PageSourceSearch

https://factchecker.cloud/node_modules/.vite/deps/client-B6T5C89C.js?v=ae253003

js factchecker.cloud collected 2026-10-02 01:20:18 UTC 3,132,233 bytes, 15,852 lines download raw bytes

vendor: 7,844 bytes, lines 1-187
1import { t as __commonJSMin } from "/node_modules/.vite/deps/rolldown-runtime-DC62tzP2.js?v=ae253003";
2import { t as require_react } from "/node_modules/.vite/deps/react.js?v=ae253003";
3import { t as require_react_dom } from "/node_modules/.vite/deps/react-dom.js?v=ae253003";
4//#region node_modules/scheduler/cjs/scheduler.development.js
5/**
6* @license React
7* scheduler.development.js
8*
9* Copyright (c) Meta Platforms, Inc. and affiliates.
10*
11* This source code is licensed under the MIT license found in the
12* LICENSE file in the root directory of this source tree.
13*/
14var require_scheduler_development = /* @__PURE__ */ __commonJSMin(((exports) => {
15	(function() {
16		function performWorkUntilDeadline() {
17			needsPaint = !1;
18			if (isMessageLoopRunning) {
19				var currentTime = exports.unstable_now();
20				startTime = currentTime;
21				var hasMoreWork = !0;
22				try {
23					a: {
24						isHostCallbackScheduled = !1;
25						isHostTimeoutScheduled && (isHostTimeoutScheduled = !1, localClearTimeout(taskTimeoutID), taskTimeoutID = -1);
26						isPerformingWork = !0;
27						var previousPriorityLevel = currentPriorityLevel;
28						try {
29							b: {
30								advanceTimers(currentTime);
31								for (currentTask = peek(taskQueue); null !== currentTask && !(currentTask.expirationTime > currentTime && shouldYieldToHost());) {
32									var callback = currentTask.callback;
33									if ("function" === typeof callback) {
34										currentTask.callback = null;
35										currentPriorityLevel = currentTask.priorityLevel;
36										var continuationCallback = callback(currentTask.expirationTime <= currentTime);
37										currentTime = exports.unstable_now();
38										if ("function" === typeof continuationCallback) {
39											currentTask.callback = continuationCallback;
40											advanceTimers(currentTime);
41											hasMoreWork = !0;
42											break b;
43										}
44										currentTask === peek(taskQueue) && pop(taskQueue);
45										advanceTimers(currentTime);
46									} else pop(taskQueue);
47									currentTask = peek(taskQueue);
48								}
49								if (null !== currentTask) hasMoreWork = !0;
50								else {
51									var firstTimer = peek(timerQueue);
52									null !== firstTimer && requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime);
53									hasMoreWork = !1;
54								}
55							}
56							break a;
57						} finally {
58							currentTask = null, currentPriorityLevel = previousPriorityLevel, isPerformingWork = !1;
59						}
60						hasMoreWork = void 0;
61					}
62				} finally {
63					hasMoreWork ? schedulePerformWorkUntilDeadline() : isMessageLoopRunning = !1;
64				}
65			}
66		}
67		function push(heap, node) {
68			var index = heap.length;
69			heap.push(node);
70			a: for (; 0 < index;) {
71				var parentIndex = index - 1 >>> 1, parent = heap[parentIndex];
72				if (0 < compare(parent, node)) heap[parentIndex] = node, heap[index] = parent, index = parentIndex;
73				else break a;
74			}
75		}
76		function peek(heap) {
77			return 0 === heap.length ? null : heap[0];
78		}
79		function pop(heap) {
80			if (0 === heap.length) return null;
81			var first = heap[0], last = heap.pop();
82			if (last !== first) {
83				heap[0] = last;
84				a: for (var index = 0, length = heap.length, halfLength = length >>> 1; index < halfLength;) {
85					var leftIndex = 2 * (index + 1) - 1, left = heap[leftIndex], rightIndex = leftIndex + 1, right = heap[rightIndex];
86					if (0 > compare(left, last)) rightIndex < length && 0 > compare(right, left) ? (heap[index] = right, heap[rightIndex] = last, index = rightIndex) : (heap[index] = left, heap[leftIndex] = last, index = leftIndex);
87					else if (rightIndex < length && 0 > compare(right, last)) heap[index] = right, heap[rightIndex] = last, index = rightIndex;
88					else break a;
89				}
90			}
91			return first;
92		}
93		function compare(a, b) {
94			var diff = a.sortIndex - b.sortIndex;
95			return 0 !== diff ? diff : a.id - b.id;
96		}
97		function advanceTimers(currentTime) {
98			for (var timer = peek(timerQueue); null !== timer;) {
99				if (null === timer.callback) pop(timerQueue);
100				else if (timer.startTime <= currentTime) pop(timerQueue), timer.sortIndex = timer.expirationTime, push(taskQueue, timer);
101				else break;
102				timer = peek(timerQueue);
103			}
104		}
105		function handleTimeout(currentTime) {
106			isHostTimeoutScheduled = !1;
107			advanceTimers(currentTime);
108			if (!isHostCallbackScheduled) if (null !== peek(taskQueue)) isHostCallbackScheduled = !0, isMessageLoopRunning || (isMessageLoopRunning = !0, schedulePerformWorkUntilDeadline());
109			else {
110				var firstTimer = peek(timerQueue);
111				null !== firstTimer && requestHostTimeout(handleTimeout, firstTimer.startTime - currentTime);
112			}
113		}
114		function shouldYieldToHost() {
115			return needsPaint ? !0 : exports.unstable_now() - startTime < frameInterval ? !1 : !0;
116		}
117		function requestHostTimeout(callback, ms) {
118			taskTimeoutID = localSetTimeout(function() {
119				callback(exports.unstable_now());
120			}, ms);
121		}
122		"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());
123		exports.unstable_now = void 0;
124		if ("object" === typeof performance && "function" === typeof performance.now) {
125			var localPerformance = performance;
126			exports.unstable_now = function() {
127				return localPerformance.now();
128			};
129		} else {
130			var localDate = Date, initialTime = localDate.now();
131			exports.unstable_now = function() {
132				return localDate.now() - initialTime;
133			};
134		}
135		var taskQueue = [], timerQueue = [], taskIdCounter = 1, currentTask = null, currentPriorityLevel = 3, isPerformingWork = !1, isHostCallbackScheduled = !1, isHostTimeoutScheduled = !1, needsPaint = !1, localSetTimeout = "function" === typeof setTimeout ? setTimeout : null, localClearTimeout = "function" === typeof clearTimeout ? clearTimeout : null, localSetImmediate = "undefined" !== typeof setImmediate ? setImmediate : null, isMessageLoopRunning = !1, taskTimeoutID = -1, frameInterval = 5, startTime = -1;
136		if ("function" === typeof localSetImmediate) var schedulePerformWorkUntilDeadline = function() {
137			localSetImmediate(performWorkUntilDeadline);
138		};
139		else if ("undefined" !== typeof MessageChannel) {
140			var channel = new MessageChannel(), port = channel.port2;
141			channel.port1.onmessage = performWorkUntilDeadline;
142			schedulePerformWorkUntilDeadline = function() {
143				port.postMessage(null);
144			};
145		} else schedulePerformWorkUntilDeadline = function() {
146			localSetTimeout(performWorkUntilDeadline, 0);
147		};
148		exports.unstable_IdlePriority = 5;
149		exports.unstable_ImmediatePriority = 1;
150		exports.unstable_LowPriority = 4;
151		exports.unstable_NormalPriority = 3;
152		exports.unstable_Profiling = null;
153		exports.unstable_UserBlockingPriority = 2;
154		exports.unstable_cancelCallback = function(task) {
155			task.callback = null;
156		};
157		exports.unstable_forceFrameRate = function(fps) {
158			0 > fps || 125 < fps ? console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported") : frameInterval = 0 < fps ? Math.floor(1e3 / fps) : 5;
159		};
160		exports.unstable_getCurrentPriorityLevel = function() {
161			return currentPriorityLevel;
162		};
163		exports.unstable_next = function(eventHandler) {
164			switch (currentPriorityLevel) {
165				case 1:
166				case 2:
167				case 3:
168					var priorityLevel = 3;
169					break;
170				default: priorityLevel = currentPriorityLevel;
171			}
172			var previousPriorityLevel = currentPriorityLevel;
173			currentPriorityLevel = priorityLevel;
174			try {
175				return eventHandler();
176			} finally {
177				currentPriorityLevel = previousPriorityLevel;
178			}
179		};
180		exports.unstable_requestPaint = function() {
181			needsPaint = !0;
182		};
183		exports.unstable_runWithPriority = function(priorityLevel, eventHandler) {
184			switch (priorityLevel) {
185				case 1:
186				case 2:
187				case 3:
vendor: 4,600 bytes, lines 188-300
188				case 4:
189				case 5: break;
190				default: priorityLevel = 3;
191			}
192			var previousPriorityLevel = currentPriorityLevel;
193			currentPriorityLevel = priorityLevel;
194			try {
195				return eventHandler();
196			} finally {
197				currentPriorityLevel = previousPriorityLevel;
198			}
199		};
200		exports.unstable_scheduleCallback = function(priorityLevel, callback, options) {
201			var currentTime = exports.unstable_now();
202			"object" === typeof options && null !== options ? (options = options.delay, options = "number" === typeof options && 0 < options ? currentTime + options : currentTime) : options = currentTime;
203			switch (priorityLevel) {
204				case 1:
205					var timeout = -1;
206					break;
207				case 2:
208					timeout = 250;
209					break;
210				case 5:
211					timeout = 1073741823;
212					break;
213				case 4:
214					timeout = 1e4;
215					break;
216				default: timeout = 5e3;
217			}
218			timeout = options + timeout;
219			priorityLevel = {
220				id: taskIdCounter++,
221				callback,
222				priorityLevel,
223				startTime: options,
224				expirationTime: timeout,
225				sortIndex: -1
226			};
227			options > currentTime ? (priorityLevel.sortIndex = options, push(timerQueue, priorityLevel), null === peek(taskQueue) && priorityLevel === peek(timerQueue) && (isHostTimeoutScheduled ? (localClearTimeout(taskTimeoutID), taskTimeoutID = -1) : isHostTimeoutScheduled = !0, requestHostTimeout(handleTimeout, options - currentTime))) : (priorityLevel.sortIndex = timeout, push(taskQueue, priorityLevel), isHostCallbackScheduled || isPerformingWork || (isHostCallbackScheduled = !0, isMessageLoopRunning || (isMessageLoopRunning = !0, schedulePerformWorkUntilDeadline())));
228			return priorityLevel;
229		};
230		exports.unstable_shouldYield = shouldYieldToHost;
231		exports.unstable_wrapCallback = function(callback) {
232			var parentPriorityLevel = currentPriorityLevel;
233			return function() {
234				var previousPriorityLevel = currentPriorityLevel;
235				currentPriorityLevel = parentPriorityLevel;
236				try {
237					return callback.apply(this, arguments);
238				} finally {
239					currentPriorityLevel = previousPriorityLevel;
240				}
241			};
242		};
243		"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());
244	})();
245}));
246//#endregion
247//#region node_modules/scheduler/index.js
248var require_scheduler = /* @__PURE__ */ __commonJSMin(((exports, module) => {
249	module.exports = require_scheduler_development();
250}));
251//#endregion
252//#region node_modules/react-dom/cjs/react-dom-client.development.js
253/**
254* @license React
255* react-dom-client.development.js
256*
257* Copyright (c) Meta Platforms, Inc. and affiliates.
258*
259* This source code is licensed under the MIT license found in the
260* LICENSE file in the root directory of this source tree.
261*/
262var require_react_dom_client_development = /* @__PURE__ */ __commonJSMin(((exports) => {
263	(function() {
264		function findHook(fiber, id) {
265			for (fiber = fiber.memoizedState; null !== fiber && 0 < id;) fiber = fiber.next, id--;
266			return fiber;
267		}
268		function copyWithSetImpl(obj, path, index, value) {
269			if (index >= path.length) return value;
270			var key = path[index], updated = isArrayImpl(obj) ? obj.slice() : assign({}, obj);
271			updated[key] = copyWithSetImpl(obj[key], path, index + 1, value);
272			return updated;
273		}
274		function copyWithRename(obj, oldPath, newPath) {
275			if (oldPath.length !== newPath.length) console.warn("copyWithRename() expects paths of the same length");
276			else {
277				for (var i = 0; i < newPath.length - 1; i++) if (oldPath[i] !== newPath[i]) {
278					console.warn("copyWithRename() expects paths to be the same except for the deepest key");
279					return;
280				}
281				return copyWithRenameImpl(obj, oldPath, newPath, 0);
282			}
283		}
284		function copyWithRenameImpl(obj, oldPath, newPath, index) {
285			var oldKey = oldPath[index], updated = isArrayImpl(obj) ? obj.slice() : assign({}, obj);
286			index + 1 === oldPath.length ? (updated[newPath[index]] = updated[oldKey], isArrayImpl(updated) ? updated.splice(oldKey, 1) : delete updated[oldKey]) : updated[oldKey] = copyWithRenameImpl(obj[oldKey], oldPath, newPath, index + 1);
287			return updated;
288		}
289		function copyWithDeleteImpl(obj, path, index) {
290			var key = path[index], updated = isArrayImpl(obj) ? obj.slice() : assign({}, obj);
291			if (index + 1 === path.length) return isArrayImpl(updated) ? updated.splice(key, 1) : delete updated[key], updated;
292			updated[key] = copyWithDeleteImpl(obj[key], path, index + 1);
293			return updated;
294		}
295		function shouldSuspendImpl() {
296			return !1;
297		}
298		function shouldErrorImpl() {
299			return null;
300		}
301		function warnInvalidHookAccess() {
302			console.error("Do not call Hooks inside useEffect(...), useMemo(...), or other built-in Hooks. You can only call Hooks at the top level of your React function. For more information, see https://react.dev/link/rules-of-hooks");
303		}
304		function warnInvalidContextAccess() {
305			console.error("Context can only be read while React is rendering. In classes, you can read it in the render method or getDerivedStateFromProps. In function components, you can read it directly in the function body, but not inside Hooks like useReducer() or useMemo().");
306		}
307		function noop() {}
308		function warnForMissingKey() {}
309		function setToSortedString(set) {
310			var array = [];
311			set.forEach(function(value) {
312				array.push(value);
313			});
314			return array.sort().join(", ");
315		}
316		function createFiber(tag, pendingProps, key, mode) {
317			return new FiberNode(tag, pendingProps, key, mode);
318		}
319		function scheduleRoot(root, element) {
320			root.context === emptyContextObject && (updateContainerImpl(root.current, 2, element, root, null, null), flushSyncWork$1());
321		}
322		function scheduleRefresh(root, update) {
323			if (null !== resolveFamily) {
324				var staleFamilies = update.staleFamilies;
325				update = update.updatedFamilies;
326				flushPendingEffects();
327				scheduleFibersWithFamiliesRecursively(root.current, update, staleFamilies);
328				flushSyncWork$1();
329			}
330		}
331		function setRefreshHandler(handler) {
332			resolveFamily = handler;
333		}
334		function isValidContainer(node) {
335			return !(!node || 1 !== node.nodeType && 9 !== node.nodeType && 11 !== node.nodeType);
336		}
337		function getNearestMountedFiber(fiber) {
338			for (var node = fiber, nextNode = node; nextNode && !nextNode.alternate;) node = nextNode, 0 !== (node.flags & 4098) && (fiber = node.return), nextNode = node.return;
339			for (; node.return;) node = node.return;
340			return 3 === node.tag ? fiber : null;
341		}
342		function getSuspenseInstanceFromFiber(fiber) {
343			if (13 === fiber.tag) {
344				var suspenseState = fiber.memoizedState;
345				null === suspenseState && (fiber = fiber.alternate, null !== fiber && (suspenseState = fiber.memoizedState));
346				if (null !== suspenseState) return suspenseState.dehydrated;
347			}
348			return null;
349		}
350		function getActivityInstanceFromFiber(fiber) {
351			if (31 === fiber.tag) {
352				var activityState = fiber.memoizedState;
353				null === activityState && (fiber = fiber.alternate, null !== fiber && (activityState = fiber.memoizedState));
354				if (null !== activityState) return activityState.dehydrated;
355			}
356			return null;
357		}
358		function assertIsMounted(fiber) {
359			if (getNearestMountedFiber(fiber) !== fiber) throw Error("Unable to find node on an unmounted component.");
360		}
361		function findCurrentFiberUsingSlowPath(fiber) {
362			var alternate = fiber.alternate;
363			if (!alternate) {
364				alternate = getNearestMountedFiber(fiber);
365				if (null === alternate) throw Error("Unable to find node on an unmounted component.");
366				return alternate !== fiber ? null : fiber;
367			}
368			for (var a = fiber, b = alternate;;) {
369				var parentA = a.return;
370				if (null === parentA) break;
371				var parentB = parentA.alternate;
372				if (null === parentB) {
373					b = parentA.return;
374					if (null !== b) {
375						a = b;
376						continue;
377					}
378					break;
379				}
380				if (parentA.child === parentB.child) {
381					for (parentB = parentA.child; parentB;) {
382						if (parentB === a) return assertIsMounted(parentA), fiber;
383						if (parentB === b) return assertIsMounted(parentA), alternate;
384						parentB = parentB.sibling;
385					}
386					throw Error("Unable to find node on an unmounted component.");
387				}
388				if (a.return !== b.return) a = parentA, b = parentB;
389				else {
390					for (var didFindChild = !1, _child = parentA.child; _child;) {
391						if (_child === a) {
392							didFindChild = !0;
393							a = parentA;
394							b = parentB;
395							break;
396						}
397						if (_child === b) {
398							didFindChild = !0;
399							b = parentA;
400							a = parentB;
401							break;
402						}
403						_child = _child.sibling;
404					}
405					if (!didFindChild) {
406						for (_child = parentB.child; _child;) {
407							if (_child === a) {
408								didFindChild = !0;
409								a = parentB;
410								b = parentA;
411								break;
412							}
413							if (_child === b) {
414								didFindChild = !0;
415								b = parentB;
416								a = parentA;
417								break;
418							}
419							_child = _child.sibling;
420						}
421						if (!didFindChild) throw Error("Child was not found in either parent set. This indicates a bug in React related to the return pointer. Please file an issue.");
422					}
423				}
424				if (a.alternate !== b) throw Error("Return fibers should always be each others' alternates. This error is likely caused by a bug in React. Please file an issue.");
425			}
426			if (3 !== a.tag) throw Error("Unable to find node on an unmounted component.");
427			return a.stateNode.current === a ? fiber : alternate;
428		}
429		function findCurrentHostFiberImpl(node) {
430			var tag = node.tag;
431			if (5 === tag || 26 === tag || 27 === tag || 6 === tag) return node;
432			for (node = node.child; null !== node;) {
433				tag = findCurrentHostFiberImpl(node);
434				if (null !== tag) return tag;
435				node = node.sibling;
436			}
437			return null;
438		}
439		function traverseFragmentInstancesAndTextInstances(fragmentFiber, fn, a, b, c) {
440			traverseVisibleInstancesAndTextInstances(fragmentFiber.child, !1, fn, a, b, c);
441		}
442		function traverseVisibleInstancesAndTextInstances(child, searchWithinHosts, fn, a, b, c) {
443			for (; null !== child;) {
444				if ((5 === child.tag || 27 === child.tag || 6 === child.tag) && fn(child, a, b, c) || (22 !== child.tag || null === child.memoizedState) && (searchWithinHosts || 5 !== child.tag && 27 !== child.tag) && traverseVisibleInstancesAndTextInstances(child.child, searchWithinHosts, fn, a, b, c)) return !0;
445				child = child.sibling;
446			}
447			return !1;
448		}
449		function getFragmentParentInstanceOrContainerFiber(fiber) {
450			for (fiber = fiber.return; null !== fiber;) {
451				if (3 === fiber.tag || 5 === fiber.tag || 27 === fiber.tag) return fiber;
452				fiber = fiber.return;
453			}
454			return null;
455		}
456		function fiberIsPortaledIntoHost(fiber) {
457			var foundPortalParent = !1;
458			for (fiber = fiber.return; null !== fiber;) {
459				4 === fiber.tag && (foundPortalParent = !0);
460				if (3 === fiber.tag || 5 === fiber.tag || 27 === fiber.tag) break;
461				fiber = fiber.return;
462			}
463			return foundPortalParent;
464		}
465		function getFragmentInstanceOrTextInstanceSiblings(fiber) {
466			var result = [null, null], parentHostFiber = getFragmentParentInstanceOrContainerFiber(fiber);
467			if (null === parentHostFiber) return result;
468			findFragmentInstanceOrTextInstanceSiblings(result, fiber, parentHostFiber.child, { foundSelf: !1 });
469			return result;
470		}
471		function findFragmentInstanceOrTextInstanceSiblings(result, self, child, state) {
472			for (; null !== child;) {
473				if (child === self) state.foundSelf = !0;
474				else if (5 === child.tag || 27 === child.tag || 6 === child.tag) {
475					if (state.foundSelf) return result[1] = child, !0;
476					result[0] = child;
477				} else if ((22 !== child.tag || null === child.memoizedState) && findFragmentInstanceOrTextInstanceSiblings(result, self, child.child, state)) return !0;
478				child = child.sibling;
479			}
480			return !1;
481		}
482		function getInstanceFromHostFiber(fiber) {
483			switch (fiber.tag) {
484				case 5:
485				case 27:
486				case 6: return fiber.stateNode;
487				case 3: return fiber.stateNode.containerInfo;
488				default: throw Error("Expected to find a host node. This is a bug in React.");
489			}
490		}
491		function isFiberPrecedingCheck(child, target, boundary) {
492			return child === boundary ? !0 : child === target ? (searchTarget = child, !0) : !1;
493		}
494		function isFiberFollowingCheck(child, target, boundary) {
495			return child === boundary ? (searchBoundary = child, !1) : child === target ? (null !== searchBoundary && (searchTarget = child), !0) : !1;
496		}
497		function getParentForFragmentAncestors(inst) {
498			if (null === inst) return null;
499			do
500				inst = null === inst ? null : inst.return;
501			while (inst && 5 !== inst.tag && 27 !== inst.tag && 3 !== inst.tag);
502			return inst ? inst : null;
503		}
504		function getLowestCommonAncestor(instA, instB, getParent) {
505			for (var depthA = 0, tempA = instA; tempA; tempA = getParent(tempA)) depthA++;
506			tempA = 0;
507			for (var tempB = instB; tempB; tempB = getParent(tempB)) tempA++;
508			for (; 0 < depthA - tempA;) instA = getParent(instA), depthA--;
509			for (; 0 < tempA - depthA;) instB = getParent(instB), tempA--;
510			for (; depthA--;) {
511				if (instA === instB || null !== instB && instA === instB.alternate) return instA;
512				instA = getParent(instA);
513				instB = getParent(instB);
514			}
515			return null;
516		}
517		function getIteratorFn(maybeIterable) {
518			if (null === maybeIterable || "object" !== typeof maybeIterable) return null;
519			maybeIterable = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable["@@iterator"];
520			return "function" === typeof maybeIterable ? maybeIterable : null;
521		}
522		function getComponentNameFromType(type) {
523			if (null == type) return null;
524			if ("function" === typeof type) return type.$$typeof === REACT_CLIENT_REFERENCE ? null : type.displayName || type.name || null;
525			if ("string" === typeof type) return type;
526			switch (type) {
527				case REACT_FRAGMENT_TYPE: return "Fragment";
528				case REACT_PROFILER_TYPE: return "Profiler";
529				case REACT_STRICT_MODE_TYPE: return "StrictMode";
530				case REACT_SUSPENSE_TYPE: return "Suspense";
531				case REACT_SUSPENSE_LIST_TYPE: return "SuspenseList";
532				case REACT_ACTIVITY_TYPE: return "Activity";
533				case REACT_VIEW_TRANSITION_TYPE: return "ViewTransition";
534			}
535			if ("object" === typeof type) switch ("number" === typeof type.tag && console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."), type.$$typeof) {
536				case REACT_PORTAL_TYPE: return "Portal";
537				case REACT_CONTEXT_TYPE: return type.displayName || "Context";
538				case REACT_CONSUMER_TYPE: return (type._context.displayName || "Context") + ".Consumer";
539				case REACT_FORWARD_REF_TYPE:
540					var innerType = type.render;
541					type = type.displayName;
542					type || (type = innerType.displayName || innerType.name || "", type = "" !== type ? "ForwardRef(" + type + ")" : "ForwardRef");
543					return type;
544				case REACT_MEMO_TYPE: return innerType = type.displayName || null, null !== innerType ? innerType : getComponentNameFromType(type.type) || "Memo";
545				case REACT_LAZY_TYPE:
546					innerType = type._payload;
547					type = type._init;
548					try {
549						return getComponentNameFromType(type(innerType));
550					} catch (x) {}
551			}
552			return null;
553		}
554		function getComponentNameFromOwner(owner) {
555			return "number" === typeof owner.tag ? getComponentNameFromFiber(owner) : "string" === typeof owner.name ? owner.name : null;
556		}
557		function getComponentNameFromFiber(fiber) {
558			var type = fiber.type;
559			switch (fiber.tag) {
560				case 31: return "Activity";
561				case 24: return "Cache";
562				case 9: return (type._context.displayName || "Context") + ".Consumer";
563				case 10: return type.displayName || "Context";
564				case 18: return "DehydratedFragment";
565				case 11: return fiber = type.render, fiber = fiber.displayName || fiber.name || "", type.displayName || ("" !== fiber ? "ForwardRef(" + fiber + ")" : "ForwardRef");
566				case 7: return "Fragment";
567				case 26:
568				case 27:
569				case 5: return type;
570				case 4: return "Portal";
571				case 3: return "Root";
572				case 6: return "Text";
573				case 16: return getComponentNameFromType(type);
574				case 8: return type === REACT_STRICT_MODE_TYPE ? "StrictMode" : "Mode";
575				case 22:
576					if (null !== fiber.return) return getComponentNameFromFiber(fiber.return);
577					break;
578				case 12: return "Profiler";
579				case 21: return "Scope";
580				case 13: return "Suspense";
581				case 19: return "SuspenseList";
582				case 25: return "TracingMarker";
583				case 30: return "ViewTransition";
584				case 1:
585				case 0:
586				case 14:
vendor: 18,155 bytes, lines 587-1002
587				case 15:
588					if ("function" === typeof type) return type.displayName || type.name || null;
589					if ("string" === typeof type) return type;
590					break;
591				case 29:
592					type = fiber._debugInfo;
593					if (null != type) {
594						for (var i = type.length - 1; 0 <= i; i--) if ("string" === typeof type[i].name) return type[i].name;
595					}
596					if (null !== fiber.return) return getComponentNameFromFiber(fiber.return);
597			}
598			return null;
599		}
600		function createCursor(defaultValue) {
601			return { current: defaultValue };
602		}
603		function pop(cursor, fiber) {
604			0 > index$jscomp$0 ? console.error("Unexpected pop.") : (fiber !== fiberStack[index$jscomp$0] && console.error("Unexpected Fiber popped."), cursor.current = valueStack[index$jscomp$0], valueStack[index$jscomp$0] = null, fiberStack[index$jscomp$0] = null, index$jscomp$0--);
605		}
606		function push(cursor, value, fiber) {
607			index$jscomp$0++;
608			valueStack[index$jscomp$0] = cursor.current;
609			fiberStack[index$jscomp$0] = fiber;
610			cursor.current = value;
611		}
612		function requiredContext(c) {
613			null === c && console.error("Expected host context to exist. This error is likely caused by a bug in React. Please file an issue.");
614			return c;
615		}
616		function pushHostContainer(fiber, nextRootInstance) {
617			push(rootInstanceStackCursor, nextRootInstance, fiber);
618			push(contextFiberStackCursor, fiber, fiber);
619			push(contextStackCursor, null, fiber);
620			var nextRootContext = nextRootInstance.nodeType;
621			switch (nextRootContext) {
622				case 9:
623				case 11:
624					nextRootContext = 9 === nextRootContext ? "#document" : "#fragment";
625					nextRootInstance = (nextRootInstance = nextRootInstance.documentElement) ? (nextRootInstance = nextRootInstance.namespaceURI) ? getOwnHostContext(nextRootInstance) : HostContextNamespaceNone : HostContextNamespaceNone;
626					break;
627				default: if (nextRootContext = nextRootInstance.tagName, nextRootInstance = nextRootInstance.namespaceURI) nextRootInstance = getOwnHostContext(nextRootInstance), nextRootInstance = getChildHostContextProd(nextRootInstance, nextRootContext);
628				else switch (nextRootContext) {
629					case "svg":
630						nextRootInstance = HostContextNamespaceSvg;
631						break;
632					case "math":
633						nextRootInstance = HostContextNamespaceMath;
634						break;
635					default: nextRootInstance = HostContextNamespaceNone;
636				}
637			}
638			nextRootContext = nextRootContext.toLowerCase();
639			nextRootContext = updatedAncestorInfoDev(null, nextRootContext);
640			nextRootContext = {
641				context: nextRootInstance,
642				ancestorInfo: nextRootContext
643			};
644			pop(contextStackCursor, fiber);
645			push(contextStackCursor, nextRootContext, fiber);
646		}
647		function popHostContainer(fiber) {
648			pop(contextStackCursor, fiber);
649			pop(contextFiberStackCursor, fiber);
650			pop(rootInstanceStackCursor, fiber);
651		}
652		function getHostContext() {
653			return requiredContext(contextStackCursor.current);
654		}
655		function pushHostContext(fiber) {
656			var stateHook = fiber.memoizedState;
657			null !== stateHook && (HostTransitionContext._currentValue = stateHook.memoizedState, push(hostTransitionProviderCursor, fiber, fiber));
658			stateHook = requiredContext(contextStackCursor.current);
659			var type = fiber.type;
660			var nextContext = getChildHostContextProd(stateHook.context, type);
661			type = updatedAncestorInfoDev(stateHook.ancestorInfo, type);
662			nextContext = {
663				context: nextContext,
664				ancestorInfo: type
665			};
666			stateHook !== nextContext && (push(contextFiberStackCursor, fiber, fiber), push(contextStackCursor, nextContext, fiber));
667		}
668		function popHostContext(fiber) {
669			contextFiberStackCursor.current === fiber && (pop(contextStackCursor, fiber), pop(contextFiberStackCursor, fiber));
670			hostTransitionProviderCursor.current === fiber && (pop(hostTransitionProviderCursor, fiber), HostTransitionContext._currentValue = NotPendingTransition);
671		}
672		function disabledLog() {}
673		function disableLogs() {
674			if (0 === disabledDepth) {
675				prevLog = console.log;
676				prevInfo = console.info;
677				prevWarn = console.warn;
678				prevError = console.error;
679				prevGroup = console.group;
680				prevGroupCollapsed = console.groupCollapsed;
681				prevGroupEnd = console.groupEnd;
682				var props = {
683					configurable: !0,
684					enumerable: !0,
685					value: disabledLog,
686					writable: !0
687				};
688				Object.defineProperties(console, {
689					info: props,
690					log: props,
691					warn: props,
692					error: props,
693					group: props,
694					groupCollapsed: props,
695					groupEnd: props
696				});
697			}
698			disabledDepth++;
699		}
700		function reenableLogs() {
701			disabledDepth--;
702			if (0 === disabledDepth) {
703				var props = {
704					configurable: !0,
705					enumerable: !0,
706					writable: !0
707				};
708				Object.defineProperties(console, {
709					log: assign({}, props, { value: prevLog }),
710					info: assign({}, props, { value: prevInfo }),
711					warn: assign({}, props, { value: prevWarn }),
712					error: assign({}, props, { value: prevError }),
713					group: assign({}, props, { value: prevGroup }),
714					groupCollapsed: assign({}, props, { value: prevGroupCollapsed }),
715					groupEnd: assign({}, props, { value: prevGroupEnd })
716				});
717			}
718			0 > disabledDepth && console.error("disabledDepth fell below zero. This is a bug in React. Please file an issue.");
719		}
720		function formatOwnerStack(error) {
721			var prevPrepareStackTrace = Error.prepareStackTrace;
722			Error.prepareStackTrace = void 0;
723			error = error.stack;
724			Error.prepareStackTrace = prevPrepareStackTrace;
725			error.startsWith("Error: react-stack-top-frame\n") && (error = error.slice(29));
726			prevPrepareStackTrace = error.indexOf("\n");
727			-1 !== prevPrepareStackTrace && (error = error.slice(prevPrepareStackTrace + 1));
728			prevPrepareStackTrace = error.indexOf("react_stack_bottom_frame");
729			-1 !== prevPrepareStackTrace && (prevPrepareStackTrace = error.lastIndexOf("\n", prevPrepareStackTrace));
730			if (-1 !== prevPrepareStackTrace) error = error.slice(0, prevPrepareStackTrace);
731			else return "";
732			return error;
733		}
734		function describeBuiltInComponentFrame(name) {
735			if (void 0 === prefix) try {
736				throw Error();
737			} catch (x) {
738				var match = x.stack.trim().match(/\n( *(at )?)/);
739				prefix = match && match[1] || "";
740				suffix = -1 < x.stack.indexOf("\n    at") ? " (<anonymous>)" : -1 < x.stack.indexOf("@") ? "@unknown:0:0" : "";
741			}
742			return "\n" + prefix + name + suffix;
743		}
744		function describeNativeComponentFrame(fn, construct) {
745			if (!fn || reentry) return "";
746			var frame = componentFrameCache.get(fn);
747			if (void 0 !== frame) return frame;
748			reentry = !0;
749			frame = Error.prepareStackTrace;
750			Error.prepareStackTrace = void 0;
751			var previousDispatcher = null;
752			previousDispatcher = ReactSharedInternals.H;
753			ReactSharedInternals.H = null;
754			disableLogs();
755			try {
756				var RunInRootFrame = { DetermineComponentFrameRoot: function() {
757					try {
758						if (construct) {
759							var Fake = function() {
760								throw Error();
761							};
762							Object.defineProperty(Fake.prototype, "props", { set: function() {
763								throw Error();
764							} });
765							if ("object" === typeof Reflect && Reflect.construct) {
766								try {
767									Reflect.construct(Fake, []);
768								} catch (x) {
769									var control = x;
770								}
771								Reflect.construct(fn, [], Fake);
772							} else {
773								try {
774									Fake.call();
775								} catch (x$0) {
776									control = x$0;
777								}
778								Fake = !1;
779								try {
780									var prevProps = Object.getOwnPropertyDescriptor(fn.prototype, "props");
781									Object.defineProperty(fn.prototype, "props", {
782										configurable: !0,
783										set: function() {
784											throw Error();
785										}
786									});
787									Fake = !0;
788									new fn();
789								} finally {
790									Fake && (void 0 !== prevProps ? Object.defineProperty(fn.prototype, "props", prevProps) : delete fn.prototype.props);
791								}
792							}
793						} else {
794							try {
795								throw Error();
796							} catch (x$1) {
797								control = x$1;
798							}
799							(Fake = fn()) && "function" === typeof Fake.catch && Fake.catch(function() {});
800						}
801					} catch (sample) {
802						if (sample && control && "string" === typeof sample.stack) return [sample.stack, control.stack];
803					}
804					return [null, null];
805				} };
806				RunInRootFrame.DetermineComponentFrameRoot.displayName = "DetermineComponentFrameRoot";
807				var namePropDescriptor = Object.getOwnPropertyDescriptor(RunInRootFrame.DetermineComponentFrameRoot, "name");
808				namePropDescriptor && namePropDescriptor.configurable && Object.defineProperty(RunInRootFrame.DetermineComponentFrameRoot, "name", { value: "DetermineComponentFrameRoot" });
809				var _RunInRootFrame$Deter = RunInRootFrame.DetermineComponentFrameRoot(), sampleStack = _RunInRootFrame$Deter[0], controlStack = _RunInRootFrame$Deter[1];
810				if (sampleStack && controlStack) {
811					var sampleLines = sampleStack.split("\n"), controlLines = controlStack.split("\n");
812					for (_RunInRootFrame$Deter = namePropDescriptor = 0; namePropDescriptor < sampleLines.length && !sampleLines[namePropDescriptor].includes("DetermineComponentFrameRoot");) namePropDescriptor++;
813					for (; _RunInRootFrame$Deter < controlLines.length && !controlLines[_RunInRootFrame$Deter].includes("DetermineComponentFrameRoot");) _RunInRootFrame$Deter++;
814					if (namePropDescriptor === sampleLines.length || _RunInRootFrame$Deter === controlLines.length) for (namePropDescriptor = sampleLines.length - 1, _RunInRootFrame$Deter = controlLines.length - 1; 1 <= namePropDescriptor && 0 <= _RunInRootFrame$Deter && sampleLines[namePropDescriptor] !== controlLines[_RunInRootFrame$Deter];) _RunInRootFrame$Deter--;
815					for (; 1 <= namePropDescriptor && 0 <= _RunInRootFrame$Deter; namePropDescriptor--, _RunInRootFrame$Deter--) if (sampleLines[namePropDescriptor] !== controlLines[_RunInRootFrame$Deter]) {
816						if (1 !== namePropDescriptor || 1 !== _RunInRootFrame$Deter) do
817							if (namePropDescriptor--, _RunInRootFrame$Deter--, 0 > _RunInRootFrame$Deter || sampleLines[namePropDescriptor] !== controlLines[_RunInRootFrame$Deter]) {
818								var _frame = "\n" + sampleLines[namePropDescriptor].replace(" at new ", " at ");
819								fn.displayName && _frame.includes("<anonymous>") && (_frame = _frame.replace("<anonymous>", fn.displayName));
820								"function" === typeof fn && componentFrameCache.set(fn, _frame);
821								return _frame;
822							}
823						while (1 <= namePropDescriptor && 0 <= _RunInRootFrame$Deter);
824						break;
825					}
826				}
827			} finally {
828				reentry = !1, ReactSharedInternals.H = previousDispatcher, reenableLogs(), Error.prepareStackTrace = frame;
829			}
830			sampleLines = (sampleLines = fn ? fn.displayName || fn.name : "") ? describeBuiltInComponentFrame(sampleLines) : "";
831			"function" === typeof fn && componentFrameCache.set(fn, sampleLines);
832			return sampleLines;
833		}
834		function describeFiber(fiber, childFiber) {
835			switch (fiber.tag) {
836				case 26:
837				case 27:
838				case 5: return describeBuiltInComponentFrame(fiber.type);
839				case 16: return describeBuiltInComponentFrame("Lazy");
840				case 13: return fiber.child !== childFiber && null !== childFiber ? describeBuiltInComponentFrame("Suspense Fallback") : describeBuiltInComponentFrame("Suspense");
841				case 19: return describeBuiltInComponentFrame("SuspenseList");
842				case 0:
843				case 15: return describeNativeComponentFrame(fiber.type, !1);
844				case 11: return describeNativeComponentFrame(fiber.type.render, !1);
845				case 1: return describeNativeComponentFrame(fiber.type, !0);
846				case 31: return describeBuiltInComponentFrame("Activity");
847				case 30: return describeBuiltInComponentFrame("ViewTransition");
848				default: return "";
849			}
850		}
851		function getStackByFiberInDevAndProd(workInProgress) {
852			try {
853				var info = "", previous = null;
854				do {
855					info += describeFiber(workInProgress, previous);
856					var debugInfo = workInProgress._debugInfo;
857					if (debugInfo) for (var i = debugInfo.length - 1; 0 <= i; i--) {
858						var entry = debugInfo[i];
859						if ("string" === typeof entry.name) {
860							var JSCompiler_temp_const = info;
861							a: {
862								var name = entry.name, env = entry.env, location = entry.debugLocation;
863								if (null != location) {
864									var childStack = formatOwnerStack(location), idx = childStack.lastIndexOf("\n"), lastLine = -1 === idx ? childStack : childStack.slice(idx + 1);
865									if (-1 !== lastLine.indexOf(name)) {
866										var JSCompiler_inline_result = "\n" + lastLine;
867										break a;
868									}
869								}
870								JSCompiler_inline_result = describeBuiltInComponentFrame(name + (env ? " [" + env + "]" : ""));
871							}
872							info = JSCompiler_temp_const + JSCompiler_inline_result;
873						}
874					}
875					previous = workInProgress;
876					workInProgress = workInProgress.return;
877				} while (workInProgress);
878				return info;
879			} catch (x) {
880				return "\nError generating stack: " + x.message + "\n" + x.stack;
881			}
882		}
883		function describeFunctionComponentFrameWithoutLineNumber(fn) {
884			return (fn = fn ? fn.displayName || fn.name : "") ? describeBuiltInComponentFrame(fn) : "";
885		}
886		function getCurrentFiberOwnerNameInDevOrNull() {
887			if (null === current) return null;
888			var owner = current._debugOwner;
889			return null != owner ? getComponentNameFromOwner(owner) : null;
890		}
891		function getCurrentFiberStackInDev() {
892			if (null === current) return "";
893			var workInProgress = current;
894			try {
895				var info = "";
896				6 === workInProgress.tag && (workInProgress = workInProgress.return);
897				switch (workInProgress.tag) {
898					case 26:
899					case 27:
900					case 5:
901						info += describeBuiltInComponentFrame(workInProgress.type);
902						break;
903					case 13:
904						info += describeBuiltInComponentFrame("Suspense");
905						break;
906					case 19:
907						info += describeBuiltInComponentFrame("SuspenseList");
908						break;
909					case 31:
910						info += describeBuiltInComponentFrame("Activity");
911						break;
912					case 30:
913						info += describeBuiltInComponentFrame("ViewTransition");
914						break;
915					case 0:
916					case 15:
917					case 1:
918						workInProgress._debugOwner || "" !== info || (info += describeFunctionComponentFrameWithoutLineNumber(workInProgress.type));
919						break;
920					case 11: workInProgress._debugOwner || "" !== info || (info += describeFunctionComponentFrameWithoutLineNumber(workInProgress.type.render));
921				}
922				for (; workInProgress;) if ("number" === typeof workInProgress.tag) {
923					var fiber = workInProgress;
924					workInProgress = fiber._debugOwner;
925					var debugStack = fiber._debugStack;
926					if (workInProgress && debugStack) {
927						var formattedStack = formatOwnerStack(debugStack);
928						"" !== formattedStack && (info += "\n" + formattedStack);
929					}
930				} else if (null != workInProgress.debugStack) {
931					var ownerStack = workInProgress.debugStack;
932					(workInProgress = workInProgress.owner) && ownerStack && (info += "\n" + formatOwnerStack(ownerStack));
933				} else break;
934				var JSCompiler_inline_result = info;
935			} catch (x) {
936				JSCompiler_inline_result = "\nError generating stack: " + x.message + "\n" + x.stack;
937			}
938			return JSCompiler_inline_result;
939		}
940		function runWithFiberInDEV(fiber, callback, arg0, arg1, arg2, arg3, arg4) {
941			var previousFiber = current;
942			setCurrentFiber(fiber);
943			try {
944				return null !== fiber && fiber._debugTask ? fiber._debugTask.run(callback.bind(null, arg0, arg1, arg2, arg3, arg4)) : callback(arg0, arg1, arg2, arg3, arg4);
945			} finally {
946				setCurrentFiber(previousFiber);
947			}
948			throw Error("runWithFiberInDEV should never be called in production. This is a bug in React.");
949		}
950		function setCurrentFiber(fiber) {
951			ReactSharedInternals.getCurrentStack = null === fiber ? null : getCurrentFiberStackInDev;
952			isRendering = !1;
953			current = fiber;
954		}
955		function typeName(value) {
956			return "function" === typeof Symbol && Symbol.toStringTag && value[Symbol.toStringTag] || value.constructor.name || "Object";
957		}
958		function willCoercionThrow(value) {
959			try {
960				return testStringCoercion(value), !1;
961			} catch (e) {
962				return !0;
963			}
964		}
965		function testStringCoercion(value) {
966			return "" + value;
967		}
968		function checkAttributeStringCoercion(value, attributeName) {
969			if (willCoercionThrow(value)) return console.error("The provided `%s` attribute is an unsupported type %s. This value must be coerced to a string before using it here.", attributeName, typeName(value)), testStringCoercion(value);
970		}
971		function checkCSSPropertyStringCoercion(value, propName) {
972			if (willCoercionThrow(value)) return console.error("The provided `%s` CSS property is an unsupported type %s. This value must be coerced to a string before using it here.", propName, typeName(value)), testStringCoercion(value);
973		}
974		function checkFormFieldValueStringCoercion(value) {
975			if (willCoercionThrow(value)) return console.error("Form field values (value, checked, defaultValue, or defaultChecked props) must be strings, not %s. This value must be coerced to a string before using it here.", typeName(value)), testStringCoercion(value);
976		}
977		function injectInternals(internals) {
978			if ("undefined" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__) return !1;
979			var hook = __REACT_DEVTOOLS_GLOBAL_HOOK__;
980			if (hook.isDisabled) return !0;
981			if (!hook.supportsFiber) return console.error("The installed version of React DevTools is too old and will not work with the current version of React. Please update React DevTools. https://react.dev/link/react-devtools"), !0;
982			try {
983				rendererID = hook.inject(internals), injectedHook = hook;
984			} catch (err) {
985				console.error("React instrumentation encountered an error: %o.", err);
986			}
987			return hook.checkDCE ? !0 : !1;
988		}
989		function setIsStrictModeForDevtools(newIsStrictMode) {
990			"function" === typeof log$1 && unstable_setDisableYieldValue(newIsStrictMode);
991			if (injectedHook && "function" === typeof injectedHook.setStrictMode) try {
992				injectedHook.setStrictMode(rendererID, newIsStrictMode);
993			} catch (err) {
994				hasLoggedError || (hasLoggedError = !0, console.error("React instrumentation encountered an error: %o", err));
995			}
996		}
997		function clz32Fallback(x) {
998			x >>>= 0;
999			return 0 === x ? 32 : 31 - (log(x) / LN2 | 0) | 0;
1000		}
1001		function getHighestPriorityLanes(lanes) {
1002			var pendingSyncLanes = lanes & 42;
vendor: 6,842 bytes, lines 1003-1168
1003			if (0 !== pendingSyncLanes) return pendingSyncLanes;
1004			switch (lanes & -lanes) {
1005				case 1: return 1;
1006				case 2: return 2;
1007				case 4: return 4;
1008				case 8: return 8;
1009				case 16: return 16;
1010				case 32: return 32;
1011				case 64: return 64;
1012				case 128: return 128;
1013				case 256:
1014				case 512:
1015				case 1024:
1016				case 2048:
1017				case 4096:
1018				case 8192:
1019				case 16384:
1020				case 32768:
1021				case 65536:
1022				case 131072: return lanes & -lanes;
1023				case 262144:
1024				case 524288:
1025				case 1048576:
1026				case 2097152: return lanes & 3932160;
1027				case 4194304:
1028				case 8388608:
1029				case 16777216:
1030				case 33554432: return lanes & 62914560;
1031				case 67108864: return 67108864;
1032				case 134217728: return 134217728;
1033				case 268435456: return 268435456;
1034				case 536870912: return 536870912;
1035				case 1073741824: return 0;
1036				default: return console.error("Should have found matching lanes. This is a bug in React."), lanes;
1037			}
1038		}
1039		function getNextLanes(root, wipLanes, rootHasPendingCommit) {
1040			var pendingLanes = root.pendingLanes;
1041			if (0 === pendingLanes) return 0;
1042			var nextLanes = 0, suspendedLanes = root.suspendedLanes, pingedLanes = root.pingedLanes;
1043			root = root.warmLanes;
1044			var nonIdlePendingLanes = pendingLanes & 134217727;
1045			0 !== nonIdlePendingLanes ? (pendingLanes = nonIdlePendingLanes & ~suspendedLanes, 0 !== pendingLanes ? nextLanes = getHighestPriorityLanes(pendingLanes) : (pingedLanes &= nonIdlePendingLanes, 0 !== pingedLanes ? nextLanes = getHighestPriorityLanes(pingedLanes) : rootHasPendingCommit || (rootHasPendingCommit = nonIdlePendingLanes & ~root, 0 !== rootHasPendingCommit && (nextLanes = getHighestPriorityLanes(rootHasPendingCommit))))) : (nonIdlePendingLanes = pendingLanes & ~suspendedLanes, 0 !== nonIdlePendingLanes ? nextLanes = getHighestPriorityLanes(nonIdlePendingLanes) : 0 !== pingedLanes ? nextLanes = getHighestPriorityLanes(pingedLanes) : rootHasPendingCommit || (rootHasPendingCommit = pendingLanes & ~root, 0 !== rootHasPendingCommit && (nextLanes = getHighestPriorityLanes(rootHasPendingCommit))));
1046			return 0 === nextLanes ? 0 : 0 !== wipLanes && wipLanes !== nextLanes && 0 === (wipLanes & suspendedLanes) && (suspendedLanes = nextLanes & -nextLanes, rootHasPendingCommit = wipLanes & -wipLanes, suspendedLanes >= rootHasPendingCommit || 32 === suspendedLanes && 0 !== (rootHasPendingCommit & 4194048)) ? wipLanes : nextLanes;
1047		}
1048		function checkIfRootIsPrerendering(root, renderLanes) {
1049			return 0 === (root.pendingLanes & ~(root.suspendedLanes & ~root.pingedLanes) & renderLanes);
1050		}
1051		function getEntangledLanes(root, renderLanes) {
1052			0 !== (renderLanes & 8) && (renderLanes |= renderLanes & 32);
1053			var allEntangledLanes = root.entangledLanes;
1054			if (0 !== allEntangledLanes) for (root = root.entanglements, allEntangledLanes &= renderLanes; 0 < allEntangledLanes;) {
1055				var index = 31 - clz32(allEntangledLanes), lane = 1 << index;
1056				renderLanes |= root[index];
1057				allEntangledLanes &= ~lane;
1058			}
1059			return renderLanes;
1060		}
1061		function computeExpirationTime(lane, currentTime) {
1062			switch (lane) {
1063				case 1:
1064				case 2:
1065				case 4:
1066				case 8:
1067				case 64: return currentTime + 250;
1068				case 16:
1069				case 32:
1070				case 128:
1071				case 256:
1072				case 512:
1073				case 1024:
1074				case 2048:
1075				case 4096:
1076				case 8192:
1077				case 16384:
1078				case 32768:
1079				case 65536:
1080				case 131072:
1081				case 262144:
1082				case 524288:
1083				case 1048576:
1084				case 2097152: return currentTime + 5e3;
1085				case 4194304:
1086				case 8388608:
1087				case 16777216:
1088				case 33554432: return -1;
1089				case 67108864:
1090				case 134217728:
1091				case 268435456:
1092				case 536870912:
1093				case 1073741824: return -1;
1094				default: return console.error("Should have found matching lanes. This is a bug in React."), -1;
1095			}
1096		}
1097		function claimNextRetryLane() {
1098			var lane = nextRetryLane;
1099			nextRetryLane <<= 1;
1100			0 === (nextRetryLane & 62914560) && (nextRetryLane = 4194304);
1101			return lane;
1102		}
1103		function createLaneMap(initial) {
1104			for (var laneMap = [], i = 0; 31 > i; i++) laneMap.push(initial);
1105			return laneMap;
1106		}
1107		function markRootUpdated$1(root, updateLane) {
1108			root.pendingLanes |= updateLane;
1109			268435456 !== updateLane && (root.suspendedLanes = 0, root.pingedLanes = 0, root.warmLanes = 0);
1110		}
1111		function markRootFinished(root, finishedLanes, remainingLanes, spawnedLane, updatedLanes, suspendedRetryLanes) {
1112			var previouslyPendingLanes = root.pendingLanes;
1113			root.pendingLanes = remainingLanes;
1114			root.suspendedLanes = 0;
1115			root.pingedLanes = 0;
1116			root.warmLanes = 0;
1117			root.expiredLanes &= remainingLanes;
1118			root.entangledLanes &= remainingLanes;
1119			root.errorRecoveryDisabledLanes &= remainingLanes;
1120			root.shellSuspendCounter = 0;
1121			var entanglements = root.entanglements, expirationTimes = root.expirationTimes, hiddenUpdates = root.hiddenUpdates;
1122			for (remainingLanes = previouslyPendingLanes & ~remainingLanes; 0 < remainingLanes;) {
1123				var index = 31 - clz32(remainingLanes), lane = 1 << index;
1124				entanglements[index] = 0;
1125				expirationTimes[index] = -1;
1126				var hiddenUpdatesForLane = hiddenUpdates[index];
1127				if (null !== hiddenUpdatesForLane) for (hiddenUpdates[index] = null, index = 0; index < hiddenUpdatesForLane.length; index++) {
1128					var update = hiddenUpdatesForLane[index];
1129					null !== update && (update.lane &= -536870913);
1130				}
1131				remainingLanes &= ~lane;
1132			}
1133			0 !== spawnedLane && markSpawnedDeferredLane(root, spawnedLane, 0);
1134			0 !== suspendedRetryLanes && 0 === updatedLanes && 0 !== root.tag && (root.suspendedLanes |= suspendedRetryLanes & ~(previouslyPendingLanes & ~finishedLanes));
1135		}
1136		function markSpawnedDeferredLane(root, spawnedLane, entangledLanes) {
1137			root.pendingLanes |= spawnedLane;
1138			root.suspendedLanes &= ~spawnedLane;
1139			var spawnedLaneIndex = 31 - clz32(spawnedLane);
1140			root.entangledLanes |= spawnedLane;
1141			root.entanglements[spawnedLaneIndex] = root.entanglements[spawnedLaneIndex] | 1073741824 | entangledLanes & 261930;
1142		}
1143		function markRootEntangled(root, entangledLanes) {
1144			var rootEntangledLanes = root.entangledLanes |= entangledLanes;
1145			for (root = root.entanglements; rootEntangledLanes;) {
1146				var index = 31 - clz32(rootEntangledLanes), lane = 1 << index;
1147				lane & entangledLanes | root[index] & entangledLanes && (root[index] |= entangledLanes);
1148				rootEntangledLanes &= ~lane;
1149			}
1150		}
1151		function getBumpedLaneForHydration(root, renderLanes) {
1152			var renderLane = renderLanes & -renderLanes;
1153			renderLane = 0 !== (renderLane & 42) ? 1 : getBumpedLaneForHydrationByLane(renderLane);
1154			return 0 !== (renderLane & (root.suspendedLanes | renderLanes)) ? 0 : renderLane;
1155		}
1156		function getBumpedLaneForHydrationByLane(lane) {
1157			switch (lane) {
1158				case 2:
1159					lane = 1;
1160					break;
1161				case 8:
1162					lane = 4;
1163					break;
1164				case 32:
1165					lane = 16;
1166					break;
1167				case 256:
1168				case 512:
1169				case 1024:
1170				case 2048:
1171				case 4096:
1172				case 8192:
1173				case 16384:
1174				case 32768:
1175				case 65536:
1176				case 131072:
1177				case 262144:
1178				case 524288:
1179				case 1048576:
1180				case 2097152:
1181				case 4194304:
1182				case 8388608:
1183				case 16777216:
1184				case 33554432:
1185					lane = 128;
1186					break;
1187				case 268435456:
1188					lane = 134217728;
1189					break;
1190				default: lane = 0;
1191			}
1192			return lane;
1193		}
1194		function addFiberToLanesMap(root, fiber, lanes) {
1195			if (isDevToolsPresent) for (root = root.pendingUpdatersLaneMap; 0 < lanes;) {
1196				var index = 31 - clz32(lanes), lane = 1 << index;
1197				root[index].add(fiber);
1198				lanes &= ~lane;
1199			}
1200		}
1201		function movePendingFibersToMemoized(root, lanes) {
1202			if (isDevToolsPresent) for (var pendingUpdatersLaneMap = root.pendingUpdatersLaneMap, memoizedUpdaters = root.memoizedUpdaters; 0 < lanes;) {
1203				var index = 31 - clz32(lanes);
1204				root = 1 << index;
1205				index = pendingUpdatersLaneMap[index];
1206				0 < index.size && (index.forEach(function(fiber) {
1207					var alternate = fiber.alternate;
1208					null !== alternate && memoizedUpdaters.has(alternate) || memoizedUpdaters.add(fiber);
1209				}), index.clear());
1210				lanes &= ~root;
1211			}
1212		}
1213		function lanesToEventPriority(lanes) {
1214			lanes &= -lanes;
1215			return 0 !== DiscreteEventPriority && DiscreteEventPriority < lanes ? 0 !== ContinuousEventPriority && ContinuousEventPriority < lanes ? 0 !== (lanes & 134217727) ? DefaultEventPriority : IdleEventPriority : ContinuousEventPriority : DiscreteEventPriority;
1216		}
1217		function resolveUpdatePriority() {
1218			var updatePriority = ReactDOMSharedInternals.p;
1219			if (0 !== updatePriority) return updatePriority;
1220			updatePriority = window.event;
1221			return void 0 === updatePriority ? DefaultEventPriority : getEventPriority(updatePriority.type);
1222		}
1223		function runWithPriority(priority, fn) {
1224			var previousPriority = ReactDOMSharedInternals.p;
1225			try {
1226				return ReactDOMSharedInternals.p = priority, fn();
1227			} finally {
1228				ReactDOMSharedInternals.p = previousPriority;
1229			}
1230		}
1231		function detachDeletedInstance(node) {
1232			delete node[internalInstanceKey];
1233			delete node[internalPropsKey];
1234			delete node[internalEventHandlerListenersKey];
1235			delete node[internalEventHandlesSetKey];
1236		}
1237		function getClosestInstanceFromNode(targetNode) {
1238			var targetInst;
1239			if (targetInst = targetNode[internalInstanceKey]) return targetInst;
1240			for (var parentNode = targetNode.parentNode; parentNode;) {
1241				if (targetInst = parentNode[internalContainerInstanceKey] || parentNode[internalInstanceKey]) {
1242					parentNode = targetInst.alternate;
1243					if (null !== targetInst.child || null !== parentNode && null !== parentNode.child) for (targetNode = getParentHydrationBoundary(targetNode); null !== targetNode;) {
1244						if (parentNode = targetNode[internalInstanceKey]) return parentNode;
1245						targetNode = getParentHydrationBoundary(targetNode);
1246					}
1247					return targetInst;
1248				}
1249				targetNode = parentNode;
1250				parentNode = targetNode.parentNode;
1251			}
1252			return null;
1253		}
1254		function getInstanceFromNode(node) {
1255			if (node = node[internalInstanceKey] || node[internalContainerInstanceKey]) {
1256				var tag = node.tag;
1257				if (5 === tag || 6 === tag || 13 === tag || 31 === tag || 26 === tag || 27 === tag || 3 === tag) return node;
1258			}
1259			return null;
1260		}
1261		function getNodeFromInstance(inst) {
1262			var tag = inst.tag;
1263			if (5 === tag || 26 === tag || 27 === tag || 6 === tag) return inst.stateNode;
1264			throw Error("getNodeFromInstance: Invalid argument.");
1265		}
1266		function getResourcesFromRoot(root) {
1267			var resources = root[internalRootNodeResourcesKey];
1268			resources || (resources = root[internalRootNodeResourcesKey] = {
1269				hoistableStyles: /* @__PURE__ */ new Map(),
1270				hoistableScripts: /* @__PURE__ */ new Map()
1271			});
1272			return resources;
1273		}
1274		function markNodeAsHoistable(node) {
1275			node[internalHoistableMarker] = !0;
1276		}
1277		function clearPendingLoadOnNode(node) {
1278			node[internalLoadPendingKey] = void 0;
1279		}
1280		function registerTwoPhaseEvent(registrationName, dependencies) {
1281			registerDirectEvent(registrationName, dependencies);
1282			registerDirectEvent(registrationName + "Capture", dependencies);
1283		}
1284		function registerDirectEvent(registrationName, dependencies) {
1285			registrationNameDependencies[registrationName] && console.error("EventRegistry: More than one plugin attempted to publish the same registration name, `%s`.", registrationName);
1286			registrationNameDependencies[registrationName] = dependencies;
1287			var lowerCasedName = registrationName.toLowerCase();
1288			possibleRegistrationNames[lowerCasedName] = registrationName;
1289			"onDoubleClick" === registrationName && (possibleRegistrationNames.ondblclick = registrationName);
1290			for (registrationName = 0; registrationName < dependencies.length; registrationName++) allNativeEvents.add(dependencies[registrationName]);
1291		}
1292		function checkControlledValueProps(tagName, props) {
1293			hasReadOnlyValue[props.type] || props.onChange || props.onInput || props.readOnly || props.disabled || null == props.value || ("select" === tagName ? console.error("You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set `onChange`.") : console.error("You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set either `onChange` or `readOnly`."));
1294			props.onChange || props.readOnly || props.disabled || null == props.checked || console.error("You provided a `checked` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultChecked`. Otherwise, set either `onChange` or `readOnly`.");
1295		}
1296		function isAttributeNameSafe(attributeName) {
1297			if (hasOwnProperty.call(validatedAttributeNameCache, attributeName)) return !0;
1298			if (hasOwnProperty.call(illegalAttributeNameCache, attributeName)) return !1;
1299			if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) return validatedAttributeNameCache[attributeName] = !0;
1300			illegalAttributeNameCache[attributeName] = !0;
1301			console.error("Invalid attribute name: `%s`", attributeName);
1302			return !1;
1303		}
1304		function pushMutationContext() {
1305			var prev = viewTransitionMutationContext;
1306			viewTransitionMutationContext = !1;
1307			return prev;
1308		}
1309		function getValueForAttributeOnCustomComponent(node, name, expected) {
1310			if (isAttributeNameSafe(name)) {
1311				if (!node.hasAttribute(name)) {
1312					switch (typeof expected) {
1313						case "symbol":
1314						case "object": return expected;
1315						case "function": return expected;
1316						case "boolean": if (!1 === expected) return expected;
1317					}
1318					return void 0 === expected ? void 0 : null;
1319				}
1320				node = "nonce" === name.toLowerCase() ? node.nonce : node.getAttribute(name);
1321				if ("" === node && !0 === expected) return !0;
1322				checkAttributeStringCoercion(expected, name);
1323				return node === "" + expected ? expected : node;
1324			}
1325		}
1326		function setValueForAttribute(node, name, value) {
1327			if (isAttributeNameSafe(name)) if (null === value) node.removeAttribute(name);
1328			else {
1329				switch (typeof value) {
1330					case "undefined":
1331					case "function":
1332					case "symbol":
1333						node.removeAttribute(name);
1334						return;
1335					case "boolean":
1336						var prefix = name.toLowerCase().slice(0, 5);
1337						if ("data-" !== prefix && "aria-" !== prefix) {
1338							node.removeAttribute(name);
1339							return;
1340						}
1341				}
1342				checkAttributeStringCoercion(value, name);
1343				node.setAttribute(name, value);
1344			}
1345		}
1346		function setValueForKnownAttribute(node, name, value) {
1347			if (null === value) node.removeAttribute(name);
1348			else {
1349				switch (typeof value) {
1350					case "undefined":
1351					case "function":
1352					case "symbol":
1353					case "boolean":
1354						node.removeAttribute(name);
1355						return;
1356				}
1357				checkAttributeStringCoercion(value, name);
1358				node.setAttribute(name, value);
1359			}
1360		}
1361		function setValueForNamespacedAttribute(node, namespace, name, value) {
1362			if (null === value) node.removeAttribute(name);
1363			else {
1364				switch (typeof value) {
1365					case "undefined":
1366					case "function":
1367					case "symbol":
1368					case "boolean":
1369						node.removeAttribute(name);
1370						return;
1371				}
1372				checkAttributeStringCoercion(value, name);
1373				node.setAttributeNS(namespace, name, value);
1374			}
1375		}
1376		function getToStringValue(value) {
1377			switch (typeof value) {
1378				case "bigint":
1379				case "boolean":
vendor: 18,801 bytes, lines 1380-1664
1380				case "number":
1381				case "string":
1382				case "undefined": return value;
1383				case "object": return checkFormFieldValueStringCoercion(value), value;
1384				default: return "";
1385			}
1386		}
1387		function isCheckable(elem) {
1388			var type = elem.type;
1389			return (elem = elem.nodeName) && "input" === elem.toLowerCase() && ("checkbox" === type || "radio" === type);
1390		}
1391		function trackValueOnNode(node, valueField, currentValue) {
1392			var descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField);
1393			if (!node.hasOwnProperty(valueField) && "undefined" !== typeof descriptor && "function" === typeof descriptor.get && "function" === typeof descriptor.set) {
1394				var get = descriptor.get, set = descriptor.set;
1395				Object.defineProperty(node, valueField, {
1396					configurable: !0,
1397					get: function() {
1398						return get.call(this);
1399					},
1400					set: function(value) {
1401						checkFormFieldValueStringCoercion(value);
1402						currentValue = "" + value;
1403						set.call(this, value);
1404					}
1405				});
1406				Object.defineProperty(node, valueField, { enumerable: descriptor.enumerable });
1407				return {
1408					getValue: function() {
1409						return currentValue;
1410					},
1411					setValue: function(value) {
1412						checkFormFieldValueStringCoercion(value);
1413						currentValue = "" + value;
1414					},
1415					stopTracking: function() {
1416						node._valueTracker = null;
1417						delete node[valueField];
1418					}
1419				};
1420			}
1421		}
1422		function track(node) {
1423			if (!node._valueTracker) {
1424				var valueField = isCheckable(node) ? "checked" : "value";
1425				node._valueTracker = trackValueOnNode(node, valueField, "" + node[valueField]);
1426			}
1427		}
1428		function updateValueIfChanged(node) {
1429			if (!node) return !1;
1430			var tracker = node._valueTracker;
1431			if (!tracker) return !0;
1432			var lastValue = tracker.getValue();
1433			var value = "";
1434			node && (value = isCheckable(node) ? node.checked ? "true" : "false" : node.value);
1435			node = value;
1436			return node !== lastValue ? (tracker.setValue(node), !0) : !1;
1437		}
1438		function escapeSelectorAttributeValueInsideDoubleQuotes(value) {
1439			return value.replace(escapeSelectorAttributeValueInsideDoubleQuotesRegex, function(ch) {
1440				return "\\" + ch.charCodeAt(0).toString(16) + " ";
1441			});
1442		}
1443		function validateInputProps(element, props) {
1444			void 0 === props.checked || void 0 === props.defaultChecked || didWarnCheckedDefaultChecked || (console.error("%s contains an input of type %s with both checked and defaultChecked props. Input elements must be either controlled or uncontrolled (specify either the checked prop, or the defaultChecked prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://react.dev/link/controlled-components", getCurrentFiberOwnerNameInDevOrNull() || "A component", props.type), didWarnCheckedDefaultChecked = !0);
1445			void 0 === props.value || void 0 === props.defaultValue || didWarnValueDefaultValue$1 || (console.error("%s contains an input of type %s with both value and defaultValue props. Input elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://react.dev/link/controlled-components", getCurrentFiberOwnerNameInDevOrNull() || "A component", props.type), didWarnValueDefaultValue$1 = !0);
1446		}
1447		function updateInput(element, value, defaultValue, lastDefaultValue, checked, defaultChecked, type, name) {
1448			element.name = "";
1449			null != type && "function" !== typeof type && "symbol" !== typeof type && "boolean" !== typeof type ? (checkAttributeStringCoercion(type, "type"), element.type = type) : element.removeAttribute("type");
1450			if (null != value) if ("number" === type) {
1451				if (0 === value && "" === element.value || element.value != value) element.value = "" + getToStringValue(value);
1452			} else element.value !== "" + getToStringValue(value) && (element.value = "" + getToStringValue(value));
1453			else "submit" !== type && "reset" !== type || element.removeAttribute("value");
1454			null != value ? "number" === type && element.value == value ? setDefaultValue(element, getToStringValue(element.value)) : setDefaultValue(element, getToStringValue(value)) : null != defaultValue ? setDefaultValue(element, getToStringValue(defaultValue)) : null != lastDefaultValue && element.removeAttribute("value");
1455			null == checked && null != defaultChecked && (element.defaultChecked = !!defaultChecked);
1456			null != checked && (element.checked = checked && "function" !== typeof checked && "symbol" !== typeof checked);
1457			null != name && "function" !== typeof name && "symbol" !== typeof name && "boolean" !== typeof name ? (checkAttributeStringCoercion(name, "name"), element.name = "" + getToStringValue(name)) : element.removeAttribute("name");
1458		}
1459		function initInput(element, value, defaultValue, checked, defaultChecked, type, name, isHydrating) {
1460			null != type && "function" !== typeof type && "symbol" !== typeof type && "boolean" !== typeof type && (checkAttributeStringCoercion(type, "type"), element.type = type);
1461			if (null != value || null != defaultValue) {
1462				if (!("submit" !== type && "reset" !== type || void 0 !== value && null !== value)) {
1463					track(element);
1464					return;
1465				}
1466				defaultValue = null != defaultValue ? "" + getToStringValue(defaultValue) : "";
1467				value = null != value ? "" + getToStringValue(value) : defaultValue;
1468				isHydrating || value === element.value || (element.value = value);
1469				element.defaultValue = value;
1470			}
1471			checked = null != checked ? checked : defaultChecked;
1472			checked = "function" !== typeof checked && "symbol" !== typeof checked && !!checked;
1473			element.checked = isHydrating ? element.checked : !!checked;
1474			element.defaultChecked = !!checked;
1475			null != name && "function" !== typeof name && "symbol" !== typeof name && "boolean" !== typeof name && (checkAttributeStringCoercion(name, "name"), element.name = name);
1476			track(element);
1477		}
1478		function setDefaultValue(node, value) {
1479			node.defaultValue !== "" + value && (node.defaultValue = "" + value);
1480		}
1481		function validateOptionProps(element, props) {
1482			props.value ?? ("object" === typeof props.children && null !== props.children ? React.Children.forEach(props.children, function(child) {
1483				null == child || "string" === typeof child || "number" === typeof child || "bigint" === typeof child || didWarnInvalidChild || (didWarnInvalidChild = !0, console.error("Cannot infer the option value of complex children. Pass a `value` prop or use a plain string as children to <option>."));
1484			}) : null == props.dangerouslySetInnerHTML || didWarnInvalidInnerHTML || (didWarnInvalidInnerHTML = !0, console.error("Pass a `value` prop if you set dangerouslyInnerHTML so React knows which value should be selected.")));
1485			null == props.selected || didWarnSelectedSetOnOption || (console.error("Use the `defaultValue` or `value` props on <select> instead of setting `selected` on <option>."), didWarnSelectedSetOnOption = !0);
1486		}
1487		function getDeclarationErrorAddendum() {
1488			var ownerName = getCurrentFiberOwnerNameInDevOrNull();
1489			return ownerName ? "\n\nCheck the render method of `" + ownerName + "`." : "";
1490		}
1491		function updateOptions(node, multiple, propValue, setDefaultSelected) {
1492			node = node.options;
1493			if (multiple) {
1494				multiple = {};
1495				for (var i = 0; i < propValue.length; i++) multiple["$" + propValue[i]] = !0;
1496				for (propValue = 0; propValue < node.length; propValue++) i = multiple.hasOwnProperty("$" + node[propValue].value), node[propValue].selected !== i && (node[propValue].selected = i), i && setDefaultSelected && (node[propValue].defaultSelected = !0);
1497			} else {
1498				propValue = "" + getToStringValue(propValue);
1499				multiple = null;
1500				for (i = 0; i < node.length; i++) {
1501					if (node[i].value === propValue) {
1502						node[i].selected = !0;
1503						setDefaultSelected && (node[i].defaultSelected = !0);
1504						return;
1505					}
1506					null !== multiple || node[i].disabled || (multiple = node[i]);
1507				}
1508				null !== multiple && (multiple.selected = !0);
1509			}
1510		}
1511		function validateSelectProps(element, props) {
1512			for (element = 0; element < valuePropNames.length; element++) {
1513				var propName = valuePropNames[element];
1514				if (null != props[propName]) {
1515					var propNameIsArray = isArrayImpl(props[propName]);
1516					props.multiple && !propNameIsArray ? console.error("The `%s` prop supplied to <select> must be an array if `multiple` is true.%s", propName, getDeclarationErrorAddendum()) : !props.multiple && propNameIsArray && console.error("The `%s` prop supplied to <select> must be a scalar value if `multiple` is false.%s", propName, getDeclarationErrorAddendum());
1517				}
1518			}
1519			void 0 === props.value || void 0 === props.defaultValue || didWarnValueDefaultValue || (console.error("Select elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled select element and remove one of these props. More info: https://react.dev/link/controlled-components"), didWarnValueDefaultValue = !0);
1520		}
1521		function validateTextareaProps(element, props) {
1522			void 0 === props.value || void 0 === props.defaultValue || didWarnValDefaultVal || (console.error("%s contains a textarea with both value and defaultValue props. Textarea elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled textarea and remove one of these props. More info: https://react.dev/link/controlled-components", getCurrentFiberOwnerNameInDevOrNull() || "A component"), didWarnValDefaultVal = !0);
1523			null != props.children && null == props.value && console.error("Use the `defaultValue` or `value` props instead of setting children on <textarea>.");
1524		}
1525		function updateTextarea(element, value, defaultValue) {
1526			if (null != value && (value = "" + getToStringValue(value), value !== element.value && (element.value = value), null == defaultValue)) {
1527				element.defaultValue !== value && (element.defaultValue = value);
1528				return;
1529			}
1530			element.defaultValue = null != defaultValue ? "" + getToStringValue(defaultValue) : "";
1531		}
1532		function initTextarea(element, value, defaultValue, children) {
1533			if (null == value) {
1534				if (null != children) {
1535					if (null != defaultValue) throw Error("If you supply `defaultValue` on a <textarea>, do not pass children.");
1536					if (isArrayImpl(children)) {
1537						if (1 < children.length) throw Error("<textarea> can only have at most one child.");
1538						children = children[0];
1539					}
1540					defaultValue = children;
1541				}
1542				defaultValue ??= "";
1543				value = defaultValue;
1544			}
1545			defaultValue = getToStringValue(value);
1546			element.defaultValue = defaultValue;
1547			children = element.textContent;
1548			children === defaultValue && "" !== children && null !== children && (element.value = children);
1549			track(element);
1550		}
1551		function findNotableNode(node, indent) {
1552			return void 0 === node.serverProps && 0 === node.serverTail.length && 1 === node.children.length && 3 < node.distanceFromLeaf && node.distanceFromLeaf > 15 - indent ? findNotableNode(node.children[0], indent) : node;
1553		}
1554		function indentation(indent) {
1555			return "  " + "  ".repeat(indent);
1556		}
1557		function added(indent) {
1558			return "+ " + "  ".repeat(indent);
1559		}
1560		function removed(indent) {
1561			return "- " + "  ".repeat(indent);
1562		}
1563		function describeFiberType(fiber) {
1564			switch (fiber.tag) {
1565				case 26:
1566				case 27:
1567				case 5: return fiber.type;
1568				case 16: return "Lazy";
1569				case 31: return "Activity";
1570				case 13: return "Suspense";
1571				case 19: return "SuspenseList";
1572				case 0:
1573				case 15: return fiber = fiber.type, fiber.displayName || fiber.name || null;
1574				case 11: return fiber = fiber.type.render, fiber.displayName || fiber.name || null;
1575				case 1: return fiber = fiber.type, fiber.displayName || fiber.name || null;
1576				default: return null;
1577			}
1578		}
1579		function describeTextNode(content, maxLength) {
1580			return needsEscaping.test(content) ? (content = JSON.stringify(content), content.length > maxLength - 2 ? 8 > maxLength ? "{\"...\"}" : "{" + content.slice(0, maxLength - 7) + "...\"}" : "{" + content + "}") : content.length > maxLength ? 5 > maxLength ? "{\"...\"}" : content.slice(0, maxLength - 3) + "..." : content;
1581		}
1582		function describeTextDiff(clientText, serverProps, indent) {
1583			var maxLength = 120 - 2 * indent;
1584			if (null === serverProps) return added(indent) + describeTextNode(clientText, maxLength) + "\n";
1585			if ("string" === typeof serverProps) {
1586				for (var firstDiff = 0; firstDiff < serverProps.length && firstDiff < clientText.length && serverProps.charCodeAt(firstDiff) === clientText.charCodeAt(firstDiff); firstDiff++);
1587				firstDiff > maxLength - 8 && 10 < firstDiff && (clientText = "..." + clientText.slice(firstDiff - 8), serverProps = "..." + serverProps.slice(firstDiff - 8));
1588				return added(indent) + describeTextNode(clientText, maxLength) + "\n" + removed(indent) + describeTextNode(serverProps, maxLength) + "\n";
1589			}
1590			return indentation(indent) + describeTextNode(clientText, maxLength) + "\n";
1591		}
1592		function objectName(object) {
1593			return Object.prototype.toString.call(object).replace(/^\[object (.*)\]$/, function(m, p0) {
1594				return p0;
1595			});
1596		}
1597		function describeValue(value, maxLength) {
1598			switch (typeof value) {
1599				case "string": return value = JSON.stringify(value), value.length > maxLength ? 5 > maxLength ? "\"...\"" : value.slice(0, maxLength - 4) + "...\"" : value;
1600				case "object":
1601					if (null === value) return "null";
1602					if (isArrayImpl(value)) return "[...]";
1603					if (value.$$typeof === REACT_ELEMENT_TYPE) return (maxLength = getComponentNameFromType(value.type)) ? "<" + maxLength + ">" : "<...>";
1604					var name = objectName(value);
1605					if ("Object" === name) {
1606						name = "";
1607						maxLength -= 2;
1608						for (var propName in value) if (value.hasOwnProperty(propName)) {
1609							var jsonPropName = JSON.stringify(propName);
1610							jsonPropName !== "\"" + propName + "\"" && (propName = jsonPropName);
1611							maxLength -= propName.length - 2;
1612							jsonPropName = describeValue(value[propName], 15 > maxLength ? maxLength : 15);
1613							maxLength -= jsonPropName.length;
1614							if (0 > maxLength) {
1615								name += "" === name ? "..." : ", ...";
1616								break;
1617							}
1618							name += ("" === name ? "" : ",") + propName + ":" + jsonPropName;
1619						}
1620						return "{" + name + "}";
1621					}
1622					return name;
1623				case "function": return (maxLength = value.displayName || value.name) ? "function " + maxLength : "function";
1624				default: return String(value);
1625			}
1626		}
1627		function describePropValue(value, maxLength) {
1628			return "string" !== typeof value || needsEscaping.test(value) ? "{" + describeValue(value, maxLength - 2) + "}" : value.length > maxLength - 2 ? 5 > maxLength ? "\"...\"" : "\"" + value.slice(0, maxLength - 5) + "...\"" : "\"" + value + "\"";
1629		}
1630		function describeExpandedElement(type, props, rowPrefix) {
1631			var remainingRowLength = 120 - rowPrefix.length - type.length, properties = [], propName;
1632			for (propName in props) if (props.hasOwnProperty(propName) && "children" !== propName) {
1633				var propValue = describePropValue(props[propName], 120 - rowPrefix.length - propName.length - 1);
1634				remainingRowLength -= propName.length + propValue.length + 2;
1635				properties.push(propName + "=" + propValue);
1636			}
1637			return 0 === properties.length ? rowPrefix + "<" + type + ">\n" : 0 < remainingRowLength ? rowPrefix + "<" + type + " " + properties.join(" ") + ">\n" : rowPrefix + "<" + type + "\n" + rowPrefix + "  " + properties.join("\n" + rowPrefix + "  ") + "\n" + rowPrefix + ">\n";
1638		}
1639		function describePropertiesDiff(clientObject, serverObject, indent) {
1640			var properties = "", remainingServerProperties = assign({}, serverObject), propName;
1641			for (propName in clientObject) if (clientObject.hasOwnProperty(propName)) {
1642				delete remainingServerProperties[propName];
1643				var maxLength = 120 - 2 * indent - propName.length - 2, clientPropValue = describeValue(clientObject[propName], maxLength);
1644				serverObject.hasOwnProperty(propName) ? (maxLength = describeValue(serverObject[propName], maxLength), properties += added(indent) + propName + ": " + clientPropValue + "\n", properties += removed(indent) + propName + ": " + maxLength + "\n") : properties += added(indent) + propName + ": " + clientPropValue + "\n";
1645			}
1646			for (var _propName in remainingServerProperties) remainingServerProperties.hasOwnProperty(_propName) && (clientObject = describeValue(remainingServerProperties[_propName], 120 - 2 * indent - _propName.length - 2), properties += removed(indent) + _propName + ": " + clientObject + "\n");
1647			return properties;
1648		}
1649		function describeElementDiff(type, clientProps, serverProps, indent) {
1650			var content = "", serverPropNames = /* @__PURE__ */ new Map();
1651			for (propName$jscomp$0 in serverProps) serverProps.hasOwnProperty(propName$jscomp$0) && serverPropNames.set(propName$jscomp$0.toLowerCase(), propName$jscomp$0);
1652			if (1 === serverPropNames.size && serverPropNames.has("children")) content += describeExpandedElement(type, clientProps, indentation(indent));
1653			else {
1654				for (var _propName2 in clientProps) if (clientProps.hasOwnProperty(_propName2) && "children" !== _propName2) {
1655					var maxLength$jscomp$0 = 120 - 2 * (indent + 1) - _propName2.length - 1, serverPropName = serverPropNames.get(_propName2.toLowerCase());
1656					if (void 0 !== serverPropName) {
1657						serverPropNames.delete(_propName2.toLowerCase());
1658						var propName$jscomp$0 = clientProps[_propName2];
1659						serverPropName = serverProps[serverPropName];
1660						var clientPropValue = describePropValue(propName$jscomp$0, maxLength$jscomp$0);
1661						maxLength$jscomp$0 = describePropValue(serverPropName, maxLength$jscomp$0);
1662						"object" === typeof propName$jscomp$0 && null !== propName$jscomp$0 && "object" === typeof serverPropName && null !== serverPropName && "Object" === objectName(propName$jscomp$0) && "Object" === objectName(serverPropName) && (2 < Object.keys(propName$jscomp$0).length || 2 < Object.keys(serverPropName).length || -1 < clientPropValue.indexOf("...") || -1 < maxLength$jscomp$0.indexOf("...")) ? content += indentation(indent + 1) + _propName2 + "={{\n" + describePropertiesDiff(propName$jscomp$0, serverPropName, indent + 2) + indentation(indent + 1) + "}}\n" : (content += added(indent + 1) + _propName2 + "=" + clientPropValue + "\n", content += removed(indent + 1) + _propName2 + "=" + maxLength$jscomp$0 + "\n");
1663					} else content += indentation(indent + 1) + _propName2 + "=" + describePropValue(clientProps[_propName2], maxLength$jscomp$0) + "\n";
1664				}
1665				serverPropNames.forEach(function(propName) {
1666					if ("children" !== propName) {
1667						var maxLength = 120 - 2 * (indent + 1) - propName.length - 1;
1668						content += removed(indent + 1) + propName + "=" + describePropValue(serverProps[propName], maxLength) + "\n";
1669					}
1670				});
1671				content = "" === content ? indentation(indent) + "<" + type + ">\n" : indentation(indent) + "<" + type + "\n" + content + indentation(indent) + ">\n";
1672			}
1673			type = serverProps.children;
1674			clientProps = clientProps.children;
1675			if ("string" === typeof type || "number" === typeof type || "bigint" === typeof type) {
1676				serverPropNames = "";
1677				if ("string" === typeof clientProps || "number" === typeof clientProps || "bigint" === typeof clientProps) serverPropNames = "" + clientProps;
1678				content += describeTextDiff(serverPropNames, "" + type, indent + 1);
1679			} else if ("string" === typeof clientProps || "number" === typeof clientProps || "bigint" === typeof clientProps) content = null == type ? content + describeTextDiff("" + clientProps, null, indent + 1) : content + describeTextDiff("" + clientProps, void 0, indent + 1);
1680			return content;
1681		}
1682		function describeSiblingFiber(fiber, indent) {
1683			var type = describeFiberType(fiber);
1684			if (null === type) {
1685				type = "";
1686				for (fiber = fiber.child; fiber;) type += describeSiblingFiber(fiber, indent), fiber = fiber.sibling;
1687				return type;
1688			}
1689			return indentation(indent) + "<" + type + ">\n";
1690		}
1691		function describeNode(node, indent) {
1692			var skipToNode = findNotableNode(node, indent);
1693			if (skipToNode !== node && (1 !== node.children.length || node.children[0] !== skipToNode)) return indentation(indent) + "...\n" + describeNode(skipToNode, indent + 1);
1694			skipToNode = "";
1695			var debugInfo = node.fiber._debugInfo;
1696			if (debugInfo) for (var i = 0; i < debugInfo.length; i++) {
1697				var serverComponentName = debugInfo[i].name;
1698				"string" === typeof serverComponentName && (skipToNode += indentation(indent) + "<" + serverComponentName + ">\n", indent++);
1699			}
1700			debugInfo = "";
1701			i = node.fiber.pendingProps;
1702			if (6 === node.fiber.tag) debugInfo = describeTextDiff(i, node.serverProps, indent), indent++;
1703			else if (serverComponentName = describeFiberType(node.fiber), null !== serverComponentName) if (void 0 === node.serverProps) {
1704				debugInfo = indent;
1705				var maxLength = 120 - 2 * debugInfo - serverComponentName.length - 2, content = "";
1706				for (propName in i) if (i.hasOwnProperty(propName) && "children" !== propName) {
1707					var propValue = describePropValue(i[propName], 15);
1708					maxLength -= propName.length + propValue.length + 2;
1709					if (0 > maxLength) {
1710						content += " ...";
1711						break;
1712					}
1713					content += " " + propName + "=" + propValue;
1714				}
1715				debugInfo = indentation(debugInfo) + "<" + serverComponentName + content + ">\n";
1716				indent++;
1717			} else null === node.serverProps ? (debugInfo = describeExpandedElement(serverComponentName, i, added(indent)), indent++) : "string" === typeof node.serverProps ? console.error("Should not have matched a non HostText fiber to a Text node. This is a bug in React.") : (debugInfo = describeElementDiff(serverComponentName, i, node.serverProps, indent), indent++);
1718			var propName = "";
1719			i = node.fiber.child;
1720			for (serverComponentName = 0; i && serverComponentName < node.children.length;) maxLength = node.children[serverComponentName], maxLength.fiber === i ? (propName += describeNode(maxLength, indent), serverComponentName++) : propName += describeSiblingFiber(i, indent), i = i.sibling;
1721			i && 0 < node.children.length && (propName += indentation(indent) + "...\n");
1722			i = node.serverTail;
1723			null === node.serverProps && indent--;
1724			for (node = 0; node < i.length; node++) serverComponentName = i[node], propName = "string" === typeof serverComponentName ? propName + (removed(indent) + describeTextNode(serverComponentName, 120 - 2 * indent) + "\n") : propName + describeExpandedElement(serverComponentName.type, serverComponentName.props, removed(indent));
1725			return skipToNode + debugInfo + propName;
1726		}
1727		function describeDiff(rootNode) {
1728			try {
1729				return "\n\n" + describeNode(rootNode, 0);
1730			} catch (x) {
1731				return "";
1732			}
1733		}
1734		function describeAncestors(ancestor, child, props) {
1735			for (var fiber = child, node = null, distanceFromLeaf = 0; fiber;) fiber === ancestor && (distanceFromLeaf = 0), node = {
1736				fiber,
1737				children: null !== node ? [node] : [],
1738				serverProps: fiber === child ? props : fiber === ancestor ? null : void 0,
1739				serverTail: [],
1740				distanceFromLeaf
1741			}, distanceFromLeaf++, fiber = fiber.return;
1742			return null !== node ? describeDiff(node).replaceAll(/^[+-]/gm, ">") : "";
1743		}
1744		function updatedAncestorInfoDev(oldInfo, tag) {
1745			var ancestorInfo = assign({}, oldInfo || emptyAncestorInfoDev), info = { tag };
1746			-1 !== inScopeTags.indexOf(tag) && (ancestorInfo.aTagInScope = null, ancestorInfo.buttonTagInScope = null, ancestorInfo.nobrTagInScope = null);
1747			-1 !== buttonScopeTags.indexOf(tag) && (ancestorInfo.pTagInButtonScope = null);
1748			-1 !== specialTags.indexOf(tag) && "address" !== tag && "div" !== tag && "p" !== tag && (ancestorInfo.listItemTagAutoclosing = null, ancestorInfo.dlItemTagAutoclosing = null);
1749			ancestorInfo.current = info;
1750			"form" === tag && (ancestorInfo.formTag = info);
1751			"a" === tag && (ancestorInfo.aTagInScope = info);
1752			"button" === tag && (ancestorInfo.buttonTagInScope = info);
1753			"nobr" === tag && (ancestorInfo.nobrTagInScope = info);
1754			"p" === tag && (ancestorInfo.pTagInButtonScope = info);
1755			"li" === tag && (ancestorInfo.listItemTagAutoclosing = info);
1756			if ("dd" === tag || "dt" === tag) ancestorInfo.dlItemTagAutoclosing = info;
1757			"#document" === tag || "html" === tag ? ancestorInfo.containerTagInScope = null : ancestorInfo.containerTagInScope || (ancestorInfo.containerTagInScope = info);
1758			null !== oldInfo || "#document" !== tag && "html" !== tag && "body" !== tag ? !0 === ancestorInfo.implicitRootScope && (ancestorInfo.implicitRootScope = !1) : ancestorInfo.implicitRootScope = !0;
1759			return ancestorInfo;
1760		}
1761		function isTagValidWithParent(tag, parentTag, implicitRootScope) {
1762			switch (parentTag) {
1763				case "tr": return "th" === tag || "td" === tag || "style" === tag || "script" === tag || "template" === tag;
1764				case "tbody":
1765				case "thead":
1766				case "tfoot": return "tr" === tag || "style" === tag || "script" === tag || "template" === tag;
1767				case "colgroup": return "col" === tag || "template" === tag;
1768				case "table": return "caption" === tag || "colgroup" === tag || "tbody" === tag || "tfoot" === tag || "thead" === tag || "style" === tag || "script" === tag || "template" === tag;
1769				case "head": return "base" === tag || "basefont" === tag || "bgsound" === tag || "link" === tag || "meta" === tag || "title" === tag || "noscript" === tag || "noframes" === tag || "style" === tag || "script" === tag || "template" === tag;
1770				case "html":
1771					if (implicitRootScope) break;
1772					return "head" === tag || "body" === tag || "frameset" === tag;
1773				case "frameset": return "frame" === tag;
1774				case "#document": if (!implicitRootScope) return "html" === tag;
1775			}
1776			switch (tag) {
1777				case "h1":
1778				case "h2":
1779				case "h3":
1780				case "h4":
1781				case "h5":
1782				case "h6": return "h1" !== parentTag && "h2" !== parentTag && "h3" !== parentTag && "h4" !== parentTag && "h5" !== parentTag && "h6" !== parentTag;
1783				case "rp":
1784				case "rt": return -1 === impliedEndTags.indexOf(parentTag);
1785				case "caption":
1786				case "col":
1787				case "colgroup":
1788				case "input": return "select" !== parentTag;
1789				case "frameset":
1790				case "frame":
1791				case "tbody":
1792				case "td":
1793				case "tfoot":
1794				case "th":
1795				case "thead":
1796				case "tr": return null == parentTag;
1797				case "head": return implicitRootScope || null === parentTag;
1798				case "html": return implicitRootScope && "#document" === parentTag || null === parentTag;
1799				case "body": return implicitRootScope && ("#document" === parentTag || "html" === parentTag) || null === parentTag;
1800			}
1801			return !0;
1802		}
1803		function findInvalidAncestorForTag(tag, ancestorInfo) {
1804			switch (tag) {
1805				case "address":
1806				case "article":
1807				case "aside":
1808				case "blockquote":
1809				case "center":
1810				case "details":
1811				case "dialog":
1812				case "dir":
1813				case "div":
1814				case "dl":
1815				case "fieldset":
1816				case "figcaption":
1817				case "figure":
1818				case "footer":
1819				case "header":
1820				case "hgroup":
1821				case "main":
1822				case "menu":
1823				case "nav":
1824				case "ol":
1825				case "p":
1826				case "section":
1827				case "summary":
1828				case "ul":
1829				case "pre":
1830				case "listing":
1831				case "table":
1832				case "hr":
1833				case "xmp":
1834				case "h1":
1835				case "h2":
1836				case "h3":
1837				case "h4":
1838				case "h5":
1839				case "h6": return ancestorInfo.pTagInButtonScope;
1840				case "form": return ancestorInfo.formTag || ancestorInfo.pTagInButtonScope;
1841				case "li": return ancestorInfo.listItemTagAutoclosing;
1842				case "dd":
1843				case "dt": return ancestorInfo.dlItemTagAutoclosing;
1844				case "button": return ancestorInfo.buttonTagInScope;
1845				case "a": return ancestorInfo.aTagInScope;
1846				case "nobr": return ancestorInfo.nobrTagInScope;
1847			}
1848			return null;
1849		}
1850		function findAncestor(parent, tagName) {
1851			for (; parent;) {
1852				switch (parent.tag) {
1853					case 5:
1854					case 26:
1855					case 27: if (parent.type === tagName) return parent;
1856				}
1857				parent = parent.return;
1858			}
1859			return null;
1860		}
1861		function validateDOMNesting(childTag, ancestorInfo) {
1862			ancestorInfo = ancestorInfo || emptyAncestorInfoDev;
1863			var parentInfo = ancestorInfo.current;
1864			ancestorInfo = (parentInfo = isTagValidWithParent(childTag, parentInfo && parentInfo.tag, ancestorInfo.implicitRootScope) ? null : parentInfo) ? null : findInvalidAncestorForTag(childTag, ancestorInfo);
1865			ancestorInfo = parentInfo || ancestorInfo;
1866			if (!ancestorInfo) return !0;
1867			var ancestorTag = ancestorInfo.tag;
1868			ancestorInfo = String(!!parentInfo) + "|" + childTag + "|" + ancestorTag;
1869			if (didWarn[ancestorInfo]) return !1;
1870			didWarn[ancestorInfo] = !0;
1871			var ancestor = (ancestorInfo = current) ? findAncestor(ancestorInfo.return, ancestorTag) : null, ancestorDescription = null !== ancestorInfo && null !== ancestor ? describeAncestors(ancestor, ancestorInfo, null) : "", tagDisplayName = "<" + childTag + ">";
1872			parentInfo ? (parentInfo = "", "table" === ancestorTag && "tr" === childTag && (parentInfo += " Add a <tbody>, <thead> or <tfoot> to your code to match the DOM tree generated by the browser."), console.error("In HTML, %s cannot be a child of <%s>.%s\nThis will cause a hydration error.%s", tagDisplayName, ancestorTag, parentInfo, ancestorDescription)) : console.error("In HTML, %s cannot be a descendant of <%s>.\nThis will cause a hydration error.%s", tagDisplayName, ancestorTag, ancestorDescription);
1873			ancestorInfo && (childTag = ancestorInfo.return, null === ancestor || null === childTag || ancestor === childTag && childTag._debugOwner === ancestorInfo._debugOwner || runWithFiberInDEV(ancestor, function() {
1874				console.error("<%s> cannot contain a nested %s.\nSee this log for the ancestor stack trace.", ancestorTag, tagDisplayName);
1875			}));
1876			return !1;
1877		}
1878		function validateTextNesting(childText, parentTag, implicitRootScope) {
1879			if (implicitRootScope || isTagValidWithParent("#text", parentTag, !1)) return !0;
1880			implicitRootScope = "#text|" + parentTag;
1881			if (didWarn[implicitRootScope]) return !1;
1882			didWarn[implicitRootScope] = !0;
1883			var ancestor = (implicitRootScope = current) ? findAncestor(implicitRootScope, parentTag) : null;
1884			implicitRootScope = null !== implicitRootScope && null !== ancestor ? describeAncestors(ancestor, implicitRootScope, 6 !== implicitRootScope.tag ? { children: null } : null) : "";
1885			/\S/.test(childText) ? console.error("In HTML, text nodes cannot be a child of <%s>.\nThis will cause a hydration error.%s", parentTag, implicitRootScope) : console.error("In HTML, whitespace text nodes cannot be a child of <%s>. Make sure you don't have any extra whitespace between tags on each line of your source code.\nThis will cause a hydration error.%s", parentTag, implicitRootScope);
1886			return !1;
1887		}
1888		function setTextContent(node, text) {
1889			if (text) {
1890				var firstChild = node.firstChild;
1891				if (firstChild && firstChild === node.lastChild && 3 === firstChild.nodeType) {
1892					firstChild.nodeValue = text;
1893					return;
1894				}
1895			}
1896			node.textContent = text;
1897		}
1898		function camelize(string) {
1899			return string.replace(hyphenPattern, function(_, character) {
1900				return character.toUpperCase();
1901			});
1902		}
1903		function setValueForStyle(style, styleName, value) {
1904			var isCustomProperty = 0 === styleName.indexOf("--");
1905			isCustomProperty || (-1 < styleName.indexOf("-") ? warnedStyleNames.hasOwnProperty(styleName) && warnedStyleNames[styleName] || (warnedStyleNames[styleName] = !0, console.error("Unsupported style property %s. Did you mean %s?", styleName, camelize(styleName.replace(msPattern, "ms-")))) : badVendoredStyleNamePattern.test(styleName) ? warnedStyleNames.hasOwnProperty(styleName) && warnedStyleNames[styleName] || (warnedStyleNames[styleName] = !0, console.error("Unsupported vendor-prefixed style property %s. Did you mean %s?", styleName, styleName.charAt(0).toUpperCase() + styleName.slice(1))) : !badStyleValueWithSemicolonPattern.test(value) || warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value] || (warnedStyleValues[value] = !0, console.error("Style property values shouldn't contain a semicolon. Try \"%s: %s\" instead.", styleName, value.replace(badStyleValueWithSemicolonPattern, ""))), "number" === typeof value && (isNaN(value) ? warnedForNaNValue || (warnedForNaNValue = !0, console.error("`NaN` is an invalid value for the `%s` css style property.", styleName)) : isFinite(value) || warnedForInfinityValue || (warnedForInfinityValue = !0, console.error("`Infinity` is an invalid value for the `%s` css style property.", styleName))));
1906			null == value || "boolean" === typeof value || "" === value ? isCustomProperty ? style.setProperty(styleName, "") : "float" === styleName ? style.cssFloat = "" : style[styleName] = "" : isCustomProperty ? style.setProperty(styleName, value) : "number" !== typeof value || 0 === value || unitlessNumbers.has(styleName) ? "float" === styleName ? style.cssFloat = value : (checkCSSPropertyStringCoercion(value, styleName), style[styleName] = ("" + value).trim()) : style[styleName] = value + "px";
1907		}
1908		function setValueForStyles(node, styles, prevStyles) {
1909			if (null != styles && "object" !== typeof styles) throw Error("The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + 'em'}} when using JSX.");
1910			styles && Object.freeze(styles);
1911			node = node.style;
1912			if (null != prevStyles) {
1913				if (styles) {
1914					var expandedUpdates = {};
1915					if (prevStyles) {
1916						for (var key in prevStyles) if (prevStyles.hasOwnProperty(key) && !styles.hasOwnProperty(key)) for (var longhands = shorthandToLonghand[key] || [key], i = 0; i < longhands.length; i++) expandedUpdates[longhands[i]] = key;
1917					}
1918					for (var _key in styles) if (styles.hasOwnProperty(_key) && (!prevStyles || prevStyles[_key] !== styles[_key])) for (key = shorthandToLonghand[_key] || [_key], longhands = 0; longhands < key.length; longhands++) expandedUpdates[key[longhands]] = _key;
1919					_key = {};
1920					for (var key$jscomp$0 in styles) for (key = shorthandToLonghand[key$jscomp$0] || [key$jscomp$0], longhands = 0; longhands < key.length; longhands++) _key[key[longhands]] = key$jscomp$0;
1921					key$jscomp$0 = {};
1922					for (var _key2 in expandedUpdates) if (key = expandedUpdates[_key2], (longhands = _key[_key2]) && key !== longhands && (i = key + "," + longhands, !key$jscomp$0[i])) {
1923						key$jscomp$0[i] = !0;
1924						i = console;
1925						var value = styles[key];
1926						i.error.call(i, "%s a style property during rerender (%s) when a conflicting property is set (%s) can lead to styling bugs. To avoid this, don't mix shorthand and non-shorthand properties for the same value; instead, replace the shorthand with separate values.", null == value || "boolean" === typeof value || "" === value ? "Removing" : "Updating", key, longhands);
1927					}
1928				}
1929				for (var styleName in prevStyles) !prevStyles.hasOwnProperty(styleName) || null != styles && styles.hasOwnProperty(styleName) || (0 === styleName.indexOf("--") ? node.setProperty(styleName, "") : "float" === styleName ? node.cssFloat = "" : node[styleName] = "", viewTransitionMutationContext = !0);
1930				for (var _styleName in styles) _key2 = styles[_styleName], styles.hasOwnProperty(_styleName) && prevStyles[_styleName] !== _key2 && (setValueForStyle(node, _styleName, _key2), viewTransitionMutationContext = !0);
1931			}
1931 else for (expandedUpdates in styles) styles.hasOwnProperty(expandedUpdates) && setValueForStyle(node, expandedUpdates, styles[expandedUpdates]);
1932		}
1933		function isCustomElement(tagName) {
1934			if (-1 === tagName.indexOf("-")) return !1;
1935			switch (tagName) {
1936				case "annotation-xml":
1937				case "color-profile":
1938				case "font-face":
1939				case "font-face-src":
1940				case "font-face-uri":
1941				case "font-face-format":
1942				case "font-face-name":
1943				case "missing-glyph": return !1;
1944				default: return !0;
1945			}
1946		}
1947		function getAttributeAlias(name) {
1948			return aliases.get(name) || name;
1949		}
1950		function validateProperty$1(tagName, name) {
1951			if (hasOwnProperty.call(warnedProperties$1, name) && warnedProperties$1[name]) return !0;
1952			if (rARIACamel$1.test(name)) {
1953				tagName = "aria-" + name.slice(4).toLowerCase();
1954				tagName = ariaProperties.hasOwnProperty(tagName) ? tagName : null;
1955				if (null == tagName) return console.error("Invalid ARIA attribute `%s`. ARIA attributes follow the pattern aria-* and must be lowercase.", name), warnedProperties$1[name] = !0;
1956				if (name !== tagName) return console.error("Invalid ARIA attribute `%s`. Did you mean `%s`?", name, tagName), warnedProperties$1[name] = !0;
1957			}
1958			if (rARIA$1.test(name)) {
1959				tagName = name.toLowerCase();
1960				tagName = ariaProperties.hasOwnProperty(tagName) ? tagName : null;
1961				if (null == tagName) return warnedProperties$1[name] = !0, !1;
1962				name !== tagName && (console.error("Unknown ARIA attribute `%s`. Did you mean `%s`?", name, tagName), warnedProperties$1[name] = !0);
1963			}
1964			return !0;
1965		}
1966		function validateProperties$2(type, props) {
1967			var invalidProps = [], key;
1968			for (key in props) validateProperty$1(type, key) || invalidProps.push(key);
1969			props = invalidProps.map(function(prop) {
1970				return "`" + prop + "`";
1971			}).join(", ");
1972			1 === invalidProps.length ? console.error("Invalid aria prop %s on <%s> tag. For details, see https://react.dev/link/invalid-aria-props", props, type) : 1 < invalidProps.length && console.error("Invalid aria props %s on <%s> tag. For details, see https://react.dev/link/invalid-aria-props", props, type);
1973		}
1974		function validateProperty(tagName, name, value, eventRegistry) {
1975			if (hasOwnProperty.call(warnedProperties, name) && warnedProperties[name]) return !0;
1976			var lowerCasedName = name.toLowerCase();
1977			if ("onfocusin" === lowerCasedName || "onfocusout" === lowerCasedName) return console.error("React uses onFocus and onBlur instead of onFocusIn and onFocusOut. All React events are normalized to bubble, so onFocusIn and onFocusOut are not needed/supported by React."), warnedProperties[name] = !0;
1978			if ("function" === typeof value && ("form" === tagName && "action" === name || "input" === tagName && "formAction" === name || "button" === tagName && "formAction" === name)) return !0;
1979			if (null != eventRegistry) {
1980				tagName = eventRegistry.possibleRegistrationNames;
1981				if (eventRegistry.registrationNameDependencies.hasOwnProperty(name)) return !0;
1982				eventRegistry = tagName.hasOwnProperty(lowerCasedName) ? tagName[lowerCasedName] : null;
1983				if (null != eventRegistry) return console.error("Invalid event handler property `%s`. Did you mean `%s`?", name, eventRegistry), warnedProperties[name] = !0;
1984				if (EVENT_NAME_REGEX.test(name)) return console.error("Unknown event handler property `%s`. It will be ignored.", name), warnedProperties[name] = !0;
1985			} else if (EVENT_NAME_REGEX.test(name)) return INVALID_EVENT_NAME_REGEX.test(name) && console.error("Invalid event handler property `%s`. React events use the camelCase naming convention, for example `onClick`.", name), warnedProperties[name] = !0;
1986			if (rARIA.test(name) || rARIACamel.test(name)) return !0;
1987			if ("innerhtml" === lowerCasedName) return console.error("Directly setting property `innerHTML` is not permitted. For more information, lookup documentation on `dangerouslySetInnerHTML`."), warnedProperties[name] = !0;
1988			if ("aria" === lowerCasedName) return console.error("The `aria` attribute is reserved for future use in React. Pass individual `aria-` attributes instead."), warnedProperties[name] = !0;
1989			if ("is" === lowerCasedName && null !== value && void 0 !== value && "string" !== typeof value) return console.error("Received a `%s` for a string attribute `is`. If this is expected, cast the value to a string.", typeof value), warnedProperties[name] = !0;
1990			if ("number" === typeof value && isNaN(value)) return console.error("Received NaN for the `%s` attribute. If this is expected, cast the value to a string.", name), warnedProperties[name] = !0;
1991			if (possibleStandardNames.hasOwnProperty(lowerCasedName)) {
1992				if (lowerCasedName = possibleStandardNames[lowerCasedName], lowerCasedName !== name) return console.error("Invalid DOM property `%s`. Did you mean `%s`?", name, lowerCasedName), warnedProperties[name] = !0;
1993			} else if (name !== lowerCasedName) return console.error("React does not recognize the `%s` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `%s` instead. If you accidentally passed it from a parent component, remove it from the DOM element.", name, lowerCasedName), warnedProperties[name] = !0;
1994			switch (name) {
1995				case "dangerouslySetInnerHTML":
1996				case "children":
1997				case "style":
1998				case "suppressContentEditableWarning":
1999				case "suppressHydrationWarning":
2000				case "defaultValue":
2001				case "defaultChecked":
2002				case "innerHTML":
2003				case "ref": return !0;
2004				case "innerText":
2005				case "textContent": return !0;
2006			}
2007			switch (typeof value) {
2008				case "boolean": switch (name) {
2009					case "autoFocus":
2010					case "checked":
2011					case "multiple":
2012					case "muted":
2013					case "selected":
2014					case "contentEditable":
2015					case "spellCheck":
2016					case "draggable":
2017					case "value":
2018					case "autoReverse":
2019					case "externalResourcesRequired":
2020					case "focusable":
2021					case "preserveAlpha":
2022					case "allowFullScreen":
2023					case "async":
2024					case "autoPlay":
2025					case "controls":
2026					case "credentialless":
2027					case "default":
2028					case "defer":
2029					case "disabled":
2030					case "disablePictureInPicture":
2031					case "disableRemotePlayback":
2032					case "formNoValidate":
2033					case "hidden":
2034					case "loop":
2035					case "noModule":
2036					case "noValidate":
2037					case "open":
2038					case "playsInline":
2039					case "readOnly":
2040					case "required":
2041					case "reversed":
2042					case "scoped":
2043					case "seamless":
2044					case "itemScope":
2045					case "capture":
2046					case "download":
2047					case "inert": return !0;
2048					default:
2049						lowerCasedName = name.toLowerCase().slice(0, 5);
2050						if ("data-" === lowerCasedName || "aria-" === lowerCasedName) return !0;
2051						value ? console.error("Received `%s` for a non-boolean attribute `%s`.\n\nIf you want to write it to the DOM, pass a string instead: %s=\"%s\" or %s={value.toString()}.", value, name, name, value, name) : console.error("Received `%s` for a non-boolean attribute `%s`.\n\nIf you want to write it to the DOM, pass a string instead: %s=\"%s\" or %s={value.toString()}.\n\nIf you used to conditionally omit it with %s={condition && value}, pass %s={condition ? value : undefined} instead.", value, name, name, value, name, name, name);
2052						return warnedProperties[name] = !0;
2053				}
2054				case "function":
2055				case "symbol": return warnedProperties[name] = !0, !1;
2056				case "string": if ("false" === value || "true" === value) {
2057					switch (name) {
2058						case "checked":
2059						case "selected":
2060						case "multiple":
2061						case "muted":
2062						case "allowFullScreen":
2063						case "async":
2064						case "autoPlay":
2065						case "controls":
2066						case "credentialless":
2067						case "default":
2068						case "defer":
2069						case "disabled":
2070						case "disablePictureInPicture":
2071						case "disableRemotePlayback":
2072						case "formNoValidate":
2073						case "hidden":
2074						case "loop":
2075						case "noModule":
2076						case "noValidate":
2077						case "open":
2078						case "playsInline":
2079						case "readOnly":
2080						case "required":
2081						case "reversed":
2082						case "scoped":
2083						case "seamless":
2084						case "itemScope":
2085						case "inert": break;
2086						default: return !0;
2087					}
2088					console.error("Received the string `%s` for the boolean attribute `%s`. %s Did you mean %s={%s}?", value, name, "false" === value ? "The browser will interpret it as a truthy value." : "Although this works, it will not work as expected if you pass the string \"fal
2088se\".", name, value);
2089					warnedProperties[name] = !0;
2090				}
2091			}
2092			return !0;
2093		}
2094		function warnUnknownProperties(type, props, eventRegistry) {
2095			var unknownProps = [], key;
2096			for (key in props) validateProperty(type, key, props[key], eventRegistry) || unknownProps.push(key);
2097			props = unknownProps.map(function(prop) {
2098				return "`" + prop + "`";
2099			}).join(", ");
2100			1 === unknownProps.length ? console.error("Invalid value for prop %s on <%s> tag. Either remove it from the element, or pass a string or number value to keep it in the DOM. For details, see https://react.dev/link/attribute-behavior ", props, type) : 1 < unknownProps.length && console.error("Invalid values for props %s on <%s> tag. Either remove them from the element, or pass a string or number value to keep them in the DOM. For details, see https://react.dev/link/attribute-behavior ", props, type);
2101		}
2102		function sanitizeURL(url) {
2103			return isJavaScriptProtocol.test("" + url) ? "javascript:throw new Error('React has blocked a javascript: URL as a security precaution.')" : url;
2104		}
2105		function noop$1() {}
2106		function getEventTarget(nativeEvent) {
2107			nativeEvent = nativeEvent.target || nativeEvent.srcElement || window;
2108			nativeEvent.correspondingUseElement && (nativeEvent = nativeEvent.correspondingUseElement);
2109			return 3 === nativeEvent.nodeType ? nativeEvent.parentNode : nativeEvent;
2110		}
2111		function restoreStateOfTarget(target) {
2112			var internalInstance = getInstanceFromNode(target);
2113			if (internalInstance && (target = internalInstance.stateNode)) {
2114				var props = target[internalPropsKey] || null;
2115				a: switch (target = internalInstance.stateNode, internalInstance.type) {
2116					case "input":
2117						updateInput(target, props.value, props.defaultValue, props.defaultValue, props.checked, props.defaultChecked, props.type, props.name);
2118						internalInstance = props.name;
2119						if ("radio" === props.type && null != internalInstance) {
2120							for (props = target; props.parentNode;) props = props.parentNode;
2121							checkAttributeStringCoercion(internalInstance, "name");
2122							props = props.querySelectorAll("input[name=\"" + escapeSelectorAttributeValueInsideDoubleQuotes("" + internalInstance) + "\"][type=\"radio\"]");
2123							for (internalInstance = 0; internalInstance < props.length; internalInstance++) {
2124								var otherNode = props[internalInstance];
2125								if (otherNode !== target && otherNode.form === target.form) {
2126									var otherProps = otherNode[internalPropsKey] || null;
2127									if (!otherProps) throw Error("ReactDOMInput: Mixing React and non-React radio inputs with the same `name` is not supported.");
2128									updateInput(otherNode, otherProps.value, otherProps.defaultValue, otherProps.defaultValue, otherProps.checked, otherProps.defaultChecked, otherProps.type, otherProps.name);
2129								}
2130							}
2131							for (internalInstance = 0; internalInstance < props.length; internalInstance++) otherNode = props[internalInstance], otherNode.form === target.form && updateValueIfChanged(otherNode);
2132						}
2133						break a;
2134					case "textarea":
2135						updateTextarea(target, props.value, props.defaultValue);
2136						break a;
2137					case "select": internalInstance = props.value, null != internalInstance && updateOptions(target, !!props.multiple, internalInstance, !1);
2138				}
2139			}
2140		}
2141		function batchedUpdates$1(fn, a, b) {
2142			if (isInsideEventHandler) return fn(a, b);
2143			isInsideEventHandler = !0;
2144			try {
2145				return fn(a);
2146			} finally {
2147				if (isInsideEventHandler = !1, null !== restoreTarget || null !== restoreQueue) {
2148					if (flushSyncWork$1(), restoreTarget && (a = restoreTarget, fn = restoreQueue, restoreQueue = restoreTarget = null, restoreStateOfTarget(a), fn)) for (a = 0; a < fn.length; a++) restoreStateOfTarget(fn[a]);
2149				}
2150			}
2151		}
2152		function getListener(inst, registrationName) {
2153			var stateNode = inst.stateNode;
2154			if (null === stateNode) return null;
2155			var props = stateNode[internalPropsKey] || null;
2156			if (null === props) return null;
2157			stateNode = props[registrationName];
2158			a: switch (registrationName) {
2159				case "onClick":
vendor: 6,006 bytes, lines 2160-2283
2160				case "onClickCapture":
2161				case "onDoubleClick":
2162				case "onDoubleClickCapture":
2163				case "onMouseDown":
2164				case "onMouseDownCapture":
2165				case "onMouseMove":
2166				case "onMouseMoveCapture":
2167				case "onMouseUp":
2168				case "onMouseUpCapture":
2169				case "onMouseEnter":
2170					(props = !props.disabled) || (inst = inst.type, props = !("button" === inst || "input" === inst || "select" === inst || "textarea" === inst));
2171					inst = !props;
2172					break a;
2173				default: inst = !1;
2174			}
2175			if (inst) return null;
2176			if (stateNode && "function" !== typeof stateNode) throw Error("Expected `" + registrationName + "` listener to be a function, instead got a value of `" + typeof stateNode + "` type.");
2177			return stateNode;
2178		}
2179		function getData() {
2180			if (fallbackText) return fallbackText;
2181			var start, startValue = startText, startLength = startValue.length, end, endValue = "value" in root ? root.value : root.textContent, endLength = endValue.length;
2182			for (start = 0; start < startLength && startValue[start] === endValue[start]; start++);
2183			var minEnd = startLength - start;
2184			for (end = 1; end <= minEnd && startValue[startLength - end] === endValue[endLength - end]; end++);
2185			return fallbackText = endValue.slice(start, 1 < end ? 1 - end : void 0);
2186		}
2187		function getEventCharCode(nativeEvent) {
2188			var keyCode = nativeEvent.keyCode;
2189			"charCode" in nativeEvent ? (nativeEvent = nativeEvent.charCode, 0 === nativeEvent && 13 === keyCode && (nativeEvent = 13)) : nativeEvent = keyCode;
2190			10 === nativeEvent && (nativeEvent = 13);
2191			return 32 <= nativeEvent || 13 === nativeEvent ? nativeEvent : 0;
2192		}
2193		function functionThatReturnsTrue() {
2194			return !0;
2195		}
2196		function functionThatReturnsFalse() {
2197			return !1;
2198		}
2199		function createSyntheticEvent(Interface) {
2200			function SyntheticBaseEvent(reactName, reactEventType, targetInst, nativeEvent, nativeEventTarget) {
2201				this._reactName = reactName;
2202				this._targetInst = targetInst;
2203				this.type = reactEventType;
2204				this.nativeEvent = nativeEvent;
2205				this.target = nativeEventTarget;
2206				this.currentTarget = null;
2207				for (var propName in Interface) Interface.hasOwnProperty(propName) && (reactName = Interface[propName], this[propName] = reactName ? reactName(nativeEvent) : nativeEvent[propName]);
2208				this.isDefaultPrevented = (null != nativeEvent.defaultPrevented ? nativeEvent.defaultPrevented : !1 === nativeEvent.returnValue) ? functionThatReturnsTrue : functionThatReturnsFalse;
2209				this.isPropagationStopped = functionThatReturnsFalse;
2210				return this;
2211			}
2212			assign(SyntheticBaseEvent.prototype, {
2213				preventDefault: function() {
2214					this.defaultPrevented = !0;
2215					var event = this.nativeEvent;
2216					event && (event.preventDefault ? event.preventDefault() : "unknown" !== typeof event.returnValue && (event.returnValue = !1), this.isDefaultPrevented = functionThatReturnsTrue);
2217				},
2218				stopPropagation: function() {
2219					var event = this.nativeEvent;
2220					event && (event.stopPropagation ? event.stopPropagation() : "unknown" !== typeof event.cancelBubble && (event.cancelBubble = !0), this.isPropagationStopped = functionThatReturnsTrue);
2221				},
2222				persist: function() {},
2223				isPersistent: functionThatReturnsTrue
2224			});
2225			return SyntheticBaseEvent;
2226		}
2227		function modifierStateGetter(keyArg) {
2228			var nativeEvent = this.nativeEvent;
2229			return nativeEvent.getModifierState ? nativeEvent.getModifierState(keyArg) : (keyArg = modifierKeyToProp[keyArg]) ? !!nativeEvent[keyArg] : !1;
2230		}
2231		function getEventModifierState() {
2232			return modifierStateGetter;
2233		}
2234		function isFallbackCompositionEnd(domEventName, nativeEvent) {
2235			switch (domEventName) {
2236				case "keyup": return -1 !== END_KEYCODES.indexOf(nativeEvent.keyCode);
2237				case "keydown": return nativeEvent.keyCode !== START_KEYCODE;
2238				case "keypress":
2239				case "mousedown":
2240				case "focusout": return !0;
2241				default: return !1;
2242			}
2243		}
2244		function getDataFromCustomEvent(nativeEvent) {
2245			nativeEvent = nativeEvent.detail;
2246			return "object" === typeof nativeEvent && "data" in nativeEvent ? nativeEvent.data : null;
2247		}
2248		function getNativeBeforeInputChars(domEventName, nativeEvent) {
2249			switch (domEventName) {
2250				case "compositionend": return getDataFromCustomEvent(nativeEvent);
2251				case "keypress":
2252					if (nativeEvent.which !== SPACEBAR_CODE) return null;
2253					hasSpaceKeypress = !0;
2254					return SPACEBAR_CHAR;
2255				case "textInput": return domEventName = nativeEvent.data, domEventName === SPACEBAR_CHAR && hasSpaceKeypress ? null : domEventName;
2256				default: return null;
2257			}
2258		}
2259		function getFallbackBeforeInputChars(domEventName, nativeEvent) {
2260			if (isComposing) return "compositionend" === domEventName || !canUseCompositionEvent && isFallbackCompositionEnd(domEventName, nativeEvent) ? (domEventName = getData(), fallbackText = startText = root = null, isComposing = !1, domEventName) : null;
2261			switch (domEventName) {
2262				case "paste": return null;
2263				case "keypress":
2264					if (!(nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) || nativeEvent.ctrlKey && nativeEvent.altKey) {
2265						if (nativeEvent.char && 1 < nativeEvent.char.length) return nativeEvent.char;
2266						if (nativeEvent.which) return String.fromCharCode(nativeEvent.which);
2267					}
2268					return null;
2269				case "compositionend": return useFallbackCompositionData && "ko" !== nativeEvent.locale ? null : nativeEvent.data;
2270				default: return null;
2271			}
2272		}
2273		function isTextInputElement(elem) {
2274			var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();
2275			return "input" === nodeName ? !!supportedInputTypes[elem.type] : "textarea" === nodeName ? !0 : !1;
2276		}
2277		function isEventSupported(eventNameSuffix) {
2278			if (!canUseDOM) return !1;
2279			eventNameSuffix = "on" + eventNameSuffix;
2280			var isSupported = eventNameSuffix in document;
2281			isSupported || (isSupported = document.createElement("div"), isSupported.setAttribute(eventNameSuffix, "return;"), isSupported = "function" === typeof isSupported[eventNameSuffix]);
2282			return isSupported;
2283		}
vendor: 5,188 bytes, lines 2284-2395
2284		function createAndAccumulateChangeEvent(dispatchQueue, inst, nativeEvent, target) {
2285			restoreTarget ? restoreQueue ? restoreQueue.push(target) : restoreQueue = [target] : restoreTarget = target;
2286			inst = accumulateTwoPhaseListeners(inst, "onChange");
2287			0 < inst.length && (nativeEvent = new SyntheticEvent("onChange", "change", null, nativeEvent, target), dispatchQueue.push({
2288				event: nativeEvent,
2289				listeners: inst
2290			}));
2291		}
2292		function runEventInBatch(dispatchQueue) {
2293			processDispatchQueue(dispatchQueue, 0);
2294		}
2295		function getInstIfValueChanged(targetInst) {
2296			if (updateValueIfChanged(getNodeFromInstance(targetInst))) return targetInst;
2297		}
2298		function getTargetInstForChangeEvent(domEventName, targetInst) {
2299			if ("change" === domEventName) return targetInst;
2300		}
2301		function stopWatchingForValueChange() {
2302			activeElement$1 && (activeElement$1.detachEvent("onpropertychange", handlePropertyChange), activeElementInst$1 = activeElement$1 = null);
2303		}
2304		function handlePropertyChange(nativeEvent) {
2305			if ("value" === nativeEvent.propertyName && getInstIfValueChanged(activeElementInst$1)) {
2306				var dispatchQueue = [];
2307				createAndAccumulateChangeEvent(dispatchQueue, activeElementInst$1, nativeEvent, getEventTarget(nativeEvent));
2308				batchedUpdates$1(runEventInBatch, dispatchQueue);
2309			}
2310		}
2311		function handleEventsForInputEventPolyfill(domEventName, target, targetInst) {
2312			"focusin" === domEventName ? (stopWatchingForValueChange(), activeElement$1 = target, activeElementInst$1 = targetInst, activeElement$1.attachEvent("onpropertychange", handlePropertyChange)) : "focusout" === domEventName && stopWatchingForValueChange();
2313		}
2314		function getTargetInstForInputEventPolyfill(domEventName) {
2315			if ("selectionchange" === domEventName || "keyup" === domEventName || "keydown" === domEventName) return getInstIfValueChanged(activeElementInst$1);
2316		}
2317		function getTargetInstForClickEvent(domEventName, targetInst) {
2318			if ("click" === domEventName) return getInstIfValueChanged(targetInst);
2319		}
2320		function getTargetInstForInputOrChangeEvent(domEventName, targetInst) {
2321			if ("input" === domEventName || "change" === domEventName) return getInstIfValueChanged(targetInst);
2322		}
2323		function is(x, y) {
2324			return x === y && (0 !== x || 1 / x === 1 / y) || x !== x && y !== y;
2325		}
2326		function shallowEqual(objA, objB) {
2327			if (objectIs(objA, objB)) return !0;
2328			if ("object" !== typeof objA || null === objA || "object" !== typeof objB || null === objB) return !1;
2329			var keysA = Object.keys(objA), keysB = Object.keys(objB);
2330			if (keysA.length !== keysB.length) return !1;
2331			for (keysB = 0; keysB < keysA.length; keysB++) {
2332				var currentKey = keysA[keysB];
2333				if (!hasOwnProperty.call(objB, currentKey) || !objectIs(objA[currentKey], objB[currentKey])) return !1;
2334			}
2335			return !0;
2336		}
2337		function getActiveElement(doc) {
2338			doc = doc || ("undefined" !== typeof document ? document : void 0);
2339			if ("undefined" === typeof doc) return null;
2340			try {
2341				return doc.activeElement || doc.body;
2342			} catch (e$2) {
2343				return doc.body;
2344			}
2345		}
2346		function getLeafNode(node) {
2347			for (; node && node.firstChild;) node = node.firstChild;
2348			return node;
2349		}
2350		function getNodeForCharacterOffset(root, offset) {
2351			var node = getLeafNode(root);
2352			root = 0;
2353			for (var nodeEnd; node;) {
2354				if (3 === node.nodeType) {
2355					nodeEnd = root + node.textContent.length;
2356					if (root <= offset && nodeEnd >= offset) return {
2357						node,
2358						offset: offset - root
2359					};
2360					root = nodeEnd;
2361				}
2362				a: {
2363					for (; node;) {
2364						if (node.nextSibling) {
2365							node = node.nextSibling;
2366							break a;
2367						}
2368						node = node.parentNode;
2369					}
2370					node = void 0;
2371				}
2372				node = getLeafNode(node);
2373			}
2374		}
2375		function containsNode(outerNode, innerNode) {
2376			return outerNode && innerNode ? outerNode === innerNode ? !0 : outerNode && 3 === outerNode.nodeType ? !1 : innerNode && 3 === innerNode.nodeType ? containsNode(outerNode, innerNode.parentNode) : "contains" in outerNode ? outerNode.contains(innerNode) : outerNode.compareDocumentPosition ? !!(outerNode.compareDocumentPosition(innerNode) & 16) : !1 : !1;
2377		}
2378		function getActiveElementDeep(containerInfo) {
2379			containerInfo = null != containerInfo && null != containerInfo.ownerDocument && null != containerInfo.ownerDocument.defaultView ? containerInfo.ownerDocument.defaultView : window;
2380			for (var element = getActiveElement(containerInfo.document); element instanceof containerInfo.HTMLIFrameElement;) {
2381				try {
2382					var JSCompiler_inline_result = "string" === typeof element.contentWindow.location.href;
2383				} catch (err) {
2384					JSCompiler_inline_result = !1;
2385				}
2386				if (JSCompiler_inline_result) containerInfo = element.contentWindow;
2387				else break;
2388				element = getActiveElement(containerInfo.document);
2389			}
2390			return element;
2391		}
2392		function hasSelectionCapabilities(elem) {
2393			var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();
2394			return nodeName && ("input" === nodeName && ("text" === elem.type || "search" === elem.type || "tel" === elem.type || "url" === elem.type || "password" === elem.type) || "textarea" === nodeName || "true" === elem.contentEditable);
2395		}
2396		function constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget) {
2397			var doc = nativeEventTarget.window === nativeEventTarget ? nativeEventTarget.document : 9 === nativeEventTarget.nodeType ? nativeEventTarget : nativeEventTarget.ownerDocument;
2398			mouseDown || null == activeElement || activeElement !== getActiveElement(doc) || (doc = activeElement, "selectionStart" in doc && hasSelectionCapabilities(doc) ? doc = {
2399				start: doc.selectionStart,
2400				end: doc.selectionEnd
2401			} : (doc = (doc.ownerDocument && doc.ownerDocument.defaultView || window).getSelection(), doc = {
2402				anchorNode: doc.anchorNode,
2403				anchorOffset: doc.anchorOffset,
2404				focusNode: doc.focusNode,
2405				focusOffset: doc.focusOffset
2406			}), lastSelection && shallowEqual(lastSelection, doc) || (lastSelection = doc, doc = accumulateTwoPhaseListeners(activeElementInst, "onSelect"), 0 < doc.length && (nativeEvent = new SyntheticEvent("onSelect", "select", null, nativeEvent, nativeEventTarget), dispatchQueue.push({
2407				event: nativeEvent,
2408				listeners: doc
2409			}), nativeEvent.target = activeElement)));
2410		}
2411		function makePrefixMap(styleProp, eventName) {
2412			var prefixes = {};
2413			prefixes[styleProp.toLowerCase()] = eventName.toLowerCase();
2414			prefixes["Webkit" + styleProp] = "webkit" + eventName;
2415			prefixes["Moz" + styleProp] = "moz" + eventName;
2416			return prefixes;
2417		}
2418		function getVendorPrefixedEventName(eventName) {
2419			if (prefixedEventNames[eventName]) return prefixedEventNames[eventName];
2420			if (!vendorPrefixes[eventName]) return eventName;
2421			var prefixMap = vendorPrefixes[eventName], styleProp;
2422			for (styleProp in prefixMap) if (prefixMap.hasOwnProperty(styleProp) && styleProp in style) return prefixedEventNames[eventName] = prefixMap[styleProp];
2423			return eventName;
2424		}
2425		function registerSimpleEvent(domEventName, reactName) {
2426			topLevelEventsToReactNames.set(domEventName, reactName);
2427			registerTwoPhaseEvent(reactName, [domEventName]);
2428		}
2429		function getViewTransitionName(props, instance) {
2430			if (null != props.name && "auto" !== props.name) return props.name;
2431			if (null !== instance.autoName) return instance.autoName;
2432			props = pendingEffectsRoot.identifierPrefix;
2433			var globalClientId = globalClientIdCounter$1++;
2434			props = "_" + props + "t_" + globalClientId.toString(32) + "_";
2435			return instance.autoName = props;
2436		}
2437		function getClassNameByType(classByType) {
2438			if (null == classByType || "string" === typeof classByType) return classByType;
2439			var className = null, activeTypes = pendingTransitionTypes;
2440			if (null !== activeTypes) for (var i = 0; i < activeTypes.length; i++) {
2441				var match = classByType[activeTypes[i]];
2442				if (null != match) {
2443					if ("none" === match) return "none";
2444					className = null == className ? match : className + (" " + match);
2445				}
2446			}
2447			return null == className ? classByType.default : className;
2448		}
2449		function getViewTransitionClassName(defaultClass, eventClass) {
2450			defaultClass = getClassNameByType(defaultClass);
2451			eventClass = getClassNameByType(eventClass);
2452			return null == eventClass ? "auto" === defaultClass ? null : defaultClass : "auto" === eventClass ? null : eventClass;
2453		}
2454		function getArrayKind(array) {
2455			for (var kind = EMPTY_ARRAY, i = 0; i < array.length && i < OBJECT_WIDTH_LIMIT; i++) {
2456				var value = array[i];
2457				if ("object" === typeof value && null !== value) if (isArrayImpl(value) && 2 === value.length && "string" === typeof value[0]) {
2458					if (kind !== EMPTY_ARRAY && kind !== ENTRIES_ARRAY) return COMPLEX_ARRAY;
2459					kind = ENTRIES_ARRAY;
2460				} else return COMPLEX_ARRAY;
2461				else {
2462					if ("function" === typeof value || "string" === typeof value && 50 < value.length || kind !== EMPTY_ARRAY && kind !== PRIMITIVE_ARRAY || "bigint" === typeof value) return COMPLEX_ARRAY;
2463					kind = PRIMITIVE_ARRAY;
2464				}
2465			}
2466			return kind;
2467		}
2468		function addObjectToProperties(object, properties, indent, prefix) {
2469			if (!ArrayBuffer.isView(object)) {
2470				var addedProperties = 0, key;
2471				for (key in object) if (hasOwnProperty.call(object, key) && "_" !== key[0] && (addedProperties++, addValueToProperties(key, object[key], properties, indent, prefix), addedProperties >= OBJECT_WIDTH_LIMIT)) {
2472					properties.push([prefix + "\xA0\xA0".repeat(indent) + "Only " + OBJECT_WIDTH_LIMIT + " properties are shown. React will not log more properties of this object.", ""]);
2473					break;
2474				}
2475			}
2476		}
2477		function readReactElementTypeof(value) {
2478			return "$$typeof" in value && hasOwnProperty.call(value, "$$typeof") ? value.$$typeof : void 0;
2479		}
2480		function addValueToProperties(propertyName, value, properties, indent, prefix) {
2481			switch (typeof value) {
2482				case "object": if (null === value) {
2483					value = "null";
2484					break;
2485				} else {
2486					if (readReactElementTypeof(value) === REACT_ELEMENT_TYPE) {
2487						var typeName = getComponentNameFromType(value.type) || "…", key = value.key;
2488						value = value.props;
2489						var propsKeys = Object.keys(value), propsLength = propsKeys.length;
2490						if (null == key && 0 === propsLength) {
2491							value = "<" + typeName + " />";
2492							break;
2493						}
2494						if (3 > indent || 1 === propsLength && "children" === propsKeys[0] && null == key) {
2495							value = "<" + typeName + " … />";
2496							break;
2497						}
2498						properties.push([prefix + "\xA0\xA0".repeat(indent) + propertyName, "<" + typeName]);
2499						null !== key && addValueToProperties("key", key, properties, indent + 1, prefix);
2500						propertyName = !1;
2501						key = 0;
2502						for (var propKey in value) if (key++, "children" === propKey ? null != value.children && (!isArrayImpl(value.children) || 0 < value.children.length) && (propertyName = !0) : hasOwnProperty.call(value, propKey) && "_" !== propKey[0] && addValueToProperties(propKey, value[propKey], properties, indent + 1, prefix), key >= OBJECT_WIDTH_LIMIT) break;
2503						properties.push(["", propertyName ? ">…</" + typeName + ">" : "/>"]);
2504						return;
2505					}
2506					typeName = Object.prototype.toString.call(value);
2507					typeName = typeName.slice(8, typeName.length - 1);
2508					if (ArrayBuffer.isView(value)) {
2509						value = value.length;
2510						value = "number" === typeof value ? typeName + "(" + value + ")" : typeName;
2511						break;
2512					}
2513					if ("Array" === typeName) {
2514						if (propKey = value.length > OBJECT_WIDTH_LIMIT, key = getArrayKind(value), key === PRIMITIVE_ARRAY || key === EMPTY_ARRAY) {
2515							value = JSON.stringify(propKey ? value.slice(0, OBJECT_WIDTH_LIMIT).concat("…") : value);
2516							break;
2517						} else if (key === ENTRIES_ARRAY) {
2518							properties.push([prefix + "\xA0\xA0".repeat(indent) + propertyName, ""]);
2519							for (propertyName = 0; propertyName < value.length && propertyName < OBJECT_WIDTH_LIMIT; propertyName++) typeName = value[propertyName], addValueToProperties(typeName[0], typeName[1], properties, indent + 1, prefix);
2520							propKey && addValueToProperties(OBJECT_WIDTH_LIMIT.toString(), "…", properties, indent + 1, prefix);
2521							return;
2522						}
2523					}
2524					if ("Promise" === typeName) {
2525						if ("fulfilled" === value.status) {
2526							if (typeName = properties.length, addValueToProperties(propertyName, value.value, properties, indent, prefix), properties.length > typeName) {
2527								properties = properties[typeName];
2528								properties[1] = "Promise<" + (properties[1] || "Object") + ">";
2529								return;
2530							}
2531						} else if ("rejected" === value.status && (typeName = properties.length, addValueToProperties(propertyName, value.reason, properties, indent, prefix), properties.length > typeName)) {
2532							properties = properties[typeName];
2533							properties[1] = "Rejected Promise<" + properties[1] + ">";
2534							return;
2535						}
2536						properties.push(["\xA0\xA0".repeat(indent) + propertyName, "Promise"]);
2537						return;
2538					}
2539					"Object" === typeName && (propKey = Object.getPrototypeOf(value)) && "function" === typeof propKey.constructor && (typeName = propKey.constructor.name);
2540					properties.push([prefix + "\xA0\xA0".repeat(indent) + propertyName, "Object" === typeName ? 3 > indent ? "" : "…" : typeName]);
2541					3 > indent && addObjectToProperties(value, properties, indent + 1, prefix);
2542					return;
2543				}
2544				case "function":
2545					value = value.name;
2546					value = "" === value || "string" !== typeof value ? "() => {}" : value + "() {}";
2547					break;
2548				case "string":
2549					value = value === OMITTED_PROP_ERROR ? "…" : JSON.stringify(1024 <= value.length ? value.slice(0, 1023) + "…" : value);
2550					break;
2551				case "undefined":
2552					value = "undefined";
2553					break;
2554				case "boolean":
2555					value = value ? "true" : "false";
2556					break;
2557				default: value = String(value);
2558			}
2559			properties.push([prefix + "\xA0\xA0".repeat(indent) + propertyName, value]);
2560		}
2561		function addObjectDiffToProperties(prev, next, properties, indent) {
2562			var isDeeplyEqual = !0, prevPropertiesChecked = 0;
2563			for (key in prev) {
2564				if (prevPropertiesChecked > OBJECT_WIDTH_LIMIT) {
2565					properties.push(["Previous object has more than " + OBJECT_WIDTH_LIMIT + " properties. React will not attempt to diff objects with too many properties.", ""]);
2566					isDeeplyEqual = !1;
2567					break;
2568				}
2569				key in next || (properties.push([REMOVED + "\xA0\xA0".repeat(indent) + key, "…"]), isDeeplyEqual = !1);
2570				prevPropertiesChecked++;
2571			}
2572			prevPropertiesChecked = 0;
2573			for (var _key in next) {
2574				if (prevPropertiesChecked > OBJECT_WIDTH_LIMIT) {
2575					properties.push(["Next object has more than " + OBJECT_WIDTH_LIMIT + " properties. React will not attempt to diff objects with too many properties.", ""]);
2576					isDeeplyEqual = !1;
2577					break;
2578				}
2579				if (_key in prev) {
2580					var key = prev[_key];
2581					var nextValue = next[_key];
2582					if (key !== nextValue) {
2583						if (0 === indent && "children" === _key) {
2584							isDeeplyEqual = "\xA0\xA0".repeat(indent) + _key;
2585							properties.push([REMOVED + isDeeplyEqual, "…"], [ADDED + isDeeplyEqual, "…"]);
2586							isDeeplyEqual = !1;
2587							continue;
2588						}
2589						if (!(3 <= indent)) {
2590							if ("object" === typeof key && "object" === typeof nextValue && null !== key && null !== nextValue && readReactElementTypeof(key) === readReactElementTypeof(nextValue)) if (readReactElementTypeof(nextValue) === REACT_ELEMENT_TYPE) {
2591								if (key.type === nextValue.type && key.key === nextValue.key) {
2592									key = getComponentNameFromType(nextValue.type) || "…";
2593									isDeeplyEqual = "\xA0\xA0".repeat(indent) + _key;
2594									key = "<" + key + " … />";
2595									properties.push([REMOVED + isDeeplyEqual, key], [ADDED + isDeeplyEqual, key]);
2596									isDeeplyEqual = !1;
2597									continue;
2598								}
2599							} else {
2600								var prevKind = Object.prototype.toString.call(key), nextKind = Object.prototype.toString.call(nextValue);
2601								if (prevKind === nextKind && ("[object Object]" === nextKind || "[object Array]" === nextKind)) {
2602									prevKind = [UNCHANGED + "\xA0\xA0".repeat(indent) + _key, "[object Array]" === nextKind ? "Array" : ""];
2603									properties.push(prevKind);
2604									nextKind = properties.length;
2605									addObjectDiffToProperties(key, nextValue, properties, indent + 1) ? nextKind === properties.length && (prevKind[1] = "Referentially unequal but deeply equal objects. Consider memoization.") : isDeeplyEqual = !1;
2606									continue;
2607								}
2608							}
2609							else if ("function" === typeof key && "function" === typeof nextValue && key.name === nextValue.name && key.length === nextValue.length && (prevKind = Function.prototype.toString.call(key), nextKind = Function.prototype.toString.call(nextValue), prevKind === nextKind)) {
2610								key = "" === nextValue.name ? "() => {}" : nextValue.name + "() {}";
2611								properties.push([UNCHANGED + "\xA0\xA0".repeat(indent) + _key, key + " Referentially unequal function closure. Consider memoization."]);
2612								continue;
2613							}
2614						}
2615						addValueToProperties(_key, key, properties, indent, REMOVED);
2616						addValueToProperties(_key, nextValue, properties, indent, ADDED);
2617						isDeeplyEqual = !1;
2618					}
2619				} else properties.push([ADDED + "\xA0\xA0".repeat(indent) + _key, "…"]), isDeeplyEqual = !1;
2620				prevPropertiesChecked++;
2621			}
2622			return isDeeplyEqual;
2623		}
2624		function setCurrentTrackFromLanes(lanes) {
2625			currentTrack = lanes & 63 ? "Blocking" : lanes & 64 ? "Gesture" : lanes & 4194176 ? "Transition" : lanes & 62914560 ? "Suspense" : lanes & 2080374784 ? "Idle" : "Other";
2626		}
2627		function logComponentTrigger(fiber, startTime, endTime, trigger) {
2628			supportsUserTiming && (reusableComponentOptions.start = startTime, reusableComponentOptions.end = endTime, reusableComponentDevToolDetails.color = "warning", reusableComponentDevToolDetails.tooltipText = trigger, reusableComponentDevToolDetails.properties = null, (fiber = fiber._debugTask) ? fiber.run(performance.measure.bind(performance, trigger, reusableComponentOptions)) : performance.measure(trigger, reusableComponentOptions), performance.clearMeasures(trigger));
2629		}
2630		function logComponentReappeared(fiber, startTime, endTime) {
2631			logComponentTrigger(fiber, startTime, endTime, "Reconnect");
2632		}
2633		function logComponentRender(fiber, startTime, endTime, wasHydrated, committedLanes) {
2634			var name = getComponentNameFromFiber(fiber);
2635			if (null !== name && supportsUserTiming) {
2636				var alternate = fiber.alternate, selfTime = fiber.actualDuration;
2637				if (null === alternate || alternate.child !== fiber.child) for (var child = fiber.child; null !== child; child = child.sibling) selfTime -= child.actualDuration;
2638				selfTime = .5 > selfTime ? wasHydrated ? "tertiary-light" : "primary-light" : 10 > selfTime ? wasHydrated ? "tertiary" : "primary" : 100 > selfTime ? wasHydrated ? "tertiary-dark" : "primary-dark" : "error";
2639				var props = fiber.memoizedProps;
2640				wasHydrated = fiber._debugTask;
2641				null !== props && null !== alternate && alternate.memoizedProps !== props ? (child = [reusableChangedPropsEntry], props = addObjectDiffToProperties(alternate.memoizedProps, props, child, 0), 1 < child.length ? (props && !alreadyWarnedForDeepEquality && 0 === (alternate.lanes & committedLanes) && 100 < fiber.actualDuration ? (alreadyWarnedForDeepEquality = !0, child[0] = reusableDeeplyEqualPropsEntry, reusableComponentDevToolDetails.color = "warning", reusableComponentDevToolDetails.tooltipText = DEEP_EQUALITY_WARNING) : (reusableComponentDevToolDetails.color = selfTime, reusableComponentDevToolDetails.tooltipText = name), reusableComponentDevToolDetails.properties = child, reusableComponentOptions.start = startTime, reusableComponentOptions.end = endTime, fiber = "​" + name, null != wasHydrated ? wasHydrated.run(performance.measure.bind(performance, fiber, reusableComponentOptions)) : performance.measure(fiber, reusableComponentOptions), performance.clearMeasures(fiber)) : null != wasHydrated ? wasHydrated.run(console.timeStamp.bind(console, name, startTime, endTime, COMPONENTS_TRACK, void 0, selfTime)) : console.timeStamp(name, startTime, endTime, COMPONENTS_TRACK, void 0, selfTime)) : null != wasHydrated ? wasHydrated.run(console.timeStamp.bind(console, name, startTime, endTime, COMPONENTS_TRACK, void 0, selfTime)) : console.timeStamp(name, startTime, endTime, COMPONENTS_TRACK, void 0, selfTime);
2642			}
2643		}
2644		function logComponentErrored(fiber, startTime, endTime, errors) {
2645			if (supportsUserTiming) {
2646				var name = getComponentNameFromFiber(fiber);
2647				if (null !== name) {
2648					for (var debugTask = null, properties = [], i = 0; i < errors.length; i++) {
2649						var capturedValue = errors[i];
2650						null == debugTask && null !== capturedValue.source && (debugTask = capturedValue.source._debugTask);
2651						capturedValue = capturedValue.value;
2652						properties.push(["Error", "object" === typeof capturedValue && null !== capturedValue && "string" === typeof capturedValue.message ? String(capturedValue.message) : String(capturedValue)]);
2653					}
vendor: 4,434 bytes, lines 2654-2727
2654					null !== fiber.key && addValueToProperties("key", fiber.key, properties, 0, "");
2655					null !== fiber.memoizedProps && addObjectToProperties(fiber.memoizedProps, properties, 0, "");
2656					debugTask ??= fiber._debugTask;
2657					fiber = {
2658						start: startTime,
2659						end: endTime,
2660						detail: { devtools: {
2661							color: "error",
2662							track: COMPONENTS_TRACK,
2663							tooltipText: 13 === fiber.tag ? "Hydration failed" : "Error boundary caught an error",
2664							properties
2665						} }
2666					};
2667					name = "​" + name;
2668					debugTask ? debugTask.run(performance.measure.bind(performance, name, fiber)) : performance.measure(name, fiber);
2669					performance.clearMeasures(name);
2670				}
2671			}
2672		}
2673		function logComponentEffect(fiber, startTime, endTime, selfTime, errors) {
2674			if (null !== errors) {
2675				if (supportsUserTiming) {
2676					var name = getComponentNameFromFiber(fiber);
2677					if (null !== name) {
2678						selfTime = [];
2679						for (var i = 0; i < errors.length; i++) {
2680							var error = errors[i].value;
2681							selfTime.push(["Error", "object" === typeof error && null !== error && "string" === typeof error.message ? String(error.message) : String(error)]);
2682						}
2683						null !== fiber.key && addValueToProperties("key", fiber.key, selfTime, 0, "");
2684						null !== fiber.memoizedProps && addObjectToProperties(fiber.memoizedProps, selfTime, 0, "");
2685						startTime = {
2686							start: startTime,
2687							end: endTime,
2688							detail: { devtools: {
2689								color: "error",
2690								track: COMPONENTS_TRACK,
2691								tooltipText: "A lifecycle or effect errored",
2692								properties: selfTime
2693							} }
2694						};
2695						fiber = fiber._debugTask;
2696						endTime = "​" + name;
2697						fiber ? fiber.run(performance.measure.bind(performance, endTime, startTime)) : performance.measure(endTime, startTime);
2698						performance.clearMeasures(endTime);
2699					}
2700				}
2701			} else name = getComponentNameFromFiber(fiber), null !== name && supportsUserTiming && (errors = 1 > selfTime ? "secondary-light" : 100 > selfTime ? "secondary" : 500 > selfTime ? "secondary-dark" : "error", (fiber = fiber._debugTask) ? fiber.run(console.timeStamp.bind(console, name, startTime, endTime, COMPONENTS_TRACK, void 0, errors)) : console.timeStamp(name, startTime, endTime, COMPONENTS_TRACK, void 0, errors));
2702		}
2703		function logSuspendedRenderPhase(startTime, endTime, lanes, debugTask) {
2704			!supportsUserTiming || endTime <= startTime || (lanes = (lanes & 738197653) === lanes ? "tertiary-dark" : "primary-dark", debugTask ? debugTask.run(console.timeStamp.bind(console, "Prewarm", startTime, endTime, currentTrack, LANES_TRACK_GROUP, lanes)) : console.timeStamp("Prewarm", startTime, endTime, currentTrack, LANES_TRACK_GROUP, lanes));
2705		}
2706		function logSuspendedWithDelayPhase(startTime, endTime, lanes, debugTask) {
2707			!supportsUserTiming || endTime <= startTime || (lanes = (lanes & 738197653) === lanes ? "tertiary-dark" : "primary-dark", debugTask ? debugTask.run(console.timeStamp.bind(console, "Suspended", startTime, endTime, currentTrack, LANES_TRACK_GROUP, lanes)) : console.timeStamp("Suspended", startTime, endTime, currentTrack, LANES_TRACK_GROUP, lanes));
2708		}
2709		function logErroredRenderPhase(startTime, endTime, lanes, debugTask) {
2710			!supportsUserTiming || endTime <= startTime || (debugTask ? debugTask.run(console.timeStamp.bind(console, "Errored", startTime, endTime, currentTrack, LANES_TRACK_GROUP, "error")) : console.timeStamp("Errored", startTime, endTime, currentTrack, LANES_TRACK_GROUP, "error"));
2711		}
2712		function logSuspendedCommitPhase(startTime, endTime, reason, debugTask) {
2713			!supportsUserTiming || endTime <= startTime || (debugTask ? debugTask.run(console.timeStamp.bind(console, reason, startTime, endTime, currentTrack, LANES_TRACK_GROUP, "secondary-light")) : console.timeStamp(reason, startTime, endTime, currentTrack, LANES_TRACK_GROUP, "secondary-light"));
2714		}
2715		function logCommitErrored(startTime, endTime, errors, passive, debugTask) {
2716			if (supportsUserTiming && !(endTime <= startTime)) {
2717				for (var properties = [], i = 0; i < errors.length; i++) {
2718					var error = errors[i].value;
2719					properties.push(["Error", "object" === typeof error && null !== error && "string" === typeof error.message ? String(error.message) : String(error)]);
2720				}
2721				startTime = {
2722					start: startTime,
2723					end: endTime,
2724					detail: { devtools: {
2725						color: "error",
2726						track: currentTrack,
2727						trackGroup: LANES_TRACK_GROUP,
2728						tooltipText: passive ? "Remaining Effects Errored" : "Commit Errored",
2729						properties
2730					} }
2731				};
2732				debugTask ? debugTask.run(performance.measure.bind(performance, "Errored", startTime)) : performance.measure("Errored", startTime);
2733				performance.clearMeasures("Errored");
2734			}
2735		}
2736		function logCommitPhase(startTime, endTime, errors, abortedViewTransition, debugTask) {
2737			null !== errors ? logCommitErrored(startTime, endTime, errors, !1, debugTask) : !supportsUserTiming || endTime <= startTime || (debugTask ? debugTask.run(console.timeStamp.bind(console, abortedViewTransition ? "Commit Interrupted View Transition" : "Commit", startTime, endTime, currentTrack, LANES_TRACK_GROUP, abortedViewTransition ? "error" : "secondary-dark")) : console.timeStamp(abortedViewTransition ? "Commit Interrupted View Transition" : "Commit", startTime, endTime, currentTrack, LANES_TRACK_GROUP, abortedViewTransition ? "error" : "secondary-dark"));
2738		}
2739		function logAnimatingPhase(startTime, endTime, debugTask) {
2740			!supportsUserTiming || endTime <= startTime || (debugTask ? debugTask.run(console.timeStamp.bind(console, "Animating", startTime, endTime, currentTrack, LANES_TRACK_GROUP, "secondary-dark")) : console.timeStamp("Animating", startTime, endTime, currentTrack, LANES_TRACK_GROUP, "secondary-dark"));
2741		}
2742		function finishQueueingConcurrentUpdates() {
2743			for (var endIndex = concurrentQueuesIndex, i = concurrentlyUpdatedLanes = concurrentQueuesIndex = 0; i < endIndex;) {
2744				var fiber = concurrentQueues[i];
2745				concurrentQueues[i++] = null;
2746				var queue = concurrentQueues[i];
2747				concurrentQueues[i++] = null;
2748				var update = concurrentQueues[i];
2749				concurrentQueues[i++] = null;
2750				var lane = concurrentQueues[i];
2751				concurrentQueues[i++] = null;
2752				if (null !== queue && null !== update) {
2753					var pending = queue.pending;
2754					null === pending ? update.next = update : (update.next = pending.next, pending.next = update);
2755					queue.pending = update;
2756				}
2757				0 !== lane && markUpdateLaneFromFiberToRoot(fiber, update, lane);
2758			}
2759		}
2760		function enqueueUpdate$1(fiber, queue, update, lane) {
2761			concurrentQueues[concurrentQueuesIndex++] = fiber;
2762			concurrentQueues[concurrentQueuesIndex++] = queue;
2763			concurrentQueues[concurrentQueuesIndex++] = update;
2764			concurrentQueues[concurrentQueuesIndex++] = lane;
2765			concurrentlyUpdatedLanes |= lane;
2766			fiber.lanes |= lane;
2767			fiber = fiber.alternate;
2768			null !== fiber && (fiber.lanes |= lane);
2769		}
2770		function enqueueConcurrentHookUpdate(fiber, queue, update, lane) {
2771			enqueueUpdate$1(fiber, queue, update, lane);
2772			return getRootForUpdatedFiber(fiber);
2773		}
2774		function enqueueConcurrentRenderForLane(fiber, lane) {
2775			enqueueUpdate$1(fiber, null, null, lane);
2776			return getRootForUpdatedFiber(fiber);
2777		}
2778		function markUpdateLaneFromFiberToRoot(sourceFiber, update, lane) {
2779			sourceFiber.lanes |= lane;
2780			var alternate = sourceFiber.alternate;
2781			null !== alternate && (alternate.lanes |= lane);
2782			for (var isHidden = !1, parent = sourceFiber.return; null !== parent;) parent.childLanes |= lane, alternate = parent.alternate, null !== alternate && (alternate.childLanes |= lane), 22 === parent.tag && (sourceFiber = parent.stateNode, null === sourceFiber || sourceFiber._visibility & OffscreenVisible || (isHidden = !0)), sourceFiber = parent, parent = parent.return;
2783			return 3 === sourceFiber.tag ? (parent = sourceFiber.stateNode, isHidden && null !== update && (isHidden = 31 - clz32(lane), sourceFiber = parent.hiddenUpdates, alternate = sourceFiber[isHidden], null === alternate ? sourceFiber[isHidden] = [update] : alternate.push(update), update.lane = lane | 536870912), parent) : null;
2784		}
2785		function getRootForUpdatedFiber(sourceFiber) {
2786			if (nestedUpdateCount > NESTED_UPDATE_LIMIT) throw nestedPassiveUpdateCount = nestedUpdateCount = 0, rootWithPassiveNestedUpdates = rootWithNestedUpdates = null, Error("Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops.");
2787			nestedPassiveUpdateCount > NESTED_PASSIVE_UPDATE_LIMIT && (nestedPassiveUpdateCount = 0, rootWithPassiveNestedUpdates = null, console.error("Maximum update depth exceeded. This can happen when a component calls setState inside useEffect, but useEffect either doesn't have a dependency array, or one of the dependencies changes on every render."));
2788			null === sourceFiber.alternate && 0 !== (sourceFiber.flags & 4098) && warnAboutUpdateOnNotYetMountedFiberInDEV(sourceFiber);
2789			for (var node = sourceFiber, parent = node.return; null !== parent;) null === node.alternate && 0 !== (node.flags & 4098) && warnAboutUpdateOnNotYetMountedFiberInDEV(sourceFiber), node = parent, parent = node.return;
2790			return 3 === node.tag ? node.stateNode : null;
2791		}
2792		function resolveTypeForHotReloading(type) {
2793			if (null === resolveFamily) return type;
2794			var family = resolveFamily(type);
2795			return void 0 === family ? type : family.current;
2796		}
2797		function isCompatibleFamilyForHotReloading(fiber, element) {
2798			if (null === resolveFamily) return !1;
2799			var resolve = resolveFamily, prevType = fiber.elementType;
2800			element = element.type;
2801			var needsCompareFamilies = !1, $$typeofNextType = "object" === typeof element && null !== element ? element.$$typeof : null;
2802			switch (fiber.tag) {
2803				case 1:
2804					"function" === typeof element && (needsCompareFamilies = !0);
2805					break;
2806				case 0:
2807					"function" === typeof element ? needsCompareFamilies = !0 : $$typeofNextType === REACT_LAZY_TYPE && (needsCompareFamilies = !0);
2808					break;
2809				case 11:
2810					$$typeofNextType === REACT_FORWARD_REF_TYPE ? needsCompareFamilies = !0 : $$typeofNextType === REACT_LAZY_TYPE && (needsCompareFamilies = !0);
2811					break;
2812				case 14:
2813				case 15:
2814					$$typeofNextType === REACT_MEMO_TYPE ? needsCompareFamilies = !0 : $$typeofNextType === REACT_LAZY_TYPE && (needsCompareFamilies = !0);
2815					break;
2816				default: return !1;
2817			}
2818			return needsCompareFamilies && (fiber = resolve(prevType), void 0 !== fiber && fiber === resolve(element)) ? !0 : !1;
2819		}
2820		function markFailedErrorBoundaryForHotReloading(fiber) {
2821			null !== resolveFamily && "function" === typeof WeakSet && (null === failedBoundaries && (failedBoundaries = /* @__PURE__ */ new WeakSet()), failedBoundaries.add(fiber));
2822		}
2823		function scheduleFibersWithFamiliesRecursively(fiber, updatedFamilies, staleFamilies) {
2824			do {
2825				var _fiber = fiber, alternate = _fiber.alternate, child = _fiber.child, sibling = _fiber.sibling, tag = _fiber.tag, type = _fiber.type, elementType = _fiber.elementType, candidateType = null;
2826				_fiber = null;
2827				switch (tag) {
2828					case 0:
2829					case 1:
2830						candidateType = type;
2831						break;
2832					case 15:
2833						candidateType = type;
2834						_fiber = elementType;
2835						break;
2836					case 14:
2837						_fiber = elementType;
2838						break;
2839					case 11: candidateType = type.render, _fiber = elementType;
2840				}
2841				if (null === resolveFamily) throw Error("Expected resolveFamily to be set during hot reload.");
2842				var resolve = resolveFamily;
2843				type = elementType = !1;
2844				null !== candidateType && (candidateType = resolve(candidateType), void 0 !== candidateType && (staleFamilies.has(candidateType) ? type = !0 : updatedFamilies.has(candidateType) && (1 === tag ? type = !0 : elementType = !0)));
2845				type || null === _fiber || (tag = resolve(_fiber), void 0 !== tag && staleFamilies.has(tag) ? type = !0 : "object" === typeof _fiber && _fiber.$$typeof === REACT_LAZY_TYPE && (tag = _fiber._payload, 1 === tag._status && (tag = resolve(tag._result.default), void 0 !== tag && staleFamilies.has(tag) && (type = !0))));
2846				null !== failedBoundaries && (failedBoundaries.has(fiber) || null !== alternate && failedBoundaries.has(alternate)) && (type = !0);
2847				type && (fiber._debugNeedsRemount = !0);
2848				if (type || elementType) alternate = enqueueConcurrentRenderForLane(fiber, 2), null !== alternate && scheduleUpdateOnFiber(alternate, fiber, 2);
2849				null === child || type || scheduleFibersWithFamiliesRecursively(child, updatedFamilies, staleFamilies);
2850				if (null === sibling) break;
2851				fiber = sibling;
2852			} while (1);
2853		}
2854		function FiberNode(tag, pendingProps, key, mode) {
2855			this.tag = tag;
2856			this.key = key;
2857			this.sibling = this.child = this.return = this.stateNode = this.type = this.elementType = null;
2858			this.index = 0;
2859			this.refCleanup = this.ref = null;
2860			this.pendingProps = pendingProps;
2861			this.dependencies = this.memoizedState = this.updateQueue = this.memoizedProps = null;
2862			this.mode = mode;
2863			this.subtreeFlags = this.flags = 0;
2864			this.deletions = null;
2865			this.childLanes = this.lanes = 0;
2866			this.alternate = null;
2867			this.actualDuration = -0;
2868			this.actualStartTime = -1.1;
2869			this.treeBaseDuration = this.selfBaseDuration = -0;
2870			this._debugTask = this._debugStack = this._debugOwner = this._debugInfo = null;
2871			this._debugNeedsRemount = !1;
2872			this._debugHookTypes = null;
2873			hasBadMapPolyfill || "function" !== typeof Object.preventExtensions || Object.preventExtensions(this);
2874		}
2875		function shouldConstruct(Component) {
2876			Component = Component.prototype;
2877			return !(!Component || !Component.isReactComponent);
2878		}
2879		function createWorkInProgress(current, pendingProps) {
2880			var workInProgress = current.alternate;
2881			null === workInProgress ? (workInProgress = createFiber(current.tag, pendingProps, current.key, current.mode), workInProgress.elementType = current.elementType, workInProgress.type = current.type, workInProgress.stateNode = current.stateNode, workInProgress._debugOwner = current._debugOwner, workInProgress._debugStack = current._debugStack, workInProgress._debugTask = current._debugTask, workInProgress._debugHookTypes = current._debugHookTypes, workInProgress.alternate = current, current.alternate = workInProgress) : (workInProgress.pendingProps = pendingProps, workInProgress.type = current.type, workInProgress.flags = 0, workInProgress.subtreeFlags = 0, workInProgress.deletions = null, workInProgress.actualDuration = -0, workInProgress.actualStartTime = -1.1);
2882			workInProgress.flags = current.flags & 1206910976;
2883			workInProgress.childLanes = current.childLanes;
2884			workInProgress.lanes = current.lanes;
2885			workInProgress.child = current.child;
2886			workInProgress.memoizedProps = current.memoizedProps;
2887			workInProgress.memoizedState = current.memoizedState;
2888			workInProgress.updateQueue = current.updateQueue;
2889			pendingProps = current.dependencies;
2890			workInProgress.dependencies = null === pendingProps ? null : {
2891				lanes: pendingProps.lanes,
2892				firstContext: pendingProps.firstContext,
2893				_debugThenableState: pendingProps._debugThenableState
2894			};
2895			workInProgress.sibling = current.sibling;
2896			workInProgress.index = current.index;
2897			workInProgress.ref = current.ref;
2898			workInProgress.refCleanup = current.refCleanup;
2899			workInProgress.selfBaseDuration = current.selfBaseDuration;
2900			workInProgress.treeBaseDuration = current.treeBaseDuration;
2901			workInProgress._debugInfo = current._debugInfo;
2902			workInProgress._debugNeedsRemount = current._debugNeedsRemount;
2903			switch (workInProgress.tag) {
2904				case 0:
2905				case 15:
2906				case 14:
2907				case 1:
2908				case 11: workInProgress.type = resolveTypeForHotReloading(current.type);
2909			}
2910			return workInProgress;
2911		}
2912		function resetWorkInProgress(workInProgress, renderLanes) {
2913			workInProgress.flags &= 1206910978;
2914			var current = workInProgress.alternate;
2915			null === current ? (workInProgress.childLanes = 0, workInProgress.lanes = renderLanes, workInProgress.child = null, workInProgress.subtreeFlags = 0, workInProgress.memoizedProps = null, workInProgress.memoizedState = null, workInProgress.updateQueue = null, workInProgress.dependencies = null, workInProgress.stateNode = null, workInProgress.selfBaseDuration = 0, workInProgress.treeBaseDuration = 0) : (workInProgress.childLanes = current.childLanes, workInProgress.lanes = current.lanes, workInProgress.child = current.child, workInProgress.subtreeFlags = 0, workInProgress.deletions = null, workInProgress.memoizedProps = current.memoizedProps, workInProgress.memoizedState = current.memoizedState, workInProgress.updateQueue = current.updateQueue, workInProgress.type = current.type, renderLanes = current.dependencies, workInProgress.dependencies = null === renderLanes ? null : {
2916				lanes: renderLanes.lanes,
2917				firstContext: renderLanes.firstContext,
2918				_debugThenableState: renderLanes._debugThenableState
2919			}, workInProgress.selfBaseDuration = current.selfBaseDuration, workInProgress.treeBaseDuration = current.treeBaseDuration);
2920			return workInProgress;
2921		}
2922		function createFiberFromTypeAndProps(type, key, pendingProps, owner, mode, lanes) {
2923			var fiberTag = 0;
2924			var resolvedType = resolveTypeForHotReloading(type);
2925			if ("function" === typeof resolvedType) shouldConstruct(resolvedType) && (fiberTag = 1);
2926			else if ("string" === typeof resolvedType) fiberTag = getHostContext(), fiberTag = isHostHoistableType(type, pendingProps, fiberTag) ? 26 : "html" === type || "head" === type || "body" === type ? 27 : 5;
2927			else a: switch (resolvedType) {
2928				case REACT_ACTIVITY_TYPE: return key = createFiber(31, pendingProps, key, mode), key.elementType = REACT_ACTIVITY_TYPE, key.lanes = lanes, key;
2929				case REACT_FRAGMENT_TYPE: return createFiberFromFragment(pendingProps.children, mode, lanes, key);
2930				case REACT_STRICT_MODE_TYPE:
2931					fiberTag = 8;
2932					mode |= StrictLegacyMode;
2933					mode |= StrictEffectsMode;
2934					break;
2935				case REACT_PROFILER_TYPE: return type = pendingProps, owner = mode, "string" !== typeof type.id && console.error("Profiler must specify an \"id\" of type `string` as a prop. Received the type `%s` instead.", typeof type.id), key = createFiber(12, type, key, owner | ProfileMode), key.elementType = REACT_PROFILER_TYPE, key.lanes = lanes, key.stateNode = {
2936					effectDuration: 0,
2937					passiveEffectDuration: 0
2938				}, key;
2939				case REACT_SUSPENSE_TYPE: return key = createFiber(13, pendingProps, key, mode), key.elementType = REACT_SUSPENSE_TYPE, key.lanes = lanes, key;
2940				case REACT_SUSPENSE_LIST_TYPE: return key = createFiber(19, pendingProps, key, mode), key.elementType = REACT_SUSPENSE_LIST_TYPE, key.lanes = lanes, key;
2941				case REACT_LEGACY_HIDDEN_TYPE:
2942				case REACT_VIEW_TRANSITION_TYPE: return type = mode | SuspenseyImagesMode, key = createFiber(30, pendingProps, key, type), key.elementType = REACT_VIEW_TRANSITION_TYPE, key.lanes = lanes, key.stateNode = {
2943					autoName: null,
2944					paired: null,
2945					clones: null,
2946					ref: null
2947				}, key;
2948				default:
2949					if ("object" === typeof resolvedType && null !== resolvedType) switch (resolvedType.$$typeof) {
2950						case REACT_CONTEXT_TYPE:
2951							fiberTag = 10;
2952							break a;
2953						case REACT_CONSUMER_TYPE:
2954							fiberTag = 9;
2955							break a;
2956						case REACT_FORWARD_REF_TYPE:
2957							fiberTag = 11;
2958							break a;
2959						case REACT_MEMO_TYPE:
2960							fiberTag = 14;
2961							break a;
2962						case REACT_LAZY_TYPE:
2963							fiberTag = 16;
2964							resolvedType = null;
2965							break a;
2966					}
2967					pendingProps = "";
2968					if (void 0 === type || "object" === typeof type && null !== type && 0 === Object.keys(type).length) pendingProps += " You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.";
2969					null === type ? resolvedType = "null" : isArrayImpl(type) ? resolvedType = "array" : void 0 !== type && type.$$typeof === REACT_ELEMENT_TYPE ? (resolvedType = "<" + (getComponentNameFromType(type.type) || "Unknown") + " />", pendingProps = " Did you accidentally export a JSX literal instead of a component?") : resolvedType = typeof type;
2970					(fiberTag = owner ? getComponentNameFromOwner(owner) : null) && (pendingProps += "\n\nCheck the render method of `" + fiberTag + "`.");
2971					fiberTag = 29;
vendor: 9,143 bytes, lines 2972-3172
2972					pendingProps = Error("Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: " + (resolvedType + "." + pendingProps));
2973					resolvedType = null;
2974			}
2975			key = createFiber(fiberTag, pendingProps, key, mode);
2976			key.elementType = type;
2977			key.type = resolvedType;
2978			key.lanes = lanes;
2979			key._debugOwner = owner;
2980			return key;
2981		}
2982		function createFiberFromElement(element, mode, lanes) {
2983			mode = createFiberFromTypeAndProps(element.type, element.key, element.props, element._owner, mode, lanes);
2984			mode._debugOwner = element._owner;
2985			mode._debugStack = element._debugStack;
2986			mode._debugTask = element._debugTask;
2987			return mode;
2988		}
2989		function createFiberFromFragment(elements, mode, lanes, key) {
2990			elements = createFiber(7, elements, key, mode);
2991			elements.lanes = lanes;
2992			return elements;
2993		}
2994		function createFiberFromText(content, mode, lanes) {
2995			content = createFiber(6, content, null, mode);
2996			content.lanes = lanes;
2997			return content;
2998		}
2999		function createFiberFromDehydratedFragment(dehydratedNode) {
3000			var fiber = createFiber(18, null, null, NoMode);
3001			fiber.stateNode = dehydratedNode;
3002			return fiber;
3003		}
3004		function createFiberFromPortal(portal, mode, lanes) {
3005			mode = createFiber(4, null !== portal.children ? portal.children : [], portal.key, mode);
3006			mode.lanes = lanes;
3007			mode.stateNode = {
3008				containerInfo: portal.containerInfo,
3009				pendingChildren: null,
3010				implementation: portal.implementation
3011			};
3012			return mode;
3013		}
3014		function createCapturedValueAtFiber(value, source) {
3015			if ("object" === typeof value && null !== value) {
3016				var existing = CapturedStacks.get(value);
3017				if (void 0 !== existing) return existing;
3018				source = {
3019					value,
3020					source,
3021					stack: getStackByFiberInDevAndProd(source)
3022				};
3023				CapturedStacks.set(value, source);
3024				return source;
3025			}
3026			return {
3027				value,
3028				source,
3029				stack: getStackByFiberInDevAndProd(source)
3030			};
3031		}
3032		function pushTreeFork(workInProgress, totalChildren) {
3033			warnIfNotHydrating();
3034			forkStack[forkStackIndex++] = treeForkCount;
3035			forkStack[forkStackIndex++] = treeForkProvider;
3036			treeForkProvider = workInProgress;
3037			treeForkCount = totalChildren;
3038		}
3039		function pushTreeId(workInProgress, totalChildren, index) {
3040			warnIfNotHydrating();
3041			idStack[idStackIndex++] = treeContextId;
3042			idStack[idStackIndex++] = treeContextOverflow;
3043			idStack[idStackIndex++] = treeContextProvider;
3044			treeContextProvider = workInProgress;
3045			var baseIdWithLeadingBit = treeContextId;
3046			workInProgress = treeContextOverflow;
3047			var baseLength = 32 - clz32(baseIdWithLeadingBit) - 1;
3048			baseIdWithLeadingBit &= ~(1 << baseLength);
3049			index += 1;
3050			var length = 32 - clz32(totalChildren) + baseLength;
3051			if (30 < length) {
3052				var numberOfOverflowBits = baseLength - baseLength % 5;
3053				length = (baseIdWithLeadingBit & (1 << numberOfOverflowBits) - 1).toString(32);
3054				baseIdWithLeadingBit >>= numberOfOverflowBits;
3055				baseLength -= numberOfOverflowBits;
3056				treeContextId = 1 << 32 - clz32(totalChildren) + baseLength | index << baseLength | baseIdWithLeadingBit;
3057				treeContextOverflow = length + workInProgress;
3058			} else treeContextId = 1 << length | index << baseLength | baseIdWithLeadingBit, treeContextOverflow = workInProgress;
3059		}
3060		function pushMaterializedTreeId(workInProgress) {
3061			warnIfNotHydrating();
3062			null !== workInProgress.return && (pushTreeFork(workInProgress, 1), pushTreeId(workInProgress, 1, 0));
3063		}
3064		function popTreeContext(workInProgress) {
3065			for (; workInProgress === treeForkProvider;) treeForkProvider = forkStack[--forkStackIndex], forkStack[forkStackIndex] = null, treeForkCount = forkStack[--forkStackIndex], forkStack[forkStackIndex] = null;
3066			for (; workInProgress === treeContextProvider;) treeContextProvider = idStack[--idStackIndex], idStack[idStackIndex] = null, treeContextOverflow = idStack[--idStackIndex], idStack[idStackIndex] = null, treeContextId = idStack[--idStackIndex], idStack[idStackIndex] = null;
3067		}
3068		function getSuspendedTreeContext() {
3069			warnIfNotHydrating();
3070			return null !== treeContextProvider ? {
3071				id: treeContextId,
3072				overflow: treeContextOverflow
3073			} : null;
3074		}
3075		function restoreSuspendedTreeContext(workInProgress, suspendedContext) {
3076			warnIfNotHydrating();
3077			idStack[idStackIndex++] = treeContextId;
3078			idStack[idStackIndex++] = treeContextOverflow;
3079			idStack[idStackIndex++] = treeContextProvider;
3080			treeContextId = suspendedContext.id;
3081			treeContextOverflow = suspendedContext.overflow;
3082			treeContextProvider = workInProgress;
3083		}
3084		function warnIfNotHydrating() {
3085			isHydrating || console.error("Expected to be hydrating. This is a bug in React. Please file an issue.");
3086		}
3087		function buildHydrationDiffNode(fiber, distanceFromLeaf) {
3088			if (null === fiber.return) {
3089				if (null === hydrationDiffRootDEV) hydrationDiffRootDEV = {
3090					fiber,
3091					children: [],
3092					serverProps: void 0,
3093					serverTail: [],
3094					distanceFromLeaf
3095				};
3096				else {
3097					if (hydrationDiffRootDEV.fiber !== fiber) throw Error("Saw multiple hydration diff roots in a pass. This is a bug in React.");
3098					hydrationDiffRootDEV.distanceFromLeaf > distanceFromLeaf && (hydrationDiffRootDEV.distanceFromLeaf = distanceFromLeaf);
3099				}
3100				return hydrationDiffRootDEV;
3101			}
3102			var siblings = buildHydrationDiffNode(fiber.return, distanceFromLeaf + 1).children;
3103			if (0 < siblings.length && siblings[siblings.length - 1].fiber === fiber) return siblings = siblings[siblings.length - 1], siblings.distanceFromLeaf > distanceFromLeaf && (siblings.distanceFromLeaf = distanceFromLeaf), siblings;
3104			distanceFromLeaf = {
3105				fiber,
3106				children: [],
3107				serverProps: void 0,
3108				serverTail: [],
3109				distanceFromLeaf
3110			};
3111			siblings.push(distanceFromLeaf);
3112			return distanceFromLeaf;
3113		}
3114		function warnIfHydrating() {
3115			isHydrating && console.error("We should not be hydrating here. This is a bug in React. Please file a bug.");
3116		}
3117		function warnNonHydratedInstance(fiber, rejectedCandidate) {
3118			didSuspendOrErrorDEV || (fiber = buildHydrationDiffNode(fiber, 0), fiber.serverProps = null, null !== rejectedCandidate && (rejectedCandidate = describeHydratableInstanceForDevWarnings(rejectedCandidate), fiber.serverTail.push(rejectedCandidate)));
3119		}
3120		function throwOnHydrationMismatch(fiber) {
3121			var fromText = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : !1, diff = "", diffRoot = hydrationDiffRootDEV;
3122			null !== diffRoot && (hydrationDiffRootDEV = null, diff = describeDiff(diffRoot));
3123			queueHydrationError(createCapturedValueAtFiber(Error("Hydration failed because the server rendered " + (fromText ? "text" : "HTML") + " didn't match the client. As a result this tree will be regenerated on the client. This can happen if a SSR-ed Client Component used:\n\n- A server/client branch `if (typeof window !== 'undefined')`.\n- Variable input such as `Date.now()` or `Math.random()` which changes each time it's called.\n- Date formatting in a user's locale which doesn't match the server.\n- External changing data without sending a snapshot of it along with the HTML.\n- Invalid HTML tag nesting.\n\nIt can also happen if the client has a browser extension installed which messes with the HTML before React loaded.\n\nhttps://react.dev/link/hydration-mismatch" + diff), fiber));
3124			throw HydrationMismatchException;
3125		}
3126		function prepareToHydrateHostInstance(fiber) {
3127			var didHydrate = fiber.stateNode;
3128			var type = fiber.type, props = fiber.memoizedProps;
3129			didHydrate[internalInstanceKey] = fiber;
3130			didHydrate[internalPropsKey] = props;
3131			validatePropertiesInDevelopment(type, props);
3132			switch (type) {
3133				case "dialog":
3134					listenToNonDelegatedEvent("cancel", didHydrate);
3135					listenToNonDelegatedEvent("close", didHydrate);
3136					break;
3137				case "iframe":
3138				case "object":
3139				case "embed":
3140					listenToNonDelegatedEvent("load", didHydrate);
3141					break;
3142				case "video":
3143				case "audio":
3144					for (type = 0; type < mediaEventTypes.length; type++) listenToNonDelegatedEvent(mediaEventTypes[type], didHydrate);
3145					break;
3146				case "source":
3147					listenToNonDelegatedEvent("error", didHydrate);
3148					break;
3149				case "img":
3150				case "image":
3151				case "link":
3152					listenToNonDelegatedEvent("error", didHydrate);
3153					listenToNonDelegatedEvent("load", didHydrate);
3154					break;
3155				case "details":
3156					listenToNonDelegatedEvent("toggle", didHydrate);
3157					break;
3158				case "input":
3159					checkControlledValueProps("input", props);
3160					listenToNonDelegatedEvent("invalid", didHydrate);
3161					validateInputProps(didHydrate, props);
3162					initInput(didHydrate, props.value, props.defaultValue, props.checked, props.defaultChecked, props.type, props.name, !0);
3163					break;
3164				case "option":
3165					validateOptionProps(didHydrate, props);
3166					break;
3167				case "select":
3168					checkControlledValueProps("select", props);
3169					listenToNonDelegatedEvent("invalid", didHydrate);
3170					validateSelectProps(didHydrate, props);
3171					break;
3172				case "textarea": checkControlledValueProps("textarea", props), listenToNonDelegatedEvent("invalid", didHydrate), val
vendor: 5,283 bytes, lines 3172-3250
3172idateTextareaProps(didHydrate, props), initTextarea(didHydrate, props.value, props.defaultValue, props.children);
3173			}
3174			type = props.children;
3175			"string" !== typeof type && "number" !== typeof type && "bigint" !== typeof type || didHydrate.textContent === "" + type || !0 === props.suppressHydrationWarning || checkForUnmatchedText(didHydrate.textContent, type) ? (null != props.popover && (listenToNonDelegatedEvent("beforetoggle", didHydrate), listenToNonDelegatedEvent("toggle", didHydrate)), null != props.onScroll && listenToNonDelegatedEvent("scroll", didHydrate), null != props.onScrollEnd && listenToNonDelegatedEvent("scrollend", didHydrate), null != props.onClick && (didHydrate.onclick = noop$1), didHydrate = !0) : didHydrate = !1;
3176			didHydrate || throwOnHydrationMismatch(fiber, !0);
3177		}
3178		function popToNextHostParent(fiber) {
3179			for (hydrationParentFiber = fiber.return; hydrationParentFiber;) switch (hydrationParentFiber.tag) {
3180				case 5:
3181				case 31:
3182				case 13:
3183					rootOrSingletonContext = !1;
3184					return;
3185				case 27:
3186				case 3:
3187					rootOrSingletonContext = !0;
3188					return;
3189				default: hydrationParentFiber = hydrationParentFiber.return;
3190			}
3191		}
3192		function popHydrationState(fiber) {
3193			if (fiber !== hydrationParentFiber) return !1;
3194			if (!isHydrating) return popToNextHostParent(fiber), isHydrating = !0, !1;
3195			var tag = fiber.tag, JSCompiler_temp;
3196			if (JSCompiler_temp = 3 !== tag && 27 !== tag) {
3197				if (JSCompiler_temp = 5 === tag) JSCompiler_temp = fiber.type, JSCompiler_temp = !("form" !== JSCompiler_temp && "button" !== JSCompiler_temp) || shouldSetTextContent(fiber.type, fiber.memoizedProps);
3198				JSCompiler_temp = !JSCompiler_temp;
3199			}
3200			if (JSCompiler_temp && nextHydratableInstance) {
3201				for (JSCompiler_temp = nextHydratableInstance; JSCompiler_temp;) {
3202					var diffNode = buildHydrationDiffNode(fiber, 0), description = describeHydratableInstanceForDevWarnings(JSCompiler_temp);
3203					diffNode.serverTail.push(description);
3204					JSCompiler_temp = "Suspense" === description.type ? getNextHydratableInstanceAfterHydrationBoundary(JSCompiler_temp) : getNextHydratable(JSCompiler_temp.nextSibling);
3205				}
3206				throwOnHydrationMismatch(fiber);
3207			}
3208			popToNextHostParent(fiber);
3209			if (13 === tag) {
3210				fiber = fiber.memoizedState;
3211				fiber = null !== fiber ? fiber.dehydrated : null;
3212				if (!fiber) throw Error("Expected to have a hydrated suspense instance. This error is likely caused by a bug in React. Please file an issue.");
3213				nextHydratableInstance = getNextHydratableInstanceAfterHydrationBoundary(fiber);
3214			} else if (31 === tag) {
3215				fiber = fiber.memoizedState;
3216				fiber = null !== fiber ? fiber.dehydrated : null;
3217				if (!fiber) throw Error("Expected to have a hydrated suspense instance. This error is likely caused by a bug in React. Please file an issue.");
3218				nextHydratableInstance = getNextHydratableInstanceAfterHydrationBoundary(fiber);
3219			} else 27 === tag ? (tag = nextHydratableInstance, isSingletonScope(fiber.type) ? (fiber = previousHydratableOnEnteringScopedSingleton, previousHydratableOnEnteringScopedSingleton = null, nextHydratableInstance = fiber) : nextHydratableInstance = tag) : nextHydratableInstance = hydrationParentFiber ? getNextHydratable(fiber.stateNode.nextSibling) : null;
3220			return !0;
3221		}
3222		function resetHydrationState() {
3223			nextHydratableInstance = hydrationParentFiber = null;
3224			didSuspendOrErrorDEV = isHydrating = !1;
3225		}
3226		function upgradeHydrationErrorsToRecoverable() {
3227			var queuedErrors = hydrationErrors;
3228			null !== queuedErrors && (null === workInProgressRootRecoverableErrors ? workInProgressRootRecoverableErrors = queuedErrors : workInProgressRootRecoverableErrors.push.apply(workInProgressRootRecoverableErrors, queuedErrors), hydrationErrors = null);
3229			return queuedErrors;
3230		}
3231		function queueHydrationError(error) {
3232			null === hydrationErrors ? hydrationErrors = [error] : hydrationErrors.push(error);
3233		}
3234		function emitPendingHydrationWarnings() {
3235			var diffRoot = hydrationDiffRootDEV;
3236			if (null !== diffRoot) {
3237				hydrationDiffRootDEV = null;
3238				for (var diff = describeDiff(diffRoot); 0 < diffRoot.children.length;) diffRoot = diffRoot.children[0];
3239				runWithFiberInDEV(diffRoot.fiber, function() {
3240					console.error("A tree hydrated but some attributes of the server rendered HTML didn't match the client properties. This won't be patched up. This can happen if a SSR-ed Client Component used:\n\n- A server/client branch `if (typeof window !== 'undefined')`.\n- Variable input such as `Date.now()` or `Math.random()` which changes each time it's called.\n- Date formatting in a user's locale which doesn't match the server.\n- External changing data without sending a snapshot of it along with the HTML.\n- Invalid HTML tag nesting.\n\nIt can also happen if the client has a browser extension installed which messes with the HTML before React loaded.\n\n%s%s", "https://react.dev/link/hydration-mismatch", diff);
3241				});
3242			}
3243		}
3244		function resetContextDependencies() {
3245			lastContextDependency = currentlyRenderingFiber$1 = null;
3246			isDisallowedContextReadInDEV = !1;
3247		}
3248		function pushProvider(providerFiber, context, nextValue) {
3249			push(valueCursor, context._currentValue, providerFiber);
3250			context._currentValue = nextValue;
vendor: 1,338 bytes, lines 3251-3270
3251			push(rendererCursorDEV, context._currentRenderer, providerFiber);
3252			void 0 !== context._currentRenderer && null !== context._currentRenderer && context._currentRenderer !== rendererSigil && console.error("Detected multiple renderers concurrently rendering the same context provider. This is currently unsupported.");
3253			context._currentRenderer = rendererSigil;
3254		}
3255		function popProvider(context, providerFiber) {
3256			context._currentValue = valueCursor.current;
3257			var currentRenderer = rendererCursorDEV.current;
3258			pop(rendererCursorDEV, providerFiber);
3259			context._currentRenderer = currentRenderer;
3260			pop(valueCursor, providerFiber);
3261		}
3262		function scheduleContextWorkOnParentPath(parent, renderLanes, propagationRoot) {
3263			for (; null !== parent;) {
3264				var alternate = parent.alternate;
3265				(parent.childLanes & renderLanes) !== renderLanes ? (parent.childLanes |= renderLanes, null !== alternate && (alternate.childLanes |= renderLanes)) : null !== alternate && (alternate.childLanes & renderLanes) !== renderLanes && (alternate.childLanes |= renderLanes);
3266				if (parent === propagationRoot) break;
3267				parent = parent.return;
3268			}
3269			parent !== propagationRoot && console.error("Expected to find the propagation root when scheduling context work. This error is likely caused by a bug in React. Please file an issue.");
3270		}
vendor: 3,329 bytes, lines 3271-3339
3271		function propagateContextChanges(workInProgress, contexts, renderLanes, forcePropagateEntireTree) {
3272			var fiber = workInProgress.child;
3273			null !== fiber && (fiber.return = workInProgress);
3274			for (; null !== fiber;) {
3275				var list = fiber.dependencies;
3276				if (null !== list) {
3277					var nextFiber = fiber.child;
3278					list = list.firstContext;
3279					a: for (; null !== list;) {
3280						var dependency = list;
3281						list = fiber;
3282						for (var i = 0; i < contexts.length; i++) if (dependency.context === contexts[i]) {
3283							list.lanes |= renderLanes;
3284							dependency = list.alternate;
3285							null !== dependency && (dependency.lanes |= renderLanes);
3286							scheduleContextWorkOnParentPath(list.return, renderLanes, workInProgress);
3287							forcePropagateEntireTree || (nextFiber = null);
3288							break a;
3289						}
3290						list = dependency.next;
3291					}
3292				} else if (18 === fiber.tag) {
3293					nextFiber = fiber.return;
3294					if (null === nextFiber) throw Error("We just came from a parent so we must have had a parent. This is a bug in React.");
3295					nextFiber.lanes |= renderLanes;
3296					list = nextFiber.alternate;
3297					null !== list && (list.lanes |= renderLanes);
3298					scheduleContextWorkOnParentPath(nextFiber, renderLanes, workInProgress);
3299					nextFiber = null;
3300				} else 13 === fiber.tag && null !== fiber.memoizedState && null === fiber.memoizedState.dehydrated ? (fiber.lanes |= renderLanes, nextFiber = fiber.alternate, null !== nextFiber && (nextFiber.lanes |= renderLanes), scheduleContextWorkOnParentPath(fiber.return, renderLanes, workInProgress), nextFiber = fiber.child, nextFiber = null !== nextFiber ? nextFiber.sibling : null) : nextFiber = fiber.child;
3301				if (null !== nextFiber) nextFiber.return = fiber;
3302				else for (nextFiber = fiber; null !== nextFiber;) {
3303					if (nextFiber === workInProgress) {
3304						nextFiber = null;
3305						break;
3306					}
3307					fiber = nextFiber.sibling;
3308					if (null !== fiber) {
3309						fiber.return = nextFiber.return;
3310						nextFiber = fiber;
3311						break;
3312					}
3313					nextFiber = nextFiber.return;
3314				}
3315				fiber = nextFiber;
3316			}
3317		}
3318		function propagateParentContextChanges(current, workInProgress, renderLanes, forcePropagateEntireTree) {
3319			current = null;
3320			for (var parent = workInProgress, isInsidePropagationBailout = !1; null !== parent;) {
3321				if (!isInsidePropagationBailout) {
3322					if (0 !== (parent.flags & 524288)) isInsidePropagationBailout = !0;
3323					else if (0 !== (parent.flags & 262144)) break;
3324				}
3325				if (10 === parent.tag) {
3326					var currentParent = parent.alternate;
3327					if (null === currentParent) throw Error("Should have a current fiber. This is a bug in React.");
3328					currentParent = currentParent.memoizedProps;
3329					if (null !== currentParent) {
3330						var context = parent.type;
3331						objectIs(parent.pendingProps.value, currentParent.value) || (null !== current ? current.push(context) : current = [context]);
3332					}
3333				} else if (parent === hostTransitionProviderCursor.current) {
3334					currentParent = parent.alternate;
3335					if (null === currentParent) throw Error("Should have a current fiber. This is a bug in React.");
3336					currentParent.memoizedState.memoizedState !== parent.memoizedState.memoizedState && (null !== current ? current.push(HostTransitionContext) : current = [HostTransitionContext]);
3337				}
3338				parent = parent.return;
3339			}
3340			null !== current && propagateContextChanges(workInProgress, current, renderLanes, forcePropagateEntireTree);
3341			workInProgress.flags |= 262144;
3342			return null !== current;
3343		}
3344		function checkIfContextChanged(currentDependencies) {
3345			for (currentDependencies = currentDependencies.firstContext; null !== currentDependencies;) {
3346				if (!objectIs(currentDependencies.context._currentValue, currentDependencies.memoizedValue)) return !0;
3347				currentDependencies = currentDependencies.next;
3348			}
3349			return !1;
3350		}
3351		function prepareToReadContext(workInProgress) {
3352			currentlyRenderingFiber$1 = workInProgress;
3353			lastContextDependency = null;
3354			workInProgress = workInProgress.dependencies;
3355			null !== workInProgress && (workInProgress.firstContext = null);
3356		}
3357		function readContext(context) {
3358			isDisallowedContextReadInDEV && console.error("Context can only be read while React is rendering. In classes, you can read it in the render method or getDerivedStateFromProps. In function components, you can read it directly in the function body, but not inside Hooks like useReducer() or useMemo().");
3359			return readContextForConsumer(currentlyRenderingFiber$1, context);
3360		}
3361		function readContextDuringReconciliation(consumer, context) {
3362			null === currentlyRenderingFiber$1 && prepareToReadContext(consumer);
3363			return readContextForConsumer(consumer, context);
3364		}
3365		function readContextForConsumer(consumer, context) {
3366			var value = context._currentValue;
3367			context = {
3368				context,
3369				memoizedValue: value,
3370				next: null
3371			};
3372			if (null === lastContextDependency) {
3373				if (null === consumer) throw Error("Context can only be read while React is rendering. In classes, you can read it in the render method or getDerivedStateFromProps. In function components, you can read it directly in the function body, but not inside Hooks like useReducer() or useMemo().");
3374				lastContextDependency = context;
3375				consumer.dependencies = {
3376					lanes: 0,
3377					firstContext: context,
3378					_debugThenableState: null
3379				};
3380				consumer.flags |= 524288;
3381			} else lastContextDependency = lastContextDependency.next = context;
3382			return value;
3383		}
3384		function createCache() {
3385			return {
3386				controller: new AbortControllerLocal(),
3387				data: /* @__PURE__ */ new Map(),
3388				refCount: 0
3389			};
3390		}
3391		function retainCache(cache) {
3392			cache.controller.signal.aborted && console.warn("A cache instance was retained after it was already freed. This likely indicates a bug in React.");
3393			cache.refCount++;
3394		}
3395		function releaseCache(cache) {
3396			cache.refCount--;
3397			0 > cache.refCount && console.warn("A cache instance was released after it was already freed. This likely indicates a bug in React.");
3398			0 === cache.refCount && scheduleCallback$2(NormalPriority, function() {
3399				cache.controller.abort();
3400			});
3401		}
3402		function queueTransitionTypes(root, transitionTypes) {
3403			if (0 !== (root.pendingLanes & 4194048)) {
3404				var queued = root.transitionTypes;
3405				null === queued && (queued = root.transitionTypes = []);
3406				for (root = 0; root < transitionTypes.length; root++) {
3407					var transitionType = transitionTypes[root];
3408					-1 === queued.indexOf(transitionType) && queued.push(transitionType);
3409				}
3410			}
3411		}
3412		function claimQueuedTransitionTypes(root) {
3413			var claimed = root.transitionTypes;
3414			root.transitionTypes = null;
3415			return claimed;
3416		}
3417		function startUpdateTimerByLane(lane, method, fiber) {
3418			if (0 !== (lane & 127)) 0 > blockingUpdateTime && (blockingUpdateTime = now(), blockingUpdateTask = createTask(method), blockingUpdateMethodName = method, null != fiber && (blockingUpdateComponentName = getComponentNameFromFiber(fiber)), (executionContext & (RenderContext | CommitContext)) !== NoContext && (componentEffectSpawnedUpdate = !0, blockingUpdateType = SPAWNED_UPDATE), lane = resolveEventTimeStamp(), method = resolveEventType(), lane !== blockingEventRepeatTime || method !== blockingEventType ? blockingEventRepeatTime = -1.1 : null !== method && (blockingUpdateType = SPAWNED_UPDATE), blockingEventTime = lane, blockingEventType = method);
3419			else if (0 !== (lane & 4194048) && 0 >
vendor: 11,710 bytes, lines 3419-3677
3419 transitionUpdateTime && (transitionUpdateTime = now(), transitionUpdateTask = createTask(method), transitionUpdateMethodName = method, null != fiber && (transitionUpdateComponentName = getComponentNameFromFiber(fiber)), 0 > transitionStartTime)) {
3420				lane = resolveEventTimeStamp();
3421				method = resolveEventType();
3422				if (lane !== transitionEventRepeatTime || method !== transitionEventType) transitionEventRepeatTime = -1.1;
3423				transitionEventTime = lane;
3424				transitionEventType = method;
3425			}
3426		}
3427		function startHostActionTimer(fiber) {
3428			if (0 > blockingUpdateTime) {
3429				blockingUpdateTime = now();
3430				blockingUpdateTask = null != fiber._debugTask ? fiber._debugTask : null;
3431				(executionContext & (RenderContext | CommitContext)) !== NoContext && (blockingUpdateType = SPAWNED_UPDATE);
3432				var newEventTime = resolveEventTimeStamp(), newEventType = resolveEventType();
3433				newEventTime !== blockingEventRepeatTime || newEventType !== blockingEventType ? blockingEventRepeatTime = -1.1 : null !== newEventType && (blockingUpdateType = SPAWNED_UPDATE);
3434				blockingEventTime = newEventTime;
3435				blockingEventType = newEventType;
3436			}
3437			if (0 > transitionUpdateTime && (transitionUpdateTime = now(), transitionUpdateTask = null != fiber._debugTask ? fiber._debugTask : null, 0 > transitionStartTime)) {
3438				fiber = resolveEventTimeStamp();
3439				newEventTime = resolveEventType();
3440				if (fiber !== transitionEventRepeatTime || newEventTime !== transitionEventType) transitionEventRepeatTime = -1.1;
3441				transitionEventTime = fiber;
3442				transitionEventType = newEventTime;
3443			}
3444		}
3445		function pushNestedEffectDurations() {
3446			var prevEffectDuration = profilerEffectDuration;
3447			profilerEffectDuration = 0;
3448			return prevEffectDuration;
3449		}
3450		function popNestedEffectDurations(prevEffectDuration) {
3451			var elapsedTime = profilerEffectDuration;
3452			profilerEffectDuration = prevEffectDuration;
3453			return elapsedTime;
3454		}
3455		function bubbleNestedEffectDurations(prevEffectDuration) {
3456			var elapsedTime = profilerEffectDuration;
3457			profilerEffectDuration += prevEffectDuration;
3458			return elapsedTime;
3459		}
3460		function resetComponentEffectTimers() {
3461			componentEffectEndTime = componentEffectStartTime = -1.1;
3462		}
3463		function pushComponentEffectStart() {
3464			var prevEffectStart = componentEffectStartTime;
3465			componentEffectStartTime = -1.1;
3466			return prevEffectStart;
3467		}
3468		function popComponentEffectStart(prevEffectStart) {
3469			0 <= prevEffectStart && (componentEffectStartTime = prevEffectStart);
3470		}
3471		function pushComponentEffectDuration() {
3472			var prevEffectDuration = componentEffectDuration;
3473			componentEffectDuration = -0;
3474			return prevEffectDuration;
3475		}
3476		function popComponentEffectDuration(prevEffectDuration) {
3477			0 <= prevEffectDuration && (componentEffectDuration = prevEffectDuration);
3478		}
3479		function pushComponentEffectErrors() {
3480			var prevErrors = componentEffectErrors;
3481			componentEffectErrors = null;
3482			return prevErrors;
3483		}
3484		function pushComponentEffectDidSpawnUpdate() {
3485			var prev = componentEffectSpawnedUpdate;
3486			componentEffectSpawnedUpdate = !1;
3487			return prev;
3488		}
3489		function startProfilerTimer(fiber) {
3490			profilerStartTime = now();
3491			0 > fiber.actualStartTime && (fiber.actualStartTime = profilerStartTime);
3492		}
3493		function stopProfilerTimerIfRunningAndRecordDuration(fiber) {
3494			if (0 <= profilerStartTime) {
3495				var elapsedTime = now() - profilerStartTime;
3496				fiber.actualDuration += elapsedTime;
3497				fiber.selfBaseDuration = elapsedTime;
3498				profilerStartTime = -1;
3499			}
3500		}
3501		function stopProfilerTimerIfRunningAndRecordIncompleteDuration(fiber) {
3502			if (0 <= profilerStartTime) {
3503				var elapsedTime = now() - profilerStartTime;
3504				fiber.actualDuration += elapsedTime;
3505				profilerStartTime = -1;
3506			}
3507		}
3508		function recordEffectDuration() {
3509			if (0 <= profilerStartTime) {
3510				var endTime = now(), elapsedTime = endTime - profilerStartTime;
3511				profilerStartTime = -1;
3512				profilerEffectDuration += elapsedTime;
3513				componentEffectDuration += elapsedTime;
3514				componentEffectEndTime = endTime;
3515			}
3516		}
3517		function recordEffectError(errorInfo) {
3518			null === componentEffectErrors && (componentEffectErrors = []);
3519			componentEffectErrors.push(errorInfo);
3520			null === commitErrors && (commitErrors = []);
3521			commitErrors.push(errorInfo);
3522		}
3523		function startEffectTimer() {
3524			profilerStartTime = now();
3525			0 > componentEffectStartTime && (componentEffectStartTime = profilerStartTime);
3526		}
3527		function transferActualDuration(fiber) {
3528			for (var child = fiber.child; child;) fiber.actualDuration += child.actualDuration, child = child.sibling;
3529		}
3530		function entangleAsyncAction(transition, thenable) {
3531			if (null === currentEntangledListeners) {
3532				var entangledListeners = currentEntangledListeners = [];
3533				currentEntangledPendingCount = 0;
3534				currentEntangledLane = requestTransitionLane();
3535				currentEntangledActionThenable = {
3536					status: "pending",
3537					value: void 0,
3538					then: function(resolve) {
3539						entangledListeners.push(resolve);
3540					}
3541				};
3542			}
3543			currentEntangledPendingCount++;
3544			thenable.then(pingEngtangledActionScope, pingEngtangledActionScope);
3545			return thenable;
3546		}
3547		function pingEngtangledActionScope() {
3548			if (0 === --currentEntangledPendingCount && (-1 < transitionUpdateTime || (transitionStartTime = -1.1), entangledTransitionTypes = null, null !== currentEntangledListeners)) {
3549				null !== currentEntangledActionThenable && (currentEntangledActionThenable.status = "fulfilled");
3550				var listeners = currentEntangledListeners;
3551				currentEntangledListeners = null;
3552				currentEntangledLane = 0;
3553				currentEntangledActionThenable = null;
3554				for (var i = 0; i < listeners.length; i++) (0, listeners[i])();
3555			}
3556		}
3557		function chainThenableValue(thenable, result) {
3558			var listeners = [], thenableWithOverride = {
3559				status: "pending",
3560				value: null,
3561				reason: null,
3562				then: function(resolve) {
3563					listeners.push(resolve);
3564				}
3565			};
3566			thenable.then(function() {
3567				thenableWithOverride.status = "fulfilled";
3568				thenableWithOverride.value = result;
3569				for (var i = 0; i < listeners.length; i++) (0, listeners[i])(result);
3570			}, function(error) {
3571				thenableWithOverride.status = "rejected";
3572				thenableWithOverride.reason = error;
3573				for (error = 0; error < listeners.length; error++) (0, listeners[error])(void 0);
3574			});
3575			return thenableWithOverride;
3576		}
3577		function peekCacheFromPool() {
3578			var cacheResumedFromPreviousRender = resumedCache.current;
3579			return null !== cacheResumedFromPreviousRender ? cacheResumedFromPreviousRender : workInProgressRoot.pooledCache;
3580		}
3581		function pushTransition(offscreenWorkInProgress, prevCachePool) {
3582			null === prevCachePool ? push(resumedCache, resumedCache.current, offscreenWorkInProgress) : push(resumedCache, prevCachePool.pool, offscreenWorkInProgress);
3583		}
3584		function getSuspendedCache() {
3585			var cacheFromPool = peekCacheFromPool();
3586			return null === cacheFromPool ? null : {
3587				parent: CacheContext._currentValue,
3588				pool: cacheFromPool
3589			};
3590		}
3591		function createThenableState() {
3592			return {
3593				didWarnAboutUncachedPromise: !1,
3594				thenables: []
3595			};
3596		}
3597		function isThenableResolved(thenable) {
3598			thenable = thenable.status;
3599			return "fulfilled" === thenable || "rejected" === thenable;
3600		}
3601		function trackUsedThenable(thenableState, thenable, index, fiber) {
3602			null !== ReactSharedInternals.actQueue && (ReactSharedInternals.didUsePromise = !0);
3603			var trackedThenables = thenableState.thenables;
3604			index = trackedThenables[index];
3605			void 0 === index ? trackedThenables.push(thenable) : index !== thenable && (thenableState.didWarnAboutUncachedPromise || (thenableState.didWarnAboutUncachedPromise = !0, console.error("A component was suspended by an uncached promise. Creating promises inside a Client Component or hook is not yet supported, except via a Suspense-compatible library or framework.")), thenable.then(noop$1, noop$1), thenable = index);
3606			if (void 0 === thenable._debugInfo) {
3607				thenableState = performance.now();
3608				trackedThenables = thenable.displayName;
3609				var ioInfo = {
3610					name: "string" === typeof trackedThenables ? trackedThenables : "Promise",
3611					start: thenableState,
3612					end: thenableState,
3613					value: thenable
3614				};
3615				thenable._debugInfo = [{ awaited: ioInfo }];
3616				"fulfilled" !== thenable.status && "rejected" !== thenable.status && (thenableState = function() {
3617					ioInfo.end = performance.now();
3618				}, thenable.then(thenableState, thenableState));
3619			}
3620			switch (thenable.status) {
3621				case "fulfilled": return thenable.value;
3622				case "rejected":
3623					fiber = thenable.reason;
3624					checkIfUseWrappedInAsyncCatch(fiber);
3625					if (void 0 === fiber && !("reason" in thenable)) throw Error("A rejected Promise was passed to React without a `reason` property. React threw a generic error from where the Promise was used to assist in identifying the problematic Promise. Make sure that instrumented Promises correctly set the `reason` property when setting `status` to `'rejected'`.");
3626					throw fiber;
3627				default:
3628					if ("string" === typeof thenable.status) thenable.then(noop$1, noop$1);
3629					else {
3630						thenableState = workInProgressRoot;
3631						if (null !== thenableState && 100 < thenableState.shellSuspendCounter) throw Error("An unknown Component is an async Client Component. Only Server Components can be async at the moment. This error is often caused by accidentally adding `'use client'` to a module that was originally written for the server.");
3632						thenableState = thenable;
3633						thenableState.status = "pending";
3634						thenableState.then(function(fulfilledValue) {
3635							if ("pending" === thenable.status) {
3636								var fulfilledThenable = thenable;
3637								fulfilledThenable.status = "fulfilled";
3638								fulfilledThenable.value = fulfilledValue;
3639							}
3640						}, function(error) {
3641							if ("pending" === thenable.status) {
3642								var rejectedThenable = thenable;
3643								rejectedThenable.status = "rejected";
3644								rejectedThenable.reason = error;
3645							}
3646						});
3647					}
3648					switch (thenable.status) {
3649						case "fulfilled": return thenable.value;
3650						case "rejected": throw fiber = thenable.reason, checkIfUseWrappedInAsyncCatch(fiber), fiber;
3651					}
3652					suspendedThenable = thenable;
3653					needsToResetSuspendedThenableDEV = !0;
3654					didIssueUseWarning || null === fiber || null !== fiber.alternate || (lastSuspendedFiber = fiber, lastSuspendedStack = Error("This library called use() to suspend in a previous render but did not call use() when it finished. This indicates an incorrect use of use(). Learn more: https://react.dev/warnings/conditional-use-of-use"));
3655					throw SuspenseException;
3656			}
3657		}
3658		function resolveLazy(lazyType) {
3659			try {
3660				return callLazyInitInDEV(lazyType);
3661			} catch (x) {
3662				if (null !== x && "object" === typeof x && "function" === typeof x.then) throw suspendedThenable = x, needsToResetSuspendedThenableDEV = !0, SuspenseException;
3663				throw x;
3664			}
3665		}
3666		function getSuspendedThenable() {
3667			if (null === suspendedThenable) throw Error("Expected a suspended thenable. This is a bug in React. Please file an issue.");
3668			var thenable = suspendedThenable;
3669			suspendedThenable = null;
3670			needsToResetSuspendedThenableDEV = !1;
3671			return thenable;
3672		}
3673		function checkIfUseWrappedInAsyncCatch(rejectedReason) {
3674			if (rejectedReason === SuspenseException || rejectedReason === SuspenseActionException) throw Error("Hooks are not supported inside an async component. This error is often caused by accidentally adding `'use client'` to a module that was originally written for the server.");
3675		}
3676		function areSameKeyPath(a, b) {
3677			return a === b ? !0 : a.tag !== b.tag || a.type !== b.type || a.key !== b.ke
3677y || a.index !== b.index || 3 === a.tag && a.stateNode !== b.stateNode || null === a.return || null === b.return ? !1 : areSameKeyPath(a.return, b.return);
3678		}
3679		function pushDebugInfo(debugInfo) {
3680			var previousDebugInfo = currentDebugInfo;
3681			null != debugInfo && (currentDebugInfo = null === previousDebugInfo ? debugInfo : previousDebugInfo.concat(debugInfo));
3682			return previousDebugInfo;
3683		}
3684		function getCurrentDebugTask() {
3685			var debugInfo = currentDebugInfo;
3686			if (null != debugInfo) {
3687				for (var i = debugInfo.length - 1; 0 <= i; i--) if (null != debugInfo[i].name) {
3688					var debugTask = debugInfo[i].debugTask;
3689					if (null != debugTask) return debugTask;
3690				}
3691			}
3692			return null;
3693		}
3694		function validateFragmentProps(element, fiber, returnFiber) {
3695			for (var keys = Object.keys(element.props), i = 0; i < keys.length; i++) {
3696				var key = keys[i];
3697				if ("children" !== key && "key" !== key && "ref" !== key) {
3698					null === fiber && (fiber = createFiberFromElement(element, returnFiber.mode, 0), fiber._debugInfo = currentDebugInfo, fiber.return = returnFiber);
3699					runWithFiberInDEV(fiber, function(erroredKey) {
3700						console.error("Invalid prop `%s` supplied to `React.Fragment`. React.Fragment can only have `key`, `ref`, and `children` props.", erroredKey);
3701					}, key);
3702					break;
3703				}
3704			}
3705		}
3706		function unwrapThenable(thenable) {
3707			var index = thenableIndexCounter$1;
3708			thenableIndexCounter$1 += 1;
3709			null === thenableState$1 && (thenableState$1 = createThenableState());
3710			return trackUsedThenable(thenableState$1, thenable, index, null);
3711		}
3712		function coerceRef(workInProgress, element) {
3713			element = element.props.ref;
3714			workInProgress.ref = void 0 !== element ? element : null;
3715		}
3716		function throwOnInvalidObjectTypeImpl(returnFiber, newChild) {
3717			if (newChild.$$typeof === REACT_LEGACY_ELEMENT_TYPE) throw Error("A React Element from an older version of React was rendered. This is not supported. It can happen if:\n- Multiple copies of the \"react\" package is used.\n- A library pre-bundled an old copy of \"react\" or \"react/jsx-runtime\".\n- A compiler tries to \"inline\" JSX instead of using the runtime.");
3718			returnFiber = Object.prototype.toString.call(newChild);
3719			throw Error("Objects are not valid as a React child (found: " + ("[object Object]" === returnFiber ? "object with keys {" + Object.keys(newChild).join(", ") + "}" : returnFiber) + "). If you meant to render a collection of children, use an array instead.");
3720		}
3721		function throwOnInvalidObjectType(returnFiber, newChild) {
3722			var debugTask = getCurrentDebugTask();
3723			null !== debugTask ? debugTask.run(throwOnInvalidObjectTypeImpl.bind(null, returnFiber, newChild)) : throwOnInvalidObjectTypeImpl(returnFiber, newChild);
3724		}
3725		function warnOnFunctionTypeImpl(returnFiber, invalidChild) {
3726			var parentName = getComponentNameFromFiber(returnFiber) || "Component";
3727			ownerHasFunctionTypeWarning[parentName] || (ownerHasFunctionTypeWarning[parentName] = !0, invalidChild = invalidChild.displayName || invalidChild.name || "Component", 3 === returnFiber.tag ? console.error("Functions are not valid as a React child. This may happen if you return %s instead of <%s /> from render. Or maybe you meant to call this function rather than return it.\n  root.render(%s)", invalidChild, invalidChild, invalidChild) : console.error("Functions are not valid as a React child. This may happen if you return %s instead of <%s /> from render. Or maybe you meant to call this function rather than return it.\n  <%s>{%s}</%s>", invalidChild, invalidChild, parentName, invalidChild, parentName));
3728		}
3729		function warnOnFunctionType(returnFiber, invalidChild) {
3730			var debugTask = getCurrentDebugTask();
3731			null !== debugTask ? debugTask.run(warnOnFunctionTypeImpl.bind(null, returnFiber, invalidChild)) : warnOnFunctionTypeImpl(returnFiber, invalidChild);
3732		}
3733		function warnOnSymbolTypeImpl(returnFiber, invalidChild) {
3734			var parentName = getComponentNameFromFiber(returnFiber) || "Component";
3735			ownerHasSymbolTypeWarning[parentName] || (ownerHasSymbolTypeWarning[parentName] = !0, invalidChild = String(invalidChild), 3 === returnFiber.tag ? console.error("Symbols are not valid as a React child.\n  root.render(%s)", invalidChild) : console.error("Symbols are not valid as a React child.\n  <%s>%s</%s>", parentName, invalidChild, parentName));
3736		}
3737		function warnOnSymbolType(returnFiber, invalidChild) {
3738			var debugTask = getCurrentDebugTask();
3739			null !== debugTask ? debugTask.run(warnOnSymbolTypeImpl.bind(null, returnFiber, invalidChild)) : warnOnSymbolTypeImpl(returnFiber, invalidChild);
3740		}
3741		function createChildReconciler(shouldTrackSideEffects) {
3742			function deleteChild(returnFiber, childToDelete) {
3743				if (shouldTrackSideEffects) {
vendor: 6,148 bytes, lines 3744-3821
3744					var deletions = returnFiber.deletions;
3745					null === deletions ? (returnFiber.deletions = [childToDelete], returnFiber.flags |= 16) : deletions.push(childToDelete);
3746				}
3747			}
3748			function deleteRemainingChildren(returnFiber, currentFirstChild) {
3749				if (!shouldTrackSideEffects) return null;
3750				for (; null !== currentFirstChild;) deleteChild(returnFiber, currentFirstChild), currentFirstChild = currentFirstChild.sibling;
3751				return null;
3752			}
3753			function mapRemainingChildren(currentFirstChild) {
3754				for (var existingChildren = /* @__PURE__ */ new Map(); null !== currentFirstChild;) null === currentFirstChild.key ? existingChildren.set(currentFirstChild.index, currentFirstChild) : existingChildren.set(currentFirstChild.key, currentFirstChild), currentFirstChild = currentFirstChild.sibling;
3755				return existingChildren;
3756			}
3757			function useFiber(fiber, pendingProps) {
3758				fiber = createWorkInProgress(fiber, pendingProps);
3759				fiber.index = 0;
3760				fiber.sibling = null;
3761				return fiber;
3762			}
3763			function placeChild(newFiber, lastPlacedIndex, newIndex) {
3764				newFiber.index = newIndex;
3765				if (!shouldTrackSideEffects) return newFiber.flags |= 1048576, lastPlacedIndex;
3766				newIndex = newFiber.alternate;
3767				if (null !== newIndex) return newIndex = newIndex.index, newIndex < lastPlacedIndex ? (newFiber.flags |= 2, lastPlacedIndex) : newIndex;
3768				newFiber.flags |= 134217730;
3769				return lastPlacedIndex;
3770			}
3771			function placeSingleChild(newFiber) {
3772				shouldTrackSideEffects && null === newFiber.alternate && (newFiber.flags |= 134217730);
3773				return newFiber;
3774			}
3775			function updateTextNode(returnFiber, current, textContent, lanes) {
3776				if (null === current || 6 !== current.tag) return current = createFiberFromText(textContent, returnFiber.mode, lanes), current.return = returnFiber, current._debugOwner = returnFiber, current._debugTask = returnFiber._debugTask, current._debugInfo = currentDebugInfo, current;
3777				current = useFiber(current, textContent);
3778				current.return = returnFiber;
3779				current._debugInfo = currentDebugInfo;
3780				return current;
3781			}
3782			function updateElement(returnFiber, current, element, lanes) {
3783				var elementType = element.type;
3784				if (elementType === REACT_FRAGMENT_TYPE) return current = updateFragment(returnFiber, current, element.props.children, lanes, element.key), coerceRef(current, element), validateFragmentProps(element, current, returnFiber), current;
3785				if (null !== current && (current.elementType === elementType || isCompatibleFamilyForHotReloading(current, element) || "object" === typeof elementType && null !== elementType && elementType.$$typeof === REACT_LAZY_TYPE && resolveLazy(elementType) === current.type)) return current = useFiber(current, element.props), coerceRef(current, element), current.return = returnFiber, current._debugOwner = element._owner, current._debugInfo = currentDebugInfo, current;
3786				current = createFiberFromElement(element, returnFiber.mode, lanes);
3787				coerceRef(current, element);
3788				current.return = returnFiber;
3789				current._debugInfo = currentDebugInfo;
3790				return current;
3791			}
3792			function updatePortal(returnFiber, current, portal, lanes) {
3793				if (null === current || 4 !== current.tag || current.stateNode.containerInfo !== portal.containerInfo || current.stateNode.implementation !== portal.implementation) return current = createFiberFromPortal(portal, returnFiber.mode, lanes), current.return = returnFiber, current._debugInfo = currentDebugInfo, current;
3794				current = useFiber(current, portal.children || []);
3795				current.return = returnFiber;
3796				current._debugInfo = currentDebugInfo;
3797				return current;
3798			}
3799			function updateFragment(returnFiber, current, fragment, lanes, key) {
3800				if (null === current || 7 !== current.tag) return current = createFiberFromFragment(fragment, returnFiber.mode, lanes, key), current.return = returnFiber, current._debugOwner = returnFiber, current._debugTask = returnFiber._debugTask, current._debugInfo = currentDebugInfo, current;
3801				current = useFiber(current, fragment);
3802				current.return = returnFiber;
3803				current._debugInfo = currentDebugInfo;
3804				return current;
3805			}
3806			function createChild(returnFiber, newChild, lanes) {
3807				if ("string" === typeof newChild && "" !== newChild || "number" === typeof newChild || "bigint" === typeof newChild) return newChild = createFiberFromText("" + newChild, returnFiber.mode, lanes), newChild.return = returnFiber, newChild._debugOwner = returnFiber, newChild._debugTask = returnFiber._debugTask, newChild._debugInfo = currentDebugInfo, newChild;
3808				if ("object" === typeof newChild && null !== newChild) {
3809					switch (newChild.$$typeof) {
3810						case REACT_ELEMENT_TYPE: return lanes = createFiberFromElement(newChild, returnFiber.mode, lanes), coerceRef(lanes, newChild), lanes.return = returnFiber, returnFiber = pushDebugInfo(newChild._debugInfo), lanes._debugInfo = currentDebugInfo, currentDebugInfo = returnFiber, lanes;
3811						case REACT_PORTAL_TYPE: return newChild = createFiberFromPortal(newChild, returnFiber.mode, lanes), newChild.return = returnFiber, newChild._debugInfo = currentDebugInfo, newChild;
3812						case REACT_LAZY_TYPE:
3813							var _prevDebugInfo = pushDebugInfo(newChild._debugInfo);
3814							newChild = resolveLazy(newChild);
3815							returnFiber = createChild(returnFiber, newChild, lanes);
3816							currentDebugInfo = _prevDebugInfo;
3817							return returnFiber;
3818					}
3819					if (isArrayImpl(newChild) || getIteratorFn(newChild)) return lanes = createFiberFromFragment(newChild, returnFiber.mode, lanes, null), lanes.return = returnFiber, lanes._debugOwner = returnFiber, lanes._debugTask = returnFiber._debugTask, returnFiber = pushDebugInfo(newChild._debugInfo), lanes._debugInfo = currentDebugInfo, currentDebugInfo = returnFiber, lanes;
3820					if ("function" === typeof newChild.then) return _prevDebugInfo = pushDebugInfo(newChild._debugInfo), returnFiber = createChild(returnFiber, unwrapThenable(newChild), lanes), currentDebugInfo = _prevDebugInfo, returnFiber;
3821					if (newChild.$$typeof === REACT_CONTEXT_TYPE) return createChild(returnFiber, readContextDuringReconciliation(returnFiber, newChild), lanes);
3822					throwOnInvalidObjectType(returnFiber, newChild);
3823				}
3824				"function" === typeof newChild && warnOnFunctionType(returnFiber, newChild);
3825				"symbol" === typeof newChild && warnOnSymbolType(returnFiber, newChild);
3826				return null;
3827			}
3828			function updateSlot(returnFiber, oldFiber, newChild, lanes) {
3829				var key = null !== oldFiber ? oldFiber.key : null;
3830				if ("string" === typeof newChild && "" !== newChild || "number" === typeof newChild || "bigint" === typeof newChild) return null !== key ? null : updateTextNode(returnFiber, oldFiber, "" + newChild, lanes);
3831				if ("object" === typeof newChild && null !== newChild) {
3832					switch (newChild.$$typeof) {
3833						case REACT_ELEMENT_TYPE: return newChild.key === key ? (key = pushDebugInfo(newChild._debugInfo), returnFiber = updateElement(returnFiber, oldFiber, newChild, lanes), currentDebugInfo = key, returnFiber) : null;
3834						case REACT_PORTAL_TYPE: return newChild.key === key ? updatePortal(returnFiber, oldFiber, newChild, lanes) : null;
3835						case REACT_LAZY_TYPE: return key = pushDebugInfo(newChild._debugInfo), newChild = resolveLazy(newChild), returnFiber = updateSlot(returnFiber, oldFiber, newChild, lanes), currentDebugInfo = key, returnFiber;
3836					}
3837					if (isArrayImpl(newChild) || getIteratorFn(newChild)) {
3838						if (null !== key) return null;
3839						key = pushDebugInfo(newChild._debugInfo);
3840						returnFiber = updateFragment(returnFiber, oldFiber, newChild, lanes, null);
3841						currentDebugInfo = key;
3842						return returnFiber;
3843					}
3844					if ("function" === typeof newChild.then) return key = pushDebugInfo(newChild._debugInfo), returnFiber = updateSlot(returnFiber, oldFiber, unwrapThenable(newChild), lanes), currentDebugInfo = key, returnFiber;
3845					if (newChild.$$typeof === REACT_CONTEXT_TYPE) return updateSlot(returnFiber, oldFiber, readContextDuringReconciliation(returnFiber, newChild), lanes);
3846					throwOnInvalidObjectType(returnFiber, newChild);
3847				}
3848				"function" === typeof newChild && warnOnFunctionType(returnFiber, newChild);
3849				"symbol" === typeof newChild && warnOnSymbolType(returnFiber, newChild);
3850				return null;
3851			}
3852			function updateFromMap(existingChildren, returnFiber, newIdx, newChild, lanes) {
3853				if ("string" === typeof newChild && "" !== newChild || "number" === typeof newChild || "bigint" === typeof newChild) return existingChildren = existingChildren.get(newIdx) || null, updateTextNode(returnFiber, existingChildren, "" + newChild, lanes);
3854				if ("object" === typeof newChild && null !== newChild) {
3855					switch (newChild.$$typeof) {
3856						case REACT_ELEMENT_TYPE: return newIdx = existingChildren.get(null === newChild.key ? newIdx : newChild.key) || null, existingChildren = pushDebugInfo(newChild._debugInfo), returnFiber = updateElement(returnFiber, newIdx, newChild, lanes), currentDebugInfo = existingChildren, returnFiber;
3857						case REACT_PORTAL_TYPE: return existingChildren = existingChildren.get(null === newChild.key ? newIdx : newChild.key) || null, updatePortal(returnFiber, existingChildren, newChild, lanes);
3858						case REACT_LAZY_TYPE:
3859							var _prevDebugInfo7 = pushDebugInfo(newChild._debugInfo);
3860							newChild = resolveLazy(newChild);
3861							returnFiber = updateFromMap(existingChildren, returnFiber, newIdx, newChild, lanes);
3862							currentDebugInfo = _prevDebugInfo7;
3863							return returnFiber;
3864					}
3865					if (isArrayImpl(newChild) || getIteratorFn(newChild)) return newIdx = existingChildren.get(newIdx) || null, existingChildren = pushDebugInfo(newChild._debugInfo), returnFiber = updateFragment(returnFiber, newIdx, newChild, lanes, null), currentDebugInfo = existingChildren, returnFiber;
3866					if ("function" === typeof newChild.then) return _prevDebugInfo7 = pushDebugInfo(newChild._debugInfo), returnFiber = updateFromMap(existingChildren, returnFiber, newIdx, unwrapThenable(newChild), lanes), currentDebugInfo = _prevDebugInfo7, returnFiber;
3867					if (newChild.$$typeof === REACT_CONTEXT_TYPE) return updateFromMap(existingChildren, returnFiber, newIdx, readContextDuringReconciliation(returnFiber, newChild), lanes);
vendor: 1,079 bytes, lines 3868-3892
3868					throwOnInvalidObjectType(returnFiber, newChild);
3869				}
3870				"function" === typeof newChild && warnOnFunctionType(returnFiber, newChild);
3871				"symbol" === typeof newChild && warnOnSymbolType(returnFiber, newChild);
3872				return null;
3873			}
3874			function warnOnInvalidKey(returnFiber, workInProgress, child, knownKeys) {
3875				if ("object" !== typeof child || null === child) return knownKeys;
3876				switch (child.$$typeof) {
3877					case REACT_ELEMENT_TYPE:
3878					case REACT_PORTAL_TYPE:
3879						warnForMissingKey(returnFiber, workInProgress, child);
3880						var key = child.key;
3881						if ("string" !== typeof key) break;
3882						if (null === knownKeys) {
3883							knownKeys = /* @__PURE__ */ new Set();
3884							knownKeys.add(key);
3885							break;
3886						}
3887						if (!knownKeys.has(key)) {
3888							knownKeys.add(key);
3889							break;
3890						}
3891						runWithFiberInDEV(workInProgress, function() {
3892							console.error("Encountered two children with the same key, `%s`. Keys should be unique so that components maintain their identity across updates. Non-unique keys may cause children to be duplicated and/
vendor: 1,682 bytes, lines 3892-3916
3892or omitted — the behavior is unsupported and could change in a future version.", key);
3893						});
3894						break;
3895					case REACT_LAZY_TYPE: child = resolveLazy(child), warnOnInvalidKey(returnFiber, workInProgress, child, knownKeys);
3896				}
3897				return knownKeys;
3898			}
3899			function reconcileChildrenArray(returnFiber, currentFirstChild, newChildren, lanes) {
3900				for (var knownKeys = null, resultingFirstChild = null, previousNewFiber = null, oldFiber = currentFirstChild, newIdx = currentFirstChild = 0, nextOldFiber = null; null !== oldFiber && newIdx < newChildren.length; newIdx++) {
3901					oldFiber.index > newIdx ? (nextOldFiber = oldFiber, oldFiber = null) : nextOldFiber = oldFiber.sibling;
3902					var newFiber = updateSlot(returnFiber, oldFiber, newChildren[newIdx], lanes);
3903					if (null === newFiber) {
3904						null === oldFiber && (oldFiber = nextOldFiber);
3905						break;
3906					}
3907					knownKeys = warnOnInvalidKey(returnFiber, newFiber, newChildren[newIdx], knownKeys);
3908					shouldTrackSideEffects && oldFiber && null === newFiber.alternate && deleteChild(returnFiber, oldFiber);
3909					currentFirstChild = placeChild(newFiber, currentFirstChild, newIdx);
3910					null === previousNewFiber ? resultingFirstChild = newFiber : previousNewFiber.sibling = newFiber;
3911					previousNewFiber = newFiber;
3912					oldFiber = nextOldFiber;
3913				}
3914				if (newIdx === newChildren.length) return deleteRemainingChildren(returnFiber, oldFiber), isHydrating && pushTreeFork(returnFiber, newIdx), resultingFirstChild;
3915				if (null === oldFiber) {
3916					for (; newIdx < newChildren.length; newIdx++) oldFiber = createChild(returnFiber, newChildren[newIdx], lanes), null !== oldFiber && (knownKeys = warnOnInvali
vendor: 1,948 bytes, lines 3916-3935
3916dKey(returnFiber, oldFiber, newChildren[newIdx], knownKeys), currentFirstChild = placeChild(oldFiber, currentFirstChild, newIdx), null === previousNewFiber ? resultingFirstChild = oldFiber : previousNewFiber.sibling = oldFiber, previousNewFiber = oldFiber);
3917					isHydrating && pushTreeFork(returnFiber, newIdx);
3918					return resultingFirstChild;
3919				}
3920				for (oldFiber = mapRemainingChildren(oldFiber); newIdx < newChildren.length; newIdx++) nextOldFiber = updateFromMap(oldFiber, returnFiber, newIdx, newChildren[newIdx], lanes), null !== nextOldFiber && (knownKeys = warnOnInvalidKey(returnFiber, nextOldFiber, newChildren[newIdx], knownKeys), shouldTrackSideEffects && (newFiber = nextOldFiber.alternate, null !== newFiber && oldFiber.delete(null === newFiber.key ? newIdx : newFiber.key)), currentFirstChild = placeChild(nextOldFiber, currentFirstChild, newIdx), null === previousNewFiber ? resultingFirstChild = nextOldFiber : previousNewFiber.sibling = nextOldFiber, previousNewFiber = nextOldFiber);
3921				shouldTrackSideEffects && oldFiber.forEach(function(child) {
3922					return deleteChild(returnFiber, child);
3923				});
3924				isHydrating && pushTreeFork(returnFiber, newIdx);
3925				return resultingFirstChild;
3926			}
3927			function reconcileChildrenIterator(returnFiber, currentFirstChild, newChildren, lanes) {
3928				if (null == newChildren) throw Error("An iterable object provided no iterator.");
3929				for (var resultingFirstChild = null, previousNewFiber = null, oldFiber = currentFirstChild, newIdx = currentFirstChild = 0, nextOldFiber = null, knownKeys = null, step = newChildren.next(); null !== oldFiber && !step.done; newIdx++, step = newChildren.next()) {
3930					oldFiber.index > newIdx ? (nextOldFiber = oldFiber, oldFiber = null) : nextOldFiber = oldFiber.sibling;
3931					var newFiber = updateSlot(returnFiber, oldFiber, step.value, lanes);
3932					if (null === newFiber) {
3933						null === oldFiber && (oldFiber = nextOldFiber);
3934						break;
3935					}
vendor: 1,349 bytes, lines 3936-3949
3936					knownKeys = warnOnInvalidKey(returnFiber, newFiber, step.value, knownKeys);
3937					shouldTrackSideEffects && oldFiber && null === newFiber.alternate && deleteChild(returnFiber, oldFiber);
3938					currentFirstChild = placeChild(newFiber, currentFirstChild, newIdx);
3939					null === previousNewFiber ? resultingFirstChild = newFiber : previousNewFiber.sibling = newFiber;
3940					previousNewFiber = newFiber;
3941					oldFiber = nextOldFiber;
3942				}
3943				if (step.done) return deleteRemainingChildren(returnFiber, oldFiber), isHydrating && pushTreeFork(returnFiber, newIdx), resultingFirstChild;
3944				if (null === oldFiber) {
3945					for (; !step.done; newIdx++, step = newChildren.next()) oldFiber = createChild(returnFiber, step.value, lanes), null !== oldFiber && (knownKeys = warnOnInvalidKey(returnFiber, oldFiber, step.value, knownKeys), currentFirstChild = placeChild(oldFiber, currentFirstChild, newIdx), null === previousNewFiber ? resultingFirstChild = oldFiber : previousNewFiber.sibling = oldFiber, previousNewFiber = oldFiber);
3946					isHydrating && pushTreeFork(returnFiber, newIdx);
3947					return resultingFirstChild;
3948				}
3949				for (oldFiber = mapRemainingChildren(oldFiber); !step.done; newIdx++, step = newChildren.next()) nextOldFiber = updateFromMap(oldFiber, returnFiber, newIdx, step.value, lanes), null !== nextOldFiber && (knownKeys = warnOnInvali
3949dKey(returnFiber, nextOldFiber, step.value, knownKeys), shouldTrackSideEffects && (step = nextOldFiber.alternate, null !== step && oldFiber.delete(null === step.key ? newIdx : step.key)), currentFirstChild = placeChild(nextOldFiber, currentFirstChild, newIdx), null === previousNewFiber ? resultingFirstChild = nextOldFiber : previousNewFiber.sibling = nextOldFiber, previousNewFiber = nextOldFiber);
3950				shouldTrackSideEffects && oldFiber.forEach(function(child) {
3951					return deleteChild(returnFiber, child);
3952				});
3953				isHydrating && pushTreeFork(returnFiber, newIdx);
3954				return resultingFirstChild;
3955			}
3956			function reconcileChildFibersImpl(returnFiber, currentFirstChild, newChild, lanes) {
3957				"object" === typeof newChild && null !== newChild && newChild.type === REACT_FRAGMENT_TYPE && null === newChild.key && void 0 === newChild.props.ref && (validateFragmentProps(newChild, null, returnFiber), newChild = newChild.props.children);
3958				if ("object" === typeof newChild && null !== newChild) {
3959					switch (newChild.$$typeof) {
3960						case REACT_ELEMENT_TYPE:
3961							var prevDebugInfo = pushDebugInfo(newChild._debugInfo);
3962							a: {
3963								for (var key = newChild.key; null !== currentFirstChild;) {
3964									if (currentFirstChild.key === key) {
3965										key = newChild.type;
3966										if (key === REACT_FRAGMENT_TYPE) {
3967											if (7 === currentFirstChild.tag) {
3968												deleteRemainingChildren(returnFiber, currentFirstChild.sibling);
3969												lanes = useFiber(currentFirstChild, newChild.props.children);
3970												coerceRef(lanes, newChild);
3971												lanes.return = returnFiber;
3972												lanes._debugOwner = newChild._owner;
3973												lanes._debugInfo = currentDebugInfo;
3974												validateFragmentProps(newChild, lanes, returnFiber);
3975												returnFiber = lanes;
3976												break a;
3977											}
3978										} else if (currentFirstChild.elementType === key || isCompatibleFamilyForHotReloading(currentFirstChild, newChild) || "object" === typeof key && null !== key && key.$$typeof === REACT_LAZY_TYPE && resolveLazy(key) === currentFirstChild.type) {
3979											deleteRemainingChildren(returnFiber, currentFirstChild.sibling);
3980											lanes = useFiber(currentFirstChild, newChild.props);
3981											coerceRef(lanes, newChild);
3982											lanes.return = returnFiber;
3983											lanes._debugOwner = newChild._owner;
3984											lanes._debugInfo = currentDebugInfo;
3985											returnFiber = lanes;
3986											break a;
3987										}
3988										deleteRemainingChildren(returnFiber, currentFirstChild);
3989										break;
3990									} else deleteChild(returnFiber, currentFirstChild);
3991									currentFirstChild = currentFirstChild.sibling;
3992								}
3993								newChild.type === REACT_FRAGMENT_TYPE ? (lanes = createFiberFromFragment(newChild.props.children, returnFiber.mode, lanes, newChild.key), coerceRef(lanes, newChild), lanes.return = returnFiber, lanes._debugOwner = returnFiber, lanes._debugTask = returnFiber._debugTask, lanes._debugInfo = currentDebugInfo, validateFragmentProps(newChild, lanes, returnFiber), returnFiber = lanes) : (lanes = createFiberFromElement(newChild, returnFiber.mode, lanes), coerceRef(lanes, newChild), lanes.return = returnFiber, lanes._debugInfo = currentDebugInfo, returnFiber = lanes);
3994							}
3995							returnFiber = placeSingleChild(returnFiber);
3996							currentDebugInfo = prevDebugInfo;
3997							return returnFiber;
3998						case REACT_PORTAL_TYPE:
3999							a: {
4000								prevDebugInfo = newChild;
4001								for (newChild = prevDebugInfo.key; null !== currentFirstChild;) {
4002									if (currentFirstChild.key === newChild) if (4 === currentFirstChild.tag && currentFirstChild.stateNode.containerInfo === prevDebugInfo.containerInfo && currentFirstChild.stateNode.implementation === prevDebugInfo.implementation) {
4003										deleteRemainingChildren(returnFiber, currentFirstChild.sibling);
4004										lanes = useFiber(currentFirstChild, prevDebugInfo.children || []);
4005										lanes.return = returnFiber;
4006										returnFiber = lanes;
4007										break a;
4008									} else {
4009										deleteRemainingChildren(returnFiber, currentFirstChild);
4010										break;
4011									}
4012									else deleteChild(returnFiber, currentFirstChild);
4013									currentFirstChild = currentFirstChild.sibling;
4014								}
4015								lanes = createFiberFromPortal(prevDebugInfo, returnFiber.mode, lanes);
4016								lanes.return = returnFiber;
4017								returnFiber = lanes;
4018							}
4019							return placeSingleChild(returnFiber);
4020						case REACT_LAZY_TYPE: return prevDebugInfo = pushDebugInfo(newChild._debugInfo), newChild = resolveLazy(newChild), returnFiber = reconcileChildFibersImpl(returnFiber, currentFirstChild, newChild, lanes), currentDebugInfo = prevDebugInfo, returnFiber;
4021					}
4022					if (isArrayImpl(newChild)) return reconcileChildrenArray(returnFiber, currentFirstChild, newChild, lanes);
4023					if (getIteratorFn(newChild)) {
4024						prevDebugInfo = newChild;
4025						newChild = getIteratorFn(prevDebugInfo);
4026						if ("function" !== typeof newChild) throw Error("An object is not an iterable. This error is likely caused by a bug in React. Please file an issue.");
4027						key = newChild.call(prevDebugInfo);
4028						if (key === prevDebugInfo) {
4029							if (0 !== returnFiber.tag || "[object GeneratorFunction]" !== Object.prototype.toString.call(returnFiber.type) || "[object Generator]" !== Object.prototype.toString.call(key)) didWarnAboutGenerators || console.error("Using Iterators as children is unsupported and will likely yield unexpected results because enumerating a generator mutates it. You may convert it to an array with `Array.from()` or the `[...spread]` operator before rendering. You can also use an Iterable that can iterate multiple times over the same items."), didWarnAboutGenerators = !0;
4030						} else prevDebugInfo.entries !== newChild || didWarnAboutMaps || (console.error("Using Maps as children is not supported. Use an array of keyed ReactElements instead."), didWarnAboutMaps = !0);
4031						return reconcileChildrenIterator(returnFiber, currentFirstChild, key, lanes);
4032					}
4033					if ("function" === typeof newChild.then) return prevDebugInfo = pushDebugInfo(newChild._debugInfo), returnFiber = reconcileChildFibersImpl(returnFiber, currentFirstChild, unwrapThenable(newChild), lanes), currentDebugInfo = prevDebugInfo, returnFiber;
4034					if (newChild.$$typeof === REACT_CONTEXT_TYPE) return reconcileChildFibersImpl(returnFiber, currentFirstChild, readContextDuringReconciliation(returnFiber, newChild), lanes);
4035					throwOnInvalidObjectType(returnFiber, newChild);
4036				}
4037				if ("string" === typeof newChild && "" !== newChild || "number" === typeof newChild || "bigint" === typeof newChild) return prevDebugInfo = "" + newChild, null !== currentFirstChild && 6 === currentFirstChild.tag ? (deleteRemainingChildren(returnFiber, currentFirstChild.sibling), lanes = useFiber(currentFirstChild, prevDebugInfo), lanes.return = returnFiber, returnFiber = lanes) : (deleteRemainingChildren(returnFiber, currentFirstChild), lanes = createFiberFromText(prevDebugInfo, returnFiber.mode, lanes), lanes.return = returnFiber, lanes._debugOwner = returnFiber, lanes._debugTask = returnFiber._debugTask, lanes._debugInfo = currentDebugInfo, returnFiber = lanes), placeSingleChild(returnFiber);
4038				"function" === typeof newChild && warnOnFunctionType(returnFiber, newChild);
4039				"symbol" === typeof newChild && warnOnSymbolType(returnFiber, newChild);
4040				return deleteRemainingChildren(returnFiber, currentFirstChild);
4041			}
4042			return function(returnFiber, currentFirstChild, newChild, lanes) {
4043				var prevDebugInfo = currentDebugInfo;
4044				currentDebugInfo = null;
4045				try {
4046					thenableIndexCounter$1 = 0;
4047					var firstChildFiber = reconcileChildFibersImpl(returnFiber, currentFirstChild, newChild, lanes);
4048					thenableState$1 = null;
4049					return firstChildFiber;
4050				} catch (x) {
4051					if (x === SuspenseException || x === SuspenseActionException) throw x;
4052					var fiber = createFiber(29, x, null, returnFiber.mode);
4053					fiber.lanes = lanes;
4054					fiber.return = returnFiber;
4055					var debugInfo = fiber._debugInfo = currentDebugInfo;
4056					fiber._debugOwner = returnFiber._debugOwner;
4057					fiber._debugTask = returnFiber._debugTask;
4058					if (null != debugInfo) {
4059						for (var i = debugInfo.length - 1; 0 <= i; i--) if ("string" === typeof debugInfo[i].stack) {
4060							fiber._debugOwner = debugInfo[i];
4061							fiber._debugTask = debugInfo[i].debugTask;
4062							break;
4063						}
4064					}
4065					return fiber;
4066				} finally {
4067					currentDebugInfo = prevDebugInfo;
4068				}
4069			};
4070		}
4071		function validateSuspenseListNestedChild(childSlot, index) {
4072			var isAnArray = isArrayImpl(childSlot);
4073			childSlot = !isAnArray && "function" === typeof getIteratorFn(childSlot);
4074			return isAnArray || childSlot ? (isAnArray = isAnArray ? "array" : "iterable", console.error("A nested %s was passed to row #%s in <SuspenseList />. Wrap it in an additional SuspenseList to configure its revealOrder: <SuspenseList revealOrder=...> ... <SuspenseList revealOrder=...>{%s}</SuspenseList> ... </SuspenseList>", isAnArray, index, isAnArray), !1) : !0;
4075		}
4076		function initializeUpdateQueue(fiber) {
4077			fiber.updateQueue = {
4078				baseState: fiber.memoizedState,
4079				firstBaseUpdate: null,
4080				lastBaseUpdate: null,
4081				shared: {
4082					pending: null,
4083					lanes: 0,
4084					hiddenCallbacks: null
4085				},
4086				callbacks: null
4087			};
4088		}
4089		function cloneUpdateQueue(current, workInProgress) {
4090			current = current.updateQueue;
4091			workInProgress.updateQueue === current && (workInProgress.updateQueue = {
4092				baseState: current.baseState,
4093				firstBaseUpdate: current.firstBaseUpdate,
4094				lastBaseUpdate: current.lastBaseUpdate,
4095				shared: current.shared,
4096				callbacks: null
4097			});
4098		}
4099		function createUpdate(lane) {
4100			return {
4101				lane,
4102				tag: UpdateState,
4103				payload: null,
4104				callback: null,
4105				next: null
4106			};
4107		}
4108		function enqueueUpdate(fiber, update, lane) {
4109			var updateQueue = fiber.updateQueue;
4110			if (null === updateQueue) return null;
4111			updateQueue = updateQueue.shared;
4112			if (currentlyProcessingQueue === updateQueue && !didWarnUpdateInsideUpdate) {
4113				var componentName = getComponentNameFromFiber(fiber);
4114				console.error("An update (setState, replaceState, or forceUpdate) was scheduled from inside an update function. Update functions should be pure, with zero side-effects. Consider using componentDidUpdate or a callback.\n\nPlease update the following component: %s", componentName);
4115				didWarnUpdateInsideUpdate = !0;
4116			}
4117			if ((executionContext & RenderContext) !== NoContext) return componentName = updateQueue.pending, null === componentName ? update.next = update : (update.next = componentName.next, componentName.next = update), updateQueue.pending = update, update = getRootForUpdatedFiber(fiber), markUpdateLaneFromFiberToRoot(fiber, null, lane), update;
4118			enqueueUpdate$1(fiber, updateQueue, update, lane);
4119			return getRootForUpdatedFiber(fiber);
4120		}
4121		function entangleTransitions(root, fiber, lane) {
4122			fiber = fiber.updateQueue;
4123			if (null !== fiber && (fiber = fiber.shared, 0 !== (lane & 4194048))) {
4124				var queueLanes = fiber.lanes;
4125				queueLanes &= root.pendingLanes;
4126				lane |= queueLanes;
4127				fiber.lanes = lane;
4128				markRootEntangled(root, lane);
4129			}
4130		}
4131		function enqueueCapturedUpdate(workInProgress, capturedUpdate) {
4132			var queue = workInProgress.updateQueue, current = workInProgress.alternate;
4133			if (null !== current && (current = current.updateQueue, queue === current)) {
4134				var newFirst = null, newLast = null;
4135				queue = queue.firstBaseUpdate;
4136				if (null !== queue) {
4137					do {
4138						var clone = {
4139							lane: queue.lane,
4140							tag: queue.tag,
4141							payload: queue.payload,
4142							callback: null,
4143							next: null
4144						};
4145						null === newLast ? newFirst = newLast = clone : newLast = newLast.next = clone;
4146						queue = queue.next;
4147					} while (null !== queue);
4148					null === newLast ? newFirst = newLast = capturedUpdate : newLast = newLast.next = capturedUpdate;
4149				} else newFirst = newLast = capturedUpdate;
4150				queue = {
4151					baseState: current.baseState,
4152					firstBaseUpdate: newFirst,
4153					lastBaseUpdate: newLast,
4154					shared: current.shared,
4155					callbacks: current.callbacks
4156				};
4157				workInProgress.updateQueue = queue;
4158				return;
4159			}
4160			workInProgress = queue.lastBaseUpdate;
4161			null === workInProgress ? queue.firstBaseUpdate = capturedUpdate : workInProgress.next = capturedUpdate;
4162			queue.lastBaseUpdate = capturedUpdate;
4163		}
4164		function suspendIfUpdateReadFromEntangledAsyncAction() {
4165			if (didReadFromEntangledAsyncAction) {
4166				var entangledActionThenable = currentEntangledActionThenable;
4167				if (null !== entangledActionThenable) throw entangledActionThenable;
4168			}
4169		}
4170		function processUpdateQueue(workInProgress, props, instance$jscomp$0, renderLanes) {
4171			didReadFromEntangledAsyncAction = !1;
4172			var queue = workInProgress.updateQueue;
4173			hasForceUpdate = !1;
4174			currentlyProcessingQueue = queue.shared;
4175			var firstBaseUpdate = queue.firstBaseUpdate, lastBaseUpdate = queue.lastBaseUpdate, pendingQueue = queue.shared.pending;
4176			if (null !== pendingQueue) {
4177				queue.shared.pending = null;
4178				var lastPendingUpdate = pendingQueue, firstPendingUpdate = lastPendingUpdate.next;
4179				lastPendingUpdate.next = null;
4180				null === lastBaseUpdate ? firstBaseUpdate = firstPendingUpdate : lastBaseUpdate.next = firstPendingUpdate;
4181				lastBaseUpdate = lastPendingUpdate;
4182				var current = workInProgress.alternate;
4183				null !== current && (current = current.updateQueue, pendingQueue = current.lastBaseUpdate, pendingQueue !== lastBaseUpdate && (null === pen
4183dingQueue ? current.firstBaseUpdate = firstPendingUpdate : pendingQueue.next = firstPendingUpdate, current.lastBaseUpdate = lastPendingUpdate));
4184			}
4185			if (null !== firstBaseUpdate) {
4186				var newState = queue.baseState;
4187				lastBaseUpdate = 0;
4188				current = firstPendingUpdate = lastPendingUpdate = null;
4189				pendingQueue = firstBaseUpdate;
4190				do {
4191					var updateLane = pendingQueue.lane & -536870913, isHiddenUpdate = updateLane !== pendingQueue.lane;
4192					if (isHiddenUpdate ? (workInProgressRootRenderLanes & updateLane) === updateLane : (renderLanes & updateLane) === updateLane) {
4193						0 !== updateLane && updateLane === currentEntangledLane && (didReadFromEntangledAsyncAction = !0);
4194						null !== current && (current = current.next = {
4195							lane: 0,
4196							tag: pendingQueue.tag,
4197							payload: pendingQueue.payload,
4198							callback: null,
4199							next: null
4200						});
4201						a: {
4202							updateLane = workInProgress;
4203							var partialState = pendingQueue;
4204							var nextProps = props, instance = instance$jscomp$0;
4205							switch (partialState.tag) {
4206								case ReplaceState:
4207									partialState = partialState.payload;
4208									if ("function" === typeof partialState) {
4209										isDisallowedContextReadInDEV = !0;
4210										var nextState = partialState.call(instance, newState, nextProps);
4211										if (updateLane.mode & StrictLegacyMode) {
4212											setIsStrictModeForDevtools(!0);
4213											try {
4214												partialState.call(instance, newState, nextProps);
4215											} finally {
4216												setIsStrictModeForDevtools(!1);
4217											}
4218										}
4219										isDisallowedContextReadInDEV = !1;
4220										newState = nextState;
4221										break a;
4222									}
4223									newState = partialState;
4224									break a;
4225								case CaptureUpdate: updateLane.flags = updateLane.flags & -65537 | 128;
4226								case UpdateState:
4227									nextState = partialState.payload;
4228									if ("function" === typeof nextState) {
4229										isDisallowedContextReadInDEV = !0;
4230										partialState = nextState.call(instance, newState, nextProps);
4231										if (updateLane.mode & StrictLegacyMode) {
4232											setIsStrictModeForDevtools(!0);
4233											try {
4234												nextState.call(instance, newState, nextProps);
4235											} finally {
4236												setIsStrictModeForDevtools(!1);
4237											}
4238										}
4239										isDisallowedContextReadInDEV = !1;
4240									} else partialState = nextState;
4241									if (null === partialState || void 0 === partialState) break a;
4242									newState = assign({}, newState, partialState);
4243									break a;
4244								case ForceUpdate: hasForceUpdate = !0;
4245							}
4246						}
4247						updateLane = pendingQueue.callback;
4248						null !== updateLane && (workInProgress.flags |= 64, isHiddenUpdate && (workInProgress.flags |= 8192), isHiddenUpdate = queue.callbacks, null === isHiddenUpdate ? queue.callbacks = [updateLane] : isHiddenUpdate.push(updateLane));
4249					} else isHiddenUpdate = {
4250						lane: updateLane,
4251						tag: pendingQueue.tag,
4252						payload: pendingQueue.payload,
4253						callback: pendingQueue.callback,
4254						next: null
4255					}, null === current ? (firstPendingUpdate = current = isHiddenUpdate, lastPendingUpdate = newState) : current = current.next = isHiddenUpdate, lastBaseUpdate |= updateLane;
4256					pendingQueue = pendingQueue.next;
4257					if (null === pendingQueue) if (pendingQueue = queue.shared.pending, null === pendingQueue) break;
4258					else isHiddenUpdate = pendingQueue, pendingQueue = isHiddenUpdate.next, isHiddenUpdate.next = null, queue.lastBaseUpdate = isHiddenUpdate, queue.shared.pending = null;
4259				} while (1);
4260				null === current && (lastPendingUpdate = newState);
4261				queue.baseState = lastPendingUpdate;
4262				queue.firstBaseUpdate = firstPendingUpdate;
4263				queue.lastBaseUpdate = current;
4264				null === firstBaseUpdate && (queue.shared.lanes = 0);
4265				workInProgressRootSkippedLanes |= lastBaseUpdate;
4266				workInProgress.lanes = lastBaseUpdate;
4267				workInProgress.memoizedState = newState;
4268			}
4269			currentlyProcessingQueue = null;
4270		}
4271		function callCallback(callback, context) {
4272			if ("function" !== typeof callback) throw Error("Invalid argument passed as callback. E
vendor: 8,901 bytes, lines 4272-4404
4272xpected a function. Instead received: " + callback);
4273			callback.call(context);
4274		}
4275		function commitHiddenCallbacks(updateQueue, context) {
4276			var hiddenCallbacks = updateQueue.shared.hiddenCallbacks;
4277			if (null !== hiddenCallbacks) for (updateQueue.shared.hiddenCallbacks = null, updateQueue = 0; updateQueue < hiddenCallbacks.length; updateQueue++) callCallback(hiddenCallbacks[updateQueue], context);
4278		}
4279		function commitCallbacks(updateQueue, context) {
4280			var callbacks = updateQueue.callbacks;
4281			if (null !== callbacks) for (updateQueue.callbacks = null, updateQueue = 0; updateQueue < callbacks.length; updateQueue++) callCallback(callbacks[updateQueue], context);
4282		}
4283		function pushHiddenContext(fiber, context) {
4284			var prevEntangledRenderLanes = entangledRenderLanes;
4285			push(prevEntangledRenderLanesCursor, prevEntangledRenderLanes, fiber);
4286			push(currentTreeHiddenStackCursor, context, fiber);
4287			entangledRenderLanes = prevEntangledRenderLanes | context.baseLanes;
4288		}
4289		function reuseHiddenContextOnStack(fiber) {
4290			push(prevEntangledRenderLanesCursor, entangledRenderLanes, fiber);
4291			push(currentTreeHiddenStackCursor, currentTreeHiddenStackCursor.current, fiber);
4292		}
4293		function popHiddenContext(fiber) {
4294			entangledRenderLanes = prevEntangledRenderLanesCursor.current;
4295			pop(currentTreeHiddenStackCursor, fiber);
4296			pop(prevEntangledRenderLanesCursor, fiber);
4297		}
4298		function pushPrimaryTreeSuspenseHandler(handler) {
4299			var current = handler.alternate;
4300			push(suspenseStackCursor, suspenseStackCursor.current & SubtreeSuspenseContextMask, handler);
4301			push(suspenseHandlerStackCursor, handler, handler);
4302			null === shellBoundary && (null === current || null !== currentTreeHiddenStackCursor.current ? shellBoundary = handler : null !== current.memoizedState && (shellBoundary = handler));
4303		}
4304		function pushDehydratedActivitySuspenseHandler(fiber) {
4305			push(suspenseStackCursor, suspenseStackCursor.current, fiber);
4306			push(suspenseHandlerStackCursor, fiber, fiber);
4307			null === shellBoundary && (shellBoundary = fiber);
4308		}
4309		function pushOffscreenSuspenseHandler(fiber) {
4310			22 === fiber.tag ? (push(suspenseStackCursor, suspenseStackCursor.current, fiber), push(suspenseHandlerStackCursor, fiber, fiber), null === shellBoundary && (shellBoundary = fiber)) : reuseSuspenseHandlerOnStack(fiber);
4311		}
4312		function reuseSuspenseHandlerOnStack(fiber) {
4313			push(suspenseStackCursor, suspenseStackCursor.current, fiber);
4314			push(suspenseHandlerStackCursor, suspenseHandlerStackCursor.current, fiber);
4315		}
4316		function popSuspenseHandler(fiber) {
4317			pop(suspenseHandlerStackCursor, fiber);
4318			shellBoundary === fiber && (shellBoundary = null);
4319			pop(suspenseStackCursor, fiber);
4320		}
4321		function pushSuspenseListContext(fiber, newContext) {
4322			push(suspenseHandlerStackCursor, suspenseHandlerStackCursor.current, fiber);
4323			push(suspenseStackCursor, newContext, fiber);
4324		}
4325		function popSuspenseListContext(fiber) {
4326			pop(suspenseStackCursor, fiber);
4327			pop(suspenseHandlerStackCursor, fiber);
4328			shellBoundary === fiber && (shellBoundary = null);
4329		}
4330		function findFirstSuspended(row) {
4331			for (var node = row; null !== node;) {
4332				if (13 === node.tag) {
4333					var state = node.memoizedState;
4334					if (null !== state && (state = state.dehydrated, null === state || isSuspenseInstancePending(state) || isSuspenseInstanceFallback(state))) return node;
4335				} else if (19 === node.tag && "independent" !== node.memoizedProps.revealOrder) {
4336					if (0 !== (node.flags & 128)) return node;
4337				} else if (null !== node.child) {
4338					node.child.return = node;
4339					node = node.child;
4340					continue;
4341				}
4342				if (node === row) break;
4343				for (; null === node.sibling;) {
4344					if (null === node.return || node.return === row) return null;
4345					node = node.return;
4346				}
4347				node.sibling.return = node.return;
4348				node = node.sibling;
4349			}
4350			return null;
4351		}
4352		function mountHookTypesDev() {
4353			var hookName = currentHookNameInDev;
4354			null === hookTypesDev ? hookTypesDev = [hookName] : hookTypesDev.push(hookName);
4355		}
4356		function updateHookTypesDev() {
4357			var hookName = currentHookNameInDev;
4358			if (null !== hookTypesDev && (hookTypesUpdateIndexDev++, hookTypesDev[hookTypesUpdateIndexDev] !== hookName)) {
4359				var componentName = getComponentNameFromFiber(currentlyRenderingFiber);
4360				if (!didWarnAboutMismatchedHooksForComponent.has(componentName) && (didWarnAboutMismatchedHooksForComponent.add(componentName), null !== hookTypesDev)) {
4361					for (var table = "", i = 0; i <= hookTypesUpdateIndexDev; i++) {
4362						var oldHookName = hookTypesDev[i], newHookName = i === hookTypesUpdateIndexDev ? hookName : oldHookName;
4363						for (oldHookName = i + 1 + ". " + oldHookName; 30 > oldHookName.length;) oldHookName += " ";
4364						oldHookName += newHookName + "\n";
4365						table += oldHookName;
4366					}
4367					console.error("React has detected a change in the order of Hooks called by %s. This will lead to bugs and errors if not fixed. For more information, read the Rules of Hooks: https://react.dev/link/rules-of-hooks\n\n   Previous render            Next render\n   ------------------------------------------------------\n%s   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", componentName, table);
4368				}
4369			}
4370		}
4371		function checkDepsAreArrayDev(deps) {
4372			void 0 === deps || null === deps || isArrayImpl(deps) || console.error("%s received a final argument that is not an array (instead, received `%s`). When specified, the final argument must be an array.", currentHookNameInDev, typeof deps);
4373		}
4374		function warnOnUseFormStateInDev() {
4375			var componentName = getComponentNameFromFiber(currentlyRenderingFiber);
4376			didWarnAboutUseFormState.has(componentName) || (didWarnAboutUseFormState.add(componentName), console.error("ReactDOM.useFormState has been renamed to React.useActionState. Please update %s to use React.useActionState.", componentName));
4377		}
4378		function throwInvalidHookError() {
4379			throw Error("Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:\n1. You might have mismatching versions of React and the renderer (such as React DOM)\n2. You might be breaking the Rules of Hooks\n3. You might have more than one copy of React in the same app\nSee https://react.dev/link/invalid-hook-call for tips about how to debug and fix this problem.");
4380		}
4381		function areHookInputsEqual(nextDeps, prevDeps) {
4382			if (ignorePreviousDependencies) return !1;
4383			if (null === prevDeps) return console.error("%s received a final argument during this render, but not during the previous render. Even though the final argument is optional, its type cannot change between renders.", currentHookNameInDev), !1;
4384			nextDeps.length !== prevDeps.length && console.error("The final argument passed to %s changed size between renders. The order and size of this array must remain constant.\n\nPrevious: %s\nIncoming: %s", currentHookNameInDev, "[" + prevDeps.join(", ") + "]", "[" + nextDeps.join(", ") + "]");
4385			for (var i = 0; i < prevDeps.length && i < nextDeps.length; i++) if (!objectIs(nextDeps[i], prevDeps[i])) return !1;
4386			return !0;
4387		}
4388		function renderWithHooks(current, workInProgress, Component, props, secondArg, nextRenderLanes) {
4389			renderLanes = nextRenderLanes;
4390			currentlyRenderingFiber = workInProgress;
4391			hookTypesDev = null !== current ? current._debugHookTypes : null;
4392			hookTypesUpdateIndexDev = -1;
4393			ignorePreviousDependencies = null !== current && current.type !== workInProgress.type;
4394			if ("[object AsyncFunction]" === Object.prototype.toString.call(Component) || "[object AsyncGeneratorFunction]" === Object.prototype.toString.call(Component)) nextRenderLanes = getComponentNameFromFiber(currentlyRenderingFiber), didWarnAboutAsyncClientComponent.has(nextRenderLanes) || (didWarnAboutAsyncClientComponent.add(nextRenderLanes), console.error("%s is an async Client Component. Only Server Components can be async at the moment. This error is often caused by accidentally adding `'use client'` to a module that was originally written for the server.", null === nextRenderLanes ? "An unknown Component" : "<" + nextRenderLanes + ">"));
4395			workInProgress.memoizedState = null;
4396			workInProgress.updateQueue = null;
4397			workInProgress.lanes = 0;
4398			ReactSharedInternals.H = null !== current && null !== current.memoizedState ? HooksDispatcherOnUpdateInDEV : null !== hookTypesDev ? HooksDispatcherOnMountWithHookTypesInDEV : HooksDispatcherOnMountInDEV;
4399			shouldDoubleInvokeUserFnsInHooksDEV = nextRenderLanes = (workInProgress.mode & StrictLegacyMode) !== NoMode;
4400			var children = callComponentInDEV(Component, props, secondArg);
4401			shouldDoubleInvokeUserFnsInHooksDEV = !1;
4402			didScheduleRenderPhaseUpdateDuringThisPass && (children = renderWithHooksAgain(workInProgress, Component, props, secondArg));
4403			if (nextRenderLanes) {
4404				setIsStrictModeForDevtools(!0);
4405				try {
4406					children = renderWithHooksAgain(workInProgress, Component, props, secondArg);
4407				} finally {
4408					setIsStrictModeForDevtools(!1);
4409				}
4410			}
4411			finishRenderingHooks(current, workInProgress);
4412			return children;
4413		}
4414		function finishRenderingHooks(current, workInProgress) {
4415			workInProgress._debugHookTypes = hookTypesDev;
4416			null === workInProgress.dependencies ? null !== thenableState && (workInProgress.dependencies = {
4417				lanes: 0,
4418				firstContext: null,
4419				_debugThenableState: thenableState
4420			}) : workInProgress.dependencies._debugThenableState = thenableState;
4421			var thenableState$jscomp$0 = thenableState;
4422			null !== lastSuspendedFiber && areSameKeyPath(lastSuspendedFiber, workInProgress) && (null !== thenableState$jscomp$0 || null === lastSuspendedStack || didIssueUseWarning || (didIssueUseWarning = !0, console.error(lastSuspendedStack)), lastSuspendedStack = lastSuspendedFiber = null);
4423			ReactSharedInternals.H = ContextOnlyDispatcher;
4424			thenableState$jscomp$0 = null !== currentHook && null !== currentHook.next;
4425			renderLanes = 0;
4426			hookTypesDev = currentHookNameInDev = workInProgressHook = currentHook = currentlyRenderingFiber = null;
4427			hookTypesUpdateIndexDev = -1;
4428			null !== current && (current.flags & 1206910976) !== (workInProgress.flags & 1206910976) && console.error("Internal React error: Expected static flag was missing. Please notify the React team.");
4429			didScheduleRenderPhaseUpdate = !1;
4430			thenableIndexCounter = 0;
4431			thenableState = null;
4432			if (thenableState$jscomp$0) throw Error("Rendered fewer hooks than expected. This may be caused by an accidental early return statement.");
4433			null === current || didReceiveUpdate || (current = current.dependencies, null !== current && checkIfContextChanged(current) && (didReceiveUpdate = !0));
4434			needsToResetSuspendedThenableDEV ? (needsToResetSuspendedThenableDEV = !1, current = !0) : current = !1;
4435			current && (workInProgress = getComponentNameFromFiber(workInProgress) || "Unknown", didWarnAboutUseWrappedInTryCatch.has(workInProgress) || didWarnAboutAsyncClientComponent.has(workInProgress) || (didWarnAboutUseWrappedInTryCatch.add(workInProgress), console.error("`use` was called from inside a try/catch block. This is not allowed and can lead to unexpected behavior. To handle errors triggered by `use`, wrap your component in a error boundary.")));
4436		}
4437		function renderWithHooksAgain(workInProgress, Component, props, secondArg) {
4438			currentlyRenderingFiber = workInProgress;
4439			var numberOfReRenders = 0;
4440			do {
4441				didScheduleRenderPhaseUpdateDuringThisPass && (thenableState = null);
4442				thenableIndexCounter = 0;
4443				didScheduleRenderPhaseUpdateDuringThisPass = !1;
4444				if (numberOfReRenders >= RE_RENDER_LIMIT) throw Error("Too many re-renders. React limits the number of renders to prevent an infinite loop.");
4445				numberOfReRenders += 1;
4446				ignorePreviousDependencies = !1;
4447				workInProgressHook = currentHook = null;
4448				if (null != workInProgress.updateQueue) {
4449					var children = workInProgress.updateQueue;
4450					children.lastEffect = null;
4451					children.events = null;
4452					children.stores = null;
4453					null != children.memoCache && (children.memoCache.index = 0);
4454				}
4455				hookTypesUpdateIndexDev = -1;
4456				ReactSharedInternals.H = HooksDispatcherOnRerenderInDEV;
4457				children = callComponentInDEV(Component, props, secondArg);
4458			} while (didScheduleRenderPhaseUpdateDuringThisPass);
4459			return children;
4460		}
4461		function TransitionAwareHostComponent() {
4462			var dispatcher = ReactSharedInternals.H, maybeThenable = dispatcher.useState()[0];
4463			maybeThenable = "function" === typeof maybeThenable.then ? useThenable(maybeThenable) : maybeThenable;
4464			dispatcher = dispatcher.useState()[0];
4465			(null !== currentHook ? currentHook.memoizedState : null) !== dispatcher && (currentlyRenderingFiber.flags |= 1024);
4466			return maybeThenable;
4467		}
4468		function checkDidRenderIdHook() {
4469			var didRenderIdHook = 0 !== localIdCounter;
4470			localIdCounter = 0;
4471			return didRenderIdHook;
4472		}
4473		function bailoutHooks(current, workInProgress, lanes) {
4474			workInProgress.updateQueue = current.updateQueue;
4475			workInProgress.flags = (workInProgress.mode & StrictEffectsMode) !== NoMode ? workInProgress.flags & -805308421 : workInProgress.flags & -2053;
4476			current.lanes &= ~lanes;
4477		}
vendor: 8,572 bytes, lines 4478-4667
4478		function resetHooksOnUnwind(workInProgress) {
4479			if (didScheduleRenderPhaseUpdate) {
4480				for (workInProgress = workInProgress.memoizedState; null !== workInProgress;) {
4481					var queue = workInProgress.queue;
4482					null !== queue && (queue.pending = null);
4483					workInProgress = workInProgress.next;
4484				}
4485				didScheduleRenderPhaseUpdate = !1;
4486			}
4487			renderLanes = 0;
4488			hookTypesDev = workInProgressHook = currentHook = currentlyRenderingFiber = null;
4489			hookTypesUpdateIndexDev = -1;
4490			currentHookNameInDev = null;
4491			didScheduleRenderPhaseUpdateDuringThisPass = !1;
4492			thenableIndexCounter = localIdCounter = 0;
4493			thenableState = null;
4494		}
4495		function mountWorkInProgressHook() {
4496			var hook = {
4497				memoizedState: null,
4498				baseState: null,
4499				baseQueue: null,
4500				queue: null,
4501				next: null
4502			};
4503			null === workInProgressHook ? currentlyRenderingFiber.memoizedState = workInProgressHook = hook : workInProgressHook = workInProgressHook.next = hook;
4504			return workInProgressHook;
4505		}
4506		function updateWorkInProgressHook() {
4507			if (null === currentHook) {
4508				var nextCurrentHook = currentlyRenderingFiber.alternate;
4509				nextCurrentHook = null !== nextCurrentHook ? nextCurrentHook.memoizedState : null;
4510			} else nextCurrentHook = currentHook.next;
4511			var nextWorkInProgressHook = null === workInProgressHook ? currentlyRenderingFiber.memoizedState : workInProgressHook.next;
4512			if (null !== nextWorkInProgressHook) workInProgressHook = nextWorkInProgressHook, currentHook = nextCurrentHook;
4513			else {
4514				if (null === nextCurrentHook) {
4515					if (null === currentlyRenderingFiber.alternate) throw Error("Update hook called on initial render. This is likely a bug in React. Please file an issue.");
4516					throw Error("Rendered more hooks than during the previous render.");
4517				}
4518				currentHook = nextCurrentHook;
4519				nextCurrentHook = {
4520					memoizedState: currentHook.memoizedState,
4521					baseState: currentHook.baseState,
4522					baseQueue: currentHook.baseQueue,
4523					queue: currentHook.queue,
4524					next: null
4525				};
4526				null === workInProgressHook ? currentlyRenderingFiber.memoizedState = workInProgressHook = nextCurrentHook : workInProgressHook = workInProgressHook.next = nextCurrentHook;
4527			}
4528			return workInProgressHook;
4529		}
4530		function createFunctionComponentUpdateQueue() {
4531			return {
4532				lastEffect: null,
4533				events: null,
4534				stores: null,
4535				memoCache: null
4536			};
4537		}
4538		function useThenable(thenable) {
4539			var index = thenableIndexCounter;
4540			thenableIndexCounter += 1;
4541			null === thenableState && (thenableState = createThenableState());
4542			thenable = trackUsedThenable(thenableState, thenable, index, currentlyRenderingFiber);
4543			index = currentlyRenderingFiber;
4544			null === (null === workInProgressHook ? index.memoizedState : workInProgressHook.next) && (index = index.alternate, ReactSharedInternals.H = null !== index && null !== index.memoizedState ? HooksDispatcherOnUpdateInDEV : HooksDispatcherOnMountInDEV);
4545			return thenable;
4546		}
4547		function use(usable) {
4548			if (null !== usable && "object" === typeof usable) {
4549				if ("function" === typeof usable.then) return useThenable(usable);
4550				if (usable.$$typeof === REACT_RECOVERABLE_TYPE) return;
4551				if (usable.$$typeof === REACT_CONTEXT_TYPE) return readContext(usable);
4552			}
4553			throw Error("An unsupported type was passed to use(): " + String(usable));
4554		}
4555		function useMemoCache(size) {
4556			var memoCache = null, updateQueue = currentlyRenderingFiber.updateQueue;
4557			null !== updateQueue && (memoCache = updateQueue.memoCache);
4558			if (null == memoCache) {
4559				var current = currentlyRenderingFiber.alternate;
4560				null !== current && (current = current.updateQueue, null !== current && (current = current.memoCache, null != current && (memoCache = {
4561					data: current.data.map(function(array) {
4562						return array.slice();
4563					}),
4564					index: 0
4565				})));
4566			}
4567			memoCache ??= {
4568				data: [],
4569				index: 0
4570			};
4571			null === updateQueue && (updateQueue = createFunctionComponentUpdateQueue(), currentlyRenderingFiber.updateQueue = updateQueue);
4572			updateQueue.memoCache = memoCache;
4573			updateQueue = memoCache.data[memoCache.index];
4574			if (void 0 === updateQueue || ignorePreviousDependencies) for (updateQueue = memoCache.data[memoCache.index] = Array(size), current = 0; current < size; current++) updateQueue[current] = REACT_MEMO_CACHE_SENTINEL;
4575			else updateQueue.length !== size && console.error("Expected a constant size argument for each invocation of useMemoCache. The previous cache was allocated with size %s but size %s was requested.", updateQueue.length, size);
4576			memoCache.index++;
4577			return updateQueue;
4578		}
4579		function basicStateReducer(state, action) {
4580			return "function" === typeof action ? action(state) : action;
4581		}
4582		function mountReducer(reducer, initialArg, init) {
4583			var hook = mountWorkInProgressHook();
4584			if (void 0 !== init) {
4585				var initialState = init(initialArg);
4586				if (shouldDoubleInvokeUserFnsInHooksDEV) {
4587					setIsStrictModeForDevtools(!0);
4588					try {
4589						init(initialArg);
4590					} finally {
4591						setIsStrictModeForDevtools(!1);
4592					}
4593				}
4594			} else initialState = initialArg;
4595			hook.memoizedState = hook.baseState = initialState;
4596			reducer = {
4597				pending: null,
4598				lanes: 0,
4599				dispatch: null,
4600				lastRenderedReducer: reducer,
4601				lastRenderedState: initialState
4602			};
4603			hook.queue = reducer;
4604			reducer = reducer.dispatch = dispatchReducerAction.bind(null, currentlyRenderingFiber, reducer);
4605			return [hook.memoizedState, reducer];
4606		}
4607		function updateReducer(reducer) {
4608			return updateReducerImpl(updateWorkInProgressHook(), currentHook, reducer);
4609		}
4610		function updateReducerImpl(hook, current, reducer) {
4611			var queue = hook.queue;
4612			if (null === queue) throw Error("Should have a queue. You are likely calling Hooks conditionally, which is not allowed. (https://react.dev/link/invalid-hook-call)");
4613			queue.lastRenderedReducer = reducer;
4614			var baseQueue = hook.baseQueue, pendingQueue = queue.pending;
4615			if (null !== pendingQueue) {
4616				if (null !== baseQueue) {
4617					var baseFirst = baseQueue.next;
4618					baseQueue.next = pendingQueue.next;
4619					pendingQueue.next = baseFirst;
4620				}
4621				current.baseQueue !== baseQueue && console.error("Internal error: Expected work-in-progress queue to be a clone. This is a bug in React.");
4622				current.baseQueue = baseQueue = pendingQueue;
4623				queue.pending = null;
4624			}
4625			pendingQueue = hook.baseState;
4626			if (null === baseQueue) hook.memoizedState = pendingQueue;
4627			else {
4628				current = baseQueue.next;
4629				var newBaseQueueFirst = baseFirst = null, newBaseQueueLast = null, update = current, didReadFromEntangledAsyncAction = !1;
4630				do {
4631					var updateLane = update.lane & -536870913;
4632					if (updateLane !== update.lane ? (workInProgressRootRenderLanes & updateLane) === updateLane : (renderLanes & updateLane) === updateLane) {
4633						var revertLane = update.revertLane;
4634						if (0 === revertLane) null !== newBaseQueueLast && (newBaseQueueLast = newBaseQueueLast.next = {
4635							lane: 0,
4636							revertLane: 0,
4637							gesture: null,
4638							action: update.action,
4639							hasEagerState: update.hasEagerState,
4640							eagerState: update.eagerState,
4641							next: null
4642						}), updateLane === currentEntangledLane && (didReadFromEntangledAsyncAction = !0);
4643						else if ((renderLanes & revertLane) === revertLane) {
4644							update = update.next;
4645							revertLane === currentEntangledLane && (didReadFromEntangledAsyncAction = !0);
4646							continue;
4647						} else updateLane = {
4648							lane: 0,
4649							revertLane: update.revertLane,
4650							gesture: null,
4651							action: update.action,
4652							hasEagerState: update.hasEagerState,
4653							eagerState: update.eagerState,
4654							next: null
4655						}, null === newBaseQueueLast ? (newBaseQueueFirst = newBaseQueueLast = updateLane, baseFirst = pendingQueue) : newBaseQueueLast = newBaseQueueLast.next = updateLane, currentlyRenderingFiber.lanes |= revertLane, workInProgressRootSkippedLanes |= revertLane;
4656						updateLane = update.action;
4657						shouldDoubleInvokeUserFnsInHooksDEV && reducer(pendingQueue, updateLane);
4658						pendingQueue = update.hasEagerState ? update.eagerState : reducer(pendingQueue, updateLane);
4659					} else revertLane = {
4660						lane: updateLane,
4661						revertLane: update.revertLane,
4662						gesture: update.gesture,
4663						action: update.action,
4664						hasEagerState: update.hasEagerState,
4665						eagerState: update.eagerState,
4666						next: null
4667					}, null === newBaseQueueLast ? (newBaseQueueFirst = newBaseQueueLast = revertLane, baseFirst = pendingQueue) : newBaseQueueLast = newBaseQueueLast.next = revertLane, 
4667currentlyRenderingFiber.lanes |= updateLane, workInProgressRootSkippedLanes |= updateLane;
4668					update = update.next;
4669				} while (null !== update && update !== current);
4670				null === newBaseQueueLast ? baseFirst = pendingQueue : newBaseQueueLast.next = newBaseQueueFirst;
4671				if (!objectIs(pendingQueue, hook.memoizedState) && (didReceiveUpdate = !0, didReadFromEntangledAsyncAction && (reducer = currentEntangledActionThenable, null !== reducer))) throw reducer;
4672				hook.memoizedState = pendingQueue;
4673				hook.baseState = baseFirst;
4674				hook.baseQueue = newBaseQueueLast;
4675				queue.lastRenderedState = pendingQueue;
4676			}
4677			null === baseQueue && (queue.lanes = 0);
4678			return [hook.memoizedState, queue.dispatch];
4679		}
4680		function rerenderReducer(reducer) {
4681			var hook = updateWorkInProgressHook(), queue = hook.queue;
4682			if (null === queue) throw Error("Should have a queue. You are likely calling Hooks conditionally, which is not allowed. (https://react.dev/link/invalid-hook-call)");
4683			queue.lastRenderedReducer = reducer;
4684			var dispatch = queue.dispatch, lastRenderPhaseUpdate = queue.pending, newState = hook.memoizedState;
4685			if (null !== lastRenderPhaseUpdate) {
4686				queue.pending = null;
4687				var update = lastRenderPhaseUpdate = lastRenderPhaseUpdate.next;
4688				do
4689					newState = reducer(newState, update.action), update = update.next;
4690				while (update !== lastRenderPhaseUpdate);
4691				objectIs(newState, hook.memoizedState) || (didReceiveUpdate = !0);
4692				hook.memoizedState = newState;
4693				null === hook.baseQueue && (hook.baseState = newState);
4694				queue.lastRenderedState = newState;
4695			}
4696			return [newState, dispatch];
4697		}
4698		function mountSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) {
4699			var fiber = currentlyRenderingFiber, hook = mountWorkInProgressHook();
4700			if (isHydrating) {
4701				if (void 0 === getServerSnapshot) throw Error("Missing getServerSnapshot, which is required for server-rendered content. Will revert to client rendering.");
4702				var nextSnapshot = getServerSnapshot();
4703				didWarnUncachedGetSnapshot || nextSnapshot === getServerSnapshot() || (console.error("The result of getServerSnapshot should be cached to avoid an infinite loop"), didWarnUncachedGetSnapshot = !0);
4704			} else {
4705				nextSnapshot = getSnapshot();
4706				didWarnUncachedGetSnapshot || (getServerSnapshot = getSnapshot(), objectIs(nextSnapshot, getServerSnapshot) || (console.error("The result of getSnapshot should be cached to avoid an infinite loop"), didWarnUncachedGetSnapshot = !0));
4707				if (null === workInProgressRoot) throw Error("Expected a work-in-progress root. This is a bug in React. Please file an issue.");
4708				0 !== (workInProgressRootRenderLanes & 127) || pushStoreConsistencyCheck(fiber, getSnapshot, nextSnapshot);
4709			}
4710			hook.memoizedState = nextSnapshot;
4711			getServerSnapshot = {
4712				value: nextSnapshot,
4713				getSnapshot
4714			};
4715			hook.queue = getServerSnapshot;
4716			mountEffect(subscribeToStore.bind(null, fiber, getServerSnapshot, subscribe), [subscribe]);
4717			fiber.flags |= 2048;
4718			pushSimpleEffect(HasEffect | Passive, { destroy: void 0 }, updateStoreInstance.bind(null, fiber, getServerSnapshot, nextSnapshot, getSnapshot), null);
4719			return nextSnapshot;
4720		}
4721		function updateSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) {
4722			var fiber = currentlyRenderingFiber, hook = updateWorkInProgressHook(), isHydrating$jscomp$0 = isHydrating;
4723			if (isHydrating$jscomp$0) {
4724				if (void 0 === getServerSnapshot) throw Error("Missing getServerSnapshot, which is required for server-rendered content. Will revert to client rendering.");
4725				getServerSnapshot = getServerSnapshot();
4726			} else if (getServerSnapshot = getSnapshot(), !didWarnUncachedGetSnapshot) {
4727				var cachedSnapshot = getSnapshot();
4728				objectIs(getServerSnapshot, cachedSnapshot) || (console.error("The result of getSnapshot should be cached to avoid an infinite loop"), didWarnUncachedGetSnapshot = !0);
4729			}
4730			if (cachedSnapshot = !objectIs((currentHook || hook).memoizedState, getServerSnapshot)) hook.memoizedState = getServerSnapshot, didReceiveUpdate = !0;
4731			hook = hook.queue;
4732			updateEffectImpl(2048, Passive, subscribeToStore.bind(null, fiber, hook, subscribe), [subscribe]);
4733			subscribe = hook.getSnapshot !== getSnapshot || cachedSnapshot || null !== workInProgressHook && (workInProgressHook.memoizedState.tag & HasEffect) !== NoFlags;
4734			pushSimpleEffect(subscribe ? HasEffect | Passive : Passive, { destroy: void 0 }, updateStoreInstance.bind(null, fiber, hook, getServerSnapshot, getSnapshot), null);
4735			if (subscribe) {
4736				fiber.flags |= 2048;
4737				if (null === workInProgressRoot) throw Error("Expected a work-in-progress root. This is a bug in React. Please file an issue.");
4738				isHydrating$jscomp$0 || 0 !== (renderLanes & 127) || pushStoreConsistencyCheck(fiber, getSnapshot, getServerSnapshot);
4739			}
4740			return getServerSnapshot;
4741		}
4742		function pushStoreConsistencyCheck(fiber, getSnapshot, renderedSnapshot) {
4743			fiber.flags |= 16384;
4744			fiber = {
4745				getSnapshot,
4746				value: renderedSnapshot
4747			};
4748			getSnapshot = currentlyRenderingFiber.updateQueue;
4749			null === getSnapshot ? (getSnapshot = createFunctionComponentUpdateQueue(), currentlyRenderingFiber.updateQueue = getSnapshot, getSnapshot.stores = [fiber]) : (renderedSnapshot = getSnapshot.stores, null === renderedSnapshot ? getSnapshot.stores = [fiber] : renderedSnapshot.push(fiber));
4750		}
4751		function updateStoreInstance(fiber, inst, nextSnapshot, getSnapshot) {
4752			inst.value = nextSnapshot;
4753			inst.getSnapshot = getSnapshot;
4754			checkIfSnapshotChanged(inst) && forceStoreRerender(fiber);
4755		}
4756		function subscribeToStore(fiber, inst, subscribe) {
4757			return subscribe(function() {
4758				checkIfSnapshotChanged(inst) && (startUpdateTimerByLane(2, "updateSyncExternalStore()", fiber), forceStoreRerender(fiber));
4759			});
4760		}
4761		function checkIfSnapshotChanged(inst) {
4762			var latestGetSnapshot = inst.getSnapshot;
4763			inst = inst.value;
4764			try {
4765				var nextValue = latestGetSnapshot();
4766				return !objectIs(inst, nextValue);
4767			} catch (error) {
4768				return !0;
4769			}
4770		}
4771		function forceStoreRerender(fiber) {
4772			var root = enqueueConcurrentRenderForLane(fiber, 2);
4773			null !== root && scheduleUpdateOnFiber(root, fiber, 2);
4774		}
4775		function mountStateImpl(initialState) {
4776			var hook = mountWorkInProgressHook();
4777			if ("function" === typeof initialState) {
4778				var initialStateInitializer = initialState;
4779				initialState = initialStateInitializer();
4780				if (shouldDoubleInvokeUserFnsInHooksDEV) {
4781					setIsStrictModeForDevtools(!0);
4782					try {
4783						initialStateInitializer();
4784					} finally {
4785						setIsStrictModeForDevtools(!1);
4786					}
4787				}
4788			}
4789			hook.memoizedState = hook.baseState = initialState;
4790			hook.queue = {
4791				pending: null,
4792				lanes: 0,
4793				dispatch: null,
4794				lastRenderedReducer: basicStateReducer,
4795				lastRenderedState: initialState
4796			};
4797			return hook;
4798		}
4799		function mountState(initialState) {
4800			initialState = mountStateImpl(initialState);
4801			var queue = initialState.queue, dispatch = dispatchSetState.bind(null, currentlyRenderingFiber, queue);
4802			queue.dispatch = dispatch;
4803			return [initialState.memoizedState, dispatch];
4804		}
4805		function mountOptimistic(passthrough) {
4806			var hook = mountWorkInProgressHook();
4807			hook.memoizedState = hook.baseState = passthrough;
4808			var queue = {
4809				pending: null,
4810				lanes: 0,
4811				dispatch: null,
4812				lastRenderedReducer: null,
4813				lastRenderedState: null
4814			};
4815			hook.queue = queue;
4816			hook = dispatchOptimisticSetState.bind(null, currentlyRenderingFiber, !0, queue);
4817			queue.dispatch = hook;
4818			return [passthrough, hook];
4819		}
4820		function updateOptimistic(passthrough, reducer) {
4821			return updateOptimisticImpl(updateWorkInProgressHook(), currentHook, passthrough, reducer);
4822		}
4823		function updateOptimisticImpl(hook, current, passthrough, reducer) {
4824			hook.baseState = passthrough;
4825			return updateReducerImpl(hook, currentHook, "function" === typeof reducer ? reducer : basicStateReducer);
4826		}
4827		function rerenderOptimistic(passthrough, reducer) {
4828			var hook = updateWorkInProgressHook();
4829			if (null !== currentHook) return updateOptimisticImpl(hook, currentHook, passthrough, reducer);
4830			hook.baseState = passthrough;
4831			return [passthrough, hook.queue.dispatch];
4832		}
4833		function dispatchActionState(fiber, actionQueue, setPendingState, setState, payload) {
4834			if (isRenderPhaseUpdate(fiber)) throw Error("Cannot update action state while rendering.");
4835			fiber = actionQueue.action;
4836			if (null !== fiber) {
4837				var actionNode = {
4838					payload,
4839					action: fiber,
4840					next: null,
4841					isTransition: !0,
4842					status: "pending",
4843					value: null,
4844					reason: null,
4845					listeners: [],
4846					then: function(listener) {
4847						actionNode.listeners.push(listener);
4848					}
4849				};
4850				null !== ReactSharedInternals.T ? setPendingState(!0) : actionNode.isTransition = !1;
4851				setState(actionNode);
4852				setPendingState = actionQueue.pending;
4853				null === setPendingState ? (actionNode.next = actionQueue.pending = actionNode, runActionStateAction(action
vendor: 2,277 bytes, lines 4853-4879
4853Queue, actionNode)) : (actionNode.next = setPendingState.next, actionQueue.pending = setPendingState.next = actionNode);
4854			}
4855		}
4856		function runActionStateAction(actionQueue, node) {
4857			var action = node.action, payload = node.payload, prevState = actionQueue.state;
4858			if (node.isTransition) {
4859				var prevTransition = ReactSharedInternals.T, currentTransition = {};
4860				currentTransition.types = null !== prevTransition ? prevTransition.types : null;
4861				currentTransition._updatedFibers = /* @__PURE__ */ new Set();
4862				ReactSharedInternals.T = currentTransition;
4863				try {
4864					var returnValue = action(prevState, payload), onStartTransitionFinish = ReactSharedInternals.S;
4865					null !== onStartTransitionFinish && onStartTransitionFinish(currentTransition, returnValue);
4866					handleActionReturnValue(actionQueue, node, returnValue);
4867				} catch (error) {
4868					onActionError(actionQueue, node, error);
4869				} finally {
4870					null !== prevTransition && null !== currentTransition.types && (null !== prevTransition.types && prevTransition.types !== currentTransition.types && console.error("We expected inner Transitions to have transferred the outer types set and that you cannot add to the outer Transition while inside the inner.This is a bug in React."), prevTransition.types = currentTransition.types), ReactSharedInternals.T = prevTransition, null === prevTransition && currentTransition._updatedFibers && (actionQueue = currentTransition._updatedFibers.size, currentTransition._updatedFibers.clear(), 10 < actionQueue && console.warn("Detected a large number of updates inside startTransition. If this is due to a subscription please re-write it to use React provided hooks. Otherwise concurrent mode guarantees are off the table."));
4871				}
4872			} else try {
4873				currentTransition = action(prevState, payload), handleActionReturnValue(actionQueue, node, currentTransition);
4874			} catch (error$5) {
4875				onActionError(actionQueue, node, error$5);
4876			}
4877		}
4878		function handleActionReturnValue(actionQueue, node, returnValue) {
4879			null !== returnValue && "object" === typeof returnValue && "function" === typeof returnValue.then ? (ReactSharedInternals.asyncTransitions++, returnValue.then(releaseAsyncTransition, releaseAsyncTransition), returnValue.then(function(nextState) {
vendor: 9,745 bytes, lines 4880-5100
4880				onActionSuccess(actionQueue, node, nextState);
4881			}, function(error) {
4882				return onActionError(actionQueue, node, error);
4883			}), node.isTransition || console.error("An async function with useActionState was called outside of a transition. This is likely not what you intended (for example, isPending will not update correctly). Either call the returned function inside startTransition, or pass it to an `action` or `formAction` prop.")) : onActionSuccess(actionQueue, node, returnValue);
4884		}
4885		function onActionSuccess(actionQueue, actionNode, nextState) {
4886			actionNode.status = "fulfilled";
4887			actionNode.value = nextState;
4888			notifyActionListeners(actionNode);
4889			actionQueue.state = nextState;
4890			actionNode = actionQueue.pending;
4891			null !== actionNode && (nextState = actionNode.next, nextState === actionNode ? actionQueue.pending = null : (nextState = nextState.next, actionNode.next = nextState, runActionStateAction(actionQueue, nextState)));
4892		}
4893		function onActionError(actionQueue, actionNode, error) {
4894			var last = actionQueue.pending;
4895			actionQueue.pending = null;
4896			if (null !== last) {
4897				last = last.next;
4898				do
4899					actionNode.status = "rejected", actionNode.reason = error, notifyActionListeners(actionNode), actionNode = actionNode.next;
4900				while (actionNode !== last);
4901			}
4902			actionQueue.action = null;
4903		}
4904		function notifyActionListeners(actionNode) {
4905			actionNode = actionNode.listeners;
4906			for (var i = 0; i < actionNode.length; i++) (0, actionNode[i])();
4907		}
4908		function actionStateReducer(oldState, newState) {
4909			return newState;
4910		}
4911		function mountActionState(action, initialStateProp) {
4912			if (isHydrating) {
4913				var ssrFormState = workInProgressRoot.formState;
4914				if (null !== ssrFormState) {
4915					a: {
4916						var isMatching = currentlyRenderingFiber;
4917						if (isHydrating) {
4918							if (nextHydratableInstance) {
4919								b: {
4920									var markerInstance = nextHydratableInstance;
4921									for (var inRootOrSingleton = rootOrSingletonContext; 8 !== markerInstance.nodeType;) {
4922										if (!inRootOrSingleton) {
4923											markerInstance = null;
4924											break b;
4925										}
4926										markerInstance = getNextHydratable(markerInstance.nextSibling);
4927										if (null === markerInstance) {
4928											markerInstance = null;
4929											break b;
4930										}
4931									}
4932									inRootOrSingleton = markerInstance.data;
4933									markerInstance = inRootOrSingleton === FORM_STATE_IS_MATCHING || inRootOrSingleton === FORM_STATE_IS_NOT_MATCHING ? markerInstance : null;
4934								}
4935								if (markerInstance) {
4936									nextHydratableInstance = getNextHydratable(markerInstance.nextSibling);
4937									isMatching = markerInstance.data === FORM_STATE_IS_MATCHING;
4938									break a;
4939								}
4940							}
4941							throwOnHydrationMismatch(isMatching);
4942						}
4943						isMatching = !1;
4944					}
4945					isMatching && (initialStateProp = ssrFormState[0]);
4946				}
4947			}
4948			ssrFormState = mountWorkInProgressHook();
4949			ssrFormState.memoizedState = ssrFormState.baseState = initialStateProp;
4950			isMatching = {
4951				pending: null,
4952				lanes: 0,
4953				dispatch: null,
4954				lastRenderedReducer: actionStateReducer,
4955				lastRenderedState: initialStateProp
4956			};
4957			ssrFormState.queue = isMatching;
4958			ssrFormState = dispatchSetState.bind(null, currentlyRenderingFiber, isMatching);
4959			isMatching.dispatch = ssrFormState;
4960			isMatching = mountStateImpl(!1);
4961			inRootOrSingleton = dispatchOptimisticSetState.bind(null, currentlyRenderingFiber, !1, isMatching.queue);
4962			isMatching = mountWorkInProgressHook();
4963			markerInstance = {
4964				state: initialStateProp,
4965				dispatch: null,
4966				action,
4967				pending: null
4968			};
4969			isMatching.queue = markerInstance;
4970			ssrFormState = dispatchActionState.bind(null, currentlyRenderingFiber, markerInstance, inRootOrSingleton, ssrFormState);
4971			markerInstance.dispatch = ssrFormState;
4972			isMatching.memoizedState = action;
4973			return [
4974				initialStateProp,
4975				ssrFormState,
4976				!1
4977			];
4978		}
4979		function updateActionState(action) {
4980			return updateActionStateImpl(updateWorkInProgressHook(), currentHook, action);
4981		}
4982		function updateActionStateImpl(stateHook, currentStateHook, action) {
4983			currentStateHook = updateReducerImpl(stateHook, currentStateHook, actionStateReducer)[0];
4984			stateHook = updateReducer(basicStateReducer)[0];
4985			if ("object" === typeof currentStateHook && null !== currentStateHook && "function" === typeof currentStateHook.then) try {
4986				var state = useThenable(currentStateHook);
4987			} catch (x) {
4988				if (x === SuspenseException) throw SuspenseActionException;
4989				throw x;
4990			}
4991			else state = currentStateHook;
4992			currentStateHook = updateWorkInProgressHook();
4993			var actionQueue = currentStateHook.queue, dispatch = actionQueue.dispatch;
4994			action !== currentStateHook.memoizedState && (currentlyRenderingFiber.flags |= 2048, pushSimpleEffect(HasEffect | Passive, { destroy: void 0 }, actionStateActionEffect.bind(null, actionQueue, action), null));
4995			return [
4996				state,
4997				dispatch,
4998				stateHook
4999			];
5000		}
5001		function actionStateActionEffect(actionQueue, action) {
5002			actionQueue.action = action;
5003		}
5004		function rerenderActionState(action) {
5005			var stateHook = updateWorkInProgressHook(), currentStateHook = currentHook;
5006			if (null !== currentStateHook) return updateActionStateImpl(stateHook, currentStateHook, action);
5007			updateWorkInProgressHook();
5008			stateHook = stateHook.memoizedState;
5009			currentStateHook = updateWorkInProgressHook();
5010			var dispatch = currentStateHook.queue.dispatch;
5011			currentStateHook.memoizedState = action;
5012			return [
5013				stateHook,
5014				dispatch,
5015				!1
5016			];
5017		}
5018		function pushSimpleEffect(tag, inst, create, deps) {
5019			tag = {
5020				tag,
5021				create,
5022				deps,
5023				inst,
5024				next: null
5025			};
5026			inst = currentlyRenderingFiber.updateQueue;
5027			null === inst && (inst = createFunctionComponentUpdateQueue(), currentlyRenderingFiber.updateQueue = inst);
5028			create = inst.lastEffect;
5029			null === create ? inst.lastEffect = tag.next = tag : (deps = create.next, create.next = tag, tag.next = deps, inst.lastEffect = tag);
5030			return tag;
5031		}
5032		function mountRef(initialValue) {
5033			var hook = mountWorkInProgressHook();
5034			initialValue = { current: initialValue };
5035			return hook.memoizedState = initialValue;
5036		}
5037		function mountEffectImpl(fiberFlags, hookFlags, create, deps) {
5038			var hook = mountWorkInProgressHook();
5039			currentlyRenderingFiber.flags |= fiberFlags;
5040			hook.memoizedState = pushSimpleEffect(HasEffect | hookFlags, { destroy: void 0 }, create, void 0 === deps ? null : deps);
5041		}
5042		function updateEffectImpl(fiberFlags, hookFlags, create, deps) {
5043			var hook = updateWorkInProgressHook();
5044			deps = void 0 === deps ? null : deps;
5045			var inst = hook.memoizedState.inst;
5046			null !== currentHook && null !== deps && areHookInputsEqual(deps, currentHook.memoizedState.deps) ? hook.memoizedState = pushSimpleEffect(hookFlags, inst, create, deps) : (currentlyRenderingFiber.flags |= fiberFlags, hook.memoizedState = pushSimpleEffect(HasEffect | hookFlags, inst, create, deps));
5047		}
5048		function mountEffect(create, deps) {
5049			(currentlyRenderingFiber.mode & StrictEffectsMode) !== NoMode ? mountEffectImpl(545261568, Passive, create, deps) : mountEffectImpl(8390656, Passive, create, deps);
5050		}
5051		function useEffectEventImpl(payload) {
5052			currentlyRenderingFiber.flags |= 4;
5053			var componentUpdateQueue = currentlyRenderingFiber.updateQueue;
5054			if (null === componentUpdateQueue) componentUpdateQueue = createFunctionComponentUpdateQueue(), currentlyRenderingFiber.updateQueue = componentUpdateQueue, componentUpdateQueue.events = [payload];
5055			else {
5056				var events = componentUpdateQueue.events;
5057				null === events ? componentUpdateQueue.events = [payload] : events.push(payload);
5058			}
5059		}
5060		function mountEvent(callback) {
5061			var hook = mountWorkInProgressHook(), ref = { impl: callback };
5062			hook.memoizedState = ref;
5063			return function() {
5064				if ((executionContext & RenderContext) !== NoContext) throw Error("A function wrapped in useEffectEvent can't be called during rendering.");
5065				return ref.impl.apply(void 0, arguments);
5066			};
5067		}
5068		function updateEvent(callback) {
5069			var ref = updateWorkInProgressHook().memoizedState;
5070			useEffectEventImpl({
5071				ref,
5072				nextImpl: callback
5073			});
5074			return function() {
5075				if ((executionContext & RenderContext) !== NoContext) throw Error("A function wrapped in useEffectEvent can't be called during rendering.");
5076				return ref.impl.apply(void 0, arguments);
5077			};
5078		}
5079		function mountLayoutEffect(create, deps) {
5080			var fiberFlags = 4194308;
5081			(currentlyRenderingFiber.mode & StrictEffectsMode) !== NoMode && (fiberFlags |= 268435456);
5082			return mountEffectImpl(fiberFlags, Layout, create, deps);
5083		}
5084		function imperativeHandleEffect(create, ref) {
5085			if ("function" === typeof ref) {
5086				create = create();
5087				var refCleanup = ref(create);
5088				return function() {
5089					"function" === typeof refCleanup ? refCleanup() : ref(null);
5090				};
5091			}
5092			if (null !== ref && void 0 !== ref) return ref.hasOwnProperty("current") || console.error("Expected useImperativeHandle() first argument to either be a ref callback or React.createRef() object. Instead received: %s.", "an object with keys {" + Object.keys(ref).join(", ") + "}"), create = create(), ref.current = create, function() {
5093				ref.current = null;
5094			};
5095		}
5096		function mountImperativeHandle(ref, create, deps) {
5097			"function" !== typeof create && console.error("Expected useImperativeHandle() second argument to be a function that creates a handle. Instead received: %s.", null !== create ? typeof create : "null");
5098			deps = null !== deps && void 0 !== deps ? deps.concat([ref]) : null;
5099			var fiberFlags = 4194308;
5100			(currentlyRenderingFiber.mode & StrictEffectsMode) !== NoMode && (fiberFlags |= 268435456);
vendor: 8,046 bytes, lines 5101-5261
5101			mountEffectImpl(fiberFlags, Layout, imperativeHandleEffect.bind(null, create, ref), deps);
5102		}
5103		function updateImperativeHandle(ref, create, deps) {
5104			"function" !== typeof create && console.error("Expected useImperativeHandle() second argument to be a function that creates a handle. Instead received: %s.", null !== create ? typeof create : "null");
5105			deps = null !== deps && void 0 !== deps ? deps.concat([ref]) : null;
5106			updateEffectImpl(4, Layout, imperativeHandleEffect.bind(null, create, ref), deps);
5107		}
5108		function mountCallback(callback, deps) {
5109			mountWorkInProgressHook().memoizedState = [callback, void 0 === deps ? null : deps];
5110			return callback;
5111		}
5112		function updateCallback(callback, deps) {
5113			var hook = updateWorkInProgressHook();
5114			deps = void 0 === deps ? null : deps;
5115			var prevState = hook.memoizedState;
5116			if (null !== deps && areHookInputsEqual(deps, prevState[1])) return prevState[0];
5117			hook.memoizedState = [callback, deps];
5118			return callback;
5119		}
5120		function mountMemo(nextCreate, deps) {
5121			var hook = mountWorkInProgressHook();
5122			deps = void 0 === deps ? null : deps;
5123			var nextValue = nextCreate();
5124			if (shouldDoubleInvokeUserFnsInHooksDEV) {
5125				setIsStrictModeForDevtools(!0);
5126				try {
5127					nextCreate();
5128				} finally {
5129					setIsStrictModeForDevtools(!1);
5130				}
5131			}
5132			hook.memoizedState = [nextValue, deps];
5133			return nextValue;
5134		}
5135		function updateMemo(nextCreate, deps) {
5136			var hook = updateWorkInProgressHook();
5137			deps = void 0 === deps ? null : deps;
5138			var prevState = hook.memoizedState;
5139			if (null !== deps && areHookInputsEqual(deps, prevState[1])) return prevState[0];
5140			prevState = nextCreate();
5141			if (shouldDoubleInvokeUserFnsInHooksDEV) {
5142				setIsStrictModeForDevtools(!0);
5143				try {
5144					nextCreate();
5145				} finally {
5146					setIsStrictModeForDevtools(!1);
5147				}
5148			}
5149			hook.memoizedState = [prevState, deps];
5150			return prevState;
5151		}
5152		function mountDeferredValue(value, initialValue) {
5153			return mountDeferredValueImpl(mountWorkInProgressHook(), value, initialValue);
5154		}
5155		function updateDeferredValue(value, initialValue) {
5156			return updateDeferredValueImpl(updateWorkInProgressHook(), currentHook.memoizedState, value, initialValue);
5157		}
5158		function rerenderDeferredValue(value, initialValue) {
5159			var hook = updateWorkInProgressHook();
5160			return null === currentHook ? mountDeferredValueImpl(hook, value, initialValue) : updateDeferredValueImpl(hook, currentHook.memoizedState, value, initialValue);
5161		}
5162		function mountDeferredValueImpl(hook, value, initialValue) {
5163			if (void 0 === initialValue || 0 !== (renderLanes & 1073741824) && 0 === (workInProgressRootRenderLanes & 261930)) return hook.memoizedState = value;
5164			hook.memoizedState = initialValue;
5165			hook = requestDeferredLane();
5166			currentlyRenderingFiber.lanes |= hook;
5167			workInProgressRootSkippedLanes |= hook;
5168			return initialValue;
5169		}
5170		function updateDeferredValueImpl(hook, prevValue, value, initialValue) {
5171			if (objectIs(value, prevValue)) return value;
5172			if (null !== currentTreeHiddenStackCursor.current) return hook = mountDeferredValueImpl(hook, value, initialValue), objectIs(hook, prevValue) || (didReceiveUpdate = !0), hook;
5173			if (0 === (renderLanes & 106) || 0 !== (renderLanes & 1073741824) && 0 === (workInProgressRootRenderLanes & 261930)) return didReceiveUpdate = !0, hook.memoizedState = value;
5174			hook = requestDeferredLane();
5175			currentlyRenderingFiber.lanes |= hook;
5176			workInProgressRootSkippedLanes |= hook;
5177			return prevValue;
5178		}
5179		function releaseAsyncTransition() {
5180			ReactSharedInternals.asyncTransitions--;
5181		}
5182		function startTransition(fiber, queue, pendingState, finishedState, callback) {
5183			var previousPriority = ReactDOMSharedInternals.p;
5184			ReactDOMSharedInternals.p = 0 !== previousPriority && previousPriority < ContinuousEventPriority ? previousPriority : ContinuousEventPriority;
5185			var prevTransition = ReactSharedInternals.T, currentTransition = {};
5186			currentTransition.types = null !== prevTransition ? prevTransition.types : null;
5187			currentTransition._updatedFibers = /* @__PURE__ */ new Set();
5188			ReactSharedInternals.T = currentTransition;
5189			dispatchOptimisticSetState(fiber, !1, queue, pendingState);
5190			try {
5191				var returnValue = callback(), onStartTransitionFinish = ReactSharedInternals.S;
5192				null !== onStartTransitionFinish && onStartTransitionFinish(currentTransition, returnValue);
5193				if (null !== returnValue && "object" === typeof returnValue && "function" === typeof returnValue.then) {
5194					ReactSharedInternals.asyncTransitions++;
5195					returnValue.then(releaseAsyncTransition, releaseAsyncTransition);
5196					var thenableForFinishedState = chainThenableValue(returnValue, finishedState);
5197					dispatchSetStateInternal(fiber, queue, thenableForFinishedState, requestUpdateLane(fiber));
5198				} else dispatchSetStateInternal(fiber, queue, finishedState, requestUpdateLane(fiber));
5199			} catch (error) {
5200				dispatchSetStateInternal(fiber, queue, {
5201					then: function() {},
5202					status: "rejected",
5203					reason: error
5204				}, requestUpdateLane(fiber));
5205			} finally {
5206				ReactDOMSharedInternals.p = previousPriority, null !== prevTransition && null !== currentTransition.types && (null !== prevTransition.types && prevTransition.types !== currentTransition.types && console.error("We expected inner Transitions to have transferred the outer types set and that you cannot add to the outer Transition while inside the inner.This is a bug in React."), prevTransition.types = currentTransition.types), ReactSharedInternals.T = prevTransition, null === prevTransition && currentTransition._updatedFibers && (fiber = currentTransition._updatedFibers.size, currentTransition._updatedFibers.clear(), 10 < fiber && console.warn("Detected a large number of updates inside startTransition. If this is due to a subscription please re-write it to use React provided hooks. Otherwise concurrent mode guarantees are off the table."));
5207			}
5208		}
5209		function startHostTransition(formFiber, pendingState, action, formData) {
5210			if (5 !== formFiber.tag) throw Error("Expected the form instance to be a HostComponent. This is a bug in React.");
5211			var queue = ensureFormComponentIsStateful(formFiber).queue;
5212			startHostActionTimer(formFiber);
5213			startTransition(formFiber, queue, pendingState, NotPendingTransition, null === action ? noop : function() {
5214				requestFormReset$1(formFiber);
5215				return action(formData);
5216			});
5217		}
5218		function ensureFormComponentIsStateful(formFiber) {
5219			var existingStateHook = formFiber.memoizedState;
5220			if (null !== existingStateHook) return existingStateHook;
5221			existingStateHook = {
5222				memoizedState: NotPendingTransition,
5223				baseState: NotPendingTransition,
5224				baseQueue: null,
5225				queue: {
5226					pending: null,
5227					lanes: 0,
5228					dispatch: null,
5229					lastRenderedReducer: basicStateReducer,
5230					lastRenderedState: NotPendingTransition
5231				},
5232				next: null
5233			};
5234			var initialResetState = {};
5235			existingStateHook.next = {
5236				memoizedState: initialResetState,
5237				baseState: initialResetState,
5238				baseQueue: null,
5239				queue: {
5240					pending: null,
5241					lanes: 0,
5242					dispatch: null,
5243					lastRenderedReducer: basicStateReducer,
5244					lastRenderedState: initialResetState
5245				},
5246				next: null
5247			};
5248			formFiber.memoizedState = existingStateHook;
5249			formFiber = formFiber.alternate;
5250			null !== formFiber && (formFiber.memoizedState = existingStateHook);
5251			return existingStateHook;
5252		}
5253		function requestFormReset$1(formFiber) {
5254			null === ReactSharedInternals.T && console.error("requestFormReset was called outside a transition or action. To fix, move to an action, or wrap with startTransition.");
5255			var stateHook = ensureFormComponentIsStateful(formFiber);
5256			null === stateHook.next && (stateHook = formFiber.alternate.memoizedState);
5257			dispatchSetStateInternal(formFiber, stateHook.next.queue, {}, requestUpdateLane(formFiber));
5258		}
5259		function mountTransition() {
5260			var stateHook = mountStateImpl(!1);
5261			stateHook = startTransition.bind(null, currentlyRenderingFiber, stateHook.queue, !0, !1);
vendor: 3,078 bytes, lines 5262-5320
5262			mountWorkInProgressHook().memoizedState = stateHook;
5263			return [!1, stateHook];
5264		}
5265		function updateTransition() {
5266			var booleanOrThenable = updateReducer(basicStateReducer)[0], start = updateWorkInProgressHook().memoizedState;
5267			return ["boolean" === typeof booleanOrThenable ? booleanOrThenable : useThenable(booleanOrThenable), start];
5268		}
5269		function rerenderTransition() {
5270			var booleanOrThenable = rerenderReducer(basicStateReducer)[0], start = updateWorkInProgressHook().memoizedState;
5271			return ["boolean" === typeof booleanOrThenable ? booleanOrThenable : useThenable(booleanOrThenable), start];
5272		}
5273		function useHostTransitionStatus() {
5274			return readContext(HostTransitionContext);
5275		}
5276		function mountId() {
5277			var hook = mountWorkInProgressHook(), identifierPrefix = workInProgressRoot.identifierPrefix;
5278			if (isHydrating) {
5279				var treeId = treeContextOverflow;
5280				var idWithLeadingBit = treeContextId;
5281				treeId = (idWithLeadingBit & ~(1 << 32 - clz32(idWithLeadingBit) - 1)).toString(32) + treeId;
5282				identifierPrefix = "_" + identifierPrefix + "R_" + treeId;
5283				treeId = localIdCounter++;
5284				0 < treeId && (identifierPrefix += "H" + treeId.toString(32));
5285				identifierPrefix += "_";
5286			} else treeId = globalClientIdCounter++, identifierPrefix = "_" + identifierPrefix + "r_" + treeId.toString(32) + "_";
5287			return hook.memoizedState = identifierPrefix;
5288		}
5289		function mountRefresh() {
5290			return mountWorkInProgressHook().memoizedState = refreshCache.bind(null, currentlyRenderingFiber);
5291		}
5292		function refreshCache(fiber, seedKey) {
5293			for (var provider = fiber.return; null !== provider;) {
5294				switch (provider.tag) {
5295					case 24:
5296					case 3:
5297						var lane = requestUpdateLane(provider), refreshUpdate = createUpdate(lane), root = enqueueUpdate(provider, refreshUpdate, lane);
5298						null !== root && (startUpdateTimerByLane(lane, "refresh()", fiber), scheduleUpdateOnFiber(root, provider, lane), entangleTransitions(root, provider, lane));
5299						fiber = createCache();
5300						null !== seedKey && void 0 !== seedKey && null !== root && console.error("The seed argument is not enabled outside experimental channels.");
5301						refreshUpdate.payload = { cache: fiber };
5302						return;
5303				}
5304				provider = provider.return;
5305			}
5306		}
5307		function dispatchReducerAction(fiber, queue, action) {
5308			var args = arguments;
5309			"function" === typeof args[3] && console.error("State updates from the useState() and useReducer() Hooks don't support the second callback argument. To execute a side effect after rendering, declare it in the component body with useEffect().");
5310			args = requestUpdateLane(fiber);
5311			var update = {
5312				lane: args,
5313				revertLane: 0,
5314				gesture: null,
5315				action,
5316				hasEagerState: !1,
5317				eagerState: null,
5318				next: null
5319			};
5320			isRenderPhaseUpdate(fiber) ? enqueueRenderPhaseUpdate(queue, update) : (update = enqueueConcurrentHookUpdate(fiber, queue, update, args), null !== update && (startUpdateTimerByLane(args, "dispatch()", fiber), scheduleUpdateOnFiber(update, fiber, args), entangleTransitionUpdate(update, queue, args
5320)));
5321		}
5322		function dispatchSetState(fiber, queue, action) {
5323			var args = arguments;
5324			"function" === typeof args[3] && console.error("State updates from the useState() and useReducer() Hooks don't support the second callback argument. To execute a side effect after rendering, declare it in the component body with useEffect().");
5325			args = requestUpdateLane(fiber);
5326			dispatchSetStateInternal(fiber, queue, action, args) && startUpdateTimerByLane(args, "setState()", fiber);
5327		}
5328		function dispatchSetStateInternal(fiber, queue, action, lane) {
5329			var update = {
5330				lane,
5331				revertLane: 0,
5332				gesture: null,
5333				action,
5334				hasEagerState: !1,
5335				eagerState: null,
5336				next: null
5337			};
5338			if (isRenderPhaseUpdate(fiber)) enqueueRenderPhaseUpdate(queue, update);
5339			else {
5340				var alternate = fiber.alternate;
5341				if (0 === fiber.lanes && (null === alternate || 0 === alternate.lanes) && (alternate = queue.lastRenderedReducer, null !== alternate)) {
5342					var prevDispatcher = ReactSharedInternals.H;
5343					ReactSharedInternals.H = InvalidNestedHooksDispatcherOnUpdateInDEV;
5344					try {
5345						var currentState = queue.lastRenderedState, eagerState = alternate(currentState, action);
5346						update.hasEagerState = !0;
5347						update.eagerState = eagerState;
5348						if (objectIs(eagerState, currentState)) return enqueueUpdate$1(fiber, queue, update, 0), null === workInProgressRoot && finishQueueingConcurrentUpdates(), !1;
5349					} catch (error) {} finally {
5350						ReactSharedInternals.H = prevDispatcher;
5351					}
5352				}
5353				action = enqueueConcurrentHookUpdate(fiber, queue, update, lane);
5354				if (null !== action) return scheduleUpdateOnFiber(action, fiber, lane), entangleTransitionUpdate(action, queue, lane), !0;
5355			}
5356			return !1;
5357		}
5358		function dispatchOptimisticSetState(fiber, throwIfDuringRender, queue, action) {
5359			null === ReactSharedInternals.T && 0 === currentEntangledLane && console.error("An optimistic state update occurred outside a transition or action. To fix, move the update to an action, or wrap with startTransition.");
5360			action = {
5361				lane: 2,
5362				revertLane: requestTransitionLane(),
5363				gesture: null,
5364				action,
5365				hasEagerState: !1,
5366				eagerState: null,
5367				next: null
5368			};
5369			if (isRenderPhaseUpdate(fiber)) {
5370				if (throwIfDuringRender) throw Error("Cannot update optimistic state while rendering.");
5371				console.error("Cannot call startTransition while rendering.");
5372			} else throwIfDuringRender = enqueueConcurrentHookUpdate(fiber, queue, action, 2), null !== throwIfDuringRender && (startUpdateTimerByLane(2, "setOptimistic()", fiber), scheduleUpdateOnFiber(throwIfDuringRender, fiber, 2));
5373		}
5374		function isRenderPhaseUpdate(fiber) {
5375			var alternate = fiber.alternate;
5376			return fiber === currentlyRenderingFiber || null !== alternate && alternate === currentlyRenderingFiber;
5377		}
5378		function enqueueRenderPhaseUpdate(queue, update) {
5379			didScheduleRenderPhaseUpdateDuringThisPass = didScheduleRenderPhaseUpdate = !0;
5380			var pending = queue.pending;
5381			null === pending ? update.next = update : (update.next = pending.next, pending.next = update);
5382			queue.pending = update;
5383		}
5384		function entangleTransitionUpdate(root, queue, lane) {
5385			if (0 !== (lane & 4194048)) {
5386				var queueLanes = queue.lanes;
5387				queueLanes &= root.pendingLanes;
5388				lane |= queueLanes;
5389				queue.lanes = lane;
5390				markRootEntangled(root, lane);
5391			}
5392		}
vendor: 6,111 bytes, lines 5393-5494
5393		function warnOnInvalidCallback(callback) {
5394			if (null !== callback && "function" !== typeof callback) {
5395				var key = String(callback);
5396				didWarnOnInvalidCallback.has(key) || (didWarnOnInvalidCallback.add(key), console.error("Expected the last optional `callback` argument to be a function. Instead received: %s.", callback));
5397			}
5398		}
5399		function applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, nextProps) {
5400			var prevState = workInProgress.memoizedState, partialState = getDerivedStateFromProps(nextProps, prevState);
5401			if (workInProgress.mode & StrictLegacyMode) {
5402				setIsStrictModeForDevtools(!0);
5403				try {
5404					partialState = getDerivedStateFromProps(nextProps, prevState);
5405				} finally {
5406					setIsStrictModeForDevtools(!1);
5407				}
5408			}
5409			void 0 === partialState && (ctor = getComponentNameFromType(ctor) || "Component", didWarnAboutUndefinedDerivedState.has(ctor) || (didWarnAboutUndefinedDerivedState.add(ctor), console.error("%s.getDerivedStateFromProps(): A valid state object (or null) must be returned. You have returned undefined.", ctor)));
5410			prevState = null === partialState || void 0 === partialState ? prevState : assign({}, prevState, partialState);
5411			workInProgress.memoizedState = prevState;
5412			0 === workInProgress.lanes && (workInProgress.updateQueue.baseState = prevState);
5413		}
5414		function checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext) {
5415			var instance = workInProgress.stateNode;
5416			if ("function" === typeof instance.shouldComponentUpdate) {
5417				oldProps = instance.shouldComponentUpdate(newProps, newState, nextContext);
5418				if (workInProgress.mode & StrictLegacyMode) {
5419					setIsStrictModeForDevtools(!0);
5420					try {
5421						oldProps = instance.shouldComponentUpdate(newProps, newState, nextContext);
5422					} finally {
5423						setIsStrictModeForDevtools(!1);
5424					}
5425				}
5426				void 0 === oldProps && console.error("%s.shouldComponentUpdate(): Returned undefined instead of a boolean value. Make sure to return true or false.", getComponentNameFromType(ctor) || "Component");
5427				return oldProps;
5428			}
5429			return ctor.prototype && ctor.prototype.isPureReactComponent ? !shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState) : !0;
5430		}
5431		function callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext) {
5432			var oldState = instance.state;
5433			"function" === typeof instance.componentWillReceiveProps && instance.componentWillReceiveProps(newProps, nextContext);
5434			"function" === typeof instance.UNSAFE_componentWillReceiveProps && instance.UNSAFE_componentWillReceiveProps(newProps, nextContext);
5435			instance.state !== oldState && (workInProgress = getComponentNameFromFiber(workInProgress) || "Component", didWarnAboutStateAssignmentForComponent.has(workInProgress) || (didWarnAboutStateAssignmentForComponent.add(workInProgress), console.error("%s.componentWillReceiveProps(): Assigning directly to this.state is deprecated (except inside a component's constructor). Use setState instead.", workInProgress)), classComponentUpdater.enqueueReplaceState(instance, instance.state, null));
5436		}
5437		function resolveClassComponentProps(Component, baseProps) {
5438			var newProps = baseProps;
5439			if ("ref" in baseProps) {
5440				newProps = {};
5441				for (var propName in baseProps) "ref" !== propName && (newProps[propName] = baseProps[propName]);
5442			}
5443			if (Component = Component.defaultProps) {
5444				newProps === baseProps && (newProps = assign({}, newProps));
5445				for (var _propName in Component) void 0 === newProps[_propName] && (newProps[_propName] = Component[_propName]);
5446			}
5447			return newProps;
5448		}
5449		function defaultOnUncaughtError(error) {
5450			reportGlobalError(error);
5451			console.warn("%s\n\n%s\n", componentName ? "An error occurred in the <" + componentName + "> component." : "An error occurred in one of your React components.", "Consider adding an error boundary to your tree to customize error handling behavior.\nVisit https://react.dev/link/error-boundaries to learn more about error boundaries.");
5452		}
5453		function defaultOnCaughtError(error) {
5454			var componentNameMessage = componentName ? "The above error occurred in the <" + componentName + "> component." : "The above error occurred in one of your React components.", recreateMessage = "React will try to recreate this component tree from scratch using the error boundary you provided, " + ((errorBoundaryName || "Anonymous") + ".");
5455			if ("object" === typeof error && null !== error && "string" === typeof error.environmentName) {
5456				var JSCompiler_inline_result = error.environmentName;
5457				error = [
5458					"%o\n\n%s\n\n%s\n",
5459					error,
5460					componentNameMessage,
5461					recreateMessage
5462				].slice(0);
5463				"string" === typeof error[0] ? error.splice(0, 1, badgeFormat + " " + error[0], badgeStyle, pad + JSCompiler_inline_result + pad, resetStyle) : error.splice(0, 0, badgeFormat, badgeStyle, pad + JSCompiler_inline_result + pad, resetStyle);
5464				error.unshift(console);
5465				JSCompiler_inline_result = bind.apply(console.error, error);
5466				JSCompiler_inline_result();
5467			} else console.error("%o\n\n%s\n\n%s\n", error, componentNameMessage, recreateMessage);
5468		}
5469		function defaultOnRecoverableError(error) {
5470			reportGlobalError(error);
5471		}
5472		function logUncaughtError(root, errorInfo) {
5473			try {
5474				componentName = errorInfo.source ? getComponentNameFromFiber(errorInfo.source) : null;
5475				errorBoundaryName = null;
5476				var error = errorInfo.value;
5477				if (null !== ReactSharedInternals.actQueue) ReactSharedInternals.thrownErrors.push(error);
5478				else {
5479					var onUncaughtError = root.onUncaughtError;
5480					onUncaughtError(error, { componentStack: errorInfo.stack });
5481				}
5482			} catch (e$6) {
5483				setTimeout(function() {
5484					throw e$6;
5485				});
5486			}
5487		}
5488		function logCaughtError(root, boundary, errorInfo) {
5489			try {
5490				componentName = errorInfo.source ? getComponentNameFromFiber(errorInfo.source) : null;
5491				errorBoundaryName = getComponentNameFromFiber(boundary);
5492				var onCaughtError = root.onCaughtError;
5493				onCaughtError(errorInfo.value, {
5494					componentStack: errorInfo.stack,
5495					errorBoundary: 1 === boundary.tag ? boundary.stateNode : null
5496				});
5497			} catch (e$7) {
5498				setTimeout(function() {
5499					throw e$7;
5500				});
5501			}
5502		}
5503		function createRootErrorUpdate(root, errorInfo, lane) {
5504			lane = createUpdate(lane);
5505			lane.tag = CaptureUpdate;
5506			lane.payload = { element: null };
5507			lane.callback = function() {
5508				runWithFiberInDEV(errorInfo.source, logUncaughtError, root, errorInfo);
5509			};
5510			return lane;
5511		}
5512		function createClassErrorUpdate(lane) {
5513			lane = createUpdate(lane);
5514			lane.tag = CaptureUpdate;
5515			return lane;
5516		}
5517		function initializeClassErrorUpdate(update, root, fiber, errorInfo) {
5518			var getDerivedStateFromError = fiber.type.getDerivedStateFromError;
5519			if ("function" === typeof getDerivedStateFromError) {
5520				var error = errorInfo.value;
5521				update.payload = function() {
5522					return getDerivedStateFromError(error);
5523				};
5524				update.callback = function() {
5525					markFailedErrorBoundaryForHotReloading(fiber);
5526					runWithFiberInDEV(errorInfo.source, logCaughtError, root, fiber, errorInfo);
5527				};
5528			}
5529			var inst = fiber.stateNode;
5530			null !== inst && "function" === typeof inst.componentDidCatch && (update.callback = function() {
5531				markFailedErrorBoundaryForHotReloading(fiber);
5532				runWithFiberInDEV(errorInfo.source, logCaughtError, root, fiber, errorInfo);
5533				"function" !== typeof getDerivedStateFromError && (null === legacyErrorBoundariesThatAlreadyFailed ? legacyErrorBoundariesThatAlreadyFailed = /* @__PURE__ */ new Set([this]) : legacyErrorBoundariesThatAlreadyFailed.add(this));
5534				callComponentDidCatchInDEV(this, errorInfo);
5535				"function" === typeof getDerivedStateFromError || 0 === (fiber.lanes & 2) && console.error("%s: Error boundaries should implement getDerivedStateFromError(). In that method, return a state update to display an error message or fallback UI.", getComponentNameFromFiber(fiber) || "Unknown");
5536			});
5537		}
5538		function throwException(root, returnFiber, sourceFiber, value, rootRenderLanes) {
5539			sourceFiber.flags |= 32768;
5540			isDevToolsPresent && restorePendingUpdaters(root, rootRenderLanes);
5541			if (null !== value && "object" === typeof value && "function" === typeof value.then) {
5542				returnFiber = sourceFiber.alternate;
5543				null !== returnFiber && propagateParentContextChanges(returnFiber, sourceFiber, rootRenderLanes, !0);
5544				isHydrating && (didSuspendOrErrorDEV = !0);
5545				sourceFiber = suspenseHandlerStackCursor.current;
5546				if (null !== sourceFiber) {
5547					switch (sourceFiber.tag) {
5548						case 31:
5549						case 13:
5550						case 19: return null === shellBoundary ? renderDidSuspendDelayIfPossible() : null === sourceFiber.alternate && workInProgressRootExitStatus === RootInProgress && (workInProgressRootExitStatus = RootSuspended), sourceFiber.flags &= -257, sourceFiber.flags |= 65536, sourceFiber.lanes = rootRenderLanes, value === noopSuspenseyCommitThenable ? sourceFiber.flags |= 16384 : (returnFiber = sourceFiber.updateQueue, null === returnFiber ? sourceFiber.updateQueue = /* @__PURE__ */ new Set([value]) : returnFiber.add(value), attachPingListener(root, value, rootRenderLanes)), !1;
5551						case 22: return sourceFiber.flags |= 65536, value === noopSuspenseyCommitThenable ? sourceFiber.flags |= 16384 : (returnFiber = sourceFiber.updateQueue, null === returnFiber ? (returnFiber = {
5552							transitions: null,
5553							markerInstances: null,
5554							retryQueue: /* @__PURE__ */ new Set([value])
5555						}, sourceFiber.updateQueue = returnFiber) : (sourceFiber = returnFiber.retryQueue, null === sourceFiber ? returnFiber.retryQueue = /* @__PURE__ */ new Set([value]) : sourceFiber.add(value)), attachPingListener(root, value, rootRenderLanes)), !1;
5556					}
5557					throw Error("Unexpected Suspense handler tag (" + sourceFiber.tag + "). This is a bug in React.");
5558				}
5559				attachPingListener(root, value, rootRenderLanes);
5560				renderDidSuspendDelayIfPossible();
5561				return !1;
5562			}
5563			if (isHydrating) return didSuspendOrErrorDEV = !0, returnFiber = suspenseHandlerStackCursor.current, null !== returnFiber ? (19 === returnFiber.tag && console.error("SuspenseList should never catch while hydrating. This is a bug in React."), 0 === (returnFiber.flags & 65536) && (returnFiber.flags |= 256), returnFiber.flags |= 65536, returnFiber.lanes = rootRenderLanes, value !== HydrationMismatchException && queueHydrationError(createCapturedValueAtFiber(Error("There was an error while hydrating but React was able to re
vendor: 9,703 bytes, lines 5563-5696
5563cover by instead client rendering from the nearest Suspense boundary.", { cause: value }), sourceFiber))) : (value !== HydrationMismatchException && queueHydrationError(createCapturedValueAtFiber(Error("There was an error while hydrating but React was able to recover by instead client rendering the entire root.", { cause: value }), sourceFiber)), root = root.current.alternate, root.flags |= 65536, rootRenderLanes &= -rootRenderLanes, root.lanes |= rootRenderLanes, value = createCapturedValueAtFiber(value, sourceFiber), rootRenderLanes = createRootErrorUpdate(root.stateNode, value, rootRenderLanes), enqueueCapturedUpdate(root, rootRenderLanes), workInProgressRootExitStatus !== RootSuspendedWithDelay && (workInProgressRootExitStatus = RootErrored)), !1;
5564			var error = createCapturedValueAtFiber(Error("There was an error during concurrent rendering but React was able to recover by instead synchronously rendering the entire root.", { cause: value }), sourceFiber);
5565			null === workInProgressRootConcurrentErrors ? workInProgressRootConcurrentErrors = [error] : workInProgressRootConcurrentErrors.push(error);
5566			workInProgressRootExitStatus !== RootSuspendedWithDelay && (workInProgressRootExitStatus = RootErrored);
5567			if (null === returnFiber) return !0;
5568			value = createCapturedValueAtFiber(value, sourceFiber);
5569			sourceFiber = returnFiber;
5570			do {
5571				switch (sourceFiber.tag) {
5572					case 3: return sourceFiber.flags |= 65536, root = rootRenderLanes & -rootRenderLanes, sourceFiber.lanes |= root, root = createRootErrorUpdate(sourceFiber.stateNode, value, root), enqueueCapturedUpdate(sourceFiber, root), !1;
5573					case 1:
5574						returnFiber = sourceFiber.type;
5575						error = sourceFiber.stateNode;
5576						if (0 === (sourceFiber.flags & 128) && ("function" === typeof returnFiber.getDerivedStateFromError || null !== error && "function" === typeof error.componentDidCatch && (null === legacyErrorBoundariesThatAlreadyFailed || !legacyErrorBoundariesThatAlreadyFailed.has(error)))) return sourceFiber.flags |= 65536, rootRenderLanes &= -rootRenderLanes, sourceFiber.lanes |= rootRenderLanes, rootRenderLanes = createClassErrorUpdate(rootRenderLanes), initializeClassErrorUpdate(rootRenderLanes, root, sourceFiber, value), enqueueCapturedUpdate(sourceFiber, rootRenderLanes), !1;
5577						break;
5578					case 22: if (null !== sourceFiber.memoizedState) return sourceFiber.flags |= 65536, !1;
5579				}
5580				sourceFiber = sourceFiber.return;
5581			} while (null !== sourceFiber);
5582			return !1;
5583		}
5584		function reconcileChildren(current, workInProgress, nextChildren, renderLanes) {
5585			workInProgress.child = null === current ? mountChildFibers(workInProgress, null, nextChildren, renderLanes) : reconcileChildFibers(workInProgress, current.child, nextChildren, renderLanes);
5586		}
5587		function updateForwardRef(current, workInProgress, Component, nextProps, renderLanes) {
5588			Component = Component.render;
5589			var resolvedRender = resolveTypeForHotReloading(Component);
5590			resolvedRender !== Component && (Component = resolvedRender, null !== current && (didReceiveUpdate = !0));
5591			resolvedRender = workInProgress.ref;
5592			if ("ref" in nextProps) {
5593				var propsWithoutRef = {};
5594				for (var key in nextProps) "ref" !== key && (propsWithoutRef[key] = nextProps[key]);
5595			} else propsWithoutRef = nextProps;
5596			prepareToReadContext(workInProgress);
5597			nextProps = renderWithHooks(current, workInProgress, Component, propsWithoutRef, resolvedRender, renderLanes);
5598			key = checkDidRenderIdHook();
5599			if (null !== current && !didReceiveUpdate) return bailoutHooks(current, workInProgress, renderLanes), bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
5600			isHydrating && key && pushMaterializedTreeId(workInProgress);
5601			workInProgress.flags |= 1;
5602			reconcileChildren(current, workInProgress, nextProps, renderLanes);
5603			return workInProgress.child;
5604		}
5605		function updateMemoComponent(current, workInProgress, Component, nextProps, renderLanes) {
5606			if (null === current) {
5607				var type = Component.type;
5608				if ("function" === typeof type && !shouldConstruct(type) && void 0 === type.defaultProps && null === Component.compare) return Component = resolveTypeForHotReloading(type), workInProgress.tag = 15, workInProgress.type = Component, validateFunctionComponentInDev(workInProgress, type), updateSimpleMemoComponent(current, workInProgress, Component, nextProps, renderLanes);
5609				current = createFiberFromTypeAndProps(Component.type, null, nextProps, workInProgress, workInProgress.mode, renderLanes);
5610				current.ref = workInProgress.ref;
5611				current.return = workInProgress;
5612				return workInProgress.child = current;
5613			}
5614			type = current.child;
5615			if (!checkScheduledUpdateOrContext(current, renderLanes)) {
5616				var prevProps = type.memoizedProps;
5617				Component = Component.compare;
5618				Component = null !== Component ? Component : shallowEqual;
5619				if (Component(prevProps, nextProps) && current.ref === workInProgress.ref) return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
5620			}
5621			workInProgress.flags |= 1;
5622			current = createWorkInProgress(type, nextProps);
5623			current.ref = workInProgress.ref;
5624			current.return = workInProgress;
5625			return workInProgress.child = current;
5626		}
5627		function updateSimpleMemoComponent(current, workInProgress, Component, nextProps, renderLanes) {
5628			if (null !== current) {
5629				var prevProps = current.memoizedProps;
5630				if (shallowEqual(prevProps, nextProps) && current.ref === workInProgress.ref && workInProgress.type === current.type) if (didReceiveUpdate = !1, workInProgress.pendingProps = nextProps = prevProps, checkScheduledUpdateOrContext(current, renderLanes)) 0 !== (current.flags & 131072) && (didReceiveUpdate = !0);
5631				else return workInProgress.lanes = current.lanes, bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
5632			}
5633			return updateFunctionComponent(current, workInProgress, Component, nextProps, renderLanes);
5634		}
5635		function updateOffscreenComponent(current, workInProgress, renderLanes, nextProps) {
5636			var nextChildren = nextProps.children, prevState = null !== current ? current.memoizedState : null;
5637			null === current && null === workInProgress.stateNode && (workInProgress.stateNode = {
5638				_visibility: OffscreenVisible,
5639				_pendingMarkers: null,
5640				_retryCache: null,
5641				_transitions: null
5642			});
5643			if ("hidden" === nextProps.mode) {
5644				if (0 !== (workInProgress.flags & 128)) {
5645					prevState = null !== prevState ? prevState.baseLanes | renderLanes : renderLanes;
5646					if (null !== current) {
5647						nextProps = workInProgress.child = current.child;
5648						for (nextChildren = 0; null !== nextProps;) nextChildren = nextChildren | nextProps.lanes | nextProps.childLanes, nextProps = nextProps.sibling;
5649						nextProps = nextChildren & ~prevState;
5650					} else nextProps = 0, workInProgress.child = null;
5651					return deferHiddenOffscreenComponent(current, workInProgress, prevState, renderLanes, nextProps);
5652				}
5653				if (0 !== (renderLanes & 536870912)) workInProgress.memoizedState = {
5654					baseLanes: 0,
5655					cachePool: null
5656				}, null !== current && pushTransition(workInProgress, null !== prevState ? prevState.cachePool : null), null !== prevState ? pushHiddenContext(workInProgress, prevState) : reuseHiddenContextOnStack(workInProgress), pushOffscreenSuspenseHandler(workInProgress);
5657				else return nextProps = workInProgress.lanes = 536870912, deferHiddenOffscreenComponent(current, workInProgress, null !== prevState ? prevState.baseLanes | renderLanes : renderLanes, renderLanes, nextProps);
5658			} else null !== prevState ? (pushTransition(workInProgress, prevState.cachePool), pushHiddenContext(workInProgress, prevState), reuseSuspenseHandlerOnStack(workInProgress), workInProgress.memoizedState = null) : (null !== current && pushTransition(workInProgress, null), reuseHiddenContextOnStack(workInProgress), reuseSuspenseHandlerOnStack(workInProgress));
5659			reconcileChildren(current, workInProgress, nextChildren, renderLanes);
5660			return workInProgress.child;
5661		}
5662		function bailoutOffscreenComponent(current, workInProgress) {
5663			null !== current && 22 === current.tag || null !== workInProgress.stateNode || (workInProgress.stateNode = {
5664				_visibility: OffscreenVisible,
5665				_pendingMarkers: null,
5666				_retryCache: null,
5667				_transitions: null
5668			});
5669			return workInProgress.sibling;
5670		}
5671		function deferHiddenOffscreenComponent(current, workInProgress, nextBaseLanes, renderLanes, remainingChildLanes) {
5672			var JSCompiler_inline_result = peekCacheFromPool();
5673			JSCompiler_inline_result = null === JSCompiler_inline_result ? null : {
5674				parent: CacheContext._currentValue,
5675				pool: JSCompiler_inline_result
5676			};
5677			workInProgress.memoizedState = {
5678				baseLanes: nextBaseLanes,
5679				cachePool: JSCompiler_inline_result
5680			};
5681			null !== current && pushTransition(workInProgress, null);
5682			reuseHiddenContextOnStack(workInProgress);
5683			pushOffscreenSuspenseHandler(workInProgress);
5684			null !== current && propagateParentContextChanges(current, workInProgress, renderLanes, !0);
5685			workInProgress.childLanes = remainingChildLanes;
5686			return null;
5687		}
5688		function mountActivityChildren(workInProgress, nextProps) {
5689			var hiddenProp = nextProps.hidden;
5690			void 0 !== hiddenProp && console.error("<Activity> doesn't accept a hidden prop. Use mode=\"hidden\" instead.\n- <Activity %s>\n+ <Activity %s>", !0 === hiddenProp ? "hidden" : !1 === hiddenProp ? "hidden={false}" : "hidden={...}", hiddenProp ? "mode=\"hidden\"" : "mode=\"visible\"");
5691			nextProps = mountWorkInProgressOffscreenFiber({
5692				mode: nextProps.mode,
5693				children: nextProps.children
5694			}, workInProgress.mode);
5695			nextProps.ref = workInProgress.ref;
5696			workInProgress.child = nextProps;
5697			nextProps.return = workInProgress;
5698			return nextProps;
5699		}
5700		function retryActivityComponentWithoutHydrating(current, workInProgress, renderLanes) {
5701			reconcileChildFibers(workInProgress, current.child, null, renderLanes);
5702			current = mountActivityChildren(workInProgress, workInProgress.pendingProps);
5703			current.flags |= 2;
5704			popSuspenseHandler(workInProgress);
5705			workInProgress.memoizedState = null;
5706			return current;
5707		}
5708		function updateActivityComponent(current, workInProgress, renderLanes) {
5709			var nextProps = workInProgress.pendingProps, didSuspend = 0 !== (workInProgress.flags & 128);
5710			workInProgress.flags &= -129;
5711			if (null === current) {
5712				if (isHydrating) {
5713					if ("hidden" === nextProps.mode) return current = mountActivityChildren(workInProgress, nextProps), workInProgress.lanes = 536870912, current.memoizedState = {
5714						baseLanes: 0,
5715						cachePool: null
5716					}, bailoutOffscreenComponent(null, current);
5717					pushDehydratedActivitySuspenseHandler(workInProgress);
5718					(current = nextHydratableInstance) ? (renderLanes = canHydrateHydrationBoundary(current, rootOrSingletonContext), renderLanes = null !== renderLanes && renderLanes.data === ACTIVITY_START_DATA ? renderLanes : null, null !== renderLanes && (nextProps = {
5719						dehydrated: renderLanes,
5720						treeContext: getSuspendedTreeContext(),
5721						retryLane: 536870912,
5722						hydrationErrors: null
5723					}, workInProgress.memoizedState = nextProps, nextProps = createFiberFromDehydratedFragment(renderLanes), nextProps.return = workInProgress, workInProgress.child = nextProps, hydrationParentFiber = workInProgress, nextHydratableInstance = null)) : renderLanes = null;
5724					if (null === renderLanes) throw warnNonHydratedInstance(workInProgress, current), throwOnHydrationMismatch(workInProgress);
5725					workInProgress.lanes = 536870912;
5726					return null;
5727				}
5728				return mountActivityChildren(workInProgress, nextProps);
5729			}
5730			var prevState = current.memoizedState;
5731			if (null !== prevState) {
5732				var activityInstance = prevState.dehydrated;
5733				pushDehydratedActivitySuspenseHandler(workInProgress);
5734				if (didSuspend) if (workInProgress.flags & 256) workInProgress.flags &= -257, workInProgress = retryActivityComponentWithoutHydrating(current, workInProgress, renderLanes);
5735				else if (null !== workInProgress.memoizedState) workInProgress.child = current.child, workInProgress.flags |= 128, workInProgress = null;
5736				else throw Error("Client rendering an Activity suspended it again. This is a bug in React.");
5737				else if (warnIfHydrating(), 0 !== (renderLanes & 536870912) && markRenderDerivedCause(workInProgress), didReceiveUpdate || propagateParentContextChanges(current, workInProgress, renderLanes, !1), didSuspend = 0 !== (renderLanes & current.childLanes), didReceiveUpdate || didSuspend) {
5738					if (null === currentTreeHiddenStackCursor.current) {
5739						nextProps = workInProgressRoot;
5740						if (null !== nextProps && (activityInstance = getBumpedLaneForHydration(nextProps, renderLanes), 0 !== activityInstance && activityInstance !== prevState.retryLane)) throw prevState.retryLane = activityInstance, enqueueConcurrentRenderForLane(current, activityInstance), scheduleUpdateOnFiber(nextProps, current, activityInstance), SelectiveHydrationException;
5741						renderDidSuspendDelayIfPossible();
5742					}
5743					workInProgress = retryActivityComponentWithoutHydrating(current, workInProgress, renderLanes);
5744				} else current = prevState.treeContext, nextHydratableInstance = getNextHydratable(activityInstance.nextSibling), hydrationParentFiber = workInProgress, isHydrating = !0, hydrationErrors = null, didSuspendOrErrorDEV = !1, hydrationDiffRootDEV = null, rootOrSingletonContext = !1, null !== current && restoreSuspendedTreeContext(workInProgress, current), workInProgress = mountActivityChildren(workInProgress, nextProps), workInProgress.flags |= 134221824;
5745				return workInProgress;
5746			}
5747			prevState = current.child;
5748			nextProps = {
5749				mode: nextProps.mode,
5750				children: nextProps.children
5751			};
5752			0 !== (renderLanes & 536870912) && 0 !== (renderLanes & current.lanes) && markRenderDerivedCause(workInProgress);
5753			current = createWorkInProgress(prevState, nextProps);
5754			current.ref = workInProgress.ref;
5755			workInProgress.child = current;
vendor: 16,192 bytes, lines 5756-5889
5756			current.return = workInProgress;
5757			return current;
5758		}
5759		function markRef(current, workInProgress) {
5760			var ref = workInProgress.ref;
5761			if (null === ref) null !== current && null !== current.ref && (workInProgress.flags |= 4194816);
5762			else {
5763				if ("function" !== typeof ref && "object" !== typeof ref) throw Error("Expected ref to be a function, an object returned by React.createRef(), or undefined/null.");
5764				if (null === current || current.ref !== ref) workInProgress.flags |= 4194816;
5765			}
5766		}
5767		function updateFunctionComponent(current, workInProgress, Component, nextProps, renderLanes) {
5768			if (Component.prototype && "function" === typeof Component.prototype.render) {
5769				var componentName = getComponentNameFromType(Component) || "Unknown";
5770				didWarnAboutBadClass[componentName] || (console.error("The <%s /> component appears to have a render method, but doesn't extend React.Component. This is likely to cause errors. Change %s to extend React.Component instead.", componentName, componentName), didWarnAboutBadClass[componentName] = !0);
5771			}
5772			workInProgress.mode & StrictLegacyMode && ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, null);
5773			null === current && (validateFunctionComponentInDev(workInProgress, workInProgress.type), Component.contextTypes && (componentName = getComponentNameFromType(Component) || "Unknown", didWarnAboutContextTypes[componentName] || (didWarnAboutContextTypes[componentName] = !0, console.error("%s uses the legacy contextTypes API which was removed in React 19. Use React.createContext() with React.useContext() instead. (https://react.dev/link/legacy-context)", componentName))));
5774			prepareToReadContext(workInProgress);
5775			Component = renderWithHooks(current, workInProgress, Component, nextProps, void 0, renderLanes);
5776			nextProps = checkDidRenderIdHook();
5777			if (null !== current && !didReceiveUpdate) return bailoutHooks(current, workInProgress, renderLanes), bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
5778			isHydrating && nextProps && pushMaterializedTreeId(workInProgress);
5779			workInProgress.flags |= 1;
5780			reconcileChildren(current, workInProgress, Component, renderLanes);
5781			return workInProgress.child;
5782		}
5783		function replayFunctionComponent(current, workInProgress, nextProps, Component, secondArg, renderLanes) {
5784			prepareToReadContext(workInProgress);
5785			hookTypesUpdateIndexDev = -1;
5786			ignorePreviousDependencies = null !== current && current.type !== workInProgress.type;
5787			workInProgress.updateQueue = null;
5788			nextProps = renderWithHooksAgain(workInProgress, Component, nextProps, secondArg);
5789			finishRenderingHooks(current, workInProgress);
5790			Component = checkDidRenderIdHook();
5791			if (null !== current && !didReceiveUpdate) return bailoutHooks(current, workInProgress, renderLanes), bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
5792			isHydrating && Component && pushMaterializedTreeId(workInProgress);
5793			workInProgress.flags |= 1;
5794			reconcileChildren(current, workInProgress, nextProps, renderLanes);
5795			return workInProgress.child;
5796		}
5797		function updateClassComponent(current, workInProgress, Component, nextProps, renderLanes) {
5798			switch (shouldErrorImpl(workInProgress)) {
5799				case !1:
5800					var _instance = workInProgress.stateNode, state = new workInProgress.type(workInProgress.memoizedProps, _instance.context).state;
5801					_instance.updater.enqueueSetState(_instance, state, null);
5802					break;
5803				case !0:
5804					workInProgress.flags |= 128;
5805					workInProgress.flags |= 65536;
5806					_instance = Error("Simulated error coming from DevTools");
5807					var lane = renderLanes & -renderLanes;
5808					workInProgress.lanes |= lane;
5809					state = workInProgressRoot;
5810					if (null === state) throw Error("Expected a work-in-progress root. This is a bug in React. Please file an issue.");
5811					lane = createClassErrorUpdate(lane);
5812					initializeClassErrorUpdate(lane, state, workInProgress, createCapturedValueAtFiber(_instance, workInProgress));
5813					enqueueCapturedUpdate(workInProgress, lane);
5814			}
5815			prepareToReadContext(workInProgress);
5816			if (null === workInProgress.stateNode) {
5817				state = emptyContextObject;
5818				_instance = Component.contextType;
5819				"contextType" in Component && null !== _instance && (void 0 === _instance || _instance.$$typeof !== REACT_CONTEXT_TYPE) && !didWarnAboutInvalidateContextType.has(Component) && (didWarnAboutInvalidateContextType.add(Component), lane = void 0 === _instance ? " However, it is set to undefined. This can be caused by a typo or by mixing up named and default imports. This can also happen due to a circular dependency, so try moving the createContext() call to a separate file." : "object" !== typeof _instance ? " However, it is set to a " + typeof _instance + "." : _instance.$$typeof === REACT_CONSUMER_TYPE ? " Did you accidentally pass the Context.Consumer instead?" : " However, it is set to an object with keys {" + Object.keys(_instance).join(", ") + "}.", console.error("%s defines an invalid contextType. contextType should point to the Context object returned by React.createContext().%s", getComponentNameFromType(Component) || "Component", lane));
5820				"object" === typeof _instance && null !== _instance && (state = readContext(_instance));
5821				_instance = new Component(nextProps, state);
5822				if (workInProgress.mode & StrictLegacyMode) {
5823					setIsStrictModeForDevtools(!0);
5824					try {
5825						_instance = new Component(nextProps, state);
5826					} finally {
5827						setIsStrictModeForDevtools(!1);
5828					}
5829				}
5830				state = workInProgress.memoizedState = null !== _instance.state && void 0 !== _instance.state ? _instance.state : null;
5831				_instance.updater = classComponentUpdater;
5832				workInProgress.stateNode = _instance;
5833				_instance._reactInternals = workInProgress;
5834				_instance._reactInternalInstance = fakeInternalInstance;
5835				"function" === typeof Component.getDerivedStateFromProps && null === state && (state = getComponentNameFromType(Component) || "Component", didWarnAboutUninitializedState.has(state) || (didWarnAboutUninitializedState.add(state), console.error("`%s` uses `getDerivedStateFromProps` but its initial state is %s. This is not recommended. Instead, define the initial state by assigning an object to `this.state` in the constructor of `%s`. This ensures that `getDerivedStateFromProps` arguments have a consistent shape.", state, null === _instance.state ? "null" : "undefined", state)));
5836				if ("function" === typeof Component.getDerivedStateFromProps || "function" === typeof _instance.getSnapshotBeforeUpdate) {
5837					var foundWillUpdateName = lane = state = null;
5838					"function" === typeof _instance.componentWillMount && !0 !== _instance.componentWillMount.__suppressDeprecationWarning ? state = "componentWillMount" : "function" === typeof _instance.UNSAFE_componentWillMount && (state = "UNSAFE_componentWillMount");
5839					"function" === typeof _instance.componentWillReceiveProps && !0 !== _instance.componentWillReceiveProps.__suppressDeprecationWarning ? lane = "componentWillReceiveProps" : "function" === typeof _instance.UNSAFE_componentWillReceiveProps && (lane = "UNSAFE_componentWillReceiveProps");
5840					"function" === typeof _instance.componentWillUpdate && !0 !== _instance.componentWillUpdate.__suppressDeprecationWarning ? foundWillUpdateName = "componentWillUpdate" : "function" === typeof _instance.UNSAFE_componentWillUpdate && (foundWillUpdateName = "UNSAFE_componentWillUpdate");
5841					if (null !== state || null !== lane || null !== foundWillUpdateName) {
5842						_instance = getComponentNameFromType(Component) || "Component";
5843						var newApiName = "function" === typeof Component.getDerivedStateFromProps ? "getDerivedStateFromProps()" : "getSnapshotBeforeUpdate()";
5844						didWarnAboutLegacyLifecyclesAndDerivedState.has(_instance) || (didWarnAboutLegacyLifecyclesAndDerivedState.add(_instance), console.error("Unsafe legacy lifecycles will not be called for components using new component APIs.\n\n%s uses %s but also contains the following legacy lifecycles:%s%s%s\n\nThe above lifecycles should be removed. Learn more about this warning here:\nhttps://react.dev/link/unsafe-component-lifecycles", _instance, newApiName, null !== state ? "\n  " + state : "", null !== lane ? "\n  " + lane : "", null !== foundWillUpdateName ? "\n  " + foundWillUpdateName : ""));
5845					}
5846				}
5847				_instance = workInProgress.stateNode;
5848				state = getComponentNameFromType(Component) || "Component";
5849				_instance.render || (Component.prototype && "function" === typeof Component.prototype.render ? console.error("No `render` method found on the %s instance: did you accidentally return an object from the constructor?", state) : console.error("No `render` method found on the %s instance: you may have forgotten to define `render`.", state));
5850				!_instance.getInitialState || _instance.getInitialState.isReactClassApproved || _instance.state || console.error("getInitialState was defined on %s, a plain JavaScript class. This is only supported for classes created using React.createClass. Did you mean to define a state property instead?", state);
5851				_instance.getDefaultProps && !_instance.getDefaultProps.isReactClassApproved && console.error("getDefaultProps was defined on %s, a plain JavaScript class. This is only supported for classes created using React.createClass. Use a static property to define defaultProps instead.", state);
5852				_instance.contextType && console.error("contextType was defined as an instance property on %s. Use a static property to define contextType instead.", state);
5853				Component.childContextTypes && !didWarnAboutChildContextTypes.has(Component) && (didWarnAboutChildContextTypes.add(Component), console.error("%s uses the legacy childContextTypes API which was removed in React 19. Use React.createContext() instead. (https://react.dev/link/legacy-context)", state));
5854				Component.contextTypes && !didWarnAboutContextTypes$1.has(Component) && (didWarnAboutContextTypes$1.add(Component), console.error("%s uses the legacy contextTypes API which was removed in React 19. Use React.createContext() with static contextType instead. (https://react.dev/link/legacy-context)", state));
5855				"function" === typeof _instance.componentShouldUpdate && console.error("%s has a method called componentShouldUpdate(). Did you mean shouldComponentUpdate()? The name is phrased as a question because the function is expected to return a value.", state);
5856				Component.prototype && Component.prototype.isPureReactComponent && "undefined" !== typeof _instance.shouldComponentUpdate && console.error("%s has a method called shouldComponentUpdate(). shouldComponentUpdate should not be used when extending React.PureComponent. Please extend React.Component if shouldComponentUpdate is used.", getComponentNameFromType(Component) || "A pure component");
5857				"function" === typeof _instance.componentDidUnmount && console.error("%s has a method called componentDidUnmount(). But there is no such lifecycle method. Did you mean componentWillUnmount()?", state);
5858				"function" === typeof _instance.componentDidReceiveProps && console.error("%s has a method called componentDidReceiveProps(). But there is no such lifecycle method. If you meant to update the state in response to changing props, use componentWillReceiveProps(). If you meant to fetch data or run side-effects or mutations after React has updated the UI, use componentDidUpdate().", state);
5859				"function" === typeof _instance.componentWillRecieveProps && console.error("%s has a method called componentWillRecieveProps(). Did you mean componentWillReceiveProps()?", state);
5860				"function" === typeof _instance.UNSAFE_componentWillRecieveProps && console.error("%s has a method called UNSAFE_componentWillRecieveProps(). Did you mean UNSAFE_componentWillReceiveProps()?", state);
5861				lane = _instance.props !== nextProps;
5862				void 0 !== _instance.props && lane && console.error("When calling super() in `%s`, make sure to pass up the same props that your component's constructor was passed.", state);
5863				_instance.defaultProps && console.error("Setting defaultProps as an instance property on %s is not supported and will be ignored. Instead, define defaultProps as a static property on %s.", state, state);
5864				"function" !== typeof _instance.getSnapshotBeforeUpdate || "function" === typeof _instance.componentDidUpdate || didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.has(Component) || (didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.add(Component), console.error("%s: getSnapshotBeforeUpdate() should be used with componentDidUpdate(). This component defines getSnapshotBeforeUpdate() only.", getComponentNameFromType(Component)));
5865				"function" === typeof _instance.getDerivedStateFromProps && console.error("%s: getDerivedStateFromProps() is defined as an instance method and will be ignored. Instead, declare it as a static method.", state);
5866				"function" === typeof _instance.getDerivedStateFromError && console.error("%s: getDerivedStateFromError() is defined as an instance method and will be ignored. Instead, declare it as a static method.", state);
5867				"function" === typeof Component.getSnapshotBeforeUpdate && console.error("%s: getSnapshotBeforeUpdate() is defined as a static method and will be ignored. Instead, declare it as an instance method.", state);
5868				(lane = _instance.state) && ("object" !== typeof lane || isArrayImpl(lane)) && console.error("%s.state: must be set to an object or null", state);
5869				"function" === typeof _instance.getChildContext && "object" !== typeof Component.childContextTypes && console.error("%s.getChildContext(): childContextTypes must be defined in order to use getChildContext().", state);
5870				_instance = workInProgress.stateNode;
5871				_instance.props = nextProps;
5872				_instance.state = workInProgress.memoizedState;
5873				_instance.refs = {};
5874				initializeUpdateQueue(workInProgress);
5875				state = Component.contextType;
5876				_instance.context = "object" === typeof state && null !== state ? readContext(state) : emptyContextObject;
5877				_instance.state === nextProps && (state = getComponentNameFromType(Component) || "Component", didWarnAboutDirectlyAssigningPropsToState.has(state) || (didWarnAboutDirectlyAssigningPropsToState.add(state), console.error("%s: It is not recommended to assign props directly to state because updates to props won't be reflected in state. In most cases, it is better to use props directly.", state)));
5878				workInProgress.mode & StrictLegacyMode && ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, _instance);
5879				ReactStrictModeWarnings.recordUnsafeLifecycleWarnings(workInProgress, _instance);
5880				_instance.state = workInProgress.memoizedState;
5881				state = Component.getDerivedStateFromProps;
5882				"function" === typeof state && (applyDerivedStateFromProps(workInProgress, Component, state, nextProps), _instance.state = workInProgress.memoizedState);
5883				"function" === typeof Component.getDerivedStateFromProps || "function" === typeof _instance.getSnapshotBeforeUpdate || "function" !== typeof _instance.UNSAFE_componentWillMount && "function" !== typeof _instance.componentWillMount || (state = _instance.state, "function" === typeof _instance.componentWillMount && _instance.componentWillMount(), "function" === typeof _instance.UNSAFE_componentWillMount && _instance.UNSAFE_componentWillMount(), state !== _instance.state && (console.error("%s.componentWillMount(): Assigning directly to this.state is deprecated (except inside a component's constructor). Use setState instead.", getComponentNameFromFiber(workInProgress) || "Component"), classComponentUpdater.enqueueReplaceState(_instance, _instance.state, null)), processUpdateQueue(workInProgress, nextProps, _instance, renderLanes), suspendIfUpdateReadFromEntangledAsyncAction(), _instance.state = workInProgress.memoizedState);
5884				"function" === typeof _instance.componentDidMount && (workInProgress.flags |= 4194308);
5885				(workInProgress.mode & StrictEffectsMode) !== NoMode && (workInProgress.flags |= 268435456);
5886				_instance = !0;
5887			} else if (null === current) {
5888				_instance = workInProgress.stateNode;
5889				var unresolvedOldProps = workInProgress.memoizedProps;
vendor: 6,869 bytes, lines 5890-5947
5890				lane = resolveClassComponentProps(Component, unresolvedOldProps);
5891				_instance.props = lane;
5892				var oldContext = _instance.context;
5893				foundWillUpdateName = Component.contextType;
5894				state = emptyContextObject;
5895				"object" === typeof foundWillUpdateName && null !== foundWillUpdateName && (state = readContext(foundWillUpdateName));
5896				newApiName = Component.getDerivedStateFromProps;
5897				foundWillUpdateName = "function" === typeof newApiName || "function" === typeof _instance.getSnapshotBeforeUpdate;
5898				unresolvedOldProps = workInProgress.pendingProps !== unresolvedOldProps;
5899				foundWillUpdateName || "function" !== typeof _instance.UNSAFE_componentWillReceiveProps && "function" !== typeof _instance.componentWillReceiveProps || (unresolvedOldProps || oldContext !== state) && callComponentWillReceiveProps(workInProgress, _instance, nextProps, state);
5900				hasForceUpdate = !1;
5901				var oldState = workInProgress.memoizedState;
5902				_instance.state = oldState;
5903				processUpdateQueue(workInProgress, nextProps, _instance, renderLanes);
5904				suspendIfUpdateReadFromEntangledAsyncAction();
5905				oldContext = workInProgress.memoizedState;
5906				unresolvedOldProps || oldState !== oldContext || hasForceUpdate ? ("function" === typeof newApiName && (applyDerivedStateFromProps(workInProgress, Component, newApiName, nextProps), oldContext = workInProgress.memoizedState), (lane = hasForceUpdate || checkShouldComponentUpdate(workInProgress, Component, lane, nextProps, oldState, oldContext, state)) ? (foundWillUpdateName || "function" !== typeof _instance.UNSAFE_componentWillMount && "function" !== typeof _instance.componentWillMount || ("function" === typeof _instance.componentWillMount && _instance.componentWillMount(), "function" === typeof _instance.UNSAFE_componentWillMount && _instance.UNSAFE_componentWillMount()), "function" === typeof _instance.componentDidMount && (workInProgress.flags |= 4194308), (workInProgress.mode & StrictEffectsMode) !== NoMode && (workInProgress.flags |= 268435456)) : ("function" === typeof _instance.componentDidMount && (workInProgress.flags |= 4194308), (workInProgress.mode & StrictEffectsMode) !== NoMode && (workInProgress.flags |= 268435456), workInProgress.memoizedProps = nextProps, workInProgress.memoizedState = oldContext), _instance.props = nextProps, _instance.state = oldContext, _instance.context = state, _instance = lane) : ("function" === typeof _instance.componentDidMount && (workInProgress.flags |= 4194308), (workInProgress.mode & StrictEffectsMode) !== NoMode && (workInProgress.flags |= 268435456), _instance = !1);
5907			} else {
5908				_instance = workInProgress.stateNode;
5909				cloneUpdateQueue(current, workInProgress);
5910				state = workInProgress.memoizedProps;
5911				foundWillUpdateName = resolveClassComponentProps(Component, state);
5912				_instance.props = foundWillUpdateName;
5913				newApiName = workInProgress.pendingProps;
5914				oldState = _instance.context;
5915				oldContext = Component.contextType;
5916				lane = emptyContextObject;
5917				"object" === typeof oldContext && null !== oldContext && (lane = readContext(oldContext));
5918				unresolvedOldProps = Component.getDerivedStateFromProps;
5919				(oldContext = "function" === typeof unresolvedOldProps || "function" === typeof _instance.getSnapshotBeforeUpdate) || "function" !== typeof _instance.UNSAFE_componentWillReceiveProps && "function" !== typeof _instance.componentWillReceiveProps || (state !== newApiName || oldState !== lane) && callComponentWillReceiveProps(workInProgress, _instance, nextProps, lane);
5920				hasForceUpdate = !1;
5921				oldState = workInProgress.memoizedState;
5922				_instance.state = oldState;
5923				processUpdateQueue(workInProgress, nextProps, _instance, renderLanes);
5924				suspendIfUpdateReadFromEntangledAsyncAction();
5925				var newState = workInProgress.memoizedState;
5926				state !== newApiName || oldState !== newState || hasForceUpdate || null !== current && null !== current.dependencies && checkIfContextChanged(current.dependencies) ? ("function" === typeof unresolvedOldProps && (applyDerivedStateFromProps(workInProgress, Component, unresolvedOldProps, nextProps), newState = workInProgress.memoizedState), (foundWillUpdateName = hasForceUpdate || checkShouldComponentUpdate(workInProgress, Component, foundWillUpdateName, nextProps, oldState, newState, lane) || null !== current && null !== current.dependencies && checkIfContextChanged(current.dependencies)) ? (oldContext || "function" !== typeof _instance.UNSAFE_componentWillUpdate && "function" !== typeof _instance.componentWillUpdate || ("function" === typeof _instance.componentWillUpdate && _instance.componentWillUpdate(nextProps, newState, lane), "function" === typeof _instance.UNSAFE_componentWillUpdate && _instance.UNSAFE_componentWillUpdate(nextProps, newState, lane)), "function" === typeof _instance.componentDidUpdate && (workInProgress.flags |= 4), "function" === typeof _instance.getSnapshotBeforeUpdate && (workInProgress.flags |= 1024)) : ("function" !== typeof _instance.componentDidUpdate || state === current.memoizedProps && oldState === current.memoizedState || (workInProgress.flags |= 4), "function" !== typeof _instance.getSnapshotBeforeUpdate || state === current.memoizedProps && oldState === current.memoizedState || (workInProgress.flags |= 1024), workInProgress.memoizedProps = nextProps, workInProgress.memoizedState = newState), _instance.props = nextProps, _instance.state = newState, _instance.context = lane, _instance = foundWillUpdateName) : ("function" !== typeof _instance.componentDidUpdate || state === current.memoizedProps && oldState === current.memoizedState || (workInProgress.flags |= 4), "function" !== typeof _instance.getSnapshotBeforeUpdate || state === current.memoizedProps && oldState === current.memoizedState || (workInProgress.flags |= 1024), _instance = !1);
5927			}
5928			lane = _instance;
5929			markRef(current, workInProgress);
5930			state = 0 !== (workInProgress.flags & 128);
5931			if (lane || state) {
5932				lane = workInProgress.stateNode;
5933				setCurrentFiber(workInProgress);
5934				if (state && "function" !== typeof Component.getDerivedStateFromError) Component = null, profilerStartTime = -1;
5935				else if (Component = callRenderInDEV(lane), workInProgress.mode & StrictLegacyMode) {
5936					setIsStrictModeForDevtools(!0);
5937					try {
5938						callRenderInDEV(lane);
5939					} finally {
5940						setIsStrictModeForDevtools(!1);
5941					}
5942				}
5943				workInProgress.flags |= 1;
5944				null !== current && state ? (workInProgress.child = reconcileChildFibers(workInProgress, current.child, null, renderLanes), workInProgress.child = reconcileChildFibers(workInProgress, null, Component, renderLanes)) : reconcileChildren(current, workInProgress, Component, renderLanes);
5945				workInProgress.memoizedState = lane.state;
5946				current = workInProgress.child;
5947			} else current = bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
5948			renderLanes = workInProgress.stateNode;
5949			_instance && renderLanes.props !== nextProps && (didWarnAboutReassigningProps || console.error("It looks like %s is reassigning its own `this.props` while rendering. This is not supported and can lead to confusing bugs.", getComponentNameFromFiber(workInProgress) || "a component"), didWarnAboutReassigningProps = !0);
5950			return current;
5951		}
5952		function mountHostRootWithoutHydrating(current, workInProgress, nextChildren, renderLanes) {
5953			resetHydrationState();
5954			workInProgress.flags |= 256;
5955			reconcileChildren(current, workInProgress, nextChildren, renderLanes);
5956			return workInProgress.child;
5957		}
5958		function validateFunctionComponentInDev(workInProgress, Component) {
5959			Component && Component.childContextTypes && console.error("childContextTypes cannot be defined on a function component.\n  %s.childContextTypes = ...", Component.displayName || Component.name || "Component");
5960			"function" === typeof Component.getDerivedStateFromProps && (workInProgress = getComponentNameFromType(Component) || "Unknown", didWarnAboutGetDerivedStateOnFunctionComponent[workInProgress] || (console.error("%s: Function components do not support getDerivedStateFromProps.", workInProgress), didWarnAboutGetDerivedStateOnFunctionComponent[workInProgress] = !0));
5961			"object" === typeof Component.contextType && null !== Component.contextType && (Component = getComponentNameFromType(Component) || "Unknown", didWarnAboutContextTypeOnFunctionComponent[Component] || (console.error("%s: Function components do not support contextType.", Component), didWarnAboutContextTypeOnFunctionComponent[Component] = !0));
5962		}
5963		function mountSuspenseOffscreenState(renderLanes) {
5964			return {
5965				baseLanes: renderLanes,
5966				cachePool: getSuspendedCache()
5967			};
5968		}
5969		function getRemainingWorkInPrimaryTree(current, primaryTreeDidDefer, renderLanes) {
5970			current = null !== current ? current.childLanes & ~renderLanes : 0;
5971			primaryTreeDidDefer && (current |= workInProgressDeferredLane);
5972			return current;
5973		}
5974		function updateSuspenseComponent(current, workInProgress, renderLanes) {
5975			var nextProps = workInProgress.pendingProps;
5976			shouldSuspendImpl(workInProgress) && (workInProgress.flags |= 128);
5977			var showFallback = !1, didSuspend = 0 !== (workInProgress.flags & 128), JSCompiler_temp;
5978			(JSCompiler_temp = didSuspend) || (JSCompiler_temp = null !== current && null === current.memoizedState ? !1 : 0 !== (suspenseStackCursor.current & ForceSuspenseFallback));
5979			JSCompiler_temp && (showFallback = !0, workInProgress.flags &= -129);
5980			JSCompiler_temp = 0 !== (workInProgress.flags & 32);
5981			workInProgress.flags &= -33;
5982			if (null === current) {
5983				if (isHydrating) {
5984					showFallback ? pushPrimaryTreeSuspenseHandler(workInProgress) : reuseSuspenseHandlerOnStack(workInProgress);
5985					(current = nextHydratableInstance) ? (renderLanes = canHydrateHydrationBoundary(current, rootOrSingletonContext), renderLanes = null !== renderLanes && renderLanes.data !== ACTIVITY_START_DATA ? renderLanes : null, null !== renderLanes && (JSCompiler_temp = {
5986						dehydrated: renderLanes,
5987						treeContext: getSuspendedTreeContext(),
5988						retryLane: 536870912,
5989						hydrationErrors: null
5990					}, workInProgress.memoizedState = JSCompiler_temp, JSCompiler_temp = createFiberFromDehydratedFragment(renderLanes), JSCompiler_temp.return = workInProgress, workInProgress.child = JSCompiler_temp, hydrationParentFiber = workInProgress, nextHydratableInstance = null)) : renderLanes = null;
5991					if (null === renderLanes) throw warnNonHydratedInstance(workInProgress, current), throwOnHydrationMismatch(workInProgress);
5992					isSuspenseInstanceFallback(renderLanes) ? workInProgress.lanes = 32 : workInProgress.lanes = 536870912;
5993					return null;
5994				}
5995				didSuspend = nextProps.children;
5996				nextProps = nextProps.fallback;
5997				if (showFallback) return reuseSuspenseHandlerOnStack(workInProgress), showFallback = workInProgress.mode, didSuspend = mountWorkInProgressOffscreenFiber({
5998					mode: "hidden",
5999					children: didSuspend
6000				}, showFallback), nextProps = createFiberFromFragment(nextProps, showFallback, renderLanes, null), didSuspend.return = w
vendor: 4,884 bytes, lines 6000-6064
6000orkInProgress, nextProps.return = workInProgress, didSuspend.sibling = nextProps, workInProgress.child = didSuspend, nextProps = workInProgress.child, nextProps.memoizedState = mountSuspenseOffscreenState(renderLanes), nextProps.childLanes = getRemainingWorkInPrimaryTree(current, JSCompiler_temp, renderLanes), workInProgress.memoizedState = SUSPENDED_MARKER, bailoutOffscreenComponent(null, nextProps);
6001				pushPrimaryTreeSuspenseHandler(workInProgress);
6002				return mountSuspensePrimaryChildren(workInProgress, didSuspend);
6003			}
6004			var prevState = current.memoizedState;
6005			if (null !== prevState) {
6006				var _dehydrated2 = prevState.dehydrated;
6007				if (null !== _dehydrated2) return updateDehydratedSuspenseComponent(current, workInProgress, didSuspend, JSCompiler_temp, nextProps, _dehydrated2, prevState, renderLanes);
6008			}
6009			if (showFallback) return reuseSuspenseHandlerOnStack(workInProgress), showFallback = nextProps.fallback, didSuspend = workInProgress.mode, prevState = current.child, _dehydrated2 = prevState.sibling, nextProps = createWorkInProgress(prevState, {
6010				mode: "hidden",
6011				children: nextProps.children
6012			}), nextProps.subtreeFlags = prevState.subtreeFlags & 1206910976, null !== _dehydrated2 ? showFallback = createWorkInProgress(_dehydrated2, showFallback) : (showFallback = createFiberFromFragment(showFallback, didSuspend, renderLanes, null), showFallback.flags |= 2), showFallback.return = workInProgress, nextProps.return = workInProgress, nextProps.sibling = showFallback, workInProgress.child = nextProps, bailoutOffscreenComponent(null, nextProps), nextProps = workInProgress.child, showFallback = current.child.memoizedState, null === showFallback ? showFallback = mountSuspenseOffscreenState(renderLanes) : (didSuspend = showFallback.cachePool, null !== didSuspend ? (prevState = CacheContext._currentValue, didSuspend = didSuspend.parent !== prevState ? {
6013				parent: prevState,
6014				pool: prevState
6015			} : didSuspend) : didSuspend = getSuspendedCache(), showFallback = {
6016				baseLanes: showFallback.baseLanes | renderLanes,
6017				cachePool: didSuspend
6018			}), nextProps.memoizedState = showFallback, nextProps.childLanes = getRemainingWorkInPrimaryTree(current, JSCompiler_temp, renderLanes), workInProgress.memoizedState = SUSPENDED_MARKER, bailoutOffscreenComponent(current.child, nextProps);
6019			null !== prevState && (renderLanes & 62914560) === renderLanes && 0 !== (renderLanes & current.lanes) && markRenderDerivedCause(workInProgress);
6020			pushPrimaryTreeSuspenseHandler(workInProgress);
6021			renderLanes = current.child;
6022			current = renderLanes.sibling;
6023			renderLanes = createWorkInProgress(renderLanes, {
6024				mode: "visible",
6025				children: nextProps.children
6026			});
6027			renderLanes.return = workInProgress;
6028			renderLanes.sibling = null;
6029			null !== current && (JSCompiler_temp = workInProgress.deletions, null === JSCompiler_temp ? (workInProgress.deletions = [current], workInProgress.flags |= 16) : JSCompiler_temp.push(current));
6030			workInProgress.child = renderLanes;
6031			workInProgress.memoizedState = null;
6032			return renderLanes;
6033		}
6034		function mountSuspensePrimaryChildren(workInProgress, primaryChildren) {
6035			primaryChildren = mountWorkInProgressOffscreenFiber({
6036				mode: "visible",
6037				children: primaryChildren
6038			}, workInProgress.mode);
6039			primaryChildren.return = workInProgress;
6040			return workInProgress.child = primaryChildren;
6041		}
6042		function mountWorkInProgressOffscreenFiber(offscreenProps, mode) {
6043			offscreenProps = createFiber(22, offscreenProps, null, mode);
6044			offscreenProps.lanes = 0;
6045			return offscreenProps;
6046		}
6047		function retrySuspenseComponentWithoutHydrating(current, workInProgress, renderLanes) {
6048			reconcileChildFibers(workInProgress, current.child, null, renderLanes);
6049			current = mountSuspensePrimaryChildren(workInProgress, workInProgress.pendingProps.children);
6050			current.flags |= 2;
6051			workInProgress.memoizedState = null;
6052			return current;
6053		}
6054		function updateDehydratedSuspenseComponent(current, workInProgress, didSuspend, didPrimaryChildrenDefer, nextProps, suspenseInstance, suspenseState, renderLanes) {
6055			if (didSuspend) {
6056				if (workInProgress.flags & 256) return pushPrimaryTreeSuspenseHandler(workInProgress), workInProgress.flags &= -257, retrySuspenseComponentWithoutHydrating(current, workInProgress, renderLanes);
6057				if (null !== workInProgress.memoizedState) return reuseSuspenseHandlerOnStack(workInProgress), workInProgress.child = current.child, workInProgress.flags |= 128, null;
6058				reuseSuspenseHandlerOnStack(workInProgress);
6059				var fallbackChildren = nextProps.fallback, fiberMode = workInProgress.mode, primaryChildFragment = mountWorkInProgressOffscreenFiber({
6060					mode: "visible",
6061					children: nextProps.children
6062				}, fiberMode);
6063				fallbackChildren = createFiberFromFragment(fallbackChildren, fiberMode, renderLanes, null);
6064				fallbackChildren.flags |= 2;
6065				primaryChildFragment.return = workInProgress;
6066				fallbackChildren.return = workInProgress;
6067				primaryChildFragment.sibling = fallbackChildren;
6068				workInProgress.child = primaryChildFragment;
6069				reconcileChildFibers(workInProgress, current.child, null, renderLanes);
6070				fallbackChildren = workInProgress.child;
6071				fallbackChildren.memoizedState = mountSuspenseOffscreenState(renderLanes);
6072				fallbackChildren.childLanes = getRemainingWorkInPrimaryTree(current, didPrimaryChildrenDefer, renderLanes);
6073				workInProgress.memoizedState = SUSPENDED_MARKER;
6074				return bailoutOffscreenComponent(null, fallbackChildren);
6075			}
6076			pushPrimaryTreeSuspenseHandler(workInProgress);
6077			warnIfHydrating();
6078			0 !== (renderLanes & 536870912) && markRenderDerivedCause(workInProgress);
6079			if (isSuspenseInstanceFallback(suspenseInstance)) {
6080				didPrimaryChildrenDefer = suspenseInstance.nextSibling && suspenseInstance.nextSibling.dataset;
6081				if (didPrimaryChildrenDefer) {
6082					fallbackChildren = didPrimaryChildrenDefer.dgst;
6083					var message = didPrimaryChildrenDefer.msg;
6084					fiberMode = didPrimaryChildrenDefer.stck;
6085					primaryChildFragment = didPrimaryChildrenDefer.cstck;
6086				}
6087				suspenseInstance = message;
6088				suspenseState = fallbackChildren;
6089				nextProps = fiberMode;
6090				didPrimaryChildrenDefer = primaryChildFragment;
6091				fallbackChildren = suspenseState;
6092				fiberMode = suspenseInstance;
6093				primaryChildFragment = nextProps;
6094				nextProps = didPrimaryChildrenDefer;
6095				fallbackChildren !== REACT_RECOVERABLE_DIGEST && (didPrimaryChildrenDefer = fiberMode ? Error(fiberMode) : Error("The server could not finish this Suspense boundary, likely due to an error during server rendering. Switched to client rendering."), didPrimaryChildrenDefer.stack = primaryChildFragment || "", didPrimaryChildrenDefer.digest = fallbackChildren, fallbackChildren = void 0 === nextProps ? null : nextProps, fiberMode = {
6096					value: didPrimaryChildrenDefer,
6097					source: null,
6098					stack: fallbackChildren
6099				}, "string" === typeof fallbackChildren && CapturedStacks.set(didPrimaryChildrenDefer, fiberMode), queueHydrationError(fiberMode));
6100				return retrySuspenseComponentWithoutHydrating(current, workInProgress, renderLanes);
6101			}
6102			didReceiveUpdate || propagateParentContextChanges(current, workInProgress, renderLanes, !1);
6103			didPrimaryChildrenDefer = 0 !== (renderLanes & current.childLanes);
6104			if (didReceiveUpdate || didPrimaryChildrenDefer) {
6105				if (null !== currentTreeHiddenStackCursor.current) return retrySuspenseComponentWithoutHydrating(current, workInProgress, renderLanes);
6106				didPrimaryChildrenDefer = workInProgressRoot;
6107				if (null !== didPrimaryChildrenDefer && (fallbackChildren = getBumpedLaneForHydration(didPrimaryChildrenDefer, renderLanes), 0 !== fallbackChildren && fallbackChildren !== suspenseState.retryLane)) throw suspenseState.retryLane = fallbackChildren, enqueueConcurrentRenderForLane(current, fallbackChildren), scheduleUpdateOnFiber(didPrimaryChildrenDefer, current, fallbackChildren), SelectiveHydrationException;
6108				isSuspenseInstancePending(suspenseInstance) || renderDidSuspendDelayIfPossible();
6109				return retrySuspenseComponentWithoutHydrating(current, workInProgress, renderLanes);
6110			}
6111			if (isSuspenseInstancePending(suspenseInstance)) return workInProgress.flags |= 192, workInProgress.child = current.child, null;
6112			current = suspenseState.treeContext;
6113			nextHydratableInstance = getNextHydratable(suspenseInstance.nextSibling);
6114			hydrationParentFiber = workInProgress;
6115			isHydrating = !0;
6116			hydrationErrors = null;
6117			didSuspendOrErrorDEV = !1;
6118			hydrationDiffRootDEV = null;
6119			rootOrSingletonContext = !1;
6120			null !== current && restoreSuspendedTreeContext(workInProgress, current);
6121			workInProgress = mountSuspensePrimaryChildren(workInProgress, nextProps.children);
6122			workInProgress.flags |= 134221824;
6123			return workInProgress;
6124		}
6125		function scheduleSuspenseWorkOnFiber(fiber, renderLanes, propagationRoot) {
6126			fiber.lanes |= renderLanes;
6127			var alternate = fiber.alternate;
6128			null !== alternate && (alternate.lanes |= renderLanes);
6129			scheduleContextWorkOnParentPath(fiber.return, renderLanes, propagationRoot);
6130		}
6131		function findLastContentRow(firstChild) {
6132			for (var lastContentRow = null; null !== firstChild;) {
6133				var currentRow = firstChild.alternate;
6134				null !== currentRow && null === findFirstSuspended(currentRow) && (lastContentRow = firstChild);
6135				firstChild = firstChild.sibling;
6136			}
6137			return lastContentRow;
6138		}
6139		function initSuspenseListRenderState(workInProgress, isBackwards, tail, lastContentRow, tailMode, treeForkCount) {
6140			var renderState = workInProgress.memoizedState;
6141			null === renderState ? workInProgress.memoizedState = {
6142				isBackwards,
6143				rendering: null,
6144				renderingStartTime: 0,
6145				last: lastContentRow,
6146				tail,
6147				tailMode,
6148				treeForkCount
6149			} : (renderState.isBackwards = isBackwards, renderState.rendering = null, renderState.renderingStartTime = 0, renderState.last = lastContentRow, renderState.tail = tail, renderState.tailMode = tailMode, renderState.treeForkCount = treeForkCount);
6150		}
6151		function reverseChildren(fiber) {
6152			var row = fiber.child;
6153			for (fiber.child = null; null !== row;) {
6154				var nextRow = row.sibling;
6155				row.sibling = fiber.child;
6156				fiber.child = row;
6157				row = nextRow;
6158			}
6159		}
6160		function updateSuspenseListComponent(current, workInProgress, renderLanes) {
6161			var nextProps = workInProgress.pendingProps, revealOrder = nextProps.revealOrder, tailMode = nextProps.tail, newChildren = nextProps.children, suspenseContext = suspenseStackCursor.current;
6162			if (workInProgress.flags & 128) return pushSuspenseListContext(workInProgress, suspenseContext), null;
6163			(nextProps = 0 !== (suspenseContext & ForceSuspenseFallback)) ? (suspenseContext = suspenseContext & SubtreeSuspenseContextMask | ForceSuspenseFallback, workInProgress.flags |= 128) : suspenseContext &= SubtreeSuspenseContextMask;
6164			pushSuspenseListContext(workInProgress, suspenseContext);
6165			suspenseContext = null == revealOrder ? "null" : revealOrder;
6166			if (null != revealOrder && "forwards" !== revealOrder && "backwards" !== revealOrder && "unstable_legacy-backwards" !== revealOrder && "together" !== revealOrder && "independent" !== revealOrder && !didWarnAboutRevealOrder[suspenseContext]) if (didWarnAboutRevealOrder[suspenseContext] = !0, "string" === typeof revealOrder) switch (revealOrder.toLowerCase()) {
6167				case "together":
6168				case "forwards":
6169				case "backwards":
6170				case "independent":
6171					console.error("\"%s\" is not a valid value for revealOrder on <SuspenseList />. Use lowercase \"%s\" instead.", revealOrder, revealOrder.toLowerCase());
6172					break;
6173				case "forward":
6174				case "backward":
6175					console.error("\"%s\" is not a valid value for revealOrder on <SuspenseList />. React uses the -s suffix in the spelling. Use \"%ss\" instead.", revealOrder, revealOrder.toLowerCase());
6176					break;
6177				default: console.error("\"%s\" is not a supported revealOrder on <SuspenseList />. Did you mean \"independent\", \"together\", \"forwards\" or \"backwards\"?", revealOrder);
6178			}
6179			else console.error("%s is not a supported value for revealOrder on <SuspenseList />. Did you mean \"independent\", \"together\", \"forwards\" or \"backwards\"?", revealOrder);
6180			suspenseContext = null == tailMode ? "null" : tailMode;
6181			didWarnAboutTailOptions[suspenseContext] || null == tailMode || ("visible" !== tailMode && "collapsed" !== tailMode && "hidden" !== tailMode ? (didWarnAboutTailOptions[suspenseContext] = !0, console.error("\"%s\" is not a supported value for tail on <SuspenseList />. Did you mean \"visible\", \"collapsed\" or \"hidden\"?", tailMode)) : null != revealOrder && "forwards" !== revealOrder && "backwards" !== revealOrder && "unstable_legacy-backwards" !== revealOrder && (didWarnAboutTailOptions[suspenseContext] = !0, console.error("<SuspenseList tail=\"%s\" /> is only valid if revealOrder is \"forwards\" (default) or \"backwards\". Did you mean to specify revealOrder=\"forwards\"?", tailMode)));
6182			a: if ((null == revealOrder || "forwards" === revealOrder || "backwards" === revealOrder || "unstable_legacy-backwards" === revealOrder) && void 0 !== newChildren && null !== newChildren && !1 !== newChildren) if (isArrayImpl(newChildren)) {
6183				for (suspenseContext = 0; suspenseContext < newChildren.length; suspenseContext++) if (!validateSuspenseListNestedChild(newChildren[suspenseContext], suspenseContext)) break a;
6184			} else if (suspenseContext = getIteratorFn(newChildren), "function" === typeof suspenseContext) {
6185				if (suspenseContext = suspenseContext.call(newChildren)) for (var step = suspenseContext.next(), _i = 0; !step.done; step = suspenseContext.next()) {
6186					if (!validateSuspenseListNestedChild(step.value, _i)) break a;
6187					_i++;
6188				}
6189			} else console.error("A single row was passed to a <SuspenseList revealOrder=\"%s\" />. This is not useful since it needs multiple rows. Did you mean to pass multiple children or an array?", revealOrder);
6190			"backwards" === revealOrder && null !== current ? (reverseChildren(current), reconcileChildren(current, workInProgress, newChildren, renderLanes), reverseChildren(current)) : reconcileChildren(current, workInProgress, newChildren, renderLanes);
6191			isHydrating ? (warnIfNotHydrating(), newChildren = treeForkCount) : newChildren = 0;
6192			if (!nextProps && null !== current && 0 !== (current.flags & 128)) a: for (current = workInProgress.child; null !== current;) {
6193				if (13 === current.tag) null !== current.memoizedState && scheduleSuspenseWorkOnFiber(current, renderLanes, workInProgress);
6194				else if (19 === current.tag) scheduleSuspenseWorkOnFiber(current, renderLanes, workInProgress);
6195				else if (null !== current.child) {
6196					current.child.return = current;
6197					current = current.child;
6198					continue;
6199				}
6200				if (current === workInProgress) break a;
6201				for (; null === current.sibling;) {
6202					if (null === current.return || current.return === workInProgress) break a;
6203					current = current.return;
6204				}
6205				current.sibling.return = current.return;
6206				current = current.sibling;
6207			}
6208			switch (revealOrder) {
6209				case "backwards":
6210					renderLanes = findLastContentRow(workInProgress.child);
6211					null === renderLanes ? (revealOrder = workInProgress.child, workInProgress.child = null) : (revealOrder = renderLanes.sibling, renderLanes.sibling = null, reverseChildren(workInProgress));
6212					initSuspenseListRenderState(workInProgress, !0, revealOrder, null, tailMode, newChildren);
6213					break;
6214				case "unstable_legacy-backwards":
6215					renderLanes = null;
6216					revealOrder = workInProgress.child;
6217					for (workInProgress.child = null; null !== revealOrder;) {
6218						current = revealOrder.alternate;
6219						if (null !== current && null === findFirstSuspended(current)) {
6220							workInProgress.child = revealOrder;
6221							break;
6222						}
6223						current = revealOrder.sibling;
6224						revealOrder.sibling = renderLanes;
6225						renderLanes = revealOrder;
6226						revealOrder = current;
6227					}
6228					initSuspenseListRenderState(workInProgress, !0, renderLanes, null, tailMode, newChildren);
6229					break;
6230				case "together":
6231					initSuspenseListRenderState(workInProgress, !1, null, null, void 0, newChildren);
6232					break;
6233				case "independent":
6234					workInProgress.memoizedState = null;
6235					break;
6236				default: renderLanes = findLastContentRow(workInProgress.child), null === renderLanes ? (revealOrder = workInProgress.child, workInProgress.child = null) : (revealOrder = renderLanes.sibling, renderLanes.sibling = null), initSuspenseListRenderState(workInProgress, !1, revealOrder, renderLanes, tailMode, newChildren);
6237			}
6238			return workInProgress.child;
6239		}
6240		function updateContextProvider(current, workInProgress, renderLanes) {
6241			var context = workInProgress.type, newProps = workInProgress.pendingProps, newValue = newProps.value;
6242			"value" in newProps || hasWarnedAboutUsingNoValuePropOnContextProvider || (hasWarnedAboutUsingNoValuePropOnContextProvider = !0, console.error("The `value` prop is required for the `<Context.Provider>`. Did you misspell it or forget to pass it?"));
6243			pushProvider(workInProgress, context, newValue);
6244			reconcileChildren(current, workInProgress, newProps.children, renderLanes);
6245			return workInProgress.child;
6246		}
6247		function bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes) {
6248			null !== current && (workInProgress.dependencies = current.dependencies);
6249			profilerStartTime = -1;
6250			workInProgressRootSkippedLanes |= workInProgress.lanes;
6251			if (0 === (renderLanes & workInProgress.childLanes)) if (null !== current) {
6252				if (propagateParentContextChanges(current, workInProgress, renderLanes, !1), 0 === (renderLanes & workInProgress.childLanes)) return null;
6253			} else return null;
6254			if (null !== current && workInProgress.child !== current.child) throw Error("Resuming work not yet implemented.");
6255			if (null !== workInProgress.child) {
6256				current = workInProgress.child;
6257				renderLanes = createWorkInProgress(current, current.pendingProps);
6258				workInProgress.child = renderLanes;
vendor: 4,326 bytes, lines 6259-6338
6259				for (renderLanes.return = workInProgress; null !== current.sibling;) current = current.sibling, renderLanes = renderLanes.sibling = createWorkInProgress(current, current.pendingProps), renderLanes.return = workInProgress;
6260				renderLanes.sibling = null;
6261			}
6262			return workInProgress.child;
6263		}
6264		function checkScheduledUpdateOrContext(current, renderLanes) {
6265			if (0 !== (current.lanes & renderLanes)) return !0;
6266			current = current.dependencies;
6267			return null !== current && checkIfContextChanged(current) ? !0 : !1;
6268		}
6269		function attemptEarlyBailoutIfNoScheduledUpdate(current, workInProgress, renderLanes) {
6270			switch (workInProgress.tag) {
6271				case 3:
6272					pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);
6273					pushProvider(workInProgress, CacheContext, current.memoizedState.cache);
6274					resetHydrationState();
6275					break;
6276				case 27:
6277				case 5:
6278					pushHostContext(workInProgress);
6279					break;
6280				case 4:
6281					pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);
6282					break;
6283				case 10:
6284					pushProvider(workInProgress, workInProgress.type, workInProgress.memoizedProps.value);
6285					break;
6286				case 12:
6287					0 !== (renderLanes & workInProgress.childLanes) && (workInProgress.flags |= 4);
6288					workInProgress.flags |= 2048;
6289					var stateNode = workInProgress.stateNode;
6290					stateNode.effectDuration = -0;
6291					stateNode.passiveEffectDuration = -0;
6292					break;
6293				case 31:
6294					if (null !== workInProgress.memoizedState) return workInProgress.flags |= 128, pushDehydratedActivitySuspenseHandler(workInProgress), null;
6295					break;
6296				case 13:
6297					stateNode = workInProgress.memoizedState;
6298					if (null !== stateNode) {
6299						if (null !== stateNode.dehydrated) return pushPrimaryTreeSuspenseHandler(workInProgress), workInProgress.flags |= 128, null;
6300						stateNode = propagateParentContextChanges(current, workInProgress, renderLanes, !1);
6301						var primaryChildLanes = workInProgress.child.childLanes;
6302						if (stateNode || 0 !== (renderLanes & primaryChildLanes)) return updateSuspenseComponent(current, workInProgress, renderLanes);
6303						pushPrimaryTreeSuspenseHandler(workInProgress);
6304						current = bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
6305						return null !== current ? current.sibling : null;
6306					}
6307					pushPrimaryTreeSuspenseHandler(workInProgress);
6308					break;
6309				case 19:
6310					if (workInProgress.flags & 128) return updateSuspenseListComponent(current, workInProgress, renderLanes);
6311					primaryChildLanes = 0 !== (current.flags & 128);
6312					stateNode = 0 !== (renderLanes & workInProgress.childLanes);
6313					stateNode || (propagateParentContextChanges(current, workInProgress, renderLanes, !1), stateNode = 0 !== (renderLanes & workInProgress.childLanes));
6314					if (primaryChildLanes) {
6315						if (stateNode) return updateSuspenseListComponent(current, workInProgress, renderLanes);
6316						workInProgress.flags |= 128;
6317					}
6318					primaryChildLanes = workInProgress.memoizedState;
6319					null !== primaryChildLanes && (primaryChildLanes.rendering = null, primaryChildLanes.tail = null, primaryChildLanes.lastEffect = null);
6320					pushSuspenseListContext(workInProgress, suspenseStackCursor.current);
6321					if (stateNode) break;
6322					else return null;
6323				case 22: return workInProgress.lanes = 0, updateOffscreenComponent(current, workInProgress, renderLanes, workInProgress.pendingProps);
6324				case 24: pushProvider(workInProgress, CacheContext, current.memoizedState.cache);
6325			}
6326			return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
6327		}
6328		function beginWork(current, workInProgress, renderLanes) {
6329			if (workInProgress._debugNeedsRemount && null !== current) {
6330				renderLanes = createFiberFromTypeAndProps(resolveTypeForHotReloading(workInProgress.elementType), workInProgress.key, workInProgress.pendingProps, workInProgress._debugOwner || null, workInProgress.mode, workInProgress.lanes);
6331				renderLanes._debugStack = workInProgress._debugStack;
6332				renderLanes._debugTask = workInProgress._debugTask;
6333				var returnFiber = workInProgress.return;
6334				if (null === returnFiber) throw Error("Cannot swap the root fiber.");
6335				current.alternate = null;
6336				workInProgress.alternate = null;
6337				renderLanes.index = workInProgress.index;
6338				renderLanes.sibling = workInProgress.sibling;
6339				renderLanes.return = workInProgress.return;
6340				renderLanes.ref = workInProgress.ref;
6341				renderLanes._debugInfo = workInProgress._debugInfo;
6342				if (workInProgress === returnFiber.child) returnFiber.child = renderLanes;
6343				else {
6344					var prevSibling = returnFiber.child;
6345					if (null === prevSibling) throw Error("Expected parent to have a child.");
6346					for (; prevSibling.sibling !== workInProgress;) if (prevSibling = prevSibling.sibling, null === prevSibling) throw Error("Expected to find the previous sibling.");
6347					prevSibling.sibling = renderLanes;
6348				}
6349				workInProgress = returnFiber.deletions;
6350				null === workInProgress ? (returnFiber.deletions = [current], returnFiber.flags |= 16) : workInProgress.push(current);
6351				renderLanes.flags |= 134217730;
6352				return renderLanes;
6353			}
6354			if (null !== current) if (current.memoizedProps !== workInProgress.pendingProps || workInProgress.type !== current.type) didReceiveUpdate = !0;
6355			else {
6356				if (!checkScheduledUpdateOrContext(current, renderLanes) && 0 === (workInProgress.flags & 128)) return didReceiveUpdate = !1, attemptEarlyBailoutIfNoScheduledUpdate(current, workInProgress, renderLanes);
6357				didReceiveUpdate = 0 !== (current.flags & 131072) ? !0 : !1;
6358			}
6359			else {
6360				didReceiveUpdate = !1;
6361				if (returnFiber = isHydrating) warnIfNotHydrating(), returnFiber = 0 !== (workInProgress.flags & 1048576);
6362				returnFiber && (returnFiber = workInProgress.index, warnIfNotHydrating(), pushTreeId(workInProgress, treeForkCount, returnFiber));
6363			}
6364			workInProgress.lanes = 0;
6365			switch (workInProgress.tag) {
6366				case 16:
6367					a: if (returnFiber = workInProgress.pendingProps, current = resolveLazy(workInProgress.elementType), current = resolveTypeForHotReloading(current), workInProgress.type = current, "function" === typeof current) shouldConstruct(current) ? (returnFiber = resolveClassComponentProps(current, returnFiber), workInProgress.tag = 1, workInProgress = updateClassComponent(null, workInProgress, current, returnFiber, renderLanes)) : (workInProgress.tag = 0, validateFunctionComponentInDev(workInProgress, current), workInProgress = updateFunctionComponent(null, workInProgress, current, returnFiber, renderLanes));
6368					else {
6369						if (void 0 !== current && null !== current) {
6370							if (prevSibling = current.$$typeof, prevSibling === REACT_FORWARD_REF_TYPE) {
6371								workInProgress.tag = 11;
6372								workInProgress = updateForwardRef(null, workInProgress, current, returnFiber, renderLanes);
6373								break a;
6374							} else if (prevSibling === REACT_MEMO_TYPE) {
6375								workInProgress.tag = 14;
6376								workInProgress = updateMemoComponent(null, workInProgress, current, returnFiber, renderLanes);
6377								break a;
6378							} else if (prevSibling === REACT_CONTEXT_TYPE) {
6379								workInProgress.tag = 10;
6380								workInProgress.type = current;
6381								workInProgress = updateContextProvider(null, workInProgress, renderLanes);
6382								break a;
6383							}
6384						}
6385						workInProgress = "";
6386						null !== current && "object" === typeof current && current.$$typeof === REACT_LAZY_TYPE && (workInProgress = " Did you wrap a component in React.lazy() more than once?");
6387						renderLanes = getComponentNameFromType(current) || current;
6388						throw Error("Element type is invalid. Received a promise that resolves to: " + renderLanes + ". Lazy element type must resolve to a class or function." + workInProgress);
6389					}
6390					return workInProgress;
6391				case 0: return updateFunctionComponent(current, workInProgress, workInProgress.type, workInProgress.pendingProps, renderLanes);
6392				case 1: return returnFiber = workInProgress.type, prevSibling = resolveClassComponentProps(returnFiber, workInProgress.pendingProps), updateClassComponent(current, workInProgress, returnFiber, prevSibling, renderLanes);
6393				case 3:
6394					a: {
6395						pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);
6396						if (null === current) throw Error("Should have a current fiber. This is a bug in React.");
6397						returnFiber = workInProgress.pendingProps;
6398						var prevState = workInProgress.memoizedState;
6399						prevSibling = prevState.element;
6400						cloneUpdateQueue(current, workInProgress);
6401						processUpdateQueue(workInProgress, returnFiber, null, renderLanes);
6402						var nextState = workInProgress.memoizedState;
6403						returnFiber = nextState.cache;
6404						pushProvider(workInProgress, CacheContext, returnFiber);
6405						returnFiber !== prevState.cache && propagateContextChanges(workInProgress, [CacheContext], renderLanes, !0);
6406						suspendIfUpdateReadFromEntangledAsyncAction();
6407						returnFiber = nextState.element;
6408						if (prevState.isDehydrated) if (prevState = {
6409							element: returnFiber,
6410							isDehydrated: !1,
6411							cache: nextState.cache
6412						}, workInProgress.updateQueue.baseState = prevState, workInProgress.memoizedState = prevState, workInProgress.flags & 256) {
6413							workInProgress = mountHostRootWithoutHydrating(current, workInProgress, returnFiber, renderLanes);
6414							break a;
6415						} else if (returnFiber !== prevSibling) {
6416							prevSibling = createCapturedValueAtFiber(Error("This root received an early update, before anything was able hydrate. Switched the entire root to client rendering."), workInProgress);
6417							queueHydrationError(prevSibling);
6418							workInProgress = mountHostRootWithoutHydrating(current, workInProgress, returnFiber, renderLanes);
6419							break a;
6420						} else {
6421							current = workInProgress.stateNode.containerInfo;
6422							switch (current.nodeType) {
6423								case 9:
6424									current = current.body;
6425									break;
6426								default: current = "HTML" === current.nodeName ? current.ownerDocument.body : current;
6427							}
6428							nextHydratableInstance = getNextHydratable(current.firstChild);
6429							hydrationParentFiber = workInProgress;
6430							isHydrating = !0;
6431							hydrationErrors = null;
6432							didSuspendOrErrorDEV = !1;
6433							hydrationDiffRootDEV = null;
6434							rootOrSingletonContext = !0;
6435							renderLanes = mountChildFibers(workInProgress, null, returnFiber, renderLanes);
6436							for (workInProgress.child = renderLanes; renderLanes;) renderLanes.flags = renderLanes.flags & -3 | 134221824, renderLanes = renderLanes.sibling;
6437						}
6438						else {
6439							resetHydrationState();
6440							if (returnFiber === prevSibling) {
6441								workInProgress = bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
6442								break a;
6443							}
6444							reconcileChildren(current, workInProgress, returnFiber, renderLanes);
6445						}
6446						workInProgress = workInProgress.child;
6447					}
6448					return workInProgress;
6449				case 26: return markRef(current, workInProgress), null === current ? (renderLanes = getResource(workInProgress.type, null, workInProgress.pendingProps, null)) ? workInProgress.memoizedState = renderLanes : isHydrating || (workInProgress.stateNode = createHoistableInstance(workInProgress.type, workInProgress.pendingProps, requiredContext(rootInstanceStackCursor.current), workInProgress)) : workInProgress.memoizedState = getResource(workInProgress.type, current.memoizedProps, workInProgress.pendingProps, current.memoizedState), null;
6450				case 27: return pushHostContext(workInProgress), null === current && isHydrating && (returnFiber = requiredContext(rootInstanceStackCursor.current), prevSibling = getHostContext(), returnFiber = workInProgress.stateNode = resolveSingletonInstance(workInProgress.type, workInProgress.pendingProps, returnFiber, prevSibling, !1), didSuspendOrErrorDEV || (prevSibling = diffHydratedProperties(returnFiber, workInProgress.type, workInProgress.pendingProps, prevSibling), null !== prevSibling && (buildHydrationDiffNode(workInProgress, 0).serverProps = prevSibling)), hydrationParentFiber = workInProgress, rootOrSingletonContext = !0, prevSibling = nextHydratableInstance, isSingletonScope(workInProgress.type) ? (previousHydratableOnEnteringScopedSingleton = prevSibling, nextHydratableInstance = getNextHydratable(returnFiber.firstChild)) : nextHydratableInstance = prevSibling), reconcileChildren(current, workInProgress, workInProgress.pendingProps.children, renderLanes), markRef(current, workInProgress), null === current && (workInProgress.flags |= 4194304), workInProgress.child;
6451				case 5: return null === current && isHydrating && (prevState = getHostContext(), returnFiber = validateDOMNesting(workInProgress.type, prevState.ancestorInfo), prevSibling = nextHydratableInstance, (nextState = !prevSibling) || (nextState = canHydrateInstance(prevSibling, workInProgress.type, workInProgress.pendingProps, rootOrSingletonContext), null !== nextState ? (workInProgress.stateNode = nextState, didSuspendOrErrorDEV || (prevState = diffHydratedProperties(nextState, workInProgress.type, workInProgress.pendingProps, prevState), null !== prevState && (buildHydrationDiffNode(workInProgress, 0).serverProps = prevState)), hydrationParentFiber = workInProgress, nextHydratableInstance = getNextHydratable(nextState.firstChild), rootOrSingletonContext = !1, prevState = !0) : prevState = !1, nextState = !prevState), nextState && (returnFiber && warnNonHydratedInstance(workInProgress, prevSibling), throwOnHydrationMismatch(workInProgress))), pushHostContext(workInProgress), prevSibling = workInProgress.type, prevState = workInProgress.pendingProps, nextState = null !== current ? current.memoizedProps : null, returnFiber = prevState.children, shouldSetTextContent(prevSibling, prevState) ? returnFiber = null : null !== nextState && shouldSetTextContent(prevSibling, nextState) && (workInProgress.flags |= 32), null !== workInProgress.memoizedState && (prevSibling = renderWithHooks(current, workInProgress, TransitionAwareHostComponent, null, null, renderLanes), HostTransitionContext._currentValue = prevSibling), markRef(current, workInProgress), reconcileChildren(current, workInProgress, returnFiber, renderLanes), workInProgress.child;
6452				case 6: return null === current && isHydrating && (renderLanes = w
6452orkInProgress.pendingProps, current = getHostContext(), returnFiber = current.ancestorInfo.current, renderLanes = null != returnFiber ? validateTextNesting(renderLanes, returnFiber.tag, current.ancestorInfo.implicitRootScope) : !0, current = nextHydratableInstance, (returnFiber = !current) || (returnFiber = canHydrateTextInstance(current, workInProgress.pendingProps, rootOrSingletonContext), null !== returnFiber ? (workInProgress.stateNode = returnFiber, hydrationParentFiber = workInProgress, nextHydratableInstance = null, returnFiber = !0) : returnFiber = !1, returnFiber = !returnFiber), returnFiber && (renderLanes && warnNonHydratedInstance(workInProgress, current), throwOnHydrationMismatch(workInProgress))), null;
6453				case 13: return updateSuspenseComponent(current, workInProgress, renderLanes);
6454				case 4: return pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo), returnFiber = workInProgress.pendingProps, null === current ? workInProgress.child = reconcileChildFibers(workInProgress, null, returnFiber, renderLanes) : reconcileChildren(current, workInProgress, returnFiber, renderLanes), workInProgress.child;
6455				case 11: return updateForwardRef(current, workInProgress, workInProgress.type, workInProgress.pendingProps, renderLanes);
6456				case 7: return returnFiber = workInProgress.pendingProps, markRef(current, workInProgress), reconcileChildren(current, workInProgress, returnFiber, renderLanes), workInProgress.child;
6457				case 8: return reconcileChildren(current, workInProgress, workInProgress.pendingProps.children, renderLanes), workInProgress.child;
6458				case 12: return workInProgress.flags |= 4, workInProgress.flags |= 2048, returnFiber = workInProgress.stateNode, returnFiber.effectDuration = -0, returnFiber.passiveEffectDuration = -0, reconcileChildren(current, workInProgress, workInProgress.pendingProps.children, renderLanes), workInProgress.child;
6459				case 10: return updateContextProvider(current, workInProgress, renderLanes);
6460				case 9: return prevSibling = workInProgress.type._context, returnFiber = workInProgress.pendingProps.children, "function" !== typeof returnFiber && console.error("A context consumer was rendered with multiple children, or a child that isn't a function. A context consumer expects a single child that is a function. If you did pass a function, make sure there is no trailing or leading whitespace around it."), prepareToReadContext(workInProgress), prevSibling = readContext(prevSibling), returnFiber = callComponentInDEV(returnFiber, prevSibling, void 0), workInProgress.flags |= 1, reconcileChildren(current, workInProgress, returnFiber, renderLanes), workInProgress.child;
6461				case 14: return updateMemoComponent(current, workInProgress, workInProgress.type, workInProgress.pendingProps, renderLanes);
6462				case 15: return updateSimpleMemoComponent(current, workInProgress, workInProgress.type, workInProgress.pendingProps, renderLanes);
6463				case 19: return updateSuspenseListComponent(current, workInProgress, renderLanes);
6464				case 31: return updateActivityComponent(current, workInProgress, renderLanes);
6465				case 22: return updateOffscreenComponent(current, workInProgress, renderLanes, workInProgress.pendingProps);
6466				case 24: return prepareToReadContext(workInProgress), returnFiber = readContext(CacheContext), null === current ? (prevSibling = peekCacheFromPool(), null === prevSibling && (prevSibling = workInProgressRoot, prevState = createCache(), prevSibling.pooledCache = prevState, retainCache(prevState), null !== prevState && (prevSibling.pooledCacheLanes |= renderLanes), prevSibling = prevState), workInProgress.memoizedState = {
6467					parent: returnFiber,
6468					cache: prevSibling
6469				}, initializeUpdateQueue(workInProgress), pushProvider(workInProgress, CacheContext, prevSibling)) : (0 !== (current.lanes & renderLanes) && (cloneUpdateQueue(current, workInProgress), processUpdateQueue(workInProgress, null, null, renderLanes), suspendIfUpdateReadFromEntangledAsyncAction()), prevSibling = current.memoizedState, prevState = workInProgress.memoizedState, prevSibling.parent !== returnFiber ? (prevSibling = {
6470					parent: returnFiber,
6471					cache: returnFiber
6472				}, workInProgress.memoizedState = prevSibling, 0 === workInProgress.lanes && (workInProgress.memoizedState = workInProgress.updateQueue.baseState = prevSibling), pushProvider(workInProgress, CacheContext, returnFiber)) : (returnFiber = prevState.cache, pushProvider(workInProgress, CacheContext, returnFiber), returnFiber !== prevSibling.cache && propagateContextChanges(wor
6472kInProgress, [CacheContext], renderLanes, !0))), reconcileChildren(current, workInProgress, workInProgress.pendingProps.children, renderLanes), workInProgress.child;
6473				case 30: return null === workInProgress.stateNode && (workInProgress.stateNode = {
6474					autoName: null,
6475					paired: null,
6476					clones: null,
6477					ref: null
6478				}), returnFiber = workInProgress.pendingProps, null != returnFiber.name && "auto" !== returnFiber.name ? workInProgress.flags |= null === current ? 18882560 : 18874368 : isHydrating && pushMaterializedTreeId(workInProgress), void 0 !== returnFiber.className && (prevSibling = "string" === typeof returnFiber.className ? JSON.stringify(returnFiber.className) : "{...}", didWarnAboutClassNameOnViewTransition[prevSibling] || (didWarnAboutClassNameOnViewTransition[prevSibling] = !0, console.error("<ViewTransition> doesn't accept a \"className\" prop. It has been renamed to \"default\".\n-   <ViewTransition className=%s>\n+   <ViewTransition default=%s>", prevSibling, prevSibling))), null !== current && current.memoizedProps.name !== returnFiber.name ? workInProgress.flags |= 4194816 : markRef(current, workInProgress), reconcileChildren(current, workInProgress, returnFiber.children, renderLanes), workInProgress.child;
6479				case 29: throw workInProgress.pendingProps;
6480			}
6481			throw Error("Unknown unit of work tag (" + workInProgress.tag + "). This error is likely caused by a bug in React. Please file an issue.");
6482		}
6483		function markUpdate(workInProgress) {
6484			workInProgress.flags |= 4;
6485		}
6486		function preloadInstanceAndSuspendIfNeeded(workInProgress, type, oldProps, newProps, renderLanes) {
6487			var JSCompiler_temp;
6488			if (JSCompiler_temp = (workInProgress.mode & SuspenseyImagesMode) !== NoMode) JSCompiler_temp = null === oldProps ? maySuspendCommit(type, newProps) : maySuspendCommit(type, newProps) && (newProps.src !== oldProps.src || newProps.srcSet !== oldProps.srcSet);
6489			if (JSCompiler_temp) {
6490				if (workInProgress.flags |= 16777216, (renderLanes & 335544128) === renderLanes) if (workInProgress.stateNode.complete) workInProgress.flags |= 8192;
6491				else if (shouldRemainOnPreviousScreen()) workInProgress.flags |= 8192;
6492				else throw suspendedThenable = noopSuspenseyCommitThenable, SuspenseyCommitException;
6493			} else workInProgress.flags &= -16777217;
6494		}
6495		function preloadResourceAndSuspendIfNeeded(workInProgress, resource) {
6496			if ("stylesheet" !== resource.type || (resource.state.loading & Inserted) !== NotLoaded) workInProgress.flags &= -16777217;
6497			else if (workInProgress.flags |= 16777216, !preloadResource(resource)) if (shouldRemainOnPreviousScreen()) workInProgress.flags |= 8192;
6498			else throw suspendedThenable = noopSuspenseyCommitThenable, SuspenseyCommitException;
6499		}
6500		function scheduleRetryEffect(workInProgress, retryQueue) {
6501			null !== retryQueue && (workInProgress.flags |= 4);
6502			workInProgress.flags & 16384 && (retryQueue = 22 !== workInProgress.tag ? claimNextRetryLane() : 536870912, workInProgress.lanes |= retryQueue, workInProgressSuspendedRetryLanes |= retryQueue);
6503		}
6504		function cutOffTailIfNeeded(renderState, hasRenderedATailFallback) {
6505			if (!isHydrating) switch (renderState.tailMode) {
6506				case "visible": break;
6507				case "collapsed":
6508					for (var tailNode = renderState.tail, lastTailNode = null; null !== tailNode;) null !== tailNode.alternate && (lastTailNode = tailNode), tailNode = tailNode.sibling;
6509					null === lastTailNode ? hasRenderedATailFallback || null === renderState.tail ? renderState.tail = null : renderState.tail.sibling = null : lastTailNode.sibling = null;
6510					break;
6511				default:
6512					hasRenderedATailFallback = renderState.tail;
6513					for (tailNode = null; null !== hasRenderedATailFallback;) null !== hasRenderedATailFallback.alternate && (tailNode = hasRenderedATailFallback), hasRenderedATailFallback = hasRenderedATailFallback.sibling;
6514					null === tailNode ? renderState.tail = null : tailNode.sibling = null;
6515			}
6516		}
6517		function bubbleProperties(completedWork) {
6518			var didBailout = null !== completedWork.alternate && completedWork.alternate.child === completedWork.child, newChildLanes = 0, subtreeFlags = 0;
6519			if (didBailout) if ((completedWork.mode & ProfileMode) !== NoMode) {
6520				for (var _treeBaseDuration = completedWork.selfBaseDuration, _child2 = completedWork.child; null !== _child2;) newChildLanes |= _child2.lanes | _child2.childLanes, subtreeFlags |= _child2.subtreeFlags & 1206910976, subtreeFlags |= _child2.flags & 1206910976, _treeBaseDuration += _child2.treeBaseDuration, _child2 = _child2.sibling;
6521				completedWork.treeBaseDuration = _treeBaseDuration;
6522			} else for (_treeBaseDuration = completedWork.child; null !== _treeBaseDuration;) newChildLanes |= _treeBaseDuration.lanes | _treeBaseDuration.childLanes, subtreeFlags |= _treeBaseDuration.subtreeFlags & 1206910976, subtreeFlags |= _treeBaseDuration.flags & 1206910976, _treeBaseDuration.return = completedWork, _treeBaseDuration = _treeBaseDuration.sibling;
6523			else if ((completedWork.mode & ProfileMode) !== NoMode) {
6524				_treeBaseDuration = completedWork.actualDuration;
6525				_child2 = completedWork.selfBaseDuration;
6526				for (var child = completedWork.child; null !== child;) newChildLanes |= child.lanes | child.childLanes, subtreeFlags |= child.subtreeFlags, subtreeFlags |= child.flags, _treeBaseDuration += child.actualDuration, _child2 += child.treeBaseDuration, child = child.sibling;
6527				completedWork.actualDuration = _treeBaseDuration;
6528				completedWork.treeBaseDuration = _child2;
6529			} else for (_treeBaseDuration = completedWork.child; null !== _treeBaseDuration;) newChildLanes |= _treeBaseDuration.lanes | _treeBaseDuration.childLanes, subtreeFlags |= _treeBaseDuration.subtreeFlags, subtreeFlags |= _treeBaseDuration.flags, _treeBaseDuration.return = completedWork, _treeBaseDuration = _treeBaseDuration.sibling;
6530			completedWork.subtreeFlags |= subtreeFlags;
6531			completedWork.childLanes = newChildLanes;
6532			return didBailout;
6533		}
6534		function completeWork(current, workInProgress, renderLanes) {
6535			var newProps = workInProgress.pendingProps;
6536			popTreeContext(workInProgress);
6537			switch (workInProgress.tag) {
6538				case 16:
6539				case 15:
6540				case 0:
6541				case 11:
6542				case 7:
6543				case 8:
vendor: 8,249 bytes, lines 6544-6670
6544				case 12:
6545				case 9:
6546				case 14: return bubbleProperties(workInProgress), null;
6547				case 1: return bubbleProperties(workInProgress), null;
6548				case 3:
6549					renderLanes = workInProgress.stateNode;
6550					newProps = null;
6551					null !== current && (newProps = current.memoizedState.cache);
6552					workInProgress.memoizedState.cache !== newProps && (workInProgress.flags |= 2048);
6553					popProvider(CacheContext, workInProgress);
6554					popHostContainer(workInProgress);
6555					renderLanes.pendingContext && (renderLanes.context = renderLanes.pendingContext, renderLanes.pendingContext = null);
6556					if (null === current || null === current.child) popHydrationState(workInProgress) ? (emitPendingHydrationWarnings(), markUpdate(workInProgress)) : null === current || current.memoizedState.isDehydrated && 0 === (workInProgress.flags & 256) || (workInProgress.flags |= 1024, upgradeHydrationErrorsToRecoverable());
6557					bubbleProperties(workInProgress);
6558					return null;
6559				case 26:
6560					var type = workInProgress.type, nextResource = workInProgress.memoizedState;
6561					null === current ? (markUpdate(workInProgress), null !== nextResource ? (bubbleProperties(workInProgress), preloadResourceAndSuspendIfNeeded(workInProgress, nextResource)) : (bubbleProperties(workInProgress), preloadInstanceAndSuspendIfNeeded(workInProgress, type, null, newProps, renderLanes))) : nextResource ? nextResource !== current.memoizedState ? (markUpdate(workInProgress), bubbleProperties(workInProgress), preloadResourceAndSuspendIfNeeded(workInProgress, nextResource)) : (bubbleProperties(workInProgress), workInProgress.flags &= -16777217) : (current = current.memoizedProps, current !== newProps && markUpdate(workInProgress), bubbleProperties(workInProgress), preloadInstanceAndSuspendIfNeeded(workInProgress, type, current, newProps, renderLanes));
6562					return null;
6563				case 27:
6564					popHostContext(workInProgress);
6565					renderLanes = requiredContext(rootInstanceStackCursor.current);
6566					type = workInProgress.type;
6567					if (null !== current && null != workInProgress.stateNode) current.memoizedProps !== newProps && markUpdate(workInProgress);
6568					else {
6569						if (!newProps) {
6570							if (null === workInProgress.stateNode) throw Error("We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue.");
6571							bubbleProperties(workInProgress);
6572							workInProgress.subtreeFlags &= -33554433;
6573							return null;
6574						}
6575						current = getHostContext();
6576						popHydrationState(workInProgress) ? prepareToHydrateHostInstance(workInProgress, current) : (current = resolveSingletonInstance(type, newProps, renderLanes, current, !0), workInProgress.stateNode = current, markUpdate(workInProgress));
6577					}
6578					bubbleProperties(workInProgress);
6579					workInProgress.subtreeFlags &= -33554433;
6580					return null;
6581				case 5:
6582					popHostContext(workInProgress);
6583					type = workInProgress.type;
6584					if (null !== current && null != workInProgress.stateNode) current.memoizedProps !== newProps && markUpdate(workInProgress);
6585					else {
6586						if (!newProps) {
6587							if (null === workInProgress.stateNode) throw Error("We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue.");
6588							bubbleProperties(workInProgress);
6589							workInProgress.subtreeFlags &= -33554433;
6590							return null;
6591						}
6592						var _currentHostContext = getHostContext();
6593						if (popHydrationState(workInProgress)) prepareToHydrateHostInstance(workInProgress, _currentHostContext);
6594						else {
6595							nextResource = requiredContext(rootInstanceStackCursor.current);
6596							validateDOMNesting(type, _currentHostContext.ancestorInfo);
6597							_currentHostContext = _currentHostContext.context;
6598							nextResource = getOwnerDocumentFromRootContainer(nextResource);
6599							switch (_currentHostContext) {
6600								case HostContextNamespaceSvg:
6601									nextResource = nextResource.createElementNS(SVG_NAMESPACE, type);
6602									break;
6603								case HostContextNamespaceMath:
6604									nextResource = nextResource.createElementNS(MATH_NAMESPACE, type);
6605									break;
6606								default: switch (type) {
6607									case "svg":
6608										nextResource = nextResource.createElementNS(SVG_NAMESPACE, type);
6609										break;
6610									case "math":
6611										nextResource = nextResource.createElementNS(MATH_NAMESPACE, type);
6612										break;
6613									case "script":
6614										nextResource = nextResource.createElement("div");
6615										didWarnScriptTags || isScriptDataBlock(newProps) || (console.error("Encountered a script tag while rendering React component. Scripts inside React components are never executed when rendering on the client. Consider using template tag instead (https://developer.mozilla.org/en-US/docs/Web/HTML/Element/template)."), didWarnScriptTags = !0);
6616										nextResource.innerHTML = "<script><\/script>";
6617										nextResource = nextResource.removeChild(nextResource.firstChild);
6618										break;
6619									case "select":
6620										nextResource = "string" === typeof newProps.is ? nextResource.createElement("select", { is: newProps.is }) : nextResource.createElement("select");
6621										newProps.multiple ? nextResource.multiple = !0 : newProps.size && (nextResource.size = newProps.size);
6622										break;
6623									default: nextResource = "string" === typeof newProps.is ? nextResource.createElement(type, { is: newProps.is }) : nextResource.createElement(type), -1 === type.indexOf("-") && (type !== type.toLowerCase() && console.error("<%s /> is using incorrect casing. Use PascalCase for React components, or lowercase for HTML elements.", type), "[object HTMLUnknownElement]" !== Object.prototype.toString.call(nextResource) || hasOwnProperty.call(warnedUnknownTags, type) || (warnedUnknownTags[type] = !0, console.error("The tag <%s> is unrecognized in this browser. If you meant to render a React component, start its name with an uppercase letter.", type)));
6624								}
6625							}
6626							nextResource[internalInstanceKey] = workInProgress;
6627							nextResource[internalPropsKey] = newProps;
6628							a: for (_currentHostContext = workInProgress.child; null !== _currentHostContext;) {
6629								if (5 === _currentHostContext.tag || 6 === _currentHostContext.tag) nextResource.appendChild(_currentHostContext.stateNode);
6630								else if (4 !== _currentHostContext.tag && 27 !== _currentHostContext.tag && null !== _currentHostContext.child) {
6631									_currentHostContext.child.return = _currentHostContext;
6632									_currentHostContext = _currentHostContext.child;
6633									continue;
6634								}
6635								if (_currentHostContext === workInProgress) break a;
6636								for (; null === _currentHostContext.sibling;) {
6637									if (null === _currentHostContext.return || _currentHostContext.return === workInProgress) break a;
6638									_currentHostContext = _currentHostContext.return;
6639								}
6640								_currentHostContext.sibling.return = _currentHostContext.return;
6641								_currentHostContext = _currentHostContext.sibling;
6642							}
6643							workInProgress.stateNode = nextResource;
6644							a: switch (setInitialProperties(nextResource, type, newProps), type) {
6645								case "button":
6646								case "input":
6647								case "select":
6648								case "textarea":
6649									newProps = !!newProps.autoFocus;
6650									break a;
6651								case "img":
6652									newProps = !0;
6653									break a;
6654								default: newProps = !1;
6655							}
6656							newProps && markUpdate(workInProgress);
6657						}
6658					}
6659					bubbleProperties(workInProgress);
6660					workInProgress.subtreeFlags &= -33554433;
6661					preloadInstanceAndSuspendIfNeeded(workInProgress, workInProgress.type, null === current ? null : current.memoizedProps, workInProgress.pendingProps, renderLanes);
6662					return null;
6663				case 6:
6664					if (current && null != workInProgress.stateNode) current.memoizedProps !== newProps && markUpdate(workInProgress);
6665					else {
6666						if ("string" !== typeof newProps && null === workInProgress.stateNode) throw Error("We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue.");
6667						current = requiredContext(rootInstanceStackCursor.current);
6668						renderLanes = getHostContext();
6669						if (popHydrationState(workInProgress)) {
6670							current = workInProgress.stateNode;
6671							renderLanes = workInProgress.memoizedProps;
6672							type = !didSuspendOrErrorDEV;
6673							newProps = null;
6674							nextResource = hydrationParentFiber;
6675							if (null !== nextResource) switch (nextResource.tag) {
6676								case 3:
6677									type && (type = diffHydratedTextForDevWarnings(current, renderLanes, newProps), null !== type && (buildHydrationDiffNode(workInProgress, 0).serverProps = type));
6678									break;
6679								case 27:
6680								case 5: newProps = nextResource.memoizedProps, type && (type = diffHydratedTextForDevWarnings(current, renderLanes, newProps), null !== type && (buildHydrationDiffNode(workInProgress, 0).serverProps = type));
6681							}
6682							current[internalInstanceKey] = workInProgress;
6683							current = current.nodeValue === renderLanes || null !== newProps && !0 === newProps.suppressHydrationWarning || checkForUnmatchedText(current.nodeValue, renderLanes) ? !0 : !1;
6684							current || throwOnHydrationMismatch(workInProgress, !0);
6685						} else type = renderLanes.ancestorInfo.current, null != type && validateTextNesting(newProps, type.tag, renderLanes.ancestorInfo.implicitRootScope), current = getOwnerDocumentFromRootContainer(current).createTextNode(newProps), current[internalInstanceKey] = workInProgress, workInProgress.stateNode = current;
6686					}
6687					bubbleProperties(workInProgress);
6688					return null;
6689				case 31:
6690					renderLanes = workInProgress.memoizedState;
6691					if (null === current || null !== current.memoizedState) {
6692						newProps = popHydrationState(workInProgress);
6693						if (null !== renderLanes) {
6694							if (null === current) {
6695								if (!newProps) throw Error("A dehydrated suspense component was completed without a hydrated node. This is probably a bug in React.");
6696								current = workInProgress.memoizedState;
6697								current = null !== current ? current.dehydrated : null;
6698								if (!current) throw Error("Expected to have a hydrated activity instance. This error is likely caused by a bug in React. Please file an issue.");
6699								current[internalInstanceKey] = workInProgress;
6700								bubbleProperties(workInProgress);
6701								(workInProgress.mode & ProfileMode) !== NoMode && null !== renderLanes && (current = workInProgress.child, null !== current && (workInProgress.treeBaseDuration -= current.treeBaseDuration));
6702							} else emitPendingHydrationWarnings(), resetHydrationState(), 0 === (workInProgress.flags & 128) && (renderLanes = workInProgress.memoizedState = null), workInProgress.flags |= 4, bubbleProperties(workInProgress), (workInProgress.mode & ProfileMode) !== NoMode && null !== renderLanes && (current = workInProgress.child, null !== current && (workInProgress.treeBaseDuration -= current.treeBaseDuration));
6703							current = !1;
6704						} else renderLanes = upgradeHydrationErrorsToRecoverable(), null !== current && null !== current.memoizedState && (current.memoizedState.hydrationErrors = renderLanes), current = !0;
6705						if (!current) {
6706							if (workInProgress.flags & 256) return popSuspenseHandler(workInProgress), workInProgress;
6707							popSuspenseHandler(workInProgress);
6708							return null;
6709						}
6710						if (0 !== (workInProgress.flags & 128)) throw Error("Client rendering an Activity suspended it again. This is a bug in React.");
6711					}
6712					bubbleProperties(workInProgress);
6713					return null;
6714				case 13:
6715					newProps = workInProgress.memoizedState;
6716					if (null === current || null !== current.memoizedState && null !== current.memoizedState.dehydrated) {
6717						type = newProps;
6718						nextResource = popHydrationState(workInProgress);
6719						if (null !== type && null !== type.dehydrated) {
6720							if (null === current) {
6721								if (!nextResource) throw Error("A dehydrated suspense component was completed without a hydrated node. This is probably a bug in React.");
6722								nextResource = workInProgress.memoizedState;
6723								nextResource = null !== nextResource ? nextResource.dehydrated : null;
6724								if (!nextResource) throw Error("Expected to have a hydrated suspense instance. This error is likely caused by a bug in React. Please file an issue.");
6725								nextResource[internalInstanceKey] = workInProgress;
6726								bubbleProperties(workInProgress);
6727								(workInProgress.mode & ProfileMode) !== NoMode && null !== type && (type = workInProgress.child, null !== type && (workInProgress.treeBaseDuration -= type.treeBaseDuration));
6728							} else emitPendingHydrationWarnings(), resetHydrationState(), 0 === (workInProgress.flags & 128) && (type = workInProgress.memoizedState = null), workInProgress.flags |= 4, bubbleProperties(workInProgress), (workInProgress.mode & ProfileMode) !== NoMode && null !== type && (type = workInProgress.child, null !== type && (workInProgress.treeBaseDuration -= type.treeBaseDuration));
6729							type = !1;
6730						} else type = upgradeHydrationErrorsToRecoverable(), null !== current && null !== current.memoizedState && (current.memoizedState.hydrationErrors = type), type = !0;
6731						if (!type) {
6732							if (workInProgress.flags & 256) return popSuspenseHandler(workInProgress), workInProgress;
6733							popSuspenseHandler(workInProgress);
6734							return null;
6735						}
6736					}
6737					popSuspenseHandler(workInProgress);
6738					if (0 !== (workInProgress.flags & 128)) return workInProgress.lanes = renderLanes, (workInProgress.mode & ProfileMode) !== NoMode && transferActualDuration(workInProgress), workInProgress;
6739					renderLanes = null !== newProps;
6740					current = null !== current && null !== current.memoizedState;
6741					renderLanes && (newProps = workInProgress.child, type = null, null !== newProps.alternate && null !== newProps.alternate.memoizedState && null !== newProps.alternate.memoizedState.cachePool && (type = newProps.alternate.memoizedState.cachePool.pool), nextResource = null, null !== newProps.memoizedState && null !== newProps.memoizedState.cachePool && (nextResource = newProps.memoizedState.cachePool.pool), nextResource !== type && (newProps.flags |= 2048));
6742					renderLanes !== current && renderLanes && (workInProgress.child.flags |= 8192);
6743					scheduleRetryEffect(workInProgress, workInProgress.updateQueue);
6744					bubbleProperties(workInProgress);
6745					(workInProgress.mode & ProfileMode) !== NoMode && renderLanes && (current = workInProgress.child, null !== current && (workInProgress.treeBaseDuration -= current.treeBaseDuration));
6746					return null;
6747				case 4: return popHostContainer(workInProgress), null === current && listenToAllSupportedEvents(workInProgress.stateNode.containerInfo), workInProgress.flags |= 67108864, bubbleProperties(workInProgress), null;
6748				case 10: return popProvider(workInProgress.type, workInProgress), bubbleProperties(workInProgress), null;
6749				case 19:
6750					popSuspenseListContext(workInProgress);
6751					newProps = workInProgress.memoizedState;
6752					if (null === newProps) return bubbleProperties(workInProgress), null;
6753					type = 0 !== (workInProgress.flags & 128);
6754					nextResource = newProps.rendering;
6755					if (null === nextResource) if (type) cutOffTailIfNeeded(newProps, !1);
6756					else {
6757						if (workInProgressRootExitStatus !== RootInProgress || null !== current && 0 !== (current.flags & 128)) for (current = workInProgress.child; null !== current;) {
6758							nextResource = findFirstSuspended(current);
6759							if (null !== nextResource) {
6760								workInProgress.flags |= 128;
6761								cutOffTailIfNeeded(newProps, !1);
6762								current = nextResource.updateQueue;
6763								workInProgress.updateQueue = current;
6764								scheduleRetryEffect(workInProgress, current);
6765								workInProgress.subtreeFlags = 0;
6766								current = renderLanes;
6767								for (renderLanes = workInProgress.child; null !== renderLanes;) resetWorkInProgress(renderLanes, current), renderLanes = renderLanes.sibling;
6768								pushSuspenseListContext(workInProgress, suspenseStackCursor.current & SubtreeSuspenseContextMask | ForceSuspenseFallback);
6769								isHydrating && pushTreeFork(workInProgress, newProps.treeForkCount);
6770								return workInProgress.child;
6771							}
6772							current = current.sibling;
6773						}
6774						null !== newProps.tail && now$1() > workInProgressRootRenderTargetTime && (workInProgress.flags |= 128, type = !0, cutOffTailIfNeeded(newProps, !1), workInProgress.lanes = 4194304);
6775					}
6776					else {
6777						if (!type) if (current = findFirstSuspended(nextResource), null !== current) {
6778							if (workInProgress.flags |= 128, type = !0, current = current.updateQueue, workInProgress.updateQueue = current, scheduleRetryEffect(workInProgress, current), cutOffTailIfNeeded(newProps, !0), null === newProps.tail && "collapsed" !== newProps.tailMode && "visible" !== newProps.tailMode && !nextResource.alternate && !isHydrating) return bubbleProperties(workInProgress), null;
6779						} else 2 * now$1() - newProps.renderingStartTime > workInProgressRootRenderTargetTime && 536870912 !== renderLanes && (workInProgress.flags |= 128, type = !0, cutOffTailIfNeeded(newProps, !1), workInProgress.lanes = 4194304);
6780						newProps.isBackwards ? (nextResource.sibling = workInProgress.child, workInProgress.child = nextResource) : (current = newProps.last, null !== current ? current.sibling = nextResource : workInProgress.child = nextResource, newProps.last = nextResource);
6781					}
6782					if (null !== newProps.tail) {
6783						current = newProps.tail;
6784						a: {
6785							for (renderLanes = current; null !== renderLanes;) {
6786								if (null !== renderLanes.alternate) {
6787									renderLanes = !1;
6788									break a;
6789								}
6790								renderLanes = renderLanes.sibling;
6791							}
6792							renderLanes = !0;
6793						}
6794						newProps.rendering = current;
6795						newProps.tail = current.sibling;
6796						newProps.renderingStartTime = now$1();
6797						current.sibling = null;
6798						nextResource = suspenseStackCursor.current;
6799						nextResource = type ? nextResource & SubtreeSuspenseContextMask | ForceSuspenseFallback : nextResource & SubtreeSuspenseContextMask;
6800						"visible" === newProps.tailMode || "collapsed" === newProps.tailMode || !renderLanes || isHydrating ? pushSuspenseListContext(workInProgress, nextResource) : (renderLanes = nextResource, push(suspenseHandlerStackCursor, workInProgress, workInProgress), push(suspenseStackCursor, renderLanes, workInProgress), null === shellBoundary && (shellBoundary = workInProgress));
6801						isHydrating && pushTreeFork(workInProgress, newProps.treeForkCount);
6802						return current;
6803					}
6804					bubbleProperties(workInProgress);
6805					return null;
6806				case 22:
6807				case 23: return popSuspenseHandler(workInProgress), popHiddenContext(workInProgress), newProps = null !== workInProgress.memoizedState, null !== current ? null !== current.memoizedState !== newProps && (workInProgress.flags |= 8192) : newProps && (workInProgress.flags |= 8192), newProps ? 0 !== (renderLanes & 536870912) && 0 === (workInProgress.flags & 128) && (bubbleProperties(workInProgress), workInProgress.subtreeFlags & 6 && (workInProgress.flags |= 8192)) : bubbleProperties(workInProgress), renderLanes = w
6807orkInProgress.updateQueue, null !== renderLanes && scheduleRetryEffect(workInProgress, renderLanes.retryQueue), renderLanes = null, null !== current && null !== current.memoizedState && null !== current.memoizedState.cachePool && (renderLanes = current.memoizedState.cachePool.pool), newProps = null, null !== workInProgress.memoizedState && null !== workInProgress.memoizedState.cachePool && (newProps = workInProgress.memoizedState.cachePool.pool), newProps !== renderLanes && (workInProgress.flags |= 2048), null !== current && pop(resumedCache, workInProgress), null;
6808				case 24: return renderLanes = null, null !== current && (renderLanes = current.memoizedState.cache), workInProgress.memoizedState.cache !== renderLanes && (workInProgress.flags |= 2048), popProvider(CacheContext, workInProgress), bubbleProperties(workInProgress), null;
6809				case 25: return null;
6810				case 30: return workInProgress.flags |= 33554432, bubbleProperties(workInProgress), null;
6811			}
6812			throw Error("Unknown unit of work tag (" + workInProgress.tag + "). This error is likely caused by a bug in React. Please file an issue.");
6813		}
6814		function unwindWork(current, workInProgress) {
6815			popTreeContext(workInProgress);
6816			switch (workInProgress.tag) {
6817				case 1: return current = workInProgress.flags, current & 65536 ? (workInProgress.flags = current & -65537 | 128, (workInProgress.mode & ProfileMode) !== NoMode && transferActualDuration(workInProgress), workInProgress) : null;
6818				case 3: return popProvider(CacheContext, workInProgress), popHostContainer(workInProgress), current = workInProgress.flags, 0 !== (current & 65536) && 0 === (current & 128) ? (workInProgress.flags = current & -65537 | 128, workInProgress) : null;
6819				case 26:
6820				case 27:
6821				case 5: return popHostContext(workInProgress), null;
6822				case 31:
6823					if (null !== workInProgress.memoizedState) {
6824						popSuspenseHandler(workInProgress);
6825						if (null === workInProgress.alternate) throw Error("Threw in newly mounted dehydrated component. This is likely a bug in React. Please file an issue.");
6826						resetHydrationState();
6827					}
6828					current = workInProgress.flags;
6829					return current & 65536 ? (workInProgress.flags = current & -65537 | 128, (workInProgress.mode & ProfileMode) !== NoMode && transferActualDuration(workInProgress), workInProgress) : null;
6830				case 13:
6831					popSuspenseHandler(workInProgress);
6832					current = workInProgress.memoizedState;
6833					if (null !== current && null !== current.dehydrated) {
6834						if (null === workInProgress.alternate) throw Error("Threw in newly mounted dehydrated component. This is likely a bug in React. Please file an issue.");
6835						resetHydrationState();
6836					}
6837					current = workInProgress.flags;
6838					return current & 65536 ? (workInProgress.flags = current & -65537 | 128, (workInProgress.mode & ProfileMode) !== NoMode && transferActualDuration(workInProgress), workInProgress) : null;
6839				case 19: return popSuspenseListContext(workInProgress), current = workInProgress.flags, current & 65536 ? (workInProgress.flags = current & -65537 | 128, current = workInProgress.memoizedState, null !== current && (current.rendering = null, current.tail = null), workInProgress.flags |= 4, workInProgress) : null;
6840				case 4: return popHostContainer(workInProgress), null;
6841				case 10: return popProvider(workInProgress.type, workInProgress), null;
6842				case 22:
6843				case 23: return popSuspenseHandler(workInProgress), popHiddenContext(workInProgress), null !== current && pop(resumedCache, workInProgress), current = workInProgress.flags, current & 65536 ? (workInProgress.flags = current & -65537 | 128, (workInProgress.mode & ProfileMode) !== NoMode && transferActualDuration(workInProgress), workInProgress) : null;
6844				case 24: return popProvider(CacheContext, workInProgress), null;
6845				case 25: return null;
6846				default: return null;
6847			}
6848		}
6849		function unwindInterruptedWork(current, interruptedWork) {
6850			popTreeContext(interruptedWork);
6851			switch (interruptedWork.tag) {
6852				case 3:
6853					popProvider(CacheContext, interruptedWork);
6854					popHostContainer(interruptedWork);
6855					break;
6856				case 26:
6857				case 27:
6858				case 5:
6859					popHostContext(interruptedWork);
6860					break;
6861				case 4:
6862					popHostContainer(interruptedWork);
6863					break;
6864				case 31:
6865					null !== interruptedWork.memoizedState && popSuspenseHandler(interruptedWork);
6866					break;
6867				case 13:
6868					popSuspenseHandler(interruptedWork);
6869					break;
6870				case 19:
6871					popSuspenseListContext(interruptedWork);
6872					break;
6873				case 10:
vendor: 13,157 bytes, lines 6874-7080
6874					popProvider(interruptedWork.type, interruptedWork);
6875					break;
6876				case 22:
6877				case 23:
6878					popSuspenseHandler(interruptedWork);
6879					popHiddenContext(interruptedWork);
6880					null !== current && pop(resumedCache, interruptedWork);
6881					break;
6882				case 24: popProvider(CacheContext, interruptedWork);
6883			}
6884		}
6885		function shouldProfile(current) {
6886			return (current.mode & ProfileMode) !== NoMode;
6887		}
6888		function commitHookLayoutEffects(finishedWork, hookFlags) {
6889			shouldProfile(finishedWork) ? (startEffectTimer(), commitHookEffectListMount(hookFlags, finishedWork), recordEffectDuration()) : commitHookEffectListMount(hookFlags, finishedWork);
6890		}
6891		function commitHookLayoutUnmountEffects(finishedWork, nearestMountedAncestor, hookFlags) {
6892			shouldProfile(finishedWork) ? (startEffectTimer(), commitHookEffectListUnmount(hookFlags, finishedWork, nearestMountedAncestor), recordEffectDuration()) : commitHookEffectListUnmount(hookFlags, finishedWork, nearestMountedAncestor);
6893		}
6894		function commitHookEffectListMount(flags, finishedWork) {
6895			try {
6896				var updateQueue = finishedWork.updateQueue, lastEffect = null !== updateQueue ? updateQueue.lastEffect : null;
6897				if (null !== lastEffect) {
6898					var firstEffect = lastEffect.next;
6899					updateQueue = firstEffect;
6900					do {
6901						if ((updateQueue.tag & flags) === flags && (lastEffect = void 0, (flags & Insertion) !== NoFlags && (isRunningInsertionEffect = !0), lastEffect = runWithFiberInDEV(finishedWork, callCreateInDEV, updateQueue), (flags & Insertion) !== NoFlags && (isRunningInsertionEffect = !1), void 0 !== lastEffect && "function" !== typeof lastEffect)) {
6902							var hookName = void 0;
6903							hookName = 0 !== (updateQueue.tag & Layout) ? "useLayoutEffect" : 0 !== (updateQueue.tag & Insertion) ? "useInsertionEffect" : "useEffect";
6904							var addendum = void 0;
6905							addendum = null === lastEffect ? " You returned null. If your effect does not require clean up, return undefined (or nothing)." : "function" === typeof lastEffect.then ? "\n\nIt looks like you wrote " + hookName + "(async () => ...) or returned a Promise. Instead, write the async function inside your effect and call it immediately:\n\n" + hookName + "(() => {\n  async function fetchData() {\n    // You can await here\n    const response = await MyAPI.getData(someId);\n    // ...\n  }\n  fetchData();\n}, [someId]); // Or [] if effect doesn't need props or state\n\nLearn more about data fetching with Hooks: https://react.dev/link/hooks-data-fetching" : " You returned: " + lastEffect;
6906							runWithFiberInDEV(finishedWork, function(n, a) {
6907								console.error("%s must not return anything besides a function, which is used for clean-up.%s", n, a);
6908							}, hookName, addendum);
6909						}
6910						updateQueue = updateQueue.next;
6911					} while (updateQueue !== firstEffect);
6912				}
6913			} catch (error) {
6914				captureCommitPhaseError(finishedWork, finishedWork.return, error);
6915			}
6916		}
6917		function commitHookEffectListUnmount(flags, finishedWork, nearestMountedAncestor) {
6918			try {
6919				var updateQueue = finishedWork.updateQueue, lastEffect = null !== updateQueue ? updateQueue.lastEffect : null;
6920				if (null !== lastEffect) {
6921					var firstEffect = lastEffect.next;
6922					updateQueue = firstEffect;
6923					do {
6924						if ((updateQueue.tag & flags) === flags) {
6925							var inst = updateQueue.inst, destroy = inst.destroy;
6926							void 0 !== destroy && (inst.destroy = void 0, (flags & Insertion) !== NoFlags && (isRunningInsertionEffect = !0), lastEffect = finishedWork, runWithFiberInDEV(lastEffect, callDestroyInDEV, lastEffect, nearestMountedAncestor, destroy), (flags & Insertion) !== NoFlags && (isRunningInsertionEffect = !1));
6927						}
6928						updateQueue = updateQueue.next;
6929					} while (updateQueue !== firstEffect);
6930				}
6931			} catch (error) {
6932				captureCommitPhaseError(finishedWork, finishedWork.return, error);
6933			}
6934		}
6935		function commitHookPassiveMountEffects(finishedWork, hookFlags) {
6936			shouldProfile(finishedWork) ? (startEffectTimer(), commitHookEffectListMount(hookFlags, finishedWork), recordEffectDuration()) : commitHookEffectListMount(hookFlags, finishedWork);
6937		}
6938		function commitHookPassiveUnmountEffects(finishedWork, nearestMountedAncestor, hookFlags) {
6939			shouldProfile(finishedWork) ? (startEffectTimer(), commitHookEffectListUnmount(hookFlags, finishedWork, nearestMountedAncestor), recordEffectDuration()) : commitHookEffectListUnmount(hookFlags, finishedWork, nearestMountedAncestor);
6940		}
6941		function commitClassCallbacks(finishedWork) {
6942			var updateQueue = finishedWork.updateQueue;
6943			if (null !== updateQueue) {
6944				var instance = finishedWork.stateNode;
6945				finishedWork.type.defaultProps || "ref" in finishedWork.memoizedProps || didWarnAboutReassigningProps || (instance.props !== finishedWork.memoizedProps && console.error("Expected %s props to match memoized props before processing the update queue. This might either be because of a bug in React, or because a component reassigns its own `this.props`. Please file an issue.", getComponentNameFromFiber(finishedWork) || "instance"), instance.state !== finishedWork.memoizedState && console.error("Expected %s state to match memoized state before processing the update queue. This might either be because of a bug in React, or because a component reassigns its own `this.state`. Please file an issue.", getComponentNameFromFiber(finishedWork) || "instance"));
6946				try {
6947					runWithFiberInDEV(finishedWork, commitCallbacks, updateQueue, instance);
6948				} catch (error) {
6949					captureCommitPhaseError(finishedWork, finishedWork.return, error);
6950				}
6951			}
6952		}
6953		function callGetSnapshotBeforeUpdates(instance, prevProps, prevState) {
6954			return instance.getSnapshotBeforeUpdate(prevProps, prevState);
6955		}
6956		function commitClassSnapshot(finishedWork, current) {
6957			var prevProps = current.memoizedProps, prevState = current.memoizedState;
6958			current = finishedWork.stateNode;
6959			finishedWork.type.defaultProps || "ref" in finishedWork.memoizedProps || didWarnAboutReassigningProps || (current.props !== finishedWork.memoizedProps && console.error("Expected %s props to match memoized props before getSnapshotBeforeUpdate. This might either be because of a bug in React, or because a component reassigns its own `this.props`. Please file an issue.", getComponentNameFromFiber(finishedWork) || "instance"), current.state !== finishedWork.memoizedState && console.error("Expected %s state to match memoized state before getSnapshotBeforeUpdate. This might either be because of a bug in React, or because a component reassigns its own `this.state`. Please file an issue.", getComponentNameFromFiber(finishedWork) || "instance"));
6960			try {
6961				var resolvedPrevProps = resolveClassComponentProps(finishedWork.type, prevProps);
6962				var snapshot = runWithFiberInDEV(finishedWork, callGetSnapshotBeforeUpdates, current, resolvedPrevProps, prevState);
6963				prevProps = didWarnAboutUndefinedSnapshotBeforeUpdate;
6964				void 0 !== snapshot || prevProps.has(finishedWork.type) || (prevProps.add(finishedWork.type), runWithFiberInDEV(finishedWork, function() {
6965					console.error("%s.getSnapshotBeforeUpdate(): A snapshot value (or null) must be returned. You have returned undefined.", getComponentNameFromFiber(finishedWork));
6966				}));
6967				current.__reactInternalSnapshotBeforeUpdate = snapshot;
6968			} catch (error) {
6969				captureCommitPhaseError(finishedWork, finishedWork.return, error);
6970			}
6971		}
6972		function safelyCallComponentWillUnmount(current, nearestMountedAncestor, instance) {
6973			instance.props = resolveClassComponentProps(current.type, current.memoizedProps);
6974			instance.state = current.memoizedState;
6975			shouldProfile(current) ? (startEffectTimer(), runWithFiberInDEV(current, callComponentWillUnmountInDEV, current, nearestMountedAncestor, instance), recordEffectDuration()) : runWithFiberInDEV(current, callComponentWillUnmountInDEV, current, nearestMountedAncestor, instance);
6976		}
6977		function commitAttachRef(finishedWork) {
6978			var ref = finishedWork.ref;
6979			if (null !== ref) {
6980				switch (finishedWork.tag) {
6981					case 26:
6982					case 27:
6983					case 5:
6984						var instanceToUse = finishedWork.stateNode;
6985						break;
6986					case 30:
6987						instanceToUse = finishedWork.stateNode;
6988						var name = getViewTransitionName(finishedWork.memoizedProps, instanceToUse);
6989						if (null === instanceToUse.ref || instanceToUse.ref.name !== name) instanceToUse.ref = createViewTransitionInstance(name);
6990						instanceToUse = instanceToUse.ref;
6991						break;
6992					case 7:
6993						null === finishedWork.stateNode && (instanceToUse = new FragmentInstance(finishedWork), traverseFragmentInstancesAndTextInstances(finishedWork, addFragmentHandleToFiber, instanceToUse), finishedWork.stateNode = instanceToUse);
6994						instanceToUse = finishedWork.stateNode;
6995						break;
6996					default: instanceToUse = finishedWork.stateNode;
6997				}
6998				if ("function" === typeof ref) if (shouldProfile(finishedWork)) try {
6999					startEffectTimer(), finishedWork.refCleanup = ref(instanceToUse);
7000				} finally {
7001					recordEffectDuration();
7002				}
7003				else finishedWork.refCleanup = ref(instanceToUse);
7004				else "string" === typeof ref ? console.error("String refs are no longer supported.") : ref.hasOwnProperty("current") || console.error("Unexpected ref object provided for %s. Use either a ref-setter function or React.createRef().", getComponentNameFromFiber(finishedWork)), ref.current = instanceToUse;
7005			}
7006		}
7007		function safelyAttachRef(current, nearestMountedAncestor) {
7008			try {
7009				runWithFiberInDEV(current, commitAttachRef, current);
7010			} catch (error) {
7011				captureCommitPhaseError(current, nearestMountedAncestor, error);
7012			}
7013		}
7014		function safelyDetachRef(current, nearestMountedAncestor) {
7015			var ref = current.ref, refCleanup = current.refCleanup;
7016			if (null !== ref) if ("function" === typeof refCleanup) try {
7017				if (shouldProfile(current)) try {
7018					startEffectTimer(), runWithFiberInDEV(current, refCleanup);
7019				} finally {
7020					recordEffectDuration(current);
7021				}
7022				else runWithFiberInDEV(current, refCleanup);
7023			} catch (error) {
7024				captureCommitPhaseError(current, nearestMountedAncestor, error);
7025			} finally {
7026				current.refCleanup = null, current = current.alternate, null != current && (current.refCleanup = null);
7027			}
7028			else if ("function" === typeof ref) try {
7029				if (shouldProfile(current)) try {
7030					startEffectTimer(), runWithFiberInDEV(current, ref, null);
7031				} finally {
7032					recordEffectDuration(current);
7033				}
7034				else runWithFiberInDEV(current, ref, null);
7035			} catch (error$8) {
7036				captureCommitPhaseError(current, nearestMountedAncestor, error$8);
7037			}
7038			else ref.current = null;
7039		}
7040		function commitProfiler(finishedWork, current, commitStartTime, effectDuration) {
7041			var _finishedWork$memoize = finishedWork.memoizedProps, id = _finishedWork$memoize.id, onCommit = _finishedWork$memoize.onCommit;
7042			_finishedWork$memoize = _finishedWork$memoize.onRender;
7043			current = null === current ? "mount" : "update";
7044			currentUpdateIsNested && (current = "nested-update");
7045			"function" === typeof _finishedWork$memoize && _finishedWork$memoize(id, current, finishedWork.actualDuration, finishedWork.treeBaseDuration, finishedWork.actualStartTime, commitStartTime);
7046			"function" === typeof onCommit && onCommit(id, current, effectDuration, commitStartTime);
7047		}
7048		function commitProfilerPostCommitImpl(finishedWork, current, commitStartTime, passiveEffectDuration) {
7049			var _finishedWork$memoize2 = finishedWork.memoizedProps;
7050			finishedWork = _finishedWork$memoize2.id;
7051			_finishedWork$memoize2 = _finishedWork$memoize2.onPostCommit;
7052			current = null === current ? "mount" : "update";
7053			currentUpdateIsNested && (current = "nested-update");
7054			"function" === typeof _finishedWork$memoize2 && _finishedWork$memoize2(finishedWork, current, passiveEffectDuration, commitStartTime);
7055		}
7056		function commitNewChildToFragmentInstances(fiber, parentFragmentInstances) {
7057			if ((5 === fiber.tag || 27 === fiber.tag || 6 === fiber.tag) && null === fiber.alternate && null !== parentFragmentInstances) for (var i = 0; i < parentFragmentInstances.length; i++) commitNewChildToFragmentInstance(fiber.stateNode, parentFragmentInstances[i]);
7058		}
7059		function commitFragmentInstanceInsertionEffects(fiber) {
7060			for (var parent = fiber.return; null !== parent;) {
7061				isFragmentInstanceParent(parent) && commitNewChildToFragmentInstance(fiber.stateNode, parent.stateNode);
7062				if (isFragmentInstanceHostBoundary(parent)) break;
7063				parent = parent.return;
7064			}
7065		}
7066		function commitFragmentInstanceDeletionEffects(fiber) {
7067			for (var parent = fiber.return; null !== parent;) {
7068				isFragmentInstanceParent(parent) && deleteChildFromFragmentInstance(fiber.stateNode, parent.stateNode);
7069				if (isFragmentInstanceHostBoundary(parent)) break;
7070				parent = parent.return;
7071			}
7072		}
7073		function isFragmentInstanceHostBoundary(fiber) {
7074			return 5 === fiber.tag || 3 === fiber.tag || 27 === fiber.tag;
7075		}
7076		function isFragmentInstanceParent(fiber) {
7077			return fiber && 7 === fiber.tag && null !== fiber.stateNode;
7078		}
7079		function commitHostMount(finishedWork) {
7080			var type = finishedWork.type, props = finishedWork.memoizedProps, instance = f
7080inishedWork.stateNode;
7081			try {
7082				runWithFiberInDEV(finishedWork, commitMount, instance, type, props, finishedWork);
7083			} catch (error) {
7084				captureCommitPhaseError(finishedWork, finishedWork.return, error);
7085			}
7086		}
7087		function commitHostUpdate(finishedWork, newProps, oldProps) {
7088			try {
7089				runWithFiberInDEV(finishedWork, commitUpdate, finishedWork.stateNode, finishedWork.type, oldProps, newProps, finishedWork);
7090			} catch (error) {
7091				captureCommitPhaseError(finishedWork, finishedWork.return, error);
7092			}
7093		}
7094		function isHostParent(fiber) {
7095			return 5 === fiber.tag || 3 === fiber.tag || 26 === fiber.tag || 27 === fiber.tag && isSingletonScope(fiber.type) || 4 === fiber.tag;
7096		}
7097		function getHostSibling(fiber) {
7098			a: for (;;) {
7099				for (; null === fiber.sibling;) {
7100					if (null === fiber.return || isHostParent(fiber.return)) return null;
7101					fiber = fiber.return;
7102				}
7103				fiber.sibling.return = fiber.return;
7104				for (fiber = fiber.sibling; 5 !== fiber.tag && 6 !== fiber.tag && 18 !== fiber.tag;) {
7105					if (27 === fiber.tag && isSingletonScope(fiber.type)) continue a;
7106					if (fiber.flags & 2) continue a;
7107					if (null === fiber.child || 4 === fiber.tag) continue a;
7108					else fiber.child.return = fiber, fiber = fiber.child;
7109				}
7110				if (!(fiber.flags & 2)) return fiber.stateNode;
7111			}
7112		}
7113		function insertOrAppendPlacementNodeIntoContainer(node, before, parent, parentFragmentInstances) {
7114			var tag = node.tag;
7115			if (5 === tag || 6 === tag) tag = node.stateNode, before ? (warnForReactChildrenConflict(parent), (9 === parent.nodeType ? parent.body : "HTML" === parent.nodeName ? parent.ownerDocument.body : parent).insertBefore(tag, before)) : (warnForReactChildrenConflict(parent), before = 9 === parent.nodeType ? parent.body : "HTML" === parent.nodeName ? parent.ownerDocument.body : parent, before.appendChild(tag), tag = parent._reactRootContainer, null !== tag && void 0 !== tag || null !== before.onclick || (before.onclick = noop$1)), commitNewChildToFragmentInstances(node, parentFragmentInstances), viewTransitionMutationContext = !0;
7116			else if (4 !== tag && (27 === tag && (commitNewChildToFragmentInstances(node, parentFragmentInstances), parentFragmentInstances = null, isSingletonScope(node.type) && (parent = node.stateNode, before = null)), node = node.child, null !== node)) for (insertOrAppendPlacementNodeIntoContainer(node, before, parent, parentFragmentInstances), node = node.sibling; null !== node;) insertOrAppendPlacementNodeIntoContainer(node, before, parent, parentFragmentInstances), node = node.sibling;
7117		}
7118		function insertOrAppendPlacementNode(node, before, parent, parentFragmentInstances) {
7119			var tag = node.tag;
7120			if (5 === tag || 6 === tag) tag = node.stateNode, before ? parent.insertBefore(tag, before) : parent.appendChild(tag), commitNewChildToFragmentInstances(node, parentFragmentInstances), viewTransitionMutationContext = !0;
7121			else if (4 !== tag && (27 === tag && (commitNewChildToFragmentInstances(node, parentFragmentInstances), parentFragmentInstances = null, isSingletonScope(node.type) && (parent = node.stateNode)), node = node.child, null !== node)) for (insertOrAppendPlacementNode(node, before, parent, parentFragmentInstances), node = node.sibling; null !== node;) insertOrAppendPlacementNode(node, before, parent, parentFragmentInstances), node = node.sibling;
7122		}
7123		function commitPlacement(finishedWork) {
7124			for (var hostParentFiber, parentFiber = finishedWork.return; null !== parentFiber;) {
7125				if (isHostParent(parentFiber)) {
7126					hostParentFiber = parentFiber;
7127					break;
7128				}
7129				parentFiber = parentFiber.return;
7130			}
7131			parentFiber = null;
7132			for (var parent = finishedWork.return; null !== parent;) {
7133				if (isFragmentInstanceParent(parent)) {
7134					var fragmentInstance = parent.stateNode;
7135					null === parentFiber ? parentFiber = [fragmentInstance] : parentFiber.push(fragmentInstance);
7136				}
7137				if (isFragmentInstanceHostBoundary(parent)) break;
7138				parent = parent.return;
7139			}
7140			if (null == hostParentFiber) throw Error("Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue.");
7141			switch (hostParentFiber.tag) {
7142				case 27:
7143					hostParentFiber = hostParentFiber.stateNode;
7144					parent = getHostSibling(finishedWork);
7145					insertOrAppendPlacementNode(finishedWork, parent, hostParentFiber, parentFiber);
7146					break;
7147				case 5:
7148					parent = hostParentFiber.stateNode;
7149					hostParentFiber.flags & 32 && (resetTextContent(parent), hostParentFiber.flags &= -33);
7150					hostParentFiber = getHostSibling(finishedWork);
7151					insertOrAppendPlacementNode(finishedWork, hostParentFiber, parent, parentFiber);
7152					break;
7153				case 3:
7154				case 4:
7155					hostParentFiber = hostParentFiber.stateNode.containerInfo;
7156					parent = getHostSibling(finishedWork);
7157					insertOrAppendPlacementNodeIntoContainer(finishedWork, parent, hostParentFiber, parentFiber);
7158					break;
7159				default: throw Error("Invalid host parent fiber. This error is likely caused by a bug in React. Please file an issue.");
7160			}
7161		}
7162		function commitHostSingletonAcquisition(finishedWork) {
7163			var singleton = finishedWork.stateNode, props = finishedWork.memoizedProps;
7164			try {
7165				runWithFiberInDEV(finishedWork, acquireSingletonInstance, finishedWork.type, props, singleton, finishedWork);
7166			} catch (error) {
7167				captureCommitPhaseError(finishedWork, finishedWork.return, error);
7168			}
7169		}
7170		function trackEnterViewTransitions(placement) {
7171			if (30 === placement.tag || 0 !== (placement.subtreeFlags & 33554432)) shouldStartViewTransition = !0;
7172		}
7173		function pushViewTransitionCancelableScope() {
7174			var prevChildren = viewTransitionCancelableChildren;
7175			viewTransitionCancelableChildren = null;
7176			return prevChildren;
7177		}
7178		function applyViewTransitionToHostInstances(fiber, name, className, collectMeasurements, stopAtNestedViewTransitions) {
7179			viewTransitionHostInstanceIdx = 0;
7180			(name = applyViewTransitionToHostInstancesRecursive(fiber.child, name, className, collectMeasurements, stopAtNestedViewTransitions)) && null != fiber._debugTask && null === animatingTask && (animatingTask = fiber._debugTask);
7181			return name;
7182		}
7183		function applyViewTransitionToHostInstancesRecursive(child, name, className, collectMeasurements, stopAtNestedViewTransitions) {
7184			for (var inViewport = !1; null !== child;) {
7185				if (5 === child.tag) {
7186					var _instance = child.stateNode;
7187					if (null !== collectMeasurements) {
7188						var measurement = measureInstance(_instance);
7189						collectMeasurements.push(measurement);
7190						measurement.view && (inViewport = !0);
7191					} else inViewport || measureInstance(_instance).view && (inViewport = !0);
7192					shouldStartViewTransition = !0;
7193					applyViewTransitionName(_instance, 0 === viewTransitionHostInstanceIdx ? name : name + "_" + viewTransitionHostInstanceIdx, className);
7194					viewTransitionHostInstanceIdx++;
7195				} else if (22 !== child.tag || null === child.memoizedState) 30 === child.tag && stopAtNestedViewTransitions || applyViewTransitionToHostInstancesRecursive(child.child, name, className, collectMeasurements, stopAtNestedViewTransitions) && (inViewport = !0);
7196				child = child.sibling;
7197			}
7198			return inViewport;
7199		}
7200		function restoreViewTransitionOnHostInstances(child, stopAtNestedViewTransitions) {
7201			for (; null !== child;) {
7202				if (5 === child.tag) restoreViewTransitionName(child.stateNode, child.memoizedProps);
7203				else if (22 !== child.tag || null === child.memoizedState) 30 === child.tag && stopAtNestedViewTransitions || restoreViewTransitionOnHostInstances(child.child, stopAtNestedViewTransitions);
7204				child = child.sibling;
7205			}
7206		}
7207		function commitAppearingPairViewTransitions(placement) {
7208			if (0 !== (placement.subtreeFlags & 18874368)) for (placement = placement.child; null !== placement;) {
7209				if (22 !== placement.tag || null === placement.memoizedState) {
7210					if (commitAppearingPairViewTransitions(placement), 30 === placement.tag && 0 !== (placement.flags & 18874368) && placement.stateNode.paired) {
7211						var props = placement.memoizedProps;
7212						if (null == props.name || "auto" === props.name) throw Error("Found a pair with an auto name. This is a bug in React.");
7213						var name = props.name;
7214						props = getViewTransitionClassName(props.default, props.share);
7215						"none" !== props && (applyViewTransitionToHostInstances(placement, name, props, null, !1) || restoreViewTransitionOnHostInstances(placement.child, !1));
7216					}
7217				}
7218				placement = placement.sibling;
7219			}
7220		}
7221		function commitEnterViewTransitions(placement, gesture) {
7222			if (30 === placement.tag) {
7223				var state = placement.stateNode, props = placement.memoizedProps, name = getViewTransitionName(props, state), className = getViewTransitionClassName(props.default, state.paired ? props.share : props.enter);
7224				"none" !== className ? applyViewTransitionToHostInstances(placement, name, className, null, !1) ? (commitAppearingPairViewTransitions(placement), state.paired || gesture || scheduleViewTransitionEvent(placement, props.onEnter)) : restoreViewTransitionOnHostInstances(placement.child, !1) : commitAppearingPairViewTransitions(placement);
7225			} else if (0 !== (placement.subtreeFlags & 33554432)) for (placement = placement.child; null !== placement;) commitEnterViewTransitions(placement, gesture), placement = placement.sibling;
7226			else commitAppearingPairViewTransitions(placement);
7227		}
7228		function commitDeletedPairViewTransitions(deletion) {
7229			if (null !== appearingViewTransitions && 0 !== appearingViewTransitions.size) {
7230				var pairs = appearingViewTransitions;
7231				if (0 !== (deletion.subtreeFlags & 18874368)) for (deletion = deletion.child; null !== deletion;) {
7232					if (22 !== deletion.tag || null === deletion.memoizedState) {
7233						if (30 === deletion.tag && 0 !== (deletion.flags & 18874368)) {
7234							var props = deletion.memoizedProps, name = props.name;
7235							if (null != name && "auto" !== name) {
7236								var pair = pairs.get(name);
7237								if (void 0 !== pair) {
7238									var className = getViewTransitionClassName(props.default, props.share);
7239									"none" !== className && (applyViewTransitionToHostInstances(deletion, name, className, null, !1) ? (className = deletion.stateNode, pair.paired = className, className.paired = pair, scheduleViewTransitionEvent(deletion, props.onShare)) : restoreViewTransitionOnHostInstances(deletion.child, !1));
7240									pairs.delete(name);
7241									if (0 === pairs.size) break;
7242								}
7243							}
7244						}
7245						commitDeletedPairViewTransitions(deletion);
7246					}
vendor: 1,060 bytes, lines 7247-7256
7247					deletion = deletion.sibling;
7248				}
7249			}
7250		}
7251		function commitExitViewTransitions(deletion) {
7252			if (30 === deletion.tag) {
7253				var props = deletion.memoizedProps, name = getViewTransitionName(props, deletion.stateNode), pair = null !== appearingViewTransitions ? appearingViewTransitions.get(name) : void 0, className = getViewTransitionClassName(props.default, void 0 !== pair ? props.share : props.exit);
7254				"none" !== className && (applyViewTransitionToHostInstances(deletion, name, className, null, !1) ? void 0 !== pair ? (className = deletion.stateNode, pair.paired = className, className.paired = pair, appearingViewTransitions.delete(name), scheduleViewTransitionEvent(deletion, props.onShare)) : scheduleViewTransitionEvent(deletion, props.onExit) : restoreViewTransitionOnHostInstances(deletion.child, !1));
7255				null !== appearingViewTransitions && commitDeletedPairViewTransitions(deletion);
7256			} else if (0 !== (deletion.subtreeFlags & 33554432)) for (deletion = deletion.child; null !== deletion;) commitExitViewTransitions(deletion), deleti
7256on = deletion.sibling;
7257			else null !== appearingViewTransitions && commitDeletedPairViewTransitions(deletion);
7258		}
7259		function commitNestedViewTransitions(changedParent) {
7260			for (changedParent = changedParent.child; null !== changedParent;) {
7261				if (30 === changedParent.tag) {
7262					var props = changedParent.memoizedProps, name = getViewTransitionName(props, changedParent.stateNode);
7263					props = getViewTransitionClassName(props.default, props.update);
7264					changedParent.flags &= -5;
7265					"none" !== props && applyViewTransitionToHostInstances(changedParent, name, props, changedParent.memoizedState = [], !1);
7266				} else 0 !== (changedParent.subtreeFlags & 33554432) && commitNestedViewTransitions(changedParent);
7267				changedParent = changedParent.sibling;
7268			}
7269		}
7270		function restorePairedViewTransitions(parent) {
7271			if (0 !== (parent.subtreeFlags & 18874368)) for (parent = parent.child; null !== parent;) {
7272				if (22 !== parent.tag || null === parent.memoizedState) {
7273					if (30 === parent.tag && 0 !== (parent.flags & 18874368)) {
7274						var instance = parent.stateNode;
7275						null !== instance.paired && (instance.paired = null, restoreViewTransitionOnHostInstances(parent.child, !1));
7276					}
7277					restorePairedViewTransitions(parent);
7278				}
7279				parent = parent.sibling;
7280			}
7281		}
7282		function restoreEnterOrExitViewTransitions(fiber) {
7283			if (30 === fiber.tag) fiber.stateNode.paired = null, restoreViewTransitionOnHostInstances(fiber.child, !1), restorePairedViewTransitions(fiber);
7284			else if (0 !== (fiber.subtreeFlags & 33554432)) for (fiber = fiber.child; null !== fiber;) restoreEnterOrExitViewTransitions(fiber), fiber = fiber.sibling;
7285			else restorePairedViewTransitions(fiber);
7286		}
7287		function restoreNestedViewTransitions(changedParent) {
7288			for (changedParent = changedParent.child; null !== changedParent;) 30 === changedParent.tag ? restoreViewTransitionOnHostInstances(changedParent.child, !1) : 0 !== (changedParent.subtreeFlags & 33554432) && restoreNestedViewTransitions(changedParent), changedParent = changedParent.sibling;
7289		}
7290		function measureViewTransitionHostInstancesRecursive(parentViewTransition, child, newName, oldName, className, previousMeasurements, stopAtNestedViewTransitions) {
7291			for (var inViewport = !1; null !== child;) {
7292				if (5 === child.tag) {
7293					var _instance2 = child.stateNode;
7294					if (null !== previousMeasurements && viewTransitionHostInstanceIdx < previousMeasurements.length) {
7295						var previousMeasurement = previousMeasurements[viewTransitionHostInstanceIdx], nextMeasurement = measureInstance(_instance2);
7296						if (previousMeasurement.view || nextMeasurement.view) inViewport = !0;
7297						var JSCompiler_temp;
7298						if (JSCompiler_temp = 0 === (parentViewTransition.flags & 4)) if (nextMeasurement.clip) JSCompiler_temp = !0;
7299						else {
7300							JSCompiler_temp = previousMeasurement.rect;
7301							var newRect = nextMeasurement.rect;
7302							JSCompiler_temp = JSCompiler_temp.y !== newRect.y || JSCompiler_temp.x !== newRect.x || JSCompiler_temp.height !== newRect.height || JSCompiler_temp.width !== newRect.width;
7303						}
7304						JSCompiler_temp && (parentViewTransition.flags |= 4);
7305						nextMeasurement.abs ? nextMeasurement = !previousMeasurement.abs : (previousMeasurement = previousMeasurement.rect, nextMeasurement = nextMeasurement.rect, nextMeasurement = previousMeasurement.height !== nextMeasurement.height || previousMeasurement.width !== nextMeasurement.width);
7306						nextMeasurement && (parentViewTransition.flags |= 32);
7307					} else parentViewTransition.flags |= 32;
7308					0 !== (parentViewTransition.flags & 4) && applyViewTransitionName(_instance2, 0 === viewTransitionHostInstanceIdx ? newName : newName + "_" + viewTransitionHostInstanceIdx, className);
7309					inViewport && 0 !== (parentViewTransition.flags & 4) || (null === viewTransitionCancelableChildren && (viewTransitionCancelableChildren = []), viewTransitionCancelableChildren.push(_instance2, 0 === viewTransitionHostInstanceIdx ? oldName : oldName + "_" + viewTransitionHostInstanceIdx, child.memoizedProps));
7310					viewTransitionHostInstanceIdx++;
7311				} else if (22 !== child.tag || null === child.memoizedState) 30 === child.tag && stopAtNestedViewTransitions ? parentViewTransition.flags |= child.flags & 32 : measureViewTransitionHostInstancesRecursive(parentViewTransition, child.child, newName, oldName, className, previousMeasurements, stopAtNestedViewTransitions) && (inViewport = !0);
7312				child = child.sibling;
7313			}
7314			return inViewport;
7315		}
7316		function measureNestedViewTransitions(changedParent, gesture) {
7317			for (changedParent = changedParent.child; null !== changedParent;) {
7318				if (30 === changedParent.tag) {
7319					var props = changedParent.memoizedProps, state = changedParent.stateNode, name = getViewTransitionName(props, state), className = getViewTransitionClassName(props.default, props.update);
7320					if (gesture) {
7321						state = state.clones;
7322						var previousMeasurements = null === state ? null : state.map(measureClonedInstance);
7323					} else previousMeasurements = changedParent.memoizedState, changedParent.memoizedState = null;
7324					state = changedParent;
7325					var child = changedParent.child, newName = name;
7326					viewTransitionHostInstanceIdx = 0;
7327					className = measureViewTransitionHostInstancesRecursive(state, child, newName, name, className, previousMeasurements, !1);
7328					0 !== (changedParent.flags & 4) && className && (gesture || scheduleViewTransitionEvent(changedParent, props.onUpdate));
7329				} else 0 !== (changedParent.subtreeFlags & 33554432) && measureNestedViewTransitions(changedParent, gesture);
7330				changedParent = changedParent.sibling;
7331			}
7332		}
7333		function trackNamedViewTransition(fiber) {
7334			var name = fiber.memoizedProps.name;
7335			if (null != name && "auto" !== name) {
7336				var existing = mountedNamedViewTransitions.get(name);
7337				if (void 0 !== existing) {
7338					if (existing !== fiber && existing !== fiber.alternate && !didWarnAboutName[name]) {
7339						didWarnAboutName[name] = !0;
7340						var stringifiedName = JSON.stringify(name);
7341						runWithFiberInDEV(fiber, function() {
7342							console.error("There are two <ViewTransition name=%s> components with the same name mounted at the same time. This is not supported and will cause View Transitions to error. Try to use a more unique name e.g. by using a namespace prefix and adding the id of an item to the name.", stringifiedName);
7343						});
7344						runWithFiberInDEV(existing, function() {
7345							console.error("The existing <ViewTransition name=%s> duplicate has this stack trace.", stringifiedName);
7346						});
7347					}
7348				} else mountedNamedViewTransitions.set(name, fiber);
7349			}
7350		}
7351		function untrackNamedViewTransition(fiber) {
7352			var name = fiber.memoizedProps.name;
7353			if (null != name && "auto" !== name) {
7354				var existing = mountedNamedViewTransitions.get(name);
7355				void 0 === existing || existing !== fiber && existing !== fiber.alternate || mountedNamedViewTransitions.delete(name);
7356			}
7357		}
7358		function isHydratingParent(current, finishedWork) {
7359			return 31 === finishedWork.tag ? (finishedWork = finishedWork.memoizedState, null !== current.memoizedState && null === finishedWork) : 13 === finishedWork.tag ? (current = current.memoizedState, finishedWork = finishedWork.memoizedState, null !== current && null !== current.dehydrated && (null === finishedWork || null === finishedWork.dehydrated)) : 3 === finishedWork.tag ? current.memoizedState.isDehydrated && 0 === (finishedWork.flags & 256) : !1;
7360		}
7361		function commitBeforeMutationEffects(root, firstChild, committedLanes) {
7362			root = root.containerInfo;
7363			eventsEnabled = _enabled;
7364			root = getActiveElementDeep(root);
7365			if (hasSelectionCapabilities(root)) {
7366				if ("selectionStart" in root) var JSCompiler_temp = {
7367					start: root.selectionStart,
7368					end: root.selectionEnd
7369				};
7370				else a: {
7371					JSCompiler_temp = (JSCompiler_temp = root.ownerDocument) && JSCompiler_temp.defaultView || window;
7372					var selection = JSCompiler_temp.getSelection && JSCompiler_temp.getSelection();
7373					if (selection && 0 !== selection.rangeCount) {
7374						JSCompiler_temp = selection.anchorNode;
7375						var anchorOffset = selection.anchorOffset, focusNode = selection.focusNode;
7376						selection = selection.focusOffset;
7377						try {
7378							JSCompiler_temp.nodeType, focusNode.nodeType;
7379						} catch (e$3) {
7380							JSCompiler_temp = null;
7381							break a;
7382						}
7383						var length = 0, start = -1, end = -1, indexWithinAnchor = 0, indexWithinFocus = 0, node = root, parentNode = null;
7384						b: for (;;) {
7385							for (var next;;) {
7386								node !== JSCompiler_temp || 0 !== anchorOffset && 3 !== node.nodeType || (start = length + anchorOffset);
7387								node !== focusNode || 0 !== selection && 3 !== node.nodeType || (end = length + selection);
7388								3 === node.nodeType && (length += node.nodeValue.length);
7389								if (null === (next = node.firstChild)) break;
7390								parentNode = node;
7391								node = next;
7392							}
7393							for (;;) {
7394								if (node === root) break b;
7395								parentNode === JSCompiler_temp && ++indexWithinAnchor === anchorOffset && (start = length);
7396								parentNode === focusNode && ++indexWithinFocus === selection && (end = length);
7397								if (null !== (next = node.nextSibling)) break;
7398								node = parentNode;
7399								parentNode = node.parentNode;
7400							}
7401							node = next;
7402						}
7403						JSCompiler_temp = -1 === start || -1 === end ? null : {
7404							start,
7405							end
7406						};
7407					} else JSCompiler_temp = null;
7408				}
7409				JSCompiler_temp = JSCompiler_temp || {
7410					start: 0,
7411					end: 0
7412				};
7413			} else JSCompiler_temp = null;
7414			selectionInformation = {
7415				focusedElem: root,
7416				selectionRange: JSCompiler_temp
7417			};
7418			_enabled = !1;
7419			committedLanes = (committedLanes & 335544064) === committedLanes;
7420			nextEffect = firstChild;
7421			for (firstChild = committedLanes ? 9270 : 1024; null !== nextEffect;) {
7422				root = nextEffect;
7423				if (committedLanes && (JSCompiler_temp = root.deletions, null !== JSCompiler_temp)) for (anchorOffset = 0; anchorOffset < JSCompiler_temp.length; anchorOffset++) committedLanes && commitExitViewTransitions(JSCompiler_temp[anchorOffset]);
7424				if (null === root.alternate && 0 !== (root.flags & 2)) committedLanes && trackEnterViewTransitions(root), commitBeforeMutationEffects_complete(committedLanes);
7425				else {
7426					if (22 === root.tag) {
7427						if (JSCompiler_temp = root.alternate, null !== root.memoizedState) {
7428							null !== JSCompiler_temp && null === JSCompiler_temp.memoizedState && committedLanes && commitExitViewTransitions(JSCompiler_temp);
7429							commitBeforeMutationEffects_complete(committedLanes);
7430							continue;
7431						} else if (null !== JSCompiler_temp && null !== JSCompiler_temp.memoizedState) {
7432							committedLanes && trackEnterViewTransitions(root);
7433							commitBeforeMutationEffects_complete(committedLanes);
7434							continue;
7435						}
7436					}
7437					JSCompiler_temp = root.child;
7438					0 !== (root.subtreeFlags & firstChild) && null !== JSCompiler_temp ? (JSCompiler_temp.return = root, nextEffect = JSCompiler_temp) : (committedLanes && commitNestedViewTransitions(root), commitBeforeMutationEffects_complete(committedLanes));
7439				}
7440			}
7441			appearingViewTransitions = null;
7442		}
7443		function commitBeforeMutationEffects_complete(isViewTransitionEligible$jscomp$0) {
7444			for (; null !== nextEffect;) {
7445				var fiber = nextEffect, finishedWork = fiber, isViewTransitionEligible = isViewTransitionEligible$jscomp$0, current = finishedWork.alternate, flags = finishedWork.flags;
7446				switch (finishedWork.tag) {
7447					case 0:
7448					case 11:
7449					case 15: break;
7450					case 1:
7451						0 !== (flags & 1024) && null !== current && commitClassSnapshot(finishedWork, current);
7452						break;
7453					case 3:
7454						if (0 !== (flags & 1024)) {
7455							if (isViewTransitionEligible = finishedWork.stateNode.containerInfo, finishedWork = isViewTransitionEligible.nodeType, 9 === finishedWork) clearContainerSparingly(isViewTransitionEligible);
7456							else if (1 === finishedWork) switch (isViewTransitionEligible.nodeName) {
7457								case "HEAD":
7458								case "HTML":
7459								case "BODY":
7460									clearContainerSparingly(isViewTransitionEligible);
7461									break;
7462								default: isViewTransitionEligible.textContent = "";
7463							}
7464						}
7465						break;
7466					case 5:
7467					case 26:
7468					case 27:
7469					case 6:
7470					case 4:
7471					case 17: break;
7472					case 30:
7473						isViewTransitionEligible && null !== current && (isViewTransitionEligible = current, current = finishedWork, finishedWork = getViewTransitionName(isViewTransitionEligible.memoizedProps, isViewTransitionEligible.stateNode), current = current.memoizedProps, current = getViewTransitionClassName(current.default, current.update), "none" !== current && applyViewTransitionToHostInstances(isViewTransitionEligible, finishedWork, current, isViewTransitionEligible.memoizedState = [], !0));
7474						break;
7475					default: if (0 !== (flags & 1024)) throw Error("This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.");
7476				}
7477				isViewTransitionEligible = fiber.sibling;
7478				if (null !== isViewTransitionEligible) {
7479					isViewTransitionEligible.return = fiber.return;
7480					nextEffect = isViewTransitionEligible;
7481					break;
7482				}
7483				nextEffect = fiber.return;
7484			}
7485		}
7486		function commitLayoutEffectOnFiber(finishedRoot, current, finishedWork) {
7487			var prevEffectStart = pushComponentEffectStart(), prevEffectDuration = pushComponentEffectDuration(), prevEffectErrors = pushComponentEffectErrors(), prevEffectDidSpawnUpdate = pushComponentEffectDidSpawnUpdate(), flags = finishedWork.flags;
7488			switch (finishedWork.tag) {
7489				case 0:
7490				case 11:
7491				case 15:
7492					recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);
7493					flags & 4 && commitHookLayoutEffects(finishedWork, Layout | HasEffect);
7494					break;
7495				case 1:
7496					recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);
7497					if (flags & 4) if (finishedRoot = finishedWork.stateNode, null === current) finishedWork.type.defaultProps || "ref" in finishedWork.memoizedProps || didWarnAboutReassigningProps || (finishedRoot.props !== finishedWork.memoizedProps && console.error("Expected %s props to match memoized props before componentDidMount. This might either be because of a bug in React, or because a component reassigns its own `this.props`. Please file an issue.", getComponentNameFromFiber(finishedWork) || "instance"), finishedRoot.state !== finishedWork.memoizedState && console.error("Expected %s state to match memoized state before componentDidMount. This might either be because of a bug in React, or because a component reassigns its own `this.state`. Please file an issue.", getComponentNameFromFiber(finishedWork) || "instance")), shouldProfile(finishedWork) ? (startEffectTimer(), runWithFiberInDEV(finishedWork, callComponentDidMountInDEV, finishedWork, finishedRoot), recordEffectDuration()) : runWithFiberInDEV(finishedWork, callComponentDidMountInDEV, finishedWork, finishedRoot);
7498					else {
vendor: 4,503 bytes, lines 7499-7574
7499						var prevProps = resolveClassComponentProps(finishedWork.type, current.memoizedProps);
7500						current = current.memoizedState;
7501						finishedWork.type.defaultProps || "ref" in finishedWork.memoizedProps || didWarnAboutReassigningProps || (finishedRoot.props !== finishedWork.memoizedProps && console.error("Expected %s props to match memoized props before componentDidUpdate. This might either be because of a bug in React, or because a component reassigns its own `this.props`. Please file an issue.", getComponentNameFromFiber(finishedWork) || "instance"), finishedRoot.state !== finishedWork.memoizedState && console.error("Expected %s state to match memoized state before componentDidUpdate. This might either be because of a bug in React, or because a component reassigns its own `this.state`. Please file an issue.", getComponentNameFromFiber(finishedWork) || "instance"));
7502						shouldProfile(finishedWork) ? (startEffectTimer(), runWithFiberInDEV(finishedWork, callComponentDidUpdateInDEV, finishedWork, finishedRoot, prevProps, current, finishedRoot.__reactInternalSnapshotBeforeUpdate), recordEffectDuration()) : runWithFiberInDEV(finishedWork, callComponentDidUpdateInDEV, finishedWork, finishedRoot, prevProps, current, finishedRoot.__reactInternalSnapshotBeforeUpdate);
7503					}
7504					flags & 64 && commitClassCallbacks(finishedWork);
7505					flags & 512 && safelyAttachRef(finishedWork, finishedWork.return);
7506					break;
7507				case 3:
7508					current = pushNestedEffectDurations();
7509					recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);
7510					if (flags & 64 && (flags = finishedWork.updateQueue, null !== flags)) {
7511						prevProps = null;
7512						if (null !== finishedWork.child) switch (finishedWork.child.tag) {
7513							case 27:
7514							case 5:
7515								prevProps = finishedWork.child.stateNode;
7516								break;
7517							case 1: prevProps = finishedWork.child.stateNode;
7518						}
7519						try {
7520							runWithFiberInDEV(finishedWork, commitCallbacks, flags, prevProps);
7521						} catch (error) {
7522							captureCommitPhaseError(finishedWork, finishedWork.return, error);
7523						}
7524					}
7525					finishedRoot.effectDuration += popNestedEffectDurations(current);
7526					break;
7527				case 27: null === current && flags & 4 && commitHostSingletonAcquisition(finishedWork);
7528				case 26:
7529				case 5:
7530					recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);
7531					if (null === current) {
7532						if (flags & 4) commitHostMount(finishedWork);
7533						else if (flags & 64) {
7534							finishedRoot = finishedWork.type;
7535							current = finishedWork.memoizedProps;
7536							prevProps = finishedWork.stateNode;
7537							try {
7538								runWithFiberInDEV(finishedWork, commitHydratedInstance, prevProps, finishedRoot, current, finishedWork);
7539							} catch (error) {
7540								captureCommitPhaseError(finishedWork, finishedWork.return, error);
7541							}
7542						}
7543					}
7544					flags & 512 && safelyAttachRef(finishedWork, finishedWork.return);
7545					break;
7546				case 12:
7547					if (flags & 4) {
7548						flags = pushNestedEffectDurations();
7549						recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);
7550						finishedRoot = finishedWork.stateNode;
7551						finishedRoot.effectDuration += bubbleNestedEffectDurations(flags);
7552						try {
7553							runWithFiberInDEV(finishedWork, commitProfiler, finishedWork, current, commitStartTime, finishedRoot.effectDuration);
7554						} catch (error) {
7555							captureCommitPhaseError(finishedWork, finishedWork.return, error);
7556						}
7557					} else recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);
7558					break;
7559				case 31:
7560					recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);
7561					flags & 4 && commitActivityHydrationCallbacks(finishedRoot, finishedWork);
7562					break;
7563				case 13:
7564					recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);
7565					flags & 4 && commitSuspenseHydrationCallbacks(finishedRoot, finishedWork);
7566					flags & 64 && (finishedRoot = finishedWork.memoizedState, null !== finishedRoot && (finishedRoot = finishedRoot.dehydrated, null !== finishedRoot && (flags = retryDehydratedSuspenseBoundary.bind(null, finishedWork), registerSuspenseInstanceRetry(finishedRoot, flags))));
7567					break;
7568				case 22:
7569					flags = null !== finishedWork.memoizedState || offscreenSubtreeIsHidden;
7570					if (!flags) {
7571						var newOffscreenSubtreeWasHidden = null !== current && null !== current.memoizedState || offscreenSubtreeWasHidden;
7572						current = offscreenSubtreeIsHidden;
7573						prevProps = offscreenSubtreeWasHidden;
7574						offscreenSubtreeIsHidden = flags;
7575						(offscreenSubtreeWasHidden = newOffscreenSubtreeWasHidden) && !prevProps ? (flags = IncludeHostSingletons, 0 !== (finishedWork.subtreeFlags & 8772) && (flags |= IncludeWorkInProgressEffects), recursivelyTraverseReappearLayoutEffects(finishedRoot, finishedWork, flags), (finishedWork.mode & ProfileMode) !== NoMode && 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && .05 < componentEffectEndTime - componentEffectStartTime && logComponentReappeared(finishedWork, componentEffectStartTime, componentEffectEndTime)) : recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);
7576						offscreenSubtreeIsHidden = current;
7577						offscreenSubtreeWasHidden = prevProps;
7578					}
7579					break;
7580				case 30:
7581					flags & 18874368 && trackNamedViewTransition(finishedWork);
7582					recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);
7583					flags & 512 && safelyAttachRef(finishedWork, finishedWork.return);
7584					break;
7585				case 7: flags & 512 && safelyAttachRef(finishedWork, finishedWork.return);
7586				default: recursivelyTraverseLayoutEffects(finishedRoot, finishedWork);
7587			}
7588			(finishedWork.mode & ProfileMode) !== NoMode && 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && ((componentEffectSpawnedUpdate || .05 < componentEffectDuration) && logComponentEffect(finishedWork, componentEffectStartTime, componentEffectEndTime, componentEffectDuration, componentEffectErrors), null === finishedWork.alternate && null !== finishedWork.return && null !== finishedWork.return.alternate && .05 < componentEffectEndTime - componentEffectStartTime && (isHydratingParent(finishedWork.return.alternate, finishedWork.return) || logComponentTrigger(finishedWork, componentEffectStartTime, componentEffectEndTime, "Mount")));
7589			popComponentEffectStart(prevEffectStart);
7590			popComponentEffectDuration(prevEffectDuration);
7591			componentEffectErrors = prevEffectErrors;
7592			componentEffectSpawnedUpdate = prevEffectDidSpawnUpdate;
7593		}
7594		function hideOrUnhideAllChildren(parentFiber, isHidden) {
7595			for (parentFiber = parentFiber.child; null !== parentFiber;) hideOrUnhideAllChildrenOnFiber(parentFiber, isHidden), parentFiber = parentFiber.sibling;
7596		}
7597		function hideOrUnhideAllChildrenOnFiber(fiber, isHidden) {
7598			switch (fiber.tag) {
7599				case 5:
7600				case 26:
7601					try {
7602						var instance = fiber.stateNode;
7603						isHidden ? runWithFiberInDEV(fiber, hideInstance, instance) : runWithFiberInDEV(fiber, unhideInstance, fiber.stateNode, fiber.memoizedProps);
7604					} catch (error) {
7605						captureCommitPhaseError(fiber, fiber.return, error);
7606					}
7607					hideOrUnhideNearestPortals(fiber, isHidden);
7608					break;
7609				case 6:
7610					try {
7611						var instance$jscomp$0 = fiber.stateNode;
7612						isHidden ? runWithFiberInDEV(fiber, hideTextInstance, instance$jscomp$0) : runWithFiberInDEV(fiber, unhideTextInstance, instance$jscomp$0, fiber.memoizedProps);
7613						viewTransitionMutationContext = !0;
7614					} catch (error) {
7615						captureCommitPhaseError(fiber, fiber.return, error);
7616					}
7617					break;
7618				case 18:
7619					try {
7620						var instance$jscomp$1 = fiber.stateNode;
7621						isHidden ? runWithFiberInDEV(fiber, hideDehydratedBoundary, instance$jscomp$1) : runWithFiberInDEV(fiber, unhideDehydratedBoundary, fiber.stateNode);
7622					} catch (error) {
7623						captureCommitPhaseError(fiber, fiber.return, error);
7624					}
7625					break;
7626				case 22:
7627				case 23:
7628					null === fiber.memoizedState && hideOrUnhideAllChildren(fiber, isHidden);
7629					break;
7630				default: hideOrUnhideAllChildren(fiber, isHidden);
7631			}
7632		}
7633		function hideOrUnhideNearestPortals(parentFiber, isHidden$jscomp$0) {
7634			if (parentFiber.subtreeFlags & 67108864) for (parentFiber = parentFiber.child; null !== parentFiber;) {
7635				a: {
7636					var fiber = parentFiber, isHidden = isHidden$jscomp$0;
7637					switch (fiber.tag) {
7638						case 4:
7639							hideOrUnhideAllChildrenOnFiber(fiber, isHidden);
7640							break a;
7641						case 22:
7642							null === fiber.memoizedState && hideOrUnhideNearestPortals(fiber, isHidden);
7643							break a;
7644						default: hideOrUnhideNearestPortals(fiber, isHidden);
7645					}
7646				}
7647				parentFiber = parentFiber.sibling;
7648			}
7649		}
7650		function detachFiberAfterEffects(fiber) {
7651			var alternate = fiber.alternate;
7652			null !== alternate && (fiber.alternate = null, detachFiberAfterEffects(alternate));
7653			fiber.child = null;
7654			fiber.deletions = null;
7655			fiber.sibling = null;
7656			5 === fiber.tag && (alternate = fiber.stateNode, null !== alternate && detachDeletedInstance(alternate));
7657			fiber.stateNode = null;
7658			fiber._debugOwner = null;
7659			fiber.return = null;
7660			fiber.dependencies = null;
7661			fiber.memoizedProps = null;
7662			fiber.memoizedState = null;
7663			fiber.pendingProps = null;
7664			fiber.stateNode = null;
7665			fiber.updateQueue = null;
7666		}
7667		function recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, parent) {
7668			for (parent = parent.child; null !== parent;
7668) commitDeletionEffectsOnFiber(finishedRoot, nearestMountedAncestor, parent), parent = parent.sibling;
7669		}
7670		function commitDeletionEffectsOnFiber(finishedRoot, nearestMountedAncestor, deletedFiber) {
7671			if (injectedHook && "function" === typeof injectedHook.onCommitFiberUnmount) try {
7672				injectedHook.onCommitFiberUnmount(rendererID, deletedFiber);
7673			} catch (err) {
7674				hasLoggedError || (hasLoggedError = !0, console.error("React instrumentation encountered an error: %o", err));
7675			}
7676			var prevEffectStart = pushComponentEffectStart(), prevEffectDuration = pushComponentEffectDuration(), prevEffectErrors = pushComponentEffectErrors(), prevEffectDidSpawnUpdate = pushComponentEffectDidSpawnUpdate();
7677			switch (deletedFiber.tag) {
7678				case 26:
7679					offscreenSubtreeWasHidden || safelyDetachRef(deletedFiber, nearestMountedAncestor);
7680					recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
7681					deletedFiber.memoizedState ? deletedFiber.memoizedState.count-- : deletedFiber.stateNode && !
vendor: 4,731 bytes, lines 7681-7756
7681offscreenSubtreeWasHidden && (finishedRoot = deletedFiber.stateNode, finishedRoot.parentNode.removeChild(finishedRoot));
7682					break;
7683				case 27:
7684					offscreenSubtreeWasHidden || safelyDetachRef(deletedFiber, nearestMountedAncestor);
7685					commitFragmentInstanceDeletionEffects(deletedFiber);
7686					var prevHostParent = hostParent, prevHostParentIsContainer = hostParentIsContainer;
7687					isSingletonScope(deletedFiber.type) && (hostParent = deletedFiber.stateNode, hostParentIsContainer = !1);
7688					recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
7689					runWithFiberInDEV(deletedFiber, releaseSingletonInstance, deletedFiber.stateNode, deletedFiber.type, deletedFiber.memoizedProps);
7690					hostParent = prevHostParent;
7691					hostParentIsContainer = prevHostParentIsContainer;
7692					break;
7693				case 5: offscreenSubtreeWasHidden || safelyDetachRef(deletedFiber, nearestMountedAncestor), commitFragmentInstanceDeletionEffects(deletedFiber);
7694				case 6:
7695					6 === deletedFiber.tag && commitFragmentInstanceDeletionEffects(deletedFiber);
7696					prevHostParent = hostParent;
7697					prevHostParentIsContainer = hostParentIsContainer;
7698					hostParent = null;
7699					recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
7700					hostParent = prevHostParent;
7701					hostParentIsContainer = prevHostParentIsContainer;
7702					if (null !== hostParent) if (hostParentIsContainer) try {
7703						runWithFiberInDEV(deletedFiber, removeChildFromContainer, hostParent, deletedFiber.stateNode), viewTransitionMutationContext = !0;
7704					} catch (error) {
7705						captureCommitPhaseError(deletedFiber, nearestMountedAncestor, error);
7706					}
7707					else try {
7708						runWithFiberInDEV(deletedFiber, removeChild, hostParent, deletedFiber.stateNode), viewTransitionMutationContext = !0;
7709					} catch (error) {
7710						captureCommitPhaseError(deletedFiber, nearestMountedAncestor, error);
7711					}
7712					break;
7713				case 18:
7714					null !== hostParent && (hostParentIsContainer ? (finishedRoot = hostParent, clearHydrationBoundary(9 === finishedRoot.nodeType ? finishedRoot.body : "HTML" === finishedRoot.nodeName ? finishedRoot.ownerDocument.body : finishedRoot, deletedFiber.stateNode), retryIfBlockedOn(finishedRoot)) : clearHydrationBoundary(hostParent, deletedFiber.stateNode));
7715					break;
7716				case 4:
7717					prevHostParent = hostParent;
7718					prevHostParentIsContainer = hostParentIsContainer;
7719					hostParent = deletedFiber.stateNode.containerInfo;
7720					hostParentIsContainer = !0;
7721					recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
7722					hostParent = prevHostParent;
7723					hostParentIsContainer = prevHostParentIsContainer;
7724					break;
7725				case 0:
7726				case 11:
7727				case 14:
7728				case 15:
7729					commitHookEffectListUnmount(Insertion, deletedFiber, nearestMountedAncestor);
7730					offscreenSubtreeWasHidden || commitHookLayoutUnmountEffects(deletedFiber, nearestMountedAncestor, Layout);
7731					recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
7732					break;
7733				case 1:
7734					offscreenSubtreeWasHidden || (safelyDetachRef(deletedFiber, nearestMountedAncestor), prevHostParent = deletedFiber.stateNode, "function" === typeof prevHostParent.componentWillUnmount && safelyCallComponentWillUnmount(deletedFiber, nearestMountedAncestor, prevHostParent));
7735					recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
7736					break;
7737				case 21:
7738					recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
7739					break;
7740				case 22:
7741					offscreenSubtreeWasHidden = (prevHostParent = offscreenSubtreeWasHidden) || null !== deletedFiber.memoizedState;
7742					recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
7743					offscreenSubtreeWasHidden = prevHostParent;
7744					break;
7745				case 30:
7746					deletedFiber.flags & 18874368 && untrackNamedViewTransition(deletedFiber);
7747					safelyDetachRef(deletedFiber, nearestMountedAncestor);
7748					recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
7749					break;
7750				case 7:
7751					offscreenSubtreeWasHidden || safelyDetachRef(deletedFiber, nearestMountedAncestor);
7752					recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
7753					break;
7754				default: recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
7755			}
7756			(deletedFiber.mode & ProfileMode) !== NoMode && 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && (componentEffectSpawnedUpdate || .05 < componentEffectDuration) && logComponentEffect(deletedFiber, componentEffectStartTime, componentEffectEndTime, componentEffectDuration, componentEffectErrors);
vendor: 4,613 bytes, lines 7757-7846
7757			popComponentEffectStart(prevEffectStart);
7758			popComponentEffectDuration(prevEffectDuration);
7759			componentEffectErrors = prevEffectErrors;
7760			componentEffectSpawnedUpdate = prevEffectDidSpawnUpdate;
7761		}
7762		function commitActivityHydrationCallbacks(finishedRoot, finishedWork) {
7763			if (null === finishedWork.memoizedState && (finishedRoot = finishedWork.alternate, null !== finishedRoot && (finishedRoot = finishedRoot.memoizedState, null !== finishedRoot))) {
7764				finishedRoot = finishedRoot.dehydrated;
7765				try {
7766					runWithFiberInDEV(finishedWork, commitHydratedActivityInstance, finishedRoot);
7767				} catch (error) {
7768					captureCommitPhaseError(finishedWork, finishedWork.return, error);
7769				}
7770			}
7771		}
7772		function commitSuspenseHydrationCallbacks(finishedRoot, finishedWork) {
7773			if (null === finishedWork.memoizedState && (finishedRoot = finishedWork.alternate, null !== finishedRoot && (finishedRoot = finishedRoot.memoizedState, null !== finishedRoot && (finishedRoot = finishedRoot.dehydrated, null !== finishedRoot)))) try {
7774				runWithFiberInDEV(finishedWork, commitHydratedSuspenseInstance, finishedRoot);
7775			} catch (error) {
7776				captureCommitPhaseError(finishedWork, finishedWork.return, error);
7777			}
7778		}
7779		function getRetryCache(finishedWork) {
7780			switch (finishedWork.tag) {
7781				case 31:
7782				case 13:
7783				case 19:
7784					var retryCache = finishedWork.stateNode;
7785					null === retryCache && (retryCache = finishedWork.stateNode = new PossiblyWeakSet());
7786					return retryCache;
7787				case 22: return finishedWork = finishedWork.stateNode, retryCache = finishedWork._retryCache, null === retryCache && (retryCache = finishedWork._retryCache = new PossiblyWeakSet()), retryCache;
7788				default: throw Error("Unexpected Suspense handler tag (" + finishedWork.tag + "). This is a bug in React.");
7789			}
7790		}
7791		function attachSuspenseRetryListeners(finishedWork, wakeables) {
7792			var retryCache = getRetryCache(finishedWork);
7793			wakeables.forEach(function(wakeable) {
7794				if (!retryCache.has(wakeable)) {
7795					retryCache.add(wakeable);
7796					if (isDevToolsPresent) if (null !== inProgressLanes && null !== inProgressRoot) restorePendingUpdaters(inProgressRoot, inProgressLanes);
7797					else throw Error("Expected finished root and lanes to be set. This is a bug in React.");
7798					var retry = resolveRetryWakeable.bind(null, finishedWork, wakeable);
7799					wakeable.then(retry, retry);
7800				}
7801			});
7802		}
7803		function recursivelyTraverseMutationEffects(root$jscomp$0, parentFiber, lanes) {
7804			var deletions = parentFiber.deletions;
7805			if (null !== deletions) for (var i = 0; i < deletions.length; i++) {
7806				var root = root$jscomp$0, returnFiber = parentFiber, deletedFiber = deletions[i], prevEffectStart = pushComponentEffectStart(), parent = returnFiber;
7807				a: for (; null !== parent;) {
7808					switch (parent.tag) {
7809						case 27:
7810							if (isSingletonScope(parent.type)) {
7811								hostParent = parent.stateNode;
7812								hostParentIsContainer = !1;
7813								break a;
7814							}
7815							break;
7816						case 5:
7817							hostParent = parent.stateNode;
7818							hostParentIsContainer = !1;
7819							break a;
7820						case 3:
7821						case 4:
7822							hostParent = parent.stateNode.containerInfo;
7823							hostParentIsContainer = !0;
7824							break a;
7825					}
7826					parent = parent.return;
7827				}
7828				if (null === hostParent) throw Error("Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue.");
7829				commitDeletionEffectsOnFiber(root, returnFiber, deletedFiber);
7830				hostParent = null;
7831				hostParentIsContainer = !1;
7832				(deletedFiber.mode & ProfileMode) !== NoMode && 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && .05 < componentEffectEndTime - componentEffectStartTime && logComponentTrigger(deletedFiber, componentEffectStartTime, componentEffectEndTime, "Unmount");
7833				popComponentEffectStart(prevEffectStart);
7834				root = deletedFiber;
7835				returnFiber = root.alternate;
7836				null !== returnFiber && (returnFiber.return = null);
7837				root.return = null;
7838			}
7839			if (parentFiber.subtreeFlags & 13886) for (parentFiber = parentFiber.child; null !== parentFiber;) commitMutationEffectsOnFiber(parentFiber, root$jscomp$0, lanes), parentFiber = parentFiber.sibling;
7840		}
7841		function commitMutationEffectsOnFiber(finishedWork, root, lanes) {
7842			var prevEffectStart = pushComponentEffectStart(), prevEffectDuration = pushComponentEffectDuration(), prevEffectErrors = pushComponentEffectErrors(), prevEffectDidSpawnUpdate = pushComponentEffectDidSpawnUpdate(), current = finishedWork.alternate, flags = finishedWork.flags;
7843			switch (finishedWork.tag) {
7844				case 0:
7845				case 11:
7846				case 14:
vendor: 14,562 bytes, lines 7847-8041
7847				case 15:
7848					if (flags & 4 && (current = finishedWork.updateQueue, current = null !== current ? current.events : null, null !== current)) for (var ii = 0; ii < current.length; ii++) {
7849						var _eventPayloads$ii2 = current[ii];
7850						_eventPayloads$ii2.ref.impl = _eventPayloads$ii2.nextImpl;
7851					}
7852					recursivelyTraverseMutationEffects(root, finishedWork, lanes);
7853					commitReconciliationEffects(finishedWork);
7854					flags & 4 && (commitHookEffectListUnmount(Insertion | HasEffect, finishedWork, finishedWork.return), commitHookEffectListMount(Insertion | HasEffect, finishedWork), commitHookLayoutUnmountEffects(finishedWork, finishedWork.return, Layout | HasEffect));
7855					break;
7856				case 1:
7857					recursivelyTraverseMutationEffects(root, finishedWork, lanes);
7858					commitReconciliationEffects(finishedWork);
7859					flags & 512 && (offscreenSubtreeWasHidden || null === current || safelyDetachRef(current, current.return));
7860					flags & 64 && offscreenSubtreeIsHidden && (root = finishedWork.updateQueue, null !== root && (lanes = root.callbacks, null !== lanes && (flags = root.shared.hiddenCallbacks, root.shared.hiddenCallbacks = null === flags ? lanes : flags.concat(lanes))));
7861					break;
7862				case 26:
7863					ii = currentHoistableRoot;
7864					recursivelyTraverseMutationEffects(root, finishedWork, lanes);
7865					commitReconciliationEffects(finishedWork);
7866					flags & 512 && (offscreenSubtreeWasHidden || null === current || safelyDetachRef(current, current.return));
7867					if (flags & 4) if (flags = null !== current ? current.memoizedState : null, lanes = finishedWork.memoizedState, null === current) if (null === lanes) if (null === finishedWork.stateNode) if (offscreenSubtreeIsHidden) finishedWork.stateNode = createHoistableInstance(finishedWork.type, finishedWork.memoizedProps, root.containerInfo, finishedWork);
7868					else {
7869						a: {
7870							root = finishedWork.type;
7871							lanes = finishedWork.memoizedProps;
7872							flags = ii.ownerDocument || ii;
7873							b: switch (root) {
7874								case "title":
7875									current = flags.getElementsByTagName("title")[0];
7876									if (!current || current[internalHoistableMarker] || current[internalInstanceKey] || current.namespaceURI === SVG_NAMESPACE || current.hasAttribute("itemprop")) current = flags.createElement(root), flags.head.insertBefore(current, flags.querySelector("head > title"));
7877									setInitialProperties(current, root, lanes);
7878									current[internalInstanceKey] = finishedWork;
7879									markNodeAsHoistable(current);
7880									root = current;
7881									break a;
7882								case "link":
7883									if (ii = getHydratableHoistableCache("link", "href", flags).get(root + (lanes.href || ""))) {
7884										for (_eventPayloads$ii2 = 0; _eventPayloads$ii2 < ii.length; _eventPayloads$ii2++) if (current = ii[_eventPayloads$ii2], current.getAttribute("href") === (null == lanes.href || "" === lanes.href ? null : lanes.href) && current.getAttribute("rel") === (null == lanes.rel ? null : lanes.rel) && current.getAttribute("title") === (null == lanes.title ? null : lanes.title) && current.getAttribute("crossorigin") === (null == lanes.crossOrigin ? null : lanes.crossOrigin)) {
7885											ii.splice(_eventPayloads$ii2, 1);
7886											break b;
7887										}
7888									}
7889									current = flags.createElement(root);
7890									setInitialProperties(current, root, lanes);
7891									flags.head.appendChild(current);
7892									break;
7893								case "meta":
7894									if (ii = getHydratableHoistableCache("meta", "content", flags).get(root + (lanes.content || ""))) {
7895										for (_eventPayloads$ii2 = 0; _eventPayloads$ii2 < ii.length; _eventPayloads$ii2++) if (current = ii[_eventPayloads$ii2], checkAttributeStringCoercion(lanes.content, "content"), current.getAttribute("content") === (null == lanes.content ? null : "" + lanes.content) && current.getAttribute("name") === (null == lanes.name ? null : lanes.name) && current.getAttribute("property") === (null == lanes.property ? null : lanes.property) && current.getAttribute("http-equiv") === (null == lanes.httpEquiv ? null : lanes.httpEquiv) && current.getAttribute("charset") === (null == lanes.charSet ? null : lanes.charSet)) {
7896											ii.splice(_eventPayloads$ii2, 1);
7897											break b;
7898										}
7899									}
7900									current = flags.createElement(root);
7901									setInitialProperties(current, root, lanes);
7902									flags.head.appendChild(current);
7903									break;
7904								default: throw Error("getNodesForType encountered a type it did not expect: \"" + root + "\". This is a bug in React.");
7905							}
7906							current[internalInstanceKey] = finishedWork;
7907							markNodeAsHoistable(current);
7908							root = current;
7909						}
7910						finishedWork.stateNode = root;
7911					}
7912					else offscreenSubtreeIsHidden || mountHoistable(ii, finishedWork.type, finishedWork.stateNode);
7913					else finishedWork.stateNode = acquireResource(ii, lanes, finishedWork.memoizedProps);
7914					else flags !== lanes ? (null === flags ? (root = current.stateNode, null === root || offscreenSubtreeWasHidden || root.parentNode.removeChild(root)) : flags.count--, null === lanes ? offscreenSubtreeIsHidden || mountHoistable(ii, finishedWork.type, finishedWork.stateNode) : acquireResource(ii, lanes, finishedWork.memoizedProps)) : null === lanes && null !== finishedWork.stateNode && commitHostUpdate(finishedWork, finishedWork.memoizedProps, current.memoizedProps);
7915					break;
7916				case 27:
7917					recursivelyTraverseMutationEffects(root, finishedWork, lanes);
7918					commitReconciliationEffects(finishedWork);
7919					flags & 512 && (offscreenSubtreeWasHidden || null === current || safelyDetachRef(current, current.return));
7920					null !== current && flags & 4 && commitHostUpdate(finishedWork, finishedWork.memoizedProps, current.memoizedProps);
7921					break;
7922				case 5:
7923					ii = offscreenDirectParentIsHidden;
7924					offscreenDirectParentIsHidden = !1;
7925					recursivelyTraverseMutationEffects(root, finishedWork, lanes);
7926					offscreenDirectParentIsHidden = ii;
7927					commitReconciliationEffects(finishedWork);
7928					flags & 512 && (offscreenSubtreeWasHidden || null === current || safelyDetachRef(current, current.return));
7929					if (finishedWork.flags & 32) {
7930						root = finishedWork.stateNode;
7931						try {
7932							runWithFiberInDEV(finishedWork, resetTextContent, root), viewTransitionMutationContext = !0;
7933						} catch (error) {
7934							captureCommitPhaseError(finishedWork, finishedWork.return, error);
7935						}
7936					}
7937					flags & 4 && null != finishedWork.stateNode && (root = finishedWork.memoizedProps, commitHostUpdate(finishedWork, root, null !== current ? current.memoizedProps : root));
7938					flags & 1024 && (needsFormReset = !0, "form" !== finishedWork.type && console.error("Unexpected host component type. Expected a form. This is a bug in React."));
7939					break;
7940				case 6:
7941					recursivelyTraverseMutationEffects(root, finishedWork, lanes);
7942					commitReconciliationEffects(finishedWork);
7943					if (flags & 4) {
7944						if (null === finishedWork.stateNode) throw Error("This should have a text node initialized. This error is likely caused by a bug in React. Please file an issue.");
7945						root = finishedWork.memoizedProps;
7946						lanes = null !== current ? current.memoizedProps : root;
7947						flags = finishedWork.stateNode;
7948						try {
7949							runWithFiberInDEV(finishedWork, commitTextUpdate, flags, lanes, root), viewTransitionMutationContext = !0;
7950						} catch (error) {
7951							captureCommitPhaseError(finishedWork, finishedWork.return, error);
7952						}
7953					}
7954					break;
7955				case 3:
7956					ii = pushNestedEffectDurations();
7957					viewTransitionMutationContext = !1;
7958					tagCaches = null;
7959					_eventPayloads$ii2 = currentHoistableRoot;
7960					currentHoistableRoot = getHoistableRoot(root.containerInfo);
7961					recursivelyTraverseMutationEffects(root, finishedWork, lanes);
7962					currentHoistableRoot = _eventPayloads$ii2;
7963					commitReconciliationEffects(finishedWork);
7964					if (flags & 4 && null !== current && current.memoizedState.isDehydrated) try {
7965						runWithFiberInDEV(finishedWork, commitHydratedContainer, root.containerInfo);
7966					} catch (error) {
7967						captureCommitPhaseError(finishedWork, finishedWork.return, error);
7968					}
7969					needsFormReset && (needsFormReset = !1, recursivelyResetForms(finishedWork));
7970					root.effectDuration += popNestedEffectDurations(ii);
7971					viewTransitionMutationContext = !1;
7972					break;
7973				case 4:
7974					flags = offscreenDirectParentIsHidden;
7975					offscreenDirectParentIsHidden = offscreenSubtreeIsHidden;
7976					current = pushMutationContext();
7977					ii = currentHoistableRoot;
7978					currentHoistableRoot = getHoistableRoot(finishedWork.stateNode.containerInfo);
7979					recursivelyTraverseMutationEffects(root, finishedWork, lanes);
7980					commitReconciliationEffects(finishedWork);
7981					currentHoistableRoot = ii;
7982					viewTransitionMutationContext && inUpdateViewTransition && (rootViewTransitionAffected = !0);
7983					viewTransitionMutationContext = current;
7984					offscreenDirectParentIsHidden = flags;
7985					break;
7986				case 12:
7987					flags = pushNestedEffectDurations();
7988					recursivelyTraverseMutationEffects(root, finishedWork, lanes);
7989					commitReconciliationEffects(finishedWork);
7990					finishedWork.stateNode.effectDuration += bubbleNestedEffectDurations(flags);
7991					break;
7992				case 31:
7993					recursivelyTraverseMutationEffects(root, finishedWork, lanes);
7994					commitReconciliationEffects(finishedWork);
7995					flags & 4 && (root = finishedWork.updateQueue, null !== root && (finishedWork.updateQueue = null, attachSuspenseRetryListeners(finishedWork, root)));
7996					break;
7997				case 13:
7998					recursivelyTraverseMutationEffects(root, finishedWork, lanes);
7999					commitReconciliationEffects(finishedWork);
8000					finishedWork.child.flags & 8192 && null !== finishedWork.memoizedState !== (null !== current && null !== current.memoizedState) && (globalMostRecentFallbackTime = now$1());
8001					flags & 4 && (root = finishedWork.updateQueue, null !== root && (finishedWork.updateQueue = null, attachSuspenseRetryListeners(finishedWork, root)));
8002					break;
8003				case 22:
8004					ii = null !== finishedWork.memoizedState;
8005					_eventPayloads$ii2 = null !== current && null !== current.memoizedState;
8006					var prevOffscreenSubtreeIsHidden = offscreenSubtreeIsHidden, prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden, _prevOffscreenDirectParentIsHidden2 = offscreenDirectParentIsHidden;
8007					offscreenSubtreeIsHidden = prevOffscreenSubtreeIsHidden || ii;
8008					offscreenDirectParentIsHidden = _prevOffscreenDirectParentIsHidden2 || ii;
8009					offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden || _eventPayloads$ii2;
8010					recursivelyTraverseMutationEffects(root, finishedWork, lanes);
8011					offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden;
8012					offscreenDirectParentIsHidden = _prevOffscreenDirectParentIsHidden2;
8013					offscreenSubtreeIsHidden = prevOffscreenSubtreeIsHidden;
8014					_eventPayloads$ii2 && !ii && !prevOffscreenSubtreeIsHidden && !prevOffscreenSubtreeWasHidden && (finishedWork.mode & ProfileMode) !== NoMode && 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && .05 < componentEffectEndTime - componentEffectStartTime && logComponentReappeared(finishedWork, componentEffectStartTime, componentEffectEndTime);
8015					commitReconciliationEffects(finishedWork);
8016					flags & 8192 && (root = finishedWork.stateNode, root._visibility = ii ? root._visibility & ~OffscreenVisible : root._visibility | OffscreenVisible, !ii || null === current || _eventPayloads$ii2 || offscreenSubtreeIsHidden || offscreenSubtreeWasHidden || (root = IncludeHostSingletons, lanes = _eventPayloads$ii2 || offscreenSubtreeWasHidden, current = offscreenSubtreeIsHidden, _eventPayloads$ii2 = offscreenSubtreeWasHidden, offscreenSubtreeIsHidden = ii || offscreenSubtreeIsHidden, offscreenSubtreeWasHidden = lanes, recursivelyTraverseDisappearLayoutEffects(finishedWork, root), (finishedWork.mode & ProfileMode) !== NoMode && 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && .05 < componentEffectEndTime - componentEffectStartTime && logComponentTrigger(finishedWork, componentEffectStartTime, componentEffectEndTime, "Disconnect"), offscreenSubtreeIsHidden = current, offscreenSubtreeWasHidden = _eventPayloads$ii2), !ii && offscreenDirectParentIsHidden || hideOrUnhideAllChildren(finishedWork, ii));
8017					flags & 4 && (root = finishedWork.updateQueue, null !== root && (lanes = root.retryQueue, null !== lanes && (root.retryQueue = null, attachSuspenseRetryListeners(finishedWork, lanes))));
8018					break;
8019				case 19:
8020					recursivelyTraverseMutationEffects(root, finishedWork, lanes);
8021					commitReconciliationEffects(finishedWork);
8022					flags & 4 && (root = finishedWork.updateQueue, null !== root && (finishedWork.updateQueue = null, attachSuspenseRetryListeners(finishedWork, root)));
8023					break;
8024				case 30:
8025					flags & 512 && (offscreenSubtreeWasHidden || null === current || safelyDetachRef(current, current.return));
8026					flags = pushMutationContext();
8027					ii = inUpdateViewTransition;
8028					_eventPayloads$ii2 = (lanes & 335544064) === lanes;
8029					prevOffscreenSubtreeIsHidden = finishedWork.memoizedProps;
8030					inUpdateViewTransition = _eventPayloads$ii2 && "none" !== getViewTransitionClassName(prevOffscreenSubtreeIsHidden.default, prevOffscreenSubtreeIsHidden.update);
8031					recursivelyTraverseMutationEffects(root, finishedWork, lanes);
8032					commitReconciliationEffects(finishedWork);
8033					_eventPayloads$ii2 && null !== current && viewTransitionMutationContext && (finishedWork.flags |= 4);
8034					inUpdateViewTransition = ii;
8035					viewTransitionMutationContext = flags;
8036					break;
8037				case 21: break;
8038				case 7: flags & 512 && (offscreenSubtreeWasHidden || null === current || safelyDetachRef(current, current.return)), current && null !== current.stateNode && (current.stateNode._fragmentFiber = finishedWork);
8039				default: recursivelyTraverseMutationEffects(root, finishedWork, lanes), commitReconciliationEffects(finishedWork);
8040			}
8041			(finishedWork.mode & ProfileMode) !== NoMode && 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && ((componentEffectSpawnedUpdate || .05 < componentEffectDuration) && logComponentEffect(finishedWork, componentEffectStartTime, componentEffectEndTime, componentEffectDuration, componentEffectErrors), null === finishedWork.alternate && null !== finishedWork.return && null !== finishedWork.return.alternate && .05 < componentEffectEndTime - componentEffectStartTime && (isHydratingParent(finishedWork.return.alternate, finishedWork.return) || logComponentTrigger(finishedWork, componentEffectStartTime, componentEffectEndTime, "Mount")));
8042			popComponentEffectStart(prevEffectStart);
8043			popComponentEffectDuration(prevEffectDuration);
8044			componentEffectErrors = prevEffectErrors;
8045			componentEffectSpawnedUpdate = prevEffectDidSpawnUpdate;
8046		}
8047		function commitReconciliationEffects(finishedWork) {
8048			var flags = finishedWork.flags;
8049			if (flags & 2) {
8050				try {
8051					runWithFiberInDEV(finishedWork, commitPlacement, finishedWork);
8052				} catch (error) {
8053					captureCommitPhaseError(finishedWork, finishedWork.return, error);
8054				}
8055				finishedWork.flags &= -3;
8056			}
8057			flags & 4096 && (finishedWork.flags &= -4097);
8058		}
8059		function recursivelyResetForms(parentFiber) {
8060			if (parentFiber.subtreeFlags & 1024) for (parentFiber = parentFiber.child; null !== parentFiber;) {
8061				var fiber = parentFiber;
8062				recursivelyResetForms(fiber);
8063				5 === fiber.tag && fiber.flags & 1024 && (fiber = fiber.stateNode, _enabled = !0, fiber.reset(), _enabled = !1);
8064				parentFiber = parentFiber.sibling;
8065			}
8066		}
8067		function recursivelyTraverseAfterMutationEffects(root, parentFiber) {
8068			if (parentFiber.subtreeFlags & 9270) for (parentFiber = parentFiber.child; null !== parentFiber;) commitAfterMutationEffectsOnFiber(parentFiber, root), parentFiber = parentFiber.sibling;
8069			else measureNestedViewTransitions(parentFiber, !1);
8070		}
8071		function commitAfterMutationEffectsOnFiber(finishedWork, root) {
8072			var current = finishedWork.alternate;
8073			if (null === current) commitEnterViewTransitions(finishedWork, !1);
8074			else switch (finishedWork.tag) {
8075				case 3:
8076					rootViewTransitionNameCanceled = viewTransitionContextChanged = !1;
8077					pushViewTransitionCancelableScope();
8078					recursivelyTraverseAfterMutationEffects(root, finishedWork);
8079					if (!viewTransitionContextChanged && !rootViewTransitionAffected) {
8080						finishedWork = viewTransitionCancelableChildren;
8081						if (null !== finishedWork) for (var i = 0; i < finishedWork.length; i += 3) {
8082							current = finishedWork[i];
8083							var oldName = finishedWork[i + 1];
8084							restoreViewTransitionName(current, finishedWork[i + 2]);
8085							current = current.ownerDocument.documentElement;
8086							null !== current && current.animate({
8087								opacity: [0, 0],
8088								pointerEvents: ["none", "none"]
8089							}, {
8090								duration: 0,
8091								fill: "forwards",
8092								pseudoElement: "::view-transition-group(" + oldName + ")"
8093							});
8094						}
8095						finishedWork = root.containerInfo;
8096						finishedWork = 9 === finishedWork.nodeType ? finishedWork.documentElement : finishedWork.ownerDocument.documentElement;
8097						null !== finishedWork && "" === finishedWork.style.viewTransitionName && (finishedWork.style.viewTransitionName = "none", finishedWork.animate({
8098							opacity: [0, 0],
8099							pointerEvents: ["none", "none"]
8100						}, {
8101							duration: 0,
8102							fill: "forwards",
8103							pseudoElement: "::view-transition-group(root)"
8104						}), finishedWork.animate({
8105							width: [0, 0],
8106							height: [0, 0]
8107						}, {
8108							duration: 0,
8109							fill: "forwards",
8110							pseudoElement: "::view-transition"
8111						}));
8112						rootViewTransitionNameCanceled = !0;
8113					}
8114					viewTransitionCancelableChildren = null;
8115					break;
8116				case 5:
8117					recursivelyTraverseAfterMutationEffects(root, finishedWork);
8118					break;
8119				case 4:
8120					i = viewTransitionContextChanged;
8121					viewTransitionContextChanged = !1;
8122					recursivelyTraverseAfterMutationEffects(root, finishedWork);
8123					viewTransitionContextChanged && (rootViewTransitionAffected = !0);
8124					viewTransitionContextChanged = i;
8125					break;
8126				case 22:
8127					null === finishedWork.memoizedState && (null !== current.memoizedState ? commitEnterViewTransitions(finishedWork, !1) : recursivelyTraverseAfterMutationEffects(root, finishedWork));
8128					break;
8129				case 30:
8130					i = viewTransitionContextChanged;
8131					oldName = pushViewTransitionCancelableScope();
8132					viewTransitionContextChanged = !1;
8133					recursivelyTraverseAfterMutationEffects(root, finishedWork);
8134					viewTransitionContextChanged && (finishedWork.flags |= 4);
8135					var props = finishedWork.memoizedProps, state = finishedWork.stateNode;
8136					root = getViewTransitionName(props, state);
8137					state = getViewTransitionName(current.memoizedProps, state);
8138					var className = getViewTransitionClassName(props.default, props.update);
8139					"none" === className ? root = !1 : (props = current.memoizedState, current.memoizedState = null, current = finishedWork.child, viewTransitionHostInstanceIdx = 0, root = measureViewTransitionHostInstancesRecursive(finishedWork, current, root, state, className, props, !0), viewTransitionHostInstanceIdx !== (null === props ? 0 : props.length) && (finishedWork.flags |= 32));
8140					0 !== (finishedWork.flags & 4) && root ? (scheduleViewTransitionEvent(finishedWork, finishedWork.memoizedProps.onUpdate), viewTransitionCancelableChildren = oldName) : null !== oldName && (oldName.push.apply(oldName, viewTransitionCancelableChildren), viewTransitionCancelableChildren = oldName);
8141					viewTransitionContextChanged = 0 !== (finishedWork.flags & 32) ? !0 : i;
8142					break;
8143				default: recursivelyTraverseAfterMutationEffects(root, finishedWork);
8144			}
8145		}
8146		function recursivelyTraverseLayoutEffects(root, parentFiber) {
8147			if (parentFiber.subtreeFlags & 8772) for (parentFiber = parentFiber.child; null !== parentFiber;) commitLayoutEffectOnFiber(root, parentFiber.alternate, parentFiber), parentFiber = parentFiber.sibling;
8148		}
8149		function disappearLayoutEffects(finishedWork, layoutEffectTraversalFlags) {
8150			var prevEffectStart = pushComponentEffectStart(), prevEffectDuration = pushComponentEffectDuration(), prevEffectErrors = pushComponentEffectErrors(), prevEffectDidSpawnUpdate = pushComponentEffectDidSpawnUpdate();
8151			switch (finishedWork.tag) {
8152				case 0:
8153				case 11:
8154				case 14:
8155				case 15:
8156					commitHookLayoutUnmountEffects(finishedWork, finishedWork.return, Layout);
8157					recursivelyTraverseDisappearLayoutEffects(finishedWork, layoutEffectTraversalFlags);
8158					break;
8159				case 1:
8160					safelyDetachRef(finishedWork, finishedWork.return);
8161					var instance = finishedWork.stateNode;
8162					"function" === typeof instance.componentWillUnmount && safelyCallComponentWillUnmount(finishedWork, finishedWork.return, instance);
8163					recursivelyTraverseDisappearLayoutEffects(finishedWork, layoutEffectTraversalFlags);
8164					break;
8165				case 27: (layoutEffectTraversalFlags & IncludeHostSingletons) !== NoLayoutEffectTraversalFlags && runWithFiberInDEV(finishedWork, releaseSingletonInstance, finishedWork.stateNode, finishedWork.type, finishedWork.memoizedProps);
8166				case 5:
8167					safelyDetachRef(finishedWork, finishedWork.return);
8168					5 !== finishedWork.tag && 27 !== finishedWork.tag || commitFragmentInstanceDeletionEffects(finishedWork);
8169					recursivelyTraverseDisappearLayoutEffects(finishedWork, layoutEffectTraversalFlags);
8170					break;
8171				case 6:
8172					commitFragmentInstanceDeletionEffects(finishedWork);
8173					break;
8174				case 26:
8175					safelyDetachRef(finishedWork, finishedWork.return);
8176					instance = finishedWork.stateNode;
8177					null !== finishedWork.memoizedState || null === instance || offscreenSubtreeWasHidden || instance.parentNode.removeChild(instance);
8178					recursivelyTraverseDisappearLayoutEffects(finishedWork, layoutEffectTraversalFlags);
8179					break;
8180				case 22:
8181					null === finishedWork.memoizedState && recursivelyTraverseDisappearLayoutEffects(finishedWork, layoutEffectTraversalFlags);
8182					break;
8183				case 30:
8184					finishedWork.flags & 18874368 && untrackNamedViewTransition(finishedWork);
8185					safelyDetachRef(finishedWork, finishedWork.return);
8186					recursivelyTraverseDisappearLayoutEffects(finishedWork, layoutEffectTraversalFlags);
8187					break;
8188				case 7: safelyDetachRef(finishedWork, finishedWork.return);
8189				default: recursivelyTraverseDisappearLayoutEffects(finishedWork, layoutEffectTraversalFlags);
8190			}
8191			(finishedWork.mode & ProfileMode) !== NoMode && 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && (componentEffectSpawnedUpdate || .05 < componentEffectDuration) && logComponentEffect(finishedWork, componentEffectStartTime, componentEffectEndTime, componentEffectDuration, componentEffectErrors);
8192			popComponentEffectStart(prevEffectStart);
8193			popComponentEffectDuration(prevEffectDuration);
8194			componentEffectErrors = prevEffectErrors;
8195			componentEffectSpawnedUpdate = prevEffectDidSpawnUpdate;
8196		}
8197		function recursivelyTraverseDisappearLayoutEffects(parentFiber, layoutEffectTraversalFlags) {
8198			for (parentFiber = parentFiber.child; null !== parentFiber;) disappearLayoutEffects(parentFiber, layoutEffectTraversalFlags), parentFiber = parentFiber.sibling;
8199		}
8200		function reappearLayoutEffects(finishedRoot, current, finishedWork, layoutEffectTraversalFlags) {
8201			var prevEffectStart = pushComponentEffectStart(), prevEffectDuration = pushComponentEffectDuration(), prevEffectErrors = pushComponentEffectErrors(), prevEffectDidSpawnUpdate = pushComponentEffectDidSpawnUpdate(), flags = finishedWork.flags, includeWorkInProgressEffects = (layoutEffectTraversalFlags & IncludeWorkInProgressEffects) !== NoLayoutEffectTraversalFlags;
8202			switch (finishedWork.tag) {
8203				case 0:
8204				case 11:
8205				case 15:
8206					recursivelyTraverseReappearLayoutEffects(finishedRoot, finishedWork, layoutEffectTraversalFlags);
8207					commitHookLayoutEffects(finishedWork, Layout);
8208					break;
8209				case 1:
8210					recursivelyTraverseReappearLayoutEffects(finishedRoot, finishedWork, layoutEffectTraversalFlags);
8211					current = finishedWork.stateNode;
8212					"function" === typeof current.componentDidMount && runWithFiberInDEV(finishedWork, callComponentDidMountInDEV, finishedWork, current);
8213					current = finishedWork.updateQueue;
8214					if (null !== current) {
8215						finishedRoot = finishedWork.stateNode;
8216						try {
8217							runWithFiberInDEV(finishedWork, commitHiddenCallbacks, current, finishedRoot);
8218						} catch (error) {
8219							captureCommitPhaseError(finishedWork, finishedWork.return, error);
8220						}
8221					}
8222					includeWorkInProgressEffects && flags & 64 && commitClassCallbacks(finishedWork);
8223					safelyAttachRef(finishedWork, finishedWork.return);
8224					break;
8225				case 27: (layoutEffectTraversalFlags & IncludeHostSingletons) !== NoLayoutEffectTraversalFlags && commitHostSingletonAcquisition(finishedWork);
8226				case 5:
8227					5 !== finishedWork.tag && 27 !== finishedWork.tag || commitFragmentInstanceInsertionEffects(finishedWork);
8228					recursivelyTraverseReappearLayoutEffects(finishedRoot, finishedWork, layoutEffectTraversalFlags);
8229					includeWorkInProgressEffects && null === current && flags & 4 && commitHostMount(finishedWork);
8230					safelyAttachRef(finishedWork, finishedWork.return);
8231					break;
8232				case 6:
8233					commitFragmentInstanceInsertionEffects(finishedWork);
8234					break;
8235				case 26:
vendor: 4,157 bytes, lines 8236-8295
8236					var instance = finishedWork.stateNode;
8237					null !== finishedWork.memoizedState || null === instance || offscreenSubtreeIsHidden || mountHoistable(getHoistableRoot(instance.ownerDocument), finishedWork.type, instance);
8238					recursivelyTraverseReappearLayoutEffects(finishedRoot, finishedWork, layoutEffectTraversalFlags);
8239					includeWorkInProgressEffects && null === current && flags & 4 && commitHostMount(finishedWork);
8240					safelyAttachRef(finishedWork, finishedWork.return);
8241					break;
8242				case 12:
8243					if (includeWorkInProgressEffects && flags & 4) {
8244						flags = pushNestedEffectDurations();
8245						recursivelyTraverseReappearLayoutEffects(finishedRoot, finishedWork, layoutEffectTraversalFlags);
8246						includeWorkInProgressEffects = finishedWork.stateNode;
8247						includeWorkInProgressEffects.effectDuration += bubbleNestedEffectDurations(flags);
8248						try {
8249							runWithFiberInDEV(finishedWork, commitProfiler, finishedWork, current, commitStartTime, includeWorkInProgressEffects.effectDuration);
8250						} catch (error) {
8251							captureCommitPhaseError(finishedWork, finishedWork.return, error);
8252						}
8253					} else recursivelyTraverseReappearLayoutEffects(finishedRoot, finishedWork, layoutEffectTraversalFlags);
8254					break;
8255				case 31:
8256					recursivelyTraverseReappearLayoutEffects(finishedRoot, finishedWork, layoutEffectTraversalFlags);
8257					includeWorkInProgressEffects && flags & 4 && commitActivityHydrationCallbacks(finishedRoot, finishedWork);
8258					break;
8259				case 13:
8260					recursivelyTraverseReappearLayoutEffects(finishedRoot, finishedWork, layoutEffectTraversalFlags);
8261					includeWorkInProgressEffects && flags & 4 && commitSuspenseHydrationCallbacks(finishedRoot, finishedWork);
8262					break;
8263				case 22:
8264					null === finishedWork.memoizedState && recursivelyTraverseReappearLayoutEffects(finishedRoot, finishedWork, layoutEffectTraversalFlags);
8265					safelyAttachRef(finishedWork, finishedWork.return);
8266					break;
8267				case 30:
8268					recursivelyTraverseReappearLayoutEffects(finishedRoot, finishedWork, layoutEffectTraversalFlags);
8269					flags & 18874368 && trackNamedViewTransition(finishedWork);
8270					safelyAttachRef(finishedWork, finishedWork.return);
8271					break;
8272				case 7: safelyAttachRef(finishedWork, finishedWork.return);
8273				default: recursivelyTraverseReappearLayoutEffects(finishedRoot, finishedWork, layoutEffectTraversalFlags);
8274			}
8275			(finishedWork.mode & ProfileMode) !== NoMode && 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && (componentEffectSpawnedUpdate || .05 < componentEffectDuration) && logComponentEffect(finishedWork, componentEffectStartTime, componentEffectEndTime, componentEffectDuration, componentEffectErrors);
8276			popComponentEffectStart(prevEffectStart);
8277			popComponentEffectDuration(prevEffectDuration);
8278			componentEffectErrors = prevEffectErrors;
8279			componentEffectSpawnedUpdate = prevEffectDidSpawnUpdate;
8280		}
8281		function recursivelyTraverseReappearLayoutEffects(finishedRoot, parentFiber, layoutEffectTraversalFlags) {
8282			layoutEffectTraversalFlags = 0 !== (parentFiber.subtreeFlags & 8772) ? layoutEffectTraversalFlags : layoutEffectTraversalFlags & ~IncludeWorkInProgressEffects;
8283			for (parentFiber = parentFiber.child; null !== parentFiber;) reappearLayoutEffects(finishedRoot, parentFiber.alternate, parentFiber, layoutEffectTraversalFlags), parentFiber = parentFiber.sibling;
8284		}
8285		function commitOffscreenPassiveMountEffects(current, finishedWork) {
8286			var previousCache = null;
8287			null !== current && null !== current.memoizedState && null !== current.memoizedState.cachePool && (previousCache = current.memoizedState.cachePool.pool);
8288			current = null;
8289			null !== finishedWork.memoizedState && null !== finishedWork.memoizedState.cachePool && (current = finishedWork.memoizedState.cachePool.pool);
8290			current !== previousCache && (null != current && retainCache(current), null != previousCache && releaseCache(previousCache));
8291		}
8292		function commitCachePassiveMountEffect(current, finishedWork) {
8293			current = null;
8294			null !== finishedWork.alternate && (current = finishedWork.alternate.memoizedState.cache);
8295			finishedWork = finishedWork.memoizedState.cache;
8296			finishedWork !== current && (retainCache(finishedWork), null != current && releaseCache(current));
8297		}
8298		function recursivelyTraversePassiveMountEffects(root, parentFiber, committedLanes, committedTransitions, endTime) {
8299			var isViewTransitionEligible = (committedLanes & 335544064) === committedLanes;
8300			if (parentFiber.subtreeFlags & (isViewTransitionEligible ? 10262 : 10256) || 0 !== parentFiber.actualDuration && (null === parentFiber.alternate || parentFiber.alternate.child !== parentFiber.child)) for (parentFiber = parentFiber.child; null !== parentFiber;) isViewTransitionEligible = parentFiber.sibling, commitPassiveMountOnFiber(root, parentFiber, committedLanes, committedTransitions, null !== isViewTransitionEligible ? isViewTransitionEligible.actualStartTime : endTime), parentFiber = isViewTransitionEligible;
8301			else isViewTransitionEligible && restoreNestedViewTransitions(parentFiber);
8302		}
8303		function commitPassiveMountOnFiber(finishedRoot, finishedWork, committedLanes, committedTransitions, endTime) {
8304			var prevEffectStart = pushComponentEffectStart(), prevEffectDuration = pushComponentEffectDuration(), prevEffectErrors = pushComponentEffectErrors(), prevEffectDidSpawnUpdate = pushComponentEffectDidSpawnUpdate(), prevDeepEquality = alreadyWarnedForDeepEquality, isViewTransitionEligible = (committedLanes & 335544064) === committedLanes;
8305			isViewTransitionEligible && null === finishedWork.alternate && null !== finishedWork.return && null !== finishedWork.return.alternate && restoreEnterOrExitViewTransitions(finishedWork);
8306			var flags = finishedWork.flags;
8307			switch (finishedWork.tag) {
8308				case 0:
8309				case 11:
8310				case 15:
8311					(finishedWork.mode & ProfileMode) !== NoMode && 0 < finishedWork.actualStartTime && 0 !== (finishedWork.flags & 1) && logComponentRender(finishedWork, finishedWork.actualStartTime, endTime, inHydratedSubtree, committedLanes);
8312					recursivelyTraversePassiveMountEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, endTime);
8313					flags & 2048 && commitHookPassiveMountEffects(finishedWork, Passive | HasEffect);
8314					break;
8315				case 1:
8316					(finishedWork.mode & ProfileMode) !== NoMode && 0 < finishedWork.actualStartTime && (0 !== (finishedWork.flags & 128) ? logComponentErrored(finishedWork, finishedWork.actualStartTime, endTime, []) : 0 !== (finishedWork.flags & 1) && logComponentRender(finishedWork, finishedWork.actualStartTime, endTime, inHydratedSubtree, committedLanes));
8317					recursivelyTraversePassiveMountEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, endTime);
8318					break;
8319				case 3:
8320					var prevProfilerEffectDuration = pushNestedEffectDurations(), wasInHydratedSubtree = inHydratedSubtree;
8321					inHydratedSubtree = null !== finishedWork.alternate && finishedWork.alternate.memoizedState.isDehydrated && 0 === (finishedWork.flags & 256);
8322					recursivelyTraversePassiveMountEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, endTime);
8323					inHydratedSubtree = wasInHydratedSubtree;
8324					isViewTransitionEligible && rootViewTransitionNameCanceled && (committedLanes = finishedRoot.containerInfo, committedLanes = 9 === committedLanes.nodeType ? committedLanes.body : "HTML" === committedLanes.nodeName ? committedLanes.ownerDocument.body : committedLanes, "root" === committedLanes.style.viewTransitionName && (committedLanes.style.viewTransitionName = ""), committedLanes = committedLanes.ownerDocument.documentElement, null !== committedLanes && "none" === committedLanes.style.viewTransitionName && (committedLanes.style.viewTransitionName = ""));
8325					flags & 2048 && (committedLanes = null, null !== finishedWork.alternate && (committedLanes = finishedWork.alternate.memoizedState.cache), committedTransitions = finishedWork.memoizedState.cache, committedTransitions !== committedLanes && (retainCache(committedTransitions), null != committedLanes && releaseCache(committedLanes)));
8326					finishedRoot.passiveEffectDuration += popNestedEffectDurations(prevProfilerEffectDuration);
8327					break;
8328				case 12:
8329					if (flags & 2048) {
8330						flags = pushNestedEffectDurations();
8331						recursivelyTraversePassiveMountEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, endTime);
8332						finishedRoot = finishedWork.stateNode;
8333						finishedRoot.passiveEffectDuration += bubbleNestedEffectDurations(flags);
8334						try {
8335							runWithFiberInDEV(finishedWork, commitProfilerPostCommitImpl, finishedWork, finishedWork.alternate, commitStartTime, finishedRoot.passiveEffectDuration);
8336						} catch (error) {
8337							captureCommitPhaseError(finishedWork, finishedWork.return, error);
8338						}
8339					} else recursivelyTraversePassiveMountEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, endTime);
8340					break;
8341				case 31:
8342					flags = inHydratedSubtree;
8343					prevProfilerEffectDuration = null !== finishedWork.alternate ? finishedWork.alternate.memoizedState : null;
8344					isViewTransitionEligible = finishedWork.memoizedState;
8345					null !== prevProfilerEffectDuration && null === isViewTransitionEligible ? (isViewTransitionEligible = finishedWork.deleti
8345ons, null !== isViewTransitionEligible && 0 < isViewTransitionEligible.length && 18 === isViewTransitionEligible[0].tag ? (inHydratedSubtree = !1, prevProfilerEffectDuration = prevProfilerEffectDuration.hydrationErrors, null !== prevProfilerEffectDuration && logComponentErrored(finishedWork, finishedWork.actualStartTime, endTime, prevProfilerEffectDuration)) : inHydratedSubtree = !0) : inHydratedSubtree = !1;
8346					recursivelyTraversePassiveMountEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, endTime);
8347					inHydratedSubtree = flags;
8348					break;
8349				case 13:
8350					flags = inHydratedSubtree;
8351					prevProfilerEffectDuration = null !== finishedWork.alternate ? finishedWork.alternate.memoizedState : null;
8352					isViewTransitionEligible = finishedWork.memoizedState;
8353					null === prevProfilerEffectDuration || null === prevProfilerEffectDuration.dehydrated || null !== isViewTransitionEligible && null !== isViewTransitionEligible.dehydrated ? inHydratedSubtree = !1 : (isViewTransitionEligible = finishedWork.deletions, null !== isViewTransitionEligible && 0 < isViewTransitionEligible.length && 18 === isViewTransitionEligible[0].tag ? (inHydratedSubtree = !1, prevProfilerEffectDuration = prevProfilerEffectDuration.hydrationErrors, null !== prevProfilerEffectDuration && logComponentErrored(finishedWork, finishedWork.actualStartTime, endTime, prevProfilerEffectDuration)) : inHydratedSubtree = !0);
8354					recursivelyTraversePassiveMountEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, endTime);
8355					inHydratedSubtree = flags;
8356					break;
8357				case 23: break;
8358				case 22:
8359					wasInHydratedSubtree = finishedWork.stateNode;
8360					prevProfilerEffectDuration = finishedWork.alternate;
8361					null !== finishedWork.memoizedState ? (isViewTransitionEligible && null !== prevProfilerEffectDuration && null === prevProfilerEffectDuration.memoizedState && restoreEnterOrExitViewTransitions(prevProfilerEffectDuration), wasInHydratedSubtree._visibility & OffscreenPassiveEffectsConnected ? recursivelyTraversePassiveMountEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, endTime) : recursivelyTraverseAtomicPassiveEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, endTime)) : (isViewTransitionEligible && null !== prevProfilerEffectDuration && null !== prevProfilerEffectDuration.memoizedState && restoreEnterOrExitViewTransitions(finishedWork), wasInHydratedSubtree._visibility & OffscreenPassiveEffectsConnected ? recursivelyTraversePassiveMountEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, endTime) : (wasInHydratedSubtree._visibility |= OffscreenPassiveEffectsConnected, recursivelyTraverseReconnectPassiveEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, 0 !== (finishedWork.subtreeFlags & 10256) || 0 !== finishedWork.actualDuration && (null === finishedWork.alternate || finishedWork.alternate.child !== finishedWork.child), endTime), (finishedWork.mode & ProfileMode) === NoMode || inHydratedSubtree || (finishedRoot = finishedWork.actualStartTime, 0 <= finishedRoot && .05 < endTime - finishedRoot && logComponentReappeared(finishedWork, finishedRoot, endTime), 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && .05 < componentEffectEndTime - componentEffectStartTime && logComponentReappeared(finishedWork, componentEffectStartTime, componentEffectEndTime))));
8362					flags & 2048 && commitOffscreenPassiveMountEffects(prevProfilerEffectDuration, finishedWork);
8363					break;
8364				case 24:
8365					recursivelyTraversePassiveMountEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, endTime);
8366					flags & 2048 && commitCachePassiveMountEffect(finishedWork.alternate, finishedWork);
8367					break;
8368				case 30:
8369					isViewTransitionEligible && (flags = finishedWork.alternate, null !== flags && (restoreViewTransitionOnHostInstances(flags.child, !0), restoreViewTransitionOnHostInstances(finishedWork.child, !0)));
8370					recursivelyTraversePassiveMountEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, endTime);
8371					break;
8372				default: recursivelyTraversePassiveMountEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, endTime);
8373			}
8374			if ((finishedWork.mode & ProfileMode) !== NoMode) {
8375				if (finishedRoot = !inHydratedSubtree && null === finishedWork.alternate && null !== finishedWork.return && null !== finishedWork.return.alternate) committedLanes = finishedWork.actualStartTime, 0 <= committedLanes && .05 < endTime - committedLanes && logComponentTrigger(finishedWork, committedLanes, endTime, "Mount");
8376				0 <= componentEffectStartTime && 0 <= componentEffectEndTime && ((componentEffectSpawnedUpdate || .05 < componentEffectDuration) && logComponentEffect(finishedWork, componentEffectStartTime, componentEffectEndTime, componentEffectDuration, componentEffectErrors), finishedRoot && .05 < componentEffectEndTime - componentEffectStartTime && logComponentTrigger(finishedWork, componentEffectStartTime, componentEffectEndTime, "Mount"));
8377			}
vendor: 6,534 bytes, lines 8378-8456
8378			popComponentEffectStart(prevEffectStart);
8379			popComponentEffectDuration(prevEffectDuration);
8380			componentEffectErrors = prevEffectErrors;
8381			componentEffectSpawnedUpdate = prevEffectDidSpawnUpdate;
8382			alreadyWarnedForDeepEquality = prevDeepEquality;
8383		}
8384		function recursivelyTraverseReconnectPassiveEffects(finishedRoot, parentFiber, committedLanes, committedTransitions, includeWorkInProgressEffects, endTime) {
8385			includeWorkInProgressEffects = includeWorkInProgressEffects && (0 !== (parentFiber.subtreeFlags & 10256) || 0 !== parentFiber.actualDuration && (null === parentFiber.alternate || parentFiber.alternate.child !== parentFiber.child));
8386			for (parentFiber = parentFiber.child; null !== parentFiber;) {
8387				var nextSibling = parentFiber.sibling;
8388				reconnectPassiveEffects(finishedRoot, parentFiber, committedLanes, committedTransitions, includeWorkInProgressEffects, null !== nextSibling ? nextSibling.actualStartTime : endTime);
8389				parentFiber = nextSibling;
8390			}
8391		}
8392		function reconnectPassiveEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, includeWorkInProgressEffects, endTime) {
8393			var prevEffectStart = pushComponentEffectStart(), prevEffectDuration = pushComponentEffectDuration(), prevEffectErrors = pushComponentEffectErrors(), prevEffectDidSpawnUpdate = pushComponentEffectDidSpawnUpdate(), prevDeepEquality = alreadyWarnedForDeepEquality;
8394			includeWorkInProgressEffects && (finishedWork.mode & ProfileMode) !== NoMode && 0 < finishedWork.actualStartTime && 0 !== (finishedWork.flags & 1) && logComponentRender(finishedWork, finishedWork.actualStartTime, endTime, inHydratedSubtree, committedLanes);
8395			var flags = finishedWork.flags;
8396			switch (finishedWork.tag) {
8397				case 0:
8398				case 11:
8399				case 15:
8400					recursivelyTraverseReconnectPassiveEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, includeWorkInProgressEffects, endTime);
8401					commitHookPassiveMountEffects(finishedWork, Passive);
8402					break;
8403				case 23: break;
8404				case 22:
8405					var _instance4 = finishedWork.stateNode;
8406					null !== finishedWork.memoizedState ? _instance4._visibility & OffscreenPassiveEffectsConnected ? recursivelyTraverseReconnectPassiveEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, includeWorkInProgressEffects, endTime) : recursivelyTraverseAtomicPassiveEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, endTime) : (_instance4._visibility |= OffscreenPassiveEffectsConnected, recursivelyTraverseReconnectPassiveEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, includeWorkInProgressEffects, endTime));
8407					includeWorkInProgressEffects && flags & 2048 && commitOffscreenPassiveMountEffects(finishedWork.alternate, finishedWork);
8408					break;
8409				case 24:
8410					recursivelyTraverseReconnectPassiveEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, includeWorkInProgressEffects, endTime);
8411					includeWorkInProgressEffects && flags & 2048 && commitCachePassiveMountEffect(finishedWork.alternate, finishedWork);
8412					break;
8413				default: recursivelyTraverseReconnectPassiveEffects(finishedRoot, finishedWork, committedLanes, committedTransitions, includeWorkInProgressEffects, endTime);
8414			}
8415			(finishedWork.mode & ProfileMode) !== NoMode && 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && (componentEffectSpawnedUpdate || .05 < componentEffectDuration) && logComponentEffect(finishedWork, componentEffectStartTime, componentEffectEndTime, componentEffectDuration, componentEffectErrors);
8416			popComponentEffectStart(prevEffectStart);
8417			popComponentEffectDuration(prevEffectDuration);
8418			componentEffectErrors = prevEffectErrors;
8419			componentEffectSpawnedUpdate = prevEffectDidSpawnUpdate;
8420			alreadyWarnedForDeepEquality = prevDeepEquality;
8421		}
8422		function recursivelyTraverseAtomicPassiveEffects(finishedRoot$jscomp$0, parentFiber, committedLanes$jscomp$0, committedTransitions$jscomp$0, endTime$jscomp$0) {
8423			if (parentFiber.subtreeFlags & 10256 || 0 !== parentFiber.actualDuration && (null === parentFiber.alternate || parentFiber.alternate.child !== parentFiber.child)) for (var child = parentFiber.child; null !== child;) {
8424				parentFiber = child.sibling;
8425				var finishedRoot = finishedRoot$jscomp$0, committedLanes = committedLanes$jscomp$0, committedTransitions = committedTransitions$jscomp$0, endTime = null !== parentFiber ? parentFiber.actualStartTime : endTime$jscomp$0, prevDeepEquality = alreadyWarnedForDeepEquality;
8426				(child.mode & ProfileMode) !== NoMode && 0 < child.actualStartTime && 0 !== (child.flags & 1) && logComponentRender(child, child.actualStartTime, endTime, inHydratedSubtree, committedLanes);
8427				var flags = child.flags;
8428				switch (child.tag) {
8429					case 22:
8430						recursivelyTraverseAtomicPassiveEffects(finishedRoot, child, committedLanes, committedTransitions, endTime);
8431						flags & 2048 && commitOffscreenPassiveMountEffects(child.alternate, child);
8432						break;
8433					case 24:
8434						recursivelyTraverseAtomicPassiveEffects(finishedRoot, child, committedLanes, committedTransitions, endTime);
8435						flags & 2048 && commitCachePassiveMountEffect(child.alternate, child);
8436						break;
8437					default: recursivelyTraverseAtomicPassiveEffects(finishedRoot, child, committedLanes, committedTransitions, endTime);
8438				}
8439				alreadyWarnedForDeepEquality = prevDeepEquality;
8440				child = parentFiber;
8441			}
8442		}
8443		function recursivelyAccumulateSuspenseyCommit(parentFiber, committedLanes, suspendedState) {
8444			if (parentFiber.subtreeFlags & suspenseyCommitFlag) for (parentFiber = parentFiber.child; null !== parentFiber;) accumulateSuspenseyCommitOnFiber(parentFiber, committedLanes, suspendedState), parentFiber = parentFiber.sibling;
8445		}
8446		function accumulateSuspenseyCommitOnFiber(fiber, committedLanes, suspendedState) {
8447			switch (fiber.tag) {
8448				case 26:
8449					recursivelyAccumulateSuspenseyCommit(fiber, committedLanes, suspendedState);
8450					fiber.flags & suspenseyCommitFlag && (null !== fiber.memoizedState ? suspendResource(suspendedState, currentHoistableRoot, fiber.memoizedState, fiber.memoizedProps) : (fiber = fiber.stateNode, (committedLanes & 335544128) === committedLanes && suspendInstance(suspendedState, fiber)));
8451					break;
8452				case 5:
8453					recursivelyAccumulateSuspenseyCommit(fiber, committedLanes, suspendedState);
8454					fiber.flags & suspenseyCommitFlag && (fiber = fiber.stateNode, (committedLanes & 335544128) === committedLanes && suspendInstance(suspendedState, fiber));
8455					break;
8456				case 3:
8457				case 4:
8458					var previousHoistableRoot = currentHoistableRoot;
8459					currentHoistableRoot = getHoistableRoot(fiber.stateNode.containerInfo);
8460					recursivelyAccumulateSuspenseyCommit(fiber, committedLanes, suspendedState);
8461					currentHoistableRoot = previousHoistableRoot;
8462					break;
8463				case 22:
8464					null === fiber.memoizedState && (previousHoistableRoot = fiber.alternate, null !== previousHoistableRoot && null !== previousHoistableRoot.memoizedState ? (previousHoistableRoot = suspenseyCommitFlag, suspenseyCommitFlag = 16777216, recursivelyAccumulateSuspenseyCommit(fiber, committedLanes, suspendedState), suspenseyCommitFlag = previousHoistableRoot) : recursivelyAccumulateSuspenseyCommit(fiber, committedLanes, suspendedState));
8465					break;
8466				case 30:
8467					if (0 !== (fiber.flags & suspenseyCommitFlag) && (previousHoistableRoot = fiber.memoizedProps.name, null != previousHoistableRoot && "auto" !== previousHoistableRoot)) {
8468						var state = fiber.stateNode;
8469						state.paired = null;
8470						null === appearingViewTransitions && (appearingViewTransitions = /* @__PURE__ */ new Map());
8471						appearingViewTransitions.set(previousHoistableRoot, state);
8472					}
8473					recursivelyAccumulateSuspenseyCommit(fiber, committedLanes, suspendedState);
8474					break;
8475				default: recursivelyAccumulateSuspenseyCommit(fiber, committedLanes, suspendedState);
8476			}
8477		}
8478		function detachAlternateSiblings(parentFiber) {
8479			var previousFiber = parentFiber.alternate;
8480			if (null !== previousFiber && (parentFiber = previousFiber.child, null !== parentFiber)) {
8481				previousFiber.child = null;
8482				do
8483					previousFiber = parentFiber.sibling, parentFiber.sibling = null, parentFiber = previousFiber;
8484				while (null !== parentFiber);
8485			}
8486		}
8487		function recursivelyTraversePassiveUnmountEffects(parentFiber) {
8488			var deletions = parentFiber.deletions;
8489			if (0 !== (parentFiber.flags & 16)) {
8490				if (null !== deletions) for (var i = 0; i < deletions.length; i++) {
8491					var childToDelete = deletions[i], prevEffectStart = pushComponentEffectStart();
8492					nextEffect = childToDelete;
8493					commitPassiveUnmountEffectsInsideOfDeletedTree_begin(childToDelete, parentFiber);
8494					(childToDelete.mode & ProfileMode) !== NoMode && 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && .05 < componentEffectEndTime - componentEffectStartTime && logComponentTrigger(childToDelete, componentEffectStartTime, componentEffectEndTime, "Unmount");
8495					popComponentEffectStart(prevEffectStart);
8496				}
8497				detachAlternateSiblings(parentFiber);
8498			}
8499			if (parentFiber.subtreeFlags & 10256) for (parentFiber = parentFiber.child; null !== parentFiber;) commitPassiveUnmountOnFiber(parentFiber), parentFiber = parentFiber.sibling;
8500		}
8501		function commitPassiveUnmountOnFiber(finishedWork) {
8502			var prevEffectStart = pushComponentEffectStart(), prevEffectDuration = pushComponentEffectDuration(), prevEffectErrors = pushComponentEffectErrors(), prevEffectDidSpawnUpdate = pushComponentEffectDidSpawnUpdate();
8503			switch (finishedWork.tag) {
8504				case 0:
8505				case 11:
8506				case 15:
8507					recursivelyTraversePassiveUnmountEffects(finishedWork);
8508					finishedWork.flags & 2048 && commitHookPassiveUnmountEffects(finishedWork, finishedWork.return, Passive | HasEffect);
8509					break;
8510				case 3:
8511					var prevProfilerEffectDuration = pushNestedEffectDurations();
8512					recursivelyTraversePassiveUnmountEffects(finishedWork);
8513					finishedWork.stateNode.passiveEffectDuration += popNestedEffectDurations(prevProfilerEffectDuration);
8514					break;
8515				case 12:
8516					prevProfilerEffectDuration = pushNestedEffectDurations();
8517					recursivelyTraversePassiveUnmountEffects(finishedWork);
8518					finishedWork.stateNode.passiveEffectDuration += bubbleNestedEffectDurations(prevProfilerEffectDuration);
8519					break;
8520				case 22:
8521					prevProfilerEffectDuration = finishedWork.stateNode;
8522					null !== finishedWork.memoizedState && prevProfilerEffectDuration._visibility & OffscreenPassiveEffectsConnected && (null === finishedWork.return || 13 !== finishedWork.return.tag) ? (prevProfilerEffectDuration._visibility &= ~OffscreenPassiveEffectsConnected, recursivelyTraverseDisconnectPassiveEffects(finishedWork), (finishedWork.mode & ProfileMode) !== NoMode && 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && .05 < componentEffectEndTime - componentEffectStartTime && logComponentTrigger(finishedWork, componentEffectStartTime, componentEffectEndTime, "Disconnect")) : recursivelyTraversePassiveUnmountEffects(finishedWork);
8523					break;
8524				default: recursivelyTraversePassiveUnmountEffects(finishedWork);
8525			}
8526			(finishedWork.mode & ProfileMode) !== NoMode && 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && (componentEffectSpawnedUpdate || .05 < componentEffectDuration) && logComponentEffect(finishedWork, componentEffectStartTime, componentEffectEndTime, componentEffectDuration, componentEffectErrors);
vendor: 4,659 bytes, lines 8527-8611
8527			popComponentEffectStart(prevEffectStart);
8528			popComponentEffectDuration(prevEffectDuration);
8529			componentEffectSpawnedUpdate = prevEffectDidSpawnUpdate;
8530			componentEffectErrors = prevEffectErrors;
8531		}
8532		function recursivelyTraverseDisconnectPassiveEffects(parentFiber) {
8533			var deletions = parentFiber.deletions;
8534			if (0 !== (parentFiber.flags & 16)) {
8535				if (null !== deletions) for (var i = 0; i < deletions.length; i++) {
8536					var childToDelete = deletions[i], prevEffectStart = pushComponentEffectStart();
8537					nextEffect = childToDelete;
8538					commitPassiveUnmountEffectsInsideOfDeletedTree_begin(childToDelete, parentFiber);
8539					(childToDelete.mode & ProfileMode) !== NoMode && 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && .05 < componentEffectEndTime - componentEffectStartTime && logComponentTrigger(childToDelete, componentEffectStartTime, componentEffectEndTime, "Unmount");
8540					popComponentEffectStart(prevEffectStart);
8541				}
8542				detachAlternateSiblings(parentFiber);
8543			}
8544			for (parentFiber = parentFiber.child; null !== parentFiber;) disconnectPassiveEffect(parentFiber), parentFiber = parentFiber.sibling;
8545		}
8546		function disconnectPassiveEffect(finishedWork) {
8547			var prevEffectStart = pushComponentEffectStart(), prevEffectDuration = pushComponentEffectDuration(), prevEffectErrors = pushComponentEffectErrors(), prevEffectDidSpawnUpdate = pushComponentEffectDidSpawnUpdate();
8548			switch (finishedWork.tag) {
8549				case 0:
8550				case 11:
8551				case 15:
8552					commitHookPassiveUnmountEffects(finishedWork, finishedWork.return, Passive);
8553					recursivelyTraverseDisconnectPassiveEffects(finishedWork);
8554					break;
8555				case 22:
8556					var instance = finishedWork.stateNode;
8557					instance._visibility & OffscreenPassiveEffectsConnected && (instance._visibility &= ~OffscreenPassiveEffectsConnected, recursivelyTraverseDisconnectPassiveEffects(finishedWork));
8558					break;
8559				default: recursivelyTraverseDisconnectPassiveEffects(finishedWork);
8560			}
8561			(finishedWork.mode & ProfileMode) !== NoMode && 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && (componentEffectSpawnedUpdate || .05 < componentEffectDuration) && logComponentEffect(finishedWork, componentEffectStartTime, componentEffectEndTime, componentEffectDuration, componentEffectErrors);
8562			popComponentEffectStart(prevEffectStart);
8563			popComponentEffectDuration(prevEffectDuration);
8564			componentEffectSpawnedUpdate = prevEffectDidSpawnUpdate;
8565			componentEffectErrors = prevEffectErrors;
8566		}
8567		function commitPassiveUnmountEffectsInsideOfDeletedTree_begin(deletedSubtreeRoot, nearestMountedAncestor$jscomp$0) {
8568			for (; null !== nextEffect;) {
8569				var fiber = nextEffect, current = fiber, nearestMountedAncestor = nearestMountedAncestor$jscomp$0, prevEffectStart = pushComponentEffectStart(), prevEffectDuration = pushComponentEffectDuration(), prevEffectErrors = pushComponentEffectErrors(), prevEffectDidSpawnUpdate = pushComponentEffectDidSpawnUpdate();
8570				switch (current.tag) {
8571					case 0:
8572					case 11:
8573					case 15:
8574						commitHookPassiveUnmountEffects(current, nearestMountedAncestor, Passive);
8575						break;
8576					case 23:
8577					case 22:
8578						null !== current.memoizedState && null !== current.memoizedState.cachePool && (nearestMountedAncestor = current.memoizedState.cachePool.pool, null != nearestMountedAncestor && retainCache(nearestMountedAncestor));
8579						break;
8580					case 24: releaseCache(current.memoizedState.cache);
8581				}
8582				(current.mode & ProfileMode) !== NoMode && 0 <= componentEffectStartTime && 0 <= componentEffectEndTime && (componentEffectSpawnedUpdate || .05 < componentEffectDuration) && logComponentEffect(current, componentEffectStartTime, componentEffectEndTime, componentEffectDuration, componentEffectErrors);
8583				popComponentEffectStart(prevEffectStart);
8584				popComponentEffectDuration(prevEffectDuration);
8585				componentEffectSpawnedUpdate = prevEffectDidSpawnUpdate;
8586				componentEffectErrors = prevEffectErrors;
8587				current = fiber.child;
8588				if (null !== current) current.return = fiber, nextEffect = current;
8589				else a: for (fiber = deletedSubtreeRoot; null !== nextEffect;) {
8590					current = nextEffect;
8591					prevEffectStart = current.sibling;
8592					prevEffectDuration = current.return;
8593					detachFiberAfterEffects(current);
8594					if (current === fiber) {
8595						nextEffect = null;
8596						break a;
8597					}
8598					if (null !== prevEffectStart) {
8599						prevEffectStart.return = prevEffectDuration;
8600						nextEffect = prevEffectStart;
8601						break a;
8602					}
8603					nextEffect = prevEffectDuration;
8604				}
8605			}
8606		}
8607		function onCommitRoot() {
8608			commitHooks.forEach(function(commitHook) {
8609				return commitHook();
8610			});
8611		}
8612		function isConcurrentActEnvironment() {
8613			var isReactActEnvironmentGlobal = "undefined" !== typeof IS_REACT_ACT_ENVIRONMENT ? IS_REACT_ACT_ENVIRONMENT : void 0;
8614			isReactActEnvironmentGlobal || null === ReactSharedInternals.actQueue || console.error("The current testing environment is not configured to support act(...)");
8615			return isReactActEnvironmentGlobal;
8616		}
8617		function requestUpdateLane(fiber) {
8618			if ((executionContext & RenderContext) !== NoContext && 0 !== workInProgressRootRenderLanes) return workInProgressRootRenderLanes & -workInProgressRootRenderLanes;
8619			var transition = ReactSharedInternals.T;
8620			if (null !== transition) return transition._updatedFibers || (transition._updatedFibers = /* @__PURE__ */ new Set()), transition._updatedFibers.add(fiber), null !== lastSuspendedFiber && resolveUpdatePriority() === DiscreteEventPriority && (lastSuspendedFiber = null), requestTransitionLane();
8621			fiber = resolveUpdatePriority();
8622			fiber === DiscreteEventPriority && (lastSuspendedFiber = null);
8623			return fiber;
8624		}
8625		function requestDeferredLane() {
8626			if (0 === workInProgressDeferredLane) if (0 === (workInProgressRootRenderLanes & 536870912) || isHydrating) {
8627				var lane = nextTransitionDeferredLane;
8628				nextTransitionDeferredLane <<= 1;
8629				0 === (nextTransitionDeferredLane & 3932160) && (nextTransitionDeferredLane = 262144);
8630				workInProgressDeferredLane = lane;
8631			} else workInProgressDeferredLane = 536870912;
8632			lane = suspenseHandlerStackCursor.current;
8633			null !== lane && (lane.flags |= 32);
8634			return workInProgressDeferredLane;
8635		}
8636		function scheduleViewTransitionEvent(fiber, callback) {
8637			if (null != callback) {
8638				var state = fiber.stateNode, instance = state.ref;
8639				null === instance && (instance = state.ref = createViewTransitionInstance(getViewTransitionName(fiber.memoizedProps, state)));
8640				null === pendingViewTransitionEvents && (pendingViewTransitionEvents = []);
8641				pendingViewTransitionEvents.push(callback.bind(null, instance));
8642			}
8643		}
8644		function scheduleUpdateOnFiber(root, fiber, lane) {
8645			isRunningInsertionEffect && console.error("useInsertionEffect must not schedule updates.");
8646			isFlushingPassiveEffects && (didScheduleUpdateDuringPassiveEffects = !0);
8647			if (root === workInProgressRoot && (workInProgressSuspendedReason === SuspendedOnData || workInProgressSuspendedReason === SuspendedOnAction) || null !== root.cancelPendingCommit) prepareFreshStack(root, 0), markRootSuspended(root, workInProgressRootRenderLanes, workInProgressDeferredLane, !1);
8648			markRootUpdated$1(root, lane);
8649			if ((executionContext & RenderContext) !== NoContext && root === workInProgressRoot) {
8650				if (isRendering) switch (fiber.tag) {
8651					case 0:
8652					case 11:
8653					case 15:
8654						root = workInProgress && getComponentNameFromFiber(workInProgress) || "Unknown";
8655						didWarnAboutUpdateInRenderForAnotherComponent.has(root) || (didWarnAboutUpdateInRenderForAnotherComponent.add(root), fiber = getComponentNameFromFiber(fiber) || "Unknown", console.error("Cannot update a component (`%s`) while rendering a different component (`%s`). To locate the bad setState() call inside `%s`, follow the stack trace as described in https://react.dev/link/setstate-in-render", fiber, root, root));
8656						break;
8657					case 1: didWarnAboutUpdateInRender || (console.error("Cannot update during an existing state transition (such as within `render`). Render methods should be a pure function of props and state."), didWarnAboutUpdateInRender = !0);
8658				}
8659			} else isDevToolsPresent && addFiberToLanesMap(root, fiber, lane), warnIfUpdatesNotWrappedWithActDEV(fiber), root === workInProgressRoot && ((executionContext & RenderContext) === NoContext && (workInProgressRootInterleavedUpdatedLanes |= lane), workInProgressRootExitStatus === RootSuspendedWithDelay && markRootSuspended(root, workInProgressRootRenderLanes, workInProgressDeferredLane, !1)), ensureRootIsScheduled(root);
8660		}
8661		function performWorkOnRoot(root, lanes, forceSync) {
8662			if ((executionContext & (RenderContext | CommitContext)) !== NoContext) throw Error("Should not already be working.");
8663			if (0 !== workInProgressRootRenderLanes && null !== workInProgress) {
8664				var yieldedFiber = workInProgress, yieldEndTime = now$1();
8665				switch (yieldReason) {
8666					case SuspendedOnImmediate:
8667					case SuspendedOnData:
8668						var startTime = yieldStartTime;
8669						supportsUserTiming && ((yieldedFiber = yieldedFiber._debugTask) ? yieldedFiber.run(console.timeStamp.bind(console, "Suspended", startTime, yieldEndTime, COMPONENTS_TRACK, void 0, "primary-light")) : console.timeStamp("Suspended", startTime, yieldEndTime, COMPONENTS_TRACK, void 0, "primary-light"));
8670						break;
8671					case SuspendedOnAction:
8672						startTime = yieldStartTime;
8673						supportsUserTiming && ((yieldedFiber = yieldedFiber._debugTask) ? yieldedFiber.run(console.timeStamp.bind(console, "Action", startTime, yieldEndTime, COMPONENTS_TRACK, void 0, "primary-light")) : console.timeStamp("Action", startTime, yieldEndTime, COMPONENTS_TRACK, void 0, "primary-light"));
8674						break;
8675					default: supportsUserTiming && (yieldedFiber = yieldEndTime - yieldStartTime, 3 > yieldedFiber || console.timeStamp("Blocked", yieldStartTime, yieldEndTime, COMPONENTS_TRACK, void 0, 5 > yieldedFiber ? "primary-light" : 10 > yieldedFiber ? "primary" : 100 > yieldedFiber ? "primary-dark" : "error"));
8676				}
8677			}
8678			startTime = (forceSync = !forceSync && 0 === (lanes & 127) && 0 === (lanes & root.expiredLanes) || checkIfRootIsPrerendering(root, lanes)) ? renderRootConcurrent(root, lanes) : renderRootSync(root, lanes, !0);
8679			var renderWasConcurrent = forceSync;
8680			do {
8681				if (startTime === RootInProgress) {
8682					workInProgressRootIsPrerendering && !forceSync && markRootSuspended(root, lanes, 0, !1);
8683					lanes = workInProgressSuspendedReason;
vendor: 4,308 bytes, lines 8684-8763
8684					yieldStartTime = now();
8685					yieldReason = lanes;
8686					break;
8687				} else {
8688					yieldedFiber = now$1();
8689					yieldEndTime = root.current.alternate;
8690					if (renderWasConcurrent && !isRenderConsistentWithExternalStores(yieldEndTime)) {
8691						setCurrentTrackFromLanes(lanes);
8692						yieldEndTime = renderStartTime;
8693						startTime = yieldedFiber;
8694						!supportsUserTiming || startTime <= yieldEndTime || (workInProgressUpdateTask ? workInProgressUpdateTask.run(console.timeStamp.bind(console, "Teared Render", yieldEndTime, startTime, currentTrack, LANES_TRACK_GROUP, "error")) : console.timeStamp("Teared Render", yieldEndTime, startTime, currentTrack, LANES_TRACK_GROUP, "error"));
8695						finalizeRender(lanes, yieldedFiber);
8696						startTime = renderRootSync(root, lanes, !1);
8697						renderWasConcurrent = !1;
8698						continue;
8699					}
8700					if (startTime === RootErrored) {
8701						renderWasConcurrent = lanes;
8702						if (root.errorRecoveryDisabledLanes & renderWasConcurrent) var errorRetryLanes = 0;
8703						else errorRetryLanes = root.pendingLanes & -536870913, errorRetryLanes = 0 !== errorRetryLanes ? errorRetryLanes : errorRetryLanes & 536870912 ? 536870912 : 0;
8704						if (0 !== errorRetryLanes) {
8705							setCurrentTrackFromLanes(lanes);
8706							logErroredRenderPhase(renderStartTime, yieldedFiber, lanes, workInProgressUpdateTask);
8707							finalizeRender(lanes, yieldedFiber);
8708							lanes = errorRetryLanes;
8709							a: {
8710								yieldedFiber = root;
8711								startTime = renderWasConcurrent;
8712								renderWasConcurrent = workInProgressRootConcurrentErrors;
8713								var wasRootDehydrated = yieldedFiber.current.memoizedState.isDehydrated;
8714								wasRootDehydrated && (prepareFreshStack(yieldedFiber, errorRetryLanes).flags |= 256);
8715								errorRetryLanes = renderRootSync(yieldedFiber, errorRetryLanes, !1);
8716								if (errorRetryLanes !== RootErrored && errorRetryLanes !== RootSuspendedAtTheShell) {
8717									if (workInProgressRootDidAttachPingListener && !wasRootDehydrated) {
8718										yieldedFiber.errorRecoveryDisabledLanes |= startTime;
8719										workInProgressRootInterleavedUpdatedLanes |= startTime;
8720										startTime = RootSuspendedWithDelay;
8721										break a;
8722									}
8723									yieldedFiber = workInProgressRootRecoverableErrors;
8724									workInProgressRootRecoverableErrors = renderWasConcurrent;
8725									null !== yieldedFiber && (null === workInProgressRootRecoverableErrors ? workInProgressRootRecoverableErrors = yieldedFiber : workInProgressRootRecoverableErrors.push.apply(workInProgressRootRecoverableErrors, yieldedFiber));
8726								}
8727								startTime = errorRetryLanes;
8728							}
8729							renderWasConcurrent = !1;
8730							if (startTime !== RootErrored) continue;
8731							else yieldedFiber = now$1();
8732						}
8733					}
8734					if (startTime === RootFatalErrored) {
8735						setCurrentTrackFromLanes(lanes);
8736						logErroredRenderPhase(renderStartTime, yieldedFiber, lanes, workInProgressUpdateTask);
8737						finalizeRender(lanes, yieldedFiber);
8738						prepareFreshStack(root, 0);
8739						markRootSuspended(root, lanes, 0, !0);
8740						break;
8741					}
8742					a: {
8743						forceSync = root;
8744						switch (startTime) {
8745							case RootInProgress:
8746							case RootFatalErrored: throw Error("Root did not complete. This is a bug in React.");
8747							case RootSuspendedWithDelay: if ((lanes & 4194048) !== lanes && (lanes & 62914560) !== lanes) break;
8748							case RootSuspendedAtTheShell:
8749								setCurrentTrackFromLanes(lanes);
8750								logSuspendedRenderPhase(renderStartTime, yieldedFiber, lanes, workInProgressUpdateTask);
8751								finalizeRender(lanes, yieldedFiber);
8752								yieldEndTime = lanes;
8753								0 !== (yieldEndTime & 127) ? blockingSuspendedTime = yieldedFiber : 0 !== (yieldEndTime & 4194048) && (transitionSuspendedTime = yieldedFiber);
8754								markRootSuspended(forceSync, lanes, workInProgressDeferredLane, !workInProgressRootDidSkipSuspendedSiblings);
8755								break a;
8756							case RootErrored:
8757								workInProgressRootRecoverableErrors = null;
8758								break;
8759							case RootSuspended:
8760							case RootCompleted: break;
8761							default: throw Error("Unknown root exit status.");
8762						}
8763						if (null !== ReactSharedInternals.actQueue) completeRoot(forceSync, yieldEndTime, lanes, workInProgressRootRecoverableErrors, workInProgressTransitions, workInProgressRootDidIncludeRecursiveRenderUpd
8763ate, workInProgressDeferredLane, workInProgressRootInterleavedUpdatedLanes, workInProgressSuspendedRetryLanes, workInProgressRootDidSkipSuspendedSiblings, startTime, null, null, renderStartTime, yieldedFiber);
8764						else {
8765							if ((lanes & 62914560) === lanes && (renderWasConcurrent = globalMostRecentFallbackTime + FALLBACK_THROTTLE_MS - now$1(), 10 < renderWasConcurrent)) {
8766								markRootSuspended(forceSync, lanes, workInProgressDeferredLane, !workInProgressRootDidSkipSuspendedSiblings);
8767								if (0 !== getNextLanes(forceSync, 0, !0)) break a;
8768								pendingEffectsLanes = lanes;
8769								forceSync.timeoutHandle = scheduleTimeout(completeRootWhenReady.bind(null, forceSync, yieldEndTime, workInProgressRootRecoverableErrors, workInProgressTransitions, workInProgressRootDidIncludeRecursiveRenderUpdate, lanes, workInProgressDeferredLane, workInProgressRootInterleavedUpdatedLanes, workInProgressSuspendedRetryLanes, workInProgressRootDidSkipSuspendedSiblings, startTime, "Throttled", renderStartTime, yieldedFiber), renderWasConcurrent);
8770								break a;
8771							}
8772							completeRootWhenReady(forceSync, yieldEndTime, workInProgressRootRecoverableErrors, workInProgressTransitions, workInProgressRootDidIncludeRecursiveRenderUpdate, lanes, workInProgressDeferredLane, workInProgressRootInterleavedUpdatedLanes, workInProgressSuspendedRetryLanes, workInProgressRootDidSkipSuspendedSiblings, startTime, null, renderStartTime, yieldedFiber);
8773						}
8774					}
8775				}
8776				break;
8777			} while (1);
8778			ensureRootIsScheduled(root);
8779		}
8780		function completeRootWhenReady(root, finishedWork, recoverableErrors, transitions, didIncludeRenderPhaseUpdate, lanes, spawnedLane, updatedLanes, suspendedRetryLanes, didSkipSuspendedSiblings, exitStatus, suspendedCommitReason, completedRenderStartTime, completedRenderEndTime) {
8781			root.timeoutHandle = noTimeout;
8782			var subtreeFlags = finishedWork.subtreeFlags, isViewTransitionEligible = (lanes & 335544064) === lanes, suspendedState = null;
8783			if (isViewTransitionEligible || subtreeFlags & 8192 || 16785408 === (subtreeFlags & 16785408)) {
8784				if (suspendedState = {
8785					stylesheets: null,
8786					count: 0,
8787					imgCount: 0,
8788					imgBytes: 0,
8789					suspenseyImages: [],
8790					waitingForImages: !0,
8791					waitingForViewTransition: !1,
8792					unsuspend: noop$1
8793				}, appearingViewTransitions = null, accumulateSuspenseyCommitOnFiber(finishedWork, lanes, suspendedState), isViewTransitionEligible && (subtreeFlags = suspendedState, isViewTransitionEligible = root.containerInfo, isViewTransitionEligible = (9 === isViewTransitionEligible.nodeType ? isViewTransitionEligible : isViewTransitionEligible.ownerDocument).__reactViewTransition, null != isViewTransitionEligible && (subtreeFlags.count++, subtreeFlags.waitingForViewTransition = !0, subtreeFlags = onUnsuspend.bind(subtreeFlags), isViewTransitionEligible.finished.then(subtreeFlags, subtreeFlags))), subtreeFlags = (lanes & 62914560) === lanes ? globalMostRecentFallbackTime - now$1() : (lanes & 4194048) === lanes ? globalMostRecentTransitionTime - now$1() : 0, subtreeFlags = waitForCommitToBeReady(suspendedState, subtreeFlags), null !== subtreeFlags) {
8794					pendingEffectsLanes = lanes;
8795					root.cancelPendingCommit = subtreeFlags(completeRoot.bind(null, root, finishedWork, lanes, recoverableErrors, transitions, didIncludeRenderPhaseUpdate, spawnedLane, updatedLanes, suspendedRetryLanes, didSkipSuspendedSiblings, exitStatus, suspendedState, suspendedState.waitingForViewTransition ? "Waiting for the previous Animation" : 0 < suspendedState.count ? 0 < suspendedState.imgCount ? "Suspended on CSS and Images" : "Suspended on CSS" : 1 === suspendedState.imgCount ? "Suspended on an Image" : 0 < suspendedState.imgCount ? "Suspended on Images" : null, completedRenderStartTime, completedRenderEndTime));
8796					markRootSuspended(root, lanes, spawnedLane, !didSkipSuspendedSiblings);
8797					return;
8798				}
8799			}
8800			completeRoot(root, finishedWork, lanes, recoverableErrors, transitions, didIncludeRenderPhaseUpdate, spawnedLane, updatedLanes, suspendedRetryLanes, didSkipSuspendedSiblings, exitStatus, suspendedState, suspendedCommitReason, completedRenderStartTime, completedRenderEndTime);
8801		}
8802		function isRenderConsistentWithExternalStores(finishedWork) {
8803			for (var node = finishedWork;;) {
8804				var tag = node.tag;
8805				if ((0 === tag || 11 === tag || 15 === tag) && node.flags & 16384 && (tag = node.updateQueue, null !== tag && (tag = tag.stores, null !== tag))) for (var i = 0; i < tag.length; i++) {
vendor: 6,289 bytes, lines 8806-8898
8806					var check = tag[i], getSnapshot = check.getSnapshot;
8807					check = check.value;
8808					try {
8809						if (!objectIs(getSnapshot(), check)) return !1;
8810					} catch (error) {
8811						return !1;
8812					}
8813				}
8814				tag = node.child;
8815				if (node.subtreeFlags & 16384 && null !== tag) tag.return = node, node = tag;
8816				else {
8817					if (node === finishedWork) break;
8818					for (; null === node.sibling;) {
8819						if (null === node.return || node.return === finishedWork) return !0;
8820						node = node.return;
8821					}
8822					node.sibling.return = node.return;
8823					node = node.sibling;
8824				}
8825			}
8826			return !0;
8827		}
8828		function markRootSuspended(root, suspendedLanes, spawnedLane, didAttemptEntireTree) {
8829			suspendedLanes = getEntangledLanes(root, suspendedLanes);
8830			suspendedLanes &= ~workInProgressRootPingedLanes;
8831			suspendedLanes &= ~workInProgressRootInterleavedUpdatedLanes;
8832			root.suspendedLanes |= suspendedLanes;
8833			root.pingedLanes &= ~suspendedLanes;
8834			didAttemptEntireTree && (root.warmLanes |= suspendedLanes);
8835			didAttemptEntireTree = root.expirationTimes;
8836			for (var lanes = suspendedLanes; 0 < lanes;) {
8837				var index = 31 - clz32(lanes), lane = 1 << index;
8838				didAttemptEntireTree[index] = -1;
8839				lanes &= ~lane;
8840			}
8841			0 !== spawnedLane && markSpawnedDeferredLane(root, spawnedLane, suspendedLanes);
8842		}
8843		function flushSyncWork$1() {
8844			return (executionContext & (RenderContext | CommitContext)) === NoContext ? (flushSyncWorkAcrossRoots_impl(0, !1), !1) : !0;
8845		}
8846		function resetWorkInProgressStack() {
8847			if (null !== workInProgress) {
8848				if (workInProgressSuspendedReason === NotSuspended) var interruptedWork = workInProgress.return;
8849				else interruptedWork = workInProgress, resetContextDependencies(), resetHooksOnUnwind(interruptedWork), thenableState$1 = null, thenableIndexCounter$1 = 0, interruptedWork = workInProgress;
8850				for (; null !== interruptedWork;) unwindInterruptedWork(interruptedWork.alternate, interruptedWork), interruptedWork = interruptedWork.return;
8851				workInProgress = null;
8852			}
8853		}
8854		function finalizeRender(lanes, finalizationTime) {
8855			0 !== (lanes & 127) && (blockingClampTime = finalizationTime);
8856			0 !== (lanes & 4194048) && (transitionClampTime = finalizationTime);
8857			0 !== (lanes & 62914560) && (retryClampTime = finalizationTime);
8858			0 !== (lanes & 2080374784) && (idleClampTime = finalizationTime);
8859		}
8860		function prepareFreshStack(root, lanes) {
8861			supportsUserTiming && (console.timeStamp("Blocking Track", .003, .003, "Blocking", LANES_TRACK_GROUP, "primary-light"), console.timeStamp("Transition Track", .003, .003, "Transition", LANES_TRACK_GROUP, "primary-light"), console.timeStamp("Suspense Track", .003, .003, "Suspense", LANES_TRACK_GROUP, "primary-light"), console.timeStamp("Idle Track", .003, .003, "Idle", LANES_TRACK_GROUP, "primary-light"));
8862			var previousRenderStartTime = renderStartTime;
8863			renderStartTime = now();
8864			if (0 !== workInProgressRootRenderLanes && 0 < previousRenderStartTime) {
8865				setCurrentTrackFromLanes(workInProgressRootRenderLanes);
8866				if (workInProgressRootExitStatus === RootSuspended || workInProgressRootExitStatus === RootSuspendedWithDelay) logSuspendedRenderPhase(previousRenderStartTime, renderStartTime, lanes, workInProgressUpdateTask);
8867				else {
8868					var endTime = renderStartTime, debugTask = workInProgressUpdateTask;
8869					if (supportsUserTiming && !(endTime <= previousRenderStartTime)) {
8870						var color = (lanes & 738197653) === lanes ? "tertiary-dark" : "primary-dark", label = (lanes & 536870912) === lanes ? "Prewarm" : (lanes & 201326741) === lanes ? "Interrupted Hydration" : "Interrupted Render";
8871						debugTask ? debugTask.run(console.timeStamp.bind(console, label, previousRenderStartTime, endTime, currentTrack, LANES_TRACK_GROUP, color)) : console.timeStamp(label, previousRenderStartTime, endTime, currentTrack, LANES_TRACK_GROUP, color);
8872					}
8873				}
8874				finalizeRender(workInProgressRootRenderLanes, renderStartTime);
8875			}
8876			previousRenderStartTime = workInProgressUpdateTask;
8877			workInProgressUpdateTask = null;
8878			if (0 !== (lanes & 127)) {
8879				workInProgressUpdateTask = blockingUpdateTask;
8880				debugTask = 0 <= blockingUpdateTime && blockingUpdateTime < blockingClampTime ? blockingClampTime : blockingUpdateTime;
8881				endTime = 0 <= blockingEventTime && blockingEventTime < blockingClampTime ? blockingClampTime : blockingEventTime;
8882				color = 0 <= endTime ? endTime : 0 <= debugTask ? debugTask : renderStartTime;
8883				0 <= blockingSuspendedTime ? (setCurrentTrackFromLanes(2), logSuspendedWithDelayPhase(blockingSuspendedTime, color, lanes, previousRenderStartTime)) : 0 !== (animatingLanes & 127) && (setCurrentTrackFromLanes(2), logAnimatingPhase(blockingClampTime, color, animatingTask));
8884				previousRenderStartTime = debugTask;
8885				var eventTime = endTime, eventType = blockingEventType, eventIsRepeat = 0 < blockingEventRepeatTime, isSpawnedUpdate = blockingUpdateType === SPAWNED_UPDATE, isPingedUpdate = blockingUpdateType === PINGED_UPDATE;
8886				debugTask = renderStartTime;
8887				endTime = blockingUpdateTask;
8888				color = blockingUpdateMethodName;
8889				label = blockingUpdateComponentName;
8890				if (supportsUserTiming) {
8891					currentTrack = "Blocking";
8892					0 < previousRenderStartTime ? previousRenderStartTime > debugTask && (previousRenderStartTime = debugTask) : previousRenderStartTime = debugTask;
8893					0 < eventTime ? eventTime > previousRenderStartTime && (eventTime = previousRenderStartTime) : eventTime = previousRenderStartTime;
8894					if (null !== eventType && previousRenderStartTime > eventTime) {
8895						var color$jscomp$0 = eventIsRepeat ? "secondary-light" : "warning";
8896						endTime ? endTime.run(console.timeStamp.bind(console, eventIsRepeat ? "Consecutive" : "Event: " + eventType, eventTime, previousRenderStartTime, currentTrack, LANES_TRACK_GROUP, color$jscomp$0)) : console.timeStamp(eventIsRepeat ? "Consecutive" : "Event: " + eventType, eventTime, previousRenderStartTime, currentTrack, LANES_TRACK_GROUP, color$jscomp$0);
8897					}
8898					debugTask > previousRenderStartTime && (eventTime = isSpawnedUpdate ? "error" : (lanes & 738197653) === lanes ? "tertiary-light" : "primary-light", isSpawnedUpdate = isPingedUpdate ? "Promise Resolved" : isSpawnedUpdate ? "Cascading Update" : 5 < debugTask - previousRenderStartTime ? "Upd
vendor: 3,404 bytes, lines 8898-8917
8898ate Blocked" : "Update", isPingedUpdate = [], null != label && isPingedUpdate.push(["Component name", label]), null != color && isPingedUpdate.push(["Method name", color]), previousRenderStartTime = {
8899						start: previousRenderStartTime,
8900						end: debugTask,
8901						detail: { devtools: {
8902							properties: isPingedUpdate,
8903							track: currentTrack,
8904							trackGroup: LANES_TRACK_GROUP,
8905							color: eventTime
8906						} }
8907					}, endTime ? endTime.run(performance.measure.bind(performance, isSpawnedUpdate, previousRenderStartTime)) : performance.measure(isSpawnedUpdate, previousRenderStartTime), performance.clearMeasures(isSpawnedUpdate));
8908				}
8909				blockingUpdateTime = -1.1;
8910				blockingUpdateType = 0;
8911				blockingUpdateComponentName = blockingUpdateMethodName = null;
8912				blockingSuspendedTime = -1.1;
8913				blockingEventRepeatTime = blockingEventTime;
8914				blockingEventTime = -1.1;
8915				blockingClampTime = now();
8916			}
8917			0 !== (lanes & 4194048) && (workInProgressUpdateTask = transitionUpdateTask, debugTask = 0 <= transitionStartTime && transitionStartTime < transitionClampTime ? transitionClampTime : transitionStartTime, previousRenderStartTime = 0 <= transitionUpdateTime && transitionUpdateTime < transitionClampTime ? transitionClampTime : transitionUpdateTime, endTime = 0 <= transitionEventTime && transitionEventTime < transitionClampTime ? transitionClampTime : transitionEventTime, color = 0 <= endTime ? endTime : 0 <= previousRenderStartTime ? previousRenderStartTime : renderStartTime, 0 <= transitionSuspendedTime ? (setCurrentTrackFromLanes(256), logSuspendedWithDelayPhase(transitionSuspendedTime, color, lanes, workInProgressUpdateTask)) : 0 !== (animatingLanes & 4194048) && (setCurrentTrackFromLanes(256), logAnimatingPhase(transitionClampTime, color, animatingTask)), isPingedUpdate = endTime, eventTime = transitionEventType, eventType = 0 < transitionEventRepeatTime, eventIsRepeat = transitionUpdateType === PINGED_UPDATE, color = renderStartTime, endTime = transitionUpdateTask, label = transitionUpdateMethodName, isSpawnedUpdate = transitionUpdateComponentName, supportsUserTiming && (currentTrack = "Transition", 0 < previousRenderStartTime ? previousRenderStartTime > color && (previousRenderStartTime = color) : previousRenderStartTime = color, 0 < debugTask ? debugTask > previousRenderStartTime && (debugTask = previousRenderStartTime) : debugTask = previousRenderStartTime, 0 < isPingedUpdate ? isPingedUpdate > debugTask && (isPingedUpdate = debugTask) : isPingedUpdate = debugTask, debugTask > isPingedUpdate && null !== eventTime && (color$jscomp$0 = eventType ? "secondary-light" : "warning", endTime ? endTime.run(console.timeStamp.bind(console, eventType ? "Consecutive" : "Event: " + eventTime, isPingedUpdate, debugTask, currentTrack, LANES_TRACK_GROUP, color$jscomp$0)) : console.timeStamp(eventType ? "Consecutive" : "Event: " + eventTime, isPingedUpdate, debugTask, currentTrack, LANES_TRACK_GROUP, color$jscomp$0)), previousRenderStartTime > debugTask && (endTime ? endTime.run(console.timeStamp.bind(console, "Action", debugTask, previousRenderStartTime, currentTrack, LANES_TRACK_GROUP, "primary-dark")) : console.timeStamp("Action", debugTask, previousRenderStartTime, currentTrack, LANES_TRACK_GROUP, "primary-dark")), color > previousRenderStartTime && (debugTask = eventIsRepeat ? "Promise Resolved" : 5 < color - previousRenderStartTime ? "Upd
8917ate Blocked" : "Update", isPingedUpdate = [], null != isSpawnedUpdate && isPingedUpdate.push(["Component name", isSpawnedUpdate]), null != label && isPingedUpdate.push(["Method name", label]), previousRenderStartTime = {
8918				start: previousRenderStartTime,
8919				end: color,
8920				detail: { devtools: {
8921					properties: isPingedUpdate,
8922					track: currentTrack,
8923					trackGroup: LANES_TRACK_GROUP,
8924					color: "primary-light"
8925				} }
8926			}, endTime ? endTime.run(performance.measure.bind(performance, debugTask, previousRenderStartTime)) : performance.measure(debugTask, previousRenderStartTime), performance.clearMeasures(debugTask))), transitionUpdateTime = transitionStartTime = -1.1, transitionUpdateType = 0, transitionSuspendedTime = -1.1, transitionEventRepeatTime = transitionEventTime, transitionEventTime = -1.1, transitionClampTime = now());
8927			0 !== (lanes & 62914560) && 0 !== (animatingLanes & 62914560) && (setCurrentTrackFromLanes(4194304), logAnimatingPhase(retryClampTime, renderStartTime, animatingTask));
8928			0 !== (lanes & 2080374784) && 0 !== (animatingLanes & 2080374784) && (setCurrentTrackFromLanes(268435456), logAnimatingPhase(idleClampTime, renderStartTime, animatingTask));
8929			previousRenderStartTime = root.timeoutHandle;
8930			previousRenderStartTime !== noTimeout && (root.timeoutHandle = noTimeout, cancelTimeout(previousRenderStartTime));
8931			previousRenderStartTime = root.cancelPendingCommit;
8932			null !== previousRenderStartTime && (root.cancelPendingCommit = null, previousRenderStartTime());
8933			pendingEffectsLanes = 0;
8934			resetWorkInProgressStack();
8935			workInProgressRoot = root;
8936			workInProgress = previousRenderStartTime = createWorkInProgress(root.current, null);
8937			workInProgressRootRenderLanes = lanes;
8938			workInProgressSuspendedReason = NotSuspended;
8939			workInProgressThrownValue = null;
8940			workInProgressRootDidSkipSuspendedSiblings = !1;
8941			workInProgressRootIsPrerendering = checkIfRootIsPrerendering(root, lanes);
8942			workInProgressRootDidAttachPingListener = !1;
8943			workInProgressRootExitStatus = RootInProgress;
8944			workInProgressSuspendedRetryLanes = workInProgressDeferredLane = workInProgressRootPingedLanes = w
8944orkInProgressRootInterleavedUpdatedLanes = workInProgressRootSkippedLanes = 0;
8945			workInProgressRootRecoverableErrors = workInProgressRootConcurrentErrors = null;
8946			workInProgressRootDidIncludeRecursiveRenderUpdate = !1;
8947			entangledRenderLanes = getEntangledLanes(root, lanes);
8948			finishQueueingConcurrentUpdates();
8949			root = getCurrentTime();
8950			1e3 < root - lastResetTime && (ReactSharedInternals.recentlyCreatedOwnerStacks = 0, lastResetTime = root);
8951			ReactStrictModeWarnings.discardPendingWarnings();
8952			return previousRenderStartTime;
8953		}
8954		function handleThrow(root, thrownValue) {
8955			currentlyRenderingFiber = null;
8956			ReactSharedInternals.H = ContextOnlyDispatcher;
8957			ReactSharedInternals.getCurrentStack = null;
8958			isRendering = !1;
8959			current = null;
8960			thrownValue === SuspenseException || thrownValue === SuspenseActionException ? (thrownValue = getSuspendedThenable(), workInProgressSuspendedReason = SuspendedOnImmediate) : thrownValue === SuspenseyCommitException ? (thrownValue = getSuspendedThenable(), workInProgressSuspendedReason = SuspendedOnInstance) : workInProgressSuspendedReason = thrownValue === SelectiveHydrationException ? SuspendedOnHydration : null !== thrownValue && "object" === typeof thrownValue && "function" === typeof thrownValue.then ? SuspendedOnDeprecatedThrowPromise : SuspendedOnError;
8961			workInProgressThrownValue = thrownValue;
8962			var erroredWork = workInProgress;
8963			null === erroredWork ? (workInProgressRootExitStatus = RootFatalErrored, logUncaughtError(root, createCapturedValueAtFiber(thrownValue, root.current))) : erroredWork.mode & ProfileMode && stopProfilerTimerIfRunningAndRecordDuration(erroredWork);
8964		}
8965		function shouldRemainOnPreviousScreen() {
8966			var handler = suspenseHandlerStackCursor.current;
8967			return null === handler ? !0 : (workInProgressRootRenderLanes & 4194048) === workInProgressRootRenderLanes ? null === shellBoundary ? !0 : !1 : (workInProgressRootRenderLanes & 62914560) === workInProgressRootRenderLanes || 0 !== (workInProgressRootRenderLanes & 536870912) ? handler === shellBoundary : !1;
8968		}
8969		function pushDispatcher() {
8970			var prevDispatcher = ReactSharedInternals.H;
8971			ReactSharedInternals.H = ContextOnlyDispatcher;
8972			return null === prevDispatcher ? ContextOnlyDispatcher : prevDispatcher;
8973		}
8974		function pushAsyncDispatcher() {
8975			var prevAsyncDispatcher = ReactSharedInternals.A;
8976			ReactSharedInternals.A = DefaultAsyncDispatcher;
8977			return prevAsyncDispatcher;
8978		}
8979		function markRenderDerivedCause(fiber) {
8980			null === workInProgressUpdateTask && (workInProgressUpdateTask = null == fiber._debugTask ? null : fiber._debugTask);
8981		}
8982		function renderDidSuspendDelayIfPossible() {
8983			workInProgressRootExitStatus = RootSuspendedWithDelay;
8984			workInProgressRootDidSkipSuspendedSiblings || (workInProgressRootRenderLanes & 4194048) !== workInProgressRootRenderLanes && null !== suspenseHandlerStackCursor.current || (workInProgressRootIsPrerendering = !0);
8985			0 === (workInProgressRootSkippedLanes & 134217727) && 0 === (workInProgressRootInterleavedUpdatedLanes & 134217727) || null === workInProgressRoot || markRootSuspended(workInProgressRoot, workInProgressRootRenderLanes, workInProgressDeferredLane, !1);
8986		}
8987		function renderRootSync(root, lanes, shouldYieldForPrerendering) {
8988			var prevExecutionContext = executionContext;
8989			executionContext |= RenderContext;
8990			var prevDispatcher = pushDispatcher(), prevAsyncDispatcher = pushAsyncDispatcher();
8991			if (workInProgressRoot !== root || workInProgressRootRenderLanes !== lanes) {
8992				if (isDevToolsPresent) {
8993					var memoizedUpdaters = root.memoizedUpdaters;
8994					0 < memoizedUpdaters.size && (restorePendingUpdaters(root, workInProgressRootRenderLanes), memoizedUpdaters.clear());
8995					movePendingFibersToMemoized(root, lanes);
8996				}
8997				workInProgressTransitions = null;
8998				prepareFreshStack(root, lanes);
8999			}
9000			lanes = !1;
9001			memoizedUpdaters = workInProgressRootExitStatus;
9002			a: do
9003				try {
9004					if (workInProgressSuspendedReason !== NotSuspended && null !== workInProgress) {
9005						var unitOfWork = workInProgress, thrownValue = workInProgressThrownValue;
9006						switch (workInProgressSuspendedReason) {
9007							case SuspendedOnHydration:
9008								resetWorkInProgressStack();
9009								memoizedUpdaters = RootSuspendedAtTheShell;
9010								break a;
9011							case SuspendedOnImmediate:
9012							case SuspendedOnData:
9013							case SuspendedOnAction:
9014							case SuspendedOnDeprecatedThrowPromise:
9015								null === suspenseHandlerStackCursor.current && (lanes = !0);
9016								var reason = workInProgressSuspendedReason;
9017								workInProgressSuspendedReason = NotSuspended;
9018								workInProgressThrownValue = null;
9019								throwAndUnwindWorkLoop(root, unitOfWork, thrownValue, reason);
9020								if (shouldYieldForPrerendering && workInProgressRootIsPrerendering) {
9021									memoizedUpdaters = RootInProgress;
9022									break a;
9023								}
9024								break;
9025							default: reason = workInProgressSuspendedReason, workInProgressSuspendedReason = NotSuspended, workInProgressThrownValue = null, throwAndUnwindWorkLoop(root, unitOfWork, thrownValue, reason);
9026						}
9027					}
9028					workLoopSync();
9029					memoizedUpdaters = workInProgressRootExitStatus;
9030					break;
9031				} catch (thrownValue$9) {
9032					handleThrow(root, thrownValue$9);
9033				}
9034			while (1);
9035			lanes && root.shellSuspendCounter++;
9036			resetContextDependencies();
9037			executionContext = prevExecutionContext;
9038			ReactSharedInternals.H = prevDispatcher;
9039			ReactSharedInternals.A = prevAsyncDispatcher;
9040			null === workInProgress && (workInProgressRoot = null, workInProgressRootRenderLanes = 0, finishQueueingConcurrentUpdates());
9041			return memoizedUpdaters;
9042		}
9043		function workLoopSync() {
9044			for (; null !== workInProgress;) performUnitOfWork(workInProgress);
9045		}
9046		function renderRootConcurrent(root, lanes) {
9047			var prevExecutionContext = executionContext;
9048			executionContext |= RenderContext;
vendor: 6,267 bytes, lines 9049-9171
9049			var prevDispatcher = pushDispatcher(), prevAsyncDispatcher = pushAsyncDispatcher();
9050			if (workInProgressRoot !== root || workInProgressRootRenderLanes !== lanes) {
9051				if (isDevToolsPresent) {
9052					var memoizedUpdaters = root.memoizedUpdaters;
9053					0 < memoizedUpdaters.size && (restorePendingUpdaters(root, workInProgressRootRenderLanes), memoizedUpdaters.clear());
9054					movePendingFibersToMemoized(root, lanes);
9055				}
9056				workInProgressTransitions = null;
9057				workInProgressRootRenderTargetTime = now$1() + RENDER_TIMEOUT_MS;
9058				prepareFreshStack(root, lanes);
9059			} else workInProgressRootIsPrerendering = checkIfRootIsPrerendering(root, lanes);
9060			a: do
9061				try {
9062					if (workInProgressSuspendedReason !== NotSuspended && null !== workInProgress) b: switch (lanes = workInProgress, memoizedUpdaters = workInProgressThrownValue, workInProgressSuspendedReason) {
9063						case SuspendedOnError:
9064							workInProgressSuspendedReason = NotSuspended;
9065							workInProgressThrownValue = null;
9066							throwAndUnwindWorkLoop(root, lanes, memoizedUpdaters, SuspendedOnError);
9067							break;
9068						case SuspendedOnData:
9069						case SuspendedOnAction:
9070							if (isThenableResolved(memoizedUpdaters)) {
9071								workInProgressSuspendedReason = NotSuspended;
9072								workInProgressThrownValue = null;
9073								replaySuspendedUnitOfWork(lanes);
9074								break;
9075							}
9076							lanes = function() {
9077								workInProgressSuspendedReason !== SuspendedOnData && workInProgressSuspendedReason !== SuspendedOnAction || workInProgressRoot !== root || (workInProgressSuspendedReason = SuspendedAndReadyToContinue);
9078								ensureRootIsScheduled(root);
9079							};
9080							memoizedUpdaters.then(lanes, lanes);
9081							break a;
9082						case SuspendedOnImmediate:
9083							workInProgressSuspendedReason = SuspendedAndReadyToContinue;
9084							break a;
9085						case SuspendedOnInstance:
9086							workInProgressSuspendedReason = SuspendedOnInstanceAndReadyToContinue;
9087							break a;
9088						case SuspendedAndReadyToContinue:
9089							isThenableResolved(memoizedUpdaters) ? (workInProgressSuspendedReason = NotSuspended, workInProgressThrownValue = null, replaySuspendedUnitOfWork(lanes)) : (workInProgressSuspendedReason = NotSuspended, workInProgressThrownValue = null, throwAndUnwindWorkLoop(root, lanes, memoizedUpdaters, SuspendedAndReadyToContinue));
9090							break;
9091						case SuspendedOnInstanceAndReadyToContinue:
9092							var resource = null;
9093							switch (workInProgress.tag) {
9094								case 26: resource = workInProgress.memoizedState;
9095								case 5:
9096								case 27:
9097									var hostFiber = workInProgress;
9098									if (resource ? preloadResource(resource) : hostFiber.stateNode.complete) {
9099										workInProgressSuspendedReason = NotSuspended;
9100										workInProgressThrownValue = null;
9101										var sibling = hostFiber.sibling;
9102										if (null !== sibling) workInProgress = sibling;
9103										else {
9104											var returnFiber = hostFiber.return;
9105											null !== returnFiber ? (workInProgress = returnFiber, completeUnitOfWork(returnFiber)) : workInProgress = null;
9106										}
9107										break b;
9108									}
9109									break;
9110								default: console.error("Unexpected type of fiber triggered a suspensey commit. This is a bug in React.");
9111							}
9112							workInProgressSuspendedReason = NotSuspended;
9113							workInProgressThrownValue = null;
9114							throwAndUnwindWorkLoop(root, lanes, memoizedUpdaters, SuspendedOnInstanceAndReadyToContinue);
9115							break;
9116						case SuspendedOnDeprecatedThrowPromise:
9117							workInProgressSuspendedReason = NotSuspended;
9118							workInProgressThrownValue = null;
9119							throwAndUnwindWorkLoop(root, lanes, memoizedUpdaters, SuspendedOnDeprecatedThrowPromise);
9120							break;
9121						case SuspendedOnHydration:
9122							resetWorkInProgressStack();
9123							workInProgressRootExitStatus = RootSuspendedAtTheShell;
9124							break a;
9125						default: throw Error("Unexpected SuspendedReason. This is a bug in React.");
9126					}
9127					null !== ReactSharedInternals.actQueue ? workLoopSync() : workLoopConcurrentByScheduler();
9128					break;
9129				} catch (thrownValue$10) {
9130					handleThrow(root, thrownValue$10);
9131				}
9132			while (1);
9133			resetContextDependencies();
9134			ReactSharedInternals.H = prevDispatcher;
9135			ReactSharedInternals.A = prevAsyncDispatcher;
9136			executionContext = prevExecutionContext;
9137			if (null !== workInProgress) return RootInProgress;
9138			workInProgressRoot = null;
9139			workInProgressRootRenderLanes = 0;
9140			finishQueueingConcurrentUpdates();
9141			return workInProgressRootExitStatus;
9142		}
9143		function workLoopConcurrentByScheduler() {
9144			for (; null !== workInProgress && !shouldYield();) performUnitOfWork(workInProgress);
9145		}
9146		function performUnitOfWork(unitOfWork) {
9147			var current = unitOfWork.alternate;
9148			(unitOfWork.mode & ProfileMode) !== NoMode ? (startProfilerTimer(unitOfWork), current = runWithFiberInDEV(unitOfWork, beginWork, current, unitOfWork, entangledRenderLanes), stopProfilerTimerIfRunningAndRecordDuration(unitOfWork)) : current = runWithFiberInDEV(unitOfWork, beginWork, current, unitOfWork, entangledRenderLanes);
9149			unitOfWork.memoizedProps = unitOfWork.pendingProps;
9150			null === current ? completeUnitOfWork(unitOfWork) : workInProgress = current;
9151		}
9152		function replaySuspendedUnitOfWork(unitOfWork) {
9153			var next = runWithFiberInDEV(unitOfWork, replayBeginWork, unitOfWork);
9154			unitOfWork.memoizedProps = unitOfWork.pendingProps;
9155			null === next ? completeUnitOfWork(unitOfWork) : workInProgress = next;
9156		}
9157		function replayBeginWork(unitOfWork) {
9158			var current = unitOfWork.alternate, isProfilingMode = (unitOfWork.mode & ProfileMode) !== NoMode;
9159			isProfilingMode && startProfilerTimer(unitOfWork);
9160			switch (unitOfWork.tag) {
9161				case 15:
9162				case 0:
9163					current = replayFunctionComponent(current, unitOfWork, unitOfWork.pendingProps, unitOfWork.type, void 0, workInProgressRootRenderLanes);
9164					break;
9165				case 11:
9166					current = replayFunctionComponent(current, unitOfWork, unitOfWork.pendingProps, unitOfWork.type.render, unitOfWork.ref, workInProgressRootRenderLanes);
9167					break;
9168				case 5:
9169					resetHooksOnUnwind(unitOfWork);
9170					var fiber = unitOfWork;
9171					fiber === hydrationParentFiber && (isHydrating ? (popToNextHostParent(fiber), 5 === fiber.tag && null != fiber.stateNode && (nextHydratableInstance = f
9171iber.stateNode)) : (popToNextHostParent(fiber), isHydrating = !0));
9172				default: unwindInterruptedWork(current, unitOfWork), unitOfWork = workInProgress = resetWorkInProgress(unitOfWork, entangledRenderLanes), current = beginWork(current, unitOfWork, entangledRenderLanes);
9173			}
9174			isProfilingMode && stopProfilerTimerIfRunningAndRecordDuration(unitOfWork);
9175			return current;
9176		}
9177		function throwAndUnwindWorkLoop(root, unitOfWork, thrownValue, suspendedReason) {
9178			resetContextDependencies();
9179			resetHooksOnUnwind(unitOfWork);
9180			thenableState$1 = null;
9181			thenableIndexCounter$1 = 0;
9182			var returnFiber = unitOfWork.return;
9183			try {
9184				if (throwException(root, returnFiber, unitOfWork, thrownValue, workInProgressRootRenderLanes)) {
9185					workInProgressRootExitStatus = RootFatalErrored;
9186					logUncaughtError(root, createCapturedValueAtFiber(thrownValue, root.current));
9187					workInProgress = null;
9188					return;
9189				}
9190			} catch (error) {
9191				if (null !== returnFiber) throw workInProgress = returnFiber, error;
9192				workInProgressRootExitStatus = RootFatalErrored;
9193				logUncaughtError(root, createCapturedValueAtFiber(thrownValue, root.current));
9194				workInProgress = null;
9195				return;
9196			}
9197			if (unitOfWork.flags & 32768) {
9198				if (isHydrating || suspendedReason === SuspendedOnError) root = !0;
9199				else if (workInProgressRootIsPrerendering || 0 !== (workInProgressRootRenderLanes & 536870912)) root = !1;
9200				else if (workInProgressRootDidSkipSuspendedSiblings = root = !0, suspendedReason === SuspendedOnData || suspendedReason === SuspendedOnAction || suspendedReason === SuspendedOnImmediate || suspendedReason === SuspendedOnDeprecatedThrowPromise) suspendedReason = suspenseHandlerStackCursor.current, null !== suspendedReason && 13 === suspendedReason.tag && (suspendedReason.flags |= 16384);
9201				unwindUnitOfWork(unitOfWork, root);
9202			} else completeUnitOfWork(unitOfWork);
9203		}
9204		function completeUnitOfWork(unitOfWork) {
9205			var completedWork = unitOfWork;
9206			do {
9207				if (0 !== (completedWork.flags & 32768)) {
9208					unwindUnitOfWork(completedWork, workInProgressRootDidSkipSuspendedSiblings);
9209					return;
9210				}
9211				var current = completedWork.alternate;
9212				unitOfWork = completedWork.return;
9213				startProfilerTimer(completedWork);
9214				current = runWithFiberInDEV(completedWork, completeWork, current, completedWork, entangledRenderLanes);
9215				(completedWork.mode & ProfileMode) !== NoMode && stopProfilerTimerIfRunningAndRecordIncompleteDuration(completedWork);
9216				if (null !== current) {
9217					workInProgress = current;
9218					return;
9219				}
9220				completedWork = completedWork.sibling;
9221				if (null !== completedWork) {
9222					workInProgress = completedWork;
9223					return;
9224				}
9225				workInProgress = completedWork = unitOfWork;
9226			} while (null !== completedWork);
9227			workInProgressRootExitStatus === RootInProgress && (workInProgressRootExitStatus = RootCompleted);
9228		}
9229		function unwindUnitOfWork(unitOfWork, skipSiblings) {
9230			do {
9231				var next = unwindWork(unitOfWork.alternate, unitOfWork);
9232				if (null !== next) {
9233					next.flags &= 32767;
9234					workInProgress = next;
9235					return;
9236				}
9237				if ((unitOfWork.mode & ProfileMode) !== NoMode) {
9238					stopProfilerTimerIfRunningAndRecordIncompleteDuration(unitOfWork);
9239					next = unitOfWork.actualDuration;
9240					for (var child = unitOfWork.child; null !== child;) next += child.actualDuration, child = child.sibling;
9241					unitOfWork.actualDuration = next;
9242				}
9243				next = unitOfWork.return;
9244				null !== next && (next.flags |= 32768, next.subtreeFlags = 0, next.deletions = null);
9245				if (!skipSiblings && (unitOfWork = unitOfWork.sibling, null !== unitOfWork)) {
9246					workInProgress = unitOfWork;
9247					return;
9248				}
9249				workInProgress = unitOfWork = next;
9250			} while (null !== unitOfWork);
9251			workInProgressRootExitStatus = RootSuspendedAtTheShell;
9252			workInProgress = null;
9253		}
9254		function completeRoot(root, finishedWork, lanes, recoverableErrors, transitions, didIncludeRenderPhaseUpdate, spawnedLane, updatedLanes, suspendedRetryLanes, didSkipSuspendedSiblings, exitStatus, suspendedState, suspendedCommitReason, completedRenderStartTime, completedRenderEndTime) {
9255			root.cancelPendingCommit = null;
9256			do
9257				flushPendingEffects();
9258			while (pendingEffectsStatus !== NO_PENDING_EFFECTS);
9259			ReactStrictModeWarnings.flushLegacyContextWarning();
9260			ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings();
9261			if ((executionContext & (RenderContext | CommitContext)) !== NoContext) throw Error("Should not already be working.");
9262			setCurrentTrackFromLanes(lanes);
9263			if (exitStatus === RootErrored) logErroredRenderPhase(completedRenderStartTime, completedRenderEndTime, lanes, workInProgressUpdateTask);
9264			else if (null !== recoverableErrors) {
vendor: 4,112 bytes, lines 9265-9315
9265				if (didSkipSuspendedSiblings = null !== finishedWork && null !== finishedWork.alternate && finishedWork.alternate.memoizedState.isDehydrated && 0 !== (finishedWork.flags & 256), didIncludeRenderPhaseUpdate = workInProgressUpdateTask, supportsUserTiming && !(completedRenderEndTime <= completedRenderStartTime)) {
9266					exitStatus = [];
9267					for (var i = 0; i < recoverableErrors.length; i++) {
9268						var error = recoverableErrors[i].value;
9269						exitStatus.push(["Recoverable Error", "object" === typeof error && null !== error && "string" === typeof error.message ? String(error.message) : String(error)]);
9270					}
9271					completedRenderStartTime = {
9272						start: completedRenderStartTime,
9273						end: completedRenderEndTime,
9274						detail: { devtools: {
9275							color: "primary-dark",
9276							track: currentTrack,
9277							trackGroup: LANES_TRACK_GROUP,
9278							tooltipText: didSkipSuspendedSiblings ? "Hydration Failed" : "Recovered after Error",
9279							properties: exitStatus
9280						} }
9281					};
9282					didIncludeRenderPhaseUpdate ? didIncludeRenderPhaseUpdate.run(performance.measure.bind(performance, "Recovered", completedRenderStartTime)) : performance.measure("Recovered", completedRenderStartTime);
9283					performance.clearMeasures("Recovered");
9284				}
9285			} else didIncludeRenderPhaseUpdate = workInProgressUpdateTask, !supportsUserTiming || completedRenderEndTime <= completedRenderStartTime || (didSkipSuspendedSiblings = (lanes & 738197653) === lanes ? "tertiary-dark" : "primary-dark", exitStatus = (lanes & 536870912) === lanes ? "Prepared" : (lanes & 201326741) === lanes ? "Hydrated" : "Render", didIncludeRenderPhaseUpdate ? didIncludeRenderPhaseUpdate.run(console.timeStamp.bind(console, exitStatus, completedRenderStartTime, completedRenderEndTime, currentTrack, LANES_TRACK_GROUP, didSkipSuspendedSiblings)) : console.timeStamp(exitStatus, completedRenderStartTime, completedRenderEndTime, currentTrack, LANES_TRACK_GROUP, didSkipSuspendedSiblings));
9286			if (null !== finishedWork) {
9287				0 === lanes && console.error("finishedLanes should not be empty during a commit. This is a bug in React.");
9288				if (finishedWork === root.current) throw Error("Cannot commit the same tree as before. This error is likely caused by a bug in React. Please file an issue.");
9289				root === workInProgressRoot && (workInProgress = workInProgressRoot = null, workInProgressRootRenderLanes = 0);
9290				pendingFinishedWork = finishedWork;
9291				pendingEffectsRoot = root;
9292				pendingEffectsLanes = lanes;
9293				pendingPassiveTransitions = transitions;
9294				pendingRecoverableErrors = recoverableErrors;
9295				pendingEffectsRenderEndTime = completedRenderEndTime;
9296				pendingSuspendedCommitReason = suspendedCommitReason;
9297				pendingDelayedCommitReason = IMMEDIATE_COMMIT;
9298				pendingSuspendedViewTransitionReason = null;
9299				commitRoot(root, finishedWork, lanes, spawnedLane, updatedLanes, suspendedRetryLanes, suspendedState, suspendedCommitReason, completedRenderEndTime);
9300			}
9301		}
9302		function commitRoot(root, finishedWork, lanes, spawnedLane, updatedLanes, suspendedRetryLanes, suspendedState, suspendedCommitReason, completedRenderEndTime) {
9303			var remainingLanes = finishedWork.lanes | finishedWork.childLanes;
9304			pendingEffectsRemainingLanes = remainingLanes;
9305			remainingLanes |= concurrentlyUpdatedLanes;
9306			markRootFinished(root, lanes, remainingLanes, spawnedLane, updatedLanes, suspendedRetryLanes);
9307			pendingViewTransitionEvents = null;
9308			(lanes & 335544064) === lanes ? (pendingTransitionTypes = claimQueuedTransitionTypes(root), spawnedLane = 10262) : (pendingTransitionTypes = null, spawnedLane = 10256);
9309			0 !== finishedWork.actualDuration || 0 !== (finishedWork.subtreeFlags & spawnedLane) || 0 !== (finishedWork.flags & spawnedLane) ? (root.callbackNode = null, root.callbackPriority = 0, scheduleCallback$1(NormalPriority$1, function() {
9310				schedulerEvent = window.event;
9311				pendingDelayedCommitReason === IMMEDIATE_COMMIT && (pendingDelayedCommitReason = DELAYED_PASSIVE_COMMIT);
9312				flushPassiveEffects();
9313				return null;
9314			})) : (root.callbackNode = null, root.callbackPriority = 0);
9315			commitErrors = null;
9316			commitStartTime = now();
9317			null !== suspendedCommitReason && logSuspendedCommitPhase(completedRenderEndTime, commitStartTime, suspendedCommitReason, workInProgressUpdateTask);
9318			shouldStartViewTransition = !1;
9319			suspendedCommitReason = 0 !== (finishedWork.flags & 13878);
9320			if (0 !== (finishedWork.subtreeFlags & 13878) || suspendedCommitReason) {
9321				suspendedCommitReason = ReactSharedInternals.T;
9322				ReactSharedInternals.T = null;
9323				completedRenderEndTime = ReactDOMSharedInternals.p;
9324				ReactDOMSharedInternals.p = DiscreteEventPriority;
9325				spawnedLane = executionContext;
9326				executionContext |= CommitContext;
9327				try {
9328					commitBeforeMutationEffects(root, finishedWork, lanes);
9329				} finally {
9330					executionContext = spawnedLane, ReactDOMSharedInternals.p = completedRenderEndTime, ReactSharedInternals.T = suspendedCommitReason;
9331				}
9332			}
9333			pendingEffectsStatus = PENDING_MUTATION_PHASE;
9334			shouldStartViewTransition ? (animatingLanes |= lanes, animatingTask = null, pendingViewTransition = startViewTransition(suspendedState, root.containerInfo, pendingTransitionTypes, flushMutationEffects, flushLayoutEffects, flushAfterMutationEffects, flushSpawnedWork, flushPassiveEffects, reportViewTransitionError, suspendedViewTransition, finishedViewTransition.bind(null, lanes))) : (flushMutationEffects(), flushLayoutEffects(), flushSpawnedWork());
9335		}
9336		function reportViewTransitionError(error) {
9337			if (pendingEffectsStatus !== NO_PENDING_EFFECTS) {
9338				var onRecoverableError = pendingEffectsRoot.onRecoverableError;
9339				onRecoverableError(error, makeErrorInfo(null));
9340			}
9341		}
9342		function suspendedViewTransition(reason) {
9343			commitEndTime = now();
9344			logCommitPhase(null === pendingSuspendedCommitReason ? pendingEffectsRenderEndTime : commitStartTime, commitEndTime, commitErrors, pendingDelayedCommitReason === ABORTED_VIEW_TRANSITION_COMMIT, workInProgressUpdateTask);
9345			pendingSuspendedCommitReason = pendingSuspendedViewTransitionReason = reason;
9346		}
9347		function finishedViewTransition(lanes) {
9348			if (0 !== (animatingLanes & lanes)) {
9349				var task = animatingTask;
9350				animatingLanes &= ~lanes;
9351				animatingTask = null;
9352				0 !== (lanes & 4194048) && 0 === (workInProgressRootRenderLanes & 4194048) && 0 === (pendingEffectsLanes & 4194048) && (setCurrentTrackFromLanes(256), logAnimatingPhase(transitionClampTime, now$1(), task));
9353				0 !== (lanes & 62914560) && 0 === (workInProgressRootRenderLanes & 62914560) && 0 === (pendingEffectsLanes & 62914560) && (setCurrentTrackFromLanes(4194304), logAnimatingPhase(retryClampTime, now$1(), task));
9354				0 !== (lanes & 2080374784) && 0 === (workInProgressRootRenderLanes & 2080374784) && 0 === (pendingEffectsLanes & 2080374784) && (setCurrentTrackFromLanes(268435456), logAnimatingPhase(idleClampTime, now$1(), task));
9355			}
9356		}
9357		function flushAfterMutationEffects() {
9358			pendingEffectsStatus === PENDING_AFTER_MUTATION_PHASE && (pendingEffectsStatus = NO_PENDING_EFFECTS, commitAfterMutationEffectsOnFiber(pendingFinishedWork, pendingEffectsRoot), pendingEffectsStatus = PENDING_SPAWNED_WORK);
9359		}
9360		function flushMutationEffects() {
9361			if (pendingEffectsStatus === PENDING_MUTATION_PHASE) {
9362				pendingEffectsStatus = NO_PENDING_EFFECTS;
9363				var root = pendingEffectsRoot, finishedWork = pendingFinishedWork, lanes = pendingEffectsLanes, rootMutationHasEffect = 0 !== (finishedWork.flags & 13878);
9364				if (0 !== (finishedWork.subtreeFlags & 13878) || rootMutationHasEffect) {
9365					rootMutationHasEffect = ReactSharedInternals.T;
9366					ReactSharedInternals.T = null;
9367					var previousPriority = ReactDOMSharedInternals.p;
9368					ReactDOMSharedInternals.p = DiscreteEventPriority;
9369					var prevExecutionContext = executionContext;
9370					executionContext |= CommitContext;
9371					try {
9372						inProgressLanes = lanes;
9373						inProgressRoot = root;
9374						inUpdateViewTransition = rootViewTransitionAffected = !1;
9375						resetComponentEffectTimers();
9376						commitMutationEffectsOnFiber(finishedWork, root, lanes);
9377						inProgressRoot = inProgressLanes = null;
9378						lanes = selectionInformation;
9379						var curFocusedElem = getActiveElementDeep(root.containerInfo), priorFocusedElem = lanes.focusedElem, priorSelectionRange = lanes.selectionRange;
9380						if (curFocusedElem !== priorFocusedElem && priorFocusedElem && priorFocusedElem.ownerDocument && containsNode(priorFocusedElem.ownerDocument.documentElement, priorFocusedElem)) {
9381							if (null !== priorSelectionRange && hasSelectionCapabilities(priorFocusedElem)) {
9382								var start = priorSelectionRange.start, end = priorSelectionRange.end;
9383								void 0 === end && (end = start);
9384								if ("selectionStart" in priorFocusedElem) priorFocusedElem.selectionStart = start, priorFocusedElem.selectionEnd = Math.min(end, priorFocusedElem.value.length);
9385								else {
9386									var doc = priorFocusedElem.ownerDocument || document, win = doc && doc.defaultView || window;
vendor: 5,354 bytes, lines 9387-9463
9387									if (win.getSelection) {
9388										var selection = win.getSelection(), length = priorFocusedElem.textContent.length, start$jscomp$0 = Math.min(priorSelectionRange.start, length), end$jscomp$0 = void 0 === priorSelectionRange.end ? start$jscomp$0 : Math.min(priorSelectionRange.end, length);
9389										!selection.extend && start$jscomp$0 > end$jscomp$0 && (curFocusedElem = end$jscomp$0, end$jscomp$0 = start$jscomp$0, start$jscomp$0 = curFocusedElem);
9390										var startMarker = getNodeForCharacterOffset(priorFocusedElem, start$jscomp$0), endMarker = getNodeForCharacterOffset(priorFocusedElem, end$jscomp$0);
9391										if (startMarker && endMarker && (1 !== selection.rangeCount || selection.anchorNode !== startMarker.node || selection.anchorOffset !== startMarker.offset || selection.focusNode !== endMarker.node || selection.focusOffset !== endMarker.offset)) {
9392											var range = doc.createRange();
9393											range.setStart(startMarker.node, startMarker.offset);
9394											selection.removeAllRanges();
9395											start$jscomp$0 > end$jscomp$0 ? (selection.addRange(range), selection.extend(endMarker.node, endMarker.offset)) : (range.setEnd(endMarker.node, endMarker.offset), selection.addRange(range));
9396										}
9397									}
9398								}
9399							}
9400							doc = [];
9401							for (selection = priorFocusedElem; selection = selection.parentNode;) 1 === selection.nodeType && doc.push({
9402								element: selection,
9403								left: selection.scrollLeft,
9404								top: selection.scrollTop
9405							});
9406							"function" === typeof priorFocusedElem.focus && priorFocusedElem.focus();
9407							for (priorFocusedElem = 0; priorFocusedElem < doc.length; priorFocusedElem++) {
9408								var info = doc[priorFocusedElem];
9409								info.element.scrollLeft = info.left;
9410								info.element.scrollTop = info.top;
9411							}
9412						}
9413						_enabled = !!eventsEnabled;
9414						selectionInformation = eventsEnabled = null;
9415					} finally {
9416						executionContext = prevExecutionContext, ReactDOMSharedInternals.p = previousPriority, ReactSharedInternals.T = rootMutationHasEffect;
9417					}
9418				}
9419				root.current = finishedWork;
9420				pendingEffectsStatus = PENDING_LAYOUT_PHASE;
9421			}
9422		}
9423		function flushLayoutEffects() {
9424			if (pendingEffectsStatus === PENDING_LAYOUT_PHASE) {
9425				pendingEffectsStatus = NO_PENDING_EFFECTS;
9426				var suspendedViewTransitionReason = pendingSuspendedViewTransitionReason;
9427				if (null !== suspendedViewTransitionReason) {
9428					commitStartTime = now();
9429					var startTime = commitEndTime, endTime = commitStartTime;
9430					!supportsUserTiming || endTime <= startTime || (animatingTask ? animatingTask.run(console.timeStamp.bind(console, suspendedViewTransitionReason, startTime, endTime, currentTrack, LANES_TRACK_GROUP, "secondary-light")) : console.timeStamp(suspendedViewTransitionReason, startTime, endTime, currentTrack, LANES_TRACK_GROUP, "secondary-light"));
9431				}
9432				suspendedViewTransitionReason = pendingEffectsRoot;
9433				startTime = pendingFinishedWork;
9434				endTime = pendingEffectsLanes;
9435				var rootHasLayoutEffect = 0 !== (startTime.flags & 8772);
9436				if (0 !== (startTime.subtreeFlags & 8772) || rootHasLayoutEffect) {
9437					rootHasLayoutEffect = ReactSharedInternals.T;
9438					ReactSharedInternals.T = null;
9439					var _previousPriority = ReactDOMSharedInternals.p;
9440					ReactDOMSharedInternals.p = DiscreteEventPriority;
9441					var _prevExecutionContext = executionContext;
9442					executionContext |= CommitContext;
9443					try {
9444						inProgressLanes = endTime, inProgressRoot = suspendedViewTransitionReason, resetComponentEffectTimers(), commitLayoutEffectOnFiber(suspendedViewTransitionReason, startTime.alternate, startTime), inProgressRoot = inProgressLanes = null;
9445					} finally {
9446						executionContext = _prevExecutionContext, ReactDOMSharedInternals.p = _previousPriority, ReactSharedInternals.T = rootHasLayoutEffect;
9447					}
9448				}
9449				suspendedViewTransitionReason = pendingEffectsRenderEndTime;
9450				startTime = pendingSuspendedCommitReason;
9451				commitEndTime = now();
9452				logCommitPhase(null === startTime ? suspendedViewTransitionReason : commitStartTime, commitEndTime, commitErrors, pendingDelayedCommitReason === ABORTED_VIEW_TRANSITION_COMMIT, workInProgressUpdateTask);
9453				pendingEffectsStatus = PENDING_AFTER_MUTATION_PHASE;
9454			}
9455		}
9456		function flushSpawnedWork() {
9457			if (pendingEffectsStatus === PENDING_SPAWNED_WORK || pendingEffectsStatus === PENDING_AFTER_MUTATION_PHASE) {
9458				if (pendingEffectsStatus === PENDING_SPAWNED_WORK) {
9459					var startViewTransitionStartTime = commitEndTime;
9460					commitEndTime = now();
9461					var endTime = commitEndTime, abortedViewTransition = pendingDelayedCommitReason === ABORTED_VIEW_TRANSITION_COMMIT;
9462					!supportsUserTiming || endTime <= startViewTransitionStartTime || (animatingTask ? animatingTask.run(console.timeStamp.bind(console, abortedViewTransition ? "Interrupted View Transition" : "Starting Animation", startViewTransitionStartTime, endTime, currentTrack, LANES_TRACK_GROUP, abortedViewTransition ? "error" : "secondary-light")) : console.timeStamp(abortedViewTransition ? "Interrupted View Transition" : "Starting Animation", startViewTransitionStartTime, endTime, currentTrack, LANES_TRACK_GROUP, abortedViewTransition ? " error" : "secondary-light"));
9463					pendingDelayedCommitReason !== ABORTED_VIEW_TRANSITION_COMMIT && (pendingDelayedCommitReason = ANIMATION_
9463STARTED_COMMIT);
9464				}
9465				pendingEffectsStatus = NO_PENDING_EFFECTS;
9466				startViewTransitionStartTime = pendingViewTransition;
9467				pendingViewTransition = null;
9468				requestPaint();
9469				endTime = pendingEffectsRoot;
9470				var finishedWork = pendingFinishedWork;
9471				abortedViewTransition = pendingEffectsLanes;
9472				var recoverableErrors = pendingRecoverableErrors, passiveSubtreeMask = (abortedViewTransition & 335544064) === abortedViewTransition ? 10262 : 10256;
9473				(passiveSubtreeMask = 0 !== finishedWork.actualDuration || 0 !== (finishedWork.subtreeFlags & passiveSubtreeMask) || 0 !== (finishedWork.flags & passiveSubtreeMask)) ? pendingEffectsStatus = PENDING_PASSIVE_PHASE : (pendingEffectsStatus = NO_PENDING_EFFECTS, pendingFinishedWork = pendingEffectsRoot = null, releaseRootPooledCache(endTime, endTime.pendingLanes), nestedPassiveUpdateCount = 0, rootWithPassiveNestedUpdates = null);
9474				var remainingLanes = endTime.pendingLanes;
9475				0 === remainingLanes && (legacyErrorBoundariesThatAlreadyFailed = null);
9476				passiveSubtreeMask || commitDoubleInvokeEffectsInDEV(endTime);
9477				remainingLanes = lanesToEventPriority(abortedViewTransition);
9478				finishedWork = finishedWork.stateNode;
9479				if (injectedHook && "function" === typeof injectedHook.onCommitFiberRoot) try {
9480					var didError = 128 === (finishedWork.current.flags & 128);
9481					switch (remainingLanes) {
9482						case DiscreteEventPriority:
9483							var schedulerPriority = ImmediatePriority;
9484							break;
9485						case ContinuousEventPriority:
9486							schedulerPriority = UserBlockingPriority;
9487							break;
9488						case DefaultEventPriority:
9489							schedulerPriority = NormalPriority$1;
9490							break;
9491						case IdleEventPriority:
9492							schedulerPriority = IdlePriority;
9493							break;
9494						default: schedulerPriority = NormalPriority$1;
9495					}
9496					injectedHook.onCommitFiberRoot(rendererID, finishedWork, schedulerPriority, didError);
9497				} catch (err) {
9498					hasLoggedError || (hasLoggedError = !0, console.error("React instrumentation encountered an error: %o", err));
9499				}
9500				isDevToolsPresent && endTime.memoizedUpdaters.clear();
9501				onCommitRoot();
9502				if (null !== recoverableErrors) {
9503					didError = ReactSharedInternals.T;
9504					schedulerPriority = ReactDOMSharedInternals.p;
9505					ReactDOMSharedInternals.p = DiscreteEventPriority;
9506					ReactSharedInternals.T = null;
9507					try {
9508						var onRecoverableError = endTime.onRecoverableError;
9509						for (finishedWork = 0; finishedWork < recoverableErrors.length; finishedWork++) {
9510							var recoverableError = recoverableErrors[finishedWork], errorInfo = makeErrorInfo(recoverableError.stack);
9511							runWithFiberInDEV(recoverableError.source, onRecoverableError, recoverableError.value, errorInfo);
9512						}
9513					} finally {
9514						ReactSharedInternals.T = didError, ReactDOMSharedInternals.p = schedulerPriority;
9515					}
9516				}
9517				onRecoverableError = pendingViewTransitionEvents;
9518				recoverableError = pendingTransitionTypes;
9519				pendingTransitionTypes = null;
9520				if (null !== onRecoverableError && (pendingViewTransitionEvents = null, null === recoverableError && (recoverableError = []), null !== startViewTransitionStartTime)) for (errorInfo = 0; errorInfo < onRecoverableError.length; errorInfo++) recoverableErrors = (0, onRecoverableError[errorInfo])(recoverableError), void 0 !== recoverableErrors && startViewTransitionStartTime.finished.finally(recoverableErrors);
9521				0 !== (pendingEffectsLanes & 3) && flushPendingEffects();
9522				ensureRootIsScheduled(endTime);
9523				remainingLanes = endTime.pendingLanes;
9524				0 !== (abortedViewTransition & 261930) && 0 !== (remainingLanes & 42) ? (nestedUpdateScheduled = !0, endTime === rootWithNestedUpdates ? nestedUpdateCount++ : (nestedUpdateCount = 0, rootWithNestedUpdates = endTime)) : (nestedUpdateCount = 0, rootWithNestedUpdates = null);
9525				passiveSubtreeMask || finalizeRender(abortedViewTransition, commitEndTime);
9526				flushSyncWorkAcrossRoots_impl(0, !1);
9527			}
9528		}
9529		function makeErrorInfo(componentStack) {
9530			componentStack = { componentStack };
9531			Object.defineProperty(componentStack, "digest", { get: function() {
9532				console.error("You are accessing \"digest\" from the errorInfo object passed to onRecoverableError. This property is no longer provided as part of errorInfo but can be accessed as a property of the Error instance itself.");
9533			} });
9534			return componentStack;
9535		}
9536		function releaseRootPooledCache(root, remainingLanes) {
9537			0 === (root.pooledCacheLanes &= remainingLanes) && (remainingLanes = root.pooledCache, null != remainingLanes && (root.pooledCache = null, releaseCache(remainingLanes)));
9538		}
9539		function flushPendingEffects() {
9540			null !== pendingViewTransition && (pendingViewTransition.skipTransition(), didWarnAboutInterruptedViewTransitions || (didWarnAboutInterruptedViewTransitions = !0, console.warn("A flushSync update cancelled a View Transition because it was called while the View Transition was still preparing. To preserve the synchronous semantics, React had to skip the View Transition. If you can, try to avoid flushSync() in a scenario that's likely to interfere.")), pendingViewTransition = null, pendingDelayedCommitReason = ABORTED_VIEW_TRANSITION_COMMIT);
9541			flushMutationEffects();
9542			flushLayoutEffects();
9543			flushSpawnedWork();
9544			return flushPassiveEffects();
9545		}
9546		function flushPassiveEffects() {
9547			if (pendingEffectsStatus !== PENDING_PASSIVE_PHASE) return !1;
9548			var root = pendingEffectsRoot, remainingLanes = pendingEffectsRemainingLanes;
9549			pendingEffectsRemainingLanes = 0;
vendor: 4,403 bytes, lines 9550-9615
9550			var renderPriority = lanesToEventPriority(pendingEffectsLanes), priority = 0 === DefaultEventPriority || DefaultEventPriority > renderPriority ? DefaultEventPriority : renderPriority;
9551			renderPriority = ReactSharedInternals.T;
9552			var previousPriority = ReactDOMSharedInternals.p;
9553			try {
9554				ReactDOMSharedInternals.p = priority;
9555				ReactSharedInternals.T = null;
9556				var transitions = pendingPassiveTransitions;
9557				pendingPassiveTransitions = null;
9558				priority = pendingEffectsRoot;
9559				var lanes = pendingEffectsLanes;
9560				pendingEffectsStatus = NO_PENDING_EFFECTS;
9561				pendingFinishedWork = pendingEffectsRoot = null;
9562				pendingEffectsLanes = 0;
9563				if ((executionContext & (RenderContext | CommitContext)) !== NoContext) throw Error("Cannot flush passive effects while already rendering.");
9564				setCurrentTrackFromLanes(lanes);
9565				isFlushingPassiveEffects = !0;
9566				didScheduleUpdateDuringPassiveEffects = !1;
9567				var passiveEffectStartTime = 0;
9568				commitErrors = null;
9569				passiveEffectStartTime = now$1();
9570				if (pendingDelayedCommitReason === ANIMATION_STARTED_COMMIT) logAnimatingPhase(commitEndTime, passiveEffectStartTime, animatingTask);
9571				else {
9572					var startTime = commitEndTime, endTime = passiveEffectStartTime, delayedUntilPaint = pendingDelayedCommitReason === DELAYED_PASSIVE_COMMIT;
9573					!supportsUserTiming || endTime <= startTime || (workInProgressUpdateTask ? workInProgressUpdateTask.run(console.timeStamp.bind(console, delayedUntilPaint ? "Waiting for Paint" : "Waiting", startTime, endTime, currentTrack, LANES_TRACK_GROUP, "secondary-light")) : console.timeStamp(delayedUntilPaint ? "Waiting for Paint" : "Waiting", startTime, endTime, currentTrack, LANES_TRACK_GROUP, "secondary-light"));
9574				}
9575				startTime = executionContext;
9576				executionContext |= CommitContext;
9577				var finishedWork = priority.current;
9578				resetComponentEffectTimers();
9579				commitPassiveUnmountOnFiber(finishedWork);
9580				var finishedWork$jscomp$0 = priority.current;
9581				finishedWork = pendingEffectsRenderEndTime;
9582				resetComponentEffectTimers();
9583				commitPassiveMountOnFiber(priority, finishedWork$jscomp$0, lanes, transitions, finishedWork);
9584				commitDoubleInvokeEffectsInDEV(priority);
9585				executionContext = startTime;
9586				var passiveEffectsEndTime = now$1();
9587				finishedWork$jscomp$0 = passiveEffectStartTime;
9588				finishedWork = workInProgressUpdateTask;
9589				null !== commitErrors ? logCommitErrored(finishedWork$jscomp$0, passiveEffectsEndTime, commitErrors, !0, finishedWork) : !supportsUserTiming || passiveEffectsEndTime <= finishedWork$jscomp$0 || (finishedWork ? finishedWork.run(console.timeStamp.bind(console, "Remaining Effects", finishedWork$jscomp$0, passiveEffectsEndTime, currentTrack, LANES_TRACK_GROUP, "secondary-dark")) : console.timeStamp("Remaining Effects", finishedWork$jscomp$0, passiveEffectsEndTime, currentTrack, LANES_TRACK_GROUP, "secondary-dark"));
9590				finalizeRender(lanes, passiveEffectsEndTime);
9591				flushSyncWorkAcrossRoots_impl(0, !1);
9592				didScheduleUpdateDuringPassiveEffects ? priority === rootWithPassiveNestedUpdates ? nestedPassiveUpdateCount++ : (nestedPassiveUpdateCount = 0, rootWithPassiveNestedUpdates = priority) : nestedPassiveUpdateCount = 0;
9593				didScheduleUpdateDuringPassiveEffects = isFlushingPassiveEffects = !1;
9594				if (injectedHook && "function" === typeof injectedHook.onPostCommitFiberRoot) try {
9595					injectedHook.onPostCommitFiberRoot(rendererID, priority);
9596				} catch (err) {
9597					hasLoggedError || (hasLoggedError = !0, console.error("React instrumentation encountered an error: %o", err));
9598				}
9599				var stateNode = priority.current.stateNode;
9600				stateNode.effectDuration = 0;
9601				stateNode.passiveEffectDuration = 0;
9602				return !0;
9603			} finally {
9604				ReactDOMSharedInternals.p = previousPriority, ReactSharedInternals.T = renderPriority, releaseRootPooledCache(root, remainingLanes);
9605			}
9606		}
9607		function captureCommitPhaseErrorOnRoot(rootFiber, sourceFiber, error) {
9608			sourceFiber = createCapturedValueAtFiber(error, sourceFiber);
9609			recordEffectError(sourceFiber);
9610			sourceFiber = createRootErrorUpdate(rootFiber.stateNode, sourceFiber, 2);
9611			rootFiber = enqueueUpdate(rootFiber, sourceFiber, 2);
9612			null !== rootFiber && (markRootUpdated$1(rootFiber, 2), ensureRootIsScheduled(rootFiber));
9613		}
9614		function captureCommitPhaseError(sourceFiber, nearestMountedAncestor, error) {
9615			isRunningInsertionEffect = !1;
9616			if (3 === sourceFiber.tag) captureCommitPhaseErrorOnRoot(sourceFiber, sourceFiber, error);
9617			else {
9618				for (; null !== nearestMountedAncestor;) {
9619					if (3 === nearestMountedAncestor.tag) {
9620						captureCommitPhaseErrorOnRoot(nearestMountedAncestor, sourceFiber, error);
9621						return;
9622					}
9623					if (1 === nearestMountedAncestor.tag) {
9624						var instance = nearestMountedAncestor.stateNode;
9625						if ("function" === typeof nearestMountedAncestor.type.getDerivedStateFromError || "function" === typeof instance.componentDidCatch && (null === legacyErrorBoundariesThatAlreadyFailed || !legacyErrorBoundariesThatAlreadyFailed.has(instance))) {
9626							sourceFiber = createCapturedValueAtFiber(error, sourceFiber);
9627							recordEffectError(sourceFiber);
9628							error = createClassErrorUpdate(2);
9629							instance = enqueueUpdate(nearestMountedAncestor, error, 2);
9630							null !== instance && (initializeClassErrorUpdate(error, instance, nearestMountedAncestor, sourceFiber), markRootUpdated$1(instance, 2), ensureRootIsScheduled(instance));
9631							return;
9632						}
9633					}
9634					nearestMountedAncestor = nearestMountedAncestor.return;
9635				}
9636				console.error("Internal React error: Attempted to capture a commit phase error inside a detached tree. This indicates a bug in React. Potential causes include deleting the same fiber more than once, committing an already-finished tree, or an inconsistent return pointer.\n\nError message:\n\n%s", error);
9637			}
9638		}
9639		function attachPingListener(root, wakeable, lanes) {
9640			var pingCache = root.pingCache;
9641			if (null === pingCache) {
9642				pingCache = root.pingCache = new PossiblyWeakMap();
9643				var threadIDs = /* @__PURE__ */ new Set();
9644				pingCache.set(wakeable, threadIDs);
9645			} else threadIDs = pingCache.get(wakeable), void 0 === threadIDs && (threadIDs = /* @__PURE__ */ new Set(), pingCache.set(wakeable, threadIDs));
9646			threadIDs.has(lanes) || (workInProgressRootDidAttachPingListener = !0, threadIDs.add(lanes), pingCache = pingSuspendedRoot.bind(null, root, wakeable, lanes), isDevToolsPresent && restorePendingUpdaters(root, lanes), wakeable.then(pingCache, pingCache));
9647		}
9648		function pingSuspendedRoot(root, wakeable, pingedLanes) {
9649			var pingCache = root.pingCache;
9650			null !== pingCache && pingCache.delete(wakeable);
9651			root.pingedLanes |= root.suspendedLanes & pingedLanes;
9652			root.warmLanes &= ~pingedLanes;
9653			0 !== (pingedLanes & 127) ? 0 > blockingUpdateTime && (blockingClampTime = blockingUpdateTime = now(), blockingUpdateTask = createTask("Promise Resolved"), blockingUpdateType = PINGED_UPDATE) : 0 !== (pingedLanes & 4194048) && 0 > transitionUpdateTime && (transitionClampTime = transitionUpdateTime = now(), transitionUpdateTask = createTask("Promise Resolved"), transitionUpdateType = PINGED_UPDATE);
9654			isConcurrentActEnvironment() && null === ReactSharedInternals.actQueue && console.error("A suspended resource finished loading inside a test, but the event was not wrapped in act(...).\n\nWhen testing, code that resolves suspended data should be wrapped into act(...):\n\nact(() => {\n  /* finish loading suspended data */\n});\n/* assert on the output */\n\nThis ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act");
9655			workInProgressRoot === root && (workInProgressRootRenderLanes & pingedLanes) === pingedLanes && (workInProgressRootExitStatus === RootSuspendedWithDelay || workInProgressRootExitStatus === RootSuspended && (workInProgressRootRenderLanes & 62914560) === workInProgressRootRenderLanes && now$1() - globalMostRecentFallbackTime < FALLBACK_THROTTLE_MS ? (executionContext & RenderContext) === NoContext ? prepareFreshStack(root, 0) : workInProgressRootPingedLanes |= pingedLanes : workInProgressRootPingedLanes |= pingedLanes, workInProgressSuspendedRetryLanes === workInProgressRootRenderLanes && (workInProgressSuspendedRetryLanes = 0));
9656			ensureRootIsScheduled(root);
9657		}
9658		function retryTimedOutBoundary(boundaryFiber, retryLane) {
9659			0 === retryLane && (retryLane = claimNextRetryLane());
9660			boundaryFiber = enqueueConcurrentRenderForLane(boundaryFiber, retryLane);
vendor: 4,351 bytes, lines 9661-9735
9661			null !== boundaryFiber && (markRootUpdated$1(boundaryFiber, retryLane), ensureRootIsScheduled(boundaryFiber));
9662		}
9663		function retryDehydratedSuspenseBoundary(boundaryFiber) {
9664			var suspenseState = boundaryFiber.memoizedState, retryLane = 0;
9665			null !== suspenseState && (retryLane = suspenseState.retryLane);
9666			retryTimedOutBoundary(boundaryFiber, retryLane);
9667		}
9668		function resolveRetryWakeable(boundaryFiber, wakeable) {
9669			var retryLane = 0;
9670			switch (boundaryFiber.tag) {
9671				case 31:
9672				case 13:
9673					var retryCache = boundaryFiber.stateNode;
9674					var suspenseState = boundaryFiber.memoizedState;
9675					null !== suspenseState && (retryLane = suspenseState.retryLane);
9676					break;
9677				case 19:
9678					retryCache = boundaryFiber.stateNode;
9679					break;
9680				case 22:
9681					retryCache = boundaryFiber.stateNode._retryCache;
9682					break;
9683				default: throw Error("Pinged unknown suspense boundary type. This is probably a bug in React.");
9684			}
9685			null !== retryCache && retryCache.delete(wakeable);
9686			retryTimedOutBoundary(boundaryFiber, retryLane);
9687		}
9688		function recursivelyTraverseAndDoubleInvokeEffectsInDEV(root$jscomp$0, parentFiber, isInStrictMode) {
9689			if (0 !== (parentFiber.subtreeFlags & 134225920)) for (parentFiber = parentFiber.child; null !== parentFiber;) {
9690				var root = root$jscomp$0, fiber = parentFiber, isStrictModeFiber = fiber.type === REACT_STRICT_MODE_TYPE;
9691				isStrictModeFiber = isInStrictMode || isStrictModeFiber;
9692				22 !== fiber.tag ? fiber.flags & 134217728 ? isStrictModeFiber && runWithFiberInDEV(fiber, doubleInvokeEffectsOnFiber, root, fiber) : recursivelyTraverseAndDoubleInvokeEffectsInDEV(root, fiber, isStrictModeFiber) : null === fiber.memoizedState && (isStrictModeFiber && fiber.flags & 134225920 ? runWithFiberInDEV(fiber, doubleInvokeEffectsOnFiber, root, fiber) : fiber.subtreeFlags & 134217728 && runWithFiberInDEV(fiber, recursivelyTraverseAndDoubleInvokeEffectsInDEV, root, fiber, isStrictModeFiber));
9693				parentFiber = parentFiber.sibling;
9694			}
9695		}
9696		function doubleInvokeEffectsOnFiber(root, fiber) {
9697			setIsStrictModeForDevtools(!0);
9698			try {
9699				disappearLayoutEffects(fiber, NoLayoutEffectTraversalFlags), disconnectPassiveEffect(fiber), reappearLayoutEffects(root, fiber.alternate, fiber, NoLayoutEffectTraversalFlags), reconnectPassiveEffects(root, fiber, 0, null, !1, 0);
9700			} finally {
9701				setIsStrictModeForDevtools(!1);
9702			}
9703		}
9704		function commitDoubleInvokeEffectsInDEV(root) {
9705			var doubleInvokeEffects = !0;
9706			root.current.mode & (StrictLegacyMode | StrictEffectsMode) || (doubleInvokeEffects = !1);
9707			recursivelyTraverseAndDoubleInvokeEffectsInDEV(root, root.current, doubleInvokeEffects);
9708		}
9709		function warnAboutUpdateOnNotYetMountedFiberInDEV(fiber) {
9710			if ((executionContext & RenderContext) === NoContext) {
9711				var tag = fiber.tag;
9712				if (3 === tag || 1 === tag || 0 === tag || 11 === tag || 14 === tag || 15 === tag) {
9713					tag = getComponentNameFromFiber(fiber) || "ReactComponent";
9714					if (null !== didWarnStateUpdateForNotYetMountedComponent) {
9715						if (didWarnStateUpdateForNotYetMountedComponent.has(tag)) return;
9716						didWarnStateUpdateForNotYetMountedComponent.add(tag);
9717					} else didWarnStateUpdateForNotYetMountedComponent = /* @__PURE__ */ new Set([tag]);
9718					runWithFiberInDEV(fiber, function() {
9719						console.error("Can't perform a React state update on a component that hasn't mounted yet. This indicates that you have a side-effect in your render function that asynchronously tries to update the component. Move this work to useEffect instead.");
9720					});
9721				}
9722			}
9723		}
9724		function restorePendingUpdaters(root, lanes) {
9725			isDevToolsPresent && root.memoizedUpdaters.forEach(function(schedulingFiber) {
9726				addFiberToLanesMap(root, schedulingFiber, lanes);
9727			});
9728		}
9729		function scheduleCallback$1(priorityLevel, callback) {
9730			var actQueue = ReactSharedInternals.actQueue;
9731			return null !== actQueue ? (actQueue.push(callback), fakeActCallbackNode$1) : scheduleCallback$3(priorityLevel, callback);
9732		}
9733		function warnIfUpdatesNotWrappedWithActDEV(fiber) {
9734			isConcurrentActEnvironment() && null === ReactSharedInternals.actQueue && runWithFiberInDEV(fiber, function() {
9735				console.error("An update to %s inside a test was not wrapped in act(...).\n\nWhen testing, code that causes React state updates should be wrapped into act(...):\n\nact(() =>
vendor: 4,281 bytes, lines 9735-9795
9735 {\n  /* fire events that update state */\n});\n/* assert on the output */\n\nThis ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act", getComponentNameFromFiber(fiber));
9736			});
9737		}
9738		function ensureRootIsScheduled(root) {
9739			root !== lastScheduledRoot && null === root.next && (null === lastScheduledRoot ? firstScheduledRoot = lastScheduledRoot = root : lastScheduledRoot = lastScheduledRoot.next = root);
9740			mightHavePendingSyncWork = !0;
9741			null !== ReactSharedInternals.actQueue ? didScheduleMicrotask_act || (didScheduleMicrotask_act = !0, scheduleImmediateRootScheduleTask()) : didScheduleMicrotask || (didScheduleMicrotask = !0, scheduleImmediateRootScheduleTask());
9742		}
9743		function flushSyncWorkAcrossRoots_impl(syncTransitionLanes, onlyLegacy) {
9744			if (!isFlushingWork && mightHavePendingSyncWork) {
9745				isFlushingWork = !0;
9746				do {
9747					var didPerformSomeWork = !1;
9748					for (var root = firstScheduledRoot; null !== root;) {
9749						if (!onlyLegacy) if (0 !== syncTransitionLanes) {
9750							var pendingLanes = root.pendingLanes;
9751							if (0 === pendingLanes) var nextLanes = 0;
9752							else {
9753								var suspendedLanes = root.suspendedLanes, pingedLanes = root.pingedLanes;
9754								nextLanes = (1 << 31 - clz32(42 | syncTransitionLanes) + 1) - 1;
9755								nextLanes &= pendingLanes & ~(suspendedLanes & ~pingedLanes);
9756								nextLanes = nextLanes & 201326741 ? nextLanes & 201326741 | 1 : nextLanes ? nextLanes | 2 : 0;
9757							}
9758							0 !== nextLanes && (didPerformSomeWork = !0, performSyncWorkOnRoot(root, nextLanes));
9759						} else nextLanes = workInProgressRootRenderLanes, nextLanes = getNextLanes(root, root === workInProgressRoot ? nextLanes : 0, null !== root.cancelPendingCommit || root.timeoutHandle !== noTimeout), 0 === (nextLanes & 3) || checkIfRootIsPrerendering(root, nextLanes) || (didPerformSomeWork = !0, performSyncWorkOnRoot(root, nextLanes));
9760						root = root.next;
9761					}
9762				} while (didPerformSomeWork);
9763				isFlushingWork = !1;
9764			}
9765		}
9766		function processRootScheduleInImmediateTask() {
9767			schedulerEvent = window.event;
9768			processRootScheduleInMicrotask();
9769		}
9770		function processRootScheduleInMicrotask() {
9771			mightHavePendingSyncWork = didScheduleMicrotask_act = didScheduleMicrotask = !1;
9772			var syncTransitionLanes = 0;
9773			0 !== currentEventTransitionLane && shouldAttemptEagerTransition() && (syncTransitionLanes = currentEventTransitionLane);
9774			for (var currentTime = now$1(), prev = null, root = firstScheduledRoot; null !== root;) {
9775				var next = root.next, nextLanes = scheduleTaskForRootDuringMicrotask(root, currentTime);
9776				if (0 === nextLanes) root.next = null, null === prev ? firstScheduledRoot = next : prev.next = next, null === next && (lastScheduledRoot = prev);
9777				else if (prev = root, 0 !== syncTransitionLanes || 0 !== (nextLanes & 3)) mightHavePendingSyncWork = !0;
9778				root = next;
9779			}
9780			pendingEffectsStatus !== NO_PENDING_EFFECTS && pendingEffectsStatus !== PENDING_PASSIVE_PHASE || flushSyncWorkAcrossRoots_impl(syncTransitionLanes, !1);
9781			0 !== currentEventTransitionLane && (currentEventTransitionLane = 0);
9782		}
9783		function scheduleTaskForRootDuringMicrotask(root, currentTime) {
9784			for (var suspendedLanes = root.suspendedLanes, pingedLanes = root.pingedLanes, expirationTimes = root.expirationTimes, lanes = root.pendingLanes & -62914561; 0 < lanes;) {
9785				var index = 31 - clz32(lanes), lane = 1 << index, expirationTime = expirationTimes[index];
9786				if (-1 === expirationTime) {
9787					if (0 === (lane & suspendedLanes) || 0 !== (lane & pingedLanes)) expirationTimes[index] = computeExpirationTime(lane, currentTime);
9788				} else expirationTime <= currentTime && (root.expiredLanes |= lane);
9789				lanes &= ~lane;
9790			}
9791			currentTime = workInProgressRoot;
9792			suspendedLanes = workInProgressRootRenderLanes;
9793			suspendedLanes = getNextLanes(root, root === currentTime ? suspendedLanes : 0, null !== root.cancelPendingCommit || root.timeoutHandle !== noTimeout);
9794			pingedLanes = root.callbackNode;
9795			if (0 === suspendedLanes || root === currentTime && (workInProgressSuspendedReason === SuspendedOnData || workInProgressSuspendedReason === SuspendedOnAction) || null !== root.cancelPendingCommit) return null !== pingedLanes && c
vendor: 5,893 bytes, lines 9795-9911
9795ancelCallback(pingedLanes), root.callbackNode = null, root.callbackPriority = 0;
9796			if (0 === (suspendedLanes & 3) || checkIfRootIsPrerendering(root, suspendedLanes)) {
9797				currentTime = suspendedLanes & -suspendedLanes;
9798				if (currentTime !== root.callbackPriority || null !== ReactSharedInternals.actQueue && pingedLanes !== fakeActCallbackNode) cancelCallback(pingedLanes);
9799				else return currentTime;
9800				switch (lanesToEventPriority(suspendedLanes)) {
9801					case DiscreteEventPriority:
9802					case ContinuousEventPriority:
9803						suspendedLanes = UserBlockingPriority;
9804						break;
9805					case DefaultEventPriority:
9806						suspendedLanes = NormalPriority$1;
9807						break;
9808					case IdleEventPriority:
9809						suspendedLanes = IdlePriority;
9810						break;
9811					default: suspendedLanes = NormalPriority$1;
9812				}
9813				pingedLanes = performWorkOnRootViaSchedulerTask.bind(null, root);
9814				null !== ReactSharedInternals.actQueue ? (ReactSharedInternals.actQueue.push(pingedLanes), suspendedLanes = fakeActCallbackNode) : suspendedLanes = scheduleCallback$3(suspendedLanes, pingedLanes);
9815				root.callbackPriority = currentTime;
9816				root.callbackNode = suspendedLanes;
9817				return currentTime;
9818			}
9819			null !== pingedLanes && cancelCallback(pingedLanes);
9820			root.callbackPriority = 2;
9821			root.callbackNode = null;
9822			return 2;
9823		}
9824		function performWorkOnRootViaSchedulerTask(root, didTimeout) {
9825			nestedUpdateScheduled = currentUpdateIsNested = !1;
9826			schedulerEvent = window.event;
9827			if (pendingEffectsStatus !== NO_PENDING_EFFECTS && pendingEffectsStatus !== PENDING_PASSIVE_PHASE) return root.callbackNode = null, root.callbackPriority = 0, null;
9828			var originalCallbackNode = root.callbackNode;
9829			pendingDelayedCommitReason === IMMEDIATE_COMMIT && (pendingDelayedCommitReason = DELAYED_PASSIVE_COMMIT);
9830			if (flushPendingEffects() && root.callbackNode !== originalCallbackNode) return null;
9831			var workInProgressRootRenderLanes$jscomp$0 = workInProgressRootRenderLanes;
9832			workInProgressRootRenderLanes$jscomp$0 = getNextLanes(root, root === workInProgressRoot ? workInProgressRootRenderLanes$jscomp$0 : 0, null !== root.cancelPendingCommit || root.timeoutHandle !== noTimeout);
9833			if (0 === workInProgressRootRenderLanes$jscomp$0) return null;
9834			performWorkOnRoot(root, workInProgressRootRenderLanes$jscomp$0, didTimeout);
9835			scheduleTaskForRootDuringMicrotask(root, now$1());
9836			return null != root.callbackNode && root.callbackNode === originalCallbackNode ? performWorkOnRootViaSchedulerTask.bind(null, root) : null;
9837		}
9838		function performSyncWorkOnRoot(root, lanes) {
9839			if (flushPendingEffects()) return null;
9840			currentUpdateIsNested = nestedUpdateScheduled;
9841			nestedUpdateScheduled = !1;
9842			performWorkOnRoot(root, lanes, !0);
9843		}
9844		function cancelCallback(callbackNode) {
9845			callbackNode !== fakeActCallbackNode && null !== callbackNode && cancelCallback$1(callbackNode);
9846		}
9847		function scheduleImmediateRootScheduleTask() {
9848			null !== ReactSharedInternals.actQueue && ReactSharedInternals.actQueue.push(function() {
9849				processRootScheduleInMicrotask();
9850				return null;
9851			});
9852			scheduleMicrotask(function() {
9853				(executionContext & (RenderContext | CommitContext)) !== NoContext ? scheduleCallback$3(ImmediatePriority, processRootScheduleInImmediateTask) : processRootScheduleInMicrotask();
9854			});
9855		}
9856		function requestTransitionLane() {
9857			if (0 === currentEventTransitionLane) {
9858				var actionScopeLane = currentEntangledLane;
9859				0 === actionScopeLane && (actionScopeLane = nextTransitionUpdateLane, nextTransitionUpdateLane <<= 1, 0 === (nextTransitionUpdateLane & 261888) && (nextTransitionUpdateLane = 256));
9860				currentEventTransitionLane = actionScopeLane;
9861			}
9862			return currentEventTransitionLane;
9863		}
9864		function coerceFormActionProp(actionProp) {
9865			if (null == actionProp || "symbol" === typeof actionProp || "boolean" === typeof actionProp) return null;
9866			if ("function" === typeof actionProp) return actionProp;
9867			checkAttributeStringCoercion(actionProp, "action");
9868			return sanitizeURL(actionProp);
9869		}
9870		function extractEvents$1(dispatchQueue, domEventName, maybeTargetInst, nativeEvent, nativeEventTarget) {
9871			if ("submit" === domEventName && maybeTargetInst && maybeTargetInst.stateNode === nativeEventTarget) {
9872				var action = coerceFormActionProp((nativeEventTarget[internalPropsKey] || null).action), submitter = nativeEvent.submitter;
9873				submitter && (domEventName = (domEventName = submitter[internalPropsKey] || null) ? coerceFormActionProp(domEventName.formAction) : submitter.getAttribute("formAction"), null !== domEventName && (action = domEventName, submitter = null));
9874				var event = new SyntheticEvent("action", "action", null, nativeEvent, nativeEventTarget);
9875				dispatchQueue.push({
9876					event,
9877					listeners: [{
9878						instance: null,
9879						listener: function() {
9880							if (nativeEvent.defaultPrevented) {
9881								if (0 !== currentEventTransitionLane) {
9882									var formData = new FormData(nativeEventTarget, submitter), pendingState = {
9883										pending: !0,
9884										data: formData,
9885										method: nativeEventTarget.method,
9886										action
9887									};
9888									Object.freeze(pendingState);
9889									startHostTransition(maybeTargetInst, pendingState, null, formData);
9890								}
9891							} else "function" === typeof action && (event.preventDefault(), formData = new FormData(nativeEventTarget, submitter), pendingState = {
9892								pending: !0,
9893								data: formData,
9894								method: nativeEventTarget.method,
9895								action
9896							}, Object.freeze(pendingState), startHostTransition(maybeTargetInst, pendingState, action, formData));
9897						},
9898						currentTarget: nativeEventTarget
9899					}]
9900				});
9901			}
9902		}
9903		function executeDispatch(event, listener, currentTarget) {
9904			event.currentTarget = currentTarget;
9905			try {
9906				listener(event);
9907			} catch (error) {
9908				reportGlobalError(error);
9909			}
9910			event.currentTarget = null;
9911		}
vendor: 16,729 bytes, lines 9912-10200
9912		function processDispatchQueue(dispatchQueue, eventSystemFlags) {
9913			eventSystemFlags = 0 !== (eventSystemFlags & 4);
9914			for (var i = 0; i < dispatchQueue.length; i++) {
9915				var _dispatchQueue$i = dispatchQueue[i];
9916				a: {
9917					var previousInstance = void 0, event = _dispatchQueue$i.event;
9918					_dispatchQueue$i = _dispatchQueue$i.listeners;
9919					if (eventSystemFlags) for (var i$jscomp$0 = _dispatchQueue$i.length - 1; 0 <= i$jscomp$0; i$jscomp$0--) {
9920						var _dispatchListeners$i = _dispatchQueue$i[i$jscomp$0], instance = _dispatchListeners$i.instance, currentTarget = _dispatchListeners$i.currentTarget;
9921						_dispatchListeners$i = _dispatchListeners$i.listener;
9922						if (instance !== previousInstance && event.isPropagationStopped()) break a;
9923						null !== instance ? runWithFiberInDEV(instance, executeDispatch, event, _dispatchListeners$i, currentTarget) : executeDispatch(event, _dispatchListeners$i, currentTarget);
9924						previousInstance = instance;
9925					}
9926					else for (i$jscomp$0 = 0; i$jscomp$0 < _dispatchQueue$i.length; i$jscomp$0++) {
9927						_dispatchListeners$i = _dispatchQueue$i[i$jscomp$0];
9928						instance = _dispatchListeners$i.instance;
9929						currentTarget = _dispatchListeners$i.currentTarget;
9930						_dispatchListeners$i = _dispatchListeners$i.listener;
9931						if (instance !== previousInstance && event.isPropagationStopped()) break a;
9932						null !== instance ? runWithFiberInDEV(instance, executeDispatch, event, _dispatchListeners$i, currentTarget) : executeDispatch(event, _dispatchListeners$i, currentTarget);
9933						previousInstance = instance;
9934					}
9935				}
9936			}
9937		}
9938		function listenToNonDelegatedEvent(domEventName, targetElement) {
9939			nonDelegatedEvents.has(domEventName) || console.error("Did not expect a listenToNonDelegatedEvent() call for \"%s\". This is a bug in React. Please file an issue.", domEventName);
9940			var listenerSet = targetElement[internalEventHandlersKey];
9941			void 0 === listenerSet && (listenerSet = targetElement[internalEventHandlersKey] = /* @__PURE__ */ new Set());
9942			var listenerSetKey = domEventName + "__bubble";
9943			listenerSet.has(listenerSetKey) || (addTrappedEventListener(targetElement, domEventName, 2, !1), listenerSet.add(listenerSetKey));
9944		}
9945		function listenToNativeEvent(domEventName, isCapturePhaseListener, target) {
9946			nonDelegatedEvents.has(domEventName) && !isCapturePhaseListener && console.error("Did not expect a listenToNativeEvent() call for \"%s\" in the bubble phase. This is a bug in React. Please file an issue.", domEventName);
9947			var eventSystemFlags = 0;
9948			isCapturePhaseListener && (eventSystemFlags |= 4);
9949			addTrappedEventListener(target, domEventName, eventSystemFlags, isCapturePhaseListener);
9950		}
9951		function listenToAllSupportedEvents(rootContainerElement) {
9952			if (!rootContainerElement[listeningMarker]) {
9953				rootContainerElement[listeningMarker] = !0;
9954				allNativeEvents.forEach(function(domEventName) {
9955					"selectionchange" !== domEventName && (nonDelegatedEvents.has(domEventName) || listenToNativeEvent(domEventName, !1, rootContainerElement), listenToNativeEvent(domEventName, !0, rootContainerElement));
9956				});
9957				var ownerDocument = 9 === rootContainerElement.nodeType ? rootContainerElement : rootContainerElement.ownerDocument;
9958				null === ownerDocument || ownerDocument[listeningMarker] || (ownerDocument[listeningMarker] = !0, listenToNativeEvent("selectionchange", !1, ownerDocument));
9959			}
9960		}
9961		function addTrappedEventListener(targetContainer, domEventName, eventSystemFlags, isCapturePhaseListener) {
9962			switch (getEventPriority(domEventName)) {
9963				case DiscreteEventPriority:
9964					var listenerWrapper = dispatchDiscreteEvent;
9965					break;
9966				case ContinuousEventPriority:
9967					listenerWrapper = dispatchContinuousEvent;
9968					break;
9969				default: listenerWrapper = dispatchEvent;
9970			}
9971			eventSystemFlags = listenerWrapper.bind(null, domEventName, eventSystemFlags, targetContainer);
9972			listenerWrapper = void 0;
9973			!passiveBrowserEventsSupported || "touchstart" !== domEventName && "touchmove" !== domEventName && "wheel" !== domEventName || (listenerWrapper = !0);
9974			isCapturePhaseListener ? void 0 !== listenerWrapper ? targetContainer.addEventListener(domEventName, eventSystemFlags, {
9975				capture: !0,
9976				passive: listenerWrapper
9977			}) : targetContainer.addEventListener(domEventName, eventSystemFlags, !0) : void 0 !== listenerWrapper ? targetContainer.addEventListener(domEventName, eventSystemFlags, { passive: listenerWrapper }) : targetContainer.addEventListener(domEventName, eventSystemFlags, !1);
9978		}
9979		function dispatchEventForPluginEventSystem(domEventName, eventSystemFlags, nativeEvent, targetInst$jscomp$0, targetContainer) {
9980			var ancestorInst = targetInst$jscomp$0;
9981			if (0 === (eventSystemFlags & 1) && 0 === (eventSystemFlags & 2) && null !== targetInst$jscomp$0) a: for (;;) {
9982				if (null === targetInst$jscomp$0) return;
9983				var nodeTag = targetInst$jscomp$0.tag;
9984				if (3 === nodeTag || 4 === nodeTag) {
9985					var container = targetInst$jscomp$0.stateNode.containerInfo;
9986					if (container === targetContainer) break;
9987					if (4 === nodeTag) for (nodeTag = targetInst$jscomp$0.return; null !== nodeTag;) {
9988						var grandTag = nodeTag.tag;
9989						if ((3 === grandTag || 4 === grandTag) && nodeTag.stateNode.containerInfo === targetContainer) return;
9990						nodeTag = nodeTag.return;
9991					}
9992					for (; null !== container;) {
9993						nodeTag = getClosestInstanceFromNode(container);
9994						if (null === nodeTag) return;
9995						grandTag = nodeTag.tag;
9996						if (5 === grandTag || 6 === grandTag || 26 === grandTag || 27 === grandTag) {
9997							targetInst$jscomp$0 = ancestorInst = nodeTag;
9998							continue a;
9999						}
10000						container = container.parentNode;
10001					}
10002				}
10003				targetInst$jscomp$0 = targetInst$jscomp$0.return;
10004			}
10005			batchedUpdates$1(function() {
10006				var targetInst = ancestorInst, nativeEventTarget = getEventTarget(nativeEvent), dispatchQueue = [];
10007				a: {
10008					var reactName = topLevelEventsToReactNames.get(domEventName);
10009					if (void 0 !== reactName) {
10010						var SyntheticEventCtor = SyntheticEvent, reactEventType = domEventName;
10011						switch (domEventName) {
10012							case "keypress": if (0 === getEventCharCode(nativeEvent)) break a;
10013							case "keydown":
10014							case "keyup":
10015								SyntheticEventCtor = SyntheticKeyboardEvent;
10016								break;
10017							case "focusin":
10018								reactEventType = "focus";
10019								SyntheticEventCtor = SyntheticFocusEvent;
10020								break;
10021							case "focusout":
10022								reactEventType = "blur";
10023								SyntheticEventCtor = SyntheticFocusEvent;
10024								break;
10025							case "beforeblur":
10026							case "afterblur":
10027								SyntheticEventCtor = SyntheticFocusEvent;
10028								break;
10029							case "click": if (2 === nativeEvent.button) break a;
10030							case "auxclick":
10031							case "dblclick":
10032							case "mousedown":
10033							case "mousemove":
10034							case "mouseup":
10035							case "mouseout":
10036							case "mouseover":
10037							case "contextmenu":
10038								SyntheticEventCtor = SyntheticMouseEvent;
10039								break;
10040							case "drag":
10041							case "dragend":
10042							case "dragenter":
10043							case "dragexit":
10044							case "dragleave":
10045							case "dragover":
10046							case "dragstart":
10047							case "drop":
10048								SyntheticEventCtor = SyntheticDragEvent;
10049								break;
10050							case "touchcancel":
10051							case "touchend":
10052							case "touchmove":
10053							case "touchstart":
10054								SyntheticEventCtor = SyntheticTouchEvent;
10055								break;
10056							case ANIMATION_END:
10057							case ANIMATION_ITERATION:
10058							case ANIMATION_START:
10059								SyntheticEventCtor = SyntheticAnimationEvent;
10060								break;
10061							case TRANSITION_END:
10062								SyntheticEventCtor = SyntheticTransitionEvent;
10063								break;
10064							case "scroll":
10065							case "scrollend":
10066								SyntheticEventCtor = SyntheticUIEvent;
10067								break;
10068							case "wheel":
10069								SyntheticEventCtor = SyntheticWheelEvent;
10070								break;
10071							case "copy":
10072							case "cut":
10073							case "paste":
10074								SyntheticEventCtor = SyntheticClipboardEvent;
10075								break;
10076							case "gotpointercapture":
10077							case "lostpointercapture":
10078							case "pointercancel":
10079							case "pointerdown":
10080							case "pointermove":
10081							case "pointerout":
10082							case "pointerover":
10083							case "pointerup":
10084								SyntheticEventCtor = SyntheticPointerEvent;
10085								break;
10086							case "submit":
10087								SyntheticEventCtor = SyntheticSubmitEvent;
10088								break;
10089							case "toggle":
10090							case "beforetoggle": SyntheticEventCtor = SyntheticToggleEvent;
10091						}
10092						var inCapturePhase = 0 !== (eventSystemFlags & 4), accumulateTargetOnly = !inCapturePhase && ("scroll" === domEventName || "scrollend" === domEventName), reactEventName = inCapturePhase ? null !== reactName ? reactName + "Capture" : null : reactName;
10093						inCapturePhase = [];
10094						for (var instance = targetInst, lastHostComponent; null !== instance;) {
10095							var _instance2 = instance;
10096							lastHostComponent = _instance2.stateNode;
10097							_instance2 = _instance2.tag;
10098							5 !== _instance2 && 26 !== _instance2 && 27 !== _instance2 || null === lastHostComponent || null === reactEventName || (_instance2 = getListener(instance, reactEventName), null != _instance2 && inCapturePhase.push(createDispatchListener(instance, _instance2, lastHostComponent)));
10099							if (accumulateTargetOnly) break;
10100							instance = instance.return;
10101						}
10102						0 < inCapturePhase.length && (reactName = new SyntheticEventCtor(reactName, reactEventType, null, nativeEvent, nativeEventTarget), dispatchQueue.push({
10103							event: reactName,
10104							listeners: inCapturePhase
10105						}));
10106					}
10107				}
10108				if (0 === (eventSystemFlags & 7)) {
10109					a: {
10110						SyntheticEventCtor = "mouseover" === domEventName || "pointerover" === domEventName;
10111						reactName = "mouseout" === domEventName || "pointerout" === domEventName;
10112						if (SyntheticEventCtor && nativeEvent !== currentReplayingEvent && (reactEventType = nativeEvent.relatedTarget || nativeEvent.fromElement) && (getClosestInstanceFromNode(reactEventType) || reactEventType[internalContainerInstanceKey])) break a;
10113						if (reactName || SyntheticEventCtor) {
10114							reactEventType = nativeEventTarget.window === nativeEventTarget ? nativeEventTarget : (SyntheticEventCtor = nativeEventTarget.ownerDocument) ? SyntheticEventCtor.defaultView || SyntheticEventCtor.parentWindow : window;
10115							if (reactName) {
10116								if (SyntheticEventCtor = nativeEvent.relatedTarget || nativeEvent.toElement, reactName = targetInst, SyntheticEventCtor = SyntheticEventCtor ? getClosestInstanceFromNode(SyntheticEventCtor) : null, null !== SyntheticEventCtor && (accumulateTargetOnly = getNearestMountedFiber(SyntheticEventCtor), inCapturePhase = SyntheticEventCtor.tag, SyntheticEventCtor !== accumulateTargetOnly || 5 !== inCapturePhase && 27 !== inCapturePhase && 6 !== inCapturePhase)) SyntheticEventCtor = null;
10117							} else reactName = null, SyntheticEventCtor = targetInst;
10118							if (reactName !== SyntheticEventCtor) {
10119								inCapturePhase = SyntheticMouseEvent;
10120								_instance2 = "onMouseLeave";
10121								reactEventName = "onMouseEnter";
10122								instance = "mouse";
10123								if ("pointerout" === domEventName || "pointerover" === domEventName) inCapturePhase = SyntheticPointerEvent, _instance2 = "onPointerLeave", reactEventName = "onPointerEnter", instance = "pointer";
10124								accumulateTargetOnly = null == reactName ? reactEventType : getNodeFromInstance(reactName);
10125								lastHostComponent = null == SyntheticEventCtor ? reactEventType : getNodeFromInstance(SyntheticEventCtor);
10126								reactEventType = new inCapturePhase(_instance2, instance + "leave", reactName, nativeEvent, nativeEventTarget);
10127								reactEventType.target = accumulateTargetOnly;
10128								reactEventType.relatedTarget = lastHostComponent;
10129								_instance2 = null;
10130								getClosestInstanceFromNode(nativeEventTarget) === targetInst && (inCapturePhase = new inCapturePhase(reactEventName, instance + "enter", SyntheticEventCtor, nativeEvent, nativeEventTarget), inCapturePhase.target = lastHostComponent, inCapturePhase.relatedTarget = accumulateTargetOnly, _instance2 = inCapturePhase);
10131								accumulateTargetOnly = _instance2;
10132								inCapturePhase = reactName && SyntheticEventCtor ? getLowestCommonAncestor(reactName, SyntheticEventCtor, getParent) : null;
10133								null !== reactName && accumulateEnterLeaveListenersForEvent(dispatchQueue, reactEventType, reactName, inCapturePhase, !1);
10134								null !== SyntheticEventCtor && null !== accumulateTargetOnly && accumulateEnterLeaveListenersForEvent(dispatchQueue, accumulateTargetOnly, SyntheticEventCtor, inCapturePhase, !0);
10135							}
10136						}
10137					}
10138					a: {
10139						reactName = targetInst ? getNodeFromInstance(targetInst) : window;
10140						SyntheticEventCtor = reactName.nodeName && reactName.nodeName.toLowerCase();
10141						if ("select" === SyntheticEventCtor || "input" === SyntheticEventCtor && "file" === reactName.type) var getTargetInstFunc = getTargetInstForChangeEvent;
10142						else if (isTextInputElement(reactName)) if (isInputEventSupported) getTargetInstFunc = getTargetInstForInputOrChangeEvent;
10143						else {
10144							getTargetInstFunc = getTargetInstForInputEventPolyfill;
10145							var handleEventFunc = handleEventsForInputEventPolyfill;
10146						}
10147						else SyntheticEventCtor = reactName.nodeName, !SyntheticEventCtor || "input" !== SyntheticEventCtor.toLowerCase() || "checkbox" !== reactName.type && "radio" !== reactName.type ? targetInst && isCustomElement(targetInst.elementType) && (getTargetInstFunc = getTargetInstForChangeEvent) : getTargetInstFunc = getTargetInstForClickEvent;
10148						if (getTargetInstFunc && (getTargetInstFunc = getTargetInstFunc(domEventName, targetInst))) {
10149							createAndAccumulateChangeEvent(dispatchQueue, getTargetInstFunc, nativeEvent, nativeEventTarget);
10150							break a;
10151						}
10152						handleEventFunc && handleEventFunc(domEventName, reactName, targetInst);
10153					}
10154					handleEventFunc = targetInst ? getNodeFromInstance(targetInst) : window;
10155					switch (domEventName) {
10156						case "focusin":
10157							if (isTextInputElement(handleEventFunc) || "true" === handleEventFunc.contentEditable) activeElement = handleEventFunc, activeElementInst = targetInst, lastSelection = null;
10158							break;
10159						case "focusout":
10160							lastSelection = activeElementInst = activeElement = null;
10161							break;
10162						case "mousedown":
10163							mouseDown = !0;
10164							break;
10165						case "contextmenu":
10166						case "mouseup":
10167						case "dragend":
10168							mouseDown = !1;
10169							constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget);
10170							break;
10171						case "selectionchange": if (skipSelectionChangeEvent) break;
10172						case "keydown":
10173						case "keyup": constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget);
10174					}
10175					var fallbackData;
10176					if (canUseCompositionEvent) b: {
10177						switch (domEventName) {
10178							case "compositionstart":
10179								var eventType = "onCompositionStart";
10180								break b;
10181							case "compositionend":
10182								eventType = "onCompositionEnd";
10183								break b;
10184							case "compositionupdate":
10185								eventType = "onCompositionUpdate";
10186								break b;
10187						}
10188						eventType = void 0;
10189					}
10190					else isComposing ? isFallbackCompositionEnd(domEventName, nativeEvent) && (eventType = "onCompositionEnd") : "keydown" === domEventName && nativeEvent.keyCode === START_KEYCODE && (eventType = "onCompositionStart");
10191					eventType && (useFallbackCompositionData && "ko" !== nativeEvent.locale && (isComposing || "onCompositionStart" !== eventType ? "onCompositionEnd" === eventType && isComposing && (fallbackData = getData()) : (root = nativeEventTarget, startText = "value" in root ? root.value : root.textContent, isComposing = !0)), handleEventFunc = accumulateTwoPhaseListeners(targetInst, eventType), 0 < handleEventFunc.length && (eventType = new SyntheticCompositionEvent(eventType, domEventName, null, nativeEvent, nativeEventTarget), dispatchQueue.push({
10192						event: eventType,
10193						listeners: handleEventFunc
10194					}), fallbackData ? eventType.data = fallbackData : (fallbackData = getDataFromCustomEvent(nativeEvent), null !== fallbackData && (eventType.data = fallbackData))));
10195					if (fallbackData = canUseTextInputEvent ? getNativeBeforeInputChars(domEventName, nativeEvent) : getFallbackBeforeInputChars(domEventName, nativeEvent)) eventType = accumulateTwoPhaseListeners(targetInst, "onBeforeInput"), 0 < eventType.length && (handleEventFunc = new SyntheticInputEvent("onBeforeInput", "beforeinput", null, nativeEvent, nativeEventTarget), dispatchQueue.push({
10196						event: handleEventFunc,
10197						listeners: eventType
10198					}), handleEventFunc.data = fallbackData);
10199					extractEvents$1(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget);
10200				}
10201				processDispatchQueue(dispatchQueue, eventSystemFlags);
10202			});
10203		}
10204		function createDispatchListener(instance, listener, currentTarget) {
10205			return {
10206				instance,
10207				listener,
10208				currentTarget
10209			};
10210		}
10211		function accumulateTwoPhaseListeners(targetFiber, reactName) {
10212			for (var captureName = reactName + "Capture", listeners = []; null !== targetFiber;) {
10213				var _instance3 = targetFiber, stateNode = _instance3.stateNode;
10214				_instance3 = _instance3.tag;
10215				5 !== _instance3 && 26 !== _instance3 && 27 !== _instance3 || null === stateNode || (_instance3 = getListener(targetFiber, captureName), null != _instance3 && listeners.unshift(createDispatchListener(targetFiber, _instance3, stateNode)), _instance3 = getListener(targetFiber, reactName), null != _instance3 && listeners.push(createDispatchListener(targetFiber, _instance3, stateNode)));
10216				if (3 === targetFiber.tag) return listeners;
10217				targetFiber = targetFiber.return;
10218			}
10219			return [];
10220		}
10221		function getParent(inst) {
10222			if (null === inst) return null;
10223			do
10224				inst = inst.return;
10225			while (inst && 5 !== inst.tag && 27 !== inst.tag);
10226			return inst ? inst : null;
10227		}
10228		function accumulateEnterLeaveListenersForEvent(dispatchQueue, event, target, common, inCapturePhase) {
10229			for (var registrationName = event._reactName, listeners = []; null !== target && target !== common;) {
10230				var _instance4 = target, alternate = _instance4.alternate, stateNode = _instance4.stateNode;
10231				_instance4 = _instance4.tag;
10232				if (null !== alternate && alternate === common) break;
10233				5 !== _instance4 && 26 !== _instance4 && 27 !== _instance4 || null === stateNode || (alternate = stateNode, inCapturePhase ? (stateNode = getListener(target, registrationName), null != stateNode && listeners.unshift(createDispatchListener(target, stateNode, alternate))) : inCapturePhase || (stateNode = getListener(target, registrationName), null != stateNode && listeners.push(createDispatchListener(target, stateNode, alternate))));
10234				target = target.return;
10235			}
10236			0 !== listeners.length && dispatchQueue.push({
10237				event,
10238				listeners
10239			});
10240		}
10241		function validatePropertiesInDevelopment(type, props) {
10242			validateProperties$2(type, props);
10243			"input" !== type && "textarea" !== type && "select" !== type || null == props || null !== props.value || didWarnValueNull || (didWarnValueNull = !0, "select" === type && props.multiple ? console.error("`value` prop on `%s` should not be null. Consider using an empty array when `multiple` is set to `true` to clear the component or `undefined` for uncontrolled components.", type) : console.error("`value` prop on `%s` should not be null. Consider using an empty string to clear the component or `undefined` for uncontrolled components.", type));
10244			var eventRegistry = {
10245				registrationNameDependencies,
10246				possibleRegistrationNames
10247			};
10248			isCustomElement(type) || "string" === typeof props.is || warnUnknownProperties(type, props, eventRegistry);
10249			props.contentEditable && !props.suppressContentEditableWarning && null != props.children && console.error("A component is `contentEditable` and contains `children` managed by React. It is now your responsibility to guarantee that none of those nodes are unexpectedly modified or duplicated. This is probably not intentional.");
10250		}
10251		function warnForPropDifference(propName, serverValue, clientValue, serverDifferences) {
10252			serverValue !== clientValue && (clientValue = normalizeMarkupForTextOrAttribute(clientValue), normalizeMarkupForTextOrAttribute(serverValue) !== clientValue && (serverDifferences[propName] = serverValue));
10253		}
10254		function hasViewTransition(htmlElement) {
10255			return !!(htmlElement.getAttribute("vt-share") || htmlElement.getAttribute("vt-exit") || htmlElement.getAttribute("vt-enter") || htmlElement.getAttribute("vt-update"));
10256		}
10257		function isExpectedViewTransitionName(htmlElement) {
10258			if (!hasViewTransition(htmlElement)) return !1;
10259			var expectedVtName = htmlElement.getAttribute("vt-name");
10260			htmlElement = htmlElement.style["view-transition-name"];
10261			return expectedVtName ? expectedVtName === htmlElement : htmlElement.startsWith("_T_");
10262		}
10263		function warnForExtraAttributes(domElement, attributeNames, serverDifferences) {
vendor: 11,643 bytes, lines 10264-10428
10264			attributeNames.forEach(function(attributeName) {
10265				"style" === attributeName ? "" !== domElement.getAttribute(attributeName) && (attributeName = domElement.style, (1 === attributeName.length && "view-transition-name" === attributeName[0] || 2 === attributeName.length && "view-transition-class" === attributeName[0] && "view-transition-name" === attributeName[1]) && isExpectedViewTransitionName(domElement) || (serverDifferences.style = getStylesObjectFromElement(domElement))) : serverDifferences[getPropNameFromAttributeName(attributeName)] = domElement.getAttribute(attributeName);
10266			});
10267		}
10268		function warnForInvalidEventListener(registrationName, listener) {
10269			!1 === listener ? console.error("Expected `%s` listener to be a function, instead got `false`.\n\nIf you used to conditionally omit it with %s={condition && value}, pass %s={condition ? value : undefined} instead.", registrationName, registrationName, registrationName) : console.error("Expected `%s` listener to be a function, instead got a value of `%s` type.", registrationName, typeof listener);
10270		}
10271		function normalizeHTML(parent, html) {
10272			parent = parent.namespaceURI === MATH_NAMESPACE || parent.namespaceURI === SVG_NAMESPACE ? parent.ownerDocument.createElementNS(parent.namespaceURI, parent.tagName) : parent.ownerDocument.createElement(parent.tagName);
10273			parent.innerHTML = html;
10274			return parent.innerHTML;
10275		}
10276		function normalizeMarkupForTextOrAttribute(markup) {
10277			willCoercionThrow(markup) && (console.error("The provided HTML markup uses a value of unsupported type %s. This value must be coerced to a string before using it here.", typeName(markup)), testStringCoercion(markup));
10278			return ("string" === typeof markup ? markup : "" + markup).replace(NORMALIZE_NEWLINES_REGEX, "\n").replace(NORMALIZE_NULL_AND_REPLACEMENT_REGEX, "");
10279		}
10280		function checkForUnmatchedText(serverText, clientText) {
10281			clientText = normalizeMarkupForTextOrAttribute(clientText);
10282			return normalizeMarkupForTextOrAttribute(serverText) === clientText ? !0 : !1;
10283		}
10284		function setProp(domElement, tag, key, value, props, prevValue) {
10285			switch (key) {
10286				case "children":
10287					if ("string" === typeof value) validateTextNesting(value, tag, !1), "body" === tag || "textarea" === tag && "" === value || setTextContent(domElement, value);
10288					else if ("number" === typeof value || "bigint" === typeof value) validateTextNesting("" + value, tag, !1), "body" !== tag && setTextContent(domElement, "" + value);
10289					else return;
10290					break;
10291				case "className":
10292					setValueForKnownAttribute(domElement, "class", value);
10293					break;
10294				case "tabIndex":
10295					setValueForKnownAttribute(domElement, "tabindex", value);
10296					break;
10297				case "dir":
10298				case "role":
10299				case "viewBox":
10300				case "width":
10301				case "height":
10302					setValueForKnownAttribute(domElement, key, value);
10303					break;
10304				case "style":
10305					setValueForStyles(domElement, value, prevValue);
10306					return;
10307				case "data": if ("object" !== tag) {
10308					setValueForKnownAttribute(domElement, "data", value);
10309					break;
10310				}
10311				case "src":
10312				case "href":
10313					if ("" === value && ("a" !== tag || "href" !== key)) {
10314						"src" === key ? console.error("An empty string (\"\") was passed to the %s attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to %s instead of an empty string.", key, key) : console.error("An empty string (\"\") was passed to the %s attribute. To fix this, either do not render the element at all or pass null to %s instead of an empty string.", key, key);
10315						domElement.removeAttribute(key);
10316						break;
10317					}
10318					if (null == value || "function" === typeof value || "symbol" === typeof value || "boolean" === typeof value) {
10319						domElement.removeAttribute(key);
10320						break;
10321					}
10322					checkAttributeStringCoercion(value, key);
10323					value = sanitizeURL(value);
10324					domElement.setAttribute(key, value);
10325					break;
10326				case "action":
10327				case "formAction":
10328					null != value && ("form" === tag ? "formAction" === key ? console.error("You can only pass the formAction prop to <input> or <button>. Use the action prop on <form>.") : "function" === typeof value && (null == props.encType && null == props.method || didWarnFormActionMethod || (didWarnFormActionMethod = !0, console.error("Cannot specify a encType or method for a form that specifies a function as the action. React provides those automatically. They will get overridden.")), null == props.target || didWarnFormActionTarget || (didWarnFormActionTarget = !0, console.error("Cannot specify a target for a form that specifies a function as the action. The function will always be executed in the same window."))) : "input" === tag || "button" === tag ? "action" === key ? console.error("You can only pass the action prop to <form>. Use the formAction prop on <input> or <button>.") : "input" !== tag || "submit" === props.type || "image" === props.type || didWarnFormActionType ? "button" !== tag || null == props.type || "submit" === props.type || didWarnFormActionType ? "function" === typeof value && (null == props.name || didWarnFormActionName || (didWarnFormActionName = !0, console.error("Cannot specify a \"name\" prop for a button that specifies a function as a formAction. React needs it to encode which action should be invoked. It will get overridden.")), null == props.formEncType && null == props.formMethod || didWarnFormActionMethod || (didWarnFormActionMethod = !0, console.error("Cannot specify a formEncType or formMethod for a button that specifies a function as a formAction. React provides those automatically. They will get overridden.")), null == props.formTarget || didWarnFormActionTarget || (didWarnFormActionTarget = !0, console.error("Cannot specify a formTarget for a button that specifies a function as a formAction. The function will always be executed in the same window."))) : (didWarnFormActionType = !0, console.error("A button can only specify a formAction along with type=\"submit\" or no type.")) : (didWarnFormActionType = !0, console.error("An input can only specify a formAction along with type=\"submit\" or type=\"image\".")) : "action" === key ? console.error("You can only pass the action prop to <form>.") : console.error("You can only pass the formAction prop to <input> or <button>."));
10329					if ("function" === typeof value) {
10330						domElement.setAttribute(key, "javascript:throw new Error('A React form was unexpectedly submitted. If you called form.submit() manually, consider using form.requestSubmit() instead. If you\\'re trying to use event.stopPropagation() in a submit event handler, consider also calling event.preventDefault().')");
10331						break;
10332					} else "function" === typeof prevValue && ("formAction" === key ? ("input" !== tag && setProp(domElement, tag, "name", props.name, props, null), setProp(domElement, tag, "formEncType", props.formEncType, props, null), setProp(domElement, tag, "formMethod", props.formMethod, props, null), setProp(domElement, tag, "formTarget", props.formTarget, props, null)) : (setProp(domElement, tag, "encType", props.encType, props, null), setProp(domElement, tag, "method", props.method, props, null), setProp(domElement, tag, "target", props.target, props, null)));
10333					if (null == value || "symbol" === typeof value || "boolean" === typeof value) {
10334						domElement.removeAttribute(key);
10335						break;
10336					}
10337					checkAttributeStringCoercion(value, key);
10338					value = sanitizeURL(value);
10339					domElement.setAttribute(key, value);
10340					break;
10341				case "onClick":
10342					null != value && ("function" !== typeof value && warnForInvalidEventListener(key, value), domElement.onclick = noop$1);
10343					return;
10344				case "onScroll":
10345					null != value && ("function" !== typeof value && warnForInvalidEventListener(key, value), listenToNonDelegatedEvent("scroll", domElement));
10346					return;
10347				case "onScrollEnd":
10348					null != value && ("function" !== typeof value && warnForInvalidEventListener(key, value), listenToNonDelegatedEvent("scrollend", domElement));
10349					return;
10350				case "dangerouslySetInnerHTML":
10351					if (null != value) {
10352						if ("object" !== typeof value || !("__html" in value)) throw Error("`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit https://react.dev/link/dangerously-set-inner-html for more information.");
10353						key = value.__html;
10354						if (null != key) {
10355							if (null != props.children) throw Error("Can only set one of `children` or `props.dangerouslySetInnerHTML`.");
10356							(null != prevValue ? prevValue.__html : void 0) !== key && (domElement.innerHTML = key);
10357						}
10358					}
10359					break;
10360				case "multiple":
10361					domElement.multiple = value && "function" !== typeof value && "symbol" !== typeof value;
10362					break;
10363				case "muted":
10364					domElement.muted = value && "function" !== typeof value && "symbol" !== typeof value;
10365					break;
10366				case "suppressContentEditableWarning":
10367				case "suppressHydrationWarning":
10368				case "defaultValue":
10369				case "defaultChecked":
10370				case "innerHTML":
10371				case "ref": break;
10372				case "autoFocus": break;
10373				case "xlinkHref":
10374					if (null == value || "function" === typeof value || "boolean" === typeof value || "symbol" === typeof value) {
10375						domElement.removeAttribute("xlink:href");
10376						break;
10377					}
10378					checkAttributeStringCoercion(value, key);
10379					key = sanitizeURL(value);
10380					domElement.setAttributeNS(xlinkNamespace, "xlink:href", key);
10381					break;
10382				case "contentEditable":
10383				case "spellCheck":
10384				case "draggable":
10385				case "value":
10386				case "autoReverse":
10387				case "externalResourcesRequired":
10388				case "focusable":
10389				case "preserveAlpha":
10390					null != value && "function" !== typeof value && "symbol" !== typeof value ? (checkAttributeStringCoercion(value, key), domElement.setAttribute(key, value)) : domElement.removeAttribute(key);
10391					break;
10392				case "inert": "" !== value || didWarnForNewBooleanPropsWithEmptyValue[key] || (didWarnForNewBooleanPropsWithEmptyValue[key] = !0, console.error("Received an empty string for a boolean attribute `%s`. This will treat the attribute as if it were false. Either pass `false` to silence this warning, or pass `true` if you used an empty string in earlier versions of React to indicate this attribute is true.", key));
10393				case "allowFullScreen":
10394				case "async":
10395				case "autoPlay":
10396				case "controls":
10397				case "credentialless":
10398				case "default":
10399				case "defer":
10400				case "disabled":
10401				case "disablePictureInPicture":
10402				case "disableRemotePlayback":
10403				case "formNoValidate":
10404				case "hidden":
10405				case "loop":
10406				case "noModule":
10407				case "noValidate":
10408				case "open":
10409				case "playsInline":
10410				case "readOnly":
10411				case "required":
10412				case "reversed":
10413				case "scoped":
10414				case "seamless":
10415				case "itemScope":
10416					value && "function" !== typeof value && "symbol" !== typeof value ? domElement.setAttribute(key, "") : domElement.removeAttribute(key);
10417					break;
10418				case "capture":
10419				case "download":
10420					!0 === value ? domElement.setAttribute(key, "") : !1 !== value && null != value && "function" !== typeof value && "symbol" !== typeof value ? (checkAttributeStringCoercion(value, key), domElement.setAttribute(key, value)) : domElement.removeAttribute(key);
10421					break;
10422				case "cols":
10423				case "rows":
10424				case "size":
10425				case "span":
10426					null != value && "function" !== typeof value && "symbol" !== typeof value && !isNaN(value) && 1 <= value ? (checkAttributeStringCoercion(value, key), domElement.setAttribute(key, value)) : domElement.removeAttribute(key);
10427					break;
10428				case "rowSpan":
10429				case "start":
10430					null == value || "function" === typeof value || "symbol" === typeof value || isNaN(value) ? domElement.removeAttribute(key) : (checkAttributeStringCoercion(value, key), domElement.setAttribute(key, value));
10431					break;
10432				case "popover":
10433					listenToNonDelegatedEvent("beforetoggle", domElement);
10434					listenToNonDelegatedEvent("toggle", domElement);
10435					setValueForAttribute(domElement, "popover", value);
10436					break;
10437				case "xlinkActuate":
10438					setValueForNamespacedAttribute(domElement, xlinkNamespace, "xlink:actuate", value);
10439					break;
10440				case "xlinkArcrole":
10441					setValueForNamespacedAttribute(domElement, xlinkNamespace, "xlink:arcrole", value);
10442					break;
10443				case "xlinkRole":
10444					setValueForNamespacedAttribute(domElement, xlinkNamespace, "xlink:role", value);
10445					break;
10446				case "xlinkShow":
10447					setValueForNamespacedAttribute(domElement, xlinkNamespace, "xlink:show", value);
10448					break;
10449				case "xlinkTitle":
10450					setValueForNamespacedAttribute(domElement, xlinkNamespace, "xlink:title", value);
10451					break;
10452				case "xlinkType":
10453					setValueForNamespacedAttribute(domElement, xlinkNamespace, "xlink:type", value);
10454					break;
10455				case "xmlBase":
10456					setValueForNamespacedAttribute(domElement, xmlNamespace, "xml:base", value);
10457					break;
10458				case "xmlLang":
10459					setValueForNamespacedAttribute(domElement, xmlNamespace, "xml:lang", value);
10460					break;
10461				case "xmlSpace":
10462					setValueForNamespacedAttribute(domElement, xmlNamespace, "xml:space", value);
10463					break;
10464				case "is":
10465					null != prevValue && console.error("Cannot update the \"is\" prop after it has been initialized.");
10466					setValueForAttribute(domElement, "is", value);
10467					break;
10468				case "innerText":
10469				case "textContent": return;
10470				case "popoverTarget": didWarnPopoverTargetObject || null == value || "object" !== typeof value || (didWarnPopoverTargetObject = !0, console.error("The `popoverTarget` prop expects the ID of an Element as a string. Received %s instead.", value));
10471				default: if (!(2 < key.length) || "o" !== key[0] && "O" !== key[0] || "n" !== key[1] && "N" !== key[1]) key = getAttributeAlias(key), setValueForAttribute(domElement, key, value);
10472				else {
10473					registrationNameDependencies.hasOwnProperty(key) && null != value && "function" !== typeof value && warnForInvalidEventListener(key, value);
10474					return;
10475				}
10476			}
10477			viewTransitionMutationContext = !0;
10478		}
10479		function setPropOnCustomElement(domElement, tag, key, value, props, prevValue) {
10480			switch (key) {
10481				case "style":
10482					setValueForStyles(domElement, value, prevValue);
10483					return;
10484				case "dangerouslySetInnerHTML":
10485					if (null != value) {
10486						if ("object" !== typeof value || !("__html" in value)) throw Error("`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit https://react.dev/link/dangerously-set-inner-html for more information.");
10487						key = value.__html;
10488						if (null != key) {
10489							if (null != props.children) throw Error("Can only set one of `children` or `props.dangerouslySetInnerHTML`.");
10490							(null != prevValue ? prevValue.__html : void 0) !== key && (domElement.innerHTML = key);
10491						}
10492					}
10493					break;
10494				case "children":
10495					if ("string" === typeof value) setTextContent(domElement, value);
10496					else if ("number" === typeof value || "bigint" === typeof value) setTextContent(domElement, "" + value);
10497					else return;
10498					break;
10499				case "onScroll":
10500					null != value && ("function" !== typeof value && warnForInvalidEventListener(key, value), listenToNonDelegatedEvent("scroll", domElement));
10501					return;
10502				case "onScrollEnd":
10503					null != value && ("function" !== typeof value && warnForInvalidEventListener(key, value), listenToNonDelegatedEvent("scrollend", domElement));
10504					return;
10505				case "onClick":
10506					null != value && ("function" !== typeof value && warnForInvalidEventListener(key, value), domElement.onclick = noop$1);
10507					return;
10508				case "suppressContentEditableWarning":
10509				case "suppressHydrationWarning":
10510				case "innerHTML":
10511				case "ref": return;
10512				case "innerText":
10513				case "textContent": return;
10514				default:
10515					if (registrationNameDependencies.hasOwnProperty(key)) null != value && "function" !== typeof value && warnForInvalidEventListener(key, value);
10516					else a: {
10517						if ("o" === key[0] && "n" === key[1] && (props = key.endsWith("Capture"), prevValue = key.slice(2, props ? key.length - 7 : void 0), tag = domElement[internalPropsKey] || null, tag = null != tag ? tag[key] : null, "function" === typeof tag && domElement.removeEventListener(prevValue, tag, props), "function" === typeof value)) {
10518							"function" !== typeof tag && null !== tag && (key in domElement ? domElement[key] = null : domElement.hasAttribute(key) && domElement.removeAttribute(key));
10519							domElement.addEventListener(prevValue, value, props);
10520							break a;
10521						}
10522						viewTransitionMutationContext = !0;
10523						key in domElement ? domElement[key] = value : !0 === value ? domElement.setAttribute(key, "") : setValueForAttribute(domElement, key, value);
10524					}
10525					return;
10526			}
10527			viewTransitionMutationContext = !0;
10528		}
10529		function setInitialProperties(domElement, tag, props) {
10530			validatePropertiesInDevelopment(tag, props);
10531			switch (tag) {
10532				case "div":
10533				case "span":
vendor: 4,769 bytes, lines 10534-10657
10534				case "svg":
10535				case "path":
10536				case "a":
10537				case "g":
10538				case "p":
10539				case "li": break;
10540				case "img":
10541					listenToNonDelegatedEvent("error", domElement);
10542					listenToNonDelegatedEvent("load", domElement);
10543					var hasSrc = !1, hasSrcSet = !1, propKey;
10544					for (propKey in props) if (props.hasOwnProperty(propKey)) {
10545						var propValue = props[propKey];
10546						if (null != propValue) switch (propKey) {
10547							case "src":
10548								hasSrc = !0;
10549								break;
10550							case "srcSet":
10551								hasSrcSet = !0;
10552								break;
10553							case "children":
10554							case "dangerouslySetInnerHTML": throw Error(tag + " is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`.");
10555							default: setProp(domElement, tag, propKey, propValue, props, null);
10556						}
10557					}
10558					hasSrcSet && setProp(domElement, tag, "srcSet", props.srcSet, props, null);
10559					hasSrc && setProp(domElement, tag, "src", props.src, props, null);
10560					return;
10561				case "input":
10562					checkControlledValueProps("input", props);
10563					listenToNonDelegatedEvent("invalid", domElement);
10564					var defaultValue = propKey = propValue = hasSrcSet = null, checked = null, defaultChecked = null;
10565					for (hasSrc in props) if (props.hasOwnProperty(hasSrc)) {
10566						var _propValue = props[hasSrc];
10567						if (null != _propValue) switch (hasSrc) {
10568							case "name":
10569								hasSrcSet = _propValue;
10570								break;
10571							case "type":
10572								propValue = _propValue;
10573								break;
10574							case "checked":
10575								checked = _propValue;
10576								break;
10577							case "defaultChecked":
10578								defaultChecked = _propValue;
10579								break;
10580							case "value":
10581								propKey = _propValue;
10582								break;
10583							case "defaultValue":
10584								defaultValue = _propValue;
10585								break;
10586							case "children":
10587							case "dangerouslySetInnerHTML":
10588								if (null != _propValue) throw Error(tag + " is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`.");
10589								break;
10590							default: setProp(domElement, tag, hasSrc, _propValue, props, null);
10591						}
10592					}
10593					validateInputProps(domElement, props);
10594					initInput(domElement, propKey, defaultValue, checked, defaultChecked, propValue, hasSrcSet, !1);
10595					return;
10596				case "select":
10597					checkControlledValueProps("select", props);
10598					listenToNonDelegatedEvent("invalid", domElement);
10599					hasSrc = propValue = propKey = null;
10600					for (hasSrcSet in props) if (props.hasOwnProperty(hasSrcSet) && (defaultValue = props[hasSrcSet], null != defaultValue)) switch (hasSrcSet) {
10601						case "value":
10602							propKey = defaultValue;
10603							break;
10604						case "defaultValue":
10605							propValue = defaultValue;
10606							break;
10607						case "multiple": hasSrc = defaultValue;
10608						default: setProp(domElement, tag, hasSrcSet, defaultValue, props, null);
10609					}
10610					validateSelectProps(domElement, props);
10611					tag = propKey;
10612					props = propValue;
10613					domElement.multiple = !!hasSrc;
10614					null != tag ? updateOptions(domElement, !!hasSrc, tag, !1) : null != props && updateOptions(domElement, !!hasSrc, props, !0);
10615					return;
10616				case "textarea":
10617					checkControlledValueProps("textarea", props);
10618					listenToNonDelegatedEvent("invalid", domElement);
10619					propKey = hasSrcSet = hasSrc = null;
10620					for (propValue in props) if (props.hasOwnProperty(propValue) && (defaultValue = props[propValue], null != defaultValue)) switch (propValue) {
10621						case "value":
10622							hasSrc = defaultValue;
10623							break;
10624						case "defaultValue":
10625							hasSrcSet = defaultValue;
10626							break;
10627						case "children":
10628							propKey = defaultValue;
10629							break;
10630						case "dangerouslySetInnerHTML":
10631							if (null != defaultValue) throw Error("`dangerouslySetInnerHTML` does not make sense on <textarea>.");
10632							break;
10633						default: setProp(domElement, tag, propValue, defaultValue, props, null);
10634					}
10635					validateTextareaProps(domElement, props);
10636					initTextarea(domElement, hasSrc, hasSrcSet, propKey);
10637					return;
10638				case "option":
10639					validateOptionProps(domElement, props);
10640					for (checked in props) if (props.hasOwnProperty(checked) && (hasSrc = props[checked], null != hasSrc)) switch (checked) {
10641						case "selected":
10642							domElement.selected = hasSrc && "function" !== typeof hasSrc && "symbol" !== typeof hasSrc;
10643							break;
10644						default: setProp(domElement, tag, checked, hasSrc, props, null);
10645					}
10646					return;
10647				case "dialog":
10648					listenToNonDelegatedEvent("beforetoggle", domElement);
10649					listenToNonDelegatedEvent("toggle", domElement);
10650					listenToNonDelegatedEvent("cancel", domElement);
10651					listenToNonDelegatedEvent("close", domElement);
10652					break;
10653				case "iframe":
10654				case "object":
10655					listenToNonDelegatedEvent("load", domElement);
10656					break;
10657				case "video":
vendor: 7,246 bytes, lines 10658-10795
10658				case "audio":
10659					for (hasSrc = 0; hasSrc < mediaEventTypes.length; hasSrc++) listenToNonDelegatedEvent(mediaEventTypes[hasSrc], domElement);
10660					break;
10661				case "image":
10662					listenToNonDelegatedEvent("error", domElement);
10663					listenToNonDelegatedEvent("load", domElement);
10664					break;
10665				case "details":
10666					listenToNonDelegatedEvent("toggle", domElement);
10667					break;
10668				case "embed":
10669				case "source":
10670				case "link": listenToNonDelegatedEvent("error", domElement), listenToNonDelegatedEvent("load", domElement);
10671				case "area":
10672				case "base":
10673				case "br":
10674				case "col":
10675				case "hr":
10676				case "keygen":
10677				case "meta":
10678				case "param":
10679				case "track":
10680				case "wbr":
10681				case "menuitem":
10682					for (defaultChecked in props) if (props.hasOwnProperty(defaultChecked) && (hasSrc = props[defaultChecked], null != hasSrc)) switch (defaultChecked) {
10683						case "children":
10684						case "dangerouslySetInnerHTML": throw Error(tag + " is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`.");
10685						default: setProp(domElement, tag, defaultChecked, hasSrc, props, null);
10686					}
10687					return;
10688				default: if (isCustomElement(tag)) {
10689					for (_propValue in props) props.hasOwnProperty(_propValue) && (hasSrc = props[_propValue], void 0 !== hasSrc && setPropOnCustomElement(domElement, tag, _propValue, hasSrc, props, void 0));
10690					return;
10691				}
10692			}
10693			for (defaultValue in props) props.hasOwnProperty(defaultValue) && (hasSrc = props[defaultValue], null != hasSrc && setProp(domElement, tag, defaultValue, hasSrc, props, null));
10694		}
10695		function updateProperties(domElement, tag, lastProps, nextProps) {
10696			validatePropertiesInDevelopment(tag, nextProps);
10697			switch (tag) {
10698				case "div":
10699				case "span":
10700				case "svg":
10701				case "path":
10702				case "a":
10703				case "g":
10704				case "p":
10705				case "li": break;
10706				case "input":
10707					var name = null, type = null, value = null, defaultValue = null, lastDefaultValue = null, checked = null, defaultChecked = null;
10708					for (propKey in lastProps) {
10709						var lastProp = lastProps[propKey];
10710						if (lastProps.hasOwnProperty(propKey) && null != lastProp) switch (propKey) {
10711							case "checked": break;
10712							case "value": break;
10713							case "defaultValue": lastDefaultValue = lastProp;
10714							default: nextProps.hasOwnProperty(propKey) || setProp(domElement, tag, propKey, null, nextProps, lastProp);
10715						}
10716					}
10717					for (var _propKey8 in nextProps) {
10718						var propKey = nextProps[_propKey8];
10719						lastProp = lastProps[_propKey8];
10720						if (nextProps.hasOwnProperty(_propKey8) && (null != propKey || null != lastProp)) switch (_propKey8) {
10721							case "type":
10722								propKey !== lastProp && (viewTransitionMutationContext = !0);
10723								type = propKey;
10724								break;
10725							case "name":
10726								propKey !== lastProp && (viewTransitionMutationContext = !0);
10727								name = propKey;
10728								break;
10729							case "checked":
10730								propKey !== lastProp && (viewTransitionMutationContext = !0);
10731								checked = propKey;
10732								break;
10733							case "defaultChecked":
10734								propKey !== lastProp && (viewTransitionMutationContext = !0);
10735								defaultChecked = propKey;
10736								break;
10737							case "value":
10738								propKey !== lastProp && (viewTransitionMutationContext = !0);
10739								value = propKey;
10740								break;
10741							case "defaultValue":
10742								propKey !== lastProp && (viewTransitionMutationContext = !0);
10743								defaultValue = propKey;
10744								break;
10745							case "children":
10746							case "dangerouslySetInnerHTML":
10747								if (null != propKey) throw Error(tag + " is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`.");
10748								break;
10749							default: propKey !== lastProp && setProp(domElement, tag, _propKey8, propKey, nextProps, lastProp);
10750						}
10751					}
10752					tag = "checkbox" === lastProps.type || "radio" === lastProps.type ? null != lastProps.checked : null != lastProps.value;
10753					nextProps = "checkbox" === nextProps.type || "radio" === nextProps.type ? null != nextProps.checked : null != nextProps.value;
10754					tag || !nextProps || didWarnUncontrolledToControlled || (console.error("A component is changing an uncontrolled input to be controlled. This is likely caused by the value changing from undefined to a defined value, which should not happen. Decide between using a controlled or uncontrolled input element for the lifetime of the component. More info: https://react.dev/link/controlled-components"), didWarnUncontrolledToControlled = !0);
10755					!tag || nextProps || didWarnControlledToUncontrolled || (console.error("A component is changing a controlled input to be uncontrolled. This is likely caused by the value changing from a defined to undefined, which should not happen. Decide between using a controlled or uncontrolled input element for the lifetime of the component. More info: https://react.dev/link/controlled-components"), didWarnControlledToUncontrolled = !0);
10756					updateInput(domElement, value, defaultValue, lastDefaultValue, checked, defaultChecked, type, name);
10757					return;
10758				case "select":
10759					propKey = value = defaultValue = _propKey8 = null;
10760					for (type in lastProps) if (lastDefaultValue = lastProps[type], lastProps.hasOwnProperty(type) && null != lastDefaultValue) switch (type) {
10761						case "value": break;
10762						case "multiple": propKey = lastDefaultValue;
10763						default: nextProps.hasOwnProperty(type) || setProp(domElement, tag, type, null, nextProps, lastDefaultValue);
10764					}
10765					for (name in nextProps) if (type = nextProps[name], lastDefaultValue = lastProps[name], nextProps.hasOwnProperty(name) && (null != type || null != lastDefaultValue)) switch (name) {
10766						case "value":
10767							type !== lastDefaultValue && (viewTransitionMutationContext = !0);
10768							_propKey8 = type;
10769							break;
10770						case "defaultValue":
10771							type !== lastDefaultValue && (viewTransitionMutationContext = !0);
10772							defaultValue = type;
10773							break;
10774						case "multiple": type !== lastDefaultValue && (viewTransitionMutationContext = !0), value = type;
10775						default: type !== lastDefaultValue && setProp(domElement, tag, name, type, nextProps, lastDefaultValue);
10776					}
10777					nextProps = defaultValue;
10778					tag = value;
10779					lastProps = propKey;
10780					null != _propKey8 ? updateOptions(domElement, !!tag, _propKey8, !1) : !!lastProps !== !!tag && (null != nextProps ? updateOptions(domElement, !!tag, nextProps, !0) : updateOptions(domElement, !!tag, tag ? [] : "", !1));
10781					return;
10782				case "textarea":
10783					propKey = _propKey8 = null;
10784					for (defaultValue in lastProps) if (name = lastProps[defaultValue], lastProps.hasOwnProperty(defaultValue) && null != name && !nextProps.hasOwnProperty(defaultValue)) switch (defaultValue) {
10785						case "value": break;
10786						case "children": break;
10787						default: setProp(domElement, tag, defaultValue, null, nextProps, name);
10788					}
10789					for (value in nextProps) if (name = nextProps[value], type = lastProps[value], nextProps.hasOwnProperty(value) && (null != name || null != type)) switch (value) {
10790						case "value":
10791							name !== type && (viewTransitionMutationContext = !0);
10792							_propKey8 = name;
10793							break;
10794						case "defaultValue":
10795							name !== type && (viewTransitionMutationContext = !0);
10796							propKey = name;
10797							break;
10798						case "children": break;
10799						case "dangerouslySetInnerHTML":
10800							if (null != name) throw Error("`dangerouslySetInnerHTML` does not make sense on <textarea>.");
10801							break;
10802						default: name !== type && setProp(domElement, tag, value, name, nextProps, type);
10803					}
10804					updateTextarea(domElement, _propKey8, propKey);
10805					return;
10806				case "option":
10807					for (var _propKey13 in lastProps) if (_propKey8 = lastProps[_propKey13], lastProps.hasOwnProperty(_propKey13) && null != _propKey8 && !nextProps.hasOwnProperty(_propKey13)) switch (_propKey13) {
10808						case "selected":
10809							domElement.selected = !1;
10810							break;
10811						default: setProp(domElement, tag, _propKey13, null, nextProps, _propKey8);
10812					}
10813					for (lastDefaultValue in nextProps) if (_propKey8 = nextProps[lastDefaultValue], propKey = lastProps[lastDefaultValue], nextProps.hasOwnProperty(lastDefaultValue) && _propKey8 !== propKey && (null != _propKey8 || null != propKey)) switch (lastDefaultValue) {
10814						case "selected":
10815							_propKey8 !== propKey && (viewTransitionMutationContext = !0);
10816							domElement.selected = _propKey8 && "function" !== typeof _propKey8 && "symbol" !== typeof _propKey8;
10817							break;
10818						default: setProp(domElement, tag, lastDefaultValue, _propKey8, nextProps, propKey);
10819					}
10820					return;
10821				case "img":
10822				case "link":
10823				case "area":
10824				case "base":
10825				case "br":
10826				case "col":
10827				case "embed":
10828				case "hr":
10829				case "keygen":
10830				case "meta":
10831				case "param":
10832				case "source":
10833				case "track":
10834				case "wbr":
10835				case "menuitem":
10836					for (var _propKey15 in lastProps) _propKey8 = lastProps[_propKey15], lastProps.hasOwnProperty(_propKey15) && null != _propKey8 && !nextProps.hasOwnProperty(_propKey15) && setProp(domElement, tag, _propKey15, null, nextProps, _propKey8);
10837					for (checked in nextProps) if (_propKey8 = nextProps[checked], propKey = lastProps[checked], nextProps.hasOwnProperty(checked) && _propKey8 !== propKey && (null != _propKey8 || null != propKey)) switch (checked) {
10838						case "children":
10839						case "dangerouslySetInnerHTML":
10840							if (null != _propKey8) throw Error(tag + " is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`.");
10841							break;
10842						default: setProp(domElement, tag, checked, _propKey8, nextProps, propKey);
10843					}
10844					return;
10845				default: if (isCustomElement(tag)) {
10846					for (var _propKey17 in lastProps) _propKey8 = lastProps[_propKey17], lastProps.hasOwnProperty(_propKey17) && void 0 !== _propKey8 && !nextProps.hasOwnProperty(_propKey17) && setPropOnCustomElement(domElement, tag, _propKey17, void 0, nextProps, _propKey8);
10847					for (defaultChecked in nextProps) _propKey8 = nextProps[defaultChecked], propKey = lastProps[defaultChecked], !nextProps.hasOwnProperty(defaultChecked) || _propKey8 === propKey || void 0 === _propKey8 && void 0 === propKey || setPropOnCustomElement(domElement, tag, defaultChecked, _propKey8, nextProps, propKey);
10848					return;
10849				}
10850			}
10851			for (var _propKey19 in lastProps) _propKey8 = lastProps[_propKey19], lastProps.hasOwnProperty(_propKey19) && null != _propKey8 && !nextProps.hasOwnProperty(_propKey19) && setProp(domElement, tag, _propKey19, null, nextProps, _propKey8);
10852			for (lastProp in nextProps) _propKey8 = nextProps[lastProp], propKey = lastProps[lastProp], !nextProps.hasOwnProperty(lastProp) || _propKey8 === propKey || null == _propKey8 && null == propKey || setProp(domElement, tag, lastProp, _propKey8, nextProps, propKey);
10853		}
10854		function getPropNameFromAttributeName(attrName) {
10855			switch (attrName) {
10856				case "class": return "className";
10857				case "for": return "htmlFor";
10858				default: return attrName;
10859			}
10860		}
10861		function getStylesObjectFromElement(domElement) {
10862			for (var serverValueInObjectForm = {}, style = domElement.style, i = 0; i < style.length; i++) {
10863				var styleName = style[i];
10864				"view-transition-name" === styleName && isExpectedViewTransitionName(domElement) || (serverValueInObjectForm[styleName] = style.getPropertyValue(styleName));
10865			}
10866			return serverValueInObjectForm;
10867		}
10868		function diffHydratedStyles(domElement, value$jscomp$0, serverDifferences) {
10869			if (null != value$jscomp$0 && "object" !== typeof value$jscomp$0) console.error("The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + 'em'}} when using JSX.");
10870			else {
10871				var clientValue;
10872				var delimiter = clientValue = "", styleName;
10873				for (styleName in value$jscomp$0) if (value$jscomp$0.hasOwnProperty(styleName)) {
10874					var value = value$jscomp$0[styleName];
10875					null != value && "boolean" !== typeof value && "" !== value && (0 === styleName.indexOf("--") ? (checkCSSPropertyStringCoercion(value, styleName), clientValue += delimiter + styleName + ":" + ("" + value).trim()) : "number" !== typeof value || 0 === value || unitlessNumbers.has(styleName) ? (checkCSSPropertyStringCoercion(value, styleName), clientValue += delimiter + styleName.replace(uppercasePattern, "-$1").toLowerCase().replace(msPattern$1, "-ms-") + ":" + ("" + value).trim()) : clientValue += delimiter + styleName.replace(uppercasePattern, "-$1").toLowerCase().replace(msPattern$1, "-ms-") + ":" + value + "px", delimiter = ";");
10876				}
10877				clientValue = clientValue || null;
10878				value$jscomp$0 = domElement.getAttribute("style");
10879				value$jscomp$0 !== clientValue && (clientValue = normalizeMarkupForTextOrAttribute(clientValue), value$jscomp$0 = normalizeMarkupForTextOrAttribute(value$jscomp$0), value$jscomp$0 === clientValue || ";" === value$jscomp$0[value$jscomp$0.length - 1] && hasViewTransition(domElement) || (serverDifferences.style = getStylesObjectFromElement(domElement)));
10880			}
10881		}
10882		function hydrateAttribute(domElement, propKey, attributeName, value, extraAttributes, serverDifferences) {
10883			extraAttributes.delete(attributeName);
10884			domElement = domElement.getAttribute(attributeName);
10885			if (null === domElement) switch (typeof value) {
10886				case "undefined":
vendor: 10,623 bytes, lines 10887-11124
10887				case "function":
10888				case "symbol":
10889				case "boolean": return;
10890			}
10891			else if (null != value) switch (typeof value) {
10892				case "function":
10893				case "symbol":
10894				case "boolean": break;
10895				default: if (checkAttributeStringCoercion(value, propKey), domElement === "" + value) return;
10896			}
10897			warnForPropDifference(propKey, domElement, value, serverDifferences);
10898		}
10899		function hydrateBooleanAttribute(domElement, propKey, attributeName, value, extraAttributes, serverDifferences) {
10900			extraAttributes.delete(attributeName);
10901			domElement = domElement.getAttribute(attributeName);
10902			if (null === domElement) {
10903				switch (typeof value) {
10904					case "function":
10905					case "symbol": return;
10906				}
10907				if (!value) return;
10908			} else switch (typeof value) {
10909				case "function":
10910				case "symbol": break;
10911				default: if (value) return;
10912			}
10913			warnForPropDifference(propKey, domElement, value, serverDifferences);
10914		}
10915		function hydrateBooleanishAttribute(domElement, propKey, attributeName, value, extraAttributes, serverDifferences) {
10916			extraAttributes.delete(attributeName);
10917			domElement = domElement.getAttribute(attributeName);
10918			if (null === domElement) switch (typeof value) {
10919				case "undefined":
10920				case "function":
10921				case "symbol": return;
10922			}
10923			else if (null != value) switch (typeof value) {
10924				case "function":
10925				case "symbol": break;
10926				default: if (checkAttributeStringCoercion(value, attributeName), domElement === "" + value) return;
10927			}
10928			warnForPropDifference(propKey, domElement, value, serverDifferences);
10929		}
10930		function hydrateNumericAttribute(domElement, propKey, attributeName, value, extraAttributes, serverDifferences) {
10931			extraAttributes.delete(attributeName);
10932			domElement = domElement.getAttribute(attributeName);
10933			if (null === domElement) switch (typeof value) {
10934				case "undefined":
10935				case "function":
10936				case "symbol":
10937				case "boolean": return;
10938				default: if (isNaN(value)) return;
10939			}
10940			else if (null != value) switch (typeof value) {
10941				case "function":
10942				case "symbol":
10943				case "boolean": break;
10944				default: if (!isNaN(value) && (checkAttributeStringCoercion(value, propKey), domElement === "" + value)) return;
10945			}
10946			warnForPropDifference(propKey, domElement, value, serverDifferences);
10947		}
10948		function hydrateSanitizedAttribute(domElement, propKey, attributeName, value, extraAttributes, serverDifferences) {
10949			extraAttributes.delete(attributeName);
10950			domElement = domElement.getAttribute(attributeName);
10951			if (null === domElement) switch (typeof value) {
10952				case "undefined":
10953				case "function":
10954				case "symbol":
10955				case "boolean": return;
10956			}
10957			else if (null != value) switch (typeof value) {
10958				case "function":
10959				case "symbol":
10960				case "boolean": break;
10961				default: if (checkAttributeStringCoercion(value, propKey), attributeName = sanitizeURL("" + value), domElement === attributeName) return;
10962			}
10963			warnForPropDifference(propKey, domElement, value, serverDifferences);
10964		}
10965		function diffHydratedProperties(domElement, tag, props, hostContext) {
10966			for (var serverDifferences = {}, extraAttributes = /* @__PURE__ */ new Set(), attributes = domElement.attributes, i = 0; i < attributes.length; i++) switch (attributes[i].name.toLowerCase()) {
10967				case "value": break;
10968				case "checked": break;
10969				case "selected": break;
10970				case "vt-name":
10971				case "vt-update":
10972				case "vt-enter":
10973				case "vt-exit":
10974				case "vt-share":
10975				case "vt-parent-enter":
10976				case "vt-parent-exit": break;
10977				default: extraAttributes.add(attributes[i].name);
10978			}
10979			if (isCustomElement(tag)) {
10980				for (var propKey in props) if (props.hasOwnProperty(propKey)) {
10981					var value = props[propKey];
10982					if (null != value) {
10983						if (registrationNameDependencies.hasOwnProperty(propKey)) "function" !== typeof value && warnForInvalidEventListener(propKey, value);
10984						else if (!0 !== props.suppressHydrationWarning) switch (propKey) {
10985							case "children":
10986								"string" !== typeof value && "number" !== typeof value || warnForPropDifference("children", domElement.textContent, value, serverDifferences);
10987								continue;
10988							case "suppressContentEditableWarning":
10989							case "suppressHydrationWarning":
10990							case "defaultValue":
10991							case "defaultChecked":
10992							case "innerHTML":
10993							case "ref": continue;
10994							case "dangerouslySetInnerHTML":
10995								attributes = domElement.innerHTML;
10996								value = value ? value.__html : void 0;
10997								null != value && (value = normalizeHTML(domElement, value), warnForPropDifference(propKey, attributes, value, serverDifferences));
10998								continue;
10999							case "style":
11000								extraAttributes.delete(propKey);
11001								diffHydratedStyles(domElement, value, serverDifferences);
11002								continue;
11003							case "offsetParent":
11004							case "offsetTop":
11005							case "offsetLeft":
11006							case "offsetWidth":
11007							case "offsetHeight":
11008							case "isContentEditable":
11009							case "outerText":
11010							case "outerHTML":
11011								extraAttributes.delete(propKey.toLowerCase());
11012								console.error("Assignment to read-only property will result in a no-op: `%s`", propKey);
11013								continue;
11014							case "className":
11015								extraAttributes.delete("class");
11016								attributes = getValueForAttributeOnCustomComponent(domElement, "class", value);
11017								warnForPropDifference("className", attributes, value, serverDifferences);
11018								continue;
11019							default: hostContext.context === HostContextNamespaceNone && "svg" !== tag && "math" !== tag ? extraAttributes.delete(propKey.toLowerCase()) : extraAttributes.delete(propKey), attributes = getValueForAttributeOnCustomComponent(domElement, propKey, value), warnForPropDifference(propKey, attributes, value, serverDifferences);
11020						}
11021					}
11022				}
11023			} else for (value in props) if (props.hasOwnProperty(value) && (propKey = props[value], null != propKey)) {
11024				if (registrationNameDependencies.hasOwnProperty(value)) "function" !== typeof propKey && warnForInvalidEventListener(value, propKey);
11025				else if (!0 !== props.suppressHydrationWarning) switch (value) {
11026					case "children":
11027						"string" !== typeof propKey && "number" !== typeof propKey || warnForPropDifference("children", domElement.textContent, propKey, serverDifferences);
11028						continue;
11029					case "suppressContentEditableWarning":
11030					case "suppressHydrationWarning":
11031					case "value":
11032					case "checked":
11033					case "selected":
11034					case "defaultValue":
11035					case "defaultChecked":
11036					case "innerHTML":
11037					case "ref": continue;
11038					case "dangerouslySetInnerHTML":
11039						attributes = domElement.innerHTML;
11040						propKey = propKey ? propKey.__html : void 0;
11041						null != propKey && (propKey = normalizeHTML(domElement, propKey), attributes !== propKey && (serverDifferences[value] = { __html: attributes }));
11042						continue;
11043					case "className":
11044						hydrateAttribute(domElement, value, "class", propKey, extraAttributes, serverDifferences);
11045						continue;
11046					case "tabIndex":
11047						hydrateAttribute(domElement, value, "tabindex", propKey, extraAttributes, serverDifferences);
11048						continue;
11049					case "style":
11050						extraAttributes.delete(value);
11051						diffHydratedStyles(domElement, propKey, serverDifferences);
11052						continue;
11053					case "multiple":
11054						extraAttributes.delete(value);
11055						warnForPropDifference(value, domElement.multiple, propKey, serverDifferences);
11056						continue;
11057					case "muted":
11058						extraAttributes.delete(value);
11059						warnForPropDifference(value, domElement.muted, propKey, serverDifferences);
11060						continue;
11061					case "autoFocus":
11062						extraAttributes.delete("autofocus");
11063						warnForPropDifference(value, domElement.autofocus, propKey, serverDifferences);
11064						continue;
11065					case "data": if ("object" !== tag) {
11066						extraAttributes.delete(value);
11067						attributes = domElement.getAttribute("data");
11068						warnForPropDifference(value, attributes, propKey, serverDifferences);
11069						continue;
11070					}
11071					case "src":
11072					case "href":
11073						if (!("" !== propKey || "a" === tag && "href" === value || "object" === tag && "data" === value)) {
11074							"src" === value ? console.error("An empty string (\"\") was passed to the %s attribute. This may cause the browser to download the whole page again over the network. To fix this, either do not render the element at all or pass null to %s instead of an empty string.", value, value) : console.error("An empty string (\"\") was passed to the %s attribute. To fix this, either do not render the element at all or pass null to %s instead of an empty string.", value, value);
11075							continue;
11076						}
11077						hydrateSanitizedAttribute(domElement, value, value, propKey, extraAttributes, serverDifferences);
11078						continue;
11079					case "action":
11080					case "formAction":
11081						attributes = domElement.getAttribute(value);
11082						if ("function" === typeof propKey) {
11083							extraAttributes.delete(value.toLowerCase());
11084							"formAction" === value ? (extraAttributes.delete("name"), extraAttributes.delete("formenctype"), extraAttributes.delete("formmethod"), extraAttributes.delete("formtarget")) : (extraAttributes.delete("enctype"), extraAttributes.delete("method"), extraAttributes.delete("target"));
11085							continue;
11086						} else if (attributes === EXPECTED_FORM_ACTION_URL) {
11087							extraAttributes.delete(value.toLowerCase());
11088							warnForPropDifference(value, "function", propKey, serverDifferences);
11089							continue;
11090						}
11091						hydrateSanitizedAttribute(domElement, value, value.toLowerCase(), propKey, extraAttributes, serverDifferences);
11092						continue;
11093					case "xlinkHref":
11094						hydrateSanitizedAttribute(domElement, value, "xlink:href", propKey, extraAttributes, serverDifferences);
11095						continue;
11096					case "contentEditable":
11097						hydrateBooleanishAttribute(domElement, value, "contenteditable", propKey, extraAttributes, serverDifferences);
11098						continue;
11099					case "spellCheck":
11100						hydrateBooleanishAttribute(domElement, value, "spellcheck", propKey, extraAttributes, serverDifferences);
11101						continue;
11102					case "draggable":
11103					case "autoReverse":
11104					case "externalResourcesRequired":
11105					case "focusable":
11106					case "preserveAlpha":
11107						hydrateBooleanishAttribute(domElement, value, value, propKey, extraAttributes, serverDifferences);
11108						continue;
11109					case "allowFullScreen":
11110					case "async":
11111					case "autoPlay":
11112					case "controls":
11113					case "credentialless":
11114					case "default":
11115					case "defer":
11116					case "disabled":
11117					case "disablePictureInPicture":
11118					case "disableRemotePlayback":
11119					case "formNoValidate":
11120					case "hidden":
11121					case "loop":
11122					case "noModule":
11123					case "noValidate":
11124					case "open":
11125					case "playsInline":
11126					case "readOnly":
11127					case "required":
11128					case "reversed":
11129					case "scoped":
11130					case "seamless":
11131					case "itemScope":
11132						hydrateBooleanAttribute(domElement, value, value.toLowerCase(), propKey, extraAttributes, serverDifferences);
11133						continue;
11134					case "capture":
11135					case "download":
11136						a: {
11137							i = domElement;
11138							var attributeName = attributes = value, serverDifferences$jscomp$0 = serverDifferences;
11139							extraAttributes.delete(attributeName);
11140							i = i.getAttribute(attributeName);
11141							if (null === i) switch (typeof propKey) {
11142								case "undefined":
11143								case "function":
11144								case "symbol": break a;
11145								default: if (!1 === propKey) break a;
11146							}
11147							else if (null != propKey) switch (typeof propKey) {
11148								case "function":
11149								case "symbol": break;
11150								case "boolean":
11151									if (!0 === propKey && "" === i) break a;
11152									break;
11153								default: if (checkAttributeStringCoercion(propKey, attributes), i === "" + propKey) break a;
11154							}
11155							warnForPropDifference(attributes, i, propKey, serverDifferences$jscomp$0);
11156						}
11157						continue;
11158					case "cols":
11159					case "rows":
11160					case "size":
11161					case "span":
11162						a: {
11163							i = domElement;
11164							attributeName = attributes = value;
11165							serverDifferences$jscomp$0 = serverDifferences;
11166							extraAttributes.delete(attributeName);
11167							i = i.getAttribute(attributeName);
11168							if (null === i) switch (typeof propKey) {
11169								case "undefined":
11170								case "function":
11171								case "symbol":
11172								case "boolean": break a;
11173								default: if (isNaN(propKey) || 1 > propKey) break a;
11174							}
11175							else if (null != propKey) switch (typeof propKey) {
11176								case "function":
11177								case "symbol":
11178								case "boolean": break;
11179								default: if (!(isNaN(propKey) || 1 > propKey) && (checkAttributeStringCoercion(propKey, attributes), i === "" + propKey)) break a;
11180							}
11181							warnForPropDifference(attributes, i, propKey, serverDifferences$jscomp$0);
11182						}
11183						continue;
11184					case "rowSpan":
11185						hydrateNumericAttribute(domElement, value, "rowspan", propKey, extraAttributes, serverDifferences);
11186						continue;
11187					case "start":
11188						hydrateNumericAttribute(domElement, value, value, propKey, extraAttributes, serverDifferences);
11189						continue;
11190					case "xHeight":
11191						hydrateAttribute(domElement, value, "x-height", propKey, extraAttributes, serverDifferences);
11192						continue;
11193					case "xlinkActuate":
11194						hydrateAttribute(domElement, value, "xlink:actuate", propKey, extraAttributes, serverDifferences);
11195						continue;
11196					case "xlinkArcrole":
11197						hydrateAttribute(domElement, value, "xlink:arcrole", propKey, extraAttributes, serverDifferences);
11198						continue;
11199					case "xlinkRole":
11200						hydrateAttribute(domElement, value, "xlink:role", propKey, extraAttributes, serverDifferences);
11201						continue;
11202					case "xlinkShow":
11203						hydrateAttribute(domElement, value, "xlink:show", propKey, extraAttributes, serverDifferences);
11204						continue;
11205					case "xlinkTitle":
11206						hydrateAttribute(domElement, value, "xlink:title", propKey, extraAttributes, serverDifferences);
11207						continue;
11208					case "xlinkType":
11209						hydrateAttribute(domElement, value, "xlink:type", propKey, extraAttributes, serverDifferences);
11210						continue;
11211					case "xmlBase":
11212						hydrateAttribute(domElement, value, "xml:base", propKey, extraAttributes, serverDifferences);
11213						continue;
11214					case "xmlLang":
11215						hydrateAttribute(domElement, value, "xml:lang", propKey, extraAttributes, serverDifferences);
11216						continue;
11217					case "xmlSpace":
11218						hydrateAttribute(domElement, value, "xml:space", propKey, extraAttributes, serverDifferences);
11219						continue;
11220					case "inert":
11221						"" !== propKey || didWarnForNewBooleanPropsWithEmptyValue[value] || (didWarnForNewBooleanPropsWithEmptyValue[value] = !0, console.error("Received an empty string for a boolean attribute `%s`. This will treat the attribute as if it were false. Either pass `false` to silence this warning, or pass `true` if you used an empty string in earlier versions of React to indicate this attribute is true.", value));
11222						hydrateBooleanAttribute(domElement, value, value, propKey, extraAttributes, serverDifferences);
11223						continue;
11224					default: if (!(2 < value.length) || "o" !== value[0] && "O" !== value[0] || "n" !== value[1] && "N" !== value[1]) {
11225						i = getAttributeAlias(value);
11226						attributes = !1;
11227						hostContext.context === HostContextNamespaceNone && "svg" !== tag && "math" !== tag ? extraAttributes.delete(i.toLowerCase()) : (attributeName = value.toLowerCase(), attributeName = possibleStandardNames.hasOwnProperty(attributeName) ? possibleStandardNames[attributeName] || null : null, null !== attributeName && attributeName !== value && (attributes = !0, extraAttributes.delete(attributeName)), extraAttributes.delete(i));
11228						a: if (attributeName = domElement, serverDifferences$jscomp$0 = i, i = propKey, isAttributeNameSafe(serverDifferences$jscomp$0)) if (attributeName.hasAttribute(serverDifferences$jscomp$0)) attributeName = "nonce" === serverDifferences$jscomp$0.toLowerCase() ? attributeName.nonce : attributeName.getAttribute(serverDifferences$jscomp$0), checkAttributeStringCoercion(i, serverDifferences$jscomp$0), i = attributeName === "" + i ? i : attributeName;
11229						else {
11230							switch (typeof i) {
11231								case "function":
11232								case "symbol": break a;
11233								case "boolean": if (attributeName = serverDifferences$jscomp$0.toLowerCase().slice(0, 5), "data-" !== attributeName && "aria-" !== attributeName) break a;
11234							}
11235							i = void 0 === i ? void 0 : null;
11236						}
11237						else i = void 0;
11238						attributes || warnForPropDifference(value, i, propKey, serverDifferences);
11239					}
11240				}
11241			}
11242			0 < extraAttributes.size && !0 !== props.suppressHydrationWarning && warnForExtraAttributes(domElement, extraAttributes, serverDifferences);
11243			return 0 === Object.keys(serverDifferences).length ? null : serverDifferences;
11244		}
11245		function propNamesListJoin(list, combinator) {
11246			switch (list.length) {
11247				case 0: return "";
11248				case 1: return list[0];
11249				case 2: return list[0] + " " + combinator + " " + list[1];
11250				default: return list.slice(0, -1).join(", ") + ", " + combinator + " " + list[list.length - 1];
11251			}
11252		}
11253		function isLikelyStaticResource(initiatorType) {
11254			switch (initiatorType) {
11255				case "css":
11256				case "script":
11257				case "font":
11258				case "img":
11259				case "image":
11260				case "input":
11261				case "link": return !0;
11262				default: return !1;
11263			}
11264		}
11265		function estimateBandwidth() {
11266			if ("function" === typeof performance.getEntriesByType) {
11267				for (var count = 0, bits = 0, resourceEntries = performance.getEntriesByType("resource"), i = 0; i < resourceEntries.length; i++) {
11268					var entry = resourceEntries[i], transferSize = entry.transferSize, initiatorType = entry.initiatorType, duration = entry.duration;
11269					if (transferSize && duration && isLikelyStaticResource(initiatorType)) {
11270						initiatorType = 0;
11271						duration = entry.responseEnd;
11272						for (i += 1; i < resourceEntries.length; i++) {
11273							var overlapEntry = resourceEntries[i], overlapStartTime = overlapEntry.startTime;
11274							if (overlapStartTime > duration) break;
11275							var overlapTransferSize = overlapEntry.transferSize, overlapInitiatorType = overlapEntry.initiatorType;
11276							overlapTransferSize && isLikelyStaticResource(overlapInitiatorType) && (overlapEntry = overlapEntry.responseEnd, initiatorType += overlapTransferSize * (overlapEntry < duration ? 1 : (duration - overlapStartTime) / (overlapEntry - overlapStartTime)));
11277						}
11278						--i;
11279						bits += 8 * (transferSize + initiatorType) / (entry.duration / 1e3);
11280						count++;
11281						if (10 < count) break;
11282					}
11283				}
11284				if (0 < count) return bits / count / 1e6;
11285			}
11286			return navigator.connection && (count = navigator.connection.downlink, "number" === typeof count) ? count : 5;
11287		}
11288		function getOwnerDocumentFromRootContainer(rootContainerElement) {
11289			return 9 === rootContainerElement.nodeType ? rootContainerElement : rootContainerElement.ownerDocument;
11290		}
11291		function getOwnHostContext(namespaceURI) {
11292			switch (namespaceURI) {
11293				case SVG_NAMESPACE: return HostContextNamespaceSvg;
11294				case MATH_NAMESPACE: return HostContextNamespaceMath;
11295				default: return HostContextNamespaceNone;
11296			}
11297		}
11298		function getChildHostContextProd(parentNamespace, type) {
11299			if (parentNamespace === HostContextNamespaceNone) switch (type) {
11300				case "svg": return HostContextNamespaceSvg;
11301				case "math": return HostContextNamespaceMath;
11302				default: return HostContextNamespaceNone;
11303			}
11304			return parentNamespace === HostContextNamespaceSvg && "foreignObject" === type ? HostContextNamespaceNone : parentNamespace;
11305		}
11306		function createHoistableInstance(type, props, rootContainerInstance, internalInstanceHandle) {
11307			rootContainerInstance = getOwnerDocumentFromRootContainer(rootContainerInstance).createElement(type);
11308			rootContainerInstance[internalInstanceKey] = internalInstanceHandle;
11309			rootContainerInstance[internalPropsKey] = props;
11310			setInitialProperties(rootContainerInstance, type, props);
11311			markNodeAsHoistable(rootContainerInstance);
11312			return rootContainerInstance;
11313		}
11314		function isScriptDataBlock(props) {
11315			props = props.type;
11316			if ("string" !== typeof props || "" === props) return !1;
11317			props = props.toLowerCase();
11318			if ("module" === props || "importmap" === props || "speculationrules" === props) return !1;
11319			switch (props) {
11320				case "application/ecmascript":
11321				case "application/javascript":
11322				case "application/x-ecmascript":
11323				case "application/x-javascript":
11324				case "text/ecmascript":
11325				case "text/javascript":
11326				case "text/javascript1.0":
11327				case "text/javascript1.1":
11328				case "text/javascript1.2":
11329				case "text/javascript1.3":
11330				case "text/javascript1.4":
11331				case "text/javascript1.5":
11332				case "text/jscript":
11333				case "text/livescript":
11334				case "text/x-ecmascript":
11335				case "text/x-javascript": return !1;
11336			}
11337			return !0;
11338		}
11339		function shouldSetTextContent(type, props) {
11340			return "textarea" === type || "noscript" === type || "string" === typeof props.children || "number" === typeof props.children || "bigint" === typeof props.children || "object" === typeof props.dangerouslySetInnerHTML && null !== props.dangerouslySetInnerHTML && null != props.dangerouslySetInnerHTML.__html;
11341		}
11342		function shouldAttemptEagerTransition() {
11343			var event = window.event;
11344			if (event && "popstate" === event.type) {
11345				if (event === currentPopstateTransitionEvent) return !1;
11346				currentPopstateTransitionEvent = event;
11347				return !0;
11348			}
11349			currentPopstateTransitionEvent = null;
11350			return !1;
11351		}
11352		function resolveEventType() {
11353			var event = window.event;
11354			return event && event !== schedulerEvent ? event.type : null;
11355		}
11356		function resolveEventTimeStamp() {
11357			var event = window.event;
11358			return event && event !== schedulerEvent ? event.timeStamp : -1.1;
11359		}
11360		function handleErrorInNextTick(error) {
11361			setTimeout(function() {
11362				throw error;
11363			});
11364		}
11365		function commitMount(domElement, type, newProps) {
11366			switch (type) {
11367				case "button":
11368				case "input":
11369				case "select":
11370				case "textarea":
11371					newProps.autoFocus && domElement.focus();
11372					break;
11373				case "img": newProps.src ? domElement.src = newProps.src : newProps.srcSet && (domElement.srcset = newProps.srcSet);
11374			}
11375		}
11376		function commitHydratedInstance() {}
11377		function commitUpdate(domElement, type, oldProps, newProps) {
11378			updateProperties(domElement, type, oldProps, newProps);
11379			domElement[internalPropsKey] = newProps;
11380		}
11381		function resetTextContent(domElement) {
11382			setTextContent(domElement, "");
11383		}
11384		function commitTextUpdate(textInstance, oldText, newText) {
11385			textInstance.nodeValue = newText;
11386		}
11387		function warnForReactChildrenConflict(container) {
11388			if (!container.__reactWarnedAboutChildrenConflict) {
11389				var props = container[internalPropsKey] || null;
11390				if (null !== props) {
11391					var fiber = getInstanceFromNode(container);
11392					null !== fiber && ("string" === typeof props.children || "number" === typeof props.children ? (container.__reactWarnedAboutChildrenConflict = !0, runWithFiberInDEV(fiber, function() {
11393						console.error("Cannot use a ref on a React element as a container to `createRoot` or `createPortal` if that element also sets \"children\" text content using React. It should be a leaf with no children. Otherwise it's ambiguous which children should be used.");
11394					})) : null != props.dangerouslySetInnerHTML && (container.__reactWarnedAboutChildrenConflict = !0, runWithFiberInDEV(fiber, function() {
11395						console.error("Cannot use a ref on a React element as a container to `createRoot` or `createPortal` if that element also sets \"dangerouslySetInnerHTML\" using React. It should be a leaf with no children. Otherwise it's ambiguous which children should be used.");
11396					})));
11397				}
11398			}
11399		}
11400		function isSingletonScope(type) {
11401			return "head" === type;
11402		}
11403		function removeChild(parentInstance, child) {
11404			parentInstance.removeChild(child);
11405		}
11406		function removeChildFromContainer(container, child) {
11407			(9 === container.nodeType ? container.body : "HTML" === container.nodeName ? container.ownerDocument.body : container).removeChild(child);
11408		}
11409		function clearHydrationBoundary(parentInstance, hydrationInstance) {
11410			var node = hydrationInstance, depth = 0;
11411			do {
11412				var nextNode = node.nextSibling;
11413				parentInstance.removeChild(node);
11414				if (nextNode && 8 === nextNode.nodeType) if (node = nextNode.data, node === SUSPENSE_END_DATA || node === ACTIVITY_END_DATA) {
11415					if (0 === depth) {
11416						parentInstance.removeChild(nextNode);
11417						retryIfBlockedOn(hydrationInstance);
11418						return;
11419					}
11420					depth--;
11421				} else if (node === SUSPENSE_START_DATA || node === SUSPENSE_PENDING_START_DATA || node === SUSPENSE_QUEUED_START_DATA || node === SUSPENSE_FALLBACK_START_DATA || node === ACTIVITY_START_DATA) depth++;
11422				else if (node === PREAMBLE_CONTRIBUTION_HTML) clearSingletonPreambleContribution(parentInstance.ownerDocument.documentElement);
11423				else if (node === PREAMBLE_CONTRIBUTION_HEAD) {
11424					node = parentInstance.ownerDocument.head;
11425					clearSingletonPreambleContribution(node);
11426					for (var node$jscomp$0 = node.firstChild; node$jscomp$0;) {
11427						var nextNode$jscomp$0 = node$jscomp$0.nextSibling, nodeName = node$jscomp$0.nodeName;
11428						node$jscomp$0[internalHoistableMarker] || "SCRIPT" === nodeName || "STYLE" === nodeName || "LINK" === nodeName && "stylesheet" === node$jscomp$0.rel.toLowerCase() || node.removeChild(node$jscomp$0);
11429						node$jscomp$0 = nextNode$jscomp$0;
11430					}
11431				} else node === PREAMBLE_CONTRIBUTION_BODY && clearSingletonPreambleContribution(parentInstance.ownerDocument.body);
11432				node = nextNode;
11433			} while (node);
11434			retryIfBlockedOn(hydrationInstance);
11435		}
11436		function hideOrUnhideDehydratedBoundary(suspenseInstance, isHidden) {
11437			var node = suspenseInstance;
11438			suspenseInstance = 0;
11439			do {
11440				var nextNode = node.nextSibling;
11441				1 === node.nodeType ? isHidden ? (node._stashedDisplay = node.style.display, node.style.display = "none") : (node.style.display = node._stashedDisplay || "", "" === node.getAttribute("style") && node.removeAttribute("style")) : 3 === node.nodeType && (isHidden ? (node._stashedText = node.nodeValue, node.nodeValue = "") : node.nodeValue = node._stashedText || "");
11442				if (nextNode && 8 === nextNode.nodeType) if (node = nextNode.data, node === SUSPENSE_END_DATA) if (0 === suspenseInstance) break;
11443				else suspenseInstance--;
11444				else node !== SUSPENSE_START_DATA && node !== SUSPENSE_PENDING_START_DATA && node !== SUSPENSE_QUEUED_START_DATA && node !== SUSPENSE_FALLBACK_START_DATA || suspenseInstance++;
11445				node = nextNode;
11446			} while (node);
11447		}
11448		function hideDehydratedBoundary(suspenseInstance) {
11449			hideOrUnhideDehydratedBoundary(suspenseInstance, !0);
11450		}
11451		function hideInstance(instance) {
11452			instance = instance.style;
11453			"function" === typeof instance.setProperty ? instance.setProperty("display", "none", "important") : instance.display = "none";
11454		}
11455		function hideTextInstance(textInstance) {
11456			textInstance.nodeValue = "";
11457		}
11458		function unhideDehydratedBoundary(dehydratedInstance) {
11459			hideOrUnhideDehydratedBoundary(dehydratedInstance, !1);
11460		}
11461		function unhideInstance(instance, props) {
11462			props = props[STYLE];
11463			props = void 0 !== props && null !== props && props.hasOwnProperty("display") ? props.display : null;
11464			instance.style.display = null == props || "boolean" === typeof props ? "" : ("" + props).trim();
11465		}
11466		function unhideTextInstance(textInstance, text) {
11467			textInstance.nodeValue = text;
11468		}
11469		function warnForBlockInsideInline(instance) {
11470			for (var nextNode = instance.firstChild; null != nextNode;) {
11471				if (1 === nextNode.nodeType && "block" === getComputedStyle(nextNode).display) {
11472					runWithFiberInDEV(getInstanceFromNode(nextNode) || getInstanceFromNode(instance), function(parentTag, childTag) {
11473						console.error("You're about to start a <ViewTransition> around a display: inline element <%s>, which itself has a display: block element <%s> inside it. This might trigger a bug in Safari which causes the View Transition to be skipped with a duplicate name error.\nhttps://bugs.webkit.org/show_bug.cgi?id=290923", parentTag.toLocaleLowerCase(), childTag.toLocaleLowerCase());
11474					}, instance.tagName, nextNode.tagName);
11475					break;
11476				}
11477				if (null != nextNode.firstChild) nextNode = nextNode.firstChild;
11478				else {
11479					if (nextNode === instance) break;
11480					for (; null == nextNode.nextSibling && null != nextNode.parentNode && nextNode.parentNode !== instance;) nextNode = nextNode.parentNode;
11481					nextNode = nextNode.nextSibling;
11482				}
11483			}
11484		}
11485		function applyViewTransitionName(instance, name, className) {
11486			name = CSS.escape(name) !== name ? "r-" + btoa(name).replace(/=/g, "") : name;
11487			instance.style.viewTransitionName = name;
11488			null != className && (instance.style.viewTransitionClass = className);
11489			className = getComputedStyle(instance);
11490			if ("inline" === className.display) {
11491				name = instance.getClientRects();
11492				if (1 === name.length) var JSCompiler_inline_result = 1;
11493				else for (var i = JSCompiler_inline_result = 0; i < name.length; i++) {
11494					var rect = name[i];
11495					0 < rect.width && 0 < rect.height && JSCompiler_inline_result++;
11496				}
11497				1 === JSCompiler_inline_result ? (instance = instance.style, instance.display = 1 === name.length ? "inline-block" : "block", instance.marginTop = "-" + className.paddingTop, instance.marginBottom = "-" + className.paddingBottom) : warnForBlockInsideInline(instance);
11498			}
11499		}
11500		function restoreViewTransitionName(instance, props) {
11501			instance = instance.style;
11502			props = props[STYLE];
11503			var viewTransitionName = null != props ? props.hasOwnProperty("viewTransitionName") ? props.viewTransitionName : props.hasOwnProperty("view-transition-name") ? props["view-transition-name"] : null : null;
11504			instance.viewTransitionName = null == viewTransitionName || "boolean" === typeof viewTransitionName ? "" : ("" + viewTransitionName).trim();
11505			viewTransitionName = null != props ? props.hasOwnProperty("viewTransitionClass") ? props.viewTransitionClass : props.hasOwnProperty("view-transition-class") ? props["view-transition-class"] : null : null;
11506			instance.viewTransitionClass = null == viewTransitionName || "boolean" === typeof viewTransitionName ? "" : ("" + viewTransitionName).trim();
11507			"inline-block" === instance.display && (null == props ? instance.display = instance.margin = "" : (viewTransitionName = props.display, instance.display = null == viewTransitionName || "boolean" === typeof viewTransitionName ? "" : viewTransitionName, viewTransitionName = props.margin, null != viewTransitionName ? instance.margin = viewTransitionName : (viewTransitionName = props.hasOwnProperty("marginTop") ? props.marginTop : props["margin-top"], instance.marginTop = null == viewTransitionName || "boolean" === typeof viewTransitionName ? "" : viewTransitionName, props = props.hasOwnProperty("marginBottom") ? props.marginBottom : props["margin-bottom"], instance.marginBottom = null == props || "boolean" === typeof props ? "" : props)));
11508		}
11509		function createMeasurement(rect, computedStyle, element) {
11510			element = element.ownerDocument.defaultView;
11511			return {
11512				rect,
11513				abs: "absolute" === computedStyle.position || "fixed" === computedStyle.position,
11514				clip: "none" !== computedStyle.clipPath || "visible" !== computedStyle.overflow || "none" !== computedStyle.filter || "none" !== computedStyle.mask || "none" !== computedStyle.mask || "0px" !== computedStyle.borderRadius,
11515				view: 0 <= rect.bottom && 0 <= rect.right && rect.top <= element.innerHe
11515ight && rect.left <= element.innerWidth
11516			};
11517		}
11518		function measureInstance(instance) {
11519			return createMeasurement(instance.getBoundingClientRect(), getComputedStyle(instance), instance);
11520		}
11521		function measureClonedInstance(instance) {
11522			var measuredRect = instance.getBoundingClientRect();
11523			measuredRect = new DOMRect(measuredRect.x + 2e4, measuredRect.y + 2e4, measuredRect.width, measuredRect.height);
11524			var computedStyle = getComputedStyle(instance);
11525			return createMeasurement(measuredRect, computedStyle, instance);
11526		}
11527		function customizeViewTransitionError(error, ignoreAbort) {
11528			if ("object" === typeof error && null !== error) switch (error.name) {
11529				case "TimeoutError": return Error("A ViewTransition timed out because a Navigation stalled. This can happen if a Navigation is blocked on React itself. Such as if it's resolved inside useEffect. This can be solved by moving the resolution to useLayoutEffect.", { cause: error });
11530				case "AbortError": return ignoreAbort ? null : Error("A ViewTransition was aborted early. This might be because you have other View Transition libraries on the page and only one can run at a time. To avoid this, use only React's built-in <ViewTransition> to coordinate.", { cause: error });
11531				case "InvalidStateError": if ("View transition was skipped because document visibility state is hidden." === error.message || "Skipping view transition because document visibility state has become hidden." === error.message || "Skipping view transition because viewport size changed." === error.message || "Transition was aborted because of invalid state" === error.message) return null;
11532			}
11533			return error;
11534		}
11535		function forceLayout(ownerDocument) {
11536			return ownerDocument.documentElement.clientHeight;
11537		}
11538		function waitForImageToLoad(resolve) {
11539			this.addEventListener("load", resolve);
11540			this.addEventListener("error", resolve);
11541		}
11542		function startViewTransition(suspendedState, rootContainer, transitionTypes, mutationCallback, layoutCallback, afterMutationCallback, spawnedWorkCallback, passiveCallback, errorCallback, blockedCallback, finishedAnimation) {
11543			var ownerDocument = 9 === rootContainer.nodeType ? rootContainer : rootContainer.ownerDocument;
11544			try {
11545				var transition = ownerDocument.startViewTransition({
11546					update: function() {
11547						var ownerWindow = ownerDocument.defaultView, pendingNavigation = ownerWindow.navigation && ownerWindow.navigation.transition, previousFontLoadingStatus = ownerDocument.fonts.status;
11548						mutationCallback();
11549						var blockingPromises = [];
11550						"loaded" === previousFontLoadingStatus && (forceLayout(ownerDocument), "loading" === ownerDocument.fonts.status && blockingPromises.push(ownerDocument.fonts.ready));
11551						previousFontLoadingStatus = blockingPromises.length;
11552						if (null !== suspendedState) for (var suspenseyImages = suspendedState.suspenseyImages, imgBytes = 0, i = 0; i < suspenseyImages.length; i++) {
11553							var suspenseyImage = suspenseyImages[i];
11554							if (!suspenseyImage.complete) {
11555								var rect = suspenseyImage.getBoundingClientRect();
11556								if (0 < rect.bottom && 0 < rect.right && rect.top < ownerWindow.innerHeight && rect.left < ownerWindow.innerWidth) {
11557									imgBytes += estimateImageBytes(suspenseyImage);
11558									if (imgBytes > estimatedBytesWithinLimit) {
11559										blockingPromises.length = previousFontLoadingStatus;
11560										break;
11561									}
11562									suspenseyImage = new Promise(waitForImageToLoad.bind(suspenseyImage));
11563									blockingPromises.push(suspenseyImage);
11564								}
11565							}
11566						}
11567						if (0 < blockingPromises.length) return blockedCallback(0 < previousFontLoadingStatus ? blockingPromises.length > previousFontLoadingStatus ? "Waiting on Fonts and Images" : "Waiting on Fonts" : "Waiting on Images"), ownerWindow = Promise.race([Promise.all(blockingPromises), new Promise(function(resolve) {
11568							return setTimeout(resolve, SUSPENSEY_FONT_AND_IMAGE_TIMEOUT);
11569						})]).then(layoutCallback, layoutCallback), (pendingNavigation ? Promise.allSettled([pendingNavigation.finished, ownerWindow]) : ownerWindow).then(afterMutationCallback, afterMutationCallback);
11570						layoutCallback();
11571						if (pendingNavigation) return pendingNavigation.finished.then(afterMutationCallback, afterMutationCallback);
11572						afterMutationCallback();
11573					},
11574					types: transitionTypes
11575				});
11576				ownerDocument.__reactViewTransition = transition;
11577				var viewTransitionAnimations = [];
11578				transition.ready.then(function() {
11579					for (var animations = ownerDocument.documentElement.getAnimations({ subtree: !0 }), i = 0; i < animations.length; i++) {
11580						var animation = animations[i], effect = animation.effect, pseudoElement = effect.pseudoElement;
11581						if (null != pseudoElement && pseudoElement.startsWith("::view-transition")) {
11582							viewTransitionAnimations.push(animation);
11583							animation = effect.getKeyframes();
11584							for (var height = pseudoElement = void 0, unchangedDimensions = !0, j = 0; j < animation.length; j++) {
11585								var keyframe = animation[j], w = keyframe.width;
11586								if (void 0 === pseudoElement) pseudoElement = w;
11587								else if (pseudoElement !== w) {
11588									unchangedDimensions = !1;
11589									break;
11590								}
11591								w = keyframe.height;
11592								if (void 0 === height) height = w;
11593								else if (height !== w) {
11594									unchangedDimensions = !1;
11595									break;
11596								}
11597								delete keyframe.width;
11598								delete keyframe.height;
11599								"none" === keyframe.transform && delete keyframe.transform;
11600							}
11601							unchangedDimensions && void 0 !== pseudoElement && void 0 !== height && (effect.setKeyframes(animation), unchangedDimensions = getComputedStyle(effect.target, effect.pseudoElement), unchangedDimensions.width !== pseudoElement || unchangedDimensions.height !== height) && (unchangedDimensions = animation[0], unchangedDimensions.width = pseudoElement, unchangedDimensions.height = height, unchangedDimensions = animation[animation.length - 1], unchangedDimensions.width = pseudoElement, unchangedDimensions.height = height, effect.setKeyframes(animation));
11602						}
11603					}
11604					spawnedWorkCallback();
11605				}, function(error) {
11606					ownerDocument.__reactViewTransition === transition && (ownerDocument.__reactViewTransition = null);
11607					try {
11608						error = customizeViewTransitionError(error, !1), null !== error && errorCallback(error);
11609					} finally {
11610						mutationCallback(), layoutCallback(), spawnedWorkCallback(), finishedAnimation();
11611					}
11612				});
11613				transition.finished.finally(function() {
11614					for (var i = 0; i < viewTransitionAnimations.length; i++) viewTransitionAnimations[i].cancel();
11615					ownerDocument.__reactViewTransition === transition && (ownerDocument.__reactViewTransition = null);
11616					finishedAnimation();
11617					passiveCallback();
11618				});
11619				return transition;
11620			} catch (x) {
11621				return mutationCallback(), layoutCallback(), finishedAnimation(), spawnedWorkCallback(), null;
11622			}
11623		}
11624		function ViewTransitionPseudoElement(pseudo, name) {
11625			this._scope = document.documentElement;
11626			this._selector = "::view-transition-" + pseudo + "(" + name + ")";
11627		}
11628		function createViewTransitionInstance(name) {
11629			return {
11630				name,
11631				group: new ViewTransitionPseudoElement("group", name),
11632				imagePair: new ViewTransitionPseudoElement("image-pair", name),
11633				old: new ViewTransitionPseudoElement("old", name),
11634				new: new ViewTransitionPseudoElement("new", name)
11635			};
11636		}
11637		function FragmentInstance(fragmentFiber) {
11638			this._fragmentFiber = fragmentFiber;
11639			this._observers = this._eventListeners = null;
11640		}
11641		function addEventListenerToChild(child, type, listener, optionsOrUseCapture) {
11642			getInstanceFromHostFiber(child).addEventListener(type, listener, optionsOrUseCapture);
11643			return !1;
11644		}
11645		function removeEventListenerFromChild(child, type, listener, optionsOrUseCapture) {
11646			getInstanceFromHostFiber(child).removeEventListener(type, listener, optionsOrUseCapture);
11647			return !1;
11648		}
11649		function getAttachOptions(opts) {
11650			return null != opts && "boolean" !== typeof opts && (!0 === opts.once || opts.signal instanceof AbortSignal) ? {
11651				capture: opts.capture,
11652				passive: opts.passive
11653			} : opts;
11654		}
11655		function normalizeListenerOptions(opts) {
11656			return null == opts ? "c=0" : "boolean" === typeof opts ? "c=" + (opts ? "1" : "0") : "c=" + (opts.capture ? "1" : "0");
11657		}
11658		function indexOfEventListener(eventListeners, type, listener, optionsOrUseCapture) {
11659			if (0 === eventListeners.length) return -1;
11660			optionsOrUseCapture = normalizeListenerOptions(optionsOrUseCapture);
11661			for (var i = 0; i < eventListeners.length; i++) {
11662				var item = eventListeners[i];
11663				if (item.type === type && item.listener === listener && normalizeListenerOptions(item.optionsOrUseCapture) === optionsOrUseCapture) return i;
11664			}
11665			return -1;
11666		}
11667		function setFocusOnFiberIfFocusable(fiber, focusOptions) {
11668			if (6 === fiber.tag) return !1;
11669			fiber = getInstanceFromHostFiber(fiber);
11670			return setFocusIfFocusable(fiber, focusOptions);
11671		}
11672		function collectChildren(child, collection) {
11673			collection.push(child);
11674			return !1;
11675		}
11676		function blurActiveElementWithinFragment(child, activeElement) {
11677			if (6 === child.tag) return !1;
11678			child = getInstanceFromHostFiber(child);
11679			return child === activeElement || child.contains(activeElement) ? (activeElement.blur(), !0) : !1;
11680		}
11681		function observeChild(child, observer) {
11682			if (6 === child.tag) return !1;
11683			child = getInstanceFromHostFiber(child);
11684			observer.observe(child);
11685			return !1;
11686		}
11687		function unobserveChild(child, observer) {
11688			if (6 === child.tag) return !1;
11689			child = getInstanceFromHostFiber(child);
11690			observer.unobserve(child);
11691			return !1;
11692		}
11693		function schedulePendingIntersectionUnobserve(fragmentInstance, observer, instance) {
11694			pendingIntersectionUnobserves.push({
11695				fragmentInstance,
11696				observer,
11697				instance
11698			});
11699			intersectionUnobserveScheduled || (intersectionUnobserveScheduled = !0, requestPostPaintCallback(function() {
11700				intersectionUnobserveScheduled = !1;
11701				var pending = pendingIntersectionUnobserves;
11702				pendingIntersectionUnobserves = [];
11703				for (var i = 0; i < pending.length; i++) {
11704					var item = pending[i];
11705					item.observer.unobserve(item.instance);
11706				}
11707			}));
11708		}
11709		function collectClientRects(child, rects) {
11710			if (6 === child.tag) {
11711				child = child.stateNode;
11712				var range = child.ownerDocument.createRange();
11713				range.selectNodeContents(child);
11714				rects.push.apply(rects, range.getClientRects());
11715			} else child = getInstanceFromHostFiber(child), rects.push.apply(rects, child.getClientRects());
11716			return !1;
11717		}
11718		function validateDocumentPositionWithFiberTree(documentPosition, fragmentFiber, precedingBoundaryFiber, followingBoundaryFiber, otherNode) {
11719			var otherFiber = getClosestInstanceFromNode(otherNode);
11720			if (documentPosition & Node.DOCUMENT_POSITION_CONTAINED_BY) {
11721				if (precedingBoundaryFiber = !!otherFiber) a: {
11722					for (; null !== otherFiber;) {
11723						if (7 === otherFiber.tag && (otherFiber === fragmentFiber || otherFiber.alternate === fragmentFiber)) {
11724							precedingBoundaryFiber = !0;
11725							break a;
11726						}
11727						otherFiber = otherFiber.return;
11728					}
11729					precedingBoundaryFiber = !1;
11730				}
11731				return precedingBoundaryFiber;
11732			}
11733			if (documentPosition & Node.DOCUMENT_POSITION_CONTAINS) {
11734				if (null === otherFiber) return otherFiber = otherNode.ownerDocument, otherNode === otherFiber || otherNode === otherFiber.documentElement || otherNode === otherFiber.body;
11735				a: {
11736					otherFiber = fragmentFiber;
11737					for (fragmentFiber = getFragmentParentInstanceOrContainerFiber(fragmentFiber); null !== otherFiber;) {
11738						if (!(5 !== otherFiber.tag && 3 !== otherFiber.tag && 27 !== otherFiber.tag || otherFiber !== fragmentFiber && otherFiber.alternate !== fragmentFiber)) {
11739							otherFiber = !0;
11740							break a;
11741						}
11742						otherFiber = otherFiber.return;
11743					}
11744					otherFiber = !1;
11745				}
11746				return otherFiber;
11747			}
11748			return documentPosition & Node.DOCUMENT_POSITION_PRECEDING ? ((fragmentFiber = !!otherFiber) && !(fragmentFiber = otherFiber === precedingBoundaryFiber) && (fragmentFiber = getLowestCommonAncestor(precedingBoundaryFiber, otherFiber, getParentForFragmentAncestors), null === fragmentFiber ? fragmentFiber = !1 : (traverseVisibleInstancesAndTextInstances(fragmentFiber, !0, isFiberPrecedingCheck, otherFiber, precedingBoundaryFiber), otherFiber = searchTarget, searchTarget = null, fragmentFiber = null !== otherFiber)), fragmentFiber) : documentPosition & Node.DOCUMENT_POSITION_FOLLOWING ? ((fragmentFiber = !!otherFiber) && !(fragmentFiber = otherFiber === followingBoundaryFiber) && (fragmentFiber = getLowestCommonAncestor(followingBoundaryFiber, otherFiber, getParentForFragmentAncestors), null === fragmentFiber ? fragmentFiber = !1 : (traverseVisibleInstancesAndTextInstances(fragmentFiber, !0, isFiberFollowingCheck, otherFiber, followingBoundaryFiber), otherFiber = searchTarget, searchBoundary = searchTarget = null, fragmentFiber = null !== otherFiber)), fragmentFiber) : !1;
11749		}
11750		function scrollTextNodeIntoView(textNode, resolvedAlignToTop) {
11751			var range = textNode.ownerDocument.createRange();
11752			range.selectNodeContents(textNode);
11753			textNode = range.getBoundingClientRect();
11754			window.scrollTo(window.scrollX + textNode.left, resolvedAlignToTop ? window.scrollY + textNode.top : window.scrollY + textNode.bottom - window.innerHeight);
11755		}
11756		function addFragmentHandleToFiber(child, fragmentInstance) {
11757			child = getInstanceFromHostFiber(child);
11758			addFragmentHandleToInstance(child, fragmentInstance);
11759			return !1;
11760		}
11761		function addFragmentHandleToInstance(instance, fragmentInstance) {
11762			instance.reactFragments ??= /* @__PURE__ */ new Set();
11763			instance.reactFragments.add(fragmentInstance);
11764		}
11765		function commitNewChildToFragmentInstance(childInstance, fragmentInstance) {
11766			var eventListeners = fragmentInstance._eventListeners;
11767			if (null !== eventListeners) for (var i$jscomp$0 = 0; i$jscomp$0 < eventListeners.length; i$jscomp$0++) {
11768				var _eventListeners$i2 = eventListeners[i$jscomp$0];
11769				childInstance.addEventListener(_eventListeners$i2.type, _eventListeners$i2.attachedListener, getAttachOptions(_eventListeners$i2.optionsOrUseCapture));
11770			}
11771			3 !== childInstance.nodeType && (eventListeners = fragmentInstance._observers, null !== eventListeners && eventListeners.forEac
vendor: 5,804 bytes, lines 11771-11881
11771h(function(observer) {
11772				for (var writeIdx = 0, i = 0; i < pendingIntersectionUnobserves.length; i++) {
11773					var pending = pendingIntersectionUnobserves[i];
11774					if (pending.fragmentInstance !== fragmentInstance || pending.observer !== observer || pending.instance !== childInstance) pendingIntersectionUnobserves[writeIdx++] = pending;
11775				}
11776				pendingIntersectionUnobserves.length = writeIdx;
11777				observer.observe(childInstance);
11778			}), addFragmentHandleToInstance(childInstance, fragmentInstance));
11779		}
11780		function deleteChildFromFragmentInstance(childInstance, fragmentInstance) {
11781			var eventListeners = fragmentInstance._eventListeners;
11782			if (null !== eventListeners) for (var i = 0; i < eventListeners.length; i++) {
11783				var _eventListeners$i3 = eventListeners[i];
11784				childInstance.removeEventListener(_eventListeners$i3.type, _eventListeners$i3.attachedListener, getAttachOptions(_eventListeners$i3.optionsOrUseCapture));
11785			}
11786			3 !== childInstance.nodeType && (eventListeners = fragmentInstance._observers, null !== eventListeners && eventListeners.forEach(function(observer) {
11787				"string" === typeof observer.rootMargin ? schedulePendingIntersectionUnobserve(fragmentInstance, observer, childInstance) : observer.unobserve(childInstance);
11788			}), null != childInstance.reactFragments && childInstance.reactFragments.delete(fragmentInstance));
11789		}
11790		function clearContainerSparingly(container) {
11791			var nextNode = container.firstChild;
11792			nextNode && 10 === nextNode.nodeType && (nextNode = nextNode.nextSibling);
11793			for (; nextNode;) {
11794				var node = nextNode;
11795				nextNode = nextNode.nextSibling;
11796				switch (node.nodeName) {
11797					case "HTML":
11798					case "HEAD":
11799					case "BODY":
11800						clearContainerSparingly(node);
11801						detachDeletedInstance(node);
11802						continue;
11803					case "SCRIPT":
11804					case "STYLE": continue;
11805					case "LINK": if ("stylesheet" === node.rel.toLowerCase()) continue;
11806				}
11807				container.removeChild(node);
11808			}
11809		}
11810		function canHydrateInstance(instance, type, props, inRootOrSingleton) {
11811			for (; 1 === instance.nodeType;) {
11812				var anyProps = props;
11813				if (instance.nodeName.toLowerCase() !== type.toLowerCase()) {
11814					if (!inRootOrSingleton && ("INPUT" !== instance.nodeName || "hidden" !== instance.type)) break;
11815				} else if (!inRootOrSingleton) if ("input" === type && "hidden" === instance.type) {
11816					checkAttributeStringCoercion(anyProps.name, "name");
11817					var name = null == anyProps.name ? null : "" + anyProps.name;
11818					if ("hidden" === anyProps.type && instance.getAttribute("name") === name) return instance;
11819				} else return instance;
11820				else if (!instance[internalHoistableMarker]) switch (type) {
11821					case "meta":
11822						if (!instance.hasAttribute("itemprop")) break;
11823						return instance;
11824					case "link":
11825						name = instance.getAttribute("rel");
11826						if ("stylesheet" === name && instance.hasAttribute("data-precedence")) break;
11827						else if (name !== anyProps.rel || instance.getAttribute("href") !== (null == anyProps.href || "" === anyProps.href ? null : anyProps.href) || instance.getAttribute("crossorigin") !== (null == anyProps.crossOrigin ? null : anyProps.crossOrigin) || instance.getAttribute("title") !== (null == anyProps.title ? null : anyProps.title)) break;
11828						return instance;
11829					case "style":
11830						if (instance.hasAttribute("data-precedence")) break;
11831						return instance;
11832					case "script":
11833						name = instance.getAttribute("src");
11834						if ((name !== (null == anyProps.src ? null : anyProps.src) || instance.getAttribute("type") !== (null == anyProps.type ? null : anyProps.type) || instance.getAttribute("crossorigin") !== (null == anyProps.crossOrigin ? null : anyProps.crossOrigin)) && name && instance.hasAttribute("async") && !instance.hasAttribute("itemprop")) break;
11835						return instance;
11836					default: return instance;
11837				}
11838				instance = getNextHydratable(instance.nextSibling);
11839				if (null === instance) break;
11840			}
11841			return null;
11842		}
11843		function canHydrateTextInstance(instance, text, inRootOrSingleton) {
11844			if ("" === text) return null;
11845			for (; 3 !== instance.nodeType;) {
11846				if ((1 !== instance.nodeType || "INPUT" !== instance.nodeName || "hidden" !== instance.type) && !inRootOrSingleton) return null;
11847				instance = getNextHydratable(instance.nextSibling);
11848				if (null === instance) return null;
11849			}
11850			return instance;
11851		}
11852		function canHydrateHydrationBoundary(instance, inRootOrSingleton) {
11853			for (; 8 !== instance.nodeType;) {
11854				if ((1 !== instance.nodeType || "INPUT" !== instance.nodeName || "hidden" !== instance.type) && !inRootOrSingleton) return null;
11855				instance = getNextHydratable(instance.nextSibling);
11856				if (null === instance) return null;
11857			}
11858			return instance;
11859		}
11860		function isSuspenseInstancePending(instance) {
11861			return instance.data === SUSPENSE_PENDING_START_DATA || instance.data === SUSPENSE_QUEUED_START_DATA;
11862		}
11863		function isSuspenseInstanceFallback(instance) {
11864			return instance.data === SUSPENSE_FALLBACK_START_DATA || instance.data === SUSPENSE_PENDING_START_DATA && instance.ownerDocument.readyState !== DOCUMENT_READY_STATE_LOADING;
11865		}
11866		function registerSuspenseInstanceRetry(instance, callback) {
11867			var ownerDocument = instance.ownerDocument;
11868			if (instance.data === SUSPENSE_QUEUED_START_DATA) instance._reactRetry = callback;
11869			else if (instance.data !== SUSPENSE_PENDING_START_DATA || ownerDocument.readyState !== DOCUMENT_READY_STATE_LOADING) callback();
11870			else {
11871				var listener = function() {
11872					callback();
11873					ownerDocument.removeEventListener("DOMContentLoaded", listener);
11874				};
11875				ownerDocument.addEventListener("DOMContentLoaded", listener);
11876				instance._reactRetry = listener;
11877			}
11878		}
11879		function getNextHydratable(node) {
11880			for (; null != node; node = node.nextSibling) {
11881				var nodeType = node.nodeType;
11882				if (1 === nodeType || 3 === nodeType) break;
11883				if (8 === nodeType) {
11884					nodeType = node.data;
11885					if (nodeType === SUSPENSE_START_DATA || nodeType === SUSPENSE_FALLBACK_START_DATA || nodeType === SUSPENSE_PENDING_START_DATA || nodeType === SUSPENSE_QUEUED_START_DATA || nodeType === ACTIVITY_START_DATA || nodeType === FORM_STATE_IS_MATCHING || nodeType === FORM_STATE_IS_NOT_MATCHING) break;
11886					if (nodeType === SUSPENSE_END_DATA || nodeType === ACTIVITY_END_DATA) return null;
11887				}
11888			}
11889			return node;
11890		}
11891		function describeHydratableInstanceForDevWarnings(instance) {
11892			if (1 === instance.nodeType) {
11893				for (var JSCompiler_temp_const = instance.nodeName.toLowerCase(), serverDifferences = {}, attributes = instance.attributes, i = 0; i < attributes.length; i++) {
11894					var attr = attributes[i];
11895					serverDifferences[getPropNameFromAttributeName(attr.name)] = "style" === attr.name.toLowerCase() ? getStylesObjectFromElement(instance) : attr.value;
11896				}
11897				return {
11898					type: JSCompiler_temp_const,
11899					props: serverDifferences
11900				};
11901			}
11902			return 8 === instance.nodeType ? instance.data === ACTIVITY_START_DATA ? {
11903				type: "Activity",
11904				props: {}
11905			} : {
11906				type: "Suspense",
11907				props: {}
11908			} : instance.nodeValue;
11909		}
11910		function diffHydratedTextForDevWarnings(textInstance, text, parentProps) {
11911			return null === parentProps || !0 !== parentProps[SUPPRESS_HYDRATION_WARNING] ? (textInstance.nodeValue === text ? textInstance = null : (text = normalizeMarkupForTextOrAttribute(text), textInstance = normalizeMarkupForTextOrAttribute(textInstance.nodeValue) === text ? null : textInstance.nodeValue), textInstance) : null;
11912		}
11913		function getNextHydratableInstanceAfterHydrationBoundary(hydrationInstance) {
11914			hydrationInstance = hydrationInstance.nextSibling;
11915			for (var depth = 0; hydrationInstance;) {
11916				if (8 === hydrationInstance.nodeType) {
11917					var data = hydrationInstance.data;
11918					if (data === SUSPENSE_END_DATA || data === ACTIVITY_END_DATA) {
11919						if (0 === depth) return getNextHydratable(hydrationInstance.nextSibling);
11920						depth--;
11921					} else data !== SUSPENSE_START_DATA && data !== SUSPENSE_FALLBACK_START_DATA && data !== SUSPENSE_PENDING_START_DATA && data !== SUSPENSE_QUEUED_START_DATA && data !== ACTIVITY_START_DATA || depth++;
11922				}
11923				hydrationInstance = hydrationInstance.nextSibling;
11924			}
11925			return null;
11926		}
11927		function getParentHydrationBoundary(targetInstance) {
11928			targetInstance = targetInstance.previousSibling;
11929			for (var depth = 0; targetInstance;) {
11930				if (8 === targetInstance.nodeType) {
11931					var data = targetInstance.data;
11932					if (data === SUSPENSE_START_DATA || data === SUSPENSE_FALLBACK_START_DATA || data === SUSPENSE_PENDING_START_DATA || data === SUSPENSE_QUEUED_START_DATA || data === ACTIVITY_START_DATA) {
11933						if (0 === depth) return targetInstance;
11934						depth--;
11935					} else data !== SUSPENSE_END_DATA && data !== ACTIVITY_END_DATA || depth++;
11936				}
11937				targetInstance = targetInstance.previousSibling;
11938			}
11939			return null;
11940		}
11941		function commitHydratedContainer(container) {
11942			retryIfBlockedOn(container);
11943		}
11944		function commitHydratedActivityInstance(activityInstance) {
11945			retryIfBlockedOn(activityInstance);
11946		}
11947		function commitHydratedSuspenseInstance(suspenseInstance) {
11948			retryIfBlockedOn(suspenseInstance);
11949		}
11950		function setFocusIfFocusable(node, focusOptions) {
11951			function handleFocus() {
11952				didFocus = !0;
11953			}
11954			if (node.ownerDocument.activeElement === node) return !0;
11955			var didFocus = !1;
11956			try {
11957				node.ownerDocument.addEventListener("focus", handleFocus, !0), (node.focus || HTMLElement.prototype.focus).call(node, focusOptions);
11958			} finally {
11959				node.ownerDocument.removeEventListener("focus", handleFocus, !0);
11960			}
11961			return didFocus;
11962		}
11963		function requestPostPaintCallback(callback) {
11964			localRequestAnimationFrame(function() {
11965				localRequestAnimationFrame(function(time) {
11966					return callback(time);
11967				});
11968			});
11969		}
11970		function resolveSingletonInstance(type, props, rootContainerInstance, hostContext, validateDOMNestingDev) {
11971			validateDOMNestingDev && validateDOMNesting(type, hostContext.ancestorInfo);
11972			props = getOwnerDocumentFromRootContainer(rootContainerInstance);
11973			switch (type) {
11974				case "html":
11975					type = props.documentElement;
11976					if (!type) throw Error("React expected an <html> element (document.documentElement) to exist in the Document but one was not found. React never removes the documentElement for any Document it renders into so the cause is likely in some other script running on this page.");
11977					return type;
11978				case "head":
11979					type = props.head;
11980					if (!type) throw Error("React expected a <head> element (document.head) to exist in the Document but one was not found. React never removes the head for any Document it renders into so the cause is likely in some other script running on this page.");
11981					return type;
11982				case "body":
11983					type = props.body;
11984					if (!type) throw Error("React expected a <body> element (document.body) to exist in the Document but one was not found. React never removes the body for any Document it renders into so the cause is likely in some other script running on this page.");
11985					return type;
11986				default: throw Error("resolveSingletonInstance was called with an element type that is not supported. This is a bug in React.");
11987			}
11988		}
11989		function acquireSingletonInstance(type, props, instance, internalInstanceHandle) {
11990			if (!instance[internalContainerInstanceKey] && getInstanceFromNode(instance)) {
11991				var tagName = instance.tagName.toLowerCase();
11992				console.error("You are mounting a new %s component when a previous one has not first unmounted. It is an error to render more than one %s component at a time and attributes and children of these components will likely fail in unpredictable ways. Please only render a single instance of <%s> and if you need to mount a new one, ensure any previous ones have unmounted first.", tagName, tagName, tagName);
11993			}
11994			switch (type) {
11995				case "html":
11996				case "head":
vendor: 13,358 bytes, lines 11997-12220
11997				case "body": break;
11998				default: console.error("acquireSingletonInstance was called with an element type that is not supported. This is a bug in React.");
11999			}
12000			for (tagName = instance.attributes; tagName.length;) instance.removeAttributeNode(tagName[0]);
12001			setInitialProperties(instance, type, props);
12002			instance[internalInstanceKey] = internalInstanceHandle;
12003			instance[internalPropsKey] = props;
12004		}
12005		function releaseSingletonInstance(instance, type, props) {
12006			for (var propKey in props) {
12007				var propValue = props[propKey];
12008				props.hasOwnProperty(propKey) && null != propValue && setProp(instance, type, propKey, null, emptyProps, propValue);
12009			}
12010			null != props.dangerouslySetInnerHTML && (instance.textContent = "");
12011			instance.onclick === noop$1 && (instance.onclick = null);
12012			detachDeletedInstance(instance);
12013		}
12014		function clearSingletonPreambleContribution(instance) {
12015			for (var attributes = instance.attributes; attributes.length;) instance.removeAttributeNode(attributes[0]);
12016			detachDeletedInstance(instance);
12017		}
12018		function getHoistableRoot(container) {
12019			if ("function" === typeof container.getRootNode) {
12020				var rootNode = container.getRootNode();
12021				if (9 === rootNode.nodeType || 11 === rootNode.nodeType) return rootNode;
12022			}
12023			return 9 === container.nodeType ? container : container.ownerDocument;
12024		}
12025		function preconnectAs(rel, href, crossOrigin) {
12026			var ownerDocument = globalDocument;
12027			if (ownerDocument && "string" === typeof href && href) {
12028				var limitedEscapedHref = escapeSelectorAttributeValueInsideDoubleQuotes(href);
12029				limitedEscapedHref = "link[rel=\"" + rel + "\"][href=\"" + limitedEscapedHref + "\"]";
12030				"string" === typeof crossOrigin && (limitedEscapedHref += "[crossorigin=\"" + crossOrigin + "\"]");
12031				preconnectsSet.has(limitedEscapedHref) || (preconnectsSet.add(limitedEscapedHref), rel = {
12032					rel,
12033					crossOrigin,
12034					href
12035				}, null === ownerDocument.querySelector(limitedEscapedHref) && (href = ownerDocument.createElement("link"), setInitialProperties(href, "link", rel), markNodeAsHoistable(href), ownerDocument.head.appendChild(href)));
12036			}
12037		}
12038		function getResource(type, currentProps, pendingProps, currentResource) {
12039			var resourceRoot = (resourceRoot = rootInstanceStackCursor.current) ? getHoistableRoot(resourceRoot) : null;
12040			if (!resourceRoot) throw Error("\"resourceRoot\" was expected to exist. This is a bug in React.");
12041			switch (type) {
12042				case "meta":
12043				case "title": return null;
12044				case "style": return "string" === typeof pendingProps.precedence && "string" === typeof pendingProps.href ? (pendingProps = getStyleKey(pendingProps.href), currentProps = getResourcesFromRoot(resourceRoot).hoistableStyles, currentResource = currentProps.get(pendingProps), currentResource || (currentResource = {
12045					type: "style",
12046					instance: null,
12047					count: 0,
12048					state: null
12049				}, currentProps.set(pendingProps, currentResource)), currentResource) : {
12050					type: "void",
12051					instance: null,
12052					count: 0,
12053					state: null
12054				};
12055				case "link":
12056					if ("stylesheet" === pendingProps.rel && "string" === typeof pendingProps.href && "string" === typeof pendingProps.precedence) {
12057						type = getStyleKey(pendingProps.href);
12058						var _styles = getResourcesFromRoot(resourceRoot).hoistableStyles, _resource = _styles.get(type);
12059						_resource || (resourceRoot = resourceRoot.ownerDocument || resourceRoot, _resource = {
12060							type: "stylesheet",
12061							instance: null,
12062							count: 0,
12063							state: {
12064								loading: NotLoaded,
12065								preload: null
12066							}
12067						}, _styles.set(type, _resource), (_styles = resourceRoot.querySelector(getStylesheetSelectorFromKey(type))) ? _styles._p || (_resource.instance = _styles, _resource.state.loading = Loaded | Inserted) : (_styles = preloadPropsMap.get(type), _styles || (_styles = {
12068							rel: "preload",
12069							as: "style",
12070							href: pendingProps.href,
12071							crossOrigin: pendingProps.crossOrigin,
12072							integrity: pendingProps.integrity,
12073							media: pendingProps.media,
12074							hrefLang: pendingProps.hrefLang,
12075							referrerPolicy: pendingProps.referrerPolicy
12076						}, preloadPropsMap.set(type, _styles)), preloadStylesheet(resourceRoot, type, _styles, _resource.state)));
12077						if (currentProps && null === currentResource) throw pendingProps = "\n\n  - " + describeLinkForResourceErrorDEV(currentProps) + "\n  + " + describeLinkForResourceErrorDEV(pendingProps), Error("Expected <link> not to update to be updated to a stylesheet with precedence. Check the `rel`, `href`, and `precedence` props of this component. Alternatively, check whether two different <link> components render in the same slot or share the same key." + pendingProps);
12078						return _resource;
12079					}
12080					if (currentProps && null !== currentResource) throw pendingProps = "\n\n  - " + describeLinkForResourceErrorDEV(currentProps) + "\n  + " + describeLinkForResourceErrorDEV(pendingProps), Error("Expected stylesheet with precedence to not be updated to a different kind of <link>. Check the `rel`, `href`, and `precedence` props of this component. Alternatively, check whether two different <link> components render in the same slot or share the same key." + pendingProps);
12081					return null;
12082				case "script": return currentProps = pendingProps.async, pendingProps = pendingProps.src, "string" === typeof pendingProps && currentProps && "function" !== typeof currentProps && "symbol" !== typeof currentProps ? (pendingProps = getScriptKey(pendingProps), currentProps = getResourcesFromRoot(resourceRoot).hoistableScripts, currentResource = currentProps.get(pendingProps), currentResource || (currentResource = {
12083					type: "script",
12084					instance: null,
12085					count: 0,
12086					state: null
12087				}, currentProps.set(pendingProps, currentResource)), currentResource) : {
12088					type: "void",
12089					instance: null,
12090					count: 0,
12091					state: null
12092				};
12093				default: throw Error("getResource encountered a type it did not expect: \"" + type + "\". this is a bug in React.");
12094			}
12095		}
12096		function describeLinkForResourceErrorDEV(props) {
12097			var describedProps = 0, description = "<link";
12098			"string" === typeof props.rel ? (describedProps++, description += " rel=\"" + props.rel + "\"") : hasOwnProperty.call(props, "rel") && (describedProps++, description += " rel=\"" + (null === props.rel ? "null" : "invalid type " + typeof props.rel) + "\"");
12099			"string" === typeof props.href ? (describedProps++, description += " href=\"" + props.href + "\"") : hasOwnProperty.call(props, "href") && (describedProps++, description += " href=\"" + (null === props.href ? "null" : "invalid type " + typeof props.href) + "\"");
12100			"string" === typeof props.precedence ? (describedProps++, description += " precedence=\"" + props.precedence + "\"") : hasOwnProperty.call(props, "precedence") && (describedProps++, description += " precedence={" + (null === props.precedence ? "null" : "invalid type " + typeof props.precedence) + "}");
12101			Object.getOwnPropertyNames(props).length > describedProps && (description += " ...");
12102			return description + " />";
12103		}
12104		function getStyleKey(href) {
12105			return "href=\"" + escapeSelectorAttributeValueInsideDoubleQuotes(href) + "\"";
12106		}
12107		function getStylesheetSelectorFromKey(key) {
12108			return "link[rel=\"stylesheet\"][" + key + "]";
12109		}
12110		function stylesheetPropsFromRawProps(rawProps) {
12111			return assign({}, rawProps, {
12112				"data-precedence": rawProps.precedence,
12113				precedence: null
12114			});
12115		}
12116		function preloadStylesheet(ownerDocument, key, preloadProps, state) {
12117			if (key = ownerDocument.querySelector("link[rel=\"preload\"][as=\"style\"][" + key + "]")) {
12118				if (!0 !== key[internalLoadPendingKey]) {
12119					state.loading = Loaded;
12120					return;
12121				}
12122			} else key = ownerDocument.createElement("link"), key[internalLoadPendingKey] = !0, key.onload = key.onerror = clearPendingLoadOnNode.bind(null, key), setInitialProperties(key, "link", preloadProps), markNodeAsHoistable(key), ownerDocument.head.appendChild(key);
12123			state.preload = key;
12124			key.addEventListener("load", function() {
12125				return state.loading |= Loaded;
12126			});
12127			key.addEventListener("error", function() {
12128				return state.loading |= Errored;
12129			});
12130		}
12131		function getScriptKey(src) {
12132			return "[src=\"" + escapeSelectorAttributeValueInsideDoubleQuotes(src) + "\"]";
12133		}
12134		function getScriptSelectorFromKey(key) {
12135			return "script[async]" + key;
12136		}
12137		function acquireResource(hoistableRoot, resource, props) {
12138			resource.count++;
12139			if (null === resource.instance) switch (resource.type) {
12140				case "style":
12141					var instance = hoistableRoot.querySelector("style[data-href~=\"" + escapeSelectorAttributeValueInsideDoubleQuotes(props.href) + "\"]");
12142					if (instance) return resource.instance = instance, markNodeAsHoistable(instance), instance;
12143					var styleProps = assign({}, props, {
12144						"data-href": props.href,
12145						"data-precedence": props.precedence,
12146						href: null,
12147						precedence: null
12148					});
12149					instance = (hoistableRoot.ownerDocument || hoistableRoot).createElement("style");
12150					markNodeAsHoistable(instance);
12151					setInitialProperties(instance, "style", styleProps);
12152					insertStylesheet(instance, props.precedence, hoistableRoot);
12153					return resource.instance = instance;
12154				case "stylesheet":
12155					styleProps = getStyleKey(props.href);
12156					var _instance = hoistableRoot.querySelector(getStylesheetSelectorFromKey(styleProps));
12157					if (_instance) return resource.state.loading |= Inserted, resource.instance = _instance, markNodeAsHoistable(_instance), _instance;
12158					instance = stylesheetPropsFromRawProps(props);
12159					(styleProps = preloadPropsMap.get(styleProps)) && adoptPreloadPropsForStylesheet(instance, styleProps);
12160					_instance = (hoistableRoot.ownerDocument || hoistableRoot).createElement("link");
12161					markNodeAsHoistable(_instance);
12162					var linkInstance = _instance;
12163					linkInstance._p = new Promise(function(resolve, reject) {
12164						linkInstance.onload = resolve;
12165						linkInstance.onerror = reject;
12166					});
12167					setInitialProperties(_instance, "link", instance);
12168					resource.state.loading |= Inserted;
12169					insertStylesheet(_instance, props.precedence, hoistableRoot);
12170					return resource.instance = _instance;
12171				case "script":
12172					_instance = getScriptKey(props.src);
12173					if (styleProps = hoistableRoot.querySelector(getScriptSelectorFromKey(_instance))) return resource.instance = styleProps, markNodeAsHoistable(styleProps), styleProps;
12174					instance = props;
12175					if (styleProps = preloadPropsMap.get(_instance)) instance = assign({}, props), adoptPreloadPropsForScript(instance, styleProps);
12176					hoistableRoot = hoistableRoot.ownerDocument || hoistableRoot;
12177					styleProps = hoistableRoot.createElement("script");
12178					markNodeAsHoistable(styleProps);
12179					setInitialProperties(styleProps, "link", instance);
12180					hoistableRoot.head.appendChild(styleProps);
12181					return resource.instance = styleProps;
12182				case "void": return null;
12183				default: throw Error("acquireResource encountered a resource type it did not expect: \"" + resource.type + "\". this is a bug in React.");
12184			}
12185			else "stylesheet" === resource.type && (resource.state.loading & Inserted) === NotLoaded && (instance = resource.instance, resource.state.loading |= Inserted, insertStylesheet(instance, props.precedence, hoistableRoot));
12186			return resource.instance;
12187		}
12188		function insertStylesheet(instance, precedence, root) {
12189			for (var nodes = root.querySelectorAll("link[rel=\"stylesheet\"][data-precedence],style[data-precedence]"), last = nodes.length ? nodes[nodes.length - 1] : null, prior = last, i = 0; i < nodes.length; i++) {
12190				var node = nodes[i];
12191				if (node.dataset.precedence === precedence) prior = node;
12192				else if (prior !== last) break;
12193			}
12194			prior ? prior.parentNode.insertBefore(instance, prior.nextSibling) : (precedence = 9 === root.nodeType ? root.head : root, precedence.insertBefore(instance, precedence.firstChild));
12195		}
12196		function adoptPreloadPropsForStylesheet(stylesheetProps, preloadProps) {
12197			stylesheetProps.crossOrigin ??= preloadProps.crossOrigin;
12198			stylesheetProps.referrerPolicy ??= preloadProps.referrerPolicy;
12199			stylesheetProps.title ??= preloadProps.title;
12200		}
12201		function adoptPreloadPropsForScript(scriptProps, preloadProps) {
12202			scriptProps.crossOrigin ??= preloadProps.crossOrigin;
12203			scriptProps.referrerPolicy ??= preloadProps.referrerPolicy;
12204			scriptProps.integrity ??= preloadProps.integrity;
12205		}
12206		function getHydratableHoistableCache(type, keyAttribute, ownerDocument) {
12207			if (null === tagCaches) {
12208				var cache = /* @__PURE__ */ new Map();
12209				var caches = tagCaches = /* @__PURE__ */ new Map();
12210				caches.set(ownerDocument, cache);
12211			} else caches = tagCaches, cache = caches.get(ownerDocument), cache || (cache = /* @__PURE__ */ new Map(), caches.set(ownerDocument, cache));
12212			if (cache.has(type)) return cache;
12213			cache.set(type, null);
12214			ownerDocument = ownerDocument.getElementsByTagName(type);
12215			for (caches = 0; caches < ownerDocument.length; caches++) {
12216				var node = ownerDocument[caches];
12217				if (!(node[internalHoistableMarker] || node[internalInstanceKey] || "link" === type && "stylesheet" === node.getAttribute("rel")) && node.namespaceURI !== SVG_NAMESPACE) {
12218					var nodeKey = node.getAttribute(keyAttribute) || "";
12219					nodeKey = type + nodeKey;
12220					var existing = cache.get(nodeKey);
12221					existing ? existing.push(node) : cache.set(nodeKey, [node]);
12222				}
12223			}
12224			return cache;
12225		}
12226		function mountHoistable(hoistableRoot, type, instance) {
12227			hoistableRoot = hoistableRoot.ownerDocument || hoistableRoot;
12228			hoistableRoot.head.insertBefore(instance, "title" === type ? hoistableRoot.querySelector("head > title") : null);
12229		}
12230		function isHostHoistableType(type, props, hostContext) {
12231			var outsideHostContainerContext = !hostContext.ancestorInfo.containerTagInScope;
12232			if (hostContext.context === HostContextNamespaceSvg || null != props.itemProp) return !outsideHostContainerContext || null == props.itemProp || "meta" !== type && "title" !== type && "style" !== type && "link" !== type && "script" !== type || console.error("Cannot render a <%s> outside the main document if it has an `itemProp` prop. `itemProp` suggests the tag belongs to an `itemScope` which can appear anywhere in the DOM. If you were intending for React to hoist this <%s> remove the `itemProp` prop. Otherwise, try moving this tag into the <head> or <body> of the Document.", type, type), !1;
12233			switch (type) {
12234				case "meta":
12235				case "title": return !0;
12236				case "style":
12237					if ("string" !== typeof props.precedence || "string" !== typeof props.href || "" === props.href) {
12238						outsideHostContainerContext && console.error("Cannot render a <style> outside the main document without knowing its precedence and a unique href key. React can hoist and deduplicate <style> tags if you provide a `precedence` prop along with an `href` prop that does not conflict with the `href` values used in any other hoisted <style> or <link rel=\"stylesheet\" ...> tags.  Note that hoisting <style> tags is considered an advanced feature that most will not use directly. Consider moving the <style> tag to the <head> or consider adding a `precedence=\"default\"` and `href=\"some unique resource identifier\"`.");
12239						break;
12240					}
12241					return !0;
12242				case "link":
12243					if ("string" !== typeof props.rel || "string" !== typeof props.href || "" === props.href || props.onLoad || props.onError) {
12244						if ("stylesheet" === props.rel && "string" === typeof props.precedence) {
12245							type = props.href;
12246							var onError = props.onError, disabled = props.disabled;
12247							hostContext = [];
12248							props.onLoad && hostContext.push("`onLoad`");
12249							onError && hostContext.push("`onError`");
12250							null != disabled && hostContext.push("`disabled`");
12251							onError = propNamesListJoin(hostContext, "and");
12252							onError += 1 === hostContext.length ? " prop" : " props";
12253							disabled = 1 === hostContext.length ? "an " + onError : "the " + onError;
12254							hostContext.length && console.error("React encountered a <link rel=\"stylesheet\" href=\"%s\" ... /> with a `precedence` prop that also included %s. The presence of loading and error handlers indicates an intent to manage the stylesheet loading state from your from your Component code and React will not hoist or deduplicate this stylesheet. If your intent was to have React hoist and deduplciate this stylesheet using the `precedence` prop remove the %s, otherwise remove the `precedence` prop.", type, disabled, onError);
12255						}
12256						outsideHostContainerContext && ("string" !== typeof props.rel || "string" !== typeof props.href || "" === props.href ? console.error("Cannot render a <link> outside the main document without a `rel` and `href` prop. Try adding a `rel` and/or `href` prop to this <link> or moving the link into the <head> tag") : (props.onError || props.onLoad) && console.error("Cannot render a <link> with onLoad or onError listeners outside the main document. Try removing onLoad={...} and onError={...} or moving it into the root <head> tag or somewhere in the <body>."));
12257						break;
12258					}
12259					switch (props.rel) {
12260						case "stylesheet": return type = props.precedence, props = props.disabled, "string" !== typeof type && outsideHostContainerContext && console.error("Cannot render a <link rel=\"stylesheet\" /> outside the main document without knowing its precedence. Consider adding precedence=\"default\" or moving it into the root <head> tag."), "string" === typeof type && null == props;
12261						default: return !0;
12262					}
12263				case "script":
12264					type = props.async && "function" !== typeof props.async && "symbol" !== typeof props.async;
12265					if (!type || props.onLoad || props.onError || !props.src || "string" !== typeof props.src) {
12266						outsideHostContainerContext && (type ? props.onLoad || props.onError ? console.error("Cannot render a <script> with onLoad or onError listeners outside the main document. Try removing onLoad={...} and onError={...} or moving it into the root <head> tag or somewhere in the <body>.") : console.error("Cannot render a <script> outside the main document without `async={true}` and a non-empty `src` prop. Ensure there is a valid `src` and either make the script async or move it into the root <head> tag or somewhere in the <body>.") : console.error("Cannot render a sync or defer <script> outside the main document without knowing its order. Try adding async=\"\" or moving it into the root <head> tag."));
12267						break;
12268					}
12269					return !0;
12270				case "noscript":
12271				case "template": outsideHostContainerContext && console.error("Cannot render <%s> outside the main document. Try moving it into the root <head> tag.", type);
12272			}
12273			return !1;
12274		}
12275		function maySuspendCommit(type, props) {
12276			return "img" === type && null != props.src && "" !== props.src && null == props.onLoad && "lazy" !== props.loading;
12277		}
12278		function preloadResource(resource) {
12279			return "stylesheet" === resource.type && (resource.state.loading & Settled) === NotLoaded ? !1 : !0;
12280		}
12281		function estimateImageBytes(instance) {
12282			return (instance.width || 100) * (instance.height || 100) * ("number" === typeof devicePixelRatio ? devicePixelRatio : 1) * .25;
12283		}
12284		function suspendInstance(state, instance) {
12285			"function" === typeof instance.decode && (state.imgCount++, instance.complete || (state.imgBytes += estimateImageBytes(instance), state.suspenseyImages.push(instance)), state = onUnsuspendImg.b
vendor: 11,964 bytes, lines 12285-12517
12285ind(state), instance.decode().then(state, state));
12286		}
12287		function suspendResource(state, hoistableRoot, resource, props) {
12288			if ("stylesheet" === resource.type && ("string" !== typeof props.media || !1 !== matchMedia(props.media).matches) && (resource.state.loading & Inserted) === NotLoaded) {
12289				if (null === resource.instance) {
12290					var key = getStyleKey(props.href), instance = hoistableRoot.querySelector(getStylesheetSelectorFromKey(key));
12291					if (instance) {
12292						hoistableRoot = instance._p;
12293						null !== hoistableRoot && "object" === typeof hoistableRoot && "function" === typeof hoistableRoot.then && (state.count++, state = onUnsuspend.bind(state), hoistableRoot.then(state, state));
12294						resource.state.loading |= Inserted;
12295						resource.instance = instance;
12296						markNodeAsHoistable(instance);
12297						return;
12298					}
12299					instance = hoistableRoot.ownerDocument || hoistableRoot;
12300					props = stylesheetPropsFromRawProps(props);
12301					(key = preloadPropsMap.get(key)) && adoptPreloadPropsForStylesheet(props, key);
12302					instance = instance.createElement("link");
12303					markNodeAsHoistable(instance);
12304					var linkInstance = instance;
12305					linkInstance._p = new Promise(function(resolve, reject) {
12306						linkInstance.onload = resolve;
12307						linkInstance.onerror = reject;
12308					});
12309					setInitialProperties(instance, "link", props);
12310					resource.instance = instance;
12311				}
12312				null === state.stylesheets && (state.stylesheets = /* @__PURE__ */ new Map());
12313				state.stylesheets.set(resource, hoistableRoot);
12314				(hoistableRoot = resource.state.preload) && (resource.state.loading & Settled) === NotLoaded && (state.count++, resource = onUnsuspend.bind(state), hoistableRoot.addEventListener("load", resource), hoistableRoot.addEventListener("error", resource));
12315			}
12316		}
12317		function waitForCommitToBeReady(state, timeoutOffset) {
12318			state.stylesheets && 0 === state.count && insertSuspendedStylesheets(state, state.stylesheets);
12319			return 0 < state.count || 0 < state.imgCount ? function(commit) {
12320				var stylesheetTimer = setTimeout(function() {
12321					state.stylesheets && insertSuspendedStylesheets(state, state.stylesheets);
12322					if (state.unsuspend) {
12323						var unsuspend = state.unsuspend;
12324						state.unsuspend = null;
12325						unsuspend();
12326					}
12327				}, SUSPENSEY_STYLESHEET_TIMEOUT + timeoutOffset);
12328				0 < state.imgBytes && 0 === estimatedBytesWithinLimit && (estimatedBytesWithinLimit = 125 * estimateBandwidth() * SUSPENSEY_IMAGE_TIME_ESTIMATE);
12329				var imgTimer = setTimeout(function() {
12330					state.waitingForImages = !1;
12331					if (0 === state.count && (state.stylesheets && insertSuspendedStylesheets(state, state.stylesheets), state.unsuspend)) {
12332						var unsuspend = state.unsuspend;
12333						state.unsuspend = null;
12334						unsuspend();
12335					}
12336				}, (state.imgBytes > estimatedBytesWithinLimit ? 50 : SUSPENSEY_IMAGE_TIMEOUT) + timeoutOffset);
12337				state.unsuspend = commit;
12338				return function() {
12339					state.unsuspend = null;
12340					clearTimeout(stylesheetTimer);
12341					clearTimeout(imgTimer);
12342				};
12343			} : null;
12344		}
12345		function checkIfFullyUnsuspended(state) {
12346			if (0 === state.count && (0 === state.imgCount || !state.waitingForImages)) {
12347				if (state.stylesheets) insertSuspendedStylesheets(state, state.stylesheets);
12348				else if (state.unsuspend) {
12349					var unsuspend = state.unsuspend;
12350					state.unsuspend = null;
12351					unsuspend();
12352				}
12353			}
12354		}
12355		function onUnsuspend() {
12356			this.count--;
12357			checkIfFullyUnsuspended(this);
12358		}
12359		function onUnsuspendImg() {
12360			this.imgCount--;
12361			checkIfFullyUnsuspended(this);
12362		}
12363		function insertSuspendedStylesheets(state, resources) {
12364			state.stylesheets = null;
12365			null !== state.unsuspend && (state.count++, precedencesByRoot = /* @__PURE__ */ new Map(), resources.forEach(insertStylesheetIntoRoot, state), precedencesByRoot = null, onUnsuspend.call(state));
12366		}
12367		function insertStylesheetIntoRoot(root, resource) {
12368			if (!(resource.state.loading & Inserted)) {
12369				var precedences = precedencesByRoot.get(root);
12370				if (precedences) var last = precedences.get(LAST_PRECEDENCE);
12371				else {
12372					precedences = /* @__PURE__ */ new Map();
12373					precedencesByRoot.set(root, precedences);
12374					for (var nodes = root.querySelectorAll("link[data-precedence],style[data-precedence]"), i = 0; i < nodes.length; i++) {
12375						var node = nodes[i];
12376						if ("LINK" === node.nodeName || "not all" !== node.getAttribute("media")) precedences.set(node.dataset.precedence, node), last = node;
12377					}
12378					last && precedences.set(LAST_PRECEDENCE, last);
12379				}
12380				nodes = resource.instance;
12381				node = nodes.getAttribute("data-precedence");
12382				i = precedences.get(node) || last;
12383				i === last && precedences.set(LAST_PRECEDENCE, nodes);
12384				precedences.set(node, nodes);
12385				this.count++;
12386				last = onUnsuspend.bind(this);
12387				nodes.addEventListener("load", last);
12388				nodes.addEventListener("error", last);
12389				i ? i.parentNode.insertBefore(nodes, i.nextSibling) : (root = 9 === root.nodeType ? root.head : root, root.insertBefore(nodes, root.firstChild));
12390				resource.state.loading |= Inserted;
12391			}
12392		}
12393		function FiberRootNode(containerInfo, tag, hydrate, identifierPrefix, onUncaughtError, onCaughtError, onRecoverableError, onDefaultTransitionIndicator, formState) {
12394			this.tag = 1;
12395			this.containerInfo = containerInfo;
12396			this.pingCache = this.current = this.pendingChildren = null;
12397			this.timeoutHandle = noTimeout;
12398			this.callbackNode = this.next = this.pendingContext = this.context = this.cancelPendingCommit = null;
12399			this.callbackPriority = 0;
12400			this.expirationTimes = createLaneMap(-1);
12401			this.entangledLanes = this.shellSuspendCounter = this.errorRecoveryDisabledLanes = this.expiredLanes = this.warmLanes = this.pingedLanes = this.suspendedLanes = this.pendingLanes = 0;
12402			this.entanglements = createLaneMap(0);
12403			this.hiddenUpdates = createLaneMap(null);
12404			this.identifierPrefix = identifierPrefix;
12405			this.onUncaughtError = onUncaughtError;
12406			this.onCaughtError = onCaughtError;
12407			this.onRecoverableError = onRecoverableError;
12408			this.pooledCache = null;
12409			this.pooledCacheLanes = 0;
12410			this.formState = formState;
12411			this.transitionTypes = null;
12412			this.incompleteTransitions = /* @__PURE__ */ new Map();
12413			this.passiveEffectDuration = this.effectDuration = -0;
12414			this.memoizedUpdaters = /* @__PURE__ */ new Set();
12415			containerInfo = this.pendingUpdatersLaneMap = [];
12416			for (tag = 0; 31 > tag; tag++) containerInfo.push(/* @__PURE__ */ new Set());
12417			this._debugRootType = hydrate ? "hydrateRoot()" : "createRoot()";
12418		}
12419		function createFiberRoot(containerInfo, tag, hydrate, initialChildren, hydrationCallbacks, isStrictMode, identifierPrefix, formState, onUncaughtError, onCaughtError, onRecoverableError, onDefaultTransitionIndicator) {
12420			containerInfo = new FiberRootNode(containerInfo, tag, hydrate, identifierPrefix, onUncaughtError, onCaughtError, onRecoverableError, onDefaultTransitionIndicator, formState);
12421			tag = ConcurrentMode;
12422			!0 === isStrictMode && (tag |= StrictLegacyMode | StrictEffectsMode);
12423			tag |= ProfileMode;
12424			isStrictMode = createFiber(3, null, null, tag);
12425			containerInfo.current = isStrictMode;
12426			isStrictMode.stateNode = containerInfo;
12427			tag = createCache();
12428			retainCache(tag);
12429			containerInfo.pooledCache = tag;
12430			retainCache(tag);
12431			isStrictMode.memoizedState = {
12432				element: initialChildren,
12433				isDehydrated: hydrate,
12434				cache: tag
12435			};
12436			initializeUpdateQueue(isStrictMode);
12437			return containerInfo;
12438		}
12439		function getContextForSubtree(parentComponent) {
12440			if (!parentComponent) return emptyContextObject;
12441			parentComponent = emptyContextObject;
12442			return parentComponent;
12443		}
12444		function updateContainerImpl(rootFiber, lane, element, container, parentComponent, callback) {
12445			if (injectedHook && "function" === typeof injectedHook.onScheduleFiberRoot) try {
12446				injectedHook.onScheduleFiberRoot(rendererID, container, element);
12447			} catch (err) {
12448				hasLoggedError || (hasLoggedError = !0, console.error("React instrumentation encountered an error: %o", err));
12449			}
12450			parentComponent = getContextForSubtree(parentComponent);
12451			null === container.context ? container.context = parentComponent : container.pendingContext = parentComponent;
12452			isRendering && null !== current && !didWarnAboutNestedUpdates && (didWarnAboutNestedUpdates = !0, console.error("Render methods should be a pure function of props and state; triggering nested component updates from render is not allowed. If necessary, trigger nested updates in componentDidUpdate.\n\nCheck the render method of %s.", getComponentNameFromFiber(current) || "Unknown"));
12453			container = createUpdate(lane);
12454			container.payload = { element };
12455			callback = void 0 === callback ? null : callback;
12456			null !== callback && ("function" !== typeof callback && console.error("Expected the last optional `callback` argument to be a function. Instead received: %s.", callback), container.callback = callback);
12457			element = enqueueUpdate(rootFiber, container, lane);
12458			null !== element && (startUpdateTimerByLane(lane, "root.render()", null), scheduleUpdateOnFiber(element, rootFiber, lane), entangleTransitions(element, rootFiber, lane));
12459		}
12460		function markRetryLaneImpl(fiber, retryLane) {
12461			fiber = fiber.memoizedState;
12462			if (null !== fiber && null !== fiber.dehydrated) {
12463				var a = fiber.retryLane;
12464				fiber.retryLane = 0 !== a && a < retryLane ? a : retryLane;
12465			}
12466		}
12467		function markRetryLaneIfNotHydrated(fiber, retryLane) {
12468			markRetryLaneImpl(fiber, retryLane);
12469			(fiber = fiber.alternate) && markRetryLaneImpl(fiber, retryLane);
12470		}
12471		function attemptContinuousHydration(fiber) {
12472			if (13 === fiber.tag || 31 === fiber.tag) {
12473				var root = enqueueConcurrentRenderForLane(fiber, 67108864);
12474				null !== root && scheduleUpdateOnFiber(root, fiber, 67108864);
12475				markRetryLaneIfNotHydrated(fiber, 67108864);
12476			}
12477		}
12478		function attemptHydrationAtCurrentPriority(fiber) {
12479			if (13 === fiber.tag || 31 === fiber.tag) {
12480				var lane = requestUpdateLane(fiber);
12481				lane = getBumpedLaneForHydrationByLane(lane);
12482				var root = enqueueConcurrentRenderForLane(fiber, lane);
12483				null !== root && scheduleUpdateOnFiber(root, fiber, lane);
12484				markRetryLaneIfNotHydrated(fiber, lane);
12485			}
12486		}
12487		function getCurrentFiberForDevTools() {
12488			return current;
12489		}
12490		function dispatchDiscreteEvent(domEventName, eventSystemFlags, container, nativeEvent) {
12491			var prevTransition = ReactSharedInternals.T;
12492			ReactSharedInternals.T = null;
12493			var previousPriority = ReactDOMSharedInternals.p;
12494			try {
12495				ReactDOMSharedInternals.p = DiscreteEventPriority, dispatchEvent(domEventName, eventSystemFlags, container, nativeEvent);
12496			} finally {
12497				ReactDOMSharedInternals.p = previousPriority, ReactSharedInternals.T = prevTransition;
12498			}
12499		}
12500		function dispatchContinuousEvent(domEventName, eventSystemFlags, container, nativeEvent) {
12501			var prevTransition = ReactSharedInternals.T;
12502			ReactSharedInternals.T = null;
12503			var previousPriority = ReactDOMSharedInternals.p;
12504			try {
12505				ReactDOMSharedInternals.p = ContinuousEventPriority, dispatchEvent(domEventName, eventSystemFlags, container, nativeEvent);
12506			} finally {
12507				ReactDOMSharedInternals.p = previousPriority, ReactSharedInternals.T = prevTransition;
12508			}
12509		}
12510		function dispatchEvent(domEventName, eventSystemFlags, targetContainer, nativeEvent) {
12511			if (_enabled) {
12512				var blockedOn = findInstanceBlockingEvent(nativeEvent);
12513				if (null === blockedOn) dispatchEventForPluginEventSystem(domEventName, eventSystemFlags, nativeEvent, return_targetInst, targetContainer), clearIfContinuousEvent(domEventName, nativeEvent);
12514				else if (queueIfContinuousEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent)) nativeEvent.stopPropagation();
12515				else if (clearIfContinuousEvent(domEventName, nativeEvent), eventSystemFlags & 4 && -1 < discreteReplayableEvents.indexOf(domEventName)) {
12516					for (; null !== blockedOn;) {
12517						var fiber = getInstanceFromNode(blockedOn);
vendor: 9,582 bytes, lines 12518-12751
12518						if (null !== fiber) switch (fiber.tag) {
12519							case 3:
12520								fiber = fiber.stateNode;
12521								if (fiber.current.memoizedState.isDehydrated) {
12522									var lanes = getHighestPriorityLanes(fiber.pendingLanes);
12523									if (0 !== lanes) {
12524										var root = fiber;
12525										root.pendingLanes |= 2;
12526										for (root.entangledLanes |= 2; lanes;) {
12527											var lane = 1 << 31 - clz32(lanes);
12528											root.entanglements[1] |= lane;
12529											lanes &= ~lane;
12530										}
12531										ensureRootIsScheduled(fiber);
12532										(executionContext & (RenderContext | CommitContext)) === NoContext && (workInProgressRootRenderTargetTime = now$1() + RENDER_TIMEOUT_MS, flushSyncWorkAcrossRoots_impl(0, !1));
12533									}
12534								}
12535								break;
12536							case 31:
12537							case 13: root = enqueueConcurrentRenderForLane(fiber, 2), null !== root && scheduleUpdateOnFiber(root, fiber, 2), flushSyncWork$1(), markRetryLaneIfNotHydrated(fiber, 2);
12538						}
12539						fiber = findInstanceBlockingEvent(nativeEvent);
12540						null === fiber && dispatchEventForPluginEventSystem(domEventName, eventSystemFlags, nativeEvent, return_targetInst, targetContainer);
12541						if (fiber === blockedOn) break;
12542						blockedOn = fiber;
12543					}
12544					null !== blockedOn && nativeEvent.stopPropagation();
12545				} else dispatchEventForPluginEventSystem(domEventName, eventSystemFlags, nativeEvent, null, targetContainer);
12546			}
12547		}
12548		function findInstanceBlockingEvent(nativeEvent) {
12549			nativeEvent = getEventTarget(nativeEvent);
12550			return findInstanceBlockingTarget(nativeEvent);
12551		}
12552		function findInstanceBlockingTarget(targetNode) {
12553			return_targetInst = null;
12554			targetNode = getClosestInstanceFromNode(targetNode);
12555			if (null !== targetNode) {
12556				var nearestMounted = getNearestMountedFiber(targetNode);
12557				if (null === nearestMounted) targetNode = null;
12558				else {
12559					var tag = nearestMounted.tag;
12560					if (13 === tag) {
12561						targetNode = getSuspenseInstanceFromFiber(nearestMounted);
12562						if (null !== targetNode) return targetNode;
12563						targetNode = null;
12564					} else if (31 === tag) {
12565						targetNode = getActivityInstanceFromFiber(nearestMounted);
12566						if (null !== targetNode) return targetNode;
12567						targetNode = null;
12568					} else if (3 === tag) {
12569						if (nearestMounted.stateNode.current.memoizedState.isDehydrated) return 3 === nearestMounted.tag ? nearestMounted.stateNode.containerInfo : null;
12570						targetNode = null;
12571					} else nearestMounted !== targetNode && (targetNode = null);
12572				}
12573			}
12574			return_targetInst = targetNode;
12575			return null;
12576		}
12577		function getEventPriority(domEventName) {
12578			switch (domEventName) {
12579				case "beforetoggle":
12580				case "cancel":
12581				case "click":
12582				case "close":
12583				case "contextmenu":
12584				case "copy":
12585				case "cut":
12586				case "auxclick":
12587				case "dblclick":
12588				case "dragend":
12589				case "dragstart":
12590				case "drop":
12591				case "focusin":
12592				case "focusout":
12593				case "input":
12594				case "invalid":
12595				case "keydown":
12596				case "keypress":
12597				case "keyup":
12598				case "mousedown":
12599				case "mouseup":
12600				case "paste":
12601				case "pause":
12602				case "play":
12603				case "pointercancel":
12604				case "pointerdown":
12605				case "pointerup":
12606				case "ratechange":
12607				case "reset":
12608				case "seeked":
12609				case "submit":
12610				case "toggle":
12611				case "touchcancel":
12612				case "touchend":
12613				case "touchstart":
12614				case "volumechange":
12615				case "change":
12616				case "selectionchange":
12617				case "textInput":
12618				case "compositionstart":
12619				case "compositionend":
12620				case "compositionupdate":
12621				case "beforeblur":
12622				case "afterblur":
12623				case "beforeinput":
12624				case "blur":
12625				case "fullscreenchange":
12626				case "fullscreenerror":
12627				case "focus":
12628				case "hashchange":
12629				case "popstate":
12630				case "select":
12631				case "selectstart": return DiscreteEventPriority;
12632				case "drag":
12633				case "dragenter":
12634				case "dragexit":
12635				case "dragleave":
12636				case "dragover":
12637				case "mousemove":
12638				case "mouseout":
12639				case "mouseover":
12640				case "pointermove":
12641				case "pointerout":
12642				case "pointerover":
12643				case "resize":
12644				case "scroll":
12645				case "touchmove":
12646				case "wheel":
12647				case "mouseenter":
12648				case "mouseleave":
12649				case "pointerenter":
12650				case "pointerleave": return ContinuousEventPriority;
12651				case "message": switch (getCurrentPriorityLevel()) {
12652					case ImmediatePriority: return DiscreteEventPriority;
12653					case UserBlockingPriority: return ContinuousEventPriority;
12654					case NormalPriority$1:
12655					case LowPriority: return DefaultEventPriority;
12656					case IdlePriority: return IdleEventPriority;
12657					default: return DefaultEventPriority;
12658				}
12659				default: return DefaultEventPriority;
12660			}
12661		}
12662		function clearIfContinuousEvent(domEventName, nativeEvent) {
12663			switch (domEventName) {
12664				case "focusin":
12665				case "focusout":
12666					queuedFocus = null;
12667					break;
12668				case "dragenter":
12669				case "dragleave":
12670					queuedDrag = null;
12671					break;
12672				case "mouseover":
12673				case "mouseout":
12674					queuedMouse = null;
12675					break;
12676				case "pointerover":
12677				case "pointerout":
12678					queuedPointers.delete(nativeEvent.pointerId);
12679					break;
12680				case "gotpointercapture":
12681				case "lostpointercapture": queuedPointerCaptures.delete(nativeEvent.pointerId);
12682			}
12683		}
12684		function accumulateOrCreateContinuousQueuedReplayableEvent(existingQueuedEvent, blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent) {
12685			if (null === existingQueuedEvent || existingQueuedEvent.nativeEvent !== nativeEvent) return existingQueuedEvent = {
12686				blockedOn,
12687				domEventName,
12688				eventSystemFlags,
12689				nativeEvent,
12690				targetContainers: [targetContainer]
12691			}, null !== blockedOn && (blockedOn = getInstanceFromNode(blockedOn), null !== blockedOn && attemptContinuousHydration(blockedOn)), existingQueuedEvent;
12692			existingQueuedEvent.eventSystemFlags |= eventSystemFlags;
12693			blockedOn = existingQueuedEvent.targetContainers;
12694			null !== targetContainer && -1 === blockedOn.indexOf(targetContainer) && blockedOn.push(targetContainer);
12695			return existingQueuedEvent;
12696		}
12697		function queueIfContinuousEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent) {
12698			switch (domEventName) {
12699				case "focusin": return queuedFocus = accumulateOrCreateContinuousQueuedReplayableEvent(queuedFocus, blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent), !0;
12700				case "dragenter": return queuedDrag = accumulateOrCreateContinuousQueuedReplayableEvent(queuedDrag, blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent), !0;
12701				case "mouseover": return queuedMouse = accumulateOrCreateContinuousQueuedReplayableEvent(queuedMouse, blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent), !0;
12702				case "pointerover":
12703					var pointerId = nativeEvent.pointerId;
12704					queuedPointers.set(pointerId, accumulateOrCreateContinuousQueuedReplayableEvent(queuedPointers.get(pointerId) || null, blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent));
12705					return !0;
12706				case "gotpointercapture": return pointerId = nativeEvent.pointerId, queuedPointerCaptures.set(pointerId, accumulateOrCreateContinuousQueuedReplayableEvent(queuedPointerCaptures.get(pointerId) || null, blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent)), !0;
12707			}
12708			return !1;
12709		}
12710		function attemptExplicitHydrationTarget(queuedTarget) {
12711			var targetInst = getClosestInstanceFromNode(queuedTarget.target);
12712			if (null !== targetInst) {
12713				var nearestMounted = getNearestMountedFiber(targetInst);
12714				if (null !== nearestMounted) {
12715					if (targetInst = nearestMounted.tag, 13 === targetInst) {
12716						if (targetInst = getSuspenseInstanceFromFiber(nearestMounted), null !== targetInst) {
12717							queuedTarget.blockedOn = targetInst;
12718							runWithPriority(queuedTarget.priority, function() {
12719								attemptHydrationAtCurrentPriority(nearestMounted);
12720							});
12721							return;
12722						}
12723					} else if (31 === targetInst) {
12724						if (targetInst = getActivityInstanceFromFiber(nearestMounted), null !== targetInst) {
12725							queuedTarget.blockedOn = targetInst;
12726							runWithPriority(queuedTarget.priority, function() {
12727								attemptHydrationAtCurrentPriority(nearestMounted);
12728							});
12729							return;
12730						}
12731					} else if (3 === targetInst && nearestMounted.stateNode.current.memoizedState.isDehydrated) {
12732						queuedTarget.blockedOn = 3 === nearestMounted.tag ? nearestMounted.stateNode.containerInfo : null;
12733						return;
12734					}
12735				}
12736			}
12737			queuedTarget.blockedOn = null;
12738		}
12739		function attemptReplayContinuousQueuedEvent(queuedEvent) {
12740			if (null !== queuedEvent.blockedOn) return !1;
12741			for (var targetContainers = queuedEvent.targetContainers; 0 < targetContainers.length;) {
12742				var nextBlockedOn = findInstanceBlockingEvent(queuedEvent.nativeEvent);
12743				if (null === nextBlockedOn) {
12744					nextBlockedOn = queuedEvent.nativeEvent;
12745					var nativeEventClone = new nextBlockedOn.constructor(nextBlockedOn.type, nextBlockedOn), event = nativeEventClone;
12746					null !== currentReplayingEvent && console.error("Expected currently replaying event to be null. This error is likely caused by a bug in React. Please file an issue.");
12747					currentReplayingEvent = event;
12748					nextBlockedOn.target.dispatchEvent(nativeEventClone);
12749					null === currentReplayingEvent && console.error("Expected currently replaying event to not be null. This error is likely caused by a bug in React. Please file an issue.");
12750					currentReplayingEvent = null;
12751				} else return targetContainers = getInstanceFromNode(nextBlockedOn), null !== targetContainers && attemptContinuousHydration(targetContainers
vendor: 7,950 bytes, lines 12751-12875
12751), queuedEvent.blockedOn = nextBlockedOn, !1;
12752				targetContainers.shift();
12753			}
12754			return !0;
12755		}
12756		function attemptReplayContinuousQueuedEventInMap(queuedEvent, key, map) {
12757			attemptReplayContinuousQueuedEvent(queuedEvent) && map.delete(key);
12758		}
12759		function replayUnblockedEvents() {
12760			hasScheduledReplayAttempt = !1;
12761			null !== queuedFocus && attemptReplayContinuousQueuedEvent(queuedFocus) && (queuedFocus = null);
12762			null !== queuedDrag && attemptReplayContinuousQueuedEvent(queuedDrag) && (queuedDrag = null);
12763			null !== queuedMouse && attemptReplayContinuousQueuedEvent(queuedMouse) && (queuedMouse = null);
12764			queuedPointers.forEach(attemptReplayContinuousQueuedEventInMap);
12765			queuedPointerCaptures.forEach(attemptReplayContinuousQueuedEventInMap);
12766		}
12767		function scheduleCallbackIfUnblocked(queuedEvent, unblocked) {
12768			queuedEvent.blockedOn === unblocked && (queuedEvent.blockedOn = null, hasScheduledReplayAttempt || (hasScheduledReplayAttempt = !0, Scheduler.unstable_scheduleCallback(Scheduler.unstable_NormalPriority, replayUnblockedEvents)));
12769		}
12770		function scheduleReplayQueueIfNeeded(formReplayingQueue) {
12771			lastScheduledReplayQueue !== formReplayingQueue && (lastScheduledReplayQueue = formReplayingQueue, Scheduler.unstable_scheduleCallback(Scheduler.unstable_NormalPriority, function() {
12772				lastScheduledReplayQueue === formReplayingQueue && (lastScheduledReplayQueue = null);
12773				for (var i = 0; i < formReplayingQueue.length; i += 3) {
12774					var form = formReplayingQueue[i], submitterOrAction = formReplayingQueue[i + 1], formData = formReplayingQueue[i + 2];
12775					if ("function" !== typeof submitterOrAction) if (null === findInstanceBlockingTarget(submitterOrAction || form)) continue;
12776					else break;
12777					var formInst = getInstanceFromNode(form);
12778					null !== formInst && (formReplayingQueue.splice(i, 3), i -= 3, form = {
12779						pending: !0,
12780						data: formData,
12781						method: form.method,
12782						action: submitterOrAction
12783					}, Object.freeze(form), startHostTransition(formInst, form, submitterOrAction, formData));
12784				}
12785			}));
12786		}
12787		function retryIfBlockedOn(unblocked) {
12788			function unblock(queuedEvent) {
12789				return scheduleCallbackIfUnblocked(queuedEvent, unblocked);
12790			}
12791			null !== queuedFocus && scheduleCallbackIfUnblocked(queuedFocus, unblocked);
12792			null !== queuedDrag && scheduleCallbackIfUnblocked(queuedDrag, unblocked);
12793			null !== queuedMouse && scheduleCallbackIfUnblocked(queuedMouse, unblocked);
12794			queuedPointers.forEach(unblock);
12795			queuedPointerCaptures.forEach(unblock);
12796			for (var i = 0; i < queuedExplicitHydrationTargets.length; i++) {
12797				var queuedTarget = queuedExplicitHydrationTargets[i];
12798				queuedTarget.blockedOn === unblocked && (queuedTarget.blockedOn = null);
12799			}
12800			for (; 0 < queuedExplicitHydrationTargets.length && (i = queuedExplicitHydrationTargets[0], null === i.blockedOn);) attemptExplicitHydrationTarget(i), null === i.blockedOn && queuedExplicitHydrationTargets.shift();
12801			i = (unblocked.ownerDocument || unblocked).$$reactFormReplay;
12802			if (null != i) for (queuedTarget = 0; queuedTarget < i.length; queuedTarget += 3) {
12803				var form = i[queuedTarget], submitterOrAction = i[queuedTarget + 1], formProps = form[internalPropsKey] || null;
12804				if ("function" === typeof submitterOrAction) formProps || scheduleReplayQueueIfNeeded(i);
12805				else if (formProps) {
12806					var action = null;
12807					if (submitterOrAction && submitterOrAction.hasAttribute("formAction")) {
12808						if (form = submitterOrAction, formProps = submitterOrAction[internalPropsKey] || null) action = formProps.formAction;
12809						else if (null !== findInstanceBlockingTarget(form)) continue;
12810					} else action = formProps.action;
12811					"function" === typeof action ? i[queuedTarget + 1] = action : (i.splice(queuedTarget, 3), queuedTarget -= 3);
12812					scheduleReplayQueueIfNeeded(i);
12813				}
12814			}
12815		}
12816		function defaultOnDefaultTransitionIndicator() {
12817			function handleNavigate(event) {
12818				event.canIntercept && "react-transition" === event.info && event.intercept({
12819					handler: function() {
12820						return new Promise(function(resolve) {
12821							return pendingResolve = resolve;
12822						});
12823					},
12824					focusReset: "manual",
12825					scroll: "manual"
12826				});
12827			}
12828			function handleNavigateComplete() {
12829				null !== pendingResolve && (pendingResolve(), pendingResolve = null);
12830				isCancelled || setTimeout(startFakeNavigation, 20);
12831			}
12832			function startFakeNavigation() {
12833				if (!isCancelled && !navigation.transition) {
12834					var currentEntry = navigation.currentEntry;
12835					currentEntry && null != currentEntry.url && navigation.navigate(currentEntry.url, {
12836						state: currentEntry.getState(),
12837						info: "react-transition",
12838						history: "replace"
12839					});
12840				}
12841			}
12842			if ("object" === typeof navigation) {
12843				var isCancelled = !1, pendingResolve = null;
12844				navigation.addEventListener("navigate", handleNavigate);
12845				navigation.addEventListener("navigatesuccess", handleNavigateComplete);
12846				navigation.addEventListener("navigateerror", handleNavigateComplete);
12847				setTimeout(startFakeNavigation, 100);
12848				return function() {
12849					isCancelled = !0;
12850					navigation.removeEventListener("navigate", handleNavigate);
12851					navigation.removeEventListener("navigatesuccess", handleNavigateComplete);
12852					navigation.removeEventListener("navigateerror", handleNavigateComplete);
12853					null !== pendingResolve && (pendingResolve(), pendingResolve = null);
12854				};
12855			}
12856		}
12857		function ReactDOMRoot(internalRoot) {
12858			this._internalRoot = internalRoot;
12859		}
12860		function ReactDOMHydrationRoot(internalRoot) {
12861			this._internalRoot = internalRoot;
12862		}
12863		function warnIfReactDOMContainerInDEV(container) {
12864			container[internalContainerInstanceKey] && (container._reactRootContainer ? console.error("You are calling ReactDOMClient.createRoot() on a container that was previously passed to ReactDOM.render(). This is not supported.") : console.error("You are calling ReactDOMClient.createRoot() on a container that has already been passed to createRoot() before. Instead, call root.render() on the existing root instead if you want to update it."));
12865		}
12866		"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());
12867		var Scheduler = require_scheduler(), React = require_react(), ReactDOM = require_react_dom(), searchTarget = null, searchBoundary = null, assign = Object.assign, REACT_LEGACY_ELEMENT_TYPE = Symbol.for("react.element"), REACT_ELEMENT_TYPE = Symbol.for("react.transitional.element"), REACT_PORTAL_TYPE = Symbol.for("react.portal"), REACT_FRAGMENT_TYPE = Symbol.for("react.fragment"), REACT_STRICT_MODE_TYPE = Symbol.for("react.strict_mode"), REACT_PROFILER_TYPE = Symbol.for("react.profiler"), REACT_CONSUMER_TYPE = Symbol.for("react.consumer"), REACT_CONTEXT_TYPE = Symbol.for("react.context"), REACT_FORWARD_REF_TYPE = Symbol.for("react.forward_ref"), REACT_SUSPENSE_TYPE = Symbol.for("react.suspense"), REACT_SUSPENSE_LIST_TYPE = Symbol.for("react.suspense_list"), REACT_MEMO_TYPE = Symbol.for("react.memo"), REACT_LAZY_TYPE = Symbol.for("react.lazy");
12868		var REACT_ACTIVITY_TYPE = Symbol.for("react.activity"), REACT_LEGACY_HIDDEN_TYPE = Symbol.for("react.legacy_hidden");
12869		var REACT_MEMO_CACHE_SENTINEL = Symbol.for("react.memo_cache_sentinel"), REACT_VIEW_TRANSITION_TYPE = Symbol.for("react.view_transition"), REACT_RECOVERABLE_TYPE = Symbol.for("react.recoverable"), MAYBE_ITERATOR_SYMBOL = Symbol.iterator, REACT_CLIENT_REFERENCE = Symbol.for("react.client.reference"), isArrayImpl = Array.isArray, ReactSharedInternals = React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE, ReactDOMSharedInternals = ReactDOM.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE, NotPending = Object.freeze({
12870			pending: !1,
12871			data: null,
12872			method: null,
12873			action: null
12874		}), valueStack = [];
12875		var fiberStack = [];
12876		var index$jscomp$0 = -1, contextStackCursor = createCursor(null), contextFiberStackCursor = createCursor(null), rootInstanceStackCursor = createCursor(null), hostTransitionProviderCursor = createCursor(null), disabledDepth = 0, prevLog, prevInfo, prevWarn, prevError, prevGroup, prevGroupCollapsed, prevGroupEnd;
12877		disabledLog.__reactDisabledLog = !0;
12878		var prefix, suffix, reentry = !1;
12879		var componentFrameCache = new ("function" === typeof WeakMap ? WeakMap : Map)();
12880		var current = null, isRendering = !1, hasOwnProperty = Object.prototype.hasOwnProperty, scheduleCallback$3 = Scheduler.unstable_scheduleCallback, cancelCallback$1 = Scheduler.unstable_cancelCallback, shouldYield = Scheduler.unstable_shouldYield, requestPaint = Scheduler.unstable_requestPaint, now$1 = Scheduler.unstable_now, getCurrentPriorityLevel = Scheduler.unstable_getCurrentPriorityLevel, ImmediatePriority = Scheduler.unstable_ImmediatePriority, UserBlockingPriority = Scheduler.unstable_UserBlockingPriority, NormalPriority$1 = Scheduler.unstable_NormalPriority, LowPriority = Scheduler.unstable_LowPriority, IdlePriority = Scheduler.unstable_IdlePriority, log$1 = Scheduler.log, unstable_setDisableYieldValue = Scheduler.unstable_setDisableYieldValue, rendererID = null, injectedHook = null, hasLoggedError = !1, isDevToolsPresent = "undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__, clz32 = Math.clz32 ? Math.clz32 : clz32Fallback, log = Math.log, LN2 = Math.LN2, nextTransitionUpdateLane = 256, nextTransitionDeferredLane = 262144, nextRetryLane = 4194304, DiscreteEventPriority = 2, ContinuousEventPriority = 8, DefaultEventPriority = 32, IdleEventPriority = 268435456, randomKey = Math.random().toString(36).slice(2), internalInstanceKey = "__reactFiber$" + randomKey, internalPropsKey = "__reactProps$" + randomKey, internalContainerInstanceKey = "__reactContainer$" + randomKey, internalEventHandlersKey = "__reactEvents$" + randomKey, internalEventHandlerListenersKey = "__reactListeners$" + randomKey, internalEventHandlesSetKey = "__reactHandles$" + randomKey, internalRootNodeResourcesKey = "__reactResources$" + randomKey, internalHoistableMarker = "__reactMarker$" + randomKey, internalLoadPendingKey = "__reactLoad$" + randomKey, allNativeEvents = /* @__PURE__ */ new Set(), registrationNameDependencies = {}, possibleRegistrationNames = {}, hasReadOnlyValue = {
12881			button: !0,
12882			checkbox: !0,
12883			image: !0,
12884			hidden: !0,
12885			radio: !0,
12886			reset: !0,
12887			submit: !0
12888		}, VALID_ATTRIBUTE_NAME_REGEX = RegExp("^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$"), illegalAttributeNameCache = {}, validatedAttributeNameCache = {}, viewTransitionMutationContext = !1, escapeSelectorAttributeValueInsideDoubleQuotesRegex = /[\n"\\]/g, didWarnValueDefaultValue$1 = !1, didWarnCheckedDefaultChecked = !1, didWarnSelectedSetOnOption = !1, didWarnInvalidChild = !1, didWarnInvalidInnerHTML = !1;
12889		var didWarnValueDefaultValue = !1;
12890		var valuePropNames = ["value", "defaultValue"], didWarnValDefaultVal = !1, needsEscaping = /["'&<>\n\t]|^\s|\s$/, specialTags = "address applet area article aside base basefont bgsound blockquote body br button caption center col 
12890colgroup dd details dir div dl dt embed fieldset figcaption figure footer form frame frameset h1 h2 h3 h4 h5 h6 head header hgroup hr html iframe img input isindex li link listing main marquee menu menuitem meta nav noembed noframes noscript object ol p param plaintext pre script section select source style summary table tbody td template textarea tfoot th thead title tr track ul wbr xmp".split(" "), inScopeTags = "applet caption html table td th marquee object select template foreignObject desc title".split(" "), buttonScopeTags = inScopeTags.concat(["button"]), impliedEndTags = "dd dt li option optgroup p rp rt".split(" "), emptyAncestorInfoDev = {
12891			current: null,
12892			formTag: null,
12893			aTagInScope: null,
12894			buttonTagInScope: null,
12895			nobrTagInScope: null,
12896			pTagInButtonScope: null,
12897			listItemTagAutoclosing: null,
12898			dlItemTagAutoclosing: null,
12899			containerTagInScope: null,
12900			implicitRootScope: !1
12901		}, didWarn = {}, shorthandToLonghand = {
12902			animation: "animationDelay animationDirection animationDuration animationFillMode animationIterationCount animationName animationPlayState animationTimingFunction".split(" "),
12903			background: "backgroundAttachment backgroundClip backgroundColor backgroundImage backgroundOrigin backgroundPositionX backgroundPositionY backgroundRepeat backgroundSize".split(" "),
12904			backgroundPosition: ["backgroundPositionX", "backgroundPositionY"],
12905			border: "borderBottomColor borderBottomStyle borderBottomWidth borderImageOutset borderImageRepeat borderImageSlice borderImageSource borderImageWidth borderLeftColor borderLeftStyle borderLeftWidth borderRightColor borderRightStyle borderRightWidth borderTopColor borderTopStyle borderTopWidth".split(" "),
12906			borderBlock: "borderBlockEndColor borderBlockEndStyle borderBlockEndWidth borderBlockStartColor borderBlockStartStyle borderBlockStartWidth".split(" "),
12907			borderBlockColor: ["borderBlockEndColor", "borderBlockStartColor"],
12908			borderBlockEnd: [
12909				"borderBlockEndColor",
12910				"borderBlockEndStyle",
12911				"borderBlockEndWidth"
12912			],
12913			borderBlockStart: [
12914				"borderBlockStartColor",
12915				"borderBlockStartStyle",
12916				"borderBlockStartWidth"
12917			],
12918			borderBlockStyle: ["borderBlockEndStyle", "borderBlockStartStyle"],
12919			borderBlockWidth: ["borderBlockEndWidth", "borderBlockStartWidth"],
12920			borderBottom: [
12921				"borderBottomColor",
12922				"borderBottomStyle",
12923				"borderBottomWidth"
12924			],
12925			borderColor: [
12926				"borderBottomColor",
12927				"borderLeftColor",
12928				"borderRightColor",
12929				"borderTopColor"
12930			],
12931			borderImage: [
12932				"borderImageOutset",
12933				"borderImageRepeat",
12934				"borderImageSlice",
12935				"borderImageSource",
12936				"borderImageWidth"
12937			],
12938			borderInline: "borderInlineEndColor borderInlineEndStyle borderInlineEndWidth borderInlineStartColor borderInlineStartStyle borderInlineStartWidth".split(" "),
12939			borderInlineColor: ["borderInlineEndColor", "borderInlineStartColor"],
12940			borderInlineEnd: [
12941				"borderInlineEndColor",
12942				"borderInlineEndStyle",
12943				"borderInlineEndWidth"
12944			],
12945			borderInlineStart: [
12946				"borderInlineStartColor",
12947				"borderInlineStartStyle",
12948				"borderInlineStartWidth"
12949			],
12950			borderInlineStyle: ["borderInlineEndStyle", "borderInlineStartStyle"],
12951			borderInlineWidth: ["borderInlineEndWidth", "borderInlineStartWidth"],
12952			borderLeft: [
12953				"borderLeftColor",
12954				"borderLeftStyle",
12955				"borderLeftWidth"
12956			],
12957			borderRadius: [
12958				"borderBottomLeftRadius",
12959				"borderBottomRightRadius",
12960				"borderTopLeftRadius",
12961				"borderTopRightRadius"
12962			],
12963			borderRight: [
12964				"borderRightColor",
12965				"borderRightStyle",
12966				"borderRightWidth"
12967			],
12968			borderStyle: [
12969				"borderBottomStyle",
12970				"borderLeftStyle",
12971				"borderRightStyle",
12972				"borderTopStyle"
12973			],
12974			borderTop: [
12975				"borderTopColor",
12976				"borderTopStyle",
12977				"borderTopWidth"
12978			],
12979			borderWidth: [
12980				"borderBottomWidth",
12981				"borderLeftWidth",
12982				"borderRightWidth",
12983				"borderTopWidth"
12984			],
12985			colorAdjust: ["printColorAdjust"],
12986			columnRule: [
12987				"columnRuleColor",
12988				"columnRuleStyle",
12989				"columnRuleWidth"
12990			],
12991			columns: ["columnCount", "columnWidth"],
12992			containIntrinsicSize: ["containIntrinsicHeight", "containIntrinsicWidth"],
12993			container: ["containerName", "containerType"],
12994			flex: [
12995				"flexBasis",
12996				"flexGrow",
12997				"flexShrink"
12998			],
12999			flexFlow: ["flexDirection", "flexWrap"],
13000			font: "fontFamily fontFeatureSettings fontKerning fontLanguageOverride fontSize fontSizeAdjust fontStretch fontStyle fontVariant fontVariantAlternates fontVariantCaps fontVariantEastAsian fontVariantLigatures fontVariantNumeric fontVariantPosition fontWeight lineHeight".split(" "),
13001			fontSynthesis: [
13002				"fontSynthesisPosition",
13003				"fontSynthesisSmallCaps",
13004				"fontSynthesisStyle",
13005				"fontSynthesisWeight"
13006			],
13007			fontVariant: "fontVariantAlternates fontVariantCaps fontVariantEastAsian fontVariantLigatures fontVariantNumeric fontVariantPosition".split(" "),
13008			gap: ["columnGap", "rowGap"],
13009			grid: "gridAutoColumns gridAutoFlow gridAutoRows gridTemplateAreas gridTemplateColumns gridTemplateRows".split(" "),
13010			gridArea: [
13011				"gridColumnEnd",
13012				"gridColumnStart",
13013				"gridRowEnd",
13014				"gridRowStart"
13015			],
13016			gridColumn: ["gridColumnEnd", "gridColumnStart"],
13017			gridColumnGap: ["columnGap"],
13018			gridGap: ["columnGap", "rowGap"],
13019			gridRow: ["gridRowEnd", "gridRowStart"],
13020			gridRowGap: ["rowGap"],
13021			gridTemplate: [
13022				"gridTemplateAreas",
13023				"gridTemplateColumns",
13024				"gridTemplateRows"
13025			],
13026			inset: [
13027				"bottom",
13028				"left",
13029				"right",
13030				"top"
13031			],
13032			insetBlock: ["insetBlockEnd", "insetBlockStart"],
13033			insetInline: ["insetInlineEnd", "insetInlineStart"],
13034			listStyle: [
13035				"listStyleImage",
13036				"listStylePosition",
13037				"listStyleType"
13038			],
13039			margin: [
13040				"marginBottom",
13041				"marginLeft",
13042				"marginRight",
13043				"marginTop"
13044			],
13045			marginBlock: ["marginBlockEnd", "marginBlockStart"],
13046			marginInline: ["marginInlineEnd", "marginInlineStart"],
13047			marker: [
13048				"markerEnd",
13049				"markerMid",
13050				"markerStart"
13051			],
13052			mask: "maskClip maskComposite maskImage maskMode maskOrigin maskPositionX maskPositionY maskRepeat maskSize".split(" "),
13053			maskPosition: ["maskPositionX", "maskPositionY"],
13054			offset: [
13055				"offsetAnchor",
13056				"offsetDistance",
13057				"offsetPath",
13058				"offsetPosition",
13059				"offsetRotate"
13060			],
13061			outline: [
13062				"outlineColor",
13063				"outlineStyle",
13064				"outlineWidth"
13065			],
13066			overflow: ["overflowX", "overflowY"],
13067			overscrollBehavior: ["overscrollBehaviorX", "overscrollBehaviorY"],
13068			padding: [
13069				"paddingBottom",
13070				"paddingLeft",
13071				"paddingRight",
13072				"paddingTop"
13073			],
13074			paddingBlock: ["paddingBlockEnd", "paddingBlockStart"],
13075			paddingInline: ["paddingInlineEnd", "paddingInlineStart"],
13076			pageBreakAfter: ["breakAfter"],
13077			pageBreakBefore: ["breakBefore"],
13078			pageBreakInside: ["breakInside"],
13079			placeContent: ["alignContent", "justifyContent"],
13080			placeItems: ["alignItems", "justifyItems"],
13081			placeSelf: ["alignSelf", "justifySelf"],
13082			scrollMargin: [
13083				"scrollMarginBottom",
13084				"scrollMarginLeft",
13085				"scrollMarginRight",
13086				"scrollMarginTop"
13087			],
13088			scrollMarginBlock: ["scrollMarginBlockEnd", "scrollMarginBlockStart"],
13089			scrollMarginInline: ["scrollMarginInlineEnd", "scrollMarginInlineStart"],
13090			scrollPadding: [
13091				"scrollPaddingBottom",
13092				"scrollPaddingLeft",
13093				"scrollPaddingRight",
13094				"scrollPaddingTop"
13095			],
13096			scrollPaddingBlock: ["scrollPaddingBlockEnd", "scrollPaddingBlockStart"],
13097			scrollPaddingInline: ["scrollPaddingInlineEnd", "scrollPaddingInlineStart"],
13098			textDecoration: [
13099				"textDecorationColor",
13100				"textDecorationLine",
13101				"textDecorationStyle",
13102				"textDecorationThickness"
13103			],
13104			textEmphasis: ["textEmphasisColor", "textEmphasisStyle"],
13105			textWrap: ["textWrapMode", "textWrapStyle"],
13106			transition: [
13107				"transitionBehavior",
13108				"transitionDelay",
13109				"transitionDuration",
13110				"transitionProperty",
13111				"transitionTimingFunction"
13112			],
13113			verticalAlign: [
13114				"alignmentBaseline",
13115				"baselineShift",
13116				"baselineSource"
13117			],
13118			whiteSpace: ["textWrapMode", "whiteSpaceCollapse"],
13119			wordWrap: ["overflowWrap"]
13120		}, uppercasePattern = /([A-Z])/g, msPattern$1 = /^ms-/, badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/, msPattern = /^-ms-/, hyphenPattern = /-(.)/g, badStyleValueWithSemicolonPattern = /;\s*$/, warnedStyleNames = {}, warnedStyleValues = {}, warnedForNaNValue = !1, warnedForInfinityValue = !1, unitlessNumbers = new Set("animationIterationCount aspectRatio borderImageOutset borderImageSlice borderImageWidth boxFlex boxFlexGroup boxOrdinalGroup columnCount columns flex flexGrow flexPositive flexShrink flexNegative flexOrder gridArea gridRow gridRowEnd gridRowSpan gridRowStart gridColumn gridColumnEnd gridColumnSpan gridColumnStart fontWeight lineClamp lineHeight opacity order orphans scale tabSize widows zIndex zoom fillOpacity floodOpacity stopOpacity strokeDasharray strokeDashoffset strokeMiterlimit strokeOpacity strokeWidth MozAnimationIterationCount MozBoxFlex MozBoxFlexGroup MozLineClamp msAnimationIterationCount msFlex msZoom msFlexGrow msFlexNegative msFlexOrder msFlexPositive msFlexShrink msGridColumn msGridColumnSpan msGridRow msGridRowSpan WebkitAnimationIterationCount WebkitBoxFlex WebKitBoxFlexGroup WebkitBoxOrdinalGroup WebkitColumnCount WebkitColumns WebkitFlex WebkitFlexGrow WebkitFlexPositive WebkitFlexShrink WebkitLineClamp".split(" ")), MATH_NAMESPACE = "http://www.w3.org/1998/Math/MathML", SVG_NAMESPACE = "http://www.w3.org/2000/svg", aliases = /* @__PURE__ */ new Map([
13121			["acceptCharset", "accept-charset"],
13122			["htmlFor", "for"],
13123			["httpEquiv", "http-equiv"],
13124			["crossOrigin", "crossorigin"],
13125			["accentHeight", "accent-height"],
13126			["alignmentBaseline", "alignment-baseline"],
13127			["arabicForm", "arabic-form"],
13128			["baselineShift", "baseline-shift"],
13129			["capHeight", "cap-height"],
13130			["clipPath", "clip-path"],
13131			["clipRule", "clip-rule"],
13132			["colorInterpolation", "color-interpolation"],
13133			["colorInterpolationFilters", "color-interpolation-filters"],
13134			["colorProfile", "color-profile"],
13135			["colorRendering", "color-rendering"],
13136			["dominantBaseline", "dominant-baseline"],
13137			["enableBackground", "enable-background"],
13138			["fillOpacity", "fill-opacity"],
13139			["fillRule", "fill-rule"],
13140			["floodColor", "flood-color"],
13141			["floodOpacity", "flood-opacity"],
13142			["fontFamily", "font-family"],
13143			["fontSize", "font-size"],
13144			["fontSizeAdjust", "font-size-adjust"],
13145			["fontStretch", "font-stretch"],
13146			["fontStyle", "font-style"],
13147			["fontVariant", "font-variant"],
13148			["fontWeight", "font-weight"],
13149			["glyphName", "glyph-name"],
13150			["glyphOrientationHorizontal", "glyph-orientation-horizontal"],
13151			["glyphOrientationVertical", "glyph-orientation-vertical"],
13152			["horizAdvX", "horiz-adv-x"],
13153			["horizOriginX", "horiz-origin-x"],
13154			["imageRendering", "image-rendering"],
13155			["letterSpacing", "letter-spacing"],
13156			["lightingColor", "lighting-color"],
13157			["markerEnd", "marker-end"],
13158			["markerMid", "marker-mid"],
13159			["markerStart", "marker-start"],
13160			["maskType", "mask-type"],
13161			["overlinePosition", "overline-position"],
13162			["overlineThickness", "overline-thickness"],
13163			["paintOrder", "paint-order"],
13164			["panose-1", "panose-1"],
13165			["pointerEvents", "pointer-events"],
13166			["renderingIntent", "rendering-intent"],
13167			["shapeRendering", "shape-rendering"],
13168			["stopColor", "stop-color"],
13169			["stopOpacity", "stop-opacity"],
13170			["strikethroughPosition", "strikethrough-position"],
13171			["strikethroughThickness", "strikethrough-thickness"],
13172			["strokeDasharray", "stroke-dasharray"],
13173			["strokeDashoffset", "stroke-dashoffset"],
13174			["strokeLinecap", "stroke-linecap"],
13175			["strokeLinejoin", "stroke-linejoin"],
13176			["strokeMiterlimit", "stroke-miterlimit"],
13177			["strokeOpacity", "stroke-opacity"],
13178			["strokeWidth", "stroke-width"],
13179			["textAnchor", "text-anchor"],
13180			["textDecoration", "text-decoration"],
13181			["textRendering", "text-rendering"],
13182			["transformOrigin", "transform-origin"],
13183			["underlinePosition", "underline-position"],
13184			["underlineThickness", "underline-thickness"],
13185			["unicodeBidi", "unicode-bidi"],
13186			["unicodeRange", "unicode-range"],
13187			["unitsPerEm", "units-per-em"],
13188			["vAlphabetic", "v-alphabetic"],
13189			["vHanging", "v-hanging"],
13190			["vIdeographic", "v-ideographic"],
13191			["vMathematical", "v-mathematical"],
13192			["vectorEffect", "vector-effect"],
13193			["vertAdvY", "vert-adv-y"],
13194			["vertOriginX", "vert-origin-x"],
13195			["vertOriginY", "vert-origin-y"],
13196			["wordSpacing", "word-spacing"],
13197			["writingMode", "writing-mode"],
13198			["xmlnsXlink", "xmlns:xlink"],
13199			["xHeight", "x-height"]
13200		]), possibleStandardNames = {
13201			accept: "accept",
13202			acceptcharset: "acceptCharset",
13203			"accept-charset": "acceptCharset",
13204			accesskey: "accessKey",
13205			action: "action",
13206			allowfullscreen: "allowFullScreen",
13207			alt: "alt",
13208			as: "as",
13209			async: "async",
13210			autocapitalize: "autoCapitalize",
13211			autocomplete: "autoComplete",
13212			autocorrect: "autoCorrect",
13213			autofocus: "autoFocus",
13214			autoplay: "autoPlay",
13215			autosave: "autoSave",
13216			capture: "capture",
13217			cellpadding: "cellPadding",
13218			cellspacing: "cellSpacing",
13219			challenge: "challenge",
13220			charset: "charSet",
13221			checked: "checked",
13222			children: "children",
13223			cite: "cite",
13224			class: "className",
13225			classid: "classID",
13226			classname: "className",
13227			cols: "cols",
13228			colspan: "colSpan",
13229			content: "content",
13230			contenteditable: "contentEditable",
13231			contextmenu: "contextMenu",
13232			controls: "controls",
13233			controlslist: "controlsList",
13234			coords: "coords",
13235			credentialless: "credentialless",
13236			crossorigin: "crossOrigin",
13237			dangerouslysetinnerhtml: "dangerouslySetInnerHTML",
13238			data: "data",
13239			datetime: "dateTime",
13240			default: "default",
13241			defaultchecked: "defaultChecked",
13242			defaultvalue: "defaultValue",
13243			defer: "defer",
13244			dir: "dir",
13245			disabled: "disabled",
13246			disablepictureinpicture: "disablePictureInPicture",
13247			disableremoteplayback: "disableRemotePlayback",
13248			download: "download",
13249			draggable: "draggable",
13250			enctype: "encType",
13251			enterkeyhint: "enterKeyHint",
13252			fetchpriority: "fetchPriority",
13253			for: "htmlFor",
13254			form: "form",
13255			formmethod: "formMethod",
13256			formaction: "formAction",
13257			formenctype: "formEncType",
13258			formnovalidate: "formNoValidate",
13259			formtarget: "formTarget",
13260			frameborder: "frameBorder",
13261			headers: "headers",
13262			height: "height",
13263			hidden: "hidden",
13264			high: "high",
13265			href: "href",
13266			hreflang: "hrefLang",
13267			htmlfor: "htmlFor",
13268			httpequiv: "httpEquiv",
13269			"http-equiv": "httpEquiv",
13270			icon: "icon",
13271			id: "id",
13272			imagesizes: "imageSizes",
13273			imagesrcset: "imageSrcSet",
13274			inert: "inert",
13275			innerhtml: "innerHTML",
13276			inputmode: "inputMode",
13277			integrity: "integrity",
13278			is: "is",
13279			itemid: "itemID",
13280			itemprop: "itemProp",
13281			itemref: "itemRef",
13282			itemscope: "itemScope",
13283			itemtype: "itemType",
13284			keyparams: "keyParams",
13285			keytype: "keyType",
13286			kind: "kind",
13287			label: "label",
13288			lang: "lang",
13289			list: "list",
13290			loop: "loop",
13291			low: "low",
13292			manifest: "manifest",
13293			marginwidth: "marginWidth",
13294			marginheight: "marginHeight",
13295			max: "max",
13296			maxlength: "maxLength",
13297			media: "media",
13298			mediagroup: "mediaGroup",
13299			method: "method",
13300			min: "min",
13301			minlength: "minLength",
13302			multiple: "multiple",
13303			muted: "muted",
13304			name: "name",
13305			nomodule: "noModule",
13306			nonce: "nonce",
13307			novalidate: "noValidate",
13308			open: "open",
13309			optimum: "optimum",
13310			pattern: "pattern",
13311			placeholder: "placeholder",
13312			playsinline: "playsInline",
13313			poster: "poster",
13314			preload: "preload",
13315			profile: "profile",
13316			radiogroup: "radioGroup",
13317			readonly: "readOnly",
13318			referrerpolicy: "referrerPolicy",
13319			rel: "rel",
13320			required: "required",
13321			reversed: "reversed",
13322			role: "role",
13323			rows: "rows",
13324			rowspan: "rowSpan",
13325			sandbox: "sandbox",
13326			scope: "scope",
13327			scoped: "scoped",
13328			scrolling: "scrolling",
13329			seamless: "seamless",
13330			selected: "selected",
13331			shape: "shape",
13332			size: "size",
13333			sizes: "sizes",
13334			span: "span",
13335			spellcheck: "spellCheck",
13336			src: "src",
13337			srcdoc: "srcDoc",
13338			srclang: "srcLang",
13339			srcset: "srcSet",
13340			start: "start",
13341			step: "step",
13342			style: "style",
13343			summary: "summary",
13344			tabindex: "tabIndex",
13345			target: "target",
13346			title: "title",
13347			type: "type",
13348			usemap: "useMap",
13349			value: "value",
13350			width: "width",
13351			wmode: "wmode",
13352			wrap: "wrap",
13353			about: "about",
13354			accentheight: "accentHeight",
13355			"accent-height": "accentHeight",
13356			accumulate: "accumulate",
13357			additive: "additive",
13358			alignmentbaseline: "alignmentBaseline",
13359			"alignment-baseline": "alignmentBaseline",
13360			allowreorder: "allowReorder",
13361			alphabetic: "alphabetic",
13362			amplitude: "amplitude",
13363			arabicform: "arabicForm",
13364			"arabic-form": "arabicForm",
13365			ascent: "ascent",
13366			attributename: "attributeName",
13367			attributetype: "attributeType",
13368			autoreverse: "autoReverse",
13369			azimuth: "azimuth",
13370			basefrequency: "baseFrequency",
13371			baselineshift: "baselineShift",
13372			"baseline-shift": "baselineShift",
13373			baseprofile: "baseProfile",
13374			bbox: "bbox",
13375			begin: "begin",
13376			bias: "bias",
13377			by: "by",
13378			calcmode: "calcMode",
13379			capheight: "capHeight",
13380			"cap-height": "capHeight",
13381			clip: "clip",
13382			clippath: "clipPath",
13383			"clip-path": "clipPath",
13384			clippathunits: "clipPathUnits",
13385			cliprule: "clipRule",
13386			"clip-rule": "clipRule",
13387			color: "color",
13388			colorinterpolation: "colorInterpolation",
13389			"color-interpolation": "colorInterpolation",
13390			colorinterpolationfilters: "colorInterpolationFilters",
13391			"color-interpolation-filters": "colorInterpolationFilters",
13392			colorprofile: "colorProfile",
13393			"color-profile": "colorProfile",
13394			colorrendering: "colorRendering",
13395			"color-rendering": "colorRendering",
13396			contentscripttype: "contentScriptType",
13397			contentstyletype: "contentStyleType",
13398			cursor: "cursor",
13399			cx: "cx",
13400			cy: "cy",
13401			d: "d",
13402			datatype: "datatype",
13403			decelerate: "decelerate",
13404			descent: "descent",
13405			diffuseconstant: "diffuseConstant",
13406			direction: "direction",
13407			display: "display",
13408			divisor: "divisor",
13409			dominantbaseline: "dominantBaseline",
13410			"dominant-baseline": "dominantBaseline",
13411			dur: "dur",
13412			dx: "dx",
13413			dy: "dy",
13414			edgemode: "edgeMode",
13415			elevation: "elevation",
13416			enablebackground: "enableBackground",
13417			"enable-background": "enableBackground",
13418			end: "end",
13419			exponent: "exponent",
13420			externalresourcesrequired: "externalResourcesRequired",
13421			fill: "fill",
13422			fillopacity: "fillOpacity",
13423			"fill-opacity": "fillOpacity",
13424			fillrule: "fillRule",
13425			"fill-rule": "fillRule",
13426			filter: "filter",
13427			filterres: "filterRes",
13428			filterunits: "filterUnits",
13429			floodopacity: "floodOpacity",
13430			"flood-opacity": "floodOpacity",
13431			floodcolor: "floodColor",
13432			"flood-color": "floodColor",
13433			focusable: "focusable",
13434			fontfamily: "fontFamily",
13435			"font-family": "fontFamily",
13436			fontsize: "fontSize",
13437			"font-size": "fontSize",
13438			fontsizeadjust: "fontSizeAdjust",
13439			"font-size-adjust": "fontSizeAdjust",
13440			fontstretch: "fontStretch",
13441			"font-stretch": "fontStretch",
13442			fontstyle: "fontStyle",
13443			"font-style": "fontStyle",
13444			fontvariant: "fontVariant",
13445			"font-variant": "fontVariant",
13446			fontweight: "fontWeight",
13447			"font-weight": "fontWeight",
13448			format: "format",
13449			from: "from",
13450			fx: "fx",
13451			fy: "fy",
13452			g1: "g1",
13453			g2: "g2",
13454			glyphname: "glyphName",
13455			"glyph-name": "glyphName",
13456			glyphorientationhorizontal: "glyphOrientationHorizontal",
13457			"glyph-orientation-horizontal": "glyphOrientationHorizontal",
13458			glyphorientationvertical: "glyphOrientationVertical",
13459			"glyph-orientation-vertical": "glyphOrientationVertical",
13460			glyphref: "glyphRef",
13461			gradienttransform: "gradientTransform",
13462			gradientunits: "gradientUnits",
13463			hanging: "hanging",
13464			horizadvx: "horizAdvX",
13465			"horiz-adv-x": "horizAdvX",
13466			horizoriginx: "horizOriginX",
13467			"horiz-origin-x": "horizOriginX",
13468			ideographic: "ideographic",
13469			imagerendering: "imageRendering",
13470			"image-rendering": "imageRendering",
13471			in2: "in2",
13472			in: "in",
13473			inlist: "inlist",
13474			intercept: "intercept",
13475			k1: "k1",
13476			k2: "k2",
13477			k3: "k3",
13478			k4: "k4",
13479			k: "k",
13480			kernelmatrix: "kernelMatrix",
13481			kernelunitlength: "kernelUnitLength",
13482			kerning: "kerning",
13483			keypoints: "keyPoints",
13484			keysplines: "keySplines",
13485			keytimes: "keyTimes",
13486			lengthadjust: "lengthAdjust",
13487			letterspacing: "letterSpacing",
13488			"letter-spacing": "letterSpacing",
13489			lightingcolor: "lightingColor",
13490			"lighting-color": "lightingColor",
13491			limitingconeangle: "limitingConeAngle",
13492			local: "local",
13493			markerend: "markerEnd",
13494			"marker-end": "markerEnd",
13495			markerheight: "markerHeight",
13496			markermid: "markerMid",
13497			"marker-mid": "markerMid",
13498			markerstart: "markerStart",
13499			"marker-start": "markerStart",
13500			markerunits: "markerUnits",
13501			markerwidth: "markerWidth",
13502			mask: "mask",
13503			maskcontentunits: "maskContentUnits",
13504			masktype: "maskType",
13505			maskunits: "maskUnits",
13506			mathematical: "mathematical",
13507			mode: "mode",
13508			numoctaves: "numOctaves",
13509			offset: "offset",
13510			opacity: "opacity",
13511			operator: "operator",
13512			order: "order",
13513			orient: "orient",
13514			orientation: "orientation",
13515			origin: "origin",
13516			overflow: "overflow",
13517			overlineposition: "overlinePosition",
13518			"overline-position": "overlinePosition",
13519			overlinethickness: "overlineThickness",
13520			"overline-thickness": "overlineThickness",
13521			paintorder: "paintOrder",
13522			"paint-order": "paintOrder",
13523			panose1: "panose1",
13524			"panose-1": "panose1",
13525			pathlength: "pathLength",
13526			patterncontentunits: "patternContentUnits",
13527			patterntransform: "patternTransform",
13528			patternunits: "patternUnits",
13529			pointerevents: "pointerEvents",
13530			"pointer-events": "pointerEvents",
13531			points: "points",
13532			pointsatx: "pointsAtX",
13533			pointsaty: "pointsAtY",
13534			pointsatz: "pointsAtZ",
13535			popover: "popover",
13536			popovertarget: "popoverTarget",
13537			popovertargetaction: "popoverTargetAction",
13538			prefix: "prefix",
13539			preservealpha: "preserveAlpha",
13540			preserveaspectratio: "preserveAspectRatio",
13541			primitiveunits: "primitiveUnits",
13542			property: "property",
13543			r: "r",
13544			radius: "radius",
13545			refx: "refX",
13546			refy: "refY",
13547			renderingintent: "renderingIntent",
13548			"rendering-intent": "renderingIntent",
13549			repeatcount: "repeatCount",
13550			repeatdur: "repeatDur",
13551			requiredextensions: "requiredExtensions",
13552			requiredfeatures: "requiredFeatures",
13553			resource: "resource",
13554			restart: "restart",
13555			result: "result",
13556			results: "results",
13557			rotate: "rotate",
13558			rx: "rx",
13559			ry: "ry",
13560			scale: "scale",
13561			security: "security",
13562			seed: "seed",
13563			shaperendering: "shapeRendering",
13564			"shape-rendering": "shapeRendering",
13565			slope: "slope",
13566			spacing: "spacing",
13567			specularconstant: "specularConstant",
13568			specularexponent: "specularExponent",
13569			speed: "speed",
13570			spreadmethod: "spreadMethod",
13571			startoffset: "startOffset",
13572			stddeviation: "stdDeviation",
13573			stemh: "stemh",
13574			stemv: "stemv",
13575			stitchtiles: "stitchTiles",
13576			stopcolor: "stopColor",
13577			"stop-color": "stopColor",
13578			stopopacity: "stopOpacity",
13579			"stop-opacity": "stopOpacity",
13580			strikethroughposition: "strikethroughPosition",
13581			"strikethrough-position": "strikethroughPosition",
13582			strikethroughthickness: "strikethroughThickness",
13583			"strikethrough-thickness": "strikethroughThickness",
13584			string: "string",
13585			stroke: "stroke",
13586			strokedasharray: "strokeDasharray",
13587			"stroke-dasharray": "strokeDasharray",
13588			strokedashoffset: "strokeDashoffset",
13589			"stroke-dashoffset": "strokeDashoffset",
13590			strokelinecap: "strokeLinecap",
13591			"stroke-linecap": "strokeLinecap",
13592			strokelinejoin: "strokeLinejoin",
13593			"stroke-linejoin": "strokeLinejoin",
13594			strokemiterlimit: "strokeMiterlimit",
13595			"stroke-miterlimit": "strokeMiterlimit",
13596			strokewidth: "strokeWidth",
13597			"stroke-width": "strokeWidth",
13598			strokeopacity: "strokeOpacity",
13599			"stroke-opacity": "strokeOpacity",
13600			suppresscontenteditablewarning: "suppressContentEditableWarning",
13601			suppresshydrationwarning: "suppressHydrationWarning",
13602			surfacescale: "surfaceScale",
13603			systemlanguage: "systemLanguage",
13604			tablevalues: "tableValues",
13605			targetx: "targetX",
13606			targety: "targetY",
13607			textanchor: "textAnchor",
13608			"text-anchor": "textAnchor",
13609			textdecoration: "textDecoration",
13610			"text-decoration": "textDecoration",
13611			textlength: "textLength",
13612			textrendering: "textRendering",
13613			"text-rendering": "textRendering",
13614			to: "to",
13615			transform: "transform",
13616			transformorigin: "transformOrigin",
13617			"transform-origin": "transformOrigin",
13618			typeof: "typeof",
13619			u1: "u1",
13620			u2: "u2",
13621			underlineposition: "underlinePosition",
13622			"underline-position": "underlinePosition",
13623			underlinethickness: "underlineThickness",
13624			"underline-thickness": "underlineThickness",
13625			unicode: "unicode",
13626			unicodebidi: "unicodeBidi",
13627			"unicode-bidi": "unicodeBidi",
13628			unicoderange: "unicodeRange",
13629			"unicode-range": "unicodeRange",
13630			unitsperem: "unitsPerEm",
13631			"units-per-em": "unitsPerEm",
13632			unselectable: "unselectable",
13633			valphabetic: "vAlphabetic",
13634			"v-alphabetic": "vAlphabetic",
13635			values: "values",
13636			vectoreffect: "vectorEffect",
13637			"vector-effect": "vectorEffect",
13638			version: "version",
13639			vertadvy: "vertAdvY",
13640			"vert-adv-y": "vertAdvY",
13641			vertoriginx: "vertOriginX",
13642			"vert-origin-x": "vertOriginX",
13643			vertoriginy: "vertOriginY",
13644			"vert-origin-y": "vertOriginY",
13645			vhanging: "vHanging",
13646			"v-hanging": "vHanging",
13647			videographic: "vIdeographic",
13648			"v-ideographic": "vIdeographic",
13649			viewbox: "viewBox",
13650			viewtarget: "viewTarget",
13651			visibility: "visibility",
13652			vmathematical: "vMathematical",
13653			"v-mathematical": "vMathematical",
13654			vocab: "vocab",
13655			widths: "widths",
13656			wordspacing: "wordSpacing",
13657			"word-spacing": "wordSpacing",
13658			writingmode: "writingMode",
13659			"writing-mode": "writingMode",
13660			x1: "x1",
13661			x2: "x2",
13662			x: "x",
13663			xchannelselector: "xChannelSelector",
13664			xheight: "xHeight",
13665			"x-height": "xHeight",
13666			xlinkactuate: "xlinkActuate",
13667			"xlink:actuate": "xlinkActuate",
13668			xlinkarcrole: "xlinkArcrole",
13669			"xlink:arcrole": "xlinkArcrole",
13670			xlinkhref: "xlinkHref",
13671			"xlink:href": "xlinkHref",
13672			xlinkrole: "xlinkRole",
13673			"xlink:role": "xlinkRole",
13674			xlinkshow: "xlinkShow",
13675			"xlink:show": "xlinkShow",
13676			xlinktitle: "xlinkTitle",
13677			"xlink:title": "xlinkTitle",
13678			xlinktype: "xlinkType",
13679			"xlink:type": "xlinkType",
13680			xmlbase: "xmlBase",
13681			"xml:base": "xmlBase",
13682			xmllang: "xmlLang",
13683			"xml:lang": "xmlLang",
13684			xmlns: "xmlns",
13685			"xml:space": "xmlSpace",
13686			xmlnsxlink: "xmlnsXlink",
13687			"xmlns:xlink": "xmlnsXlink",
13688			xmlspace: "xmlSpace",
13689			y1: "y1",
13690			y2: "y2",
13691			y: "y",
13692			ychannelselector: "yChannelSelector",
13693			z: "z",
13694			zoomandpan: "zoomAndPan"
13695		}, ariaProperties = {
13696			"aria-current": 0,
13697			"aria-description": 0,
13698			"aria-details": 0,
13699			"aria-disabled": 0,
13700			"aria-hidden": 0,
13701			"aria-invalid": 0,
13702			"aria-keyshortcuts": 0,
13703			"aria-label": 0,
13704			"aria-roledescription": 0,
13705			"aria-autocomplete": 0,
13706			"aria-checked": 0,
13707			"aria-expanded": 0,
13708			"aria-haspopup": 0,
13709			"aria-level": 0,
13710			"aria-modal": 0,
13711			"aria-multiline": 0,
13712			"aria-multiselectable": 0,
13713			"aria-orientation": 0,
13714			"aria-placeholder": 0,
13715			"aria-pressed": 0,
13716			"aria-readonly": 0,
13717			"aria-required": 0,
13718			"aria-selected": 0,
13719			"aria-sort": 0,
13720			"aria-valuemax": 0,
13721			"aria-valuemin": 0,
13722			"aria-valuenow": 0,
13723			"aria-valuetext": 0,
13724			"aria-atomic": 0,
13725			"aria-busy": 0,
13726			"aria-live": 0,
13727			"aria-relevant": 0,
13728			"aria-dropeffect": 0,
13729			"aria-grabbed": 0,
13730			"aria-activedescendant": 0,
13731			"aria-colcount": 0,
13732			"aria-colindex": 0,
13733			"aria-colspan": 0,
13734			"aria-controls": 0,
13735			"aria-describedby": 0,
13736			"aria-errormessage": 0,
13737			"aria-flowto": 0,
13738			"aria-labelledby": 0,
13739			"aria-owns": 0,
13740			"aria-posinset": 0,
13741			"aria-rowcount": 0,
13742			"aria-rowindex": 0,
13743			"aria-rowspan": 0,
13744			"aria-setsize": 0,
13745			"aria-braillelabel": 0,
13746			"aria-brailleroledescription": 0,
13747			"aria-colindextext": 0,
13748			"aria-rowindextext": 0
13749		}, warnedProperties$1 = {}, rARIA$1 = RegExp("^(aria)-[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$"), rARIACamel$1 = RegExp("^(aria)[A-Z][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$"), didWarnValueNull = !1, warnedProperties = {}, EVENT_NAME_REGEX = /^on./, INVALID_EVENT_NAME_REGEX = /^on[^A-Z]/, rARIA = RegExp("^(aria)-[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$"), rARIACamel = RegExp("^(aria)[A-Z][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u
vendor: 4,466 bytes, lines 13749-13864
13749037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$"), isJavaScriptProtocol = /^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*:/i, currentReplayingEvent = null, restoreTarget = null, restoreQueue = null, isInsideEventHandler = !1, canUseDOM = !("undefined" === typeof window || "undefined" === typeof window.document || "undefined" === typeof window.document.createElement), passiveBrowserEventsSupported = !1;
13750		if (canUseDOM) try {
13751			var options$jscomp$0 = {};
13752			Object.defineProperty(options$jscomp$0, "passive", { get: function() {
13753				passiveBrowserEventsSupported = !0;
13754			} });
13755			window.addEventListener("test", options$jscomp$0, options$jscomp$0);
13756			window.removeEventListener("test", options$jscomp$0, options$jscomp$0);
13757		} catch (e) {
13758			passiveBrowserEventsSupported = !1;
13759		}
13760		var root = null, startText = null, fallbackText = null, EventInterface = {
13761			eventPhase: 0,
13762			bubbles: 0,
13763			cancelable: 0,
13764			timeStamp: function(event) {
13765				return event.timeStamp || Date.now();
13766			},
13767			defaultPrevented: 0,
13768			isTrusted: 0
13769		}, SyntheticEvent = createSyntheticEvent(EventInterface), UIEventInterface = assign({}, EventInterface, {
13770			view: 0,
13771			detail: 0
13772		}), SyntheticUIEvent = createSyntheticEvent(UIEventInterface), lastMovementX, lastMovementY, lastMouseEvent, MouseEventInterface = assign({}, UIEventInterface, {
13773			screenX: 0,
13774			screenY: 0,
13775			clientX: 0,
13776			clientY: 0,
13777			pageX: 0,
13778			pageY: 0,
13779			ctrlKey: 0,
13780			shiftKey: 0,
13781			altKey: 0,
13782			metaKey: 0,
13783			getModifierState: getEventModifierState,
13784			button: 0,
13785			buttons: 0,
13786			relatedTarget: function(event) {
13787				return void 0 === event.relatedTarget ? event.fromElement === event.srcElement ? event.toElement : event.fromElement : event.relatedTarget;
13788			},
13789			movementX: function(event) {
13790				if ("movementX" in event) return event.movementX;
13791				event !== lastMouseEvent && (lastMouseEvent && "mousemove" === event.type ? (lastMovementX = event.screenX - lastMouseEvent.screenX, lastMovementY = event.screenY - lastMouseEvent.screenY) : lastMovementY = lastMovementX = 0, lastMouseEvent = event);
13792				return lastMovementX;
13793			},
13794			movementY: function(event) {
13795				return "movementY" in event ? event.movementY : lastMovementY;
13796			}
13797		}), SyntheticMouseEvent = createSyntheticEvent(MouseEventInterface), SyntheticDragEvent = createSyntheticEvent(assign({}, MouseEventInterface, { dataTransfer: 0 })), SyntheticFocusEvent = createSyntheticEvent(assign({}, UIEventInterface, { relatedTarget: 0 })), SyntheticAnimationEvent = createSyntheticEvent(assign({}, EventInterface, {
13798			animationName: 0,
13799			elapsedTime: 0,
13800			pseudoElement: 0
13801		})), SyntheticClipboardEvent = createSyntheticEvent(assign({}, EventInterface, { clipboardData: function(event) {
13802			return "clipboardData" in event ? event.clipboardData : window.clipboardData;
13803		} })), SyntheticCompositionEvent = createSyntheticEvent(assign({}, EventInterface, { data: 0 })), SyntheticInputEvent = SyntheticCompositionEvent, normalizeKey = {
13804			Esc: "Escape",
13805			Spacebar: " ",
13806			Left: "ArrowLeft",
13807			Up: "ArrowUp",
13808			Right: "ArrowRight",
13809			Down: "ArrowDown",
13810			Del: "Delete",
13811			Win: "OS",
13812			Menu: "ContextMenu",
13813			Apps: "ContextMenu",
13814			Scroll: "ScrollLock",
13815			MozPrintableKey: "Unidentified"
13816		}, translateToKey = {
13817			8: "Backspace",
13818			9: "Tab",
13819			12: "Clear",
13820			13: "Enter",
13821			16: "Shift",
13822			17: "Control",
13823			18: "Alt",
13824			19: "Pause",
13825			20: "CapsLock",
13826			27: "Escape",
13827			32: " ",
13828			33: "PageUp",
13829			34: "PageDown",
13830			35: "End",
13831			36: "Home",
13832			37: "ArrowLeft",
13833			38: "ArrowUp",
13834			39: "ArrowRight",
13835			40: "ArrowDown",
13836			45: "Insert",
13837			46: "Delete",
13838			112: "F1",
13839			113: "F2",
13840			114: "F3",
13841			115: "F4",
13842			116: "F5",
13843			117: "F6",
13844			118: "F7",
13845			119: "F8",
13846			120: "F9",
13847			121: "F10",
13848			122: "F11",
13849			123: "F12",
13850			144: "NumLock",
13851			145: "ScrollLock",
13852			224: "Meta"
13853		}, modifierKeyToProp = {
13854			Alt: "altKey",
13855			Control: "ctrlKey",
13856			Meta: "metaKey",
13857			Shift: "shiftKey"
13858		}, SyntheticKeyboardEvent = createSyntheticEvent(assign({}, UIEventInterface, {
13859			key: function(nativeEvent) {
13860				if (nativeEvent.key) {
13861					var key = normalizeKey[nativeEvent.key] || nativeEvent.key;
13862					if ("Unidentified" !== key) return key;
13863				}
13864				return "keypress" === nativeEvent.type ? (nativeEvent = getEventCharCo
13864de(nativeEvent), 13 === nativeEvent ? "Enter" : String.fromCharCode(nativeEvent)) : "keydown" === nativeEvent.type || "keyup" === nativeEvent.type ? translateToKey[nativeEvent.keyCode] || "Unidentified" : "";
13865			},
13866			code: 0,
13867			location: 0,
13868			ctrlKey: 0,
13869			shiftKey: 0,
13870			altKey: 0,
13871			metaKey: 0,
13872			repeat: 0,
13873			locale: 0,
13874			getModifierState: getEventModifierState,
13875			charCode: function(event) {
13876				return "keypress" === event.type ? getEventCharCode(event) : 0;
13877			},
13878			keyCode: function(event) {
13879				return "keydown" === event.type || "keyup" === event.type ? event.keyCode : 0;
13880			},
13881			which: function(event) {
13882				return "keypress" === event.type ? getEventCharCode(event) : "keydown" === event.type || "keyup" === event.type ? event.keyCode : 0;
13883			}
13884		})), SyntheticPointerEvent = createSyntheticEvent(assign({}, MouseEventInterface, {
13885			pointerId: 0,
13886			width: 0,
13887			height: 0,
13888			pressure: 0,
13889			tangentialPressure: 0,
13890			tiltX: 0,
13891			tiltY: 0,
13892			twist: 0,
13893			pointerType: 0,
13894			isPrimary: 0
13895		})), SyntheticSubmitEvent = createSyntheticEvent(assign({}, EventInterface, { submitter: 0 })), SyntheticTouchEvent = createSyntheticEvent(assign({}, UIEventInterface, {
13896			touches: 0,
13897			targetTouches: 0,
13898			changedTouches: 0,
13899			altKey: 0,
13900			metaKey: 0,
13901			ctrlKey: 0,
13902			shiftKey: 0,
13903			getModifierState: getEventModifierState
13904		})), SyntheticTransitionEvent = createSyntheticEvent(assign({}, EventInterface, {
13905			propertyName: 0,
13906			elapsedTime: 0,
13907			pseudoElement: 0
13908		})), SyntheticWheelEvent = createSyntheticEvent(assign({}, MouseEventInterface, {
13909			deltaX: function(event) {
13910				return "deltaX" in event ? event.deltaX : "wheelDeltaX" in event ? -event.wheelDeltaX : 0;
13911			},
13912			deltaY: function(event) {
13913				return "deltaY" in event ? event.deltaY : "wheelDeltaY" in event ? -event.wheelDeltaY : "wheelDelta" in event ? -event.wheelDelta : 0;
13914			},
13915			deltaZ: 0,
13916			deltaMode: 0
13917		})), SyntheticToggleEvent = createSyntheticEvent(assign({}, EventInterface, {
13918			newState: 0,
13919			oldState: 0,
13920			source: 0
13921		})), END_KEYCODES = [
13922			9,
13923			13,
13924			27,
13925			32
13926		], START_KEYCODE = 229, canUseCompositionEvent = canUseDOM && "CompositionEvent" in window, documentMode = null;
13927		canUseDOM && "documentMode" in document && (documentMode = document.documentMode);
13928		var canUseTextInputEvent = canUseDOM && "TextEvent" in window && !documentMode, useFallbackCompositionData = canUseDOM && (!canUseCompositionEvent || documentMode && 8 < documentMode && 11 >= documentMode), SPACEBAR_CODE = 32, SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE), hasSpaceKeypress = !1, isComposing = !1, supportedInputTypes = {
13929			color: !0,
13930			date: !0,
13931			datetime: !0,
13932			"datetime-local": !0,
13933			email: !0,
13934			month: !0,
13935			number: !0,
13936			password: !0,
13937			range: !0,
13938			search: !0,
13939			tel: !0,
13940			text: !0,
13941			time: !0,
13942			url: !0,
13943			week: !0
13944		}, activeElement$1 = null, activeElementInst$1 = null, isInputEventSupported = !1;
13945		canUseDOM && (isInputEventSupported = isEventSupported("input") && (!document.documentMode || 9 < document.documentMode));
13946		var objectIs = "function" === typeof Object.is ? Object.is : is, skipSelectionChangeEvent = canUseDOM && "documentMode" in document && 11 >= document.documentMode, activeElement = null, activeElementInst = null, lastSelection = null, mouseDown = !1, vendorPrefixes = {
13947			animationend: makePrefixMap("Animation", "AnimationEnd"),
13948			animationiteration: makePrefixMap("Animation", "AnimationIteration"),
13949			animationstart: makePrefixMap("Animation", "AnimationStart"),
13950			transitionrun: makePrefixMap("Transition", "TransitionRun"),
13951			transitionstart: makePrefixMap("Transition", "TransitionStart"),
13952			transitioncancel: makePrefixMap("Transition", "TransitionCancel"),
13953			transitionend: makePrefixMap("Transition", "TransitionEnd")
13954		}, prefixedEventNames = {}, style = {};
vendor: 4,875 bytes, lines 13955-14002
13955		canUseDOM && (style = document.createElement("div").style, "AnimationEvent" in window || (delete vendorPrefixes.animationend.animation, delete vendorPrefixes.animationiteration.animation, delete vendorPrefixes.animationstart.animation), "TransitionEvent" in window || delete vendorPrefixes.transitionend.transition);
13956		var ANIMATION_END = getVendorPrefixedEventName("animationend"), ANIMATION_ITERATION = getVendorPrefixedEventName("animationiteration"), ANIMATION_START = getVendorPrefixedEventName("animationstart"), TRANSITION_RUN = getVendorPrefixedEventName("transitionrun"), TRANSITION_START = getVendorPrefixedEventName("transitionstart"), TRANSITION_CANCEL = getVendorPrefixedEventName("transitioncancel"), TRANSITION_END = getVendorPrefixedEventName("transitionend"), topLevelEventsToReactNames = /* @__PURE__ */ new Map(), simpleEventPluginEvents = "abort auxClick beforeToggle cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error fullscreenChange fullscreenError gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");
13957		simpleEventPluginEvents.push("scrollEnd");
13958		var globalClientIdCounter$1 = 0, lastResetTime = 0;
13959		if ("object" === typeof performance && "function" === typeof performance.now) {
13960			var localPerformance = performance;
13961			var getCurrentTime = function() {
13962				return localPerformance.now();
13963			};
13964		} else {
13965			var localDate = Date;
13966			getCurrentTime = function() {
13967				return localDate.now();
13968			};
13969		}
13970		var reportGlobalError = "function" === typeof reportError ? reportError : function(error) {
13971			if ("object" === typeof window && "function" === typeof window.ErrorEvent) {
13972				var event = new window.ErrorEvent("error", {
13973					bubbles: !0,
13974					cancelable: !0,
13975					message: "object" === typeof error && null !== error && "string" === typeof error.message ? String(error.message) : String(error),
13976					error
13977				});
13978				if (!window.dispatchEvent(event)) return;
13979			} else if ("object" === typeof process && "function" === typeof process.emit) {
13980				process.emit("uncaughtException", error);
13981				return;
13982			}
13983			console.error(error);
13984		}, OMITTED_PROP_ERROR = "This object has been omitted by React in the console log to avoid sending too much data from the server. Try logging smaller or more specific objects.", EMPTY_ARRAY = 0, COMPLEX_ARRAY = 1, PRIMITIVE_ARRAY = 2, ENTRIES_ARRAY = 3, OBJECT_WIDTH_LIMIT = 100, REMOVED = "-\xA0", ADDED = "+\xA0", UNCHANGED = " \xA0", supportsUserTiming = "undefined" !== typeof console && "function" === typeof console.timeStamp && "undefined" !== typeof performance && "function" === typeof performance.measure, COMPONENTS_TRACK = "Components ⚛", LANES_TRACK_GROUP = "Scheduler ⚛", currentTrack = "Blocking", alreadyWarnedForDeepEquality = !1, reusableComponentDevToolDetails = {
13985			color: "primary",
13986			properties: null,
13987			tooltipText: "",
13988			track: COMPONENTS_TRACK
13989		}, reusableComponentOptions = {
13990			start: -0,
13991			end: -0,
13992			detail: { devtools: reusableComponentDevToolDetails }
13993		}, reusableChangedPropsEntry = ["Changed Props", ""], DEEP_EQUALITY_WARNING = "This component received deeply equal props. It might benefit from useMemo or the React Compiler in its owner.", reusableDeeplyEqualPropsEntry = ["Changed Props", DEEP_EQUALITY_WARNING], OffscreenVisible = 1, OffscreenPassiveEffectsConnected = 2, concurrentQueues = [], concurrentQueuesIndex = 0, concurrentlyUpdatedLanes = 0, emptyContextObject = {};
13994		Object.freeze(emptyContextObject);
13995		var resolveFamily = null, failedBoundaries = null, NoMode = 0, ConcurrentMode = 1, ProfileMode = 2, StrictLegacyMode = 8, StrictEffectsMode = 16, SuspenseyImagesMode = 32;
13996		var hasBadMapPolyfill = !1;
13997		try {
13998			Object.preventExtensions({});
13999		} catch (e$4) {
14000			hasBadMapPolyfill = !0;
14001		}
14002		var CapturedStacks = /* @__PURE__ */ new WeakMap(), forkStack = [], forkStackIndex = 0, treeForkProvider = null, treeForkCount = 0, idStack = [], idStackIndex = 0, treeContextProvider = null, treeContextId = 1, treeContextOverflow = "", hydrationParentFiber = null, nextHydratableInstance = null, isHydrating = !1, didSuspendOrErrorDEV = !1, hydrationDiffRootDEV = null, hydrationErrors = null, rootOrSingletonContext = !1, HydrationMismatchException = Error("Hydration Mismatch Exception: This is not a real error, and should not leak into userspace. If you're seeing this, it's likely a bug in React."), valueCursor = createCursor(null);
14003		var rendererCursorDEV = createCursor(null);
14004		var rendererSigil = {};
14005		var currentlyRenderingFiber$1 = null, lastContextDependency = null, isDisallowedContextReadInDEV = !1, AbortControllerLocal = "undefined" !== typeof AbortController ? AbortController : function() {
14006			var listeners = [], signal = this.signal = {
14007				aborted: !1,
14008				addEventListener: function(type, listener) {
14009					listeners.push(listener);
14010				}
14011			};
14012			this.abort = function() {
14013				signal.aborted = !0;
14014				listeners.forEach(function(listener) {
14015					return listener();
14016				});
14017			};
14018		}, scheduleCallback$2 = Scheduler.unstable_scheduleCallback, NormalPriority = Scheduler.unstable_NormalPriority, CacheContext = {
14019			$$typeof: REACT_CONTEXT_TYPE,
14020			Consumer: null,
14021			Provider: null,
14022			_currentValue: null,
14023			_currentValue2: null,
14024			_threadCount: 0,
14025			_currentRenderer: null,
14026			_currentRenderer2: null
14027		}, entangledTransitionTypes = null, now = Scheduler.unstable_now, createTask = console.createTask ? console.createTask : function() {
14028			return null;
14029		}, SPAWNED_UPDATE = 1, PINGED_UPDATE = 2, renderStartTime = -0, c
14029ommitStartTime = -0, commitEndTime = -0, commitErrors = null, profilerStartTime = -1.1, profilerEffectDuration = -0, componentEffectDuration = -0, componentEffectStartTime = -1.1, componentEffectEndTime = -1.1, componentEffectErrors = null, componentEffectSpawnedUpdate = !1, blockingClampTime = -0, blockingUpdateTime = -1.1, blockingUpdateTask = null, blockingUpdateType = 0, blockingUpdateMethodName = null, blockingUpdateComponentName = null, blockingEventTime = -1.1, blockingEventType = null, blockingEventRepeatTime = -1.1, blockingSuspendedTime = -1.1, transitionClampTime = -0, transitionStartTime = -1.1, transitionUpdateTime = -1.1, transitionUpdateType = 0, transitionUpdateTask = null, transitionUpdateMethodName = null, transitionUpdateComponentName = null, transitionEventTime = -1.1, transitionEventType = null, transitionEventRepeatTime = -1.1, transitionSuspendedTime = -1.1, retryClampTime = -0, idleClampTime = -0, animatingLanes = 0, animatingTask = null, yieldReason = 0, yieldStartTime = -1.1, currentUpdateIsNested = !1, nestedUpdateScheduled = !1, currentEntangledListeners = null, currentEntangledPendingCount = 0, currentEntangledLane = 0, currentEntangledActionThenable = null, prevOnStartTransitionFinish = ReactSharedInternals.S;
14030		ReactSharedInternals.S = function(transition, returnValue) {
14031			globalMostRecentTransitionTime = now$1();
14032			if ("object" === typeof returnValue && null !== returnValue && "function" === typeof returnValue.then) {
14033				if (0 > transitionStartTime && 0 > transitionUpdateTime) {
14034					transitionStartTime = now();
14035					var newEventTime = resolveEventTimeStamp(), newEventType = resolveEventType();
14036					if (newEventTime !== transitionEventRepeatTime || newEventType !== transitionEventType) transitionEventRepeatTime = -1.1;
14037					transitionEventTime = newEventTime;
14038					transitionEventType = newEventType;
14039				}
14040				entangleAsyncAction(transition, returnValue);
14041			}
14042			if (null !== entangledTransitionTypes) for (newEventTime = firstScheduledRoot; null !== newEventTime;) queueTransitionTypes(newEventTime, entangledTransitionTypes), newEventTime = newEventTime.next;
14043			newEventTime = transition.types;
14044			if (null !== newEventTime) {
14045				for (newEventType = firstScheduledRoot; null !== newEventType;) queueTransitionTypes(newEventType, newEventTime), newEventType = newEventType.next;
14046				if (0 !== currentEntangledLane) {
14047					newEventType = entangledTransitionTypes;
14048					null === newEventType && (newEventType = entangledTransitionTypes = []);
14049					for (var i = 0; i < newEventTime.length; i++) {
14050						var transitionType = newEventTime[i];
14051						-1 === newEventType.indexOf(transitionType) && newEventType.push(transitionType);
14052					}
14053				}
14054			}
14055			null !== prevOnStartTransitionFinish && prevOnStartTransitionFinish(transition, returnValue);
14056		};
14057		var resumedCache = createCursor(null), ReactStrictModeWarnings = {
14058			recordUnsafeLifecycleWarnings: function() {},
14059			flushPendingUnsafeLifecycleWarnings: function() {},
14060			recordLegacyContextWarning: function() {},
14061			flushLegacyContextWarning: function() {},
14062			discardPendingWarnings: function() {}
14063		}, pendingComponentWillMountWarnings = [], pendingUNSAFE_ComponentWillMountWarnings = [], pendingComponentWillReceivePropsWarnings = [], pendingUNSAFE_ComponentWillReceivePropsWarnings = [], pendingComponentWillUpdateWarnings = [], pendingUNSAFE_ComponentWillUpdateWarnings = [], didWarnAboutUnsafeLifecycles = /* @__PURE__ */ new Set();
14064		ReactStrictModeWarnings.recordUnsafeLifecycleWarnings = function(fiber, instance) {
14065			didWarnAboutUnsafeLifecycles.has(fiber.type) || ("function" === typeof instance.componentWillMount && !0 !== instance.componentWillMount.__suppressDeprecationWarning && pendingComponentWillMountWarnings.push(fiber), fiber.mode & StrictLegacyMode && "function" === typeof instance.UNSAFE_componentWillMount && pendingUNSAFE_ComponentWillMountWarnings.push(fiber), "function" === typeof instance.componentWillReceiveProps && !0 !== instance.componentWillReceiveProps.__suppressDeprecationWarning && pendingComponentWillReceivePropsWarnings.push(fiber), fiber.mode & StrictLegacyMode && "function" === typeof instance.UNSAFE_componentWillReceiveProps && pendingUNSAFE_ComponentWillReceivePropsWarnings.push(fiber), "function" === typeof instance.componentWillUpdate && !0 !== instance.componentWillUpdate.__suppressDeprecationWarning && pendingComponentWillUpdateWarnings.push(fiber), fiber.mode & StrictLegacyMode && "function" === typeof instance.UNSAFE_componentWillUpdate && pendingUNSAFE_ComponentWillUpdateWarnings.push(fiber));
14066		};
14067		ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings = function() {
14068			var componentWillMountUniqueNames = /* @__PURE__ */ new Set();
14069			0 < pendingComponentWillMountWarnings.length && (pendingComponentWillMountWarnings.forEac
14069h(function(fiber) {
14070				componentWillMountUniqueNames.add(getComponentNameFromFiber(fiber) || "Component");
14071				didWarnAboutUnsafeLifecycles.add(fiber.type);
14072			}), pendingComponentWillMountWarnings = []);
14073			var UNSAFE_componentWillMountUniqueNames = /* @__PURE__ */ new Set();
14074			0 < pendingUNSAFE_ComponentWillMountWarnings.length && (pendingUNSAFE_ComponentWillMountWarnings.forEach(function(fiber) {
14075				UNSAFE_componentWillMountUniqueNames.add(getComponentNameFromFiber(fiber) || "Component");
14076				didWarnAboutUnsafeLifecycles.add(fiber.type);
14077			}), pendingUNSAFE_ComponentWillMountWarnings = []);
14078			var componentWillReceivePropsUniqueNames = /* @__PURE__ */ new Set();
14079			0 < pendingComponentWillReceivePropsWarnings.length && (pendingComponentWillReceivePropsWarnings.forEach(function(fiber) {
14080				componentWillReceivePropsUniqueNames.add(getComponentNameFromFiber(fiber) || "Component");
14081				didWarnAboutUnsafeLifecycles.add(fiber.type);
14082			}), pendingComponentWillReceivePropsWarnings = []);
14083			var UNSAFE_componentWillReceivePropsUniqueNames = /* @__PURE__ */ new Set();
14084			0 < pendingUNSAFE_ComponentWillReceivePropsWarnings.length && (pendingUNSAFE_ComponentWillReceivePropsWarnings.forEac
14084h(function(fiber) {
14085				UNSAFE_componentWillReceivePropsUniqueNames.add(getComponentNameFromFiber(fiber) || "Component");
14086				didWarnAboutUnsafeLifecycles.add(fiber.type);
14087			}), pendingUNSAFE_ComponentWillReceivePropsWarnings = []);
14088			var componentWillUpdateUniqueNames = /* @__PURE__ */ new Set();
14089			0 < pendingComponentWillUpdateWarnings.length && (pendingComponentWillUpdateWarnings.forEach(function(fiber) {
14090				componentWillUpdateUniqueNames.add(getComponentNameFromFiber(fiber) || "Component");
14091				didWarnAboutUnsafeLifecycles.add(fiber.type);
14092			}), pendingComponentWillUpdateWarnings = []);
14093			var UNSAFE_componentWillUpdateUniqueNames = /* @__PURE__ */ new Set();
14094			0 < pendingUNSAFE_ComponentWillUpdateWarnings.length && (pendingUNSAFE_ComponentWillUpdateWarnings.forEach(function(fiber) {
14095				UNSAFE_componentWillUpdateUniqueNames.add(getComponentNameFromFiber(fiber) || "Component");
14096				didWarnAboutUnsafeLifecycles.add(fiber.type);
14097			}), pendingUNSAFE_ComponentWillUpdateWarnings = []);
14098			if (0 < UNSAFE_componentWillMountUniqueNames.size) {
14099				var sortedNames = setToSortedString(UNSAFE_componentWillMountUniqueNames);
14100				console.error("Using UNSAFE_componentWillMount in strict mode is not recommended and may indicate bugs in your code. See https://react.dev/link/unsafe-component-lifecycles for details.\n\n* Move code with side effects to componentDidMount, and set initial state in the constructor.\n\nPlease update the following components: %s", sortedNames);
14101			}
14102			0 < UNSAFE_componentWillReceivePropsUniqueNames.size && (sortedNames = setToSortedString(UNSAFE_componentWillReceivePropsUniqueNames), console.error("Using UNSAFE_componentWillReceiveProps in strict mode is not recommended and may indicate bugs in your code. See https://react.dev/link/unsafe-component-lifecycles for details.\n\n* Move data fetching code or side effects to componentDidUpdate.\n* If you're updating state whenever props change, refactor your code to use memoization techniques or move it to static getDerivedStateFromProps. Learn more at: https://react.dev/link/derived-state\n\nPlease update the following components: %s", sortedNames));
14103			0 < UNSAFE_componentWillUpdateUniqueNames.size && (sortedNames = setToSortedString(UNSAFE_componentWillUpdateUniqueNames), console.error("Using UNSAFE_componentWillUpdate in strict mode is not recommended and may indicate bugs in your code. See https://react.dev/link/unsafe-component-lifecycles for details.\n\n* Move data fetching code or side effects to componentDidUpdate.\n\nPlease update the following components: %s", sortedNames));
14104			0 < componentWillMountUniqueNames.size && (sortedNames = setToSortedString(componentWillMountUniqueNames), console.warn("componentWillMount has been renamed, and is not recommended for use. See https://react.dev/link/unsafe-component-lifecycles for details.\n\n* Move code with side effects to componentDidMount, and set initial state in the constructor.\n* Rename componentWillMount to UNSAFE_componentWillMount to suppress this warning in non-strict mode. In React 18.x, only the UNSAFE_ name will work. To rename all deprecated lifecycles to their new names, you can run `npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n\nPlease update the following components: %s", sortedNames));
14105			0 < componentWillReceivePropsUniqueNames.size && (sortedNames = setToSortedString(componentWillReceivePropsUniqueNames), console.warn("componentWillReceiveProps has been renamed, and is not recommended for use. See https://react.dev/link/unsafe-component-lifecycles for details.\n\n* Move data fetching code or side effects to componentDidUpdate.\n* If you're updating state whenever props change, refactor your code to use memoization techniques or move it to static getDerivedStateFromProps. Learn more at: https://react.dev/link/derived-state\n* Rename componentWillReceiveProps to UNSAFE_componentWillReceiveProps to suppress this warning in non-strict mode. In React 18.x, only the UNSAFE_ name will work. To rename all deprecated lifecycles to their new names, you can run `npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n\nPlease update the following components: %s", sortedNames));
14106			0 < componentWillUpdateUniqueNames.size && (sortedNames = setToSortedString(componentWillUpdateUniqueNames), console.warn("componentWillUpdate has been renamed, and is not recommended for use. See https://react.dev/link/unsafe-component-lifecycles for details.\n\n* Move data fetching code or side effects to componentDidUpdate.\n* Rename componentWillUpdate to UNSAFE_componentWillUpdate to suppress this warning in non-strict mode. In React 18.x, only the UNSAFE_ name will work. To rename all deprecated lifecycles to their new names, you can run `npx react-codemod rename-unsafe-lifecycles` in your project source folder.\n\nPlease update the following components: %s", sortedNames));
14107		};
14108		var pendingLegacyContextWarning = /* @__PURE__ */ new Map(), didWarnAboutLegacyContext = /* @__PURE__ */ new Set();
14109		ReactStrictModeWarnings.recordLegacyContextWarning = function(fiber, instance) {
14110			var strictRoot = null;
14111			for (var node = fiber; null !== node;) node.mode & StrictLegacyMode && (strictRoot = node), node = node.return;
14112			null === strictRoot ? console.error("Expected to find a StrictMode component in a strict mode tree. This error is likely caused by a bug in React. Please file an issue.") : !didWarnAboutLegacyContext.has(fiber.type) && (node = pendingLegacyContextWarning.get(strictRoot), null != fiber.type.contextTypes || null != fiber.type.childContextTypes || null !== instance && "function" === typeof instance.getChildContext) && (void 0 === node && (node = [], pendingLegacyContextWarning.set(strictRoot, node)), node.push(fiber));
14113		};
14114		ReactStrictModeWarnings.flushLegacyContextWarning = function() {
14115			pendingLegacyContextWarning.forEach(function(fiberArray) {
14116				if (0 !== fiberArray.length) {
14117					var firstFiber = fiberArray[0], uniqueNames = /* @__PURE__ */ new Set();
14118					fiberArray.forEach(function(fiber) {
14119						uniqueNames.add(getComponentNameFromFiber(fiber) || "Component");
14120						didWarnAboutLegacyContext.add(fiber.type);
14121					});
14122					var sortedNames = setToSortedString(uniqueNames);
14123					runWithFiberInDEV(firstFiber, function() {
14124						console.error("Legacy context API has been detected within a strict-mode tree.\n\nThe old API will be supported in all 16.x releases, but applications using it should migrate to the new version.\n\nPlease update the following components: %s\n\nLearn more about this warning here: https://react.dev/link/legacy-context", sortedNames);
14125					});
14126				}
14127			});
14128		};
14129		ReactStrictModeWarnings.discardPendingWarnings = function() {
14130			pendingComponentWillMountWarnings = [];
14131			pendingUNSAFE_ComponentWillMountWarnings = [];
14132			pendingComponentWillReceivePropsWarnings = [];
14133			pendingUNSAFE_ComponentWillReceivePropsWarnings = [];
14134			pendingComponentWillUpdateWarnings = [];
14135			pendingUNSAFE_ComponentWillUpdateWarnings = [];
14136			pendingLegacyContextWarning = /* @__PURE__ */ new Map();
14137		};
14138		var REACT_RECOVERABLE_DIGEST = "", callComponent = { react_stack_bottom_frame: function(Component, props, secondArg) {
14139			var wasRendering = isRendering;
14140			isRendering = !0;
14141			try {
14142				return Component(props, secondArg);
14143			} finally {
14144				isRendering = wasRendering;
14145			}
14146		} }, callComponentInDEV = callComponent.react_stack_bottom_frame.bind(callComponent), callRender = { react_stack_bottom_frame: function(instance) {
14147			var wasRendering = isRendering;
14148			isRendering = !0;
14149			try {
14150				return instance.render();
14151			} finally {
14152				isRendering = wasRendering;
14153			}
14154		} }, callRenderInDEV = callRender.react_stack_bottom_frame.bind(callRender), callComponentDidMount = { react_stack_bottom_frame: function(finishedWork, instance) {
14155			try {
14156				instance.componentDidMount();
14157			} catch (error) {
14158				captureCommitPhaseError(finishedWork, finishedWork.return, error);
14159			}
14160		} }, callComponentDidMountInDEV = callComponentDidMount.react_stack_bottom_frame.bind(callComponentDidMount), callComponentDidUpdate = { react_stack_bottom_frame: function(finishedWork, instance, prevProps, prevState, snapshot) {
14161			try {
14162				instance.componentDidUpdate(prevProps, prevState, snapshot);
14163			} catch (error) {
14164				captureCommitPhaseError(finishedWork, finishedWork.return, error);
14165			}
14166		} }, callComponentDidUpdateInDEV = callComponentDidUpdate.react_stack_bottom_frame.bind(callComponentDidUpdate), callComponentDidCatch = { react_stack_bottom_frame: function(instance, errorInfo) {
14167			var stack = errorInfo.stack;
14168			instance.componentDidCatch(errorInfo.value, { componentStack: null !== stack ? stack : "" });
14169		} }, callComponentDidCatchInDEV = callComponentDidCatch.react_stack_bottom_frame.bind(callComponentDidCatch), callComponentWillUnmount = { react_stack_bottom_frame: function(current, nearestMountedAncestor, instance) {
14170			try {
14171				instance.componentWillUnmount();
14172			} catch (error) {
14173				captureCommitPhaseError(current, nearestMountedAncestor, error);
14174			}
14175		} }, callComponentWillUnmountInDEV = callComponentWillUnmount.react_stack_bottom_frame.bind(callComponentWillUnmount), callCreate = { react_stack_bottom_frame: function(effect) {
14176			var create = effect.create;
14177			effect = effect.inst;
14178			create = create();
14179			return effect.destroy = create;
14180		} }, callCreateInDEV = callCreate.react_stack_bottom_frame.bind(callCreate), callDestroy = { react_stack_bottom_frame: function(current, nearestMountedAncestor, destroy) {
14181			try {
14182				destroy();
14183			} catch (error) {
14184				captureCommitPhaseError(current, nearestMountedAncestor, error);
14185			}
14186		} }, callDestroyInDEV = callDestroy.react_stack_bottom_frame.bind(callDestroy), callLazyInit = { react_stack_bottom_frame: function(lazy) {
14187			var init = lazy._init;
14188			return init(lazy._payload);
14189		} }, callLazyInitInDEV = callLazyInit.react_stack_bottom_frame.bind(callLazyInit), SuspenseException = Error("Suspense Exception: This is not a real error! It's an implementation detail of `use` to interrupt the current render. You must either rethrow it immediately, or move the `use` call outside of the `try/catch` block. Capturing without rethrowing will lead to unexpected behavior.\n\nTo handle async errors, wrap your component in an error boundary, or call the promise's `.catch` method and pass the result to `use`."), SuspenseyCommitException = Error("Suspense Exception: This is not a real error, and should not leak into userspace. If you're seeing this, it's likely a bug in React."), SuspenseActionException = Error("Suspense Exception: This is not a real error! It's an implementation detail of `useActionState` to interrupt the current render. You must either rethrow it immediately, or move the `useActionState` call outside of the `try/catch` block. Capturing without rethrowing will lead to unexpected behavior.\n\nTo handle async errors, wrap your component in an error boundary."), noopSuspenseyCommitThenable = { then: function() {
14190			console.error("Internal React error: A listener was unexpectedly attached to a \"noop\" thenable. This is a bug in React. Please file an issue.");
14191		} }, lastSuspendedFiber = null, lastSuspendedStack = null, didIssueUseWarning = !1, suspendedThenable = null, needsToResetSuspendedThenableDEV = !1, thenableState$1 = null, thenableIndexCounter$1 = 0, currentDebugInfo = null, didWarnAboutMaps;
14192		var didWarnAboutGenerators = didWarnAboutMaps = !1;
14193		var ownerHasKeyUseWarning = {};
14194		var ownerHasFunctionTypeWarning = {};
14195		var ownerHasSymbolTypeWarning = {};
14196		warnForMissingKey = function(returnFiber, workInProgress, child) {
14197			if (null !== child && "object" === typeof child && child._store && (!child._store.validated && null == child.key || 2 === child._store.validated)) {
14198				if ("object" !== typeof child._store) throw Error("React Component in warnForMissingKey should have a _store. This error is likely caused by a bug in React. Please file an issue.");
14199				child._store.validated = 1;
14200				var componentName = getComponentNameFromFiber(returnFiber), componentKey = componentName || "null";
14201				if (!ownerHasKeyUseWarning[componentKey]) {
14202					ownerHasKeyUseWarning[componentKey] = !0;
14203					child = child._owner;
14204					returnFiber = returnFiber._debugOwner;
14205					var currentComponentErrorInfo = "";
14206					returnFiber && "number" === typeof returnFiber.tag && (componentKey = getComponentNameFromFiber(returnFiber)) && (currentComponentErrorInfo = "\n\nCheck the render method of `" + componentKey + "`.");
14207					currentComponentErrorInfo || componentName && (currentComponentErrorInfo = "\n\nCheck the top-level render call using <" + componentName + ">.");
14208					var childOwnerAppendix = "";
14209					null != child && returnFiber !== child && (componentName = null, "number" === typeof child.tag ? componentName = getComponentNameFromFiber(child) : "string" === typeof child.name && (componentName = child.name), componentName && (childOwnerAppendix = " It was passed a child from " + componentName + "."));
14210					runWithFiberInDEV(workInProgress, function() {
vendor: 34,000 bytes, lines 14211-15222
14211						console.error("Each child in a list should have a unique \"key\" prop.%s%s See https://react.dev/link/warning-keys for more information.", currentComponentErrorInfo, childOwnerAppendix);
14212					});
14213				}
14214			}
14215		};
14216		var reconcileChildFibers = createChildReconciler(!0), mountChildFibers = createChildReconciler(!1), UpdateState = 0, ReplaceState = 1, ForceUpdate = 2, CaptureUpdate = 3, hasForceUpdate = !1;
14217		var didWarnUpdateInsideUpdate = !1;
14218		var currentlyProcessingQueue = null;
14219		var didReadFromEntangledAsyncAction = !1, currentTreeHiddenStackCursor = createCursor(null), prevEntangledRenderLanesCursor = createCursor(0), suspenseHandlerStackCursor = createCursor(null), shellBoundary = null, SubtreeSuspenseContextMask = 1, ForceSuspenseFallback = 2, suspenseStackCursor = createCursor(0), NoFlags = 0, HasEffect = 1, Insertion = 2, Layout = 4, Passive = 8, didWarnUncachedGetSnapshot;
14220		var didWarnAboutMismatchedHooksForComponent = /* @__PURE__ */ new Set();
14221		var didWarnAboutUseWrappedInTryCatch = /* @__PURE__ */ new Set();
14222		var didWarnAboutAsyncClientComponent = /* @__PURE__ */ new Set();
14223		var didWarnAboutUseFormState = /* @__PURE__ */ new Set();
14224		var renderLanes = 0, currentlyRenderingFiber = null, currentHook = null, workInProgressHook = null, didScheduleRenderPhaseUpdate = !1, didScheduleRenderPhaseUpdateDuringThisPass = !1, shouldDoubleInvokeUserFnsInHooksDEV = !1, localIdCounter = 0, thenableIndexCounter = 0, thenableState = null, globalClientIdCounter = 0, RE_RENDER_LIMIT = 25, currentHookNameInDev = null, hookTypesDev = null, hookTypesUpdateIndexDev = -1, ignorePreviousDependencies = !1, ContextOnlyDispatcher = {
14225			readContext,
14226			use,
14227			useCallback: throwInvalidHookError,
14228			useContext: throwInvalidHookError,
14229			useEffect: throwInvalidHookError,
14230			useImperativeHandle: throwInvalidHookError,
14231			useLayoutEffect: throwInvalidHookError,
14232			useInsertionEffect: throwInvalidHookError,
14233			useMemo: throwInvalidHookError,
14234			useReducer: throwInvalidHookError,
14235			useRef: throwInvalidHookError,
14236			useState: throwInvalidHookError,
14237			useDebugValue: throwInvalidHookError,
14238			useDeferredValue: throwInvalidHookError,
14239			useTransition: throwInvalidHookError,
14240			useSyncExternalStore: throwInvalidHookError,
14241			useId: throwInvalidHookError,
14242			useHostTransitionStatus: throwInvalidHookError,
14243			useFormState: throwInvalidHookError,
14244			useActionState: throwInvalidHookError,
14245			useOptimistic: throwInvalidHookError,
14246			useMemoCache: throwInvalidHookError,
14247			useCacheRefresh: throwInvalidHookError,
14248			useEffectEvent: throwInvalidHookError
14249		}, HooksDispatcherOnMountInDEV = null, HooksDispatcherOnMountWithHookTypesInDEV = null, HooksDispatcherOnUpdateInDEV = null, HooksDispatcherOnRerenderInDEV = null, InvalidNestedHooksDispatcherOnMountInDEV = null, InvalidNestedHooksDispatcherOnUpdateInDEV = null, InvalidNestedHooksDispatcherOnRerenderInDEV = null;
14250		HooksDispatcherOnMountInDEV = {
14251			readContext: function(context) {
14252				return readContext(context);
14253			},
14254			use,
14255			useCallback: function(callback, deps) {
14256				currentHookNameInDev = "useCallback";
14257				mountHookTypesDev();
14258				checkDepsAreArrayDev(deps);
14259				return mountCallback(callback, deps);
14260			},
14261			useContext: function(context) {
14262				currentHookNameInDev = "useContext";
14263				mountHookTypesDev();
14264				return readContext(context);
14265			},
14266			useEffect: function(create, deps) {
14267				currentHookNameInDev = "useEffect";
14268				mountHookTypesDev();
14269				checkDepsAreArrayDev(deps);
14270				return mountEffect(create, deps);
14271			},
14272			useImperativeHandle: function(ref, create, deps) {
14273				currentHookNameInDev = "useImperativeHandle";
14274				mountHookTypesDev();
14275				checkDepsAreArrayDev(deps);
14276				return mountImperativeHandle(ref, create, deps);
14277			},
14278			useInsertionEffect: function(create, deps) {
14279				currentHookNameInDev = "useInsertionEffect";
14280				mountHookTypesDev();
14281				checkDepsAreArrayDev(deps);
14282				mountEffectImpl(4, Insertion, create, deps);
14283			},
14284			useLayoutEffect: function(create, deps) {
14285				currentHookNameInDev = "useLayoutEffect";
14286				mountHookTypesDev();
14287				checkDepsAreArrayDev(deps);
14288				return mountLayoutEffect(create, deps);
14289			},
14290			useMemo: function(create, deps) {
14291				currentHookNameInDev = "useMemo";
14292				mountHookTypesDev();
14293				checkDepsAreArrayDev(deps);
14294				var prevDispatcher = ReactSharedInternals.H;
14295				ReactSharedInternals.H = InvalidNestedHooksDispatcherOnMountInDEV;
14296				try {
14297					return mountMemo(create, deps);
14298				} finally {
14299					ReactSharedInternals.H = prevDispatcher;
14300				}
14301			},
14302			useReducer: function(reducer, initialArg, init) {
14303				currentHookNameInDev = "useReducer";
14304				mountHookTypesDev();
14305				var prevDispatcher = ReactSharedInternals.H;
14306				ReactSharedInternals.H = InvalidNestedHooksDispatcherOnMountInDEV;
14307				try {
14308					return mountReducer(reducer, initialArg, init);
14309				} finally {
14310					ReactSharedInternals.H = prevDispatcher;
14311				}
14312			},
14313			useRef: function(initialValue) {
14314				currentHookNameInDev = "useRef";
14315				mountHookTypesDev();
14316				return mountRef(initialValue);
14317			},
14318			useState: function(initialState) {
14319				currentHookNameInDev = "useState";
14320				mountHookTypesDev();
14321				var prevDispatcher = ReactSharedInternals.H;
14322				ReactSharedInternals.H = InvalidNestedHooksDispatcherOnMountInDEV;
14323				try {
14324					return mountState(initialState);
14325				} finally {
14326					ReactSharedInternals.H = prevDispatcher;
14327				}
14328			},
14329			useDebugValue: function() {
14330				currentHookNameInDev = "useDebugValue";
14331				mountHookTypesDev();
14332			},
14333			useDeferredValue: function(value, initialValue) {
14334				currentHookNameInDev = "useDeferredValue";
14335				mountHookTypesDev();
14336				return mountDeferredValue(value, initialValue);
14337			},
14338			useTransition: function() {
14339				currentHookNameInDev = "useTransition";
14340				mountHookTypesDev();
14341				return mountTransition();
14342			},
14343			useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) {
14344				currentHookNameInDev = "useSyncExternalStore";
14345				mountHookTypesDev();
14346				return mountSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
14347			},
14348			useId: function() {
14349				currentHookNameInDev = "useId";
14350				mountHookTypesDev();
14351				return mountId();
14352			},
14353			useFormState: function(action, initialState) {
14354				currentHookNameInDev = "useFormState";
14355				mountHookTypesDev();
14356				warnOnUseFormStateInDev();
14357				return mountActionState(action, initialState);
14358			},
14359			useActionState: function(action, initialState) {
14360				currentHookNameInDev = "useActionState";
14361				mountHookTypesDev();
14362				return mountActionState(action, initialState);
14363			},
14364			useOptimistic: function(passthrough) {
14365				currentHookNameInDev = "useOptimistic";
14366				mountHookTypesDev();
14367				return mountOptimistic(passthrough);
14368			},
14369			useHostTransitionStatus,
14370			useMemoCache,
14371			useCacheRefresh: function() {
14372				currentHookNameInDev = "useCacheRefresh";
14373				mountHookTypesDev();
14374				return mountRefresh();
14375			},
14376			useEffectEvent: function(callback) {
14377				currentHookNameInDev = "useEffectEvent";
14378				mountHookTypesDev();
14379				return mountEvent(callback);
14380			}
14381		};
14382		HooksDispatcherOnMountWithHookTypesInDEV = {
14383			readContext: function(context) {
14384				return readContext(context);
14385			},
14386			use,
14387			useCallback: function(callback, deps) {
14388				currentHookNameInDev = "useCallback";
14389				updateHookTypesDev();
14390				return mountCallback(callback, deps);
14391			},
14392			useContext: function(context) {
14393				currentHookNameInDev = "useContext";
14394				updateHookTypesDev();
14395				return readContext(context);
14396			},
14397			useEffect: function(create, deps) {
14398				currentHookNameInDev = "useEffect";
14399				updateHookTypesDev();
14400				return mountEffect(create, deps);
14401			},
14402			useImperativeHandle: function(ref, create, deps) {
14403				currentHookNameInDev = "useImperativeHandle";
14404				updateHookTypesDev();
14405				return mountImperativeHandle(ref, create, deps);
14406			},
14407			useInsertionEffect: function(create, deps) {
14408				currentHookNameInDev = "useInsertionEffect";
14409				updateHookTypesDev();
14410				mountEffectImpl(4, Insertion, create, deps);
14411			},
14412			useLayoutEffect: function(create, deps) {
14413				currentHookNameInDev = "useLayoutEffect";
14414				updateHookTypesDev();
14415				return mountLayoutEffect(create, deps);
14416			},
14417			useMemo: function(create, deps) {
14418				currentHookNameInDev = "useMemo";
14419				updateHookTypesDev();
14420				var prevDispatcher = ReactSharedInternals.H;
14421				ReactSharedInternals.H = InvalidNestedHooksDispatcherOnMountInDEV;
14422				try {
14423					return mountMemo(create, deps);
14424				} finally {
14425					ReactSharedInternals.H = prevDispatcher;
14426				}
14427			},
14428			useReducer: function(reducer, initialArg, init) {
14429				currentHookNameInDev = "useReducer";
14430				updateHookTypesDev();
14431				var prevDispatcher = ReactSharedInternals.H;
14432				ReactSharedInternals.H = InvalidNestedHooksDispatcherOnMountInDEV;
14433				try {
14434					return mountReducer(reducer, initialArg, init);
14435				} finally {
14436					ReactSharedInternals.H = prevDispatcher;
14437				}
14438			},
14439			useRef: function(initialValue) {
14440				currentHookNameInDev = "useRef";
14441				updateHookTypesDev();
14442				return mountRef(initialValue);
14443			},
14444			useState: function(initialState) {
14445				currentHookNameInDev = "useState";
14446				updateHookTypesDev();
14447				var prevDispatcher = ReactSharedInternals.H;
14448				ReactSharedInternals.H = InvalidNestedHooksDispatcherOnMountInDEV;
14449				try {
14450					return mountState(initialState);
14451				} finally {
14452					ReactSharedInternals.H = prevDispatcher;
14453				}
14454			},
14455			useDebugValue: function() {
14456				currentHookNameInDev = "useDebugValue";
14457				updateHookTypesDev();
14458			},
14459			useDeferredValue: function(value, initialValue) {
14460				currentHookNameInDev = "useDeferredValue";
14461				updateHookTypesDev();
14462				return mountDeferredValue(value, initialValue);
14463			},
14464			useTransition: function() {
14465				currentHookNameInDev = "useTransition";
14466				updateHookTypesDev();
14467				return mountTransition();
14468			},
14469			useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) {
14470				currentHookNameInDev = "useSyncExternalStore";
14471				updateHookTypesDev();
14472				return mountSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
14473			},
14474			useId: function() {
14475				currentHookNameInDev = "useId";
14476				updateHookTypesDev();
14477				return mountId();
14478			},
14479			useActionState: function(action, initialState) {
14480				currentHookNameInDev = "useActionState";
14481				updateHookTypesDev();
14482				return mountActionState(action, initialState);
14483			},
14484			useFormState: function(action, initialState) {
14485				currentHookNameInDev = "useFormState";
14486				updateHookTypesDev();
14487				warnOnUseFormStateInDev();
14488				return mountActionState(action, initialState);
14489			},
14490			useOptimistic: function(passthrough) {
14491				currentHookNameInDev = "useOptimistic";
14492				updateHookTypesDev();
14493				return mountOptimistic(passthrough);
14494			},
14495			useHostTransitionStatus,
14496			useMemoCache,
14497			useCacheRefresh: function() {
14498				currentHookNameInDev = "useCacheRefresh";
14499				updateHookTypesDev();
14500				return mountRefresh();
14501			},
14502			useEffectEvent: function(callback) {
14503				currentHookNameInDev = "useEffectEvent";
14504				updateHookTypesDev();
14505				return mountEvent(callback);
14506			}
14507		};
14508		HooksDispatcherOnUpdateInDEV = {
14509			readContext: function(context) {
14510				return readContext(context);
14511			},
14512			use,
14513			useCallback: function(callback, deps) {
14514				currentHookNameInDev = "useCallback";
14515				updateHookTypesDev();
14516				return updateCallback(callback, deps);
14517			},
14518			useContext: function(context) {
14519				currentHookNameInDev = "useContext";
14520				updateHookTypesDev();
14521				return readContext(context);
14522			},
14523			useEffect: function(create, deps) {
14524				currentHookNameInDev = "useEffect";
14525				updateHookTypesDev();
14526				updateEffectImpl(2048, Passive, create, deps);
14527			},
14528			useImperativeHandle: function(ref, create, deps) {
14529				currentHookNameInDev = "useImperativeHandle";
14530				updateHookTypesDev();
14531				return updateImperativeHandle(ref, create, deps);
14532			},
14533			useInsertionEffect: function(create, deps) {
14534				currentHookNameInDev = "useInsertionEffect";
14535				updateHookTypesDev();
14536				return updateEffectImpl(4, Insertion, create, deps);
14537			},
14538			useLayoutEffect: function(create, deps) {
14539				currentHookNameInDev = "useLayoutEffect";
14540				updateHookTypesDev();
14541				return updateEffectImpl(4, Layout, create, deps);
14542			},
14543			useMemo: function(create, deps) {
14544				currentHookNameInDev = "useMemo";
14545				updateHookTypesDev();
14546				var prevDispatcher = ReactSharedInternals.H;
14547				ReactSharedInternals.H = InvalidNestedHooksDispatcherOnUpdateInDEV;
14548				try {
14549					return updateMemo(create, deps);
14550				} finally {
14551					ReactSharedInternals.H = prevDispatcher;
14552				}
14553			},
14554			useReducer: function(reducer, initialArg, init) {
14555				currentHookNameInDev = "useReducer";
14556				updateHookTypesDev();
14557				var prevDispatcher = ReactSharedInternals.H;
14558				ReactSharedInternals.H = InvalidNestedHooksDispatcherOnUpdateInDEV;
14559				try {
14560					return updateReducer(reducer, initialArg, init);
14561				} finally {
14562					ReactSharedInternals.H = prevDispatcher;
14563				}
14564			},
14565			useRef: function() {
14566				currentHookNameInDev = "useRef";
14567				updateHookTypesDev();
14568				return updateWorkInProgressHook().memoizedState;
14569			},
14570			useState: function() {
14571				currentHookNameInDev = "useState";
14572				updateHookTypesDev();
14573				var prevDispatcher = ReactSharedInternals.H;
14574				ReactSharedInternals.H = InvalidNestedHooksDispatcherOnUpdateInDEV;
14575				try {
14576					return updateReducer(basicStateReducer);
14577				} finally {
14578					ReactSharedInternals.H = prevDispatcher;
14579				}
14580			},
14581			useDebugValue: function() {
14582				currentHookNameInDev = "useDebugValue";
14583				updateHookTypesDev();
14584			},
14585			useDeferredValue: function(value, initialValue) {
14586				currentHookNameInDev = "useDeferredValue";
14587				updateHookTypesDev();
14588				return updateDeferredValue(value, initialValue);
14589			},
14590			useTransition: function() {
14591				currentHookNameInDev = "useTransition";
14592				updateHookTypesDev();
14593				return updateTransition();
14594			},
14595			useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) {
14596				currentHookNameInDev = "useSyncExternalStore";
14597				updateHookTypesDev();
14598				return updateSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
14599			},
14600			useId: function() {
14601				currentHookNameInDev = "useId";
14602				updateHookTypesDev();
14603				return updateWorkInProgressHook().memoizedState;
14604			},
14605			useFormState: function(action) {
14606				currentHookNameInDev = "useFormState";
14607				updateHookTypesDev();
14608				warnOnUseFormStateInDev();
14609				return updateActionState(action);
14610			},
14611			useActionState: function(action) {
14612				currentHookNameInDev = "useActionState";
14613				updateHookTypesDev();
14614				return updateActionState(action);
14615			},
14616			useOptimistic: function(passthrough, reducer) {
14617				currentHookNameInDev = "useOptimistic";
14618				updateHookTypesDev();
14619				return updateOptimistic(passthrough, reducer);
14620			},
14621			useHostTransitionStatus,
14622			useMemoCache,
14623			useCacheRefresh: function() {
14624				currentHookNameInDev = "useCacheRefresh";
14625				updateHookTypesDev();
14626				return updateWorkInProgressHook().memoizedState;
14627			},
14628			useEffectEvent: function(callback) {
14629				currentHookNameInDev = "useEffectEvent";
14630				updateHookTypesDev();
14631				return updateEvent(callback);
14632			}
14633		};
14634		HooksDispatcherOnRerenderInDEV = {
14635			readContext: function(context) {
14636				return readContext(context);
14637			},
14638			use,
14639			useCallback: function(callback, deps) {
14640				currentHookNameInDev = "useCallback";
14641				updateHookTypesDev();
14642				return updateCallback(callback, deps);
14643			},
14644			useContext: function(context) {
14645				currentHookNameInDev = "useContext";
14646				updateHookTypesDev();
14647				return readContext(context);
14648			},
14649			useEffect: function(create, deps) {
14650				currentHookNameInDev = "useEffect";
14651				updateHookTypesDev();
14652				updateEffectImpl(2048, Passive, create, deps);
14653			},
14654			useImperativeHandle: function(ref, create, deps) {
14655				currentHookNameInDev = "useImperativeHandle";
14656				updateHookTypesDev();
14657				return updateImperativeHandle(ref, create, deps);
14658			},
14659			useInsertionEffect: function(create, deps) {
14660				currentHookNameInDev = "useInsertionEffect";
14661				updateHookTypesDev();
14662				return updateEffectImpl(4, Insertion, create, deps);
14663			},
14664			useLayoutEffect: function(create, deps) {
14665				currentHookNameInDev = "useLayoutEffect";
14666				updateHookTypesDev();
14667				return updateEffectImpl(4, Layout, create, deps);
14668			},
14669			useMemo: function(create, deps) {
14670				currentHookNameInDev = "useMemo";
14671				updateHookTypesDev();
14672				var prevDispatcher = ReactSharedInternals.H;
14673				ReactSharedInternals.H = InvalidNestedHooksDispatcherOnRerenderInDEV;
14674				try {
14675					return updateMemo(create, deps);
14676				} finally {
14677					ReactSharedInternals.H = prevDispatcher;
14678				}
14679			},
14680			useReducer: function(reducer, initialArg, init) {
14681				currentHookNameInDev = "useReducer";
14682				updateHookTypesDev();
14683				var prevDispatcher = ReactSharedInternals.H;
14684				ReactSharedInternals.H = InvalidNestedHooksDispatcherOnRerenderInDEV;
14685				try {
14686					return rerenderReducer(reducer, initialArg, init);
14687				} finally {
14688					ReactSharedInternals.H = prevDispatcher;
14689				}
14690			},
14691			useRef: function() {
14692				currentHookNameInDev = "useRef";
14693				updateHookTypesDev();
14694				return updateWorkInProgressHook().memoizedState;
14695			},
14696			useState: function() {
14697				currentHookNameInDev = "useState";
14698				updateHookTypesDev();
14699				var prevDispatcher = ReactSharedInternals.H;
14700				ReactSharedInternals.H = InvalidNestedHooksDispatcherOnRerenderInDEV;
14701				try {
14702					return rerenderReducer(basicStateReducer);
14703				} finally {
14704					ReactSharedInternals.H = prevDispatcher;
14705				}
14706			},
14707			useDebugValue: function() {
14708				currentHookNameInDev = "useDebugValue";
14709				updateHookTypesDev();
14710			},
14711			useDeferredValue: function(value, initialValue) {
14712				currentHookNameInDev = "useDeferredValue";
14713				updateHookTypesDev();
14714				return rerenderDeferredValue(value, initialValue);
14715			},
14716			useTransition: function() {
14717				currentHookNameInDev = "useTransition";
14718				updateHookTypesDev();
14719				return rerenderTransition();
14720			},
14721			useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) {
14722				currentHookNameInDev = "useSyncExternalStore";
14723				updateHookTypesDev();
14724				return updateSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
14725			},
14726			useId: function() {
14727				currentHookNameInDev = "useId";
14728				updateHookTypesDev();
14729				return updateWorkInProgressHook().memoizedState;
14730			},
14731			useFormState: function(action) {
14732				currentHookNameInDev = "useFormState";
14733				updateHookTypesDev();
14734				warnOnUseFormStateInDev();
14735				return rerenderActionState(action);
14736			},
14737			useActionState: function(action) {
14738				currentHookNameInDev = "useActionState";
14739				updateHookTypesDev();
14740				return rerenderActionState(action);
14741			},
14742			useOptimistic: function(passthrough, reducer) {
14743				currentHookNameInDev = "useOptimistic";
14744				updateHookTypesDev();
14745				return rerenderOptimistic(passthrough, reducer);
14746			},
14747			useHostTransitionStatus,
14748			useMemoCache,
14749			useCacheRefresh: function() {
14750				currentHookNameInDev = "useCacheRefresh";
14751				updateHookTypesDev();
14752				return updateWorkInProgressHook().memoizedState;
14753			},
14754			useEffectEvent: function(callback) {
14755				currentHookNameInDev = "useEffectEvent";
14756				updateHookTypesDev();
14757				return updateEvent(callback);
14758			}
14759		};
14760		InvalidNestedHooksDispatcherOnMountInDEV = {
14761			readContext: function(context) {
14762				warnInvalidContextAccess();
14763				return readContext(context);
14764			},
14765			use: function(usable) {
14766				warnInvalidHookAccess();
14767				return use(usable);
14768			},
14769			useCallback: function(callback, deps) {
14770				currentHookNameInDev = "useCallback";
14771				warnInvalidHookAccess();
14772				mountHookTypesDev();
14773				return mountCallback(callback, deps);
14774			},
14775			useContext: function(context) {
14776				currentHookNameInDev = "useContext";
14777				warnInvalidHookAccess();
14778				mountHookTypesDev();
14779				return readContext(context);
14780			},
14781			useEffect: function(create, deps) {
14782				currentHookNameInDev = "useEffect";
14783				warnInvalidHookAccess();
14784				mountHookTypesDev();
14785				return mountEffect(create, deps);
14786			},
14787			useImperativeHandle: function(ref, create, deps) {
14788				currentHookNameInDev = "useImperativeHandle";
14789				warnInvalidHookAccess();
14790				mountHookTypesDev();
14791				return mountImperativeHandle(ref, create, deps);
14792			},
14793			useInsertionEffect: function(create, deps) {
14794				currentHookNameInDev = "useInsertionEffect";
14795				warnInvalidHookAccess();
14796				mountHookTypesDev();
14797				mountEffectImpl(4, Insertion, create, deps);
14798			},
14799			useLayoutEffect: function(create, deps) {
14800				currentHookNameInDev = "useLayoutEffect";
14801				warnInvalidHookAccess();
14802				mountHookTypesDev();
14803				return mountLayoutEffect(create, deps);
14804			},
14805			useMemo: function(create, deps) {
14806				currentHookNameInDev = "useMemo";
14807				warnInvalidHookAccess();
14808				mountHookTypesDev();
14809				var prevDispatcher = ReactSharedInternals.H;
14810				ReactSharedInternals.H = InvalidNestedHooksDispatcherOnMountInDEV;
14811				try {
14812					return mountMemo(create, deps);
14813				} finally {
14814					ReactSharedInternals.H = prevDispatcher;
14815				}
14816			},
14817			useReducer: function(reducer, initialArg, init) {
14818				currentHookNameInDev = "useReducer";
14819				warnInvalidHookAccess();
14820				mountHookTypesDev();
14821				var prevDispatcher = ReactSharedInternals.H;
14822				ReactSharedInternals.H = InvalidNestedHooksDispatcherOnMountInDEV;
14823				try {
14824					return mountReducer(reducer, initialArg, init);
14825				} finally {
14826					ReactSharedInternals.H = prevDispatcher;
14827				}
14828			},
14829			useRef: function(initialValue) {
14830				currentHookNameInDev = "useRef";
14831				warnInvalidHookAccess();
14832				mountHookTypesDev();
14833				return mountRef(initialValue);
14834			},
14835			useState: function(initialState) {
14836				currentHookNameInDev = "useState";
14837				warnInvalidHookAccess();
14838				mountHookTypesDev();
14839				var prevDispatcher = ReactSharedInternals.H;
14840				ReactSharedInternals.H = InvalidNestedHooksDispatcherOnMountInDEV;
14841				try {
14842					return mountState(initialState);
14843				} finally {
14844					ReactSharedInternals.H = prevDispatcher;
14845				}
14846			},
14847			useDebugValue: function() {
14848				currentHookNameInDev = "useDebugValue";
14849				warnInvalidHookAccess();
14850				mountHookTypesDev();
14851			},
14852			useDeferredValue: function(value, initialValue) {
14853				currentHookNameInDev = "useDeferredValue";
14854				warnInvalidHookAccess();
14855				mountHookTypesDev();
14856				return mountDeferredValue(value, initialValue);
14857			},
14858			useTransition: function() {
14859				currentHookNameInDev = "useTransition";
14860				warnInvalidHookAccess();
14861				mountHookTypesDev();
14862				return mountTransition();
14863			},
14864			useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) {
14865				currentHookNameInDev = "useSyncExternalStore";
14866				warnInvalidHookAccess();
14867				mountHookTypesDev();
14868				return mountSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
14869			},
14870			useId: function() {
14871				currentHookNameInDev = "useId";
14872				warnInvalidHookAccess();
14873				mountHookTypesDev();
14874				return mountId();
14875			},
14876			useFormState: function(action, initialState) {
14877				currentHookNameInDev = "useFormState";
14878				warnInvalidHookAccess();
14879				mountHookTypesDev();
14880				return mountActionState(action, initialState);
14881			},
14882			useActionState: function(action, initialState) {
14883				currentHookNameInDev = "useActionState";
14884				warnInvalidHookAccess();
14885				mountHookTypesDev();
14886				return mountActionState(action, initialState);
14887			},
14888			useOptimistic: function(passthrough) {
14889				currentHookNameInDev = "useOptimistic";
14890				warnInvalidHookAccess();
14891				mountHookTypesDev();
14892				return mountOptimistic(passthrough);
14893			},
14894			useMemoCache: function(size) {
14895				warnInvalidHookAccess();
14896				return useMemoCache(size);
14897			},
14898			useHostTransitionStatus,
14899			useCacheRefresh: function() {
14900				currentHookNameInDev = "useCacheRefresh";
14901				mountHookTypesDev();
14902				return mountRefresh();
14903			},
14904			useEffectEvent: function(callback) {
14905				currentHookNameInDev = "useEffectEvent";
14906				warnInvalidHookAccess();
14907				mountHookTypesDev();
14908				return mountEvent(callback);
14909			}
14910		};
14911		InvalidNestedHooksDispatcherOnUpdateInDEV = {
14912			readContext: function(context) {
14913				warnInvalidContextAccess();
14914				return readContext(context);
14915			},
14916			use: function(usable) {
14917				warnInvalidHookAccess();
14918				return use(usable);
14919			},
14920			useCallback: function(callback, deps) {
14921				currentHookNameInDev = "useCallback";
14922				warnInvalidHookAccess();
14923				updateHookTypesDev();
14924				return updateCallback(callback, deps);
14925			},
14926			useContext: function(context) {
14927				currentHookNameInDev = "useContext";
14928				warnInvalidHookAccess();
14929				updateHookTypesDev();
14930				return readContext(context);
14931			},
14932			useEffect: function(create, deps) {
14933				currentHookNameInDev = "useEffect";
14934				warnInvalidHookAccess();
14935				updateHookTypesDev();
14936				updateEffectImpl(2048, Passive, create, deps);
14937			},
14938			useImperativeHandle: function(ref, create, deps) {
14939				currentHookNameInDev = "useImperativeHandle";
14940				warnInvalidHookAccess();
14941				updateHookTypesDev();
14942				return updateImperativeHandle(ref, create, deps);
14943			},
14944			useInsertionEffect: function(create, deps) {
14945				currentHookNameInDev = "useInsertionEffect";
14946				warnInvalidHookAccess();
14947				updateHookTypesDev();
14948				return updateEffectImpl(4, Insertion, create, deps);
14949			},
14950			useLayoutEffect: function(create, deps) {
14951				currentHookNameInDev = "useLayoutEffect";
14952				warnInvalidHookAccess();
14953				updateHookTypesDev();
14954				return updateEffectImpl(4, Layout, create, deps);
14955			},
14956			useMemo: function(create, deps) {
14957				currentHookNameInDev = "useMemo";
14958				warnInvalidHookAccess();
14959				updateHookTypesDev();
14960				var prevDispatcher = ReactSharedInternals.H;
14961				ReactSharedInternals.H = InvalidNestedHooksDispatcherOnUpdateInDEV;
14962				try {
14963					return updateMemo(create, deps);
14964				} finally {
14965					ReactSharedInternals.H = prevDispatcher;
14966				}
14967			},
14968			useReducer: function(reducer, initialArg, init) {
14969				currentHookNameInDev = "useReducer";
14970				warnInvalidHookAccess();
14971				updateHookTypesDev();
14972				var prevDispatcher = ReactSharedInternals.H;
14973				ReactSharedInternals.H = InvalidNestedHooksDispatcherOnUpdateInDEV;
14974				try {
14975					return updateReducer(reducer, initialArg, init);
14976				} finally {
14977					ReactSharedInternals.H = prevDispatcher;
14978				}
14979			},
14980			useRef: function() {
14981				currentHookNameInDev = "useRef";
14982				warnInvalidHookAccess();
14983				updateHookTypesDev();
14984				return updateWorkInProgressHook().memoizedState;
14985			},
14986			useState: function() {
14987				currentHookNameInDev = "useState";
14988				warnInvalidHookAccess();
14989				updateHookTypesDev();
14990				var prevDispatcher = ReactSharedInternals.H;
14991				ReactSharedInternals.H = InvalidNestedHooksDispatcherOnUpdateInDEV;
14992				try {
14993					return updateReducer(basicStateReducer);
14994				} finally {
14995					ReactSharedInternals.H = prevDispatcher;
14996				}
14997			},
14998			useDebugValue: function() {
14999				currentHookNameInDev = "useDebugValue";
15000				warnInvalidHookAccess();
15001				updateHookTypesDev();
15002			},
15003			useDeferredValue: function(value, initialValue) {
15004				currentHookNameInDev = "useDeferredValue";
15005				warnInvalidHookAccess();
15006				updateHookTypesDev();
15007				return updateDeferredValue(value, initialValue);
15008			},
15009			useTransition: function() {
15010				currentHookNameInDev = "useTransition";
15011				warnInvalidHookAccess();
15012				updateHookTypesDev();
15013				return updateTransition();
15014			},
15015			useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) {
15016				currentHookNameInDev = "useSyncExternalStore";
15017				warnInvalidHookAccess();
15018				updateHookTypesDev();
15019				return updateSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
15020			},
15021			useId: function() {
15022				currentHookNameInDev = "useId";
15023				warnInvalidHookAccess();
15024				updateHookTypesDev();
15025				return updateWorkInProgressHook().memoizedState;
15026			},
15027			useFormState: function(action) {
15028				currentHookNameInDev = "useFormState";
15029				warnInvalidHookAccess();
15030				updateHookTypesDev();
15031				return updateActionState(action);
15032			},
15033			useActionState: function(action) {
15034				currentHookNameInDev = "useActionState";
15035				warnInvalidHookAccess();
15036				updateHookTypesDev();
15037				return updateActionState(action);
15038			},
15039			useOptimistic: function(passthrough, reducer) {
15040				currentHookNameInDev = "useOptimistic";
15041				warnInvalidHookAccess();
15042				updateHookTypesDev();
15043				return updateOptimistic(passthrough, reducer);
15044			},
15045			useMemoCache: function(size) {
15046				warnInvalidHookAccess();
15047				return useMemoCache(size);
15048			},
15049			useHostTransitionStatus,
15050			useCacheRefresh: function() {
15051				currentHookNameInDev = "useCacheRefresh";
15052				updateHookTypesDev();
15053				return updateWorkInProgressHook().memoizedState;
15054			},
15055			useEffectEvent: function(callback) {
15056				currentHookNameInDev = "useEffectEvent";
15057				warnInvalidHookAccess();
15058				updateHookTypesDev();
15059				return updateEvent(callback);
15060			}
15061		};
15062		InvalidNestedHooksDispatcherOnRerenderInDEV = {
15063			readContext: function(context) {
15064				warnInvalidContextAccess();
15065				return readContext(context);
15066			},
15067			use: function(usable) {
15068				warnInvalidHookAccess();
15069				return use(usable);
15070			},
15071			useCallback: function(callback, deps) {
15072				currentHookNameInDev = "useCallback";
15073				warnInvalidHookAccess();
15074				updateHookTypesDev();
15075				return updateCallback(callback, deps);
15076			},
15077			useContext: function(context) {
15078				currentHookNameInDev = "useContext";
15079				warnInvalidHookAccess();
15080				updateHookTypesDev();
15081				return readContext(context);
15082			},
15083			useEffect: function(create, deps) {
15084				currentHookNameInDev = "useEffect";
15085				warnInvalidHookAccess();
15086				updateHookTypesDev();
15087				updateEffectImpl(2048, Passive, create, deps);
15088			},
15089			useImperativeHandle: function(ref, create, deps) {
15090				currentHookNameInDev = "useImperativeHandle";
15091				warnInvalidHookAccess();
15092				updateHookTypesDev();
15093				return updateImperativeHandle(ref, create, deps);
15094			},
15095			useInsertionEffect: function(create, deps) {
15096				currentHookNameInDev = "useInsertionEffect";
15097				warnInvalidHookAccess();
15098				updateHookTypesDev();
15099				return updateEffectImpl(4, Insertion, create, deps);
15100			},
15101			useLayoutEffect: function(create, deps) {
15102				currentHookNameInDev = "useLayoutEffect";
15103				warnInvalidHookAccess();
15104				updateHookTypesDev();
15105				return updateEffectImpl(4, Layout, create, deps);
15106			},
15107			useMemo: function(create, deps) {
15108				currentHookNameInDev = "useMemo";
15109				warnInvalidHookAccess();
15110				updateHookTypesDev();
15111				var prevDispatcher = ReactSharedInternals.H;
15112				ReactSharedInternals.H = InvalidNestedHooksDispatcherOnUpdateInDEV;
15113				try {
15114					return updateMemo(create, deps);
15115				} finally {
15116					ReactSharedInternals.H = prevDispatcher;
15117				}
15118			},
15119			useReducer: function(reducer, initialArg, init) {
15120				currentHookNameInDev = "useReducer";
15121				warnInvalidHookAccess();
15122				updateHookTypesDev();
15123				var prevDispatcher = ReactSharedInternals.H;
15124				ReactSharedInternals.H = InvalidNestedHooksDispatcherOnUpdateInDEV;
15125				try {
15126					return rerenderReducer(reducer, initialArg, init);
15127				} finally {
15128					ReactSharedInternals.H = prevDispatcher;
15129				}
15130			},
15131			useRef: function() {
15132				currentHookNameInDev = "useRef";
15133				warnInvalidHookAccess();
15134				updateHookTypesDev();
15135				return updateWorkInProgressHook().memoizedState;
15136			},
15137			useState: function() {
15138				currentHookNameInDev = "useState";
15139				warnInvalidHookAccess();
15140				updateHookTypesDev();
15141				var prevDispatcher = ReactSharedInternals.H;
15142				ReactSharedInternals.H = InvalidNestedHooksDispatcherOnUpdateInDEV;
15143				try {
15144					return rerenderReducer(basicStateReducer);
15145				} finally {
15146					ReactSharedInternals.H = prevDispatcher;
15147				}
15148			},
15149			useDebugValue: function() {
15150				currentHookNameInDev = "useDebugValue";
15151				warnInvalidHookAccess();
15152				updateHookTypesDev();
15153			},
15154			useDeferredValue: function(value, initialValue) {
15155				currentHookNameInDev = "useDeferredValue";
15156				warnInvalidHookAccess();
15157				updateHookTypesDev();
15158				return rerenderDeferredValue(value, initialValue);
15159			},
15160			useTransition: function() {
15161				currentHookNameInDev = "useTransition";
15162				warnInvalidHookAccess();
15163				updateHookTypesDev();
15164				return rerenderTransition();
15165			},
15166			useSyncExternalStore: function(subscribe, getSnapshot, getServerSnapshot) {
15167				currentHookNameInDev = "useSyncExternalStore";
15168				warnInvalidHookAccess();
15169				updateHookTypesDev();
15170				return updateSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
15171			},
15172			useId: function() {
15173				currentHookNameInDev = "useId";
15174				warnInvalidHookAccess();
15175				updateHookTypesDev();
15176				return updateWorkInProgressHook().memoizedState;
15177			},
15178			useFormState: function(action) {
15179				currentHookNameInDev = "useFormState";
15180				warnInvalidHookAccess();
15181				updateHookTypesDev();
15182				return rerenderActionState(action);
15183			},
15184			useActionState: function(action) {
15185				currentHookNameInDev = "useActionState";
15186				warnInvalidHookAccess();
15187				updateHookTypesDev();
15188				return rerenderActionState(action);
15189			},
15190			useOptimistic: function(passthrough, reducer) {
15191				currentHookNameInDev = "useOptimistic";
15192				warnInvalidHookAccess();
15193				updateHookTypesDev();
15194				return rerenderOptimistic(passthrough, reducer);
15195			},
15196			useMemoCache: function(size) {
15197				warnInvalidHookAccess();
15198				return useMemoCache(size);
15199			},
15200			useHostTransitionStatus,
15201			useCacheRefresh: function() {
15202				currentHookNameInDev = "useCacheRefresh";
15203				updateHookTypesDev();
15204				return updateWorkInProgressHook().memoizedState;
15205			},
15206			useEffectEvent: function(callback) {
15207				currentHookNameInDev = "useEffectEvent";
15208				warnInvalidHookAccess();
15209				updateHookTypesDev();
15210				return updateEvent(callback);
15211			}
15212		};
15213		var fakeInternalInstance = {};
15214		var didWarnAboutStateAssignmentForComponent = /* @__PURE__ */ new Set();
15215		var didWarnAboutUninitializedState = /* @__PURE__ */ new Set();
15216		var didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate = /* @__PURE__ */ new Set();
15217		var didWarnAboutLegacyLifecyclesAndDerivedState = /* @__PURE__ */ new Set();
15218		var didWarnAboutDirectlyAssigningPropsToState = /* @__PURE__ */ new Set();
15219		var didWarnAboutUndefinedDerivedState = /* @__PURE__ */ new Set();
15220		var didWarnAboutContextTypes$1 = /* @__PURE__ */ new Set();
15221		var didWarnAboutChildContextTypes = /* @__PURE__ */ new Set();
15222		var didWarnAboutInvalidateContextType = /* @__PURE__ */ new Set();
15223		var didWarnOnInvalidCallback = /* @__PURE__ */ new Set();
15224		Object.freeze(fakeInternalInstance);
15225		var classComponentUpdater = {
15226			enqueueSetState: function(inst, payload, callback) {
15227				inst = inst._reactInternals;
15228				var lane = requestUpdateLane(inst), update = createUpdate(lane);
15229				update.payload = payload;
15230				void 0 !== callback && null !== callback && (warnOnInvalidCallback(callback), update.callback = callback);
15231				payload = enqueueUpdate(inst, update, lane);
15232				null !== payload && (startUpdateTimerByLane(lane, "this.setState()", inst), scheduleUpdateOnFiber(payload, inst, lane), entangleTransitions(payload, inst, lane));
15233			},
15234			enqueueReplaceState: function(inst, payload, callback) {
15235				inst = inst._reactInternals;
15236				var lane = requestUpdateLane(inst), update = createUpdate(lane);
15237				update.tag = ReplaceState;
15238				update.payload = payload;
15239				void 0 !== callback && null !== callback && (warnOnInvalidCallback(callback), update.callback = callback);
15240				payload = enqueueUpdate(inst, update, lane);
15241				null !== payload && (startUpdateTimerByLane(lane, "this.replaceState()", inst), scheduleUpdateOnFiber(payload, inst, lane), entangleTransitions(payload, inst, lane));
15242			},
15243			enqueueForceUpdate: function(inst, callback) {
15244				inst = inst._reactInternals;
15245				var lane = requestUpdateLane(inst), update = createUpdate(lane);
15246				update.tag = ForceUpdate;
15247				void 0 !== callback && null !== callback && (warnOnInvalidCallback(callback), update.callback = callback);
15248				callback = enqueueUpdate(inst, update, lane);
15249				null !== callback && (startUpdateTimerByLane(lane, "this.forceUpdate()", inst), scheduleUpdateOnFiber(callback, inst, lane), entangleTransitions(callback, inst, lane));
15250			}
15251		}, componentName = null, errorBoundaryName = null, SelectiveHydrationException = Error("This is not a real error. It's an implementation detail of React's selective hydration feature. If this leaks into userspace, it's a bug in React. Please file an issue."), didReceiveUpdate = !1;
15252		var didWarnAboutBadClass = {};
15253		var didWarnAboutContextTypeOnFunctionComponent = {};
15254		var didWarnAboutContextTypes = {};
15255		var didWarnAboutGetDerivedStateOnFunctionComponent = {};
15256		var didWarnAboutReassigningProps = !1;
15257		var didWarnAboutRevealOrder = {};
15258		var didWarnAboutTailOptions = {};
15259		var didWarnAboutClassNameOnViewTransition = {};
15260		var SUSPENDED_MARKER = {
15261			dehydrated: null,
15262			treeContext: null,
15263			retryLane: 0,
15264			hydrationErrors: null
15265		}, hasWarnedAboutUsingNoValuePropOnContextProvider = !1, didWarnAboutUndefinedSnapshotBeforeUpdate = null;
15266		didWarnAboutUndefinedSnapshotBeforeUpdate = /* @__PURE__ */ new Set();
15267		var shouldStartViewTransition = !1, appearingViewTransitions = null, viewTransitionCancelableChildren = null, viewTransitionHostInstanceIdx = 0, mountedNamedViewTransitions = /* @__PURE__ */ new Map(), didWarnAboutName = {}, NoLayoutEffectTraversalFlags = 0, IncludeWorkInProgressEffects = 1, IncludeHostSingletons = 2, offscreenSubtreeIsHidden = !1, offscreenSubtreeWasHidden = !1, offscreenDirectParentIsHidden = !1, needsFormReset = !1, PossiblyWeakSet = "function" === typeof WeakSet ? WeakSet : Set, nextEffect = null, inProgressLanes = null, inProgressRoot = null, viewTransitionContextChanged = !1, inUpdateViewTransition = !1, rootViewTransitionAffected = !1, rootViewTransitionNameCanceled = !1, hostParent = null, hostParentIsContainer = !1, currentHoistableRoot = null, inHydratedSubtree = !1, suspenseyCommitFlag = 8192, DefaultAsyncDispatcher = {
15268			getCacheForType: function(resourceType) {
15269				var cache = readContext(CacheContext), cacheForType = cache.data.get(resourceType);
15270				void 0 === cacheForType && (cacheForType = resourceType(), cache.data.set(resourceType, cacheForType));
15271				return cacheForType;
15272			},
15273			cacheSignal: function() {
15274				return readContext(CacheContext).controller.signal;
15275			},
15276			getOwner: function() {
15277				return current;
15278			}
15279		};
15280		if ("function" === typeof Symbol && Symbol.for) {
15281			var symbolFor = Symbol.for;
15282			symbolFor("selector.component");
15283			symbolFor("selector.has_pseudo_class");
15284			symbolFor("selector.role");
15285			symbolFor("selector.test_id");
15286			symbolFor("selector.text");
15287		}
15288		var commitHooks = [], PossiblyWeakMap = "function" === typeof WeakMap ? WeakMap : Map, NoContext = 0, RenderContext = 2, CommitContext = 4, RootInProgress = 0, RootFatal
vendor: 3,338 bytes, lines 15288-15298
15288Errored = 1, RootErrored = 2, RootSuspended = 3, RootSuspendedWithDelay = 4, RootSuspendedAtTheShell = 6, RootCompleted = 5, executionContext = NoContext, workInProgressRoot = null, workInProgress = null, workInProgressRootRenderLanes = 0, NotSuspended = 0, SuspendedOnError = 1, SuspendedOnData = 2, SuspendedOnImmediate = 3, SuspendedOnInstance = 4, SuspendedOnInstanceAndReadyToContinue = 5, SuspendedOnDeprecatedThrowPromise = 6, SuspendedAndReadyToContinue = 7, SuspendedOnHydration = 8, SuspendedOnAction = 9, workInProgressSuspendedReason = NotSuspended, workInProgressThrownValue = null, workInProgressRootDidSkipSuspendedSiblings = !1, workInProgressRootIsPrerendering = !1, workInProgressRootDidAttachPingListener = !1, entangledRenderLanes = 0, workInProgressRootExitStatus = RootInProgress, workInProgressRootSkippedLanes = 0, workInProgressRootInterleavedUpdatedLanes = 0, workInProgressRootPingedLanes = 0, workInProgressDeferredLane = 0, workInProgressSuspendedRetryLanes = 0, workInProgressRootConcurrentErrors = null, workInProgressRootRecoverableErrors = null, workInProgressRootDidIncludeRecursiveRenderUpdate = !1, globalMostRecentFallbackTime = 0, globalMostRecentTransitionTime = 0, FALLBACK_THROTTLE_MS = 300, workInProgressRootRenderTargetTime = Infinity, RENDER_TIMEOUT_MS = 500, workInProgressTransitions = null, workInProgressUpdateTask = null, legacyErrorBoundariesThatAlreadyFailed = null, IMMEDIATE_COMMIT = 0, ABORTED_VIEW_TRANSITION_COMMIT = 1, DELAYED_PASSIVE_COMMIT = 2, ANIMATION_STARTED_COMMIT = 3, NO_PENDING_EFFECTS = 0, PENDING_MUTATION_PHASE = 1, PENDING_LAYOUT_PHASE = 2, PENDING_AFTER_MUTATION_PHASE = 3, PENDING_SPAWNED_WORK = 4, PENDING_PASSIVE_PHASE = 5, pendingEffectsStatus = 0, pendingEffectsRoot = null, pendingFinishedWork = null, pendingEffectsLanes = 0, pendingEffectsRemainingLanes = 0, pendingEffectsRenderEndTime = -0, pendingPassiveTransitions = null, pendingRecoverableErrors = null, pendingViewTransition = null, pendingViewTransitionEvents = null, pendingTransitionTypes = null, pendingSuspendedCommitReason = null, pendingDelayedCommitReason = IMMEDIATE_COMMIT, pendingSuspendedViewTransitionReason = null, NESTED_UPDATE_LIMIT = 50, nestedUpdateCount = 0, rootWithNestedUpdates = null, isFlushingPassiveEffects = !1, didScheduleUpdateDuringPassiveEffects = !1, NESTED_PASSIVE_UPDATE_LIMIT = 50, nestedPassiveUpdateCount = 0, rootWithPassiveNestedUpdates = null, isRunningInsertionEffect = !1, didWarnAboutInterruptedViewTransitions = !1, didWarnStateUpdateForNotYetMountedComponent = null, didWarnAboutUpdateInRender = !1;
15289		var didWarnAboutUpdateInRenderForAnotherComponent = /* @__PURE__ */ new Set();
15290		var fakeActCallbackNode$1 = {}, firstScheduledRoot = null, lastScheduledRoot = null, didScheduleMicrotask = !1, didScheduleMicrotask_act = !1, mightHavePendingSyncWork = !1, isFlushingWork = !1, currentEventTransitionLane = 0, fakeActCallbackNode = {};
15291		(function() {
15292			for (var i = 0; i < simpleEventPluginEvents.length; i++) {
15293				var eventName = simpleEventPluginEvents[i], domEventName = eventName.toLowerCase();
15294				eventName = eventName[0].toUpperCase() + eventName.slice(1);
15295				registerSimpleEvent(domEventName, "on" + eventName);
15296			}
15297			registerSimpleEvent(ANIMATION_END, "onAnimationEnd");
15298			registerSimpleEvent(ANIMATION_ITERATION, "onAnimationIteration");
15299			registerSimpleEvent(ANIMATION_START, "onAnimationStart");
15300			registerSimpleEvent("dblclick", "onDoubleClick");
15301			registerSimpleEvent("focusin", "onFocus");
15302			registerSimpleEvent("focusout", "onBlur");
15303			registerSimpleEvent(TRANSITION_RUN, "onTransitionRun");
15304			registerSimpleEvent(TRANSITION_START, "onTransitionStart");
15305			registerSimpleEvent(TRANSITION_CANCEL, "onTransitionCancel");
15306			registerSimpleEvent(TRANSITION_END, "onTransitionEnd");
15307		})();
15308		registerDirectEvent("onMouseEnter", ["mouseout", "mouseover"]);
15309		registerDirectEvent("onMouseLeave", ["mouseout", "mouseover"]);
15310		registerDirectEvent("onPointerEnter", ["pointerout", "pointerover"]);
15311		registerDirectEvent("onPointerLeave", ["pointerout", "pointerover"]);
15312		registerTwoPhaseEvent("onChange", "change click focusin focusout input keydown keyup selectionchange".split(" "));
15313		registerTwoPhaseEvent("onSelect", "focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" "));
15314		registerTwoPhaseEvent("onBeforeInput", [
15315			"compositionend",
15316			"keypress",
15317			"textInput",
15318			"paste"
15319		]);
15320		registerTwoPhaseEvent("onCompositionEnd", "compositionend focusout keydown keypress keyup mousedown".split(" "));
15321		registerTwoPhaseEvent("onCompositionStart", "compositionstart focusout keydown keypress keyup mousedown".split(" "));
15322		registerTwoPhaseEvent("onCompositionUpdate", "compositionupdate focusout keydown keypress keyup mousedown".split(" "));
15323		var mediaEventTypes = "abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "), nonDelegatedEvents = new Set("beforetoggle cancel close invalid load scroll scrollend toggle".split(" ").concat(mediaEventTypes)), listeningMarker = "_reactListening" + Math.random().toString(36).slice(2), didWarnControlledToUncontrolled = !1, didWarnUncontrolledToControlled = !1, didWarnFormActionType = !1, didWarnFormActionName = !1, didWarnFormActionTarget = !1, didWarnFormActionMethod = !1, didWarnPopoverTargetObject = !1;
15324		var didWarnForNewBooleanPropsWithEmptyValue = {};
15325		var NORMALIZE_NEWLINES_REGEX = /\r\n?/g, NORMALIZE_NULL_AND_REPLACEMENT_REGEX = /\u0000|\uFFFD/g, xlinkNamespace = "http://www.w3.org/1999/xlink", xmlNamespace = "http://www.w3.org/XML/1998/namespace", emptyProps = {}, EXPECTED_FORM_ACTION_URL = "javascript:throw new Error('React form unexpectedly submitted.')", SUPPRESS_HYDRATION_WARNING = "suppressHydrationWarning", ACTIVITY_START_DATA = "&", ACTIVITY_END_DATA = "/&", SUSPENSE_START_DATA = "$", SUSPENSE_END_DATA = "/$", SUSPENSE_PENDING_START_DATA = "$?", SUSPENSE_QUEUED_START_DATA = "$~", SUSPENSE_FALLBACK_START_DATA = "$!", PREAMBLE_CONTRIBUTION_HTML = "html", PREAMBLE_CONTRIBUTION_BODY = "body", PREAMBLE_CONTRIBUTION_HEAD = "head", FORM_STATE_IS_MATCHING = "F!", FORM_STATE_IS_NOT_MATCHING = "F", DOCUMENT_READY_STATE_LOADING = "loading", STYLE = "style", HostContextNamespaceNone = 0, HostContextNamespaceSvg = 1, HostContextNamespaceMath = 2, eventsEnabled = null, selectionInformation = null, didWarnScriptTags = !1, warnedUnknownTags = {
15326			dialog: !0,
15327			webview: !0
15328		}, currentPopstateTransitionEvent = null, schedulerEvent = void 0, scheduleTimeout = "function" === typeof setTimeout ? setTimeout : void 0, cancelTimeout = "function" === typeof clearTimeout ? clearTimeout : void 0, noTimeout = -1, localPromise = "function" === typeof Promise ? Promise : void 0, localRequestAnimationFrame = "function" === typeof requestAnimationFrame ? requestAnimationFrame : scheduleTimeout, scheduleMicrotask = "function" === typeof queueMicrotask ? queueMicrotask : "undefined" !== typeof localPromise ? function(callback) {
15329			return localPromise.resolve(null).then(callback).catch(handleErrorInNextTick);
15330		} : scheduleTimeout, SUSPENSEY_FONT_AND_IMAGE_TIMEOUT = 500;
15331		ViewTransitionPseudoElement.prototype.animate = function(keyframes, options) {
15332			options = "number" === typeof options ? { duration: options } : assign({}, options);
15333			options.pseudoElement = this._selector;
15334			return this._scope.animate(keyframes, options);
15335		};
15336		ViewTransitionPseudoElement.prototype.getAnimations = function() {
15337			for (var scope = this._scope, selector = this._selector, animations = scope.getAnimations({ subtree: !0 }), result = [], i = 0; i < animations.length; i++) {
15338				var effect = animations[i].effect;
15339				null !== effect && effect.target === scope && effect.pseudoElement === selector && result.push(animations[i]);
15340			}
15341			return result;
15342		};
15343		ViewTransitionPseudoElement.prototype.getComputedStyle = function() {
15344			return getComputedStyle(this._scope, this._selector);
15345		};
15346		FragmentInstance.prototype.addEventListener = function(type, listener, optionsOrUseCapture) {
15347			var signal = null, cleanup = null;
15348			if (null != optionsOrUseCapture && "boolean" !== typeof optionsOrUseCapture && (signal = optionsOrUseCapture.signal || null, null !== signal && signal.aborted)) return;
15349			null === this._eventListeners && (this._eventListeners = []);
15350			var listeners = this._eventListeners;
15351			if (-1 === indexOfEventListener(listeners, type, listener, optionsOrUseCapture)) {
15352				var fragmentInstance = this, attachedListener = listener;
15353				null != optionsOrUseCapture && "boolean" !== typeof optionsOrUseCapture && !0 === optionsOrUseCapture.once && (attachedListener = function(event) {
15354					fragmentInstance.removeEventListener(type, listener, optionsOrUseCapture);
15355					"function" === typeof listener ? listener.call(this, event) : listener.handleEvent(event);
15356				});
15357				null !== signal && (cleanup = fragmentInstance.removeEventListener.bind(fragmentInstance, type, listener, optionsOrUseCapture), signal.addEventListener("abort", cleanup, { once: !0 }), cleanup = signal.removeEventListener.bind(signal, "abort", cleanup));
15358				signal = getAttachOptions(optionsOrUseCapture);
15359				listeners.push({
15360					type,
15361					listener,
15362					optionsOrUseCapture,
15363					attachedListener,
15364					cleanup
15365				});
15366				traverseFragmentInstancesAndTextInstances(this._fragmentFiber, addEventListenerToChild, type, attachedListener, signal);
15367			}
15368			this._eventListeners = listeners;
15369		};
15370		FragmentInstance.prototype.removeEventListener = function(type, listener, optionsOrUseCapture) {
15371			var listeners = this._eventListeners;
15372			if (null !== listeners && (listener = indexOfEventListener(listeners, type, listener, optionsOrUseCapture), -1 !== listener)) {
15373				var _listeners$index = listeners[listener];
15374				optionsOrUseCapture = _listeners$index.attachedListener;
15375				var cleanup = _listeners$index.cleanup;
15376				_listeners$index = getAttachOptions(_listeners$index.optionsOrUseCapture);
15377				traverseFragmentInstancesAndTextInstances(this._fragmentFiber, removeEventListenerFromChild, type, optionsOrUseCapture, _listeners$index);
15378				listeners.splice(listener, 1);
15379				null !== cleanup && cleanup();
15380			}
15381		};
15382		FragmentInstance.prototype.dispatchEvent = function(event) {
15383			var parentHostFiber = getFragmentParentInstanceOrContainerFiber(this._fragmentFiber);
15384			if (null === parentHostFiber) return !0;
15385			parentHostFiber = getInstanceFromHostFiber(parentHostFiber);
15386			var eventListeners = this._eventListeners;
15387			if (null !== eventListeners && 0 < eventListeners.length || !event.bubbles) {
15388				var temp = 9 === parentHostFiber.nodeType ? parentHostFiber.createComment("") : document.createTextNode("");
15389				if (eventListeners) for (var i = 0; i < eventListeners.length; i++) {
15390					var _eventListeners$i = eventListeners[i];
15391					temp.addEventListener(_eventListeners$i.type, _eventListeners$i.attachedListener, getAttachOptions(_eventListeners$i.optionsOrUseCapture));
15392				}
15393				parentHostFiber.appendChild(temp);
15394				event = temp.dispatchEvent(event);
15395				if (eventListeners) for (i = 0; i < eventListeners.length; i++) _eventListeners$i = eventListeners[i], temp.removeEventListener(_eventListeners$i.type, _eventListeners$i.attachedListener, getAttachOptions(_eventListeners$i.optionsOrUseCapture));
15396				parentHostFiber.removeChild(temp);
15397				return event;
15398			}
15399			return parentHostFiber.dispatchEvent(event);
15400		};
15401		FragmentInstance.prototype.focus = function(focusOptions) {
15402			traverseVisibleInstancesAndTextInstances(this._fragmentFiber.child, !0, setFocusOnFiberIfFocusable, focusOptions, void 0, void 0);
15403		};
15404		FragmentInstance.prototype.focusLast = function(focusOptions) {
15405			var children = [];
15406			traverseVisibleInstancesAndTextInstances(this._fragmentFiber.child, !0, collectChildren, children, void 0, void 0);
15407			for (var i = children.length - 1; 0 <= i && !setFocusOnFiberIfFocusable(children[i], focusOptions); i--);
15408		};
15409		FragmentInstance.prototype.blur = function() {
15410			var parentHostFiber = getFragmentParentInstanceOrContainerFiber(this._fragmentFiber);
15411			null !== parentHostFiber && (parentHostFiber = getInstanceFromHostFiber(parentHostFiber), parentHostFiber = getOwnerDocumentFromRootContainer(parentHostFiber).activeElement, null !== parentHostFiber && traverseFragmentInstancesAndTextInstances(this._fragmentFiber, blurActiveElementWithinFragment, parentHostFiber));
15412		};
15413		FragmentInstance.prototype.observeUsing = function(observer) {
15414			var hasText = !1, hasElement = !1;
15415			traverseFragmentInstancesAndTextInstances(this._fragmentFiber, function(child) {
15416				if (6 === child.tag) hasText = !0;
15417				else return hasElement = !0;
15418				return !1;
15419			});
15420			hasText && !hasElement && console.error("observeUsing() was called on a FragmentInstance with only text children. Observers do not work on text nodes.");
15421			null === this._observers && (this._observers = /* @__PURE__ */ new Set());
15422			this._observers.add(observer);
15423			traverseFragmentInstancesAndTextInstances(this._fragmentFiber, observeChild, observer);
15424		};
15425		FragmentInstance.prototype.unobserveUsing = function(observer) {
15426			var observers = this._observers;
15427			if (null !== observers && observers.has(observer)) {
15428				observers.delete(observer);
15429				traverseFragmentInstancesAndTextInstances(this._fragmentFiber, unobserveChild, observer);
15430				for (var i = observers = 0; i < pendingIntersectionUnobserves.length; i++) {
15431					var pending = pendingIntersectionUnobserves[i];
15432					pending.fragmentInstance === this && pending.observer === observer ? observer.unobserve(pending.instance) : pendingIntersectionUnobserves[observers++] = pending;
15433				}
15434				pendingIntersectionUnobserves.length = observers;
15435			} else console.error("You are calling unobserveUsing() with an observer that is not being observed with this fragment instance. First attach the observer with observeUsing()");
15436		};
15437		var pendingIntersectionUnobserves = [], intersectionUnobserveScheduled = !1;
15438		FragmentInstance.prototype.getClientRects = function() {
15439			var rects = [];
15440			traverseFragmentInstancesAndTextInstances(this._fragmentFiber, collectClientRects, rects);
15441			return rects;
15442		};
15443		FragmentInstance.prototype.getRootNode = function(getRootNodeOptions) {
15444			var parentHostFiber = getFragmentParentInstanceOrContainerFiber(this._fragmentFiber);
15445			return null === parentHostFiber ? this : getInstanceFromHostFiber(parentHostFiber).getRootNode(getRootNodeOptions);
15446		};
15447		FragmentInstance.prototype.compareDocumentPosition = function(otherNode) {
15448			var parentHostFiber = getFragmentParentInstanceOrContainerFiber(this._fragmentFiber);
15449			if (null === parentHostFiber) return Node.DOCUMENT_POSITION_DISCONNECTED;
15450			var children = [];
15451			traverseFragmentInstancesAndTextInstances(this._fragmentFiber, collectChildren, children);
15452			var parentHostInstance = getInstanceFromHostFiber(parentHostFiber);
15453			if (0 === children.length) {
15454				parentHostFiber = parentHostInstance;
15455				if (fiberIsPortaledIntoHost(this._fragmentFiber)) {
15456					a: {
15457						for (children = this._fragmentFiber.return; null !== children;) {
15458							if (4 === children.tag) {
15459								children = children.stateNode.containerInfo;
15460								break a;
15461							}
15462							if (3 === children.tag || 5 === children.tag || 27 === children.tag) break;
15463							children = children.return;
15464						}
15465						children = null;
15466					}
15467					null != children && (parentHostFiber = children);
15468				}
15469				children = this._fragmentFiber;
15470				var result = parentHostInstance = parentHostFiber.compareDocumentPosition(otherNode);
15471				parentHostFiber === otherNode ? result = Node.DOCUMENT_POSITION_CONTAINS : parentHostInstance & Node.DOCUMENT_POSITION_CONTAINED_BY && (children = getFragmentInstanceOrTextInstanceSiblings(children)[1], null === children ? result = Node.DOCUMENT_POSITION_PRECEDING : (otherNode = getInstanceFromHostFiber(children).compareDocumentPosition(otherNode), result = 0 === otherNode || otherNode & Node.DOCUMENT_POSITION_FOLLOWING ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING));
15472				return result |= Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC;
15473			}
15474			parentHostFiber = getInstanceFromHostFiber(children[0]);
15475			result = getInstanceFromHostFiber(children[children.length - 1]);
15476			var parentHostInstanceFromDOM = fiberIsPortaledIntoHost(this._fragmentFiber) ? parentHostFiber.parentElement : parentHostInstance;
15477			if (null == parentHostInstanceFromDOM) return Node.DOCUMENT_POSITION_DISCONNECTED;
15478			parentHostInstance = parentHostInstanceFromDOM.compareDocumentPosition(parentHostFiber) & Node.DOCUMENT_POSITION_CONTAINED_BY;
15479			parentHostInstanceFromDOM = parentHostInstanceFromDOM.compareDocumentPosition(result) & Node.DOCUMENT_POSITION_CONTAINED_BY;
15480			var firstResult = parentHostFiber.compareDocumentPosition(otherNode), lastResult = result.compareDocumentPosition(otherNode), otherNodeIsWithinFirstOrLastChild = firstResult & Node.DOCUMENT_POSITION_CONTAINED_BY || lastResult & Node.DOCUMENT_POSITION_CONTAINED_BY;
15481			lastResult = parentHostInstance && parentHostInstanceFromDOM && firstResult & Node.DOCUMENT_POSITION_FOLLOWING && lastResult & Node.DOCUMENT_POSITION_PRECEDING;
15482			parentHostFiber = parentHostInstance && parentHostFiber === otherNode || parentHostInstanceFromDOM && result === otherNode || otherNodeIsWithinFirstOrLastChild || lastResult ? Node.DOCUMENT_POSITION_CONTAINED_BY : !parentHostInstance && parentHostFiber === otherNode || !parentHostInstanceFromDOM && result === otherNode ? Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC : firstResult;
15483			return parentHostFiber & Node.DOCUMENT_POSITION_DISCONNECTED || parentHostFiber & Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC || validateDocumentPositionWithFiberTree(parentHostFiber, this._fragmentFiber, children[0], children[children.length - 1], otherNode) ? parentHostFiber : Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC;
15484		};
15485		FragmentInstance.prototype.scrollIntoView = function(alignToTo
vendor: 9,192 bytes, lines 15485-15673
15485p) {
15486			if ("object" === typeof alignToTop) throw Error("FragmentInstance.scrollIntoView() does not support scrollIntoViewOptions. Use the alignToTop boolean instead.");
15487			var children = [];
15488			traverseFragmentInstancesAndTextInstances(this._fragmentFiber, collectChildren, children);
15489			var resolvedAlignToTop = !1 !== alignToTop;
15490			if (0 === children.length) {
15491				var hostSiblings = getFragmentInstanceOrTextInstanceSiblings(this._fragmentFiber);
15492				hostSiblings = resolvedAlignToTop ? hostSiblings[1] || hostSiblings[0] || getFragmentParentInstanceOrContainerFiber(this._fragmentFiber) : hostSiblings[0] || hostSiblings[1];
15493				if (null === hostSiblings) return;
15494				if (6 === hostSiblings.tag) {
15495					alignToTop = getInstanceFromHostFiber(hostSiblings);
15496					scrollTextNodeIntoView(alignToTop, resolvedAlignToTop);
15497					return;
15498				}
15499				hostSiblings = getInstanceFromHostFiber(hostSiblings);
15500				if (9 !== hostSiblings.nodeType) {
15501					if (11 === hostSiblings.nodeType) {
15502						resolvedAlignToTop = "host" in hostSiblings ? hostSiblings.host : null;
15503						null !== resolvedAlignToTop ? resolvedAlignToTop.scrollIntoView(alignToTop) : console.warn("You are attempting to scroll a FragmentInstance that is only mounted inside a detached DocumentFragment. No scroll was performed.");
15504						return;
15505					}
15506					hostSiblings.scrollIntoView(alignToTop);
15507				}
15508			}
15509			for (hostSiblings = resolvedAlignToTop ? children.length - 1 : 0; hostSiblings !== (resolvedAlignToTop ? -1 : children.length);) {
15510				var child = children[hostSiblings];
15511				6 === child.tag ? (child = getInstanceFromHostFiber(child), scrollTextNodeIntoView(child, resolvedAlignToTop)) : getInstanceFromHostFiber(child).scrollIntoView(alignToTop);
15512				hostSiblings += resolvedAlignToTop ? -1 : 1;
15513			}
15514		};
15515		var previousHydratableOnEnteringScopedSingleton = null, NotLoaded = 0, Loaded = 1, Errored = 2, Settled = 3, Inserted = 4, preloadPropsMap = /* @__PURE__ */ new Map(), preconnectsSet = /* @__PURE__ */ new Set(), previousDispatcher = ReactDOMSharedInternals.d;
15516		ReactDOMSharedInternals.d = {
15517			f: function() {
15518				var previousWasRendering = previousDispatcher.f(), wasRendering = flushSyncWork$1();
15519				return previousWasRendering || wasRendering;
15520			},
15521			r: function(form) {
15522				var formInst = getInstanceFromNode(form);
15523				null !== formInst && 5 === formInst.tag && "form" === formInst.type ? requestFormReset$1(formInst) : previousDispatcher.r(form);
15524			},
15525			D: function(href) {
15526				previousDispatcher.D(href);
15527				preconnectAs("dns-prefetch", href, null);
15528			},
15529			C: function(href, crossOrigin) {
15530				previousDispatcher.C(href, crossOrigin);
15531				preconnectAs("preconnect", href, crossOrigin);
15532			},
15533			L: function(href, as, options) {
15534				previousDispatcher.L(href, as, options);
15535				var ownerDocument = globalDocument;
15536				if (ownerDocument && href && as) {
15537					var preloadSelector = "link[rel=\"preload\"][as=\"" + escapeSelectorAttributeValueInsideDoubleQuotes(as) + "\"]";
15538					"image" === as ? options && options.imageSrcSet ? (preloadSelector += "[imagesrcset=\"" + escapeSelectorAttributeValueInsideDoubleQuotes(options.imageSrcSet) + "\"]", "string" === typeof options.imageSizes && (preloadSelector += "[imagesizes=\"" + escapeSelectorAttributeValueInsideDoubleQuotes(options.imageSizes) + "\"]")) : preloadSelector += "[href=\"" + escapeSelectorAttributeValueInsideDoubleQuotes(href) + "\"]" : preloadSelector += "[href=\"" + escapeSelectorAttributeValueInsideDoubleQuotes(href) + "\"]";
15539					var key = preloadSelector;
15540					switch (as) {
15541						case "style":
15542							key = getStyleKey(href);
15543							break;
15544						case "script": key = getScriptKey(href);
15545					}
15546					if (!(preloadPropsMap.has(key) || (href = assign({
15547						rel: "preload",
15548						href: "image" === as && options && options.imageSrcSet ? void 0 : href,
15549						as
15550					}, options), preloadPropsMap.set(key, href), null !== ownerDocument.querySelector(preloadSelector) || "style" === as && ownerDocument.querySelector(getStylesheetSelectorFromKey(key)) || "script" === as && ownerDocument.querySelector(getScriptSelectorFromKey(key))))) {
15551						var instance = ownerDocument.createElement("link");
15552						setInitialProperties(instance, "link", href);
15553						"style" === as && (instance[internalLoadPendingKey] = !0, instance.onload = instance.onerror = function() {
15554							clearPendingLoadOnNode(instance);
15555						});
15556						markNodeAsHoistable(instance);
15557						ownerDocument.head.appendChild(instance);
15558					}
15559				}
15560			},
15561			m: function(href, options) {
15562				previousDispatcher.m(href, options);
15563				var ownerDocument = globalDocument;
15564				if (ownerDocument && href) {
15565					var as = options && "string" === typeof options.as ? options.as : "script", preloadSelector = "link[rel=\"modulepreload\"][as=\"" + escapeSelectorAttributeValueInsideDoubleQuotes(as) + "\"][href=\"" + escapeSelectorAttributeValueInsideDoubleQuotes(href) + "\"]", key = preloadSelector;
15566					switch (as) {
15567						case "audioworklet":
15568						case "paintworklet":
15569						case "serviceworker":
15570						case "sharedworker":
15571						case "worker":
15572						case "script": key = getScriptKey(href);
15573					}
15574					if (!preloadPropsMap.has(key) && (href = assign({
15575						rel: "modulepreload",
15576						href
15577					}, options), preloadPropsMap.set(key, href), null === ownerDocument.querySelector(preloadSelector))) {
15578						switch (as) {
15579							case "audioworklet":
15580							case "paintworklet":
15581							case "serviceworker":
15582							case "sharedworker":
15583							case "worker":
15584							case "script": if (ownerDocument.querySelector(getScriptSelectorFromKey(key))) return;
15585						}
15586						as = ownerDocument.createElement("link");
15587						setInitialProperties(as, "link", href);
15588						markNodeAsHoistable(as);
15589						ownerDocument.head.appendChild(as);
15590					}
15591				}
15592			},
15593			X: function(src, options) {
15594				previousDispatcher.X(src, options);
15595				var ownerDocument = globalDocument;
15596				if (ownerDocument && src) {
15597					var scripts = getResourcesFromRoot(ownerDocument).hoistableScripts, key = getScriptKey(src), resource = scripts.get(key);
15598					resource || (resource = ownerDocument.querySelector(getScriptSelectorFromKey(key)), resource || (src = assign({
15599						src,
15600						async: !0
15601					}, options), (options = preloadPropsMap.get(key)) && adoptPreloadPropsForScript(src, options), resource = ownerDocument.createElement("script"), markNodeAsHoistable(resource), setInitialProperties(resource, "link", src), ownerDocument.head.appendChild(resource)), resource = {
15602						type: "script",
15603						instance: resource,
15604						count: 1,
15605						state: null
15606					}, scripts.set(key, resource));
15607				}
15608			},
15609			S: function(href, precedence, options) {
15610				previousDispatcher.S(href, precedence, options);
15611				var ownerDocument = globalDocument;
15612				if (ownerDocument && href) {
15613					var styles = getResourcesFromRoot(ownerDocument).hoistableStyles, key = getStyleKey(href);
15614					precedence = precedence || "default";
15615					var resource = styles.get(key);
15616					if (!resource) {
15617						var state = {
15618							loading: NotLoaded,
15619							preload: null
15620						};
15621						if (resource = ownerDocument.querySelector(getStylesheetSelectorFromKey(key))) state.loading = Loaded | Inserted;
15622						else {
15623							href = assign({
15624								rel: "stylesheet",
15625								href,
15626								"data-precedence": precedence
15627							}, options);
15628							(options = preloadPropsMap.get(key)) && adoptPreloadPropsForStylesheet(href, options);
15629							var link = resource = ownerDocument.createElement("link");
15630							markNodeAsHoistable(link);
15631							setInitialProperties(link, "link", href);
15632							link._p = new Promise(function(resolve, reject) {
15633								link.onload = resolve;
15634								link.onerror = reject;
15635							});
15636							link.addEventListener("load", function() {
15637								state.loading |= Loaded;
15638							});
15639							link.addEventListener("error", function() {
15640								state.loading |= Errored;
15641							});
15642							state.loading |= Inserted;
15643							insertStylesheet(resource, precedence, ownerDocument);
15644						}
15645						resource = {
15646							type: "stylesheet",
15647							instance: resource,
15648							count: 1,
15649							state
15650						};
15651						styles.set(key, resource);
15652					}
15653				}
15654			},
15655			M: function(src, options) {
15656				previousDispatcher.M(src, options);
15657				var ownerDocument = globalDocument;
15658				if (ownerDocument && src) {
15659					var scripts = getResourcesFromRoot(ownerDocument).hoistableScripts, key = getScriptKey(src), resource = scripts.get(key);
15660					resource || (resource = ownerDocument.querySelector(getScriptSelectorFromKey(key)), resource || (src = assign({
15661						src,
15662						async: !0,
15663						type: "module"
15664					}, options), (options = preloadPropsMap.get(key)) && adoptPreloadPropsForScript(src, options), resource = ownerDocument.createElement("script"), markNodeAsHoistable(resource), setInitialProperties(resource, "link", src), ownerDocument.head.appendChild(resource)), resource = {
15665						type: "script",
15666						instance: resource,
15667						count: 1,
15668						state: null
15669					}, scripts.set(key, resource));
15670				}
15671			}
15672		};
15673		var globalDocument = "undefined" === typeof document ? null : document, tagCaches = null, SUSPENSEY_STYLESHEET_TIMEOUT = 6e4, SUSPENSEY_IMAGE_TIMEOUT = 800, SUSPENSEY_IMAGE_TIME_ESTIMATE = 500, estimatedBytesWithinLim
vendor: 12,750 bytes, lines 15673-15830
15673it = 0, LAST_PRECEDENCE = null, precedencesByRoot = null, NotPendingTransition = NotPending, HostTransitionContext = {
15674			$$typeof: REACT_CONTEXT_TYPE,
15675			Provider: null,
15676			Consumer: null,
15677			_currentValue: NotPendingTransition,
15678			_currentValue2: NotPendingTransition,
15679			_threadCount: 0
15680		}, badgeFormat = "%c%s%c", badgeStyle = "background: #e6e6e6;background: light-dark(rgba(0,0,0,0.1), rgba(255,255,255,0.25));color: #000000;color: light-dark(#000000, #ffffff);border-radius: 2px", resetStyle = "", pad = " ", bind = Function.prototype.bind;
15681		var didWarnAboutNestedUpdates = !1;
15682		var overrideHookState = null, overrideHookStateDeletePath = null, overrideHookStateRenamePath = null, overrideProps = null, overridePropsDeletePath = null, overridePropsRenamePath = null, scheduleUpdate = null, scheduleRetry = null, setErrorHandler = null, setSuspenseHandler = null;
15683		overrideHookState = function(fiber, id, path, value) {
15684			id = findHook(fiber, id);
15685			null !== id && (path = copyWithSetImpl(id.memoizedState, path, 0, value), id.memoizedState = path, id.baseState = path, fiber.memoizedProps = assign({}, fiber.memoizedProps), path = enqueueConcurrentRenderForLane(fiber, 2), null !== path && scheduleUpdateOnFiber(path, fiber, 2));
15686		};
15687		overrideHookStateDeletePath = function(fiber, id, path) {
15688			id = findHook(fiber, id);
15689			null !== id && (path = copyWithDeleteImpl(id.memoizedState, path, 0), id.memoizedState = path, id.baseState = path, fiber.memoizedProps = assign({}, fiber.memoizedProps), path = enqueueConcurrentRenderForLane(fiber, 2), null !== path && scheduleUpdateOnFiber(path, fiber, 2));
15690		};
15691		overrideHookStateRenamePath = function(fiber, id, oldPath, newPath) {
15692			id = findHook(fiber, id);
15693			null !== id && (oldPath = copyWithRename(id.memoizedState, oldPath, newPath), id.memoizedState = oldPath, id.baseState = oldPath, fiber.memoizedProps = assign({}, fiber.memoizedProps), oldPath = enqueueConcurrentRenderForLane(fiber, 2), null !== oldPath && scheduleUpdateOnFiber(oldPath, fiber, 2));
15694		};
15695		overrideProps = function(fiber, path, value) {
15696			fiber.pendingProps = copyWithSetImpl(fiber.memoizedProps, path, 0, value);
15697			fiber.alternate && (fiber.alternate.pendingProps = fiber.pendingProps);
15698			path = enqueueConcurrentRenderForLane(fiber, 2);
15699			null !== path && scheduleUpdateOnFiber(path, fiber, 2);
15700		};
15701		overridePropsDeletePath = function(fiber, path) {
15702			fiber.pendingProps = copyWithDeleteImpl(fiber.memoizedProps, path, 0);
15703			fiber.alternate && (fiber.alternate.pendingProps = fiber.pendingProps);
15704			path = enqueueConcurrentRenderForLane(fiber, 2);
15705			null !== path && scheduleUpdateOnFiber(path, fiber, 2);
15706		};
15707		overridePropsRenamePath = function(fiber, oldPath, newPath) {
15708			fiber.pendingProps = copyWithRename(fiber.memoizedProps, oldPath, newPath);
15709			fiber.alternate && (fiber.alternate.pendingProps = fiber.pendingProps);
15710			oldPath = enqueueConcurrentRenderForLane(fiber, 2);
15711			null !== oldPath && scheduleUpdateOnFiber(oldPath, fiber, 2);
15712		};
15713		scheduleUpdate = function(fiber) {
15714			var root = enqueueConcurrentRenderForLane(fiber, 2);
15715			null !== root && scheduleUpdateOnFiber(root, fiber, 2);
15716		};
15717		scheduleRetry = function(fiber) {
15718			var lane = claimNextRetryLane(), root = enqueueConcurrentRenderForLane(fiber, lane);
15719			null !== root && scheduleUpdateOnFiber(root, fiber, lane);
15720		};
15721		setErrorHandler = function(newShouldErrorImpl) {
15722			shouldErrorImpl = newShouldErrorImpl;
15723		};
15724		setSuspenseHandler = function(newShouldSuspendImpl) {
15725			shouldSuspendImpl = newShouldSuspendImpl;
15726		};
15727		var _enabled = !0, return_targetInst = null, hasScheduledReplayAttempt = !1, queuedFocus = null, queuedDrag = null, queuedMouse = null, queuedPointers = /* @__PURE__ */ new Map(), queuedPointerCaptures = /* @__PURE__ */ new Map(), queuedExplicitHydrationTargets = [], discreteReplayableEvents = "mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset".split(" "), lastScheduledReplayQueue = null;
15728		ReactDOMHydrationRoot.prototype.render = ReactDOMRoot.prototype.render = function(children) {
15729			var root = this._internalRoot;
15730			if (null === root) throw Error("Cannot update an unmounted root.");
15731			var args = arguments;
15732			"function" === typeof args[1] ? console.error("does not support the second callback argument. To execute a side effect after rendering, declare it in a component body with useEffect().") : isValidContainer(args[1]) ? console.error("You passed a container to the second argument of root.render(...). You don't need to pass it again since you already passed it to create the root.") : "undefined" !== typeof args[1] && console.error("You passed a second argument to root.render(...) but it only accepts one argument.");
15733			args = children;
15734			var current = root.current;
15735			updateContainerImpl(current, requestUpdateLane(current), args, root, null, null);
15736		};
15737		ReactDOMHydrationRoot.prototype.unmount = ReactDOMRoot.prototype.unmount = function() {
15738			var args = arguments;
15739			"function" === typeof args[0] && console.error("does not support a callback argument. To execute a side effect after rendering, declare it in a component body with useEffect().");
15740			args = this._internalRoot;
15741			if (null !== args) {
15742				this._internalRoot = null;
15743				var container = args.containerInfo;
15744				(executionContext & (RenderContext | CommitContext)) !== NoContext && console.error("Attempted to synchronously unmount a root while React was already rendering. React cannot finish unmounting the root until the current render has completed, which may lead to a race condition.");
15745				updateContainerImpl(args.current, 2, null, args, null, null);
15746				flushSyncWork$1();
15747				container[internalContainerInstanceKey] = null;
15748			}
15749		};
15750		ReactDOMHydrationRoot.prototype.unstable_scheduleHydration = function(target) {
15751			if (target) {
15752				var updatePriority = resolveUpdatePriority();
15753				target = {
15754					blockedOn: null,
15755					target,
15756					priority: updatePriority
15757				};
15758				for (var i = 0; i < queuedExplicitHydrationTargets.length && 0 !== updatePriority && updatePriority < queuedExplicitHydrationTargets[i].priority; i++);
15759				queuedExplicitHydrationTargets.splice(i, 0, target);
15760				0 === i && attemptExplicitHydrationTarget(target);
15761			}
15762		};
15763		(function() {
15764			var isomorphicReactPackageVersion = React.version;
15765			if ("19.3.0" !== isomorphicReactPackageVersion) throw Error("Incompatible React versions: The \"react\" and \"react-dom\" packages must have the exact same version. Instead got:\n  - react:      " + (isomorphicReactPackageVersion + "\n  - react-dom:  19.3.0\nLearn more: https://react.dev/warnings/version-mismatch"));
15766		})();
15767		"function" === typeof Map && null != Map.prototype && "function" === typeof Map.prototype.forEach && "function" === typeof Set && null != Set.prototype && "function" === typeof Set.prototype.clear && "function" === typeof Set.prototype.forEach || console.error("React depends on Map and Set built-in types. Make sure that you load a polyfill in older browsers. https://react.dev/link/react-polyfills");
15768		ReactDOMSharedInternals.findDOMNode = function(componentOrElement) {
15769			var fiber = componentOrElement._reactInternals;
15770			if (void 0 === fiber) {
15771				if ("function" === typeof componentOrElement.render) throw Error("Unable to find node on an unmounted component.");
15772				componentOrElement = Object.keys(componentOrElement).join(",");
15773				throw Error("Argument appears to not be a ReactComponent. Keys: " + componentOrElement);
15774			}
15775			componentOrElement = findCurrentFiberUsingSlowPath(fiber);
15776			componentOrElement = null !== componentOrElement ? findCurrentHostFiberImpl(componentOrElement) : null;
15777			componentOrElement = null === componentOrElement ? null : componentOrElement.stateNode;
15778			return componentOrElement;
15779		};
15780		if (!(function() {
15781			var internals = {
15782				bundleType: 1,
15783				version: "19.3.0",
15784				rendererPackageName: "react-dom",
15785				currentDispatcherRef: ReactSharedInternals,
15786				reconcilerVersion: "19.3.0"
15787			};
15788			internals.overrideHookState = overrideHookState;
15789			internals.overrideHookStateDeletePath = overrideHookStateDeletePath;
15790			internals.overrideHookStateRenamePath = overrideHookStateRenamePath;
15791			internals.overrideProps = overrideProps;
15792			internals.overridePropsDeletePath = overridePropsDeletePath;
15793			internals.overridePropsRenamePath = overridePropsRenamePath;
15794			internals.scheduleUpdate = scheduleUpdate;
15795			internals.scheduleRetry = scheduleRetry;
15796			internals.setErrorHandler = setErrorHandler;
15797			internals.setSuspenseHandler = setSuspenseHandler;
15798			internals.scheduleRefresh = scheduleRefresh;
15799			internals.scheduleRoot = scheduleRoot;
15800			internals.setRefreshHandler = setRefreshHandler;
15801			internals.getCurrentFiber = getCurrentFiberForDevTools;
15802			return injectInternals(internals);
15803		})() && canUseDOM && window.top === window.self && (-1 < navigator.userAgent.indexOf("Chrome") && -1 === navigator.userAgent.indexOf("Edge") || -1 < navigator.userAgent.indexOf("Firefox"))) {
15804			var protocol = window.location.protocol;
15805			/^(https?|file):$/.test(protocol) && console.info("%cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools" + ("file:" === protocol ? "\nYou might need to use a local HTTP server (instead of file://): https://react.dev/link/react-devtools-faq" : ""), "font-weight:bold");
15806		}
15807		exports.createRoot = function(container, options) {
15808			if (!isValidContainer(container)) throw Error("Target container is not a DOM element.");
15809			warnIfReactDOMContainerInDEV(container);
15810			var isStrictMode = !1, identifierPrefix = "", onUncaughtError = defaultOnUncaughtError, onCaughtError = defaultOnCaughtError, onRecoverableError = defaultOnRecoverableError;
15811			null !== options && void 0 !== options && (options.hydrate ? console.warn("hydrate through createRoot is deprecated. Use ReactDOMClient.hydrateRoot(container, <App />) instead.") : "object" === typeof options && null !== options && options.$$typeof === REACT_ELEMENT_TYPE && console.error("You passed a JSX element to createRoot. You probably meant to call root.render instead. Example usage:\n\n  let root = createRoot(domContainer);\n  root.render(<App />);"), !0 === options.unstable_strictMode && (isStrictMode = !0), void 0 !== options.identifierPrefix && (identifierPrefix = options.identifierPrefix), void 0 !== options.onUncaughtError && (onUncaughtError = options.onUncaughtError), void 0 !== options.onCaughtError && (onCaughtError = options.onCaughtError), void 0 !== options.onRecoverableError && (onRecoverableError = options.onRecoverableError));
15812			options = createFiberRoot(container, 1, !1, null, null, isStrictMode, identifierPrefix, null, onUncaughtError, onCaughtError, onRecoverableError, defaultOnDefaultTransitionIndicator);
15813			container[internalContainerInstanceKey] = options.current;
15814			listenToAllSupportedEvents(container);
15815			return new ReactDOMRoot(options);
15816		};
15817		exports.hydrateRoot = function(container, initialChildren, options) {
15818			if (!isValidContainer(container)) throw Error("Target container is not a DOM element.");
15819			warnIfReactDOMContainerInDEV(container);
15820			void 0 === initialChildren && console.error("Must provide initial children as second argument to hydrateRoot. Example usage: hydrateRoot(domContainer, <App />)");
15821			var isStrictMode = !1, identifierPrefix = "", onUncaughtError = defaultOnUncaughtError, onCaughtError = defaultOnCaughtError, onRecoverableError = defaultOnRecoverableError, formState = null;
15822			null !== options && void 0 !== options && (!0 === options.unstable_strictMode && (isStrictMode = !0), void 0 !== options.identifierPrefix && (identifierPrefix = options.identifierPrefix), void 0 !== options.onUncaughtError && (onUncaughtError = options.onUncaughtError), void 0 !== options.onCaughtError && (onCaughtError = options.onCaughtError), void 0 !== options.onRecoverableError && (onRecoverableError = options.onRecoverableError), void 0 !== options.formState && (formState = options.formState));
15823			initialChildren = createFiberRoot(container, 1, !0, initialChildren, null != options ? options : null, isStrictMode, identifierPrefix, formState, onUncaughtError, onCaughtError, onRecoverableError, defaultOnDefaultTransitionIndicator);
15824			initialChildren.context = getContextForSubtree(null);
15825			options = initialChildren.current;
15826			isStrictMode = requestUpdateLane(options);
15827			isStrictMode = getBumpedLaneForHydrationByLane(isStrictMode);
15828			identifierPrefix = createUpdate(isStrictMode);
15829			identifierPrefix.callback = null;
15830			enqueueUpdate(options, identifierPrefix, isStrictMode);
15831			startUpdateTimerByLane(isStrictMode, "hydrateRoot()", null);
15832			options = isStrictMode;
15833			initialChildren.current.lanes = options;
15834			markRootUpdated$1(initialChildren, options);
15835			ensureRootIsScheduled(initialChildren);
15836			container[internalContainerInstanceKey] = initialChildren.current;
15837			listenToAllSupportedEvents(container);
15838			return new ReactDOMHydrationRoot(initialChildren);
15839		};
15840		exports.version = "19.3.0";
15841		"undefined" !== typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" === typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());
15842	})();
15843}));
15844//#endregion
15845//#region node_modules/react-dom/client.js
15846var require_client = /* @__PURE__ */ __commonJSMin(((exports, module) => {
15847	module.exports = require_react_dom_client_development();
15848}));
15849//#endregion
15850export { require_client as t };
15851
15852//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LUI2VDVDODlDLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NjaGVkdWxlci9janMvc2NoZWR1bGVyLmRldmVsb3BtZW50LmpzIiwiLi4vLi4vc2NoZWR1bGVyL2luZGV4LmpzIiwiLi4vLi4vcmVhY3QtZG9tL2Nqcy9yZWFjdC1kb20tY2xpZW50LmRldmVsb3BtZW50LmpzIiwiLi4vLi4vcmVhY3QtZG9tL2NsaWVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiBzY2hlZHVsZXIuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cblwidXNlIHN0cmljdFwiO1xuXCJwcm9k
15852dWN0aW9uXCIgIT09IHByb2Nlc3MuZW52Lk5PREVfRU5WICYmXG4gIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gcGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lKCkge1xuICAgICAgbmVlZHNQYWludCA9ICExO1xuICAgICAgaWYgKGlzTWVzc2FnZUxvb3BSdW5uaW5nKSB7XG4gICAgICAgIHZhciBjdXJyZW50VGltZSA9IGV4cG9ydHMudW5zdGFibGVfbm93KCk7XG4gICAgICAgIHN0YXJ0VGltZSA9IGN1cnJlbnRUaW1lO1xuICAgICAgICB2YXIgaGFzTW9yZVdvcmsgPSAhMDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhOiB7XG4gICAgICAgICAgICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9ICExO1xuICAgICAgICAgICAgaXNIb3N0VGltZW91dFNjaGVkdWxlZCAmJlxuICAgICAgICAgICAgICAoKGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSAhMSksXG4gICAgICAgICAgICAgIGxvY2FsQ2xlYXJUaW1lb3V0KHRhc2tUaW1lb3V0SUQpLFxuICAgICAgICAgICAgICAodGFza1RpbWVvdXRJRCA9IC0xKSk7XG4gICAgICAgICAgICBpc1BlcmZvcm1pbmdXb3JrID0gITA7XG4gICAgICAgICAgICB2YXIgcHJldmlvdXNQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBiOiB7XG4gICAgICAgICAgICAgICAgYWR2YW5jZVRpbWVycyhjdXJyZW50VGltZSk7XG4gICAgICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnRUYXNrID0gcGVlayh0YXNrUXVldWUpO1xuICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudFRhc2sgJiZcbiAgICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUYXNrLmV4cGlyYXRpb25UaW1lID4gY3VycmVudFRpbWUgJiZcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkWWllbGRUb0hvc3QoKVxuICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gY3VycmVudFRhc2suY2FsbGJhY2s7XG4gICAgICAgICAgICAgICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRhc2suY2FsbGJhY2sgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IGN1cnJlbnRUYXNrLnByaW9yaXR5TGV2ZWw7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb250aW51YXRpb25DYWxsYmFjayA9IGNhbGxiYWNrKFxuICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUYXNrLmV4cGlyYXRpb25UaW1lIDw9IGN1cnJlbnRUaW1lXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUaW1lID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGNvbnRpbnVhdGlvbkNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRhc2suY2FsbGJhY2sgPSBjb250aW51YXRpb25DYWxsYmFjaztcbiAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlVGltZXJzKGN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICBoYXNNb3JlV29yayA9ICEwO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRhc2sgPT09IHBlZWsodGFza1F1ZXVlKSAmJiBwb3AodGFza1F1ZXVlKTtcbiAgICAgICAgICAgICAgICAgICAgYWR2YW5jZVRpbWVycyhjdXJyZW50VGltZSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgcG9wKHRhc2tRdWV1ZSk7XG4gICAgICAgICAgICAgICAgICBjdXJyZW50VGFzayA9IHBlZWsodGFza1F1ZXVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG51bGwgIT09IGN1cnJlbnRUYXNrKSBoYXNNb3JlV29yayA9ICEwO1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFyIGZpcnN0VGltZXIgPSBwZWVrKHRpbWVyUXVldWUpO1xuICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gZmlyc3RUaW1lciAmJlxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SG9zdFRpbWVvdXQoXG4gICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVGltZW91dCxcbiAgICAgICAgICAgICAgICAgICAgICBmaXJzdFRpbWVyLnN0YXJ0VGltZSAtIGN1cnJlbnRUaW1lXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBoYXNNb3JlV29yayA9ICExO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgKGN1cnJlbnRUYXNrID0gbnVsbCksXG4gICAgICAgICAgICAgICAgKGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsKSxcbiAgICAgICAgICAgICAgICAoaXNQZXJmb3JtaW5nV29yayA9ICExKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhhc01vcmVXb3JrID0gdm9pZCAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBoYXNNb3JlV29ya1xuICAgICAgICAgICAgPyBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSgpXG4gICAgICAgICAgICA6IChpc01lc3NhZ2VMb29wUnVubmluZyA9ICExKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBwdXNoKGhlYXAsIG5vZGUpIHtcbiAgICAgIHZhciBpbmRleCA9IGhlYXAubGVuZ3RoO1xuICAgICAgaGVhcC5wdXNoKG5vZGUpO1xuICAgICAgYTogZm9yICg7IDAgPCBpbmRleDsgKSB7XG4gICAgICAgIHZhciBwYXJlbnRJbmRleCA9IChpbmRleCAtIDEpID4+PiAxLFxuICAgICAgICAgIHBhcmVudCA9IGhlYXBbcGFyZW50SW5kZXhdO1xuICAgICAgICBpZiAoMCA8IGNvbXBhcmUocGFyZW50LCBub2RlKSlcbiAgICAgICAgICAoaGVhcFtwYXJlbnRJbmRleF0gPSBub2RlKSxcbiAgICAgICAgICAgIChoZWFwW2luZGV4XSA9IHBhcmVudCksXG4gICAgICAgICAgICAoaW5kZXggPSBwYXJlbnRJbmRleCk7XG4gICAgICAgIGVsc2UgYnJlYWsgYTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcGVlayhoZWFwKSB7XG4gICAgICByZXR1cm4gMCA9PT0gaGVhcC5sZW5ndGggPyBudWxsIDogaGVhcFswXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcG9wKGhlYXApIHtcbiAgICAgIGlmICgwID09PSBoZWFwLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgICB2Y
15852XIgZmlyc3QgPSBoZWFwWzBdLFxuICAgICAgICBsYXN0ID0gaGVhcC5wb3AoKTtcbiAgICAgIGlmIChsYXN0ICE9PSBmaXJzdCkge1xuICAgICAgICBoZWFwWzBdID0gbGFzdDtcbiAgICAgICAgYTogZm9yIChcbiAgICAgICAgICB2YXIgaW5kZXggPSAwLCBsZW5ndGggPSBoZWFwLmxlbmd0aCwgaGFsZkxlbmd0aCA9IGxlbmd0aCA+Pj4gMTtcbiAgICAgICAgICBpbmRleCA8IGhhbGZMZW5ndGg7XG5cbiAgICAgICAgKSB7XG4gICAgICAgICAgdmFyIGxlZnRJbmRleCA9IDIgKiAoaW5kZXggKyAxKSAtIDEsXG4gICAgICAgICAgICBsZWZ0ID0gaGVhcFtsZWZ0SW5kZXhdLFxuICAgICAgICAgICAgcmlnaHRJbmRleCA9IGxlZnRJbmRleCArIDEsXG4gICAgICAgICAgICByaWdodCA9IGhlYXBbcmlnaHRJbmRleF07XG4gICAgICAgICAgaWYgKDAgPiBjb21wYXJlKGxlZnQsIGxhc3QpKVxuICAgICAgICAgICAgcmlnaHRJbmRleCA8IGxlbmd0aCAmJiAwID4gY29tcGFyZShyaWdodCwgbGVmdClcbiAgICAgICAgICAgICAgPyAoKGhlYXBbaW5kZXhdID0gcmlnaHQpLFxuICAgICAgICAgICAgICAgIChoZWFwW3JpZ2h0SW5kZXhdID0gbGFzdCksXG4gICAgICAgICAgICAgICAgKGluZGV4ID0gcmlnaHRJbmRleCkpXG4gICAgICAgICAgICAgIDogKChoZWFwW2luZGV4XSA9IGxlZnQpLFxuICAgICAgICAgICAgICAgIChoZWFwW2xlZnRJbmRleF0gPSBsYXN0KSxcbiAgICAgICAgICAgICAgICAoaW5kZXggPSBsZWZ0SW5kZXgpKTtcbiAgICAgICAgICBlbHNlIGlmIChyaWdodEluZGV4IDwgbGVuZ3RoICYmIDAgPiBjb21wYXJlKHJpZ2h0LCBsYXN0KSlcbiAgICAgICAgICAgIChoZWFwW2luZGV4XSA9IHJpZ2h0KSxcbiAgICAgICAgICAgICAgKGhlYXBbcmlnaHRJbmRleF0gPSBsYXN0KSxcbiAgICAgICAgICAgICAgKGluZGV4ID0gcmlnaHRJbmRleCk7XG4gICAgICAgICAgZWxzZSBicmVhayBhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmlyc3Q7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXBhcmUoYSwgYikge1xuICAgICAgdmFyIGRpZmYgPSBhLnNvcnRJbmRleCAtIGIuc29ydEluZGV4O1xuICAgICAgcmV0dXJuIDAgIT09IGRpZmYgPyBkaWZmIDogYS5pZCAtIGIuaWQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFkdmFuY2VUaW1lcnMoY3VycmVudFRpbWUpIHtcbiAgICAgIGZvciAodmFyIHRpbWVyID0gcGVlayh0aW1lclF1ZXVlKTsgbnVsbCAhPT0gdGltZXI7ICkge1xuICAgICAgICBpZiAobnVsbCA9PT0gdGltZXIuY2FsbGJhY2spIHBvcCh0aW1lclF1ZXVlKTtcbiAgICAgICAgZWxzZSBpZiAodGltZXIuc3RhcnRUaW1lIDw9IGN1cnJlbnRUaW1lKVxuICAgICAgICAgIHBvcCh0aW1lclF1ZXVlKSxcbiAgICAgICAgICAgICh0aW1lci5zb3J0SW5kZXggPSB0aW1lci5leHBpcmF0aW9uVGltZSksXG4gICAgICAgICAgICBwdXNoKHRhc2tRdWV1ZSwgdGltZXIpO1xuICAgICAgICBlbHNlIGJyZWFrO1xuICAgICAgICB0aW1lciA9IHBlZWsodGltZXJRdWV1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhhbmRsZVRpbWVvdXQoY3VycmVudFRpbWUpIHtcbiAgICAgIGlzSG9zdFRpbWVvdXRTY2hlZHVsZWQgPSAhMTtcbiAgICAgIGFkdmFuY2VUaW1lcnMoY3VycmVudFRpbWUpO1xuICAgICAgaWYgKCFpc0hvc3RDYWxsYmFja1NjaGVkdWxlZClcbiAgICAgICAgaWYgKG51bGwgIT09IHBlZWsodGFza1F1ZXVlKSlcbiAgICAgICAgICAoaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSAhMCksXG4gICAgICAgICAgICBpc01lc3NhZ2VMb29wUnVubmluZyB8fFxuICAgICAgICAgICAgICAoKGlzTWVzc2FnZUxvb3BSdW5uaW5nID0gITApLCBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSgpKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdmFyIGZpcnN0VGltZXIgPSBwZWVrKHRpbWVyUXVldWUpO1xuICAgICAgICAgIG51bGwgIT09IGZpcnN0VGltZXIgJiZcbiAgICAgICAgICAgIHJlcXVlc3RIb3N0VGltZW91dChcbiAgICAgICAgICAgICAgaGFuZGxlVGltZW91dCxcbiAgICAgICAgICAgICAgZmlyc3RUaW1lci5zdGFydFRpbWUgLSBjdXJyZW50VGltZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBzaG91bGRZaWVsZFRvSG9zdCgpIHtcbiAgICAgIHJldHVybiBuZWVkc1BhaW50XG4gICAgICAgID8gITBcbiAgICAgICAgOiBleHBvcnRzLnVuc3RhYmxlX25vdygpIC0gc3RhcnRUaW1lIDwgZnJhbWVJbnRlcnZhbFxuICAgICAgICAgID8gITFcbiAgICAgICAgICA6ICEwO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXF1ZXN0SG9zdFRpbWVvdXQoY2FsbGJhY2ssIG1zKSB7XG4gICAgICB0YXNrVGltZW91dElEID0gbG9jYWxTZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2FsbGJhY2soZXhwb3J0cy51bnN0YWJsZV9ub3coKSk7XG4gICAgICB9LCBtcyk7XG4gICAgfVxuICAgIFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gJiZcbiAgICAgIFwiZnVuY3Rpb25cIiA9PT1cbiAgICAgICAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQgJiZcbiAgICAgIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQoRXJyb3IoKSk7XG4gICAgZXhwb3J0cy51bnN0YWJsZV9ub3cgPSB2b2lkIDA7XG4gICAgaWYgKFxuICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIHBlcmZvcm1hbmNlICYmXG4gICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBwZXJmb3JtYW5jZS5ub3dcbiAgICApIHtcbiAgICAgIHZhciBsb2NhbFBlcmZvcm1hbmNlID0gcGVyZm9ybWFuY2U7XG4gICAgICBleHBvcnRzLnVuc3RhYmxlX25vdyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsUGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB2Y
15852XIgbG9jYWxEYXRlID0gRGF0ZSxcbiAgICAgICAgaW5pdGlhbFRpbWUgPSBsb2NhbERhdGUubm93KCk7XG4gICAgICBleHBvcnRzLnVuc3RhYmxlX25vdyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsRGF0ZS5ub3coKSAtIGluaXRpYWxUaW1lO1xuICAgICAgfTtcbiAgICB9XG4gICAgdmFyIHRhc2tRdWV1ZSA9IFtdLFxuICAgICAgdGltZXJRdWV1ZSA9IFtdLFxuICAgICAgdGFza0lkQ291bnRlciA9IDEsXG4gICAgICBjdXJyZW50VGFzayA9IG51bGwsXG4gICAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IDMsXG4gICAgICBpc1BlcmZvcm1pbmdXb3JrID0gITEsXG4gICAgICBpc0hvc3RDYWxsYmFja1NjaGVkdWxlZCA9ICExLFxuICAgICAgaXNIb3N0VGltZW91dFNjaGVkdWxlZCA9ICExLFxuICAgICAgbmVlZHNQYWludCA9ICExLFxuICAgICAgbG9jYWxTZXRUaW1lb3V0ID0gXCJmdW5jdGlvblwiID09PSB0eXBlb2Ygc2V0VGltZW91dCA/IHNldFRpbWVvdXQgOiBudWxsLFxuICAgICAgbG9jYWxDbGVhclRpbWVvdXQgPVxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBjbGVhclRpbWVvdXQgPyBjbGVhclRpbWVvdXQgOiBudWxsLFxuICAgICAgbG9jYWxTZXRJbW1lZGlhdGUgPVxuICAgICAgICBcInVuZGVmaW5lZFwiICE9PSB0eXBlb2Ygc2V0SW1tZWRpYXRlID8gc2V0SW1tZWRpYXRlIDogbnVsbCxcbiAgICAgIGlzTWVzc2FnZUxvb3BSdW5uaW5nID0gITEsXG4gICAgICB0YXNrVGltZW91dElEID0gLTEsXG4gICAgICBmcmFtZUludGVydmFsID0gNSxcbiAgICAgIHN0YXJ0VGltZSA9IC0xO1xuICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBsb2NhbFNldEltbWVkaWF0ZSlcbiAgICAgIHZhciBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbG9jYWxTZXRJbW1lZGlhdGUocGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lKTtcbiAgICAgIH07XG4gICAgZWxzZSBpZiAoXCJ1bmRlZmluZWRcIiAhPT0gdHlwZW9mIE1lc3NhZ2VDaGFubmVsKSB7XG4gICAgICB2Y
15852XIgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpLFxuICAgICAgICBwb3J0ID0gY2hhbm5lbC5wb3J0MjtcbiAgICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gcGVyZm9ybVdvcmtVbnRpbERlYWRsaW5lO1xuICAgICAgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHBvcnQucG9zdE1lc3NhZ2UobnVsbCk7XG4gICAgICB9O1xuICAgIH0gZWxzZVxuICAgICAgc2NoZWR1bGVQZXJmb3JtV29ya1VudGlsRGVhZGxpbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxvY2FsU2V0VGltZW91dChwZXJmb3JtV29ya1VudGlsRGVhZGxpbmUsIDApO1xuICAgICAgfTtcbiAgICBleHBvcnRzLnVuc3RhYmxlX0lkbGVQcmlvcml0eSA9IDU7XG4gICAgZXhwb3J0cy51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eSA9IDE7XG4gICAgZXhwb3J0cy51bnN0YWJsZV9Mb3dQcmlvcml0eSA9IDQ7XG4gICAgZXhwb3J0cy51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eSA9IDM7XG4gICAgZXhwb3J0cy51bnN0YWJsZV9Qcm9maWxpbmcgPSBudWxsO1xuICAgIGV4cG9ydHMudW5zdGFibGVfVXNlckJsb2NraW5nUHJpb3JpdHkgPSAyO1xuICAgIGV4cG9ydHMudW5zdGFibGVfY2FuY2VsQ2FsbGJhY2sgPSBmdW5jdGlvbiAodGFzaykge1xuICAgICAgdGFzay5jYWxsYmFjayA9IG51bGw7XG4gICAgfTtcbiAgICBleHBvcnRzLnVuc3RhYmxlX2ZvcmNlRnJhbWVSYXRlID0gZnVuY3Rpb24gKGZwcykge1xuICAgICAgMCA+IGZwcyB8fCAxMjUgPCBmcHNcbiAgICAgICAgPyBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJmb3JjZUZyYW1lUmF0ZSB0YWtlcyBhIHBvc2l0aXZlIGludCBiZXR3ZWVuIDAgYW5kIDEyNSwgZm9yY2luZyBmcmFtZSByYXRlcyBoaWdoZXIgdGhhbiAxMjUgZnBzIGlzIG5vdCBzdXBwb3J0ZWRcIlxuICAgICAgICAgIClcbiAgICAgICAgOiAoZnJhbWVJbnRlcnZhbCA9IDAgPCBmcHMgPyBNYXRoLmZsb29yKDFlMyAvIGZwcykgOiA1KTtcbiAgICB9O1xuICAgIGV4cG9ydHMudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gICAgfTtcbiAgICBleHBvcnRzLnVuc3RhYmxlX25leHQgPSBmdW5jdGlvbiAoZXZlbnRIYW5kbGVyKSB7XG4gICAgICBzd2l0Y2ggKGN1cnJlbnRQcmlvcml0eUxldmVsKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgdmFyIHByaW9yaXR5TGV2ZWwgPSAzO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgICAgIH1cbiAgICAgIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJpb3JpdHlMZXZlbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBldmVudEhhbmRsZXIoKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsO1xuICAgICAgfVxuICAgIH07XG4gICAgZXhwb3J0cy51bnN0YWJsZV9yZXF1ZXN0UGFpbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBuZWVkc1BhaW50ID0gITA7XG4gICAgfTtcbiAgICBleHBvcnRzLnVuc3RhYmxlX3J1bldpdGhQcmlvcml0eSA9IGZ1bmN0aW9uIChwcmlvcml0eUxldmVsLCBldmVudEhhbmRsZXIpIHtcbiAgICAgIHN3aXRjaCAocHJpb3JpdHlMZXZlbCkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICBjYXNlIDQ6XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBwcmlvcml0eUxldmVsID0gMztcbiAgICAgIH1cbiAgICAgIHZhciBwcmV2aW91c1ByaW9yaXR5TGV2ZWwgPSBjdXJyZW50UHJpb3JpdHlMZXZlbDtcbiAgICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJpb3JpdHlMZXZlbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBldmVudEhhbmRsZXIoKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcHJldmlvdXNQcmlvcml0eUxldmVsO1xuICAgICAgfVxuICAgIH07XG4gICAgZXhwb3J0cy51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrID0gZnVuY3Rpb24gKFxuICAgICAgcHJpb3JpdHlMZXZlbCxcbiAgICAgIGNhbGxiYWNrLFxuICAgICAgb3B0aW9uc1xuICAgICkge1xuICAgICAgdmFyIGN1cnJlbnRUaW1lID0gZXhwb3J0cy51bnN0YWJsZV9ub3coKTtcbiAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiBvcHRpb25zICYmIG51bGwgIT09IG9wdGlvbnNcbiAgICAgICAgPyAoKG9wdGlvbnMgPSBvcHRpb25zLmRlbGF5KSxcbiAgICAgICAgICAob3B0aW9ucyA9XG4gICAgICAgICAgICBcIm51bWJlclwiID09PSB0eXBlb2Ygb3B0aW9ucyAmJiAwIDwgb3B0aW9uc1xuICAgICAgICAgICAgICA/IGN1cnJlbnRUaW1lICsgb3B0aW9uc1xuICAgICAgICAgICAgICA6IGN1cnJlbnRUaW1lKSlcbiAgICAgICAgOiAob3B0aW9ucyA9IGN1cnJlbnRUaW1lKTtcbiAgICAgIHN3aXRjaCAocHJpb3JpdHlMZXZlbCkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgdmFyIHRpbWVvdXQgPSAtMTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHRpbWVvdXQgPSAyNTA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICB0aW1lb3V0ID0gMTA3Mzc0MTgyMztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHRpbWVvdXQgPSAx
15852ZTQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGltZW91dCA9IDVlMztcbiAgICAgIH1cbiAgICAgIHRpbWVvdXQgPSBvcHRpb25zICsgdGltZW91dDtcbiAgICAgIHByaW9yaXR5TGV2ZWwgPSB7XG4gICAgICAgIGlkOiB0YXNrSWRDb3VudGVyKyssXG4gICAgICAgIGNhbGxiYWNrOiBjYWxsYmFjayxcbiAgICAgICAgcHJpb3JpdHlMZXZlbDogcHJpb3JpdHlMZXZlbCxcbiAgICAgICAgc3RhcnRUaW1lOiBvcHRpb25zLFxuICAgICAgICBleHBpcmF0aW9uVGltZTogdGltZW91dCxcbiAgICAgICAgc29ydEluZGV4OiAtMVxuICAgICAgfTtcbiAgICAgIG9wdGlvbnMgPiBjdXJyZW50VGltZVxuICAgICAgICA/ICgocHJpb3JpdHlMZXZlbC5zb3J0SW5kZXggPSBvcHRpb25zKSxcbiAgICAgICAgICBwdXNoKHRpbWVyUXVldWUsIHByaW9yaXR5TGV2ZWwpLFxuICAgICAgICAgIG51bGwgPT09IHBlZWsodGFza1F1ZXVlKSAmJlxuICAgICAgICAgICAgcHJpb3JpdHlMZXZlbCA9PT0gcGVlayh0aW1lclF1ZXVlKSAmJlxuICAgICAgICAgICAgKGlzSG9zdFRpbWVvdXRTY2hlZHVsZWRcbiAgICAgICAgICAgICAgPyAobG9jYWxDbGVhclRpbWVvdXQodGFza1RpbWVvdXRJRCksICh0YXNrVGltZW91dElEID0gLTEpKVxuICAgICAgICAgICAgICA6IChpc0hvc3RUaW1lb3V0U2NoZWR1bGVkID0gITApLFxuICAgICAgICAgICAgcmVxdWVzdEhvc3RUaW1lb3V0KGhhbmRsZVRpbWVvdXQsIG9wdGlvbnMgLSBjdXJyZW50VGltZSkpKVxuICAgICAgICA6ICgocHJpb3JpdHlMZXZlbC5zb3J0SW5kZXggPSB0aW1lb3V0KSxcbiAgICAgICAgICBwdXNoKHRhc2tRdWV1ZSwgcHJpb3JpdHlMZXZlbCksXG4gICAgICAgICAgaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgfHxcbiAgICAgICAgICAgIGlzUGVyZm9ybWluZ1dvcmsgfHxcbiAgICAgICAgICAgICgoaXNIb3N0Q2FsbGJhY2tTY2hlZHVsZWQgPSAhMCksXG4gICAgICAgICAgICBpc01lc3NhZ2VMb29wUnVubmluZyB8fFxuICAgICAgICAgICAgICAoKGlzTWVzc2FnZUxvb3BSdW5uaW5nID0gITApLFxuICAgICAgICAgICAgICBzY2hlZHVsZVBlcmZvcm1Xb3JrVW50aWxEZWFkbGluZSgpKSkpO1xuICAgICAgcmV0dXJuIHByaW9yaXR5TGV2ZWw7XG4gICAgfTtcbiAgICBleHBvcnRzLnVuc3RhYmxlX3Nob3VsZFlpZWxkID0gc2hvdWxkWWllbGRUb0hvc3Q7XG4gICAgZXhwb3J0cy51bnN0YWJsZV93cmFwQ2FsbGJhY2sgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgIHZhciBwYXJlbnRQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB2Y
15852XIgcHJldmlvdXNQcmlvcml0eUxldmVsID0gY3VycmVudFByaW9yaXR5TGV2ZWw7XG4gICAgICAgIGN1cnJlbnRQcmlvcml0eUxldmVsID0gcGFyZW50UHJpb3JpdHlMZXZlbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBjdXJyZW50UHJpb3JpdHlMZXZlbCA9IHByZXZpb3VzUHJpb3JpdHlMZXZlbDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICAgIFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gJiZcbiAgICAgIFwiZnVuY3Rpb25cIiA9PT1cbiAgICAgICAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcCAmJlxuICAgICAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLnJlZ2lzdGVySW50ZXJuYWxNb2R1bGVTdG9wKEVycm9yKCkpO1xuICB9KSgpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3NjaGVkdWxlci5wcm9kdWN0aW9uLmpzJyk7XG59IGVsc2Uge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3NjaGVkdWxlci5kZXZlbG9wbWVudC5qcycpO1xufVxuIiwiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QtZG9tLWNsaWVudC5kZXZlbG9wbWVudC5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuLypcbiBNb2Rlcm5penIgMy4wLjBwcmUgKEN1c3RvbSBCdWlsZCkgfCBNSVRcbiovXG5cInVzZSBzdHJpY3RcIjtcblwicHJvZHVjdGlvblwiICE9PSBwcm9jZXNzLmVudi5OT0RFX0VOViAmJlxuICAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIGZpbmRIb29rKGZpYmVyLCBpZCkge1xuICAgICAgZm9yIChmaWJlciA9IGZpYmVyLm1lbW9pemVkU3RhdGU7IG51bGwgIT09IGZpYmVyICYmIDAgPCBpZDsgKVxuICAgICAgICAoZmliZXIgPSBmaWJlci5uZXh0KSwgaWQtLTtcbiAgICAgIHJldHVybiBmaWJlcjtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29weVdpdGhTZXRJbXBsKG9iaiwgcGF0aCwgaW5kZXgsIHZhbHVlKSB7XG4gICAgICBpZiAoaW5kZXggPj0gcGF0aC5sZW5ndGgpIHJldHVybiB2YWx1ZTtcbiAgICAgIHZhciBrZXkgPSBwYXRoW2luZGV4XSxcbiAgICAgICAgdXBkYXRlZCA9IGlzQXJyYXlJbXBsKG9iaikgPyBvYmouc2xpY2UoKSA6IGFzc2lnbih7fSwgb2JqKTtcbiAgICAgIHVwZGF0ZWRba2V5XSA9IGNvcHlXaXRoU2V0SW1wbChvYmpba2V5XSwgcGF0aCwgaW5kZXggKyAxLCB2YWx1ZSk7XG4gICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29weVdpdGhSZW5hbWUob2JqLCBvbGRQYXRoLCBuZXdQYXRoKSB7XG4gICAgICBpZiAob2xkUGF0aC5sZW5ndGggIT09IG5ld1BhdGgubGVuZ3RoKVxuICAgICAgICBjb25zb2xlLndhcm4oXCJjb3B5V2l0aFJlbmFtZSgpIGV4cGVjdHMgcGF0aHMgb2YgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3UGF0aC5sZW5ndGggLSAxOyBpKyspXG4gICAgICAgICAgaWYgKG9sZFBhdGhbaV0gIT09IG5ld1BhdGhbaV0pIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgXCJjb3B5V2l0aFJlbmFtZSgpIGV4cGVjdHMgcGF0aHMgdG8gYmUgdGhlIHNhbWUgZXhjZXB0IGZvciB0aGUgZGVlcGVzdCBrZXlcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb3B5V2l0aFJlbmFtZUltcGwob2JqLCBvbGRQYXRoLCBuZXdQYXRoLCAwKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gY29weVdpdGhSZW5hbWVJbXBsKG9iaiwgb2xkUGF0aCwgbmV3UGF0aCwgaW5kZXgpIHtcbiAgICAgIHZhciBvbGRLZXkgPSBvbGRQYXRoW2luZGV4XSxcbiAgICAgICAgdXBkYXRlZCA9IGlzQXJyYXlJbXBsKG9iaikgPyBvYmouc2xpY2UoKSA6IGFzc2lnbih7fSwgb2JqKTtcbiAgICAgIGluZGV4ICsgMSA9PT0gb2xkUGF0aC5sZW5ndGhcbiAgICAgICAgPyAoKHVwZGF0ZWRbbmV3UGF0aFtpbmRleF1dID0gdXBkYXRlZFtvbGRLZXldKSxcbiAgICAgICAgICBpc0FycmF5SW1wbCh1cGRhdGVkKVxuICAgICAgICAgICAgPyB1cGRhdGVkLnNwbGljZShvbGRLZXksIDEpXG4gICAgICAgICAgICA6IGRlbGV0ZSB1cGRhdGVkW29sZEtleV0pXG4gICAgICAgIDogKHVwZGF0ZWRbb2xkS2V5XSA9IGNvcHlXaXRoUmVuYW1lSW1wbChcbiAgICAgICAgICAgIG9ialtvbGRLZXldLFxuICAgICAgICAgICAgb2xkUGF0aCxcbiAgICAgICAgICAgIG5ld1BhdGgsXG4gICAgICAgICAgICBpbmRleCArIDFcbiAgICAgICAgICApKTtcbiAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb3B5V2l0aERlbGV0ZUltcGwob2JqLCBwYXRoLCBpbmRleCkge1xuICAgICAgdmFyIGtleSA9IHBhdGhbaW5kZXhdLFxuICAgICAgICB1cGRhdGVkID0gaXNBcnJheUltcGwob2JqKSA/IG9iai5zbGljZSgpIDogYXNzaWduKHt9LCBvYmopO1xuICAgICAgaWYgKGluZGV4ICsgMSA9PT0gcGF0aC5sZW5ndGgpXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgaXNBcnJheUltcGwodXBkYXRlZCkgPyB1cGRhdGVkLnNwbGljZShrZXksIDEpIDogZGVsZXRlIHVwZGF0ZWRba2V5XSxcbiAgICAgICAgICB1cGRhdGVkXG4gICAgICAgICk7XG4gICAgICB1cGRhdGVkW2tleV0gPSBjb3B5V2l0aERlbGV0ZUltcGwob2JqW2tleV0sIHBhdGgsIGluZGV4ICsgMSk7XG4gICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2hvdWxkU3VzcGVuZEltcGwoKSB7XG4gICAgICByZXR1cm4gITE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNob3VsZEVycm9ySW1wbCgpIHtcbiAgICAgIHJldHVybi
15852BudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBcIkRvIG5vdCBjYWxsIEhvb2tzIGluc2lkZSB1c2VFZmZlY3QoLi4uKSwgdXNlTWVtbyguLi4pLCBvciBvdGhlciBidWlsdC1pbiBIb29rcy4gWW91IGNhbiBvbmx5IGNhbGwgSG9va3MgYXQgdGhlIHRvcCBsZXZlbCBvZiB5b3VyIFJlYWN0IGZ1bmN0aW9uLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvcnVsZXMtb2YtaG9va3NcIlxuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gd2FybkludmFsaWRDb250ZXh0QWNjZXNzKCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgXCJDb250ZXh0IGNhbiBvbmx5IGJlIHJlYWQgd2hpbGUgUmVhY3QgaXMgcmVuZGVyaW5nLiBJbiBjbGFzc2VzLCB5b3UgY2FuIHJlYWQgaXQgaW4gdGhlIHJlbmRlciBtZXRob2Qgb3IgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiBJbiBmdW5jdGlvbiBjb21wb25lbnRzLCB5b3UgY2FuIHJlYWQgaXQgZGlyZWN0bHkgaW4gdGhlIGZ1bmN0aW9uIGJvZHksIGJ1dCBub3QgaW5zaWRlIEhvb2tzIGxpa2UgdXNlUmVkdWNlcigpIG9yIHVzZU1lbW8oKS5cIlxuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbm9vcCgpIHt9XG4gICAgZnVuY3Rpb24gd2FybkZvck1pc3NpbmdLZXkoKSB7fVxuICAgIGZ1bmN0aW9uIHNldFRvU29ydGVkU3RyaW5nKHNldCkge1xuICAgICAgdmFyIGFycmF5ID0gW107XG4gICAgICBzZXQuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgYXJyYXkucHVzaCh2YWx1ZSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhcnJheS5zb3J0KCkuam9pbihcIiwgXCIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjcmVhdGVGaWJlcih0YWcsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKSB7XG4gICAgICByZXR1cm4gbmV3IEZpYmVyTm9kZSh0YWcsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2NoZWR1bGVSb290KHJvb3QsIGVsZW1lbnQpIHtcbiAgICAgIHJvb3QuY29udGV4dCA9PT0gZW1wdHlDb250ZXh0T2JqZWN0ICYmXG4gICAgICAgICh1cGRhdGVDb250YWluZXJJbXBsKHJvb3QuY3VycmVudCwgMiwgZWxlbWVudCwgcm9vdCwgbnVsbCwgbnVsbCksXG4gICAgICAgIGZsdXNoU3luY1dvcmskMSgpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2NoZWR1bGVSZWZyZXNoKHJvb3QsIHVwZGF0ZSkge1xuICAgICAgaWYgKG51bGwgIT09IHJlc29sdmVGYW1pbHkpIHtcbiAgICAgICAgdmFyIHN0YWxlRmFtaWxpZXMgPSB1cGRhdGUuc3RhbGVGYW1pbGllcztcbiAgICAgICAgdXBkYXRlID0gdXBkYXRlLnVwZGF0ZWRGYW1pbGllcztcbiAgICAgICAgZmx1c2hQZW5kaW5nRWZmZWN0cygpO1xuICAgICAgICBzY2hlZHVsZUZpYmVyc1dpdGhGYW1pbGllc1JlY3Vyc2l2ZWx5KFxuICAgICAgICAgIHJvb3QuY3VycmVudCxcbiAgICAgICAgICB1cGRhdGUsXG4gICAgICAgICAgc3RhbGVGYW1pbGllc1xuICAgICAgICApO1xuICAgICAgICBmbHVzaFN5bmNXb3JrJDEoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gc2V0UmVmcmVzaEhhbmRsZXIoaGFuZGxlcikge1xuICAgICAgcmVzb2x2ZUZhbWlseSA9IGhhbmRsZXI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzVmFsaWRDb250YWluZXIobm9kZSkge1xuICAgICAgcmV0dXJuICEoXG4gICAgICAgICFub2RlIHx8XG4gICAgICAgICgxICE9PSBub2RlLm5vZGVUeXBlICYmIDkgIT09IG5vZGUubm9kZVR5cGUgJiYgMTEgIT09IG5vZGUubm9kZVR5cGUpXG4gICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXROZWFyZXN0TW91bnRlZEZpYmVyKGZpYmVyKSB7XG4gICAgICBmb3IgKHZhciBub2RlID0gZmliZXIsIG5leHROb2RlID0gbm9kZTsgbmV4dE5vZGUgJiYgIW5leHROb2RlLmFsdGVybmF0ZTsgKVxuICAgICAgICAobm9kZSA9IG5leHROb2RlKSxcbiAgICAgICAgICAwICE9PSAobm9kZS5mbGFncyAmIDQwOTgpICYmIChmaWJlciA9IG5vZGUucmV0dXJuKSxcbiAgICAgICAgICAobmV4dE5vZGUgPSBub2RlLnJldHVybik7XG4gICAgICBmb3IgKDsgbm9kZS5yZXR1cm47ICkgbm9kZSA9IG5vZGUucmV0dXJuO1xuICAgICAgcmV0dXJuIDMgPT09IG5vZGUudGFnID8gZmliZXIgOiBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRTdXNwZW5zZUluc3RhbmNlRnJvbUZpYmVyKGZpYmVyKSB7XG4gICAgICBpZiAoMTMgPT09IGZpYmVyLnRhZykge1xuICAgICAgICB2Y
15852XIgc3VzcGVuc2VTdGF0ZSA9IGZpYmVyLm1lbW9pemVkU3RhdGU7XG4gICAgICAgIG51bGwgPT09IHN1c3BlbnNlU3RhdGUgJiZcbiAgICAgICAgICAoKGZpYmVyID0gZmliZXIuYWx0ZXJuYXRlKSxcbiAgICAgICAgICBudWxsICE9PSBmaWJlciAmJiAoc3VzcGVuc2VTdGF0ZSA9IGZpYmVyLm1lbW9pemVkU3RhdGUpKTtcbiAgICAgICAgaWYgKG51bGwgIT09IHN1c3BlbnNlU3RhdGUpIHJldHVybiBzdXNwZW5zZVN0YXRlLmRlaHlkcmF0ZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0QWN0aXZpdHlJbnN0YW5jZUZyb21GaWJlcihmaWJlcikge1xuICAgICAgaWYgKDMxID09PSBmaWJlci50YWcpIHtcbiAgICAgICAgdmFyIGFjdGl2aXR5U3RhdGUgPSBmaWJlci5tZW1vaXplZFN0YXRlO1xuICAgICAgICBudWxsID09PSBhY3Rpdml0eVN0YXRlICYmXG4gICAgICAgICAgKChmaWJlciA9IGZpYmVyLmFsdGVybmF0ZSksXG4gICAgICAgICAgbnVsbCAhPT0gZmliZXIgJiYgKGFjdGl2aXR5U3RhdGUgPSBmaWJlci5tZW1vaXplZFN0YXRlKSk7XG4gICAgICAgIGlmIChudWxsICE9PSBhY3Rpdml0eVN0YXRlKSByZXR1cm4gYWN0aXZpdHlTdGF0ZS5kZWh5ZHJhdGVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFzc2VydElzTW91bnRlZChmaWJlcikge1xuICAgICAgaWYgKGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpICE9PSBmaWJlcilcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuXCIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBmaW5kQ3VycmVudEZpYmVyVXNpbmdTbG93UGF0aChmaWJlcikge1xuICAgICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcbiAgICAgIGlmICghYWx0ZXJuYXRlKSB7XG4gICAgICAgIGFsdGVybmF0ZSA9IGdldE5lYXJlc3RNb3VudGVkRmliZXIoZmliZXIpO1xuICAgICAgICBpZiAobnVsbCA9PT0gYWx0ZXJuYXRlKVxuICAgICAgICAgIHRocm93IEVycm9yKFwiVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LlwiKTtcbiAgICAgICAgcmV0dXJuIGFsdGVybmF0ZSAhPT0gZmliZXIgPyBudWxsIDogZmliZXI7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBhID0gZmliZXIsIGIgPSBhbHRlcm5hdGU7IDsgKSB7XG4gICAgICAgIHZhciBwYXJlbnRBID0gYS5yZXR1cm47XG4gICAgICAgIGlmIChudWxsID09PSBwYXJlbnRBKSBicmVhaztcbiAgICAgICAgdmFyIHBhcmVudEIgPSBwYXJlbnRBLmFsdGVybmF0ZTtcbiAgICAgICAgaWYgKG51bGwgPT09IHBhcmVudEIpIHtcbiAgICAgICAgICBiID0gcGFyZW50QS5yZXR1cm47XG4gICAgICAgICAgaWYgKG51bGwgIT09IGIpIHtcbiAgICAgICAgICAgIGEgPSBiO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJlbnRBLmNoaWxkID09PSBwYXJlbnRCLmNoaWxkKSB7XG4gICAgICAgICAgZm9yIChwYXJlbnRCID0gcGFyZW50QS5jaGlsZDsgcGFyZW50QjsgKSB7XG4gICAgICAgICAgICBpZiAocGFyZW50QiA9PT0gYSkgcmV0dXJuIGFzc2VydElzTW91bnRlZChwYXJlbnRBKSwgZmliZXI7XG4gICAgICAgICAgICBpZiAocGFyZW50QiA9PT0gYikgcmV0dXJuIGFzc2VydElzTW91bnRlZChwYXJlbnRBKSwgYWx0ZXJuYXRlO1xuICAgICAgICAgICAgcGFyZW50QiA9IHBhcmVudEIuc2libGluZztcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXCJVbmFibGUgdG8gZmluZCBub2RlIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhLnJldHVybiAhPT0gYi5yZXR1cm4pIChhID0gcGFyZW50QSksIChiID0gcGFyZW50Qik7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGZvciAodmFyIGRpZEZpbmRDaGlsZCA9ICExLCBfY2hpbGQgPSBwYXJlbnRBLmNoaWxkOyBfY2hpbGQ7ICkge1xuICAgICAgICAgICAgaWYgKF9jaGlsZCA9PT0gYSkge1xuICAgICAgICAgICAgICBkaWRGaW5kQ2hpbGQgPSAhMDtcbiAgICAgICAgICAgICAgYSA9IHBhcmVudEE7XG4gICAgICAgICAgICAgIGIgPSBwYXJlbnRCO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChfY2hpbGQgPT09IGIpIHtcbiAgICAgICAgICAgICAgZGlkRmluZENoaWxkID0gITA7XG4gICAgICAgICAgICAgIGIgPSBwYXJlbnRBO1xuICAgICAgICAgICAgICBhID0gcGFyZW50QjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfY2hpbGQgPSBfY2hpbGQuc2libGluZztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFkaWRGaW5kQ2hpbGQpIHtcbiAgICAgICAgICAgIGZvciAoX2NoaWxkID0gcGFyZW50Qi5jaGlsZDsgX2NoaWxkOyApIHtcbiAgICAgICAgICAgICAgaWYgKF9jaGlsZCA9PT0gYSkge1xuICAgICAgICAgICAgICAgIGRpZEZpbmRDaGlsZCA9ICEwO1xuICAgICAgICAgICAgICAgIGEgPSBwYXJlbnRCO1xuICAgICAgICAgICAgICAgIGIgPSBwYXJlbnRBO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChfY2hpbGQgPT09IGIpIHtcbiAgICAgICAgICAgICAgICBkaWRGaW5kQ2hpbGQgPSAhMDtcbiAgICAgICAgICAgICAgICBiID0gcGFyZW50QjtcbiAgICAgICAgICAgICAgICBhID0gcGFyZW50QTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBfY2hpbGQgPSBfY2hpbGQuc2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZGlkRmluZENoaWxkKVxuICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgICAgICBcIkNoaWxkIHdhcyBub3QgZm91bmQgaW4gZWl0aGVyIHBhcmVudCBzZXQuIFRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIFJlYWN0IHJlbGF0ZWQgdG8gdGhlIHJldHVybi
15852Bwb2ludGVyLiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYS5hbHRlcm5hdGUgIT09IGIpXG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICBcIlJldHVybiBmaWJlcnMgc2hvdWxkIGFsd2F5cyBiZSBlYWNoIG90aGVycycgYWx0ZXJuYXRlcy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIlxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoMyAhPT0gYS50YWcpXG4gICAgICAgIHRocm93IEVycm9yKFwiVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LlwiKTtcbiAgICAgIHJldHVybiBhLnN0YXRlTm9kZS5jdXJyZW50ID09PSBhID8gZmliZXIgOiBhbHRlcm5hdGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZpbmRDdXJyZW50SG9zdEZpYmVySW1wbChub2RlKSB7XG4gICAgICB2YXIgdGFnID0gbm9kZS50YWc7XG4gICAgICBpZiAoNSA9PT0gdGFnIHx8IDI2ID09PSB0YWcgfHwgMjcgPT09IHRhZyB8fCA2ID09PSB0YWcpIHJldHVybiBub2RlO1xuICAgICAgZm9yIChub2RlID0gbm9kZS5jaGlsZDsgbnVsbCAhPT0gbm9kZTsgKSB7XG4gICAgICAgIHRhZyA9IGZpbmRDdXJyZW50SG9zdEZpYmVySW1wbChub2RlKTtcbiAgICAgICAgaWYgKG51bGwgIT09IHRhZykgcmV0dXJuIHRhZztcbiAgICAgICAgbm9kZSA9IG5vZGUuc2libGluZztcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiB0cmF2ZXJzZUZyYWdtZW50SW5zdGFuY2VzQW5kVGV4dEluc3RhbmNlcyhcbiAgICAgIGZyYWdtZW50RmliZXIsXG4gICAgICBmbixcbiAgICAgIGEsXG4gICAgICBiLFxuICAgICAgY1xuICAgICkge1xuICAgICAgdHJhdmVyc2VWaXNpYmxlSW5zdGFuY2VzQW5kVGV4dEluc3RhbmNlcyhcbiAgICAgICAgZnJhZ21lbnRGaWJlci5jaGlsZCxcbiAgICAgICAgITEsXG4gICAgICAgIGZuLFxuICAgICAgICBhLFxuICAgICAgICBiLFxuICAgICAgICBjXG4gICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiB0cmF2ZXJzZVZpc2libGVJbnN0YW5jZXNBbmRUZXh0SW5zdGFuY2VzKFxuICAgICAgY2hpbGQsXG4gICAgICBzZWFyY2hXaXRoaW5Ib3N0cyxcbiAgICAgIGZuLFxuICAgICAgYSxcbiAgICAgIGIsXG4gICAgICBjXG4gICAgKSB7XG4gICAgICBmb3IgKDsgbnVsbCAhPT0gY2hpbGQ7ICkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKCg1ID09PSBjaGlsZC50YWcgfHwgMjcgPT09IGNoaWxkLnRhZyB8fCA2ID09PSBjaGlsZC50YWcpICYmXG4gICAgICAgICAgICBmbihjaGlsZCwgYSwgYiwgYykpIHx8XG4gICAgICAgICAgKCgyMiAhPT0gY2hpbGQudGFnIHx8IG51bGwgPT09IGNoaWxkLm1lbW9pemVkU3RhdGUpICYmXG4gICAgICAgICAgICAoc2VhcmNoV2l0aGluSG9zdHMgfHwgKDUgIT09IGNoaWxkLnRhZyAmJiAyNyAhPT0gY2hpbGQudGFnKSkgJiZcbiAgICAgICAgICAgIHRyYXZlcnNlVmlzaWJsZUluc3RhbmNlc0FuZFRleHRJbnN0YW5jZXMoXG4gICAgICAgICAgICAgIGNoaWxkLmNoaWxkLFxuICAgICAgICAgICAgICBzZWFyY2hXaXRoaW5Ib3N0cyxcbiAgICAgICAgICAgICAgZm4sXG4gICAgICAgICAgICAgIGEsXG4gICAgICAgICAgICAgIGIsXG4gICAgICAgICAgICAgIGNcbiAgICAgICAgICAgICkpXG4gICAgICAgIClcbiAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICAgIH1cbiAgICAgIHJldHVybiAhMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0RnJhZ21lbnRQYXJlbnRJbnN0YW5jZU9yQ29udGFpbmVyRmliZXIoZmliZXIpIHtcbiAgICAgIGZvciAoZmliZXIgPSBmaWJlci5yZXR1cm47IG51bGwgIT09IGZpYmVyOyApIHtcbiAgICAgICAgaWYgKDMgPT09IGZpYmVyLnRhZyB8fCA1ID09PSBmaWJlci50YWcgfHwgMjcgPT09IGZpYmVyLnRhZylcbiAgICAgICAgICByZXR1cm4gZmliZXI7XG4gICAgICAgIGZpYmVyID0gZmliZXIucmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZpYmVySXNQb3J0YWxlZEludG9Ib3N0KGZpYmVyKSB7XG4gICAgICB2Y
15852XIgZm91bmRQb3J0YWxQYXJlbnQgPSAhMTtcbiAgICAgIGZvciAoZmliZXIgPSBmaWJlci5yZXR1cm47IG51bGwgIT09IGZpYmVyOyApIHtcbiAgICAgICAgNCA9PT0gZmliZXIudGFnICYmIChmb3VuZFBvcnRhbFBhcmVudCA9ICEwKTtcbiAgICAgICAgaWYgKDMgPT09IGZpYmVyLnRhZyB8fCA1ID09PSBmaWJlci50YWcgfHwgMjcgPT09IGZpYmVyLnRhZykgYnJlYWs7XG4gICAgICAgIGZpYmVyID0gZmliZXIucmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZvdW5kUG9ydGFsUGFyZW50O1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRGcmFnbWVudEluc3RhbmNlT3JUZXh0SW5zdGFuY2VTaWJsaW5ncyhmaWJlcikge1xuICAgICAgdmFyIHJlc3VsdCA9IFtudWxsLCBudWxsXSxcbiAgICAgICAgcGFyZW50SG9zdEZpYmVyID0gZ2V0RnJhZ21lbnRQYXJlbnRJbnN0YW5jZU9yQ29udGFpbmVyRmliZXIoZmliZXIpO1xuICAgICAgaWYgKG51bGwgPT09IHBhcmVudEhvc3RGaWJlcikgcmV0dXJuIHJlc3VsdDtcbiAgICAgIGZpbmRGcmFnbWVudEluc3RhbmNlT3JUZXh0SW5zdGFuY2VTaWJsaW5ncyhcbiAgICAgICAgcmVzdWx0LFxuICAgICAgICBmaWJlcixcbiAgICAgICAgcGFyZW50SG9zdEZpYmVyLmNoaWxkLFxuICAgICAgICB7IGZvdW5kU2VsZjogITEgfVxuICAgICAgKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZpbmRGcmFnbWVudEluc3RhbmNlT3JUZXh0SW5zdGFuY2VTaWJsaW5ncyhcbiAgICAgIHJlc3VsdCxcbiAgICAgIHNlbGYsXG4gICAgICBjaGlsZCxcbiAgICAgIHN0YXRlXG4gICAgKSB7XG4gICAgICBmb3IgKDsgbnVsbCAhPT0gY2hpbGQ7ICkge1xuICAgICAgICBpZiAoY2hpbGQgPT09IHNlbGYpIHN0YXRlLmZvdW5kU2VsZiA9ICEwO1xuICAgICAgICBlbHNlIGlmICg1ID09PSBjaGlsZC50YWcgfHwgMjcgPT09IGNoaWxkLnRhZyB8fCA2ID09PSBjaGlsZC50YWcpIHtcbiAgICAgICAgICBpZiAoc3RhdGUuZm91bmRTZWxmKSByZXR1cm4gKHJlc3VsdFsxXSA9IGNoaWxkKSwgITA7XG4gICAgICAgICAgcmVzdWx0WzBdID0gY2hpbGQ7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgKDIyICE9PSBjaGlsZC50YWcgfHwgbnVsbCA9PT0gY2hpbGQubWVtb2l6ZWRTdGF0ZSkgJiZcbiAgICAgICAgICBmaW5kRnJhZ21lbnRJbnN0YW5jZU9yVGV4dEluc3RhbmNlU2libGluZ3MoXG4gICAgICAgICAgICByZXN1bHQsXG4gICAgICAgICAgICBzZWxmLFxuICAgICAgICAgICAgY2hpbGQuY2hpbGQsXG4gICAgICAgICAgICBzdGF0ZVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgY2hpbGQgPSBjaGlsZC5zaWJsaW5nO1xuICAgICAgfVxuICAgICAgcmV0dXJuICExO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRJbnN0YW5jZUZyb21Ib3N0RmliZXIoZmliZXIpIHtcbiAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgY2FzZSAyNzpcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIHJldHVybiBmaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICByZXR1cm4gZmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXCJFeHBlY3RlZCB0byBmaW5kIGEgaG9zdCBub2RlLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LlwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaXNGaWJlclByZWNlZGluZ0NoZWNrKGNoaWxkLCB0YXJnZXQsIGJvdW5kYXJ5KSB7XG4gICAgICByZXR1cm4gY2hpbGQgPT09IGJvdW5kYXJ5XG4gICAgICAgID8gITBcbiAgICAgICAgOiBjaGlsZCA9PT0gdGFyZ2V0XG4gICAgICAgICAgPyAoKHNlYXJjaFRhcmdldCA9IGNoaWxkKSwgITApXG4gICAgICAgICAgOiAhMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaXNGaWJlckZvbGxvd2luZ0NoZWNrKGNoaWxkLCB0YXJnZXQsIGJvdW5kYXJ5KSB7XG4gICAgICByZXR1cm4gY2hpbGQgPT09IGJvdW5kYXJ5XG4gICAgICAgID8gKChzZWFyY2hCb3VuZGFyeSA9IGNoaWxkKSwgITEpXG4gICAgICAgIDogY2hpbGQgPT09IHRhcmdldFxuICAgICAgICAgID8gKG51bGwgIT09IHNlYXJjaEJvdW5kYXJ5ICYmIChzZWFyY2hUYXJnZXQgPSBjaGlsZCksICEwKVxuICAgICAgICAgIDogITE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldFBhcmVudEZvckZyYWdtZW50QW5jZXN0b3JzKGluc3QpIHtcbiAgICAgIGlmIChudWxsID09PSBpbnN0KSByZXR1cm4gbnVsbDtcbiAgICAgIGRvIGluc3QgPSBudWxsID09PSBpbnN0ID8gbnVsbCA6IGluc3QucmV0dXJuO1xuICAgICAgd2hpbGUgKGluc3QgJiYgNSAhPT0gaW5zdC50YWcgJiYgMjcgIT09IGluc3QudGFnICYmIDMgIT09IGluc3QudGFnKTtcbiAgICAgIHJldHVybiBpbnN0ID8gaW5zdCA6IG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldExvd2VzdENvbW1vbkFuY2VzdG9yKGluc3RBLCBpbnN0QiwgZ2V0UGFyZW50KSB7XG4gICAgICBmb3IgKHZhciBkZXB0aEEgPSAwLCB0ZW1wQSA9IGluc3RBOyB0ZW1wQTsgdGVtcEEgPSBnZXRQYXJlbnQodGVtcEEpKVxuICAgICAgICBkZXB0aEErKztcbiAgICAgIHRlbXBBID0gMDtcbiAgICAgIGZvciAodmFyIHRlbXBCID0gaW5zdEI7IHRlbXBCOyB0ZW1wQiA9IGdldFBhcmVudCh0ZW1wQikpIHRlbXBBKys7XG4gICAgICBmb3IgKDsgMCA8IGRlcHRoQSAtIHRlbXBBOyApIChpbnN0QSA9IGdldFBhcmVudChpbnN0
15852QSkpLCBkZXB0aEEtLTtcbiAgICAgIGZvciAoOyAwIDwgdGVtcEEgLSBkZXB0aEE7ICkgKGluc3RCID0gZ2V0UGFyZW50KGluc3RCKSksIHRlbXBBLS07XG4gICAgICBmb3IgKDsgZGVwdGhBLS07ICkge1xuICAgICAgICBpZiAoaW5zdEEgPT09IGluc3RCIHx8IChudWxsICE9PSBpbnN0QiAmJiBpbnN0QSA9PT0gaW5zdEIuYWx0ZXJuYXRlKSlcbiAgICAgICAgICByZXR1cm4gaW5zdEE7XG4gICAgICAgIGluc3RBID0gZ2V0UGFyZW50KGluc3RBKTtcbiAgICAgICAgaW5zdEIgPSBnZXRQYXJlbnQoaW5zdEIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICAgICAgaWYgKG51bGwgPT09IG1heWJlSXRlcmFibGUgfHwgXCJvYmplY3RcIiAhPT0gdHlwZW9mIG1heWJlSXRlcmFibGUpXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgbWF5YmVJdGVyYWJsZSA9XG4gICAgICAgIChNQVlCRV9JVEVSQVRPUl9TWU1CT0wgJiYgbWF5YmVJdGVyYWJsZVtNQVlCRV9JVEVSQVRPUl9TWU1CT0xdKSB8fFxuICAgICAgICBtYXliZUl0ZXJhYmxlW1wiQEBpdGVyYXRvclwiXTtcbiAgICAgIHJldHVybiBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBtYXliZUl0ZXJhYmxlID8gbWF5YmVJdGVyYWJsZSA6IG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKSB7XG4gICAgICBpZiAobnVsbCA9PSB0eXBlKSByZXR1cm4gbnVsbDtcbiAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiB0eXBlKVxuICAgICAgICByZXR1cm4gdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ0xJRU5UX1JFRkVSRU5DRVxuICAgICAgICAgID8gbnVsbFxuICAgICAgICAgIDogdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgbnVsbDtcbiAgICAgIGlmIChcInN0cmluZ1wiID09PSB0eXBlb2YgdHlwZSkgcmV0dXJuIHR5cGU7XG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgICAgIHJldHVybiBcIkZyYWdtZW50XCI7XG4gICAgICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgICAgICByZXR1cm4gXCJQcm9maWxlclwiO1xuICAgICAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIFwiU3RyaWN0TW9kZVwiO1xuICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIFwiU3VzcGVuc2VcIjtcbiAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIFwiU3VzcGVuc2VMaXN0XCI7XG4gICAgICAgIGNhc2UgUkVBQ1RfQUNUSVZJVFlfVFlQRTpcbiAgICAgICAgICByZXR1cm4gXCJBY3Rpdml0eVwiO1xuICAgICAgICBjYXNlIFJFQUNUX1ZJRVdfVFJBTlNJVElPTl9UWVBFOlxuICAgICAgICAgIHJldHVybiBcIlZpZXdUcmFuc2l0aW9uXCI7XG4gICAgICB9XG4gICAgICBpZiAoXCJvYmplY3RcIiA9PT0gdHlwZW9mIHR5cGUpXG4gICAgICAgIHN3aXRjaCAoXG4gICAgICAgICAgKFwibnVtYmVyXCIgPT09IHR5cGVvZiB0eXBlLnRhZyAmJlxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCJSZWNlaXZlZCBhbiB1bmV4cGVjdGVkIG9iamVjdCBpbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoKS4gVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiXG4gICAgICAgICAgICApLFxuICAgICAgICAgIHR5cGUuJCR0eXBlb2YpXG4gICAgICAgICkge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gXCJQb3J0YWxcIjtcbiAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IFwiQ29udGV4dFwiO1xuICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OU1VNRVJfVFlQRTpcbiAgICAgICAgICAgIHJldHVybiAodHlwZS5fY29udGV4dC5kaXNwbGF5TmFtZSB8fCBcIkNvbnRleHRcIikgKyBcIi5Db25zdW1lclwiO1xuICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICAgIHZhciBpbm5lclR5cGUgPSB0eXBlLnJlbmRlcjtcbiAgICAgICAgICAgIHR5cGUgPSB0eXBlLmRpc3BsYXlOYW1lO1xuICAgICAgICAgICAgdHlwZSB8fFxuICAgICAgICAgICAgICAoKHR5cGUgPSBpbm5lclR5cGUuZGlzcGxheU5hbWUgfHwgaW5uZXJUeXBlLm5hbWUgfHwgXCJcIiksXG4gICAgICAgICAgICAgICh0eXBlID0gXCJcIiAhPT0gdHlwZSA/IFwiRm9yd2FyZFJlZihcIiArIHR5cGUgKyBcIilcIiA6IFwiRm9yd2FyZFJlZlwiKSk7XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIChpbm5lclR5cGUgPSB0eXBlLmRpc3BsYXlOYW1lIHx8IG51bGwpLFxuICAgICAgICAgICAgICBudWxsICE9PSBpbm5lclR5cGVcbiAgICAgICAgICAgICAgICA/IGlubmVyVHlwZVxuICAgICAgICAgICAgICAgIDogZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUudHlwZSkgfHwgXCJNZW1vXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICBpbm5lclR5cGUgPSB0eXBlLl9wYXlsb2FkO1xuICAgICAgICAgICAgdHlwZSA9IHR5cGUuX2luaXQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUoaW5uZXJUeXBlKSk7XG4gICAgICAgICAgICB9IGNhdGNoICh4KSB7fVxuICAgICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0Q29tcG9uZW50TmFtZUZyb21Pd25lcihvd25lcikge1xuICAgICAgcmV0dXJuIFwibnVtYmVyXCIgPT09IHR5cGVvZiBvd25lci50YWdcbiAgICAgICAgPyBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKG93bmVyKVxuICAgICAgICA6IFwic3RyaW5nXCIgPT09IHR5cGVvZiBvd25lci5uYW1lXG4gICAgICAgICAgPyBvd25lci5uYW1lXG4gICAgICAgICAgOiBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB7XG4gICAgICB2Y
15852XIgdHlwZSA9IGZpYmVyLnR5cGU7XG4gICAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgICBjYXNlIDMxOlxuICAgICAgICAgIHJldHVybiBcIkFjdGl2aXR5XCI7XG4gICAgICAgIGNhc2UgMjQ6XG4gICAgICAgICAgcmV0dXJuIFwiQ2FjaGVcIjtcbiAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIHJldHVybiAodHlwZS5fY29udGV4dC5kaXNwbGF5TmFtZSB8fCBcIkNvbnRleHRcIikgKyBcIi5Db25zdW1lclwiO1xuICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IFwiQ29udGV4dFwiO1xuICAgICAgICBjYXNlIDE4OlxuICAgICAgICAgIHJldHVybiBcIkRlaHlkcmF0ZWRGcmFnbWVudFwiO1xuICAgICAgICBjYXNlIDExOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoZmliZXIgPSB0eXBlLnJlbmRlciksXG4gICAgICAgICAgICAoZmliZXIgPSBmaWJlci5kaXNwbGF5TmFtZSB8fCBmaWJlci5uYW1lIHx8IFwiXCIpLFxuICAgICAgICAgICAgdHlwZS5kaXNwbGF5TmFtZSB8fFxuICAgICAgICAgICAgICAoXCJcIiAhPT0gZmliZXIgPyBcIkZvcndhcmRSZWYoXCIgKyBmaWJlciArIFwiKVwiIDogXCJGb3J3YXJkUmVmXCIpXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgIHJldHVybiBcIkZyYWdtZW50XCI7XG4gICAgICAgIGNhc2UgMjY6XG4gICAgICAgIGNhc2UgMjc6XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHJldHVybiBcIlBvcnRhbFwiO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgcmV0dXJuIFwiUm9vdFwiO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgcmV0dXJuIFwiVGV4dFwiO1xuICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSk7XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICByZXR1cm4gdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA/IFwiU3RyaWN0TW9kZVwiIDogXCJNb2RlXCI7XG4gICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgaWYgKG51bGwgIT09IGZpYmVyLnJldHVybilcbiAgICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyLnJldHVybik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgcmV0dXJuIFwiUHJvZmlsZXJcIjtcbiAgICAgICAgY2FzZSAyMTpcbiAgICAgICAgICByZXR1cm4gXCJTY29wZVwiO1xuICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgIHJldHVybiBcIlN1c3BlbnNlXCI7XG4gICAgICAgIGNhc2UgMTk6XG4gICAgICAgICAgcmV0dXJuIFwiU3VzcGVuc2VMaXN0XCI7XG4gICAgICAgIGNhc2UgMjU6XG4gICAgICAgICAgcmV0dXJuIFwiVHJhY2luZ01hcmtlclwiO1xuICAgICAgICBjYXNlIDMwOlxuICAgICAgICAgIHJldHVybiBcIlZpZXdUcmFuc2l0aW9uXCI7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICBjYXNlIDE0OlxuICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiB0eXBlKVxuICAgICAgICAgICAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IG51bGw7XG4gICAgICAgICAgaWYgKFwic3RyaW5nXCIgPT09IHR5cGVvZiB0eXBlKSByZXR1cm4gdHlwZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOTpcbiAgICAgICAgICB0eXBlID0gZmliZXIuX2RlYnVnSW5mbztcbiAgICAgICAgICBpZiAobnVsbCAhPSB0eXBlKVxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IHR5cGUubGVuZ3RoIC0gMTsgMCA8PSBpOyBpLS0pXG4gICAgICAgICAgICAgIGlmIChcInN0cmluZ1wiID09PSB0eXBlb2YgdHlwZVtpXS5uYW1lKSByZXR1cm4gdHlwZVtpXS5uYW1lO1xuICAgICAgICAgIGlmIChudWxsICE9PSBmaWJlci5yZXR1cm4pXG4gICAgICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlci5yZXR1cm4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZUN1cnNvcihkZWZh
15852dWx0VmFsdWUpIHtcbiAgICAgIHJldHVybiB7IGN1cnJlbnQ6IGRlZmF1bHRWYWx1ZSB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBwb3AoY3Vyc29yLCBmaWJlcikge1xuICAgICAgMCA+IGluZGV4JGpzY29tcCQwXG4gICAgICAgID8gY29uc29sZS5lcnJvcihcIlVuZXhwZWN0ZWQgcG9wLlwiKVxuICAgICAgICA6IChmaWJlciAhPT0gZmliZXJTdGFja1tpbmRleCRqc2NvbXAkMF0gJiZcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJVbmV4cGVjdGVkIEZpYmVyIHBvcHBlZC5cIiksXG4gICAgICAgICAgKGN1cnNvci5jdXJyZW50ID0gdmFsdWVTdGFja1tpbmRleCRqc2NvbXAkMF0pLFxuICAgICAgICAgICh2YWx1ZVN0YWNrW2luZGV4JGpzY29tcCQwXSA9IG51bGwpLFxuICAgICAgICAgIChmaWJlclN0YWNrW2luZGV4JGpzY29tcCQwXSA9IG51bGwpLFxuICAgICAgICAgIGluZGV4JGpzY29tcCQwLS0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwdXNoKGN1cnNvciwgdmFsdWUsIGZpYmVyKSB7XG4gICAgICBpbmRleCRqc2NvbXAkMCsrO1xuICAgICAgdmFsdWVTdGFja1tpbmRleCRqc2NvbXAkMF0gPSBjdXJzb3IuY3VycmVudDtcbiAgICAgIGZpYmVyU3RhY2tbaW5kZXgkanNjb21wJDBdID0gZmliZXI7XG4gICAgICBjdXJzb3IuY3VycmVudCA9IHZhbHVlO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXF1aXJlZENvbnRleHQoYykge1xuICAgICAgbnVsbCA9PT0gYyAmJlxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiRXhwZWN0ZWQgaG9zdCBjb250ZXh0IHRvIGV4aXN0LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gYztcbiAgICB9XG4gICAgZnVuY3Rpb24gcHVzaEhvc3RDb250YWluZXIoZmliZXIsIG5leHRSb290SW5zdGFuY2UpIHtcbiAgICAgIHB1c2gocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IsIG5leHRSb290SW5zdGFuY2UsIGZpYmVyKTtcbiAgICAgIHB1c2goY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyLCBmaWJlcik7XG4gICAgICBwdXNoKGNvbnRleHRTdGFja0N1cnNvciwgbnVsbCwgZmliZXIpO1xuICAgICAgdmFyIG5leHRSb290Q29udGV4dCA9IG5leHRSb290SW5zdGFuY2Uubm9kZVR5cGU7XG4gICAgICBzd2l0Y2ggKG5leHRSb290Q29udGV4dCkge1xuICAgICAgICBjYXNlIDk6XG4gICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgbmV4dFJvb3RDb250ZXh0ID0gOSA9PT0gbmV4dFJvb3RDb250ZXh0ID8gXCIjZG9jdW1lbnRcIiA6IFwiI2ZyYWdtZW50XCI7XG4gICAgICAgICAgbmV4dFJvb3RJbnN0YW5jZSA9IChuZXh0Um9vdEluc3RhbmNlID1cbiAgICAgICAgICAgIG5leHRSb290SW5zdGFuY2UuZG9jdW1lbnRFbGVtZW50KVxuICAgICAgICAgICAgPyAobmV4dFJvb3RJbnN0YW5jZSA9IG5leHRSb290SW5zdGFuY2UubmFtZXNwYWNlVVJJKVxuICAgICAgICAgICAgICA/IGdldE93bkhvc3RDb250ZXh0KG5leHRSb290SW5zdGFuY2UpXG4gICAgICAgICAgICAgIDogSG9zdENvbnRleHROYW1lc3BhY2VOb25lXG4gICAgICAgICAgICA6IEhvc3RDb250ZXh0TmFtZXNwYWNlTm9uZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAoKG5leHRSb290Q29udGV4dCA9IG5leHRSb290SW5zdGFuY2UudGFnTmFtZSksXG4gICAgICAgICAgICAobmV4dFJvb3RJbnN0YW5jZSA9IG5leHRSb290SW5zdGFuY2UubmFtZXNwYWNlVVJJKSlcbiAgICAgICAgICApXG4gICAgICAgICAgICAobmV4dFJvb3RJbnN0YW5jZSA9IGdldE93bkhvc3RDb250ZXh0KG5leHRSb290SW5zdGFuY2UpKSxcbiAgICAgICAgICAgICAgKG5leHRSb290SW5zdGFuY2UgPSBnZXRDaGlsZEhvc3RDb250ZXh0UHJvZChcbiAgICAgICAgICAgICAgICBuZXh0Um9vdEluc3RhbmNlLFxuICAgICAgICAgICAgICAgIG5leHRSb290Q29udGV4dFxuICAgICAgICAgICAgICApKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBzd2l0Y2ggKG5leHRSb290Q29udGV4dCkge1xuICAgICAgICAgICAgICBjYXNlIFwic3ZnXCI6XG4gICAgICAgICAgICAgICAgbmV4dFJvb3RJbnN0YW5jZSA9IEhvc3RDb250ZXh0TmFtZXNwYWNlU3ZnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIFwibWF0aFwiOlxuICAgICAgICAgICAgICAgIG5leHRSb290SW5zdGFuY2UgPSBIb3N0Q29udGV4dE5hbWVzcGFjZU1hdGg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgbmV4dFJvb3RJbnN0YW5jZSA9IEhvc3RDb250ZXh0TmFtZXNwYWNlTm9uZTtcbiAgICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG5leHRSb290Q29udGV4dCA9IG5leHRSb290Q29udGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgbmV4dFJvb3RDb250ZXh0ID0gdXBkYXRlZEFuY2VzdG9ySW5mb0RldihudWxsLCBuZXh0Um9vdENvbnRleHQpO1xuICAgICAgbmV4dFJvb3RDb250ZXh0ID0ge1xuICAgICAgICBjb250ZXh0OiBuZXh0Um9vdEluc3RhbmNlLFxuICAgICAgICBhbmNlc3RvckluZm86IG5leHRSb290Q29udGV4dFxuICAgICAgfTtcbiAgICAgIHBvcChjb250ZXh0U3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgICAgIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yLCBuZXh0Um9vdENvbnRleHQsIGZpYmVyKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcG9wSG9zdENvbnRhaW5lcihmaWJlcikge1xuICAgICAgcG9wKGNvbnRleHRTdGFja0N1cnNvciwgZmliZXIpO1xuICAgICAgcG9wKGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLCBmaWJlcik7XG4gICAgICBwb3Aocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0SG9zdENvbnRleHQoKSB7XG4gICAgICByZXR1cm4gcmVxdWlyZWRDb250ZXh0KGNvbnRleHRTdGFja0N1cnNvci5jdXJyZW50KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHVzaEhvc3RDb250ZXh0KGZpYmVyKSB7XG4gICAgICB2Y
15852XIgc3RhdGVIb29rID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIG51bGwgIT09IHN0YXRlSG9vayAmJlxuICAgICAgICAoKEhvc3RUcmFuc2l0aW9uQ29udGV4dC5fY3VycmVudFZhbHVlID0gc3RhdGVIb29rLm1lbW9pemVkU3RhdGUpLFxuICAgICAgICBwdXNoKGhvc3RUcmFuc2l0aW9uUHJvdmlkZXJDdXJzb3IsIGZpYmVyLCBmaWJlcikpO1xuICAgICAgc3RhdGVIb29rID0gcmVxdWlyZWRDb250ZXh0KGNvbnRleHRTdGFja0N1cnNvci5jdXJyZW50KTtcbiAgICAgIHZhciB0eXBlID0gZmliZXIudHlwZTtcbiAgICAgIHZhciBuZXh0Q29udGV4dCA9IGdldENoaWxkSG9zdENvbnRleHRQcm9kKHN0YXRlSG9vay5jb250ZXh0LCB0eXBlKTtcbiAgICAgIHR5cGUgPSB1cGRhdGVkQW5jZXN0b3JJbmZvRGV2KHN0YXRlSG9vay5hbmNlc3RvckluZm8sIHR5cGUpO1xuICAgICAgbmV4dENvbnRleHQgPSB7IGNvbnRleHQ6IG5leHRDb250ZXh0LCBhbmNlc3RvckluZm86IHR5cGUgfTtcbiAgICAgIHN0YXRlSG9vayAhPT0gbmV4dENvbnRleHQgJiZcbiAgICAgICAgKHB1c2goY29udGV4dEZpYmVyU3RhY2tDdXJzb3IsIGZpYmVyLCBmaWJlciksXG4gICAgICAgIHB1c2goY29udGV4dFN0YWNrQ3Vyc29yLCBuZXh0Q29udGV4dCwgZmliZXIpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcG9wSG9zdENvbnRleHQoZmliZXIpIHtcbiAgICAgIGNvbnRleHRGaWJlclN0YWNrQ3Vyc29yLmN1cnJlbnQgPT09IGZpYmVyICYmXG4gICAgICAgIChwb3AoY29udGV4dFN0YWNrQ3Vyc29yLCBmaWJlciksIHBvcChjb250ZXh0RmliZXJTdGFja0N1cnNvciwgZmliZXIpKTtcbiAgICAgIGhvc3RUcmFuc2l0aW9uUHJvdmlkZXJDdXJzb3IuY3VycmVudCA9PT0gZmliZXIgJiZcbiAgICAgICAgKHBvcChob3N0VHJhbnNpdGlvblByb3ZpZGVyQ3Vyc29yLCBmaWJlciksXG4gICAgICAgIChIb3N0VHJhbnNpdGlvbkNvbnRleHQuX2N1cnJlbnRWYWx1ZSA9IE5vdFBlbmRpbmdUcmFuc2l0aW9uKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRpc2FibGVkTG9nKCkge31cbiAgICBmdW5jdGlvbiBkaXNhYmxlTG9ncygpIHtcbiAgICAgIGlmICgwID09PSBkaXNhYmxlZERlcHRoKSB7XG4gICAgICAgIHByZXZMb2cgPSBjb25zb2xlLmxvZztcbiAgICAgICAgcHJldkluZm8gPSBjb25zb2xlLmluZm87XG4gICAgICAgIHByZXZXYXJuID0gY29uc29sZS53YXJuO1xuICAgICAgICBwcmV2RXJyb3IgPSBjb25zb2xlLmVycm9yO1xuICAgICAgICBwcmV2R3JvdXAgPSBjb25zb2xlLmdyb3VwO1xuICAgICAgICBwcmV2R3JvdXBDb2xsYXBzZWQgPSBjb25zb2xlLmdyb3VwQ29sbGFwc2VkO1xuICAgICAgICBwcmV2R3JvdXBFbmQgPSBjb25zb2xlLmdyb3VwRW5kO1xuICAgICAgICB2Y
15852XIgcHJvcHMgPSB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgICAgICB2YWx1ZTogZGlzYWJsZWRMb2csXG4gICAgICAgICAgd3JpdGFibGU6ICEwXG4gICAgICAgIH07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgICBpbmZvOiBwcm9wcyxcbiAgICAgICAgICBsb2c6IHByb3BzLFxuICAgICAgICAgIHdhcm46IHByb3BzLFxuICAgICAgICAgIGVycm9yOiBwcm9wcyxcbiAgICAgICAgICBncm91cDogcHJvcHMsXG4gICAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IHByb3BzLFxuICAgICAgICAgIGdyb3VwRW5kOiBwcm9wc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGRpc2FibGVkRGVwdGgrKztcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVlbmFibGVMb2dzKCkge1xuICAgICAgZGlzYWJsZWREZXB0aC0tO1xuICAgICAgaWYgKDAgPT09IGRpc2FibGVkRGVwdGgpIHtcbiAgICAgICAgdmFyIHByb3BzID0geyBjb25maWd1cmFibGU6ICEwLCBlbnVtZXJhYmxlOiAhMCwgd3JpdGFibGU6ICEwIH07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgICBsb2c6IGFzc2lnbih7fSwgcHJvcHMsIHsgdmFsdWU6IHByZXZMb2cgfSksXG4gICAgICAgICAgaW5mbzogYXNzaWduKHt9LCBwcm9wcywgeyB2YWx1ZTogcHJldkluZm8gfSksXG4gICAgICAgICAgd2FybjogYXNzaWduKHt9LCBwcm9wcywgeyB2YWx1ZTogcHJldldhcm4gfSksXG4gICAgICAgICAgZXJyb3I6IGFzc2lnbih7fSwgcHJvcHMsIHsgdmFsdWU6IHByZXZFcnJvciB9KSxcbiAgICAgICAgICBncm91cDogYXNzaWduKHt9LCBwcm9wcywgeyB2YWx1ZTogcHJldkdyb3VwIH0pLFxuICAgICAgICAgIGdyb3VwQ29sbGFwc2VkOiBhc3NpZ24oe30sIHByb3BzLCB7IHZhbHVlOiBwcmV2R3JvdXBDb2xsYXBzZWQgfSksXG4gICAgICAgICAgZ3JvdXBFbmQ6IGFzc2lnbih7fSwgcHJvcHMsIHsgdmFsdWU6IHByZXZHcm91cEVuZCB9KVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIDAgPiBkaXNhYmxlZERlcHRoICYmXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJkaXNhYmxlZERlcHRoIGZlbGwgYmVsb3cgemVyby4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCJcbiAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZm9ybWF0T3duZXJTdGFjayhlcnJvcikge1xuICAgICAgdmFyIHByZXZQcmVwYXJlU3RhY2tUcmFjZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlO1xuICAgICAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSB2b2lkIDA7XG4gICAgICBlcnJvciA9IGVycm9yLnN0YWNrO1xuICAgICAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBwcmV2UHJlcGFyZVN0YWNrVHJhY2U7XG4gICAgICBlcnJvci5zdGFydHNXaXRoKFwiRXJyb3I6IHJlYWN0LXN0YWNrLXRvcC1mcmFtZVxcblwiKSAmJlxuICAgICAgICAoZXJyb3IgPSBlcnJvci5zbGljZSgyOSkpO1xuICAgICAgcHJldlByZXBhcmVTdGFja1RyYWNlID0gZXJyb3IuaW5kZXhPZihcIlxcblwiKTtcbiAgICAgIC0xICE9PSBwcmV2UHJlcGFyZVN0YWNrVHJhY2UgJiZcbiAgICAgICAgKGVycm9yID0gZXJyb3Iuc2xpY2UocHJldlByZXBhcmVTdGFja1RyYWNlICsgMSkpO1xuICAgICAgcHJldlByZXBhcmVTdGFja1RyYWNlID0gZXJyb3IuaW5kZXhPZihcInJlYWN0X3N0YWNrX2JvdHRvbV9mcmFtZVwiKTtcbiAgICAgIC0xICE9PSBwcmV2UHJlcGFyZVN0YWNrVHJhY2UgJiZcbiAgICAgICAgKHByZXZQcmVwYXJlU3RhY2tUcmFjZSA9IGVycm9yLmxhc3RJbmRleE9mKFxuICAgICAgICAgIFwiXFxuXCIsXG4gICAgICAgICAgcHJldlByZXBhcmVTdGFja1RyYWNlXG4gICAgICAgICkpO1xuICAgICAgaWYgKC0xICE9PSBwcmV2UHJlcGFyZVN0YWNrVHJhY2UpXG4gICAgICAgIGVycm9yID0gZXJyb3Iuc2xpY2UoMCwgcHJldlByZXBhcmVTdGFja1RyYWNlKTtcbiAgICAgIGVsc2UgcmV0dXJuIFwiXCI7XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUpIHtcbiAgICAgIGlmICh2b2lkIDAgPT09IHByZWZpeClcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgdmFyIG1hdGNoID0geC5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtcbiAgICAgICAgICBwcmVmaXggPSAobWF0Y2ggJiYgbWF0Y2hbMV0pIHx8IFwiXCI7XG4gICAgICAgICAgc3VmZml4ID1cbiAgICAgICAgICAgIC0xIDwgeC5zdGFjay5pbmRleE9mKFwiXFxuICAgIGF0XCIpXG4gICAgICAgICAgICAgID8gXCIgKDxhbm9ueW1vdXM+KVwiXG4gICAgICAgICAgICAgIDogLTEgPCB4LnN0YWNrLmluZGV4T2YoXCJAXCIpXG4gICAgICAgICAgICAgICAgPyBcIkB1bmtub3duOjA6MFwiXG4gICAgICAgICAgICAgICAgOiBcIlwiO1xuICAgICAgICB9XG4gICAgICByZXR1cm4gXCJcXG5cIiArIHByZWZpeCArIG5hbWUgKyBzdWZmaXg7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZm4sIGNvbnN0cnVjdCkge1xuICAgICAgaWYgKCFmbiB8fCByZWVudHJ5KSByZXR1cm4gXCJcIjtcbiAgICAgIHZhciBmcmFtZSA9IGNvbXBvbmVudEZyYW1lQ2FjaGUuZ2V0KGZuKTtcbiAgICAgIGlmICh2b2lkIDAgIT09IGZyYW1lKSByZXR1cm4gZnJhbWU7XG4gICAgICByZWVudHJ5ID0gITA7XG4gICAgICBmcmFtZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlO1xuICAgICAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSB2b2lkIDA7XG4gICAgICB2Y
15852XIgcHJldmlvdXNEaXNwYXRjaGVyID0gbnVsbDtcbiAgICAgIHByZXZpb3VzRGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLkg7XG4gICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gbnVsbDtcbiAgICAgIGRpc2FibGVMb2dzKCk7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgUnVuSW5Sb290RnJhbWUgPSB7XG4gICAgICAgICAgRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBpZiAoY29uc3RydWN0KSB7XG4gICAgICAgICAgICAgICAgdmFyIEZha2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZha2UucHJvdG90eXBlLCBcInByb3BzXCIsIHtcbiAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChcIm9iamVjdFwiID09PSB0eXBlb2YgUmVmbGVjdCAmJiBSZWZsZWN0LmNvbnN0cnVjdCkge1xuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgUmVmbGVjdC5jb25zdHJ1Y3QoRmFrZSwgW10pO1xuICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgICAgICAgICAgICB2Y
15852XIgY29udHJvbCA9IHg7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBSZWZsZWN0LmNvbnN0cnVjdChmbiwgW10sIEZha2UpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBGYWtlLmNhbGwoKTtcbiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHgkMCkge1xuICAgICAgICAgICAgICAgICAgICBjb250cm9sID0geCQwO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgRmFrZSA9ICExO1xuICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByZXZQcm9wcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICAgICAgICAgICAgICAgICAgZm4ucHJvdG90eXBlLFxuICAgICAgICAgICAgICAgICAgICAgIFwicHJvcHNcIlxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4ucHJvdG90eXBlLCBcInByb3BzXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBGYWtlID0gITA7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBmbigpO1xuICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgRmFrZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICh2b2lkIDAgIT09IHByZXZQcm9wc1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm4ucHJvdG90eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicHJvcHNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2UHJvcHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBkZWxldGUgZm4ucHJvdG90eXBlLnByb3BzKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoeCQxKSB7XG4gICAgICAgICAgICAgICAgICBjb250cm9sID0geCQxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAoRmFrZSA9IGZuKCkpICYmXG4gICAgICAgICAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBGYWtlLmNhdGNoICYmXG4gICAgICAgICAgICAgICAgICBGYWtlLmNhdGNoKGZ1bmN0aW9uICgpIHt9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoc2FtcGxlKSB7XG4gICAgICAgICAgICAgIGlmIChzYW1wbGUgJiYgY29udHJvbCAmJiBcInN0cmluZ1wiID09PSB0eXBlb2Ygc2FtcGxlLnN0YWNrKVxuICAgICAgICAgICAgICAgIHJldHVybiBbc2FtcGxlLnN0YWNrLCBjb250cm9sLnN0YWNrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbbnVsbCwgbnVsbF07XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBSdW5JblJvb3RGcmFtZS5EZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3QuZGlzcGxheU5hbWUgPVxuICAgICAgICAgIFwiRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290XCI7XG4gICAgICAgIHZhciBuYW1lUHJvcERlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgICAgIFJ1bkluUm9vdEZyYW1lLkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdCxcbiAgICAgICAgICBcIm5hbWVcIlxuICAgICAgICApO1xuICAgICAgICBuYW1lUHJvcERlc2NyaXB0b3IgJiZcbiAgICAgICAgICBuYW1lUHJvcERlc2NyaXB0b3IuY29uZmlndXJhYmxlICYmXG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgICAgUnVuSW5Sb290RnJhbWUuRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290LFxuICAgICAgICAgICAgXCJuYW1lXCIsXG4gICAgICAgICAgICB7IHZhbHVlOiBcIkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdFwiIH1cbiAgICAgICAgICApO1xuICAgICAgICB2Y
15852XIgX1J1bkluUm9vdEZyYW1lJERldGVyID1cbiAgICAgICAgICAgIFJ1bkluUm9vdEZyYW1lLkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdCgpLFxuICAgICAgICAgIHNhbXBsZVN0YWNrID0gX1J1bkluUm9vdEZyYW1lJERldGVyWzBdLFxuICAgICAgICAgIGNvbnRyb2xTdGFjayA9IF9SdW5JblJvb3RGcmFtZSREZXRlclsxXTtcbiAgICAgICAgaWYgKHNhbXBsZVN0YWNrICYmIGNvbnRyb2xTdGFjaykge1xuICAgICAgICAgIHZhciBzYW1wbGVMaW5lcyA9IHNhbXBsZVN0YWNrLnNwbGl0KFwiXFxuXCIpLFxuICAgICAgICAgICAgY29udHJvbExpbmVzID0gY29udHJvbFN0YWNrLnNwbGl0KFwiXFxuXCIpO1xuICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICBfUnVuSW5Sb290RnJhbWUkRGV0ZXIgPSBuYW1lUHJvcERlc2NyaXB0b3IgPSAwO1xuICAgICAgICAgICAgbmFtZVByb3BEZXNjcmlwdG9yIDwgc2FtcGxlTGluZXMubGVuZ3RoICYmXG4gICAgICAgICAgICAhc2FtcGxlTGluZXNbbmFtZVByb3BEZXNjcmlwdG9yXS5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgXCJEZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3RcIlxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgIClcbiAgICAgICAgICAgIG5hbWVQcm9wRGVzY3JpcHRvcisrO1xuICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICA7XG4gICAgICAgICAgICBfUnVuSW5Sb290RnJhbWUkRGV0ZXIgPCBjb250cm9sTGluZXMubGVuZ3RoICYmXG4gICAgICAgICAgICAhY29udHJvbExpbmVzW19SdW5JblJvb3RGcmFtZSREZXRlcl0uaW5jbHVkZXMoXG4gICAgICAgICAgICAgIFwiRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290XCJcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICApXG4gICAgICAgICAgICBfUnVuSW5Sb290RnJhbWUkRGV0ZXIrKztcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBuYW1lUHJvcERlc2NyaXB0b3IgPT09IHNhbXBsZUxpbmVzLmxlbmd0aCB8fFxuICAgICAgICAgICAgX1J1bkluUm9vdEZyYW1lJERldGVyID09PSBjb250cm9sTGluZXMubGVuZ3RoXG4gICAgICAgICAgKVxuICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgbmFtZVByb3BEZXNjcmlwdG9yID0gc2FtcGxlTGluZXMubGVuZ3RoIC0gMSxcbiAgICAgICAgICAgICAgICBfUnVuSW5Sb290RnJhbWUkRGV0ZXIgPSBjb250cm9sTGluZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgMSA8PSBuYW1lUHJvcERlc2NyaXB0b3IgJiZcbiAgICAgICAgICAgICAgMCA8PSBfUnVuSW5Sb290RnJhbWUkRGV0ZXIgJiZcbiAgICAgICAgICAgICAgc2FtcGxlTGluZXNbbmFtZVByb3BEZXNjcmlwdG9yXSAhPT1cbiAgICAgICAgICAgICAgICBjb250cm9sTGluZXNbX1J1bkluUm9vdEZyYW1lJERldGVyXTtcblxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBfUnVuSW5Sb290RnJhbWUkRGV0ZXItLTtcbiAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgO1xuICAgICAgICAgICAgMSA8PSBuYW1lUHJvcERlc2NyaXB0b3IgJiYgMCA8PSBfUnVuSW5Sb290RnJhbWUkRGV0ZXI7XG4gICAgICAgICAgICBuYW1lUHJvcERlc2NyaXB0b3ItLSwgX1J1bkluUm9vdEZyYW1lJERldGVyLS1cbiAgICAgICAgICApXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHNhbXBsZUxpbmVzW25hbWVQcm9wRGVzY3JpcHRvcl0gIT09XG4gICAgICAgICAgICAgIGNvbnRyb2xMaW5lc1tfUnVuSW5Sb290RnJhbWUkRGV0ZXJdXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgaWYgKDEgIT09IG5hbWVQcm9wRGVzY3JpcHRvciB8fCAxICE9PSBfUnVuSW5Sb290RnJhbWUkRGV0ZXIpIHtcbiAgICAgICAgICAgICAgICBkb1xuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAobmFtZVByb3BEZXNjcmlwdG9yLS0sXG4gICAgICAgICAgICAgICAgICAgIF9SdW5JblJvb3RGcmFtZSREZXRlci0tLFxuICAgICAgICAgICAgICAgICAgICAwID4gX1J1bkluUm9vdEZyYW1lJERldGVyIHx8XG4gICAgICAgICAgICAgICAgICAgICAgc2FtcGxlTGluZXNbbmFtZVByb3BEZXNjcmlwdG9yXSAhPT1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xMaW5lc1tfUnVuSW5Sb290RnJhbWUkRGV0ZXJdKVxuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfZnJhbWUgPVxuICAgICAgICAgICAgICAgICAgICAgIFwiXFxuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUxpbmVzW25hbWVQcm9wRGVzY3JpcHRvcl0ucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIGF0IG5ldyBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIGF0IFwiXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgZm4uZGlzcGxheU5hbWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICBfZnJhbWUuaW5jbHVkZXMoXCI8YW5vbnltb3VzPlwiKSAmJlxuICAgICAgICAgICAgICAgICAgICAgIChfZnJhbWUgPSBfZnJhbWUucmVwbGFjZShcIjxhbm9ueW1vdXM+XCIsIGZuLmRpc3BsYXlOYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGZuICYmXG4gICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIF9mcmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfZnJhbWU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2hpbGUgKDEgPD0gbmFtZVByb3BEZXNjcmlwdG9yICYmIDAgPD0gX1J1bkluUm9vdEZyYW1lJERldGVyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgKHJlZW50cnkgPSAhMSksXG4gICAgICAgICAgKFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBwcmV2aW91c0Rpc3BhdGNoZXIpLFxuICAgICAgICAgIHJlZW5hYmxlTG9ncygpLFxuICAgICAgICAgIChFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IGZyYW1lKTtcbiAgICAgIH1cbiAgICAgIHNhbXBsZUxpbmVzID0gKHNhbXBsZUxpbmVzID0gZm4gPyBmbi5kaXNwbGF5TmFtZSB8fCBmbi5uYW1lIDogXCJcIilcbiAgICAgICAgPyBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShzYW1wbGVMaW5lcylcbiAgICAgICAgOiBcIlwiO
158521xuICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgZm4gJiYgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIHNhbXBsZUxpbmVzKTtcbiAgICAgIHJldHVybiBzYW1wbGVMaW5lcztcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVzY3JpYmVGaWJlcihmaWJlciwgY2hpbGRGaWJlcikge1xuICAgICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgICAgY2FzZSAyNjpcbiAgICAgICAgY2FzZSAyNzpcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIHJldHVybiBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShmaWJlci50eXBlKTtcbiAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoXCJMYXp5XCIpO1xuICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgIHJldHVybiBmaWJlci5jaGlsZCAhPT0gY2hpbGRGaWJlciAmJiBudWxsICE9PSBjaGlsZEZpYmVyXG4gICAgICAgICAgICA/IGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKFwiU3VzcGVuc2UgRmFsbGJhY2tcIilcbiAgICAgICAgICAgIDogZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoXCJTdXNwZW5zZVwiKTtcbiAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoXCJTdXNwZW5zZUxpc3RcIik7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICByZXR1cm4gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmaWJlci50eXBlLCAhMSk7XG4gICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgcmV0dXJuIGRlc2NyaWJlTmF0aXZlQ29tcG9uZW50RnJhbWUoZmliZXIudHlwZS5yZW5kZXIsICExKTtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKGZpYmVyLnR5cGUsICEwKTtcbiAgICAgICAgY2FzZSAzMTpcbiAgICAgICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoXCJBY3Rpdml0eVwiKTtcbiAgICAgICAgY2FzZSAzMDpcbiAgICAgICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoXCJWaWV3VHJhbnNpdGlvblwiKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0U3RhY2tCeUZpYmVySW5EZXZBbmRQcm9kKHdvcmtJblByb2dyZXNzKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2Y
15852XIgaW5mbyA9IFwiXCIsXG4gICAgICAgICAgcHJldmlvdXMgPSBudWxsO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgaW5mbyArPSBkZXNjcmliZUZpYmVyKHdvcmtJblByb2dyZXNzLCBwcmV2aW91cyk7XG4gICAgICAgICAgdmFyIGRlYnVnSW5mbyA9IHdvcmtJblByb2dyZXNzLl9kZWJ1Z0luZm87XG4gICAgICAgICAgaWYgKGRlYnVnSW5mbylcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBkZWJ1Z0luZm8ubGVuZ3RoIC0gMTsgMCA8PSBpOyBpLS0pIHtcbiAgICAgICAgICAgICAgdmFyIGVudHJ5ID0gZGVidWdJbmZvW2ldO1xuICAgICAgICAgICAgICBpZiAoXCJzdHJpbmdcIiA9PT0gdHlwZW9mIGVudHJ5Lm5hbWUpIHtcbiAgICAgICAgICAgICAgICB2YXIgSlNDb21waWxlcl90ZW1wX2NvbnN0ID0gaW5mbztcbiAgICAgICAgICAgICAgICBhOiB7XG4gICAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IGVudHJ5Lm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGVudiA9IGVudHJ5LmVudixcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gPSBlbnRyeS5kZWJ1Z0xvY2F0aW9uO1xuICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gbG9jYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkU3RhY2sgPSBmb3JtYXRPd25lclN0YWNrKGxvY2F0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgICBpZHggPSBjaGlsZFN0YWNrLmxhc3RJbmRleE9mKFwiXFxuXCIpLFxuICAgICAgICAgICAgICAgICAgICAgIGxhc3RMaW5lID1cbiAgICAgICAgICAgICAgICAgICAgICAgIC0xID09PSBpZHggPyBjaGlsZFN0YWNrIDogY2hpbGRTdGFjay5zbGljZShpZHggKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKC0xICE9PSBsYXN0TGluZS5pbmRleE9mKG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCA9IFwiXFxuXCIgKyBsYXN0TGluZTtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgPSBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShcbiAgICAgICAgICAgICAgICAgICAgbmFtZSArIChlbnYgPyBcIiBbXCIgKyBlbnYgKyBcIl1cIiA6IFwiXCIpXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpbmZvID0gSlNDb21waWxlcl90ZW1wX2NvbnN0ICsgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgcHJldmlvdXMgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IHdvcmtJblByb2dyZXNzLnJldHVybjtcbiAgICAgICAgfSB3aGlsZSAod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICByZXR1cm4gaW5mbztcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgcmV0dXJuIFwiXFxuRXJyb3IgZ2VuZXJhdGluZyBzdGFjazogXCIgKyB4Lm1lc3NhZ2UgKyBcIlxcblwiICsgeC5zdGFjaztcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lV2l0aG91dExpbmVOdW1iZXIoZm4pIHtcbiAgICAgIHJldHVybiAoZm4gPSBmbiA/IGZuLmRpc3BsYXlOYW1lIHx8IGZuLm5hbWUgOiBcIlwiKVxuICAgICAgICA/IGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKGZuKVxuICAgICAgICA6IFwiXCI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCkge1xuICAgICAgaWYgKG51bGwgPT09IGN1cnJlbnQpIHJldHVybiBudWxsO1xuICAgICAgdmFyIG93bmVyID0gY3VycmVudC5fZGVidWdPd25lcjtcbiAgICAgIHJldHVybiBudWxsICE9IG93bmVyID8gZ2V0Q29tcG9uZW50TmFtZUZyb21Pd25lcihvd25lcikgOiBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRDdXJyZW50RmliZXJTdGFja0luRGV2KCkge1xuICAgICAgaWYgKG51bGwgPT09IGN1cnJlbnQpIHJldHVybiBcIlwiO1xuICAgICAgdmFyIHdvcmtJblByb2dyZXNzID0gY3VycmVudDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBpbmZvID0gXCJcIjtcbiAgICAgICAgNiA9PT0gd29ya0luUHJvZ3Jlc3MudGFnICYmICh3b3JrSW5Qcm9ncmVzcyA9IHdvcmtJblByb2dyZXNzLnJldHVybik7XG4gICAgICAgIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgICAgICAgY2FzZSAyNjpcbiAgICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIGluZm8gKz0gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUod29ya0luUHJvZ3Jlc3MudHlwZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgaW5mbyArPSBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShcIlN1c3BlbnNlXCIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICAgIGluZm8gKz0gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoXCJTdXNwZW5zZUxpc3RcIik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDMxOlxuICAgICAgICAgICAgaW5mbyArPSBkZXNjcmliZUJ1aWx0SW5Db21wb25lbnRGcmFtZShcIkFjdGl2aXR5XCIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAzMDpcbiAgICAgICAgICAgIGluZm8gKz0gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoXCJWaWV3VHJhbnNpdGlvblwiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z093bmVyIHx8XG4gICAgICAgICAgICAgIFwiXCIgIT09IGluZm8gfHxcbiAgICAgICAgICAgICAgKGluZm8gKz0gZGVzY3JpYmVGdW5jdGlvbkNvbXBvbmVudEZyYW1lV2l0aG91dExpbmVOdW1iZXIoXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZVxuICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdPd25lciB8fFxuICAgICAgICAgICAgICBcIlwiICE9PSBpbmZvIHx8XG4gICAgICAgICAgICAgIChpbmZvICs9IGRlc2NyaWJlRnVuY3Rpb25Db21wb25lbnRGcmFtZVdpdGhvdXRMaW5lTnVtYmVyKFxuICAgICAgICAgICAgICAgI
15852HdvcmtJblByb2dyZXNzLnR5cGUucmVuZGVyXG4gICAgICAgICAgICAgICkpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoOyB3b3JrSW5Qcm9ncmVzczsgKVxuICAgICAgICAgIGlmIChcIm51bWJlclwiID09PSB0eXBlb2Ygd29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgICAgICAgICB2YXIgZmliZXIgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzID0gZmliZXIuX2RlYnVnT3duZXI7XG4gICAgICAgICAgICB2YXIgZGVidWdTdGFjayA9IGZpYmVyLl9kZWJ1Z1N0YWNrO1xuICAgICAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzICYmIGRlYnVnU3RhY2spIHtcbiAgICAgICAgICAgICAgdmFyIGZvcm1hdHRlZFN0YWNrID0gZm9ybWF0T3duZXJTdGFjayhkZWJ1Z1N0YWNrKTtcbiAgICAgICAgICAgICAgXCJcIiAhPT0gZm9ybWF0dGVkU3RhY2sgJiYgKGluZm8gKz0gXCJcXG5cIiArIGZvcm1hdHRlZFN0YWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKG51bGwgIT0gd29ya0luUHJvZ3Jlc3MuZGVidWdTdGFjaykge1xuICAgICAgICAgICAgdmFyIG93bmVyU3RhY2sgPSB3b3JrSW5Qcm9ncmVzcy5kZWJ1Z1N0YWNrO1xuICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzID0gd29ya0luUHJvZ3Jlc3Mub3duZXIpICYmXG4gICAgICAgICAgICAgIG93bmVyU3RhY2sgJiZcbiAgICAgICAgICAgICAgKGluZm8gKz0gXCJcXG5cIiArIGZvcm1hdE93bmVyU3RhY2sob3duZXJTdGFjaykpO1xuICAgICAgICAgIH0gZWxzZSBicmVhaztcbiAgICAgICAgdmFyIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCA9IGluZm87XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCA9XG4gICAgICAgICAgXCJcXG5FcnJvciBnZW5lcmF0aW5nIHN0YWNrOiBcIiArIHgubWVzc2FnZSArIFwiXFxuXCIgKyB4LnN0YWNrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdDtcbiAgICB9XG4gICAgZnVuY3Rpb24gcnVuV2l0aEZpYmVySW5ERVYoZmliZXIsIGNhbGxiYWNrLCBhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0KSB7XG4gICAgICB2Y
15852XIgcHJldmlvdXNGaWJlciA9IGN1cnJlbnQ7XG4gICAgICBzZXRDdXJyZW50RmliZXIoZmliZXIpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG51bGwgIT09IGZpYmVyICYmIGZpYmVyLl9kZWJ1Z1Rhc2tcbiAgICAgICAgICA/IGZpYmVyLl9kZWJ1Z1Rhc2sucnVuKFxuICAgICAgICAgICAgICBjYWxsYmFjay5iaW5kKG51bGwsIGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBjYWxsYmFjayhhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldEN1cnJlbnRGaWJlcihwcmV2aW91c0ZpYmVyKTtcbiAgICAgIH1cbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBcInJ1bldpdGhGaWJlckluREVWIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgaW4gcHJvZHVjdGlvbi4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC5cIlxuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2V0Q3VycmVudEZpYmVyKGZpYmVyKSB7XG4gICAgICBSZWFjdFNoYXJlZEludGVybmFscy5nZXRDdXJyZW50U3RhY2sgPVxuICAgICAgICBudWxsID09PSBmaWJlciA/IG51bGwgOiBnZXRDdXJyZW50RmliZXJTdGFja0luRGV2O1xuICAgICAgaXNSZW5kZXJpbmcgPSAhMTtcbiAgICAgIGN1cnJlbnQgPSBmaWJlcjtcbiAgICB9XG4gICAgZnVuY3Rpb24gdHlwZU5hbWUodmFsdWUpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBTeW1ib2wgJiZcbiAgICAgICAgICBTeW1ib2wudG9TdHJpbmdUYWcgJiZcbiAgICAgICAgICB2YWx1ZVtTeW1ib2wudG9TdHJpbmdUYWddKSB8fFxuICAgICAgICB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lIHx8XG4gICAgICAgIFwiT2JqZWN0XCJcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKSwgITE7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiAhMDtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gXCJcIiArIHZhbHVlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgICBpZiAod2lsbENvZXJjaW9uVGhyb3codmFsdWUpKVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIlRoZSBwcm92aWRlZCBgJXNgIGF0dHJpYnV0ZSBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlICVzLiBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgdXNpbmcgaXQgaGVyZS5cIixcbiAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWUsXG4gICAgICAgICAgICB0eXBlTmFtZSh2YWx1ZSlcbiAgICAgICAgICApLFxuICAgICAgICAgIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSlcbiAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2hlY2tDU1NQcm9wZXJ0eVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBwcm9wTmFtZSkge1xuICAgICAgaWYgKHdpbGxDb2VyY2lvblRocm93KHZhbHVlKSlcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJUaGUgcHJvdmlkZWQgYCVzYCBDU1MgcHJvcGVydHkgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZSAlcy4gVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIHVzaW5nIGl0IGhlcmUuXCIsXG4gICAgICAgICAgICBwcm9wTmFtZSxcbiAgICAgICAgICAgIHR5cGVOYW1lKHZhbHVlKVxuICAgICAgICAgICksXG4gICAgICAgICAgdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKVxuICAgICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja0Zvcm1GaWVsZFZhbHVlU3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAgICAgIGlmICh3aWxsQ29lcmNpb25UaHJvdyh2YWx1ZSkpXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiRm9ybSBmaWVsZCB2YWx1ZXMgKHZhbHVlLCBjaGVja2VkLCBkZWZhdWx0VmFsdWUsIG9yIGRlZmF1bHRDaGVja2VkIHByb3BzKSBtdXN0IGJlIHN0cmluZ3MsIG5vdCAlcy4gVGhpcyB2YWx1ZSBtdXN0IGJlIGNvZXJjZWQgdG8gYSBzdHJpbmcgYmVmb3JlIHVzaW5nIGl0IGhlcmUuXCIsXG4gICAgICAgICAgICB0eXBlTmFtZSh2YWx1ZSlcbiAgICAgICAgICApLFxuICAgICAgICAgIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSlcbiAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaW5qZWN0SW50ZXJuYWxzKGludGVybmFscykge1xuICAgICAgaWYgKFwidW5kZWZpbmVkXCIgPT09IHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18pIHJldHVybiAhMTtcbiAgICAgIHZhciBob29rID0gX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fO1xuICAgICAgaWYgKGhvb2suaXNEaXNhYmxlZCkgcmV0dXJuICEwO1xuICAgICAgaWYgKCFob29rLnN1cHBvcnRzRmliZXIpXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiVGhlIGluc3RhbGxlZCB2ZXJzaW9uIG9mIFJlYWN0IERldlRvb2xzIGlzIHRvbyBvbGQgYW5kIHdpbGwgbm90IHdvcmsgd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIFJlYWN0LiBQbGVhc2UgdXBkYXRlIFJlYWN0IERldlRvb2xzLiBodHRwczovL3JlYWN0LmRldi9saW5rL3JlYWN0LWRldnRvb2xzXCJcbiAgICAgICAgICApLFxuICAgICAgICAgICEwXG4gICAgICAgICk7XG4gICAgICB0cnkge1xuICAgICAgICAocmVuZGVyZXJJRCA9IGhvb2suaW5qZWN0KGludGVybmFscykpLCAoaW5qZWN0ZWRIb29rID0gaG9vayk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlJlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJW8uXCIsIGVycik7XG4gICAgICB9XG4gICAgICByZXR1cm4gaG9vay5jaGVja0RDRSA/ICEwIDogITE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKG5ld0lzU3RyaWN0TW9kZSkge1xuICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgbG9nJDEgJiZcbiAgICAgICAgdW5zdGFibGVfc2V0RGlzYWJsZVlpZWxkVmFsdWUobmV3SXNTdHJpY3RNb2RlKTtcbiAgICAgIGlmIChpbmplY3RlZEhvb2sgJiYgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgaW5qZWN0ZWRIb29rLnNldFN0cmljdE1vZGUpXG4gICAgICAgI
15852HRyeSB7XG4gICAgICAgICAgaW5qZWN0ZWRIb29rLnNldFN0cmljdE1vZGUocmVuZGVyZXJJRCwgbmV3SXNTdHJpY3RNb2RlKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgfHxcbiAgICAgICAgICAgICgoaGFzTG9nZ2VkRXJyb3IgPSAhMCksXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIlJlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJW9cIixcbiAgICAgICAgICAgICAgZXJyXG4gICAgICAgICAgICApKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBjbHozMkZhbGxiYWNrKHgpIHtcbiAgICAgIHggPj4+PSAwO1xuICAgICAgcmV0dXJuIDAgPT09IHggPyAzMiA6ICgzMSAtICgobG9nKHgpIC8gTE4yKSB8IDApKSB8IDA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKGxhbmVzKSB7XG4gICAgICB2YXIgcGVuZGluZ1N5bmNMYW5lcyA9IGxhbmVzICYgNDI7XG4gICAgICBpZiAoMCAhPT0gcGVuZGluZ1N5bmNMYW5lcykgcmV0dXJuIHBlbmRpbmdTeW5jTGFuZXM7XG4gICAgICBzd2l0Y2ggKGxhbmVzICYgLWxhbmVzKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHJldHVybiAyO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgcmV0dXJuIDQ7XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICByZXR1cm4gODtcbiAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICByZXR1cm4gMTY7XG4gICAgICAgIGNhc2UgMzI6XG4gICAgICAgICAgcmV0dXJuIDMyO1xuICAgICAgICBjYXNlIDY0OlxuICAgICAgICAgIHJldHVybiA2NDtcbiAgICAgICAgY2FzZSAxMjg6XG4gICAgICAgICAgcmV0dXJuIDEyODtcbiAgICAgICAgY2FzZSAyNTY6XG4gICAgICAgIGNhc2UgNTEyOlxuICAgICAgICBjYXNlIDEwMjQ6XG4gICAgICAgIGNhc2UgMjA0ODpcbiAgICAgICAgY2FzZSA0MDk2OlxuICAgICAgICBjYXNlIDgxOTI6XG4gICAgICAgIGNhc2UgMTYzODQ6XG4gICAgICAgIGNhc2UgMzI3Njg6XG4gICAgICAgIGNhc2UgNjU1MzY6XG4gICAgICAgIGNhc2UgMTMxMDcyOlxuICAgICAgICAgIHJldHVybiBsYW5lcyAmIC1sYW5lcztcbiAgICAgICAgY2FzZSAyNjIxNDQ6XG4gICAgICAgIGNhc2UgNTI0Mjg4OlxuICAgICAgICBjYXNlIDEwNDg1NzY6XG4gICAgICAgIGNhc2UgMjA5NzE1MjpcbiAgICAgICAgICByZXR1cm4gbGFuZXMgJiAzOTMyMTYwO1xuICAgICAgICBjYXNlIDQxOTQzMDQ6XG4gICAgICAgIGNhc2UgODM4ODYwODpcbiAgICAgICAgY2FzZSAxNjc3NzIxNjpcbiAgICAgICAgY2FzZSAzMzU1NDQzMjpcbiAgICAgICAgICByZXR1cm4gbGFuZXMgJiA2MjkxNDU2MDtcbiAgICAgICAgY2FzZSA2NzEwODg2NDpcbiAgICAgICAgICByZXR1cm4gNjcxMDg4NjQ7XG4gICAgICAgIGNhc2UgMTM0MjE3NzI4OlxuICAgICAgICAgIHJldHVybiAxMzQyMTc3Mjg7XG4gICAgICAgIGNhc2UgMjY4NDM1NDU2OlxuICAgICAgICAgIHJldHVybiAyNjg0MzU0NTY7XG4gICAgICAgIGNhc2UgNTM2ODcwOTEyOlxuICAgICAgICAgIHJldHVybiA1MzY4NzA5MTI7XG4gICAgICAgIGNhc2UgMTA3Mzc0MTgyNDpcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCJTaG91bGQgaGF2ZSBmb3VuZCBtYXRjaGluZyBsYW5lcy4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC5cIlxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGxhbmVzXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0TmV4dExhbmVzKHJvb3QsIHdpcExhbmVzLCByb290SGFzUGVuZGluZ0NvbW1pdCkge1xuICAgICAgdmFyIHBlbmRpbmdMYW5lcyA9IHJvb3QucGVuZGluZ0xhbmVzO1xuICAgICAgaWYgKDAgPT09IHBlbmRpbmdMYW5lcykgcmV0dXJuIDA7XG4gICAgICB2Y
15852XIgbmV4dExhbmVzID0gMCxcbiAgICAgICAgc3VzcGVuZGVkTGFuZXMgPSByb290LnN1c3BlbmRlZExhbmVzLFxuICAgICAgICBwaW5nZWRMYW5lcyA9IHJvb3QucGluZ2VkTGFuZXM7XG4gICAgICByb290ID0gcm9vdC53YXJtTGFuZXM7XG4gICAgICB2YXIgbm9uSWRsZVBlbmRpbmdMYW5lcyA9IHBlbmRpbmdMYW5lcyAmIDEzNDIxNzcyNztcbiAgICAgIDAgIT09IG5vbklkbGVQZW5kaW5nTGFuZXNcbiAgICAgICAgPyAoKHBlbmRpbmdMYW5lcyA9IG5vbklkbGVQZW5kaW5nTGFuZXMgJiB+c3VzcGVuZGVkTGFuZXMpLFxuICAgICAgICAgIDAgIT09IHBlbmRpbmdMYW5lc1xuICAgICAgICAgICAgPyAobmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMocGVuZGluZ0xhbmVzKSlcbiAgICAgICAgICAgIDogKChwaW5nZWRMYW5lcyAmPSBub25JZGxlUGVuZGluZ0xhbmVzKSxcbiAgICAgICAgICAgICAgMCAhPT0gcGluZ2VkTGFuZXNcbiAgICAgICAgICAgICAgICA/IChuZXh0TGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhwaW5nZWRMYW5lcykpXG4gICAgICAgICAgICAgICAgOiByb290SGFzUGVuZGluZ0NvbW1pdCB8fFxuICAgICAgICAgICAgICAgICAgKChyb290SGFzUGVuZGluZ0NvbW1pdCA9IG5vbklkbGVQZW5kaW5nTGFuZXMgJiB+cm9vdCksXG4gICAgICAgICAgICAgICAgICAwICE9PSByb290SGFzUGVuZGluZ0NvbW1pdCAmJlxuICAgICAgICAgICAgICAgICAgICAobmV4dExhbmVzID1cbiAgICAgICAgICAgICAgICAgICAgICBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhyb290SGFzUGVuZGluZ0NvbW1pdCkpKSkpXG4gICAgICAgIDogKChub25JZGxlUGVuZGluZ0xhbmVzID0gcGVuZGluZ0xhbmVzICYgfnN1c3BlbmRlZExhbmVzKSxcbiAgICAgICAgICAwICE9PSBub25JZGxlUGVuZGluZ0xhbmVzXG4gICAgICAgICAgICA/IChuZXh0TGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhub25JZGxlUGVuZGluZ0xhbmVzKSlcbiAgICAgICAgICAgIDogMCAhPT0gcGluZ2VkTGFuZXNcbiAgICAgICAgICAgICAgPyAobmV4dExhbmVzID0gZ2V0SGlnaGVzdFByaW9yaXR5TGFuZXMocGluZ2VkTGFuZXMpKVxuICAgICAgICAgICAgICA6IHJvb3RIYXNQZW5kaW5nQ29tbWl0IHx8XG4gICAgICAgICAgICAgICAgKChyb290SGFzUGVuZGluZ0NvbW1pdCA9IHBlbmRpbmdMYW5lcyAmIH5yb290KSxcbiAgICAgICAgICAgICAgICAwICE9PSByb290SGFzUGVuZGluZ0NvbW1pdCAmJlxuICAgICAgICAgICAgICAgICAgKG5leHRMYW5lcyA9IGdldEhpZ2hlc3RQcmlvcml0eUxhbmVzKHJvb3RIYXNQZW5kaW5nQ29tbWl0KSkpKTtcbiAgICAgIHJldHVybiAwID09PSBuZXh0TGFuZXNcbiAgICAgICAgPyAwXG4gICAgICAgIDogMCAhPT0gd2lwTGFuZXMgJiZcbiAgICAgICAgICAgIHdpcExhbmVzICE9PSBuZXh0TGFuZXMgJiZcbiAgICAgICAgICAgIDAgPT09ICh3aXBMYW5lcyAmIHN1c3BlbmRlZExhbmVzKSAmJlxuICAgICAgICAgICAgKChzdXNwZW5kZWRMYW5lcyA9IG5leHRMYW5lcyAmIC1uZXh0TGFuZXMpLFxuICAgICAgICAgICAgKHJvb3RIYXNQZW5kaW5nQ29tbWl0ID0gd2lwTGFuZXMgJiAtd2lwTGFuZXMpLFxuICAgICAgICAgICAgc3VzcGVuZGVkTGFuZXMgPj0gcm9vdEhhc1BlbmRpbmdDb21taXQgfHxcbiAgICAgICAgICAgICAgKDMyID09PSBzdXNwZW5kZWRMYW5lcyAmJiAwICE9PSAocm9vdEhhc1BlbmRpbmdDb21taXQgJiA0MTk0MDQ4KSkpXG4gICAgICAgICAgPyB3aXBMYW5lc1xuICAgICAgICAgIDogbmV4dExhbmVzO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja0lmUm9vdElzUHJlcmVuZGVyaW5nKHJvb3QsIHJlbmRlckxhbmVzKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAwID09PVxuICAgICAgICAocm9vdC5wZW5kaW5nTGFuZXMgJlxuICAgICAgICAgIH4ocm9vdC5zdXNwZW5kZWRMYW5lcyAmIH5yb290LnBpbmdlZExhbmVzKSAmXG4gICAgICAgICAgcmVuZGVyTGFuZXMpXG4gICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRFbnRhbmdsZWRMYW5lcyhyb290LCByZW5kZXJMYW5lcykge1xuICAgICAgMCAhPT0gKHJlbmRlckxhbmVzICYgOCkgJiYgKHJlbmRlckxhbmVzIHw9IHJlbmRlckxhbmVzICYgMzIpO1xuICAgICAgdmFyIGFsbEVudGFuZ2xlZExhbmVzID0gcm9vdC5lbnRhbmdsZWRMYW5lcztcbiAgICAgIGlmICgwICE9PSBhbGxFbnRhbmdsZWRMYW5lcylcbiAgICAgICAgZm9yIChcbiAgICAgICAgICByb290ID0gcm9vdC5lbnRhbmdsZW1lbnRzLCBhbGxFbnRhbmdsZWRMYW5lcyAmPSByZW5kZXJMYW5lcztcbiAgICAgICAgICAwIDwgYWxsRW50YW5nbGVkTGFuZXM7XG5cbiAgICAgICAgKSB7XG4gICAgICAgICAgdmFyIGluZGV4ID0gMzEgLSBjbHozMihhbGxFbnRhbmdsZWRMYW5lcyksXG4gICAgICAgICAgICBsYW5lID0gMSA8PCBpbmRleDtcbiAgICAgICAgICByZW5kZXJMYW5lcyB8PSByb290W2luZGV4XTtcbiAgICAgICAgICBhbGxFbnRhbmdsZWRMYW5lcyAmPSB+bGFuZTtcbiAgICAgICAgfVxuICAgICAgcmV0dXJuIHJlbmRlckxhbmVzO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21wdXRlRXhwaXJhdGlvblRpbWUobGFuZSwgY3VycmVudFRpbWUpIHtcbiAgICAgIHN3aXRjaCAobGFuZSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICBjYXNlIDg6XG4gICAgICAgIGNhc2UgNjQ6XG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnRUaW1lICsgMjUwO1xuICAgICAgICBjYXNlIDE2OlxuICAgICAgICBjYXNlIDMyOlxuICAgICAgICBjYXNlIDEyODpcbiAgICAgICAgY2FzZSAyNTY6XG4gICAgICAgIGNhc2UgNTEyOlxuICAgICAgICBjYXNlIDEwMjQ6XG4gICAgICAgIGNhc2UgMjA0ODpcbiAgICAgICAgY2FzZSA0MDk2OlxuICAgICAgICBjYXNlIDgxOTI6XG4gICAgICAgIGNhc2UgMTYzODQ6XG4gICAgICAgIGNhc2UgMzI3Njg6XG4gICAgICAgIGNhc2UgNjU1MzY6XG4gICAgICAgIGNhc2UgMTMxMDcyOlxuICAgICAgICBjYXNlIDI2MjE0NDpcbiAgICAgICAgY2FzZSA1MjQyODg6XG4gICAgICAgIGNhc2UgMTA0ODU3NjpcbiAgICAgICAgY2FzZSAyMDk3MTUyOlxuICAgICAgICAgI
15852HJldHVybiBjdXJyZW50VGltZSArIDVlMztcbiAgICAgICAgY2FzZSA0MTk0MzA0OlxuICAgICAgICBjYXNlIDgzODg2MDg6XG4gICAgICAgIGNhc2UgMTY3NzcyMTY6XG4gICAgICAgIGNhc2UgMzM1NTQ0MzI6XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICBjYXNlIDY3MTA4ODY0OlxuICAgICAgICBjYXNlIDEzNDIxNzcyODpcbiAgICAgICAgY2FzZSAyNjg0MzU0NTY6XG4gICAgICAgIGNhc2UgNTM2ODcwOTEyOlxuICAgICAgICBjYXNlIDEwNzM3NDE4MjQ6XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIlNob3VsZCBoYXZlIGZvdW5kIG1hdGNoaW5nIGxhbmVzLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LlwiXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgLTFcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBjbGFpbU5leHRSZXRyeUxhbmUoKSB7XG4gICAgICB2YXIgbGFuZSA9IG5leHRSZXRyeUxhbmU7XG4gICAgICBuZXh0UmV0cnlMYW5lIDw8PSAxO1xuICAgICAgMCA9PT0gKG5leHRSZXRyeUxhbmUgJiA2MjkxNDU2MCkgJiYgKG5leHRSZXRyeUxhbmUgPSA0MTk0MzA0KTtcbiAgICAgIHJldHVybiBsYW5lO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjcmVhdGVMYW5lTWFwKGluaXRpYWwpIHtcbiAgICAgIGZvciAodmFyIGxhbmVNYXAgPSBbXSwgaSA9IDA7IDMxID4gaTsgaSsrKSBsYW5lTWFwLnB1c2goaW5pdGlhbCk7XG4gICAgICByZXR1cm4gbGFuZU1hcDtcbiAgICB9XG4gICAgZnVuY3Rpb24gbWFya1Jvb3RVcGRhdGVkJDEocm9vdCwgdXBkYXRlTGFuZSkge1xuICAgICAgcm9vdC5wZW5kaW5nTGFuZXMgfD0gdXBkYXRlTGFuZTtcbiAgICAgIDI2ODQzNTQ1NiAhPT0gdXBkYXRlTGFuZSAmJlxuICAgICAgICAoKHJvb3Quc3VzcGVuZGVkTGFuZXMgPSAwKSxcbiAgICAgICAgKHJvb3QucGluZ2VkTGFuZXMgPSAwKSxcbiAgICAgICAgKHJvb3Qud2FybUxhbmVzID0gMCkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtYXJrUm9vdEZpbmlzaGVkKFxuICAgICAgcm9vdCxcbiAgICAgIGZpbmlzaGVkTGFuZXMsXG4gICAgICByZW1haW5pbmdMYW5lcyxcbiAgICAgIHNwYXduZWRMYW5lLFxuICAgICAgdXBkYXRlZExhbmVzLFxuICAgICAgc3VzcGVuZGVkUmV0cnlMYW5lc1xuICAgICkge1xuICAgICAgdmFyIHByZXZpb3VzbHlQZW5kaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lcztcbiAgICAgIHJvb3QucGVuZGluZ0xhbmVzID0gcmVtYWluaW5nTGFuZXM7XG4gICAgICByb290LnN1c3BlbmRlZExhbmVzID0gMDtcbiAgICAgIHJvb3QucGluZ2VkTGFuZXMgPSAwO1xuICAgICAgcm9vdC53YXJtTGFuZXMgPSAwO1xuICAgICAgcm9vdC5leHBpcmVkTGFuZXMgJj0gcmVtYWluaW5nTGFuZXM7XG4gICAgICByb290LmVudGFuZ2xlZExhbmVzICY9IHJlbWFpbmluZ0xhbmVzO1xuICAgICAgcm9vdC5lcnJvclJlY292ZXJ5RGlzYWJsZWRMYW5lcyAmPSByZW1haW5pbmdMYW5lcztcbiAgICAgIHJvb3Quc2hlbGxTdXNwZW5kQ291bnRlciA9IDA7XG4gICAgICB2Y
15852XIgZW50YW5nbGVtZW50cyA9IHJvb3QuZW50YW5nbGVtZW50cyxcbiAgICAgICAgZXhwaXJhdGlvblRpbWVzID0gcm9vdC5leHBpcmF0aW9uVGltZXMsXG4gICAgICAgIGhpZGRlblVwZGF0ZXMgPSByb290LmhpZGRlblVwZGF0ZXM7XG4gICAgICBmb3IgKFxuICAgICAgICByZW1haW5pbmdMYW5lcyA9IHByZXZpb3VzbHlQZW5kaW5nTGFuZXMgJiB+cmVtYWluaW5nTGFuZXM7XG4gICAgICAgIDAgPCByZW1haW5pbmdMYW5lcztcblxuICAgICAgKSB7XG4gICAgICAgIHZhciBpbmRleCA9IDMxIC0gY2x6MzIocmVtYWluaW5nTGFuZXMpLFxuICAgICAgICAgIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgICAgICBlbnRhbmdsZW1lbnRzW2luZGV4XSA9IDA7XG4gICAgICAgIGV4cGlyYXRpb25UaW1lc1tpbmRleF0gPSAtMTtcbiAgICAgICAgdmFyIGhpZGRlblVwZGF0ZXNGb3JMYW5lID0gaGlkZGVuVXBkYXRlc1tpbmRleF07XG4gICAgICAgIGlmIChudWxsICE9PSBoaWRkZW5VcGRhdGVzRm9yTGFuZSlcbiAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgaGlkZGVuVXBkYXRlc1tpbmRleF0gPSBudWxsLCBpbmRleCA9IDA7XG4gICAgICAgICAgICBpbmRleCA8IGhpZGRlblVwZGF0ZXNGb3JMYW5lLmxlbmd0aDtcbiAgICAgICAgICAgIGluZGV4KytcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHZhciB1cGRhdGUgPSBoaWRkZW5VcGRhdGVzRm9yTGFuZVtpbmRleF07XG4gICAgICAgICAgICBudWxsICE9PSB1cGRhdGUgJiYgKHVwZGF0ZS5sYW5lICY9IC01MzY4NzA5MTMpO1xuICAgICAgICAgIH1cbiAgICAgICAgcmVtYWluaW5nTGFuZXMgJj0gfmxhbmU7XG4gICAgICB9XG4gICAgICAwICE9PSBzcGF3bmVkTGFuZSAmJiBtYXJrU3Bhd25lZERlZmVycmVkTGFuZShyb290LCBzcGF3bmVkTGFuZSwgMCk7XG4gICAgICAwICE9PSBzdXNwZW5kZWRSZXRyeUxhbmVzICYmXG4gICAgICAgIDAgPT09IHVwZGF0ZWRMYW5lcyAmJlxuICAgICAgICAwICE9PSByb290LnRhZyAmJlxuICAgICAgICAocm9vdC5zdXNwZW5kZWRMYW5lcyB8PVxuICAgICAgICAgIHN1c3BlbmRlZFJldHJ5TGFuZXMgJiB+KHByZXZpb3VzbHlQZW5kaW5nTGFuZXMgJiB+ZmluaXNoZWRMYW5lcykpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtYXJrU3Bhd25lZERlZmVycmVkTGFuZShyb290LCBzcGF3bmVkTGFuZSwgZW50YW5nbGVkTGFuZXMpIHtcbiAgICAgIHJvb3QucGVuZGluZ0xhbmVzIHw9IHNwYXduZWRMYW5lO1xuICAgICAgcm9vdC5zdXNwZW5kZWRMYW5lcyAmPSB+c3Bhd25lZExhbmU7XG4gICAgICB2Y
15852XIgc3Bhd25lZExhbmVJbmRleCA9IDMxIC0gY2x6MzIoc3Bhd25lZExhbmUpO1xuICAgICAgcm9vdC5lbnRhbmdsZWRMYW5lcyB8PSBzcGF3bmVkTGFuZTtcbiAgICAgIHJvb3QuZW50YW5nbGVtZW50c1tzcGF3bmVkTGFuZUluZGV4XSA9XG4gICAgICAgIHJvb3QuZW50YW5nbGVtZW50c1tzcGF3bmVkTGFuZUluZGV4XSB8XG4gICAgICAgIDEwNzM3NDE4MjQgfFxuICAgICAgICAoZW50YW5nbGVkTGFuZXMgJiAyNjE5MzApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtYXJrUm9vdEVudGFuZ2xlZChyb290LCBlbnRhbmdsZWRMYW5lcykge1xuICAgICAgdmFyIHJvb3RFbnRhbmdsZWRMYW5lcyA9IChyb290LmVudGFuZ2xlZExhbmVzIHw9IGVudGFuZ2xlZExhbmVzKTtcbiAgICAgIGZvciAocm9vdCA9IHJvb3QuZW50YW5nbGVtZW50czsgcm9vdEVudGFuZ2xlZExhbmVzOyApIHtcbiAgICAgICAgdmFyIGluZGV4ID0gMzEgLSBjbHozMihyb290RW50YW5nbGVkTGFuZXMpLFxuICAgICAgICAgIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgICAgICAobGFuZSAmIGVudGFuZ2xlZExhbmVzKSB8IChyb290W2luZGV4XSAmIGVudGFuZ2xlZExhbmVzKSAmJlxuICAgICAgICAgIChyb290W2luZGV4XSB8PSBlbnRhbmdsZWRMYW5lcyk7XG4gICAgICAgIHJvb3RFbnRhbmdsZWRMYW5lcyAmPSB+bGFuZTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0QnVtcGVkTGFuZUZvckh5ZHJhdGlvbihyb290LCByZW5kZXJMYW5lcykge1xuICAgICAgdmFyIHJlbmRlckxhbmUgPSByZW5kZXJMYW5lcyAmIC1yZW5kZXJMYW5lcztcbiAgICAgIHJlbmRlckxhbmUgPVxuICAgICAgICAwICE9PSAocmVuZGVyTGFuZSAmIDQyKVxuICAgICAgICAgID8gMVxuICAgICAgICAgIDogZ2V0QnVtcGVkTGFuZUZvckh5ZHJhdGlvbkJ5TGFuZShyZW5kZXJMYW5lKTtcbiAgICAgIHJldHVybiAwICE9PSAocmVuZGVyTGFuZSAmIChyb290LnN1c3BlbmRlZExhbmVzIHwgcmVuZGVyTGFuZXMpKVxuICAgICAgICA/IDBcbiAgICAgICAgOiByZW5kZXJMYW5lO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRCdW1wZWRMYW5lRm9ySHlkcmF0aW9uQnlMYW5lKGxhbmUpIHtcbiAgICAgIHN3aXRjaCAobGFuZSkge1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgbGFuZSA9IDE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICBsYW5lID0gNDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzMjpcbiAgICAgICAgICBsYW5lID0gMTY7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjU2OlxuICAgICAgICBjYXNlIDUxMjpcbiAgICAgICAgY2FzZSAxMDI0OlxuICAgICAgICBjYXNlIDIwNDg6XG4gICAgICAgIGNhc2UgNDA5NjpcbiAgICAgICAgY2FzZSA4MTkyOlxuICAgICAgICBjYXNlIDE2Mzg0OlxuICAgICAgICBjYXNlIDMyNzY4OlxuICAgICAgICBjYXNlIDY1NTM2OlxuICAgICAgICBjYXNlIDEzMTA3MjpcbiAgICAgICAgY2FzZSAyNjIxNDQ6XG4gICAgICAgIGNhc2UgNTI0Mjg4OlxuICAgICAgICBjYXNlIDEwNDg1NzY6XG4gICAgICAgIGNhc2UgMjA5NzE1MjpcbiAgICAgICAgY2FzZSA0MTk0MzA0OlxuICAgICAgICBjYXNlIDgzODg2MDg6XG4gICAgICAgIGNhc2UgMTY3NzcyMTY6XG4gICAgICAgIGNhc2UgMzM1NTQ0MzI6XG4gICAgICAgICAgbGFuZSA9IDEyODtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyNjg0MzU0NTY6XG4gICAgICAgICAgbGFuZSA9IDEzNDIxNzcyODtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBsYW5lID0gMDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBsYW5lO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhZGRGaWJlclRvTGFuZXNNYXAocm9vdCwgZmliZXIsIGxhbmVzKSB7XG4gICAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpXG4gICAgICAgIGZvciAocm9vdCA9IHJvb3QucGVuZGluZ1VwZGF0ZXJzTGFuZU1hcDsgMCA8IGxhbmVzOyApIHtcbiAgICAgICAgICB2Y
15852XIgaW5kZXggPSAzMSAtIGNsejMyKGxhbmVzKSxcbiAgICAgICAgICAgIGxhbmUgPSAxIDw8IGluZGV4O1xuICAgICAgICAgIHJvb3RbaW5kZXhdLmFkZChmaWJlcik7XG4gICAgICAgICAgbGFuZXMgJj0gfmxhbmU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbW92ZVBlbmRpbmdGaWJlcnNUb01lbW9pemVkKHJvb3QsIGxhbmVzKSB7XG4gICAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpXG4gICAgICAgIGZvciAoXG4gICAgICAgICAgdmFyIHBlbmRpbmdVcGRhdGVyc0xhbmVNYXAgPSByb290LnBlbmRpbmdVcGRhdGVyc0xhbmVNYXAsXG4gICAgICAgICAgICBtZW1vaXplZFVwZGF0ZXJzID0gcm9vdC5tZW1vaXplZFVwZGF0ZXJzO1xuICAgICAgICAgIDAgPCBsYW5lcztcblxuICAgICAgICApIHtcbiAgICAgICAgICB2YXIgaW5kZXggPSAzMSAtIGNsejMyKGxhbmVzKTtcbiAgICAgICAgICByb290ID0gMSA8PCBpbmRleDtcbiAgICAgICAgICBpbmRleCA9IHBlbmRpbmdVcGRhdGVyc0xhbmVNYXBbaW5kZXhdO1xuICAgICAgICAgIDAgPCBpbmRleC5zaXplICYmXG4gICAgICAgICAgICAoaW5kZXguZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgICAgICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcbiAgICAgICAgICAgICAgKG51bGwgIT09IGFsdGVybmF0ZSAmJiBtZW1vaXplZFVwZGF0ZXJzLmhhcyhhbHRlcm5hdGUpKSB8fFxuICAgICAgICAgICAgICAgIG1lbW9pemVkVXBkYXRlcnMuYWRkKGZpYmVyKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgaW5kZXguY2xlYXIoKSk7XG4gICAgICAgICAgbGFuZXMgJj0gfnJvb3Q7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbGFuZXNUb0V2ZW50UHJpb3JpdHkobGFuZXMpIHtcbiAgICAgIGxhbmVzICY9IC1sYW5lcztcbiAgICAgIHJldHVybiAwICE9PSBEaXNjcmV0ZUV2ZW50UHJpb3JpdHkgJiYgRGlzY3JldGVFdmVudFByaW9yaXR5IDwgbGFuZXNcbiAgICAgICAgPyAwICE9PSBDb250aW51b3VzRXZlbnRQcmlvcml0eSAmJiBDb250aW51b3VzRXZlbnRQcmlvcml0eSA8IGxhbmVzXG4gICAgICAgICAgPyAwICE9PSAobGFuZXMgJiAxMzQyMTc3MjcpXG4gICAgICAgICAgICA/IERlZmF1bHRFdmVudFByaW9yaXR5XG4gICAgICAgICAgICA6IElkbGVFdmVudFByaW9yaXR5XG4gICAgICAgICAgOiBDb250aW51b3VzRXZlbnRQcmlvcml0eVxuICAgICAgICA6IERpc2NyZXRlRXZlbnRQcmlvcml0eTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVzb2x2ZVVwZGF0ZVByaW9yaXR5KCkge1xuICAgICAgdmFyIHVwZGF0ZVByaW9yaXR5ID0gUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucDtcbiAgICAgIGlmICgwICE9PSB1cGRhdGVQcmlvcml0eSkgcmV0dXJuIHVwZGF0ZVByaW9yaXR5O1xuICAgICAgdXBkYXRlUHJpb3JpdHkgPSB3aW5kb3cuZXZlbnQ7XG4gICAgICByZXR1cm4gdm9pZCAwID09PSB1cGRhdGVQcmlvcml0eVxuICAgICAgICA/IERlZmF1bHRFdmVudFByaW9yaXR5XG4gICAgICAgIDogZ2V0RXZlbnRQcmlvcml0eSh1cGRhdGVQcmlvcml0eS50eXBlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcnVuV2l0aFByaW9yaXR5KHByaW9yaXR5LCBmbikge1xuICAgICAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBSZWFjdERPTVNoYXJlZEludGVybmFscy5wO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIChSZWFjdERPTVNoYXJlZEludGVybmFscy5wID0gcHJpb3JpdHkpLCBmbigpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucCA9IHByZXZpb3VzUHJpb3JpdHk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRldGFjaERlbGV0ZWRJbnN0YW5jZShub2RlKSB7XG4gICAgICBkZWxldGUgbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XTtcbiAgICAgIGRlbGV0ZSBub2RlW2ludGVybmFsUHJvcHNLZXldO1xuICAgICAgZGVsZXRlIG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXJMaXN0ZW5lcnNLZXldO1xuICAgICAgZGVsZXRlIG5vZGVbaW50ZXJuYWxFdmVudEhhbmRsZXNTZXRLZXldO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSh0YXJnZXROb2RlKSB7XG4gICAgICB2Y
15852XIgdGFyZ2V0SW5zdDtcbiAgICAgIGlmICgodGFyZ2V0SW5zdCA9IHRhcmdldE5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV0pKSByZXR1cm4gdGFyZ2V0SW5zdDtcbiAgICAgIGZvciAodmFyIHBhcmVudE5vZGUgPSB0YXJnZXROb2RlLnBhcmVudE5vZGU7IHBhcmVudE5vZGU7ICkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKHRhcmdldEluc3QgPVxuICAgICAgICAgICAgcGFyZW50Tm9kZVtpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5XSB8fFxuICAgICAgICAgICAgcGFyZW50Tm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgcGFyZW50Tm9kZSA9IHRhcmdldEluc3QuYWx0ZXJuYXRlO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIG51bGwgIT09IHRhcmdldEluc3QuY2hpbGQgfHxcbiAgICAgICAgICAgIChudWxsICE9PSBwYXJlbnROb2RlICYmIG51bGwgIT09IHBhcmVudE5vZGUuY2hpbGQpXG4gICAgICAgICAgKVxuICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgdGFyZ2V0Tm9kZSA9IGdldFBhcmVudEh5ZHJhdGlvbkJvdW5kYXJ5KHRhcmdldE5vZGUpO1xuICAgICAgICAgICAgICBudWxsICE9PSB0YXJnZXROb2RlO1xuXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgaWYgKChwYXJlbnROb2RlID0gdGFyZ2V0Tm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudE5vZGU7XG4gICAgICAgICAgICAgIHRhcmdldE5vZGUgPSBnZXRQYXJlbnRIeWRyYXRpb25Cb3VuZGFyeSh0YXJnZXROb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGFyZ2V0SW5zdDtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXROb2RlID0gcGFyZW50Tm9kZTtcbiAgICAgICAgcGFyZW50Tm9kZSA9IHRhcmdldE5vZGUucGFyZW50Tm9kZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRJbnN0YW5jZUZyb21Ob2RlKG5vZGUpIHtcbiAgICAgIGlmIChcbiAgICAgICAgKG5vZGUgPSBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldIHx8IG5vZGVbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV0pXG4gICAgICApIHtcbiAgICAgICAgdmFyIHRhZyA9IG5vZGUudGFnO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgNSA9PT0gdGFnIHx8XG4gICAgICAgICAgNiA9PT0gdGFnIHx8XG4gICAgICAgICAgMTMgPT09IHRhZyB8fFxuICAgICAgICAgIDMxID09PSB0YWcgfHxcbiAgICAgICAgICAyNiA9PT0gdGFnIHx8XG4gICAgICAgICAgMjcgPT09IHRhZyB8fFxuICAgICAgICAgIDMgPT09IHRhZ1xuICAgICAgICApXG4gICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KSB7XG4gICAgICB2Y
15852XIgdGFnID0gaW5zdC50YWc7XG4gICAgICBpZiAoNSA9PT0gdGFnIHx8IDI2ID09PSB0YWcgfHwgMjcgPT09IHRhZyB8fCA2ID09PSB0YWcpXG4gICAgICAgIHJldHVybiBpbnN0LnN0YXRlTm9kZTtcbiAgICAgIHRocm93IEVycm9yKFwiZ2V0Tm9kZUZyb21JbnN0YW5jZTogSW52YWxpZCBhcmd1bWVudC5cIik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldFJlc291cmNlc0Zyb21Sb290KHJvb3QpIHtcbiAgICAgIHZhciByZXNvdXJjZXMgPSByb290W2ludGVybmFsUm9vdE5vZGVSZXNvdXJjZXNLZXldO1xuICAgICAgcmVzb3VyY2VzIHx8XG4gICAgICAgIChyZXNvdXJjZXMgPSByb290W2ludGVybmFsUm9vdE5vZGVSZXNvdXJjZXNLZXldID1cbiAgICAgICAgICB7IGhvaXN0YWJsZVN0eWxlczogbmV3IE1hcCgpLCBob2lzdGFibGVTY3JpcHRzOiBuZXcgTWFwKCkgfSk7XG4gICAgICByZXR1cm4gcmVzb3VyY2VzO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtYXJrTm9kZUFzSG9pc3RhYmxlKG5vZGUpIHtcbiAgICAgIG5vZGVbaW50ZXJuYWxIb2lzdGFibGVNYXJrZXJdID0gITA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNsZWFyUGVuZGluZ0xvYWRPbk5vZGUobm9kZSkge1xuICAgICAgbm9kZVtpbnRlcm5hbExvYWRQZW5kaW5nS2V5XSA9IHZvaWQgMDtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVnaXN0ZXJUd29QaGFzZUV2ZW50KHJlZ2lzdHJhdGlvbk5hbWUsIGRlcGVuZGVuY2llcykge1xuICAgICAgcmVnaXN0ZXJEaXJlY3RFdmVudChyZWdpc3RyYXRpb25OYW1lLCBkZXBlbmRlbmNpZXMpO1xuICAgICAgcmVnaXN0ZXJEaXJlY3RFdmVudChyZWdpc3RyYXRpb25OYW1lICsgXCJDYXB0dXJlXCIsIGRlcGVuZGVuY2llcyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlZ2lzdGVyRGlyZWN0RXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgZGVwZW5kZW5jaWVzKSB7XG4gICAgICByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzW3JlZ2lzdHJhdGlvbk5hbWVdICYmXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJFdmVudFJlZ2lzdHJ5OiBNb3JlIHRoYW4gb25lIHBsdWdpbiBhdHRlbXB0ZWQgdG8gcHVibGlzaCB0aGUgc2FtZSByZWdpc3RyYXRpb24gbmFtZSwgYCVzYC5cIixcbiAgICAgICAgICByZWdpc3RyYXRpb25OYW1lXG4gICAgICAgICk7XG4gICAgICByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzW3JlZ2lzdHJhdGlvbk5hbWVdID0gZGVwZW5kZW5jaWVzO1xuICAgICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gcmVnaXN0cmF0aW9uTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lc1tsb3dlckNhc2VkTmFtZV0gPSByZWdpc3RyYXRpb25OYW1lO1xuICAgICAgXCJvbkRvdWJsZUNsaWNrXCIgPT09IHJlZ2lzdHJhdGlvbk5hbWUgJiZcbiAgICAgICAgKHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMub25kYmxjbGljayA9IHJlZ2lzdHJhdGlvbk5hbWUpO1xuICAgICAgZm9yIChcbiAgICAgICAgcmVnaXN0cmF0aW9uTmFtZSA9IDA7XG4gICAgICAgIHJlZ2lzdHJhdGlvbk5hbWUgPCBkZXBlbmRlbmNpZXMubGVuZ3RoO1xuICAgICAgICByZWdpc3RyYXRpb25OYW1lKytcbiAgICAgIClcbiAgICAgICAgYWxsTmF0aXZlRXZlbnRzLmFkZChkZXBlbmRlbmNpZXNbcmVnaXN0cmF0aW9uTmFtZV0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja0NvbnRyb2xsZWRWYWx1ZVByb3BzKHRhZ05hbWUsIHByb3BzKSB7XG4gICAgICBoYXNSZWFkT25seVZhbHVlW3Byb3BzLnR5cGVdIHx8XG4gICAgICAgIHByb3BzLm9uQ2hhbmdlIHx8XG4gICAgICAgIHByb3BzLm9uSW5wdXQgfHxcbiAgICAgICAgcHJvcHMucmVhZE9ubHkgfHxcbiAgICAgICAgcHJvcHMuZGlzYWJsZWQgfHxcbiAgICAgICAgbnVsbCA9PSBwcm9wcy52YWx1ZSB8fFxuICAgICAgICAoXCJzZWxlY3RcIiA9PT0gdGFnTmFtZVxuICAgICAgICAgID8gY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCJZb3UgcHJvdmlkZWQgYSBgdmFsdWVgIHByb3AgdG8gYSBmb3JtIGZpZWxkIHdpdGhvdXQgYW4gYG9uQ2hhbmdlYCBoYW5kbGVyLiBUaGlzIHdpbGwgcmVuZGVyIGEgcmVhZC1vbmx5IGZpZWxkLiBJZiB0aGUgZmllbGQgc2hvdWxkIGJlIG11dGFibGUgdXNlIGBkZWZhdWx0VmFsdWVgLiBPdGhlcndpc2UsIHNldCBgb25DaGFuZ2VgLlwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIllvdSBwcm92aWRlZCBhIGB2YWx1ZWAgcHJvcCB0byBhIGZvcm0gZmllbGQgd2l0aG91dCBhbiBgb25DaGFuZ2VgIGhhbmRsZXIuIFRoaXMgd2lsbCByZW5kZXIgYSByZWFkLW9ubHkgZmllbGQuIElmIHRoZSBmaWVsZCBzaG91bGQgYmUgbXV0YWJsZSB1c2UgYGRlZmF1bHRWYWx1ZWAuIE90aGVyd2lzZSwgc2V0IGVpdGhlciBgb25DaGFuZ2VgIG9yIGByZWFkT25seWAuXCJcbiAgICAgICAgICAgICkpO1xuICAgICAgcHJvcHMub25DaGFuZ2UgfHxcbiAgICAgICAgcHJvcHMucmVhZE9ubHkgfHxcbiAgICAgICAgcHJvcHMuZGlzYWJsZWQgfHxcbiAgICAgICAgbnVsbCA9PSBwcm9wcy5jaGVja2VkIHx8XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJZb3UgcHJvdmlkZWQgYSBgY2hlY2tlZGAgcHJvcCB0byBhIGZvcm0gZmllbGQgd2l0aG91dCBhbiBgb25DaGFuZ2VgIGhhbmRsZXIuIFRoaXMgd2lsbCByZW5kZXIgYSByZWFkLW9ubHkgZmllbGQuIElmIHRoZSBmaWVsZCBzaG91bGQgYmUgbXV0YWJsZSB1c2UgYGRlZmF1bHRDaGVja2VkYC4gT3RoZXJ3aXNlLCBzZXQgZWl0aGVyIGBvbkNoYW5nZWAgb3IgYHJlYWRPbmx5YC5cIlxuICAgICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0F0dHJpYnV0ZU5hbWVTYWZlKGF0dHJpYnV0ZU5hbWUpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVDYWNoZSwgYXR0cmlidXRlTmFtZSkpXG4gICAgICAgIHJldHVybiAhMDtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGlsbGVnYWxBdHRyaWJ1dGVOYW1lQ2FjaGUsIGF0dHJpYnV0ZU5hbWUpKVxuICAgICAgICByZXR1cm4gITE7XG4gICAgICBpZiAoVkFMSURfQVRUUklCVVRFX05BTUVfUkVHRVgudGVzdChhdHRyaWJ1dGVOYW1lKSlcbiAgICAgICAgcmV0dXJuICh2YWxpZGF0ZWRBdHRyaWJ1dGVOYW1lQ2FjaG
15852VbYXR0cmlidXRlTmFtZV0gPSAhMCk7XG4gICAgICBpbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlW2F0dHJpYnV0ZU5hbWVdID0gITA7XG4gICAgICBjb25zb2xlLmVycm9yKFwiSW52YWxpZCBhdHRyaWJ1dGUgbmFtZTogYCVzYFwiLCBhdHRyaWJ1dGVOYW1lKTtcbiAgICAgIHJldHVybiAhMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHVzaE11dGF0aW9uQ29udGV4dCgpIHtcbiAgICAgIHZhciBwcmV2ID0gdmlld1RyYW5zaXRpb25NdXRhdGlvbkNvbnRleHQ7XG4gICAgICB2aWV3VHJhbnNpdGlvbk11dGF0aW9uQ29udGV4dCA9ICExO1xuICAgICAgcmV0dXJuIHByZXY7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldFZhbHVlRm9yQXR0cmlidXRlT25DdXN0b21Db21wb25lbnQobm9kZSwgbmFtZSwgZXhwZWN0ZWQpIHtcbiAgICAgIGlmIChpc0F0dHJpYnV0ZU5hbWVTYWZlKG5hbWUpKSB7XG4gICAgICAgIGlmICghbm9kZS5oYXNBdHRyaWJ1dGUobmFtZSkpIHtcbiAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBleHBlY3RlZCkge1xuICAgICAgICAgICAgY2FzZSBcInN5bWJvbFwiOlxuICAgICAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICAgICAgICByZXR1cm4gZXhwZWN0ZWQ7XG4gICAgICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICAgICAgcmV0dXJuIGV4cGVjdGVkO1xuICAgICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICAgICAgaWYgKCExID09PSBleHBlY3RlZCkgcmV0dXJuIGV4cGVjdGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdm9pZCAwID09PSBleHBlY3RlZCA/IHZvaWQgMCA6IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZSA9XG4gICAgICAgICAgXCJub25jZVwiID09PSBuYW1lLnRvTG93ZXJDYXNlKCkgPyBub2RlLm5vbmNlIDogbm9kZS5nZXRBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgIGlmIChcIlwiID09PSBub2RlICYmICEwID09PSBleHBlY3RlZCkgcmV0dXJuICEwO1xuICAgICAgICBjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKGV4cGVjdGVkLCBuYW1lKTtcbiAgICAgICAgcmV0dXJuIG5vZGUgPT09IFwiXCIgKyBleHBlY3RlZCA/IGV4cGVjdGVkIDogbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gc2V0VmFsdWVGb3JBdHRyaWJ1dGUobm9kZSwgbmFtZSwgdmFsdWUpIHtcbiAgICAgIGlmIChpc0F0dHJpYnV0ZU5hbWVTYWZlKG5hbWUpKVxuICAgICAgICBpZiAobnVsbCA9PT0gdmFsdWUpIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBcInVuZGVmaW5lZFwiOlxuICAgICAgICAgICAgY2FzZSBcImZ1bmN0aW9uXCI6XG4gICAgICAgICAgICBjYXNlIFwic3ltYm9sXCI6XG4gICAgICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICAgICAgICB2Y
15852XIgcHJlZml4ID0gbmFtZS50b0xvd2VyQ2FzZSgpLnNsaWNlKDAsIDUpO1xuICAgICAgICAgICAgICBpZiAoXCJkYXRhLVwiICE9PSBwcmVmaXggJiYgXCJhcmlhLVwiICE9PSBwcmVmaXgpIHtcbiAgICAgICAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbih2YWx1ZSwgbmFtZSk7XG4gICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNldFZhbHVlRm9yS25vd25BdHRyaWJ1dGUobm9kZSwgbmFtZSwgdmFsdWUpIHtcbiAgICAgIGlmIChudWxsID09PSB2YWx1ZSkgbm9kZS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICAgICAgY2FzZSBcImZ1bmN0aW9uXCI6XG4gICAgICAgICAgY2FzZSBcInN5bWJvbFwiOlxuICAgICAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBuYW1lKTtcbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBzZXRWYWx1ZUZvck5hbWVzcGFjZWRBdHRyaWJ1dGUobm9kZSwgbmFtZXNwYWNlLCBuYW1lLCB2YWx1ZSkge1xuICAgICAgaWYgKG51bGwgPT09IHZhbHVlKSBub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICAgIGVsc2Uge1xuICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICBjYXNlIFwic3ltYm9sXCI6XG4gICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24odmFsdWUsIG5hbWUpO1xuICAgICAgICBub2RlLnNldEF0dHJpYnV0ZU5TKG5hbWVzcGFjZSwgbmFtZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRUb1N0cmluZ1ZhbHVlKHZhbHVlKSB7XG4gICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICBjYXNlIFwiYmlnaW50XCI6XG4gICAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICAgICAgcmV0dXJuIGNoZWNrRm9ybUZpZWxkVmFsdWVTdHJpbmdDb2VyY2lvbih2YWx1ZSksIHZhbHVlO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBpc0NoZWNrYWJsZShlbGVtKSB7XG4gICAgICB2Y
15852XIgdHlwZSA9IGVsZW0udHlwZTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChlbGVtID0gZWxlbS5ub2RlTmFtZSkgJiZcbiAgICAgICAgXCJpbnB1dFwiID09PSBlbGVtLnRvTG93ZXJDYXNlKCkgJiZcbiAgICAgICAgKFwiY2hlY2tib3hcIiA9PT0gdHlwZSB8fCBcInJhZGlvXCIgPT09IHR5cGUpXG4gICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFja1ZhbHVlT25Ob2RlKG5vZGUsIHZhbHVlRmllbGQsIGN1cnJlbnRWYWx1ZSkge1xuICAgICAgdmFyIGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgICBub2RlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSxcbiAgICAgICAgdmFsdWVGaWVsZFxuICAgICAgKTtcbiAgICAgIGlmIChcbiAgICAgICAgIW5vZGUuaGFzT3duUHJvcGVydHkodmFsdWVGaWVsZCkgJiZcbiAgICAgICAgXCJ1bmRlZmluZWRcIiAhPT0gdHlwZW9mIGRlc2NyaXB0b3IgJiZcbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgZGVzY3JpcHRvci5nZXQgJiZcbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgZGVzY3JpcHRvci5zZXRcbiAgICAgICkge1xuICAgICAgICB2YXIgZ2V0ID0gZGVzY3JpcHRvci5nZXQsXG4gICAgICAgICAgc2V0ID0gZGVzY3JpcHRvci5zZXQ7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShub2RlLCB2YWx1ZUZpZWxkLCB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXQuY2FsbCh0aGlzKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNldDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBjaGVja0Zvcm1GaWVsZFZhbHVlU3RyaW5nQ29lcmNpb24odmFsdWUpO1xuICAgICAgICAgICAgY3VycmVudFZhbHVlID0gXCJcIiArIHZhbHVlO1xuICAgICAgICAgICAgc2V0LmNhbGwodGhpcywgdmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShub2RlLCB2YWx1ZUZpZWxkLCB7XG4gICAgICAgICAgZW51bWVyYWJsZTogZGVzY3JpcHRvci
158525lbnVtZXJhYmxlXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGdldFZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFZhbHVlO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc2V0VmFsdWU6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgY2hlY2tGb3JtRmllbGRWYWx1ZVN0cmluZ0NvZXJjaW9uKHZhbHVlKTtcbiAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IFwiXCIgKyB2YWx1ZTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0b3BUcmFja2luZzogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbm9kZS5fdmFsdWVUcmFja2VyID0gbnVsbDtcbiAgICAgICAgICAgIGRlbGV0ZSBub2RlW3ZhbHVlRmllbGRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhY2sobm9kZSkge1xuICAgICAgaWYgKCFub2RlLl92YWx1ZVRyYWNrZXIpIHtcbiAgICAgICAgdmFyIHZhbHVlRmllbGQgPSBpc0NoZWNrYWJsZShub2RlKSA/IFwiY2hlY2tlZFwiIDogXCJ2YWx1ZVwiO1xuICAgICAgICBub2RlLl92YWx1ZVRyYWNrZXIgPSB0cmFja1ZhbHVlT25Ob2RlKFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgdmFsdWVGaWVsZCxcbiAgICAgICAgICBcIlwiICsgbm9kZVt2YWx1ZUZpZWxkXVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVWYWx1ZUlmQ2hhbmdlZChub2RlKSB7XG4gICAgICBpZiAoIW5vZGUpIHJldHVybiAhMTtcbiAgICAgIHZhciB0cmFja2VyID0gbm9kZS5fdmFsdWVUcmFja2VyO1xuICAgICAgaWYgKCF0cmFja2VyKSByZXR1cm4gITA7XG4gICAgICB2Y
15852XIgbGFzdFZhbHVlID0gdHJhY2tlci5nZXRWYWx1ZSgpO1xuICAgICAgdmFyIHZhbHVlID0gXCJcIjtcbiAgICAgIG5vZGUgJiZcbiAgICAgICAgKHZhbHVlID0gaXNDaGVja2FibGUobm9kZSlcbiAgICAgICAgICA/IG5vZGUuY2hlY2tlZFxuICAgICAgICAgICAgPyBcInRydWVcIlxuICAgICAgICAgICAgOiBcImZhbHNlXCJcbiAgICAgICAgICA6IG5vZGUudmFsdWUpO1xuICAgICAgbm9kZSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIG5vZGUgIT09IGxhc3RWYWx1ZSA/ICh0cmFja2VyLnNldFZhbHVlKG5vZGUpLCAhMCkgOiAhMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZXNjYXBlU2VsZWN0b3JBdHRyaWJ1dGVWYWx1ZUluc2lkZURvdWJsZVF1b3Rlcyh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoXG4gICAgICAgIGVzY2FwZVNlbGVjdG9yQXR0cmlidXRlVmFsdWVJbnNpZGVEb3VibGVRdW90ZXNSZWdleCxcbiAgICAgICAgZnVuY3Rpb24gKGNoKSB7XG4gICAgICAgICAgcmV0dXJuIFwiXFxcXFwiICsgY2guY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikgKyBcIiBcIjtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdmFsaWRhdGVJbnB1dFByb3BzKGVsZW1lbnQsIHByb3BzKSB7XG4gICAgICB2b2lkIDAgPT09IHByb3BzLmNoZWNrZWQgfHxcbiAgICAgICAgdm9pZCAwID09PSBwcm9wcy5kZWZhdWx0Q2hlY2tlZCB8fFxuICAgICAgICBkaWRXYXJuQ2hlY2tlZERlZmF1bHRDaGVja2VkIHx8XG4gICAgICAgIChjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiJXMgY29udGFpbnMgYW4gaW5wdXQgb2YgdHlwZSAlcyB3aXRoIGJvdGggY2hlY2tlZCBhbmQgZGVmYXVsdENoZWNrZWQgcHJvcHMuIElucHV0IGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIChzcGVjaWZ5IGVpdGhlciB0aGUgY2hlY2tlZCBwcm9wLCBvciB0aGUgZGVmYXVsdENoZWNrZWQgcHJvcCwgYnV0IG5vdCBib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCBlbGVtZW50IGFuZCByZW1vdmUgb25lIG9mIHRoZXNlIHByb3BzLiBNb3JlIGluZm86IGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvY29udHJvbGxlZC1jb21wb25lbnRzXCIsXG4gICAgICAgICAgZ2V0Q3VycmVudEZpYmVyT3duZXJOYW1lSW5EZXZPck51bGwoKSB8fCBcIkEgY29tcG9uZW50XCIsXG4gICAgICAgICAgcHJvcHMudHlwZVxuICAgICAgICApLFxuICAgICAgICAoZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCA9ICEwKSk7XG4gICAgICB2b2lkIDAgPT09IHByb3BzLnZhbHVlIHx8XG4gICAgICAgIHZvaWQgMCA9PT0gcHJvcHMuZGVmYXVsdFZhbHVlIHx8XG4gICAgICAgIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSQxIHx8XG4gICAgICAgIChjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiJXMgY29udGFpbnMgYW4gaW5wdXQgb2YgdHlwZSAlcyB3aXRoIGJvdGggdmFsdWUgYW5kIGRlZmF1bHRWYWx1ZSBwcm9wcy4gSW5wdXQgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgKHNwZWNpZnkgZWl0aGVyIHRoZSB2YWx1ZSBwcm9wLCBvciB0aGUgZGVmYXVsdFZhbHVlIHByb3AsIGJ1dCBub3QgYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiBodHRwczovL3JlYWN0LmRldi9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50c1wiLFxuICAgICAgICAgIGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCkgfHwgXCJBIGNvbXBvbmVudFwiLFxuICAgICAgICAgIHByb3BzLnR5cGVcbiAgICAgICAgKSxcbiAgICAgICAgKGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSQxID0gITApKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlSW5wdXQoXG4gICAgICBlbGVtZW50LFxuICAgICAgdmFsdWUsXG4gICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICBsYXN0RGVmYXVsdFZhbHVlLFxuICAgICAgY2hlY2tlZCxcbiAgICAgIGRlZmF1bHRDaGVja2VkLFxuICAgICAgdHlwZSxcbiAgICAgIG5hbWVcbiAgICApIHtcbiAgICAgIGVsZW1lbnQubmFtZSA9IFwiXCI7XG4gICAgICBudWxsICE9IHR5cGUgJiZcbiAgICAgIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIHR5cGUgJiZcbiAgICAgIFwic3ltYm9sXCIgIT09IHR5cGVvZiB0eXBlICYmXG4gICAgICBcImJvb2xlYW5cIiAhPT0gdHlwZW9mIHR5cGVcbiAgICAgICAgPyAoY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbih0eXBlLCBcInR5cGVcIiksIChlbGVtZW50LnR5cGUgPSB0eXBlKSlcbiAgICAgICAgOiBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShcInR5cGVcIik7XG4gICAgICBpZiAobnVsbCAhPSB2YWx1ZSlcbiAgICAgICAgaWYgKFwibnVtYmVyXCIgPT09IHR5cGUpIHtcbiAgICAgICAgICBpZiAoKDAgPT09IHZhbHVlICYmIFwiXCIgPT09IGVsZW1lbnQudmFsdWUpIHx8IGVsZW1lbnQudmFsdWUgIT0gdmFsdWUpXG4gICAgICAgICAgICBlbGVtZW50LnZhbHVlID0gXCJcIiArIGdldFRvU3RyaW5nVmFsdWUodmFsdWUpO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICBlbGVtZW50LnZhbHVlICE9PSBcIlwiICsgZ2V0VG9TdHJpbmdWYWx1ZSh2YWx1ZSkgJiZcbiAgICAgICAgICAgIChlbGVtZW50LnZhbHVlID0gXCJcIiArIGdldFRvU3RyaW5nVmFsdWUodmFsdWUpKTtcbiAgICAgIGVsc2VcbiAgICAgICAgKFwic3VibWl0XCIgIT09IHR5cGUgJiYgXCJyZXNldFwiICE9PSB0eXBlKSB8fFxuICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFwidmFsdWVcIik7XG4gICAgICBudWxsICE9IHZhbHVlXG4gICAgICAgID8gXCJudW1iZXJcIiA9PT0gdHlwZSAmJiBlbGVtZW50LnZhbHVlID09IHZhbHVlXG4gICAgICAgICAgPyBzZXREZWZhdWx0VmFsdWUoZWxlbWVudCwgZ2V0VG9TdHJpbmdWYWx1ZShlbGVtZW50LnZhbHVlKSlcbiAgICAgICAgICA6IHNldERlZmF1bHRWYWx1ZShlbGVtZW50LCBnZXRUb1N0cmluZ1ZhbHVlKHZhbHVlKSlcbiAgICAgICAgOiBudWxsICE9IGRlZmF1bHRWYWx1ZVxuICAgICAgICAgID8gc2V0RGVmYXVsdFZhbHVlKGVsZW1lbnQsIGdldFRvU3RyaW5nVmFsdWUoZGVmYXVsdFZhbHVlKSlcbiAgICAgICAgICA6IG51bGwgIT0gbGFzdERlZmF1bHRWYWx1ZSAmJiBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShcInZhbHVlXCIpO1xuICAgICAgbnVsbCA9PSBjaGVja2VkICYmXG4gICAgICAgIG51bGwgIT0gZGVmYXVsdENoZWNrZWQgJiZcbiAgICAgICAgKGVsZW1lbnQuZGVmYXVsdENoZWNrZWQgPSAhIWRlZmF1bHRDaGVja2VkKTtcbiAgICAgIG51bGwgIT0gY2hlY2tlZCAmJlxuICAgICAgICAoZWxlbWVudC5jaGVja2VkID1cbiAgICAgICAgICBjaGVja2VkICYmXG4gICAgICAgICAgXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgY2hlY2tlZCAmJlxuICAgICAgICAgIFwic3ltYm9sXCIgIT09IHR5cGVvZiBjaGVja2VkKTtcbiAgICAgIG51bGwgIT0gbmFtZSAmJlxuICAgICAgXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgbmFtZSAmJlxuICAgICAgXCJzeW1ib2xcIiAhPT0gdHlwZW9mIG5hbWUgJiZcbiAgICAgIFwiYm9vbGVhblwiICE9PSB0eXBlb2YgbmFtZVxuICAgICAgICA/IChjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKG5hbWUsIFwibmFtZVwiKSxcbiAgICAgICAgICAoZWxlbWVudC5uYW1lID0gXCJcIiArIGdldFRvU3RyaW5nVmFsdWUobmFtZSkpKVxuICAgICAgICA6IGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFwibmFtZVwiKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaW5pdElucHV0KFxuICAgICAgZWxlbWVudCxcbiAgICAgIHZhbHVlLFxuICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgY2hlY2tlZCxcbiAgICAgIGRlZmF1bHRDaGVja2VkLFxuICAgICAgdHlwZSxcbiAgICAgIG5hbWUsXG4gICAgICBpc0h5ZHJhdGluZ1xuICAgICkge1xuICAgICAgbnVsbCAhPSB0eXBlICYmXG4gICAgICAgIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIHR5cGUgJiZcbiAgICAgICAgXCJzeW1ib2xcIiAhPT0gdHlwZW9mIHR5cGUgJiZcbiAgICAgICAgXCJib29sZWFuXCIgIT09IHR5cGVvZiB0eXBlICYmXG4gICAgICAgIChjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKHR5cGUsIFwidHlwZVwiKSwgKGVsZW1lbnQudHlwZSA9IHR5cGUpKTtcbiAgICAgIGlmIChudWxsICE9IHZhbHVlIHx8IG51bGwgIT0gZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhKFxuICAgICAgICAgICAgKFwic3VibWl0XCIgIT09IHR5cGUgJiYgXCJyZXNldFwiICE9PSB0eXBlKSB8fFxuICAgICAgICAgICAgKHZvaWQgMCAhPT0gdmFsdWUgJiYgbnVsbCAhPT0gdmFsdWUpXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICB0cmFjayhlbGVtZW50KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgI
15852H1cbiAgICAgICAgZGVmYXVsdFZhbHVlID1cbiAgICAgICAgICBudWxsICE9IGRlZmF1bHRWYWx1ZSA/IFwiXCIgKyBnZXRUb1N0cmluZ1ZhbHVlKGRlZmF1bHRWYWx1ZSkgOiBcIlwiO1xuICAgICAgICB2YWx1ZSA9IG51bGwgIT0gdmFsdWUgPyBcIlwiICsgZ2V0VG9TdHJpbmdWYWx1ZSh2YWx1ZSkgOiBkZWZhdWx0VmFsdWU7XG4gICAgICAgIGlzSHlkcmF0aW5nIHx8IHZhbHVlID09PSBlbGVtZW50LnZhbHVlIHx8IChlbGVtZW50LnZhbHVlID0gdmFsdWUpO1xuICAgICAgICBlbGVtZW50LmRlZmF1bHRWYWx1ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgY2hlY2tlZCA9IG51bGwgIT0gY2hlY2tlZCA/IGNoZWNrZWQgOiBkZWZhdWx0Q2hlY2tlZDtcbiAgICAgIGNoZWNrZWQgPVxuICAgICAgICBcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBjaGVja2VkICYmXG4gICAgICAgIFwic3ltYm9sXCIgIT09IHR5cGVvZiBjaGVja2VkICYmXG4gICAgICAgICEhY2hlY2tlZDtcbiAgICAgIGVsZW1lbnQuY2hlY2tlZCA9IGlzSHlkcmF0aW5nID8gZWxlbWVudC5jaGVja2VkIDogISFjaGVja2VkO1xuICAgICAgZWxlbWVudC5kZWZhdWx0Q2hlY2tlZCA9ICEhY2hlY2tlZDtcbiAgICAgIG51bGwgIT0gbmFtZSAmJlxuICAgICAgICBcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBuYW1lICYmXG4gICAgICAgIFwic3ltYm9sXCIgIT09IHR5cGVvZiBuYW1lICYmXG4gICAgICAgIFwiYm9vbGVhblwiICE9PSB0eXBlb2YgbmFtZSAmJlxuICAgICAgICAoY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbihuYW1lLCBcIm5hbWVcIiksIChlbGVtZW50Lm5hbWUgPSBuYW1lKSk7XG4gICAgICB0cmFjayhlbGVtZW50KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2V0RGVmYXVsdFZhbHVlKG5vZGUsIHZhbHVlKSB7XG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSAhPT0gXCJcIiArIHZhbHVlICYmIChub2RlLmRlZmF1bHRWYWx1ZSA9IFwiXCIgKyB2YWx1ZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlT3B0aW9uUHJvcHMoZWxlbWVudCwgcHJvcHMpIHtcbiAgICAgIG51bGwgPT0gcHJvcHMudmFsdWUgJiZcbiAgICAgICAgKFwib2JqZWN0XCIgPT09IHR5cGVvZiBwcm9wcy5jaGlsZHJlbiAmJiBudWxsICE9PSBwcm9wcy5jaGlsZHJlblxuICAgICAgICAgID8gUmVhY3QuQ2hpbGRyZW4uZm9yRWFjaChwcm9wcy5jaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgICAgIG51bGwgPT0gY2hpbGQgfHxcbiAgICAgICAgICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2YgY2hpbGQgfHxcbiAgICAgICAgICAgICAgICBcIm51bWJlclwiID09PSB0eXBlb2YgY2hpbGQgfHxcbiAgICAgICAgICAgICAgICBcImJpZ2ludFwiID09PSB0eXBlb2YgY2hpbGQgfHxcbiAgICAgICAgICAgICAgICBkaWRXYXJuSW52YWxpZENoaWxkIHx8XG4gICAgICAgICAgICAgICAgKChkaWRXYXJuSW52YWxpZENoaWxkID0gITApLFxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICBcIkNhbm5vdCBpbmZlciB0aGUgb3B0aW9uIHZhbHVlIG9mIGNvbXBsZXggY2hpbGRyZW4uIFBhc3MgYSBgdmFsdWVgIHByb3Agb3IgdXNlIGEgcGxhaW4gc3RyaW5nIGFzIGNoaWxkcmVuIHRvIDxvcHRpb24+LlwiXG4gICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIDogbnVsbCA9PSBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCB8fFxuICAgICAgICAgICAgZGlkV2FybkludmFsaWRJbm5lckhUTUwgfHxcbiAgICAgICAgICAgICgoZGlkV2FybkludmFsaWRJbm5lckhUTUwgPSAhMCksXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIlBhc3MgYSBgdmFsdWVgIHByb3AgaWYgeW91IHNldCBkYW5nZXJvdXNseUlubmVySFRNTCBzbyBSZWFjdCBrbm93cyB3aGljaCB2YWx1ZSBzaG91bGQgYmUgc2VsZWN0ZWQuXCJcbiAgICAgICAgICAgICkpKTtcbiAgICAgIG51bGwgPT0gcHJvcHMuc2VsZWN0ZWQgfHxcbiAgICAgICAgZGlkV2FyblNlbGVjdGVkU2V0T25PcHRpb24gfHxcbiAgICAgICAgKGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJVc2UgdGhlIGBkZWZhdWx0VmFsdWVgIG9yIGB2YWx1ZWAgcHJvcHMgb24gPHNlbGVjdD4gaW5zdGVhZCBvZiBzZXR0aW5nIGBzZWxlY3RlZGAgb24gPG9wdGlvbj4uXCJcbiAgICAgICAgKSxcbiAgICAgICAgKGRpZFdhcm5TZWxlY3RlZFNldE9uT3B0aW9uID0gITApKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkge1xuICAgICAgdmFyIG93bmVyTmFtZSA9IGdldEN1cnJlbnRGaWJlck93bmVyTmFtZUluRGV2T3JOdWxsKCk7XG4gICAgICByZXR1cm4gb3duZXJOYW1lXG4gICAgICAgID8gXCJcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgXCIgKyBvd25lck5hbWUgKyBcImAuXCJcbiAgICAgICAgOiBcIlwiO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVPcHRpb25zKG5vZGUsIG11bHRpcGxlLCBwcm9wVmFsdWUsIHNldERlZmF1bHRTZWxlY3RlZCkge1xuICAgICAgbm9kZSA9IG5vZGUub3B0aW9ucztcbiAgICAgIGlmIChtdWx0aXBsZSkge1xuICAgICAgICBtdWx0aXBsZSA9IHt9O1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BWYWx1ZS5sZW5ndGg7IGkrKylcbiAgICAgICAgICBtdWx0aXBsZVtcIiRcIiArIHByb3BWYWx1ZVtpXV0gPSAhMDtcbiAgICAgICAgZm9yIChwcm9wVmFsdWUgPSAwOyBwcm9wVmFsdWUgPCBub2RlLmxlbmd0aDsgcHJvcFZhbHVlKyspXG4gICAgICAgICAgKGkgPSBtdWx0aXBsZS5oYXNPd25Qcm9wZXJ0eShcIiRcIiArIG5vZGVbcHJvcFZhbHVlXS52YWx1ZSkpLFxuICAgICAgICAgICAgbm9kZVtwcm9wVmFsdWVdLnNlbGVjdGVkICE9PSBpICYmIChub2RlW3Byb3BWYWx1ZV0uc2VsZWN0ZWQgPSBpKSxcbiAgICAgICAgICAgIGkgJiYgc2V0RGVmYXVsdFNlbGVjdGVkICYmIChub2RlW3Byb3BWYWx1ZV0uZGVmYXVsdFNlbGVjdGVkID0gITApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvcFZhbHVlID0gXCJcIiArIGdldFRvU3RyaW5nVmFsdWUocHJvcFZhbHVlKTtcbiAgICAgICAgbXVsdGlwbGUgPSBudWxsO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbm9kZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChub2RlW2ldLnZhbHVlID09PSBwcm9wVmFsdWUpIHtcbiAgICAgICAgICAgIG5vZGVbaV0uc2VsZWN0ZWQgPSAhMDtcbiAgICAgICAgICAgI
15852HNldERlZmF1bHRTZWxlY3RlZCAmJiAobm9kZVtpXS5kZWZhdWx0U2VsZWN0ZWQgPSAhMCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIG51bGwgIT09IG11bHRpcGxlIHx8IG5vZGVbaV0uZGlzYWJsZWQgfHwgKG11bHRpcGxlID0gbm9kZVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgbnVsbCAhPT0gbXVsdGlwbGUgJiYgKG11bHRpcGxlLnNlbGVjdGVkID0gITApO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZVNlbGVjdFByb3BzKGVsZW1lbnQsIHByb3BzKSB7XG4gICAgICBmb3IgKGVsZW1lbnQgPSAwOyBlbGVtZW50IDwgdmFsdWVQcm9wTmFtZXMubGVuZ3RoOyBlbGVtZW50KyspIHtcbiAgICAgICAgdmFyIHByb3BOYW1lID0gdmFsdWVQcm9wTmFtZXNbZWxlbWVudF07XG4gICAgICAgIGlmIChudWxsICE9IHByb3BzW3Byb3BOYW1lXSkge1xuICAgICAgICAgIHZhciBwcm9wTmFtZUlzQXJyYXkgPSBpc0FycmF5SW1wbChwcm9wc1twcm9wTmFtZV0pO1xuICAgICAgICAgIHByb3BzLm11bHRpcGxlICYmICFwcm9wTmFtZUlzQXJyYXlcbiAgICAgICAgICAgID8gY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBcIlRoZSBgJXNgIHByb3Agc3VwcGxpZWQgdG8gPHNlbGVjdD4gbXVzdCBiZSBhbiBhcnJheSBpZiBgbXVsdGlwbGVgIGlzIHRydWUuJXNcIixcbiAgICAgICAgICAgICAgICBwcm9wTmFtZSxcbiAgICAgICAgICAgICAgICBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6ICFwcm9wcy5tdWx0aXBsZSAmJlxuICAgICAgICAgICAgICBwcm9wTmFtZUlzQXJyYXkgJiZcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBcIlRoZSBgJXNgIHByb3Agc3VwcGxpZWQgdG8gPHNlbGVjdD4gbXVzdCBiZSBhIHNjYWxhciB2YWx1ZSBpZiBgbXVsdGlwbGVgIGlzIGZhbHNlLiVzXCIsXG4gICAgICAgICAgICAgICAgcHJvcE5hbWUsXG4gICAgICAgICAgICAgICAgZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdm9pZCAwID09PSBwcm9wcy52YWx1ZSB8fFxuICAgICAgICB2b2lkIDAgPT09IHByb3BzLmRlZmF1bHRWYWx1ZSB8fFxuICAgICAgICBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUgfHxcbiAgICAgICAgKGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJTZWxlY3QgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgKHNwZWNpZnkgZWl0aGVyIHRoZSB2YWx1ZSBwcm9wLCBvciB0aGUgZGVmYXVsdFZhbHVlIHByb3AsIGJ1dCBub3QgYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgc2VsZWN0IGVsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogaHR0cHM6Ly9yZWFjdC5kZXYvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHNcIlxuICAgICAgICApLFxuICAgICAgICAoZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlID0gITApKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdmFsaWRhdGVUZXh0YXJlYVByb3BzKGVsZW1lbnQsIHByb3BzKSB7XG4gICAgICB2b2lkIDAgPT09IHByb3BzLnZhbHVlIHx8XG4gICAgICAgIHZvaWQgMCA9PT0gcHJvcHMuZGVmYXVsdFZhbHVlIHx8XG4gICAgICAgIGRpZFdhcm5WYWxEZWZhdWx0VmFsIHx8XG4gICAgICAgIChjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiJXMgY29udGFpbnMgYSB0ZXh0YXJlYSB3aXRoIGJvdGggdmFsdWUgYW5kIGRlZmF1bHRWYWx1ZSBwcm9wcy4gVGV4dGFyZWEgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgKHNwZWNpZnkgZWl0aGVyIHRoZSB2YWx1ZSBwcm9wLCBvciB0aGUgZGVmYXVsdFZhbHVlIHByb3AsIGJ1dCBub3QgYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgdGV4dGFyZWEgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogaHR0cHM6Ly9yZWFjdC5kZXYvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHNcIixcbiAgICAgICAgICBnZXRDdXJyZW50RmliZXJPd25lck5hbWVJbkRldk9yTnVsbCgpIHx8IFwiQSBjb21wb25lbnRcIlxuICAgICAgICApLFxuICAgICAgICAoZGlkV2FyblZhbERlZmF1bHRWYWwgPSAhMCkpO1xuICAgICAgbnVsbCAhPSBwcm9wcy5jaGlsZHJlbiAmJlxuICAgICAgICBudWxsID09IHByb3BzLnZhbHVlICYmXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJVc2UgdGhlIGBkZWZhdWx0VmFsdWVgIG9yIGB2YWx1ZWAgcHJvcHMgaW5zdGVhZCBvZiBzZXR0aW5nIGNoaWxkcmVuIG9uIDx0ZXh0YXJlYT4uXCJcbiAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlVGV4dGFyZWEoZWxlbWVudCwgdmFsdWUsIGRlZmF1bHRWYWx1ZSkge1xuICAgICAgaWYgKFxuICAgICAgICBudWxsICE9IHZhbHVlICYmXG4gICAgICAgICgodmFsdWUgPSBcIlwiICsgZ2V0VG9TdHJpbmdWYWx1ZSh2YWx1ZSkpLFxuICAgICAgICB2YWx1ZSAhPT0gZWxlbWVudC52YWx1ZSAmJiAoZWxlbWVudC52YWx1ZSA9IHZhbHVlKSxcbiAgICAgICAgbnVsbCA9PSBkZWZhdWx0VmFsdWUpXG4gICAgICApIHtcbiAgICAgICAgZWxlbWVudC5kZWZhdWx0VmFsdWUgIT09IHZhbHVlICYmIChlbGVtZW50LmRlZmF1bHRWYWx1ZSA9IHZhbHVlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZWxlbWVudC5kZWZhdWx0VmFsdWUgPVxuICAgICAgICBudWxsICE9IGRlZmF1bHRWYWx1ZSA/IFwiXCIgKyBnZXRUb1N0cmluZ1ZhbHVlKGRlZmF1bHRWYWx1ZSkgOiBcIlwiO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpbml0VGV4dGFyZWEoZWxlbWVudCwgdmFsdWUsIGRlZmF1bHRWYWx1ZSwgY2hpbGRyZW4pIHtcbiAgICAgIGlmIChudWxsID09IHZhbHVlKSB7XG4gICAgICAgIGlmIChudWxsICE9IGNoaWxkcmVuKSB7XG4gICAgICAgICAgaWYgKG51bGwgIT0gZGVmYXVsdFZhbHVlKVxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgIFwiSWYgeW91IHN1cHBseSBgZGVmYXVsdFZhbHVlYCBvbiBhIDx0ZXh0YXJlYT4sIGRvIG5vdCBwYXNzIGNoaWxkcmVuLlwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGlmIChpc0FycmF
158525SW1wbChjaGlsZHJlbikpIHtcbiAgICAgICAgICAgIGlmICgxIDwgY2hpbGRyZW4ubGVuZ3RoKVxuICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcIjx0ZXh0YXJlYT4gY2FuIG9ubHkgaGF2ZSBhdCBtb3N0IG9uZSBjaGlsZC5cIik7XG4gICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuWzBdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBjaGlsZHJlbjtcbiAgICAgICAgfVxuICAgICAgICBudWxsID09IGRlZmF1bHRWYWx1ZSAmJiAoZGVmYXVsdFZhbHVlID0gXCJcIik7XG4gICAgICAgIHZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgICAgfVxuICAgICAgZGVmYXVsdFZhbHVlID0gZ2V0VG9TdHJpbmdWYWx1ZSh2YWx1ZSk7XG4gICAgICBlbGVtZW50LmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgIGNoaWxkcmVuID0gZWxlbWVudC50ZXh0Q29udGVudDtcbiAgICAgIGNoaWxkcmVuID09PSBkZWZhdWx0VmFsdWUgJiZcbiAgICAgICAgXCJcIiAhPT0gY2hpbGRyZW4gJiZcbiAgICAgICAgbnVsbCAhPT0gY2hpbGRyZW4gJiZcbiAgICAgICAgKGVsZW1lbnQudmFsdWUgPSBjaGlsZHJlbik7XG4gICAgICB0cmFjayhlbGVtZW50KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZmluZE5vdGFibGVOb2RlKG5vZGUsIGluZGVudCkge1xuICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gbm9kZS5zZXJ2ZXJQcm9wcyAmJlxuICAgICAgICAwID09PSBub2RlLnNlcnZlclRhaWwubGVuZ3RoICYmXG4gICAgICAgIDEgPT09IG5vZGUuY2hpbGRyZW4ubGVuZ3RoICYmXG4gICAgICAgIDMgPCBub2RlLmRpc3RhbmNlRnJvbUxlYWYgJiZcbiAgICAgICAgbm9kZS5kaXN0YW5jZUZyb21MZWFmID4gMTUgLSBpbmRlbnRcbiAgICAgICAgPyBmaW5kTm90YWJsZU5vZGUobm9kZS5jaGlsZHJlblswXSwgaW5kZW50KVxuICAgICAgICA6IG5vZGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGluZGVudGF0aW9uKGluZGVudCkge1xuICAgICAgcmV0dXJuIFwiICBcIiArIFwiICBcIi5yZXBlYXQoaW5kZW50KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYWRkZWQoaW5kZW50KSB7XG4gICAgICByZXR1cm4gXCIrIFwiICsgXCIgIFwiLnJlcGVhdChpbmRlbnQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZW1vdmVkKGluZGVudCkge1xuICAgICAgcmV0dXJuIFwiLSBcIiArIFwiICBcIi5yZXBlYXQoaW5kZW50KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVzY3JpYmVGaWJlclR5cGUoZmliZXIpIHtcbiAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgMjY6XG4gICAgICAgIGNhc2UgMjc6XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICByZXR1cm4gZmliZXIudHlwZTtcbiAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICByZXR1cm4gXCJMYXp5XCI7XG4gICAgICAgIGNhc2UgMzE6XG4gICAgICAgICAgcmV0dXJuIFwiQWN0aXZpdHlcIjtcbiAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICByZXR1cm4gXCJTdXNwZW5zZVwiO1xuICAgICAgICBjYXNlIDE5OlxuICAgICAgICAgIHJldHVybiBcIlN1c3BlbnNlTGlzdFwiO1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgcmV0dXJuIChmaWJlciA9IGZpYmVyLnR5cGUpLCBmaWJlci5kaXNwbGF5TmFtZSB8fCBmaWJlci5uYW1lIHx8IG51bGw7XG4gICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChmaWJlciA9IGZpYmVyLnR5cGUucmVuZGVyKSwgZmliZXIuZGlzcGxheU5hbWUgfHwgZmliZXIubmFtZSB8fCBudWxsXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHJldHVybiAoZmliZXIgPSBmaWJlci50eXBlKSwgZmliZXIuZGlzcGxheU5hbWUgfHwgZmliZXIubmFtZSB8fCBudWxsO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBkZXNjcmliZVRleHROb2RlKGNvbnRlbnQsIG1heExlbmd0aCkge1xuICAgICAgcmV0dXJuIG5lZWRzRXNjYXBpbmcudGVzdChjb250ZW50KVxuICAgICAgICA/ICgoY29udGVudCA9IEpTT04uc3RyaW5naWZ5KGNvbnRlbnQpKSxcbiAgICAgICAgICBjb250ZW50Lmxlbmd0aCA+IG1heExlbmd0aCAtIDJcbiAgICAgICAgICAgID8gOCA+IG1heExlbmd0aFxuICAgICAgICAgICAgICA/ICd7XCIuLi5cIn0nXG4gICAgICAgICAgICAgIDogXCJ7XCIgKyBjb250ZW50LnNsaWNlKDAsIG1heExlbmd0aCAtIDcpICsgJy4uLlwifSdcbiAgICAgICAgICAgIDogXCJ7XCIgKyBjb250ZW50ICsgXCJ9XCIpXG4gICAgICAgIDogY29udGVudC5sZW5ndGggPiBtYXhMZW5ndGhcbiAgICAgICAgICA/IDUgPiBtYXhMZW5ndGhcbiAgICAgICAgICAgID8gJ3tcIi4uLlwifSdcbiAgICAgICAgICAgIDogY29udGVudC5zbGljZSgwLCBtYXhMZW5ndGggLSAzKSArIFwiLi4uXCJcbiAgICAgICAgICA6IGNvbnRlbnQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlc2NyaWJlVGV4dERpZmYoY2xpZW50VGV4dCwgc2VydmVyUHJvcHMsIGluZGVudCkge1xuICAgICAgdmFyIG1heExlbmd0aCA9IDEyMCAtIDIgKiBpbmRlbnQ7XG4gICAgICBpZiAobnVsbCA9PT0gc2VydmVyUHJvcHMpXG4gICAgICAgIHJldHVybiBhZGRlZChpbmRlbnQpICsgZGVzY3JpYmVUZXh0Tm9kZShjbGllbnRUZXh0LCBtYXhMZW5ndGgpICsgXCJcXG5cIjtcbiAgICAgIGlmIChcInN0cmluZ1wiID09PSB0eXBlb2Ygc2VydmVyUHJvcHMpIHtcbiAgICAgICAgZm9yIChcbiAgICAgICAgICB2Y
15852XIgZmlyc3REaWZmID0gMDtcbiAgICAgICAgICBmaXJzdERpZmYgPCBzZXJ2ZXJQcm9wcy5sZW5ndGggJiZcbiAgICAgICAgICBmaXJzdERpZmYgPCBjbGllbnRUZXh0Lmxlbmd0aCAmJlxuICAgICAgICAgIHNlcnZlclByb3BzLmNoYXJDb2RlQXQoZmlyc3REaWZmKSA9PT1cbiAgICAgICAgICAgIGNsaWVudFRleHQuY2hhckNvZGVBdChmaXJzdERpZmYpO1xuICAgICAgICAgIGZpcnN0RGlmZisrXG4gICAgICAgICk7XG4gICAgICAgIGZpcnN0RGlmZiA+IG1heExlbmd0aCAtIDggJiZcbiAgICAgICAgICAxMCA8IGZpcnN0RGlmZiAmJlxuICAgICAgICAgICgoY2xpZW50VGV4dCA9IFwiLi4uXCIgKyBjbGllbnRUZXh0LnNsaWNlKGZpcnN0RGlmZiAtIDgpKSxcbiAgICAgICAgICAoc2VydmVyUHJvcHMgPSBcIi4uLlwiICsgc2VydmVyUHJvcHMuc2xpY2UoZmlyc3REaWZmIC0gOCkpKTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBhZGRlZChpbmRlbnQpICtcbiAgICAgICAgICBkZXNjcmliZVRleHROb2RlKGNsaWVudFRleHQsIG1heExlbmd0aCkgK1xuICAgICAgICAgIFwiXFxuXCIgK1xuICAgICAgICAgIHJlbW92ZWQoaW5kZW50KSArXG4gICAgICAgICAgZGVzY3JpYmVUZXh0Tm9kZShzZXJ2ZXJQcm9wcywgbWF4TGVuZ3RoKSArXG4gICAgICAgICAgXCJcXG5cIlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgaW5kZW50YXRpb24oaW5kZW50KSArIGRlc2NyaWJlVGV4dE5vZGUoY2xpZW50VGV4dCwgbWF4TGVuZ3RoKSArIFwiXFxuXCJcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG9iamVjdE5hbWUob2JqZWN0KSB7XG4gICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ1xuICAgICAgICAuY2FsbChvYmplY3QpXG4gICAgICAgIC5yZXBsYWNlKC9eXFxbb2JqZWN0ICguKilcXF0kLywgZnVuY3Rpb24gKG
158520sIHAwKSB7XG4gICAgICAgICAgcmV0dXJuIHAwO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVzY3JpYmVWYWx1ZSh2YWx1ZSwgbWF4TGVuZ3RoKSB7XG4gICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICh2YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKSksXG4gICAgICAgICAgICB2YWx1ZS5sZW5ndGggPiBtYXhMZW5ndGhcbiAgICAgICAgICAgICAgPyA1ID4gbWF4TGVuZ3RoXG4gICAgICAgICAgICAgICAgPyAnXCIuLi5cIidcbiAgICAgICAgICAgICAgICA6IHZhbHVlLnNsaWNlKDAsIG1heExlbmd0aCAtIDQpICsgJy4uLlwiJ1xuICAgICAgICAgICAgICA6IHZhbHVlXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICAgIGlmIChudWxsID09PSB2YWx1ZSkgcmV0dXJuIFwibnVsbFwiO1xuICAgICAgICAgIGlmIChpc0FycmF5SW1wbCh2YWx1ZSkpIHJldHVybiBcIlsuLi5dXCI7XG4gICAgICAgICAgaWYgKHZhbHVlLiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEUpXG4gICAgICAgICAgICByZXR1cm4gKG1heExlbmd0aCA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh2YWx1ZS50eXBlKSlcbiAgICAgICAgICAgICAgPyBcIjxcIiArIG1heExlbmd0aCArIFwiPlwiXG4gICAgICAgICAgICAgIDogXCI8Li4uPlwiO1xuICAgICAgICAgIHZhciBuYW1lID0gb2JqZWN0TmFtZSh2YWx1ZSk7XG4gICAgICAgICAgaWYgKFwiT2JqZWN0XCIgPT09IG5hbWUpIHtcbiAgICAgICAgICAgIG5hbWUgPSBcIlwiO1xuICAgICAgICAgICAgbWF4TGVuZ3RoIC09IDI7XG4gICAgICAgICAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiB2YWx1ZSlcbiAgICAgICAgICAgICAgaWYgKHZhbHVlLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICAgICAgICAgIHZhciBqc29uUHJvcE5hbWUgPSBKU09OLnN0cmluZ2lmeShwcm9wTmFtZSk7XG4gICAgICAgICAgICAgICAganNvblByb3BOYW1lICE9PSAnXCInICsgcHJvcE5hbWUgKyAnXCInICYmXG4gICAgICAgICAgICAgICAgICAocHJvcE5hbWUgPSBqc29uUHJvcE5hbWUpO1xuICAgICAgICAgICAgICAgIG1heExlbmd0aCAtPSBwcm9wTmFtZS5sZW5ndGggLSAyO1xuICAgICAgICAgICAgICAgIGpzb25Qcm9wTmFtZSA9IGRlc2NyaWJlVmFsdWUoXG4gICAgICAgICAgICAgICAgICB2YWx1ZVtwcm9wTmFtZV0sXG4gICAgICAgICAgICAgICAgICAxNSA+IG1heExlbmd0aCA/IG1heExlbmd0aCA6IDE1XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBtYXhMZW5ndGggLT0ganNvblByb3BOYW1lLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAoMCA+IG1heExlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgbmFtZSArPSBcIlwiID09PSBuYW1lID8gXCIuLi5cIiA6IFwiLCAuLi5cIjtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBuYW1lICs9XG4gICAgICAgICAgICAgICAgICAoXCJcIiA9PT0gbmFtZSA/IFwiXCIgOiBcIixcIikgKyBwcm9wTmFtZSArIFwiOlwiICsganNvblByb3BOYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gXCJ7XCIgKyBuYW1lICsgXCJ9XCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuYW1lO1xuICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICByZXR1cm4gKG1heExlbmd0aCA9IHZhbHVlLmRpc3BsYXlOYW1lIHx8IHZhbHVlLm5hbWUpXG4gICAgICAgICAgICA/IFwiZnVuY3Rpb24gXCIgKyBtYXhMZW5ndGhcbiAgICAgICAgICAgIDogXCJmdW5jdGlvblwiO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBkZXNjcmliZVByb3BWYWx1ZSh2YWx1ZSwgbWF4TGVuZ3RoKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmdcIiAhPT0gdHlwZW9mIHZhbHVlIHx8IG5lZWRzRXNjYXBpbmcudGVzdCh2YWx1ZSlcbiAgICAgICAgPyBcIntcIiArIGRlc2NyaWJlVmFsdWUodmFsdWUsIG1heExlbmd0aCAtIDIpICsgXCJ9XCJcbiAgICAgICAgOiB2YWx1ZS5sZW5ndGggPiBtYXhMZW5ndGggLSAyXG4gICAgICAgICAgPyA1ID4gbWF4TGVuZ3RoXG4gICAgICAgICAgICA/ICdcIi4uLlwiJ1xuICAgICAgICAgICAgOiAnXCInICsgdmFsdWUuc2xpY2UoMCwgbWF4TGVuZ3RoIC0gNSkgKyAnLi4uXCInXG4gICAgICAgICAgOiAnXCInICsgdmFsdWUgKyAnXCInO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZXNjcmliZUV4cGFuZGVkRWxlbWVudCh0eXBlLCBwcm9wcywgcm93UHJlZml4KSB7XG4gICAgICB2Y
15852XIgcmVtYWluaW5nUm93TGVuZ3RoID0gMTIwIC0gcm93UHJlZml4Lmxlbmd0aCAtIHR5cGUubGVuZ3RoLFxuICAgICAgICBwcm9wZXJ0aWVzID0gW10sXG4gICAgICAgIHByb3BOYW1lO1xuICAgICAgZm9yIChwcm9wTmFtZSBpbiBwcm9wcylcbiAgICAgICAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KHByb3BOYW1lKSAmJiBcImNoaWxkcmVuXCIgIT09IHByb3BOYW1lKSB7XG4gICAgICAgICAgdmFyIHByb3BWYWx1ZSA9IGRlc2NyaWJlUHJvcFZhbHVlKFxuICAgICAgICAgICAgcHJvcHNbcHJvcE5hbWVdLFxuICAgICAgICAgICAgMTIwIC0gcm93UHJlZml4Lmxlbmd0aCAtIHByb3BOYW1lLmxlbmd0aCAtIDFcbiAgICAgICAgICApO1xuICAgICAgICAgIHJlbWFpbmluZ1Jvd0xlbmd0aCAtPSBwcm9wTmFtZS5sZW5ndGggKyBwcm9wVmFsdWUubGVuZ3RoICsgMjtcbiAgICAgICAgICBwcm9wZXJ0aWVzLnB1c2gocHJvcE5hbWUgKyBcIj1cIiArIHByb3BWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIHJldHVybiAwID09PSBwcm9wZXJ0aWVzLmxlbmd0aFxuICAgICAgICA/IHJvd1ByZWZpeCArIFwiPFwiICsgdHlwZSArIFwiPlxcblwiXG4gICAgICAgIDogMCA8IHJlbWFpbmluZ1Jvd0xlbmd0aFxuICAgICAgICAgID8gcm93UHJlZml4ICsgXCI8XCIgKyB0eXBlICsgXCIgXCIgKyBwcm9wZXJ0aWVzLmpvaW4oXCIgXCIpICsgXCI+XFxuXCJcbiAgICAgICAgICA6IHJvd1ByZWZpeCArXG4gICAgICAgICAgICBcIjxcIiArXG4gICAgICAgICAgICB0eXBlICtcbiAgICAgICAgICAgIFwiXFxuXCIgK1xuICAgICAgICAgICAgcm93UHJlZml4ICtcbiAgICAgICAgICAgIFwiICBcIiArXG4gICAgICAgICAgICBwcm9wZXJ0aWVzLmpvaW4oXCJcXG5cIiArIHJvd1ByZWZpeCArIFwiICBcIikgK1xuICAgICAgICAgICAgXCJcXG5cIiArXG4gICAgICAgICAgICByb3dQcmVmaXggK1xuICAgICAgICAgICAgXCI+XFxuXCI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlc2NyaWJlUHJvcGVydGllc0RpZmYoY2xpZW50T2JqZWN0LCBzZXJ2ZXJPYmplY3QsIGluZGVudCkge1xuICAgICAgdmFyIHByb3BlcnRpZXMgPSBcIlwiLFxuICAgICAgICByZW1haW5pbmdTZXJ2ZXJQcm9wZXJ0aWVzID0gYXNzaWduKHt9LCBzZXJ2ZXJPYmplY3QpLFxuICAgICAgICBwcm9wTmFtZTtcbiAgICAgIGZvciAocHJvcE5hbWUgaW4gY2xpZW50T2JqZWN0KVxuICAgICAgICBpZiAoY2xpZW50T2JqZWN0Lmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICAgIGRlbGV0ZSByZW1haW5pbmdTZXJ2ZXJQcm9wZXJ0aWVzW3Byb3BOYW1lXTtcbiAgICAgICAgICB2Y
15852XIgbWF4TGVuZ3RoID0gMTIwIC0gMiAqIGluZGVudCAtIHByb3BOYW1lLmxlbmd0aCAtIDIsXG4gICAgICAgICAgICBjbGllbnRQcm9wVmFsdWUgPSBkZXNjcmliZVZhbHVlKGNsaWVudE9iamVjdFtwcm9wTmFtZV0sIG1heExlbmd0aCk7XG4gICAgICAgICAgc2VydmVyT2JqZWN0Lmhhc093blByb3BlcnR5KHByb3BOYW1lKVxuICAgICAgICAgICAgPyAoKG1heExlbmd0aCA9IGRlc2NyaWJlVmFsdWUoc2VydmVyT2JqZWN0W3Byb3BOYW1lXSwgbWF4TGVuZ3RoKSksXG4gICAgICAgICAgICAgIChwcm9wZXJ0aWVzICs9XG4gICAgICAgICAgICAgICAgYWRkZWQoaW5kZW50KSArIHByb3BOYW1lICsgXCI6IFwiICsgY2xpZW50UHJvcFZhbHVlICsgXCJcXG5cIiksXG4gICAgICAgICAgICAgIChwcm9wZXJ0aWVzICs9XG4gICAgICAgICAgICAgICAgcmVtb3ZlZChpbmRlbnQpICsgcHJvcE5hbWUgKyBcIjogXCIgKyBtYXhMZW5ndGggKyBcIlxcblwiKSlcbiAgICAgICAgICAgIDogKHByb3BlcnRpZXMgKz1cbiAgICAgICAgICAgICAgICBhZGRlZChpbmRlbnQpICsgcHJvcE5hbWUgKyBcIjogXCIgKyBjbGllbnRQcm9wVmFsdWUgKyBcIlxcblwiKTtcbiAgICAgICAgfVxuICAgICAgZm9yICh2YXIgX3Byb3BOYW1lIGluIHJlbWFpbmluZ1NlcnZlclByb3BlcnRpZXMpXG4gICAgICAgIHJlbWFpbmluZ1NlcnZlclByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoX3Byb3BOYW1lKSAmJlxuICAgICAgICAgICgoY2xpZW50T2JqZWN0ID0gZGVzY3JpYmVWYWx1ZShcbiAgICAgICAgICAgIHJlbWFpbmluZ1NlcnZlclByb3BlcnRpZXNbX3Byb3BOYW1lXSxcbiAgICAgICAgICAgIDEyMCAtIDIgKiBpbmRlbnQgLSBfcHJvcE5hbWUubGVuZ3RoIC0gMlxuICAgICAgICAgICkpLFxuICAgICAgICAgIChwcm9wZXJ0aWVzICs9XG4gICAgICAgICAgICByZW1vdmVkKGluZGVudCkgKyBfcHJvcE5hbWUgKyBcIjogXCIgKyBjbGllbnRPYmplY3QgKyBcIlxcblwiKSk7XG4gICAgICByZXR1cm4gcHJvcGVydGllcztcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVzY3JpYmVFbGVtZW50RGlmZih0eXBlLCBjbGllbnRQcm9wcywgc2VydmVyUHJvcHMsIGluZGVudCkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBcIlwiLFxuICAgICAgICBzZXJ2ZXJQcm9wTmFtZXMgPSBuZXcgTWFwKCk7XG4gICAgICBmb3IgKHByb3BOYW1lJGpzY29tcCQwIGluIHNlcnZlclByb3BzKVxuICAgICAgICBzZXJ2ZXJQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSRqc2NvbXAkMCkgJiZcbiAgICAgICAgICBzZXJ2ZXJQcm9wTmFtZXMuc2V0KFxuICAgICAgICAgICAgcHJvcE5hbWUkanNjb21wJDAudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICAgIHByb3BOYW1lJGpzY29tcCQwXG4gICAgICAgICAgKTtcbiAgICAgIGlmICgxID09PSBzZXJ2ZXJQcm9wTmFtZXMuc2l6ZSAmJiBzZXJ2ZXJQcm9wTmFtZXMuaGFzKFwiY2hpbGRyZW5cIikpXG4gICAgICAgIGNvbnRlbnQgKz0gZGVzY3JpYmVFeHBhbmRlZEVsZW1lbnQoXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICBjbGllbnRQcm9wcyxcbiAgICAgICAgICBpbmRlbnRhdGlvbihpbmRlbnQpXG4gICAgICAgICk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgZm9yICh2YXIgX3Byb3BOYW1lMiBpbiBjbGllbnRQcm9wcylcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBjbGllbnRQcm9wcy5oYXNPd25Qcm9wZXJ0eShfcHJvcE5hbWUyKSAmJlxuICAgICAgICAgICAgXCJjaGlsZHJlblwiICE9PSBfcHJvcE5hbWUyXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB2Y
15852XIgbWF4TGVuZ3RoJGpzY29tcCQwID1cbiAgICAgICAgICAgICAgICAxMjAgLSAyICogKGluZGVudCArIDEpIC0gX3Byb3BOYW1lMi5sZW5ndGggLSAxLFxuICAgICAgICAgICAgICBzZXJ2ZXJQcm9wTmFtZSA9IHNlcnZlclByb3BOYW1lcy5nZXQoX3Byb3BOYW1lMi50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgIGlmICh2b2lkIDAgIT09IHNlcnZlclByb3BOYW1lKSB7XG4gICAgICAgICAgICAgIHNlcnZlclByb3BOYW1lcy5kZWxldGUoX3Byb3BOYW1lMi50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgICAgdmFyIHByb3BOYW1lJGpzY29tcCQwID0gY2xpZW50UHJvcHNbX3Byb3BOYW1lMl07XG4gICAgICAgICAgICAgIHNlcnZlclByb3BOYW1lID0gc2VydmVyUHJvcHNbc2VydmVyUHJvcE5hbWVdO1xuICAgICAgICAgICAgICB2YXIgY2xpZW50UHJvcFZhbHVlID0gZGVzY3JpYmVQcm9wVmFsdWUoXG4gICAgICAgICAgICAgICAgcHJvcE5hbWUkanNjb21wJDAsXG4gICAgICAgICAgICAgICAgbWF4TGVuZ3RoJGpzY29tcCQwXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIG1heExlbmd0aCRqc2NvbXAkMCA9IGRlc2NyaWJlUHJvcFZhbHVlKFxuICAgICAgICAgICAgICAgIHNlcnZlclByb3BOYW1lLFxuICAgICAgICAgICAgICAgIG1heExlbmd0aCRqc2NvbXAkMFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBcIm9iamVjdFwiID09PSB0eXBlb2YgcHJvcE5hbWUkanNjb21wJDAgJiZcbiAgICAgICAgICAgICAgbnVsbCAhPT0gcHJvcE5hbWUkanNjb21wJDAgJiZcbiAgICAgICAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIHNlcnZlclByb3BOYW1lICYmXG4gICAgICAgICAgICAgIG51bGwgIT09IHNlcnZlclByb3BOYW1lICYmXG4gICAgICAgICAgICAgIFwiT2JqZWN0XCIgPT09IG9iamVjdE5hbWUocHJvcE5hbWUkanNjb21wJDApICYmXG4gICAgICAgICAgICAgIFwiT2JqZWN0XCIgPT09IG9iamVjdE5hbWUoc2VydmVyUHJvcE5hbWUpICYmXG4gICAgICAgICAgICAgICgyIDwgT2JqZWN0LmtleXMocHJvcE5hbWUkanNjb21wJDApLmxlbmd0aCB8fFxuICAgICAgICAgICAgICAgIDIgPCBPYmplY3Qua2V5cyhzZXJ2ZXJQcm9wTmFtZSkubGVuZ3RoIHx8XG4gICAgICAgICAgICAgICAgLTEgPCBjbGllbnRQcm9wVmFsdWUuaW5kZXhPZihcIi4uLlwiKSB8fFxuICAgICAgICAgICAgICAgIC0xIDwgbWF4TGVuZ3RoJGpzY29tcCQwLmluZGV4T2YoXCIuLi5cIikpXG4gICAgICAgICAgICAgICAgPyAoY29udGVudCArPVxuICAgICAgICAgICAgICAgICAgICBpbmRlbnRhdGlvbihpbmRlbnQgKyAxKSArXG4gICAgICAgICAgICAgICAgICAgIF9wcm9wTmFtZTIgK1xuICAgICAgICAgICAgICAgICAgICBcIj17e1xcblwiICtcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmVQcm9wZXJ0aWVzRGlmZihcbiAgICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZSRqc2NvbXAkMCxcbiAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJQcm9wTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKyAyXG4gICAgICAgICAgICAgICAgICAgICkgK1xuICAgICAgICAgICAgICAgICAgICBpbmRlbnRhdGlvbihpbmRlbnQgKyAxKSArXG4gICAgICAgICAgICAgICAgICAgIFwifX1cXG5cIilcbiAgICAgICAgICAgICAgICA6ICgoY29udGVudCArPVxuICAgICAgICAgICAgICAgICAgICBhZGRlZChpbmRlbnQgKyAxKSArXG4gICAgICAgICAgICAgICAgICAgIF9wcm9wTmFtZTIgK1xuICAgICAgICAgICAgICAgICAgICBcIj1cIiArXG4gICAgICAgICAgICAgICAgICAgIGNsaWVudFByb3BWYWx1ZSArXG4gICAgICAgICAgICAgICAgICAgIFwiXFxuXCIpLFxuICAgICAgICAgICAgICAgICAgKGNvbnRlbnQgKz1cbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZChpbmRlbnQgKyAxKSArXG4gICAgICAgICAgICAgICAgICAgIF9wcm9wTmFtZTIgK1xuICAgICAgICAgICAgICAgICAgICBcIj1cIiArXG4gICAgICAgICAgICAgICAgICAgIG1heExlbmd0aCRqc2NvbXAkMCArXG4gICAgICAgICAgICAgICAgICAgIFwiXFxuXCIpKTtcbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICBjb250ZW50ICs9XG4gICAgICAgICAgICAgICAgaW5kZW50YXRpb24oaW5kZW50ICsgMSkgK1xuICAgICAgICAgICAgICAgIF9wcm9wTmFtZTIgK1xuICAgICAgICAgICAgICAgIFwiPVwiICtcbiAgICAgICAgICAgICAgICBkZXNjcmliZVByb3BWYWx1ZShjbGllbnRQcm9wc1tfcHJvcE5hbWUyXSwgbWF4TGVuZ3RoJGpzY29tcCQwKSArXG4gICAgICAgICAgICAgICAgXCJcXG5cIjtcbiAgICAgICAgICB9XG4gICAgICAgIHNlcnZlclByb3BOYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wTmFtZSkge1xuICAgICAgICAgIGlmIChcImNoaWxkcmVuXCIgIT09IHByb3BOYW1lKSB7XG4gICAgICAgICAgICB2Y
15852XIgbWF4TGVuZ3RoID0gMTIwIC0gMiAqIChpbmRlbnQgKyAxKSAtIHByb3BOYW1lLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICBjb250ZW50ICs9XG4gICAgICAgICAgICAgIHJlbW92ZWQoaW5kZW50ICsgMSkgK1xuICAgICAgICAgICAgICBwcm9wTmFtZSArXG4gICAgICAgICAgICAgIFwiPVwiICtcbiAgICAgICAgICAgICAgZGVzY3JpYmVQcm9wVmFsdWUoc2VydmVyUHJvcHNbcHJvcE5hbWVdLCBtYXhMZW5ndGgpICtcbiAgICAgICAgICAgICAgXCJcXG5cIjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb250ZW50ID1cbiAgICAgICAgICBcIlwiID09PSBjb250ZW50XG4gICAgICAgICAgICA/IGluZGVudGF0aW9uKGluZGVudCkgKyBcIjxcIiArIHR5cGUgKyBcIj5cXG5cIlxuICAgICAgICAgICAgOiBpbmRlbnRhdGlvbihpbmRlbnQpICtcbiAgICAgICAgICAgICAgXCI8XCIgK1xuICAgICAgICAgICAgICB0eXBlICtcbiAgICAgICAgICAgICAgXCJcXG5cIiArXG4gICAgICAgICAgICAgIGNvbnRlbnQgK1xuICAgICAgICAgICAgICBpbmRlbnRhdGlvbihpbmRlbnQpICtcbiAgICAgICAgICAgICAgXCI+XFxuXCI7XG4gICAgICB9XG4gICAgICB0eXBlID0gc2VydmVyUHJvcHMuY2hpbGRyZW47XG4gICAgICBjbGllbnRQcm9wcyA9IGNsaWVudFByb3BzLmNoaWxkcmVuO1xuICAgICAgaWYgKFxuICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2YgdHlwZSB8fFxuICAgICAgICBcIm51bWJlclwiID09PSB0eXBlb2YgdHlwZSB8fFxuICAgICAgICBcImJpZ2ludFwiID09PSB0eXBlb2YgdHlwZVxuICAgICAgKSB7XG4gICAgICAgIHNlcnZlclByb3BOYW1lcyA9IFwiXCI7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2YgY2xpZW50UHJvcHMgfHxcbiAgICAgICAgICBcIm51bWJlclwiID09PSB0eXBlb2YgY2xpZW50UHJvcHMgfHxcbiAgICAgICAgICBcImJpZ2ludFwiID09PSB0eXBlb2YgY2xpZW50UHJvcHNcbiAgICAgICAgKVxuICAgICAgICAgIHNlcnZlclByb3BOYW1lcyA9IFwiXCIgKyBjbGllbnRQcm9wcztcbiAgICAgICAgY29udGVudCArPSBkZXNjcmliZVRleHREaWZmKHNlcnZlclByb3BOYW1lcywgXCJcIiArIHR5cGUsIGluZGVudCArIDEpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIGNsaWVudFByb3BzIHx8XG4gICAgICAgIFwibnVtYmVyXCIgPT09IHR5cGVvZiBjbGllbnRQcm9wcyB8fFxuICAgICAgICBcImJpZ2ludFwiID09PSB0eXBlb2YgY2xpZW50UHJvcHNcbiAgICAgIClcbiAgICAgICAgY29udGVudCA9XG4gICAgICAgICAgbnVsbCA9PSB0eXBlXG4gICAgICAgICAgICA/IGNvbnRlbnQgKyBkZXNjcmliZVRleHREaWZmKFwiXCIgKyBjbGllbnRQcm9wcywgbnVsbCwgaW5kZW50ICsgMSlcbiAgICAgICAgICAgIDogY29udGVudCArIGRlc2NyaWJlVGV4dERpZmYoXCJcIiArIGNsaWVudFByb3BzLCB2b2lkIDAsIGluZGVudCArIDEpO1xuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlc2NyaWJlU2libGluZ0ZpYmVyKGZpYmVyLCBpbmRlbnQpIHtcbiAgICAgIHZhciB0eXBlID0gZGVzY3JpYmVGaWJlclR5cGUoZmliZXIpO1xuICAgICAgaWYgKG51bGwgPT09IHR5cGUpIHtcbiAgICAgICAgdHlwZSA9IFwiXCI7XG4gICAgICAgIGZvciAoZmliZXIgPSBmaWJlci5jaGlsZDsgZmliZXI7IClcbiAgICAgICAgICAodHlwZSArPSBkZXNjcmliZVNpYmxpbmdGaWJlcihmaWJlciwgaW5kZW50KSksXG4gICAgICAgICAgICAoZmliZXIgPSBmaWJlci5zaWJsaW5nKTtcbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gaW5kZW50YXRpb24oaW5kZW50KSArIFwiPFwiICsgdHlwZSArIFwiPlxcblwiO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZXNjcmliZU5vZGUobm9kZSwgaW5kZW50KSB7XG4gICAgICB2Y
15852XIgc2tpcFRvTm9kZSA9IGZpbmROb3RhYmxlTm9kZShub2RlLCBpbmRlbnQpO1xuICAgICAgaWYgKFxuICAgICAgICBza2lwVG9Ob2RlICE9PSBub2RlICYmXG4gICAgICAgICgxICE9PSBub2RlLmNoaWxkcmVuLmxlbmd0aCB8fCBub2RlLmNoaWxkcmVuWzBdICE9PSBza2lwVG9Ob2RlKVxuICAgICAgKVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIGluZGVudGF0aW9uKGluZGVudCkgKyBcIi4uLlxcblwiICsgZGVzY3JpYmVOb2RlKHNraXBUb05vZGUsIGluZGVudCArIDEpXG4gICAgICAgICk7XG4gICAgICBza2lwVG9Ob2RlID0gXCJcIjtcbiAgICAgIHZhciBkZWJ1Z0luZm8gPSBub2RlLmZpYmVyLl9kZWJ1Z0luZm87XG4gICAgICBpZiAoZGVidWdJbmZvKVxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlYnVnSW5mby5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBzZXJ2ZXJDb21wb25lbnROYW1lID0gZGVidWdJbmZvW2ldLm5hbWU7XG4gICAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIHNlcnZlckNvbXBvbmVudE5hbWUgJiZcbiAgICAgICAgICAgICgoc2tpcFRvTm9kZSArPVxuICAgICAgICAgICAgICBpbmRlbnRhdGlvbihpbmRlbnQpICsgXCI8XCIgKyBzZXJ2ZXJDb21wb25lbnROYW1lICsgXCI+XFxuXCIpLFxuICAgICAgICAgICAgaW5kZW50KyspO1xuICAgICAgICB9XG4gICAgICBkZWJ1Z0luZm8gPSBcIlwiO1xuICAgICAgaSA9IG5vZGUuZmliZXIucGVuZGluZ1Byb3BzO1xuICAgICAgaWYgKDYgPT09IG5vZGUuZmliZXIudGFnKVxuICAgICAgICAoZGVidWdJbmZvID0gZGVzY3JpYmVUZXh0RGlmZihpLCBub2RlLnNlcnZlclByb3BzLCBpbmRlbnQpKSwgaW5kZW50Kys7XG4gICAgICBlbHNlIGlmIChcbiAgICAgICAgKChzZXJ2ZXJDb21wb25lbnROYW1lID0gZGVzY3JpYmVGaWJlclR5cGUobm9kZS5maWJlcikpLFxuICAgICAgICBudWxsICE9PSBzZXJ2ZXJDb21wb25lbnROYW1lKVxuICAgICAgKVxuICAgICAgICBpZiAodm9pZCAwID09PSBub2RlLnNlcnZlclByb3BzKSB7XG4gICAgICAgICAgZGVidWdJbmZvID0gaW5kZW50O1xuICAgICAgICAgIHZhciBtYXhMZW5ndGggPSAxMjAgLSAyICogZGVidWdJbmZvIC0gc2VydmVyQ29tcG9uZW50TmFtZS5sZW5ndGggLSAyLFxuICAgICAgICAgICAgY29udGVudCA9IFwiXCI7XG4gICAgICAgICAgZm9yIChwcm9wTmFtZSBpbiBpKVxuICAgICAgICAgICAgaWYgKGkuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpICYmIFwiY2hpbGRyZW5cIiAhPT0gcHJvcE5hbWUpIHtcbiAgICAgICAgICAgICAgdmFyIHByb3BWYWx1ZSA9IGRlc2NyaWJlUHJvcFZhbHVlKGlbcHJvcE5hbWVdLCAxNSk7XG4gICAgICAgICAgICAgIG1heExlbmd0aCAtPSBwcm9wTmFtZS5sZW5ndGggKyBwcm9wVmFsdWUubGVuZ3RoICsgMjtcbiAgICAgICAgICAgICAgaWYgKDAgPiBtYXhMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50ICs9IFwiIC4uLlwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnRlbnQgKz0gXCIgXCIgKyBwcm9wTmFtZSArIFwiPVwiICsgcHJvcFZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGRlYnVnSW5mbyA9XG4gICAgICAgICAgICBpbmRlbnRhdGlvbihkZWJ1Z0luZm8pICtcbiAgICAgICAgICAgIFwiPFwiICtcbiAgICAgICAgICAgIHNlcnZlckNvbXBvbmVudE5hbWUgK1xuICAgICAgICAgICAgY29udGVudCArXG4gICAgICAgICAgICBcIj5cXG5cIjtcbiAgICAgICAgICBpbmRlbnQrKztcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgbnVsbCA9PT0gbm9kZS5zZXJ2ZXJQcm9wc1xuICAgICAgICAgICAgPyAoKGRlYnVnSW5mbyA9IGRlc2NyaWJlRXhwYW5kZWRFbGVtZW50KFxuICAgICAgICAgICAgICAgIHNlcnZlckNvbXBvbmVudE5hbWUsXG4gICAgICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICAgICBhZGRlZChpbmRlbnQpXG4gICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICBpbmRlbnQrKylcbiAgICAgICAgICAgIDogXCJzdHJpbmdcIiA9PT0gdHlwZW9mIG5vZGUuc2VydmVyUHJvcHNcbiAgICAgICAgICAgICAgPyBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgXCJTaG91bGQgbm90IGhhdmUgbWF0Y2hlZCBhIG5vbiBIb3N0VGV4dCBmaWJlciB0byBhIFRleHQgbm9kZS4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC5cIlxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiAoKGRlYnVnSW5mbyA9IGRlc2NyaWJlRWxlbWVudERpZmYoXG4gICAgICAgICAgICAgICAgICBzZXJ2ZXJDb21wb25lbnROYW1lLFxuICAgICAgICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICAgICAgIG5vZGUuc2VydmVyUHJvcHMsXG4gICAgICAgICAgICAgICAgICBpbmRlbnRcbiAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICBpbmRlbnQrKyk7XG4gICAgICB2Y
15852XIgcHJvcE5hbWUgPSBcIlwiO1xuICAgICAgaSA9IG5vZGUuZmliZXIuY2hpbGQ7XG4gICAgICBmb3IgKFxuICAgICAgICBzZXJ2ZXJDb21wb25lbnROYW1lID0gMDtcbiAgICAgICAgaSAmJiBzZXJ2ZXJDb21wb25lbnROYW1lIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7XG5cbiAgICAgIClcbiAgICAgICAgKG1heExlbmd0aCA9IG5vZGUuY2hpbGRyZW5bc2VydmVyQ29tcG9uZW50TmFtZV0pLFxuICAgICAgICAgIG1heExlbmd0aC5maWJlciA9PT0gaVxuICAgICAgICAgICAgPyAoKHByb3BOYW1lICs9IGRlc2NyaWJlTm9kZShtYXhMZW5ndGgsIGluZGVudCkpLFxuICAgICAgICAgICAgICBzZXJ2ZXJDb21wb25lbnROYW1lKyspXG4gICAgICAgICAgICA6IChwcm9wTmFtZSArPSBkZXNjcmliZVNpYmxpbmdGaWJlcihpLCBpbmRlbnQpKSxcbiAgICAgICAgICAoaSA9IGkuc2libGluZyk7XG4gICAgICBpICYmXG4gICAgICAgIDAgPCBub2RlLmNoaWxkcmVuLmxlbmd0aCAmJlxuICAgICAgICAocHJvcE5hbWUgKz0gaW5kZW50YXRpb24oaW5kZW50KSArIFwiLi4uXFxuXCIpO1xuICAgICAgaSA9IG5vZGUuc2VydmVyVGFpbDtcbiAgICAgIG51bGwgPT09IG5vZGUuc2VydmVyUHJvcHMgJiYgaW5kZW50LS07XG4gICAgICBmb3IgKG5vZGUgPSAwOyBub2RlIDwgaS5sZW5ndGg7IG5vZGUrKylcbiAgICAgICAgKHNlcnZlckNvbXBvbmVudE5hbWUgPSBpW25vZGVdKSxcbiAgICAgICAgICAocHJvcE5hbWUgPVxuICAgICAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIHNlcnZlckNvbXBvbmVudE5hbWVcbiAgICAgICAgICAgICAgPyBwcm9wTmFtZSArXG4gICAgICAgICAgICAgICAgKHJlbW92ZWQoaW5kZW50KSArXG4gICAgICAgICAgICAgICAgICBkZXNjcmliZVRleHROb2RlKHNlcnZlckNvbXBvbmVudE5hbWUsIDEyMCAtIDIgKiBpbmRlbnQpICtcbiAgICAgICAgICAgICAgICAgIFwiXFxuXCIpXG4gICAgICAgICAgICAgIDogcHJvcE5hbWUgK1xuICAgICAgICAgICAgICAgIGRlc2NyaWJlRXhwYW5kZWRFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgc2VydmVyQ29tcG9uZW50TmFtZS50eXBlLFxuICAgICAgICAgICAgICAgICAgc2VydmVyQ29tcG9uZW50TmFtZS5wcm9wcyxcbiAgICAgICAgICAgICAgICAgIHJlbW92ZWQoaW5kZW50KVxuICAgICAgICAgICAgICAgICkpO1xuICAgICAgcmV0dXJuIHNraXBUb05vZGUgKyBkZWJ1Z0luZm8gKyBwcm9wTmFtZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVzY3JpYmVEaWZmKHJvb3ROb2RlKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gXCJcXG5cXG5cIiArIGRlc2NyaWJlTm9kZShyb290Tm9kZSwgMCk7XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBkZXNjcmliZUFuY2VzdG9ycyhhbmNlc3RvciwgY2hpbGQsIHByb3BzKSB7XG4gICAgICBmb3IgKHZhciBmaWJlciA9IGNoaWxkLCBub2RlID0gbnVsbCwgZGlzdGFuY2VGcm9tTGVhZiA9IDA7IGZpYmVyOyApXG4gICAgICAgIGZpYmVyID09PSBhbmNlc3RvciAmJiAoZGlzdGFuY2VGcm9tTGVhZiA9IDApLFxuICAgICAgICAgIChub2RlID0ge1xuICAgICAgICAgICAgZmliZXI6IGZpYmVyLFxuICAgICAgICAgICAgY2hpbGRyZW46IG51bGwgIT09IG5vZGUgPyBbbm9kZV0gOiBbXSxcbiAgICAgICAgICAgIHNlcnZlclByb3BzOlxuICAgICAgICAgICAgICBmaWJlciA9PT0gY2hpbGQgPyBwcm9wcyA6IGZpYmVyID09PSBhbmNlc3RvciA/IG51bGwgOiB2b2lkIDAsXG4gICAgICAgICAgICBzZXJ2ZXJUYWlsOiBbXSxcbiAgICAgICAgICAgIGRpc3RhbmNlRnJvbUxlYWY6IGRpc3RhbmNlRnJvbUxlYWZcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBkaXN0YW5jZUZyb21MZWFmKyssXG4gICAgICAgICAgKGZpYmVyID0gZmliZXIucmV0dXJuKTtcbiAgICAgIHJldHVybiBudWxsICE9PSBub2RlID8gZGVzY3JpYmVEaWZmKG5vZGUpLnJlcGxhY2VBbGwoL15bKy1dL2dtLCBcIj5cIikgOiBcIlwiO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVkQW5jZXN0b3JJbmZvRGV2KG9sZEluZm8sIHRhZykge1xuICAgICAgdmFyIGFuY2VzdG9ySW5mbyA9IGFzc2lnbih7fSwgb2xkSW5mbyB8fCBlbXB0eUFuY2VzdG9ySW5mb0RldiksXG4gICAgICAgIGluZm8gPSB7IHRhZzogdGFnIH07XG4gICAgICAtMSAhPT0gaW5TY29wZVRhZ3MuaW5kZXhPZih0YWcpICYmXG4gICAgICAgICgoYW5jZXN0b3JJbmZvLmFUYWdJblNjb3BlID0gbnVsbCksXG4gICAgICAgIChhbmNlc3RvckluZm8uYnV0dG9uVGFnSW5TY29wZSA9IG51bGwpLFxuICAgICAgICAoYW5jZXN0b3JJbmZvLm5vYnJUYWdJblNjb3BlID0gbnVsbCkpO1xuICAgICAgLTEgIT09IGJ1dHRvblNjb3BlVGFncy5pbmRleE9mKHRhZykgJiZcbiAgICAgICAgKGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZSA9IG51bGwpO1xuICAgICAgLTEgIT09IHNwZWNpYWxUYWdzLmluZGV4T2YodGFnKSAmJlxuICAgICAgICBcImFkZHJlc3NcIiAhPT0gdGFnICYmXG4gICAgICAgIFwiZGl2XCIgIT09IHRhZyAmJlxuICAgICAgICBcInBcIiAhPT0gdGFnICYmXG4gICAgICAgICgoYW5jZXN0b3JJbmZvLmxpc3RJdGVtVGFnQXV0b2Nsb3NpbmcgPSBudWxsKSxcbiAgICAgICAgKGFuY2VzdG9ySW5mby5kbEl0ZW1UYWdBdXRvY2xvc2luZyA9IG51bGwpKTtcbiAgICAgIGFuY2VzdG9ySW5mby5jdXJyZW50ID0gaW5mbztcbiAgICAgIFwiZm9ybVwiID09PSB0YWcgJiYgKGFuY2VzdG9ySW5mby5mb3JtVGFnID0gaW5mbyk7XG4gICAgICBcImFcIiA9PT0gdGFnICYmIChhbmNlc3RvckluZm8uYVRhZ0luU2NvcGUgPSBpbmZvKTtcbiAgICAgIFwiYnV0dG9uXCIgPT09IHRhZyAmJiAoYW5jZXN0b3JJbmZvLmJ1dHRvblRhZ0luU2NvcGUgPSBpbmZvKTtcbiAgICAgIFwibm9iclwiID09PSB0YWcgJiYgKGFuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29wZSA9IGluZm8pO1xuICAgICAgXCJwXCIgPT09IHRhZyAmJiAoYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlID0gaW5mbyk7XG4gICAgICBcImxpXCIgPT09IHRhZyAmJiAoYW5jZXN0b3JJbmZvLmxpc3RJdGVtVGFnQXV0b2Nsb3NpbmcgPSBpbmZvKTtcbiAgICAgIGlmIChcImRkXCIgPT09IHRhZyB8fCBcImR0XCIgPT09IHRhZylcbiAgICAgICAgYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nID0gaW5mbztcbiAgICAgIFwiI2RvY3VtZW50XCIgPT09IHRhZyB8fCBcImh0bWxcIiA9PT0gdGFnXG4gICAgICAgID8gKGFuY2VzdG9ySW5mby5jb250YWluZXJUYWdJblNjb3BlID0gbnVsbClcbiAgICAgICAgOiBhbmNlc3RvckluZm8uY29udGFpbmVyVGFnSW5TY29wZSB8fFxuICAgICAgICAgIChhbmNlc3RvckluZm8uY29udGFpbmVyVGFnSW5TY29wZSA9IGluZm8pO1xuICAgICAgbnVsbCAhPT0gb2xkSW5mbyB8fFxuICAgICAgKFwiI2RvY3VtZW50XCIgIT09IHRhZyAmJiBcImh0bWxcIiAhPT0gdGFnICYmIFwiYm9keVwiICE9PSB0YWcpXG4gICAgICAgID8gITAgPT09IGFuY2VzdG9ySW5mby5pbXBsaWNpdFJvb3RTY29wZSAmJlxuICAgICAgICAgIChhbmNlc3RvckluZm8uaW1wbGljaXRSb290U2NvcGUgPSAhMSlcbiAgICAgICAgOiAoYW5jZXN0b3JJbmZvLmltcGxpY2l0Um9vdFNjb3BlID0gITApO1xuICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mbztcbiAgICB9XG4gICAgZnVuY3Rpb24gaXNUYWdWYWxpZFdpdGhQYXJlbnQodGFnLCBwYXJlbnRUYWcsIGltcGxpY2l0Um9vdFNjb3BlKSB7XG4gICAgICBzd2l0Y2ggKHBhcmVudFRhZykge1xuICAgICAgICBjYXNlIFwidHJcIjpcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgXCJ0aFwiID09PSB0YWcgfHxcbiAgICAgICAgICAgIFwidGRcIiA9PT0gdGFnIHx8XG4gICAgICAgICAgICBcInN0eWxlXCIgPT09IHRhZyB8fFxuICAgICAgICAgICAgXCJzY3JpcHRcIiA9PT0gdGFnIHx8XG4gICAgICAgICAgICBcInRlbXBsYXRlXCIgPT09IHRhZ1xuICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgXCJ0Ym9keVwiOlxuICAgICAgICBjYXNlIFwidGhlYWRcIjpcbiAgICAgICAgY2FzZSBcInRmb290XCI6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIFwidHJcIiA9PT0gdGFnIHx8XG4gICAgICAgICAgICBcInN0eWxlXCIgPT09IHRhZyB8fFxuICAgICAgICAgICAgXCJzY3JpcHRcIiA9PT0gdGFnIHx8XG4gICAgICAgICAgICBcInRlbXBsYXRlXCIgPT09IHRhZ1xuICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgXCJjb2xncm91cFwiOlxuICAgICAgICAgI
15852HJldHVybiBcImNvbFwiID09PSB0YWcgfHwgXCJ0ZW1wbGF0ZVwiID09PSB0YWc7XG4gICAgICAgIGNhc2UgXCJ0YWJsZVwiOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBcImNhcHRpb25cIiA9PT0gdGFnIHx8XG4gICAgICAgICAgICBcImNvbGdyb3VwXCIgPT09IHRhZyB8fFxuICAgICAgICAgICAgXCJ0Ym9keVwiID09PSB0YWcgfHxcbiAgICAgICAgICAgIFwidGZvb3RcIiA9PT0gdGFnIHx8XG4gICAgICAgICAgICBcInRoZWFkXCIgPT09IHRhZyB8fFxuICAgICAgICAgICAgXCJzdHlsZVwiID09PSB0YWcgfHxcbiAgICAgICAgICAgIFwic2NyaXB0XCIgPT09IHRhZyB8fFxuICAgICAgICAgICAgXCJ0ZW1wbGF0ZVwiID09PSB0YWdcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIFwiaGVhZFwiOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBcImJhc2VcIiA9PT0gdGFnIHx8XG4gICAgICAgICAgICBcImJhc2Vmb250XCIgPT09IHRhZyB8fFxuICAgICAgICAgICAgXCJiZ3NvdW5kXCIgPT09IHRhZyB8fFxuICAgICAgICAgICAgXCJsaW5rXCIgPT09IHRhZyB8fFxuICAgICAgICAgICAgXCJtZXRhXCIgPT09IHRhZyB8fFxuICAgICAgICAgICAgXCJ0aXRsZVwiID09PSB0YWcgfHxcbiAgICAgICAgICAgIFwibm9zY3JpcHRcIiA9PT0gdGFnIHx8XG4gICAgICAgICAgICBcIm5vZnJhbWVzXCIgPT09IHRhZyB8fFxuICAgICAgICAgICAgXCJzdHlsZVwiID09PSB0YWcgfHxcbiAgICAgICAgICAgIFwic2NyaXB0XCIgPT09IHRhZyB8fFxuICAgICAgICAgICAgXCJ0ZW1wbGF0ZVwiID09PSB0YWdcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIFwiaHRtbFwiOlxuICAgICAgICAgIGlmIChpbXBsaWNpdFJvb3RTY29wZSkgYnJlYWs7XG4gICAgICAgICAgcmV0dXJuIFwiaGVhZFwiID09PSB0YWcgfHwgXCJib2R5XCIgPT09IHRhZyB8fCBcImZyYW1lc2V0XCIgPT09IHRhZztcbiAgICAgICAgY2FzZSBcImZyYW1lc2V0XCI6XG4gICAgICAgICAgcmV0dXJuIFwiZnJhbWVcIiA9PT0gdGFnO1xuICAgICAgICBjYXNlIFwiI2RvY3VtZW50XCI6XG4gICAgICAgICAgaWYgKCFpbXBsaWNpdFJvb3RTY29wZSkgcmV0dXJuIFwiaHRtbFwiID09PSB0YWc7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICBjYXNlIFwiaDFcIjpcbiAgICAgICAgY2FzZSBcImgyXCI6XG4gICAgICAgIGNhc2UgXCJoM1wiOlxuICAgICAgICBjYXNlIFwiaDRcIjpcbiAgICAgICAgY2FzZSBcImg1XCI6XG4gICAgICAgIGNhc2UgXCJoNlwiOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBcImgxXCIgIT09IHBhcmVudFRhZyAmJlxuICAgICAgICAgICAgXCJoMlwiICE9PSBwYXJlbnRUYWcgJiZcbiAgICAgICAgICAgIFwiaDNcIiAhPT0gcGFyZW50VGFnICYmXG4gICAgICAgICAgICBcImg0XCIgIT09IHBhcmVudFRhZyAmJlxuICAgICAgICAgICAgXCJoNVwiICE9PSBwYXJlbnRUYWcgJiZcbiAgICAgICAgICAgIFwiaDZcIiAhPT0gcGFyZW50VGFnXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSBcInJwXCI6XG4gICAgICAgIGNhc2UgXCJydFwiOlxuICAgICAgICAgIHJldHVybiAtMSA9PT0gaW1wbGllZEVuZFRhZ3MuaW5kZXhPZihwYXJlbnRUYWcpO1xuICAgICAgICBjYXNlIFwiY2FwdGlvblwiOlxuICAgICAgICBjYXNlIFwiY29sXCI6XG4gICAgICAgIGNhc2UgXCJjb2xncm91cFwiOlxuICAgICAgICBjYXNlIFwiaW5wdXRcIjpcbiAgICAgICAgICByZXR1cm4gXCJzZWxlY3RcIiAhPT0gcGFyZW50VGFnO1xuICAgICAgICBjYXNlIFwiZnJhbWVzZXRcIjpcbiAgICAgICAgY2FzZSBcImZyYW1lXCI6XG4gICAgICAgIGNhc2UgXCJ0Ym9keVwiOlxuICAgICAgICBjYXNlIFwidGRcIjpcbiAgICAgICAgY2FzZSBcInRmb290XCI6XG4gICAgICAgIGNhc2UgXCJ0aFwiOlxuICAgICAgICBjYXNlIFwidGhlYWRcIjpcbiAgICAgICAgY2FzZSBcInRyXCI6XG4gICAgICAgICAgcmV0dXJuIG51bGwgPT0gcGFyZW50VGFnO1xuICAgICAgICBjYXNlIFwiaGVhZFwiOlxuICAgICAgICAgIHJldHVybiBpbXBsaWNpdFJvb3RTY29wZSB8fCBudWxsID09PSBwYXJlbnRUYWc7XG4gICAgICAgIGNhc2UgXCJodG1sXCI6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChpbXBsaWNpdFJvb3RTY29wZSAmJiBcIiNkb2N1bWVudFwiID09PSBwYXJlbnRUYWcpIHx8XG4gICAgICAgICAgICBudWxsID09PSBwYXJlbnRUYWdcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIFwiYm9keVwiOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoaW1wbGljaXRSb290U2NvcGUgJiZcbiAgICAgICAgICAgICAgKFwiI2RvY3VtZW50XCIgPT09IHBhcmVudFRhZyB8fCBcImh0bWxcIiA9PT0gcGFyZW50VGFnKSkgfHxcbiAgICAgICAgICAgIG51bGwgPT09IHBhcmVudFRhZ1xuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gITA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZpbmRJbnZhbGlkQW5jZXN0b3JGb3JUYWcodGFnLCBhbmNlc3RvckluZm8pIHtcbiAgICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICAgIGNhc2UgXCJhZGRyZXNzXCI6XG4gICAgICAgIGNhc2UgXCJhcnRpY2xlXCI6XG4gICAgICAgIGNhc2UgXCJhc2lkZVwiOlxuICAgICAgICBjYXNlIFwiYmxvY2txdW90ZVwiOlxuICAgICAgICBjYXNlIFwiY2VudGVyXCI6XG4gICAgICAgIGNhc2UgXCJkZXRhaWxzXCI6XG4gICAgICAgIGNhc2UgXCJkaWFsb2dcIjpcbiAgICAgICAgY2FzZSBcImRpclwiOlxuICAgICAgICBjYXNlIFwiZGl2XCI6XG4gICAgICAgIGNhc2UgXCJkbFwiOlxuICAgICAgICBjYXNlIFwiZmllbGRzZXRcIjpcbiAgICAgICAgY2FzZSBcImZpZ2NhcHRpb25cIjpcbiAgICAgICAgY2FzZSBcImZpZ3VyZVwiOlxuICAgICAgICBjYXNlIFwiZm9vdGVyXCI6XG4gICAgICAgIGNhc2UgXCJoZWFkZXJcIjpcbiAgICAgICAgY2FzZSBcImhncm91cFwiOlxuICAgICAgICBjYXNlIFwibWFpblwiOlxuICAgICAgICBjYXNlIFwibWVudVwiOlxuICAgICAgICBjYXNlIFwibmF2XCI6XG4gICAgICAgIGNhc2UgXCJvbFwiOlxuICAgICAgICBjYXNlIFwicFwiOlxuICAgICAgICBjYXNlIFwic2VjdGlvblwiOlxuICAgICAgICBjYXNlIFwic3VtbWFyeVwiOlxuICAgICAgICBjYXNlIFwidWxcIjpcbiAgICAgICAgY2FzZSBcInByZVwiOlxuICAgICAgICBjYXNlIFwibGlzdGluZ1wiOlxuICAgICAgICBjYXNlIFwidGFibGVcIjpcbiAgICAgICAgY2FzZSBcImhyXCI6XG4gICAgICAgIGNhc2UgXCJ4bXBcIjpcbiAgICAgICAgY2FzZSBcImgxXCI6XG4gICAgICAgIGNhc2UgXCJoMlwiOlxuICAgICAgICBjYXNlIFwiaDNcIjpcbiAgICAgICAgY2FzZSBcImg0XCI6XG4gICAgICAgIGNhc2UgXCJoNVwiOlxuICAgICAgICBjYXNlIFwiaDZcIjpcbiAgICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlO1xuICAgICAgICBjYXNlIFwiZm9ybVwiOlxuICAgICAgICAgI
15852HJldHVybiBhbmNlc3RvckluZm8uZm9ybVRhZyB8fCBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGU7XG4gICAgICAgIGNhc2UgXCJsaVwiOlxuICAgICAgICAgIHJldHVybiBhbmNlc3RvckluZm8ubGlzdEl0ZW1UYWdBdXRvY2xvc2luZztcbiAgICAgICAgY2FzZSBcImRkXCI6XG4gICAgICAgIGNhc2UgXCJkdFwiOlxuICAgICAgICAgIHJldHVybiBhbmNlc3RvckluZm8uZGxJdGVtVGFnQXV0b2Nsb3Npbmc7XG4gICAgICAgIGNhc2UgXCJidXR0b25cIjpcbiAgICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmJ1dHRvblRhZ0luU2NvcGU7XG4gICAgICAgIGNhc2UgXCJhXCI6XG4gICAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5hVGFnSW5TY29wZTtcbiAgICAgICAgY2FzZSBcIm5vYnJcIjpcbiAgICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLm5vYnJUYWdJblNjb3BlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZpbmRBbmNlc3RvcihwYXJlbnQsIHRhZ05hbWUpIHtcbiAgICAgIGZvciAoOyBwYXJlbnQ7ICkge1xuICAgICAgICBzd2l0Y2ggKHBhcmVudC50YWcpIHtcbiAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgY2FzZSAyNjpcbiAgICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgICAgaWYgKHBhcmVudC50eXBlID09PSB0YWdOYW1lKSByZXR1cm4gcGFyZW50O1xuICAgICAgICB9XG4gICAgICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gdmFsaWRhdGVET01OZXN0aW5nKGNoaWxkVGFnLCBhbmNlc3RvckluZm8pIHtcbiAgICAgIGFuY2VzdG9ySW5mbyA9IGFuY2VzdG9ySW5mbyB8fCBlbXB0eUFuY2VzdG9ySW5mb0RldjtcbiAgICAgIHZhciBwYXJlbnRJbmZvID0gYW5jZXN0b3JJbmZvLmN1cnJlbnQ7XG4gICAgICBhbmNlc3RvckluZm8gPSAocGFyZW50SW5mbyA9IGlzVGFnVmFsaWRXaXRoUGFyZW50KFxuICAgICAgICBjaGlsZFRhZyxcbiAgICAgICAgcGFyZW50SW5mbyAmJiBwYXJlbnRJbmZvLnRhZyxcbiAgICAgICAgYW5jZXN0b3JJbmZvLmltcGxpY2l0Um9vdFNjb3BlXG4gICAgICApXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IHBhcmVudEluZm8pXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IGZpbmRJbnZhbGlkQW5jZXN0b3JGb3JUYWcoY2hpbGRUYWcsIGFuY2VzdG9ySW5mbyk7XG4gICAgICBhbmNlc3RvckluZm8gPSBwYXJlbnRJbmZvIHx8IGFuY2VzdG9ySW5mbztcbiAgICAgIGlmICghYW5jZXN0b3JJbmZvKSByZXR1cm4gITA7XG4gICAgICB2Y
15852XIgYW5jZXN0b3JUYWcgPSBhbmNlc3RvckluZm8udGFnO1xuICAgICAgYW5jZXN0b3JJbmZvID0gU3RyaW5nKCEhcGFyZW50SW5mbykgKyBcInxcIiArIGNoaWxkVGFnICsgXCJ8XCIgKyBhbmNlc3RvclRhZztcbiAgICAgIGlmIChkaWRXYXJuW2FuY2VzdG9ySW5mb10pIHJldHVybiAhMTtcbiAgICAgIGRpZFdhcm5bYW5jZXN0b3JJbmZvXSA9ICEwO1xuICAgICAgdmFyIGFuY2VzdG9yID0gKGFuY2VzdG9ySW5mbyA9IGN1cnJlbnQpXG4gICAgICAgICAgPyBmaW5kQW5jZXN0b3IoYW5jZXN0b3JJbmZvLnJldHVybiwgYW5jZXN0b3JUYWcpXG4gICAgICAgICAgOiBudWxsLFxuICAgICAgICBhbmNlc3RvckRlc2NyaXB0aW9uID1cbiAgICAgICAgICBudWxsICE9PSBhbmNlc3RvckluZm8gJiYgbnVsbCAhPT0gYW5jZXN0b3JcbiAgICAgICAgICAgID8gZGVzY3JpYmVBbmNlc3RvcnMoYW5jZXN0b3IsIGFuY2VzdG9ySW5mbywgbnVsbClcbiAgICAgICAgICAgIDogXCJcIixcbiAgICAgICAgdGFnRGlzcGxheU5hbWUgPSBcIjxcIiArIGNoaWxkVGFnICsgXCI+XCI7XG4gICAgICBwYXJlbnRJbmZvXG4gICAgICAgID8gKChwYXJlbnRJbmZvID0gXCJcIiksXG4gICAgICAgICAgXCJ0YWJsZVwiID09PSBhbmNlc3RvclRhZyAmJlxuICAgICAgICAgICAgXCJ0clwiID09PSBjaGlsZFRhZyAmJlxuICAgICAgICAgICAgKHBhcmVudEluZm8gKz1cbiAgICAgICAgICAgICAgXCIgQWRkIGEgPHRib2R5PiwgPHRoZWFkPiBvciA8dGZvb3Q+IHRvIHlvdXIgY29kZSB0byBtYXRjaCB0aGUgRE9NIHRyZWUgZ2VuZXJhdGVkIGJ5IHRoZSBicm93c2VyLlwiKSxcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJJbiBIVE1MLCAlcyBjYW5ub3QgYmUgYSBjaGlsZCBvZiA8JXM+LiVzXFxuVGhpcyB3aWxsIGNhdXNlIGEgaHlkcmF0aW9uIGVycm9yLiVzXCIsXG4gICAgICAgICAgICB0YWdEaXNwbGF5TmFtZSxcbiAgICAgICAgICAgIGFuY2VzdG9yVGFnLFxuICAgICAgICAgICAgcGFyZW50SW5mbyxcbiAgICAgICAgICAgIGFuY2VzdG9yRGVzY3JpcHRpb25cbiAgICAgICAgICApKVxuICAgICAgICA6IGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIkluIEhUTUwsICVzIGNhbm5vdCBiZSBhIGRlc2NlbmRhbnQgb2YgPCVzPi5cXG5UaGlzIHdpbGwgY2F1c2UgYSBoeWRyYXRpb24gZXJyb3IuJXNcIixcbiAgICAgICAgICAgIHRhZ0Rpc3BsYXlOYW1lLFxuICAgICAgICAgICAgYW5jZXN0b3JUYWcsXG4gICAgICAgICAgICBhbmNlc3RvckRlc2NyaXB0aW9uXG4gICAgICAgICAgKTtcbiAgICAgIGFuY2VzdG9ySW5mbyAmJlxuICAgICAgICAoKGNoaWxkVGFnID0gYW5jZXN0b3JJbmZvLnJldHVybiksXG4gICAgICAgIG51bGwgPT09IGFuY2VzdG9yIHx8XG4gICAgICAgICAgbnVsbCA9PT0gY2hpbGRUYWcgfHxcbiAgICAgICAgICAoYW5jZXN0b3IgPT09IGNoaWxkVGFnICYmXG4gICAgICAgICAgICBjaGlsZFRhZy5fZGVidWdPd25lciA9PT0gYW5jZXN0b3JJbmZvLl9kZWJ1Z093bmVyKSB8fFxuICAgICAgICAgIHJ1bldpdGhGaWJlckluREVWKGFuY2VzdG9yLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIjwlcz4gY2Fubm90IGNvbnRhaW4gYSBuZXN0ZWQgJXMuXFxuU2VlIHRoaXMgbG9nIGZvciB0aGUgYW5jZXN0b3Igc3RhY2sgdHJhY2UuXCIsXG4gICAgICAgICAgICAgIGFuY2VzdG9yVGFnLFxuICAgICAgICAgICAgICB0YWdEaXNwbGF5TmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KSk7XG4gICAgICByZXR1cm4gITE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlVGV4dE5lc3RpbmcoY2hpbGRUZXh0LCBwYXJlbnRUYWcsIGltcGxpY2l0Um9vdFNjb3BlKSB7XG4gICAgICBpZiAoaW1wbGljaXRSb290U2NvcGUgfHwgaXNUYWdWYWxpZFdpdGhQYXJlbnQoXCIjdGV4dFwiLCBwYXJlbnRUYWcsICExKSlcbiAgICAgICAgcmV0dXJuICEwO1xuICAgICAgaW1wbGljaXRSb290U2NvcGUgPSBcIiN0ZXh0fFwiICsgcGFyZW50VGFnO1xuICAgICAgaWYgKGRpZFdhcm5baW1wbGljaXRSb290U2NvcGVdKSByZXR1cm4gITE7XG4gICAgICBkaWRXYXJuW2ltcGxpY2l0Um9vdFNjb3BlXSA9ICEwO1xuICAgICAgdmFyIGFuY2VzdG9yID0gKGltcGxpY2l0Um9vdFNjb3BlID0gY3VycmVudClcbiAgICAgICAgPyBmaW5kQW5jZXN0b3IoaW1wbGljaXRSb290U2NvcGUsIHBhcmVudFRhZylcbiAgICAgICAgOiBudWxsO1xuICAgICAgaW1wbGljaXRSb290U2NvcGUgPVxuICAgICAgICBudWxsICE9PSBpbXBsaWNpdFJvb3RTY29wZSAmJiBudWxsICE9PSBhbmNlc3RvclxuICAgICAgICAgID8gZGVzY3JpYmVBbmNlc3RvcnMoXG4gICAgICAgICAgICAgIGFuY2VzdG9yLFxuICAgICAgICAgICAgICBpbXBsaWNpdFJvb3RTY29wZSxcbiAgICAgICAgICAgICAgNiAhPT0gaW1wbGljaXRSb290U2NvcGUudGFnID8geyBjaGlsZHJlbjogbnVsbCB9IDogbnVsbFxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogXCJcIjtcbiAgICAgIC9cXFMvLnRlc3QoY2hpbGRUZXh0KVxuICAgICAgICA/IGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIkluIEhUTUwsIHRleHQgbm9kZXMgY2Fubm90IGJlIGEgY2hpbGQgb2YgPCVzPi5cXG5UaGlzIHdpbGwgY2F1c2UgYSBoeWRyYXRpb24gZXJyb3IuJXNcIixcbiAgICAgICAgICAgIHBhcmVudFRhZyxcbiAgICAgICAgICAgIGltcGxpY2l0Um9vdFNjb3BlXG4gICAgICAgICAgKVxuICAgICAgICA6IGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIkluIEhUTUwsIHdoaXRlc3BhY2UgdGV4dCBub2RlcyBjYW5ub3QgYmUgYSBjaGlsZCBvZiA8JXM+LiBNYWtlIHN1cmUgeW91IGRvbid0IGhhdmUgYW55IGV4dHJhIHdoaXRlc3BhY2UgYmV0d2VlbiB0YWdzIG9uIGVhY2ggbGluZSBvZiB5b3VyIHNvdXJjZSBjb2RlLlxcblRoaXMgd2lsbCBjYXVzZSBhIGh5ZHJhdGlvbiBlcnJvci4lc1wiLFxuICAgICAgICAgICAgcGFyZW50VGFnLFxuICAgICAgICAgICAgaW1wbGljaXRSb290U2NvcGVcbiAgICAgICAgICApO1xuICAgICAgcmV0dXJuICExO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzZXRUZX
15852h0Q29udGVudChub2RlLCB0ZXh0KSB7XG4gICAgICBpZiAodGV4dCkge1xuICAgICAgICB2YXIgZmlyc3RDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGZpcnN0Q2hpbGQgJiZcbiAgICAgICAgICBmaXJzdENoaWxkID09PSBub2RlLmxhc3RDaGlsZCAmJlxuICAgICAgICAgIDMgPT09IGZpcnN0Q2hpbGQubm9kZVR5cGVcbiAgICAgICAgKSB7XG4gICAgICAgICAgZmlyc3RDaGlsZC5ub2RlVmFsdWUgPSB0ZXh0O1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbm9kZS50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbWVsaXplKHN0cmluZykge1xuICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKGh5cGhlblBhdHRlcm4sIGZ1bmN0aW9uIChfLCBjaGFyYWN0ZXIpIHtcbiAgICAgICAgcmV0dXJuIGNoYXJhY3Rlci50b1VwcGVyQ2FzZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNldFZhbHVlRm9yU3R5bGUoc3R5bGUsIHN0eWxlTmFtZSwgdmFsdWUpIHtcbiAgICAgIHZhciBpc0N1c3RvbVByb3BlcnR5ID0gMCA9PT0gc3R5bGVOYW1lLmluZGV4T2YoXCItLVwiKTtcbiAgICAgIGlzQ3VzdG9tUHJvcGVydHkgfHxcbiAgICAgICAgKC0xIDwgc3R5bGVOYW1lLmluZGV4T2YoXCItXCIpXG4gICAgICAgICAgPyAod2FybmVkU3R5bGVOYW1lcy5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpICYmXG4gICAgICAgICAgICAgIHdhcm5lZFN0eWxlTmFtZXNbc3R5bGVOYW1lXSkgfHxcbiAgICAgICAgICAgICgod2FybmVkU3R5bGVOYW1lc1tzdHlsZU5hbWVdID0gITApLFxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCJVbnN1cHBvcnRlZCBzdHlsZSBwcm9wZXJ0eSAlcy4gRGlkIHlvdSBtZWFuICVzP1wiLFxuICAgICAgICAgICAgICBzdHlsZU5hbWUsXG4gICAgICAgICAgICAgIGNhbWVsaXplKHN0eWxlTmFtZS5yZXBsYWNlKG1zUGF0dGVybiwgXCJtcy1cIikpXG4gICAgICAgICAgICApKVxuICAgICAgICAgIDogYmFkVmVuZG9yZWRTdHlsZU5hbWVQYXR0ZXJuLnRlc3Qoc3R5bGVOYW1lKVxuICAgICAgICAgICAgPyAod2FybmVkU3R5bGVOYW1lcy5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpICYmXG4gICAgICAgICAgICAgICAgd2FybmVkU3R5bGVOYW1lc1tzdHlsZU5hbWVdKSB8fFxuICAgICAgICAgICAgICAoKHdhcm5lZFN0eWxlTmFtZXNbc3R5bGVOYW1lXSA9ICEwKSxcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBcIlVuc3VwcG9ydGVkIHZlbmRvci1wcmVmaXhlZCBzdHlsZSBwcm9wZXJ0eSAlcy4gRGlkIHlvdSBtZWFuICVzP1wiLFxuICAgICAgICAgICAgICAgIHN0eWxlTmFtZSxcbiAgICAgICAgICAgICAgICBzdHlsZU5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHlsZU5hbWUuc2xpY2UoMSlcbiAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgIDogIWJhZFN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uUGF0dGVybi50ZXN0KHZhbHVlKSB8fFxuICAgICAgICAgICAgICAod2FybmVkU3R5bGVWYWx1ZXMuaGFzT3duUHJvcGVydHkodmFsdWUpICYmXG4gICAgICAgICAgICAgICAgd2FybmVkU3R5bGVWYWx1ZXNbdmFsdWVdKSB8fFxuICAgICAgICAgICAgICAoKHdhcm5lZFN0eWxlVmFsdWVzW3ZhbHVlXSA9ICEwKSxcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAnU3R5bGUgcHJvcGVydHkgdmFsdWVzIHNob3VsZG5cXCd0IGNvbnRhaW4gYSBzZW1pY29sb24uIFRyeSBcIiVzOiAlc1wiIGluc3RlYWQuJyxcbiAgICAgICAgICAgICAgICBzdHlsZU5hbWUsXG4gICAgICAgICAgICAgICAgdmFsdWUucmVwbGFjZShiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm4sIFwiXCIpXG4gICAgICAgICAgICAgICkpLFxuICAgICAgICBcIm51bWJlclwiID09PSB0eXBlb2YgdmFsdWUgJiZcbiAgICAgICAgICAoaXNOYU4odmFsdWUpXG4gICAgICAgICAgICA/IHdhcm5lZEZvck5hTlZhbHVlIHx8XG4gICAgICAgICAgICAgICgod2FybmVkRm9yTmFOVmFsdWUgPSAhMCksXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgXCJgTmFOYCBpcyBhbiBpbnZhbGlkIHZhbHVlIGZvciB0aGUgYCVzYCBjc3Mgc3R5bGUgcHJvcGVydHkuXCIsXG4gICAgICAgICAgICAgICAgc3R5bGVOYW1lXG4gICAgICAgICAgICAgICkpXG4gICAgICAgICAgICA6IGlzRmluaXRlKHZhbHVlKSB8fFxuICAgICAgICAgICAgICB3YXJuZWRGb3JJbmZpbml0eVZhbHVlIHx8XG4gICAgICAgICAgICAgICgod2FybmVkRm9ySW5maW5pdHlWYWx1ZSA9ICEwKSxcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBcImBJbmZpbml0eWAgaXMgYW4gaW52YWxpZCB2YWx1ZSBmb3IgdGhlIGAlc2AgY3NzIHN0eWxlIHByb3BlcnR5LlwiLFxuICAgICAgICAgICAgICAgIHN0eWxlTmFtZVxuICAgICAgICAgICAgICApKSkpO1xuICAgICAgbnVsbCA9PSB2YWx1ZSB8fCBcImJvb2xlYW5cIiA9PT0gdHlwZW9mIHZhbHVlIHx8IFwiXCIgPT09IHZhbHVlXG4gICAgICAgID8gaXNDdXN0b21Qcm9wZXJ0eVxuICAgICAgICAgID8gc3R5bGUuc2V0UHJvcGVydHkoc3R5bGVOYW1lLCBcIlwiKVxuICAgICAgICAgIDogXCJmbG9hdFwiID09PSBzdHlsZU5hbWVcbiAgICAgICAgICAgID8gKHN0eWxlLmNzc0Zsb2F0ID0gXCJcIilcbiAgICAgICAgICAgIDogKHN0eWxlW3N0eWxlTmFtZV0gPSBcIlwiKVxuICAgICAgICA6IGlzQ3VzdG9tUHJvcGVydHlcbiAgICAgICAgICA/IHN0eWxlLnNldFByb3BlcnR5KHN0eWxlTmFtZSwgdmFsdWUpXG4gICAgICAgICAgOiBcIm51bWJlclwiICE9PSB0eXBlb2YgdmFsdWUgfHxcbiAgICAgICAgICAgICAgMCA9PT0gdmFsdWUgfHxcbiAgICAgICAgICAgICAgdW5pdGxlc3NOdW1iZXJzLmhhcyhzdHlsZU5hbWUpXG4gICAgICAgICAgICA/IFwiZmxvYXRcIiA9PT0gc3R5bGVOYW1lXG4gICAgICAgICAgICAgID8gKHN0eWxlLmNzc0Zsb2F0ID0gdmFsdWUpXG4gICAgICAgICAgICAgIDogKGNoZWNrQ1NTUHJvcGVydHlTdHJpbmdDb2VyY2lvbih2YWx1ZSwgc3R5bGVOYW1lKSxcbiAgICAgICAgICAgICAgICAoc3R5bGVbc3R5bGVOYW1lXSA9IChcIlwiICsgdmFsdWUpLnRyaW0oKSkpXG4gICAgICAgICAgICA6IChzdHlsZVtzdHlsZU5hbWVdID0gdmFsdWUgKyBcInB4XCIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzZXRWYWx1ZUZvclN0eWxlcyhub2RlLCBzdHlsZXMsIHByZXZTdHlsZXMpIHtcbiAgICAgIGlmIChudWxsICE9IHN0eWxlcyAmJiBcIm9iamVjdFwiICE9PSB0eXBlb2Ygc3R5bGVzKVxuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBcIlRoZSBgc3R5bGVgIHByb3AgZXhwZWN0cyBhIG1hcHBpbmcgZnJvbSBzdHlsZSBwcm9wZXJ0aWVzIHRvIHZhbHVlcywgbm90IGEgc3RyaW5nLiBGb3IgZXhhbXBsZSwgc3R5bGU9e3ttYXJnaW5SaWdodDogc3BhY2luZyArICdlbSd9fSB3aGVuIHVzaW5nIEpTWC5cIlxuICAgICAgICApO1xuICAgICAgc3R5bGVzICYmIE9iamVjdC5mcmVlemUoc3R5bGVzKTtcbiAgICAgIG5vZGUgPSBub2RlLnN0eWxlO1xuICAgICAgaWYgKG51bGwgIT0gcHJldlN0eWxlcykge1xuICAgICAgICBpZiAoc3R5bGVzKSB7XG4gICAgICAgICAgdmFyIGV4cGFuZGVkVXBkYXRlcyA9IHt9O1xuICAgICAgICAgIGlmIChwcmV2U3R5bGVzKVxuICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHByZXZTdHlsZXMpXG4gICAgICAgICAgICAgIGlmIChwcmV2U3R5bGVzLmhhc093blByb3BlcnR5KGtleSkgJiYgIXN0eWxlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKVxuICAgICAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgICAgICB2Y
15852XIgbG9uZ2hhbmRzID0gc2hvcnRoYW5kVG9Mb25naGFuZFtrZXldIHx8IFtrZXldLCBpID0gMDtcbiAgICAgICAgICAgICAgICAgIGkgPCBsb25naGFuZHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgaSsrXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgZXhwYW5kZWRVcGRhdGVzW2xvbmdoYW5kc1tpXV0gPSBrZXk7XG4gICAgICAgICAgZm9yICh2YXIgX2tleSBpbiBzdHlsZXMpXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHN0eWxlcy5oYXNPd25Qcm9wZXJ0eShfa2V5KSAmJlxuICAgICAgICAgICAgICAoIXByZXZTdHlsZXMgfHwgcHJldlN0eWxlc1tfa2V5XSAhPT0gc3R5bGVzW19rZXldKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgICAgIGtleSA9IHNob3J0aGFuZFRvTG9uZ2hhbmRbX2tleV0gfHwgW19rZXldLCBsb25naGFuZHMgPSAwO1xuICAgICAgICAgICAgICAgIGxvbmdoYW5kcyA8IGtleS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgbG9uZ2hhbmRzKytcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGV4cGFuZGVkVXBkYXRlc1trZXlbbG9uZ2hhbmRzXV0gPSBfa2V5O1xuICAgICAgICAgIF9rZXkgPSB7fTtcbiAgICAgICAgICBmb3IgKHZhciBrZXkkanNjb21wJDAgaW4gc3R5bGVzKVxuICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAga2V5ID0gc2hvcnRoYW5kVG9Mb25naGFuZFtrZXkkanNjb21wJDBdIHx8IFtrZXkkanNjb21wJDBdLFxuICAgICAgICAgICAgICAgIGxvbmdoYW5kcyA9IDA7XG4gICAgICAgICAgICAgIGxvbmdoYW5kcyA8IGtleS5sZW5ndGg7XG4gICAgICAgICAgICAgIGxvbmdoYW5kcysrXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIF9rZXlba2V5W2xvbmdoYW5kc11dID0ga2V5JGpzY29tcCQwO1xuICAgICAgICAgIGtleSRqc2NvbXAkMCA9IHt9O1xuICAgICAgICAgIGZvciAodmFyIF9rZXkyIGluIGV4cGFuZGVkVXBkYXRlcylcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgKChrZXkgPSBleHBhbmRlZFVwZGF0ZXNbX2tleTJdKSxcbiAgICAgICAgICAgICAgKGxvbmdoYW5kcyA9IF9rZXlbX2tleTJdKSAmJlxuICAgICAgICAgICAgICAgIGtleSAhPT0gbG9uZ2hhbmRzICYmXG4gICAgICAgICAgICAgICAgKChpID0ga2V5ICsgXCIsXCIgKyBsb25naGFuZHMpLCAha2V5JGpzY29tcCQwW2ldKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBrZXkkanNjb21wJDBbaV0gPSAhMDtcbiAgICAgICAgICAgICAgaSA9IGNvbnNvbGU7XG4gICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHN0eWxlc1trZXldO1xuICAgICAgICAgICAgICBpLmVycm9yLmNhbGwoXG4gICAgICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICAgICBcIiVzIGEgc3R5bGUgcHJvcGVydHkgZHVyaW5nIHJlcmVuZGVyICglcykgd2hlbiBhIGNvbmZsaWN0aW5nIHByb3BlcnR5IGlzIHNldCAoJXMpIGNhbiBsZWFkIHRvIHN0eWxpbmcgYnVncy4gVG8gYXZvaWQgdGhpcywgZG9uJ3QgbWl4IHNob3J0aGFuZCBhbmQgbm9uLXNob3J0aGFuZCBwcm9wZXJ0aWVzIGZvciB0aGUgc2FtZSB2YWx1ZTsgaW5zdGVhZCwgcmVwbGFjZSB0aGUgc2hvcnRoYW5kIHdpdGggc2VwYXJhdGUgdmFsdWVzLlwiLFxuICAgICAgICAgICAgICAgIG51bGwgPT0gdmFsdWUgfHwgXCJib29sZWFuXCIgPT09IHR5cGVvZiB2YWx1ZSB8fCBcIlwiID09PSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgPyBcIlJlbW92aW5nXCJcbiAgICAgICAgICAgICAgICAgIDogXCJVcGRhdGluZ1wiLFxuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICBsb25naGFuZHNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBzdHlsZU5hbWUgaW4gcHJldlN0eWxlcylcbiAgICAgICAgICAhcHJldlN0eWxlcy5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpIHx8XG4gICAgICAgICAgICAobnVsbCAhPSBzdHlsZXMgJiYgc3R5bGVzLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpIHx8XG4gICAgICAgICAgICAoMCA9PT0gc3R5bGVOYW1lLmluZGV4T2YoXCItLVwiKVxuICAgICAgICAgICAgICA/IG5vZGUuc2V0UHJvcGVydHkoc3R5bGVOYW1lLCBcIlwiKVxuICAgICAgICAgICAgICA6IFwiZmxvYXRcIiA9PT0gc3R5bGVOYW1lXG4gICAgICAgICAgICAgICAgPyAobm9kZS5jc3NGbG9hdCA9IFwiXCIpXG4gICAgICAgICAgICAgICAgOiAobm9kZVtzdHlsZU5hbWVdID0gXCJcIiksXG4gICAgICAgICAgICAodmlld1RyYW5zaXRpb25NdXRhdGlvbkNvbnRleHQgPSAhMCkpO1xuICAgICAgICBmb3IgKHZhciBfc3R5bGVOYW1lIGluIHN0eWxlcylcbiAgICAgICAgICAoX2tleTIgPSBzdHlsZXNbX3N0eWxlTmFtZV0pLFxuICAgICAgICAgICAgc3R5bGVzLmhhc093blByb3BlcnR5KF9zdHlsZU5hbWUpICYmXG4gICAgICAgICAgICAgIHByZXZTdHlsZXNbX3N0eWxlTmFtZV0gIT09IF9rZXkyICYmXG4gICAgICAgICAgICAgIChzZXRWYWx1ZUZvclN0eWxlKG5vZGUsIF9zdHlsZU5hbWUsIF9rZXkyKSxcbiAgICAgICAgICAgICAgKHZpZXdUcmFuc2l0aW9uTXV0YXRpb25Db250ZXh0ID0gITApKTtcbiAgICAgIH0gZWxzZVxuICAgICAgICBmb3IgKGV4cGFuZGVkVXBkYXRlcyBpbiBzdHlsZXMpXG4gICAgICAgICAgc3R5bGVzLmhhc093blByb3BlcnR5KGV4cGFuZGVkVXBkYXRlcykgJiZcbiAgICAgICAgICAgIHNldFZhbHVlRm9yU3R5bGUobm9kZSwgZXhwYW5kZWRVcGRhdGVzLCBzdHlsZXNbZXhwYW5kZWRVcGRhdGVzXSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzQ3VzdG9tRWxlbWVudCh0YWdOYW1lKSB7XG4gICAgICBpZiAoLTEgPT09IHRhZ05hbWUuaW5kZXhPZihcIi1cIikpIHJldHVybiAhMTtcbiAgICAgIHN3aXRjaCAodGFnTmFtZSkge1xuICAgICAgICBjYXNlIFwiYW5ub3RhdGlvbi14bWxcIjpcbiAgICAgICAgY2FzZSBcImNvbG9yLXByb2ZpbGVcIjpcbiAgICAgICAgY2FzZSBcImZvbnQtZmFjZVwiOlxuICAgICAgICBjYXNlIFwiZm9udC1mYWNlLXNyY1wiOlxuICAgICAgICBjYXNlIFwiZm9udC1mYWNlLXVyaVwiOlxuICAgICAgICBjYXNlIFwiZm9udC1mYWNlLWZvcm1hdFwiOlxuICAgICAgICBjYXNlIFwiZm9udC1mYWNlLW5hbWVcIjpcbiAgICAgICAgY2FzZSBcIm1pc3NpbmctZ2x5cGhcIjpcbiAgICAgICAgICByZXR1cm4gITE7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVBbGlhcyhuYW1lKSB7XG4gICAgICByZXR1cm4gYWxpYXNlcy5nZXQobmFtZSkgfHwgbmFtZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0eSQxKHRhZ05hbWUsIG5hbW
15852UpIHtcbiAgICAgIGlmIChcbiAgICAgICAgaGFzT3duUHJvcGVydHkuY2FsbCh3YXJuZWRQcm9wZXJ0aWVzJDEsIG5hbWUpICYmXG4gICAgICAgIHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXVxuICAgICAgKVxuICAgICAgICByZXR1cm4gITA7XG4gICAgICBpZiAockFSSUFDYW1lbCQxLnRlc3QobmFtZSkpIHtcbiAgICAgICAgdGFnTmFtZSA9IFwiYXJpYS1cIiArIG5hbWUuc2xpY2UoNCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgdGFnTmFtZSA9IGFyaWFQcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHRhZ05hbWUpID8gdGFnTmFtZSA6IG51bGw7XG4gICAgICAgIGlmIChudWxsID09IHRhZ05hbWUpXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIFwiSW52YWxpZCBBUklBIGF0dHJpYnV0ZSBgJXNgLiBBUklBIGF0dHJpYnV0ZXMgZm9sbG93IHRoZSBwYXR0ZXJuIGFyaWEtKiBhbmQgbXVzdCBiZSBsb3dlcmNhc2UuXCIsXG4gICAgICAgICAgICAgIG5hbWVcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICAod2FybmVkUHJvcGVydGllcyQxW25hbWVdID0gITApXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKG5hbWUgIT09IHRhZ05hbWUpXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIFwiSW52YWxpZCBBUklBIGF0dHJpYnV0ZSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD9cIixcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgdGFnTmFtZVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICh3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSAhMClcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHJBUklBJDEudGVzdChuYW1lKSkge1xuICAgICAgICB0YWdOYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB0YWdOYW1lID0gYXJpYVByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkodGFnTmFtZSkgPyB0YWdOYW1lIDogbnVsbDtcbiAgICAgICAgaWYgKG51bGwgPT0gdGFnTmFtZSkgcmV0dXJuICh3YXJuZWRQcm9wZXJ0aWVzJDFbbmFtZV0gPSAhMCksICExO1xuICAgICAgICBuYW1lICE9PSB0YWdOYW1lICYmXG4gICAgICAgICAgKGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIlVua25vd24gQVJJQSBhdHRyaWJ1dGUgYCVzYC4gRGlkIHlvdSBtZWFuIGAlc2A/XCIsXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgdGFnTmFtZVxuICAgICAgICAgICksXG4gICAgICAgICAgKHdhcm5lZFByb3BlcnRpZXMkMVtuYW1lXSA9ICEwKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gITA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydGllcyQyKHR5cGUsIHByb3BzKSB7XG4gICAgICB2Y
15852XIgaW52YWxpZFByb3BzID0gW10sXG4gICAgICAgIGtleTtcbiAgICAgIGZvciAoa2V5IGluIHByb3BzKVxuICAgICAgICB2YWxpZGF0ZVByb3BlcnR5JDEodHlwZSwga2V5KSB8fCBpbnZhbGlkUHJvcHMucHVzaChrZXkpO1xuICAgICAgcHJvcHMgPSBpbnZhbGlkUHJvcHNcbiAgICAgICAgLm1hcChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICAgIHJldHVybiBcImBcIiArIHByb3AgKyBcImBcIjtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oXCIsIFwiKTtcbiAgICAgIDEgPT09IGludmFsaWRQcm9wcy5sZW5ndGhcbiAgICAgICAgPyBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJJbnZhbGlkIGFyaWEgcHJvcCAlcyBvbiA8JXM+IHRhZy4gRm9yIGRldGFpbHMsIHNlZSBodHRwczovL3JlYWN0LmRldi9saW5rL2ludmFsaWQtYXJpYS1wcm9wc1wiLFxuICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICB0eXBlXG4gICAgICAgICAgKVxuICAgICAgICA6IDEgPCBpbnZhbGlkUHJvcHMubGVuZ3RoICYmXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiSW52YWxpZCBhcmlhIHByb3BzICVzIG9uIDwlcz4gdGFnLiBGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvaW52YWxpZC1hcmlhLXByb3BzXCIsXG4gICAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICAgIHR5cGVcbiAgICAgICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnR5KHRhZ05hbWUsIG5hbWUsIHZhbHVlLCBldmVudFJlZ2lzdHJ5KSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh3YXJuZWRQcm9wZXJ0aWVzLCBuYW1lKSAmJiB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdKVxuICAgICAgICByZXR1cm4gITA7XG4gICAgICB2Y
15852XIgbG93ZXJDYXNlZE5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoXCJvbmZvY3VzaW5cIiA9PT0gbG93ZXJDYXNlZE5hbWUgfHwgXCJvbmZvY3Vzb3V0XCIgPT09IGxvd2VyQ2FzZWROYW1lKVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIlJlYWN0IHVzZXMgb25Gb2N1cyBhbmQgb25CbHVyIGluc3RlYWQgb2Ygb25Gb2N1c0luIGFuZCBvbkZvY3VzT3V0LiBBbGwgUmVhY3QgZXZlbnRzIGFyZSBub3JtYWxpemVkIHRvIGJ1YmJsZSwgc28gb25Gb2N1c0luIGFuZCBvbkZvY3VzT3V0IGFyZSBub3QgbmVlZGVkL3N1cHBvcnRlZCBieSBSZWFjdC5cIlxuICAgICAgICAgICksXG4gICAgICAgICAgKHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSAhMClcbiAgICAgICAgKTtcbiAgICAgIGlmIChcbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgdmFsdWUgJiZcbiAgICAgICAgKChcImZvcm1cIiA9PT0gdGFnTmFtZSAmJiBcImFjdGlvblwiID09PSBuYW1lKSB8fFxuICAgICAgICAgIChcImlucHV0XCIgPT09IHRhZ05hbWUgJiYgXCJmb3JtQWN0aW9uXCIgPT09IG5hbWUpIHx8XG4gICAgICAgICAgKFwiYnV0dG9uXCIgPT09IHRhZ05hbWUgJiYgXCJmb3JtQWN0aW9uXCIgPT09IG5hbWUpKVxuICAgICAgKVxuICAgICAgICByZXR1cm4gITA7XG4gICAgICBpZiAobnVsbCAhPSBldmVudFJlZ2lzdHJ5KSB7XG4gICAgICAgIHRhZ05hbWUgPSBldmVudFJlZ2lzdHJ5LnBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXM7XG4gICAgICAgIGlmIChldmVudFJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkobmFtZSkpXG4gICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgICBldmVudFJlZ2lzdHJ5ID0gdGFnTmFtZS5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSlcbiAgICAgICAgICA/IHRhZ05hbWVbbG93ZXJDYXNlZE5hbWVdXG4gICAgICAgICAgOiBudWxsO1xuICAgICAgICBpZiAobnVsbCAhPSBldmVudFJlZ2lzdHJ5KVxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIkludmFsaWQgZXZlbnQgaGFuZGxlciBwcm9wZXJ0eSBgJXNgLiBEaWQgeW91IG1lYW4gYCVzYD9cIixcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgZXZlbnRSZWdpc3RyeVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICh3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gITApXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKEVWRU5UX05BTUVfUkVHRVgudGVzdChuYW1lKSlcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCJVbmtub3duIGV2ZW50IGhhbmRsZXIgcHJvcGVydHkgYCVzYC4gSXQgd2lsbCBiZSBpZ25vcmVkLlwiLFxuICAgICAgICAgICAgICBuYW1lXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgKHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSAhMClcbiAgICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChFVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkpXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgSU5WQUxJRF9FVkVOVF9OQU1FX1JFR0VYLnRlc3QobmFtZSkgJiZcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIFwiSW52YWxpZCBldmVudCBoYW5kbGVyIHByb3BlcnR5IGAlc2AuIFJlYWN0IGV2ZW50cyB1c2UgdGhlIGNhbWVsQ2FzZSBuYW1pbmcgY29udmVudGlvbiwgZm9yIGV4YW1wbGUgYG9uQ2xpY2tgLlwiLFxuICAgICAgICAgICAgICBuYW1lXG4gICAgICAgICAgICApLFxuICAgICAgICAgICh3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gITApXG4gICAgICAgICk7XG4gICAgICBpZiAockFSSUEudGVzdChuYW1lKSB8fCByQVJJQUNhbWVsLnRlc3QobmFtZSkpIHJldHVybiAhMDtcbiAgICAgIGlmIChcImlubmVyaHRtbFwiID09PSBsb3dlckNhc2VkTmFtZSlcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJEaXJlY3RseSBzZXR0aW5nIHByb3BlcnR5IGBpbm5lckhUTUxgIGlzIG5vdCBwZXJtaXR0ZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBsb29rdXAgZG9jdW1lbnRhdGlvbiBvbiBgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgLlwiXG4gICAgICAgICAgKSxcbiAgICAgICAgICAod2FybmVkUHJvcGVydGllc1tuYW1lXSA9ICEwKVxuICAgICAgICApO1xuICAgICAgaWYgKFwiYXJpYVwiID09PSBsb3dlckNhc2VkTmFtZSlcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJUaGUgYGFyaWFgIGF0dHJpYnV0ZSBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBpbiBSZWFjdC4gUGFzcyBpbmRpdmlkdWFsIGBhcmlhLWAgYXR0cmlidXRlcyBpbnN0ZWFkLlwiXG4gICAgICAgICAgKSxcbiAgICAgICAgICAod2FybmVkUHJvcGVydGllc1tuYW1lXSA9ICEwKVxuICAgICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICBcImlzXCIgPT09IGxvd2VyQ2FzZWROYW1lICYmXG4gICAgICAgIG51bGwgIT09IHZhbHVlICYmXG4gICAgICAgIHZvaWQgMCAhPT0gdmFsdWUgJiZcbiAgICAgICAgXCJzdHJpbmdcIiAhPT0gdHlwZW9mIHZhbHVlXG4gICAgICApXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiUmVjZWl2ZWQgYSBgJXNgIGZvciBhIHN0cmluZyBhdHRyaWJ1dGUgYGlzYC4gSWYgdGhpcyBpcyBleHBlY3RlZCwgY2FzdCB0aGUgdmFsdWUgdG8gYSBzdHJpbmcuXCIsXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWVcbiAgICAgICAgICApLFxuICAgICAgICAgICh3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gITApXG4gICAgICAgICk7XG4gICAgICBpZiAoXCJudW1iZXJcIiA9PT0gdHlwZW9mIHZhbHVlICYmIGlzTmFOKHZhbHVlKSlcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJSZWNlaXZlZCBOYU4gZm9yIHRoZSBgJXNgIGF0dHJpYnV0ZS4gSWYgdGhpcyBpcyBleHBlY3RlZCwgY2FzdCB0aGUgdmFsdWUgdG8gYSBzdHJpbmcuXCIsXG4gICAgICAgICAgICBuYW1lXG4gICAgICAgICAgKSxcbiAgICAgICAgICAod2FybmVkUHJvcGVydGllc1tuYW1lXSA9ICEwKVxuICAgICAgICApO1xuICAgICAgaWYgKHBvc3NpYmxlU3RhbmRhcmROYW1lcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICgobG93ZXJDYXNlZE5hbWUgPSBwb3NzaWJsZVN0YW5kYXJkTmFtZXNbbG93ZXJDYXNlZE5hbWVdKSxcbiAgICAgICAgICBsb3dlckNhc2VkTmFtZSAhPT0gbmFtZSlcbiAgICAgICAgKVxuICAgICAgICAgI
15852HJldHVybiAoXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIkludmFsaWQgRE9NIHByb3BlcnR5IGAlc2AuIERpZCB5b3UgbWVhbiBgJXNgP1wiLFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICBsb3dlckNhc2VkTmFtZVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICh3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gITApXG4gICAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAobmFtZSAhPT0gbG93ZXJDYXNlZE5hbWUpXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiUmVhY3QgZG9lcyBub3QgcmVjb2duaXplIHRoZSBgJXNgIHByb3Agb24gYSBET00gZWxlbWVudC4gSWYgeW91IGludGVudGlvbmFsbHkgd2FudCBpdCB0byBhcHBlYXIgaW4gdGhlIERPTSBhcyBhIGN1c3RvbSBhdHRyaWJ1dGUsIHNwZWxsIGl0IGFzIGxvd2VyY2FzZSBgJXNgIGluc3RlYWQuIElmIHlvdSBhY2NpZGVudGFsbHkgcGFzc2VkIGl0IGZyb20gYSBwYXJlbnQgY29tcG9uZW50LCByZW1vdmUgaXQgZnJvbSB0aGUgRE9NIGVsZW1lbnQuXCIsXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgbG93ZXJDYXNlZE5hbWVcbiAgICAgICAgICApLFxuICAgICAgICAgICh3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gITApXG4gICAgICAgICk7XG4gICAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgY2FzZSBcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCI6XG4gICAgICAgIGNhc2UgXCJjaGlsZHJlblwiOlxuICAgICAgICBjYXNlIFwic3R5bGVcIjpcbiAgICAgICAgY2FzZSBcInN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZ1wiOlxuICAgICAgICBjYXNlIFwic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nXCI6XG4gICAgICAgIGNhc2UgXCJkZWZhdWx0VmFsdWVcIjpcbiAgICAgICAgY2FzZSBcImRlZmF1bHRDaGVja2VkXCI6XG4gICAgICAgIGNhc2UgXCJpbm5lckhUTUxcIjpcbiAgICAgICAgY2FzZSBcInJlZlwiOlxuICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgY2FzZSBcImlubmVyVGV4dFwiOlxuICAgICAgICBjYXNlIFwidGV4dENvbnRlbnRcIjpcbiAgICAgICAgICByZXR1cm4gITA7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgICAgICAgY2FzZSBcImF1dG9Gb2N1c1wiOlxuICAgICAgICAgICAgY2FzZSBcImNoZWNrZWRcIjpcbiAgICAgICAgICAgIGNhc2UgXCJtdWx0aXBsZVwiOlxuICAgICAgICAgICAgY2FzZSBcIm11dGVkXCI6XG4gICAgICAgICAgICBjYXNlIFwic2VsZWN0ZWRcIjpcbiAgICAgICAgICAgIGNhc2UgXCJjb250ZW50RWRpdGFibGVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJzcGVsbENoZWNrXCI6XG4gICAgICAgICAgICBjYXNlIFwiZHJhZ2dhYmxlXCI6XG4gICAgICAgICAgICBjYXNlIFwidmFsdWVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJhdXRvUmV2ZXJzZVwiOlxuICAgICAgICAgICAgY2FzZSBcImV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcIjpcbiAgICAgICAgICAgIGNhc2UgXCJmb2N1c2FibGVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJwcmVzZXJ2ZUFscGhhXCI6XG4gICAgICAgICAgICBjYXNlIFwiYWxsb3dGdWxsU2NyZWVuXCI6XG4gICAgICAgICAgICBjYXNlIFwiYXN5bmNcIjpcbiAgICAgICAgICAgIGNhc2UgXCJhdXRvUGxheVwiOlxuICAgICAgICAgICAgY2FzZSBcImNvbnRyb2xzXCI6XG4gICAgICAgICAgICBjYXNlIFwiY3JlZGVudGlhbGxlc3NcIjpcbiAgICAgICAgICAgIGNhc2UgXCJkZWZhdWx0XCI6XG4gICAgICAgICAgICBjYXNlIFwiZGVmZXJcIjpcbiAgICAgICAgICAgIGNhc2UgXCJkaXNhYmxlZFwiOlxuICAgICAgICAgICAgY2FzZSBcImRpc2FibGVQaWN0dXJlSW5QaWN0dXJlXCI6XG4gICAgICAgICAgICBjYXNlIFwiZGlzYWJsZVJlbW90ZVBsYXliYWNrXCI6XG4gICAgICAgICAgICBjYXNlIFwiZm9ybU5vVmFsaWRhdGVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJoaWRkZW5cIjpcbiAgICAgICAgICAgIGNhc2UgXCJsb29wXCI6XG4gICAgICAgICAgICBjYXNlIFwibm9Nb2R1bGVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJub1ZhbGlkYXRlXCI6XG4gICAgICAgICAgICBjYXNlIFwib3BlblwiOlxuICAgICAgICAgICAgY2FzZSBcInBsYXlzSW5saW5lXCI6XG4gICAgICAgICAgICBjYXNlIFwicmVhZE9ubHlcIjpcbiAgICAgICAgICAgIGNhc2UgXCJyZXF1aXJlZFwiOlxuICAgICAgICAgICAgY2FzZSBcInJldmVyc2VkXCI6XG4gICAgICAgICAgICBjYXNlIFwic2NvcGVkXCI6XG4gICAgICAgICAgICBjYXNlIFwic2VhbWxlc3NcIjpcbiAgICAgICAgICAgIGNhc2UgXCJpdGVtU2NvcGVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJjYXB0dXJlXCI6XG4gICAgICAgICAgICBjYXNlIFwiZG93bmxvYWRcIjpcbiAgICAgICAgICAgIGNhc2UgXCJpbmVydFwiOlxuICAgICAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBsb3dlckNhc2VkTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKS5zbGljZSgwLCA1KTtcbiAgICAgICAgICAgICAgaWYgKFwiZGF0YS1cIiA9PT0gbG93ZXJDYXNlZE5hbWUgfHwgXCJhcmlhLVwiID09PSBsb3dlckNhc2VkTmFtZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICAgICAgPyBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAnUmVjZWl2ZWQgYCVzYCBmb3IgYSBub24tYm9vbGVhbiBhdHRyaWJ1dGUgYCVzYC5cXG5cXG5JZiB5b3Ugd2FudCB0byB3cml0ZSBpdCB0byB0aGUgRE9NLCBwYXNzIGEgc3RyaW5nIGluc3RlYWQ6ICVzPVwiJXNcIiBvciAlcz17dmFsdWUudG9TdHJpbmcoKX0uJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgI
15852HZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBuYW1lXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAnUmVjZWl2ZWQgYCVzYCBmb3IgYSBub24tYm9vbGVhbiBhdHRyaWJ1dGUgYCVzYC5cXG5cXG5JZiB5b3Ugd2FudCB0byB3cml0ZSBpdCB0byB0aGUgRE9NLCBwYXNzIGEgc3RyaW5nIGluc3RlYWQ6ICVzPVwiJXNcIiBvciAlcz17dmFsdWUudG9TdHJpbmcoKX0uXFxuXFxuSWYgeW91IHVzZWQgdG8gY29uZGl0aW9uYWxseSBvbWl0IGl0IHdpdGggJXM9e2NvbmRpdGlvbiAmJiB2YWx1ZX0sIHBhc3MgJXM9e2NvbmRpdGlvbiA/IHZhbHVlIDogdW5kZWZpbmVkfSBpbnN0ZWFkLicsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgcmV0dXJuICh3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gITApO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSBcImZ1bmN0aW9uXCI6XG4gICAgICAgIGNhc2UgXCJzeW1ib2xcIjpcbiAgICAgICAgICByZXR1cm4gKHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSAhMCksICExO1xuICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgaWYgKFwiZmFsc2VcIiA9PT0gdmFsdWUgfHwgXCJ0cnVlXCIgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgICAgICAgY2FzZSBcImNoZWNrZWRcIjpcbiAgICAgICAgICAgICAgY2FzZSBcInNlbGVjdGVkXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJtdWx0aXBsZVwiOlxuICAgICAgICAgICAgICBjYXNlIFwibXV0ZWRcIjpcbiAgICAgICAgICAgICAgY2FzZSBcImFsbG93RnVsbFNjcmVlblwiOlxuICAgICAgICAgICAgICBjYXNlIFwiYXN5bmNcIjpcbiAgICAgICAgICAgICAgY2FzZSBcImF1dG9QbGF5XCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJjb250cm9sc1wiOlxuICAgICAgICAgICAgICBjYXNlIFwiY3JlZGVudGlhbGxlc3NcIjpcbiAgICAgICAgICAgICAgY2FzZSBcImRlZmF1bHRcIjpcbiAgICAgICAgICAgICAgY2FzZSBcImRlZmVyXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJkaXNhYmxlZFwiOlxuICAgICAgICAgICAgICBjYXNlIFwiZGlzYWJsZVBpY3R1cmVJblBpY3R1cmVcIjpcbiAgICAgICAgICAgICAgY2FzZSBcImRpc2FibGVSZW1vdGVQbGF5YmFja1wiOlxuICAgICAgICAgICAgICBjYXNlIFwiZm9ybU5vVmFsaWRhdGVcIjpcbiAgICAgICAgICAgICAgY2FzZSBcImhpZGRlblwiOlxuICAgICAgICAgICAgICBjYXNlIFwibG9vcFwiOlxuICAgICAgICAgICAgICBjYXNlIFwibm9Nb2R1bGVcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIm5vVmFsaWRhdGVcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIm9wZW5cIjpcbiAgICAgICAgICAgICAgY2FzZSBcInBsYXlzSW5saW5lXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJyZWFkT25seVwiOlxuICAgICAgICAgICAgICBjYXNlIFwicmVxdWlyZWRcIjpcbiAgICAgICAgICAgICAgY2FzZSBcInJldmVyc2VkXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJzY29wZWRcIjpcbiAgICAgICAgICAgICAgY2FzZSBcInNlYW1sZXNzXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJpdGVtU2NvcGVcIjpcbiAgICAgICAgICAgICAgY2FzZSBcImluZXJ0XCI6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCJSZWNlaXZlZCB0aGUgc3RyaW5nIGAlc2AgZm9yIHRoZSBib29sZWFuIGF0dHJpYnV0ZSBgJXNgLiAlcyBEaWQgeW91IG1lYW4gJXM9eyVzfT9cIixcbiAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgIFwiZmFsc2VcIiA9PT0gdmFsdWVcbiAgICAgICAgICAgICAgICA/IFwiVGhlIGJyb3dzZXIgd2lsbCBpbnRlcnByZXQgaXQgYXMgYSB0cnV0aHkgdmFsdWUuXCJcbiAgICAgICAgICAgICAgICA6ICdBbHRob3VnaCB0aGlzIHdvcmtzLCBpdCB3aWxsIG5vdCB3b3JrIGFzIGV4cGVjdGVkIGlmIHlvdSBwYXNzIHRoZSBzdHJpbmcgXCJmYWxzZVwiLicsXG4gICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgd2FybmVkUHJvcGVydGllc1tuYW1lXSA9ICEwO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAhMDtcbiAgICB9XG4gICAgZnVuY3Rpb24gd2FyblVua25vd25Qcm9wZXJ0aWVzKHR5cGUsIHByb3BzLCBldmVudFJlZ2lzdHJ5KSB7XG4gICAgICB2Y
15852XIgdW5rbm93blByb3BzID0gW10sXG4gICAgICAgIGtleTtcbiAgICAgIGZvciAoa2V5IGluIHByb3BzKVxuICAgICAgICB2YWxpZGF0ZVByb3BlcnR5KHR5cGUsIGtleSwgcHJvcHNba2V5XSwgZXZlbnRSZWdpc3RyeSkgfHxcbiAgICAgICAgICB1bmtub3duUHJvcHMucHVzaChrZXkpO1xuICAgICAgcHJvcHMgPSB1bmtub3duUHJvcHNcbiAgICAgICAgLm1hcChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICAgIHJldHVybiBcImBcIiArIHByb3AgKyBcImBcIjtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oXCIsIFwiKTtcbiAgICAgIDEgPT09IHVua25vd25Qcm9wcy5sZW5ndGhcbiAgICAgICAgPyBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJJbnZhbGlkIHZhbHVlIGZvciBwcm9wICVzIG9uIDwlcz4gdGFnLiBFaXRoZXIgcmVtb3ZlIGl0IGZyb20gdGhlIGVsZW1lbnQsIG9yIHBhc3MgYSBzdHJpbmcgb3IgbnVtYmVyIHZhbHVlIHRvIGtlZXAgaXQgaW4gdGhlIERPTS4gRm9yIGRldGFpbHMsIHNlZSBodHRwczovL3JlYWN0LmRldi9saW5rL2F0dHJpYnV0ZS1iZWhhdmlvciBcIixcbiAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgdHlwZVxuICAgICAgICAgIClcbiAgICAgICAgOiAxIDwgdW5rbm93blByb3BzLmxlbmd0aCAmJlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIkludmFsaWQgdmFsdWVzIGZvciBwcm9wcyAlcyBvbiA8JXM+IHRhZy4gRWl0aGVyIHJlbW92ZSB0aGVtIGZyb20gdGhlIGVsZW1lbnQsIG9yIHBhc3MgYSBzdHJpbmcgb3IgbnVtYmVyIHZhbHVlIHRvIGtlZXAgdGhlbSBpbiB0aGUgRE9NLiBGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvYXR0cmlidXRlLWJlaGF2aW9yIFwiLFxuICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICB0eXBlXG4gICAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2FuaXRpemVVUkwodXJsKSB7XG4gICAgICByZXR1cm4gaXNKYXZhU2NyaXB0UHJvdG9jb2wudGVzdChcIlwiICsgdXJsKVxuICAgICAgICA/IFwiamF2YXNjcmlwdDp0aHJvdyBuZXcgRXJyb3IoJ1JlYWN0IGhhcyBibG9ja2VkIGEgamF2YXNjcmlwdDogVVJMIGFzIGEgc2VjdXJpdHkgcHJlY2F1dGlvbi4nKVwiXG4gICAgICAgIDogdXJsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBub29wJDEoKSB7fVxuICAgIGZ1bmN0aW9uIGdldEV2ZW50VGFyZ2V0KG5hdGl2ZUV2ZW50KSB7XG4gICAgICBuYXRpdmVFdmVudCA9IG5hdGl2ZUV2ZW50LnRhcmdldCB8fCBuYXRpdmVFdmVudC5zcmNFbGVtZW50IHx8IHdpbmRvdztcbiAgICAgIG5hdGl2ZUV2ZW50LmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50ICYmXG4gICAgICAgIChuYXRpdmVFdmVudCA9IG5hdGl2ZUV2ZW50LmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50KTtcbiAgICAgIHJldHVybiAzID09PSBuYXRpdmVFdmVudC5ub2RlVHlwZSA/IG5hdGl2ZUV2ZW50LnBhcmVudE5vZGUgOiBuYXRpdmVFdmVudDtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVzdG9yZVN0YXRlT2ZUYXJnZXQodGFyZ2V0KSB7XG4gICAgICB2Y
15852XIgaW50ZXJuYWxJbnN0YW5jZSA9IGdldEluc3RhbmNlRnJvbU5vZGUodGFyZ2V0KTtcbiAgICAgIGlmIChpbnRlcm5hbEluc3RhbmNlICYmICh0YXJnZXQgPSBpbnRlcm5hbEluc3RhbmNlLnN0YXRlTm9kZSkpIHtcbiAgICAgICAgdmFyIHByb3BzID0gdGFyZ2V0W2ludGVybmFsUHJvcHNLZXldIHx8IG51bGw7XG4gICAgICAgIGE6IHN3aXRjaCAoXG4gICAgICAgICAgKCh0YXJnZXQgPSBpbnRlcm5hbEluc3RhbmNlLnN0YXRlTm9kZSksIGludGVybmFsSW5zdGFuY2UudHlwZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgY2FzZSBcImlucHV0XCI6XG4gICAgICAgICAgICB1cGRhdGVJbnB1dChcbiAgICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgICBwcm9wcy52YWx1ZSxcbiAgICAgICAgICAgICAgcHJvcHMuZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgICBwcm9wcy5kZWZhdWx0VmFsdWUsXG4gICAgICAgICAgICAgIHByb3BzLmNoZWNrZWQsXG4gICAgICAgICAgICAgIHByb3BzLmRlZmF1bHRDaGVja2VkLFxuICAgICAgICAgICAgICBwcm9wcy50eXBlLFxuICAgICAgICAgICAgICBwcm9wcy5uYW1lXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaW50ZXJuYWxJbnN0YW5jZSA9IHByb3BzLm5hbWU7XG4gICAgICAgICAgICBpZiAoXCJyYWRpb1wiID09PSBwcm9wcy50eXBlICYmIG51bGwgIT0gaW50ZXJuYWxJbnN0YW5jZSkge1xuICAgICAgICAgICAgICBmb3IgKHByb3BzID0gdGFyZ2V0OyBwcm9wcy5wYXJlbnROb2RlOyApIHByb3BzID0gcHJvcHMucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbihpbnRlcm5hbEluc3RhbmNlLCBcIm5hbWVcIik7XG4gICAgICAgICAgICAgIHByb3BzID0gcHJvcHMucXVlcnlTZWxlY3RvckFsbChcbiAgICAgICAgICAgICAgICAnaW5wdXRbbmFtZT1cIicgK1xuICAgICAgICAgICAgICAgICAgZXNjYXBlU2VsZWN0b3JBdHRyaWJ1dGVWYWx1ZUluc2lkZURvdWJsZVF1b3RlcyhcbiAgICAgICAgICAgICAgICAgICAgXCJcIiArIGludGVybmFsSW5zdGFuY2VcbiAgICAgICAgICAgICAgICAgICkgK1xuICAgICAgICAgICAgICAgICAgJ1wiXVt0eXBlPVwicmFkaW9cIl0nXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgICAgaW50ZXJuYWxJbnN0YW5jZSA9IDA7XG4gICAgICAgICAgICAgICAgaW50ZXJuYWxJbnN0YW5jZSA8IHByb3BzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpbnRlcm5hbEluc3RhbmNlKytcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdmFyIG90aGVyTm9kZSA9IHByb3BzW2ludGVybmFsSW5zdGFuY2VdO1xuICAgICAgICAgICAgICAgIGlmIChvdGhlck5vZGUgIT09IHRhcmdldCAmJiBvdGhlck5vZGUuZm9ybSA9PT0gdGFyZ2V0LmZvcm0pIHtcbiAgICAgICAgICAgICAgICAgIHZhciBvdGhlclByb3BzID0gb3RoZXJOb2RlW2ludGVybmFsUHJvcHNLZXldIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgICBpZiAoIW90aGVyUHJvcHMpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgIFwiUmVhY3RET01JbnB1dDogTWl4aW5nIFJlYWN0IGFuZCBub24tUmVhY3QgcmFkaW8gaW5wdXRzIHdpdGggdGhlIHNhbWUgYG5hbWVgIGlzIG5vdCBzdXBwb3J0ZWQuXCJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIHVwZGF0ZUlucHV0KFxuICAgICAgICAgICAgICAgICAgICBvdGhlck5vZGUsXG4gICAgICAgICAgICAgICAgICAgIG90aGVyUHJvcHMudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIG90aGVyUHJvcHMuZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBvdGhlclByb3BzLmRlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgb3RoZXJQcm9wcy5jaGVja2VkLFxuICAgICAgICAgICAgICAgICAgICBvdGhlclByb3BzLmRlZmF1bHRDaGVja2VkLFxuICAgICAgICAgICAgICAgICAgICBvdGhlclByb3BzLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIG90aGVyUHJvcHMubmFtZVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgICBpbnRlcm5hbEluc3RhbmNlID0gMDtcbiAgICAgICAgICAgICAgICBpbnRlcm5hbEluc3RhbmNlIDwgcHJvcHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGludGVybmFsSW5zdGFuY2UrK1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKG90aGVyTm9kZSA9IHByb3BzW2ludGVybmFsSW5zdGFuY2VdKSxcbiAgICAgICAgICAgICAgICAgIG90aGVyTm9kZS5mb3JtID09PSB0YXJnZXQuZm9ybSAmJlxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVWYWx1ZUlmQ2hhbmdlZChvdGhlck5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICBjYXNlIFwidGV4dGFyZWFcIjpcbiAgICAgICAgICAgIHVwZGF0ZVRleHRhcmVhKHRhcmdldCwgcHJvcHMudmFsdWUsIHByb3BzLmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgIGNhc2UgXCJzZWxlY3RcIjpcbiAgICAgICAgICAgIChpbnRlcm5hbEluc3RhbmNlID0gcHJvcHMudmFsdWUpLFxuICAgICAgICAgICAgICBudWxsICE9IGludGVybmFsSW5zdGFuY2UgJiZcbiAgICAgICAgICAgICAgICB1cGRhdGVPcHRpb25zKHRhcmdldCwgISFwcm9wcy5tdWx0aXBsZSwgaW50ZXJuYWxJbnN0YW5jZSwgITEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGJhdGNoZWRVcGRhdGVzJDEoZm4sIGEsIGIpIHtcbiAgICAgIGlmIChpc0luc2lkZUV2ZW50SGFuZGxlcikgcmV0dXJuIGZuKGEsIGIpO1xuICAgICAgaXNJbnNpZGVFdmVudEhhbmRsZXIgPSAhMDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgPSBmbihhKTtcbiAgICAgICAgcmV0dXJuIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdDtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAoKGlzSW5zaWRlRXZlbnRIYW5kbGVyID0gITEpLFxuICAgICAgICAgIG51bGwgIT09IHJlc3RvcmVUYXJnZXQgfHwgbnVsbCAhPT0gcmVzdG9yZVF1ZXVlKVxuICAgICAgICApXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgKGZsdXNoU3luY1dvcmskMSgpLFxuICAgICAgICAgICAgcmVzdG9yZVRhcmdldCAmJlxuICAgICAgICAgICAgICAoKGEgPSByZXN0b3JlVGFyZ2V0KSxcbiAgICAgICAgICAgICAgKGZuID0gcmVzdG9yZVF1ZXVlKSxcbiAgICAgICAgICAgICAgKHJlc3RvcmVRdWV1ZSA9IHJlc3RvcmVUYXJnZXQgPSBudWxsKSxcbiAgICAgICAgICAgICAgcmVzdG9yZVN0YXRlT2ZUYXJnZXQoYSksXG4gICAgICAgICAgICAgIGZuKSlcbiAgICAgICAgICApXG4gICAgICAgICAgICBmb3IgKGEgPSAwOyBhIDwgZm4ubGVuZ3RoOyBhKyspIHJlc3RvcmVTdGF0ZU9mVGFyZ2V0KGZuW2FdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0TGlzdGVuZXIoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSkge1xuICAgICAgdmFyIHN0YXRlTm9kZSA9IGluc3Quc3RhdGVOb2RlO1xuICAgICAgaWYgKG51bGwgPT09IHN0YXRlTm9kZSkgcmV0dXJuIG51bGw7XG4gICAgICB2Y
15852XIgcHJvcHMgPSBzdGF0ZU5vZGVbaW50ZXJuYWxQcm9wc0tleV0gfHwgbnVsbDtcbiAgICAgIGlmIChudWxsID09PSBwcm9wcykgcmV0dXJuIG51bGw7XG4gICAgICBzdGF0ZU5vZGUgPSBwcm9wc1tyZWdpc3RyYXRpb25OYW1lXTtcbiAgICAgIGE6IHN3aXRjaCAocmVnaXN0cmF0aW9uTmFtZSkge1xuICAgICAgICBjYXNlIFwib25DbGlja1wiOlxuICAgICAgICBjYXNlIFwib25DbGlja0NhcHR1cmVcIjpcbiAgICAgICAgY2FzZSBcIm9uRG91YmxlQ2xpY2tcIjpcbiAgICAgICAgY2FzZSBcIm9uRG91YmxlQ2xpY2tDYXB0dXJlXCI6XG4gICAgICAgIGNhc2UgXCJvbk1vdXNlRG93blwiOlxuICAgICAgICBjYXNlIFwib25Nb3VzZURvd25DYXB0dXJlXCI6XG4gICAgICAgIGNhc2UgXCJvbk1vdXNlTW92ZVwiOlxuICAgICAgICBjYXNlIFwib25Nb3VzZU1vdmVDYXB0dXJlXCI6XG4gICAgICAgIGNhc2UgXCJvbk1vdXNlVXBcIjpcbiAgICAgICAgY2FzZSBcIm9uTW91c2VVcENhcHR1cmVcIjpcbiAgICAgICAgY2FzZSBcIm9uTW91c2VFbnRlclwiOlxuICAgICAgICAgIChwcm9wcyA9ICFwcm9wcy5kaXNhYmxlZCkgfHxcbiAgICAgICAgICAgICgoaW5zdCA9IGluc3QudHlwZSksXG4gICAgICAgICAgICAocHJvcHMgPSAhKFxuICAgICAgICAgICAgICBcImJ1dHRvblwiID09PSBpbnN0IHx8XG4gICAgICAgICAgICAgIFwiaW5wdXRcIiA9PT0gaW5zdCB8fFxuICAgICAgICAgICAgICBcInNlbGVjdFwiID09PSBpbnN0IHx8XG4gICAgICAgICAgICAgIFwidGV4dGFyZWFcIiA9PT0gaW5zdFxuICAgICAgICAgICAgKSkpO1xuICAgICAgICAgIGluc3QgPSAhcHJvcHM7XG4gICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpbnN0ID0gITE7XG4gICAgICB9XG4gICAgICBpZiAoaW5zdCkgcmV0dXJuIG51bGw7XG4gICAgICBpZiAoc3RhdGVOb2RlICYmIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIHN0YXRlTm9kZSlcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgXCJFeHBlY3RlZCBgXCIgK1xuICAgICAgICAgICAgcmVnaXN0cmF0aW9uTmFtZSArXG4gICAgICAgICAgICBcImAgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbiwgaW5zdGVhZCBnb3QgYSB2YWx1ZSBvZiBgXCIgK1xuICAgICAgICAgICAgdHlwZW9mIHN0YXRlTm9kZSArXG4gICAgICAgICAgICBcImAgdHlwZS5cIlxuICAgICAgICApO1xuICAgICAgcmV0dXJuIHN0YXRlTm9kZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0RGF0YSgpIHtcbiAgICAgIGlmIChmYWxsYmFja1RleHQpIHJldHVybiBmYWxsYmFja1RleHQ7XG4gICAgICB2Y
15852XIgc3RhcnQsXG4gICAgICAgIHN0YXJ0VmFsdWUgPSBzdGFydFRleHQsXG4gICAgICAgIHN0YXJ0TGVuZ3RoID0gc3RhcnRWYWx1ZS5sZW5ndGgsXG4gICAgICAgIGVuZCxcbiAgICAgICAgZW5kVmFsdWUgPSBcInZhbHVlXCIgaW4gcm9vdCA/IHJvb3QudmFsdWUgOiByb290LnRleHRDb250ZW50LFxuICAgICAgICBlbmRMZW5ndGggPSBlbmRWYWx1ZS5sZW5ndGg7XG4gICAgICBmb3IgKFxuICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgIHN0YXJ0IDwgc3RhcnRMZW5ndGggJiYgc3RhcnRWYWx1ZVtzdGFydF0gPT09IGVuZFZhbHVlW3N0YXJ0XTtcbiAgICAgICAgc3RhcnQrK1xuICAgICAgKTtcbiAgICAgIHZhciBtaW5FbmQgPSBzdGFydExlbmd0aCAtIHN0YXJ0O1xuICAgICAgZm9yIChcbiAgICAgICAgZW5kID0gMTtcbiAgICAgICAgZW5kIDw9IG1pbkVuZCAmJlxuICAgICAgICBzdGFydFZhbHVlW3N0YXJ0TGVuZ3RoIC0gZW5kXSA9PT0gZW5kVmFsdWVbZW5kTGVuZ3RoIC0gZW5kXTtcbiAgICAgICAgZW5kKytcbiAgICAgICk7XG4gICAgICByZXR1cm4gKGZhbGxiYWNrVGV4dCA9IGVuZFZhbHVlLnNsaWNlKHN0YXJ0LCAxIDwgZW5kID8gMSAtIGVuZCA6IHZvaWQgMCkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRFdmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KSB7XG4gICAgICB2YXIga2V5Q29kZSA9IG5hdGl2ZUV2ZW50LmtleUNvZGU7XG4gICAgICBcImNoYXJDb2RlXCIgaW4gbmF0aXZlRXZlbnRcbiAgICAgICAgPyAoKG5hdGl2ZUV2ZW50ID0gbmF0aXZlRXZlbnQuY2hhckNvZGUpLFxuICAgICAgICAgIDAgPT09IG5hdGl2ZUV2ZW50ICYmIDEzID09PSBrZXlDb2RlICYmIChuYXRpdmVFdmVudCA9IDEzKSlcbiAgICAgICAgOiAobmF0aXZlRXZlbnQgPSBrZXlDb2RlKTtcbiAgICAgIDEwID09PSBuYXRpdmVFdmVudCAmJiAobmF0aXZlRXZlbnQgPSAxMyk7XG4gICAgICByZXR1cm4gMzIgPD0gbmF0aXZlRXZlbnQgfHwgMTMgPT09IG5hdGl2ZUV2ZW50ID8gbmF0aXZlRXZlbnQgOiAwO1xuICAgIH1cbiAgICBmdW5jdGlvbiBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZSgpIHtcbiAgICAgIHJldHVybiAhMDtcbiAgICB9XG4gICAgZnVuY3Rpb24gZnVuY3Rpb25UaGF0UmV0dXJuc0ZhbHNlKCkge1xuICAgICAgcmV0dXJuICExO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjcmVhdGVTeW50aGV0aWNFdmVudChJbnRlcmZhY2UpIHtcbiAgICAgIGZ1bmN0aW9uIFN5bnRoZXRpY0Jhc2VFdmVudChcbiAgICAgICAgcmVhY3ROYW1lLFxuICAgICAgICByZWFjdEV2ZW50VHlwZSxcbiAgICAgICAgdGFyZ2V0SW5zdCxcbiAgICAgICAgbmF0aXZlRXZlbnQsXG4gICAgICAgIG5hdGl2ZUV2ZW50VGFyZ2V0XG4gICAgICApIHtcbiAgICAgICAgdGhpcy5fcmVhY3ROYW1lID0gcmVhY3ROYW1lO1xuICAgICAgICB0aGlzLl90YXJnZXRJbnN0ID0gdGFyZ2V0SW5zdDtcbiAgICAgICAgdGhpcy50eXBlID0gcmVhY3RFdmVudFR5cGU7XG4gICAgICAgIHRoaXMubmF0aXZlRXZlbnQgPSBuYXRpdmVFdmVudDtcbiAgICAgICAgdGhpcy50YXJnZXQgPSBuYXRpdmVFdmVudFRhcmdldDtcbiAgICAgICAgdGhpcy5jdXJyZW50VGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gSW50ZXJmYWNlKVxuICAgICAgICAgIEludGVyZmFjZS5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkgJiZcbiAgICAgICAgICAgICgocmVhY3ROYW1lID0gSW50ZXJmYWNlW3Byb3BOYW1lXSksXG4gICAgICAgICAgICAodGhpc1twcm9wTmFtZV0gPSByZWFjdE5hbWVcbiAgICAgICAgICAgICAgPyByZWFjdE5hbWUobmF0aXZlRXZlbnQpXG4gICAgICAgICAgICAgIDogbmF0aXZlRXZlbnRbcHJvcE5hbWVdKSk7XG4gICAgICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gKFxuICAgICAgICAgIG51bGwgIT0gbmF0aXZlRXZlbnQuZGVmYXVsdFByZXZlbnRlZFxuICAgICAgICAgICAgPyBuYXRpdmVFdmVudC5kZWZhdWx0UHJldmVudGVkXG4gICAgICAgICAgICA6ICExID09PSBuYXRpdmVFdmVudC5yZXR1cm5WYWx1ZVxuICAgICAgICApXG4gICAgICAgICAgPyBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZVxuICAgICAgICAgIDogZnVuY3Rpb25UaGF0UmV0dXJuc0ZhbHNlO1xuICAgICAgICB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gZnVuY3Rpb25UaGF0UmV0dXJuc0ZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGFzc2lnbihTeW50aGV0aWNCYXNlRXZlbnQucHJvdG90eXBlLCB7XG4gICAgICAgIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGhpcy5kZWZhdWx0UHJldmVudGVkID0gITA7XG4gICAgICAgICAgdmFyIGV2ZW50ID0gdGhpcy5uYXRpdmVFdmVudDtcbiAgICAgICAgICBldmVudCAmJlxuICAgICAgICAgICAgKGV2ZW50LnByZXZlbnREZWZhdWx0XG4gICAgICAgICAgICAgID8gZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICAgICAgICA6IFwidW5rbm93blwiICE9PSB0eXBlb2YgZXZlbnQucmV0dXJuVmFsdWUgJiZcbiAgICAgICAgICAgICAgICAoZXZlbnQucmV0dXJuVmFsdWUgPSAhMSksXG4gICAgICAgICAgICAodGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBmdW5jdGlvblRoYXRSZXR1cm5zVHJ1ZSkpO1xuICAgICAgICB9LFxuICAgICAgICBzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2Y
15852XIgZXZlbnQgPSB0aGlzLm5hdGl2ZUV2ZW50O1xuICAgICAgICAgIGV2ZW50ICYmXG4gICAgICAgICAgICAoZXZlbnQuc3RvcFByb3BhZ2F0aW9uXG4gICAgICAgICAgICAgID8gZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICAgICAgOiBcInVua25vd25cIiAhPT0gdHlwZW9mIGV2ZW50LmNhbmNlbEJ1YmJsZSAmJlxuICAgICAgICAgICAgICAgIChldmVudC5jYW5jZWxCdWJibGUgPSAhMCksXG4gICAgICAgICAgICAodGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlKSk7XG4gICAgICAgIH0sXG4gICAgICAgIHBlcnNpc3Q6IGZ1bmN0aW9uICgpIHt9LFxuICAgICAgICBpc1BlcnNpc3RlbnQ6IGZ1bmN0aW9uVGhhdFJldHVybnNUcnVlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBTeW50aGV0aWNCYXNlRXZlbnQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1vZGlmaWVyU3RhdGVHZXR0ZXIoa2V5QXJnKSB7XG4gICAgICB2YXIgbmF0aXZlRXZlbnQgPSB0aGlzLm5hdGl2ZUV2ZW50O1xuICAgICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmdldE1vZGlmaWVyU3RhdGVcbiAgICAgICAgPyBuYXRpdmVFdmVudC5nZXRNb2RpZmllclN0YXRlKGtleUFyZylcbiAgICAgICAgOiAoa2V5QXJnID0gbW9kaWZpZXJLZXlUb1Byb3Bba2V5QXJnXSlcbiAgICAgICAgICA/ICEhbmF0aXZlRXZlbnRba2V5QXJnXVxuICAgICAgICAgIDogITE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldEV2ZW50TW9kaWZpZXJTdGF0ZSgpIHtcbiAgICAgIHJldHVybiBtb2RpZmllclN0YXRlR2V0dGVyO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0ZhbGxiYWNrQ29tcG9zaXRpb25FbmQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICAgICAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICAgICAgY2FzZSBcImtleXVwXCI6XG4gICAgICAgICAgcmV0dXJuIC0xICE9PSBFTkRfS0VZQ09ERVMuaW5kZXhPZihuYXRpdmVFdmVudC5rZXlDb2RlKTtcbiAgICAgICAgY2FzZSBcImtleWRvd25cIjpcbiAgICAgICAgICByZXR1cm4gbmF0aXZlRXZlbnQua2V5Q29kZSAhPT0gU1RBUlRfS0VZQ09ERTtcbiAgICAgICAgY2FzZSBcImtleXByZXNzXCI6XG4gICAgICAgIGNhc2UgXCJtb3VzZWRvd25cIjpcbiAgICAgICAgY2FzZSBcImZvY3Vzb3V0XCI6XG4gICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0RGF0YUZyb21DdXN0b21FdmVudChuYXRpdmVFdmVudCkge1xuICAgICAgbmF0aXZlRXZlbnQgPSBuYXRpdmVFdmVudC5kZXRhaWw7XG4gICAgICByZXR1cm4gXCJvYmplY3RcIiA9PT0gdHlwZW9mIG5hdGl2ZUV2ZW50ICYmIFwiZGF0YVwiIGluIG5hdGl2ZUV2ZW50XG4gICAgICAgID8gbmF0aXZlRXZlbnQuZGF0YVxuICAgICAgICA6IG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldE5hdGl2ZUJlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICAgICAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICAgICAgY2FzZSBcImNvbXBvc2l0aW9uZW5kXCI6XG4gICAgICAgICAgcmV0dXJuIGdldERhdGFGcm9tQ3VzdG9tRXZlbnQobmF0aXZlRXZlbnQpO1xuICAgICAgICBjYXNlIFwia2V5cHJlc3NcIjpcbiAgICAgICAgICBpZiAobmF0aXZlRXZlbnQud2hpY2ggIT09IFNQQUNFQkFSX0NPREUpIHJldHVybiBudWxsO1xuICAgICAgICAgIGhhc1NwYWNlS2V5cHJlc3MgPSAhMDtcbiAgICAgICAgICByZXR1cm4gU1BBQ0VCQVJfQ0hBUjtcbiAgICAgICAgY2FzZSBcInRleHRJbnB1dFwiOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoZG9tRXZlbnROYW1lID0gbmF0aXZlRXZlbnQuZGF0YSksXG4gICAgICAgICAgICBkb21FdmVudE5hbWUgPT09IFNQQUNFQkFSX0NIQVIgJiYgaGFzU3BhY2VLZXlwcmVzc1xuICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgOiBkb21FdmVudE5hbWVcbiAgICAgICAgICApO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRGYWxsYmFja0JlZm9yZUlucHV0Q2hhcnMoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICAgICAgaWYgKGlzQ29tcG9zaW5nKVxuICAgICAgICByZXR1cm4gXCJjb21wb3NpdGlvbmVuZFwiID09PSBkb21FdmVudE5hbWUgfHxcbiAgICAgICAgICAoIWNhblVzZUNvbXBvc2l0aW9uRXZlbnQgJiZcbiAgICAgICAgICAgIGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSlcbiAgICAgICAgICA/ICgoZG9tRXZlbnROYW1lID0gZ2V0RGF0YSgpKSxcbiAgICAgICAgICAgIChmYWxsYmFja1RleHQgPSBzdGFydFRleHQgPSByb290ID0gbnVsbCksXG4gICAgICAgICAgICAoaXNDb21wb3NpbmcgPSAhMSksXG4gICAgICAgICAgICBkb21FdmVudE5hbWUpXG4gICAgICAgICAgOiBudWxsO1xuICAgICAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICAgICAgY2FzZSBcInBhc3RlXCI6XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGNhc2UgXCJrZXlwcmVzc1wiOlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgIG5hdGl2ZUV2ZW50LmN0cmxLZXkgfHxcbiAgICAgICAgICAgICAgbmF0aXZlRXZlbnQuYWx0S2V5IHx8XG4gICAgICAgICAgICAgIG5hdGl2ZUV2ZW50Lm1ldGFLZXlcbiAgICAgICAgICAgICkgfHxcbiAgICAgICAgICAgIChuYXRpdmVFdmVudC5jdHJsS2V5ICYmIG5hdGl2ZUV2ZW50LmFsdEtleSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChuYXRpdmVFdmVudC5jaGFyICYmIDEgPCBuYXRpdmVFdmVudC5jaGFyLmxlbmd0aClcbiAgICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmNoYXI7XG4gICAgICAgICAgICBpZiAobmF0aXZlRXZlbnQud2hpY2gpXG4gICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKG5hdGl2ZUV2ZW50LndoaWNoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGNhc2UgXCJjb21wb3NpdGlvbmVuZFwiOlxuICAgICAgICAgI
15852HJldHVybiB1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSAmJiBcImtvXCIgIT09IG5hdGl2ZUV2ZW50LmxvY2FsZVxuICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICA6IG5hdGl2ZUV2ZW50LmRhdGE7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzVGV4dElucHV0RWxlbWVudChlbGVtKSB7XG4gICAgICB2YXIgbm9kZU5hbWUgPSBlbGVtICYmIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgcmV0dXJuIFwiaW5wdXRcIiA9PT0gbm9kZU5hbWVcbiAgICAgICAgPyAhIXN1cHBvcnRlZElucHV0VHlwZXNbZWxlbS50eXBlXVxuICAgICAgICA6IFwidGV4dGFyZWFcIiA9PT0gbm9kZU5hbWVcbiAgICAgICAgICA/ICEwXG4gICAgICAgICAgOiAhMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaXNFdmVudFN1cHBvcnRlZChldmVudE5hbWVTdWZmaXgpIHtcbiAgICAgIGlmICghY2FuVXNlRE9NKSByZXR1cm4gITE7XG4gICAgICBldmVudE5hbWVTdWZmaXggPSBcIm9uXCIgKyBldmVudE5hbWVTdWZmaXg7XG4gICAgICB2YXIgaXNTdXBwb3J0ZWQgPSBldmVudE5hbWVTdWZmaXggaW4gZG9jdW1lbnQ7XG4gICAgICBpc1N1cHBvcnRlZCB8fFxuICAgICAgICAoKGlzU3VwcG9ydGVkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSksXG4gICAgICAgIGlzU3VwcG9ydGVkLnNldEF0dHJpYnV0ZShldmVudE5hbWVTdWZmaXgsIFwicmV0dXJuO1wiKSxcbiAgICAgICAgKGlzU3VwcG9ydGVkID0gXCJmdW5jdGlvblwiID09PSB0eXBlb2YgaXNTdXBwb3J0ZWRbZXZlbnROYW1lU3VmZml4XSkpO1xuICAgICAgcmV0dXJuIGlzU3VwcG9ydGVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjcmVhdGVBbmRBY2N1bXVsYXRlQ2hhbmdlRXZlbnQoXG4gICAgICBkaXNwYXRjaFF1ZXVlLFxuICAgICAgaW5zdCxcbiAgICAgIG5hdGl2ZUV2ZW50LFxuICAgICAgdGFyZ2V0XG4gICAgKSB7XG4gICAgICByZXN0b3JlVGFyZ2V0XG4gICAgICAgID8gcmVzdG9yZVF1ZXVlXG4gICAgICAgICAgPyByZXN0b3JlUXVldWUucHVzaCh0YXJnZXQpXG4gICAgICAgICAgOiAocmVzdG9yZVF1ZXVlID0gW3RhcmdldF0pXG4gICAgICAgIDogKHJlc3RvcmVUYXJnZXQgPSB0YXJnZXQpO1xuICAgICAgaW5zdCA9IGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyhpbnN0LCBcIm9uQ2hhbmdlXCIpO1xuICAgICAgMCA8IGluc3QubGVuZ3RoICYmXG4gICAgICAgICgobmF0aXZlRXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnQoXG4gICAgICAgICAgXCJvbkNoYW5nZVwiLFxuICAgICAgICAgIFwiY2hhbmdlXCIsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBuYXRpdmVFdmVudCxcbiAgICAgICAgICB0YXJnZXRcbiAgICAgICAgKSksXG4gICAgICAgIGRpc3BhdGNoUXVldWUucHVzaCh7IGV2ZW50OiBuYXRpdmVFdmVudCwgbGlzdGVuZXJzOiBpbnN0IH0pKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcnVuRXZlbnRJbkJhdGNoKGRpc3BhdGNoUXVldWUp
15852IHtcbiAgICAgIHByb2Nlc3NEaXNwYXRjaFF1ZXVlKGRpc3BhdGNoUXVldWUsIDApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQodGFyZ2V0SW5zdCkge1xuICAgICAgdmFyIHRhcmdldE5vZGUgPSBnZXROb2RlRnJvbUluc3RhbmNlKHRhcmdldEluc3QpO1xuICAgICAgaWYgKHVwZGF0ZVZhbHVlSWZDaGFuZ2VkKHRhcmdldE5vZGUpKSByZXR1cm4gdGFyZ2V0SW5zdDtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvckNoYW5nZUV2ZW50KGRvbUV2ZW50TmFtZSwgdGFyZ2V0SW5zdCkge1xuICAgICAgaWYgKFwiY2hhbmdlXCIgPT09IGRvbUV2ZW50TmFtZSkgcmV0dXJuIHRhcmdldEluc3Q7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCkge1xuICAgICAgYWN0aXZlRWxlbWVudCQxICYmXG4gICAgICAgIChhY3RpdmVFbGVtZW50JDEuZGV0YWNoRXZlbnQoXCJvbnByb3BlcnR5Y2hhbmdlXCIsIGhhbmRsZVByb3BlcnR5Q2hhbmdlKSxcbiAgICAgICAgKGFjdGl2ZUVsZW1lbnRJbnN0JDEgPSBhY3RpdmVFbGVtZW50JDEgPSBudWxsKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhhbmRsZVByb3BlcnR5Q2hhbmdlKG5hdGl2ZUV2ZW50KSB7XG4gICAgICBpZiAoXG4gICAgICAgIFwidmFsdWVcIiA9PT0gbmF0aXZlRXZlbnQucHJvcGVydHlOYW1lICYmXG4gICAgICAgIGdldEluc3RJZlZhbHVlQ2hhbmdlZChhY3RpdmVFbGVtZW50SW5zdCQxKVxuICAgICAgKSB7XG4gICAgICAgIHZhciBkaXNwYXRjaFF1ZXVlID0gW107XG4gICAgICAgIGNyZWF0ZUFuZEFjY3VtdWxhdGVDaGFuZ2VFdmVudChcbiAgICAgICAgICBkaXNwYXRjaFF1ZXVlLFxuICAgICAgICAgIGFjdGl2ZUVsZW1lbnRJbnN0JDEsXG4gICAgICAgICAgbmF0aXZlRXZlbnQsXG4gICAgICAgICAgZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpXG4gICAgICAgICk7XG4gICAgICAgIGJhdGNoZWRVcGRhdGVzJDEocnVuRXZlbnRJbkJhdGNoLCBkaXNwYXRjaFF1ZXVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlRXZlbnRzRm9ySW5wdXRFdmVudFBvbHlmaWxsKFxuICAgICAgZG9tRXZlbnROYW1lLFxuICAgICAgdGFyZ2V0LFxuICAgICAgdGFyZ2V0SW5zdFxuICAgICkge1xuICAgICAgXCJmb2N1c2luXCIgPT09IGRvbUV2ZW50TmFtZVxuICAgICAgICA/IChzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpLFxuICAgICAgICAgIChhY3RpdmVFbGVtZW50JDEgPSB0YXJnZXQpLFxuICAgICAgICAgIChhY3RpdmVFbGVtZW50SW5zdCQxID0gdGFyZ2V0SW5zdCksXG4gICAgICAgICAgYWN0aXZlRWxlbWVudCQxLmF0dGFjaEV2ZW50KFwib25wcm9wZXJ0eWNoYW5nZVwiLCBoYW5kbGVQcm9wZXJ0eUNoYW5nZSkpXG4gICAgICAgIDogXCJmb2N1c291dFwiID09PSBkb21FdmVudE5hbWUgJiYgc3RvcFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UoKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvcklucHV0RXZlbnRQb2x5ZmlsbChkb21FdmVudE5hbWUpIHtcbiAgICAgIGlmIChcbiAgICAgICAgXCJzZWxlY3Rpb25jaGFuZ2VcIiA9PT0gZG9tRXZlbnROYW1lIHx8XG4gICAgICAgIFwia2V5dXBcIiA9PT0gZG9tRXZlbnROYW1lIHx8XG4gICAgICAgIFwia2V5ZG93blwiID09PSBkb21FdmVudE5hbWVcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIGdldEluc3RJZlZhbHVlQ2hhbmdlZChhY3RpdmVFbGVtZW50SW5zdCQxKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvckNsaWNrRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gICAgICBpZiAoXCJjbGlja1wiID09PSBkb21FdmVudE5hbWUpIHJldHVybiBnZXRJbnN0SWZWYWx1ZUNoYW5nZWQodGFyZ2V0SW5zdCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JJbnB1dE9yQ2hhbmdlRXZlbnQoZG9tRXZlbnROYW1lLCB0YXJnZXRJbnN0KSB7XG4gICAgICBpZiAoXCJpbnB1dFwiID09PSBkb21FdmVudE5hbWUgfHwgXCJjaGFuZ2VcIiA9PT0gZG9tRXZlbnROYW1lKVxuICAgICAgICByZXR1cm4gZ2V0SW5zdElmVmFsdWVDaGFuZ2VkKHRhcmdldEluc3QpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpcyh4LCB5KSB7XG4gICAgICByZXR1cm4gKHggPT09IHkgJiYgKDAgIT09IHggfHwgMSAvIHggPT09IDEgLyB5KSkgfHwgKHggIT09IHggJiYgeSAhPT0geSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNoYWxsb3dFcXVhbChvYmpBLCBvYmpCKSB7XG4gICAgICBpZiAob2JqZWN0SXMob2JqQSwgb2JqQikpIHJldHVybiAhMDtcbiAgICAgIGlmIChcbiAgICAgICAgXCJvYmplY3RcIiAhPT0gdHlwZW9mIG9iakEgfHxcbiAgICAgICAgbnVsbCA9PT0gb2JqQSB8fFxuICAgICAgICBcIm9iamVjdFwiICE9PSB0eXBlb2Ygb2JqQiB8fFxuICAgICAgICBudWxsID09PSBvYmpCXG4gICAgICApXG4gICAgICAgIHJldHVybiAhMTtcbiAgICAgIHZhciBrZXlzQSA9IE9iamVjdC5rZXlzKG9iakEpLFxuICAgICAgICBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuICAgICAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSByZXR1cm4gITE7XG4gICAgICBmb3IgKGtleXNCID0gMDsga2V5c0IgPCBrZXlzQS5sZW5ndGg7IGtleXNCKyspIHtcbiAgICAgICAgdmFyIGN1cnJlbnRLZXkgPSBrZXlzQVtrZXlzQl07XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhaGFzT3duUHJvcGVydHkuY2FsbChvYmpCLCBjdXJyZW50S2V5KSB8fFxuICAgICAgICAgICFvYmplY3RJcyhvYmpBW2N1cnJlbnRLZXldLCBvYmpCW2N1cnJlbnRLZXldKVxuICAgICAgICApXG4gICAgICAgICAgcmV0dXJuICExO1xuICAgICAgfVxuICAgICAgcmV0dXJuICEwO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRBY3RpdmVFbGVtZW50KGRvYykge1xuICAgICAgZG9jID0gZG9jIHx8IChcInVuZGVmaW5lZFwiICE9PSB0eXBlb2YgZG9jdW1lbnQgPyBkb2N1bWVudCA6IHZvaWQgMCk7XG4gICAgICBpZiAoXCJ1bmRlZmluZWRcIiA9PT0gdHlwZW9mIGRvYykgcmV0dXJuIG51bGw7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZG9jLmFjdGl2ZUVsZW1lbnQgfHwgZG9jLmJvZHk7XG4gICAgICB9IGNhdGNoIChlJDIpIHtcbiAgICAgICAgcmV0dXJuIGRvYy5ib2R5O1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRMZWFmTm9kZShub2RlKSB7XG4gICAgICBmb3IgKDsgbm9kZSAmJiBub2RlLmZpcnN0Q2hpbGQ7ICkgbm9kZSA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgICAgIHJldHVybi
15852Bub2RlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0KHJvb3QsIG9mZnNldCkge1xuICAgICAgdmFyIG5vZGUgPSBnZXRMZWFmTm9kZShyb290KTtcbiAgICAgIHJvb3QgPSAwO1xuICAgICAgZm9yICh2YXIgbm9kZUVuZDsgbm9kZTsgKSB7XG4gICAgICAgIGlmICgzID09PSBub2RlLm5vZGVUeXBlKSB7XG4gICAgICAgICAgbm9kZUVuZCA9IHJvb3QgKyBub2RlLnRleHRDb250ZW50Lmxlbmd0aDtcbiAgICAgICAgICBpZiAocm9vdCA8PSBvZmZzZXQgJiYgbm9kZUVuZCA+PSBvZmZzZXQpXG4gICAgICAgICAgICByZXR1cm4geyBub2RlOiBub2RlLCBvZmZzZXQ6IG9mZnNldCAtIHJvb3QgfTtcbiAgICAgICAgICByb290ID0gbm9kZUVuZDtcbiAgICAgICAgfVxuICAgICAgICBhOiB7XG4gICAgICAgICAgZm9yICg7IG5vZGU7ICkge1xuICAgICAgICAgICAgaWYgKG5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBub2RlID0gdm9pZCAwO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUgPSBnZXRMZWFmTm9kZShub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gY29udGFpbnNOb2RlKG91dGVyTm9kZSwgaW5uZXJOb2RlKSB7XG4gICAgICByZXR1cm4gb3V0ZXJOb2RlICYmIGlubmVyTm9kZVxuICAgICAgICA/IG91dGVyTm9kZSA9PT0gaW5uZXJOb2RlXG4gICAgICAgICAgPyAhMFxuICAgICAgICAgIDogb3V0ZXJOb2RlICYmIDMgPT09IG91dGVyTm9kZS5ub2RlVHlwZVxuICAgICAgICAgICAgPyAhMVxuICAgICAgICAgICAgOiBpbm5lck5vZGUgJiYgMyA9PT0gaW5uZXJOb2RlLm5vZGVUeXBlXG4gICAgICAgICAgICAgID8gY29udGFpbnNOb2RlKG91dGVyTm9kZSwgaW5uZXJOb2RlLnBhcmVudE5vZGUpXG4gICAgICAgICAgICAgIDogXCJjb250YWluc1wiIGluIG91dGVyTm9kZVxuICAgICAgICAgICAgICAgID8gb3V0ZXJOb2RlLmNvbnRhaW5zKGlubmVyTm9kZSlcbiAgICAgICAgICAgICAgICA6IG91dGVyTm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvblxuICAgICAgICAgICAgICAgICAgPyAhIShvdXRlck5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24oaW5uZXJOb2RlKSAmIDE2KVxuICAgICAgICAgICAgICAgICAgOiAhMVxuICAgICAgICA6ICExO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRBY3RpdmVFbGVtZW50RGVlcChjb250YWluZXJJbmZvKSB7XG4gICAgICBjb250YWluZXJJbmZvID1cbiAgICAgICAgbnVsbCAhPSBjb250YWluZXJJbmZvICYmXG4gICAgICAgIG51bGwgIT0gY29udGFpbmVySW5mby5vd25lckRvY3VtZW50ICYmXG4gICAgICAgIG51bGwgIT0gY29udGFpbmVySW5mby5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3XG4gICAgICAgICAgPyBjb250YWluZXJJbmZvLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXdcbiAgICAgICAgICA6IHdpbmRvdztcbiAgICAgIGZvciAoXG4gICAgICAgIHZhciBlbGVtZW50ID0gZ2V0QWN0aXZlRWxlbWVudChjb250YWluZXJJbmZvLmRvY3VtZW50KTtcbiAgICAgICAgZWxlbWVudCBpbnN0YW5jZW9mIGNvbnRhaW5lckluZm8uSFRNTElGcmFtZUVsZW1lbnQ7XG5cbiAgICAgICkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgPVxuICAgICAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIGVsZW1lbnQuY29udGVudFdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgPSAhMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0KSBjb250YWluZXJJbmZvID0gZWxlbWVudC5jb250ZW50V2luZG93O1xuICAgICAgICBlbHNlIGJyZWFrO1xuICAgICAgICBlbGVtZW50ID0gZ2V0QWN0aXZlRWxlbWVudChjb250YWluZXJJbmZvLmRvY3VtZW50KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cbiAgICBmdW5jdGlvbiBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMoZWxlbSkge1xuICAgICAgdmFyIG5vZGVOYW1lID0gZWxlbSAmJiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIG5vZGVOYW1lICYmXG4gICAgICAgICgoXCJpbnB1dFwiID09PSBub2RlTmFtZSAmJlxuICAgICAgICAgIChcInRleHRcIiA9PT0gZWxlbS50eXBlIHx8XG4gICAgICAgICAgICBcInNlYXJjaFwiID09PSBlbGVtLnR5cGUgfHxcbiAgICAgICAgICAgIFwidGVsXCIgPT09IGVsZW0udHlwZSB8fFxuICAgICAgICAgICAgXCJ1cmxcIiA9PT0gZWxlbS50eXBlIHx8XG4gICAgICAgICAgICBcInBhc3N3b3JkXCIgPT09IGVsZW0udHlwZSkpIHx8XG4gICAgICAgICAgXCJ0ZXh0YXJlYVwiID09PSBub2RlTmFtZSB8fFxuICAgICAgICAgIFwidHJ1ZVwiID09PSBlbGVtLmNvbnRlbnRFZGl0YWJsZSlcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbnN0cnVjdFNlbGVjdEV2ZW50KFxuICAgICAgZGlzcGF0Y2hRdWV1ZSxcbiAgICAgIG5hdGl2ZUV2ZW50LFxuICAgICAgbmF0aXZlRXZlbnRUYXJnZXRcbiAgICApIHtcbiAgICAgIHZhciBkb2MgPVxuICAgICAgICBuYXRpdmVFdmVudFRhcmdldC53aW5kb3cgPT09IG5hdGl2ZUV2ZW50VGFyZ2V0XG4gICAgICAgICAgPyBuYXRpdmVFdmVudFRhcmdldC5kb2N1bWVudFxuICAgICAgICAgIDogOSA9PT0gbmF0aXZlRXZlbnRUYXJnZXQubm9kZVR5cGVcbiAgICAgICAgICAgID8gbmF0aXZlRXZlbnRUYXJnZXRcbiAgICAgICAgICAgIDogbmF0aXZlRXZlbnRUYXJnZXQub3duZXJEb2N1bWVudDtcbiAgICAgIG1vdXNlRG93biB8fFxuICAgICAgICBudWxsID09IGFjdGl2ZUVsZW1lbnQgfHxcbiAgICAgICAgYWN0aXZlRWxlbWVudCAhPT0gZ2V0QWN0aXZlRWxlbWVudChkb2MpIHx8XG4gICAgICAgICgoZG9jID0gYWN0aXZlRWxlbWVudCksXG4gICAgICAgIFwic2VsZWN0aW9uU3RhcnRcIiBpbiBkb2MgJiYgaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKGRvYylcbiAgICAgICAgICA/IChkb2MgPSB7IHN0YXJ0Oi
15852Bkb2Muc2VsZWN0aW9uU3RhcnQsIGVuZDogZG9jLnNlbGVjdGlvbkVuZCB9KVxuICAgICAgICAgIDogKChkb2MgPSAoXG4gICAgICAgICAgICAgIChkb2Mub3duZXJEb2N1bWVudCAmJiBkb2Mub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykgfHxcbiAgICAgICAgICAgICAgd2luZG93XG4gICAgICAgICAgICApLmdldFNlbGVjdGlvbigpKSxcbiAgICAgICAgICAgIChkb2MgPSB7XG4gICAgICAgICAgICAgIGFuY2hvck5vZGU6IGRvYy5hbmNob3JOb2RlLFxuICAgICAgICAgICAgICBhbmNob3JPZmZzZXQ6IGRvYy5hbmNob3JPZmZzZXQsXG4gICAgICAgICAgICAgIGZvY3VzTm9kZTogZG9jLmZvY3VzTm9kZSxcbiAgICAgICAgICAgICAgZm9jdXNPZmZzZXQ6IGRvYy5mb2N1c09mZnNldFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAobGFzdFNlbGVjdGlvbiAmJiBzaGFsbG93RXF1YWwobGFzdFNlbGVjdGlvbiwgZG9jKSkgfHxcbiAgICAgICAgICAoKGxhc3RTZWxlY3Rpb24gPSBkb2MpLFxuICAgICAgICAgIChkb2MgPSBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnMoYWN0aXZlRWxlbWVudEluc3QsIFwib25TZWxlY3RcIikpLFxuICAgICAgICAgIDAgPCBkb2MubGVuZ3RoICYmXG4gICAgICAgICAgICAoKG5hdGl2ZUV2ZW50ID0gbmV3IFN5bnRoZXRpY0V2ZW50KFxuICAgICAgICAgICAgICBcIm9uU2VsZWN0XCIsXG4gICAgICAgICAgICAgIFwic2VsZWN0XCIsXG4gICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgIG5hdGl2ZUV2ZW50LFxuICAgICAgICAgICAgICBuYXRpdmVFdmVudFRhcmdldFxuICAgICAgICAgICAgKSksXG4gICAgICAgICAgICBkaXNwYXRjaFF1ZXVlLnB1c2goeyBldmVudDogbmF0aXZlRXZlbnQsIGxpc3RlbmVyczogZG9jIH0pLFxuICAgICAgICAgICAgKG5hdGl2ZUV2ZW50LnRhcmdldCA9IGFjdGl2ZUVsZW1lbnQpKSkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtYWtlUHJlZml4TWFwKHN0eWxlUHJvcCwgZXZlbnROYW1lKSB7XG4gICAgICB2Y
15852XIgcHJlZml4ZXMgPSB7fTtcbiAgICAgIHByZWZpeGVzW3N0eWxlUHJvcC50b0xvd2VyQ2FzZSgpXSA9IGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgcHJlZml4ZXNbXCJXZWJraXRcIiArIHN0eWxlUHJvcF0gPSBcIndlYmtpdFwiICsgZXZlbnROYW1lO1xuICAgICAgcHJlZml4ZXNbXCJNb3pcIiArIHN0eWxlUHJvcF0gPSBcIm1velwiICsgZXZlbnROYW1lO1xuICAgICAgcmV0dXJuIHByZWZpeGVzO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZShldmVudE5hbWUpIHtcbiAgICAgIGlmIChwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXSkgcmV0dXJuIHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdO1xuICAgICAgaWYgKCF2ZW5kb3JQcmVmaXhlc1tldmVudE5hbWVdKSByZXR1cm4gZXZlbnROYW1lO1xuICAgICAgdmFyIHByZWZpeE1hcCA9IHZlbmRvclByZWZpeGVzW2V2ZW50TmFtZV0sXG4gICAgICAgIHN0eWxlUHJvcDtcbiAgICAgIGZvciAoc3R5bGVQcm9wIGluIHByZWZpeE1hcClcbiAgICAgICAgaWYgKHByZWZpeE1hcC5oYXNPd25Qcm9wZXJ0eShzdHlsZVByb3ApICYmIHN0eWxlUHJvcCBpbiBzdHlsZSlcbiAgICAgICAgICByZXR1cm4gKHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdID0gcHJlZml4TWFwW3N0eWxlUHJvcF0pO1xuICAgICAgcmV0dXJuIGV2ZW50TmFtZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVnaXN0ZXJTaW1wbGVFdmVudChkb21FdmVudE5hbWUsIHJlYWN0TmFtZSkge1xuICAgICAgdG9wTGV2ZWxFdmVudHNUb1JlYWN0TmFtZXMuc2V0KGRvbUV2ZW50TmFtZSwgcmVhY3ROYW1lKTtcbiAgICAgIHJlZ2lzdGVyVHdvUGhhc2VFdmVudChyZWFjdE5hbWUsIFtkb21FdmVudE5hbWVdKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0Vmlld1RyYW5zaXRpb25OYW1lKHByb3BzLCBpbnN0YW5jZSkge1xuICAgICAgaWYgKG51bGwgIT0gcHJvcHMubmFtZSAmJiBcImF1dG9cIiAhPT0gcHJvcHMubmFtZSkgcmV0dXJuIHByb3BzLm5hbWU7XG4gICAgICBpZiAobnVsbCAhPT0gaW5zdGFuY2UuYXV0b05hbWUpIHJldHVybiBpbnN0YW5jZS5hdXRvTmFtZTtcbiAgICAgIHByb3BzID0gcGVuZGluZ0VmZmVjdHNSb290LmlkZW50aWZpZXJQcmVmaXg7XG4gICAgICB2Y
15852XIgZ2xvYmFsQ2xpZW50SWQgPSBnbG9iYWxDbGllbnRJZENvdW50ZXIkMSsrO1xuICAgICAgcHJvcHMgPSBcIl9cIiArIHByb3BzICsgXCJ0X1wiICsgZ2xvYmFsQ2xpZW50SWQudG9TdHJpbmcoMzIpICsgXCJfXCI7XG4gICAgICByZXR1cm4gKGluc3RhbmNlLmF1dG9OYW1lID0gcHJvcHMpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRDbGFzc05hbWVCeVR5cGUoY2xhc3NCeVR5cGUpIHtcbiAgICAgIGlmIChudWxsID09IGNsYXNzQnlUeXBlIHx8IFwic3RyaW5nXCIgPT09IHR5cGVvZiBjbGFzc0J5VHlwZSlcbiAgICAgICAgcmV0dXJuIGNsYXNzQnlUeXBlO1xuICAgICAgdmFyIGNsYXNzTmFtZSA9IG51bGwsXG4gICAgICAgIGFjdGl2ZVR5cGVzID0gcGVuZGluZ1RyYW5zaXRpb25UeXBlcztcbiAgICAgIGlmIChudWxsICE9PSBhY3RpdmVUeXBlcylcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhY3RpdmVUeXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBtYXRjaCA9IGNsYXNzQnlUeXBlW2FjdGl2ZVR5cGVzW2ldXTtcbiAgICAgICAgICBpZiAobnVsbCAhPSBtYXRjaCkge1xuICAgICAgICAgICAgaWYgKFwibm9uZVwiID09PSBtYXRjaCkgcmV0dXJuIFwibm9uZVwiO1xuICAgICAgICAgICAgY2xhc3NOYW1lID0gbnVsbCA9PSBjbGFzc05hbWUgPyBtYXRjaCA6IGNsYXNzTmFtZSArIChcIiBcIiArIG1hdGNoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIHJldHVybiBudWxsID09IGNsYXNzTmFtZSA/IGNsYXNzQnlUeXBlLmRlZmF1bHQgOiBjbGFzc05hbWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldFZpZXdUcmFuc2l0aW9uQ2xhc3NOYW1lKGRlZmF1bHRDbGFzcywgZXZlbnRDbGFzcykge1xuICAgICAgZGVmYXVsdENsYXNzID0gZ2V0Q2xhc3NOYW1lQnlUeXBlKGRlZmF1bHRDbGFzcyk7XG4gICAgICBldmVudENsYXNzID0gZ2V0Q2xhc3NOYW1lQnlUeXBlKGV2ZW50Q2xhc3MpO1xuICAgICAgcmV0dXJuIG51bGwgPT0gZXZlbnRDbGFzc1xuICAgICAgICA/IFwiYXV0b1wiID09PSBkZWZhdWx0Q2xhc3NcbiAgICAgICAgICA/IG51bGxcbiAgICAgICAgICA6IGRlZmF1bHRDbGFzc1xuICAgICAgICA6IFwiYXV0b1wiID09PSBldmVudENsYXNzXG4gICAgICAgICAgPyBudWxsXG4gICAgICAgICAgOiBldmVudENsYXNzO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRBcnJheUtpbmQoYXJyYXkpIHtcbiAgICAgIGZvciAoXG4gICAgICAgIHZhciBraW5kID0gRU1QVFlfQVJSQVksIGkgPSAwO1xuICAgICAgICBpIDwgYXJyYXkubGVuZ3RoICYmIGkgPCBPQkpFQ1RfV0lEVEhfTElNSVQ7XG4gICAgICAgIGkrK1xuICAgICAgKSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2ldO1xuICAgICAgICBpZiAoXCJvYmplY3RcIiA9PT0gdHlwZW9mIHZhbHVlICYmIG51bGwgIT09IHZhbHVlKVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGlzQXJyYXlJbXBsKHZhbHVlKSAmJlxuICAgICAgICAgICAgMiA9PT0gdmFsdWUubGVuZ3RoICYmXG4gICAgICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2YgdmFsdWVbMF1cbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChraW5kICE9PSBFTVBUWV9BUlJBWSAmJiBraW5kICE9PSBFTlRSSUVTX0FSUkFZKVxuICAgICAgICAgICAgICByZXR1cm4gQ09NUExFWF9BUlJBWTtcbiAgICAgICAgICAgIGtpbmQgPSBFTlRSSUVTX0FSUkFZO1xuICAgICAgICAgIH0gZWxzZSByZXR1cm4gQ09NUExFWF9BUlJBWTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgdmFsdWUgfHxcbiAgICAgICAgICAgIChcInN0cmluZ1wiID09PSB0eXBlb2YgdmFsdWUgJiYgNTAgPCB2YWx1ZS
158525sZW5ndGgpIHx8XG4gICAgICAgICAgICAoa2luZCAhPT0gRU1QVFlfQVJSQVkgJiYga2luZCAhPT0gUFJJTUlUSVZFX0FSUkFZKSB8fFxuICAgICAgICAgICAgXCJiaWdpbnRcIiA9PT0gdHlwZW9mIHZhbHVlXG4gICAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuIENPTVBMRVhfQVJSQVk7XG4gICAgICAgICAga2luZCA9IFBSSU1JVElWRV9BUlJBWTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGtpbmQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFkZE9iamVjdFRvUHJvcGVydGllcyhvYmplY3QsIHByb3BlcnRpZXMsIGluZGVudCwgcHJlZml4KSB7XG4gICAgICBpZiAoIUFycmF5QnVmZmVyLmlzVmlldyhvYmplY3QpKSB7XG4gICAgICAgIHZhciBhZGRlZFByb3BlcnRpZXMgPSAwLFxuICAgICAgICAgIGtleTtcbiAgICAgICAgZm9yIChrZXkgaW4gb2JqZWN0KVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmXG4gICAgICAgICAgICBcIl9cIiAhPT0ga2V5WzBdICYmXG4gICAgICAgICAgICAoYWRkZWRQcm9wZXJ0aWVzKyssXG4gICAgICAgICAgICBhZGRWYWx1ZVRvUHJvcGVydGllcyhrZXksIG9iamVjdFtrZXldLCBwcm9wZXJ0aWVzLCBpbmRlbnQsIHByZWZpeCksXG4gICAgICAgICAgICBhZGRlZFByb3BlcnRpZXMgPj0gT0JKRUNUX1dJRFRIX0xJTUlUKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcHJvcGVydGllcy5wdXNoKFtcbiAgICAgICAgICAgICAgcHJlZml4ICtcbiAgICAgICAgICAgICAgICBcIlxcdTAwYTBcXHUwMGEwXCIucmVwZWF0KGluZGVudCkgK1xuICAgICAgICAgICAgICAgIFwiT25seSBcIiArXG4gICAgICAgICAgICAgICAgT0JKRUNUX1dJRFRIX0xJTUlUICtcbiAgICAgICAgICAgICAgICBcIiBwcm9wZXJ0aWVzIGFyZSBzaG93bi4gUmVhY3Qgd2lsbCBub3QgbG9nIG1vcmUgcHJvcGVydGllcyBvZiB0aGlzIG9iamVjdC5cIixcbiAgICAgICAgICAgICAgXCJcIlxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlYWRSZWFjdEVsZW1lbnRUeXBlb2YodmFsdWUpIHtcbiAgICAgIHJldHVybiBcIiQkdHlwZW9mXCIgaW4gdmFsdWUgJiYgaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgXCIkJHR5cGVvZlwiKVxuICAgICAgICA/IHZhbHVlLiQkdHlwZW9mXG4gICAgICAgIDogdm9pZCAwO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhZGRWYWx1ZVRvUHJvcGVydGllcyhcbiAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgcHJvcGVydGllcyxcbiAgICAgIGluZGVudCxcbiAgICAgIHByZWZpeFxuICAgICkge1xuICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgICAgIGlmIChudWxsID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgdmFsdWUgPSBcIm51bGxcIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAocmVhZFJlYWN0RWxlbWVudFR5cGVvZih2YWx1ZSkgPT09IFJFQUNUX0VMRU1FTlRfVFlQRSkge1xuICAgICAgICAgICAgICB2Y
15852XIgdHlwZU5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodmFsdWUudHlwZSkgfHwgXCJcXHUyMDI2XCIsXG4gICAgICAgICAgICAgICAga2V5ID0gdmFsdWUua2V5O1xuICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnByb3BzO1xuICAgICAgICAgICAgICB2YXIgcHJvcHNLZXlzID0gT2JqZWN0LmtleXModmFsdWUpLFxuICAgICAgICAgICAgICAgIHByb3BzTGVuZ3RoID0gcHJvcHNLZXlzLmxlbmd0aDtcbiAgICAgICAgICAgICAgaWYgKG51bGwgPT0ga2V5ICYmIDAgPT09IHByb3BzTGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBcIjxcIiArIHR5cGVOYW1lICsgXCIgLz5cIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgMyA+IGluZGVudCB8fFxuICAgICAgICAgICAgICAgICgxID09PSBwcm9wc0xlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgXCJjaGlsZHJlblwiID09PSBwcm9wc0tleXNbMF0gJiZcbiAgICAgICAgICAgICAgICAgIG51bGwgPT0ga2V5KVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IFwiPFwiICsgdHlwZU5hbWUgKyBcIiBcXHUyMDI2IC8+XCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcHJvcGVydGllcy5wdXNoKFtcbiAgICAgICAgICAgICAgICBwcmVmaXggKyBcIlxcdTAwYTBcXHUwMGEwXCIucmVwZWF0KGluZGVudCkgKyBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICAgICAgXCI8XCIgKyB0eXBlTmFtZVxuICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgbnVsbCAhPT0ga2V5ICYmXG4gICAgICAgICAgICAgICAgYWRkVmFsdWVUb1Byb3BlcnRpZXMoXG4gICAgICAgICAgICAgICAgICBcImtleVwiLFxuICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyxcbiAgICAgICAgICAgICAgICAgIGluZGVudCArIDEsXG4gICAgICAgICAgICAgICAgICBwcmVmaXhcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPSAhMTtcbiAgICAgICAgICAgICAga2V5ID0gMDtcbiAgICAgICAgICAgICAgZm9yICh2YXIgcHJvcEtleSBpbiB2YWx1ZSlcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAoa2V5KyssXG4gICAgICAgICAgICAgICAgICBcImNoaWxkcmVuXCIgPT09IHByb3BLZXlcbiAgICAgICAgICAgICAgICAgICAgPyBudWxsICE9IHZhbHVlLmNoaWxkcmVuICYmXG4gICAgICAgICAgICAgICAgICAgICAgKCFpc0FycmF5SW1wbCh2YWx1ZS5jaGlsZHJlbikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIDAgPCB2YWx1ZS5jaGlsZHJlbi5sZW5ndGgpICYmXG4gICAgICAgICAgICAgICAgICAgICAgKHByb3BlcnR5TmFtZSA9ICEwKVxuICAgICAgICAgICAgICAgICAgICA6IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIHByb3BLZXkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgXCJfXCIgIT09IHByb3BLZXlbMF0gJiZcbiAgICAgICAgICAgICAgICAgICAgICBhZGRWYWx1ZVRvUHJvcGVydGllcyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BLZXksXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVtwcm9wS2V5XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKyAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4XG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIGtleSA+PSBPQkpFQ1RfV0lEVEhfTElNSVQpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIHByb3BlcnRpZXMucHVzaChbXG4gICAgICAgICAgICAgICAgXCJcIixcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPyBcIj5cXHUyMDI2PC9cIiArIHR5cGVOYW1lICsgXCI+XCIgOiBcIi8+XCJcbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHR5cGVOYW1lID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICAgICAgICAgIHR5cGVOYW1lID0gdHlwZU5hbWUuc2xpY2UoOCwgdHlwZU5hbWUubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHZhbHVlKSkge1xuICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgICAgdmFsdWUgPVxuICAgICAgICAgICAgICAgIFwibnVtYmVyXCIgPT09IHR5cGVvZiB2YWx1ZVxuICAgICAgICAgICAgICAgICAgPyB0eXBlTmFtZSArIFwiKFwiICsgdmFsdWUgKyBcIilcIlxuICAgICAgICAgICAgICAgICAgOiB0eXBlTmFtZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXCJBcnJheVwiID09PSB0eXBlTmFtZSlcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICgocHJvcEtleSA9IHZhbHVlLmxlbmd0aCA+IE9CSkVDVF9XSURUSF9MSU1JVCksXG4gICAgICAgICAgICAgICAgKGtleSA9IGdldEFycmF5S2luZCh2YWx1ZSkpLFxuICAgICAgICAgICAgICAgIGtleSA9PT0gUFJJTUlUSVZFX0FSUkFZIHx8IGtleSA9PT0gRU1QVFlfQVJSQVkpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgICAgICBwcm9wS2V5XG4gICAgICAgICAgICAgICAgICAgID8gdmFsdWUuc2xpY2UoMCwgT0JKRUNUX1dJRFRIX0xJTUlUKS5jb25jYXQoXCJcXHUyMDI2XCIpXG4gICAgICAgICAgICAgICAgICAgIDogdmFsdWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gRU5UUklFU19BUlJBWSkge1xuICAgICAgICAgICAgICAgIHByb3BlcnRpZXMucHVzaChbXG4gICAgICAgICAgICAgICAgICBwcmVmaXggKyBcIlxcdTAwYTBcXHUwMGEwXCIucmVwZWF0KGluZGVudCkgKyBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICAgICAgICBcIlwiXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgICAgI
15852HByb3BlcnR5TmFtZSA9IDA7XG4gICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUgPCB2YWx1ZS5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSA8IE9CSkVDVF9XSURUSF9MSU1JVDtcbiAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSsrXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgKHR5cGVOYW1lID0gdmFsdWVbcHJvcGVydHlOYW1lXSksXG4gICAgICAgICAgICAgICAgICAgIGFkZFZhbHVlVG9Qcm9wZXJ0aWVzKFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGVOYW1lWzBdLFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGVOYW1lWzFdLFxuICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgICAgICAgaW5kZW50ICsgMSxcbiAgICAgICAgICAgICAgICAgICAgICBwcmVmaXhcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBwcm9wS2V5ICYmXG4gICAgICAgICAgICAgICAgICBhZGRWYWx1ZVRvUHJvcGVydGllcyhcbiAgICAgICAgICAgICAgICAgICAgT0JKRUNUX1dJRFRIX0xJTUlULnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgIFwiXFx1MjAyNlwiLFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgICAgICBpbmRlbnQgKyAxLFxuICAgICAgICAgICAgICAgICAgICBwcmVmaXhcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXCJQcm9taXNlXCIgPT09IHR5cGVOYW1lKSB7XG4gICAgICAgICAgICAgIGlmIChcImZ1bGZpbGxlZFwiID09PSB2YWx1ZS5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAoKHR5cGVOYW1lID0gcHJvcGVydGllcy5sZW5ndGgpLFxuICAgICAgICAgICAgICAgICAgYWRkVmFsdWVUb1Byb3BlcnRpZXMoXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgICAgIGluZGVudCxcbiAgICAgICAgICAgICAgICAgICAgcHJlZml4XG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5sZW5ndGggPiB0eXBlTmFtZSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzW3R5cGVOYW1lXTtcbiAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNbMV0gPVxuICAgICAgICAgICAgICAgICAgICBcIlByb21pc2U8XCIgKyAocHJvcGVydGllc1sxXSB8fCBcIk9iamVjdFwiKSArIFwiPlwiO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBcInJlamVjdGVkXCIgPT09IHZhbHVlLnN0YXR1cyAmJlxuICAgICAgICAgICAgICAgICgodHlwZU5hbWUgPSBwcm9wZXJ0aWVzLmxlbmd0aCksXG4gICAgICAgICAgICAgICAgYWRkVmFsdWVUb1Byb3BlcnRpZXMoXG4gICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICAgICAgICB2YWx1ZS5yZWFzb24sXG4gICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgICAgaW5kZW50LFxuICAgICAgICAgICAgICAgICAgcHJlZml4XG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmxlbmd0aCA+IHR5cGVOYW1lKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzID0gcHJvcGVydGllc1t0eXBlTmFtZV07XG4gICAgICAgICAgICAgICAgcHJvcGVydGllc1sxXSA9IFwiUmVqZWN0ZWQgUHJvbWlzZTxcIiArIHByb3BlcnRpZXNbMV0gKyBcIj5cIjtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcHJvcGVydGllcy5wdXNoKFtcbiAgICAgICAgICAgICAgICBcIlxcdTAwYTBcXHUwMGEwXCIucmVwZWF0KGluZGVudCkgKyBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgICAgICAgXCJQcm9taXNlXCJcbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFwiT2JqZWN0XCIgPT09IHR5cGVOYW1lICYmXG4gICAgICAgICAgICAgIChwcm9wS2V5ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSkgJiZcbiAgICAgICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgcHJvcEtleS5jb25zdHJ1Y3RvciAmJlxuICAgICAgICAgICAgICAodHlwZU5hbWUgPSBwcm9wS2V5LmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgICAgICAgICAgcHJvcGVydGllcy5wdXNoKFtcbiAgICAgICAgICAgICAgcHJlZml4ICsgXCJcXHUwMGEwXFx1MDBhMFwiLnJlcGVhdChpbmRlbnQpICsgcHJvcGVydHlOYW1lLFxuICAgICAgICAgICAgICBcIk9iamVjdFwiID09PSB0eXBlTmFtZSA/ICgzID4gaW5kZW50ID8gXCJcIiA6IFwiXFx1MjAyNlwiKSA6IHR5cGVOYW1lXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIDMgPiBpbmRlbnQgJiZcbiAgICAgICAgICAgICAgYWRkT2JqZWN0VG9Qcm9wZXJ0aWVzKHZhbHVlLCBwcm9wZXJ0aWVzLCBpbmRlbnQgKyAxLCBwcmVmaXgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSBcImZ1bmN0aW9uXCI6XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZS5uYW1lO1xuICAgICAgICAgIHZhbHVlID1cbiAgICAgICAgICAgIFwiXCIgPT09IHZhbHVlIHx8IFwic3RyaW5nXCIgIT09IHR5cGVvZiB2YWx1ZVxuICAgICAgICAgICAgICA/IFwiKCkgPT4ge31cIlxuICAgICAgICAgICAgICA6IHZhbHVlICsgXCIoKSB7fVwiO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgdmFsdWUgPVxuICAgICAgICAgICAgdmFsdWUgPT09IE9NSVRURURfUFJPUF9FUlJPUlxuICAgICAgICAgICAgICA/IFwiXFx1MjAyNlwiXG4gICAgICAgICAgICAgIDogSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgICAgICAxMDI0IDw9IHZhbHVlLmxlbmd0aCA/IHZhbHVlLnNsaWNlKDAsIDEwMjMpICsgXCJcXHUyMDI2XCIgOiB2YWx1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgICAgICB2YWx1ZSA9IFwidW5kZWZpbmVkXCI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgI
15852HZhbHVlID0gU3RyaW5nKHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHByb3BlcnRpZXMucHVzaChbXG4gICAgICAgIHByZWZpeCArIFwiXFx1MDBhMFxcdTAwYTBcIi5yZXBlYXQoaW5kZW50KSArIHByb3BlcnR5TmFtZSxcbiAgICAgICAgdmFsdWVcbiAgICAgIF0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhZGRPYmplY3REaWZmVG9Qcm9wZXJ0aWVzKHByZXYsIG5leHQsIHByb3BlcnRpZXMsIGluZGVudCkge1xuICAgICAgdmFyIGlzRGVlcGx5RXF1YWwgPSAhMCxcbiAgICAgICAgcHJldlByb3BlcnRpZXNDaGVja2VkID0gMDtcbiAgICAgIGZvciAoa2V5IGluIHByZXYpIHtcbiAgICAgICAgaWYgKHByZXZQcm9wZXJ0aWVzQ2hlY2tlZCA+IE9CSkVDVF9XSURUSF9MSU1JVCkge1xuICAgICAgICAgIHByb3BlcnRpZXMucHVzaChbXG4gICAgICAgICAgICBcIlByZXZpb3VzIG9iamVjdCBoYXMgbW9yZSB0aGFuIFwiICtcbiAgICAgICAgICAgICAgT0JKRUNUX1dJRFRIX0xJTUlUICtcbiAgICAgICAgICAgICAgXCIgcHJvcGVydGllcy4gUmVhY3Qgd2lsbCBub3QgYXR0ZW1wdCB0byBkaWZmIG9iamVjdHMgd2l0aCB0b28gbWFueSBwcm9wZXJ0aWVzLlwiLFxuICAgICAgICAgICAgXCJcIlxuICAgICAgICAgIF0pO1xuICAgICAgICAgIGlzRGVlcGx5RXF1YWwgPSAhMTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBrZXkgaW4gbmV4dCB8fFxuICAgICAgICAgIChwcm9wZXJ0aWVzLnB1c2goW1xuICAgICAgICAgICAgUkVNT1ZFRCArIFwiXFx1MDBhMFxcdTAwYTBcIi5yZXBlYXQoaW5kZW50KSArIGtleSxcbiAgICAgICAgICAgIFwiXFx1MjAyNlwiXG4gICAgICAgICAgXSksXG4gICAgICAgICAgKGlzRGVlcGx5RXF1YWwgPSAhMSkpO1xuICAgICAgICBwcmV2UHJvcGVydGllc0NoZWNrZWQrKztcbiAgICAgIH1cbiAgICAgIHByZXZQcm9wZXJ0aWVzQ2hlY2tlZCA9IDA7XG4gICAgICBmb3IgKHZhciBfa2V5IGluIG5leHQpIHtcbiAgICAgICAgaWYgKHByZXZQcm9wZXJ0aWVzQ2hlY2tlZCA+IE9CSkVDVF9XSURUSF9MSU1JVCkge1xuICAgICAgICAgIHByb3BlcnRpZXMucHVzaChbXG4gICAgICAgICAgICBcIk5leHQgb2JqZWN0IGhhcyBtb3JlIHRoYW4gXCIgK1xuICAgICAgICAgICAgICBPQkpFQ1RfV0lEVEhfTElNSVQgK1xuICAgICAgICAgICAgICBcIiBwcm9wZXJ0aWVzLiBSZWFjdCB3aWxsIG5vdCBhdHRlbXB0IHRvIGRpZmYgb2JqZWN0cyB3aXRoIHRvbyBtYW55IHByb3BlcnRpZXMuXCIsXG4gICAgICAgICAgICBcIlwiXG4gICAgICAgICAgXSk7XG4gICAgICAgICAgaXNEZWVwbHlFcXVhbCA9ICExO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfa2V5IGluIHByZXYpIHtcbiAgICAgICAgICB2Y
15852XIga2V5ID0gcHJldltfa2V5XTtcbiAgICAgICAgICB2YXIgbmV4dFZhbHVlID0gbmV4dFtfa2V5XTtcbiAgICAgICAgICBpZiAoa2V5ICE9PSBuZXh0VmFsdWUpIHtcbiAgICAgICAgICAgIGlmICgwID09PSBpbmRlbnQgJiYgXCJjaGlsZHJlblwiID09PSBfa2V5KSB7XG4gICAgICAgICAgICAgIGlzRGVlcGx5RXF1YWwgPSBcIlxcdTAwYTBcXHUwMGEwXCIucmVwZWF0KGluZGVudCkgKyBfa2V5O1xuICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnB1c2goXG4gICAgICAgICAgICAgICAgW1JFTU9WRUQgKyBpc0RlZXBseUVxdWFsLCBcIlxcdTIwMjZcIl0sXG4gICAgICAgICAgICAgICAgW0FEREVEICsgaXNEZWVwbHlFcXVhbCwgXCJcXHUyMDI2XCJdXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlzRGVlcGx5RXF1YWwgPSAhMTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoISgzIDw9IGluZGVudCkpXG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBcIm9iamVjdFwiID09PSB0eXBlb2Yga2V5ICYmXG4gICAgICAgICAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIG5leHRWYWx1ZSAmJlxuICAgICAgICAgICAgICAgIG51bGwgIT09IGtleSAmJlxuICAgICAgICAgICAgICAgIG51bGwgIT09IG5leHRWYWx1ZSAmJlxuICAgICAgICAgICAgICAgIHJlYWRSZWFjdEVsZW1lbnRUeXBlb2Yoa2V5KSA9PT1cbiAgICAgICAgICAgICAgICAgIHJlYWRSZWFjdEVsZW1lbnRUeXBlb2YobmV4dFZhbHVlKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgaWYgKHJlYWRSZWFjdEVsZW1lbnRUeXBlb2YobmV4dFZhbHVlKSA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGtleS50eXBlID09PSBuZXh0VmFsdWUudHlwZSAmJlxuICAgICAgICAgICAgICAgICAgICBrZXkua2V5ID09PSBuZXh0VmFsdWUua2V5XG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAga2V5ID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKG5leHRWYWx1ZS50eXBlKSB8fCBcIlxcdTIwMjZcIjtcbiAgICAgICAgICAgICAgICAgICAgaXNEZWVwbHlFcXVhbCA9IFwiXFx1MDBhMFxcdTAwYTBcIi5yZXBlYXQoaW5kZW50KSArIF9rZXk7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IFwiPFwiICsga2V5ICsgXCIgXFx1MjAyNiAvPlwiO1xuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgW1JFTU9WRUQgKyBpc0RlZXBseUVxdWFsLCBrZXldLFxuICAgICAgICAgICAgICAgICAgICAgIFtBRERFRCArIGlzRGVlcGx5RXF1YWwsIGtleV1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaXNEZWVwbHlFcXVhbCA9ICExO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmFyIHByZXZLaW5kID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGtleSksXG4gICAgICAgICAgICAgICAgICAgIG5leHRLaW5kID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG5leHRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHByZXZLaW5kID09PSBuZXh0S2luZCAmJlxuICAgICAgICAgICAgICAgICAgICAoXCJbb2JqZWN0IE9iamVjdF1cIiA9PT0gbmV4dEtpbmQgfHxcbiAgICAgICAgICAgICAgICAgICAgICBcIltvYmplY3QgQXJyYXldXCIgPT09IG5leHRLaW5kKVxuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXZLaW5kID0gW1xuICAgICAgICAgICAgICAgICAgICAgIFVOQ0hBTkdFRCArIFwiXFx1MDBhMFxcdTAwYTBcIi5yZXBlYXQoaW5kZW50KSArIF9rZXksXG4gICAgICAgICAgICAgICAgICAgICAgXCJbb2JqZWN0IEFycmF5XVwiID09PSBuZXh0S2luZCA/IFwiQXJyYXlcIiA6IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5wdXNoKHByZXZLaW5kKTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dEtpbmQgPSBwcm9wZXJ0aWVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgYWRkT2JqZWN0RGlmZlRvUHJvcGVydGllcyhcbiAgICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgbmV4dFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgICAgICAgaW5kZW50ICsgMVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgPyBuZXh0S2luZCA9PT0gcHJvcGVydGllcy5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIChwcmV2S2luZFsxXSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiUmVmZXJlbnRpYWxseSB1bmVxdWFsIGJ1dCBkZWVwbHkgZXF1YWwgb2JqZWN0cy4gQ29uc2lkZXIgbWVtb2l6YXRpb24uXCIpXG4gICAgICAgICAgICAgICAgICAgICAgOiAoaXNEZWVwbHlFcXVhbCA9ICExKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBrZXkgJiZcbiAgICAgICAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBuZXh0VmFsdWUgJiZcbiAgICAgICAgICAgICAgICBrZXkubmFtZSA9PT0gbmV4dFZhbHVlLm5hbWUgJiZcbiAgICAgICAgICAgICAgICBrZXkubGVuZ3RoID09PSBuZXh0VmFsdWUubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgKChwcmV2S2luZCA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGtleSkpLFxuICAgICAgICAgICAgICAgIChuZXh0S2luZCA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG5leHRWYWx1ZSkpLFxuICAgICAgICAgICAgICAgI
15852HByZXZLaW5kID09PSBuZXh0S2luZClcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAga2V5ID1cbiAgICAgICAgICAgICAgICAgIFwiXCIgPT09IG5leHRWYWx1ZS5uYW1lID8gXCIoKSA9PiB7fVwiIDogbmV4dFZhbHVlLm5hbWUgKyBcIigpIHt9XCI7XG4gICAgICAgICAgICAgICAgcHJvcGVydGllcy5wdXNoKFtcbiAgICAgICAgICAgICAgICAgIFVOQ0hBTkdFRCArIFwiXFx1MDBhMFxcdTAwYTBcIi5yZXBlYXQoaW5kZW50KSArIF9rZXksXG4gICAgICAgICAgICAgICAgICBrZXkgK1xuICAgICAgICAgICAgICAgICAgICBcIiBSZWZlcmVudGlhbGx5IHVuZXF1YWwgZnVuY3Rpb24gY2xvc3VyZS4gQ29uc2lkZXIgbWVtb2l6YXRpb24uXCJcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWRkVmFsdWVUb1Byb3BlcnRpZXMoX2tleSwga2V5LCBwcm9wZXJ0aWVzLCBpbmRlbnQsIFJFTU9WRUQpO1xuICAgICAgICAgICAgYWRkVmFsdWVUb1Byb3BlcnRpZXMoX2tleSwgbmV4dFZhbHVlLCBwcm9wZXJ0aWVzLCBpbmRlbnQsIEFEREVEKTtcbiAgICAgICAgICAgIGlzRGVlcGx5RXF1YWwgPSAhMTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgIHByb3BlcnRpZXMucHVzaChbXG4gICAgICAgICAgICBBRERFRCArIFwiXFx1MDBhMFxcdTAwYTBcIi5yZXBlYXQoaW5kZW50KSArIF9rZXksXG4gICAgICAgICAgICBcIlxcdTIwMjZcIlxuICAgICAgICAgIF0pLFxuICAgICAgICAgICAgKGlzRGVlcGx5RXF1YWwgPSAhMSk7XG4gICAgICAgIHByZXZQcm9wZXJ0aWVzQ2hlY2tlZCsrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlzRGVlcGx5RXF1YWw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNldEN1cnJlbnRUcmFja0Zyb21MYW5lcyhsYW5lcykge1xuICAgICAgY3VycmVudFRyYWNrID1cbiAgICAgICAgbGFuZXMgJiA2M1xuICAgICAgICAgID8gXCJCbG9ja2luZ1wiXG4gICAgICAgICAgOiBsYW5lcyAmIDY0XG4gICAgICAgICAgICA/IFwiR2VzdHVyZVwiXG4gICAgICAgICAgICA6IGxhbmVzICYgNDE5NDE3NlxuICAgICAgICAgICAgICA/IFwiVHJhbnNpdGlvblwiXG4gICAgICAgICAgICAgIDogbGFuZXMgJiA2MjkxNDU2MFxuICAgICAgICAgICAgICAgID8gXCJTdXNwZW5zZVwiXG4gICAgICAgICAgICAgICAgOiBsYW5lcyAmIDIwODAzNzQ3ODRcbiAgICAgICAgICAgICAgICAgID8gXCJJZGxlXCJcbiAgICAgICAgICAgICAgICAgIDogXCJPdGhlclwiO1xuICAgIH1cbiAgICBmdW5jdGlvbiBsb2dDb21wb25lbnRUcmlnZ2VyKGZpYmVyLCBzdGFydFRpbWUsIGVuZFRpbWUsIHRyaWdnZXIpIHtcbiAgICAgIHN1cHBvcnRzVXNlclRpbWluZyAmJlxuICAgICAgICAoKHJldXNhYmxlQ29tcG9uZW50T3B0aW9ucy5zdGFydCA9IHN0YXJ0VGltZSksXG4gICAgICAgIChyZXVzYWJsZUNvbXBvbmVudE9wdGlvbnMuZW5kID0gZW5kVGltZSksXG4gICAgICAgIChyZXVzYWJsZUNvbXBvbmVudERldlRvb2xEZXRhaWxzLmNvbG9yID0gXCJ3YXJuaW5nXCIpLFxuICAgICAgICAocmV1c2FibGVDb21wb25lbnREZXZUb29sRGV0YWlscy50b29sdGlwVGV4dCA9IHRyaWdnZXIpLFxuICAgICAgICAocmV1c2FibGVDb21wb25lbnREZXZUb29sRGV0YWlscy5wcm9wZXJ0aWVzID0gbnVsbCksXG4gICAgICAgIChmaWJlciA9IGZpYmVyLl9kZWJ1Z1Rhc2spXG4gICAgICAgICAgPyBmaWJlci5ydW4oXG4gICAgICAgICAgICAgIHBlcmZvcm1hbmNlLm1lYXN1cmUuYmluZChcbiAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZSxcbiAgICAgICAgICAgICAgICB0cmlnZ2VyLFxuICAgICAgICAgICAgICAgIHJldXNhYmxlQ29tcG9uZW50T3B0aW9uc1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBwZXJmb3JtYW5jZS5tZWFzdXJlKHRyaWdnZXIsIHJldXNhYmxlQ29tcG9uZW50T3B0aW9ucyksXG4gICAgICAgIHBlcmZvcm1hbmNlLmNsZWFyTWVhc3VyZXModHJpZ2dlcikpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBsb2dDb21wb25lbnRSZWFwcGVhcmVkKGZpYmVyLCBzdGFydFRpbWUsIGVuZFRpbWUpIHtcbiAgICAgIGxvZ0NvbXBvbmVudFRyaWdnZXIoZmliZXIsIHN0YXJ0VGltZSwgZW5kVGltZSwgXCJSZWNvbm5lY3RcIik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxvZ0NvbXBvbmVudFJlbmRlcihcbiAgICAgIGZpYmVyLFxuICAgICAgc3RhcnRUaW1lLFxuICAgICAgZW5kVGltZSxcbiAgICAgIHdhc0h5ZHJhdGVkLFxuICAgICAgY29tbWl0dGVkTGFuZXNcbiAgICApIHtcbiAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcik7XG4gICAgICBpZiAobnVsbCAhPT0gbmFtZSAmJiBzdXBwb3J0c1VzZXJUaW1pbmcpIHtcbiAgICAgICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZSxcbiAgICAgICAgICBzZWxmVGltZSA9IGZpYmVyLmFjdHVhbER1cmF0aW9uO1xuICAgICAgICBpZiAobnVsbCA9PT0gYWx0ZXJuYXRlIHx8IGFsdGVybmF0ZS5jaGlsZCAhPT0gZmliZXIuY2hpbGQpXG4gICAgICAgICAgZm9yICh2YXIgY2hpbGQgPSBmaWJlci5jaGlsZDsgbnVsbCAhPT0gY2hpbGQ7IGNoaWxkID0gY2hpbGQuc2libGluZylcbiAgICAgICAgICAgIHNlbGZUaW1lIC09IGNoaWxkLmFjdHVhbER1cmF0aW9uO1xuICAgICAgICBzZWxmVGltZSA9XG4gICAgICAgICAgMC41ID4gc2VsZlRpbWVcbiAgICAgICAgICAgID8gd2FzSHlkcmF0ZWRcbiAgICAgICAgICAgICAgPyBcInRlcnRpYXJ5LWxpZ2h0XCJcbiAgICAgICAgICAgICAgOiBcInByaW1hcnktbGlnaHRcIlxuICAgICAgICAgICAgOiAxMCA+IHNlbGZUaW1lXG4gICAgICAgICAgICAgID8gd2FzSHlkcmF0ZWRcbiAgICAgICAgICAgICAgICA/IFwidGVydGlhcnlcIlxuICAgICAgICAgICAgICAgIDogXCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgOiAxMDAgPiBzZWxmVGltZVxuICAgICAgICAgICAgICAgID8gd2FzSHlkcmF0ZWRcbiAgICAgICAgICAgICAgICAgID8gXCJ0ZXJ0aWFyeS1kYXJrXCJcbiAgICAgICAgICAgICAgICAgIDogXCJwcmltYXJ5LWRhcmtcIlxuICAgICAgICAgICAgICAgIDogXCJlcnJvclwiO1xuICAgICAgICB2Y
15852XIgcHJvcHMgPSBmaWJlci5tZW1vaXplZFByb3BzO1xuICAgICAgICB3YXNIeWRyYXRlZCA9IGZpYmVyLl9kZWJ1Z1Rhc2s7XG4gICAgICAgIG51bGwgIT09IHByb3BzICYmXG4gICAgICAgIG51bGwgIT09IGFsdGVybmF0ZSAmJlxuICAgICAgICBhbHRlcm5hdGUubWVtb2l6ZWRQcm9wcyAhPT0gcHJvcHNcbiAgICAgICAgICA/ICgoY2hpbGQgPSBbcmV1c2FibGVDaGFuZ2VkUHJvcHNFbnRyeV0pLFxuICAgICAgICAgICAgKHByb3BzID0gYWRkT2JqZWN0RGlmZlRvUHJvcGVydGllcyhcbiAgICAgICAgICAgICAgYWx0ZXJuYXRlLm1lbW9pemVkUHJvcHMsXG4gICAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgICBjaGlsZCxcbiAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAxIDwgY2hpbGQubGVuZ3RoXG4gICAgICAgICAgICAgID8gKHByb3BzICYmXG4gICAgICAgICAgICAgICAgIWFscmVhZHlXYXJuZWRGb3JEZWVwRXF1YWxpdHkgJiZcbiAgICAgICAgICAgICAgICAwID09PSAoYWx0ZXJuYXRlLmxhbmVzICYgY29tbWl0dGVkTGFuZXMpICYmXG4gICAgICAgICAgICAgICAgMTAwIDwgZmliZXIuYWN0dWFsRHVyYXRpb25cbiAgICAgICAgICAgICAgICAgID8gKChhbHJlYWR5V2FybmVkRm9yRGVlcEVxdWFsaXR5ID0gITApLFxuICAgICAgICAgICAgICAgICAgICAoY2hpbGRbMF0gPSByZXVzYWJsZURlZXBseUVxdWFsUHJvcHNFbnRyeSksXG4gICAgICAgICAgICAgICAgICAgIChyZXVzYWJsZUNvbXBvbmVudERldlRvb2xEZXRhaWxzLmNvbG9yID0gXCJ3YXJuaW5nXCIpLFxuICAgICAgICAgICAgICAgICAgICAocmV1c2FibGVDb21wb25lbnREZXZUb29sRGV0YWlscy50b29sdGlwVGV4dCA9XG4gICAgICAgICAgICAgICAgICAgICAgREVFUF9FUVVBTElUWV9XQVJOSU5HKSlcbiAgICAgICAgICAgICAgICAgIDogKChyZXVzYWJsZUNvbXBvbmVudERldlRvb2xEZXRhaWxzLmNvbG9yID0gc2VsZlRpbWUpLFxuICAgICAgICAgICAgICAgICAgICAocmV1c2FibGVDb21wb25lbnREZXZUb29sRGV0YWlscy50b29sdGlwVGV4dCA9IG5hbWUpKSxcbiAgICAgICAgICAgICAgICAocmV1c2FibGVDb21wb25lbnREZXZUb29sRGV0YWlscy5wcm9wZXJ0aWVzID0gY2hpbGQpLFxuICAgICAgICAgICAgICAgIChyZXVzYWJsZUNvbXBvbmVudE9wdGlvbnMuc3RhcnQgPSBzdGFydFRpbWUpLFxuICAgICAgICAgICAgICAgIChyZXVzYWJsZUNvbXBvbmVudE9wdGlvbnMuZW5kID0gZW5kVGltZSksXG4gICAgICAgICAgICAgICAgKGZpYmVyID0gXCJcXHUyMDBiXCIgKyBuYW1lKSxcbiAgICAgICAgICAgICAgICBudWxsICE9IHdhc0h5ZHJhdGVkXG4gICAgICAgICAgICAgICAgICA/IHdhc0h5ZHJhdGVkLnJ1bihcbiAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZS5tZWFzdXJlLmJpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV1c2FibGVDb21wb25lbnRPcHRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICA6IHBlcmZvcm1hbmNlLm1lYXN1cmUoZmliZXIsIHJldXNhYmxlQ29tcG9uZW50T3B0aW9ucyksXG4gICAgICAgICAgICAgICAgcGVyZm9ybWFuY2UuY2xlYXJNZWFzdXJlcyhmaWJlcikpXG4gICAgICAgICAgICAgIDogbnVsbCAhPSB3YXNIeWRyYXRlZFxuICAgICAgICAgICAgICAgID8gd2FzSHlkcmF0ZWQucnVuKFxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLnRpbWVTdGFtcC5iaW5kKFxuICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUsXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgICAgICAgZW5kVGltZSxcbiAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRTX1RSQUNLLFxuICAgICAgICAgICAgICAgICAgICAgIHZvaWQgMCxcbiAgICAgICAgICAgICAgICAgICAgICBzZWxmVGltZVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiBjb25zb2xlLnRpbWVTdGFtcChcbiAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgICBlbmRUaW1lLFxuICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRTX1RSQUNLLFxuICAgICAgICAgICAgICAgICAgICB2b2lkIDAsXG4gICAgICAgICAgICAgICAgICAgIHNlbGZUaW1lXG4gICAgICAgICAgICAgICAgICApKVxuICAgICAgICAgIDogbnVsbCAhPSB3YXNIeWRyYXRlZFxuICAgICAgICAgICAgPyB3YXNIeWRyYXRlZC5ydW4oXG4gICAgICAgICAgICAgICAgY29uc29sZS50aW1lU3RhbXAuYmluZChcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUsXG4gICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgZW5kVGltZSxcbiAgICAgICAgICAgICAgICAgIENPTVBPTkVOVFNfVFJBQ0ssXG4gICAgICAgICAgICAgICAgICB2b2lkIDAsXG4gICAgICAgICAgICAgICAgICBzZWxmVGltZVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiBjb25zb2xlLnRpbWVTdGFtcChcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICBlbmRUaW1lLFxuICAgICAgICAgICAgICAgIENPTVBPTkVOVFNfVFJBQ0ssXG4gICAgICAgICAgICAgICAgdm9pZCAwLFxuICAgICAgICAgICAgICAgIHNlbGZUaW1lXG4gICAgICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxvZ0NvbXBvbmVudEVycm9yZWQoZmliZXIsIHN0YXJ0VGltZSwgZW5kVGltZSwgZXJyb3JzKSB7XG4gICAgICBpZiAoc3VwcG9ydHNVc2VyVGltaW5nKSB7XG4gICAgICAgIHZhciBuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcik7XG4gICAgICAgIGlmIChudWxsICE9PSBuYW1lKSB7XG4gICAgICAgICAgZm9yIChcbiAgICAgICAgICAgI
15852HZhciBkZWJ1Z1Rhc2sgPSBudWxsLCBwcm9wZXJ0aWVzID0gW10sIGkgPSAwO1xuICAgICAgICAgICAgaSA8IGVycm9ycy5sZW5ndGg7XG4gICAgICAgICAgICBpKytcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHZhciBjYXB0dXJlZFZhbHVlID0gZXJyb3JzW2ldO1xuICAgICAgICAgICAgbnVsbCA9PSBkZWJ1Z1Rhc2sgJiZcbiAgICAgICAgICAgICAgbnVsbCAhPT0gY2FwdHVyZWRWYWx1ZS5zb3VyY2UgJiZcbiAgICAgICAgICAgICAgKGRlYnVnVGFzayA9IGNhcHR1cmVkVmFsdWUuc291cmNlLl9kZWJ1Z1Rhc2spO1xuICAgICAgICAgICAgY2FwdHVyZWRWYWx1ZSA9IGNhcHR1cmVkVmFsdWUudmFsdWU7XG4gICAgICAgICAgICBwcm9wZXJ0aWVzLnB1c2goW1xuICAgICAgICAgICAgICBcIkVycm9yXCIsXG4gICAgICAgICAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiBjYXB0dXJlZFZhbHVlICYmXG4gICAgICAgICAgICAgIG51bGwgIT09IGNhcHR1cmVkVmFsdWUgJiZcbiAgICAgICAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIGNhcHR1cmVkVmFsdWUubWVzc2FnZVxuICAgICAgICAgICAgICAgID8gU3RyaW5nKGNhcHR1cmVkVmFsdWUubWVzc2FnZSlcbiAgICAgICAgICAgICAgICA6IFN0cmluZyhjYXB0dXJlZFZhbHVlKVxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG51bGwgIT09IGZpYmVyLmtleSAmJlxuICAgICAgICAgICAgYWRkVmFsdWVUb1Byb3BlcnRpZXMoXCJrZXlcIiwgZmliZXIua2V5LCBwcm9wZXJ0aWVzLCAwLCBcIlwiKTtcbiAgICAgICAgICBudWxsICE9PSBmaWJlci5tZW1vaXplZFByb3BzICYmXG4gICAgICAgICAgICBhZGRPYmplY3RUb1Byb3BlcnRpZXMoZmliZXIubWVtb2l6ZWRQcm9wcywgcHJvcGVydGllcywgMCwgXCJcIik7XG4gICAgICAgICAgbnVsbCA9PSBkZWJ1Z1Rhc2sgJiYgKGRlYnVnVGFzayA9IGZpYmVyLl9kZWJ1Z1Rhc2spO1xuICAgICAgICAgIGZpYmVyID0ge1xuICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0VGltZSxcbiAgICAgICAgICAgIGVuZDogZW5kVGltZSxcbiAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICBkZXZ0b29sczoge1xuICAgICAgICAgICAgICAgIGNvbG9yOiBcImVycm9yXCIsXG4gICAgICAgICAgICAgICAgdHJhY2s6IENPTVBPTkVOVFNfVFJBQ0ssXG4gICAgICAgICAgICAgICAgdG9vbHRpcFRleHQ6XG4gICAgICAgICAgICAgICAgICAxMyA9PT0gZmliZXIudGFnXG4gICAgICAgICAgICAgICAgICAgID8gXCJIeWRyYXRpb24gZmFpbGVkXCJcbiAgICAgICAgICAgICAgICAgICAgOiBcIkVycm9yIGJvdW5kYXJ5IGNhdWdodCBhbiBlcnJvclwiLFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IHByb3BlcnRpZXNcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgbmFtZSA9IFwiXFx1MjAwYlwiICsgbmFtZTtcbiAgICAgICAgICBkZWJ1Z1Rhc2tcbiAgICAgICAgICAgID8gZGVidWdUYXNrLnJ1bihwZXJmb3JtYW5jZS5tZWFzdXJlLmJpbmQocGVyZm9ybWFuY2UsIG5hbWUsIGZpYmVyKSlcbiAgICAgICAgICAgIDogcGVyZm9ybWFuY2UubWVhc3VyZShuYW1lLCBmaWJlcik7XG4gICAgICAgICAgcGVyZm9ybWFuY2UuY2xlYXJNZWFzdXJlcyhuYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBsb2dDb21wb25lbnRFZmZlY3QoZmliZXIsIHN0YXJ0VGltZSwgZW5kVGltZSwgc2VsZlRpbWUsIGVycm9ycykge1xuICAgICAgaWYgKG51bGwgIT09IGVycm9ycykge1xuICAgICAgICBpZiAoc3VwcG9ydHNVc2VyVGltaW5nKSB7XG4gICAgICAgICAgdmFyIG5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKTtcbiAgICAgICAgICBpZiAobnVsbCAhPT0gbmFtZSkge1xuICAgICAgICAgICAgc2VsZlRpbWUgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXJyb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgIHZhciBlcnJvciA9IGVycm9yc1tpXS52YWx1ZTtcbiAgICAgICAgICAgICAgc2VsZlRpbWUucHVzaChbXG4gICAgICAgICAgICAgICAgXCJFcnJvclwiLFxuICAgICAgICAgICAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiBlcnJvciAmJlxuICAgICAgICAgICAgICAgIG51bGwgIT09IGVycm9yICYmXG4gICAgICAgICAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIGVycm9yLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgID8gU3RyaW5nKGVycm9yLm1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgICA6IFN0cmluZyhlcnJvcilcbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBudWxsICE9PSBmaWJlci5rZXkgJiZcbiAgICAgICAgICAgICAgYWRkVmFsdWVUb1Byb3BlcnRpZXMoXCJrZXlcIiwgZmliZXIua2V5LCBzZWxmVGltZSwgMCwgXCJcIik7XG4gICAgICAgICAgICBudWxsICE9PSBmaWJlci5tZW1vaXplZFByb3BzICYmXG4gICAgICAgICAgICAgIGFkZE9iamVjdFRvUHJvcGVydGllcyhmaWJlci5tZW1vaXplZFByb3BzLCBzZWxmVGltZSwgMCwgXCJcIik7XG4gICAgICAgICAgICBzdGFydFRpbWUgPSB7XG4gICAgICAgICAgICAgIHN0YXJ0OiBzdGFydFRpbWUsXG4gICAgICAgICAgICAgIGVuZDogZW5kVGltZSxcbiAgICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgZGV2dG9vbHM6IHtcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiBcImVycm9yXCIsXG4gICAgICAgICAgICAgICAgICB0cmFjazogQ09NUE9ORU5UU19UUkFDSyxcbiAgICAgICAgICAgICAgICAgIHRvb2x0aXBUZXh0OiBcIkEgbGlmZWN5Y2xlIG9yIGVmZmVjdCBlcnJvcmVkXCIsXG4gICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBzZWxmVGltZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGZpYmVyID0gZmliZXIuX2RlYnVnVGFzaztcbiAgICAgICAgICAgIGVuZFRpbWUgPSBcIlxcdTIwMGJcIiArIG5hbWU7XG4gICAgICAgICAgICBmaWJlclxuICAgICAgICAgICAgICA/IGZpYmVyLnJ1bihcbiAgICAgICAgICAgICAgICAgI
15852HBlcmZvcm1hbmNlLm1lYXN1cmUuYmluZChwZXJmb3JtYW5jZSwgZW5kVGltZSwgc3RhcnRUaW1lKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBwZXJmb3JtYW5jZS5tZWFzdXJlKGVuZFRpbWUsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICBwZXJmb3JtYW5jZS5jbGVhck1lYXN1cmVzKGVuZFRpbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlXG4gICAgICAgIChuYW1lID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikpLFxuICAgICAgICAgIG51bGwgIT09IG5hbWUgJiZcbiAgICAgICAgICAgIHN1cHBvcnRzVXNlclRpbWluZyAmJlxuICAgICAgICAgICAgKChlcnJvcnMgPVxuICAgICAgICAgICAgICAxID4gc2VsZlRpbWVcbiAgICAgICAgICAgICAgICA/IFwic2Vjb25kYXJ5LWxpZ2h0XCJcbiAgICAgICAgICAgICAgICA6IDEwMCA+IHNlbGZUaW1lXG4gICAgICAgICAgICAgICAgICA/IFwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICAgIDogNTAwID4gc2VsZlRpbWVcbiAgICAgICAgICAgICAgICAgICAgPyBcInNlY29uZGFyeS1kYXJrXCJcbiAgICAgICAgICAgICAgICAgICAgOiBcImVycm9yXCIpLFxuICAgICAgICAgICAgKGZpYmVyID0gZmliZXIuX2RlYnVnVGFzaylcbiAgICAgICAgICAgICAgPyBmaWJlci5ydW4oXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLnRpbWVTdGFtcC5iaW5kKFxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLFxuICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgICAgIGVuZFRpbWUsXG4gICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVFNfVFJBQ0ssXG4gICAgICAgICAgICAgICAgICAgIHZvaWQgMCxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICA6IGNvbnNvbGUudGltZVN0YW1wKFxuICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICAgIGVuZFRpbWUsXG4gICAgICAgICAgICAgICAgICBDT01QT05FTlRTX1RSQUNLLFxuICAgICAgICAgICAgICAgICAgdm9pZCAwLFxuICAgICAgICAgICAgICAgICAgZXJyb3JzXG4gICAgICAgICAgICAgICAgKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxvZ1N1c3BlbmRlZFJlbmRlclBoYXNlKHN0YXJ0VGltZSwgZW5kVGltZSwgbGFuZXMsIGRlYnVnVGFzaykge1xuICAgICAgIXN1cHBvcnRzVXNlclRpbWluZyB8fFxuICAgICAgICBlbmRUaW1lIDw9IHN0YXJ0VGltZSB8fFxuICAgICAgICAoKGxhbmVzID1cbiAgICAgICAgICAobGFuZXMgJiA3MzgxOTc2NTMpID09PSBsYW5lcyA/IFwidGVydGlhcnktZGFya1wiIDogXCJwcmltYXJ5LWRhcmtcIiksXG4gICAgICAgIGRlYnVnVGFza1xuICAgICAgICAgID8gZGVidWdUYXNrLnJ1bihcbiAgICAgICAgICAgICAgY29uc29sZS50aW1lU3RhbXAuYmluZChcbiAgICAgICAgICAgICAgICBjb25zb2xlLFxuICAgICAgICAgICAgICAgIFwiUHJld2FybVwiLFxuICAgICAgICAgICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICBlbmRUaW1lLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFjayxcbiAgICAgICAgICAgICAgICBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICAgICAgICBsYW5lc1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBjb25zb2xlLnRpbWVTdGFtcChcbiAgICAgICAgICAgICAgXCJQcmV3YXJtXCIsXG4gICAgICAgICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgZW5kVGltZSxcbiAgICAgICAgICAgICAgY3VycmVudFRyYWNrLFxuICAgICAgICAgICAgICBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICAgICAgbGFuZXNcbiAgICAgICAgICAgICkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBsb2dTdXNwZW5kZWRXaXRoRGVsYXlQaGFzZShzdGFydFRpbWUsIGVuZFRpbWUsIGxhbmVzLCBkZWJ1Z1Rhc2spIHtcbiAgICAgICFzdXBwb3J0c1VzZXJUaW1pbmcgfHxcbiAgICAgICAgZW5kVGltZSA8PSBzdGFydFRpbWUgfHxcbiAgICAgICAgKChsYW5lcyA9XG4gICAgICAgICAgKGxhbmVzICYgNzM4MTk3NjUzKSA9PT0gbGFuZXMgPyBcInRlcnRpYXJ5LWRhcmtcIiA6IFwicHJpbWFyeS1kYXJrXCIpLFxuICAgICAgICBkZWJ1Z1Rhc2tcbiAgICAgICAgICA/IGRlYnVnVGFzay5ydW4oXG4gICAgICAgICAgICAgIGNvbnNvbGUudGltZVN0YW1wLmJpbmQoXG4gICAgICAgICAgICAgICAgY29uc29sZSxcbiAgICAgICAgICAgICAgICBcIlN1c3BlbmRlZFwiLFxuICAgICAgICAgICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICBlbmRUaW1lLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFjayxcbiAgICAgICAgICAgICAgICBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICAgICAgICBsYW5lc1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBjb25zb2xlLnRpbWVTdGFtcChcbiAgICAgICAgICAgICAgXCJTdXNwZW5kZWRcIixcbiAgICAgICAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICAgICAgICBlbmRUaW1lLFxuICAgICAgICAgICAgICBjdXJyZW50VHJhY2ssXG4gICAgICAgICAgICAgIExBTkVTX1RSQUNLX0dST1VQLFxuICAgICAgICAgICAgICBsYW5lc1xuICAgICAgICAgICAgKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxvZ0Vycm9yZWRSZW5kZXJQaGFzZShzdGFydFRpbWUsIGVuZFRpbWUsIGxhbmVzLCBkZWJ1Z1Rhc2spIHtcbiAgICAgICFzdXBwb3J0c1VzZXJUaW1pbmcgfHxcbiAgICAgICAgZW5kVGltZSA8PSBzdGFydFRpbWUgfHxcbiAgICAgICAgKGRlYnVnVGFza1xuICAgICAgICAgID8gZGVidWdUYXNrLnJ1bihcbiAgICAgICAgICAgICAgY29uc29sZS50aW1lU3RhbXAuYmluZChcbiAgICAgICAgICAgICAgICBjb25zb2xlLFxuICAgICAgICAgICAgICAgIFwiRXJyb3JlZFwiLFxuICAgICAgICAgICAgICAgI
15852HN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICBlbmRUaW1lLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFjayxcbiAgICAgICAgICAgICAgICBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICAgICAgICBcImVycm9yXCJcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogY29uc29sZS50aW1lU3RhbXAoXG4gICAgICAgICAgICAgIFwiRXJyb3JlZFwiLFxuICAgICAgICAgICAgICBzdGFydFRpbWUsXG4gICAgICAgICAgICAgIGVuZFRpbWUsXG4gICAgICAgICAgICAgIGN1cnJlbnRUcmFjayxcbiAgICAgICAgICAgICAgTEFORVNfVFJBQ0tfR1JPVVAsXG4gICAgICAgICAgICAgIFwiZXJyb3JcIlxuICAgICAgICAgICAgKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxvZ1N1c3BlbmRlZENvbW1pdFBoYXNlKHN0YXJ0VGltZSwgZW5kVGltZSwgcmVhc29uLCBkZWJ1Z1Rhc2spIHtcbiAgICAgICFzdXBwb3J0c1VzZXJUaW1pbmcgfHxcbiAgICAgICAgZW5kVGltZSA8PSBzdGFydFRpbWUgfHxcbiAgICAgICAgKGRlYnVnVGFza1xuICAgICAgICAgID8gZGVidWdUYXNrLnJ1bihcbiAgICAgICAgICAgICAgY29uc29sZS50aW1lU3RhbXAuYmluZChcbiAgICAgICAgICAgICAgICBjb25zb2xlLFxuICAgICAgICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgICAgICAgICBzdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgZW5kVGltZSxcbiAgICAgICAgICAgICAgICBjdXJyZW50VHJhY2ssXG4gICAgICAgICAgICAgICAgTEFORVNfVFJBQ0tfR1JPVVAsXG4gICAgICAgICAgICAgICAgXCJzZWNvbmRhcnktbGlnaHRcIlxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBjb25zb2xlLnRpbWVTdGFtcChcbiAgICAgICAgICAgICAgcmVhc29uLFxuICAgICAgICAgICAgICBzdGFydFRpbWUsXG4gICAgICAgICAgICAgIGVuZFRpbWUsXG4gICAgICAgICAgICAgIGN1cnJlbnRUcmFjayxcbiAgICAgICAgICAgICAgTEFORVNfVFJBQ0tfR1JPVVAsXG4gICAgICAgICAgICAgIFwic2Vjb25kYXJ5LWxpZ2h0XCJcbiAgICAgICAgICAgICkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBsb2dDb21taXRFcnJvcmVkKHN0YXJ0VGltZSwgZW5kVGltZSwgZXJyb3JzLCBwYXNzaXZlLCBkZWJ1Z1Rhc2spIHtcbiAgICAgIGlmIChzdXBwb3J0c1VzZXJUaW1pbmcgJiYgIShlbmRUaW1lIDw9IHN0YXJ0VGltZSkpIHtcbiAgICAgICAgZm9yICh2YXIgcHJvcGVydGllcyA9IFtdLCBpID0gMDsgaSA8IGVycm9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBlcnJvciA9IGVycm9yc1tpXS52YWx1ZTtcbiAgICAgICAgICBwcm9wZXJ0aWVzLnB1c2goW1xuICAgICAgICAgICAgXCJFcnJvclwiLFxuICAgICAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIGVycm9yICYmXG4gICAgICAgICAgICBudWxsICE9PSBlcnJvciAmJlxuICAgICAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIGVycm9yLm1lc3NhZ2VcbiAgICAgICAgICAgICAgPyBTdHJpbmcoZXJyb3IubWVzc2FnZSlcbiAgICAgICAgICAgICAgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhcnRUaW1lID0ge1xuICAgICAgICAgIHN0YXJ0OiBzdGFydFRpbWUsXG4gICAgICAgICAgZW5kOiBlbmRUaW1lLFxuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgZGV2dG9vbHM6IHtcbiAgICAgICAgICAgICAgY29sb3I6IFwiZXJyb3JcIixcbiAgICAgICAgICAgICAgdHJhY2s6IGN1cnJlbnRUcmFjayxcbiAgICAgICAgICAgICAgdHJhY2tHcm91cDogTEFORVNfVFJBQ0tfR1JPVVAsXG4gICAgICAgICAgICAgIHRvb2x0aXBUZXh0OiBwYXNzaXZlXG4gICAgICAgICAgICAgICAgPyBcIlJlbWFpbmluZyBFZmZlY3RzIEVycm9yZWRcIlxuICAgICAgICAgICAgICAgIDogXCJDb21taXQgRXJyb3JlZFwiLFxuICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBkZWJ1Z1Rhc2tcbiAgICAgICAgICA/IGRlYnVnVGFzay5ydW4oXG4gICAgICAgICAgICAgIHBlcmZvcm1hbmNlLm1lYXN1cmUuYmluZChwZXJmb3JtYW5jZSwgXCJFcnJvcmVkXCIsIHN0YXJ0VGltZSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IHBlcmZvcm1hbmNlLm1lYXN1cmUoXCJFcnJvcmVkXCIsIHN0YXJ0VGltZSk7XG4gICAgICAgIHBlcmZvcm1hbmNlLmNsZWFyTWVhc3VyZXMoXCJFcnJvcmVkXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBsb2dDb21taXRQaGFzZShcbiAgICAgIHN0YXJ0VGltZSxcbiAgICAgIGVuZFRpbWUsXG4gICAgICBlcnJvcnMsXG4gICAgICBhYm9ydGVkVmlld1RyYW5zaXRpb24sXG4gICAgICBkZWJ1Z1Rhc2tcbiAgICApIHtcbiAgICAgIG51bGwgIT09IGVycm9yc1xuICAgICAgICA/IGxvZ0NvbW1pdEVycm9yZWQoc3RhcnRUaW1lLCBlbmRUaW1lLCBlcnJvcnMsICExLCBkZWJ1Z1Rhc2spXG4gICAgICAgIDogIXN1cHBvcnRzVXNlclRpbWluZyB8fFxuICAgICAgICAgIGVuZFRpbWUgPD0gc3RhcnRUaW1lIHx8XG4gICAgICAgICAgKGRlYnVnVGFza1xuICAgICAgICAgICAgPyBkZWJ1Z1Rhc2sucnVuKFxuICAgICAgICAgICAgICAgIGNvbnNvbGUudGltZVN0YW1wLmJpbmQoXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLFxuICAgICAgICAgICAgICAgICAgYWJvcnRlZFZpZXdUcmFuc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgID8gXCJDb21taXQgSW50ZXJydXB0ZWQgVmlldyBUcmFuc2l0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgOiBcIkNvbW1pdFwiLFxuICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgZW5kVGltZSxcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFjayxcbiAgICAgICAgICAgICAgICAgIExBTkVTX1RSQUNLX0dST1VQLFxuICAgICAgICAgICAgICAgICAgYWJvcnRlZFZpZXdUcmFuc2l0aW9uID8gXCJlcnJvclwiIDogXCJzZWNvbmRhcnktZGFya1wiXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IGNvbnNvbGUudGltZVN0YW1wKFxuICAgICAgICAgICAgICAgIGFib3J0ZWRWaWV3VHJhbnNpdGlvblxuICAgICAgICAgICAgICAgICAgPyBcIkNvbW1pdCBJbnRlcnJ1cHRlZCBWaWV3IFRyYW5zaXRpb25cIlxuICAgICAgICAgICAgICAgICAgOiBcIkNvbW1pdFwiLFxuICAgICAgICAgICAgICAgI
15852HN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICBlbmRUaW1lLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFjayxcbiAgICAgICAgICAgICAgICBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICAgICAgICBhYm9ydGVkVmlld1RyYW5zaXRpb24gPyBcImVycm9yXCIgOiBcInNlY29uZGFyeS1kYXJrXCJcbiAgICAgICAgICAgICAgKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxvZ0FuaW1hdGluZ1BoYXNlKHN0YXJ0VGltZSwgZW5kVGltZSwgZGVidWdUYXNrKSB7XG4gICAgICAhc3VwcG9ydHNVc2VyVGltaW5nIHx8XG4gICAgICAgIGVuZFRpbWUgPD0gc3RhcnRUaW1lIHx8XG4gICAgICAgIChkZWJ1Z1Rhc2tcbiAgICAgICAgICA/IGRlYnVnVGFzay5ydW4oXG4gICAgICAgICAgICAgIGNvbnNvbGUudGltZVN0YW1wLmJpbmQoXG4gICAgICAgICAgICAgICAgY29uc29sZSxcbiAgICAgICAgICAgICAgICBcIkFuaW1hdGluZ1wiLFxuICAgICAgICAgICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICBlbmRUaW1lLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFjayxcbiAgICAgICAgICAgICAgICBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICAgICAgICBcInNlY29uZGFyeS1kYXJrXCJcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogY29uc29sZS50aW1lU3RhbXAoXG4gICAgICAgICAgICAgIFwiQW5pbWF0aW5nXCIsXG4gICAgICAgICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgZW5kVGltZSxcbiAgICAgICAgICAgICAgY3VycmVudFRyYWNrLFxuICAgICAgICAgICAgICBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICAgICAgXCJzZWNvbmRhcnktZGFya1wiXG4gICAgICAgICAgICApKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZmluaXNoUXVldWVpbmdDb25jdXJyZW50VXBkYXRlcygpIHtcbiAgICAgIGZvciAoXG4gICAgICAgIHZhciBlbmRJbmRleCA9IGNvbmN1cnJlbnRRdWV1ZXNJbmRleCxcbiAgICAgICAgICBpID0gKGNvbmN1cnJlbnRseVVwZGF0ZWRMYW5lcyA9IGNvbmN1cnJlbnRRdWV1ZXNJbmRleCA9IDApO1xuICAgICAgICBpIDwgZW5kSW5kZXg7XG5cbiAgICAgICkge1xuICAgICAgICB2Y
15852XIgZmliZXIgPSBjb25jdXJyZW50UXVldWVzW2ldO1xuICAgICAgICBjb25jdXJyZW50UXVldWVzW2krK10gPSBudWxsO1xuICAgICAgICB2YXIgcXVldWUgPSBjb25jdXJyZW50UXVldWVzW2ldO1xuICAgICAgICBjb25jdXJyZW50UXVldWVzW2krK10gPSBudWxsO1xuICAgICAgICB2YXIgdXBkYXRlID0gY29uY3VycmVudFF1ZXVlc1tpXTtcbiAgICAgICAgY29uY3VycmVudFF1ZXVlc1tpKytdID0gbnVsbDtcbiAgICAgICAgdmFyIGxhbmUgPSBjb25jdXJyZW50UXVldWVzW2ldO1xuICAgICAgICBjb25jdXJyZW50UXVldWVzW2krK10gPSBudWxsO1xuICAgICAgICBpZiAobnVsbCAhPT0gcXVldWUgJiYgbnVsbCAhPT0gdXBkYXRlKSB7XG4gICAgICAgICAgdmFyIHBlbmRpbmcgPSBxdWV1ZS5wZW5kaW5nO1xuICAgICAgICAgIG51bGwgPT09IHBlbmRpbmdcbiAgICAgICAgICAgID8gKHVwZGF0ZS5uZXh0ID0gdXBkYXRlKVxuICAgICAgICAgICAgOiAoKHVwZGF0ZS5uZXh0ID0gcGVuZGluZy5uZXh0KSwgKHBlbmRpbmcubmV4dCA9IHVwZGF0ZSkpO1xuICAgICAgICAgIHF1ZXVlLnBlbmRpbmcgPSB1cGRhdGU7XG4gICAgICAgIH1cbiAgICAgICAgMCAhPT0gbGFuZSAmJiBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChmaWJlciwgdXBkYXRlLCBsYW5lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZW5xdWV1ZVVwZGF0ZSQxKGZpYmVyLCBxdWV1ZSwgdXBkYXRlLCBsYW5lKSB7XG4gICAgICBjb25jdXJyZW50UXVldWVzW2NvbmN1cnJlbnRRdWV1ZXNJbmRleCsrXSA9IGZpYmVyO1xuICAgICAgY29uY3VycmVudFF1ZXVlc1tjb25jdXJyZW50UXVldWVzSW5kZXgrK10gPSBxdWV1ZTtcbiAgICAgIGNvbmN1cnJlbnRRdWV1ZXNbY29uY3VycmVudFF1ZXVlc0luZGV4KytdID0gdXBkYXRlO1xuICAgICAgY29uY3VycmVudFF1ZXVlc1tjb25jdXJyZW50UXVldWVzSW5kZXgrK10gPSBsYW5lO1xuICAgICAgY29uY3VycmVudGx5VXBkYXRlZExhbmVzIHw9IGxhbmU7XG4gICAgICBmaWJlci5sYW5lcyB8PSBsYW5lO1xuICAgICAgZmliZXIgPSBmaWJlci5hbHRlcm5hdGU7XG4gICAgICBudWxsICE9PSBmaWJlciAmJiAoZmliZXIubGFuZXMgfD0gbGFuZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGVucXVldWVDb25jdXJyZW50SG9va1VwZGF0ZShmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSkge1xuICAgICAgZW5xdWV1ZVVwZGF0ZSQxKGZpYmVyLCBxdWV1ZSwgdXBkYXRlLCBsYW5lKTtcbiAgICAgIHJldHVybiBnZXRSb290Rm9yVXBkYXRlZEZpYmVyKGZpYmVyKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBsYW5lKSB7XG4gICAgICBlbnF1ZXVlVXBkYXRlJDEoZmliZXIsIG51bGwsIG51bGwsIGxhbmUpO1xuICAgICAgcmV0dXJuIGdldFJvb3RGb3JVcGRhdGVkRmliZXIoZmliZXIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtYXJrVXBkYXRlTGFuZUZyb21GaWJlclRvUm9vdChzb3VyY2VGaWJlciwgdXBkYXRlLCBsYW5lKSB7XG4gICAgICBzb3VyY2VGaWJlci5sYW5lcyB8PSBsYW5lO1xuICAgICAgdmFyIGFsdGVybmF0ZSA9IHNvdXJjZUZpYmVyLmFsdGVybmF0ZTtcbiAgICAgIG51bGwgIT09IGFsdGVybmF0ZSAmJiAoYWx0ZXJuYXRlLmxhbmVzIHw9IGxhbmUpO1xuICAgICAgZm9yICh2YXIgaXNIaWRkZW4gPSAhMSwgcGFyZW50ID0gc291cmNlRmliZXIucmV0dXJuOyBudWxsICE9PSBwYXJlbnQ7IClcbiAgICAgICAgKHBhcmVudC5jaGlsZExhbmVzIHw9IGxhbmUpLFxuICAgICAgICAgIChhbHRlcm5hdGUgPSBwYXJlbnQuYWx0ZXJuYXRlKSxcbiAgICAgICAgICBudWxsICE9PSBhbHRlcm5hdGUgJiYgKGFsdGVybmF0ZS5jaGlsZExhbmVzIHw9IGxhbmUpLFxuICAgICAgICAgIDIyID09PSBwYXJlbnQudGFnICYmXG4gICAgICAgICAgICAoKHNvdXJjZUZpYmVyID0gcGFyZW50LnN0YXRlTm9kZSksXG4gICAgICAgICAgICBudWxsID09PSBzb3VyY2VGaWJlciB8fFxuICAgICAgICAgICAgICBzb3VyY2VGaWJlci5fdmlzaWJpbGl0eSAmIE9mZnNjcmVlblZpc2libGUgfHxcbiAgICAgICAgICAgICAgKGlzSGlkZGVuID0gITApKSxcbiAgICAgICAgICAoc291cmNlRmliZXIgPSBwYXJlbnQpLFxuICAgICAgICAgIChwYXJlbnQgPSBwYXJlbnQucmV0dXJuKTtcbiAgICAgIHJldHVybiAzID09PSBzb3VyY2VGaWJlci50YWdcbiAgICAgICAgPyAoKHBhcmVudCA9IHNvdXJjZUZpYmVyLnN0YXRlTm9kZSksXG4gICAgICAgICAgaXNIaWRkZW4gJiZcbiAgICAgICAgICAgIG51bGwgIT09IHVwZGF0ZSAmJlxuICAgICAgICAgICAgKChpc0hpZGRlbiA9IDMxIC0gY2x6MzIobGFuZSkpLFxuICAgICAgICAgICAgKHNvdXJjZUZpYmVyID0gcGFyZW50LmhpZGRlblVwZGF0ZXMpLFxuICAgICAgICAgICAgKGFsdGVybmF0ZSA9IHNvdXJjZUZpYmVyW2lzSGlkZGVuXSksXG4gICAgICAgICAgICBudWxsID09PSBhbHRlcm5hdGVcbiAgICAgICAgICAgICAgPyAoc291cmNlRmliZXJbaXNIaWRkZW5dID0gW3VwZGF0ZV0pXG4gICAgICAgICAgICAgIDogYWx0ZXJuYXRlLnB1c2godXBkYXRlKSxcbiAgICAgICAgICAgICh1cGRhdGUubGFuZSA9IGxhbmUgfCA1MzY4NzA5MTIpKSxcbiAgICAgICAgICBwYXJlbnQpXG4gICAgICAgIDogbnVsbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0Um9vdEZvclVwZGF0ZWRGaWJlcihzb3VyY2VGaWJlcikge1xuICAgICAgaWYgKG5lc3RlZFVwZGF0ZUNvdW50ID4gTkVTVEVEX1VQREFURV9MSU1JVClcbiAgICAgICAgdGhyb3cgKFxuICAgICAgICAgICgobmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gbmVzdGVkVXBkYXRlQ291bnQgPSAwKSxcbiAgICAgICAgICAocm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlcyA9IHJvb3RXaXRoTmVzdGVkVXBkYXRlcyA9IG51bGwpLFxuICAgICAgICAgIEVycm9yKFxuICAgICAgICAgICAgXCJNYXhpbXVtIHVwZGF0ZSBkZXB0aCBleGNlZWRlZC4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gYSBjb21wb25lbnQgcmVwZWF0ZWRseSBjYWxscyBzZXRTdGF0ZSBpbnNpZGUgY29tcG9uZW50V2lsbFVwZGF0ZSBvciBjb21wb25lbnREaWRVcGRhdGUuIFJlYWN0IGxpbWl0cyB0aGUgbnVtYmVyIG9mIG5lc3RlZCB1cGRhdGVzIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHMuXCJcbiAgICAgICAgICApKVxuICAgICAgICApO1xuICAgICAgbmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID4gTkVTVEVEX1BBU1NJVkVfVVBEQVRFX0xJTUlUICYmXG4gICAgICAgICgobmVzdGVkUGFzc2l2ZVVwZGF0ZUNvdW50ID0gMCksXG4gICAgICAgIChyb290V2l0aFBhc3NpdmVOZXN0ZWRVcGRhdGVzID0gbnVsbCksXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJNYXhpbXVtIHVwZGF0ZSBkZXB0aCBleGNlZWRlZC4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gYSBjb21wb25lbnQgY2FsbHMgc2V0U3RhdGUgaW5zaWRlIHVzZUVmZmVjdCwgYnV0IHVzZUVmZmVjdCBlaXRoZXIgZG9lc24ndCBoYXZlIGEgZGVwZW5kZW5jeSBhcnJheSwgb3Igb25lIG9mIHRoZSBkZXBlbmRlbmNpZXMgY2hhbmdlcyBvbiBldmVyeSByZW5kZXIuXCJcbiAgICAgICAgKSk7XG4gICAgICBudWxsID09PSBzb3VyY2VGaWJlci5hbHRlcm5hdGUgJiZcbiAgICAgICAgMCAhPT0gKHNvdXJjZUZpYmVyLmZsYWdzICYgNDA5OCkgJiZcbiAgICAgICAgd2Fyb
15852kFib3V0VXBkYXRlT25Ob3RZZXRNb3VudGVkRmliZXJJbkRFVihzb3VyY2VGaWJlcik7XG4gICAgICBmb3IgKHZhciBub2RlID0gc291cmNlRmliZXIsIHBhcmVudCA9IG5vZGUucmV0dXJuOyBudWxsICE9PSBwYXJlbnQ7IClcbiAgICAgICAgbnVsbCA9PT0gbm9kZS5hbHRlcm5hdGUgJiZcbiAgICAgICAgICAwICE9PSAobm9kZS5mbGFncyAmIDQwOTgpICYmXG4gICAgICAgICAgd2FybkFib3V0VXBkYXRlT25Ob3RZZXRNb3VudGVkRmliZXJJbkRFVihzb3VyY2VGaWJlciksXG4gICAgICAgICAgKG5vZGUgPSBwYXJlbnQpLFxuICAgICAgICAgIChwYXJlbnQgPSBub2RlLnJldHVybik7XG4gICAgICByZXR1cm4gMyA9PT0gbm9kZS50YWcgPyBub2RlLnN0YXRlTm9kZSA6IG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlc29sdmVUeXBlRm9ySG90UmVsb2FkaW5nKHR5cGUpIHtcbiAgICAgIGlmIChudWxsID09PSByZXNvbHZlRmFtaWx5KSByZXR1cm4gdHlwZTtcbiAgICAgIHZhciBmYW1pbHkgPSByZXNvbHZlRmFtaWx5KHR5cGUpO1xuICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gZmFtaWx5ID8gdHlwZSA6IGZhbWlseS5jdXJyZW50O1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0NvbXBhdGlibGVGYW1pbHlGb3JIb3RSZWxvYWRpbmcoZmliZXIsIGVsZW1lbnQpIHtcbiAgICAgIGlmIChudWxsID09PSByZXNvbHZlRmFtaWx5KSByZXR1cm4gITE7XG4gICAgICB2YXIgcmVzb2x2ZSA9IHJlc29sdmVGYW1pbHksXG4gICAgICAgIHByZXZUeXBlID0gZmliZXIuZWxlbWVudFR5cGU7XG4gICAgICBlbGVtZW50ID0gZWxlbWVudC50eXBlO1xuICAgICAgdmFyIG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gITEsXG4gICAgICAgICQkdHlwZW9mTmV4dFR5cGUgPVxuICAgICAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiBlbGVtZW50ICYmIG51bGwgIT09IGVsZW1lbnRcbiAgICAgICAgICAgID8gZWxlbWVudC4kJHR5cGVvZlxuICAgICAgICAgICAgOiBudWxsO1xuICAgICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGVsZW1lbnQgJiYgKG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gITApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgZWxlbWVudFxuICAgICAgICAgICAgPyAobmVlZHNDb21wYXJlRmFtaWxpZXMgPSAhMClcbiAgICAgICAgICAgIDogJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTEFaWV9UWVBFICYmXG4gICAgICAgICAgICAgIChuZWVkc0NvbXBhcmVGYW1pbGllcyA9ICEwKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFXG4gICAgICAgICAgICA/IChuZWVkc0NvbXBhcmVGYW1pbGllcyA9ICEwKVxuICAgICAgICAgICAgOiAkJHR5cGVvZk5leHRUeXBlID09PSBSRUFDVF9MQVpZX1RZUEUgJiZcbiAgICAgICAgICAgICAgKG5lZWRzQ29tcGFyZUZhbWlsaWVzID0gITApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE0OlxuICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICQkdHlwZW9mTmV4dFR5cGUgPT09IFJFQUNUX01FTU9fVFlQRVxuICAgICAgICAgICAgPyAobmVlZHNDb21wYXJlRmFtaWxpZXMgPSAhMClcbiAgICAgICAgICAgIDogJCR0eXBlb2ZOZXh0VHlwZSA9PT0gUkVBQ1RfTEFaWV9UWVBFICYmXG4gICAgICAgICAgICAgIChuZWVkc0NvbXBhcmVGYW1pbGllcyA9ICEwKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gITE7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmVlZHNDb21wYXJlRmFtaWxpZXMgJiZcbiAgICAgICAgKChmaWJlciA9IHJlc29sdmUocHJldlR5cGUpKSxcbiAgICAgICAgdm9pZCAwICE9PSBmaWJlciAmJiBmaWJlciA9PT0gcmVzb2x2ZShlbGVtZW50KSlcbiAgICAgICAgPyAhMFxuICAgICAgICA6ICExO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtYXJrRmFpbGVkRXJyb3JCb3VuZGFyeUZvckhvdFJlbG9hZGluZyhmaWJlcikge1xuICAgICAgbnVsbCAhPT0gcmVzb2x2ZUZhbWlseSAmJlxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBXZWFrU2V0ICYmXG4gICAgICAgIChudWxsID09PSBmYWlsZWRCb3VuZGFyaWVzICYmIChmYWlsZWRCb3VuZGFyaWVzID0gbmV3IFdlYWtTZXQoKSksXG4gICAgICAgIGZhaWxlZEJvdW5kYXJpZXMuYWRkKGZpYmVyKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNjaGVkdWxlRmliZXJzV2l0aEZhbWlsaWVzUmVjdXJzaXZlbHkoXG4gICAgICBmaWJlcixcbiAgICAgIHVwZGF0ZWRGYW1pbGllcyxcbiAgICAgIHN0YWxlRmFtaWxpZXNcbiAgICApIHtcbiAgICAgIGRvIHtcbiAgICAgICAgdmFyIF9maWJlciA9IGZpYmVyLFxuICAgICAgICAgIGFsdGVybmF0ZSA9IF9maWJlci5hbHRlcm5hdGUsXG4gICAgICAgICAgY2hpbGQgPSBfZmliZXIuY2hpbGQsXG4gICAgICAgICAgc2libGluZyA9IF9maWJlci5zaWJsaW5nLFxuICAgICAgICAgIHRhZyA9IF9maWJlci50YWcsXG4gICAgICAgICAgdHlwZSA9IF9maWJlci50eXBlLFxuICAgICAgICAgIGVsZW1lbnRUeXBlID0gX2ZpYmVyLmVsZW1lbnRUeXBlLFxuICAgICAgICAgIGNhbmRpZGF0ZVR5cGUgPSBudWxsO1xuICAgICAgICBfZmliZXIgPSBudWxsO1xuICAgICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBjYW5kaWRhdGVUeXBlID0gdHlwZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICBjYW5kaWRhdGVUeXBlID0gdHlwZTtcbiAgICAgICAgICAgIF9maWJlciA9IGVsZW1lbnRUeXBlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgIF9maWJlciA9IGVsZW1lbnRUeXBlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgIChjYW5kaWRhdGVUeXBlID0gdHlwZS5yZW5kZXIpLCAoX2ZpYmVyID0gZWxlbWVudFR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChudWxsID09PSByZXNvbHZlRmFtaWx5KVxuICAgICAgICAgI
15852HRocm93IEVycm9yKFwiRXhwZWN0ZWQgcmVzb2x2ZUZhbWlseSB0byBiZSBzZXQgZHVyaW5nIGhvdCByZWxvYWQuXCIpO1xuICAgICAgICB2YXIgcmVzb2x2ZSA9IHJlc29sdmVGYW1pbHk7XG4gICAgICAgIHR5cGUgPSBlbGVtZW50VHlwZSA9ICExO1xuICAgICAgICBudWxsICE9PSBjYW5kaWRhdGVUeXBlICYmXG4gICAgICAgICAgKChjYW5kaWRhdGVUeXBlID0gcmVzb2x2ZShjYW5kaWRhdGVUeXBlKSksXG4gICAgICAgICAgdm9pZCAwICE9PSBjYW5kaWRhdGVUeXBlICYmXG4gICAgICAgICAgICAoc3RhbGVGYW1pbGllcy5oYXMoY2FuZGlkYXRlVHlwZSlcbiAgICAgICAgICAgICAgPyAodHlwZSA9ICEwKVxuICAgICAgICAgICAgICA6IHVwZGF0ZWRGYW1pbGllcy5oYXMoY2FuZGlkYXRlVHlwZSkgJiZcbiAgICAgICAgICAgICAgICAoMSA9PT0gdGFnID8gKHR5cGUgPSAhMCkgOiAoZWxlbWVudFR5cGUgPSAhMCkpKSk7XG4gICAgICAgIHR5cGUgfHxcbiAgICAgICAgICBudWxsID09PSBfZmliZXIgfHxcbiAgICAgICAgICAoKHRhZyA9IHJlc29sdmUoX2ZpYmVyKSksXG4gICAgICAgICAgdm9pZCAwICE9PSB0YWcgJiYgc3RhbGVGYW1pbGllcy5oYXModGFnKVxuICAgICAgICAgICAgPyAodHlwZSA9ICEwKVxuICAgICAgICAgICAgOiBcIm9iamVjdFwiID09PSB0eXBlb2YgX2ZpYmVyICYmXG4gICAgICAgICAgICAgIF9maWJlci4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFICYmXG4gICAgICAgICAgICAgICgodGFnID0gX2ZpYmVyLl9wYXlsb2FkKSxcbiAgICAgICAgICAgICAgMSA9PT0gdGFnLl9zdGF0dXMgJiZcbiAgICAgICAgICAgICAgICAoKHRhZyA9IHJlc29sdmUodGFnLl9yZXN1bHQuZGVmYXVsdCkpLFxuICAgICAgICAgICAgICAgIHZvaWQgMCAhPT0gdGFnICYmIHN0YWxlRmFtaWxpZXMuaGFzKHRhZykgJiYgKHR5cGUgPSAhMCkpKSk7XG4gICAgICAgIG51bGwgIT09IGZhaWxlZEJvdW5kYXJpZXMgJiZcbiAgICAgICAgICAoZmFpbGVkQm91bmRhcmllcy5oYXMoZmliZXIpIHx8XG4gICAgICAgICAgICAobnVsbCAhPT0gYWx0ZXJuYXRlICYmIGZhaWxlZEJvdW5kYXJpZXMuaGFzKGFsdGVybmF0ZSkpKSAmJlxuICAgICAgICAgICh0eXBlID0gITApO1xuICAgICAgICB0eXBlICYmIChmaWJlci5fZGVidWdOZWVkc1JlbW91bnQgPSAhMCk7XG4gICAgICAgIGlmICh0eXBlIHx8IGVsZW1lbnRUeXBlKVxuICAgICAgICAgIChhbHRlcm5hdGUgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIDIpKSxcbiAgICAgICAgICAgIG51bGwgIT09IGFsdGVybmF0ZSAmJiBzY2hlZHVsZVVwZGF0ZU9uRmliZXIoYWx0ZXJuYXRlLCBmaWJlciwgMik7XG4gICAgICAgIG51bGwgPT09IGNoaWxkIHx8XG4gICAgICAgICAgdHlwZSB8fFxuICAgICAgICAgIHNjaGVkdWxlRmliZXJzV2l0aEZhbWlsaWVzUmVjdXJzaXZlbHkoXG4gICAgICAgICAgICBjaGlsZCxcbiAgICAgICAgICAgIHVwZGF0ZWRGYW1pbGllcyxcbiAgICAgICAgICAgIHN0YWxlRmFtaWxpZXNcbiAgICAgICAgICApO1xuICAgICAgICBpZiAobnVsbCA9PT0gc2libGluZykgYnJlYWs7XG4gICAgICAgIGZpYmVyID0gc2libGluZztcbiAgICAgIH0gd2hpbGUgKDEpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBGaWJlck5vZGUodGFnLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSkge1xuICAgICAgdGhpcy50YWcgPSB0YWc7XG4gICAgICB0aGlzLmtleSA9IGtleTtcbiAgICAgIHRoaXMuc2libGluZyA9XG4gICAgICAgIHRoaXMuY2hpbGQgPVxuICAgICAgICB0aGlzLnJldHVybiA9XG4gICAgICAgIHRoaXMuc3RhdGVOb2RlID1cbiAgICAgICAgdGhpcy50eXBlID1cbiAgICAgICAgdGhpcy5lbGVtZW50VHlwZSA9XG4gICAgICAgICAgbnVsbDtcbiAgICAgIHRoaXMuaW5kZXggPSAwO1xuICAgICAgdGhpcy5yZWZDbGVhbnVwID0gdGhpcy5yZWYgPSBudWxsO1xuICAgICAgdGhpcy5wZW5kaW5nUHJvcHMgPSBwZW5kaW5nUHJvcHM7XG4gICAgICB0aGlzLmRlcGVuZGVuY2llcyA9XG4gICAgICAgIHRoaXMubWVtb2l6ZWRTdGF0ZSA9XG4gICAgICAgIHRoaXMudXBkYXRlUXVldWUgPVxuICAgICAgICB0aGlzLm1lbW9pemVkUHJvcHMgPVxuICAgICAgICAgIG51bGw7XG4gICAgICB0aGlzLm1vZGUgPSBtb2RlO1xuICAgICAgdGhpcy5zdWJ0cmVlRmxhZ3MgPSB0aGlzLmZsYWdzID0gMDtcbiAgICAgIHRoaXMuZGVsZXRpb25zID0gbnVsbDtcbiAgICAgIHRoaXMuY2hpbGRMYW5lcyA9IHRoaXMubGFuZXMgPSAwO1xuICAgICAgdGhpcy5hbHRlcm5hdGUgPSBudWxsO1xuICAgICAgdGhpcy5hY3R1YWxEdXJhdGlvbiA9IC0wO1xuICAgICAgdGhpcy5hY3R1YWxTdGFydFRpbWUgPSAtMS4xO1xuICAgICAgdGhpcy50cmVlQmFzZUR1cmF0aW9uID0gdGhpcy5zZWxmQmFzZUR1cmF0aW9uID0gLTA7XG4gICAgICB0aGlzLl9kZWJ1Z1Rhc2sgPVxuICAgICAgICB0aGlzLl9kZWJ1Z1N0YWNrID1cbiAgICAgICAgdGhpcy5fZGVidWdPd25lciA9XG4gICAgICAgIHRoaXMuX2RlYnVnSW5mbyA9XG4gICAgICAgICAgbnVsbDtcbiAgICAgIHRoaXMuX2RlYnVnTmVlZHNSZW1vdW50ID0gITE7XG4gICAgICB0aGlzLl9kZWJ1Z0hvb2tUeXBlcyA9IG51bGw7XG4gICAgICBoYXNCYWRNYXBQb2x5ZmlsbCB8fFxuICAgICAgICBcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBPYmplY3QucHJldmVudEV4dGVuc2lvbnMgfHxcbiAgICAgICAgT2JqZWN0LnByZXZlbn
15852RFeHRlbnNpb25zKHRoaXMpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7XG4gICAgICBDb21wb25lbnQgPSBDb21wb25lbnQucHJvdG90eXBlO1xuICAgICAgcmV0dXJuICEoIUNvbXBvbmVudCB8fCAhQ29tcG9uZW50LmlzUmVhY3RDb21wb25lbnQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhjdXJyZW50LCBwZW5kaW5nUHJvcHMpIHtcbiAgICAgIHZhciB3b3JrSW5Qcm9ncmVzcyA9IGN1cnJlbnQuYWx0ZXJuYXRlO1xuICAgICAgbnVsbCA9PT0gd29ya0luUHJvZ3Jlc3NcbiAgICAgICAgPyAoKHdvcmtJblByb2dyZXNzID0gY3JlYXRlRmliZXIoXG4gICAgICAgICAgICBjdXJyZW50LnRhZyxcbiAgICAgICAgICAgIHBlbmRpbmdQcm9wcyxcbiAgICAgICAgICAgIGN1cnJlbnQua2V5LFxuICAgICAgICAgICAgY3VycmVudC5tb2RlXG4gICAgICAgICAgKSksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLmVsZW1lbnRUeXBlID0gY3VycmVudC5lbGVtZW50VHlwZSksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLnR5cGUgPSBjdXJyZW50LnR5cGUpLFxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBjdXJyZW50LnN0YXRlTm9kZSksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLl9kZWJ1Z093bmVyID0gY3VycmVudC5fZGVidWdPd25lciksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLl9kZWJ1Z1N0YWNrID0gY3VycmVudC5fZGVidWdTdGFjayksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLl9kZWJ1Z1Rhc2sgPSBjdXJyZW50Ll9kZWJ1Z1Rhc2spLFxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5fZGVidWdIb29rVHlwZXMgPSBjdXJyZW50Ll9kZWJ1Z0hvb2tUeXBlcyksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZSA9IGN1cnJlbnQpLFxuICAgICAgICAgIChjdXJyZW50LmFsdGVybmF0ZSA9IHdvcmtJblByb2dyZXNzKSlcbiAgICAgICAgOiAoKHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyA9IHBlbmRpbmdQcm9wcyksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLnR5cGUgPSBjdXJyZW50LnR5cGUpLFxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IDApLFxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5zdWJ0cmVlRmxhZ3MgPSAwKSxcbiAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuZGVsZXRpb25zID0gbnVsbCksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLmFjdHVhbER1cmF0aW9uID0gLTApLFxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5hY3R1YWxTdGFydFRpbWUgPSAtMS4xKSk7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IGN1cnJlbnQuZmxhZ3MgJiAxMjA2OTEwOTc2O1xuICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyA9IGN1cnJlbnQuY2hpbGRMYW5lcztcbiAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzID0gY3VycmVudC5sYW5lcztcbiAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZDtcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlO1xuICAgICAgcGVuZGluZ1Byb3BzID0gY3VycmVudC5kZXBlbmRlbmNpZXM7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPVxuICAgICAgICBudWxsID09PSBwZW5kaW5nUHJvcHNcbiAgICAgICAgICA/IG51bGxcbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgbGFuZXM6IHBlbmRpbmdQcm9wcy5sYW5lcyxcbiAgICAgICAgICAgICAgZmlyc3RDb250ZXh0OiBwZW5kaW5nUHJvcHMuZmlyc3RDb250ZXh0LFxuICAgICAgICAgICAgICBfZGVidWdUaGVuYWJsZVN0YXRlOiBwZW5kaW5nUHJvcHMuX2RlYnVnVGhlbmFibGVTdGF0ZVxuICAgICAgICAgICAgfTtcbiAgICAgIHdvcmtJblByb2dyZXNzLnNpYmxpbmcgPSBjdXJyZW50LnNpYmxpbmc7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5pbmRleCA9IGN1cnJlbnQuaW5kZXg7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5yZWYgPSBjdXJyZW50LnJlZjtcbiAgICAgIHdvcmtJblByb2dyZXNzLnJlZkNsZWFudXAgPSBjdXJyZW50LnJlZkNsZWFudXA7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5zZWxmQmFzZUR1cmF0aW9uID0gY3VycmVudC5zZWxmQmFzZUR1cmF0aW9uO1xuICAgICAgd29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiA9IGN1cnJlbnQudHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgIHdvcmtJblByb2dyZXNzLl9kZWJ1Z0luZm8gPSBjdXJyZW50Ll9kZWJ1Z0luZm87XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5fZGVidWdOZWVkc1JlbW91bnQgPSBjdXJyZW50Ll9kZWJ1Z05lZWRzUmVtb3VudDtcbiAgICAgIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICBjYXNlIDExOlxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSByZXNvbHZlVHlwZUZvckhvdFJlbG9hZGluZyhjdXJyZW50LnR5cGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXNldFdvcmtJblByb2dyZXNzKHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gMTIwNjkxMDk3ODtcbiAgICAgIHZhciBjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlO1xuICAgICAgbnVsbCA9PT0gY3VycmVudFxuICAgICAgICA/ICgod29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyA9IDApLFxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IHJlbmRlckxhbmVzKSxcbiAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBudWxsKSxcbiAgICAgICAgICAod29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzID0gMCksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMgP
15852SBudWxsKSxcbiAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGwpLFxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IG51bGwpLFxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSBudWxsKSxcbiAgICAgICAgICAod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gbnVsbCksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLnNlbGZCYXNlRHVyYXRpb24gPSAwKSxcbiAgICAgICAgICAod29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiA9IDApKVxuICAgICAgICA6ICgod29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyA9IGN1cnJlbnQuY2hpbGRMYW5lcyksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLmxhbmVzID0gY3VycmVudC5sYW5lcyksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZCksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLnN1YnRyZWVGbGFncyA9IDApLFxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5kZWxldGlvbnMgPSBudWxsKSxcbiAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpLFxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZSA9IGN1cnJlbnQudXBkYXRlUXVldWUpLFxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy50eXBlID0gY3VycmVudC50eXBlKSxcbiAgICAgICAgICAocmVuZGVyTGFuZXMgPSBjdXJyZW50LmRlcGVuZGVuY2llcyksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcyA9XG4gICAgICAgICAgICBudWxsID09PSByZW5kZXJMYW5lc1xuICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICBsYW5lczogcmVuZGVyTGFuZXMubGFuZXMsXG4gICAgICAgICAgICAgICAgICBmaXJzdENvbnRleHQ6IHJlbmRlckxhbmVzLmZpcnN0Q29udGV4dCxcbiAgICAgICAgICAgICAgICAgIF9kZWJ1Z1RoZW5hYmxlU3RhdGU6IHJlbmRlckxhbmVzLl9kZWJ1Z1RoZW5hYmxlU3RhdGVcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAod29ya0luUHJvZ3Jlc3Muc2VsZkJhc2VEdXJhdGlvbiA9IGN1cnJlbnQuc2VsZkJhc2VEdXJhdGlvbiksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLnRyZWVCYXNlRHVyYXRpb24gPSBjdXJyZW50LnRyZWVCYXNlRHVyYXRpb24pKTtcbiAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICB9XG4gICAgZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tVHlwZUFuZFByb3BzKFxuICAgICAgdHlwZSxcbiAgICAgIGtleSxcbiAgICAgIHBlbmRpbmdQcm9wcyxcbiAgICAgIG93bmVyLFxuICAgICAgbW9kZSxcbiAgICAgIGxhbmVzXG4gICAgKSB7XG4gICAgICB2Y
15852XIgZmliZXJUYWcgPSAwO1xuICAgICAgdmFyIHJlc29sdmVkVHlwZSA9IHJlc29sdmVUeXBlRm9ySG90UmVsb2FkaW5nKHR5cGUpO1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHJlc29sdmVkVHlwZSlcbiAgICAgICAgc2hvdWxkQ29uc3RydWN0KHJlc29sdmVkVHlwZSkgJiYgKGZpYmVyVGFnID0gMSk7XG4gICAgICBlbHNlIGlmIChcInN0cmluZ1wiID09PSB0eXBlb2YgcmVzb2x2ZWRUeXBlKVxuICAgICAgICAoZmliZXJUYWcgPSBnZXRIb3N0Q29udGV4dCgpKSxcbiAgICAgICAgICAoZmliZXJUYWcgPSBpc0hvc3RIb2lzdGFibGVUeXBlKHR5cGUsIHBlbmRpbmdQcm9wcywgZmliZXJUYWcpXG4gICAgICAgICAgICA/IDI2XG4gICAgICAgICAgICA6IFwiaHRtbFwiID09PSB0eXBlIHx8IFwiaGVhZFwiID09PSB0eXBlIHx8IFwiYm9keVwiID09PSB0eXBlXG4gICAgICAgICAgICAgID8gMjdcbiAgICAgICAgICAgICAgOiA1KTtcbiAgICAgIGVsc2VcbiAgICAgICAgYTogc3dpdGNoIChyZXNvbHZlZFR5cGUpIHtcbiAgICAgICAgICBjYXNlIFJFQUNUX0FDVElWSVRZX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAoa2V5ID0gY3JlYXRlRmliZXIoMzEsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKSksXG4gICAgICAgICAgICAgIChrZXkuZWxlbWVudFR5cGUgPSBSRUFDVF9BQ1RJVklUWV9UWVBFKSxcbiAgICAgICAgICAgICAgKGtleS5sYW5lcyA9IGxhbmVzKSxcbiAgICAgICAgICAgICAga2V5XG4gICAgICAgICAgICApO1xuICAgICAgICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVGaWJlckZyb21GcmFnbWVudChcbiAgICAgICAgICAgICAgcGVuZGluZ1Byb3BzLmNoaWxkcmVuLFxuICAgICAgICAgICAgICBtb2RlLFxuICAgICAgICAgICAgICBsYW5lcyxcbiAgICAgICAgICAgICAga2V5XG4gICAgICAgICAgICApO1xuICAgICAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgICAgIGZpYmVyVGFnID0gODtcbiAgICAgICAgICAgIG1vZGUgfD0gU3RyaWN0TGVnYWN5TW9kZTtcbiAgICAgICAgICAgIG1vZGUgfD0gU3RyaWN0RWZmZWN0c01vZGU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAodHlwZSA9IHBlbmRpbmdQcm9wcyksXG4gICAgICAgICAgICAgIChvd25lciA9IG1vZGUpLFxuICAgICAgICAgICAgICBcInN0cmluZ1wiICE9PSB0eXBlb2YgdHlwZS5pZCAmJlxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAnUHJvZmlsZXIgbXVzdCBzcGVjaWZ5IGFuIFwiaWRcIiBvZiB0eXBlIGBzdHJpbmdgIGFzIGEgcHJvcC4gUmVjZWl2ZWQgdGhlIHR5cGUgYCVzYCBpbnN0ZWFkLicsXG4gICAgICAgICAgICAgICAgICB0eXBlb2YgdHlwZS5pZFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIChrZXkgPSBjcmVhdGVGaWJlcigxMiwgdHlwZSwga2V5LCBvd25lciB8IFByb2ZpbGVNb2RlKSksXG4gICAgICAgICAgICAgIChrZXkuZWxlbWVudFR5cGUgPSBSRUFDVF9QUk9GSUxFUl9UWVBFKSxcbiAgICAgICAgICAgICAgKGtleS5sYW5lcyA9IGxhbmVzKSxcbiAgICAgICAgICAgICAgKGtleS5zdGF0ZU5vZGUgPSB7IGVmZmVjdER1cmF0aW9uOiAwLCBwYXNzaXZlRWZmZWN0RHVyYXRpb246IDAgfSksXG4gICAgICAgICAgICAgIGtleVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAoa2V5ID0gY3JlYXRlRmliZXIoMTMsIHBlbmRpbmdQcm9wcywga2V5LCBtb2RlKSksXG4gICAgICAgICAgICAgIChrZXkuZWxlbWVudFR5cGUgPSBSRUFDVF9TVVNQRU5TRV9UWVBFKSxcbiAgICAgICAgICAgICAgKGtleS5sYW5lcyA9IGxhbmVzKSxcbiAgICAgICAgICAgICAga2V5XG4gICAgICAgICAgICApO1xuICAgICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgKGtleSA9IGNyZWF0ZUZpYmVyKDE5LCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSkpLFxuICAgICAgICAgICAgICAoa2V5LmVsZW1lbnRUeXBlID0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFKSxcbiAgICAgICAgICAgICAgKGtleS5sYW5lcyA9IGxhbmVzKSxcbiAgICAgICAgICAgICAga2V5XG4gICAgICAgICAgICApO1xuICAgICAgICAgIGNhc2UgUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFOlxuICAgICAgICAgIGNhc2UgUkVBQ1RfVklFV19UUkFOU0lUSU9OX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAodHlwZSA9IG1vZGUgfCBTdXNwZW5zZXlJbWFnZXNNb2RlKSxcbiAgICAgICAgICAgICAgKGtleSA9IGNyZWF0ZUZpYmVyKDMwLCBwZW5kaW5nUHJvcHMsIGtleSwgdHlwZSkpLFxuICAgICAgICAgICAgICAoa2V5LmVsZW1lbnRUeXBlID0gUkVBQ1RfVklFV19UUkFOU0lUSU9OX1RZUEUpLFxuICAgICAgICAgICAgICAoa2V5LmxhbmVzID0gbGFuZXMpLFxuICAgICAgICAgICAgICAoa2V5LnN0YXRlTm9kZSA9IHtcbiAgICAgICAgICAgICAgICBhdXRvTmFtZTogbnVsbCxcbiAgICAgICAgICAgICAgICBwYWlyZWQ6IG51bGwsXG4gICAgICAgICAgICAgICAgY2xvbmVzOiBudWxsLFxuICAgICAgICAgICAgICAgIHJlZjogbnVsbFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAga2V5XG4gICAgICAgICAgICApO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBpZiAoXCJvYmplY3RcIiA9PT0gdHlwZW9mIHJlc29sdmVkVHlwZSAmJiBudWxsICE9PSByZXNvbHZlZFR5cGUpXG4gICAgICAgICAgICAgIHN3aXRjaCAocmVzb2x2ZWRUeXBlLiQkdHlwZW9mKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgICAgICAgICAgICBmaWJlclRhZyA9IDEwO1xuICAgICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlNVTUVSX1RZUEU6XG4gICAgICAgICAgICAgICAgICBmaWJlclRhZyA9IDk7XG4gICAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICAgICAgICAgIGZpYmVyVGFnID0gMTE7XG4gICAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgICAgICAgZmliZXJUYWcgPSAxNDtcbiAgICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgICAgICBmaWJlclRhZyA9IDE2O1xuICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRUeXBlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgI
15852H1cbiAgICAgICAgICAgIHBlbmRpbmdQcm9wcyA9IFwiXCI7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHZvaWQgMCA9PT0gdHlwZSB8fFxuICAgICAgICAgICAgICAoXCJvYmplY3RcIiA9PT0gdHlwZW9mIHR5cGUgJiZcbiAgICAgICAgICAgICAgICBudWxsICE9PSB0eXBlICYmXG4gICAgICAgICAgICAgICAgMCA9PT0gT2JqZWN0LmtleXModHlwZSkubGVuZ3RoKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBwZW5kaW5nUHJvcHMgKz1cbiAgICAgICAgICAgICAgICBcIiBZb3UgbGlrZWx5IGZvcmdvdCB0byBleHBvcnQgeW91ciBjb21wb25lbnQgZnJvbSB0aGUgZmlsZSBpdCdzIGRlZmluZWQgaW4sIG9yIHlvdSBtaWdodCBoYXZlIG1peGVkIHVwIGRlZmF1bHQgYW5kIG5hbWVkIGltcG9ydHMuXCI7XG4gICAgICAgICAgICBudWxsID09PSB0eXBlXG4gICAgICAgICAgICAgID8gKHJlc29sdmVkVHlwZSA9IFwibnVsbFwiKVxuICAgICAgICAgICAgICA6IGlzQXJyYXlJbXBsKHR5cGUpXG4gICAgICAgICAgICAgICAgPyAocmVzb2x2ZWRUeXBlID0gXCJhcnJheVwiKVxuICAgICAgICAgICAgICAgIDogdm9pZCAwICE9PSB0eXBlICYmIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRVxuICAgICAgICAgICAgICAgICAgPyAoKHJlc29sdmVkVHlwZSA9XG4gICAgICAgICAgICAgICAgICAgICAgXCI8XCIgK1xuICAgICAgICAgICAgICAgICAgICAgIChnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZS50eXBlKSB8fCBcIlVua25vd25cIikgK1xuICAgICAgICAgICAgICAgICAgICAgIFwiIC8+XCIpLFxuICAgICAgICAgICAgICAgICAgICAocGVuZGluZ1Byb3BzID1cbiAgICAgICAgICAgICAgICAgICAgICBcIiBEaWQgeW91IGFjY2lkZW50YWxseSBleHBvcnQgYSBKU1ggbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgY29tcG9uZW50P1wiKSlcbiAgICAgICAgICAgICAgICAgIDogKHJlc29sdmVkVHlwZSA9IHR5cGVvZiB0eXBlKTtcbiAgICAgICAgICAgIChmaWJlclRhZyA9IG93bmVyID8gZ2V0Q29tcG9uZW50TmFtZUZyb21Pd25lcihvd25lcikgOiBudWxsKSAmJlxuICAgICAgICAgICAgICAocGVuZGluZ1Byb3BzICs9XG4gICAgICAgICAgICAgICAgXCJcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgXCIgKyBmaWJlclRhZyArIFwiYC5cIik7XG4gICAgICAgICAgICBmaWJlclRhZyA9IDI5O1xuICAgICAgICAgICAgcGVuZGluZ1Byb3BzID0gRXJyb3IoXG4gICAgICAgICAgICAgIFwiRWxlbWVudCB0eX
15852BlIGlzIGludmFsaWQ6IGV4cGVjdGVkIGEgc3RyaW5nIChmb3IgYnVpbHQtaW4gY29tcG9uZW50cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSBjb21wb25lbnRzKSBidXQgZ290OiBcIiArXG4gICAgICAgICAgICAgICAgKHJlc29sdmVkVHlwZSArIFwiLlwiICsgcGVuZGluZ1Byb3BzKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlc29sdmVkVHlwZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIGtleSA9IGNyZWF0ZUZpYmVyKGZpYmVyVGFnLCBwZW5kaW5nUHJvcHMsIGtleSwgbW9kZSk7XG4gICAgICBrZXkuZWxlbWVudFR5cGUgPSB0eXBlO1xuICAgICAga2V5LnR5cGUgPSByZXNvbHZlZFR5cGU7XG4gICAgICBrZXkubGFuZXMgPSBsYW5lcztcbiAgICAgIGtleS5fZGVidWdPd25lciA9IG93bmVyO1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tRWxlbWVudChlbGVtZW50LCBtb2RlLCBsYW5lcykge1xuICAgICAgbW9kZSA9IGNyZWF0ZUZpYmVyRnJvbVR5cGVBbmRQcm9wcyhcbiAgICAgICAgZWxlbWVudC50eXBlLFxuICAgICAgICBlbGVtZW50LmtleSxcbiAgICAgICAgZWxlbWVudC5wcm9wcyxcbiAgICAgICAgZWxlbWVudC5fb3duZXIsXG4gICAgICAgIG1vZGUsXG4gICAgICAgIGxhbmVzXG4gICAgICApO1xuICAgICAgbW9kZS5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgbW9kZS5fZGVidWdTdGFjayA9IGVsZW1lbnQuX2RlYnVnU3RhY2s7XG4gICAgICBtb2RlLl9kZWJ1Z1Rhc2sgPSBlbGVtZW50Ll9kZWJ1Z1Rhc2s7XG4gICAgICByZXR1cm4gbW9kZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoZWxlbWVudHMsIG1vZGUsIGxhbmVzLCBrZXkpIHtcbiAgICAgIGVsZW1lbnRzID0gY3JlYXRlRmliZXIoNywgZWxlbWVudHMsIGtleSwgbW9kZSk7XG4gICAgICBlbGVtZW50cy5sYW5lcyA9IGxhbmVzO1xuICAgICAgcmV0dXJuIGVsZW1lbnRzO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjcmVhdGVGaWJlckZyb21UZXh0KGNvbnRlbnQsIG1vZGUsIGxhbmVzKSB7XG4gICAgICBjb250ZW50ID0gY3JlYXRlRmliZXIoNiwgY29udGVudCwgbnVsbCwgbW9kZSk7XG4gICAgICBjb250ZW50LmxhbmVzID0gbGFuZXM7XG4gICAgICByZXR1cm4gY29udGVudDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY3JlYXRlRmliZXJGcm9tRGVoeWRyYXRlZEZyYWdtZW50KGRlaHlkcmF0ZWROb2RlKSB7XG4gICAgICB2Y
15852XIgZmliZXIgPSBjcmVhdGVGaWJlcigxOCwgbnVsbCwgbnVsbCwgTm9Nb2RlKTtcbiAgICAgIGZpYmVyLnN0YXRlTm9kZSA9IGRlaHlkcmF0ZWROb2RlO1xuICAgICAgcmV0dXJuIGZpYmVyO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjcmVhdGVGaWJlckZyb21Qb3J0YWwocG9ydGFsLCBtb2RlLCBsYW5lcykge1xuICAgICAgbW9kZSA9IGNyZWF0ZUZpYmVyKFxuICAgICAgICA0LFxuICAgICAgICBudWxsICE9PSBwb3J0YWwuY2hpbGRyZW4gPyBwb3J0YWwuY2hpbGRyZW4gOiBbXSxcbiAgICAgICAgcG9ydGFsLmtleSxcbiAgICAgICAgbW9kZVxuICAgICAgKTtcbiAgICAgIG1vZGUubGFuZXMgPSBsYW5lcztcbiAgICAgIG1vZGUuc3RhdGVOb2RlID0ge1xuICAgICAgICBjb250YWluZXJJbmZvOiBwb3J0YWwuY29udGFpbmVySW5mbyxcbiAgICAgICAgcGVuZGluZ0NoaWxkcmVuOiBudWxsLFxuICAgICAgICBpbXBsZW1lbnRhdGlvbjogcG9ydGFsLmltcGxlbWVudGF0aW9uXG4gICAgICB9O1xuICAgICAgcmV0dXJuIG1vZGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKHZhbHVlLCBzb3VyY2UpIHtcbiAgICAgIGlmIChcIm9iamVjdFwiID09PSB0eXBlb2YgdmFsdWUgJiYgbnVsbCAhPT0gdmFsdWUpIHtcbiAgICAgICAgdmFyIGV4aXN0aW5nID0gQ2FwdHVyZWRTdGFja3MuZ2V0KHZhbHVlKTtcbiAgICAgICAgaWYgKHZvaWQgMCAhPT0gZXhpc3RpbmcpIHJldHVybiBleGlzdGluZztcbiAgICAgICAgc291cmNlID0ge1xuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICBzdGFjazogZ2V0U3RhY2tCeUZpYmVySW5EZXZBbmRQcm9kKHNvdXJjZSlcbiAgICAgICAgfTtcbiAgICAgICAgQ2FwdHVyZWRTdGFja3Muc2V0KHZhbHVlLCBzb3VyY2UpO1xuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgc3RhY2s6IGdldFN0YWNrQnlGaWJlckluRGV2QW5kUHJvZChzb3VyY2UpXG4gICAgICB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBwdXNoVHJlZUZvcmsod29ya0luUHJvZ3Jlc3MsIHRvdGFsQ2hpbGRyZW4pIHtcbiAgICAgIHdhcm5JZk5vdEh5ZHJhdGluZygpO1xuICAgICAgZm9ya1N0YWNrW2ZvcmtTdGFja0luZGV4KytdID0gdHJlZUZvcmtDb3VudDtcbiAgICAgIGZvcmtTdGFja1tmb3JrU3RhY2tJbmRleCsrXSA9IHRyZWVGb3JrUHJvdmlkZXI7XG4gICAgICB0cmVlRm9ya1Byb3ZpZGVyID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgICB0cmVlRm9ya0NvdW50ID0gdG90YWxDaGlsZHJlbjtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHVzaFRyZWVJZCh3b3JrSW5Qcm9ncmVzcywgdG90YWxDaGlsZHJlbiwgaW5kZXgpIHtcbiAgICAgIHdhcm5JZk5vdEh5ZHJhdGluZygpO1xuICAgICAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dElkO1xuICAgICAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dE92ZXJmbG93O1xuICAgICAgaWRTdGFja1tpZFN0YWNrSW5kZXgrK10gPSB0cmVlQ29udGV4dFByb3ZpZGVyO1xuICAgICAgdHJlZUNvbnRleHRQcm92aWRlciA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgdmFyIGJhc2VJZFdpdGhMZWFkaW5nQml0ID0gdHJlZUNvbnRleHRJZDtcbiAgICAgIHdvcmtJblByb2dyZXNzID0gdHJlZUNvbnRleHRPdmVyZmxvdztcbiAgICAgIHZhciBiYXNlTGVuZ3RoID0gMzIgLSBjbHozMihiYXNlSWRXaXRoTGVhZGluZ0JpdCkgLSAxO1xuICAgICAgYmFzZUlkV2l0aExlYWRpbmdCaXQgJj0gfigxIDw8IGJhc2VMZW5ndGgpO1xuICAgICAgaW5kZXggKz0gMTtcbiAgICAgIHZhciBsZW5ndGggPSAzMiAtIGNsejMyKHRvdGFsQ2hpbGRyZW4pICsgYmFzZUxlbmd0aDtcbiAgICAgIGlmICgzMCA8IGxlbmd0aCkge1xuICAgICAgICB2Y
15852XIgbnVtYmVyT2ZPdmVyZmxvd0JpdHMgPSBiYXNlTGVuZ3RoIC0gKGJhc2VMZW5ndGggJSA1KTtcbiAgICAgICAgbGVuZ3RoID0gKFxuICAgICAgICAgIGJhc2VJZFdpdGhMZWFkaW5nQml0ICZcbiAgICAgICAgICAoKDEgPDwgbnVtYmVyT2ZPdmVyZmxvd0JpdHMpIC0gMSlcbiAgICAgICAgKS50b1N0cmluZygzMik7XG4gICAgICAgIGJhc2VJZFdpdGhMZWFkaW5nQml0ID4+PSBudW1iZXJPZk92ZXJmbG93Qml0cztcbiAgICAgICAgYmFzZUxlbmd0aCAtPSBudW1iZXJPZk92ZXJmbG93Qml0cztcbiAgICAgICAgdHJlZUNvbnRleHRJZCA9XG4gICAgICAgICAgKDEgPDwgKDMyIC0gY2x6MzIodG90YWxDaGlsZHJlbikgKyBiYXNlTGVuZ3RoKSkgfFxuICAgICAgICAgIChpbmRleCA8PCBiYXNlTGVuZ3RoKSB8XG4gICAgICAgICAgYmFzZUlkV2l0aExlYWRpbmdCaXQ7XG4gICAgICAgIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSBsZW5ndGggKyB3b3JrSW5Qcm9ncmVzcztcbiAgICAgIH0gZWxzZVxuICAgICAgICAodHJlZUNvbnRleHRJZCA9XG4gICAgICAgICAgKDEgPDwgbGVuZ3RoKSB8IChpbmRleCA8PCBiYXNlTGVuZ3RoKSB8IGJhc2VJZFdpdGhMZWFkaW5nQml0KSxcbiAgICAgICAgICAodHJlZUNvbnRleHRPdmVyZmxvdyA9IHdvcmtJblByb2dyZXNzKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHVzaE1hdGVyaWFsaXplZFRyZWVJZCh3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgd2FybklmTm90SHlkcmF0aW5nKCk7XG4gICAgICBudWxsICE9PSB3b3JrSW5Qcm9ncmVzcy5yZXR1cm4gJiZcbiAgICAgICAgKHB1c2hUcmVlRm9yayh3b3JrSW5Qcm9ncmVzcywgMSksIHB1c2hUcmVlSWQod29ya0luUHJvZ3Jlc3MsIDEsIDApKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcG9wVHJlZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgIGZvciAoOyB3b3JrSW5Qcm9ncmVzcyA9PT0gdHJlZUZvcmtQcm92aWRlcjsgKVxuICAgICAgICAodHJlZUZvcmtQcm92aWRlciA9IGZvcmtTdGFja1stLWZvcmtTdGFja0luZGV4XSksXG4gICAgICAgICAgKGZvcmtTdGFja1tmb3JrU3RhY2tJbmRleF0gPSBudWxsKSxcbiAgICAgICAgICAodHJlZUZvcmtDb3VudCA9IGZvcmtTdGFja1stLWZvcmtTdGFja0luZGV4XSksXG4gICAgICAgICAgKGZvcmtTdGFja1tmb3JrU3RhY2tJbmRleF0gPSBudWxsKTtcbiAgICAgIGZvciAoOyB3b3JrSW5Qcm9ncmVzcyA9PT0gdHJlZUNvbnRleHRQcm92aWRlcjsgKVxuICAgICAgICAodHJlZUNvbnRleHRQcm92aWRlciA9IGlkU3RhY2tbLS1pZFN0YWNrSW5kZXhdKSxcbiAgICAgICAgICAoaWRTdGFja1tpZFN0YWNrSW5kZXhdID0gbnVsbCksXG4gICAgICAgICAgKHRyZWVDb250ZXh0T3ZlcmZsb3cgPSBpZFN0YWNrWy0taWRTdGFja0luZGV4XSksXG4gICAgICAgICAgKGlkU3RhY2tbaWRTdGFja0luZGV4XSA9IG51bGwpLFxuICAgICAgICAgICh0cmVlQ29udGV4dElkID0gaWRTdGFja1stLWlkU3RhY2tJbmRleF0pLFxuICAgICAgICAgIChpZFN0YWNrW2lkU3RhY2tJbmRleF0gPSBudWxsKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0U3VzcGVuZGVkVHJlZUNvbnRleHQoKSB7XG4gICAgICB3YXJuSWZOb3RIeWRyYXRpbmcoKTtcbiAgICAgIHJldHVybiBudWxsICE9PSB0cmVlQ29udGV4dFByb3ZpZGVyXG4gICAgICAgID8geyBpZDogdHJlZUNvbnRleHRJZCwgb3ZlcmZsb3c6IHRyZWVDb250ZXh0T3ZlcmZsb3cgfVxuICAgICAgICA6IG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlc3RvcmVTdXNwZW5kZWRUcmVlQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgc3VzcGVuZGVkQ29udGV4dCkge1xuICAgICAgd2FybklmTm90SHlkcmF0aW5nKCk7XG4gICAgICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0SWQ7XG4gICAgICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0T3ZlcmZsb3c7XG4gICAgICBpZFN0YWNrW2lkU3RhY2tJbmRleCsrXSA9IHRyZWVDb250ZXh0UHJvdmlkZXI7XG4gICAgICB0cmVlQ29udGV4dElkID0gc3VzcGVuZGVkQ29udGV4dC5pZDtcbiAgICAgIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSBzdXNwZW5kZWRDb250ZXh0Lm92ZXJmbG93O1xuICAgICAgdHJlZUNvbnRleHRQcm92aWRlciA9IHdvcmtJblByb2dyZXNzO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3YXJuSWZOb3RIeWRyYXRpbmcoKSB7XG4gICAgICBpc0h5ZHJhdGluZyB8fFxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiRXhwZWN0ZWQgdG8gYmUgaHlkcmF0aW5nLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIlxuICAgICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBidWlsZEh5ZHJhdGlvbkRpZmZOb2RlKGZpYmVyLCBkaXN0YW5jZUZyb21MZWFmKSB7XG4gICAgICBpZiAobnVsbCA9PT0gZmliZXIucmV0dXJuKSB7XG4gICAgICAgIGlmIChudWxsID09PSBoeWRyYXRpb25EaWZmUm9vdERFVilcbiAgICAgICAgICBoeWRyYXRpb25EaWZmUm9vdERFViA9IHtcbiAgICAgICAgICAgIGZpYmVyOiBmaWJlcixcbiAgICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgICAgIHNlcnZlclByb3BzOiB2b2lkIDAsXG4gICAgICAgICAgICBzZXJ2ZXJUYWlsOiBbXSxcbiAgICAgICAgICAgIGRpc3RhbmNlRnJvbUxlYWY6IGRpc3RhbmNlRnJvbUxlYWZcbiAgICAgICAgICB9O1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAoaHlkcmF0aW9uRGlmZlJvb3RERVYuZmliZXIgIT09IGZpYmVyKVxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgIFwiU2F3IG11bHRpcGxlIGh5ZHJhdGlvbiBkaWZmIHJvb3RzIGluIGEgcGFzcy4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC5cIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBoeWRyYXRpb25EaWZmUm9vdERFVi5kaXN0YW5jZUZyb21MZWFmID4gZGlzdGFuY2VGcm9tTGVhZiAmJlxuICAgICAgICAgICAgKGh5ZHJhdGlvbkRpZmZSb290REVWLmRpc3RhbmNlRnJvbUxlYWYgPSBkaXN0YW5jZUZyb21MZWFmKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaHlkcmF0aW9uRGlmZlJvb3RERVY7XG4gICAgICB9XG4gICAgICB2Y
15852XIgc2libGluZ3MgPSBidWlsZEh5ZHJhdGlvbkRpZmZOb2RlKFxuICAgICAgICBmaWJlci5yZXR1cm4sXG4gICAgICAgIGRpc3RhbmNlRnJvbUxlYWYgKyAxXG4gICAgICApLmNoaWxkcmVuO1xuICAgICAgaWYgKDAgPCBzaWJsaW5ncy5sZW5ndGggJiYgc2libGluZ3Nbc2libGluZ3MubGVuZ3RoIC0gMV0uZmliZXIgPT09IGZpYmVyKVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIChzaWJsaW5ncyA9IHNpYmxpbmdzW3NpYmxpbmdzLmxlbmd0aCAtIDFdKSxcbiAgICAgICAgICBzaWJsaW5ncy5kaXN0YW5jZUZyb21MZWFmID4gZGlzdGFuY2VGcm9tTGVhZiAmJlxuICAgICAgICAgICAgKHNpYmxpbmdzLmRpc3RhbmNlRnJvbUxlYWYgPSBkaXN0YW5jZUZyb21MZWFmKSxcbiAgICAgICAgICBzaWJsaW5nc1xuICAgICAgICApO1xuICAgICAgZGlzdGFuY2VGcm9tTGVhZiA9IHtcbiAgICAgICAgZmliZXI6IGZpYmVyLFxuICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgIHNlcnZlclByb3BzOiB2b2lkIDAsXG4gICAgICAgIHNlcnZlclRhaWw6IFtdLFxuICAgICAgICBkaXN0YW5jZUZyb21MZWFmOiBkaXN0YW5jZUZyb21MZWFmXG4gICAgICB9O1xuICAgICAgc2libGluZ3MucHVzaChkaXN0YW5jZUZyb21MZWFmKTtcbiAgICAgIHJldHVybiBkaXN0YW5jZUZyb21MZWFmO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3YXJuSWZIeWRyYXRpbmcoKSB7XG4gICAgICBpc0h5ZHJhdGluZyAmJlxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiV2Ugc2hvdWxkIG5vdCBiZSBoeWRyYXRpbmcgaGVyZS4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYSBidWcuXCJcbiAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gd2Fybk5vbkh5ZHJhdGVkSW5zdGFuY2UoZmliZXIsIHJlamVjdGVkQ2FuZGlkYXRlKSB7XG4gICAgICBkaWRTdXNwZW5kT3JFcnJvckRFViB8fFxuICAgICAgICAoKGZpYmVyID0gYnVpbGRIeWRyYXRpb25EaWZmTm9kZShmaWJlciwgMCkpLFxuICAgICAgICAoZmliZXIuc2VydmVyUHJvcHMgPSBudWxsKSxcbiAgICAgICAgbnVsbCAhPT0gcmVqZWN0ZWRDYW5kaWRhdGUgJiZcbiAgICAgICAgICAoKHJlamVjdGVkQ2FuZGlkYXRlID1cbiAgICAgICAgICAgIGRlc2NyaWJlSHlkcmF0YWJsZUluc3RhbmNlRm9yRGV2V2FybmluZ3MocmVqZWN0ZWRDYW5kaWRhdGUpKSxcbiAgICAgICAgICBmaWJlci5zZXJ2ZXJUYWlsLnB1c2gocmVqZWN0ZWRDYW5kaWRhdGUpKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93T25IeWRyYXRpb25NaXNtYXRjaChmaWJlcikge1xuICAgICAgdmFyIGZyb21UZXh0ID1cbiAgICAgICAgICAxIDwgYXJndW1lbnRzLmxlbmd0aCAmJiB2b2lkIDAgIT09IGFyZ3VtZW50c1sxXSA/IGFyZ3VtZW50c1sxXSA6ICExLFxuICAgICAgICBkaWZmID0gXCJcIixcbiAgICAgICAgZGlmZlJvb3QgPSBoeWRyYXRpb25EaWZmUm9vdERFVjtcbiAgICAgIG51bGwgIT09IGRpZmZSb290ICYmXG4gICAgICAgICgoaHlkcmF0aW9uRGlmZlJvb3RERVYgPSBudWxsKSwgKGRpZmYgPSBkZXNjcmliZURpZmYoZGlmZlJvb3QpKSk7XG4gICAgICBxdWV1ZUh5ZHJhdGlvbkVycm9yKFxuICAgICAgICBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcihcbiAgICAgICAgICBFcnJvcihcbiAgICAgICAgICAgIFwiSHlkcmF0aW9uIGZhaWxlZCBiZWNhdXNlIHRoZSBzZXJ2ZXIgcmVuZGVyZWQgXCIgK1xuICAgICAgICAgICAgICAoZnJvbVRleHQgPyBcInRleHRcIiA6IFwiSFRNTFwiKSArXG4gICAgICAgICAgICAgIFwiIGRpZG4ndCBtYXRjaCB0aGUgY2xpZW50LiBBcyBhIHJlc3VsdCB0aGlzIHRyZWUgd2lsbCBiZSByZWdlbmVyYXRlZCBvbiB0aGUgY2xpZW50LiBUaGlzIGNhbiBoYXBwZW4gaWYgYSBTU1ItZWQgQ2xpZW50IENvbXBvbmVudCB1c2VkOlxcblxcbi0gQSBzZXJ2ZXIvY2xpZW50IGJyYW5jaCBgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKWAuXFxuLSBWYXJpYWJsZSBpbnB1dCBzdWNoIGFzIGBEYXRlLm5vdygpYCBvciBgTWF0aC5yYW5kb20oKWAgd2hpY2ggY2hhbmdlcyBlYWNoIHRpbWUgaXQncyBjYWxsZWQuXFxuLSBEYXRlIGZvcm1hdHRpbmcgaW4gYSB1c2VyJ3MgbG9jYWxlIHdoaWNoIGRvZXNuJ3QgbWF0Y2ggdGhlIHNlcnZlci5cXG4tIEV4dGVybmFsIGNoYW5naW5nIGRhdGEgd2l0aG91dCBzZW5kaW5nIGEgc25hcHNob3Qgb2YgaXQgYWxvbmcgd2l0aCB0aGUgSFRNTC5cXG4tIEludmFsaWQgSFRNTCB0YWcgbmVzdGluZy5cXG5cXG5JdCBjYW4gYWxzbyBoYXBwZW4gaWYgdGhlIGNsaWVudCBoYXMgYSBicm93c2VyIGV4dGVuc2lvbiBpbnN0YWxsZWQgd2hpY2ggbWVzc2VzIHdpdGggdGhlIEhUTUwgYmVmb3JlIFJlYWN0IGxvYWRlZC5cXG5cXG5odHRwczovL3JlYWN0LmRldi9saW5rL2h5ZHJhdGlvbi1taXNtYXRjaFwiICtcbiAgICAgICAgICAgICAgZGlmZlxuICAgICAgICAgICksXG4gICAgICAgICAgZmliZXJcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHRocm93IEh5ZHJhdGlvbk1pc21hdGNoRXhjZXB0aW9uO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwcmVwYXJlVG9IeWRyYXRlSG9zdEluc3RhbmNlKGZpYmVyKSB7XG4gICAgICB2Y
15852XIgZGlkSHlkcmF0ZSA9IGZpYmVyLnN0YXRlTm9kZTtcbiAgICAgIHZhciB0eXBlID0gZmliZXIudHlwZSxcbiAgICAgICAgcHJvcHMgPSBmaWJlci5tZW1vaXplZFByb3BzO1xuICAgICAgZGlkSHlkcmF0ZVtpbnRlcm5hbEluc3RhbmNlS2V5XSA9IGZpYmVyO1xuICAgICAgZGlkSHlkcmF0ZVtpbnRlcm5hbFByb3BzS2V5XSA9IHByb3BzO1xuICAgICAgdmFsaWRhdGVQcm9wZXJ0aWVzSW5EZXZlbG9wbWVudCh0eXBlLCBwcm9wcyk7XG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBcImRpYWxvZ1wiOlxuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJjYW5jZWxcIiwgZGlkSHlkcmF0ZSk7XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcImNsb3NlXCIsIGRpZEh5ZHJhdGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiaWZyYW1lXCI6XG4gICAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgY2FzZSBcImVtYmVkXCI6XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcImxvYWRcIiwgZGlkSHlkcmF0ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJ2aWRlb1wiOlxuICAgICAgICBjYXNlIFwiYXVkaW9cIjpcbiAgICAgICAgICBmb3IgKHR5cGUgPSAwOyB0eXBlIDwgbWVkaWFFdmVudFR5cGVzLmxlbmd0aDsgdHlwZSsrKVxuICAgICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChtZWRpYUV2ZW50VHlwZXNbdHlwZV0sIGRpZEh5ZHJhdGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwic291cmNlXCI6XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcImVycm9yXCIsIGRpZEh5ZHJhdGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiaW1nXCI6XG4gICAgICAgIGNhc2UgXCJpbWFnZVwiOlxuICAgICAgICBjYXNlIFwibGlua1wiOlxuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJlcnJvclwiLCBkaWRIeWRyYXRlKTtcbiAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KFwibG9hZFwiLCBkaWRIeWRyYXRlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImRldGFpbHNcIjpcbiAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KFwidG9nZ2xlXCIsIGRpZEh5ZHJhdGUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiaW5wdXRcIjpcbiAgICAgICAgICBjaGVja0NvbnRyb2xsZWRWYWx1ZVByb3BzKFwiaW5wdXRcIiwgcHJvcHMpO1xuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJpbnZhbGlkXCIsIGRpZEh5ZHJhdGUpO1xuICAgICAgICAgIHZhbGlkYXRlSW5wdXRQcm9wcyhkaWRIeWRyYXRlLCBwcm9wcyk7XG4gICAgICAgICAgaW5pdElucHV0KFxuICAgICAgICAgICAgZGlkSHlkcmF0ZSxcbiAgICAgICAgICAgIHByb3BzLnZhbHVlLFxuICAgICAgICAgICAgcHJvcHMuZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgcHJvcHMuY2hlY2tlZCxcbiAgICAgICAgICAgIHByb3BzLmRlZmF1bHRDaGVja2VkLFxuICAgICAgICAgICAgcHJvcHMudHlwZSxcbiAgICAgICAgICAgIHByb3BzLm5hbWUsXG4gICAgICAgICAgICAhMFxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJvcHRpb25cIjpcbiAgICAgICAgICB2YWxpZGF0ZU9wdGlvblByb3BzKGRpZEh5ZHJhdGUsIHByb3BzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInNlbGVjdFwiOlxuICAgICAgICAgIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHMoXCJzZWxlY3RcIiwgcHJvcHMpO1xuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJpbnZhbGlkXCIsIGRpZEh5ZHJhdGUpO1xuICAgICAgICAgIHZhbGlkYXRlU2VsZWN0UHJvcHMoZGlkSHlkcmF0ZSwgcHJvcHMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwidGV4dGFyZWFcIjpcbiAgICAgICAgICBjaGVja0NvbnRyb2xsZWRWYWx1ZVByb3BzKFwidGV4dGFyZWFcIiwgcHJvcHMpLFxuICAgICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcImludmFsaWRcIiwgZGlkSHlkcmF0ZSksXG4gICAgICAgICAgICB2YWxpZGF0ZVRleHRhcmVhUHJvcHMoZGlkSHlkcmF0ZSwgcHJvcHMpLFxuICAgICAgICAgICAgaW5pdFRleHRhcmVhKFxuICAgICAgICAgICAgICBkaWRIeWRyYXRlLFxuICAgICAgICAgICAgICBwcm9wcy52YWx1ZSxcbiAgICAgICAgICAgICAgcHJvcHMuZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgICBwcm9wcy5jaGlsZHJlblxuICAgICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHR5cGUgPSBwcm9wcy5jaGlsZHJlbjtcbiAgICAgIChcInN0cmluZ1wiICE9PSB0eXBlb2YgdHlwZSAmJlxuICAgICAgICBcIm51bWJlclwiICE9PSB0eXBlb2YgdHlwZSAmJlxuICAgICAgICBcImJpZ2ludFwiICE9PSB0eXBlb2YgdHlwZSkgfHxcbiAgICAgIGRpZEh5ZHJhdGUudGV4dENvbnRlbnQgPT09IFwiXCIgKyB0eXBlIHx8XG4gICAgICAhMCA9PT0gcHJvcHMuc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIHx8XG4gICAgICBjaGVja0ZvclVubWF0Y2hlZFRleHQoZGlkSHlkcmF0ZS50ZXh0Q29udGVudCwgdHlwZSlcbiAgICAgICAgPyAobnVsbCAhPSBwcm9wcy5wb3BvdmVyICYmXG4gICAgICAgICAgICAobGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcImJlZm9yZXRvZ2dsZVwiLCBkaWRIeWRyYXRlKSxcbiAgICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJ0b2dnbGVcIiwgZGlkSHlkcmF0ZSkpLFxuICAgICAgICAgIG51bGwgIT0gcHJvcHMub25TY3JvbGwgJiZcbiAgICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJzY3JvbGxcIiwgZGlkSHlkcmF0ZSksXG4gICAgICAgICAgbnVsbCAhPSBwcm9wcy5vblNjcm9sbEVuZCAmJlxuICAgICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcInNjcm9sbGVuZFwiLCBkaWRIeWRyYXRlKSxcbiAgICAgICAgICBudWxsICE9IHByb3BzLm9uQ2xpY2sgJiYgKGRpZEh5ZHJhdGUub25jbGljayA9IG5vb3AkMSksXG4gICAgICAgICAgKGRpZEh5ZHJhdGUgPSAhMCkpXG4gICAgICAgIDogKGRpZEh5ZHJhdGUgPSAhMSk7XG4gICAgICBkaWRIeWRyYXRlIHx8IHRocm93T25IeWRyYXRpb25NaXNtYXRjaChmaWJlciwgITApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwb3BUb05leHRIb3N0UGFyZW50KGZpYmVyKSB7XG4gICAgICBmb3IgKGh5ZHJhdGlvblBhcmVudEZpYmVyID0gZmliZXIucmV0dXJuOyBoeWRyYXRpb25QYXJlbnRGaWJlcjsgKVxuICAgICAgICBzd2l0Y2ggKGh5ZHJhdGlvblBhcmVudEZpYmVyLnRhZykge1xuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBjYXNlIDMxOlxuICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICByb290T3JTaW5nbGV0b25Db250ZXh0ID0gITE7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgY2FzZSAyNzpcbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICByb290T3JTaW5nbGV0b25Db250ZXh0ID0gITA7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGh5ZHJhdGlvblBhcmVudEZpYmVyID0gaHlkcmF0aW9uUGFyZW50RmliZXIucmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBvcEh5ZHJhdGlvblN0YXRlKGZpYmVyKSB7XG4gICAgICBpZiAoZmliZXIgIT09IGh5ZHJhdGlvblBhcmVudEZpYmVyKSByZXR1cm4gITE7XG4gICAgICBpZiAoIWlzSHlkcmF0aW5nKVxuICAgICAgICByZXR1cm4gcG9wVG9OZXh0SG9zdFBhcmVudChmaWJlciksIChpc0h5ZHJhdGluZyA9ICEwKSwgITE7XG4gICAgICB2Y
15852XIgdGFnID0gZmliZXIudGFnLFxuICAgICAgICBKU0NvbXBpbGVyX3RlbXA7XG4gICAgICBpZiAoKEpTQ29tcGlsZXJfdGVtcCA9IDMgIT09IHRhZyAmJiAyNyAhPT0gdGFnKSkge1xuICAgICAgICBpZiAoKEpTQ29tcGlsZXJfdGVtcCA9IDUgPT09IHRhZykpXG4gICAgICAgICAgKEpTQ29tcGlsZXJfdGVtcCA9IGZpYmVyLnR5cGUpLFxuICAgICAgICAgICAgKEpTQ29tcGlsZXJfdGVtcCA9XG4gICAgICAgICAgICAgICEoXCJmb3JtXCIgIT09IEpTQ29tcGlsZXJfdGVtcCAmJiBcImJ1dHRvblwiICE9PSBKU0NvbXBpbGVyX3RlbXApIHx8XG4gICAgICAgICAgICAgIHNob3VsZFNldFRleHRDb250ZW50KGZpYmVyLnR5cGUsIGZpYmVyLm1lbW9pemVkUHJvcHMpKTtcbiAgICAgICAgSlNDb21waWxlcl90ZW1wID0gIUpTQ29tcGlsZXJfdGVtcDtcbiAgICAgIH1cbiAgICAgIGlmIChKU0NvbXBpbGVyX3RlbXAgJiYgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSkge1xuICAgICAgICBmb3IgKEpTQ29tcGlsZXJfdGVtcCA9IG5leHRIeWRyYXRhYmxlSW5zdGFuY2U7IEpTQ29tcGlsZXJfdGVtcDsgKSB7XG4gICAgICAgICAgdmFyIGRpZmZOb2RlID0gYnVpbGRIeWRyYXRpb25EaWZmTm9kZShmaWJlciwgMCksXG4gICAgICAgICAgICBkZXNjcmlwdGlvbiA9XG4gICAgICAgICAgICAgIGRlc2NyaWJlSHlkcmF0YWJsZUluc3RhbmNlRm9yRGV2V2FybmluZ3MoSlNDb21waWxlcl90ZW1wKTtcbiAgICAgICAgICBkaWZmTm9kZS5zZXJ2ZXJUYWlsLnB1c2goZGVzY3JpcHRpb24pO1xuICAgICAgICAgIEpTQ29tcGlsZXJfdGVtcCA9XG4gICAgICAgICAgICBcIlN1c3BlbnNlXCIgPT09IGRlc2NyaXB0aW9uLnR5cGVcbiAgICAgICAgICAgICAgPyBnZXROZXh0SHlkcmF0YWJsZUluc3RhbmNlQWZ0ZXJIeWRyYXRpb25Cb3VuZGFyeShKU0NvbXBpbGVyX3RlbXApXG4gICAgICAgICAgICAgIDogZ2V0TmV4dEh5ZHJhdGFibGUoSlNDb21waWxlcl90ZW1wLm5leHRTaWJsaW5nKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvd09uSHlkcmF0aW9uTWlzbWF0Y2goZmliZXIpO1xuICAgICAgfVxuICAgICAgcG9wVG9OZXh0SG9zdFBhcmVudChmaWJlcik7XG4gICAgICBpZiAoMTMgPT09IHRhZykge1xuICAgICAgICBmaWJlciA9IGZpYmVyLm1lbW9pemVkU3RhdGU7XG4gICAgICAgIGZpYmVyID0gbnVsbCAhPT0gZmliZXIgPyBmaWJlci5kZWh5ZHJhdGVkIDogbnVsbDtcbiAgICAgICAgaWYgKCFmaWJlcilcbiAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgIFwiRXhwZWN0ZWQgdG8gaGF2ZSBhIGh5ZHJhdGVkIHN1c3BlbnNlIGluc3RhbmNlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiXG4gICAgICAgICAgKTtcbiAgICAgICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9XG4gICAgICAgICAgZ2V0TmV4dEh5ZHJhdGFibGVJbnN0YW5jZUFmdGVySHlkcmF0aW9uQm91bmRhcnkoZmliZXIpO1xuICAgICAgfSBlbHNlIGlmICgzMSA9PT0gdGFnKSB7XG4gICAgICAgIGZpYmVyID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgZmliZXIgPSBudWxsICE9PSBmaWJlciA/IGZpYmVyLmRlaHlkcmF0ZWQgOiBudWxsO1xuICAgICAgICBpZiAoIWZpYmVyKVxuICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgXCJFeHBlY3RlZCB0byBoYXZlIGEgaHlkcmF0ZWQgc3VzcGVuc2UgaW5zdGFuY2UuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCJcbiAgICAgICAgICApO1xuICAgICAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID1cbiAgICAgICAgICBnZXROZXh0SHlkcmF0YWJsZUluc3RhbmNlQWZ0ZXJIeWRyYXRpb25Cb3VuZGFyeShmaWJlcik7XG4gICAgICB9IGVsc2VcbiAgICAgICAgMjcgPT09IHRhZ1xuICAgICAgICAgID8gKCh0YWcgPSBuZXh0SHlkcmF0YWJsZUluc3RhbmNlKSxcbiAgICAgICAgICAgIGlzU2luZ2xldG9uU2NvcGUoZmliZXIudHlwZSlcbiAgICAgICAgICAgICAgPyAoKGZpYmVyID0gcHJldmlvdXNIeWRyYXRhYmxlT25FbnRlcmluZ1Njb3BlZFNpbmdsZXRvbiksXG4gICAgICAgICAgICAgICAgKHByZXZpb3VzSHlkcmF0YWJsZU9uRW50ZXJpbmdTY29wZWRTaW5nbGV0b24gPSBudWxsKSxcbiAgICAgICAgICAgICAgICAobmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IGZpYmVyKSlcbiAgICAgICAgICAgICAgOiAobmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IHRhZykpXG4gICAgICAgICAgOiAobmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IGh5ZHJhdGlvblBhcmVudEZpYmVyXG4gICAgICAgICAgICAgID8gZ2V0TmV4dEh5ZHJhdGFibGUoZmliZXIuc3RhdGVOb2RlLm5leHRTaWJsaW5nKVxuICAgICAgICAgICAgICA6IG51bGwpO1xuICAgICAgcmV0dXJuICEwO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXNldEh5ZHJhdGlvblN0YXRlKCkge1xuICAgICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IGh5ZHJhdGlvblBhcmVudEZpYmVyID0gbnVsbDtcbiAgICAgIGRpZFN1c3BlbmRPckVycm9yREVWID0gaXNIeWRyYXRpbmcgPSAhMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBncmFkZUh5ZHJhdGlvbkVycm9yc1RvUmVjb3ZlcmFibGUoKSB7XG4gICAgICB2Y
15852XIgcXVldWVkRXJyb3JzID0gaHlkcmF0aW9uRXJyb3JzO1xuICAgICAgbnVsbCAhPT0gcXVldWVkRXJyb3JzICYmXG4gICAgICAgIChudWxsID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9yc1xuICAgICAgICAgID8gKHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID0gcXVldWVkRXJyb3JzKVxuICAgICAgICAgIDogd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMucHVzaC5hcHBseShcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsXG4gICAgICAgICAgICAgIHF1ZXVlZEVycm9yc1xuICAgICAgICAgICAgKSxcbiAgICAgICAgKGh5ZHJhdGlvbkVycm9ycyA9IG51bGwpKTtcbiAgICAgIHJldHVybiBxdWV1ZWRFcnJvcnM7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHF1ZXVlSHlkcmF0aW9uRXJyb3IoZXJyb3IpIHtcbiAgICAgIG51bGwgPT09IGh5ZHJhdGlvbkVycm9yc1xuICAgICAgICA/IChoeWRyYXRpb25FcnJvcnMgPSBbZXJyb3JdKVxuICAgICAgICA6IGh5ZHJhdGlvbkVycm9ycy5wdXNoKGVycm9yKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZW1pdFBlbmRpbmdIeWRyYXRpb25XYXJuaW5ncygpIHtcbiAgICAgIHZhciBkaWZmUm9vdCA9IGh5ZHJhdGlvbkRpZmZSb290REVWO1xuICAgICAgaWYgKG51bGwgIT09IGRpZmZSb290KSB7XG4gICAgICAgIGh5ZHJhdGlvbkRpZmZSb290REVWID0gbnVsbDtcbiAgICAgICAgZm9yICh2YXIgZGlmZiA9IGRlc2NyaWJlRGlmZihkaWZmUm9vdCk7IDAgPCBkaWZmUm9vdC5jaGlsZHJlbi5sZW5ndGg7IClcbiAgICAgICAgICBkaWZmUm9vdCA9IGRpZmZSb290LmNoaWxkcmVuWzBdO1xuICAgICAgICBydW5XaXRoRmliZXJJbkRFVihkaWZmUm9vdC5maWJlciwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIkEgdHJlZSBoeWRyYXRlZCBidXQgc29tZSBhdHRyaWJ1dGVzIG9mIHRoZSBzZXJ2ZXIgcmVuZGVyZWQgSFRNTCBkaWRuJ3QgbWF0Y2ggdGhlIGNsaWVudCBwcm9wZXJ0aWVzLiBUaGlzIHdvbid0IGJlIHBhdGNoZWQgdXAuIFRoaXMgY2FuIGhhcHBlbiBpZiBhIFNTUi1lZCBDbGllbnQgQ29tcG9uZW50IHVzZWQ6XFxuXFxuLSBBIHNlcnZlci9jbGllbnQgYnJhbmNoIGBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpYC5cXG4tIFZhcmlhYmxlIGlucHV0IHN1Y2ggYXMgYERhdGUubm93KClgIG9yIGBNYXRoLnJhbmRvbSgpYCB3aGljaCBjaGFuZ2VzIGVhY2ggdGltZSBpdCdzIGNhbGxlZC5cXG4tIERhdGUgZm9ybWF0dGluZyBpbiBhIHVzZXIncyBsb2NhbGUgd2hpY2ggZG9lc24ndCBtYXRjaCB0aGUgc2VydmVyLlxcbi0gRXh0ZXJuYWwgY2hhbmdpbmcgZGF0YSB3aXRob3V0IHNlbmRpbmcgYSBzbmFwc2hvdCBvZiBpdCBhbG9uZyB3aXRoIHRoZSBIVE1MLlxcbi0gSW52YWxpZCBIVE1MIHRhZyBuZXN0aW5nLlxcblxcbkl0IGNhbiBhbHNvIGhhcHBlbiBpZiB0aGUgY2xpZW50IGhhcyBhIGJyb3dzZXIgZXh0ZW5zaW9uIGluc3RhbGxlZCB3aGljaCBtZXNzZXMgd2l0aCB0aGUgSFRNTCBiZWZvcmUgUmVhY3QgbG9hZGVkLlxcblxcbiVzJXNcIixcbiAgICAgICAgICAgIFwiaHR0cHM6Ly9yZWFjdC5kZXYvbGluay9oeWRyYXRpb24tbWlzbWF0Y2hcIixcbiAgICAgICAgICAgIGRpZmZcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCkge1xuICAgICAgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIkMSA9IG51bGw7XG4gICAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gITE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHB1c2hQcm92aWRlcihwcm92aWRlckZpYmVyLCBjb250ZXh0LCBuZXh0VmFsdWUpIHtcbiAgICAgIHB1c2godmFsdWVDdXJzb3IsIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSwgcHJvdmlkZXJGaWJlcik7XG4gICAgICBjb250ZXh0Ll9jdXJyZW50VmFsdWUgPSBuZXh0VmFsdWU7XG4gICAgICBwdXNoKHJlbmRlcmVyQ3Vyc29yREVWLCBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIsIHByb3ZpZGVyRmliZXIpO1xuICAgICAgdm9pZCAwICE9PSBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgJiZcbiAgICAgICAgbnVsbCAhPT0gY29udGV4dC5fY3VycmVudFJlbmRlcmVyICYmXG4gICAgICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciAhPT0gcmVuZGVyZXJTaWdpbCAmJlxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiRGV0ZWN0ZWQgbXVsdGlwbGUgcmVuZGVyZXJzIGNvbmN1cnJlbnRseSByZW5kZXJpbmcgdGhlIHNhbWUgY29udGV4dCBwcm92aWRlci4gVGhpcyBpcyBjdXJyZW50bHkgdW5zdXBwb3J0ZWQuXCJcbiAgICAgICAgKTtcbiAgICAgIGNvbnRleHQuX2N1cnJlbnRSZW5kZXJlciA9IHJlbmRlcmVyU2lnaWw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBvcFByb3ZpZGVyKGNvbnRleHQsIHByb3ZpZGVyRmliZXIpIHtcbiAgICAgIGNvbnRleHQuX2N1cnJlbnRWYWx1ZSA9IHZhbHVlQ3Vyc29yLmN1cnJlbnQ7XG4gICAgICB2Y
15852XIgY3VycmVudFJlbmRlcmVyID0gcmVuZGVyZXJDdXJzb3JERVYuY3VycmVudDtcbiAgICAgIHBvcChyZW5kZXJlckN1cnNvckRFViwgcHJvdmlkZXJGaWJlcik7XG4gICAgICBjb250ZXh0Ll9jdXJyZW50UmVuZGVyZXIgPSBjdXJyZW50UmVuZGVyZXI7XG4gICAgICBwb3AodmFsdWVDdXJzb3IsIHByb3ZpZGVyRmliZXIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzY2hlZHVsZUNvbnRleHRXb3JrT25QYXJlbnRQYXRoKFxuICAgICAgcGFyZW50LFxuICAgICAgcmVuZGVyTGFuZXMsXG4gICAgICBwcm9wYWdhdGlvblJvb3RcbiAgICApIHtcbiAgICAgIGZvciAoOyBudWxsICE9PSBwYXJlbnQ7ICkge1xuICAgICAgICB2YXIgYWx0ZXJuYXRlID0gcGFyZW50LmFsdGVybmF0ZTtcbiAgICAgICAgKHBhcmVudC5jaGlsZExhbmVzICYgcmVuZGVyTGFuZXMpICE9PSByZW5kZXJMYW5lc1xuICAgICAgICAgID8gKChwYXJlbnQuY2hpbGRMYW5lcyB8PSByZW5kZXJMYW5lcyksXG4gICAgICAgICAgICBudWxsICE9PSBhbHRlcm5hdGUgJiYgKGFsdGVybmF0ZS5jaGlsZExhbmVzIHw9IHJlbmRlckxhbmVzKSlcbiAgICAgICAgICA6IG51bGwgIT09IGFsdGVybmF0ZSAmJlxuICAgICAgICAgICAgKGFsdGVybmF0ZS5jaGlsZExhbmVzICYgcmVuZGVyTGFuZXMpICE9PSByZW5kZXJMYW5lcyAmJlxuICAgICAgICAgICAgKGFsdGVybmF0ZS5jaGlsZExhbmVzIHw9IHJlbmRlckxhbmVzKTtcbiAgICAgICAgaWYgKHBhcmVudCA9PT0gcHJvcGFnYXRpb25Sb290KSBicmVhaztcbiAgICAgICAgcGFyZW50ID0gcGFyZW50LnJldHVybjtcbiAgICAgIH1cbiAgICAgIHBhcmVudCAhPT0gcHJvcGFnYXRpb25Sb290ICYmXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJFeHBlY3RlZCB0byBmaW5kIHRoZSBwcm9wYWdhdGlvbiByb290IHdoZW4gc2NoZWR1bGluZyBjb250ZXh0IHdvcmsuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCJcbiAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHJvcGFnYXRlQ29udGV4dENoYW5nZXMoXG4gICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgIGNvbnRleHRzLFxuICAgICAgcmVuZGVyTGFuZXMsXG4gICAgICBmb3JjZVByb3BhZ2F0ZUVudGlyZVRyZWVcbiAgICApIHtcbiAgICAgIHZhciBmaWJlciA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgbnVsbCAhPT0gZmliZXIgJiYgKGZpYmVyLnJldHVybiA9IHdvcmtJblByb2dyZXNzKTtcbiAgICAgIGZvciAoOyBudWxsICE9PSBmaWJlcjsgKSB7XG4gICAgICAgIHZhciBsaXN0ID0gZmliZXIuZGVwZW5kZW5jaWVzO1xuICAgICAgICBpZiAobnVsbCAhPT0gbGlzdCkge1xuICAgICAgICAgIHZhciBuZXh0RmliZXIgPSBmaWJlci5jaGlsZDtcbiAgICAgICAgICBsaXN0ID0gbGlzdC5maXJzdENvbnRleHQ7XG4gICAgICAgICAgYTogZm9yICg7IG51bGwgIT09IGxpc3Q7ICkge1xuICAgICAgICAgICAgdmFyIGRlcGVuZGVuY3kgPSBsaXN0O1xuICAgICAgICAgICAgbGlzdCA9IGZpYmVyO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250ZXh0cy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgaWYgKGRlcGVuZGVuY3kuY29udGV4dCA9PT0gY29udGV4dHNbaV0pIHtcbiAgICAgICAgICAgICAgICBsaXN0LmxhbmVzIHw9IHJlbmRlckxhbmVzO1xuICAgICAgICAgICAgICAgIGRlcGVuZGVuY3kgPSBsaXN0LmFsdGVybmF0ZTtcbiAgICAgICAgICAgICAgICBudWxsICE9PSBkZXBlbmRlbmN5ICYmIChkZXBlbmRlbmN5LmxhbmVzIHw9IHJlbmRlckxhbmVzKTtcbiAgICAgICAgICAgICAgICBzY2hlZHVsZUNvbnRleHRXb3JrT25QYXJlbnRQYXRoKFxuICAgICAgICAgICAgICAgICAgbGlzdC5yZXR1cm4sXG4gICAgICAgICAgICAgICAgICByZW5kZXJMYW5lcyxcbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBmb3JjZVByb3BhZ2F0ZUVudGlyZVRyZWUgfHwgKG5leHRGaWJlciA9IG51bGwpO1xuICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxpc3QgPSBkZXBlbmRlbmN5Lm5leHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKDE4ID09PSBmaWJlci50YWcpIHtcbiAgICAgICAgICBuZXh0RmliZXIgPSBmaWJlci5yZXR1cm47XG4gICAgICAgICAgaWYgKG51bGwgPT09IG5leHRGaWJlcilcbiAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICBcIldlIGp1c3QgY2FtZSBmcm9tIGEgcGFyZW50IHNvIHdlIG11c3QgaGF2ZSBoYWQgYSBwYXJlbnQuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgbmV4dEZpYmVyLmxhbmVzIHw9IHJlbmRlckxhbmVzO1xuICAgICAgICAgIGxpc3QgPSBuZXh0RmliZXIuYWx0ZXJuYXRlO1xuICAgICAgICAgIG51bGwgIT09IGxpc3QgJiYgKGxpc3QubGFuZXMgfD0gcmVuZGVyTGFuZXMpO1xuICAgICAgICAgIHNjaGVkdWxlQ29udGV4dFdvcmtPblBhcmVudFBhdGgoXG4gICAgICAgICAgICBuZXh0RmliZXIsXG4gICAgICAgICAgICByZW5kZXJMYW5lcyxcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzXG4gICAgICAgICAgKTtcbiAgICAgICAgICBuZXh0RmliZXIgPSBudWxsO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAxMyA9PT0gZmliZXIudGFnICYmXG4gICAgICAgICAgbnVsbCAhPT0gZmliZXIubWVtb2l6ZWRTdGF0ZSAmJlxuICAgICAgICAgIG51bGwgPT09IGZpYmVyLm1lbW9pemVkU3RhdGUuZGVoeWRyYXRlZFxuICAgICAgICAgICAgPyAoKGZpYmVyLmxhbmVzIHw9IHJlbmRlckxhbmVzKSxcbiAgICAgICAgICAgICAgKG5leHRGaWJlciA9IGZpYmVyLmFsdGVybmF0ZSksXG4gICAgICAgICAgICAgIG51bGwgIT09IG5leHRGaWJlciAmJiAobmV4dEZpYmVyLmxhbmVzIHw9IHJlbmRlckxhbmVzKSxcbiAgICAgICAgICAgICAgc2NoZWR1bGVDb250ZXh0V29ya09uUGFyZW50UGF0aChcbiAgICAgICAgICAgICAgICBmaWJlci5yZXR1cm4sXG4gICAgICAgICAgICAgICAgcmVuZGVyTGFuZXMsXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKG5leHRGaWJlciA9IGZpYmVyLmNoaWxkKSxcbiAgICAgICAgICAgICAgKG5leHRGaWJlciA9IG51bGwgIT09IG5leHRGaWJlciA/IG5leHRGaWJlci5zaWJsaW5nIDogbnVsbCkpXG4gICAgICAgICAgICA6IChuZXh0RmliZXIgPSBmaWJlci5jaGlsZCk7XG4gICAgICAgIGlmIChudWxsICE9PSBuZXh0RmliZXIpIG5leHRGaWJlci5yZXR1cm4gPSBmaWJlcjtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGZvciAobmV4dEZpYmVyID0gZmliZXI7IG51bGwgIT09IG5leHRGaWJlcjsgKSB7XG4gICAgICAgICAgICBpZiAobmV4dEZpYmVyID09PSB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgICAgICAgICBuZXh0RmliZXIgPSBudWxsO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgI
15852H1cbiAgICAgICAgICAgIGZpYmVyID0gbmV4dEZpYmVyLnNpYmxpbmc7XG4gICAgICAgICAgICBpZiAobnVsbCAhPT0gZmliZXIpIHtcbiAgICAgICAgICAgICAgZmliZXIucmV0dXJuID0gbmV4dEZpYmVyLnJldHVybjtcbiAgICAgICAgICAgICAgbmV4dEZpYmVyID0gZmliZXI7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV4dEZpYmVyID0gbmV4dEZpYmVyLnJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIGZpYmVyID0gbmV4dEZpYmVyO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBwcm9wYWdhdGVQYXJlbnRDb250ZXh0Q2hhbmdlcyhcbiAgICAgIGN1cnJlbnQsXG4gICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgIHJlbmRlckxhbmVzLFxuICAgICAgZm9yY2VQcm9wYWdhdGVFbnRpcmVUcmVlXG4gICAgKSB7XG4gICAgICBjdXJyZW50ID0gbnVsbDtcbiAgICAgIGZvciAoXG4gICAgICAgIHZhciBwYXJlbnQgPSB3b3JrSW5Qcm9ncmVzcywgaXNJbnNpZGVQcm9wYWdhdGlvbkJhaWxvdXQgPSAhMTtcbiAgICAgICAgbnVsbCAhPT0gcGFyZW50O1xuXG4gICAgICApIHtcbiAgICAgICAgaWYgKCFpc0luc2lkZVByb3BhZ2F0aW9uQmFpbG91dClcbiAgICAgICAgICBpZiAoMCAhPT0gKHBhcmVudC5mbGFncyAmIDUyNDI4OCkpIGlzSW5zaWRlUHJvcGFnYXRpb25CYWlsb3V0ID0gITA7XG4gICAgICAgICAgZWxzZSBpZiAoMCAhPT0gKHBhcmVudC5mbGFncyAmIDI2MjE0NCkpIGJyZWFrO1xuICAgICAgICBpZiAoMTAgPT09IHBhcmVudC50YWcpIHtcbiAgICAgICAgICB2Y
15852XIgY3VycmVudFBhcmVudCA9IHBhcmVudC5hbHRlcm5hdGU7XG4gICAgICAgICAgaWYgKG51bGwgPT09IGN1cnJlbnRQYXJlbnQpXG4gICAgICAgICAgICB0aHJvdyBFcnJvcihcIlNob3VsZCBoYXZlIGEgY3VycmVudCBmaWJlci4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC5cIik7XG4gICAgICAgICAgY3VycmVudFBhcmVudCA9IGN1cnJlbnRQYXJlbnQubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICBpZiAobnVsbCAhPT0gY3VycmVudFBhcmVudCkge1xuICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBwYXJlbnQudHlwZTtcbiAgICAgICAgICAgIG9iamVjdElzKHBhcmVudC5wZW5kaW5nUHJvcHMudmFsdWUsIGN1cnJlbnRQYXJlbnQudmFsdWUpIHx8XG4gICAgICAgICAgICAgIChudWxsICE9PSBjdXJyZW50XG4gICAgICAgICAgICAgICAgPyBjdXJyZW50LnB1c2goY29udGV4dClcbiAgICAgICAgICAgICAgICA6IChjdXJyZW50ID0gW2NvbnRleHRdKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHBhcmVudCA9PT0gaG9zdFRyYW5zaXRpb25Qcm92aWRlckN1cnNvci5jdXJyZW50KSB7XG4gICAgICAgICAgY3VycmVudFBhcmVudCA9IHBhcmVudC5hbHRlcm5hdGU7XG4gICAgICAgICAgaWYgKG51bGwgPT09IGN1cnJlbnRQYXJlbnQpXG4gICAgICAgICAgICB0aHJvdyBFcnJvcihcIlNob3VsZCBoYXZlIGEgY3VycmVudCBmaWJlci4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC5cIik7XG4gICAgICAgICAgY3VycmVudFBhcmVudC5tZW1vaXplZFN0YXRlLm1lbW9pemVkU3RhdGUgIT09XG4gICAgICAgICAgICBwYXJlbnQubWVtb2l6ZWRTdGF0ZS5tZW1vaXplZFN0YXRlICYmXG4gICAgICAgICAgICAobnVsbCAhPT0gY3VycmVudFxuICAgICAgICAgICAgICA/IGN1cnJlbnQucHVzaChIb3N0VHJhbnNpdGlvbkNvbnRleHQpXG4gICAgICAgICAgICAgIDogKGN1cnJlbnQgPSBbSG9zdFRyYW5zaXRpb25Db250ZXh0XSkpO1xuICAgICAgICB9XG4gICAgICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gICAgICB9XG4gICAgICBudWxsICE9PSBjdXJyZW50ICYmXG4gICAgICAgIHByb3BhZ2F0ZUNvbnRleHRDaGFuZ2VzKFxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgcmVuZGVyTGFuZXMsXG4gICAgICAgICAgZm9yY2VQcm9wYWdhdGVFbnRpcmVUcmVlXG4gICAgICAgICk7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAyNjIxNDQ7XG4gICAgICByZXR1cm4gbnVsbCAhPT0gY3VycmVudDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2hlY2tJZkNvbnRleHRDaGFuZ2VkKGN1cnJlbnREZXBlbmRlbmNpZXMpIHtcbiAgICAgIGZvciAoXG4gICAgICAgIGN1cnJlbnREZXBlbmRlbmNpZXMgPSBjdXJyZW50RGVwZW5kZW5jaWVzLmZpcnN0Q29udGV4dDtcbiAgICAgICAgbnVsbCAhPT0gY3VycmVudERlcGVuZGVuY2llcztcblxuICAgICAgKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhb2JqZWN0SXMoXG4gICAgICAgICAgICBjdXJyZW50RGVwZW5kZW5jaWVzLmNvbnRleHQuX2N1cnJlbnRWYWx1ZSxcbiAgICAgICAgICAgIGN1cnJlbnREZXBlbmRlbmNpZXMubWVtb2l6ZWRWYWx1ZVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgY3VycmVudERlcGVuZGVuY2llcyA9IGN1cnJlbnREZXBlbmRlbmNpZXMubmV4dDtcbiAgICAgIH1cbiAgICAgIHJldHVybiAhMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICAgIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IG51bGw7XG4gICAgICB3b3JrSW5Qcm9ncmVzcyA9IHdvcmtJblByb2dyZXNzLmRlcGVuZGVuY2llcztcbiAgICAgIG51bGwgIT09IHdvcmtJblByb2dyZXNzICYmICh3b3JrSW5Qcm9ncmVzcy5maXJzdENvbnRleHQgPSBudWxsKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVhZENvbnRleHQoY29udGV4dCkge1xuICAgICAgaXNEaXNhbGxvd2VkQ29udGV4dFJlYWRJbkRFViAmJlxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiQ29udGV4dCBjYW4gb25seSBiZSByZWFkIHdoaWxlIFJlYWN0IGlzIHJlbmRlcmluZy4gSW4gY2xhc3NlcywgeW91IGNhbiByZWFkIGl0IGluIHRoZSByZW5kZXIgbWV0aG9kIG9yIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy4gSW4gZnVuY3Rpb24gY29tcG9uZW50cywgeW91IGNhbiByZWFkIGl0IGRpcmVjdGx5IGluIHRoZSBmdW5jdGlvbiBib2R5LCBidXQgbm90IGluc2lkZSBIb29rcyBsaWtlIHVzZVJlZHVjZXIoKSBvciB1c2VNZW1vKCkuXCJcbiAgICAgICAgKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dEZvckNvbnN1bWVyKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyJDEsIGNvbnRleHQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWFkQ29udGV4dER1cmluZ1JlY29uY2lsaWF0aW9uKGNvbnN1bWVyLCBjb250ZXh0KSB7XG4gICAgICBudWxsID09PSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxICYmIHByZXBhcmVUb1JlYWRDb250ZXh0KGNvbnN1bWVyKTtcbiAgICAgIHJldHVybiByZWFkQ29udGV4dEZvckNvbnN1bWVyKGNvbnN1bWVyLCBjb250ZXh0KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVhZENvbnRleHRGb3JDb25zdW1lcihjb25zdW1lciwgY29udGV4dCkge1xuICAgICAgdmFyIHZhbHVlID0gY29udGV4dC5fY3VycmVudFZhbHVlO1xuICAgICAgY29udGV4dCA9IHsgY29udGV4dDogY29udGV4dCwgbWVtb2l6ZWRWYWx1ZTogdmFsdWUsIG5leHQ6IG51bGwgfTtcbiAgICAgIGlmIChudWxsID09PSBsYXN0Q29udGV4dERlcGVuZGVuY3kpIHtcbiAgICAgICAgaWYgKG51bGwgPT09IGNvbnN1bWVyKVxuICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgXCJDb250ZXh0IGNhbiBvbmx5IGJlIHJlYWQgd2hpbGUgUmVhY3QgaXMgcmVuZGVyaW5nLiBJbiBjbGFzc2VzLCB5b3UgY2FuIHJlYWQgaXQgaW4gdGhlIHJlbmRlciBtZXRob2Qgb3IgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiBJbiBmdW5jdGlvbiBjb21wb25lbnRzLCB5b3UgY2FuIHJlYWQgaXQgZGlyZWN0bHkgaW4gdGhlIGZ1bmN0aW9uIGJvZHksIGJ1dCBub3QgaW5zaWRlIEhvb2tzIGxpa2UgdXNlUmVkdWNlcigpIG9yIHVzZU1lbW8oKS5cIlxuICAgICAgICAgICk7XG4gICAgICAgIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IGNvbnRleHQ7XG4gICAgICAgIGNvbnN1bWVyLmRlcGVuZGVuY2llcyA9IHtcbiAgICAgICAgICBsYW5lczogMCxcbiAgICAgICAgICBmaXJzdENvbnRleHQ6IGNvbnRleHQsXG4gICAgICAgICAgX2RlYnVnVGhlbmFibGVTdGF0ZTogbnVsbFxuICAgICAgICB9O1xuICAgICAgICBjb25zdW1lci5mbGFncyB8PSA1MjQyODg7XG4gICAgICB9IGVsc2UgbGFzdENvbnRleHREZXBlbmRlbmN5ID0gbGFzdENvbnRleHREZXBlbmRlbmN5Lm5leHQgPSBjb250ZXh0O1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjcmVhdGVDYWNoZSgpIHtcbiAgICAgIHJldHVybi
15852B7XG4gICAgICAgIGNvbnRyb2xsZXI6IG5ldyBBYm9ydENvbnRyb2xsZXJMb2NhbCgpLFxuICAgICAgICBkYXRhOiBuZXcgTWFwKCksXG4gICAgICAgIHJlZkNvdW50OiAwXG4gICAgICB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXRhaW5DYWNoZShjYWNoZSkge1xuICAgICAgY2FjaGUuY29udHJvbGxlci5zaWduYWwuYWJvcnRlZCAmJlxuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgXCJBIGNhY2hlIGluc3RhbmNlIHdhcyByZXRhaW5lZCBhZnRlciBpdCB3YXMgYWxyZWFkeSBmcmVlZC4gVGhpcyBsaWtlbHkgaW5kaWNhdGVzIGEgYnVnIGluIFJlYWN0LlwiXG4gICAgICAgICk7XG4gICAgICBjYWNoZS5yZWZDb3VudCsrO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWxlYXNlQ2FjaGUoY2FjaGUpIHtcbiAgICAgIGNhY2hlLnJlZkNvdW50LS07XG4gICAgICAwID4gY2FjaGUucmVmQ291bnQgJiZcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIFwiQSBjYWNoZSBpbnN0YW5jZSB3YXMgcmVsZWFzZWQgYWZ0ZXIgaXQgd2FzIGFscmVhZHkgZnJlZWQuIFRoaXMgbGlrZWx5IGluZGljYXRlcyBhIGJ1ZyBpbiBSZWFjdC5cIlxuICAgICAgICApO1xuICAgICAgMCA9PT0gY2FjaGUucmVmQ291bnQgJiZcbiAgICAgICAgc2NoZWR1bGVDYWxsYmFjayQyKE5vcm1hbFByaW9yaXR5LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY2FjaGUuY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcXVldWVUcmFuc2l0aW9uVHlwZXMocm9vdCwgdHJhbnNpdGlvblR5cGVzKSB7XG4gICAgICBpZiAoMCAhPT0gKHJvb3QucGVuZGluZ0xhbmVzICYgNDE5NDA0OCkpIHtcbiAgICAgICAgdmFyIHF1ZXVlZCA9IHJvb3QudHJhbnNpdGlvblR5cGVzO1xuICAgICAgICBudWxsID09PSBxdWV1ZWQgJiYgKHF1ZXVlZCA9IHJvb3QudHJhbnNpdGlvblR5cGVzID0gW10pO1xuICAgICAgICBmb3IgKHJvb3QgPSAwOyByb290IDwgdHJhbnNpdGlvblR5cGVzLmxlbmd0aDsgcm9vdCsrKSB7XG4gICAgICAgICAgdmFyIHRyYW5zaXRpb25UeXBlID0gdHJhbnNpdGlvblR5cGVzW3Jvb3RdO1xuICAgICAgICAgIC0xID09PSBxdWV1ZWQuaW5kZXhPZih0cmFuc2l0aW9uVHlwZSkgJiYgcXVldWVkLnB1c2godHJhbnNpdGlvblR5cGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNsYWltUXVldWVkVHJhbnNpdGlvblR5cGVzKHJvb3QpIHtcbiAgICAgIHZhciBjbGFpbWVkID0gcm9vdC50cmFuc2l0aW9uVHlwZXM7XG4gICAgICByb290LnRyYW5zaXRpb25UeXBlcyA9IG51bGw7XG4gICAgICByZXR1cm4gY2xhaW1lZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gc3RhcnRVcGRhdGVUaW1lckJ5TGFuZShsYW5lLCBtZXRob2QsIGZpYmVyKSB7XG4gICAgICBpZiAoMCAhPT0gKGxhbmUgJiAxMjcpKVxuICAgICAgICAwID4gYmxvY2tpbmdVcGRhdGVUaW1lICYmXG4gICAgICAgICAgKChibG9ja2luZ1VwZGF0ZVRpbWUgPSBub3coKSksXG4gICAgICAgICAgKGJsb2NraW5nVXBkYXRlVGFzayA9IGNyZWF0ZVRhc2sobWV0aG9kKSksXG4gICAgICAgICAgKGJsb2NraW5nVXBkYXRlTWV0aG9kTmFtZSA9IG1ldGhvZCksXG4gICAgICAgICAgbnVsbCAhPSBmaWJlciAmJlxuICAgICAgICAgICAgKGJsb2NraW5nVXBkYXRlQ29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpKSxcbiAgICAgICAgICAoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHQgJiZcbiAgICAgICAgICAgICgoY29tcG9uZW50RWZmZWN0U3Bhd25lZFVwZGF0ZSA9ICEwKSxcbiAgICAgICAgICAgIChibG9ja2luZ1VwZGF0ZVR5cGUgPSBTUEFXTkVEX1VQREFURSkpLFxuICAgICAgICAgIChsYW5lID0gcmVzb2x2ZUV2ZW50VGltZVN0YW1wKCkpLFxuICAgICAgICAgIChtZXRob2QgPSByZXNvbHZlRXZlbnRUeXBlKCkpLFxuICAgICAgICAgIGxhbmUgIT09IGJsb2NraW5nRXZlbnRSZXBlYXRUaW1lIHx8IG1ldGhvZCAhPT0gYmxvY2tpbmdFdmVudFR5cGVcbiAgICAgICAgICAgID8gKGJsb2NraW5nRXZlbnRSZXBlYXRUaW1lID0gLTEuMSlcbiAgICAgICAgICAgIDogbnVsbCAhPT0gbWV0aG9kICYmIChibG9ja2luZ1VwZGF0ZVR5cGUgPSBTUEFXTkVEX1VQREFURSksXG4gICAgICAgICAgKGJsb2NraW5nRXZlbnRUaW1lID0gbGFuZSksXG4gICAgICAgICAgKGJsb2NraW5nRXZlbnRUeXBlID0gbWV0aG9kKSk7XG4gICAgICBlbHNlIGlmIChcbiAgICAgICAgMCAhPT0gKGxhbmUgJiA0MTk0MDQ4KSAmJlxuICAgICAgICAwID4gdHJhbnNpdGlvblVwZGF0ZVRpbWUgJiZcbiAgICAgICAgKCh0cmFuc2l0aW9uVXBkYXRlVGltZSA9IG5vdygpKSxcbiAgICAgICAgKHRyYW5zaXRpb25VcGRhdGVUYXNrID0gY3JlYXRlVGFzayhtZXRob2QpKSxcbiAgICAgICAgKHRyYW5zaXRpb25VcGRhdGVNZXRob2ROYW1lID0gbWV0aG9kKSxcbiAgICAgICAgbnVsbCAhPSBmaWJlciAmJlxuICAgICAgICAgICh0cmFuc2l0aW9uVXBkYXRlQ29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpKSxcbiAgICAgICAgMCA+IHRyYW5zaXRpb25TdGFydFRpbWUpXG4gICAgICApIHtcbiAgICAgICAgbGFuZSA9IHJlc29sdmVFdmVudFRpbWVTdGFtcCgpO1xuICAgICAgICBtZXRob2QgPSByZXNvbHZlRXZlbnRUeXBlKCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBsYW5lICE9PSB0cmFuc2l0aW9uRXZlbnRSZXBlYXRUaW1lIHx8XG4gICAgICAgICAgbWV0aG9kICE9PSB0cmFuc2l0aW9uRXZlbnRUeXBlXG4gICAgICAgIClcbiAgICAgICAgICB0cmFuc2l0aW9uRXZlbnRSZXBlYXRUaW1lID0gLTEuMTtcbiAgICAgICAgdHJhbnNpdGlvbkV2ZW50VGltZSA9IGxhbmU7XG4gICAgICAgIHRyYW5zaXRpb25FdmVudFR5cGUgPSBtZXRob2Q7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0YXJ0SG9zdEFjdGlvblRpbWVyKGZpYmVyKSB7XG4gICAgICBpZiAoMCA+IGJsb2NraW5nVXBkYXRlVGltZSkge1xuICAgICAgICBibG9ja2luZ1VwZGF0ZVRpbWUgPSBub3coKTtcbiAgICAgICAgYmxvY2tpbmdVcGRhdGVUYXNrID0gbnVsbCAhPSBmaWJlci5fZGVidWdUYXNrID8gZmliZXIuX2RlYnVnVGFzayA6IG51bGw7XG4gICAgICAgIChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dCAmJlxuICAgICAgICAgIChibG9ja2luZ1VwZGF0ZVR5cGUgPSBTUEFXTkVEX1VQREFURSk7XG4gICAgICAgI
15852HZhciBuZXdFdmVudFRpbWUgPSByZXNvbHZlRXZlbnRUaW1lU3RhbXAoKSxcbiAgICAgICAgICBuZXdFdmVudFR5cGUgPSByZXNvbHZlRXZlbnRUeXBlKCk7XG4gICAgICAgIG5ld0V2ZW50VGltZSAhPT0gYmxvY2tpbmdFdmVudFJlcGVhdFRpbWUgfHxcbiAgICAgICAgbmV3RXZlbnRUeXBlICE9PSBibG9ja2luZ0V2ZW50VHlwZVxuICAgICAgICAgID8gKGJsb2NraW5nRXZlbnRSZXBlYXRUaW1lID0gLTEuMSlcbiAgICAgICAgICA6IG51bGwgIT09IG5ld0V2ZW50VHlwZSAmJiAoYmxvY2tpbmdVcGRhdGVUeXBlID0gU1BBV05FRF9VUERBVEUpO1xuICAgICAgICBibG9ja2luZ0V2ZW50VGltZSA9IG5ld0V2ZW50VGltZTtcbiAgICAgICAgYmxvY2tpbmdFdmVudFR5cGUgPSBuZXdFdmVudFR5cGU7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIDAgPiB0cmFuc2l0aW9uVXBkYXRlVGltZSAmJlxuICAgICAgICAoKHRyYW5zaXRpb25VcGRhdGVUaW1lID0gbm93KCkpLFxuICAgICAgICAodHJhbnNpdGlvblVwZGF0ZVRhc2sgPVxuICAgICAgICAgIG51bGwgIT0gZmliZXIuX2RlYnVnVGFzayA/IGZpYmVyLl9kZWJ1Z1Rhc2sgOiBudWxsKSxcbiAgICAgICAgMCA+IHRyYW5zaXRpb25TdGFydFRpbWUpXG4gICAgICApIHtcbiAgICAgICAgZmliZXIgPSByZXNvbHZlRXZlbnRUaW1lU3RhbXAoKTtcbiAgICAgICAgbmV3RXZlbnRUaW1lID0gcmVzb2x2ZUV2ZW50VHlwZSgpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZmliZXIgIT09IHRyYW5zaXRpb25FdmVudFJlcGVhdFRpbWUgfHxcbiAgICAgICAgICBuZXdFdmVudFRpbWUgIT09IHRyYW5zaXRpb25FdmVudFR5cGVcbiAgICAgICAgKVxuICAgICAgICAgIHRyYW5zaXRpb25FdmVudFJlcGVhdFRpbWUgPSAtMS4xO1xuICAgICAgICB0cmFuc2l0aW9uRXZlbnRUaW1lID0gZmliZXI7XG4gICAgICAgIHRyYW5zaXRpb25FdmVudFR5cGUgPSBuZXdFdmVudFRpbWU7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHB1c2hOZXN0ZWRFZmZlY3REdXJhdGlvbnMoKSB7XG4gICAgICB2Y
15852XIgcHJldkVmZmVjdER1cmF0aW9uID0gcHJvZmlsZXJFZmZlY3REdXJhdGlvbjtcbiAgICAgIHByb2ZpbGVyRWZmZWN0RHVyYXRpb24gPSAwO1xuICAgICAgcmV0dXJuIHByZXZFZmZlY3REdXJhdGlvbjtcbiAgICB9XG4gICAgZnVuY3Rpb24gcG9wTmVzdGVkRWZmZWN0RHVyYXRpb25zKHByZXZFZmZlY3REdXJhdGlvbikge1xuICAgICAgdmFyIGVsYXBzZWRUaW1lID0gcHJvZmlsZXJFZmZlY3REdXJhdGlvbjtcbiAgICAgIHByb2ZpbGVyRWZmZWN0RHVyYXRpb24gPSBwcmV2RWZmZWN0RHVyYXRpb247XG4gICAgICByZXR1cm4gZWxhcHNlZFRpbWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGJ1YmJsZU5lc3RlZEVmZmVjdER1cmF0aW9ucyhwcmV2RWZmZWN0RHVyYXRpb24pIHtcbiAgICAgIHZhciBlbGFwc2VkVGltZSA9IHByb2ZpbGVyRWZmZWN0RHVyYXRpb247XG4gICAgICBwcm9maWxlckVmZmVjdER1cmF0aW9uICs9IHByZXZFZmZlY3REdXJhdGlvbjtcbiAgICAgIHJldHVybiBlbGFwc2VkVGltZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVzZXRDb21wb25lbnRFZmZlY3RUaW1lcnMoKSB7XG4gICAgICBjb21wb25lbnRFZmZlY3RFbmRUaW1lID0gY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lID0gLTEuMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHVzaENvbXBvbmVudEVmZmVjdFN0YXJ0KCkge1xuICAgICAgdmFyIHByZXZFZmZlY3RTdGFydCA9IGNvbXBvbmVudEVmZmVjdFN0YXJ0VGltZTtcbiAgICAgIGNvbXBvbmVudEVmZmVjdFN0YXJ0VGltZSA9IC0xLjE7XG4gICAgICByZXR1cm4gcHJldkVmZmVjdFN0YXJ0O1xuICAgIH1cbiAgICBmdW5jdGlvbiBwb3BDb21wb25lbnRFZmZlY3RTdGFydChwcmV2RWZmZWN0U3RhcnQpIHtcbiAgICAgIDAgPD0gcHJldkVmZmVjdFN0YXJ0ICYmIChjb21wb25lbnRFZmZlY3RTdGFydFRpbWUgPSBwcmV2RWZmZWN0U3RhcnQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwdXNoQ29tcG9uZW50RWZmZWN0RHVyYXRpb24oKSB7XG4gICAgICB2Y
15852XIgcHJldkVmZmVjdER1cmF0aW9uID0gY29tcG9uZW50RWZmZWN0RHVyYXRpb247XG4gICAgICBjb21wb25lbnRFZmZlY3REdXJhdGlvbiA9IC0wO1xuICAgICAgcmV0dXJuIHByZXZFZmZlY3REdXJhdGlvbjtcbiAgICB9XG4gICAgZnVuY3Rpb24gcG9wQ29tcG9uZW50RWZmZWN0RHVyYXRpb24ocHJldkVmZmVjdER1cmF0aW9uKSB7XG4gICAgICAwIDw9IHByZXZFZmZlY3REdXJhdGlvbiAmJiAoY29tcG9uZW50RWZmZWN0RHVyYXRpb24gPSBwcmV2RWZmZWN0RHVyYXRpb24pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwdXNoQ29tcG9uZW50RWZmZWN0RXJyb3JzKCkge1xuICAgICAgdmFyIHByZXZFcnJvcnMgPSBjb21wb25lbnRFZmZlY3RFcnJvcnM7XG4gICAgICBjb21wb25lbnRFZmZlY3RFcnJvcnMgPSBudWxsO1xuICAgICAgcmV0dXJuIHByZXZFcnJvcnM7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHB1c2hDb21wb25lbnRFZmZlY3REaWRTcGF3blVwZGF0ZSgpIHtcbiAgICAgIHZhciBwcmV2ID0gY29tcG9uZW50RWZmZWN0U3Bhd25lZFVwZGF0ZTtcbiAgICAgIGNvbXBvbmVudEVmZmVjdFNwYXduZWRVcGRhdGUgPSAhMTtcbiAgICAgIHJldHVybiBwcmV2O1xuICAgIH1cbiAgICBmdW5jdGlvbiBzdGFydFByb2ZpbGVyVGltZXIoZmliZXIpIHtcbiAgICAgIHByb2ZpbGVyU3RhcnRUaW1lID0gbm93KCk7XG4gICAgICAwID4gZmliZXIuYWN0dWFsU3RhcnRUaW1lICYmIChmaWJlci5hY3R1YWxTdGFydFRpbWUgPSBwcm9maWxlclN0YXJ0VGltZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRHVyYXRpb24oZmliZXIpIHtcbiAgICAgIGlmICgwIDw9IHByb2ZpbGVyU3RhcnRUaW1lKSB7XG4gICAgICAgIHZhciBlbGFwc2VkVGltZSA9IG5vdygpIC0gcHJvZmlsZXJTdGFydFRpbWU7XG4gICAgICAgIGZpYmVyLmFjdHVhbER1cmF0aW9uICs9IGVsYXBzZWRUaW1lO1xuICAgICAgICBmaWJlci5zZWxmQmFzZUR1cmF0aW9uID0gZWxhcHNlZFRpbWU7XG4gICAgICAgIHByb2ZpbGVyU3RhcnRUaW1lID0gLTE7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkSW5jb21wbGV0ZUR1cmF0aW9uKGZpYmVyKSB7XG4gICAgICBpZiAoMCA8PSBwcm9maWxlclN0YXJ0VGltZSkge1xuICAgICAgICB2Y
15852XIgZWxhcHNlZFRpbWUgPSBub3coKSAtIHByb2ZpbGVyU3RhcnRUaW1lO1xuICAgICAgICBmaWJlci5hY3R1YWxEdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcbiAgICAgICAgcHJvZmlsZXJTdGFydFRpbWUgPSAtMTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcmVjb3JkRWZmZWN0RHVyYXRpb24oKSB7XG4gICAgICBpZiAoMCA8PSBwcm9maWxlclN0YXJ0VGltZSkge1xuICAgICAgICB2YXIgZW5kVGltZSA9IG5vdygpLFxuICAgICAgICAgIGVsYXBzZWRUaW1lID0gZW5kVGltZSAtIHByb2ZpbGVyU3RhcnRUaW1lO1xuICAgICAgICBwcm9maWxlclN0YXJ0VGltZSA9IC0xO1xuICAgICAgICBwcm9maWxlckVmZmVjdER1cmF0aW9uICs9IGVsYXBzZWRUaW1lO1xuICAgICAgICBjb21wb25lbnRFZmZlY3REdXJhdGlvbiArPSBlbGFwc2VkVGltZTtcbiAgICAgICAgY29tcG9uZW50RWZmZWN0RW5kVGltZSA9IGVuZFRpbWU7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlY29yZEVmZmVjdEVycm9yKGVycm9ySW5mbykge1xuICAgICAgbnVsbCA9PT0gY29tcG9uZW50RWZmZWN0RXJyb3JzICYmIChjb21wb25lbnRFZmZlY3RFcnJvcnMgPSBbXSk7XG4gICAgICBjb21wb25lbnRFZmZlY3RFcnJvcnMucHVzaChlcnJvckluZm8pO1xuICAgICAgbnVsbCA9PT0gY29tbWl0RXJyb3JzICYmIChjb21taXRFcnJvcnMgPSBbXSk7XG4gICAgICBjb21taXRFcnJvcnMucHVzaChlcnJvckluZm8pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzdGFydEVmZmVjdFRpbWVyKCkge1xuICAgICAgcHJvZmlsZXJTdGFydFRpbWUgPSBub3coKTtcbiAgICAgIDAgPiBjb21wb25lbnRFZmZlY3RTdGFydFRpbWUgJiZcbiAgICAgICAgKGNvbXBvbmVudEVmZmVjdFN0YXJ0VGltZSA9IHByb2ZpbGVyU3RhcnRUaW1lKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhbnNmZXJBY3R1YWxEdXJhdGlvbihmaWJlcikge1xuICAgICAgZm9yICh2YXIgY2hpbGQgPSBmaWJlci5jaGlsZDsgY2hpbGQ7IClcbiAgICAgICAgKGZpYmVyLmFjdHVhbER1cmF0aW9uICs9IGNoaWxkLmFjdHVhbER1cmF0aW9uKSwgKGNoaWxkID0gY2hpbGQuc2libGluZyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGVudGFuZ2xlQXN5bmNBY3Rpb24odHJhbnNpdGlvbiwgdGhlbmFibGUpIHtcbiAgICAgIGlmIChudWxsID09PSBjdXJyZW50RW50YW5nbGVkTGlzdGVuZXJzKSB7XG4gICAgICAgIHZhciBlbnRhbmdsZWRMaXN0ZW5lcnMgPSAoY3VycmVudEVudGFuZ2xlZExpc3RlbmVycyA9IFtdKTtcbiAgICAgICAgY3VycmVudEVudGFuZ2xlZFBlbmRpbmdDb3VudCA9IDA7XG4gICAgICAgIGN1cnJlbnRFbnRhbmdsZWRMYW5lID0gcmVxdWVzdFRyYW5zaXRpb25MYW5lKCk7XG4gICAgICAgIGN1cnJlbnRFbnRhbmdsZWRBY3Rpb25UaGVuYWJsZSA9IHtcbiAgICAgICAgICBzdGF0dXM6IFwicGVuZGluZ1wiLFxuICAgICAgICAgIHZhbHVlOiB2b2lkIDAsXG4gICAgICAgICAgdGhlbjogZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgIGVudGFuZ2xlZExpc3RlbmVycy5wdXNoKHJlc29sdmUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRFbnRhbmdsZWRQZW5kaW5nQ291bnQrKztcbiAgICAgIHRoZW5hYmxlLnRoZW4ocGluZ0VuZ3RhbmdsZWRBY3Rpb25TY29wZSwgcGluZ0VuZ3RhbmdsZWRBY3Rpb25TY29wZSk7XG4gICAgICByZXR1cm4gdGhlbmFibGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBpbmdFbmd0YW5nbGVkQWN0aW9uU2NvcGUoKSB7XG4gICAgICBpZiAoXG4gICAgICAgIDAgPT09IC0tY3VycmVudEVudGFuZ2xlZFBlbmRpbmdDb3VudCAmJlxuICAgICAgICAoLTEgPCB0cmFuc2l0aW9uVXBkYXRlVGltZSB8fCAodHJhbnNpdGlvblN0YXJ0VGltZSA9IC0xLjEpLFxuICAgICAgICAoZW50YW5nbGVkVHJhbnNpdGlvblR5cGVzID0gbnVsbCksXG4gICAgICAgIG51bGwgIT09IGN1cnJlbnRFbnRhbmdsZWRMaXN0ZW5lcnMpXG4gICAgICApIHtcbiAgICAgICAgbnVsbCAhPT0gY3VycmVudEVudGFuZ2xlZEFjdGlvblRoZW5hYmxlICYmXG4gICAgICAgICAgKGN1cnJlbnRFbnRhbmdsZWRBY3Rpb25UaGVuYWJsZS5zdGF0dXMgPSBcImZ1bGZpbGxlZFwiKTtcbiAgICAgICAgdmFyIGxpc3RlbmVycyA9IGN1cnJlbnRFbnRhbmdsZWRMaXN0ZW5lcnM7XG4gICAgICAgIGN1cnJlbnRFbnRhbmdsZWRMaXN0ZW5lcnMgPSBudWxsO1xuICAgICAgICBjdXJyZW50RW50YW5nbGVkTGFuZSA9IDA7XG4gICAgICAgIGN1cnJlbnRFbnRhbmdsZWRBY3Rpb25UaGVuYWJsZSA9IG51bGw7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSAoMCwgbGlzdGVuZXJzW2ldKSgpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBjaGFpblRoZW5hYmxlVmFsdWUodGhlbmFibGUsIHJlc3VsdCkge1xuICAgICAgdmFyIGxpc3RlbmVycyA9IFtdLFxuICAgICAgICB0aGVuYWJsZVdpdGhPdmVycmlkZSA9IHtcbiAgICAgICAgICBzdGF0dXM6IFwicGVuZGluZ1wiLFxuICAgICAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgICAgIHJlYXNvbjogbnVsbCxcbiAgICAgICAgICB0aGVuOiBmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgICAgbGlzdGVuZXJzLnB1c2gocmVzb2x2ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgdGhlbmFibGUudGhlbihcbiAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRoZW5hYmxlV2l0aE92ZXJyaWRlLnN0YXR1cyA9IFwiZnVsZmlsbGVkXCI7XG4gICAgICAgICAgdGhlbmFibGVXaXRoT3ZlcnJpZGUudmFsdWUgPSByZXN1bHQ7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspICgwLCBsaXN0ZW5lcnNbaV0pKHJlc3VsdCk7XG4gICAgICAgIH0sXG4gICAgICAgIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgIHRoZW5hYmxlV2l0aE92ZXJyaWRlLnN0YXR1cyA9IFwicmVqZWN0ZWRcIjtcbiAgICAgICAgICB0aGVuYWJsZVdpdGhPdmVycmlkZS5yZWFzb24gPSBlcnJvcjtcbiAgICAgICAgICBmb3IgKGVycm9yID0gMDsgZXJyb3IgPCBsaXN0ZW5lcnMubGVuZ3RoOyBlcnJvcisrKVxuICAgICAgICAgICAgKDAsIGxpc3RlbmVyc1tlcnJvcl0pKHZvaWQgMCk7XG4gICAgICAgI
15852H1cbiAgICAgICk7XG4gICAgICByZXR1cm4gdGhlbmFibGVXaXRoT3ZlcnJpZGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBlZWtDYWNoZUZyb21Qb29sKCkge1xuICAgICAgdmFyIGNhY2hlUmVzdW1lZEZyb21QcmV2aW91c1JlbmRlciA9IHJlc3VtZWRDYWNoZS5jdXJyZW50O1xuICAgICAgcmV0dXJuIG51bGwgIT09IGNhY2hlUmVzdW1lZEZyb21QcmV2aW91c1JlbmRlclxuICAgICAgICA/IGNhY2hlUmVzdW1lZEZyb21QcmV2aW91c1JlbmRlclxuICAgICAgICA6IHdvcmtJblByb2dyZXNzUm9vdC5wb29sZWRDYWNoZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHVzaFRyYW5zaXRpb24ob2Zmc2NyZWVuV29ya0luUHJvZ3Jlc3MsIHByZXZDYWNoZVBvb2wpIHtcbiAgICAgIG51bGwgPT09IHByZXZDYWNoZVBvb2xcbiAgICAgICAgPyBwdXNoKHJlc3VtZWRDYWNoZSwgcmVzdW1lZENhY2hlLmN1cnJlbnQsIG9mZnNjcmVlbldvcmtJblByb2dyZXNzKVxuICAgICAgICA6IHB1c2gocmVzdW1lZENhY2hlLCBwcmV2Q2FjaGVQb29sLnBvb2wsIG9mZnNjcmVlbldvcmtJblByb2dyZXNzKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0U3VzcGVuZGVkQ2FjaGUoKSB7XG4gICAgICB2YXIgY2FjaGVGcm9tUG9vbCA9IHBlZWtDYWNoZUZyb21Qb29sKCk7XG4gICAgICByZXR1cm4gbnVsbCA9PT0gY2FjaGVGcm9tUG9vbFxuICAgICAgICA/IG51bGxcbiAgICAgICAgOiB7IHBhcmVudDogQ2FjaGVDb250ZXh0Ll9jdXJyZW50VmFsdWUsIHBvb2w6IGNhY2hlRnJvbVBvb2wgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY3JlYXRlVGhlbmFibGVTdGF0ZSgpIHtcbiAgICAgIHJldHVybiB7IGRpZFdhcm5BYm91dFVuY2FjaGVkUHJvbWlzZTogITEsIHRoZW5hYmxlczogW10gfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaXNUaGVuYWJsZVJlc29sdmVkKHRoZW5hYmxlKSB7XG4gICAgICB0aGVuYWJsZSA9IHRoZW5hYmxlLnN0YXR1cztcbiAgICAgIHJldHVybiBcImZ1bGZpbGxlZFwiID09PSB0aGVuYWJsZSB8fCBcInJlamVjdGVkXCIgPT09IHRoZW5hYmxlO1xuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFja1VzZWRUaGVuYWJsZSh0aGVuYWJsZVN0YXRlLCB0aGVuYWJsZSwgaW5kZXgsIGZpYmVyKSB7XG4gICAgICBudWxsICE9PSBSZWFjdFNoYXJlZEludGVybmFscy5hY3RRdWV1ZSAmJlxuICAgICAgICAoUmVhY3RTaGFyZWRJbnRlcm5hbHMuZGlkVXNlUHJvbWlzZSA9ICEwKTtcbiAgICAgIHZhciB0cmFja2VkVGhlbmFibGVzID0gdGhlbmFibGVTdGF0ZS50aGVuYWJsZXM7XG4gICAgICBpbmRleCA9IHRyYWNrZWRUaGVuYWJsZXNbaW5kZXhdO1xuICAgICAgdm9pZCAwID09PSBpbmRleFxuICAgICAgICA/IHRyYWNrZWRUaGVuYWJsZXMucHVzaCh0aGVuYWJsZSlcbiAgICAgICAgOiBpbmRleCAhPT0gdGhlbmFibGUgJiZcbiAgICAgICAgICAodGhlbmFibGVTdGF0ZS5kaWRXYXJuQWJvdXRVbmNhY2hlZFByb21pc2UgfHxcbiAgICAgICAgICAgICgodGhlbmFibGVTdGF0ZS5kaWRXYXJuQWJvdXRVbmNhY2hlZFByb21pc2UgPSAhMCksXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIkEgY29tcG9uZW50IHdhcyBzdXNwZW5kZWQgYnkgYW4gdW5jYWNoZWQgcHJvbWlzZS4gQ3JlYXRpbmcgcHJvbWlzZXMgaW5zaWRlIGEgQ2xpZW50IENvbXBvbmVudCBvciBob29rIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLCBleGNlcHQgdmlhIGEgU3VzcGVuc2UtY29tcGF0aWJsZSBsaWJyYXJ5IG9yIGZyYW1ld29yay5cIlxuICAgICAgICAgICAgKSksXG4gICAgICAgICAgdGhlbmFibGUudGhlbihub29wJDEsIG5vb3AkMSksXG4gICAgICAgICAgKHRoZW5hYmxlID0gaW5kZXgpKTtcbiAgICAgIGlmICh2b2lkIDAgPT09IHRoZW5hYmxlLl9kZWJ1Z0luZm8pIHtcbiAgICAgICAgdGhlbmFibGVTdGF0ZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgICB0cmFja2VkVGhlbmFibGVzID0gdGhlbmFibGUuZGlzcGxheU5hbWU7XG4gICAgICAgIHZhciBpb0luZm8gPSB7XG4gICAgICAgICAgbmFtZTpcbiAgICAgICAgICAgIFwic3RyaW5nXCIgPT09IHR5cGVvZiB0cmFja2VkVGhlbmFibGVzID8gdHJhY2tlZFRoZW5hYmxlcyA6IFwiUHJvbWlzZVwiLFxuICAgICAgICAgIHN0YXJ0OiB0aGVuYWJsZVN0YXRlLFxuICAgICAgICAgIGVuZDogdGhlbmFibGVTdGF0ZSxcbiAgICAgICAgICB2YWx1ZTogdGhlbmFibGVcbiAgICAgICAgfTtcbiAgICAgICAgdGhlbmFibGUuX2RlYnVnSW5mbyA9IFt7IGF3YWl0ZWQ6IGlvSW5mbyB9XTtcbiAgICAgICAgXCJmdWxmaWxsZWRcIiAhPT0gdGhlbmFibGUuc3RhdHVzICYmXG4gICAgICAgICAgXCJyZWplY3RlZFwiICE9PSB0aGVuYWJsZS5zdGF0dXMgJiZcbiAgICAgICAgICAoKHRoZW5hYmxlU3RhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpb0luZm8uZW5kID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgdGhlbmFibGUudGhlbih0aGVuYWJsZVN0YXRlLCB0aGVuYWJsZVN0YXRlKSk7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHRoZW5hYmxlLnN0YXR1cykge1xuICAgICAgICBjYXNlIFwiZnVsZmlsbGVkXCI6XG4gICAgICAgICAgcmV0dXJuIHRoZW5hYmxlLnZhbHVlO1xuICAgICAgICBjYXNlIFwicmVqZWN0ZWRcIjpcbiAgICAgICAgICBmaWJlciA9IHRoZW5hYmxlLnJlYXNvbjtcbiAgICAgICAgICBjaGVja0lmVXNlV3JhcHBlZEluQXN5bmNDYXRjaChmaWJlcik7XG4gICAgICAgICAgaWYgKHZvaWQgMCA9PT0gZmliZXIgJiYgIShcInJlYXNvblwiIGluIHRoZW5hYmxlKSlcbiAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICBcIkEgcmVqZWN0ZWQgUHJvbWlzZSB3YXMgcGFzc2VkIHRvIFJlYWN0IHdpdGhvdXQgYSBgcmVhc29uYCBwcm9wZXJ0eS4gUmVhY3QgdGhyZXcgYSBnZW5lcmljIGVycm9yIGZyb20gd2hlcmUgdGhlIFByb21pc2Ugd2FzIHVzZWQgdG8gYXNzaXN0IGluIGlkZW50aWZ5aW5nIHRoZSBwcm9ibGVtYXRpYyBQcm9taXNlLiBNYWtlIHN1cmUgdGhhdCBpbnN0cnVtZW50ZWQgUHJvbWlzZXMgY29ycmVjdGx5IHNldCB0aGUgYHJlYXNvbmAgcHJvcGVydHkgd2hlbiBzZXR0aW5nIGBzdGF0dXNgIHRvIGAncmVqZWN0ZWQnYC5cIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB0aHJvdyBmaWJlcjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoXCJzdHJpbmdcIiA9PT0gdHlwZW9mIHRoZW5
15852hYmxlLnN0YXR1cylcbiAgICAgICAgICAgIHRoZW5hYmxlLnRoZW4obm9vcCQxLCBub29wJDEpO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhlbmFibGVTdGF0ZSA9IHdvcmtJblByb2dyZXNzUm9vdDtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgbnVsbCAhPT0gdGhlbmFibGVTdGF0ZSAmJlxuICAgICAgICAgICAgICAxMDAgPCB0aGVuYWJsZVN0YXRlLnNoZWxsU3VzcGVuZENvdW50ZXJcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJBbiB1bmtub3duIENvbXBvbmVudCBpcyBhbiBhc3luYyBDbGllbnQgQ29tcG9uZW50LiBPbmx5IFNlcnZlciBDb21wb25lbnRzIGNhbiBiZSBhc3luYyBhdCB0aGUgbW9tZW50LiBUaGlzIGVycm9yIGlzIG9mdGVuIGNhdXNlZCBieSBhY2NpZGVudGFsbHkgYWRkaW5nIGAndXNlIGNsaWVudCdgIHRvIGEgbW9kdWxlIHRoYXQgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBmb3IgdGhlIHNlcnZlci5cIlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhlbmFibGVTdGF0ZSA9IHRoZW5hYmxlO1xuICAgICAgICAgICAgdGhlbmFibGVTdGF0ZS5zdGF0dXMgPSBcInBlbmRpbmdcIjtcbiAgICAgICAgICAgIHRoZW5hYmxlU3RhdGUudGhlbihcbiAgICAgICAgICAgICAgZnVuY3Rpb24gKGZ1bGZpbGxlZFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKFwicGVuZGluZ1wiID09PSB0aGVuYWJsZS5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgICAgIHZhciBmdWxmaWxsZWRUaGVuYWJsZSA9IHRoZW5hYmxlO1xuICAgICAgICAgICAgICAgICAgZnVsZmlsbGVkVGhlbmFibGUuc3RhdHVzID0gXCJmdWxmaWxsZWRcIjtcbiAgICAgICAgICAgICAgICAgIGZ1bGZpbGxlZFRoZW5hYmxlLnZhbHVlID0gZnVsZmlsbGVkVmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoXCJwZW5kaW5nXCIgPT09IHRoZW5hYmxlLnN0YXR1cykge1xuICAgICAgICAgICAgICAgICAgdmFyIHJlamVjdGVkVGhlbmFibGUgPSB0aGVuYWJsZTtcbiAgICAgICAgICAgICAgICAgIHJlamVjdGVkVGhlbmFibGUuc3RhdHVzID0gXCJyZWplY3RlZFwiO1xuICAgICAgICAgICAgICAgICAgcmVqZWN0ZWRUaGVuYWJsZS5yZWFzb24gPSBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN3aXRjaCAodGhlbmFibGUuc3RhdHVzKSB7XG4gICAgICAgICAgICBjYXNlIFwiZnVsZmlsbGVkXCI6XG4gICAgICAgICAgICAgIHJldHVybiB0aGVuYWJsZS52YWx1ZTtcbiAgICAgICAgICAgIGNhc2UgXCJyZWplY3RlZFwiOlxuICAgICAgICAgICAgICB0aHJvdyAoXG4gICAgICAgICAgICAgICAgKChmaWJlciA9IHRoZW5hYmxlLnJlYXNvbiksXG4gICAgICAgICAgICAgICAgY2hlY2tJZlVzZVdyYXBwZWRJbkFzeW5jQ2F0Y2goZmliZXIpLFxuICAgICAgICAgICAgICAgIGZpYmVyKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdXNwZW5kZWRUaGVuYWJsZSA9IHRoZW5hYmxlO1xuICAgICAgICAgIG5lZWRzVG9SZXNldFN1c3BlbmRlZFRoZW5hYmxlREVWID0gITA7XG4gICAgICAgICAgZGlkSXNzdWVVc2VXYXJuaW5nIHx8XG4gICAgICAgICAgICBudWxsID09PSBmaWJlciB8fFxuICAgICAgICAgICAgbnVsbCAhPT0gZmliZXIuYWx0ZXJuYXRlIHx8XG4gICAgICAgICAgICAoKGxhc3RTdXNwZW5kZWRGaWJlciA9IGZpYmVyKSxcbiAgICAgICAgICAgIChsYXN0U3VzcGVuZGVkU3RhY2sgPSBFcnJvcihcbiAgICAgICAgICAgICAgXCJUaGlzIGxpYnJhcnkgY2FsbGVkIHVzZSgpIHRvIHN1c3BlbmQgaW4gYSBwcmV2aW91cyByZW5kZXIgYnV0IGRpZCBub3QgY2FsbCB1c2UoKSB3aGVuIGl0IGZpbmlzaGVkLiBUaGlzIGluZGljYXRlcyBhbiBpbmNvcnJlY3QgdXNlIG9mIHVzZSgpLiBMZWFybiBtb3JlOiBodHRwczovL3JlYWN0LmRldi93YXJuaW5ncy9jb25kaXRpb25hbC11c2Utb2YtdXNlXCJcbiAgICAgICAgICAgICkpKTtcbiAgICAgICAgICB0aHJvdyBTdXNwZW5zZUV4Y2VwdGlvbjtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcmVzb2x2ZUxhenkobGF6eVR5cGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBjYWxsTGF6eUluaXRJbkRFVihsYXp5VHlwZSk7XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIGlmIChudWxsICE9PSB4ICYmIFwib2JqZWN0XCIgPT09IHR5cGVvZiB4ICYmIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHgudGhlbilcbiAgICAgICAgICB0aHJvdyAoXG4gICAgICAgICAgICAoKHN1c3BlbmRlZFRoZW5hYmxlID0geCksXG4gICAgICAgICAgICAobmVlZHNUb1Jlc2V0U3VzcGVuZGVkVGhlbmFibGVERVYgPSAhMCksXG4gICAgICAgICAgICBTdXNwZW5zZUV4Y2VwdGlvbilcbiAgICAgICAgICApO1xuICAgICAgICB0aHJvdyB4O1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRTdXNwZW5kZWRUaGVuYWJsZSgpIHtcbiAgICAgIGlmIChudWxsID09PSBzdXNwZW5kZWRUaGVuYWJsZSlcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgXCJFeHBlY3RlZCBhIHN1c3BlbmRlZCB0aGVuYWJsZS4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCJcbiAgICAgICAgKTtcbiAgICAgIHZhciB0aGVuYWJsZSA9IHN1c3BlbmRlZFRoZW5hYmxlO1xuICAgICAgc3VzcGVuZGVkVGhlbmFibGUgPSBudWxsO1xuICAgICAgbmVlZHNUb1Jlc2V0U3VzcGVuZGVkVGhlbmFibGVERVYgPSAhMTtcbiAgICAgIHJldHVybiB0aGVuYWJsZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2hlY2tJZlVzZVdyYXBwZWRJbkFzeW5jQ2F0Y2gocmVqZWN0ZWRSZWFzb24pIHtcbiAgICAgIGlmIChcbiAgICAgICAgcmVqZWN0ZWRSZWFzb24gPT09IFN1c3BlbnNlRXhjZXB0aW9uIHx8XG4gICAgICAgIHJlamVjdGVkUmVhc29uID09PSBTdXNwZW5zZUFjdGlvbkV4Y2VwdGlvblxuICAgICAgKVxuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBcIkhvb2tzIGFyZSBub3Qgc3VwcG9ydGVkIGluc2lkZSBhbiBhc3luYyBjb21wb25lbnQuIFRoaXMgZXJyb3IgaXMgb2Z0ZW4gY2F1c2VkIGJ5IGFjY2lkZW50YWxseSBhZGRpbmcgYCd1c2UgY2xpZW50J2AgdG8gYSBtb2R1bGUgdGhhdCB3YXMgb3JpZ2luYWxseSB3cml0dGVuIGZvciB0aGUgc2VydmVyLlwiXG4gICAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFyZVNhbWVLZXlQYXRoKGEsIGIpIHtcbiAgICAgIHJldHVybi
15852BhID09PSBiXG4gICAgICAgID8gITBcbiAgICAgICAgOiBhLnRhZyAhPT0gYi50YWcgfHxcbiAgICAgICAgICAgIGEudHlwZSAhPT0gYi50eXBlIHx8XG4gICAgICAgICAgICBhLmtleSAhPT0gYi5rZXkgfHxcbiAgICAgICAgICAgIGEuaW5kZXggIT09IGIuaW5kZXggfHxcbiAgICAgICAgICAgICgzID09PSBhLnRhZyAmJiBhLnN0YXRlTm9kZSAhPT0gYi5zdGF0ZU5vZGUpIHx8XG4gICAgICAgICAgICBudWxsID09PSBhLnJldHVybiB8fFxuICAgICAgICAgICAgbnVsbCA9PT0gYi5yZXR1cm5cbiAgICAgICAgICA/ICExXG4gICAgICAgICAgOiBhcmVTYW1lS2V5UGF0aChhLnJldHVybiwgYi5yZXR1cm4pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwdXNoRGVidWdJbmZvKGRlYnVnSW5mbykge1xuICAgICAgdmFyIHByZXZpb3VzRGVidWdJbmZvID0gY3VycmVudERlYnVnSW5mbztcbiAgICAgIG51bGwgIT0gZGVidWdJbmZvICYmXG4gICAgICAgIChjdXJyZW50RGVidWdJbmZvID1cbiAgICAgICAgICBudWxsID09PSBwcmV2aW91c0RlYnVnSW5mb1xuICAgICAgICAgICAgPyBkZWJ1Z0luZm9cbiAgICAgICAgICAgIDogcHJldmlvdXNEZWJ1Z0luZm8uY29uY2F0KGRlYnVnSW5mbykpO1xuICAgICAgcmV0dXJuIHByZXZpb3VzRGVidWdJbmZvO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRDdXJyZW50RGVidWdUYXNrKCkge1xuICAgICAgdmFyIGRlYnVnSW5mbyA9IGN1cnJlbnREZWJ1Z0luZm87XG4gICAgICBpZiAobnVsbCAhPSBkZWJ1Z0luZm8pXG4gICAgICAgIGZvciAodmFyIGkgPSBkZWJ1Z0luZm8ubGVuZ3RoIC0gMTsgMCA8PSBpOyBpLS0pXG4gICAgICAgICAgaWYgKG51bGwgIT0gZGVidWdJbmZvW2ldLm5hbWUpIHtcbiAgICAgICAgICAgIHZhciBkZWJ1Z1Rhc2sgPSBkZWJ1Z0luZm9baV0uZGVidWdUYXNrO1xuICAgICAgICAgICAgaWYgKG51bGwgIT0gZGVidWdUYXNrKSByZXR1cm4gZGVidWdUYXNrO1xuICAgICAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZUZyYWdtZW50UHJvcHMoZWxlbWVudCwgZmliZXIsIHJldHVybkZpYmVyKSB7XG4gICAgICBmb3IgKHZhciBrZXlzID0gT2JqZWN0LmtleXMoZWxlbWVudC5wcm9wcyksIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2Y
15852XIga2V5ID0ga2V5c1tpXTtcbiAgICAgICAgaWYgKFwiY2hpbGRyZW5cIiAhPT0ga2V5ICYmIFwia2V5XCIgIT09IGtleSAmJiBcInJlZlwiICE9PSBrZXkpIHtcbiAgICAgICAgICBudWxsID09PSBmaWJlciAmJlxuICAgICAgICAgICAgKChmaWJlciA9IGNyZWF0ZUZpYmVyRnJvbUVsZW1lbnQoZWxlbWVudCwgcmV0dXJuRmliZXIubW9kZSwgMCkpLFxuICAgICAgICAgICAgKGZpYmVyLl9kZWJ1Z0luZm8gPSBjdXJyZW50RGVidWdJbmZvKSxcbiAgICAgICAgICAgIChmaWJlci5yZXR1cm4gPSByZXR1cm5GaWJlcikpO1xuICAgICAgICAgIHJ1bldpdGhGaWJlckluREVWKFxuICAgICAgICAgICAgZmliZXIsXG4gICAgICAgICAgICBmdW5jdGlvbiAoZXJyb3JlZEtleSkge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgIFwiSW52YWxpZCBwcm9wIGAlc2Agc3VwcGxpZWQgdG8gYFJlYWN0LkZyYWdtZW50YC4gUmVhY3QuRnJhZ21lbnQgY2FuIG9ubHkgaGF2ZSBga2V5YCwgYHJlZmAsIGFuZCBgY2hpbGRyZW5gIHByb3BzLlwiLFxuICAgICAgICAgICAgICAgIGVycm9yZWRLZXlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBrZXlcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVud3JhcFRoZW5hYmxlKHRoZW5hYmxlKSB7XG4gICAgICB2YXIgaW5kZXggPSB0aGVuYWJsZUluZGV4Q291bnRlciQxO1xuICAgICAgdGhlbmFibGVJbmRleENvdW50ZXIkMSArPSAxO1xuICAgICAgbnVsbCA9PT0gdGhlbmFibGVTdGF0ZSQxICYmICh0aGVuYWJsZVN0YXRlJDEgPSBjcmVhdGVUaGVuYWJsZVN0YXRlKCkpO1xuICAgICAgcmV0dXJuIHRyYWNrVXNlZFRoZW5hYmxlKHRoZW5hYmxlU3RhdGUkMSwgdGhlbmFibGUsIGluZGV4LCBudWxsKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29lcmNlUmVmKHdvcmtJblByb2dyZXNzLCBlbGVtZW50KSB7XG4gICAgICBlbGVtZW50ID0gZWxlbWVudC5wcm9wcy5yZWY7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5yZWYgPSB2b2lkIDAgIT09IGVsZW1lbnQgPyBlbGVtZW50IDogbnVsbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gdGhyb3dPbkludmFsaWRPYmplY3RUeXBlSW1wbChyZXR1cm5GaWJlciwgbmV3Q2hpbGQpIHtcbiAgICAgIGlmIChuZXdDaGlsZC4kJHR5cGVvZiA9PT0gUkVBQ1RfTEVHQUNZX0VMRU1FTlRfVFlQRSlcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgJ0EgUmVhY3QgRWxlbWVudCBmcm9tIGFuIG9sZG
15852VyIHZlcnNpb24gb2YgUmVhY3Qgd2FzIHJlbmRlcmVkLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuIEl0IGNhbiBoYXBwZW4gaWY6XFxuLSBNdWx0aXBsZSBjb3BpZXMgb2YgdGhlIFwicmVhY3RcIiBwYWNrYWdlIGlzIHVzZWQuXFxuLSBBIGxpYnJhcnkgcHJlLWJ1bmRsZWQgYW4gb2xkIGNvcHkgb2YgXCJyZWFjdFwiIG9yIFwicmVhY3QvanN4LXJ1bnRpbWVcIi5cXG4tIEEgY29tcGlsZXIgdHJpZXMgdG8gXCJpbmxpbmVcIiBKU1ggaW5zdGVhZCBvZiB1c2luZyB0aGUgcnVudGltZS4nXG4gICAgICAgICk7XG4gICAgICByZXR1cm5GaWJlciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuZXdDaGlsZCk7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgXCJPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6IFwiICtcbiAgICAgICAgICAoXCJbb2JqZWN0IE9iamVjdF1cIiA9PT0gcmV0dXJuRmliZXJcbiAgICAgICAgICAgID8gXCJvYmplY3Qgd2l0aCBrZXlzIHtcIiArIE9iamVjdC5rZXlzKG5ld0NoaWxkKS5qb2luKFwiLCBcIikgKyBcIn1cIlxuICAgICAgICAgICAgOiByZXR1cm5GaWJlcikgK1xuICAgICAgICAgIFwiKS4gSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4sIHVzZSBhbiBhcnJheSBpbnN0ZWFkLlwiXG4gICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKSB7XG4gICAgICB2YXIgZGVidWdUYXNrID0gZ2V0Q3VycmVudERlYnVnVGFzaygpO1xuICAgICAgbnVsbCAhPT0gZGVidWdUYXNrXG4gICAgICAgID8gZGVidWdUYXNrLnJ1bihcbiAgICAgICAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZUltcGwuYmluZChudWxsLCByZXR1cm5GaWJlciwgbmV3Q2hpbGQpXG4gICAgICAgICAgKVxuICAgICAgICA6IHRocm93T25JbnZhbGlkT2JqZWN0VHlwZUltcGwocmV0dXJuRmliZXIsIG5ld0NoaWxkKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gd2Fybk9uRnVuY3Rpb25UeXBlSW1wbChyZXR1cm5GaWJlciwgaW52YWxpZENoaWxkKSB7XG4gICAgICB2Y
15852XIgcGFyZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIocmV0dXJuRmliZXIpIHx8IFwiQ29tcG9uZW50XCI7XG4gICAgICBvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmdbcGFyZW50TmFtZV0gfHxcbiAgICAgICAgKChvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmdbcGFyZW50TmFtZV0gPSAhMCksXG4gICAgICAgIChpbnZhbGlkQ2hpbGQgPVxuICAgICAgICAgIGludmFsaWRDaGlsZC5kaXNwbGF5TmFtZSB8fCBpbnZhbGlkQ2hpbGQubmFtZSB8fCBcIkNvbXBvbmVudFwiKSxcbiAgICAgICAgMyA9PT0gcmV0dXJuRmliZXIudGFnXG4gICAgICAgICAgPyBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIkZ1bmN0aW9ucyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQuIFRoaXMgbWF5IGhhcHBlbiBpZiB5b3UgcmV0dXJuICVzIGluc3RlYWQgb2YgPCVzIC8+IGZyb20gcmVuZGVyLiBPciBtYXliZSB5b3UgbWVhbnQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHJhdGhlciB0aGFuIHJldHVybiBpdC5cXG4gIHJvb3QucmVuZGVyKCVzKVwiLFxuICAgICAgICAgICAgICBpbnZhbGlkQ2hpbGQsXG4gICAgICAgICAgICAgIGludmFsaWRDaGlsZCxcbiAgICAgICAgICAgICAgaW52YWxpZENoaWxkXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIkZ1bmN0aW9ucyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQuIFRoaXMgbWF5IGhhcHBlbiBpZiB5b3UgcmV0dXJuICVzIGluc3RlYWQgb2YgPCVzIC8+IGZyb20gcmVuZGVyLiBPciBtYXliZSB5b3UgbWVhbnQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHJhdGhlciB0aGFuIHJldHVybiBpdC5cXG4gIDwlcz57JXN9PC8lcz5cIixcbiAgICAgICAgICAgICAgaW52YWxpZENoaWxkLFxuICAgICAgICAgICAgICBpbnZhbGlkQ2hpbGQsXG4gICAgICAgICAgICAgIHBhcmVudE5hbWUsXG4gICAgICAgICAgICAgIGludmFsaWRDaGlsZCxcbiAgICAgICAgICAgICAgcGFyZW50TmFtZVxuICAgICAgICAgICAgKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHdhcm5PbkZ1bmN0aW9uVHlwZShyZXR1cm5GaWJlciwgaW52YWxpZENoaWxkKSB7XG4gICAgICB2Y
15852XIgZGVidWdUYXNrID0gZ2V0Q3VycmVudERlYnVnVGFzaygpO1xuICAgICAgbnVsbCAhPT0gZGVidWdUYXNrXG4gICAgICAgID8gZGVidWdUYXNrLnJ1bihcbiAgICAgICAgICAgIHdhcm5PbkZ1bmN0aW9uVHlwZUltcGwuYmluZChudWxsLCByZXR1cm5GaWJlciwgaW52YWxpZENoaWxkKVxuICAgICAgICAgIClcbiAgICAgICAgOiB3YXJuT25GdW5jdGlvblR5cGVJbXBsKHJldHVybkZpYmVyLCBpbnZhbGlkQ2hpbGQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3YXJuT25TeW1ib2xUeXBlSW1wbChyZXR1cm5GaWJlciwgaW52YWxpZENoaWxkKSB7XG4gICAgICB2YXIgcGFyZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIocmV0dXJuRmliZXIpIHx8IFwiQ29tcG9uZW50XCI7XG4gICAgICBvd25lckhhc1N5bWJvbFR5cGVXYXJuaW5nW3BhcmVudE5hbWVdIHx8XG4gICAgICAgICgob3duZXJIYXNTeW1ib2xUeXBlV2FybmluZ1twYXJlbnROYW1lXSA9ICEwKSxcbiAgICAgICAgKGludmFsaWRDaGlsZCA9IFN0cmluZyhpbnZhbGlkQ2hpbGQpKSxcbiAgICAgICAgMyA9PT0gcmV0dXJuRmliZXIudGFnXG4gICAgICAgICAgPyBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIlN5bWJvbHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkLlxcbiAgcm9vdC5yZW5kZXIoJXMpXCIsXG4gICAgICAgICAgICAgIGludmFsaWRDaGlsZFxuICAgICAgICAgICAgKVxuICAgICAgICAgIDogY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCJTeW1ib2xzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZC5cXG4gIDwlcz4lczwvJXM+XCIsXG4gICAgICAgICAgICAgIHBhcmVudE5hbWUsXG4gICAgICAgICAgICAgIGludmFsaWRDaGlsZCxcbiAgICAgICAgICAgICAgcGFyZW50TmFtZVxuICAgICAgICAgICAgKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHdhcm5PblN5bWJvbFR5cGUocmV0dXJuRmliZXIsIGludmFsaWRDaGlsZCkge1xuICAgICAgdmFyIGRlYnVnVGFzayA9IGdldEN1cnJlbnREZWJ1Z1Rhc2soKTtcbiAgICAgIG51bGwgIT09IGRlYnVnVGFza1xuICAgICAgICA/IGRlYnVnVGFzay5ydW4oXG4gICAgICAgICAgICB3YXJuT25TeW1ib2xUeXBlSW1wbC5iaW5kKG51bGwsIHJldHVybkZpYmVyLCBpbnZhbGlkQ2hpbGQpXG4gICAgICAgICAgKVxuICAgICAgICA6IHdhcm5PblN5bWJvbFR5cGVJbXBsKHJldHVybkZpYmVyLCBpbnZhbGlkQ2hpbGQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjcmVhdGVDaGlsZFJlY29uY2lsZXIoc2hvdWxkVHJhY2tTaWRlRWZmZWN0cykge1xuICAgICAgZnVuY3Rpb24gZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkVG9EZWxldGUpIHtcbiAgICAgICAgaWYgKHNob3VsZFRyYWNrU2lkZUVmZmVjdHMpIHtcbiAgICAgICAgICB2Y
15852XIgZGVsZXRpb25zID0gcmV0dXJuRmliZXIuZGVsZXRpb25zO1xuICAgICAgICAgIG51bGwgPT09IGRlbGV0aW9uc1xuICAgICAgICAgICAgPyAoKHJldHVybkZpYmVyLmRlbGV0aW9ucyA9IFtjaGlsZFRvRGVsZXRlXSksXG4gICAgICAgICAgICAgIChyZXR1cm5GaWJlci5mbGFncyB8PSAxNikpXG4gICAgICAgICAgICA6IGRlbGV0aW9ucy5wdXNoKGNoaWxkVG9EZWxldGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpIHtcbiAgICAgICAgaWYgKCFzaG91bGRUcmFja1NpZGVFZmZlY3RzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgZm9yICg7IG51bGwgIT09IGN1cnJlbnRGaXJzdENoaWxkOyApXG4gICAgICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGN1cnJlbnRGaXJzdENoaWxkKSxcbiAgICAgICAgICAgIChjdXJyZW50Rmlyc3RDaGlsZCA9IGN1cnJlbnRGaXJzdENoaWxkLnNpYmxpbmcpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIG1hcFJlbWFpbmluZ0NoaWxkcmVuKGN1cnJlbnRGaXJzdENoaWxkKSB7XG4gICAgICAgIGZvciAodmFyIGV4aXN0aW5nQ2hpbGRyZW4gPSBuZXcgTWFwKCk7IG51bGwgIT09IGN1cnJlbnRGaXJzdENoaWxkOyApXG4gICAgICAgICAgbnVsbCA9PT0gY3VycmVudEZpcnN0Q2hpbGQua2V5XG4gICAgICAgICAgICA/IGV4aXN0aW5nQ2hpbGRyZW4uc2V0KGN1cnJlbnRGaXJzdENoaWxkLmluZGV4LCBjdXJyZW50Rmlyc3RDaGlsZClcbiAgICAgICAgICAgIDogZXhpc3RpbmdDaGlsZHJlbi5zZXQoY3VycmVudEZpcnN0Q2hpbGQua2V5LCBjdXJyZW50Rmlyc3RDaGlsZCksXG4gICAgICAgICAgICAoY3VycmVudEZpcnN0Q2hpbGQgPSBjdXJyZW50Rmlyc3RDaGlsZC5zaWJsaW5nKTtcbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nQ2hpbGRyZW47XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiB1c2VGaWJlcihmaWJlciwgcGVuZGluZ1Byb3BzKSB7XG4gICAgICAgIGZpYmVyID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoZmliZXIsIHBlbmRpbmdQcm9wcyk7XG4gICAgICAgIGZpYmVyLmluZGV4ID0gMDtcbiAgICAgICAgZmliZXIuc2libGluZyA9IG51bGw7XG4gICAgICAgIHJldHVybiBmaWJlcjtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHBsYWNlQ2hpbGQobmV3RmliZXIsIGxhc3RQbGFjZWRJbmRleCwgbmV3SW5kZXgpIHtcbiAgICAgICAgbmV3RmliZXIuaW5kZXggPSBuZXdJbmRleDtcbiAgICAgICAgaWYgKCFzaG91bGRUcmFja1NpZGVFZmZlY3RzKVxuICAgICAgICAgIHJldHVybiAobmV3RmliZXIuZmxhZ3MgfD0gMTA0ODU3NiksIGxhc3RQbGFjZWRJbmRleDtcbiAgICAgICAgbmV3SW5kZXggPSBuZXdGaWJlci5hbHRlcm5hdGU7XG4gICAgICAgIGlmIChudWxsICE9PSBuZXdJbmRleClcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKG5ld0luZGV4ID0gbmV3SW5kZXguaW5kZXgpLFxuICAgICAgICAgICAgbmV3SW5kZXggPCBsYXN0UGxhY2VkSW5kZXhcbiAgICAgICAgICAgICAgPyAoKG5ld0ZpYmVyLmZsYWdzIHw9IDIpLCBsYXN0UGxhY2VkSW5kZXgpXG4gICAgICAgICAgICAgIDogbmV3SW5kZXhcbiAgICAgICAgICApO1xuICAgICAgICBuZXdGaWJlci5mbGFncyB8PSAxMzQyMTc3MzA7XG4gICAgICAgIHJldHVybiBsYXN0UGxhY2VkSW5kZXg7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBwbGFjZVNpbmdsZUNoaWxkKG5ld0ZpYmVyKSB7XG4gICAgICAgIHNob3VsZFRyYWNrU2lkZUVmZmVjdHMgJiZcbiAgICAgICAgICBudWxsID09PSBuZXdGaWJlci5hbHRlcm5hdGUgJiZcbiAgICAgICAgICAobmV3RmliZXIuZmxhZ3MgfD0gMTM0MjE3NzMwKTtcbiAgICAgICAgcmV0dXJuIG5ld0ZpYmVyO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIGN1cnJlbnQsIHRleHRDb250ZW50LCBsYW5lcykge1xuICAgICAgICBpZiAobnVsbCA9PT0gY3VycmVudCB8fCA2ICE9PSBjdXJyZW50LnRhZylcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKGN1cnJlbnQgPSBjcmVhdGVGaWJlckZyb21UZXh0KFxuICAgICAgICAgICAgICB0ZXh0Q29udGVudCxcbiAgICAgICAgICAgICAgcmV0dXJuRmliZXIubW9kZSxcbiAgICAgICAgICAgICAgbGFuZXNcbiAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgKGN1cnJlbnQucmV0dXJuID0gcmV0dXJuRmliZXIpLFxuICAgICAgICAgICAgKGN1cnJlbnQuX2RlYnVnT3duZXIgPSByZXR1cm5GaWJlciksXG4gICAgICAgICAgICAoY3VycmVudC5fZGVidWdUYXNrID0gcmV0dXJuRmliZXIuX2RlYnVnVGFzayksXG4gICAgICAgICAgICAoY3VycmVudC5fZGVidWdJbmZvID0gY3VycmVudERlYnVnSW5mbyksXG4gICAgICAgICAgICBjdXJyZW50XG4gICAgICAgICAgKTtcbiAgICAgICAgY3VycmVudCA9IHVzZUZpYmVyKGN1cnJlbnQsIHRleHRDb250ZW50KTtcbiAgICAgICAgY3VycmVudC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgY3VycmVudC5fZGVidWdJbmZvID0gY3VycmVudERlYnVnSW5mbztcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiB1cGRhdGVFbGVtZW50KHJldHVybkZpYmVyLCBjdXJyZW50LCBlbGVtZW50LCBsYW5lcykge1xuICAgICAgICB2Y
15852XIgZWxlbWVudFR5cGUgPSBlbGVtZW50LnR5cGU7XG4gICAgICAgIGlmIChlbGVtZW50VHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSlcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKGN1cnJlbnQgPSB1cGRhdGVGcmFnbWVudChcbiAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgIGVsZW1lbnQucHJvcHMuY2hpbGRyZW4sXG4gICAgICAgICAgICAgIGxhbmVzLFxuICAgICAgICAgICAgICBlbGVtZW50LmtleVxuICAgICAgICAgICAgKSksXG4gICAgICAgICAgICBjb2VyY2VSZWYoY3VycmVudCwgZWxlbWVudCksXG4gICAgICAgICAgICB2YWxpZGF0ZUZyYWdtZW50UHJvcHMoZWxlbWVudCwgY3VycmVudCwgcmV0dXJuRmliZXIpLFxuICAgICAgICAgICAgY3VycmVudFxuICAgICAgICAgICk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBudWxsICE9PSBjdXJyZW50ICYmXG4gICAgICAgICAgKGN1cnJlbnQuZWxlbWVudFR5cGUgPT09IGVsZW1lbnRUeXBlIHx8XG4gICAgICAgICAgICBpc0NvbXBhdGlibGVGYW1pbHlGb3JIb3RSZWxvYWRpbmcoY3VycmVudCwgZWxlbWVudCkgfHxcbiAgICAgICAgICAgIChcIm9iamVjdFwiID09PSB0eXBlb2YgZWxlbWVudFR5cGUgJiZcbiAgICAgICAgICAgICAgbnVsbCAhPT0gZWxlbWVudFR5cGUgJiZcbiAgICAgICAgICAgICAgZWxlbWVudFR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0xBWllfVFlQRSAmJlxuICAgICAgICAgICAgICByZXNvbHZlTGF6eShlbGVtZW50VHlwZSkgPT09IGN1cnJlbnQudHlwZSkpXG4gICAgICAgIClcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKGN1cnJlbnQgPSB1c2VGaWJlcihjdXJyZW50LCBlbGVtZW50LnByb3BzKSksXG4gICAgICAgICAgICBjb2VyY2VSZWYoY3VycmVudCwgZWxlbWVudCksXG4gICAgICAgICAgICAoY3VycmVudC5yZXR1cm4gPSByZXR1cm5GaWJlciksXG4gICAgICAgICAgICAoY3VycmVudC5fZGVidWdPd25lciA9IGVsZW1lbnQuX293bmVyKSxcbiAgICAgICAgICAgIChjdXJyZW50Ll9kZWJ1Z0luZm8gPSBjdXJyZW50RGVidWdJbmZvKSxcbiAgICAgICAgICAgIGN1cnJlbnRcbiAgICAgICAgICApO1xuICAgICAgICBjdXJyZW50ID0gY3JlYXRlRmliZXJGcm9tRWxlbWVudChlbGVtZW50LCByZXR1cm5GaWJlci5tb2RlLCBsYW5lcyk7XG4gICAgICAgIGNvZXJjZVJlZihjdXJyZW50LCBlbGVtZW50KTtcbiAgICAgICAgY3VycmVudC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgY3VycmVudC5fZGVidWdJbmZvID0gY3VycmVudERlYnVnSW5mbztcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiB1cGRhdGVQb3J0YWwocmV0dXJuRmliZXIsIGN1cnJlbnQsIHBvcnRhbCwgbGFuZXMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG51bGwgPT09IGN1cnJlbnQgfHxcbiAgICAgICAgICA0ICE9PSBjdXJyZW50LnRhZyB8fFxuICAgICAgICAgIGN1cnJlbnQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8gIT09IHBvcnRhbC5jb250YWluZXJJbmZvIHx8XG4gICAgICAgICAgY3VycmVudC5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb24gIT09IHBvcnRhbC5pbXBsZW1lbnRhdGlvblxuICAgICAgICApXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChjdXJyZW50ID0gY3JlYXRlRmliZXJGcm9tUG9ydGFsKHBvcnRhbCwgcmV0dXJuRmliZXIubW9kZSwgbGFuZXMpKSxcbiAgICAgICAgICAgIChjdXJyZW50LnJldHVybiA9IHJldHVybkZpYmVyKSxcbiAgICAgICAgICAgIChjdXJyZW50Ll9kZWJ1Z0luZm8gPSBjdXJyZW50RGVidWdJbmZvKSxcbiAgICAgICAgICAgIGN1cnJlbnRcbiAgICAgICAgICApO1xuICAgICAgICBjdXJyZW50ID0gdXNlRmliZXIoY3VycmVudCwgcG9ydGFsLmNoaWxkcmVuIHx8IFtdKTtcbiAgICAgICAgY3VycmVudC5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgY3VycmVudC5fZGVidWdJbmZvID0gY3VycmVudERlYnVnSW5mbztcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiB1cGRhdGVGcmFnbWVudChyZXR1cm5GaWJlciwgY3VycmVudCwgZnJhZ21lbnQsIGxhbmVzLCBrZXkpIHtcbiAgICAgICAgaWYgKG51bGwgPT09IGN1cnJlbnQgfHwgNyAhPT0gY3VycmVudC50YWcpXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChjdXJyZW50ID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoXG4gICAgICAgICAgICAgIGZyYWdtZW50LFxuICAgICAgICAgICAgICByZXR1cm5GaWJlci5tb2RlLFxuICAgICAgICAgICAgICBsYW5lcyxcbiAgICAgICAgICAgICAga2V5XG4gICAgICAgICAgICApKSxcbiAgICAgICAgICAgIChjdXJyZW50LnJldHVybiA9IHJldHVybkZpYmVyKSxcbiAgICAgICAgICAgIChjdXJyZW50Ll9kZWJ1Z093bmVyID0gcmV0dXJuRmliZXIpLFxuICAgICAgICAgICAgKGN1cnJlbnQuX2RlYnVnVGFzayA9IHJldHVybkZpYmVyLl9kZWJ1Z1Rhc2spLFxuICAgICAgICAgICAgKGN1cnJlbnQuX2RlYnVnSW5mbyA9IGN1cnJlbnREZWJ1Z0luZm8pLFxuICAgICAgICAgICAgY3VycmVudFxuICAgICAgICAgICk7XG4gICAgICAgIGN1cnJlbnQgPSB1c2VGaWJlcihjdXJyZW50LCBmcmFnbWVudCk7XG4gICAgICAgIGN1cnJlbnQucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgIGN1cnJlbnQuX2RlYnVnSW5mbyA9IGN1cnJlbnREZWJ1Z0luZm87XG4gICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gY3JlYXRlQ2hpbGQocmV0dXJuRmliZXIsIG5ld0NoaWxkLCBsYW5lcykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKFwic3RyaW5nXCIgPT09IHR5cGVvZiBuZXdDaGlsZCAmJiBcIlwiICE9PSBuZXdDaGlsZCkgfHxcbiAgICAgICAgICBcIm51bWJlclwiID09PSB0eXBlb2YgbmV3Q2hpbGQgfHxcbiAgICAgICAgICBcImJpZ2ludFwiID09PSB0eXBlb2YgbmV3Q2hpbGRcbiAgICAgICAgKVxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAobmV3Q2hpbGQgPSBjcmVhdGVGaWJlckZyb21UZXh0KFxuICAgICAgICAgICAgICBcIlwiICsgbmV3Q2hpbGQsXG4gICAgICAgICAgICAgI
15852HJldHVybkZpYmVyLm1vZGUsXG4gICAgICAgICAgICAgIGxhbmVzXG4gICAgICAgICAgICApKSxcbiAgICAgICAgICAgIChuZXdDaGlsZC5yZXR1cm4gPSByZXR1cm5GaWJlciksXG4gICAgICAgICAgICAobmV3Q2hpbGQuX2RlYnVnT3duZXIgPSByZXR1cm5GaWJlciksXG4gICAgICAgICAgICAobmV3Q2hpbGQuX2RlYnVnVGFzayA9IHJldHVybkZpYmVyLl9kZWJ1Z1Rhc2spLFxuICAgICAgICAgICAgKG5ld0NoaWxkLl9kZWJ1Z0luZm8gPSBjdXJyZW50RGVidWdJbmZvKSxcbiAgICAgICAgICAgIG5ld0NoaWxkXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKFwib2JqZWN0XCIgPT09IHR5cGVvZiBuZXdDaGlsZCAmJiBudWxsICE9PSBuZXdDaGlsZCkge1xuICAgICAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIChsYW5lcyA9IGNyZWF0ZUZpYmVyRnJvbUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICBuZXdDaGlsZCxcbiAgICAgICAgICAgICAgICAgIHJldHVybkZpYmVyLm1vZGUsXG4gICAgICAgICAgICAgICAgICBsYW5lc1xuICAgICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICAgIGNvZXJjZVJlZihsYW5lcywgbmV3Q2hpbGQpLFxuICAgICAgICAgICAgICAgIChsYW5lcy5yZXR1cm4gPSByZXR1cm5GaWJlciksXG4gICAgICAgICAgICAgICAgKHJldHVybkZpYmVyID0gcHVzaERlYnVnSW5mbyhuZXdDaGlsZC5fZGVidWdJbmZvKSksXG4gICAgICAgICAgICAgICAgKGxhbmVzLl9kZWJ1Z0luZm8gPSBjdXJyZW50RGVidWdJbmZvKSxcbiAgICAgICAgICAgICAgICAoY3VycmVudERlYnVnSW5mbyA9IHJldHVybkZpYmVyKSxcbiAgICAgICAgICAgICAgICBsYW5lc1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAobmV3Q2hpbGQgPSBjcmVhdGVGaWJlckZyb21Qb3J0YWwoXG4gICAgICAgICAgICAgICAgICBuZXdDaGlsZCxcbiAgICAgICAgICAgICAgICAgIHJldHVybkZpYmVyLm1vZGUsXG4gICAgICAgICAgICAgICAgICBsYW5lc1xuICAgICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICAgIChuZXdDaGlsZC5yZXR1cm4gPSByZXR1cm5GaWJlciksXG4gICAgICAgICAgICAgICAgKG5ld0NoaWxkLl9kZWJ1Z0luZm8gPSBjdXJyZW50RGVidWdJbmZvKSxcbiAgICAgICAgICAgICAgICBuZXdDaGlsZFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgIHZhciBfcHJldkRlYnVnSW5mbyA9IHB1c2hEZWJ1Z0luZm8obmV3Q2hpbGQuX2RlYnVnSW5mbyk7XG4gICAgICAgICAgICAgIG5ld0NoaWxkID0gcmVzb2x2ZUxhenkobmV3Q2hpbGQpO1xuICAgICAgICAgICAgICByZXR1cm5GaWJlciA9IGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpO1xuICAgICAgICAgICAgICBjdXJyZW50RGVidWdJbmZvID0gX3ByZXZEZWJ1Z0luZm87XG4gICAgICAgICAgICAgIHJldHVybiByZXR1cm5GaWJlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzQXJyYXlJbXBsKG5ld0NoaWxkKSB8fCBnZXRJdGVyYXRvckZuKG5ld0NoaWxkKSlcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIChsYW5lcyA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KFxuICAgICAgICAgICAgICAgIG5ld0NoaWxkLFxuICAgICAgICAgICAgICAgIHJldHVybkZpYmVyLm1vZGUsXG4gICAgICAgICAgICAgICAgbGFuZXMsXG4gICAgICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgKGxhbmVzLnJldHVybiA9IHJldHVybkZpYmVyKSxcbiAgICAgICAgICAgICAgKGxhbmVzLl9kZWJ1Z093bmVyID0gcmV0dXJuRmliZXIpLFxuICAgICAgICAgICAgICAobGFuZXMuX2RlYnVnVGFzayA9IHJldHVybkZpYmVyLl9kZWJ1Z1Rhc2spLFxuICAgICAgICAgICAgICAocmV0dXJuRmliZXIgPSBwdXNoRGVidWdJbmZvKG5ld0NoaWxkLl9kZWJ1Z0luZm8pKSxcbiAgICAgICAgICAgICAgKGxhbmVzLl9kZWJ1Z0luZm8gPSBjdXJyZW50RGVidWdJbmZvKSxcbiAgICAgICAgICAgICAgKGN1cnJlbnREZWJ1Z0luZm8gPSByZXR1cm5GaWJlciksXG4gICAgICAgICAgICAgIGxhbmVzXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBuZXdDaGlsZC50aGVuKVxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgKF9wcmV2RGVidWdJbmZvID0gcHVzaERlYnVnSW5mbyhuZXdDaGlsZC5fZGVidWdJbmZvKSksXG4gICAgICAgICAgICAgIChyZXR1cm5GaWJlciA9IGNyZWF0ZUNoaWxkKFxuICAgICAgICAgICAgICAgIHJldHVybkZpYmVyLFxuICAgICAgICAgICAgICAgIHVud3JhcFRoZW5hYmxlKG5ld0NoaWxkKSxcbiAgICAgICAgICAgICAgICBsYW5lc1xuICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgKGN1cnJlbnREZWJ1Z0luZm8gPSBfcHJldkRlYnVnSW5mbyksXG4gICAgICAgICAgICAgIHJldHVybkZpYmVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGlmIChuZXdDaGlsZC4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFKVxuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUNoaWxkKFxuICAgICAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICAgICAgcmVhZENvbnRleHREdXJpbmdSZWNvbmNpbGlhdGlvbihyZXR1cm5GaWJlciwgbmV3Q2hpbGQpLFxuICAgICAgICAgICAgICBsYW5lc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKTtcbiAgICAgICAgfVxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBuZXdDaGlsZCAmJlxuICAgICAgICAgIHdhcm5PbkZ1bmN0aW9uVHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgICAgICBcInN5bWJvbFwiID09PSB0eXBlb2YgbmV3Q2hpbGQgJiYgd2Fyb
15852k9uU3ltYm9sVHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHVwZGF0ZVNsb3QocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBuZXdDaGlsZCwgbGFuZXMpIHtcbiAgICAgICAgdmFyIGtleSA9IG51bGwgIT09IG9sZEZpYmVyID8gb2xkRmliZXIua2V5IDogbnVsbDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChcInN0cmluZ1wiID09PSB0eXBlb2YgbmV3Q2hpbGQgJiYgXCJcIiAhPT0gbmV3Q2hpbGQpIHx8XG4gICAgICAgICAgXCJudW1iZXJcIiA9PT0gdHlwZW9mIG5ld0NoaWxkIHx8XG4gICAgICAgICAgXCJiaWdpbnRcIiA9PT0gdHlwZW9mIG5ld0NoaWxkXG4gICAgICAgIClcbiAgICAgICAgICByZXR1cm4gbnVsbCAhPT0ga2V5XG4gICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgIDogdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIG9sZEZpYmVyLCBcIlwiICsgbmV3Q2hpbGQsIGxhbmVzKTtcbiAgICAgICAgaWYgKFwib2JqZWN0XCIgPT09IHR5cGVvZiBuZXdDaGlsZCAmJiBudWxsICE9PSBuZXdDaGlsZCkge1xuICAgICAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgICAgICByZXR1cm4gbmV3Q2hpbGQua2V5ID09PSBrZXlcbiAgICAgICAgICAgICAgICA/ICgoa2V5ID0gcHVzaERlYnVnSW5mbyhuZXdDaGlsZC5fZGVidWdJbmZvKSksXG4gICAgICAgICAgICAgICAgICAocmV0dXJuRmliZXIgPSB1cGRhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICAgICAgICAgICAgb2xkRmliZXIsXG4gICAgICAgICAgICAgICAgICAgIG5ld0NoaWxkLFxuICAgICAgICAgICAgICAgICAgICBsYW5lc1xuICAgICAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgICAgICAoY3VycmVudERlYnVnSW5mbyA9IGtleSksXG4gICAgICAgICAgICAgICAgICByZXR1cm5GaWJlcilcbiAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgICAgICByZXR1cm4gbmV3Q2hpbGQua2V5ID09PSBrZXlcbiAgICAgICAgICAgICAgICA/IHVwZGF0ZVBvcnRhbChyZXR1cm5GaWJlciwgb2xkRmliZXIsIG5ld0NoaWxkLCBsYW5lcylcbiAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAoa2V5ID0gcHVzaERlYnVnSW5mbyhuZXdDaGlsZC5fZGVidWdJbmZvKSksXG4gICAgICAgICAgICAgICAgKG5ld0NoaWxkID0gcmVzb2x2ZUxhenkobmV3Q2hpbGQpKSxcbiAgICAgICAgICAgICAgICAocmV0dXJuRmliZXIgPSB1cGRhdGVTbG90KFxuICAgICAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgICAgICBvbGRGaWJlcixcbiAgICAgICAgICAgICAgICAgIG5ld0NoaWxkLFxuICAgICAgICAgICAgICAgICAgbGFuZXNcbiAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICAoY3VycmVudERlYnVnSW5mbyA9IGtleSksXG4gICAgICAgICAgICAgICAgcmV0dXJuRmliZXJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzQXJyYXlJbXBsKG5ld0NoaWxkKSB8fCBnZXRJdGVyYXRvckZuKG5ld0NoaWxkKSkge1xuICAgICAgICAgICAgaWYgKG51bGwgIT09IGtleSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBrZXkgPSBwdXNoRGVidWdJbmZvKG5ld0NoaWxkLl9kZWJ1Z0luZm8pO1xuICAgICAgICAgICAgcmV0dXJuRmliZXIgPSB1cGRhdGVGcmFnbWVudChcbiAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgIG9sZEZpYmVyLFxuICAgICAgICAgICAgICBuZXdDaGlsZCxcbiAgICAgICAgICAgICAgbGFuZXMsXG4gICAgICAgICAgICAgIG51bGxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjdXJyZW50RGVidWdJbmZvID0ga2V5O1xuICAgICAgICAgICAgcmV0dXJuIHJldHVybkZpYmVyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgbmV3Q2hpbGQudGhlbilcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIChrZXkgPSBwdXNoRGVidWdJbmZvKG5ld0NoaWxkLl9kZWJ1Z0luZm8pKSxcbiAgICAgICAgICAgICAgKHJldHVybkZpYmVyID0gdXBkYXRlU2xvdChcbiAgICAgICAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICAgICAgICBvbGRGaWJlcixcbiAgICAgICAgICAgICAgICB1bndyYXBUaGVuYWJsZShuZXdDaGlsZCksXG4gICAgICAgICAgICAgICAgbGFuZXNcbiAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgIChjdXJyZW50RGVidWdJbmZvID0ga2V5KSxcbiAgICAgICAgICAgICAgcmV0dXJuRmliZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKG5ld0NoaWxkLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUpXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlU2xvdChcbiAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgIG9sZEZpYmVyLFxuICAgICAgICAgICAgICByZWFkQ29udGV4dER1cmluZ1JlY29uY2lsaWF0aW9uKHJldHVybkZpYmVyLCBuZXdDaGlsZCksXG4gICAgICAgICAgICAgIGxhbmVzXG4gICAgICAgICAgICApO1xuICAgICAgICAgIHRocm93T25JbnZhbGlkT2JqZWN0VHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgICAgICB9XG4gICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIG5ld0NoaWxkICYmXG4gICAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgICAgIFwic3ltYm9sXCIgPT09IHR5cGVvZiBuZXdDaGlsZCAmJiB3YXJuT25TeW1ib2xUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gdXBkYXRlRnJvbU1hcChcbiAgICAgICAgZXhpc3RpbmdDaGlsZHJlbixcbiAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgIG5ld0lkeCxcbiAgICAgICAgbmV3Q2hpbGQsXG4gICAgICAgIGxhbmVzXG4gICAgICApIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChcInN0cmluZ1wiID09PSB0eXBlb2YgbmV3Q2hpbGQgJiYgXCJcIiAhPT0gbm
15852V3Q2hpbGQpIHx8XG4gICAgICAgICAgXCJudW1iZXJcIiA9PT0gdHlwZW9mIG5ld0NoaWxkIHx8XG4gICAgICAgICAgXCJiaWdpbnRcIiA9PT0gdHlwZW9mIG5ld0NoaWxkXG4gICAgICAgIClcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKGV4aXN0aW5nQ2hpbGRyZW4gPSBleGlzdGluZ0NoaWxkcmVuLmdldChuZXdJZHgpIHx8IG51bGwpLFxuICAgICAgICAgICAgdXBkYXRlVGV4dE5vZGUocmV0dXJuRmliZXIsIGV4aXN0aW5nQ2hpbGRyZW4sIFwiXCIgKyBuZXdDaGlsZCwgbGFuZXMpXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKFwib2JqZWN0XCIgPT09IHR5cGVvZiBuZXdDaGlsZCAmJiBudWxsICE9PSBuZXdDaGlsZCkge1xuICAgICAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIChuZXdJZHggPVxuICAgICAgICAgICAgICAgICAgZXhpc3RpbmdDaGlsZHJlbi5nZXQoXG4gICAgICAgICAgICAgICAgICAgIG51bGwgPT09IG5ld0NoaWxkLmtleSA/IG5ld0lkeCA6IG5ld0NoaWxkLmtleVxuICAgICAgICAgICAgICAgICAgKSB8fCBudWxsKSxcbiAgICAgICAgICAgICAgICAoZXhpc3RpbmdDaGlsZHJlbiA9IHB1c2hEZWJ1Z0luZm8obmV3Q2hpbGQuX2RlYnVnSW5mbykpLFxuICAgICAgICAgICAgICAgIChyZXR1cm5GaWJlciA9IHVwZGF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICAgICAgICAgIG5ld0lkeCxcbiAgICAgICAgICAgICAgICAgIG5ld0NoaWxkLFxuICAgICAgICAgICAgICAgICAgbGFuZXNcbiAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICAoY3VycmVudERlYnVnSW5mbyA9IGV4aXN0aW5nQ2hpbGRyZW4pLFxuICAgICAgICAgICAgICAgIHJldHVybkZpYmVyXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIChleGlzdGluZ0NoaWxkcmVuID1cbiAgICAgICAgICAgICAgICAgIGV4aXN0aW5nQ2hpbGRyZW4uZ2V0KFxuICAgICAgICAgICAgICAgICAgICBudWxsID09PSBuZXdDaGlsZC5rZXkgPyBuZXdJZHggOiBuZXdDaGlsZC5rZXlcbiAgICAgICAgICAgICAgICAgICkgfHwgbnVsbCksXG4gICAgICAgICAgICAgICAgdXBkYXRlUG9ydGFsKHJldHVybkZpYmVyLCBleGlzdGluZ0NoaWxkcmVuLCBuZXdDaGlsZCwgbGFuZXMpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgdmFyIF9wcmV2RGVidWdJbmZvNyA9IHB1c2hEZWJ1Z0luZm8obmV3Q2hpbGQuX2RlYnVnSW5mbyk7XG4gICAgICAgICAgICAgIG5ld0NoaWxkID0gcmVzb2x2ZUxhenkobmV3Q2hpbGQpO1xuICAgICAgICAgICAgICByZXR1cm5GaWJlciA9IHVwZGF0ZUZyb21NYXAoXG4gICAgICAgICAgICAgICAgZXhpc3RpbmdDaGlsZHJlbixcbiAgICAgICAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICAgICAgICBuZXdJZHgsXG4gICAgICAgICAgICAgICAgbmV3Q2hpbGQsXG4gICAgICAgICAgICAgICAgbGFuZXNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgY3VycmVudERlYnVnSW5mbyA9IF9wcmV2RGVidWdJbmZvNztcbiAgICAgICAgICAgICAgcmV0dXJuIHJldHVybkZpYmVyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNBcnJheUltcGwobmV3Q2hpbGQpIHx8IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGQpKVxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgKG5ld0lkeCA9IGV4aXN0aW5nQ2hpbGRyZW4uZ2V0KG5ld0lkeCkgfHwgbnVsbCksXG4gICAgICAgICAgICAgIChleGlzdGluZ0NoaWxkcmVuID0gcHVzaERlYnVnSW5mbyhuZXdDaGlsZC5fZGVidWdJbmZvKSksXG4gICAgICAgICAgICAgIChyZXR1cm5GaWJlciA9IHVwZGF0ZUZyYWdtZW50KFxuICAgICAgICAgICAgICAgIHJldHVybkZpYmVyLFxuICAgICAgICAgICAgICAgIG5ld0lkeCxcbiAgICAgICAgICAgICAgICBuZXdDaGlsZCxcbiAgICAgICAgICAgICAgICBsYW5lcyxcbiAgICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICAoY3VycmVudERlYnVnSW5mbyA9IGV4aXN0aW5nQ2hpbGRyZW4pLFxuICAgICAgICAgICAgICByZXR1cm5GaWJlclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgbmV3Q2hpbGQudGhlbilcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIChfcHJldkRlYnVnSW5mbzcgPSBwdXNoRGVidWdJbmZvKG5ld0NoaWxkLl9kZWJ1Z0luZm8pKSxcbiAgICAgICAgICAgICAgKHJldHVybkZpYmVyID0gdXBkYXRlRnJvbU1hcChcbiAgICAgICAgICAgICAgICBleGlzdGluZ0NoaWxkcmVuLFxuICAgICAgICAgICAgICAgIHJldHVybkZpYmVyLFxuICAgICAgICAgICAgICAgIG5ld0lkeCxcbiAgICAgICAgICAgICAgICB1bndyYXBUaGVuYWJsZShuZXdDaGlsZCksXG4gICAgICAgICAgICAgICAgbGFuZXNcbiAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgIChjdXJyZW50RGVidWdJbmZvID0gX3ByZXZEZWJ1Z0luZm83KSxcbiAgICAgICAgICAgICAgcmV0dXJuRmliZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKG5ld0NoaWxkLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUpXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlRnJvbU1hcChcbiAgICAgICAgICAgICAgZXhpc3RpbmdDaGlsZHJlbixcbiAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgIG5ld0lkeCxcbiAgICAgICAgICAgICAgcmVhZENvbnRleHREdXJpbmdSZWNvbmNpbGlhdGlvbihyZXR1cm5GaWJlciwgbmV3Q2hpbGQpLFxuICAgICAgICAgICAgICBsYW5lc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB0aHJvd09uSW52YWxpZE9iamVjdFR5cGUocmV0dXJuRmliZXIsIG5ld0NoaWxkKTtcbiAgICAgICAgfVxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBuZXdDaGlsZCAmJlxuICAgICAgICAgI
15852Hdhcm5PbkZ1bmN0aW9uVHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgICAgICBcInN5bWJvbFwiID09PSB0eXBlb2YgbmV3Q2hpbGQgJiYgd2Fybk9uU3ltYm9sVHlwZShyZXR1cm5GaWJlciwgbmV3Q2hpbGQpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHdhcm5PbkludmFsaWRLZXkocmV0dXJuRmliZXIsIHdvcmtJblByb2dyZXNzLCBjaGlsZCwga25vd25LZXlzKSB7XG4gICAgICAgIGlmIChcIm9iamVjdFwiICE9PSB0eXBlb2YgY2hpbGQgfHwgbnVsbCA9PT0gY2hpbGQpIHJldHVybiBrbm93bktleXM7XG4gICAgICAgIHN3aXRjaCAoY2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcbiAgICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgICAgd2FybkZvck1pc3NpbmdLZXkocmV0dXJuRmliZXIsIHdvcmtJblByb2dyZXNzLCBjaGlsZCk7XG4gICAgICAgICAgICB2YXIga2V5ID0gY2hpbGQua2V5O1xuICAgICAgICAgICAgaWYgKFwic3RyaW5nXCIgIT09IHR5cGVvZiBrZXkpIGJyZWFrO1xuICAgICAgICAgICAgaWYgKG51bGwgPT09IGtub3duS2V5cykge1xuICAgICAgICAgICAgICBrbm93bktleXMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICAgIGtub3duS2V5cy5hZGQoa2V5KTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWtub3duS2V5cy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgICBrbm93bktleXMuYWRkKGtleSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcnVuV2l0aEZpYmVySW5ERVYod29ya0luUHJvZ3Jlc3MsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBcIkVuY291bnRlcmVkIHR3byBjaGlsZHJlbiB3aXRoIHRoZSBzYW1lIGtleSwgYCVzYC4gS2V5cyBzaG91bGQgYmUgdW5pcXVlIHNvIHRoYXQgY29tcG9uZW50cyBtYWludGFpbiB0aGVpciBpZGVudGl0eSBhY3Jvc3MgdXBkYXRlcy4gTm9uLXVuaXF1ZSBrZXlzIG1heSBjYXVzZSBjaGlsZHJlbiB0byBiZSBkdXBsaWNhdGVkIGFuZC9vciBvbWl0dGVkIFxcdTIwMTQgdGhlIGJlaGF2aW9yIGlzIHVuc3VwcG9ydGVkIGFuZCBjb3VsZCBjaGFuZ2UgaW4gYSBmdXR1cmUgdmVyc2lvbi5cIixcbiAgICAgICAgICAgICAgICBrZXlcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAoY2hpbGQgPSByZXNvbHZlTGF6eShjaGlsZCkpLFxuICAgICAgICAgICAgICB3YXJuT25JbnZhbGlkS2V5KHJldHVybkZpYmVyLCB3b3JrSW5Qcm9ncmVzcywgY2hpbGQsIGtub3duS2V5cyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGtub3duS2V5cztcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkcmVuQXJyYXkoXG4gICAgICAgIHJldHVybkZpYmVyLFxuICAgICAgICBjdXJyZW50Rmlyc3RDaGlsZCxcbiAgICAgICAgbmV3Q2hpbGRyZW4sXG4gICAgICAgIGxhbmVzXG4gICAgICApIHtcbiAgICAgICAgZm9yIChcbiAgICAgICAgICB2Y
15852XIga25vd25LZXlzID0gbnVsbCxcbiAgICAgICAgICAgIHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBudWxsLFxuICAgICAgICAgICAgcHJldmlvdXNOZXdGaWJlciA9IG51bGwsXG4gICAgICAgICAgICBvbGRGaWJlciA9IGN1cnJlbnRGaXJzdENoaWxkLFxuICAgICAgICAgICAgbmV3SWR4ID0gKGN1cnJlbnRGaXJzdENoaWxkID0gMCksXG4gICAgICAgICAgICBuZXh0T2xkRmliZXIgPSBudWxsO1xuICAgICAgICAgIG51bGwgIT09IG9sZEZpYmVyICYmIG5ld0lkeCA8IG5ld0NoaWxkcmVuLmxlbmd0aDtcbiAgICAgICAgICBuZXdJZHgrK1xuICAgICAgICApIHtcbiAgICAgICAgICBvbGRGaWJlci5pbmRleCA+IG5ld0lkeFxuICAgICAgICAgICAgPyAoKG5leHRPbGRGaWJlciA9IG9sZEZpYmVyKSwgKG9sZEZpYmVyID0gbnVsbCkpXG4gICAgICAgICAgICA6IChuZXh0T2xkRmliZXIgPSBvbGRGaWJlci5zaWJsaW5nKTtcbiAgICAgICAgICB2YXIgbmV3RmliZXIgPSB1cGRhdGVTbG90KFxuICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICBvbGRGaWJlcixcbiAgICAgICAgICAgIG5ld0NoaWxkcmVuW25ld0lkeF0sXG4gICAgICAgICAgICBsYW5lc1xuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKG51bGwgPT09IG5ld0ZpYmVyKSB7XG4gICAgICAgICAgICBudWxsID09PSBvbGRGaWJlciAmJiAob2xkRmliZXIgPSBuZXh0T2xkRmliZXIpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGtub3duS2V5cyA9IHdhcm5PbkludmFsaWRLZXkoXG4gICAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICAgIG5ld0ZpYmVyLFxuICAgICAgICAgICAgbmV3Q2hpbGRyZW5bbmV3SWR4XSxcbiAgICAgICAgICAgIGtub3duS2V5c1xuICAgICAgICAgICk7XG4gICAgICAgICAgc2hvdWxkVHJhY2tTaWRlRWZmZWN0cyAmJlxuICAgICAgICAgICAgb2xkRmliZXIgJiZcbiAgICAgICAgICAgIG51bGwgPT09IG5ld0ZpYmVyLmFsdGVybmF0ZSAmJlxuICAgICAgICAgICAgZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIG9sZEZpYmVyKTtcbiAgICAgICAgICBjdXJyZW50Rmlyc3RDaGlsZCA9IHBsYWNlQ2hpbGQobmV3RmliZXIsIGN1cnJlbnRGaXJzdENoaWxkLCBuZXdJZHgpO1xuICAgICAgICAgIG51bGwgPT09IHByZXZpb3VzTmV3RmliZXJcbiAgICAgICAgICAgID8gKHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBuZXdGaWJlcilcbiAgICAgICAgICAgIDogKHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IG5ld0ZpYmVyKTtcbiAgICAgICAgICBwcmV2aW91c05ld0ZpYmVyID0gbmV3RmliZXI7XG4gICAgICAgICAgb2xkRmliZXIgPSBuZXh0T2xkRmliZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5ld0lkeCA9PT0gbmV3Q2hpbGRyZW4ubGVuZ3RoKVxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgb2xkRmliZXIpLFxuICAgICAgICAgICAgaXNIeWRyYXRpbmcgJiYgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBuZXdJZHgpLFxuICAgICAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZFxuICAgICAgICAgICk7XG4gICAgICAgIGlmIChudWxsID09PSBvbGRGaWJlcikge1xuICAgICAgICAgIGZvciAoOyBuZXdJZHggPCBuZXdDaGlsZHJlbi5sZW5ndGg7IG5ld0lkeCsrKVxuICAgICAgICAgICAgKG9sZEZpYmVyID0gY3JlYXRlQ2hpbGQocmV0dXJuRmliZXIsIG5ld0NoaWxkcmVuW25ld0lkeF0sIGxhbmVzKSksXG4gICAgICAgICAgICAgIG51bGwgIT09IG9sZEZpYmVyICYmXG4gICAgICAgICAgICAgICAgKChrbm93bktleXMgPSB3YXJuT25JbnZhbGlkS2V5KFxuICAgICAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgICAgICBvbGRGaWJlcixcbiAgICAgICAgICAgICAgICAgIG5ld0NoaWxkcmVuW25ld0lkeF0sXG4gICAgICAgICAgICAgICAgICBrbm93bktleXNcbiAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICAoY3VycmVudEZpcnN0Q2hpbGQgPSBwbGFjZUNoaWxkKFxuICAgICAgICAgICAgICAgICAgb2xkRmliZXIsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50Rmlyc3RDaGlsZCxcbiAgICAgICAgICAgICAgICAgIG5ld0lkeFxuICAgICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICAgIG51bGwgPT09IHByZXZpb3VzTmV3RmliZXJcbiAgICAgICAgICAgICAgICAgID8gKHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBvbGRGaWJlcilcbiAgICAgICAgICAgICAgICAgIDogKHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IG9sZEZpYmVyKSxcbiAgICAgICAgICAgICAgICAocHJldmlvdXNOZXdGaWJlciA9IG9sZEZpYmVyKSk7XG4gICAgICAgICAgaXNIeWRyYXRpbmcgJiYgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBuZXdJZHgpO1xuICAgICAgICAgIHJldHVybiByZXN1bHRpbmdGaXJzdENoaWxkO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoXG4gICAgICAgICAgb2xkRmliZXIgPSBtYXBSZW1haW5pbmdDaGlsZHJlbihvbGRGaWJlcik7XG4gICAgICAgICAgbmV3SWR4IDwgbmV3Q2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgICAgIG5ld0lkeCsrXG4gICAgICAgIClcbiAgICAgICAgICAobmV4dE9sZEZpYmVyID0gdXBkYXRlRnJvbU1hcChcbiAgICAgICAgICAgIG9sZEZpYmVyLFxuICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICBuZXdJZHgsXG4gICAgICAgICAgICBuZXdDaGlsZHJlbltuZXdJZHhdLFxuICAgICAgICAgICAgbGFuZXNcbiAgICAgICAgICApKSxcbiAgICAgICAgICAgIG51bGwgIT09IG5leHRPbGRGaWJlciAmJlxuICAgICAgICAgICAgICAoKGtub3duS2V5cyA9IHdhcm5PbkludmFsaWRLZXkoXG4gICAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgICAgbmV4dE9sZEZpYmVyLFxuICAgICAgICAgICAgICAgIG5ld0NoaWxkcmVuW25ld0lkeF0sXG4gICAgICAgICAgICAgICAga25vd25LZXlzXG4gICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICBzaG91bGRUcmFja1NpZGVFZmZlY3RzICYmXG4gICAgICAgICAgICAgICAgKChuZXdGaWJlciA9IG5leHRPbGRGaWJlci5hbHRlcm5hdGUpLFxuICAgICAgICAgICAgICAgIG51bGwgIT09IG5ld0ZpYmVyICYmXG4gICAgICAgICAgICAgICAgICBvbGRGaWJlci5kZWxldGUoXG4gICAgICAgICAgICAgICAgICAgIG51bGwgPT09IG5ld0ZpYmVyLmtleSA/IG5ld0lkeCA6IG5ld0ZpYmVyLmtleVxuICAgICAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgIChjdXJyZW50Rmlyc3RDaGlsZCA9IHBsYWNlQ2hpbGQoXG4gICAgICAgICAgICAgICAgbmV4dE9sZEZpYmVyLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRGaXJzdENoaWxkLFxuICAgICAgICAgICAgICAgIG5ld0lkeFxuICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgbnVsbCA9PT0gcHJldmlvdXNOZXdGaWJlclxuICAgICAgICAgICAgICAgID8gKHJlc3VsdGluZ0ZpcnN0Q2hpbGQgPSBuZXh0T2xkRmliZXIpXG4gICAgICAgICAgICAgICAgOiAocHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gbmV4dE9sZEZpYmVyKSxcbiAgICAgICAgICAgICAgKHByZXZpb3VzTmV3RmliZXIgPSBuZXh0T2xkRmliZXIpKTtcbiAgICAgICAgc2hvdWxkVHJhY2tTaWRlRWZmZWN0cyAmJlxuICAgICAgICAgIG9sZEZpYmVyLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVsZXRlQ2hpbGQocmV0dXJuRmliZXIsIGNoaWxkKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgaXNIeWRyYXRpbmcgJiYgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBuZXdJZHgpO1xuICAgICAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkcmVuSXRlcmF0b3IoXG4gICAgICAgI
15852HJldHVybkZpYmVyLFxuICAgICAgICBjdXJyZW50Rmlyc3RDaGlsZCxcbiAgICAgICAgbmV3Q2hpbGRyZW4sXG4gICAgICAgIGxhbmVzXG4gICAgICApIHtcbiAgICAgICAgaWYgKG51bGwgPT0gbmV3Q2hpbGRyZW4pXG4gICAgICAgICAgdGhyb3cgRXJyb3IoXCJBbiBpdGVyYWJsZSBvYmplY3QgcHJvdmlkZWQgbm8gaXRlcmF0b3IuXCIpO1xuICAgICAgICBmb3IgKFxuICAgICAgICAgIHZhciByZXN1bHRpbmdGaXJzdENoaWxkID0gbnVsbCxcbiAgICAgICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBudWxsLFxuICAgICAgICAgICAgb2xkRmliZXIgPSBjdXJyZW50Rmlyc3RDaGlsZCxcbiAgICAgICAgICAgIG5ld0lkeCA9IChjdXJyZW50Rmlyc3RDaGlsZCA9IDApLFxuICAgICAgICAgICAgbmV4dE9sZEZpYmVyID0gbnVsbCxcbiAgICAgICAgICAgIGtub3duS2V5cyA9IG51bGwsXG4gICAgICAgICAgICBzdGVwID0gbmV3Q2hpbGRyZW4ubmV4dCgpO1xuICAgICAgICAgIG51bGwgIT09IG9sZEZpYmVyICYmICFzdGVwLmRvbmU7XG4gICAgICAgICAgbmV3SWR4KyssIHN0ZXAgPSBuZXdDaGlsZHJlbi5uZXh0KClcbiAgICAgICAgKSB7XG4gICAgICAgICAgb2xkRmliZXIuaW5kZXggPiBuZXdJZHhcbiAgICAgICAgICAgID8gKChuZXh0T2xkRmliZXIgPSBvbGRGaWJlciksIChvbGRGaWJlciA9IG51bGwpKVxuICAgICAgICAgICAgOiAobmV4dE9sZEZpYmVyID0gb2xkRmliZXIuc2libGluZyk7XG4gICAgICAgICAgdmFyIG5ld0ZpYmVyID0gdXBkYXRlU2xvdChyZXR1cm5GaWJlciwgb2xkRmliZXIsIHN0ZXAudmFsdWUsIGxhbmVzKTtcbiAgICAgICAgICBpZiAobnVsbCA9PT0gbmV3RmliZXIpIHtcbiAgICAgICAgICAgIG51bGwgPT09IG9sZEZpYmVyICYmIChvbGRGaWJlciA9IG5leHRPbGRGaWJlcik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAga25vd25LZXlzID0gd2Fybk9uSW52YWxpZEtleShcbiAgICAgICAgICAgIHJldHVybkZpYmVyLFxuICAgICAgICAgICAgbmV3RmliZXIsXG4gICAgICAgICAgICBzdGVwLnZhbHVlLFxuICAgICAgICAgICAga25vd25LZXlzXG4gICAgICAgICAgKTtcbiAgICAgICAgICBzaG91bGRUcmFja1NpZGVFZmZlY3RzICYmXG4gICAgICAgICAgICBvbGRGaWJlciAmJlxuICAgICAgICAgICAgbnVsbCA9PT0gbmV3RmliZXIuYWx0ZXJuYXRlICYmXG4gICAgICAgICAgICBkZWxldGVDaGlsZChyZXR1cm5GaWJlciwgb2xkRmliZXIpO1xuICAgICAgICAgIGN1cnJlbnRGaXJzdENoaWxkID0gcGxhY2VDaGlsZChuZXdGaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0lkeCk7XG4gICAgICAgICAgbnVsbCA9PT0gcHJldmlvdXNOZXdGaWJlclxuICAgICAgICAgICAgPyAocmVzdWx0aW5nRmlyc3RDaGlsZCA9IG5ld0ZpYmVyKVxuICAgICAgICAgICAgOiAocHJldmlvdXNOZXdGaWJlci5zaWJsaW5nID0gbmV3RmliZXIpO1xuICAgICAgICAgIHByZXZpb3VzTmV3RmliZXIgPSBuZXdGaWJlcjtcbiAgICAgICAgICBvbGRGaWJlciA9IG5leHRPbGRGaWJlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RlcC5kb25lKVxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgb2xkRmliZXIpLFxuICAgICAgICAgICAgaXNIeWRyYXRpbmcgJiYgcHVzaFRyZWVGb3JrKHJldHVybkZpYmVyLCBuZXdJZHgpLFxuICAgICAgICAgICAgcmVzdWx0aW5nRmlyc3RDaGlsZFxuICAgICAgICAgICk7XG4gICAgICAgIGlmIChudWxsID09PSBvbGRGaWJlcikge1xuICAgICAgICAgIGZvciAoOyAhc3RlcC5kb25lOyBuZXdJZHgrKywgc3RlcCA9IG5ld0NoaWxkcmVuLm5leHQoKSlcbiAgICAgICAgICAgIChvbGRGaWJlciA9IGNyZWF0ZUNoaWxkKHJldHVybkZpYmVyLCBzdGVwLnZhbHVlLCBsYW5lcykpLFxuICAgICAgICAgICAgICBudWxsICE9PSBvbGRGaWJlciAmJlxuICAgICAgICAgICAgICAgICgoa25vd25LZXlzID0gd2Fybk9uSW52YWxpZEtleShcbiAgICAgICAgICAgICAgICAgIHJldHVybkZpYmVyLFxuICAgICAgICAgICAgICAgICAgb2xkRmliZXIsXG4gICAgICAgICAgICAgICAgICBzdGVwLnZhbHVlLFxuICAgICAgICAgICAgICAgICAga25vd25LZXlzXG4gICAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgICAgKGN1cnJlbnRGaXJzdENoaWxkID0gcGxhY2VDaGlsZChcbiAgICAgICAgICAgICAgICAgIG9sZEZpYmVyLFxuICAgICAgICAgICAgICAgICAgY3VycmVudEZpcnN0Q2hpbGQsXG4gICAgICAgICAgICAgICAgICBuZXdJZHhcbiAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICBudWxsID09PSBwcmV2aW91c05ld0ZpYmVyXG4gICAgICAgICAgICAgICAgICA/IChyZXN1bHRpbmdGaXJzdENoaWxkID0gb2xkRmliZXIpXG4gICAgICAgICAgICAgICAgICA6IChwcmV2aW91c05ld0ZpYmVyLnNpYmxpbmcgPSBvbGRGaWJlciksXG4gICAgICAgICAgICAgICAgKHByZXZpb3VzTmV3RmliZXIgPSBvbGRGaWJlcikpO1xuICAgICAgICAgIGlzSHlkcmF0aW5nICYmIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgbmV3SWR4KTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0aW5nRmlyc3RDaGlsZDtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKFxuICAgICAgICAgIG9sZEZpYmVyID0gbWFwUmVtYWluaW5nQ2hpbGRyZW4ob2xkRmliZXIpO1xuICAgICAgICAgICFzdGVwLmRvbmU7XG4gICAgICAgICAgbmV3SWR4KyssIHN0ZXAgPSBuZXdDaGlsZHJlbi5uZXh0KClcbiAgICAgICAgKVxuICAgICAgICAgIChuZXh0T2xkRmliZXIgPSB1cGRhdGVGcm9tTWFwKFxuICAgICAgICAgICAgb2xkRmliZXIsXG4gICAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICAgIG5ld0lkeCxcbiAgICAgICAgICAgIHN0ZXAudmFsdWUsXG4gICAgICAgICAgICBsYW5lc1xuICAgICAgICAgICkpLFxuICAgICAgICAgICAgbnVsbCAhPT0gbmV4dE9sZEZpYmVyICYmXG4gICAgICAgICAgICAgICgoa25vd25LZXlzID0gd2Fybk9uSW52YWxpZEtleShcbiAgICAgICAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICAgICAgICBuZXh0T2xkRmliZXIsXG4gICAgICAgICAgICAgICAgc3RlcC52YWx1ZSxcbiAgICAgICAgICAgICAgICBrbm93bktleXNcbiAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgI
15852HNob3VsZFRyYWNrU2lkZUVmZmVjdHMgJiZcbiAgICAgICAgICAgICAgICAoKHN0ZXAgPSBuZXh0T2xkRmliZXIuYWx0ZXJuYXRlKSxcbiAgICAgICAgICAgICAgICBudWxsICE9PSBzdGVwICYmXG4gICAgICAgICAgICAgICAgICBvbGRGaWJlci5kZWxldGUobnVsbCA9PT0gc3RlcC5rZXkgPyBuZXdJZHggOiBzdGVwLmtleSkpLFxuICAgICAgICAgICAgICAoY3VycmVudEZpcnN0Q2hpbGQgPSBwbGFjZUNoaWxkKFxuICAgICAgICAgICAgICAgIG5leHRPbGRGaWJlcixcbiAgICAgICAgICAgICAgICBjdXJyZW50Rmlyc3RDaGlsZCxcbiAgICAgICAgICAgICAgICBuZXdJZHhcbiAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgIG51bGwgPT09IHByZXZpb3VzTmV3RmliZXJcbiAgICAgICAgICAgICAgICA/IChyZXN1bHRpbmdGaXJzdENoaWxkID0gbmV4dE9sZEZpYmVyKVxuICAgICAgICAgICAgICAgIDogKHByZXZpb3VzTmV3RmliZXIuc2libGluZyA9IG5leHRPbGRGaWJlciksXG4gICAgICAgICAgICAgIChwcmV2aW91c05ld0ZpYmVyID0gbmV4dE9sZEZpYmVyKSk7XG4gICAgICAgIHNob3VsZFRyYWNrU2lkZUVmZmVjdHMgJiZcbiAgICAgICAgICBvbGRGaWJlci5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgICAgcmV0dXJuIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjaGlsZCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIGlzSHlkcmF0aW5nICYmIHB1c2hUcmVlRm9yayhyZXR1cm5GaWJlciwgbmV3SWR4KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdGluZ0ZpcnN0Q2hpbGQ7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiByZWNvbmNpbGVDaGlsZEZpYmVyc0ltcGwoXG4gICAgICAgIHJldHVybkZpYmVyLFxuICAgICAgICBjdXJyZW50Rmlyc3RDaGlsZCxcbiAgICAgICAgbmV3Q2hpbGQsXG4gICAgICAgIGxhbmVzXG4gICAgICApIHtcbiAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIG5ld0NoaWxkICYmXG4gICAgICAgICAgbnVsbCAhPT0gbmV3Q2hpbGQgJiZcbiAgICAgICAgICBuZXdDaGlsZC50eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFICYmXG4gICAgICAgICAgbnVsbCA9PT0gbmV3Q2hpbGQua2V5ICYmXG4gICAgICAgICAgdm9pZCAwID09PSBuZXdDaGlsZC5wcm9wcy5yZWYgJiZcbiAgICAgICAgICAodmFsaWRhdGVGcmFnbWVudFByb3BzKG5ld0NoaWxkLCBudWxsLCByZXR1cm5GaWJlciksXG4gICAgICAgICAgKG5ld0NoaWxkID0gbmV3Q2hpbGQucHJvcHMuY2hpbGRyZW4pKTtcbiAgICAgICAgaWYgKFwib2JqZWN0XCIgPT09IHR5cGVvZiBuZXdDaGlsZCAmJiBudWxsICE9PSBuZXdDaGlsZCkge1xuICAgICAgICAgIHN3aXRjaCAobmV3Q2hpbGQuJCR0eXBlb2YpIHtcbiAgICAgICAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuICAgICAgICAgICAgICB2Y
15852XIgcHJldkRlYnVnSW5mbyA9IHB1c2hEZWJ1Z0luZm8obmV3Q2hpbGQuX2RlYnVnSW5mbyk7XG4gICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgPSBuZXdDaGlsZC5rZXk7IG51bGwgIT09IGN1cnJlbnRGaXJzdENoaWxkOyApIHtcbiAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Rmlyc3RDaGlsZC5rZXkgPT09IGtleSkge1xuICAgICAgICAgICAgICAgICAgICBrZXkgPSBuZXdDaGlsZC50eXBlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKDcgPT09IGN1cnJlbnRGaXJzdENoaWxkLnRhZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybkZpYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Rmlyc3RDaGlsZC5zaWJsaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFuZXMgPSB1c2VGaWJlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEZpcnN0Q2hpbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NoaWxkLnByb3BzLmNoaWxkcmVuXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29lcmNlUmVmKGxhbmVzLCBuZXdDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYW5lcy5yZXR1cm4gPSByZXR1cm5GaWJlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhbmVzLl9kZWJ1Z093bmVyID0gbmV3Q2hpbGQuX293bmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFuZXMuX2RlYnVnSW5mbyA9IGN1cnJlbnREZWJ1Z0luZm87XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUZyYWdtZW50UHJvcHMobmV3Q2hpbGQsIGxhbmVzLCByZXR1cm5GaWJlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5GaWJlciA9IGxhbmVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudEZpcnN0Q2hpbGQuZWxlbWVudFR5cGUgPT09IGtleSB8fFxuICAgICAgICAgICAgICAgICAgICAgIGlzQ29tcGF0aWJsZUZhbWlseUZvckhvdFJlbG9hZGluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGaXJzdENoaWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2hpbGRcbiAgICAgICAgICAgICAgICAgICAgICApIHx8XG4gICAgICAgICAgICAgICAgICAgICAgKFwib2JqZWN0XCIgPT09IHR5cGVvZiBrZXkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT09IGtleSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAga2V5LiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVMYXp5KGtleSkgPT09IGN1cnJlbnRGaXJzdENoaWxkLnR5cGUpXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Rmlyc3RDaGlsZC5zaWJsaW5nXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBsYW5lcyA9IHVzZUZpYmVyKGN1cnJlbnRGaXJzdENoaWxkLCBuZXdDaGlsZC5wcm9wcyk7XG4gICAgICAgICAgICAgICAgICAgICAgY29lcmNlUmVmKGxhbmVzLCBuZXdDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgbGFuZXMucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgICAgICAgICAgICAgICAgbGFuZXMuX2RlYnVnT3duZXIgPSBuZXdDaGlsZC5fb3duZXI7XG4gICAgICAgICAgICAgICAgICAgICAgbGFuZXMuX2RlYnVnSW5mbyA9IGN1cnJlbnREZWJ1Z0luZm87XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuRmliZXIgPSBsYW5lcztcbiAgICAgICAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCk7XG4gICAgICAgICAgICAgICAgICBjdXJyZW50Rmlyc3RDaGlsZCA9IGN1cnJlbnRGaXJzdENoaWxkLnNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG5ld0NoaWxkLnR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEVcbiAgICAgICAgICAgICAgICAgID8gKChsYW5lcyA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KFxuICAgICAgICAgICAgICAgICAgICAgIG5ld0NoaWxkLnByb3BzLmNoaWxkcmVuLFxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybkZpYmVyLm1vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgbGFuZXMsXG4gICAgICAgICAgICAgICAgICAgICAgbmV3Q2hpbGQua2V5XG4gICAgICAgICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICAgICAgICBjb2VyY2VSZWYobGFuZXMsIG5ld0NoaWxkKSxcbiAgICAgICAgICAgICAgICAgICAgKGxhbmVzLnJldHVybiA9IHJldHVybkZpYmVyKSxcbiAgICAgICAgICAgICAgICAgICAgKGxhbmVzLl9kZWJ1Z093bmVyID0gcmV0dXJuRmliZXIpLFxuICAgICAgICAgICAgICAgICAgICAobGFuZXMuX2RlYnVnVGFzayA9IHJldHVybkZpYmVyLl9kZWJ1Z1Rhc2spLFxuICAgICAgICAgICAgICAgICAgICAobGFuZXMuX2RlYnVnSW5mbyA9IGN1cnJlbnREZWJ1Z0luZm8pLFxuICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUZyYWdtZW50UHJvcHMobmV3Q2hpbGQsIGxhbmVzLCByZXR1cm5GaWJlciksXG4gICAgICAgICAgICAgICAgICAgIChyZXR1cm5GaWJlciA9IGxhbmVzKSlcbiAgICAgICAgICAgICAgICAgIDogKChsYW5lcyA9IGNyZWF0ZUZpYmVyRnJvbUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgbmV3Q2hpbGQsXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuRmliZXIubW9kZSxcbiAgICAgICAgICAgICAgICAgICAgICBsYW5lc1xuICAgICAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICAgICAgY29lcmNlUmVmKGxhbmVzLCBuZXdDaGlsZCksXG4gICAgICAgICAgICAgICAgICAgIChsYW5lcy5yZXR1cm4gPSByZXR1cm5GaWJlciksXG4gICAgICAgICAgICAgICAgICAgIChsYW5lcy5fZGVidWdJbmZvID0gY3VycmVudERlYnVnSW5mbyksXG4gICAgICAgICAgICAgICAgICAgIChyZXR1cm5GaWJlciA9IGxhbmVzKSk7XG4gICAgICAgICAgICAgI
15852H1cbiAgICAgICAgICAgICAgcmV0dXJuRmliZXIgPSBwbGFjZVNpbmdsZUNoaWxkKHJldHVybkZpYmVyKTtcbiAgICAgICAgICAgICAgY3VycmVudERlYnVnSW5mbyA9IHByZXZEZWJ1Z0luZm87XG4gICAgICAgICAgICAgIHJldHVybiByZXR1cm5GaWJlcjtcbiAgICAgICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICBwcmV2RGVidWdJbmZvID0gbmV3Q2hpbGQ7XG4gICAgICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgICAgIG5ld0NoaWxkID0gcHJldkRlYnVnSW5mby5rZXk7XG4gICAgICAgICAgICAgICAgICBudWxsICE9PSBjdXJyZW50Rmlyc3RDaGlsZDtcblxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRGaXJzdENoaWxkLmtleSA9PT0gbmV3Q2hpbGQpXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICA0ID09PSBjdXJyZW50Rmlyc3RDaGlsZC50YWcgJiZcbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Rmlyc3RDaGlsZC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZEZWJ1Z0luZm8uY29udGFpbmVySW5mbyAmJlxuICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGaXJzdENoaWxkLnN0YXRlTm9kZS5pbXBsZW1lbnRhdGlvbiA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZEZWJ1Z0luZm8uaW1wbGVtZW50YXRpb25cbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZGVsZXRlUmVtYWluaW5nQ2hpbGRyZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGaXJzdENoaWxkLnNpYmxpbmdcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGxhbmVzID0gdXNlRmliZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Rmlyc3RDaGlsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZEZWJ1Z0luZm8uY2hpbGRyZW4gfHwgW11cbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGxhbmVzLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybkZpYmVyID0gbGFuZXM7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBlbHNlIGRlbGV0ZUNoaWxkKHJldHVybkZpYmVyLCBjdXJyZW50Rmlyc3RDaGlsZCk7XG4gICAgICAgICAgICAgICAgICBjdXJyZW50Rmlyc3RDaGlsZCA9IGN1cnJlbnRGaXJzdENoaWxkLnNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxhbmVzID0gY3JlYXRlRmliZXJGcm9tUG9ydGFsKFxuICAgICAgICAgICAgICAgICAgcHJldkRlYnVnSW5mbyxcbiAgICAgICAgICAgICAgICAgIHJldHVybkZpYmVyLm1vZGUsXG4gICAgICAgICAgICAgICAgICBsYW5lc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgbGFuZXMucmV0dXJuID0gcmV0dXJuRmliZXI7XG4gICAgICAgICAgICAgICAgcmV0dXJuRmliZXIgPSBsYW5lcztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gcGxhY2VTaW5nbGVDaGlsZChyZXR1cm5GaWJlcik7XG4gICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAocHJldkRlYnVnSW5mbyA9IHB1c2hEZWJ1Z0luZm8obmV3Q2hpbGQuX2RlYnVnSW5mbykpLFxuICAgICAgICAgICAgICAgIChuZXdDaGlsZCA9IHJlc29sdmVMYXp5KG5ld0NoaWxkKSksXG4gICAgICAgICAgICAgICAgKHJldHVybkZpYmVyID0gcmVjb25jaWxlQ2hpbGRGaWJlcnNJbXBsKFxuICAgICAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50Rmlyc3RDaGlsZCxcbiAgICAgICAgICAgICAgICAgIG5ld0NoaWxkLFxuICAgICAgICAgICAgICAgICAgbGFuZXNcbiAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICAoY3VycmVudERlYnVnSW5mbyA9IHByZXZEZWJ1Z0luZm8pLFxuICAgICAgICAgICAgICAgIHJldHVybkZpYmVyXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc0FycmF5SW1wbChuZXdDaGlsZCkpXG4gICAgICAgICAgICByZXR1cm4gcmVjb25jaWxlQ2hpbGRyZW5BcnJheShcbiAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgIGN1cnJlbnRGaXJzdENoaWxkLFxuICAgICAgICAgICAgICBuZXdDaGlsZCxcbiAgICAgICAgICAgICAgbGFuZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGdldEl0ZXJhdG9yRm4obmV3Q2hpbGQpKSB7XG4gICAgICAgICAgICBwcmV2RGVidWdJbmZvID0gbmV3Q2hpbGQ7XG4gICAgICAgICAgICBuZXdDaGlsZCA9IGdldEl0ZXJhdG9yRm4ocHJldkRlYnVnSW5mbyk7XG4gICAgICAgICAgICBpZiAoXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgbmV3Q2hpbGQpXG4gICAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAgIFwiQW4gb2JqZWN0IGlzIG5vdCBhbiBpdGVyYWJsZS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAga2V5ID0gbmV3Q2hpbGQuY2FsbChwcmV2RGVidWdJbmZvKTtcbiAgICAgICAgICAgIGlmIChrZXkgPT09IHByZXZEZWJ1Z0luZm8pIHtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIDAgIT09IHJldHVybkZpYmVyLnRhZyB8fFxuICAgICAgICAgICAgICAgIFwiW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl1cIiAhPT1cbiAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChyZXR1cm5GaWJlci50eXBlKSB8fFxuICAgICAgICAgICAgICAgIFwiW29iamVjdCBHZW5lcmF0b3JdXCIgIT09IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChrZXkpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBkaWRXYXJuQWJvdXRHZW5lcmF0b3JzIHx8XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIlVzaW5nIEl0ZXJhdG9ycyBhcyBjaGlsZHJlbiBpcyB1bnN1cHBvcnRlZCBhbmQgd2lsbCBsaWtlbHkgeWllbGQgdW5leHBlY3RlZCByZXN1bHRzIGJlY2F1c2UgZW51bWVyYXRpbmcgYSBnZW5lcmF0b3IgbXV0YXRlcyBpdC4gWW91IG1heSBjb252ZXJ0IGl0IHRvIGFuIGFycmF5IHdpdGggYEFycmF5LmZyb20oKWAgb3IgdGhlIGBbLi4uc3ByZWFkXWAgb3BlcmF0b3IgYmVmb3JlIHJlbmRlcmluZy4gWW91IGNhbiBhbHNvIHVzZSBhbiBJdGVyYWJsZSB0aGF0IGNhbiBpdGVyYXRlIG11bHRpcGxlIHRpbWVzIG92ZXIgdGhlIHNhbWUgaXRlbXMuXCJcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAoZGlkV2Fyb
15852kFib3V0R2VuZXJhdG9ycyA9ICEwKTtcbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICBwcmV2RGVidWdJbmZvLmVudHJpZXMgIT09IG5ld0NoaWxkIHx8XG4gICAgICAgICAgICAgICAgZGlkV2FybkFib3V0TWFwcyB8fFxuICAgICAgICAgICAgICAgIChjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgXCJVc2luZyBNYXBzIGFzIGNoaWxkcmVuIGlzIG5vdCBzdXBwb3J0ZWQuIFVzZSBhbiBhcnJheSBvZiBrZXllZCBSZWFjdEVsZW1lbnRzIGluc3RlYWQuXCJcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIChkaWRXYXJuQWJvdXRNYXBzID0gITApKTtcbiAgICAgICAgICAgIHJldHVybiByZWNvbmNpbGVDaGlsZHJlbkl0ZXJhdG9yKFxuICAgICAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICAgICAgY3VycmVudEZpcnN0Q2hpbGQsXG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgbGFuZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBuZXdDaGlsZC50aGVuKVxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgKHByZXZEZWJ1Z0luZm8gPSBwdXNoRGVidWdJbmZvKG5ld0NoaWxkLl9kZWJ1Z0luZm8pKSxcbiAgICAgICAgICAgICAgKHJldHVybkZpYmVyID0gcmVjb25jaWxlQ2hpbGRGaWJlcnNJbXBsKFxuICAgICAgICAgICAgICAgIHJldHVybkZpYmVyLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRGaXJzdENoaWxkLFxuICAgICAgICAgICAgICAgIHVud3JhcFRoZW5hYmxlKG5ld0NoaWxkKSxcbiAgICAgICAgICAgICAgICBsYW5lc1xuICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgKGN1cnJlbnREZWJ1Z0luZm8gPSBwcmV2RGVidWdJbmZvKSxcbiAgICAgICAgICAgICAgcmV0dXJuRmliZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKG5ld0NoaWxkLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUpXG4gICAgICAgICAgICByZXR1cm4gcmVjb25jaWxlQ2hpbGRGaWJlcnNJbXBsKFxuICAgICAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICAgICAgY3VycmVudEZpcnN0Q2hpbGQsXG4gICAgICAgICAgICAgIHJlYWRDb250ZXh0RHVyaW5nUmVjb25jaWxpYXRpb24ocmV0dXJuRmliZXIsIG5ld0NoaWxkKSxcbiAgICAgICAgICAgICAgbGFuZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgdGhyb3dPbkludmFsaWRPYmplY3RUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIChcInN0cmluZ1wiID09PSB0eXBlb2YgbmV3Q2hpbGQgJiYgXCJcIiAhPT0gbmV3Q2hpbGQpIHx8XG4gICAgICAgICAgXCJudW1iZXJcIiA9PT0gdHlwZW9mIG5ld0NoaWxkIHx8XG4gICAgICAgICAgXCJiaWdpbnRcIiA9PT0gdHlwZW9mIG5ld0NoaWxkXG4gICAgICAgIClcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKHByZXZEZWJ1Z0luZm8gPSBcIlwiICsgbmV3Q2hpbGQpLFxuICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudEZpcnN0Q2hpbGQgJiYgNiA9PT0gY3VycmVudEZpcnN0Q2hpbGQudGFnXG4gICAgICAgICAgICAgID8gKGRlbGV0ZVJlbWFpbmluZ0NoaWxkcmVuKFxuICAgICAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50Rmlyc3RDaGlsZC5zaWJsaW5nXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAobGFuZXMgPSB1c2VGaWJlcihjdXJyZW50Rmlyc3RDaGlsZCwgcHJldkRlYnVnSW5mbykpLFxuICAgICAgICAgICAgICAgIChsYW5lcy5yZXR1cm4gPSByZXR1cm5GaWJlciksXG4gICAgICAgICAgICAgICAgKHJldHVybkZpYmVyID0gbGFuZXMpKVxuICAgICAgICAgICAgICA6IChkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpLFxuICAgICAgICAgICAgICAgIChsYW5lcyA9IGNyZWF0ZUZpYmVyRnJvbVRleHQoXG4gICAgICAgICAgICAgICAgICBwcmV2RGVidWdJbmZvLFxuICAgICAgICAgICAgICAgICAgcmV0dXJuRmliZXIubW9kZSxcbiAgICAgICAgICAgICAgICAgIGxhbmVzXG4gICAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgICAgKGxhbmVzLnJldHVybiA9IHJldHVybkZpYmVyKSxcbiAgICAgICAgICAgICAgICAobGFuZXMuX2RlYnVnT3duZXIgPSByZXR1cm5GaWJlciksXG4gICAgICAgICAgICAgICAgKGxhbmVzLl9kZWJ1Z1Rhc2sgPSByZXR1cm5GaWJlci5fZGVidWdUYXNrKSxcbiAgICAgICAgICAgICAgICAobGFuZXMuX2RlYnVnSW5mbyA9IGN1cnJlbnREZWJ1Z0luZm8pLFxuICAgICAgICAgICAgICAgIChyZXR1cm5GaWJlciA9IGxhbmVzKSksXG4gICAgICAgICAgICBwbGFjZVNpbmdsZUNoaWxkKHJldHVybkZpYmVyKVxuICAgICAgICAgICk7XG4gICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIG5ld0NoaWxkICYmXG4gICAgICAgICAgd2Fybk9uRnVuY3Rpb25UeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgICAgIFwic3ltYm9sXCIgPT09IHR5cGVvZiBuZXdDaGlsZCAmJiB3YXJuT25TeW1ib2xUeXBlKHJldHVybkZpYmVyLCBuZXdDaGlsZCk7XG4gICAgICAgIHJldHVybiBkZWxldGVSZW1haW5pbmdDaGlsZHJlbihyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChyZXR1cm5GaWJlciwgY3VycmVudEZpcnN0Q2hpbGQsIG5ld0NoaWxkLCBsYW5lcykge1xuICAgICAgICB2Y
15852XIgcHJldkRlYnVnSW5mbyA9IGN1cnJlbnREZWJ1Z0luZm87XG4gICAgICAgIGN1cnJlbnREZWJ1Z0luZm8gPSBudWxsO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoZW5hYmxlSW5kZXhDb3VudGVyJDEgPSAwO1xuICAgICAgICAgIHZhciBmaXJzdENoaWxkRmliZXIgPSByZWNvbmNpbGVDaGlsZEZpYmVyc0ltcGwoXG4gICAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICAgIGN1cnJlbnRGaXJzdENoaWxkLFxuICAgICAgICAgICAgbmV3Q2hpbGQsXG4gICAgICAgICAgICBsYW5lc1xuICAgICAgICAgICk7XG4gICAgICAgICAgdGhlbmFibGVTdGF0ZSQxID0gbnVsbDtcbiAgICAgICAgICByZXR1cm4gZmlyc3RDaGlsZEZpYmVyO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgaWYgKHggPT09IFN1c3BlbnNlRXhjZXB0aW9uIHx8IHggPT09IFN1c3BlbnNlQWN0aW9uRXhjZXB0aW9uKSB0aHJvdyB4O1xuICAgICAgICAgIHZhciBmaWJlciA9IGNyZWF0ZUZpYmVyKDI5LCB4LCBudWxsLCByZXR1cm5GaWJlci5tb2RlKTtcbiAgICAgICAgICBmaWJlci5sYW5lcyA9IGxhbmVzO1xuICAgICAgICAgIGZpYmVyLnJldHVybiA9IHJldHVybkZpYmVyO1xuICAgICAgICAgIHZhciBkZWJ1Z0luZm8gPSAoZmliZXIuX2RlYnVnSW5mbyA9IGN1cnJlbnREZWJ1Z0luZm8pO1xuICAgICAgICAgIGZpYmVyLl9kZWJ1Z093bmVyID0gcmV0dXJuRmliZXIuX2RlYnVnT3duZXI7XG4gICAgICAgICAgZmliZXIuX2RlYnVnVGFzayA9IHJldHVybkZpYmVyLl9kZWJ1Z1Rhc2s7XG4gICAgICAgICAgaWYgKG51bGwgIT0gZGVidWdJbmZvKVxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IGRlYnVnSW5mby5sZW5ndGggLSAxOyAwIDw9IGk7IGktLSlcbiAgICAgICAgICAgICAgaWYgKFwic3RyaW5nXCIgPT09IHR5cGVvZiBkZWJ1Z0luZm9baV0uc3RhY2spIHtcbiAgICAgICAgICAgICAgICBmaWJlci5fZGVidWdPd25lciA9IGRlYnVnSW5mb1tpXTtcbiAgICAgICAgICAgICAgICBmaWJlci5fZGVidWdUYXNrID0gZGVidWdJbmZvW2ldLmRlYnVnVGFzaztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmaWJlcjtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBjdXJyZW50RGVidWdJbmZvID0gcHJldkRlYnVnSW5mbztcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChjaGlsZFNsb3QsIGluZGV4KSB7XG4gICAgICB2Y
15852XIgaXNBbkFycmF5ID0gaXNBcnJheUltcGwoY2hpbGRTbG90KTtcbiAgICAgIGNoaWxkU2xvdCA9ICFpc0FuQXJyYXkgJiYgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgZ2V0SXRlcmF0b3JGbihjaGlsZFNsb3QpO1xuICAgICAgcmV0dXJuIGlzQW5BcnJheSB8fCBjaGlsZFNsb3RcbiAgICAgICAgPyAoKGlzQW5BcnJheSA9IGlzQW5BcnJheSA/IFwiYXJyYXlcIiA6IFwiaXRlcmFibGVcIiksXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiQSBuZXN0ZWQgJXMgd2FzIHBhc3NlZCB0byByb3cgIyVzIGluIDxTdXNwZW5zZUxpc3QgLz4uIFdyYXAgaXQgaW4gYW4gYWRkaXRpb25hbCBTdXNwZW5zZUxpc3QgdG8gY29uZmlndXJlIGl0cyByZXZlYWxPcmRlcjogPFN1c3BlbnNlTGlzdCByZXZlYWxPcmRlcj0uLi4+IC4uLiA8U3VzcGVuc2VMaXN0IHJldmVhbE9yZGVyPS4uLj57JXN9PC9TdXNwZW5zZUxpc3Q+IC4uLiA8L1N1c3BlbnNlTGlzdD5cIixcbiAgICAgICAgICAgIGlzQW5BcnJheSxcbiAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgaXNBbkFycmF5XG4gICAgICAgICAgKSxcbiAgICAgICAgICAhMSlcbiAgICAgICAgOiAhMDtcbiAgICB9XG4gICAgZnVuY3Rpb24gaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKGZpYmVyKSB7XG4gICAgICBmaWJlci51cGRhdGVRdWV1ZSA9IHtcbiAgICAgICAgYmFzZVN0YXRlOiBmaWJlci5tZW1vaXplZFN0YXRlLFxuICAgICAgICBmaXJzdEJhc2VVcGRhdGU6IG51bGwsXG4gICAgICAgIGxhc3RCYXNlVXBkYXRlOiBudWxsLFxuICAgICAgICBzaGFyZWQ6IHsgcGVuZGluZzogbnVsbCwgbGFuZXM6IDAsIGhpZGRlbkNhbGxiYWNrczogbnVsbCB9LFxuICAgICAgICBjYWxsYmFja3M6IG51bGxcbiAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNsb25lVXBkYXRlUXVldWUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnVwZGF0ZVF1ZXVlO1xuICAgICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPT09IGN1cnJlbnQgJiZcbiAgICAgICAgKHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0ge1xuICAgICAgICAgIGJhc2VTdGF0ZTogY3VycmVudC5iYXNlU3RhdGUsXG4gICAgICAgICAgZmlyc3RCYXNlVXBkYXRlOiBjdXJyZW50LmZpcnN0QmFzZVVwZGF0ZSxcbiAgICAgICAgICBsYXN0QmFzZVVwZGF0ZTogY3VycmVudC5sYXN0QmFzZVVwZGF0ZSxcbiAgICAgICAgICBzaGFyZWQ6IGN1cnJlbnQuc2hhcmVkLFxuICAgICAgICAgIGNhbGxiYWNrczogbnVsbFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY3JlYXRlVXBkYXRlKGxhbmUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxhbmU6IGxhbmUsXG4gICAgICAgIHRhZzogVXBkYXRlU3RhdGUsXG4gICAgICAgIHBheWxvYWQ6IG51bGwsXG4gICAgICAgIGNhbGxiYWNrOiBudWxsLFxuICAgICAgICBuZXh0OiBudWxsXG4gICAgICB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBlbnF1ZXVlVXBkYXRlKGZpYmVyLCB1cGRhdGUsIGxhbmUpIHtcbiAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IGZpYmVyLnVwZGF0ZVF1ZXVlO1xuICAgICAgaWYgKG51bGwgPT09IHVwZGF0ZVF1ZXVlKSByZXR1cm4gbnVsbDtcbiAgICAgIHVwZGF0ZVF1ZXVlID0gdXBkYXRlUXVldWUuc2hhcmVkO1xuICAgICAgaWYgKFxuICAgICAgICBjdXJyZW50bHlQcm9jZXNzaW5nUXVldWUgPT09IHVwZGF0ZVF1ZXVlICYmXG4gICAgICAgICFkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlXG4gICAgICApIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBcIkFuIHVwZGF0ZSAoc2V0U3RhdGUsIHJlcGxhY2VTdGF0ZSwgb3IgZm9yY2VVcGRhdGUpIHdhcyBzY2hlZHVsZWQgZnJvbSBpbnNpZGUgYW4gdXBkYXRlIGZ1bmN0aW9uLiBVcGRhdGUgZnVuY3Rpb25zIHNob3VsZCBiZSBwdXJlLCB3aXRoIHplcm8gc2lkZS1lZmZlY3RzLiBDb25zaWRlciB1c2luZyBjb21wb25lbnREaWRVcGRhdGUgb3IgYSBjYWxsYmFjay5cXG5cXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50OiAlc1wiLFxuICAgICAgICAgIGNvbXBvbmVudE5hbWVcbiAgICAgICAgKTtcbiAgICAgICAgZGlkV2FyblVwZGF0ZUluc2lkZVVwZGF0ZSA9ICEwO1xuICAgICAgfVxuICAgICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dClcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAoY29tcG9uZW50TmFtZSA9IHVwZGF0ZVF1ZXVlLnBlbmRpbmcpLFxuICAgICAgICAgIG51bGwgPT09IGNvbXBvbmVudE5hbWVcbiAgICAgICAgICAgID8gKHVwZGF0ZS5uZXh0ID0gdXBkYXRlKVxuICAgICAgICAgICAgOiAoKHVwZGF0ZS5uZXh0ID0gY29tcG9uZW50TmFtZS5uZXh0KSxcbiAgICAgICAgICAgICAgKGNvbXBvbmVudE5hbWUubmV4dCA9IHVwZGF0ZSkpLFxuICAgICAgICAgICh1cGRhdGVRdWV1ZS5wZW5kaW5nID0gdXBkYXRlKSxcbiAgICAgICAgICAodXBkYXRlID0gZ2V0Um9vdEZvclVwZGF0ZWRGaWJlcihmaWJlcikpLFxuICAgICAgICAgIG1hcmtVcGRhdGVMYW5lRnJvbUZpYmVyVG9Sb290KGZpYmVyLCBudWxsLCBsYW5lKSxcbiAgICAgICAgICB1cGRhdGVcbiAgICAgICAgKTtcbiAgICAgIGVucXVldWVVcGRhdGUkMShmaWJlciwgdXBkYXRlUXVldWUsIHVwZGF0ZSwgbGFuZSk7XG4gICAgICByZXR1cm4gZ2V0Um9vdEZvclVwZGF0ZWRGaWJlcihmaWJlcik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGVudGFuZ2xlVHJhbnNpdGlvbnMocm9vdCwgZmliZXIsIGxhbmUpIHtcbiAgICAgIGZpYmVyID0gZmliZXIudXBkYXRlUXVldWU7XG4gICAgICBpZiAobnVsbCAhPT0gZmliZXIgJiYgKChmaWJlciA9IGZpYmVyLnNoYXJlZCksIDAgIT09IChsYW5lICYgNDE5NDA0OCkpKSB7XG4gICAgICAgIHZhciBxdWV1ZUxhbmVzID0gZmliZXIubGFuZXM7XG4gICAgICAgIHF1ZXVlTGFuZXMgJj0gcm9vdC5wZW5kaW5nTGFuZXM7XG4gICAgICAgIGxhbmUgfD0gcXVldWVMYW5lcztcbiAgICAgICAgZmliZXIubGFuZXMgPSBsYW5lO1xuICAgICAgICBtYXJrUm9vdEVudGFuZ2xlZChyb290LCBsYW5lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZW5xdWV1ZUNhcHR1cmVkVXBkYXRlKHdvcmtJblByb2dyZXNzLCBjYXB0dXJlZFVwZGF0ZSkge1xuICAgICAgdmFyIHF1ZXVlID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUsXG4gICAgICAgIGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGU7XG4gICAgICBpZiAoXG4gICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiZcbiAgICAgICAgKChjdXJyZW50ID0gY3VycmVudC51cGRhdGV
15852RdWV1ZSksIHF1ZXVlID09PSBjdXJyZW50KVxuICAgICAgKSB7XG4gICAgICAgIHZhciBuZXdGaXJzdCA9IG51bGwsXG4gICAgICAgICAgbmV3TGFzdCA9IG51bGw7XG4gICAgICAgIHF1ZXVlID0gcXVldWUuZmlyc3RCYXNlVXBkYXRlO1xuICAgICAgICBpZiAobnVsbCAhPT0gcXVldWUpIHtcbiAgICAgICAgICBkbyB7XG4gICAgICAgICAgICB2YXIgY2xvbmUgPSB7XG4gICAgICAgICAgICAgIGxhbmU6IHF1ZXVlLmxhbmUsXG4gICAgICAgICAgICAgIHRhZzogcXVldWUudGFnLFxuICAgICAgICAgICAgICBwYXlsb2FkOiBxdWV1ZS5wYXlsb2FkLFxuICAgICAgICAgICAgICBjYWxsYmFjazogbnVsbCxcbiAgICAgICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIG51bGwgPT09IG5ld0xhc3RcbiAgICAgICAgICAgICAgPyAobmV3Rmlyc3QgPSBuZXdMYXN0ID0gY2xvbmUpXG4gICAgICAgICAgICAgIDogKG5ld0xhc3QgPSBuZXdMYXN0Lm5leHQgPSBjbG9uZSk7XG4gICAgICAgICAgICBxdWV1ZSA9IHF1ZXVlLm5leHQ7XG4gICAgICAgICAgfSB3aGlsZSAobnVsbCAhPT0gcXVldWUpO1xuICAgICAgICAgIG51bGwgPT09IG5ld0xhc3RcbiAgICAgICAgICAgID8gKG5ld0ZpcnN0ID0gbmV3TGFzdCA9IGNhcHR1cmVkVXBkYXRlKVxuICAgICAgICAgICAgOiAobmV3TGFzdCA9IG5ld0xhc3QubmV4dCA9IGNhcHR1cmVkVXBkYXRlKTtcbiAgICAgICAgfSBlbHNlIG5ld0ZpcnN0ID0gbmV3TGFzdCA9IGNhcHR1cmVkVXBkYXRlO1xuICAgICAgICBxdWV1ZSA9IHtcbiAgICAgICAgICBiYXNlU3RhdGU6IGN1cnJlbnQuYmFzZVN0YXRlLFxuICAgICAgICAgIGZpcnN0QmFzZVVwZGF0ZTogbmV3Rmlyc3QsXG4gICAgICAgICAgbGFzdEJhc2VVcGRhdGU6IG5ld0xhc3QsXG4gICAgICAgICAgc2hhcmVkOiBjdXJyZW50LnNoYXJlZCxcbiAgICAgICAgICBjYWxsYmFja3M6IGN1cnJlbnQuY2FsbGJhY2tzXG4gICAgICAgIH07XG4gICAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gcXVldWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHdvcmtJblByb2dyZXNzID0gcXVldWUubGFzdEJhc2VVcGRhdGU7XG4gICAgICBudWxsID09PSB3b3JrSW5Qcm9ncmVzc1xuICAgICAgICA/IChxdWV1ZS5maXJzdEJhc2VVcGRhdGUgPSBjYXB0dXJlZFVwZGF0ZSlcbiAgICAgICAgOiAod29ya0luUHJvZ3Jlc3MubmV4dCA9IGNhcHR1cmVkVXBkYXRlKTtcbiAgICAgIHF1ZXVlLmxhc3RCYXNlVXBkYXRlID0gY2FwdHVyZWRVcGRhdGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN1c3BlbmRJZlVwZGF0ZVJlYWRGcm9tRW50YW5nbGVkQXN5bmNBY3Rpb24oKSB7XG4gICAgICBpZiAoZGlkUmVhZEZyb21FbnRhbmdsZWRBc3luY0FjdGlvbikge1xuICAgICAgICB2Y
15852XIgZW50YW5nbGVkQWN0aW9uVGhlbmFibGUgPSBjdXJyZW50RW50YW5nbGVkQWN0aW9uVGhlbmFibGU7XG4gICAgICAgIGlmIChudWxsICE9PSBlbnRhbmdsZWRBY3Rpb25UaGVuYWJsZSkgdGhyb3cgZW50YW5nbGVkQWN0aW9uVGhlbmFibGU7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHByb2Nlc3NVcGRhdGVRdWV1ZShcbiAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgcHJvcHMsXG4gICAgICBpbnN0YW5jZSRqc2NvbXAkMCxcbiAgICAgIHJlbmRlckxhbmVzXG4gICAgKSB7XG4gICAgICBkaWRSZWFkRnJvbUVudGFuZ2xlZEFzeW5jQWN0aW9uID0gITE7XG4gICAgICB2YXIgcXVldWUgPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTtcbiAgICAgIGhhc0ZvcmNlVXBkYXRlID0gITE7XG4gICAgICBjdXJyZW50bHlQcm9jZXNzaW5nUXVldWUgPSBxdWV1ZS5zaGFyZWQ7XG4gICAgICB2YXIgZmlyc3RCYXNlVXBkYXRlID0gcXVldWUuZmlyc3RCYXNlVXBkYXRlLFxuICAgICAgICBsYXN0QmFzZVVwZGF0ZSA9IHF1ZXVlLmxhc3RCYXNlVXBkYXRlLFxuICAgICAgICBwZW5kaW5nUXVldWUgPSBxdWV1ZS5zaGFyZWQucGVuZGluZztcbiAgICAgIGlmIChudWxsICE9PSBwZW5kaW5nUXVldWUpIHtcbiAgICAgICAgcXVldWUuc2hhcmVkLnBlbmRpbmcgPSBudWxsO1xuICAgICAgICB2YXIgbGFzdFBlbmRpbmdVcGRhdGUgPSBwZW5kaW5nUXVldWUsXG4gICAgICAgICAgZmlyc3RQZW5kaW5nVXBkYXRlID0gbGFzdFBlbmRpbmdVcGRhdGUubmV4dDtcbiAgICAgICAgbGFzdFBlbmRpbmdVcGRhdGUubmV4dCA9IG51bGw7XG4gICAgICAgIG51bGwgPT09IGxhc3RCYXNlVXBkYXRlXG4gICAgICAgICAgPyAoZmlyc3RCYXNlVXBkYXRlID0gZmlyc3RQZW5kaW5nVXBkYXRlKVxuICAgICAgICAgIDogKGxhc3RCYXNlVXBkYXRlLm5leHQgPSBmaXJzdFBlbmRpbmdVcGRhdGUpO1xuICAgICAgICBsYXN0QmFzZVVwZGF0ZSA9IGxhc3RQZW5kaW5nVXBkYXRlO1xuICAgICAgICB2Y
15852XIgY3VycmVudCA9IHdvcmtJblByb2dyZXNzLmFsdGVybmF0ZTtcbiAgICAgICAgbnVsbCAhPT0gY3VycmVudCAmJlxuICAgICAgICAgICgoY3VycmVudCA9IGN1cnJlbnQudXBkYXRlUXVldWUpLFxuICAgICAgICAgIChwZW5kaW5nUXVldWUgPSBjdXJyZW50Lmxhc3RCYXNlVXBkYXRlKSxcbiAgICAgICAgICBwZW5kaW5nUXVldWUgIT09IGxhc3RCYXNlVXBkYXRlICYmXG4gICAgICAgICAgICAobnVsbCA9PT0gcGVuZGluZ1F1ZXVlXG4gICAgICAgICAgICAgID8gKGN1cnJlbnQuZmlyc3RCYXNlVXBkYXRlID0gZmlyc3RQZW5kaW5nVXBkYXRlKVxuICAgICAgICAgICAgICA6IChwZW5kaW5nUXVldWUubmV4dCA9IGZpcnN0UGVuZGluZ1VwZGF0ZSksXG4gICAgICAgICAgICAoY3VycmVudC5sYXN0QmFzZVVwZGF0ZSA9IGxhc3RQZW5kaW5nVXBkYXRlKSkpO1xuICAgICAgfVxuICAgICAgaWYgKG51bGwgIT09IGZpcnN0QmFzZVVwZGF0ZSkge1xuICAgICAgICB2YXIgbmV3U3RhdGUgPSBxdWV1ZS5iYXNlU3RhdGU7XG4gICAgICAgIGxhc3RCYXNlVXBkYXRlID0gMDtcbiAgICAgICAgY3VycmVudCA9IGZpcnN0UGVuZGluZ1VwZGF0ZSA9IGxhc3RQZW5kaW5nVXBkYXRlID0gbnVsbDtcbiAgICAgICAgcGVuZGluZ1F1ZXVlID0gZmlyc3RCYXNlVXBkYXRlO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgdmFyIHVwZGF0ZUxhbmUgPSBwZW5kaW5nUXVldWUubGFuZSAmIC01MzY4NzA5MTMsXG4gICAgICAgICAgICBpc0hpZGRlblVwZGF0ZSA9IHVwZGF0ZUxhbmUgIT09IHBlbmRpbmdRdWV1ZS5sYW5lO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGlzSGlkZGVuVXBkYXRlXG4gICAgICAgICAgICAgID8gKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzICYgdXBkYXRlTGFuZSkgPT09IHVwZGF0ZUxhbmVcbiAgICAgICAgICAgICAgOiAocmVuZGVyTGFuZXMgJiB1cGRhdGVMYW5lKSA9PT0gdXBkYXRlTGFuZVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgMCAhPT0gdXBkYXRlTGFuZSAmJlxuICAgICAgICAgICAgICB1cGRhdGVMYW5lID09PSBjdXJyZW50RW50YW5nbGVkTGFuZSAmJlxuICAgICAgICAgICAgICAoZGlkUmVhZEZyb21FbnRhbmdsZWRBc3luY0FjdGlvbiA9ICEwKTtcbiAgICAgICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiZcbiAgICAgICAgICAgICAgKGN1cnJlbnQgPSBjdXJyZW50Lm5leHQgPVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGxhbmU6IDAsXG4gICAgICAgICAgICAgICAgICB0YWc6IHBlbmRpbmdRdWV1ZS50YWcsXG4gICAgICAgICAgICAgICAgICBwYXlsb2FkOiBwZW5kaW5nUXVldWUucGF5bG9hZCxcbiAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBudWxsLFxuICAgICAgICAgICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICB1cGRhdGVMYW5lID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgICAgICAgIHZhciBwYXJ0aWFsU3RhdGUgPSBwZW5kaW5nUXVldWU7XG4gICAgICAgICAgICAgIHZhciBuZXh0UHJvcHMgPSBwcm9wcyxcbiAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IGluc3RhbmNlJGpzY29tcCQwO1xuICAgICAgICAgICAgICBzd2l0Y2ggKHBhcnRpYWxTdGF0ZS50YWcpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFJlcGxhY2VTdGF0ZTpcbiAgICAgICAgICAgICAgICAgIHBhcnRpYWxTdGF0ZSA9IHBhcnRpYWxTdGF0ZS5wYXlsb2FkO1xuICAgICAgICAgICAgICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHBhcnRpYWxTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gITA7XG4gICAgICAgICAgICAgICAgICAgIHZhciBuZXh0U3RhdGUgPSBwYXJ0aWFsU3RhdGUuY2FsbChcbiAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICBuZXh0UHJvcHNcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUxhbmUubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyghMCk7XG4gICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpYWxTdGF0ZS5jYWxsKGluc3RhbmNlLCBuZXdTdGF0ZSwgbmV4dFByb3BzKTtcbiAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoITEpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gITE7XG4gICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlID0gbmV4dFN0YXRlO1xuICAgICAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgbmV3U3RhdGUgPSBwYXJ0aWFsU3RhdGU7XG4gICAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICAgIGNhc2UgQ2FwdHVyZVVwZGF0ZTpcbiAgICAgICAgICAgICAgICAgIHVwZGF0ZUxhbmUuZmxhZ3MgPSAodXBkYXRlTGFuZS5mbGFncyAmIC02NTUzNykgfCAxMjg7XG4gICAgICAgICAgICAgICAgY2FzZSBVcGRhdGVTdGF0ZTpcbiAgICAgICAgICAgICAgICAgIG5leHRTdGF0ZSA9IHBhcnRpYWxTdGF0ZS5wYXlsb2FkO1xuICAgICAgICAgICAgICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIG5leHRTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gITA7XG4gICAgICAgICAgICAgICAgICAgIHBhcnRpYWxTdGF0ZSA9IG5leHRTdGF0ZS5jYWxsKFxuICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgIG5leHRQcm9wc1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlTGFuZS5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgI
15852HNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKCEwKTtcbiAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFN0YXRlLmNhbGwoaW5zdGFuY2UsIG5ld1N0YXRlLCBuZXh0UHJvcHMpO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyghMSk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlzRGlzYWxsb3dlZENvbnRleHRSZWFkSW5ERVYgPSAhMTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBwYXJ0aWFsU3RhdGUgPSBuZXh0U3RhdGU7XG4gICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gcGFydGlhbFN0YXRlIHx8IHZvaWQgMCA9PT0gcGFydGlhbFN0YXRlKSBicmVhayBhO1xuICAgICAgICAgICAgICAgICAgbmV3U3RhdGUgPSBhc3NpZ24oe30sIG5ld1N0YXRlLCBwYXJ0aWFsU3RhdGUpO1xuICAgICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgICAgICBjYXNlIEZvcmNlVXBkYXRlOlxuICAgICAgICAgICAgICAgICAgaGFzRm9yY2VVcGRhdGUgPSAhMDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXBkYXRlTGFuZSA9IHBlbmRpbmdRdWV1ZS5jYWxsYmFjaztcbiAgICAgICAgICAgIG51bGwgIT09IHVwZGF0ZUxhbmUgJiZcbiAgICAgICAgICAgICAgKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA2NCksXG4gICAgICAgICAgICAgIGlzSGlkZGVuVXBkYXRlICYmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA4MTkyKSxcbiAgICAgICAgICAgICAgKGlzSGlkZGVuVXBkYXRlID0gcXVldWUuY2FsbGJhY2tzKSxcbiAgICAgICAgICAgICAgbnVsbCA9PT0gaXNIaWRkZW5VcGRhdGVcbiAgICAgICAgICAgICAgICA/IChxdWV1ZS5jYWxsYmFja3MgPSBbdXBkYXRlTGFuZV0pXG4gICAgICAgICAgICAgICAgOiBpc0hpZGRlblVwZGF0ZS5wdXNoKHVwZGF0ZUxhbmUpKTtcbiAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIChpc0hpZGRlblVwZGF0ZSA9IHtcbiAgICAgICAgICAgICAgbGFuZTogdXBkYXRlTGFuZSxcbiAgICAgICAgICAgICAgdGFnOiBwZW5kaW5nUXVldWUudGFnLFxuICAgICAgICAgICAgICBwYXlsb2FkOiBwZW5kaW5nUXVldWUucGF5bG9hZCxcbiAgICAgICAgICAgICAgY2FsbGJhY2s6IHBlbmRpbmdRdWV1ZS5jYWxsYmFjayxcbiAgICAgICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIG51bGwgPT09IGN1cnJlbnRcbiAgICAgICAgICAgICAgICA/ICgoZmlyc3RQZW5kaW5nVXBkYXRlID0gY3VycmVudCA9IGlzSGlkZGVuVXBkYXRlKSxcbiAgICAgICAgICAgICAgICAgIChsYXN0UGVuZGluZ1VwZGF0ZSA9IG5ld1N0YXRlKSlcbiAgICAgICAgICAgICAgICA6IChjdXJyZW50ID0gY3VycmVudC5uZXh0ID0gaXNIaWRkZW5VcGRhdGUpLFxuICAgICAgICAgICAgICAobGFzdEJhc2VVcGRhdGUgfD0gdXBkYXRlTGFuZSk7XG4gICAgICAgICAgcGVuZGluZ1F1ZXVlID0gcGVuZGluZ1F1ZXVlLm5leHQ7XG4gICAgICAgICAgaWYgKG51bGwgPT09IHBlbmRpbmdRdWV1ZSlcbiAgICAgICAgICAgIGlmICgoKHBlbmRpbmdRdWV1ZSA9IHF1ZXVlLnNoYXJlZC5wZW5kaW5nKSwgbnVsbCA9PT0gcGVuZGluZ1F1ZXVlKSlcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgIChpc0hpZGRlblVwZGF0ZSA9IHBlbmRpbmdRdWV1ZSksXG4gICAgICAgICAgICAgICAgKHBlbmRpbmdRdWV1ZSA9IGlzSGlkZGVuVXBkYXRlLm5leHQpLFxuICAgICAgICAgICAgICAgIChpc0hpZGRlblVwZGF0ZS5uZXh0ID0gbnVsbCksXG4gICAgICAgICAgICAgICAgKHF1ZXVlLmxhc3RCYXNlVXBkYXRlID0gaXNIaWRkZW5VcGRhdGUpLFxuICAgICAgICAgICAgICAgIChxdWV1ZS5zaGFyZWQucGVuZGluZyA9IG51bGwpO1xuICAgICAgICB9IHdoaWxlICgxKTtcbiAgICAgICAgbnVsbCA9PT0gY3VycmVudCAmJiAobGFzdFBlbmRpbmdVcGRhdGUgPSBuZXdTdGF0ZSk7XG4gICAgICAgIHF1ZXVlLmJhc2VTdGF0ZSA9IGxhc3RQZW5kaW5nVXBkYXRlO1xuICAgICAgICBxdWV1ZS5maXJzdEJhc2VVcGRhdGUgPSBmaXJzdFBlbmRpbmdVcGRhdGU7XG4gICAgICAgIHF1ZXVlLmxhc3RCYXNlVXBkYXRlID0gY3VycmVudDtcbiAgICAgICAgbnVsbCA9PT0gZmlyc3RCYXNlVXBkYXRlICYmIChxdWV1ZS5zaGFyZWQubGFuZXMgPSAwKTtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzIHw9IGxhc3RCYXNlVXBkYXRlO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGxhc3RCYXNlVXBkYXRlO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gICAgICB9XG4gICAgICBjdXJyZW50bHlQcm9jZXNzaW5nUXVldWUgPSBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjYWxsQ2FsbGJhY2soY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICAgIGlmIChcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBjYWxsYmFjaylcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgXCJJbnZhbGlkIGFyZ3VtZW50IHBhc3NlZCBhcyBjYWxsYmFjay4gRXhwZWN0ZWQgYSBmdW5jdGlvbi4gSW5zdGVhZCByZWNlaXZlZDogXCIgK1xuICAgICAgICAgICAgY2FsbGJhY2tcbiAgICAgICAgKTtcbiAgICAgIGNhbGxiYWNrLmNhbGwoY29udGV4dCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbW1pdEhpZGRlbkNhbGxiYWNrcyh1cGRhdGVRdWV1ZSwgY29udGV4dCkge1xuICAgICAgdmFyIGhpZGRlbkNhbGxiYWNrcyA9IHVwZGF0ZVF1ZXVlLnNoYXJlZC5oaWRkZW5DYWxsYmFja3M7XG4gICAgICBpZiAobnVsbCAhPT0gaGlkZGVuQ2FsbGJhY2tzKVxuICAgICAgICBmb3IgKFxuICAgICAgICAgIHVwZGF0ZVF1ZXVlLnNoYXJlZC5oaWRkZW5DYWxsYmFja3MgPSBudWxsLCB1cGRhdGVRdWV1ZSA9IDA7XG4gICAgICAgICAgdXBkYXRlUXVldWUgPCBoaWRkZW5DYWxsYmFja3MubGVuZ3RoO1xuICAgICAgICAgI
15852HVwZGF0ZVF1ZXVlKytcbiAgICAgICAgKVxuICAgICAgICAgIGNhbGxDYWxsYmFjayhoaWRkZW5DYWxsYmFja3NbdXBkYXRlUXVldWVdLCBjb250ZXh0KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tbWl0Q2FsbGJhY2tzKHVwZGF0ZVF1ZXVlLCBjb250ZXh0KSB7XG4gICAgICB2YXIgY2FsbGJhY2tzID0gdXBkYXRlUXVldWUuY2FsbGJhY2tzO1xuICAgICAgaWYgKG51bGwgIT09IGNhbGxiYWNrcylcbiAgICAgICAgZm9yIChcbiAgICAgICAgICB1cGRhdGVRdWV1ZS5jYWxsYmFja3MgPSBudWxsLCB1cGRhdGVRdWV1ZSA9IDA7XG4gICAgICAgICAgdXBkYXRlUXVldWUgPCBjYWxsYmFja3MubGVuZ3RoO1xuICAgICAgICAgIHVwZGF0ZVF1ZXVlKytcbiAgICAgICAgKVxuICAgICAgICAgIGNhbGxDYWxsYmFjayhjYWxsYmFja3NbdXBkYXRlUXVldWVdLCBjb250ZXh0KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHVzaEhpZGRlbkNvbnRleHQoZmliZXIsIGNvbnRleHQpIHtcbiAgICAgIHZhciBwcmV2RW50YW5nbGVkUmVuZGVyTGFuZXMgPSBlbnRhbmdsZWRSZW5kZXJMYW5lcztcbiAgICAgIHB1c2gocHJldkVudGFuZ2xlZFJlbmRlckxhbmVzQ3Vyc29yLCBwcmV2RW50YW5nbGVkUmVuZGVyTGFuZXMsIGZpYmVyKTtcbiAgICAgIHB1c2goY3VycmVudFRyZWVIaWRkZW5TdGFja0N1cnNvciwgY29udGV4dCwgZmliZXIpO1xuICAgICAgZW50YW5nbGVkUmVuZGVyTGFuZXMgPSBwcmV2RW50YW5nbGVkUmVuZGVyTGFuZXMgfCBjb250ZXh0LmJhc2VMYW5lcztcbiAgICB9XG4gICAgZnVuY3Rpb24gcmV1c2VIaWRkZW5Db250ZXh0T25TdGFjayhmaWJlcikge1xuICAgICAgcHVzaChwcmV2RW50YW5nbGVkUmVuZGVyTGFuZXNDdXJzb3IsIGVudGFuZ2xlZFJlbmRlckxhbmVzLCBmaWJlcik7XG4gICAgICBwdXNoKFxuICAgICAgICBjdXJyZW50VHJlZUhpZGRlblN0YWNrQ3Vyc29yLFxuICAgICAgICBjdXJyZW50VHJlZUhpZGRlblN0YWNrQ3Vyc29yLmN1cnJlbnQsXG4gICAgICAgIGZpYmVyXG4gICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwb3BIaWRkZW5Db250ZXh0KGZpYmVyKSB7XG4gICAgICBlbnRhbmdsZWRSZW5kZXJMYW5lcyA9IHByZXZFbnRhbmdsZWRSZW5kZXJMYW5lc0N1cnNvci5jdXJyZW50O1xuICAgICAgcG9wKGN1cnJlbnRUcmVlSGlkZGVuU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgICAgIHBvcChwcmV2RW50YW5nbGVkUmVuZGVyTGFuZXNDdXJzb3IsIGZpYmVyKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHVzaFByaW1hcnlUcmVlU3VzcGVuc2VIYW5kbGVyKGhhbmRsZXIpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gaGFuZGxlci5hbHRlcm5hdGU7XG4gICAgICBwdXNoKFxuICAgICAgICBzdXNwZW5zZVN0YWNrQ3Vyc29yLFxuICAgICAgICBzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQgJiBTdWJ0cmVlU3VzcGVuc2VDb250ZXh0TWFzayxcbiAgICAgICAgaGFuZGxlclxuICAgICAgKTtcbiAgICAgIHB1c2goc3VzcGVuc2VIYW5kbGVyU3RhY2tDdXJzb3IsIGhhbmRsZXIsIGhhbmRsZXIpO1xuICAgICAgbnVsbCA9PT0gc2hlbGxCb3VuZGFyeSAmJlxuICAgICAgICAobnVsbCA9PT0gY3VycmVudCB8fCBudWxsICE9PSBjdXJyZW50VHJlZUhpZGRlblN0YWNrQ3Vyc29yLmN1cnJlbnRcbiAgICAgICAgICA/IChzaGVsbEJvdW5kYXJ5ID0gaGFuZGxlcilcbiAgICAgICAgICA6IG51bGwgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAmJiAoc2hlbGxCb3VuZGFyeSA9IGhhbmRsZXIpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHVzaERlaHlkcmF0ZWRBY3Rpdml0eVN1c3BlbnNlSGFuZGxlcihmaWJlcikge1xuICAgICAgcHVzaChzdXNwZW5zZVN0YWNrQ3Vyc29yLCBzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQsIGZpYmVyKTtcbiAgICAgIHB1c2goc3VzcGVuc2VIYW5kbGVyU3RhY2tDdXJzb3IsIGZpYmVyLCBmaWJlcik7XG4gICAgICBudWxsID09PSBzaGVsbEJvdW5kYXJ5ICYmIChzaGVsbEJvdW5kYXJ5ID0gZmliZXIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwdXNoT2Zmc2NyZWVuU3VzcGVuc2VIYW5kbGVyKGZpYmVyKSB7XG4gICAgICAyMiA9PT0gZmliZXIudGFnXG4gICAgICAgID8gKHB1c2goc3VzcGVuc2VTdGFja0N1cnNvciwgc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50LCBmaWJlciksXG4gICAgICAgICAgcHVzaChzdXNwZW5zZUhhbmRsZXJTdGFja0N1cnNvciwgZmliZXIsIGZpYmVyKSxcbiAgICAgICAgICBudWxsID09PSBzaGVsbEJvdW5kYXJ5ICYmIChzaGVsbEJvdW5kYXJ5ID0gZmliZXIpKVxuICAgICAgICA6IHJldXNlU3VzcGVuc2VIYW5kbGVyT25TdGFjayhmaWJlcik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJldXNlU3VzcGVuc2VIYW5kbGVyT25TdGFjayhmaWJlcikge1xuICAgICAgcHVzaChzdXNwZW5zZVN0YWNrQ3Vyc29yLCBzdXNwZW5zZVN0YWNrQ3Vyc29yLmN1cnJlbnQsIGZpYmVyKTtcbiAgICAgIHB1c2goXG4gICAgICAgIHN1c3BlbnNlSGFuZGxlclN0YWNrQ3Vyc29yLFxuICAgICAgICBzdXNwZW5zZUhhbmRsZXJTdGFja0N1cnNvci5jdXJyZW50LFxuICAgICAgICBmaWJlclxuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcG9wU3VzcGVuc2VIYW5kbGVyKGZpYmVyKSB7XG4gICAgICBwb3Aoc3VzcGVuc2VIYW5kbGVyU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgICAgIHNoZWxsQm91bmRhcnkgPT09IGZpYmVyICYmIChzaGVsbEJvdW5kYXJ5ID0gbnVsbCk7XG4gICAgICBwb3Aoc3VzcGVuc2VTdGFja0N1cnNvciwgZmliZXIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwdXNoU3VzcGVuc2VMaXN0Q29udGV4dChmaWJlciwgbmV3Q29udGV4dCkge1xuICAgICAgcHVzaChcbiAgICAgICAgc3VzcGVuc2VIYW5kbGVyU3RhY2tDdXJzb3IsXG4gICAgICAgIHN1c3BlbnNlSGFuZGxlclN0YWNrQ3Vyc29yLmN1cnJlbnQsXG4gICAgICAgIGZpYmVyXG4gICAgICApO1xuICAgICAgcHVzaChzdXNwZW5zZVN0YWNrQ3Vyc29yLCBuZXdDb250ZXh0LCBmaWJlcik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBvcFN1c3BlbnNlTGlzdENvbnRleHQoZmliZXIpIHtcbiAgICAgIHBvcChzdXNwZW5zZVN0YWNrQ3Vyc29yLCBmaWJlcik7XG4gICAgICBwb3Aoc3VzcGVuc2VIYW5kbGVyU3RhY2tDdXJzb3IsIGZpYmVyKTtcbiAgICAgIHNoZWxsQm91bmRhcnkgPT09IGZpYmVyICYmIChzaGVsbEJvdW5kYXJ5ID0gbnVsbCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZpbmRGaXJzdFN1c3BlbmRlZChyb3cpIHtcbiAgICAgIGZvciAodmFyIG5vZGUgPSByb3c7IG51bGwgIT09IG5vZGU7ICkge1xuICAgICAgICBpZiAoMTMgPT09IG5vZGUudGFnKSB7XG4gICAgICAgICAgdmFyIHN0YXRlID0gbm9kZS5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIG51bGwgIT09IHN0YXRlICYmXG4gICAgICAgICAgICAoKHN0YXRlID0gc3RhdGUuZGVoeWRyYXRlZCksXG4gICAgICAgICAgICBudWxsID09PSBzdGF0ZSB8fFxuICAgICAgICAgICAgICBpc1N1c3BlbnNlSW5zdGFuY2VQZW5kaW5nKHN0YXRlKSB8fFxuICAgICAgICAgICAgICBpc1N1c3BlbnNlSW5zdGFuY2VGYWxsYmFjayhzdGF0ZSkpXG4gICAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgI
15852H0gZWxzZSBpZiAoXG4gICAgICAgICAgMTkgPT09IG5vZGUudGFnICYmXG4gICAgICAgICAgXCJpbmRlcGVuZGVudFwiICE9PSBub2RlLm1lbW9pemVkUHJvcHMucmV2ZWFsT3JkZXJcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKDAgIT09IChub2RlLmZsYWdzICYgMTI4KSkgcmV0dXJuIG5vZGU7XG4gICAgICAgIH0gZWxzZSBpZiAobnVsbCAhPT0gbm9kZS5jaGlsZCkge1xuICAgICAgICAgIG5vZGUuY2hpbGQucmV0dXJuID0gbm9kZTtcbiAgICAgICAgICBub2RlID0gbm9kZS5jaGlsZDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobm9kZSA9PT0gcm93KSBicmVhaztcbiAgICAgICAgZm9yICg7IG51bGwgPT09IG5vZGUuc2libGluZzsgKSB7XG4gICAgICAgICAgaWYgKG51bGwgPT09IG5vZGUucmV0dXJuIHx8IG5vZGUucmV0dXJuID09PSByb3cpIHJldHVybiBudWxsO1xuICAgICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBub2RlLnNpYmxpbmcucmV0dXJuID0gbm9kZS5yZXR1cm47XG4gICAgICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gbW91bnRIb29rVHlwZXNEZXYoKSB7XG4gICAgICB2YXIgaG9va05hbWUgPSBjdXJyZW50SG9va05hbWVJbkRldjtcbiAgICAgIG51bGwgPT09IGhvb2tUeXBlc0RldlxuICAgICAgICA/IChob29rVHlwZXNEZXYgPSBbaG9va05hbWVdKVxuICAgICAgICA6IGhvb2tUeXBlc0Rldi5wdXNoKGhvb2tOYW1lKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlSG9va1R5cGVzRGV2KCkge1xuICAgICAgdmFyIGhvb2tOYW1lID0gY3VycmVudEhvb2tOYW1lSW5EZXY7XG4gICAgICBpZiAoXG4gICAgICAgIG51bGwgIT09IGhvb2tUeXBlc0RldiAmJlxuICAgICAgICAoaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYrKyxcbiAgICAgICAgaG9va1R5cGVzRGV2W2hvb2tUeXBlc1VwZGF0ZUluZGV4RGV2XSAhPT0gaG9va05hbWUpXG4gICAgICApIHtcbiAgICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFkaWRXYXJuQWJvdXRNaXNtYXRjaGVkSG9va3NGb3JDb21wb25lbnQuaGFzKGNvbXBvbmVudE5hbWUpICYmXG4gICAgICAgICAgKGRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudC5hZGQoY29tcG9uZW50TmFtZSksXG4gICAgICAgICAgbnVsbCAhPT0gaG9va1R5cGVzRGV2KVxuICAgICAgICApIHtcbiAgICAgICAgICBmb3IgKHZhciB0YWJsZSA9IFwiXCIsIGkgPSAwOyBpIDw9IGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2OyBpKyspIHtcbiAgICAgICAgICAgIHZhciBvbGRIb29rTmFtZSA9IGhvb2tUeXBlc0RldltpXSxcbiAgICAgICAgICAgICAgbmV3SG9va05hbWUgPVxuICAgICAgICAgICAgICAgIGkgPT09IGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID8gaG9va05hbWUgOiBvbGRIb29rTmFtZTtcbiAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgIG9sZEhvb2tOYW1lID0gaSArIDEgKyBcIi4gXCIgKyBvbGRIb29rTmFtZTtcbiAgICAgICAgICAgICAgMzAgPiBvbGRIb29rTmFtZS5sZW5ndGg7XG5cbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgb2xkSG9va05hbWUgKz0gXCIgXCI7XG4gICAgICAgICAgICBvbGRIb29rTmFtZSArPSBuZXdIb29rTmFtZSArIFwiXFxuXCI7XG4gICAgICAgICAgICB0YWJsZSArPSBvbGRIb29rTmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiUmVhY3QgaGFzIGRldGVjdGVkIGEgY2hhbmdlIGluIHRoZSBvcmRlciBvZiBIb29rcyBjYWxsZWQgYnkgJXMuIFRoaXMgd2lsbCBsZWFkIHRvIGJ1Z3MgYW5kIGVycm9ycyBpZiBub3QgZml4ZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWFkIHRoZSBSdWxlcyBvZiBIb29rczogaHR0cHM6Ly9yZWFjdC5kZXYvbGluay9ydWxlcy1vZi1ob29rc1xcblxcbiAgIFByZXZpb3VzIHJlbmRlciAgICAgICAgICAgIE5leHQgcmVuZGVyXFxuICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuJXMgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5cXG5cIixcbiAgICAgICAgICAgIGNvbXBvbmVudE5hbWUsXG4gICAgICAgICAgICB0YWJsZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcykge1xuICAgICAgdm9pZCAwID09PSBkZXBzIHx8XG4gICAgICAgIG51bGwgPT09IGRlcHMgfHxcbiAgICAgICAgaXNBcnJheUltcGwoZGVwcykgfHxcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBcIiVzIHJlY2VpdmVkIGEgZmluYWwgYXJndW1lbnQgdGhhdCBpcyBub3QgYW4gYXJyYXkgKGluc3RlYWQsIHJlY2VpdmVkIGAlc2ApLiBXaGVuIHNwZWNpZmllZCwgdGhlIGZpbmFsIGFyZ3VtZW50IG11c3QgYmUgYW4gYXJyYXkuXCIsXG4gICAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYsXG4gICAgICAgICAgdHlwZW9mIGRlcHNcbiAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gd2Fybk9uVXNlRm9ybVN0YXRlSW5EZXYoKSB7XG4gICAgICB2Y
15852XIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoY3VycmVudGx5UmVuZGVyaW5nRmliZXIpO1xuICAgICAgZGlkV2FybkFib3V0VXNlRm9ybVN0YXRlLmhhcyhjb21wb25lbnROYW1lKSB8fFxuICAgICAgICAoZGlkV2FybkFib3V0VXNlRm9ybVN0YXRlLmFkZChjb21wb25lbnROYW1lKSxcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBcIlJlYWN0RE9NLnVzZUZvcm1TdGF0ZSBoYXMgYmVlbiByZW5hbWVkIHRvIFJlYWN0LnVzZUFjdGlvblN0YXRlLiBQbGVhc2UgdXBkYXRlICVzIHRvIHVzZSBSZWFjdC51c2VBY3Rpb25TdGF0ZS5cIixcbiAgICAgICAgICBjb21wb25lbnROYW1lXG4gICAgICAgICkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB0aHJvd0ludmFsaWRIb29rRXJyb3IoKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgXCJJbnZhbGlkIGhvb2sgY2FsbC4gSG9va3MgY2FuIG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XFxuMS4gWW91IG1pZ2h0IGhhdmUgbWlzbWF0Y2hpbmcgdmVyc2lvbnMgb2YgUmVhY3QgYW5kIHRoZSByZW5kZXJlciAoc3VjaCBhcyBSZWFjdCBET00pXFxuMi4gWW91IG1pZ2h0IGJlIGJyZWFraW5nIHRoZSBSdWxlcyBvZiBIb29rc1xcbjMuIFlvdSBtaWdodCBoYXZlIG1vcmUgdGhhbiBvbmUgY29weSBvZiBSZWFjdCBpbiB0aGUgc2FtZSBhcHBcXG5TZWUgaHR0cHM6Ly9yZWFjdC5kZXYvbGluay9pbnZhbGlkLWhvb2stY2FsbCBmb3IgdGlwcyBhYm91dCBob3cgdG8gZGVidWcgYW5kIGZpeCB0aGlzIHByb2JsZW0uXCJcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFyZUhvb2tJbnB1dHNFcXVhbChuZXh0RGVwcywgcHJldkRlcHMpIHtcbiAgICAgIGlmIChpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcykgcmV0dXJuICExO1xuICAgICAgaWYgKG51bGwgPT09IHByZXZEZXBzKVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIiVzIHJlY2VpdmVkIGEgZmluYWwgYXJndW1lbnQgZHVyaW5nIHRoaXMgcmVuZGVyLCBidXQgbm90IGR1cmluZyB0aGUgcHJldmlvdXMgcmVuZGVyLiBFdmVuIHRob3VnaCB0aGUgZmluYWwgYXJndW1lbnQgaXMgb3B0aW9uYWwsIGl0cyB0eXBlIGNhbm5vdCBjaGFuZ2UgYmV0d2VlbiByZW5kZXJzLlwiLFxuICAgICAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXZcbiAgICAgICAgICApLFxuICAgICAgICAgICExXG4gICAgICAgICk7XG4gICAgICBuZXh0RGVwcy5sZW5ndGggIT09IHByZXZEZXBzLmxlbmd0aCAmJlxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiVGhlIGZpbmFsIGFyZ3VtZW50IHBhc3NlZCB0byAlcyBjaGFuZ2VkIHNpemUgYmV0d2VlbiByZW5kZXJzLiBUaGUgb3JkZXIgYW5kIHNpemUgb2YgdGhpcyBhcnJheSBtdXN0IHJlbWFpbiBjb25zdGFudC5cXG5cXG5QcmV2aW91czogJXNcXG5JbmNvbWluZzogJXNcIixcbiAgICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldixcbiAgICAgICAgICBcIltcIiArIHByZXZEZXBzLmpvaW4oXCIsIFwiKSArIFwiXVwiLFxuICAgICAgICAgIFwiW1wiICsgbmV4dERlcHMuam9pbihcIiwgXCIpICsgXCJdXCJcbiAgICAgICAgKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJldkRlcHMubGVuZ3RoICYmIGkgPCBuZXh0RGVwcy5sZW5ndGg7IGkrKylcbiAgICAgICAgaWYgKCFvYmplY3RJcyhuZXh0RGVwc1tpXSwgcHJldkRlcHNbaV0pKSByZXR1cm4gITE7XG4gICAgICByZXR1cm4gITA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbmRlcldpdGhIb29rcyhcbiAgICAgIGN1cnJlbnQsXG4gICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgIENvbXBvbmVudCxcbiAgICAgIHByb3BzLFxuICAgICAgc2Vjb25kQXJnLFxuICAgICAgbmV4dFJlbmRlckxhbmVzXG4gICAgKSB7XG4gICAgICByZW5kZXJMYW5lcyA9IG5leHRSZW5kZXJMYW5lcztcbiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgICBob29rVHlwZXNEZXYgPSBudWxsICE9PSBjdXJyZW50ID8gY3VycmVudC5fZGVidWdIb29rVHlwZXMgOiBudWxsO1xuICAgICAgaG9va1R5cGVzVXBkYXRlSW5kZXhEZXYgPSAtMTtcbiAgICAgIGlnbm9yZVByZXZpb3VzRGVwZW5kZW5jaWVzID1cbiAgICAgICAgbnVsbCAhPT0gY3VycmVudCAmJiBjdXJyZW50LnR5cGUgIT09IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICBpZiAoXG4gICAgICAgIFwiW29iamVjdCBBc3luY0Z1bmN0aW9uXVwiID09PVxuICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChDb21wb25lbnQpIHx8XG4gICAgICAgIFwiW29iamVjdCBBc3luY0dlbmVyYXRvckZ1bmN0aW9uXVwiID09PVxuICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChDb21wb25lbnQpXG4gICAgICApXG4gICAgICAgIChuZXh0UmVuZGVyTGFuZXMgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyKSksXG4gICAgICAgICAgZGlkV2FybkFib3V0QXN5bmNDbGllbnRDb21wb25lbnQuaGFzKG5leHRSZW5kZXJMYW5lcykgfHxcbiAgICAgICAgICAgIChkaWRXYXJuQWJvdXRBc3luY0NsaWVudENvbXBvbmVudC5hZGQobmV4dFJlbmRlckxhbmVzKSxcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIFwiJXMgaXMgYW4gYXN5bmMgQ2xpZW50IENvbXBvbmVudC4gT25seSBTZXJ2ZXIgQ29tcG9uZW50cyBjYW4gYmUgYXN5bmMgYXQgdGhlIG1vbWVudC4gVGhpcyBlcnJvciBpcyBvZnRlbiBjYXVzZWQgYnkgYWNjaWRlbnRhbGx5IGFkZGluZyBgJ3VzZSBjbGllbnQnYCB0byBhIG1vZHVsZSB0aGF0IHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gZm9yIHRoZSBzZXJ2ZXIuXCIsXG4gICAgICAgICAgICAgIG51bGwgPT09IG5leHRSZW5kZXJMYW5lc1xuICAgICAgICAgICAgICAgID8gXCJBbiB1bmtub3duIENvbXBvbmVudFwiXG4gICAgICAgICAgICAgICAgOiBcIjxcIiArIG5leHRSZW5kZXJMYW5lcyArIFwiPlwiXG4gICAgICAgICAgICApKTtcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBudWxsO1xuICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSAwO1xuICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuSCA9XG4gICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiYgbnVsbCAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlXG4gICAgICAgICAgPyBIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWXG4gICAgICAgICAgOiBudWxsICE9PSB
15852ob29rVHlwZXNEZXZcbiAgICAgICAgICAgID8gSG9va3NEaXNwYXRjaGVyT25Nb3VudFdpdGhIb29rVHlwZXNJbkRFVlxuICAgICAgICAgICAgOiBIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG4gICAgICBzaG91bGREb3VibGVJbnZva2VVc2VyRm5zSW5Ib29rc0RFViA9IG5leHRSZW5kZXJMYW5lcyA9XG4gICAgICAgICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSkgIT09IE5vTW9kZTtcbiAgICAgIHZhciBjaGlsZHJlbiA9IGNhbGxDb21wb25lbnRJbkRFVihDb21wb25lbnQsIHByb3BzLCBzZWNvbmRBcmcpO1xuICAgICAgc2hvdWxkRG91YmxlSW52b2tlVXNlckZuc0luSG9va3NERVYgPSAhMTtcbiAgICAgIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyAmJlxuICAgICAgICAoY2hpbGRyZW4gPSByZW5kZXJXaXRoSG9va3NBZ2FpbihcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICBDb21wb25lbnQsXG4gICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgc2Vjb25kQXJnXG4gICAgICAgICkpO1xuICAgICAgaWYgKG5leHRSZW5kZXJMYW5lcykge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyghMCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY2hpbGRyZW4gPSByZW5kZXJXaXRoSG9va3NBZ2FpbihcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgQ29tcG9uZW50LFxuICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICBzZWNvbmRBcmdcbiAgICAgICAgICApO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKCExKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZmluaXNoUmVuZGVyaW5nSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuICAgIH1cbiAgICBmdW5jdGlvbiBmaW5pc2hSZW5kZXJpbmdIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnSG9va1R5cGVzID0gaG9va1R5cGVzRGV2O1xuICAgICAgbnVsbCA9PT0gd29ya0luUHJvZ3Jlc3MuZGVwZW5kZW5jaWVzXG4gICAgICAgID8gbnVsbCAhPT0gdGhlbmFibGVTdGF0ZSAmJlxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMgPSB7XG4gICAgICAgICAgICBsYW5lczogMCxcbiAgICAgICAgICAgIGZpcnN0Q29udGV4dDogbnVsbCxcbiAgICAgICAgICAgIF9kZWJ1Z1RoZW5hYmxlU3RhdGU6IHRoZW5hYmxlU3RhdGVcbiAgICAgICAgICB9KVxuICAgICAgICA6ICh3b3JrSW5Qcm9ncmVzcy5kZXBlbmRlbmNpZXMuX2RlYnVnVGhlbmFibGVTdGF0ZSA9IHRoZW5hYmxlU3RhdGUpO1xuICAgICAgdmFyIHRoZW5hYmxlU3RhdGUkanNjb21wJDAgPSB0aGVuYWJsZVN0YXRlO1xuICAgICAgbnVsbCAhPT0gbGFzdFN1c3BlbmRlZEZpYmVyICYmXG4gICAgICAgIGFyZVNhbWVLZXlQYXRoKGxhc3RTdXNwZW5kZWRGaWJlciwgd29ya0luUHJvZ3Jlc3MpICYmXG4gICAgICAgIChudWxsICE9PSB0aGVuYWJsZVN0YXRlJGpzY29tcCQwIHx8XG4gICAgICAgICAgbnVsbCA9PT0gbGFzdFN1c3BlbmRlZFN0YWNrIHx8XG4gICAgICAgICAgZGlkSXNzdWVVc2VXYXJuaW5nIHx8XG4gICAgICAgICAgKChkaWRJc3N1ZVVzZVdhcm5pbmcgPSAhMCksIGNvbnNvbGUuZXJyb3IobGFzdFN1c3BlbmRlZFN0YWNrKSksXG4gICAgICAgIChsYXN0U3VzcGVuZGVkU3RhY2sgPSBsYXN0U3VzcGVuZGVkRmliZXIgPSBudWxsKSk7XG4gICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuICAgICAgdGhlbmFibGVTdGF0ZSRqc2NvbXAkMCA9XG4gICAgICAgIG51bGwgIT09IGN1cnJlbnRIb29rICYmIG51bGwgIT09IGN1cnJlbnRIb29rLm5leHQ7XG4gICAgICByZW5kZXJMYW5lcyA9IDA7XG4gICAgICBob29rVHlwZXNEZXYgPVxuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9XG4gICAgICAgIHdvcmtJblByb2dyZXNzSG9vayA9XG4gICAgICAgIGN1cnJlbnRIb29rID1cbiAgICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIgPVxuICAgICAgICAgIG51bGw7XG4gICAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xO1xuICAgICAgbnVsbCAhPT0gY3VycmVudCAmJlxuICAgICAgICAoY3VycmVudC5mbGFncyAmIDEyMDY5MTA5NzYpICE9PSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiAxMjA2OTEwOTc2KSAmJlxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiSW50ZXJuYWwgUmVhY3QgZXJyb3I6IEV4cGVjdGVkIHN0YXRpYyBmbGFnIHdhcyBtaXNzaW5nLiBQbGVhc2Ugbm90aWZ5IHRoZSBSZWFjdCB0ZWFtLlwiXG4gICAgICAgICk7XG4gICAgICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gITE7XG4gICAgICB0aGVuYWJsZUluZGV4Q291bnRlciA9IDA7XG4gICAgICB0aGVuYWJsZVN0YXRlID0gbnVsbDtcbiAgICAgIGlmICh0aGVuYWJsZVN0YXRlJGpzY29tcCQwKVxuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBcIlJlbmRlcmVkIGZld2VyIGhvb2tzIHRoYW4gZXhwZWN0ZWQuIFRoaXMgbWF5IGJlIGNhdXNlZCBieSBhbiBhY2NpZGVudGFsIGVhcmx5IHJldHVybiBzdGF0ZW1lbnQuXCJcbiAgICAgICAgKTtcbiAgICAgIG51bGwgPT09IGN1cnJlbnQgfHxcbiAgICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSB8fFxuICAgICAgICAoKGN1cnJlbnQgPSBjdXJyZW50LmRlcGVuZGVuY2llcyksXG4gICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiZcbiAgICAgICAgICBjaGVja0lmQ29udGV4dENoYW5nZWQoY3VycmVudCkgJiZcbiAgICAgICAgICAoZGlkUmVjZWl2ZVVwZGF0ZSA9ICEwKSk7XG4gICAgICBuZWVkc1RvUmVzZXRTdXNwZW5kZWRUaGVuYWJsZURFVlxuICAgICAgICA/ICgobmVlZHNUb1Jlc2V0U3VzcGVuZGVkVGhlbmFibGVERVYgPSAhMSksIChjdXJyZW50ID0gITApKVxuICAgICAgICA6IChjdXJyZW50ID0gITEpO1xuICAgICAgY3VycmVudCAmJlxuICAgICAgICAoKHdvcmtJblByb2dyZXNzID1cbiAgICAgICAgICBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHdvcmtJblByb2dyZXNzKSB8fCBcIlVua25vd25cIiksXG4gICAgICAgIGRpZFdhcm5BYm91dFVzZVdyYXBwZWRJblRyeUNhdGNoLmhhcyh3b3JrSW5Qcm9ncmVzcykgfHxcbiAgICAgICAgICBkaWRXYXJuQWJvdXRBc3luY0NsaWVudENvbXBvbmVudC5oYXMod29ya0luUHJvZ3Jlc3MpIHx8XG4gICAgICAgICAgKGRpZFdhcm5BYm91dFVzZVdyYXBwZWRJblRyeUNhdGNoLmFkZCh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiYHVzZWAgd2FzIGNhbGxlZCBmcm9tIGluc2lkZSBhIHRyeS9jYXRjaCBibG9jay4gVGhpcyBpcyBub3QgYWxsb3dlZCBhbmQgY2FuIGxlYWQgdG8gdW5leHBlY3RlZCBiZWhhdmlvci4gVG8gaGFuZGxlIGVycm9ycyB0cmlnZ2VyZWQgYnkgYHVzZWAsIHdyYXAgeW91ciBjb21wb25lbnQgaW4gYSBlcnJvciBib3VuZGFyeS5cIlxuICAgICAgICAgICkpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVuZGVyV2l0aEhvb2tzQWdhaW4od29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCwgcHJvcHMsIHNlY29uZEFyZykge1xuICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICAgIHZhciBudW1iZXJPZlJlUmVuZGVycyA9IDA7XG4gICAgICBkbyB7XG4gICAgICAgIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyAmJiAodGhlbmFibGVTdGF0ZSA9IG51bGwpO1xuICAgICAgICB0aGVuYWJsZUluZGV4Q291bnRlciA9IDA7XG4gICAgICAgIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyA9ICExO1xuICAgICAgICBpZiAobnVtYmVyT2ZSZVJlbmRlcnMgPj0gUkVfUkVOREVSX0xJTUlUKVxuICAgICAgICAgI
15852HRocm93IEVycm9yKFxuICAgICAgICAgICAgXCJUb28gbWFueSByZS1yZW5kZXJzLiBSZWFjdCBsaW1pdHMgdGhlIG51bWJlciBvZiByZW5kZXJzIHRvIHByZXZlbnQgYW4gaW5maW5pdGUgbG9vcC5cIlxuICAgICAgICAgICk7XG4gICAgICAgIG51bWJlck9mUmVSZW5kZXJzICs9IDE7XG4gICAgICAgIGlnbm9yZVByZXZpb3VzRGVwZW5kZW5jaWVzID0gITE7XG4gICAgICAgIHdvcmtJblByb2dyZXNzSG9vayA9IGN1cnJlbnRIb29rID0gbnVsbDtcbiAgICAgICAgaWYgKG51bGwgIT0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUpIHtcbiAgICAgICAgICB2YXIgY2hpbGRyZW4gPSB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZTtcbiAgICAgICAgICBjaGlsZHJlbi5sYXN0RWZmZWN0ID0gbnVsbDtcbiAgICAgICAgICBjaGlsZHJlbi5ldmVudHMgPSBudWxsO1xuICAgICAgICAgIGNoaWxkcmVuLnN0b3JlcyA9IG51bGw7XG4gICAgICAgICAgbnVsbCAhPSBjaGlsZHJlbi5tZW1vQ2FjaGUgJiYgKGNoaWxkcmVuLm1lbW9DYWNoZS5pbmRleCA9IDApO1xuICAgICAgICB9XG4gICAgICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7XG4gICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVY7XG4gICAgICAgIGNoaWxkcmVuID0gY2FsbENvbXBvbmVudEluREVWKENvbXBvbmVudCwgcHJvcHMsIHNlY29uZEFyZyk7XG4gICAgICB9IHdoaWxlIChkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MpO1xuICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuICAgIH1cbiAgICBmdW5jdGlvbiBUcmFuc2l0aW9uQXdhcmVIb3N0Q29tcG9uZW50KCkge1xuICAgICAgdmFyIGRpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5ILFxuICAgICAgICBtYXliZVRoZW5hYmxlID0gZGlzcGF0Y2hlci51c2VTdGF0ZSgpWzBdO1xuICAgICAgbWF5YmVUaGVuYWJsZSA9XG4gICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIG1heWJlVGhlbmFibGUudGhlblxuICAgICAgICAgID8gdXNlVGhlbmFibGUobWF5YmVUaGVuYWJsZSlcbiAgICAgICAgICA6IG1heWJlVGhlbmFibGU7XG4gICAgICBkaXNwYXRjaGVyID0gZGlzcGF0Y2hlci51c2VTdGF0ZSgpWzBdO1xuICAgICAgKG51bGwgIT09IGN1cnJlbnRIb29rID8gY3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZSA6IG51bGwpICE9PVxuICAgICAgICBkaXNwYXRjaGVyICYmIChjdXJyZW50bHlSZW5kZXJpbmdGaWJlci5mbGFncyB8PSAxMDI0KTtcbiAgICAgIHJldHVybiBtYXliZVRoZW5hYmxlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja0RpZFJlbmRlcklkSG9vaygpIHtcbiAgICAgIHZhciBkaWRSZW5kZXJJZEhvb2sgPSAwICE9PSBsb2NhbElkQ291bnRlcjtcbiAgICAgIGxvY2FsSWRDb3VudGVyID0gMDtcbiAgICAgIHJldHVybiBkaWRSZW5kZXJJZEhvb2s7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbGFuZXMpIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gY3VycmVudC51cGRhdGVRdWV1ZTtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzID1cbiAgICAgICAgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZVxuICAgICAgICAgID8gd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiAtODA1MzA4NDIxXG4gICAgICAgICAgOiB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIC0yMDUzO1xuICAgICAgY3VycmVudC5sYW5lcyAmPSB+bGFuZXM7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlc2V0SG9va3NPblVud2luZCh3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgaWYgKGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUpIHtcbiAgICAgICAgZm9yIChcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgbnVsbCAhPT0gd29ya0luUHJvZ3Jlc3M7XG5cbiAgICAgICAgKSB7XG4gICAgICAgICAgdmFyIHF1ZXVlID0gd29ya0luUHJvZ3Jlc3MucXVldWU7XG4gICAgICAgICAgbnVsbCAhPT0gcXVldWUgJiYgKHF1ZXVlLnBlbmRpbmcgPSBudWxsKTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IHdvcmtJblByb2dyZXNzLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgZGlkU2NoZWR1bGVSZW5kZXJQaGFzZVVwZGF0ZSA9ICExO1xuICAgICAgfVxuICAgICAgcmVuZGVyTGFuZXMgPSAwO1xuICAgICAgaG9va1R5cGVzRGV2ID1cbiAgICAgICAgd29ya0luUHJvZ3Jlc3NIb29rID1cbiAgICAgICAgY3VycmVudEhvb2sgPVxuICAgICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciA9XG4gICAgICAgICAgbnVsbDtcbiAgICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7XG4gICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IG51bGw7XG4gICAgICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSAhMTtcbiAgICAgIHRoZW5hYmxlSW5kZXhDb3VudGVyID0gbG9jYWxJZENvdW50ZXIgPSAwO1xuICAgICAgdGhlbmFibGVTdGF0ZSA9IG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCkge1xuICAgICAgdmFyIGhvb2sgPSB7XG4gICAgICAgIG1lbW9pemVkU3RhdGU6IG51bGwsXG4gICAgICAgIGJhc2VTdGF0ZTogbnVsbCxcbiAgICAgICAgYmFzZVF1ZXVlOiBudWxsLFxuICAgICAgICBxdWV1ZTogbnVsbCxcbiAgICAgICAgbmV4dDogbnVsbFxuICAgICAgfTtcbiAgICAgIG51bGwgPT09IHdvcmtJblByb2dyZXNzSG9va1xuICAgICAgICA/IChjdXJyZW50bHlSZW5kZXJpbmdGaWJlci5tZW1vaXplZFN0YXRlID0gd29ya0luUHJvZ3Jlc3NIb29rID0gaG9vaylcbiAgICAgICAgOiAod29ya0luUHJvZ3Jlc3NIb29rID0gd29ya0luUHJvZ3Jlc3NIb29rLm5leHQgPSBob29rKTtcbiAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzc0hvb2s7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpIHtcbiAgICAgIGlmIChudWxsID09PSBjdXJyZW50SG9vaykge1xuICAgICAgICB2Y
15852XIgbmV4dEN1cnJlbnRIb29rID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIuYWx0ZXJuYXRlO1xuICAgICAgICBuZXh0Q3VycmVudEhvb2sgPVxuICAgICAgICAgIG51bGwgIT09IG5leHRDdXJyZW50SG9vayA/IG5leHRDdXJyZW50SG9vay5tZW1vaXplZFN0YXRlIDogbnVsbDtcbiAgICAgIH0gZWxzZSBuZXh0Q3VycmVudEhvb2sgPSBjdXJyZW50SG9vay5uZXh0O1xuICAgICAgdmFyIG5leHRXb3JrSW5Qcm9ncmVzc0hvb2sgPVxuICAgICAgICBudWxsID09PSB3b3JrSW5Qcm9ncmVzc0hvb2tcbiAgICAgICAgICA/IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLm1lbW9pemVkU3RhdGVcbiAgICAgICAgICA6IHdvcmtJblByb2dyZXNzSG9vay5uZXh0O1xuICAgICAgaWYgKG51bGwgIT09IG5leHRXb3JrSW5Qcm9ncmVzc0hvb2spXG4gICAgICAgICh3b3JrSW5Qcm9ncmVzc0hvb2sgPSBuZXh0V29ya0luUHJvZ3Jlc3NIb29rKSxcbiAgICAgICAgICAoY3VycmVudEhvb2sgPSBuZXh0Q3VycmVudEhvb2spO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGlmIChudWxsID09PSBuZXh0Q3VycmVudEhvb2spIHtcbiAgICAgICAgICBpZiAobnVsbCA9PT0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIuYWx0ZXJuYXRlKVxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgIFwiVXBkYXRlIGhvb2sgY2FsbGVkIG9uIGluaXRpYWwgcmVuZGVyLiBUaGlzIGlzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXCJSZW5kZXJlZCBtb3JlIGhvb2tzIHRoYW4gZHVyaW5nIHRoZSBwcmV2aW91cyByZW5kZXIuXCIpO1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRIb29rID0gbmV4dEN1cnJlbnRIb29rO1xuICAgICAgICBuZXh0Q3VycmVudEhvb2sgPSB7XG4gICAgICAgICAgbWVtb2l6ZWRTdGF0ZTogY3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZSxcbiAgICAgICAgICBiYXNlU3RhdGU6IGN1cnJlbnRIb29rLmJhc2VTdGF0ZSxcbiAgICAgICAgICBiYXNlUXVldWU6IGN1cnJlbnRIb29rLmJhc2VRdWV1ZSxcbiAgICAgICAgICBxdWV1ZTogY3VycmVudEhvb2sucXVldWUsXG4gICAgICAgICAgbmV4dDogbnVsbFxuICAgICAgICB9O1xuICAgICAgICBudWxsID09PSB3b3JrSW5Qcm9ncmVzc0hvb2tcbiAgICAgICAgICA/IChjdXJyZW50bHlSZW5kZXJpbmdGaWJlci5tZW1vaXplZFN0YXRlID0gd29ya0luUHJvZ3Jlc3NIb29rID1cbiAgICAgICAgICAgICAgbmV4dEN1cnJlbnRIb29rKVxuICAgICAgICAgIDogKHdvcmtJblByb2dyZXNzSG9vayA9IHdvcmtJblByb2dyZXNzSG9vay5uZXh0ID0gbmV4dEN1cnJlbnRIb29rKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzc0hvb2s7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZUZ1bmN0aW9uQ29tcG9uZW50VXBkYXRlUXVldWUoKSB7XG4gICAgICByZXR1cm4geyBsYXN0RWZmZWN0OiBudWxsLCBldmVudHM6IG51bGwsIHN0b3JlczogbnVsbCwgbWVtb0NhY2hlOiBudWxsIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVzZVRoZW5hYmxlKHRoZW5hYmxlKSB7XG4gICAgICB2Y
15852XIgaW5kZXggPSB0aGVuYWJsZUluZGV4Q291bnRlcjtcbiAgICAgIHRoZW5hYmxlSW5kZXhDb3VudGVyICs9IDE7XG4gICAgICBudWxsID09PSB0aGVuYWJsZVN0YXRlICYmICh0aGVuYWJsZVN0YXRlID0gY3JlYXRlVGhlbmFibGVTdGF0ZSgpKTtcbiAgICAgIHRoZW5hYmxlID0gdHJhY2tVc2VkVGhlbmFibGUoXG4gICAgICAgIHRoZW5hYmxlU3RhdGUsXG4gICAgICAgIHRoZW5hYmxlLFxuICAgICAgICBpbmRleCxcbiAgICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXJcbiAgICAgICk7XG4gICAgICBpbmRleCA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyO1xuICAgICAgbnVsbCA9PT1cbiAgICAgICAgKG51bGwgPT09IHdvcmtJblByb2dyZXNzSG9va1xuICAgICAgICAgID8gaW5kZXgubWVtb2l6ZWRTdGF0ZVxuICAgICAgICAgIDogd29ya0luUHJvZ3Jlc3NIb29rLm5leHQpICYmXG4gICAgICAgICgoaW5kZXggPSBpbmRleC5hbHRlcm5hdGUpLFxuICAgICAgICAoUmVhY3RTaGFyZWRJbnRlcm5hbHMuSCA9XG4gICAgICAgICAgbnVsbCAhPT0gaW5kZXggJiYgbnVsbCAhPT0gaW5kZXgubWVtb2l6ZWRTdGF0ZVxuICAgICAgICAgICAgPyBIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWXG4gICAgICAgICAgICA6IEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVikpO1xuICAgICAgcmV0dXJuIHRoZW5hYmxlO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1c2UodXNhYmxlKSB7XG4gICAgICBpZiAobnVsbCAhPT0gdXNhYmxlICYmIFwib2JqZWN0XCIgPT09IHR5cGVvZiB1c2FibGUpIHtcbiAgICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHVzYWJsZS50aGVuKSByZXR1cm4gdXNlVGhlbmFibGUodXNhYmxlKTtcbiAgICAgICAgaWYgKHVzYWJsZS4kJHR5cGVvZiA9PT0gUkVBQ1RfUkVDT1ZFUkFCTEVfVFlQRSkgcmV0dXJuO1xuICAgICAgICBpZiAodXNhYmxlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUpIHJldHVybiByZWFkQ29udGV4dCh1c2FibGUpO1xuICAgICAgfVxuICAgICAgdGhyb3cgRXJyb3IoXCJBbiB1bnN1cHBvcnRlZCB0eXBlIHdhcyBwYXNzZWQgdG8gdXNlKCk6IFwiICsgU3RyaW5nKHVzYWJsZSkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1c2VNZW1vQ2FjaGUoc2l6ZSkge1xuICAgICAgdmFyIG1lbW9DYWNoZSA9IG51bGwsXG4gICAgICAgIHVwZGF0ZVF1ZXVlID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIudXBkYXRlUXVldWU7XG4gICAgICBudWxsICE9PSB1cGRhdGVRdWV1ZSAmJiAobWVtb0NhY2hlID0gdXBkYXRlUXVldWUubWVtb0NhY2hlKTtcbiAgICAgIGlmIChudWxsID09IG1lbW9DYWNoZSkge1xuICAgICAgICB2Y
15852XIgY3VycmVudCA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLmFsdGVybmF0ZTtcbiAgICAgICAgbnVsbCAhPT0gY3VycmVudCAmJlxuICAgICAgICAgICgoY3VycmVudCA9IGN1cnJlbnQudXBkYXRlUXVldWUpLFxuICAgICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiZcbiAgICAgICAgICAgICgoY3VycmVudCA9IGN1cnJlbnQubWVtb0NhY2hlKSxcbiAgICAgICAgICAgIG51bGwgIT0gY3VycmVudCAmJlxuICAgICAgICAgICAgICAobWVtb0NhY2hlID0ge1xuICAgICAgICAgICAgICAgIGRhdGE6IGN1cnJlbnQuZGF0YS5tYXAoZnVuY3Rpb24gKGFycmF5KSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkuc2xpY2UoKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBpbmRleDogMFxuICAgICAgICAgICAgICB9KSkpO1xuICAgICAgfVxuICAgICAgbnVsbCA9PSBtZW1vQ2FjaGUgJiYgKG1lbW9DYWNoZSA9IHsgZGF0YTogW10sIGluZGV4OiAwIH0pO1xuICAgICAgbnVsbCA9PT0gdXBkYXRlUXVldWUgJiZcbiAgICAgICAgKCh1cGRhdGVRdWV1ZSA9IGNyZWF0ZUZ1bmN0aW9uQ29tcG9uZW50VXBkYXRlUXVldWUoKSksXG4gICAgICAgIChjdXJyZW50bHlSZW5kZXJpbmdGaWJlci51cGRhdGVRdWV1ZSA9IHVwZGF0ZVF1ZXVlKSk7XG4gICAgICB1cGRhdGVRdWV1ZS5tZW1vQ2FjaGUgPSBtZW1vQ2FjaGU7XG4gICAgICB1cGRhdGVRdWV1ZSA9IG1lbW9DYWNoZS5kYXRhW21lbW9DYWNoZS5pbmRleF07XG4gICAgICBpZiAodm9pZCAwID09PSB1cGRhdGVRdWV1ZSB8fCBpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcylcbiAgICAgICAgZm9yIChcbiAgICAgICAgICB1cGRhdGVRdWV1ZSA9IG1lbW9DYWNoZS5kYXRhW21lbW9DYWNoZS5pbmRleF0gPSBBcnJheShzaXplKSxcbiAgICAgICAgICAgIGN1cnJlbnQgPSAwO1xuICAgICAgICAgIGN1cnJlbnQgPCBzaXplO1xuICAgICAgICAgIGN1cnJlbnQrK1xuICAgICAgICApXG4gICAgICAgICAgdXBkYXRlUXVldWVbY3VycmVudF0gPSBSRUFDVF9NRU1PX0NBQ0hFX1NFTlRJTkVMO1xuICAgICAgZWxzZVxuICAgICAgICB1cGRhdGVRdWV1ZS5sZW5ndGggIT09IHNpemUgJiZcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJFeHBlY3RlZCBhIGNvbnN0YW50IHNpemUgYXJndW1lbnQgZm9yIGVhY2ggaW52b2NhdGlvbiBvZiB1c2VNZW1vQ2FjaGUuIFRoZSBwcmV2aW91cyBjYWNoZSB3YXMgYWxsb2NhdGVkIHdpdGggc2l6ZSAlcyBidXQgc2l6ZSAlcyB3YXMgcmVxdWVzdGVkLlwiLFxuICAgICAgICAgICAgdXBkYXRlUXVldWUubGVuZ3RoLFxuICAgICAgICAgICAgc2l6ZVxuICAgICAgICAgICk7XG4gICAgICBtZW1vQ2FjaGUuaW5kZXgrKztcbiAgICAgIHJldHVybiB1cGRhdGVRdWV1ZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYmFzaWNTdGF0ZVJlZHVjZXIoc3RhdGUsIGFjdGlvbikge1xuICAgICAgcmV0dXJuIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGFjdGlvbiA/IGFjdGlvbihzdGF0ZSkgOiBhY3Rpb247XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1vdW50UmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICB2Y
15852XIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gICAgICBpZiAodm9pZCAwICE9PSBpbml0KSB7XG4gICAgICAgIHZhciBpbml0aWFsU3RhdGUgPSBpbml0KGluaXRpYWxBcmcpO1xuICAgICAgICBpZiAoc2hvdWxkRG91YmxlSW52b2tlVXNlckZuc0luSG9va3NERVYpIHtcbiAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyghMCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGluaXQoaW5pdGlhbEFyZyk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKCExKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpbml0aWFsU3RhdGUgPSBpbml0aWFsQXJnO1xuICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gaG9vay5iYXNlU3RhdGUgPSBpbml0aWFsU3RhdGU7XG4gICAgICByZWR1Y2VyID0ge1xuICAgICAgICBwZW5kaW5nOiBudWxsLFxuICAgICAgICBsYW5lczogMCxcbiAgICAgICAgZGlzcGF0Y2g6IG51bGwsXG4gICAgICAgIGxhc3RSZW5kZXJlZFJlZHVjZXI6IHJlZHVjZXIsXG4gICAgICAgIGxhc3RSZW5kZXJlZFN0YXRlOiBpbml0aWFsU3RhdGVcbiAgICAgIH07XG4gICAgICBob29rLnF1ZXVlID0gcmVkdWNlcjtcbiAgICAgIHJlZHVjZXIgPSByZWR1Y2VyLmRpc3BhdGNoID0gZGlzcGF0Y2hSZWR1Y2VyQWN0aW9uLmJpbmQoXG4gICAgICAgIG51bGwsXG4gICAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLFxuICAgICAgICByZWR1Y2VyXG4gICAgICApO1xuICAgICAgcmV0dXJuIFtob29rLm1lbW9pemVkU3RhdGUsIHJlZHVjZXJdO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVSZWR1Y2VyKHJlZHVjZXIpIHtcbiAgICAgIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gICAgICByZXR1cm4gdXBkYXRlUmVkdWNlckltcGwoaG9vaywgY3VycmVudEhvb2ssIHJlZHVjZXIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVSZWR1Y2VySW1wbChob29rLCBjdXJyZW50LCByZWR1Y2VyKSB7XG4gICAgICB2Y
15852XIgcXVldWUgPSBob29rLnF1ZXVlO1xuICAgICAgaWYgKG51bGwgPT09IHF1ZXVlKVxuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBcIlNob3VsZCBoYXZlIGEgcXVldWUuIFlvdSBhcmUgbGlrZWx5IGNhbGxpbmcgSG9va3MgY29uZGl0aW9uYWxseSwgd2hpY2ggaXMgbm90IGFsbG93ZWQuIChodHRwczovL3JlYWN0LmRldi9saW5rL2ludmFsaWQtaG9vay1jYWxsKVwiXG4gICAgICAgICk7XG4gICAgICBxdWV1ZS5sYXN0UmVuZGVyZWRSZWR1Y2VyID0gcmVkdWNlcjtcbiAgICAgIHZhciBiYXNlUXVldWUgPSBob29rLmJhc2VRdWV1ZSxcbiAgICAgICAgcGVuZGluZ1F1ZXVlID0gcXVldWUucGVuZGluZztcbiAgICAgIGlmIChudWxsICE9PSBwZW5kaW5nUXVldWUpIHtcbiAgICAgICAgaWYgKG51bGwgIT09IGJhc2VRdWV1ZSkge1xuICAgICAgICAgIHZhciBiYXNlRmlyc3QgPSBiYXNlUXVldWUubmV4dDtcbiAgICAgICAgICBiYXNlUXVldWUubmV4dCA9IHBlbmRpbmdRdWV1ZS5uZXh0O1xuICAgICAgICAgIHBlbmRpbmdRdWV1ZS5uZXh0ID0gYmFzZUZpcnN0O1xuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnQuYmFzZVF1ZXVlICE9PSBiYXNlUXVldWUgJiZcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJJbnRlcm5hbCBlcnJvcjogRXhwZWN0ZWQgd29yay1pbi1wcm9ncmVzcyBxdWV1ZSB0byBiZSBhIGNsb25lLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LlwiXG4gICAgICAgICAgKTtcbiAgICAgICAgY3VycmVudC5iYXNlUXVldWUgPSBiYXNlUXVldWUgPSBwZW5kaW5nUXVldWU7XG4gICAgICAgIHF1ZXVlLnBlbmRpbmcgPSBudWxsO1xuICAgICAgfVxuICAgICAgcGVuZGluZ1F1ZXVlID0gaG9vay5iYXNlU3RhdGU7XG4gICAgICBpZiAobnVsbCA9PT0gYmFzZVF1ZXVlKSBob29rLm1lbW9pemVkU3RhdGUgPSBwZW5kaW5nUXVldWU7XG4gICAgICBlbHNlIHtcbiAgICAgICAgY3VycmVudCA9IGJhc2VRdWV1ZS5uZXh0O1xuICAgICAgICB2Y
15852XIgbmV3QmFzZVF1ZXVlRmlyc3QgPSAoYmFzZUZpcnN0ID0gbnVsbCksXG4gICAgICAgICAgbmV3QmFzZVF1ZXVlTGFzdCA9IG51bGwsXG4gICAgICAgICAgdXBkYXRlID0gY3VycmVudCxcbiAgICAgICAgICBkaWRSZWFkRnJvbUVudGFuZ2xlZEFzeW5jQWN0aW9uID0gITE7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICB2YXIgdXBkYXRlTGFuZSA9IHVwZGF0ZS5sYW5lICYgLTUzNjg3MDkxMztcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB1cGRhdGVMYW5lICE9PSB1cGRhdGUubGFuZVxuICAgICAgICAgICAgICA/ICh3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAmIHVwZGF0ZUxhbmUpID09PSB1cGRhdGVMYW5lXG4gICAgICAgICAgICAgIDogKHJlbmRlckxhbmVzICYgdXBkYXRlTGFuZSkgPT09IHVwZGF0ZUxhbmVcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHZhciByZXZlcnRMYW5lID0gdXBkYXRlLnJldmVydExhbmU7XG4gICAgICAgICAgICBpZiAoMCA9PT0gcmV2ZXJ0TGFuZSlcbiAgICAgICAgICAgICAgbnVsbCAhPT0gbmV3QmFzZVF1ZXVlTGFzdCAmJlxuICAgICAgICAgICAgICAgIChuZXdCYXNlUXVldWVMYXN0ID0gbmV3QmFzZVF1ZXVlTGFzdC5uZXh0ID1cbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGFuZTogMCxcbiAgICAgICAgICAgICAgICAgICAgcmV2ZXJ0TGFuZTogMCxcbiAgICAgICAgICAgICAgICAgICAgZ2VzdHVyZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiB1cGRhdGUuYWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICBoYXNFYWdlclN0YXRlOiB1cGRhdGUuaGFzRWFnZXJTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgZWFnZXJTdGF0ZTogdXBkYXRlLmVhZ2VyU3RhdGUsXG4gICAgICAgICAgICAgICAgICAgIG5leHQ6IG51bGxcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHVwZGF0ZUxhbmUgPT09IGN1cnJlbnRFbnRhbmdsZWRMYW5lICYmXG4gICAgICAgICAgICAgICAgICAoZGlkUmVhZEZyb21FbnRhbmdsZWRBc3luY0FjdGlvbiA9ICEwKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKChyZW5kZXJMYW5lcyAmIHJldmVydExhbmUpID09PSByZXZlcnRMYW5lKSB7XG4gICAgICAgICAgICAgIHVwZGF0ZSA9IHVwZGF0ZS5uZXh0O1xuICAgICAgICAgICAgICByZXZlcnRMYW5lID09PSBjdXJyZW50RW50YW5nbGVkTGFuZSAmJlxuICAgICAgICAgICAgICAgIChkaWRSZWFkRnJvbUVudGFuZ2xlZEFzeW5jQWN0aW9uID0gITApO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAodXBkYXRlTGFuZSA9IHtcbiAgICAgICAgICAgICAgICBsYW5lOiAwLFxuICAgICAgICAgICAgICAgIHJldmVydExhbmU6IHVwZGF0ZS5yZXZlcnRMYW5lLFxuICAgICAgICAgICAgICAgIGdlc3R1cmU6IG51bGwsXG4gICAgICAgICAgICAgICAgYWN0aW9uOiB1cGRhdGUuYWN0aW9uLFxuICAgICAgICAgICAgICAgIGhhc0VhZ2VyU3RhdGU6IHVwZGF0ZS5oYXNFYWdlclN0YXRlLFxuICAgICAgICAgICAgICAgIGVhZ2VyU3RhdGU6IHVwZGF0ZS5lYWdlclN0YXRlLFxuICAgICAgICAgICAgICAgIG5leHQ6IG51bGxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgbnVsbCA9PT0gbmV3QmFzZVF1ZXVlTGFzdFxuICAgICAgICAgICAgICAgICAgPyAoKG5ld0Jhc2VRdWV1ZUZpcnN0ID0gbmV3QmFzZVF1ZXVlTGFzdCA9IHVwZGF0ZUxhbmUpLFxuICAgICAgICAgICAgICAgICAgICAoYmFzZUZpcnN0ID0gcGVuZGluZ1F1ZXVlKSlcbiAgICAgICAgICAgICAgICAgIDogKG5ld0Jhc2VRdWV1ZUxhc3QgPSBuZXdCYXNlUXVldWVMYXN0Lm5leHQgPSB1cGRhdGVMYW5lKSxcbiAgICAgICAgICAgICAgICAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIubGFuZXMgfD0gcmV2ZXJ0TGFuZSksXG4gICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyB8PSByZXZlcnRMYW5lKTtcbiAgICAgICAgICAgIHVwZGF0ZUxhbmUgPSB1cGRhdGUuYWN0aW9uO1xuICAgICAgICAgICAgc2hvdWxkRG91YmxlSW52b2tlVXNlckZuc0luSG9va3NERVYgJiZcbiAgICAgICAgICAgICAgcmVkdWNlcihwZW5kaW5nUXVldWUsIHVwZGF0ZUxhbmUpO1xuICAgICAgICAgICAgcGVuZGluZ1F1ZXVlID0gdXBkYXRlLmhhc0VhZ2VyU3RhdGVcbiAgICAgICAgICAgICAgPyB1cGRhdGUuZWFnZXJTdGF0ZVxuICAgICAgICAgICAgICA6IHJlZHVjZXIocGVuZGluZ1F1ZXVlLCB1cGRhdGVMYW5lKTtcbiAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIChyZXZlcnRMYW5lID0ge1xuICAgICAgICAgICAgICBsYW5lOiB1cGRhdGVMYW5lLFxuICAgICAgICAgICAgICByZXZlcnRMYW5lOiB1cGRhdGUucmV2ZXJ0TGFuZSxcbiAgICAgICAgICAgICAgZ2VzdHVyZTogdXBkYXRlLmdlc3R1cmUsXG4gICAgICAgICAgICAgIGFjdGlvbjogdXBkYXRlLmFjdGlvbixcbiAgICAgICAgICAgICAgaGFzRWFnZXJTdGF0ZTogdXBkYXRlLmhhc0VhZ2VyU3RhdGUsXG4gICAgICAgICAgICAgIGVhZ2VyU3RhdGU6IHVwZGF0ZS5lYWdlclN0YXRlLFxuICAgICAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgbnVsbCA9PT0gbmV3QmFzZVF1ZXVlTGFzdFxuICAgICAgICAgICAgICAgID8gKChuZXdCYXNlUXVldWVGaXJzdCA9IG5ld0Jhc2VRdWV1ZUxhc3QgPSByZXZlcnRMYW5lKSxcbiAgICAgICAgICAgICAgICAgIChiYXNlRmlyc3QgPSBwZW5kaW5nUXVldWUpKVxuICAgICAgICAgICAgICAgIDogKG5ld0Jhc2VRdWV1ZUxhc3QgPSBuZXdCYXNlUXVldWVMYXN0Lm5leHQgPSByZXZlcnRMYW5lKSxcbiAgICAgICAgICAgICAgKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLmxhbmVzIHw9IHVwZGF0ZUxhbmUpLFxuICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzIHw9IHVwZGF0ZUxhbmUpO1xuICAgICAgICAgIHVwZGF0ZSA9IHVwZGF0ZS5uZXh0O1xuICAgICAgICB9IHdoaWxlIChudWxsICE9PSB1cGRhdGUgJiYgdXBkYXRlICE9PSBjdXJyZW50KTtcbiAgICAgICAgbnVsbCA9PT0gbmV3QmFzZVF1ZXVlTGFzdFxuICAgICAgICAgID8gKGJhc2VGaXJzdCA9IHBlbmRpbmdRdWV1ZSlcbiAgICAgICAgICA6IChuZXdCYXNlUXVldWVMYXN0Lm5leHQgPSBuZXdCYXNlUXVldWVGaXJzdCk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhb2JqZWN0SXMocGVuZGluZ1F1ZXVlLCBob29rLm1lbW9pemVkU3RhdGUpICYmXG4gICAgICAgICAgKChkaWRSZWNlaXZlVXBkYXRlID0gITApLFxuICAgICAgICAgIGRpZFJlYWRGcm9tRW50YW5nbGVkQXN5bmNBY3Rpb24gJiZcbiAgICAgICAgICAgICgocmVkdWNlciA9IGN1cnJlbnRFbnRhbmdsZWRBY3Rpb25UaGVuYWJsZSksIG51bGwgIT09IHJlZHVjZXIpKVxuICAgICAgICApXG4gICAgICAgICAgdGhyb3cgcmVkdWNlcjtcbiAgICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gcGVuZGluZ1F1ZXVlO1xuICAgICAgICBob29rLmJhc2VTdGF0ZSA9IGJhc2VGaXJzdDtcbiAgICAgICAgaG9vay5iYXNlUXVldWUgPSBuZXdCYXNlUXVldWVMYXN0O1xuICAgICAgICBxdWV1ZS5sYXN0UmVuZGVyZWRTdGF0ZSA9IHBlbmRpbmdRdWV1ZTtcbiAgICAgIH1cbiAgICAgIG51bGwgPT09IGJhc2VRdWV1ZSAmJiAocXVldWUubGFuZXMgPSAwKTtcbiAgICAgIHJldHVybi
15852BbaG9vay5tZW1vaXplZFN0YXRlLCBxdWV1ZS5kaXNwYXRjaF07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlcmVuZGVyUmVkdWNlcihyZWR1Y2VyKSB7XG4gICAgICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpLFxuICAgICAgICBxdWV1ZSA9IGhvb2sucXVldWU7XG4gICAgICBpZiAobnVsbCA9PT0gcXVldWUpXG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIFwiU2hvdWxkIGhhdmUgYSBxdWV1ZS4gWW91IGFyZSBsaWtlbHkgY2FsbGluZyBIb29rcyBjb25kaXRpb25hbGx5LCB3aGljaCBpcyBub3QgYWxsb3dlZC4gKGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvaW52YWxpZC1ob29rLWNhbGwpXCJcbiAgICAgICAgKTtcbiAgICAgIHF1ZXVlLmxhc3RSZW5kZXJlZFJlZHVjZXIgPSByZWR1Y2VyO1xuICAgICAgdmFyIGRpc3BhdGNoID0gcXVldWUuZGlzcGF0Y2gsXG4gICAgICAgIGxhc3RSZW5kZXJQaGFzZVVwZGF0ZSA9IHF1ZXVlLnBlbmRpbmcsXG4gICAgICAgIG5ld1N0YXRlID0gaG9vay5tZW1vaXplZFN0YXRlO1xuICAgICAgaWYgKG51bGwgIT09IGxhc3RSZW5kZXJQaGFzZVVwZGF0ZSkge1xuICAgICAgICBxdWV1ZS5wZW5kaW5nID0gbnVsbDtcbiAgICAgICAgdmFyIHVwZGF0ZSA9IChsYXN0UmVuZGVyUGhhc2VVcGRhdGUgPSBsYXN0UmVuZGVyUGhhc2VVcGRhdGUubmV4dCk7XG4gICAgICAgIGRvXG4gICAgICAgICAgKG5ld1N0YXRlID0gcmVkdWNlcihuZXdTdGF0ZSwgdXBkYXRlLmFjdGlvbikpLCAodXBkYXRlID0gdXBkYXRlLm5leHQpO1xuICAgICAgICB3aGlsZSAodXBkYXRlICE9PSBsYXN0UmVuZGVyUGhhc2VVcGRhdGUpO1xuICAgICAgICBvYmplY3RJcyhuZXdTdGF0ZSwgaG9vay5tZW1vaXplZFN0YXRlKSB8fCAoZGlkUmVjZWl2ZVVwZGF0ZSA9ICEwKTtcbiAgICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gbmV3U3RhdGU7XG4gICAgICAgIG51bGwgPT09IGhvb2suYmFzZVF1ZXVlICYmIChob29rLmJhc2VTdGF0ZSA9IG5ld1N0YXRlKTtcbiAgICAgICAgcXVldWUubGFzdFJlbmRlcmVkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbbmV3U3RhdGUsIGRpc3BhdGNoXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbW91bnRTeW5jRXh0ZXJuYWxTdG9yZShzdWJzY3JpYmUsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCkge1xuICAgICAgdmFyIGZpYmVyID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIsXG4gICAgICAgIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICAgICAgaWYgKGlzSHlkcmF0aW5nKSB7XG4gICAgICAgIGlmICh2b2lkIDAgPT09IGdldFNlcnZlclNuYXBzaG90KVxuICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgXCJNaXNzaW5nIGdldFNlcnZlclNuYXBzaG90LCB3aGljaCBpcyByZXF1aXJlZCBmb3Igc2VydmVyLXJlbmRlcmVkIGNvbnRlbnQuIFdpbGwgcmV2ZXJ0IHRvIGNsaWVudCByZW5kZXJpbmcuXCJcbiAgICAgICAgICApO1xuICAgICAgICB2Y
15852XIgbmV4dFNuYXBzaG90ID0gZ2V0U2VydmVyU25hcHNob3QoKTtcbiAgICAgICAgZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QgfHxcbiAgICAgICAgICBuZXh0U25hcHNob3QgPT09IGdldFNlcnZlclNuYXBzaG90KCkgfHxcbiAgICAgICAgICAoY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiVGhlIHJlc3VsdCBvZiBnZXRTZXJ2ZXJTbmFwc2hvdCBzaG91bGQgYmUgY2FjaGVkIHRvIGF2b2lkIGFuIGluZmluaXRlIGxvb3BcIlxuICAgICAgICAgICksXG4gICAgICAgICAgKGRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90ID0gITApKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHRTbmFwc2hvdCA9IGdldFNuYXBzaG90KCk7XG4gICAgICAgIGRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90IHx8XG4gICAgICAgICAgKChnZXRTZXJ2ZXJTbmFwc2hvdCA9IGdldFNuYXBzaG90KCkpLFxuICAgICAgICAgIG9iamVjdElzKG5leHRTbmFwc2hvdCwgZ2V0U2VydmVyU25hcHNob3QpIHx8XG4gICAgICAgICAgICAoY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCJUaGUgcmVzdWx0IG9mIGdldFNuYXBzaG90IHNob3VsZCBiZSBjYWNoZWQgdG8gYXZvaWQgYW4gaW5maW5pdGUgbG9vcFwiXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgKGRpZFdhcm5VbmNhY2hlZEdldFNuYXBzaG90ID0gITApKSk7XG4gICAgICAgIGlmIChudWxsID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QpXG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICBcIkV4cGVjdGVkIGEgd29yay1pbi1wcm9ncmVzcyByb290LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIlxuICAgICAgICAgICk7XG4gICAgICAgIDAgIT09ICh3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAmIDEyNykgfHxcbiAgICAgICAgICBwdXNoU3RvcmVDb25zaXN0ZW5jeUNoZWNrKGZpYmVyLCBnZXRTbmFwc2hvdCwgbmV4dFNuYXBzaG90KTtcbiAgICAgIH1cbiAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IG5leHRTbmFwc2hvdDtcbiAgICAgIGdldFNlcnZlclNuYXBzaG90ID0geyB2YWx1ZTogbmV4dFNuYXBzaG90LCBnZXRTbmFwc2hvdDogZ2V0U25hcHNob3QgfTtcbiAgICAgIGhvb2sucXVldWUgPSBnZXRTZXJ2ZXJTbmFwc2hvdDtcbiAgICAgIG1vdW50RWZmZWN0KFxuICAgICAgICBzdWJzY3JpYmVUb1N0b3JlLmJpbmQobnVsbCwgZmliZXIsIGdldFNlcnZlclNuYXBzaG90LCBzdWJzY3JpYmUpLFxuICAgICAgICBbc3Vic2NyaWJlXVxuICAgICAgKTtcbiAgICAgIGZpYmVyLmZsYWdzIHw9IDIwNDg7XG4gICAgICBwdXNoU2ltcGxlRWZmZWN0KFxuICAgICAgICBIYXNFZmZlY3QgfCBQYXNzaXZlLFxuICAgICAgICB7IGRlc3Ryb3k6IHZvaWQgMCB9LFxuICAgICAgICB1cGRhdGVTdG9yZUluc3RhbmNlLmJpbmQoXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBmaWJlcixcbiAgICAgICAgICBnZXRTZXJ2ZXJTbmFwc2hvdCxcbiAgICAgICAgICBuZXh0U25hcHNob3QsXG4gICAgICAgICAgZ2V0U25hcHNob3RcbiAgICAgICAgKSxcbiAgICAgICAgbnVsbFxuICAgICAgKTtcbiAgICAgIHJldHVybiBuZXh0U25hcHNob3Q7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKFxuICAgICAgc3Vic2NyaWJlLFxuICAgICAgZ2V0U25hcHNob3QsXG4gICAgICBnZXRTZXJ2ZXJTbmFwc2hvdFxuICAgICkge1xuICAgICAgdmFyIGZpYmVyID0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIsXG4gICAgICAgIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKSxcbiAgICAgICAgaXNIeWRyYXRpbmckanNjb21wJDAgPSBpc0h5ZHJhdGluZztcbiAgICAgIGlmIChpc0h5ZHJhdGluZyRqc2NvbXAkMCkge1xuICAgICAgICBpZiAodm9pZCAwID09PSBnZXRTZXJ2ZXJTbmFwc2hvdClcbiAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgIFwiTWlzc2luZyBnZXRTZXJ2ZXJTbmFwc2hvdCwgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIHNlcnZlci1yZW5kZXJlZCBjb250ZW50LiBXaWxsIHJldmVydCB0byBjbGllbnQgcmVuZGVyaW5nLlwiXG4gICAgICAgICAgKTtcbiAgICAgICAgZ2V0U2VydmVyU25hcHNob3QgPSBnZXRTZXJ2ZXJTbmFwc2hvdCgpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgKChnZXRTZXJ2ZXJTbmFwc2hvdCA9IGdldFNuYXBzaG90KCkpLCAhZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QpXG4gICAgICApIHtcbiAgICAgICAgdmFyIGNhY2hlZFNuYXBzaG90ID0gZ2V0U25hcHNob3QoKTtcbiAgICAgICAgb2JqZWN0SXMoZ2V0U2VydmVyU25hcHNob3QsIGNhY2hlZFNuYXBzaG90KSB8fFxuICAgICAgICAgIChjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJUaGUgcmVzdWx0IG9mIGdldFNuYXBzaG90IHNob3VsZCBiZSBjYWNoZWQgdG8gYXZvaWQgYW4gaW5maW5pdGUgbG9vcFwiXG4gICAgICAgICAgKSxcbiAgICAgICAgICAoZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3QgPSAhMCkpO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICAoY2FjaGVkU25hcHNob3QgPSAhb2JqZWN0SXMoXG4gICAgICAgICAgKGN1cnJlbnRIb29rIHx8IGhvb2spLm1lbW9pemVkU3RhdGUsXG4gICAgICAgICAgZ2V0U2VydmVyU25hcHNob3RcbiAgICAgICAgKSlcbiAgICAgIClcbiAgICAgICAgKGhvb2subWVtb2l6ZWRTdGF0ZSA9IGdldFNlcnZlclNuYXBzaG90KSwgKGRpZFJlY2VpdmVVcGRhdGUgPSAhMCk7XG4gICAgICBob29rID0gaG9vay5xdWV1ZTtcbiAgICAgIHZhciBjcmVhdGUgPSBzdWJzY3JpYmVUb1N0b3JlLmJpbmQobnVsbCwgZmliZXIsIGhvb2ssIHN1YnNjcmliZSk7XG4gICAgICB1cGRhdGVFZmZlY3RJbXBsKDIwNDgsIFBhc3NpdmUsIGNyZWF0ZSwgW3N1YnNjcmliZV0pO1xuICAgICAgc3Vic2NyaWJlID1cbiAgICAgICAgaG9vay5nZXRTbmFwc2hvdCAhPT0gZ2V0U25hcHNob3QgfHxcbiAgICAgICAgY2FjaGVkU25hcHNob3QgfHxcbiAgICAgICAgKG51bGwgIT09IHdvcmtJblByb2dyZXNzSG9vayAmJlxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzc0hvb2subWVtb2l6ZWRTdGF0ZS50YWcgJiBIYXNFZmZlY3QpICE9PSBOb0ZsYWdzKTtcbiAgICAgIHB1c2hTaW1wbGVFZmZlY3QoXG4gICAgICAgI
15852HN1YnNjcmliZSA/IEhhc0VmZmVjdCB8IFBhc3NpdmUgOiBQYXNzaXZlLFxuICAgICAgICB7IGRlc3Ryb3k6IHZvaWQgMCB9LFxuICAgICAgICB1cGRhdGVTdG9yZUluc3RhbmNlLmJpbmQoXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBmaWJlcixcbiAgICAgICAgICBob29rLFxuICAgICAgICAgIGdldFNlcnZlclNuYXBzaG90LFxuICAgICAgICAgIGdldFNuYXBzaG90XG4gICAgICAgICksXG4gICAgICAgIG51bGxcbiAgICAgICk7XG4gICAgICBpZiAoc3Vic2NyaWJlKSB7XG4gICAgICAgIGZpYmVyLmZsYWdzIHw9IDIwNDg7XG4gICAgICAgIGlmIChudWxsID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QpXG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICBcIkV4cGVjdGVkIGEgd29yay1pbi1wcm9ncmVzcyByb290LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIlxuICAgICAgICAgICk7XG4gICAgICAgIGlzSHlkcmF0aW5nJGpzY29tcCQwIHx8XG4gICAgICAgICAgMCAhPT0gKHJlbmRlckxhbmVzICYgMTI3KSB8fFxuICAgICAgICAgIHB1c2hTdG9yZUNvbnNpc3RlbmN5Q2hlY2soZmliZXIsIGdldFNuYXBzaG90LCBnZXRTZXJ2ZXJTbmFwc2hvdCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2V0U2VydmVyU25hcHNob3Q7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHB1c2hTdG9yZUNvbnNpc3RlbmN5Q2hlY2soZmliZXIsIGdldFNuYXBzaG90LCByZW5kZXJlZFNuYXBzaG90KSB7XG4gICAgICBmaWJlci5mbGFncyB8PSAxNjM4NDtcbiAgICAgIGZpYmVyID0geyBnZXRTbmFwc2hvdDogZ2V0U25hcHNob3QsIHZhbHVlOiByZW5kZXJlZFNuYXBzaG90IH07XG4gICAgICBnZXRTbmFwc2hvdCA9IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLnVwZGF0ZVF1ZXVlO1xuICAgICAgbnVsbCA9PT0gZ2V0U25hcHNob3RcbiAgICAgICAgPyAoKGdldFNuYXBzaG90ID0gY3JlYXRlRnVuY3Rpb25Db21wb25lbnRVcGRhdGVRdWV1ZSgpKSxcbiAgICAgICAgICAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIudXBkYXRlUXVldWUgPSBnZXRTbmFwc2hvdCksXG4gICAgICAgICAgKGdldFNuYXBzaG90LnN0b3JlcyA9IFtmaWJlcl0pKVxuICAgICAgICA6ICgocmVuZGVyZWRTbmFwc2hvdCA9IGdldFNuYXBzaG90LnN0b3JlcyksXG4gICAgICAgICAgbnVsbCA9PT0gcmVuZGVyZWRTbmFwc2hvdFxuICAgICAgICAgICAgPyAoZ2V0U25hcHNob3Quc3RvcmVzID0gW2ZpYmVyXSlcbiAgICAgICAgICAgIDogcmVuZGVyZWRTbmFwc2hvdC5wdXNoKGZpYmVyKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZVN0b3JlSW5zdGFuY2UoZmliZXIsIGluc3QsIG5leHRTbmFwc2hvdCwgZ2V0U25hcHNob3QpIHtcbiAgICAgIGluc3QudmFsdWUgPSBuZXh0U25hcHNob3Q7XG4gICAgICBpbnN0LmdldFNuYXBzaG90ID0gZ2V0U25hcHNob3Q7XG4gICAgICBjaGVja0lmU25hcHNob3RDaGFuZ2VkKGluc3QpICYmIGZvcmNlU3RvcmVSZXJlbmRlcihmaWJlcik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN1YnNjcmliZVRvU3RvcmUoZmliZXIsIGluc3QsIHN1YnNjcmliZSkge1xuICAgICAgcmV0dXJuIHN1YnNjcmliZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkgJiZcbiAgICAgICAgICAoc3RhcnRVcGRhdGVUaW1lckJ5TGFuZSgyLCBcInVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKClcIiwgZmliZXIpLFxuICAgICAgICAgIGZvcmNlU3RvcmVSZXJlbmRlcihmaWJlcikpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNoZWNrSWZTbmFwc2hvdENoYW5nZWQoaW5zdCkge1xuICAgICAgdmFyIGxhdGVzdEdldFNuYXBzaG90ID0gaW5zdC5nZXRTbmFwc2hvdDtcbiAgICAgIGluc3QgPSBpbnN0LnZhbHVlO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIG5leHRWYWx1ZSA9IGxhdGVzdEdldFNuYXBzaG90KCk7XG4gICAgICAgIHJldHVybiAhb2JqZWN0SXMoaW5zdCwgbmV4dFZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiAhMDtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZm9yY2VTdG9yZVJlcmVuZGVyKGZpYmVyKSB7XG4gICAgICB2Y
15852XIgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgMik7XG4gICAgICBudWxsICE9PSByb290ICYmIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgMik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1vdW50U3RhdGVJbXBsKGluaXRpYWxTdGF0ZSkge1xuICAgICAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGluaXRpYWxTdGF0ZSkge1xuICAgICAgICB2YXIgaW5pdGlhbFN0YXRlSW5pdGlhbGl6ZXIgPSBpbml0aWFsU3RhdGU7XG4gICAgICAgIGluaXRpYWxTdGF0ZSA9IGluaXRpYWxTdGF0ZUluaXRpYWxpemVyKCk7XG4gICAgICAgIGlmIChzaG91bGREb3VibGVJbnZva2VVc2VyRm5zSW5Ib29rc0RFVikge1xuICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKCEwKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaW5pdGlhbFN0YXRlSW5pdGlhbGl6ZXIoKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoITEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gaG9vay5iYXNlU3RhdGUgPSBpbml0aWFsU3RhdGU7XG4gICAgICBob29rLnF1ZXVlID0ge1xuICAgICAgICBwZW5kaW5nOiBudWxsLFxuICAgICAgICBsYW5lczogMCxcbiAgICAgICAgZGlzcGF0Y2g6IG51bGwsXG4gICAgICAgIGxhc3RSZW5kZXJlZFJlZHVjZXI6IGJhc2ljU3RhdGVSZWR1Y2VyLFxuICAgICAgICBsYXN0UmVuZGVyZWRTdGF0ZTogaW5pdGlhbFN0YXRlXG4gICAgICB9O1xuICAgICAgcmV0dXJuIGhvb2s7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1vdW50U3RhdGUoaW5pdGlhbFN0YXRlKSB7XG4gICAgICBpbml0aWFsU3RhdGUgPSBtb3VudFN0YXRlSW1wbChpbml0aWFsU3RhdGUpO1xuICAgICAgdmFyIHF1ZXVlID0gaW5pdGlhbFN0YXRlLnF1ZXVlLFxuICAgICAgICBkaXNwYXRjaCA9IGRpc3BhdGNoU2V0U3RhdGUuYmluZChudWxsLCBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciwgcXVldWUpO1xuICAgICAgcXVldWUuZGlzcGF0Y2ggPSBkaXNwYXRjaDtcbiAgICAgIHJldHVybiBbaW5pdGlhbFN0YXRlLm1lbW9pemVkU3RhdGUsIGRpc3BhdGNoXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbW91bnRPcHRpbWlzdGljKHBhc3N0aHJvdWdoKSB7XG4gICAgICB2Y
15852XIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gICAgICBob29rLm1lbW9pemVkU3RhdGUgPSBob29rLmJhc2VTdGF0ZSA9IHBhc3N0aHJvdWdoO1xuICAgICAgdmFyIHF1ZXVlID0ge1xuICAgICAgICBwZW5kaW5nOiBudWxsLFxuICAgICAgICBsYW5lczogMCxcbiAgICAgICAgZGlzcGF0Y2g6IG51bGwsXG4gICAgICAgIGxhc3RSZW5kZXJlZFJlZHVjZXI6IG51bGwsXG4gICAgICAgIGxhc3RSZW5kZXJlZFN0YXRlOiBudWxsXG4gICAgICB9O1xuICAgICAgaG9vay5xdWV1ZSA9IHF1ZXVlO1xuICAgICAgaG9vayA9IGRpc3BhdGNoT3B0aW1pc3RpY1NldFN0YXRlLmJpbmQoXG4gICAgICAgIG51bGwsXG4gICAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLFxuICAgICAgICAhMCxcbiAgICAgICAgcXVldWVcbiAgICAgICk7XG4gICAgICBxdWV1ZS5kaXNwYXRjaCA9IGhvb2s7XG4gICAgICByZXR1cm4gW3Bhc3N0aHJvdWdoLCBob29rXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlT3B0aW1pc3RpYyhwYXNzdGhyb3VnaCwgcmVkdWNlcikge1xuICAgICAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgICAgIHJldHVybiB1cGRhdGVPcHRpbWlzdGljSW1wbChob29rLCBjdXJyZW50SG9vaywgcGFzc3Rocm91Z2gsIHJlZHVjZXIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVPcHRpbWlzdGljSW1wbChob29rLCBjdXJyZW50LCBwYXNzdGhyb3VnaCwgcmVkdWNlcikge1xuICAgICAgaG9vay5iYXNlU3RhdGUgPSBwYXNzdGhyb3VnaDtcbiAgICAgIHJldHVybiB1cGRhdGVSZWR1Y2VySW1wbChcbiAgICAgICAgaG9vayxcbiAgICAgICAgY3VycmVudEhvb2ssXG4gICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHJlZHVjZXIgPyByZWR1Y2VyIDogYmFzaWNTdGF0ZVJlZHVjZXJcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlcmVuZGVyT3B0aW1pc3RpYyhwYXNzdGhyb3VnaCwgcmVkdWNlcikge1xuICAgICAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgICAgIGlmIChudWxsICE9PSBjdXJyZW50SG9vaylcbiAgICAgICAgcmV0dXJuIHVwZGF0ZU9wdGltaXN0aWNJbXBsKGhvb2ssIGN1cnJlbnRIb29rLCBwYXNzdGhyb3VnaCwgcmVkdWNlcik7XG4gICAgICBob29rLmJhc2VTdGF0ZSA9IHBhc3N0aHJvdWdoO1xuICAgICAgcmV0dXJuIFtwYXNzdGhyb3VnaCwgaG9vay5xdWV1ZS5kaXNwYXRjaF07XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRpc3BhdGNoQWN0aW9uU3RhdGUoXG4gICAgICBmaWJlcixcbiAgICAgIGFjdGlvblF1ZXVlLFxuICAgICAgc2V0UGVuZGluZ1N0YXRlLFxuICAgICAgc2V0U3RhdGUsXG4gICAgICBwYXlsb2FkXG4gICAgKSB7XG4gICAgICBpZiAoaXNSZW5kZXJQaGFzZVVwZGF0ZShmaWJlcikpXG4gICAgICAgIHRocm93IEVycm9yKFwiQ2Fubm90IHVwZGF0ZSBhY3Rpb24gc3RhdGUgd2hpbGUgcmVuZGVyaW5nLlwiKTtcbiAgICAgIGZpYmVyID0gYWN0aW9uUXVldWUuYWN0aW9uO1xuICAgICAgaWYgKG51bGwgIT09IGZpYmVyKSB7XG4gICAgICAgIHZhciBhY3Rpb25Ob2RlID0ge1xuICAgICAgICAgIHBheWxvYWQ6IHBheWxvYWQsXG4gICAgICAgICAgYWN0aW9uOiBmaWJlcixcbiAgICAgICAgICBuZXh0OiBudWxsLFxuICAgICAgICAgIGlzVHJhbnNpdGlvbjogITAsXG4gICAgICAgICAgc3RhdHVzOiBcInBlbmRpbmdcIixcbiAgICAgICAgICB2YWx1ZTogbnVsbCxcbiAgICAgICAgICByZWFzb246IG51bGwsXG4gICAgICAgICAgbGlzdGVuZXJzOiBbXSxcbiAgICAgICAgICB0aGVuOiBmdW5jdGlvbiAobGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGFjdGlvbk5vZGUubGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgbnVsbCAhPT0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuVFxuICAgICAgICAgID8gc2V0UGVuZGluZ1N0YXRlKCEwKVxuICAgICAgICAgIDogKGFjdGlvbk5vZGUuaXNUcmFuc2l0aW9uID0gITEpO1xuICAgICAgICBzZXRTdGF0ZShhY3Rpb25Ob2RlKTtcbiAgICAgICAgc2V0UGVuZGluZ1N0YXRlID0gYWN0aW9uUXVldWUucGVuZGluZztcbiAgICAgICAgbnVsbCA9PT0gc2V0UGVuZGluZ1N0YXRlXG4gICAgICAgICAgPyAoKGFjdGlvbk5vZGUubmV4dCA9IGFjdGlvblF1ZXVlLnBlbmRpbmcgPSBhY3Rpb25Ob2RlKSxcbiAgICAgICAgICAgIHJ1bkFjdGlvblN0YXRlQWN0aW9uKGFjdGlvblF1ZXVlLCBhY3Rpb25Ob2RlKSlcbiAgICAgICAgICA6ICgoYWN0aW9uTm9kZS5uZXh0ID0gc2V0UGVuZGluZ1N0YXRlLm5leHQpLFxuICAgICAgICAgICAgKGFjdGlvblF1ZXVlLnBlbmRpbmcgPSBzZXRQZW5kaW5nU3RhdGUubmV4dCA9IGFjdGlvbk5vZGUpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcnVuQWN0aW9uU3RhdGVBY3Rpb24oYWN0aW9uUXVldWUsIG5vZGUpIHtcbiAgICAgIHZhciBhY3Rpb24gPSBub2RlLmFjdGlvbixcbiAgICAgICAgcGF5bG9hZCA9IG5vZGUucGF5bG9hZCxcbiAgICAgICAgcHJldlN0YXRlID0gYWN0aW9uUXVldWUuc3RhdGU7XG4gICAgICBpZiAobm9kZS5pc1RyYW5zaXRpb24pIHtcbiAgICAgICAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuVCxcbiAgICAgICAgICBjdXJyZW50VHJhbnNpdGlvbiA9IHt9O1xuICAgICAgICBjdXJyZW50VHJhbnNpdGlvbi50eXBlcyA9XG4gICAgICAgICAgbnVsbCAhPT0gcHJldlRyYW5zaXRpb24gPyBwcmV2VHJhbnNpdGlvbi50eXBlcyA6IG51bGw7XG4gICAgICAgIGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzID0gbmV3IFNldCgpO1xuICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5UID0gY3VycmVudFRyYW5zaXRpb247XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFyIHJldHVyblZhbHVlID0gYWN0aW9uKHByZXZTdGF0ZSwgcGF5bG9hZCksXG4gICAgICAgICAgICBvblN0YXJ0VHJhbnNpdGlvbkZpbmlzaCA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlM7XG4gICAgICAgICAgbnVsbCAhPT0gb25TdGFydFRyYW5zaXRpb25GaW5pc2ggJiZcbiAgICAgICAgICAgIG9uU3RhcnRUcmFuc2l0aW9uRmluaXNoKGN1cnJlbnRUcmFuc2l0aW9uLCByZXR1cm5WYWx1ZSk7XG4gICAgICAgICAgaGFuZGxlQWN0aW9uUmV0dXJuVmFsdWUoYWN0aW9uUXVldWUsIG5vZGUsIHJldHVyblZhbHVlKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBvbkFjdGlvbkVycm9yKGFjdGlvblF1ZXVlLCBub2RlLCBlcnJvcik7XG4gICAgICAgI
15852H0gZmluYWxseSB7XG4gICAgICAgICAgbnVsbCAhPT0gcHJldlRyYW5zaXRpb24gJiZcbiAgICAgICAgICAgIG51bGwgIT09IGN1cnJlbnRUcmFuc2l0aW9uLnR5cGVzICYmXG4gICAgICAgICAgICAobnVsbCAhPT0gcHJldlRyYW5zaXRpb24udHlwZXMgJiZcbiAgICAgICAgICAgICAgcHJldlRyYW5zaXRpb24udHlwZXMgIT09IGN1cnJlbnRUcmFuc2l0aW9uLnR5cGVzICYmXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgXCJXZSBleHBlY3RlZCBpbm5lciBUcmFuc2l0aW9ucyB0byBoYXZlIHRyYW5zZmVycmVkIHRoZSBvdXRlciB0eXBlcyBzZXQgYW5kIHRoYXQgeW91IGNhbm5vdCBhZGQgdG8gdGhlIG91dGVyIFRyYW5zaXRpb24gd2hpbGUgaW5zaWRlIHRoZSBpbm5lci5UaGlzIGlzIGEgYnVnIGluIFJlYWN0LlwiXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAocHJldlRyYW5zaXRpb24udHlwZXMgPSBjdXJyZW50VHJhbnNpdGlvbi50eXBlcykpLFxuICAgICAgICAgICAgKFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQgPSBwcmV2VHJhbnNpdGlvbiksXG4gICAgICAgICAgICBudWxsID09PSBwcmV2VHJhbnNpdGlvbiAmJlxuICAgICAgICAgICAgICBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycyAmJlxuICAgICAgICAgICAgICAoKGFjdGlvblF1ZXVlID0gY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuc2l6ZSksXG4gICAgICAgICAgICAgIGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzLmNsZWFyKCksXG4gICAgICAgICAgICAgIDEwIDwgYWN0aW9uUXVldWUgJiZcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICBcIkRldGVjdGVkIGEgbGFyZ2UgbnVtYmVyIG9mIHVwZGF0ZXMgaW5zaWRlIHN0YXJ0VHJhbnNpdGlvbi4gSWYgdGhpcyBpcyBkdWUgdG8gYSBzdWJzY3JpcHRpb24gcGxlYXNlIHJlLXdyaXRlIGl0IHRvIHVzZSBSZWFjdCBwcm92aWRlZCBob29rcy4gT3RoZXJ3aXNlIGNvbmN1cnJlbnQgbW9kZSBndWFyYW50ZWVzIGFyZSBvZmYgdGhlIHRhYmxlLlwiXG4gICAgICAgICAgICAgICAgKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZVxuICAgICAgICB0cnkge1xuICAgICAgICAgIChjdXJyZW50VHJhbnNpdGlvbiA9IGFjdGlvbihwcmV2U3RhdGUsIHBheWxvYWQpKSxcbiAgICAgICAgICAgIGhhbmRsZUFjdGlvblJldHVyblZhbHVlKGFjdGlvblF1ZXVlLCBub2RlLCBjdXJyZW50VHJhbnNpdGlvbik7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yJDUpIHtcbiAgICAgICAgICBvbkFjdGlvbkVycm9yKGFjdGlvblF1ZXVlLCBub2RlLCBlcnJvciQ1KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBoYW5kbGVBY3Rpb25SZXR1cm5WYWx1ZShhY3Rpb25RdWV1ZSwgbm9kZSwgcmV0dXJuVmFsdWUpIHtcbiAgICAgIG51bGwgIT09IHJldHVyblZhbHVlICYmXG4gICAgICBcIm9iamVjdFwiID09PSB0eXBlb2YgcmV0dXJuVmFsdWUgJiZcbiAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHJldHVyblZhbHVlLnRoZW5cbiAgICAgICAgPyAoUmVhY3RTaGFyZWRJbnRlcm5hbHMuYXN5bmNUcmFuc2l0aW9ucysrLFxuICAgICAgICAgIHJldHVyblZhbHVlLnRoZW4ocmVsZWFzZUFzeW5jVHJhbnNpdGlvbiwgcmVsZWFzZUFzeW5jVHJhbnNpdGlvbiksXG4gICAgICAgICAgcmV0dXJuVmFsdWUudGhlbihcbiAgICAgICAgICAgIGZ1bmN0aW9uIChuZXh0U3RhdGUpIHtcbiAgICAgICAgICAgICAgb25BY3Rpb25TdWNjZXNzKGFjdGlvblF1ZXVlLCBub2RlLCBuZXh0U3RhdGUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4gb25BY3Rpb25FcnJvcihhY3Rpb25RdWV1ZSwgbm9kZSwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICksXG4gICAgICAgICAgbm9kZS5pc1RyYW5zaXRpb24gfHxcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIFwiQW4gYXN5bmMgZnVuY3Rpb24gd2l0aCB1c2VBY3Rpb25TdGF0ZSB3YXMgY2FsbGVkIG91dHNpZGUgb2YgYSB0cmFuc2l0aW9uLiBUaGlzIGlzIGxpa2VseSBub3Qgd2hhdCB5b3UgaW50ZW5kZWQgKGZvciBleGFtcGxlLCBpc1BlbmRpbmcgd2lsbCBub3QgdXBkYXRlIGNvcnJlY3RseSkuIEVpdGhlciBjYWxsIHRoZSByZXR1cm5lZCBmdW5jdGlvbiBpbnNpZGUgc3RhcnRUcmFuc2l0aW9uLCBvciBwYXNzIGl0IHRvIGFuIGBhY3Rpb25gIG9yIGBmb3JtQWN0aW9uYCBwcm9wLlwiXG4gICAgICAgICAgICApKVxuICAgICAgICA6IG9uQWN0aW9uU3VjY2VzcyhhY3Rpb25RdWV1ZSwgbm9kZSwgcmV0dXJuVmFsdWUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBvbkFjdGlvblN1Y2Nlc3MoYWN0aW9uUXVldWUsIGFjdGlvbk5vZGUsIG5leHRTdGF0ZSkge1xuICAgICAgYWN0aW9uTm9kZS5zdGF0dXMgPSBcImZ1bGZpbGxlZFwiO1xuICAgICAgYWN0aW9uTm9kZS52YWx1ZSA9IG5leHRTdGF0ZTtcbiAgICAgIG5vdGlmeUFjdGlvbkxpc3RlbmVycyhhY3Rpb25Ob2RlKTtcbiAgICAgIGFjdGlvblF1ZXVlLnN0YXRlID0gbmV4dFN0YXRlO1xuICAgICAgYWN0aW9uTm9kZSA9IGFjdGlvblF1ZXVlLnBlbmRpbmc7XG4gICAgICBudWxsICE9PSBhY3Rpb25Ob2RlICYmXG4gICAgICAgICgobmV4dFN0YXRlID0gYWN0aW9uTm9kZS5uZXh0KSxcbiAgICAgICAgbmV4dFN0YXRlID09PSBhY3Rpb25Ob2RlXG4gICAgICAgICAgPyAoYWN0aW9uUXVldWUucGVuZGluZyA9IG51bGwpXG4gICAgICAgICAgOiAoKG5leHRTdGF0ZSA9IG5leHRTdGF0ZS5uZXh0KSxcbiAgICAgICAgICAgIChhY3Rpb25Ob2RlLm5leHQgPSBuZXh0U3RhdGUpLFxuICAgICAgICAgICAgcnVuQWN0aW9uU3RhdGVBY3Rpb24oYWN0aW9uUXVldWUsIG5leHRTdGF0ZSkpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gb25BY3Rpb25FcnJvcihhY3Rpb25RdWV1ZSwgYWN0aW9uTm9kZSwgZXJyb3IpIHtcbiAgICAgIHZhciBsYXN0ID0gYWN0aW9uUXVldWUucGVuZGluZztcbiAgICAgIGFjdGlvblF1ZXVlLnBlbmRpbmcgPSBudWxsO1xuICAgICAgaWYgKG51bGwgIT09IGxhc3QpIHtcbiAgICAgICAgbGFzdCA9IGxhc3QubmV4dDtcbiAgICAgICAgZG9cbiAgICAgICAgICAoYWN0aW9uTm9kZS5zdGF0dXMgPSBcInJlamVjdGVkXCIpLFxuICAgICAgICAgICAgKGFjdGlvbk5vZGUucmVhc29uID0gZXJyb3IpLFxuICAgICAgICAgICAgbm90aWZ5QWN0aW9uTGlzdGVuZXJzKGFjdGlvbk5vZGUpLFxuICAgICAgICAgICAgKGFjdGlvbk5vZGUgPSBhY3Rpb25Ob2RlLm5leHQpO1xuICAgICAgICB3aGlsZSAoYWN0aW9uTm9kZSAhPT0gbGFzdCk7XG4gICAgICB9XG4gICAgICBhY3Rpb25RdWV1ZS5hY3Rpb24gPSBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBub3RpZnlBY3Rpb25MaXN0ZW5lcnMoYWN0aW9uTm9kZSkge1xuICAgICAgYWN0aW9uTm9kZSA9IGFjdGlvbk5vZGUubGlzdGVuZXJzO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhY3Rpb25Ob2RlLmxlbmd0aDsgaSsrKSAoMCwgYWN0aW9uTm9kZVtpXSkoKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYWN0aW9uU3RhdGVSZWR1Y2VyKG9sZFN0YXRlLCBuZXdTdGF0ZSkge1xuICAgICAgcmV0dXJuIG5ld1N0YXRlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtb3VudEFjdGlvblN0YXRlKGFjdGlvbiwgaW5pdGlhbFN0YXRlUHJv
15852cCkge1xuICAgICAgaWYgKGlzSHlkcmF0aW5nKSB7XG4gICAgICAgIHZhciBzc3JGb3JtU3RhdGUgPSB3b3JrSW5Qcm9ncmVzc1Jvb3QuZm9ybVN0YXRlO1xuICAgICAgICBpZiAobnVsbCAhPT0gc3NyRm9ybVN0YXRlKSB7XG4gICAgICAgICAgYToge1xuICAgICAgICAgICAgdmFyIGlzTWF0Y2hpbmcgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlcjtcbiAgICAgICAgICAgIGlmIChpc0h5ZHJhdGluZykge1xuICAgICAgICAgICAgICBpZiAobmV4dEh5ZHJhdGFibGVJbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgIGI6IHtcbiAgICAgICAgICAgICAgICAgIHZhciBtYXJrZXJJbnN0YW5jZSA9IG5leHRIeWRyYXRhYmxlSW5zdGFuY2U7XG4gICAgICAgICAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgICAgICAgICB2YXIgaW5Sb290T3JTaW5nbGV0b24gPSByb290T3JTaW5nbGV0b25Db250ZXh0O1xuICAgICAgICAgICAgICAgICAgICA4ICE9PSBtYXJrZXJJbnN0YW5jZS5ub2RlVHlwZTtcblxuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaW5Sb290T3JTaW5nbGV0b24pIHtcbiAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJJbnN0YW5jZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWsgYjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtYXJrZXJJbnN0YW5jZSA9IGdldE5leHRIeWRyYXRhYmxlKFxuICAgICAgICAgICAgICAgICAgICAgIG1hcmtlckluc3RhbmNlLm5leHRTaWJsaW5nXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09PSBtYXJrZXJJbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgICAgICAgIG1hcmtlckluc3RhbmNlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhayBiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpblJvb3RPclNpbmdsZXRvbiA9IG1hcmtlckluc3RhbmNlLmRhdGE7XG4gICAgICAgICAgICAgICAgICBtYXJrZXJJbnN0YW5jZSA9XG4gICAgICAgICAgICAgICAgICAgIGluUm9vdE9yU2luZ2xldG9uID09PSBGT1JNX1NUQVRFX0lTX01BVENISU5HIHx8XG4gICAgICAgICAgICAgICAgICAgIGluUm9vdE9yU2luZ2xldG9uID09PSBGT1JNX1NUQVRFX0lTX05PVF9NQVRDSElOR1xuICAgICAgICAgICAgICAgICAgICAgID8gbWFya2VySW5zdGFuY2VcbiAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChtYXJrZXJJbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IGdldE5leHRIeWRyYXRhYmxlKFxuICAgICAgICAgICAgICAgICAgICBtYXJrZXJJbnN0YW5jZS5uZXh0U2libGluZ1xuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGlzTWF0Y2hpbmcgPSBtYXJrZXJJbnN0YW5jZS5kYXRhID09PSBGT1JNX1NUQVRFX0lTX01BVENISU5HO1xuICAgICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKGlzTWF0Y2hpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXNNYXRjaGluZyA9ICExO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpc01hdGNoaW5nICYmIChpbml0aWFsU3RhdGVQcm9wID0gc3NyRm9ybVN0YXRlWzBdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3NyRm9ybVN0YXRlID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgICAgIHNzckZvcm1TdGF0ZS5tZW1vaXplZFN0YXRlID0gc3NyRm9ybVN0YXRlLmJhc2VTdGF0ZSA9IGluaXRpYWxTdGF0ZVByb3A7XG4gICAgICBpc01hdGNoaW5nID0ge1xuICAgICAgICBwZW5kaW5nOiBudWxsLFxuICAgICAgICBsYW5lczogMCxcbiAgICAgICAgZGlzcGF0Y2g6IG51bGwsXG4gICAgICAgIGxhc3RSZW5kZXJlZFJlZHVjZXI6IGFjdGlvblN0YXRlUmVkdWNlcixcbiAgICAgICAgbGFzdFJlbmRlcmVkU3RhdGU6IGluaXRpYWxTdGF0ZVByb3BcbiAgICAgIH07XG4gICAgICBzc3JGb3JtU3RhdGUucXVldWUgPSBpc01hdGNoaW5nO1xuICAgICAgc3NyRm9ybVN0YXRlID0gZGlzcGF0Y2hTZXRTdGF0ZS5iaW5kKFxuICAgICAgICBudWxsLFxuICAgICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlcixcbiAgICAgICAgaXNNYXRjaGluZ1xuICAgICAgKTtcbiAgICAgIGlzTWF0Y2hpbmcuZGlzcGF0Y2ggPSBzc3JGb3JtU3RhdGU7XG4gICAgICBpc01hdGNoaW5nID0gbW91bnRTdGF0ZUltcGwoITEpO1xuICAgICAgaW5Sb290T3JTaW5nbGV0b24gPSBkaXNwYXRjaE9wdGltaXN0aWNTZXRTdGF0ZS5iaW5kKFxuICAgICAgICBudWxsLFxuICAgICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlcixcbiAgICAgICAgITEsXG4gICAgICAgIGlzTWF0Y2hpbmcucXVldWVcbiAgICAgICk7XG4gICAgICBpc01hdGNoaW5nID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgICAgIG1hcmtlckluc3RhbmNlID0ge1xuICAgICAgICBzdGF0ZTogaW5pdGlhbFN0YXRlUHJvcCxcbiAgICAgICAgZGlzcGF0Y2g6IG51bGwsXG4gICAgICAgIGFjdGlvbjogYWN0aW9uLFxuICAgICAgICBwZW5kaW5nOiBudWxsXG4gICAgICB9O1xuICAgICAgaXNNYXRjaGluZy5xdWV1ZSA9IG1hcmtlckluc3RhbmNlO1xuICAgICAgc3NyRm9ybVN0YXRlID0gZGlzcGF0Y2hBY3Rpb25TdGF0ZS5iaW5kKFxuICAgICAgICBudWxsLFxuICAgICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlcixcbiAgICAgICAgbWFya2VySW5zdGFuY2UsXG4gICAgICAgIGluUm9vdE9yU2luZ2xldG9uLFxuICAgICAgICBzc3JGb3JtU3RhdGVcbiAgICAgICk7XG4gICAgICBtYXJrZXJJbnN0YW5jZS5kaXNwYXRjaCA9IHNzckZvcm1TdGF0ZTtcbiAgICAgIGlzTWF0Y2hpbmcubWVtb2l6ZWRTdGF0ZSA9IGFjdGlvbjtcbiAgICAgIHJldHVybiBbaW5pdGlhbFN0YXRlUHJv
15852cCwgc3NyRm9ybVN0YXRlLCAhMV07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZUFjdGlvblN0YXRlKGFjdGlvbikge1xuICAgICAgdmFyIHN0YXRlSG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICAgICAgcmV0dXJuIHVwZGF0ZUFjdGlvblN0YXRlSW1wbChzdGF0ZUhvb2ssIGN1cnJlbnRIb29rLCBhY3Rpb24pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVBY3Rpb25TdGF0ZUltcGwoc3RhdGVIb29rLCBjdXJyZW50U3RhdGVIb29rLCBhY3Rpb24pIHtcbiAgICAgIGN1cnJlbnRTdGF0ZUhvb2sgPSB1cGRhdGVSZWR1Y2VySW1wbChcbiAgICAgICAgc3RhdGVIb29rLFxuICAgICAgICBjdXJyZW50U3RhdGVIb29rLFxuICAgICAgICBhY3Rpb25TdGF0ZVJlZHVjZXJcbiAgICAgIClbMF07XG4gICAgICBzdGF0ZUhvb2sgPSB1cGRhdGVSZWR1Y2VyKGJhc2ljU3RhdGVSZWR1Y2VyKVswXTtcbiAgICAgIGlmIChcbiAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIGN1cnJlbnRTdGF0ZUhvb2sgJiZcbiAgICAgICAgbnVsbCAhPT0gY3VycmVudFN0YXRlSG9vayAmJlxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBjdXJyZW50U3RhdGVIb29rLnRoZW5cbiAgICAgIClcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YXIgc3RhdGUgPSB1c2VUaGVuYWJsZShjdXJyZW50U3RhdGVIb29rKTtcbiAgICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICAgIGlmICh4ID09PSBTdXNwZW5zZUV4Y2VwdGlvbikgdGhyb3cgU3VzcGVuc2VBY3Rpb25FeGNlcHRpb247XG4gICAgICAgICAgdGhyb3cgeDtcbiAgICAgICAgfVxuICAgICAgZWxzZSBzdGF0ZSA9IGN1cnJlbnRTdGF0ZUhvb2s7XG4gICAgICBjdXJyZW50U3RhdGVIb29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gICAgICB2Y
15852XIgYWN0aW9uUXVldWUgPSBjdXJyZW50U3RhdGVIb29rLnF1ZXVlLFxuICAgICAgICBkaXNwYXRjaCA9IGFjdGlvblF1ZXVlLmRpc3BhdGNoO1xuICAgICAgYWN0aW9uICE9PSBjdXJyZW50U3RhdGVIb29rLm1lbW9pemVkU3RhdGUgJiZcbiAgICAgICAgKChjdXJyZW50bHlSZW5kZXJpbmdGaWJlci5mbGFncyB8PSAyMDQ4KSxcbiAgICAgICAgcHVzaFNpbXBsZUVmZmVjdChcbiAgICAgICAgICBIYXNFZmZlY3QgfCBQYXNzaXZlLFxuICAgICAgICAgIHsgZGVzdHJveTogdm9pZCAwIH0sXG4gICAgICAgICAgYWN0aW9uU3RhdGVBY3Rpb25FZmZlY3QuYmluZChudWxsLCBhY3Rpb25RdWV1ZSwgYWN0aW9uKSxcbiAgICAgICAgICBudWxsXG4gICAgICAgICkpO1xuICAgICAgcmV0dXJuIFtzdGF0ZSwgZGlzcGF0Y2gsIHN0YXRlSG9va107XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFjdGlvblN0YXRlQWN0aW9uRWZmZWN0KGFjdGlvblF1ZXVlLCBhY3Rpb24pIHtcbiAgICAgIGFjdGlvblF1ZXVlLmFjdGlvbiA9IGFjdGlvbjtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVyZW5kZXJBY3Rpb25TdGF0ZShhY3Rpb24pIHtcbiAgICAgIHZhciBzdGF0ZUhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKSxcbiAgICAgICAgY3VycmVudFN0YXRlSG9vayA9IGN1cnJlbnRIb29rO1xuICAgICAgaWYgKG51bGwgIT09IGN1cnJlbnRTdGF0ZUhvb2spXG4gICAgICAgIHJldHVybiB1cGRhdGVBY3Rpb25TdGF0ZUltcGwoc3RhdGVIb29rLCBjdXJyZW50U3RhdGVIb29rLCBhY3Rpb24pO1xuICAgICAgdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gICAgICBzdGF0ZUhvb2sgPSBzdGF0ZUhvb2subWVtb2l6ZWRTdGF0ZTtcbiAgICAgIGN1cnJlbnRTdGF0ZUhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgICAgIHZhciBkaXNwYXRjaCA9IGN1cnJlbnRTdGF0ZUhvb2sucXVldWUuZGlzcGF0Y2g7XG4gICAgICBjdXJyZW50U3RhdGVIb29rLm1lbW9pemVkU3RhdGUgPSBhY3Rpb247XG4gICAgICByZXR1cm4gW3N0YXRlSG9vaywgZGlzcGF0Y2gsICExXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHVzaFNpbXBsZUVmZmVjdCh0YWcsIGluc3QsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgdGFnID0geyB0YWc6IHRhZywgY3JlYXRlOiBjcmVhdGUsIGRlcHM6IGRlcHMsIGluc3Q6IGluc3QsIG5leHQ6IG51bGwgfTtcbiAgICAgIGluc3QgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlci51cGRhdGVRdWV1ZTtcbiAgICAgIG51bGwgPT09IGluc3QgJiZcbiAgICAgICAgKChpbnN0ID0gY3JlYXRlRnVuY3Rpb25Db21wb25lbnRVcGRhdGVRdWV1ZSgpKSxcbiAgICAgICAgKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLnVwZGF0ZVF1ZXVlID0gaW5zdCkpO1xuICAgICAgY3JlYXRlID0gaW5zdC5sYXN0RWZmZWN0O1xuICAgICAgbnVsbCA9PT0gY3JlYXRlXG4gICAgICAgID8gKGluc3QubGFzdEVmZmVjdCA9IHRhZy5uZXh0ID0gdGFnKVxuICAgICAgICA6ICgoZGVwcyA9IGNyZWF0ZS5uZXh0KSxcbiAgICAgICAgICAoY3JlYXRlLm5leHQgPSB0YWcpLFxuICAgICAgICAgICh0YWcubmV4dCA9IGRlcHMpLFxuICAgICAgICAgIChpbnN0Lmxhc3RFZmZlY3QgPSB0YWcpKTtcbiAgICAgIHJldHVybiB0YWc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1vdW50UmVmKGluaXRpYWxWYWx1ZSkge1xuICAgICAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICAgICAgaW5pdGlhbFZhbHVlID0geyBjdXJyZW50OiBpbml0aWFsVmFsdWUgfTtcbiAgICAgIHJldHVybiAoaG9vay5tZW1vaXplZFN0YXRlID0gaW5pdGlhbFZhbHVlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbW91bnRFZmZlY3RJbXBsKGZpYmVyRmxhZ3MsIGhvb2tGbGFncywgY3JlYXRlLCBkZXBzKSB7XG4gICAgICB2Y
15852XIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gICAgICBjdXJyZW50bHlSZW5kZXJpbmdGaWJlci5mbGFncyB8PSBmaWJlckZsYWdzO1xuICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gcHVzaFNpbXBsZUVmZmVjdChcbiAgICAgICAgSGFzRWZmZWN0IHwgaG9va0ZsYWdzLFxuICAgICAgICB7IGRlc3Ryb3k6IHZvaWQgMCB9LFxuICAgICAgICBjcmVhdGUsXG4gICAgICAgIHZvaWQgMCA9PT0gZGVwcyA/IG51bGwgOiBkZXBzXG4gICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVFZmZlY3RJbXBsKGZpYmVyRmxhZ3MsIGhvb2tGbGFncywgY3JlYXRlLCBkZXBzKSB7XG4gICAgICB2YXIgaG9vayA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpO1xuICAgICAgZGVwcyA9IHZvaWQgMCA9PT0gZGVwcyA/IG51bGwgOiBkZXBzO1xuICAgICAgdmFyIGluc3QgPSBob29rLm1lbW9pemVkU3RhdGUuaW5zdDtcbiAgICAgIG51bGwgIT09IGN1cnJlbnRIb29rICYmXG4gICAgICBudWxsICE9PSBkZXBzICYmXG4gICAgICBhcmVIb29rSW5wdXRzRXF1YWwoZGVwcywgY3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZS5kZXBzKVxuICAgICAgICA/IChob29rLm1lbW9pemVkU3RhdGUgPSBwdXNoU2ltcGxlRWZmZWN0KGhvb2tGbGFncywgaW5zdCwgY3JlYXRlLCBkZXBzKSlcbiAgICAgICAgOiAoKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLmZsYWdzIHw9IGZpYmVyRmxhZ3MpLFxuICAgICAgICAgIChob29rLm1lbW9pemVkU3RhdGUgPSBwdXNoU2ltcGxlRWZmZWN0KFxuICAgICAgICAgICAgSGFzRWZmZWN0IHwgaG9va0ZsYWdzLFxuICAgICAgICAgICAgaW5zdCxcbiAgICAgICAgICAgIGNyZWF0ZSxcbiAgICAgICAgICAgIGRlcHNcbiAgICAgICAgICApKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1vdW50RWZmZWN0KGNyZWF0ZSwgZGVwcykge1xuICAgICAgKGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZVxuICAgICAgICA/IG1vdW50RWZmZWN0SW1wbCg1NDUyNjE1NjgsIFBhc3NpdmUsIGNyZWF0ZSwgZGVwcylcbiAgICAgICAgOiBtb3VudEVmZmVjdEltcGwoODM5MDY1NiwgUGFzc2l2ZSwgY3JlYXRlLCBkZXBzKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXNlRWZmZWN0RXZlbnRJbXBsKHBheWxvYWQpIHtcbiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLmZsYWdzIHw9IDQ7XG4gICAgICB2Y
15852XIgY29tcG9uZW50VXBkYXRlUXVldWUgPSBjdXJyZW50bHlSZW5kZXJpbmdGaWJlci51cGRhdGVRdWV1ZTtcbiAgICAgIGlmIChudWxsID09PSBjb21wb25lbnRVcGRhdGVRdWV1ZSlcbiAgICAgICAgKGNvbXBvbmVudFVwZGF0ZVF1ZXVlID0gY3JlYXRlRnVuY3Rpb25Db21wb25lbnRVcGRhdGVRdWV1ZSgpKSxcbiAgICAgICAgICAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIudXBkYXRlUXVldWUgPSBjb21wb25lbnRVcGRhdGVRdWV1ZSksXG4gICAgICAgICAgKGNvbXBvbmVudFVwZGF0ZVF1ZXVlLmV2ZW50cyA9IFtwYXlsb2FkXSk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgdmFyIGV2ZW50cyA9IGNvbXBvbmVudFVwZGF0ZVF1ZXVlLmV2ZW50cztcbiAgICAgICAgbnVsbCA9PT0gZXZlbnRzXG4gICAgICAgICAgPyAoY29tcG9uZW50VXBkYXRlUXVldWUuZXZlbnRzID0gW3BheWxvYWRdKVxuICAgICAgICAgIDogZXZlbnRzLnB1c2gocGF5bG9hZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1vdW50RXZlbnQoY2FsbGJhY2spIHtcbiAgICAgIHZhciBob29rID0gbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKSxcbiAgICAgICAgcmVmID0geyBpbXBsOiBjYWxsYmFjayB9O1xuICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gcmVmO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dClcbiAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgIFwiQSBmdW5jdGlvbiB3cmFwcGVkIGluIHVzZUVmZmVjdEV2ZW50IGNhbid0IGJlIGNhbGxlZCBkdXJpbmcgcmVuZGVyaW5nLlwiXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHJlZi5pbXBsLmFwcGx5KHZvaWQgMCwgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZUV2ZW50KGNhbGxiYWNrKSB7XG4gICAgICB2Y
15852XIgcmVmID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCkubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIHVzZUVmZmVjdEV2ZW50SW1wbCh7IHJlZjogcmVmLCBuZXh0SW1wbDogY2FsbGJhY2sgfSk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSAhPT0gTm9Db250ZXh0KVxuICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgXCJBIGZ1bmN0aW9uIHdyYXBwZWQgaW4gdXNlRWZmZWN0RXZlbnQgY2FuJ3QgYmUgY2FsbGVkIGR1cmluZyByZW5kZXJpbmcuXCJcbiAgICAgICAgICApO1xuICAgICAgICByZXR1cm4gcmVmLmltcGwuYXBwbHkodm9pZCAwLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbW91bnRMYXlvdXRFZmZlY3QoY3JlYXRlLCBkZXBzKSB7XG4gICAgICB2YXIgZmliZXJGbGFncyA9IDQxOTQzMDg7XG4gICAgICAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlICYmXG4gICAgICAgIChmaWJlckZsYWdzIHw9IDI2ODQzNTQ1Nik7XG4gICAgICByZXR1cm4gbW91bnRFZmZlY3RJbXBsKGZpYmVyRmxhZ3MsIExheW91dCwgY3JlYXRlLCBkZXBzKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaW1wZXJhdGl2ZUhhbmRsZUVmZmVjdChjcmVhdGUsIHJlZikge1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHJlZikge1xuICAgICAgICBjcmVhdGUgPSBjcmVhdGUoKTtcbiAgICAgICAgdmFyIHJlZkNsZWFudXAgPSByZWYoY3JlYXRlKTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiByZWZDbGVhbnVwID8gcmVmQ2xlYW51cCgpIDogcmVmKG51bGwpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKG51bGwgIT09IHJlZiAmJiB2b2lkIDAgIT09IHJlZilcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICByZWYuaGFzT3duUHJvcGVydHkoXCJjdXJyZW50XCIpIHx8XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIkV4cGVjdGVkIHVzZUltcGVyYXRpdmVIYW5kbGUoKSBmaXJzdCBhcmd1bWVudCB0byBlaXRoZXIgYmUgYSByZWYgY2FsbGJhY2sgb3IgUmVhY3QuY3JlYXRlUmVmKCkgb2JqZWN0LiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy5cIixcbiAgICAgICAgICAgICAgXCJhbiBvYmplY3Qgd2l0aCBrZXlzIHtcIiArIE9iamVjdC5rZXlzKHJlZikuam9pbihcIiwgXCIpICsgXCJ9XCJcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKGNyZWF0ZSA9IGNyZWF0ZSgpKSxcbiAgICAgICAgICAocmVmLmN1cnJlbnQgPSBjcmVhdGUpLFxuICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgY3JlYXRlICYmXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJFeHBlY3RlZCB1c2VJbXBlcmF0aXZlSGFuZGxlKCkgc2Vjb25kIGFyZ3VtZW50IHRvIGJlIGEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGEgaGFuZGxlLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy5cIixcbiAgICAgICAgICBudWxsICE9PSBjcmVhdGUgPyB0eXBlb2YgY3JlYXRlIDogXCJudWxsXCJcbiAgICAgICAgKTtcbiAgICAgIGRlcHMgPSBudWxsICE9PSBkZXBzICYmIHZvaWQgMCAhPT0gZGVwcyA/IGRlcHMuY29uY2F0KFtyZWZdKSA6IG51bGw7XG4gICAgICB2Y
15852XIgZmliZXJGbGFncyA9IDQxOTQzMDg7XG4gICAgICAoY3VycmVudGx5UmVuZGVyaW5nRmliZXIubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlICYmXG4gICAgICAgIChmaWJlckZsYWdzIHw9IDI2ODQzNTQ1Nik7XG4gICAgICBtb3VudEVmZmVjdEltcGwoXG4gICAgICAgIGZpYmVyRmxhZ3MsXG4gICAgICAgIExheW91dCxcbiAgICAgICAgaW1wZXJhdGl2ZUhhbmRsZUVmZmVjdC5iaW5kKG51bGwsIGNyZWF0ZSwgcmVmKSxcbiAgICAgICAgZGVwc1xuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgY3JlYXRlICYmXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJFeHBlY3RlZCB1c2VJbXBlcmF0aXZlSGFuZGxlKCkgc2Vjb25kIGFyZ3VtZW50IHRvIGJlIGEgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGEgaGFuZGxlLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy5cIixcbiAgICAgICAgICBudWxsICE9PSBjcmVhdGUgPyB0eXBlb2YgY3JlYXRlIDogXCJudWxsXCJcbiAgICAgICAgKTtcbiAgICAgIGRlcHMgPSBudWxsICE9PSBkZXBzICYmIHZvaWQgMCAhPT0gZGVwcyA/IGRlcHMuY29uY2F0KFtyZWZdKSA6IG51bGw7XG4gICAgICB1cGRhdGVFZmZlY3RJbXBsKFxuICAgICAgICA0LFxuICAgICAgICBMYXlvdXQsXG4gICAgICAgIGltcGVyYXRpdmVIYW5kbGVFZmZlY3QuYmluZChudWxsLCBjcmVhdGUsIHJlZiksXG4gICAgICAgIGRlcHNcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1vdW50Q2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpIHtcbiAgICAgIG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCkubWVtb2l6ZWRTdGF0ZSA9IFtcbiAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgIHZvaWQgMCA9PT0gZGVwcyA/IG51bGwgOiBkZXBzXG4gICAgICBdO1xuICAgICAgcmV0dXJuIGNhbGxiYWNrO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcykge1xuICAgICAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgICAgIGRlcHMgPSB2b2lkIDAgPT09IGRlcHMgPyBudWxsIDogZGVwcztcbiAgICAgIHZhciBwcmV2U3RhdGUgPSBob29rLm1lbW9pemVkU3RhdGU7XG4gICAgICBpZiAobnVsbCAhPT0gZGVwcyAmJiBhcmVIb29rSW5wdXRzRXF1YWwoZGVwcywgcHJldlN0YXRlWzFdKSlcbiAgICAgICAgcmV0dXJuIHByZXZTdGF0ZVswXTtcbiAgICAgIGhvb2subWVtb2l6ZWRTdGF0ZSA9IFtjYWxsYmFjaywgZGVwc107XG4gICAgICByZXR1cm4gY2FsbGJhY2s7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1vdW50TWVtbyhuZXh0Q3JlYXRlLCBkZXBzKSB7XG4gICAgICB2Y
15852XIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gICAgICBkZXBzID0gdm9pZCAwID09PSBkZXBzID8gbnVsbCA6IGRlcHM7XG4gICAgICB2YXIgbmV4dFZhbHVlID0gbmV4dENyZWF0ZSgpO1xuICAgICAgaWYgKHNob3VsZERvdWJsZUludm9rZVVzZXJGbnNJbkhvb2tzREVWKSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKCEwKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBuZXh0Q3JlYXRlKCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoITEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBob29rLm1lbW9pemVkU3RhdGUgPSBbbmV4dFZhbHVlLCBkZXBzXTtcbiAgICAgIHJldHVybiBuZXh0VmFsdWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZU1lbW8obmV4dENyZWF0ZSwgZGVwcykge1xuICAgICAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgICAgIGRlcHMgPSB2b2lkIDAgPT09IGRlcHMgPyBudWxsIDogZGVwcztcbiAgICAgIHZhciBwcmV2U3RhdGUgPSBob29rLm1lbW9pemVkU3RhdGU7XG4gICAgICBpZiAobnVsbCAhPT0gZGVwcyAmJiBhcmVIb29rSW5wdXRzRXF1YWwoZGVwcywgcHJldlN0YXRlWzFdKSlcbiAgICAgICAgcmV0dXJuIHByZXZTdGF0ZVswXTtcbiAgICAgIHByZXZTdGF0ZSA9IG5leHRDcmVhdGUoKTtcbiAgICAgIGlmIChzaG91bGREb3VibGVJbnZva2VVc2VyRm5zSW5Ib29rc0RFVikge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyghMCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbmV4dENyZWF0ZSgpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKCExKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gW3ByZXZTdGF0ZSwgZGVwc107XG4gICAgICByZXR1cm4gcHJldlN0YXRlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtb3VudERlZmVycmVkVmFsdWUodmFsdWUsIGluaXRpYWxWYWx1ZSkge1xuICAgICAgdmFyIGhvb2sgPSBtb3VudFdvcmtJblByb2dyZXNzSG9vaygpO1xuICAgICAgcmV0dXJuIG1vdW50RGVmZXJyZWRWYWx1ZUltcGwoaG9vaywgdmFsdWUsIGluaXRpYWxWYWx1ZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZURlZmVycmVkVmFsdWUodmFsdWUsIGluaXRpYWxWYWx1ZSkge1xuICAgICAgdmFyIGhvb2sgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKTtcbiAgICAgIHJldHVybiB1cGRhdGVEZWZlcnJlZFZhbHVlSW1wbChcbiAgICAgICAgaG9vayxcbiAgICAgICAgY3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGluaXRpYWxWYWx1ZVxuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVyZW5kZXJEZWZlcnJlZFZhbHVlKHZhbHVlLCBpbml0aWFsVmFsdWUpIHtcbiAgICAgIHZhciBob29rID0gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCk7XG4gICAgICByZXR1cm4gbnVsbCA9PT0gY3VycmVudEhvb2tcbiAgICAgICAgPyBtb3VudERlZmVycmVkVmFsdWVJbXBsKGhvb2ssIHZhbHVlLCBpbml0aWFsVmFsdWUpXG4gICAgICAgIDogdXBkYXRlRGVmZXJyZWRWYWx1ZUltcGwoXG4gICAgICAgICAgICBob29rLFxuICAgICAgICAgICAgY3VycmVudEhvb2subWVtb2l6ZWRTdGF0ZSxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgaW5pdGlhbFZhbHVlXG4gICAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbW91bnREZWZlcnJlZFZhbHVlSW1wbChob29rLCB2YWx1ZSwgaW5pdGlhbFZhbHVlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHZvaWQgMCA9PT0gaW5pdGlhbFZhbHVlIHx8XG4gICAgICAgICgwICE9PSAocmVuZGVyTGFuZXMgJiAxMDczNzQxODI0KSAmJlxuICAgICAgICAgIDAgPT09ICh3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAmIDI2MTkzMCkpXG4gICAgICApXG4gICAgICAgIHJldHVybiAoaG9vay5tZW1vaXplZFN0YXRlID0gdmFsdWUpO1xuICAgICAgaG9vay5tZW1vaXplZFN0YXRlID0gaW5pdGlhbFZhbHVlO1xuICAgICAgaG9vayA9IHJlcXVlc3REZWZlcnJlZExhbmUoKTtcbiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLmxhbmVzIHw9IGhvb2s7XG4gICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMgfD0gaG9vaztcbiAgICAgIHJldHVybiBpbml0aWFsVmFsdWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZURlZmVycmVkVmFsdWVJbXBsKGhvb2ssIHByZXZWYWx1ZSwgdmFsdWUsIGluaXRpYWxWYWx1ZSkge1xuICAgICAgaWYgKG9iamVjdElzKHZhbHVlLCBwcmV2VmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gICAgICBpZiAobnVsbCAhPT0gY3VycmVudFRyZWVIaWRkZW5TdGFja0N1cnNvci5jdXJyZW50KVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIChob29rID0gbW91bnREZWZlcnJlZFZhbHVlSW1wbChob29rLCB2YWx1ZSwgaW5pdGlhbFZhbHVlKSksXG4gICAgICAgICAgb2JqZWN0SXMoaG9vaywgcHJldlZhbHVlKSB8fCAoZGlkUmVjZWl2ZVVwZGF0ZSA9ICEwKSxcbiAgICAgICAgICBob29rXG4gICAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgIDAgPT09IChyZW5kZXJMYW5lcyAmIDEwNikgfHxcbiAgICAgICAgKDAgIT09IChyZW5kZXJMYW5lcyAmIDEwNzM3NDE4MjQpICYmXG4gICAgICAgICAgMCA9PT0gKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzICYgMjYxOTMwKSlcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIChkaWRSZWNlaXZlVXBkYXRlID0gITApLCAoaG9vay5tZW1vaXplZFN0YXRlID0gdmFsdWUpO1xuICAgICAgaG9vayA9IHJlcXVlc3REZWZlcnJlZExhbmUoKTtcbiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyLmxhbmVzIHw9IGhvb2s7XG4gICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMgfD0gaG9vaztcbiAgICAgIHJldHVybiBwcmV2VmFsdWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlbGVhc2VBc3luY1RyYW5zaXRpb24oKSB7XG4gICAgICBSZWFjdFNoYXJlZEludGVybmFscy5hc3luY1
15852RyYW5zaXRpb25zLS07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0YXJ0VHJhbnNpdGlvbihcbiAgICAgIGZpYmVyLFxuICAgICAgcXVldWUsXG4gICAgICBwZW5kaW5nU3RhdGUsXG4gICAgICBmaW5pc2hlZFN0YXRlLFxuICAgICAgY2FsbGJhY2tcbiAgICApIHtcbiAgICAgIHZhciBwcmV2aW91c1ByaW9yaXR5ID0gUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucDtcbiAgICAgIFJlYWN0RE9NU2hhcmVkSW50ZXJuYWxzLnAgPVxuICAgICAgICAwICE9PSBwcmV2aW91c1ByaW9yaXR5ICYmIHByZXZpb3VzUHJpb3JpdHkgPCBDb250aW51b3VzRXZlbnRQcmlvcml0eVxuICAgICAgICAgID8gcHJldmlvdXNQcmlvcml0eVxuICAgICAgICAgIDogQ29udGludW91c0V2ZW50UHJpb3JpdHk7XG4gICAgICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdFNoYXJlZEludGVybmFscy5ULFxuICAgICAgICBjdXJyZW50VHJhbnNpdGlvbiA9IHt9O1xuICAgICAgY3VycmVudFRyYW5zaXRpb24udHlwZXMgPVxuICAgICAgICBudWxsICE9PSBwcmV2VHJhbnNpdGlvbiA/IHByZXZUcmFuc2l0aW9uLnR5cGVzIDogbnVsbDtcbiAgICAgIGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzID0gbmV3IFNldCgpO1xuICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuVCA9IGN1cnJlbnRUcmFuc2l0aW9uO1xuICAgICAgZGlzcGF0Y2hPcHRpbWlzdGljU2V0U3RhdGUoZmliZXIsICExLCBxdWV1ZSwgcGVuZGluZ1N0YXRlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciByZXR1cm5WYWx1ZSA9IGNhbGxiYWNrKCksXG4gICAgICAgICAgb25TdGFydFRyYW5zaXRpb25GaW5pc2ggPSBSZWFjdFNoYXJlZEludGVybmFscy5TO1xuICAgICAgICBudWxsICE9PSBvblN0YXJ0VHJhbnNpdGlvbkZpbmlzaCAmJlxuICAgICAgICAgIG9uU3RhcnRUcmFuc2l0aW9uRmluaXNoKGN1cnJlbnRUcmFuc2l0aW9uLCByZXR1cm5WYWx1ZSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBudWxsICE9PSByZXR1cm5WYWx1ZSAmJlxuICAgICAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiByZXR1cm5WYWx1ZSAmJlxuICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHJldHVyblZhbHVlLnRoZW5cbiAgICAgICAgKSB7XG4gICAgICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuYXN5bmNUcmFuc2l0aW9ucysrO1xuICAgICAgICAgIHJldHVyblZhbHVlLnRoZW4ocmVsZWFzZUFzeW5jVHJhbnNpdGlvbiwgcmVsZWFzZUFzeW5jVHJhbnNpdGlvbik7XG4gICAgICAgICAgdmFyIHRoZW5hYmxlRm9yRmluaXNoZWRTdGF0ZSA9IGNoYWluVGhlbmFibGVWYWx1ZShcbiAgICAgICAgICAgIHJldHVyblZhbHVlLFxuICAgICAgICAgICAgZmluaXNoZWRTdGF0ZVxuICAgICAgICAgICk7XG4gICAgICAgICAgZGlzcGF0Y2hTZXRTdGF0ZUludGVybmFsKFxuICAgICAgICAgICAgZmliZXIsXG4gICAgICAgICAgICBxdWV1ZSxcbiAgICAgICAgICAgIHRoZW5hYmxlRm9yRmluaXNoZWRTdGF0ZSxcbiAgICAgICAgICAgIHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgIGRpc3BhdGNoU2V0U3RhdGVJbnRlcm5hbChcbiAgICAgICAgICAgIGZpYmVyLFxuICAgICAgICAgICAgcXVldWUsXG4gICAgICAgICAgICBmaW5pc2hlZFN0YXRlLFxuICAgICAgICAgICAgcmVxdWVzdFVwZGF0ZUxhbmUoZmliZXIpXG4gICAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGRpc3BhdGNoU2V0U3RhdGVJbnRlcm5hbChcbiAgICAgICAgICBmaWJlcixcbiAgICAgICAgICBxdWV1ZSxcbiAgICAgICAgICB7IHRoZW46IGZ1bmN0aW9uICgpIHt9LCBzdGF0dXM6IFwicmVqZWN0ZWRcIiwgcmVhc29uOiBlcnJvciB9LFxuICAgICAgICAgIHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKVxuICAgICAgICApO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgKFJlYWN0RE9NU2hhcmVkSW50ZXJuYWxzLnAgPSBwcmV2aW91c1ByaW9yaXR5KSxcbiAgICAgICAgICBudWxsICE9PSBwcmV2VHJhbnNpdGlvbiAmJlxuICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudFRyYW5zaXRpb24udHlwZXMgJiZcbiAgICAgICAgICAgIChudWxsICE9PSBwcmV2VHJhbnNpdGlvbi50eXBlcyAmJlxuICAgICAgICAgICAgICBwcmV2VHJhbnNpdGlvbi50eXBlcyAhPT0gY3VycmVudFRyYW5zaXRpb24udHlwZXMgJiZcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBcIldlIGV4cGVjdGVkIGlubmVyIFRyYW5zaXRpb25zIHRvIGhhdmUgdHJhbnNmZXJyZWQgdGhlIG91
15852dGVyIHR5cGVzIHNldCBhbmQgdGhhdCB5b3UgY2Fubm90IGFkZCB0byB0aGUgb3V0ZXIgVHJhbnNpdGlvbiB3aGlsZSBpbnNpZGUgdGhlIGlubmVyLlRoaXMgaXMgYSBidWcgaW4gUmVhY3QuXCJcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIChwcmV2VHJhbnNpdGlvbi50eXBlcyA9IGN1cnJlbnRUcmFuc2l0aW9uLnR5cGVzKSksXG4gICAgICAgICAgKFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQgPSBwcmV2VHJhbnNpdGlvbiksXG4gICAgICAgICAgbnVsbCA9PT0gcHJldlRyYW5zaXRpb24gJiZcbiAgICAgICAgICAgIGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzICYmXG4gICAgICAgICAgICAoKGZpYmVyID0gY3VycmVudFRyYW5zaXRpb24uX3VwZGF0ZWRGaWJlcnMuc2l6ZSksXG4gICAgICAgICAgICBjdXJyZW50VHJhbnNpdGlvbi5fdXBkYXRlZEZpYmVycy5jbGVhcigpLFxuICAgICAgICAgICAgMTAgPCBmaWJlciAmJlxuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgXCJEZXRlY3RlZCBhIGxhcmdlIG51bWJlciBvZiB1cGRhdGVzIGluc2lkZSBzdGFydFRyYW5zaXRpb24uIElmIHRoaXMgaXMgZHVlIHRvIGEgc3Vic2NyaXB0aW9uIHBsZWFzZSByZS13cml0ZSBpdCB0byB1c2UgUmVhY3QgcHJvdmlkZWQgaG9va3MuIE90aGVyd2lzZSBjb25jdXJyZW50IG1vZGUgZ3VhcmFudGVlcyBhcmUgb2ZmIHRoZSB0YWJsZS5cIlxuICAgICAgICAgICAgICApKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gc3RhcnRIb3N0VHJhbnNpdGlvbihmb3JtRmliZXIsIHBlbmRpbmdTdGF0ZSwgYWN0aW9uLCBmb3JtRGF0YSkge1xuICAgICAgaWYgKDUgIT09IGZvcm1GaWJlci50YWcpXG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIFwiRXhwZWN0ZWQgdGhlIGZvcm0gaW5zdGFuY2UgdG8gYmUgYSBIb3N0Q29tcG9uZW50LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LlwiXG4gICAgICAgICk7XG4gICAgICB2Y
15852XIgcXVldWUgPSBlbnN1cmVGb3JtQ29tcG9uZW50SXNTdGF0ZWZ1bChmb3JtRmliZXIpLnF1ZXVlO1xuICAgICAgc3RhcnRIb3N0QWN0aW9uVGltZXIoZm9ybUZpYmVyKTtcbiAgICAgIHN0YXJ0VHJhbnNpdGlvbihcbiAgICAgICAgZm9ybUZpYmVyLFxuICAgICAgICBxdWV1ZSxcbiAgICAgICAgcGVuZGluZ1N0YXRlLFxuICAgICAgICBOb3RQZW5kaW5nVHJhbnNpdGlvbixcbiAgICAgICAgbnVsbCA9PT0gYWN0aW9uXG4gICAgICAgICAgPyBub29wXG4gICAgICAgICAgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJlcXVlc3RGb3JtUmVzZXQkMShmb3JtRmliZXIpO1xuICAgICAgICAgICAgICByZXR1cm4gYWN0aW9uKGZvcm1EYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGVuc3VyZUZvcm1Db21wb25lbnRJc1N0YXRlZnVsKGZvcm1GaWJlcikge1xuICAgICAgdmFyIGV4aXN0aW5nU3RhdGVIb29rID0gZm9ybUZpYmVyLm1lbW9pemVkU3RhdGU7XG4gICAgICBpZiAobnVsbCAhPT0gZXhpc3RpbmdTdGF0ZUhvb2spIHJldHVybiBleGlzdGluZ1N0YXRlSG9vaztcbiAgICAgIGV4aXN0aW5nU3RhdGVIb29rID0ge1xuICAgICAgICBtZW1vaXplZFN0YXRlOiBOb3RQZW5kaW5nVHJhbnNpdGlvbixcbiAgICAgICAgYmFzZVN0YXRlOiBOb3RQZW5kaW5nVHJhbnNpdGlvbixcbiAgICAgICAgYmFzZVF1ZXVlOiBudWxsLFxuICAgICAgICBxdWV1ZToge1xuICAgICAgICAgIHBlbmRpbmc6IG51bGwsXG4gICAgICAgICAgbGFuZXM6IDAsXG4gICAgICAgICAgZGlzcGF0Y2g6IG51bGwsXG4gICAgICAgICAgbGFzdFJlbmRlcmVkUmVkdWNlcjogYmFzaWNTdGF0ZVJlZHVjZXIsXG4gICAgICAgICAgbGFzdFJlbmRlcmVkU3RhdGU6IE5vdFBlbmRpbmdUcmFuc2l0aW9uXG4gICAgICAgIH0sXG4gICAgICAgIG5leHQ6IG51bGxcbiAgICAgIH07XG4gICAgICB2Y
15852XIgaW5pdGlhbFJlc2V0U3RhdGUgPSB7fTtcbiAgICAgIGV4aXN0aW5nU3RhdGVIb29rLm5leHQgPSB7XG4gICAgICAgIG1lbW9pemVkU3RhdGU6IGluaXRpYWxSZXNldFN0YXRlLFxuICAgICAgICBiYXNlU3RhdGU6IGluaXRpYWxSZXNldFN0YXRlLFxuICAgICAgICBiYXNlUXVldWU6IG51bGwsXG4gICAgICAgIHF1ZXVlOiB7XG4gICAgICAgICAgcGVuZGluZzogbnVsbCxcbiAgICAgICAgICBsYW5lczogMCxcbiAgICAgICAgICBkaXNwYXRjaDogbnVsbCxcbiAgICAgICAgICBsYXN0UmVuZGVyZWRSZWR1Y2VyOiBiYXNpY1N0YXRlUmVkdWNlcixcbiAgICAgICAgICBsYXN0UmVuZGVyZWRTdGF0ZTogaW5pdGlhbFJlc2V0U3RhdGVcbiAgICAgICAgfSxcbiAgICAgICAgbmV4dDogbnVsbFxuICAgICAgfTtcbiAgICAgIGZvcm1GaWJlci5tZW1vaXplZFN0YXRlID0gZXhpc3RpbmdTdGF0ZUhvb2s7XG4gICAgICBmb3JtRmliZXIgPSBmb3JtRmliZXIuYWx0ZXJuYXRlO1xuICAgICAgbnVsbCAhPT0gZm9ybUZpYmVyICYmIChmb3JtRmliZXIubWVtb2l6ZWRTdGF0ZSA9IGV4aXN0aW5nU3RhdGVIb29rKTtcbiAgICAgIHJldHVybiBleGlzdGluZ1N0YXRlSG9vaztcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVxdWVzdEZvcm1SZXNldCQxKGZvcm1GaWJlcikge1xuICAgICAgbnVsbCA9PT0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuVCAmJlxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwicmVxdWVzdEZvcm1SZXNldCB3YXMgY2FsbGVkIG91dHNpZGUgYSB0cmFuc2l0aW9uIG9yIGFjdGlvbi4gVG8gZml4LCBtb3ZlIHRvIGFuIGFjdGlvbiwgb3Igd3JhcCB3aXRoIHN0YXJ0VHJhbnNpdGlvbi5cIlxuICAgICAgICApO1xuICAgICAgdmFyIHN0YXRlSG9vayA9IGVuc3VyZUZvcm1Db21wb25lbnRJc1N0YXRlZnVsKGZvcm1GaWJlcik7XG4gICAgICBudWxsID09PSBzdGF0ZUhvb2submV4dCAmJlxuICAgICAgICAoc3RhdGVIb29rID0gZm9ybUZpYmVyLmFsdGVybmF0ZS5tZW1vaXplZFN0YXRlKTtcbiAgICAgIGRpc3BhdGNoU2V0U3RhdGVJbnRlcm5hbChcbiAgICAgICAgZm9ybUZpYmVyLFxuICAgICAgICBzdGF0ZUhvb2submV4dC5xdWV1ZSxcbiAgICAgICAge30sXG4gICAgICAgIHJlcXVlc3RVcGRhdGVMYW5lKGZvcm1GaWJlcilcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1vdW50VHJhbnNpdGlvbigpIHtcbiAgICAgIHZhciBzdGF0ZUhvb2sgPSBtb3VudFN0YXRlSW1wbCghMSk7XG4gICAgICBzdGF0ZUhvb2sgPSBzdGFydFRyYW5zaXRpb24uYmluZChcbiAgICAgICAgbnVsbCxcbiAgICAgICAgY3VycmVudGx5UmVuZGVyaW5nRmliZXIsXG4gICAgICAgIHN0YXRlSG9vay5xdWV1ZSxcbiAgICAgICAgITAsXG4gICAgICAgICExXG4gICAgICApO1xuICAgICAgbW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKS5tZW1vaXplZFN0YXRlID0gc3RhdGVIb29rO1xuICAgICAgcmV0dXJuIFshMSwgc3RhdGVIb29rXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlVHJhbnNpdGlvbigpIHtcbiAgICAgIHZhciBib29sZWFuT3JUaGVuYWJsZSA9IHVwZGF0ZVJlZHVjZXIoYmFzaWNTdGF0ZVJlZHVjZXIpWzBdLFxuICAgICAgICBzdGFydCA9IHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpLm1lbW9pemVkU3RhdGU7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBcImJvb2xlYW5cIiA9PT0gdHlwZW9mIGJvb2xlYW5PclRoZW5hYmxlXG4gICAgICAgICAgPyBib29sZWFuT3JUaGVuYWJsZVxuICAgICAgICAgIDogdXNlVGhlbmFibGUoYm9vbGVhbk9yVGhlbmFibGUpLFxuICAgICAgICBzdGFydFxuICAgICAgXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVyZW5kZXJUcmFuc2l0aW9uKCkge1xuICAgICAgdmFyIGJvb2xlYW5PclRoZW5hYmxlID0gcmVyZW5kZXJSZWR1Y2VyKGJhc2ljU3RhdGVSZWR1Y2VyKVswXSxcbiAgICAgICAgc3RhcnQgPSB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKS5tZW1vaXplZFN0YXRlO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgXCJib29sZWFuXCIgPT09IHR5cGVvZiBib29sZWFuT3JUaGVuYWJsZVxuICAgICAgICAgID8gYm9vbGVhbk9yVGhlbmFibGVcbiAgICAgICAgICA6IHVzZVRoZW5hYmxlKGJvb2xlYW5PclRoZW5hYmxlKSxcbiAgICAgICAgc3RhcnRcbiAgICAgIF07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVzZUhvc3RUcmFuc2l0aW9uU3RhdHVzKCkge1xuICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KEhvc3RUcmFuc2l0aW9uQ29udGV4dCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1vdW50SWQoKSB7XG4gICAgICB2Y
15852XIgaG9vayA9IG1vdW50V29ya0luUHJvZ3Jlc3NIb29rKCksXG4gICAgICAgIGlkZW50aWZpZXJQcmVmaXggPSB3b3JrSW5Qcm9ncmVzc1Jvb3QuaWRlbnRpZmllclByZWZpeDtcbiAgICAgIGlmIChpc0h5ZHJhdGluZykge1xuICAgICAgICB2YXIgdHJlZUlkID0gdHJlZUNvbnRleHRPdmVyZmxvdztcbiAgICAgICAgdmFyIGlkV2l0aExlYWRpbmdCaXQgPSB0cmVlQ29udGV4dElkO1xuICAgICAgICB0cmVlSWQgPVxuICAgICAgICAgIChcbiAgICAgICAgICAgIGlkV2l0aExlYWRpbmdCaXQgJiB+KDEgPDwgKDMyIC0gY2x6MzIoaWRXaXRoTGVhZGluZ0JpdCkgLSAxKSlcbiAgICAgICAgICApLnRvU3RyaW5nKDMyKSArIHRyZWVJZDtcbiAgICAgICAgaWRlbnRpZmllclByZWZpeCA9IFwiX1wiICsgaWRlbnRpZmllclByZWZpeCArIFwiUl9cIiArIHRyZWVJZDtcbiAgICAgICAgdHJlZUlkID0gbG9jYWxJZENvdW50ZXIrKztcbiAgICAgICAgMCA8IHRyZWVJZCAmJiAoaWRlbnRpZmllclByZWZpeCArPSBcIkhcIiArIHRyZWVJZC50b1N0cmluZygzMikpO1xuICAgICAgICBpZGVudGlmaWVyUHJlZml4ICs9IFwiX1wiO1xuICAgICAgfSBlbHNlXG4gICAgICAgICh0cmVlSWQgPSBnbG9iYWxDbGllbnRJZENvdW50ZXIrKyksXG4gICAgICAgICAgKGlkZW50aWZpZXJQcmVmaXggPVxuICAgICAgICAgICAgXCJfXCIgKyBpZGVudGlmaWVyUHJlZml4ICsgXCJyX1wiICsgdHJlZUlkLnRvU3RyaW5nKDMyKSArIFwiX1wiKTtcbiAgICAgIHJldHVybiAoaG9vay5tZW1vaXplZFN0YXRlID0gaWRlbnRpZmllclByZWZpeCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1vdW50UmVmcmVzaCgpIHtcbiAgICAgIHJldHVybiAobW91bnRXb3JrSW5Qcm9ncmVzc0hvb2soKS5tZW1vaXplZFN0YXRlID0gcmVmcmVzaENhY2hlLmJpbmQoXG4gICAgICAgIG51bGwsXG4gICAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyXG4gICAgICApKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVmcmVzaENhY2hlKGZpYmVyLCBzZWVkS2V5KSB7XG4gICAgICBmb3IgKHZhciBwcm92aWRlciA9IGZpYmVyLnJldHVybjsgbnVsbCAhPT0gcHJvdmlkZXI7ICkge1xuICAgICAgICBzd2l0Y2ggKHByb3ZpZGVyLnRhZykge1xuICAgICAgICAgIGNhc2UgMjQ6XG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgdmFyIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShwcm92aWRlciksXG4gICAgICAgICAgICAgIHJlZnJlc2hVcGRhdGUgPSBjcmVhdGVVcGRhdGUobGFuZSksXG4gICAgICAgICAgICAgIHJvb3QgPSBlbnF1ZXVlVXBkYXRlKHByb3ZpZGVyLCByZWZyZXNoVXBkYXRlLCBsYW5lKTtcbiAgICAgICAgICAgIG51bGwgIT09IHJvb3QgJiZcbiAgICAgICAgICAgICAgKHN0YXJ0VXBkYXRlVGltZXJCeUxhbmUobGFuZSwgXCJyZWZyZXNoKClcIiwgZmliZXIpLFxuICAgICAgICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgcHJvdmlkZXIsIGxhbmUpLFxuICAgICAgICAgICAgICBlbnRhbmdsZVRyYW5zaXRpb25zKHJvb3QsIHByb3ZpZGVyLCBsYW5lKSk7XG4gICAgICAgICAgICBmaWJlciA9IGNyZWF0ZUNhY2hlKCk7XG4gICAgICAgICAgICBudWxsICE9PSBzZWVkS2V5ICYmXG4gICAgICAgICAgICAgIHZvaWQgMCAhPT0gc2VlZEtleSAmJlxuICAgICAgICAgICAgICBudWxsICE9PSByb290ICYmXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgXCJUaGUgc2VlZCBhcmd1bWVudCBpcyBub3QgZW5hYmxlZCBvdXRzaWRlIGV4cGVyaW1lbnRhbCBjaGFubmVscy5cIlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgcmVmcmVzaFVwZGF0ZS5wYXlsb2FkID0geyBjYWNoZTogZmliZXIgfTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBwcm92aWRlciA9IHByb3ZpZGVyLnJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZGlzcGF0Y2hSZWR1Y2VyQWN0aW9uKGZpYmVyLCBxdWV1ZSwgYWN0aW9uKSB7XG4gICAgICB2Y
15852XIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGFyZ3NbM10gJiZcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBcIlN0YXRlIHVwZGF0ZXMgZnJvbSB0aGUgdXNlU3RhdGUoKSBhbmQgdXNlUmVkdWNlcigpIEhvb2tzIGRvbid0IHN1cHBvcnQgdGhlIHNlY29uZCBjYWxsYmFjayBhcmd1bWVudC4gVG8gZXhlY3V0ZSBhIHNpZGUgZWZmZWN0IGFmdGVyIHJlbmRlcmluZywgZGVjbGFyZSBpdCBpbiB0aGUgY29tcG9uZW50IGJvZHkgd2l0aCB1c2VFZmZlY3QoKS5cIlxuICAgICAgICApO1xuICAgICAgYXJncyA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgICAgIHZhciB1cGRhdGUgPSB7XG4gICAgICAgIGxhbmU6IGFyZ3MsXG4gICAgICAgIHJldmVydExhbmU6IDAsXG4gICAgICAgIGdlc3R1cmU6IG51bGwsXG4gICAgICAgIGFjdGlvbjogYWN0aW9uLFxuICAgICAgICBoYXNFYWdlclN0YXRlOiAhMSxcbiAgICAgICAgZWFnZXJTdGF0ZTogbnVsbCxcbiAgICAgICAgbmV4dDogbnVsbFxuICAgICAgfTtcbiAgICAgIGlzUmVuZGVyUGhhc2VVcGRhdGUoZmliZXIpXG4gICAgICAgID8gZW5xdWV1ZVJlbmRlclBoYXNlVXBkYXRlKHF1ZXVlLCB1cGRhdGUpXG4gICAgICAgIDogKCh1cGRhdGUgPSBlbnF1ZXVlQ29uY3VycmVudEhvb2tVcGRhdGUoZmliZXIsIHF1ZXVlLCB1cGRhdGUsIGFyZ3MpKSxcbiAgICAgICAgICBudWxsICE9PSB1cGRhdGUgJiZcbiAgICAgICAgICAgIChzdGFydFVwZGF0ZVRpbWVyQnlMYW5lKGFyZ3MsIFwiZGlzcGF0Y2goKVwiLCBmaWJlciksXG4gICAgICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIodXBkYXRlLCBmaWJlciwgYXJncyksXG4gICAgICAgICAgICBlbnRhbmdsZVRyYW5zaXRpb25VcGRhdGUodXBkYXRlLCBxdWV1ZSwgYXJncykpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGlzcGF0Y2hTZXRTdGF0ZShmaWJlciwgcXVldWUsIGFjdGlvbikge1xuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBhcmdzWzNdICYmXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJTdGF0ZSB1cGRhdGVzIGZyb20gdGhlIHVzZVN0YXRlKCkgYW5kIHVzZVJlZHVjZXIoKSBIb29rcyBkb24ndCBzdXBwb3J0IHRoZSBzZWNvbmQgY2FsbGJhY2sgYXJndW1lbnQuIFRvIGV4ZWN1dGUgYSBzaWRlIGVmZmVjdCBhZnRlciByZW5kZXJpbmcsIGRlY2xhcmUgaXQgaW4gdGhlIGNvbXBvbmVudCBib2R5IHdpdGggdXNlRWZmZWN0KCkuXCJcbiAgICAgICAgKTtcbiAgICAgIGFyZ3MgPSByZXF1ZXN0VXBkYXRlTGFuZShmaWJlcik7XG4gICAgICBkaXNwYXRjaFNldFN0YXRlSW50ZXJuYWwoZmliZXIsIHF1ZXVlLCBhY3Rpb24sIGFyZ3MpICYmXG4gICAgICAgIHN0YXJ0VXBkYXRlVGltZXJCeUxhbmUoYXJncywgXCJzZXRTdGF0ZSgpXCIsIGZpYmVyKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGlzcGF0Y2hTZXRTdGF0ZUludGVybmFsKGZpYmVyLCBxdWV1ZSwgYWN0aW9uLCBsYW5lKSB7XG4gICAgICB2Y
15852XIgdXBkYXRlID0ge1xuICAgICAgICBsYW5lOiBsYW5lLFxuICAgICAgICByZXZlcnRMYW5lOiAwLFxuICAgICAgICBnZXN0dXJlOiBudWxsLFxuICAgICAgICBhY3Rpb246IGFjdGlvbixcbiAgICAgICAgaGFzRWFnZXJTdGF0ZTogITEsXG4gICAgICAgIGVhZ2VyU3RhdGU6IG51bGwsXG4gICAgICAgIG5leHQ6IG51bGxcbiAgICAgIH07XG4gICAgICBpZiAoaXNSZW5kZXJQaGFzZVVwZGF0ZShmaWJlcikpIGVucXVldWVSZW5kZXJQaGFzZVVwZGF0ZShxdWV1ZSwgdXBkYXRlKTtcbiAgICAgIGVsc2Uge1xuICAgICAgICB2YXIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgMCA9PT0gZmliZXIubGFuZXMgJiZcbiAgICAgICAgICAobnVsbCA9PT0gYWx0ZXJuYXRlIHx8IDAgPT09IGFsdGVybmF0ZS5sYW5lcykgJiZcbiAgICAgICAgICAoKGFsdGVybmF0ZSA9IHF1ZXVlLmxhc3RSZW5kZXJlZFJlZHVjZXIpLCBudWxsICE9PSBhbHRlcm5hdGUpXG4gICAgICAgICkge1xuICAgICAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLkg7XG4gICAgICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuSCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudFN0YXRlID0gcXVldWUubGFzdFJlbmRlcmVkU3RhdGUsXG4gICAgICAgICAgICAgIGVhZ2VyU3RhdGUgPSBhbHRlcm5hdGUoY3VycmVudFN0YXRlLCBhY3Rpb24pO1xuICAgICAgICAgICAgdXBkYXRlLmhhc0VhZ2VyU3RhdGUgPSAhMDtcbiAgICAgICAgICAgIHVwZGF0ZS5lYWdlclN0YXRlID0gZWFnZXJTdGF0ZTtcbiAgICAgICAgICAgIGlmIChvYmplY3RJcyhlYWdlclN0YXRlLCBjdXJyZW50U3RhdGUpKVxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIGVucXVldWVVcGRhdGUkMShmaWJlciwgcXVldWUsIHVwZGF0ZSwgMCksXG4gICAgICAgICAgICAgICAgbnVsbCA9PT0gd29ya0luUHJvZ3Jlc3NSb290ICYmXG4gICAgICAgICAgICAgICAgICBmaW5pc2hRdWV1ZWluZ0NvbmN1cnJlbnRVcGRhdGVzKCksXG4gICAgICAgICAgICAgICAgITFcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFjdGlvbiA9IGVucXVldWVDb25jdXJyZW50SG9va1VwZGF0ZShmaWJlciwgcXVldWUsIHVwZGF0ZSwgbGFuZSk7XG4gICAgICAgIGlmIChudWxsICE9PSBhY3Rpb24pXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihhY3Rpb24sIGZpYmVyLCBsYW5lKSxcbiAgICAgICAgICAgIGVudGFuZ2xlVHJhbnNpdGlvblVwZGF0ZShhY3Rpb24sIHF1ZXVlLCBsYW5lKSxcbiAgICAgICAgICAgICEwXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAhMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGlzcGF0Y2hPcHRpbWlzdGljU2V0U3RhdGUoXG4gICAgICBmaWJlcixcbiAgICAgIHRocm93SWZEdXJpbmdSZW5kZXIsXG4gICAgICBxdWV1ZSxcbiAgICAgIGFjdGlvblxuICAgICkge1xuICAgICAgbnVsbCA9PT0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuVCAmJlxuICAgICAgICAwID09PSBjdXJyZW50RW50YW5nbGVkTGFuZSAmJlxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiQW4gb3B0aW1pc3RpYyBzdGF0ZSB1cGRhdGUgb2NjdXJyZWQgb3V0c2lkZSBhIHRyYW5zaXRpb24gb3IgYWN0aW9uLiBUbyBmaXgsIG1vdmUgdGhlIHVwZGF0ZSB0byBhbiBhY3Rpb24sIG9yIHdyYXAgd2l0aCBzdGFydFRyYW5zaXRpb24uXCJcbiAgICAgICAgKTtcbiAgICAgIGFjdGlvbiA9IHtcbiAgICAgICAgbGFuZTogMixcbiAgICAgICAgcmV2ZXJ0TGFuZTogcmVxdWVzdFRyYW5zaXRpb25MYW5lKCksXG4gICAgICAgIGdlc3R1cmU6IG51bGwsXG4gICAgICAgIGFjdGlvbjogYWN0aW9uLFxuICAgICAgICBoYXNFYWdlclN0YXRlOiAhMSxcbiAgICAgICAgZWFnZXJTdGF0ZTogbnVsbCxcbiAgICAgICAgbmV4dDogbnVsbFxuICAgICAgfTtcbiAgICAgIGlmIChpc1JlbmRlclBoYXNlVXBkYXRlKGZpYmVyKSkge1xuICAgICAgICBpZiAodGhyb3dJZkR1cmluZ1JlbmRlcilcbiAgICAgICAgICB0aHJvdyBFcnJvcihcIkNhbm5vdCB1cGRhdGUgb3B0aW1pc3RpYyBzdGF0ZSB3aGlsZSByZW5kZXJpbmcuXCIpO1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiQ2Fubm90IGNhbGwgc3RhcnRUcmFuc2l0aW9uIHdoaWxlIHJlbmRlcmluZy5cIik7XG4gICAgICB9IGVsc2VcbiAgICAgICAgKHRocm93SWZEdXJpbmdSZW5kZXIgPSBlbnF1ZXVlQ29uY3VycmVudEhvb2tVcGRhdGUoXG4gICAgICAgICAgZmliZXIsXG4gICAgICAgICAgcXVldWUsXG4gICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgIDJcbiAgICAgICAgKSksXG4gICAgICAgICAgbnVsbCAhPT0gdGhyb3dJZkR1cmluZ1JlbmRlciAmJlxuICAgICAgICAgICAgKHN0YXJ0VXBkYXRlVGltZXJCeUxhbmUoMiwgXCJzZXRPcHRpbWlzdGljKClcIiwgZmliZXIpLFxuICAgICAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHRocm93SWZEdXJpbmdSZW5kZXIsIGZpYmVyLCAyKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzUmVuZGVyUGhhc2VVcGRhdGUoZmliZXIpIHtcbiAgICAgIHZhciBhbHRlcm5hdGUgPSBmaWJlci5hbHRlcm5hdGU7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBmaWJlciA9PT0gY3VycmVudGx5UmVuZGVyaW5nRmliZXIgfHxcbiAgICAgICAgKG51bGwgIT09IGFsdGVybmF0ZSAmJiBhbHRlcm5hdGUgPT09IGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyKVxuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZW5xdWV1ZVJlbmRlclBoYXNlVXBkYXRlKHF1ZXVlLCB1cGRhdGUpIHtcbiAgICAgIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGVEdXJpbmdUaGlzUGFzcyA9XG4gICAgICAgIGRpZFNjaGVkdWxlUmVuZGVyUGhhc2VVcGRhdGUgPSAhMDtcbiAgICAgIHZhciBwZW5kaW5nID0gcXVldWUucGVuZGluZztcbiAgICAgIG51bGwgPT09IHBlbmRpbmdcbiAgICAgICAgPyAodXBkYXRlLm5leHQgPSB1cGRhdGUpXG4gICAgICAgIDogKCh1cGRhdGUubmV4dCA9IHBlbmRpbmcubmV4dCksIChwZW5kaW5nLm5leHQgPSB1cGRhdGUpKTtcbiAgICAgIHF1ZXVlLnBlbmRpbmcgPSB1cGRhdGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGVudGFuZ2xlVHJhbnNpdGlvblVwZGF0ZShyb290LCBxdWV1ZSwgbGFuZSkge1xuICAgICAgaWYgKDAgIT09IChsYW5lICYgNDE5NDA0OCkpIHtcbiAgICAgICAgdmFyIHF1ZXVlTGFuZXMgPSBxdWV1ZS5sYW5lcztcbiAgICAgICAgcXVldWVMYW5lcyAmPSByb290LnBlbmRpbmdMYW5lcztcbiAgICAgICAgbGFuZSB8PSBxdWV1ZUxhbmVzO1xuICAgICAgICBxdWV1ZS5sYW5lcyA9IGxhbmU7XG4gICAgICAgIG1hcmtSb290RW50YW5nbGVkKHJvb3QsIGxhbmUpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB3YXJuT25JbnZhbGlkQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgICAgIGlmIChudWxsICE9PSBjYWxsYmFjayAmJiBcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBjYWxsYmFjaykge1xuICAgICAgICB2Y
15852XIga2V5ID0gU3RyaW5nKGNhbGxiYWNrKTtcbiAgICAgICAgZGlkV2Fybk9uSW52YWxpZENhbGxiYWNrLmhhcyhrZXkpIHx8XG4gICAgICAgICAgKGRpZFdhcm5PbkludmFsaWRDYWxsYmFjay5hZGQoa2V5KSxcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJFeHBlY3RlZCB0aGUgbGFzdCBvcHRpb25hbCBgY2FsbGJhY2tgIGFyZ3VtZW50IHRvIGJlIGEgZnVuY3Rpb24uIEluc3RlYWQgcmVjZWl2ZWQ6ICVzLlwiLFxuICAgICAgICAgICAgY2FsbGJhY2tcbiAgICAgICAgICApKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMoXG4gICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgIGN0b3IsXG4gICAgICBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsXG4gICAgICBuZXh0UHJvcHNcbiAgICApIHtcbiAgICAgIHZhciBwcmV2U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlLFxuICAgICAgICBwYXJ0aWFsU3RhdGUgPSBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMobmV4dFByb3BzLCBwcmV2U3RhdGUpO1xuICAgICAgaWYgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKCEwKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXJ0aWFsU3RhdGUgPSBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMobmV4dFByb3BzLCBwcmV2U3RhdGUpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKCExKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdm9pZCAwID09PSBwYXJ0aWFsU3RhdGUgJiZcbiAgICAgICAgKChjdG9yID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8IFwiQ29tcG9uZW50XCIpLFxuICAgICAgICBkaWRXYXJuQWJvdXRVbmRlZmluZWREZXJpdmVkU3RhdGUuaGFzKGN0b3IpIHx8XG4gICAgICAgICAgKGRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZS5hZGQoY3RvciksXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiJXMuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKCk6IEEgdmFsaWQgc3RhdGUgb2JqZWN0IChvciBudWxsKSBtdXN0IGJlIHJldHVybmVkLiBZb3UgaGF2ZSByZXR1cm5lZCB1bmRlZmluZWQuXCIsXG4gICAgICAgICAgICBjdG9yXG4gICAgICAgICAgKSkpO1xuICAgICAgcHJldlN0YXRlID1cbiAgICAgICAgbnVsbCA9PT0gcGFydGlhbFN0YXRlIHx8IHZvaWQgMCA9PT0gcGFydGlhbFN0YXRlXG4gICAgICAgICAgPyBwcmV2U3RhdGVcbiAgICAgICAgICA6IGFzc2lnbih7fSwgcHJldlN0YXRlLCBwYXJ0aWFsU3RhdGUpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHByZXZTdGF0ZTtcbiAgICAgIDAgPT09IHdvcmtJblByb2dyZXNzLmxhbmVzICYmXG4gICAgICAgICh3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZS5iYXNlU3RhdGUgPSBwcmV2U3RhdGUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja1Nob3VsZENvbXBvbmVudFVwZGF0ZShcbiAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgY3RvcixcbiAgICAgIG9sZFByb3BzLFxuICAgICAgbmV3UHJvcHMsXG4gICAgICBvbGRTdGF0ZSxcbiAgICAgIG5ld1N0YXRlLFxuICAgICAgbmV4dENvbnRleHRcbiAgICApIHtcbiAgICAgIHZhciBpbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUpIHtcbiAgICAgICAgb2xkUHJvcHMgPSBpbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUoXG4gICAgICAgICAgbmV3UHJvcHMsXG4gICAgICAgICAgbmV3U3RhdGUsXG4gICAgICAgICAgbmV4dENvbnRleHRcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlKSB7XG4gICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoITApO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBvbGRQcm9wcyA9IGluc3RhbmNlLnNob3VsZENvbXBvbmVudFVwZGF0ZShcbiAgICAgICAgICAgICAgbmV3UHJvcHMsXG4gICAgICAgICAgICAgIG5ld1N0YXRlLFxuICAgICAgICAgICAgICBuZXh0Q29udGV4dFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoITEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2b2lkIDAgPT09IG9sZFByb3BzICYmXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiJXMuc2hvdWxkQ29tcG9uZW50VXBkYXRlKCk6IFJldHVybmVkIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIGEgYm9vbGVhbiB2YWx1ZS4gTWFrZSBzdXJlIHRvIHJldHVybiB0cnVlIG9yIGZhbHNlLlwiLFxuICAgICAgICAgICAgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGN0b3IpIHx8IFwiQ29tcG9uZW50XCJcbiAgICAgICAgICApO1xuICAgICAgICByZXR1cm4gb2xkUHJvcHM7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3Rvci5wcm90b3R5cGUgJiYgY3Rvci5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnRcbiAgICAgICAgPyAhc2hhbGxvd0VxdWFsKG9sZFByb3BzLCBuZXdQcm9wcykgfHwgIXNoYWxsb3dFcXVhbChvbGRTdGF0ZSwgbmV3U3RhdGUpXG4gICAgICAgIDogITA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbGxDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKFxuICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIG5ld1Byb3BzLFxuICAgICAgbmV4dENvbnRleHRcbiAgICApIHtcbiAgICAgIHZhciBvbGRTdGF0ZSA9IGluc3RhbmNlLnN0YXRlO1xuICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyAmJlxuICAgICAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5ld1Byb3BzLCBuZXh0Q29udGV4dCk7XG4gICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyAmJlxuICAgICAgICBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXdQcm9wcywgbmV4dENvbnRleHQpO1xuICAgICAgaW5zdGFuY2Uuc3RhdGUgIT09IG9sZFN0YXRlICYmXG4gICAgICAgICgod29ya0luUHJvZ3Jlc3MgPVxuICAgICAgICAgIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8IFwiQ29tcG9uZW50XCIpLFxuICAgICAgICBkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQuaGFzKHdvcmtJblByb2dyZXNzKSB8fFxuICAgICAgICAgIChkaWRXYXJuQWJvdXRTdGF0ZUFzc2lnbm1lbnRGb3JDb21wb25lbnQuYWRkKHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCIlcy5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCk6IEFzc2lnbmluZyBkaXJlY3RseSB0byB0aGlzLnN0YXRlIGlzIGRlcHJlY2F0ZWQgKGV4Y2VwdCBpbnNpZGUgYSBjb21wb25lbnQncyBjb25zdHJ1Y3RvcikuIFVzZSBzZXRTdGF0ZSBpbnN0ZWFkLlwiLFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NcbiAgICAgICAgICApKSxcbiAgICAgICAgY2xhc3NDb21wb25lbnRVcGRhdGVyLmVucXVldWVSZXBsYWNlU3RhdGUoXG4gICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgaW5zdGFuY2Uuc3RhdGUsXG4gICAgICAgICAgbnVsbFxuICAgICAgICApKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVzb2x2ZUNsYXNzQ29tcG9uZW50UHJvcHMoQ29tcG9uZW50LCBiYXNlUHJvcHMpIHtcbiAgICAgIHZhciBuZXdQcm9wcyA9IGJhc2VQcm9wcztcbiAgICAgIGlmIChcInJlZlwiIGluIGJhc2VQcm9wcykge1xuICAgICAgICBuZXdQcm9wcyA9IHt9O1xuICAgICAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBiYXNlUHJvcHMpXG4gICAgICAgICAgXCJyZWZcIiAhPT0gcHJvcE5hbWUgJiYgKG5ld1Byb3BzW3Byb3BOYW1lXSA9IGJhc2VQcm9wc1twcm9wTmFtZV0pO1xuICAgICAgfVxuICAgICAgaWYgKChDb21wb25lbnQgPSBDb21wb25lbnQuZGVmYXVsdFByb3BzKSkge1xuICAgICAgICBuZXdQcm9wcyA9PT0gYmFzZVByb3BzICYmIChuZXdQcm9wcyA9IGFzc2lnbih7fSwgbmV3UHJvcHMpKTtcbiAgICAgICAgZm9yICh2YXIgX3Byb3BOYW1lIGluIENvbXBvbmVudClcbiAgICAgICAgICB2b2lkIDAgPT09IG5ld1Byb3BzW19wcm9wTmFtZV0gJiZcbiAgICAgICAgICAgIChuZXdQcm9wc1tfcHJvcE5hbWVdID0gQ29tcG9uZW50W19wcm9wTmFtZV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ld1Byb3BzO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWZh
15852dWx0T25VbmNhdWdodEVycm9yKGVycm9yKSB7XG4gICAgICByZXBvcnRHbG9iYWxFcnJvcihlcnJvcik7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiJXNcXG5cXG4lc1xcblwiLFxuICAgICAgICBjb21wb25lbnROYW1lXG4gICAgICAgICAgPyBcIkFuIGVycm9yIG9jY3VycmVkIGluIHRoZSA8XCIgKyBjb21wb25lbnROYW1lICsgXCI+IGNvbXBvbmVudC5cIlxuICAgICAgICAgIDogXCJBbiBlcnJvciBvY2N1cnJlZCBpbiBvbmUgb2YgeW91ciBSZWFjdCBjb21wb25lbnRzLlwiLFxuICAgICAgICBcIkNvbnNpZGVyIGFkZGluZyBhbiBlcnJvciBib3VuZGFyeSB0byB5b3VyIHRyZWUgdG8gY3VzdG9taXplIGVycm9yIGhhbmRsaW5nIGJlaGF2aW9yLlxcblZpc2l0IGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvZXJyb3ItYm91bmRhcmllcyB0byBsZWFybiBtb3JlIGFib3V0IGVycm9yIGJvdW5kYXJpZXMuXCJcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlZmF1bHRPbkNhdWdodEVycm9yKGVycm9yKSB7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZU1lc3NhZ2UgPSBjb21wb25lbnROYW1lXG4gICAgICAgICAgPyBcIlRoZSBhYm92ZSBlcnJvciBvY2N1cnJlZCBpbiB0aGUgPFwiICsgY29tcG9uZW50TmFtZSArIFwiPiBjb21wb25lbnQuXCJcbiAgICAgICAgICA6IFwiVGhlIGFib3ZlIGVycm9yIG9jY3VycmVkIGluIG9uZSBvZiB5b3VyIFJlYWN0IGNvbXBvbmVudHMuXCIsXG4gICAgICAgIHJlY3JlYXRlTWVzc2FnZSA9XG4gICAgICAgICAgXCJSZWFjdCB3aWxsIHRyeSB0byByZWNyZWF0ZSB0aGlzIGNvbXBvbmVudCB0cmVlIGZyb20gc2NyYXRjaCB1c2luZyB0aGUgZXJyb3IgYm91bmRhcnkgeW91IHByb3ZpZGVkLCBcIiArXG4gICAgICAgICAgKChlcnJvckJvdW5kYXJ5TmFtZSB8fCBcIkFub255bW91c1wiKSArIFwiLlwiKTtcbiAgICAgIGlmIChcbiAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIGVycm9yICYmXG4gICAgICAgIG51bGwgIT09IGVycm9yICYmXG4gICAgICAgIFwic3RyaW5nXCIgPT09IHR5cGVvZiBlcnJvci5lbnZpcm9ubWVudE5hbWVcbiAgICAgICkge1xuICAgICAgICB2Y
15852XIgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ID0gZXJyb3IuZW52aXJvbm1lbnROYW1lO1xuICAgICAgICBlcnJvciA9IFtcbiAgICAgICAgICBcIiVvXFxuXFxuJXNcXG5cXG4lc1xcblwiLFxuICAgICAgICAgIGVycm9yLFxuICAgICAgICAgIGNvbXBvbmVudE5hbWVNZXNzYWdlLFxuICAgICAgICAgIHJlY3JlYXRlTWVzc2FnZVxuICAgICAgICBdLnNsaWNlKDApO1xuICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2YgZXJyb3JbMF1cbiAgICAgICAgICA/IGVycm9yLnNwbGljZShcbiAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgMSxcbiAgICAgICAgICAgICAgYmFkZ2VGb3JtYXQgKyBcIiBcIiArIGVycm9yWzBdLFxuICAgICAgICAgICAgICBiYWRnZVN0eWxlLFxuICAgICAgICAgICAgICBwYWQgKyBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgKyBwYWQsXG4gICAgICAgICAgICAgIHJlc2V0U3R5bGVcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IGVycm9yLnNwbGljZShcbiAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgYmFkZ2VGb3JtYXQsXG4gICAgICAgICAgICAgIGJhZGdlU3R5bGUsXG4gICAgICAgICAgICAgIHBhZCArIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCArIHBhZCxcbiAgICAgICAgICAgICAgcmVzZXRTdHlsZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgZXJyb3IudW5zaGlmdChjb25zb2xlKTtcbiAgICAgICAgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ID0gYmluZC5hcHBseShjb25zb2xlLmVycm9yLCBlcnJvcik7XG4gICAgICAgIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCgpO1xuICAgICAgfSBlbHNlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCIlb1xcblxcbiVzXFxuXFxuJXNcXG5cIixcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgICBjb21wb25lbnROYW1lTWVzc2FnZSxcbiAgICAgICAgICByZWNyZWF0ZU1lc3NhZ2VcbiAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVmYXVsdE9uUmVjb3ZlcmFibGVFcnJvcihlcnJvcikge1xuICAgICAgcmVwb3J0R2xvYmFsRXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBsb2dVbmNhdWdodEVycm9yKHJvb3QsIGVycm9ySW5mbykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29tcG9uZW50TmFtZSA9IGVycm9ySW5mby5zb3VyY2VcbiAgICAgICAgICA/IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZXJyb3JJbmZvLnNvdXJjZSlcbiAgICAgICAgICA6IG51bGw7XG4gICAgICAgIGVycm9yQm91bmRhcnlOYW1lID0gbnVsbDtcbiAgICAgICAgdmFyIGVycm9yID0gZXJyb3JJbmZvLnZhbHVlO1xuICAgICAgICBpZiAobnVsbCAhPT0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuYWN0UXVldWUpXG4gICAgICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMudGhyb3duRXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB2Y
15852XIgb25VbmNhdWdodEVycm9yID0gcm9vdC5vblVuY2F1Z2h0RXJyb3I7XG4gICAgICAgICAgb25VbmNhdWdodEVycm9yKGVycm9yLCB7IGNvbXBvbmVudFN0YWNrOiBlcnJvckluZm8uc3RhY2sgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUkNikge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB0aHJvdyBlJDY7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBsb2dDYXVnaHRFcnJvcihyb290LCBib3VuZGFyeSwgZXJyb3JJbmZvKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb21wb25lbnROYW1lID0gZXJyb3JJbmZvLnNvdXJjZVxuICAgICAgICAgID8gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihlcnJvckluZm8uc291cmNlKVxuICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgZXJyb3JCb3VuZGFyeU5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGJvdW5kYXJ5KTtcbiAgICAgICAgdmFyIG9uQ2F1Z2h0RXJyb3IgPSByb290Lm9uQ2F1Z2h0RXJyb3I7XG4gICAgICAgIG9uQ2F1Z2h0RXJyb3IoZXJyb3JJbmZvLnZhbHVlLCB7XG4gICAgICAgICAgY29tcG9uZW50U3RhY2s6IGVycm9ySW5mby5zdGFjayxcbiAgICAgICAgICBlcnJvckJvdW5kYXJ5OiAxID09PSBib3VuZGFyeS50YWcgPyBib3VuZGFyeS5zdGF0ZU5vZGUgOiBudWxsXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZSQ3KSB7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRocm93IGUkNztcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZVJvb3RFcnJvclVwZGF0ZShyb290LCBlcnJvckluZm8sIGxhbmUpIHtcbiAgICAgIGxhbmUgPSBjcmVhdGVVcGRhdGUobGFuZSk7XG4gICAgICBsYW5lLnRhZyA9IENhcHR1cmVVcGRhdGU7XG4gICAgICBsYW5lLnBheWxvYWQgPSB7IGVsZW1lbnQ6IG51bGwgfTtcbiAgICAgIGxhbmUuY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJ1bldpdGhGaWJlckluREVWKGVycm9ySW5mby5zb3VyY2UsIGxvZ1VuY2F1Z2h0RXJyb3IsIHJvb3QsIGVycm9ySW5mbyk7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIGxhbmU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZUNsYXNzRXJyb3JVcGRhdGUobGFuZSkge1xuICAgICAgbGFuZSA9IGNyZWF0ZVVwZGF0ZShsYW5lKTtcbiAgICAgIGxhbmUudGFnID0gQ2FwdHVyZVVwZGF0ZTtcbiAgICAgIHJldHVybiBsYW5lO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpbml0aWFsaXplQ2xhc3NFcnJvclVwZGF0ZSh1cGRhdGUsIHJvb3QsIGZpYmVyLCBlcnJvckluZm8pIHtcbiAgICAgIHZhciBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgPSBmaWJlci50eXBlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcjtcbiAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IpIHtcbiAgICAgICAgdmFyIGVycm9yID0gZXJyb3JJbmZvLnZhbHVlO1xuICAgICAgICB1cGRhdGUucGF5bG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKGVycm9yKTtcbiAgICAgICAgfTtcbiAgICAgICAgdXBkYXRlLmNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIG1hcmtGYWlsZWRFcnJvckJvdW5kYXJ5Rm9ySG90UmVsb2FkaW5nKGZpYmVyKTtcbiAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgIGVycm9ySW5mby5zb3VyY2UsXG4gICAgICAgICAgICBsb2dDYXVnaHRFcnJvcixcbiAgICAgICAgICAgIHJvb3QsXG4gICAgICAgICAgICBmaWJlcixcbiAgICAgICAgICAgIGVycm9ySW5mb1xuICAgICAgICAgICk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB2Y
15852XIgaW5zdCA9IGZpYmVyLnN0YXRlTm9kZTtcbiAgICAgIG51bGwgIT09IGluc3QgJiZcbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgaW5zdC5jb21wb25lbnREaWRDYXRjaCAmJlxuICAgICAgICAodXBkYXRlLmNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIG1hcmtGYWlsZWRFcnJvckJvdW5kYXJ5Rm9ySG90UmVsb2FkaW5nKGZpYmVyKTtcbiAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgIGVycm9ySW5mby5zb3VyY2UsXG4gICAgICAgICAgICBsb2dDYXVnaHRFcnJvcixcbiAgICAgICAgICAgIHJvb3QsXG4gICAgICAgICAgICBmaWJlcixcbiAgICAgICAgICAgIGVycm9ySW5mb1xuICAgICAgICAgICk7XG4gICAgICAgICAgXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yICYmXG4gICAgICAgICAgICAobnVsbCA9PT0gbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWRcbiAgICAgICAgICAgICAgPyAobGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBuZXcgU2V0KFt0aGlzXSkpXG4gICAgICAgICAgICAgIDogbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQuYWRkKHRoaXMpKTtcbiAgICAgICAgICBjYWxsQ29tcG9uZW50RGlkQ2F0Y2hJbkRFVih0aGlzLCBlcnJvckluZm8pO1xuICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvciB8fFxuICAgICAgICAgICAgKDAgPT09IChmaWJlci5sYW5lcyAmIDIpICYmXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgXCIlczogRXJyb3IgYm91bmRhcmllcyBzaG91bGQgaW1wbGVtZW50IGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcigpLiBJbiB0aGF0IG1ldGhvZCwgcmV0dXJuIGEgc3RhdGUgdXBkYXRlIHRvIGRpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSBvciBmYWxsYmFjayBVSS5cIixcbiAgICAgICAgICAgICAgICBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCBcIlVua25vd25cIlxuICAgICAgICAgICAgICApKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93RXhjZXB0aW9uKFxuICAgICAgcm9vdCxcbiAgICAgIHJldHVybkZpYmVyLFxuICAgICAgc291cmNlRmliZXIsXG4gICAgICB2YWx1ZSxcbiAgICAgIHJvb3RSZW5kZXJMYW5lc1xuICAgICkge1xuICAgICAgc291cmNlRmliZXIuZmxhZ3MgfD0gMzI3Njg7XG4gICAgICBpc0RldlRvb2xzUHJlc2VudCAmJiByZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKHJvb3QsIHJvb3RSZW5kZXJMYW5lcyk7XG4gICAgICBpZiAoXG4gICAgICAgIG51bGwgIT09IHZhbHVlICYmXG4gICAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiB2YWx1ZSAmJlxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiB2YWx1ZS50aGVuXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuRmliZXIgPSBzb3VyY2VGaWJlci5hbHRlcm5hdGU7XG4gICAgICAgIG51bGwgIT09IHJldHVybkZpYmVyICYmXG4gICAgICAgICAgcHJvcGFnYXRlUGFyZW50Q29udGV4dENoYW5nZXMoXG4gICAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICAgIHNvdXJjZUZpYmVyLFxuICAgICAgICAgICAgcm9vdFJlbmRlckxhbmVzLFxuICAgICAgICAgICAgITBcbiAgICAgICAgICApO1xuICAgICAgICBpc0h5ZHJhdGluZyAmJiAoZGlkU3VzcGVuZE9yRXJyb3JERVYgPSAhMCk7XG4gICAgICAgIHNvdXJjZUZpYmVyID0gc3VzcGVuc2VIYW5kbGVyU3RhY2tDdXJzb3IuY3VycmVudDtcbiAgICAgICAgaWYgKG51bGwgIT09IHNvdXJjZUZpYmVyKSB7XG4gICAgICAgICAgc3dpdGNoIChzb3VyY2VGaWJlci50YWcpIHtcbiAgICAgICAgICAgIGNhc2UgMzE6XG4gICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBudWxsID09PSBzaGVsbEJvdW5kYXJ5XG4gICAgICAgICAgICAgICAgICA/IHJlbmRlckRpZFN1c3BlbmREZWxheUlmUG9zc2libGUoKVxuICAgICAgICAgICAgICAgICAgOiBudWxsID09PSBzb3VyY2VGaWJlci5hbHRlcm5hdGUgJiZcbiAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdEluUHJvZ3Jlc3MgJiZcbiAgICAgICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290U3VzcGVuZGVkKSxcbiAgICAgICAgICAgICAgICAoc291cmNlRmliZXIuZmxhZ3MgJj0gLTI1NyksXG4gICAgICAgICAgICAgICAgKHNvdXJjZUZpYmVyLmZsYWdzIHw9IDY1NTM2KSxcbiAgICAgICAgICAgICAgICAoc291cmNlRmliZXIubGFuZXMgPSByb290UmVuZGVyTGFuZXMpLFxuICAgICAgICAgICAgICAgIHZhbHVlID09PSBub29wU3VzcGVuc2V5Q29tbWl0VGhlbmFibGVcbiAgICAgICAgICAgICAgICAgID8gKHNvdXJjZUZpYmVyLmZsYWdzIHw9IDE2Mzg0KVxuICAgICAgICAgICAgICAgICAgOiAoKHJldHVybkZpYmVyID0gc291cmNlRmliZXIudXBkYXRlUXVldWUpLFxuICAgICAgICAgICAgICAgICAgICBudWxsID09PSByZXR1cm5GaWJlclxuICAgICAgICAgICAgICAgICAgICAgID8gKHNvdXJjZUZpYmVyLnVwZGF0ZVF1ZXVlID0gbmV3IFNldChbdmFsdWVdKSlcbiAgICAgICAgICAgICAgICAgICAgICA6IHJldHVybkZpYmVyLmFkZCh2YWx1ZSksXG4gICAgICAgICAgICAgICAgICAgIGF0dGFjaFBpbmdMaXN0ZW5lcihyb290LCB2YWx1ZSwgcm9vdFJlbmRlckxhbmVzKSksXG4gICAgICAgICAgICAgICAgITFcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgKHNvdXJjZUZpYmVyLmZsYWdzIHw9IDY1NTM2KSxcbiAgICAgICAgICAgICAgICB2YWx1ZSA9PT0gbm9vcFN1c3BlbnNleUNvbW1pdFRoZW5hYmxlXG4gICAgICAgICAgICAgICAgICA/IChzb3VyY2VGaWJlci5mbGFncyB8PSAxNjM4NClcbiAgICAgICAgICAgICAgICAgIDogKChyZXR1cm5GaWJlciA9IHNvdXJjZUZpYmVyLnVwZGF0ZVF1ZXVlKSxcbiAgICAgICAgICAgICAgICAgICAgbnVsbCA9PT0gcmV0dXJuRmliZXJcbiAgICAgICAgICAgICAgICAgICAgICA/ICgocmV0dXJuRmliZXIgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgI
15852HRyYW5zaXRpb25zOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJJbnN0YW5jZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHJ5UXVldWU6IG5ldyBTZXQoW3ZhbHVlXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgKHNvdXJjZUZpYmVyLnVwZGF0ZVF1ZXVlID0gcmV0dXJuRmliZXIpKVxuICAgICAgICAgICAgICAgICAgICAgIDogKChzb3VyY2VGaWJlciA9IHJldHVybkZpYmVyLnJldHJ5UXVldWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCA9PT0gc291cmNlRmliZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyAocmV0dXJuRmliZXIucmV0cnlRdWV1ZSA9IG5ldyBTZXQoW3ZhbHVlXSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogc291cmNlRmliZXIuYWRkKHZhbHVlKSksXG4gICAgICAgICAgICAgICAgICAgIGF0dGFjaFBpbmdMaXN0ZW5lcihyb290LCB2YWx1ZSwgcm9vdFJlbmRlckxhbmVzKSksXG4gICAgICAgICAgICAgICAgITFcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICBcIlVuZXhwZWN0ZWQgU3VzcGVuc2UgaGFuZGxlciB0YWcgKFwiICtcbiAgICAgICAgICAgICAgc291cmNlRmliZXIudGFnICtcbiAgICAgICAgICAgICAgXCIpLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LlwiXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBhdHRhY2hQaW5nTGlzdGVuZXIocm9vdCwgdmFsdWUsIHJvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgIHJlbmRlckRpZFN1c3BlbmREZWxheUlmUG9zc2libGUoKTtcbiAgICAgICAgcmV0dXJuICExO1xuICAgICAgfVxuICAgICAgaWYgKGlzSHlkcmF0aW5nKVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIChkaWRTdXNwZW5kT3JFcnJvckRFViA9ICEwKSxcbiAgICAgICAgICAocmV0dXJuRmliZXIgPSBzdXNwZW5zZUhhbmRsZXJTdGFja0N1cnNvci5jdXJyZW50KSxcbiAgICAgICAgICBudWxsICE9PSByZXR1cm5GaWJlclxuICAgICAgICAgICAgPyAoMTkgPT09IHJldHVybkZpYmVyLnRhZyAmJlxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICBcIlN1c3BlbnNlTGlzdCBzaG91bGQgbmV2ZXIgY2F0Y2ggd2hpbGUgaHlkcmF0aW5nLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LlwiXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgMCA9PT0gKHJldHVybkZpYmVyLmZsYWdzICYgNjU1MzYpICYmIChyZXR1cm5GaWJlci5mbGFncyB8PSAyNTYpLFxuICAgICAgICAgICAgICAocmV0dXJuRmliZXIuZmxhZ3MgfD0gNjU1MzYpLFxuICAgICAgICAgICAgICAocmV0dXJuRmliZXIubGFuZXMgPSByb290UmVuZGVyTGFuZXMpLFxuICAgICAgICAgICAgICB2YWx1ZSAhPT0gSHlkcmF0aW9uTWlzbWF0Y2hFeGNlcHRpb24gJiZcbiAgICAgICAgICAgICAgICBxdWV1ZUh5ZHJhdGlvbkVycm9yKFxuICAgICAgICAgICAgICAgICAgY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIoXG4gICAgICAgICAgICAgICAgICAgIEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgIFwiVGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGh5ZHJhdGluZyBidXQgUmVhY3Qgd2FzIGFibGUgdG8gcmVjb3ZlciBieSBpbnN0ZWFkIGNsaWVudCByZW5kZXJpbmcgZnJvbSB0aGUgbmVhcmVzdCBTdXNwZW5zZSBib3VuZGFyeS5cIixcbiAgICAgICAgICAgICAgICAgICAgICB7IGNhdXNlOiB2YWx1ZSB9XG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpYmVyXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgIDogKHZhbHVlICE9PSBIeWRyYXRpb25NaXNtYXRjaEV4Y2VwdGlvbiAmJlxuICAgICAgICAgICAgICAgIHF1ZXVlSHlkcmF0aW9uRXJyb3IoXG4gICAgICAgICAgICAgICAgICBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcihcbiAgICAgICAgICAgICAgICAgICAgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgXCJUaGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgaHlkcmF0aW5nIGJ1dCBSZWFjdCB3YXMgYWJsZSB0byByZWNvdmVyIGJ5IGluc3RlYWQgY2xpZW50IHJlbmRlcmluZyB0aGUgZW50aXJlIHJvb3QuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgeyBjYXVzZTogdmFsdWUgfVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VGaWJlclxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIChyb290ID0gcm9vdC5jdXJyZW50LmFsdGVybmF0ZSksXG4gICAgICAgICAgICAgIChyb290LmZsYWdzIHw9IDY1NTM2KSxcbiAgICAgICAgICAgICAgKHJvb3RSZW5kZXJMYW5lcyAmPSAtcm9vdFJlbmRlckxhbmVzKSxcbiAgICAgICAgICAgICAgKHJvb3QubGFuZXMgfD0gcm9vdFJlbmRlckxhbmVzKSxcbiAgICAgICAgICAgICAgKHZhbHVlID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIodmFsdWUsIHNvdXJjZUZpYmVyKSksXG4gICAgICAgICAgICAgIChyb290UmVuZGVyTGFuZXMgPSBjcmVhdGVSb290RXJyb3JVcGRhdGUoXG4gICAgICAgICAgICAgICAgcm9vdC5zdGF0ZU5vZGUsXG4gICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgcm9vdFJlbmRlckxhbmVzXG4gICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICBlbnF1ZXVlQ2FwdHVyZWRVcGRhdGUocm9vdCwgcm9vdFJlbmRlckxhbmVzKSxcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyAhPT0gUm9vdFN1c3BlbmRlZFdpdGhEZWxheSAmJlxuICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdEVycm9yZWQpKSxcbiAgICAgICAgICAhMVxuICAgICAgICApO1xuICAgICAgdmFyIGVycm9yID0gY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIoXG4gICAgICAgIEVycm9yKFxuICAgICAgICAgIFwiVGhlcmUgd2FzIGFuIGVycm9yIGR1cmluZyBjb25jdXJyZW50IHJlbmRlcmluZyBidXQgUmVhY3Qgd2FzIGFibGUgdG8gcmVjb3ZlciBieSBpbnN0ZWFkIHN5bmNocm9ub3VzbHkgcmVuZGVyaW5nIHRoZSBlbnRpcmUgcm9vdC5cIixcbiAgICAgICAgICB7IGNhdXNlOiB2YWx1ZSB9XG4gICAgICAgICksXG4gICAgICAgI
15852HNvdXJjZUZpYmVyXG4gICAgICApO1xuICAgICAgbnVsbCA9PT0gd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9yc1xuICAgICAgICA/ICh3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzID0gW2Vycm9yXSlcbiAgICAgICAgOiB3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyAhPT0gUm9vdFN1c3BlbmRlZFdpdGhEZWxheSAmJlxuICAgICAgICAod29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RFcnJvcmVkKTtcbiAgICAgIGlmIChudWxsID09PSByZXR1cm5GaWJlcikgcmV0dXJuICEwO1xuICAgICAgdmFsdWUgPSBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcih2YWx1ZSwgc291cmNlRmliZXIpO1xuICAgICAgc291cmNlRmliZXIgPSByZXR1cm5GaWJlcjtcbiAgICAgIGRvIHtcbiAgICAgICAgc3dpdGNoIChzb3VyY2VGaWJlci50YWcpIHtcbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAoc291cmNlRmliZXIuZmxhZ3MgfD0gNjU1MzYpLFxuICAgICAgICAgICAgICAocm9vdCA9IHJvb3RSZW5kZXJMYW5lcyAmIC1yb290UmVuZGVyTGFuZXMpLFxuICAgICAgICAgICAgICAoc291cmNlRmliZXIubGFuZXMgfD0gcm9vdCksXG4gICAgICAgICAgICAgIChyb290ID0gY3JlYXRlUm9vdEVycm9yVXBkYXRlKFxuICAgICAgICAgICAgICAgIHNvdXJjZUZpYmVyLnN0YXRlTm9kZSxcbiAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICByb290XG4gICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICBlbnF1ZXVlQ2FwdHVyZWRVcGRhdGUoc291cmNlRmliZXIsIHJvb3QpLFxuICAgICAgICAgICAgICAhMVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICByZXR1cm5GaWJlciA9IHNvdXJjZUZpYmVyLnR5cGU7XG4gICAgICAgICAgICBlcnJvciA9IHNvdXJjZUZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgMCA9PT0gKHNvdXJjZUZpYmVyLmZsYWdzICYgMTI4KSAmJlxuICAgICAgICAgICAgICAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgcmV0dXJuRmliZXIuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIHx8XG4gICAgICAgICAgICAgICAgKG51bGwgIT09IGVycm9yICYmXG4gICAgICAgICAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBlcnJvci5jb21wb25lbnREaWRDYXRjaCAmJlxuICAgICAgICAgICAgICAgICAgKG51bGwgPT09IGxlZ2FjeUVycm9yQm91bmRhcmllc1RoYXRBbHJlYWR5RmFpbGVkIHx8XG4gICAgICAgICAgICAgICAgICAgICFsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZC5oYXMoZXJyb3IpKSkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgKHNvdXJjZUZpYmVyLmZsYWdzIHw9IDY1NTM2KSxcbiAgICAgICAgICAgICAgICAocm9vdFJlbmRlckxhbmVzICY9IC1yb290UmVuZGVyTGFuZXMpLFxuICAgICAgICAgICAgICAgIChzb3VyY2VGaWJlci5sYW5lcyB8PSByb290UmVuZGVyTGFuZXMpLFxuICAgICAgICAgICAgICAgIChyb290UmVuZGVyTGFuZXMgPSBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKHJvb3RSZW5kZXJMYW5lcykpLFxuICAgICAgICAgICAgICAgIGluaXRpYWxpemVDbGFzc0Vycm9yVXBkYXRlKFxuICAgICAgICAgICAgICAgICAgcm9vdFJlbmRlckxhbmVzLFxuICAgICAgICAgICAgICAgICAgcm9vdCxcbiAgICAgICAgICAgICAgICAgIHNvdXJjZUZpYmVyLFxuICAgICAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGVucXVldWVDYXB0dXJlZFVwZGF0ZShzb3VyY2VGaWJlciwgcm9vdFJlbmRlckxhbmVzKSxcbiAgICAgICAgICAgICAgICAhMVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICAgIGlmIChudWxsICE9PSBzb3VyY2VGaWJlci5tZW1vaXplZFN0YXRlKVxuICAgICAgICAgICAgICByZXR1cm4gKHNvdXJjZUZpYmVyLmZsYWdzIHw9IDY1NTM2KSwgITE7XG4gICAgICAgIH1cbiAgICAgICAgc291cmNlRmliZXIgPSBzb3VyY2VGaWJlci5yZXR1cm47XG4gICAgICB9IHdoaWxlIChudWxsICE9PSBzb3VyY2VGaWJlcik7XG4gICAgICByZXR1cm4gITE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlY29uY2lsZUNoaWxkcmVuKFxuICAgICAgY3VycmVudCxcbiAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgbmV4dENoaWxkcmVuLFxuICAgICAgcmVuZGVyTGFuZXNcbiAgICApIHtcbiAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID1cbiAgICAgICAgbnVsbCA9PT0gY3VycmVudFxuICAgICAgICAgID8gbW91bnRDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgbnVsbCwgbmV4dENoaWxkcmVuLCByZW5kZXJMYW5lcylcbiAgICAgICAgICA6IHJlY29uY2lsZUNoaWxkRmliZXJzKFxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgY3VycmVudC5jaGlsZCxcbiAgICAgICAgICAgICAgbmV4dENoaWxkcmVuLFxuICAgICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlRm9yd2FyZFJlZihcbiAgICAgIGN1cnJlbnQsXG4gICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgIENvbXBvbmVudCxcbiAgICAgIG5leHRQcm9wcyxcbiAgICAgIHJlbmRlckxhbmVzXG4gICAgKSB7XG4gICAgICBDb21wb25lbnQgPSBDb21wb25lbnQucmVuZGVyO1xuICAgICAgdmFyIHJlc29sdmVkUmVuZGVyID0gcmVzb2x2ZVR5cGVGb3JIb3RSZWxvYWRpbmcoQ29tcG9uZW50KTtcbiAgICAgIHJlc29sdmVkUmVuZGVyICE9PSBDb21wb25lbnQgJiZcbiAgICAgICAgKChDb21wb25lbnQgPSByZXNvbHZlZFJlbmRlciksXG4gICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiYgKGRpZFJlY2VpdmVVcGRhdGUgPSAhMCkpO1xuICAgICAgcmVzb2x2ZWRSZW5kZXIgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7XG4gICAgICBpZiAoXCJyZWZcIiBpbiBuZXh0UHJvcHMpIHtcbiAgICAgICAgdmFyIHByb3BzV2l0aG91dFJlZiA9IHt9O1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gbmV4dFByb3BzKVxuICAgICAgICAgIFwicmVmXCIgIT09IGtleSAmJiAocHJvcHNXaXRob3V0UmVmW2tleV0gPSBuZXh0UHJvcHNba2V5XSk7XG4gICAgICB9IGVsc2UgcHJvcHNXaXRob3V0UmVmID0gbmV4dFByb3BzO1xuICAgICAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgbmV4dFByb3BzID0gcmVuZGVyV2l0aEhvb2tzKFxuICAgICAgICBjdXJyZW50LFxuICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgQ29tcG9uZW50LFxuICAgICAgICBwcm9wc1dpdGhvdXRSZWYsXG4gICAgICAgI
15852HJlc29sdmVkUmVuZGVyLFxuICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgKTtcbiAgICAgIGtleSA9IGNoZWNrRGlkUmVuZGVySWRIb29rKCk7XG4gICAgICBpZiAobnVsbCAhPT0gY3VycmVudCAmJiAhZGlkUmVjZWl2ZVVwZGF0ZSlcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBiYWlsb3V0SG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSxcbiAgICAgICAgICBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcylcbiAgICAgICAgKTtcbiAgICAgIGlzSHlkcmF0aW5nICYmIGtleSAmJiBwdXNoTWF0ZXJpYWxpemVkVHJlZUlkKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDE7XG4gICAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV4dFByb3BzLCByZW5kZXJMYW5lcyk7XG4gICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZU1lbW9Db21wb25lbnQoXG4gICAgICBjdXJyZW50LFxuICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICBDb21wb25lbnQsXG4gICAgICBuZXh0UHJvcHMsXG4gICAgICByZW5kZXJMYW5lc1xuICAgICkge1xuICAgICAgaWYgKG51bGwgPT09IGN1cnJlbnQpIHtcbiAgICAgICAgdmFyIHR5cGUgPSBDb21wb25lbnQudHlwZTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHR5cGUgJiZcbiAgICAgICAgICAhc2hvdWxkQ29uc3RydWN0KHR5cGUpICYmXG4gICAgICAgICAgdm9pZCAwID09PSB0eXBlLmRlZmF1bHRQcm9wcyAmJlxuICAgICAgICAgIG51bGwgPT09IENvbXBvbmVudC5jb21wYXJlXG4gICAgICAgIClcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKENvbXBvbmVudCA9IHJlc29sdmVUeXBlRm9ySG90UmVsb2FkaW5nKHR5cGUpKSxcbiAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy50YWcgPSAxNSksXG4gICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MudHlwZSA9IENvbXBvbmVudCksXG4gICAgICAgICAgICB2YWxpZGF0ZUZ1bmN0aW9uQ29tcG9uZW50SW5EZXYod29ya0luUHJvZ3Jlc3MsIHR5cGUpLFxuICAgICAgICAgICAgdXBkYXRlU2ltcGxlTWVtb0NvbXBvbmVudChcbiAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgIENvbXBvbmVudCxcbiAgICAgICAgICAgICAgbmV4dFByb3BzLFxuICAgICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIGN1cnJlbnQgPSBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHMoXG4gICAgICAgICAgQ29tcG9uZW50LnR5cGUsXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBuZXh0UHJvcHMsXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubW9kZSxcbiAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICApO1xuICAgICAgICBjdXJyZW50LnJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjtcbiAgICAgICAgY3VycmVudC5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgcmV0dXJuICh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGN1cnJlbnQpO1xuICAgICAgfVxuICAgICAgdHlwZSA9IGN1cnJlbnQuY2hpbGQ7XG4gICAgICBpZiAoIWNoZWNrU2NoZWR1bGVkVXBkYXRlT3JDb250ZXh0KGN1cnJlbnQsIHJlbmRlckxhbmVzKSkge1xuICAgICAgICB2Y
15852XIgcHJldlByb3BzID0gdHlwZS5tZW1vaXplZFByb3BzO1xuICAgICAgICBDb21wb25lbnQgPSBDb21wb25lbnQuY29tcGFyZTtcbiAgICAgICAgQ29tcG9uZW50ID0gbnVsbCAhPT0gQ29tcG9uZW50ID8gQ29tcG9uZW50IDogc2hhbGxvd0VxdWFsO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgQ29tcG9uZW50KHByZXZQcm9wcywgbmV4dFByb3BzKSAmJlxuICAgICAgICAgIGN1cnJlbnQucmVmID09PSB3b3JrSW5Qcm9ncmVzcy5yZWZcbiAgICAgICAgKVxuICAgICAgICAgIHJldHVybiBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKFxuICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMTtcbiAgICAgIGN1cnJlbnQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyh0eXBlLCBuZXh0UHJvcHMpO1xuICAgICAgY3VycmVudC5yZWYgPSB3b3JrSW5Qcm9ncmVzcy5yZWY7XG4gICAgICBjdXJyZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgcmV0dXJuICh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGN1cnJlbnQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVTaW1wbGVNZW1vQ29tcG9uZW50KFxuICAgICAgY3VycmVudCxcbiAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgQ29tcG9uZW50LFxuICAgICAgbmV4dFByb3BzLFxuICAgICAgcmVuZGVyTGFuZXNcbiAgICApIHtcbiAgICAgIGlmIChudWxsICE9PSBjdXJyZW50KSB7XG4gICAgICAgIHZhciBwcmV2UHJvcHMgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHM7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzaGFsbG93RXF1YWwocHJldlByb3BzLCBuZXh0UHJvcHMpICYmXG4gICAgICAgICAgY3VycmVudC5yZWYgPT09IHdvcmtJblByb2dyZXNzLnJlZiAmJlxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPT09IGN1cnJlbnQudHlwZVxuICAgICAgICApXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgKChkaWRSZWNlaXZlVXBkYXRlID0gITEpLFxuICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyA9IG5leHRQcm9wcyA9IHByZXZQcm9wcyksXG4gICAgICAgICAgICBjaGVja1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dChjdXJyZW50LCByZW5kZXJMYW5lcykpXG4gICAgICAgICAgKVxuICAgICAgICAgICAgMCAhPT0gKGN1cnJlbnQuZmxhZ3MgJiAxMzEwNzIpICYmIChkaWRSZWNlaXZlVXBkYXRlID0gITApO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IGN1cnJlbnQubGFuZXMpLFxuICAgICAgICAgICAgICBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcylcbiAgICAgICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdXBkYXRlRnVuY3Rpb25Db21wb25lbnQoXG4gICAgICAgIGN1cnJlbnQsXG4gICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICBDb21wb25lbnQsXG4gICAgICAgIG5leHRQcm9wcyxcbiAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZU9mZnNjcmVlbkNvbXBvbmVudChcbiAgICAgIGN1cnJlbnQsXG4gICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgIHJlbmRlckxhbmVzLFxuICAgICAgbmV4dFByb3BzXG4gICAgKSB7XG4gICAgICB2Y
15852XIgbmV4dENoaWxkcmVuID0gbmV4dFByb3BzLmNoaWxkcmVuLFxuICAgICAgICBwcmV2U3RhdGUgPSBudWxsICE9PSBjdXJyZW50ID8gY3VycmVudC5tZW1vaXplZFN0YXRlIDogbnVsbDtcbiAgICAgIG51bGwgPT09IGN1cnJlbnQgJiZcbiAgICAgICAgbnVsbCA9PT0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlICYmXG4gICAgICAgICh3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSB7XG4gICAgICAgICAgX3Zpc2liaWxpdHk6IE9mZnNjcmVlblZpc2libGUsXG4gICAgICAgICAgX3BlbmRpbmdNYXJrZXJzOiBudWxsLFxuICAgICAgICAgIF9yZXRyeUNhY2hlOiBudWxsLFxuICAgICAgICAgIF90cmFuc2l0aW9uczogbnVsbFxuICAgICAgICB9KTtcbiAgICAgIGlmIChcImhpZGRlblwiID09PSBuZXh0UHJvcHMubW9kZSkge1xuICAgICAgICBpZiAoMCAhPT0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgMTI4KSkge1xuICAgICAgICAgIHByZXZTdGF0ZSA9XG4gICAgICAgICAgICBudWxsICE9PSBwcmV2U3RhdGVcbiAgICAgICAgICAgICAgPyBwcmV2U3RhdGUuYmFzZUxhbmVzIHwgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICAgOiByZW5kZXJMYW5lcztcbiAgICAgICAgICBpZiAobnVsbCAhPT0gY3VycmVudCkge1xuICAgICAgICAgICAgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjdXJyZW50LmNoaWxkO1xuICAgICAgICAgICAgZm9yIChuZXh0Q2hpbGRyZW4gPSAwOyBudWxsICE9PSBuZXh0UHJvcHM7IClcbiAgICAgICAgICAgICAgKG5leHRDaGlsZHJlbiA9XG4gICAgICAgICAgICAgICAgbmV4dENoaWxkcmVuIHwgbmV4dFByb3BzLmxhbmVzIHwgbmV4dFByb3BzLmNoaWxkTGFuZXMpLFxuICAgICAgICAgICAgICAgIChuZXh0UHJvcHMgPSBuZXh0UHJvcHMuc2libGluZyk7XG4gICAgICAgICAgICBuZXh0UHJvcHMgPSBuZXh0Q2hpbGRyZW4gJiB+cHJldlN0YXRlO1xuICAgICAgICAgIH0gZWxzZSAobmV4dFByb3BzID0gMCksICh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG51bGwpO1xuICAgICAgICAgIHJldHVybiBkZWZlckhpZGRlbk9mZnNjcmVlbkNvbXBvbmVudChcbiAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgIHByZXZTdGF0ZSxcbiAgICAgICAgICAgIHJlbmRlckxhbmVzLFxuICAgICAgICAgICAgbmV4dFByb3BzXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoMCAhPT0gKHJlbmRlckxhbmVzICYgNTM2ODcwOTEyKSlcbiAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHsgYmFzZUxhbmVzOiAwLCBjYWNoZVBvb2w6IG51bGwgfSksXG4gICAgICAgICAgICBudWxsICE9PSBjdXJyZW50ICYmXG4gICAgICAgICAgICAgIHB1c2hUcmFuc2l0aW9uKFxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICAgIG51bGwgIT09IHByZXZTdGF0ZSA/IHByZXZTdGF0ZS5jYWNoZVBvb2wgOiBudWxsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICBudWxsICE9PSBwcmV2U3RhdGVcbiAgICAgICAgICAgICAgPyBwdXNoSGlkZGVuQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcHJldlN0YXRlKVxuICAgICAgICAgICAgICA6IHJldXNlSGlkZGVuQ29udGV4dE9uU3RhY2sod29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgcHVzaE9mZnNjcmVlblN1c3BlbnNlSGFuZGxlcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLmxhbmVzID0gNTM2ODcwOTEyKSxcbiAgICAgICAgICAgIGRlZmVySGlkZGVuT2Zmc2NyZWVuQ29tcG9uZW50KFxuICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgbnVsbCAhPT0gcHJldlN0YXRlXG4gICAgICAgICAgICAgICAgPyBwcmV2U3RhdGUuYmFzZUxhbmVzIHwgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICAgICA6IHJlbmRlckxhbmVzLFxuICAgICAgICAgICAgICByZW5kZXJMYW5lcyxcbiAgICAgICAgICAgICAgbmV4dFByb3BzXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgIH0gZWxzZVxuICAgICAgICBudWxsICE9PSBwcmV2U3RhdGVcbiAgICAgICAgICA/IChwdXNoVHJhbnNpdGlvbih3b3JrSW5Qcm9ncmVzcywgcHJldlN0YXRlLmNhY2hlUG9vbCksXG4gICAgICAgICAgICBwdXNoSGlkZGVuQ29udGV4dCh3b3JrSW5Qcm9ncmVzcywgcHJldlN0YXRlKSxcbiAgICAgICAgICAgIHJldXNlU3VzcGVuc2VIYW5kbGVyT25TdGFjayh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGwpKVxuICAgICAgICAgIDogKG51bGwgIT09IGN1cnJlbnQgJiYgcHVzaFRyYW5zaXRpb24od29ya0luUHJvZ3Jlc3MsIG51bGwpLFxuICAgICAgICAgICAgcmV1c2VIaWRkZW5Db250ZXh0T25TdGFjayh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICByZXVzZVN1c3BlbnNlSGFuZGxlck9uU3RhY2sod29ya0luUHJvZ3Jlc3MpKTtcbiAgICAgIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0Q2hpbGRyZW4sIHJlbmRlckxhbmVzKTtcbiAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gYmFpbG91dE9mZnNjcmVlbkNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgKG51bGwgIT09IGN1cnJlbnQgJiYgMjIgPT09IGN1cnJlbnQudGFnKSB8fFxuICAgICAgICBudWxsICE9PSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgfHxcbiAgICAgICAgKHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IHtcbiAgICAgICAgICBfdmlzaWJpbGl0eTogT2Zmc2NyZWVuVmlzaWJsZSxcbiAgICAgICAgICBfcGVuZGluZ01hcmtlcnM6IG51bGwsXG4gICAgICAgICAgX3JldHJ5Q2FjaGU6IG51bGwsXG4gICAgICAgICAgX3RyYW5zaXRpb25zOiBudWxsXG4gICAgICAgI
15852H0pO1xuICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLnNpYmxpbmc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlZmVySGlkZGVuT2Zmc2NyZWVuQ29tcG9uZW50KFxuICAgICAgY3VycmVudCxcbiAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgbmV4dEJhc2VMYW5lcyxcbiAgICAgIHJlbmRlckxhbmVzLFxuICAgICAgcmVtYWluaW5nQ2hpbGRMYW5lc1xuICAgICkge1xuICAgICAgdmFyIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCA9IHBlZWtDYWNoZUZyb21Qb29sKCk7XG4gICAgICBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgPVxuICAgICAgICBudWxsID09PSBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHRcbiAgICAgICAgICA/IG51bGxcbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgcGFyZW50OiBDYWNoZUNvbnRleHQuX2N1cnJlbnRWYWx1ZSxcbiAgICAgICAgICAgICAgcG9vbDogSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0XG4gICAgICAgICAgICB9O1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHtcbiAgICAgICAgYmFzZUxhbmVzOiBuZXh0QmFzZUxhbmVzLFxuICAgICAgICBjYWNoZVBvb2w6IEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdFxuICAgICAgfTtcbiAgICAgIG51bGwgIT09IGN1cnJlbnQgJiYgcHVzaFRyYW5zaXRpb24od29ya0luUHJvZ3Jlc3MsIG51bGwpO1xuICAgICAgcmV1c2VIaWRkZW5Db250ZXh0T25TdGFjayh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBwdXNoT2Zmc2NyZWVuU3VzcGVuc2VIYW5kbGVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIG51bGwgIT09IGN1cnJlbnQgJiZcbiAgICAgICAgcHJvcGFnYXRlUGFyZW50Q29udGV4dENoYW5nZXMoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzLCAhMCk7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzID0gcmVtYWluaW5nQ2hpbGRMYW5lcztcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtb3VudEFjdGl2aXR5Q2hpbGRyZW4od29ya0luUHJvZ3Jlc3MsIG5leHRQcm9wcykge1xuICAgICAgdmFyIGhpZGRlblByb3AgPSBuZXh0UHJvcHMuaGlkZGVuO1xuICAgICAgdm9pZCAwICE9PSBoaWRkZW5Qcm9wICYmXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgJzxBY3Rpdml0eT4gZG9lc25cXCd0IGFjY2VwdCBhIGhpZGRlbiBwcm9wLiBVc2UgbW9kZT1cImhpZGRlblwiIGluc3RlYWQuXFxuLSA8QWN0aXZpdHkgJXM+XFxuKyA8QWN0aXZpdHkgJXM+JyxcbiAgICAgICAgICAhMCA9PT0gaGlkZGVuUHJvcFxuICAgICAgICAgICAgPyBcImhpZGRlblwiXG4gICAgICAgICAgICA6ICExID09PSBoaWRkZW5Qcm9wXG4gICAgICAgICAgICAgID8gXCJoaWRkZW49e2ZhbHNlfVwiXG4gICAgICAgICAgICAgIDogXCJoaWRkZW49ey4uLn1cIixcbiAgICAgICAgICBoaWRkZW5Qcm9wID8gJ21vZGU9XCJoaWRkZW5cIicgOiAnbW9kZT1cInZpc2libGVcIidcbiAgICAgICAgKTtcbiAgICAgIG5leHRQcm9wcyA9IG1vdW50V29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihcbiAgICAgICAgeyBtb2RlOiBuZXh0UHJvcHMubW9kZSwgY2hpbGRyZW46IG5leHRQcm9wcy5jaGlsZHJlbiB9LFxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tb2RlXG4gICAgICApO1xuICAgICAgbmV4dFByb3BzLnJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjtcbiAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gbmV4dFByb3BzO1xuICAgICAgbmV4dFByb3BzLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgcmV0dXJuIG5leHRQcm9wcztcbiAgICB9XG4gICAgZnVuY3Rpb24gcmV0cnlBY3Rpdml0eUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoXG4gICAgICBjdXJyZW50LFxuICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICByZW5kZXJMYW5lc1xuICAgICkge1xuICAgICAgcmVjb25jaWxlQ2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIGN1cnJlbnQuY2hpbGQsIG51bGwsIHJlbmRlckxhbmVzKTtcbiAgICAgIGN1cnJlbnQgPSBtb3VudEFjdGl2aXR5Q2hpbGRyZW4oXG4gICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHNcbiAgICAgICk7XG4gICAgICBjdXJyZW50LmZsYWdzIHw9IDI7XG4gICAgICBwb3BTdXNwZW5zZUhhbmRsZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlQWN0aXZpdHlDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gICAgICB2Y
15852XIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLFxuICAgICAgICBkaWRTdXNwZW5kID0gMCAhPT0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgMTI4KTtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzICY9IC0xMjk7XG4gICAgICBpZiAobnVsbCA9PT0gY3VycmVudCkge1xuICAgICAgICBpZiAoaXNIeWRyYXRpbmcpIHtcbiAgICAgICAgICBpZiAoXCJoaWRkZW5cIiA9PT0gbmV4dFByb3BzLm1vZGUpXG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAoY3VycmVudCA9IG1vdW50QWN0aXZpdHlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgbmV4dFByb3BzKSksXG4gICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IDUzNjg3MDkxMiksXG4gICAgICAgICAgICAgIChjdXJyZW50Lm1lbW9pemVkU3RhdGUgPSB7IGJhc2VMYW5lczogMCwgY2FjaGVQb29sOiBudWxsIH0pLFxuICAgICAgICAgICAgICBiYWlsb3V0T2Zmc2NyZWVuQ29tcG9uZW50KG51bGwsIGN1cnJlbnQpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIHB1c2hEZWh5ZHJhdGVkQWN0aXZpdHlTdXNwZW5zZUhhbmRsZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIChjdXJyZW50ID0gbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSlcbiAgICAgICAgICAgID8gKChyZW5kZXJMYW5lcyA9IGNhbkh5ZHJhdGVIeWRyYXRpb25Cb3VuZGFyeShcbiAgICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICAgIHJvb3RPclNpbmdsZXRvbkNvbnRleHRcbiAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgIChyZW5kZXJMYW5lcyA9XG4gICAgICAgICAgICAgICAgbnVsbCAhPT0gcmVuZGVyTGFuZXMgJiYgcmVuZGVyTGFuZXMuZGF0YSA9PT0gQUNUSVZJVFlfU1RBUlRfREFUQVxuICAgICAgICAgICAgICAgICAgPyByZW5kZXJMYW5lc1xuICAgICAgICAgICAgICAgICAgOiBudWxsKSxcbiAgICAgICAgICAgICAgbnVsbCAhPT0gcmVuZGVyTGFuZXMgJiZcbiAgICAgICAgICAgICAgICAoKG5leHRQcm9wcyA9IHtcbiAgICAgICAgICAgICAgICAgIGRlaHlkcmF0ZWQ6IHJlbmRlckxhbmVzLFxuICAgICAgICAgICAgICAgICAgdHJlZUNvbnRleHQ6IGdldFN1c3BlbmRlZFRyZWVDb250ZXh0KCksXG4gICAgICAgICAgICAgICAgICByZXRyeUxhbmU6IDUzNjg3MDkxMixcbiAgICAgICAgICAgICAgICAgIGh5ZHJhdGlvbkVycm9yczogbnVsbFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbmV4dFByb3BzKSxcbiAgICAgICAgICAgICAgICAobmV4dFByb3BzID0gY3JlYXRlRmliZXJGcm9tRGVoeWRyYXRlZEZyYWdtZW50KHJlbmRlckxhbmVzKSksXG4gICAgICAgICAgICAgICAgKG5leHRQcm9wcy5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmNoaWxkID0gbmV4dFByb3BzKSxcbiAgICAgICAgICAgICAgICAoaHlkcmF0aW9uUGFyZW50RmliZXIgPSB3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAgICAgKG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBudWxsKSkpXG4gICAgICAgICAgICA6IChyZW5kZXJMYW5lcyA9IG51bGwpO1xuICAgICAgICAgIGlmIChudWxsID09PSByZW5kZXJMYW5lcylcbiAgICAgICAgICAgIHRocm93IChcbiAgICAgICAgICAgICAgKHdhcm5Ob25IeWRyYXRlZEluc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdXJyZW50KSxcbiAgICAgICAgICAgICAgdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKHdvcmtJblByb2dyZXNzKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubGFuZXMgPSA1MzY4NzA5MTI7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1vdW50QWN0aXZpdHlDaGlsZHJlbih3b3JrSW5Qcm9ncmVzcywgbmV4dFByb3BzKTtcbiAgICAgIH1cbiAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgICBpZiAobnVsbCAhPT0gcHJldlN0YXRlKSB7XG4gICAgICAgIHZhciBhY3Rpdml0eUluc3RhbmNlID0gcHJldlN0YXRlLmRlaHlkcmF0ZWQ7XG4gICAgICAgIHB1c2hEZWh5ZHJhdGVkQWN0aXZpdHlTdXNwZW5zZUhhbmRsZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICBpZiAoZGlkU3VzcGVuZClcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiAyNTYpXG4gICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gLTI1NyksXG4gICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcyA9IHJldHJ5QWN0aXZpdHlDb21wb25lbnRXaXRob3V0SHlkcmF0aW5nKFxuICAgICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgZWxzZSBpZiAobnVsbCAhPT0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSlcbiAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGN1cnJlbnQuY2hpbGQpLFxuICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMTI4KSxcbiAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzID0gbnVsbCk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgIFwiQ2xpZW50IHJlbmRlcmluZyBhbiBBY3Rpdml0eSBzdXNwZW5kZWQgaXQgYWdhaW4uIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICh3YXJuSWZIeWRyYXRpbmcoKSxcbiAgICAgICAgICAwICE9PSAocmVuZGVyTGFuZXMgJiA1MzY4NzA5MTIpICYmXG4gICAgICAgICAgICBtYXJrUmVuZGVyRGVyaXZlZENhdXNlKHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICBkaWRSZWNlaXZlVXBkYXRlIHx8XG4gICAgICAgICAgICBwcm9wYWdhdGVQYXJlbnRDb250ZXh0Q2hhbmdlcyhcbiAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgI
15852HJlbmRlckxhbmVzLFxuICAgICAgICAgICAgICAhMVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAoZGlkU3VzcGVuZCA9IDAgIT09IChyZW5kZXJMYW5lcyAmIGN1cnJlbnQuY2hpbGRMYW5lcykpLFxuICAgICAgICAgIGRpZFJlY2VpdmVVcGRhdGUgfHwgZGlkU3VzcGVuZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKG51bGwgPT09IGN1cnJlbnRUcmVlSGlkZGVuU3RhY2tDdXJzb3IuY3VycmVudCkge1xuICAgICAgICAgICAgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3NSb290O1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBudWxsICE9PSBuZXh0UHJvcHMgJiZcbiAgICAgICAgICAgICAgKChhY3Rpdml0eUluc3RhbmNlID0gZ2V0QnVtcGVkTGFuZUZvckh5ZHJhdGlvbihcbiAgICAgICAgICAgICAgICBuZXh0UHJvcHMsXG4gICAgICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgIDAgIT09IGFjdGl2aXR5SW5zdGFuY2UgJiZcbiAgICAgICAgICAgICAgICBhY3Rpdml0eUluc3RhbmNlICE9PSBwcmV2U3RhdGUucmV0cnlMYW5lKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB0aHJvdyAoXG4gICAgICAgICAgICAgICAgKChwcmV2U3RhdGUucmV0cnlMYW5lID0gYWN0aXZpdHlJbnN0YW5jZSksXG4gICAgICAgICAgICAgICAgZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGN1cnJlbnQsIGFjdGl2aXR5SW5zdGFuY2UpLFxuICAgICAgICAgICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihuZXh0UHJvcHMsIGN1cnJlbnQsIGFjdGl2aXR5SW5zdGFuY2UpLFxuICAgICAgICAgICAgICAgIFNlbGVjdGl2ZUh5ZHJhdGlvbkV4Y2VwdGlvbilcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlbmRlckRpZFN1c3BlbmREZWxheUlmUG9zc2libGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSByZXRyeUFjdGl2aXR5Q29tcG9uZW50V2l0aG91dEh5ZHJhdGluZyhcbiAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgKGN1cnJlbnQgPSBwcmV2U3RhdGUudHJlZUNvbnRleHQpLFxuICAgICAgICAgICAgKG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZShcbiAgICAgICAgICAgICAgYWN0aXZpdHlJbnN0YW5jZS5uZXh0U2libGluZ1xuICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAoaHlkcmF0aW9uUGFyZW50RmliZXIgPSB3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAoaXNIeWRyYXRpbmcgPSAhMCksXG4gICAgICAgICAgICAoaHlkcmF0aW9uRXJyb3JzID0gbnVsbCksXG4gICAgICAgICAgICAoZGlkU3VzcGVuZE9yRXJyb3JERVYgPSAhMSksXG4gICAgICAgICAgICAoaHlkcmF0aW9uRGlmZlJvb3RERVYgPSBudWxsKSxcbiAgICAgICAgICAgIChyb290T3JTaW5nbGV0b25Db250ZXh0ID0gITEpLFxuICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudCAmJlxuICAgICAgICAgICAgICByZXN0b3JlU3VzcGVuZGVkVHJlZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN1cnJlbnQpLFxuICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzID0gbW91bnRBY3Rpdml0eUNoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBuZXh0UHJvcHMpKSxcbiAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAxMzQyMjE4MjQpO1xuICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG4gICAgICB9XG4gICAgICBwcmV2U3RhdGUgPSBjdXJyZW50LmNoaWxkO1xuICAgICAgbmV4dFByb3BzID0geyBtb2RlOiBuZXh0UHJvcHMubW9kZSwgY2hpbGRyZW46IG5leHRQcm9wcy5jaGlsZHJlbiB9O1xuICAgICAgMCAhPT0gKHJlbmRlckxhbmVzICYgNTM2ODcwOTEyKSAmJlxuICAgICAgICAwICE9PSAocmVuZGVyTGFuZXMgJiBjdXJyZW50LmxhbmVzKSAmJlxuICAgICAgICBtYXJrUmVuZGVyRGVyaXZlZENhdXNlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIGN1cnJlbnQgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhwcmV2U3RhdGUsIG5leHRQcm9wcyk7XG4gICAgICBjdXJyZW50LnJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjtcbiAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudDtcbiAgICAgIGN1cnJlbnQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgZnVuY3Rpb24gbWFya1JlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgdmFyIHJlZiA9IHdvcmtJblByb2dyZXNzLnJlZjtcbiAgICAgIGlmIChudWxsID09PSByZWYpXG4gICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiZcbiAgICAgICAgICBudWxsICE9PSBjdXJyZW50LnJlZiAmJlxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA0MTk0ODE2KTtcbiAgICAgIGVsc2Uge1xuICAgICAgICBpZiAoXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgcmVmICYmIFwib2JqZWN0XCIgIT09IHR5cGVvZiByZWYpXG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICBcIkV4cGVjdGVkIHJlZiB0byBiZSBhIGZ1bmN0aW9uLCBhbiBvYmplY3QgcmV0dXJuZWQgYnkgUmVhY3QuY3JlYXRlUmVmKCksIG9yIHVuZGVmaW5lZC9udWxsLlwiXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKG51bGwgPT09IGN1cnJlbnQgfHwgY3VycmVudC5yZWYgIT09IHJlZilcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA0MTk0ODE2O1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChcbiAgICAgIGN1cnJlbnQsXG4gICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgIENvbXBvbmVudCxcbiAgICAgIG5leHRQcm9wcyxcbiAgICAgIHJlbmRlckxhbmVzXG4gICAgKSB7XG4gICAgICBpZiAoXG4gICAgICAgIENvbXBvbmVudC5wcm90b3R5cGUgJiZcbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgQ29tcG9uZW50LnByb3RvdHlwZS5yZW5kZXJcbiAgICAgICkge1xuICAgICAgICB2Y
15852XIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpIHx8IFwiVW5rbm93blwiO1xuICAgICAgICBkaWRXYXJuQWJvdXRCYWRDbGFzc1tjb21wb25lbnROYW1lXSB8fFxuICAgICAgICAgIChjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJUaGUgPCVzIC8+IGNvbXBvbmVudCBhcHBlYXJzIHRvIGhhdmUgYSByZW5kZXIgbWV0aG9kLCBidXQgZG9lc24ndCBleHRlbmQgUmVhY3QuQ29tcG9uZW50LiBUaGlzIGlzIGxpa2VseSB0byBjYXVzZSBlcnJvcnMuIENoYW5nZSAlcyB0byBleHRlbmQgUmVhY3QuQ29tcG9uZW50IGluc3RlYWQuXCIsXG4gICAgICAgICAgICBjb21wb25lbnROYW1lLFxuICAgICAgICAgICAgY29tcG9uZW50TmFtZVxuICAgICAgICAgICksXG4gICAgICAgICAgKGRpZFdhcm5BYm91dEJhZENsYXNzW2NvbXBvbmVudE5hbWVdID0gITApKTtcbiAgICAgIH1cbiAgICAgIHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlICYmXG4gICAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nKFxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgIG51bGwgPT09IGN1cnJlbnQgJiZcbiAgICAgICAgKHZhbGlkYXRlRnVuY3Rpb25Db21wb25lbnRJbkRldih3b3JrSW5Qcm9ncmVzcywgd29ya0luUHJvZ3Jlc3MudHlwZSksXG4gICAgICAgIENvbXBvbmVudC5jb250ZXh0VHlwZXMgJiZcbiAgICAgICAgICAoKGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCBcIlVua25vd25cIiksXG4gICAgICAgICAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVzW2NvbXBvbmVudE5hbWVdIHx8XG4gICAgICAgICAgICAoKGRpZFdhcm5BYm91dENvbnRleHRUeXBlc1tjb21wb25lbnROYW1lXSA9ICEwKSxcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIFwiJXMgdXNlcyB0aGUgbGVnYWN5IGNvbnRleHRUeXBlcyBBUEkgd2hpY2ggd2FzIHJlbW92ZWQgaW4gUmVhY3QgMTkuIFVzZSBSZWFjdC5jcmVhdGVDb250ZXh0KCkgd2l0aCBSZWFjdC51c2VDb250ZXh0KCkgaW5zdGVhZC4gKGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvbGVnYWN5LWNvbnRleHQpXCIsXG4gICAgICAgICAgICAgIGNvbXBvbmVudE5hbWVcbiAgICAgICAgICAgICkpKSk7XG4gICAgICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBDb21wb25lbnQgPSByZW5kZXJXaXRoSG9va3MoXG4gICAgICAgIGN1cnJlbnQsXG4gICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICBDb21wb25lbnQsXG4gICAgICAgIG5leHRQcm9wcyxcbiAgICAgICAgdm9pZCAwLFxuICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgKTtcbiAgICAgIG5leHRQcm9wcyA9IGNoZWNrRGlkUmVuZGVySWRIb29rKCk7XG4gICAgICBpZiAobnVsbCAhPT0gY3VycmVudCAmJiAhZGlkUmVjZWl2ZVVwZGF0ZSlcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBiYWlsb3V0SG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSxcbiAgICAgICAgICBiYWlsb3V0T25BbHJlYWR5RmluaXNoZWRXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcylcbiAgICAgICAgKTtcbiAgICAgIGlzSHlkcmF0aW5nICYmIG5leHRQcm9wcyAmJiBwdXNoTWF0ZXJpYWxpemVkVHJlZUlkKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDE7XG4gICAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgQ29tcG9uZW50LCByZW5kZXJMYW5lcyk7XG4gICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlcGxheUZ1bmN0aW9uQ29tcG9uZW50KFxuICAgICAgY3VycmVudCxcbiAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgbmV4dFByb3BzLFxuICAgICAgQ29tcG9uZW50LFxuICAgICAgc2Vjb25kQXJnLFxuICAgICAgcmVuZGVyTGFuZXNcbiAgICApIHtcbiAgICAgIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgIGhvb2tUeXBlc1VwZGF0ZUluZGV4RGV2ID0gLTE7XG4gICAgICBpZ25vcmVQcmV2aW91c0RlcGVuZGVuY2llcyA9XG4gICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiYgY3VycmVudC50eXBlICE9PSB3b3JrSW5Qcm9ncmVzcy50eXBlO1xuICAgICAgd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUgPSBudWxsO1xuICAgICAgbmV4dFByb3BzID0gcmVuZGVyV2l0aEhvb2tzQWdhaW4oXG4gICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICBDb21wb25lbnQsXG4gICAgICAgIG5leHRQcm9wcyxcbiAgICAgICAgc2Vjb25kQXJnXG4gICAgICApO1xuICAgICAgZmluaXNoUmVuZGVyaW5nSG9va3MoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgQ29tcG9uZW50ID0gY2hlY2tEaWRSZW5kZXJJZEhvb2soKTtcbiAgICAgIGlmIChudWxsICE9PSBjdXJyZW50ICYmICFkaWRSZWNlaXZlVXBkYXRlKVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIGJhaWxvdXRIb29rcyhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpLFxuICAgICAgICAgIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKVxuICAgICAgICApO1xuICAgICAgaXNIeWRyYXRpbmcgJiYgQ29tcG9uZW50ICYmIHB1c2hNYXRlcmlhbGl6ZWRUcmVlSWQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMTtcbiAgICAgIHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBuZXh0UHJvcHMsIHJlbmRlckxhbmVzKTtcbiAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlQ2xhc3NDb21wb25lbnQoXG4gICAgICBjdXJyZW50LFxuICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICBDb21wb25lbnQsXG4gICAgICBuZXh0UHJvcHMsXG4gICAgICByZW5kZXJMYW5lc1xuICAgICkge1xuICAgICAgc3dpdGNoIChzaG91bGRFcnJvckltcGwod29ya0luUHJvZ3Jlc3MpKSB7XG4gICAgICAgIGNhc2UgITE6XG4gICAgICAgICAgdmFyIF9pbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSxcbiAgICAgICAgICAgI
15852HN0YXRlID0gbmV3IHdvcmtJblByb2dyZXNzLnR5cGUoXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHMsXG4gICAgICAgICAgICAgIF9pbnN0YW5jZS5jb250ZXh0XG4gICAgICAgICAgICApLnN0YXRlO1xuICAgICAgICAgIF9pbnN0YW5jZS51cGRhdGVyLmVucXVldWVTZXRTdGF0ZShfaW5zdGFuY2UsIHN0YXRlLCBudWxsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAhMDpcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAxMjg7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gNjU1MzY7XG4gICAgICAgICAgX2luc3RhbmNlID0gRXJyb3IoXCJTaW11bGF0ZWQgZXJyb3IgY29taW5nIGZyb20gRGV2VG9vbHNcIik7XG4gICAgICAgICAgdmFyIGxhbmUgPSByZW5kZXJMYW5lcyAmIC1yZW5kZXJMYW5lcztcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyB8PSBsYW5lO1xuICAgICAgICAgIHN0YXRlID0gd29ya0luUHJvZ3Jlc3NSb290O1xuICAgICAgICAgIGlmIChudWxsID09PSBzdGF0ZSlcbiAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICBcIkV4cGVjdGVkIGEgd29yay1pbi1wcm9ncmVzcyByb290LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBsYW5lID0gY3JlYXRlQ2xhc3NFcnJvclVwZGF0ZShsYW5lKTtcbiAgICAgICAgICBpbml0aWFsaXplQ2xhc3NFcnJvclVwZGF0ZShcbiAgICAgICAgICAgIGxhbmUsXG4gICAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIoX2luc3RhbmNlLCB3b3JrSW5Qcm9ncmVzcylcbiAgICAgICAgICApO1xuICAgICAgICAgIGVucXVldWVDYXB0dXJlZFVwZGF0ZSh3b3JrSW5Qcm9ncmVzcywgbGFuZSk7XG4gICAgICB9XG4gICAgICBwcmVwYXJlVG9SZWFkQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBpZiAobnVsbCA9PT0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlKSB7XG4gICAgICAgIHN0YXRlID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuICAgICAgICBfaW5zdGFuY2UgPSBDb21wb25lbnQuY29udGV4dFR5cGU7XG4gICAgICAgIFwiY29udGV4dFR5cGVcIiBpbiBDb21wb25lbnQgJiZcbiAgICAgICAgICBudWxsICE9PSBfaW5zdGFuY2UgJiZcbiAgICAgICAgICAodm9pZCAwID09PSBfaW5zdGFuY2UgfHwgX2luc3RhbmNlLiQkdHlwZW9mICE9PSBSRUFDVF9DT05URVhUX1RZUEUpICYmXG4gICAgICAgICAgIWRpZFdhcm5BYm91dEludmFsaWRhdGVDb250ZXh0VHlwZS5oYXMoQ29tcG9uZW50KSAmJlxuICAgICAgICAgIChkaWRXYXJuQWJvdXRJbnZhbGlkYXRlQ29udGV4dFR5cGUuYWRkKENvbXBvbmVudCksXG4gICAgICAgICAgKGxhbmUgPVxuICAgICAgICAgICAgdm9pZCAwID09PSBfaW5zdGFuY2VcbiAgICAgICAgICAgICAgPyBcIiBIb3dldmVyLCBpdCBpcyBzZXQgdG8gdW5kZWZpbmVkLiBUaGlzIGNhbiBiZSBjYXVzZWQgYnkgYSB0eXBvIG9yIGJ5IG1peGluZyB1cCBuYW1lZCBhbmQgZGVmYXVsdCBpbXBvcnRzLiBUaGlzIGNhbiBhbHNvIGhhcHBlbiBkdWUgdG8gYSBjaXJjdWxhciBkZXBlbmRlbmN5LCBzbyB0cnkgbW92aW5nIHRoZSBjcmVhdGVDb250ZXh0KCkgY2FsbCB0byBhIHNlcGFyYXRlIGZpbGUuXCJcbiAgICAgICAgICAgICAgOiBcIm9iamVjdFwiICE9PSB0eXBlb2YgX2luc3RhbmNlXG4gICAgICAgICAgICAgICAgPyBcIiBIb3dldmVyLCBpdCBpcyBzZXQgdG8gYSBcIiArIHR5cGVvZiBfaW5zdGFuY2UgKyBcIi5cIlxuICAgICAgICAgICAgICAgIDogX2luc3RhbmNlLiQkdHlwZW9mID09PSBSRUFDVF9DT05TVU1FUl9UWVBFXG4gICAgICAgICAgICAgICAgICA/IFwiIERpZCB5b3UgYWNjaWRlbnRhbGx5IHBhc3MgdGhlIENvbnRleHQuQ29uc3VtZXIgaW5zdGVhZD9cIlxuICAgICAgICAgICAgICAgICAgOiBcIiBIb3dldmVyLCBpdCBpcyBzZXQgdG8gYW4gb2JqZWN0IHdpdGgga2V5cyB7XCIgK1xuICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhfaW5zdGFuY2UpLmpvaW4oXCIsIFwiKSArXG4gICAgICAgICAgICAgICAgICAgIFwifS5cIiksXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiJXMgZGVmaW5lcyBhbiBpbnZhbGlkIGNvbnRleHRUeXBlLiBjb250ZXh0VHlwZSBzaG91bGQgcG9pbnQgdG8gdGhlIENvbnRleHQgb2JqZWN0IHJldHVybmVkIGJ5IFJlYWN0LmNyZWF0ZUNvbnRleHQoKS4lc1wiLFxuICAgICAgICAgICAgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgXCJDb21wb25lbnRcIixcbiAgICAgICAgICAgIGxhbmVcbiAgICAgICAgICApKTtcbiAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIF9pbnN0YW5jZSAmJlxuICAgICAgICAgIG51bGwgIT09IF9pbnN0YW5jZSAmJlxuICAgICAgICAgIChzdGF0ZSA9IHJlYWRDb250ZXh0KF9pbnN0YW5jZSkpO1xuICAgICAgICBfaW5zdGFuY2UgPSBuZXcgQ29tcG9uZW50KG5leHRQcm9wcywgc3RhdGUpO1xuICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUpIHtcbiAgICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyghMCk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIF9pbnN0YW5jZSA9IG5ldyBDb21wb25lbnQobmV4dFByb3BzLCBzdGF0ZSk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKCExKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID1cbiAgICAgICAgICBudWxsICE9PSBfaW5zdGFuY2Uuc3RhdGUgJiYgdm9pZCAwICE9PSBfaW5zdGFuY2Uuc3RhdGVcbiAgICAgICAgICAgID8gX2luc3RhbmNlLnN0YXRlXG4gICAgICAgICAgICA6IG51bGw7XG4gICAgICAgIF9pbnN0YW5jZS51cGRhdGVyID0gY2xhc3NDb21wb25lbnRVcGRhdGVyO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgPSBfaW5zdGFuY2U7XG4gICAgICAgIF9pbnN0YW5jZS5fcmVhY3RJb
15852nRlcm5hbHMgPSB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgX2luc3RhbmNlLl9yZWFjdEludGVybmFsSW5zdGFuY2UgPSBmYWtlSW50ZXJuYWxJbnN0YW5jZTtcbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyAmJlxuICAgICAgICAgIG51bGwgPT09IHN0YXRlICYmXG4gICAgICAgICAgKChzdGF0ZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpIHx8IFwiQ29tcG9uZW50XCIpLFxuICAgICAgICAgIGRpZFdhcm5BYm91dFVuaW5pdGlhbGl6ZWRTdGF0ZS5oYXMoc3RhdGUpIHx8XG4gICAgICAgICAgICAoZGlkV2FybkFib3V0VW5pbml0aWFsaXplZFN0YXRlLmFkZChzdGF0ZSksXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcImAlc2AgdXNlcyBgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzYCBidXQgaXRzIGluaXRpYWwgc3RhdGUgaXMgJXMuIFRoaXMgaXMgbm90IHJlY29tbWVuZGVkLiBJbnN0ZWFkLCBkZWZpbmUgdGhlIGluaXRpYWwgc3RhdGUgYnkgYXNzaWduaW5nIGFuIG9iamVjdCB0byBgdGhpcy5zdGF0ZWAgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIGAlc2AuIFRoaXMgZW5zdXJlcyB0aGF0IGBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHNgIGFyZ3VtZW50cyBoYXZlIGEgY29uc2lzdGVudCBzaGFwZS5cIixcbiAgICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICAgIG51bGwgPT09IF9pbnN0YW5jZS5zdGF0ZSA/IFwibnVsbFwiIDogXCJ1bmRlZmluZWRcIixcbiAgICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICAgICkpKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIENvbXBvbmVudC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgfHxcbiAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBfaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGVcbiAgICAgICAgKSB7XG4gICAgICAgICAgdmFyIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSAobGFuZSA9IHN0YXRlID0gbnVsbCk7XG4gICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgX2luc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCAmJlxuICAgICAgICAgICEwICE9PSBfaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50Ll9fc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmdcbiAgICAgICAgICAgID8gKHN0YXRlID0gXCJjb21wb25lbnRXaWxsTW91bnRcIilcbiAgICAgICAgICAgIDogXCJmdW5jdGlvblwiID09PSB0eXBlb2YgX2luc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgJiZcbiAgICAgICAgICAgICAgKHN0YXRlID0gXCJVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50XCIpO1xuICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIF9pbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzICYmXG4gICAgICAgICAgITAgIT09XG4gICAgICAgICAgICBfaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcy5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nXG4gICAgICAgICAgICA/IChsYW5lID0gXCJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzXCIpXG4gICAgICAgICAgICA6IFwiZnVuY3Rpb25cIiA9PT1cbiAgICAgICAgICAgICAgICB0eXBlb2YgX2luc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzICYmXG4gICAgICAgICAgICAgIChsYW5lID0gXCJVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1wiKTtcbiAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBfaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSAmJlxuICAgICAgICAgICEwICE9PSBfaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZS5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nXG4gICAgICAgICAgICA/IChmb3VuZFdpbGxVcGRhdGVOYW1lID0gXCJjb21wb25lbnRXaWxsVXBkYXRlXCIpXG4gICAgICAgICAgICA6IFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIF9pbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSAmJlxuICAgICAgICAgICAgICAoZm91bmRXaWxsVXBkYXRlTmFtZSA9IFwiVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGVcIik7XG4gICAgICAgICAgaWYgKG51bGwgIT09IHN0YXRlIHx8IG51bGwgIT09IGxhbmUgfHwgbnVsbCAhPT0gZm91bmRXaWxsVXBkYXRlTmFtZSkge1xuICAgICAgICAgICAgX2luc3RhbmNlID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgXCJDb21wb25lbnRcIjtcbiAgICAgICAgICAgIHZhciBuZXdBcGlOYW1lID1cbiAgICAgICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wc1xuICAgICAgICAgICAgICAgID8gXCJnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMoKVwiXG4gICAgICAgICAgICAgICAgOiBcImdldFNuYXBzaG90QmVmb3JlVXBkYXRlKClcIjtcbiAgICAgICAgICAgIGRpZFdhcm5BYm91dExlZ2FjeUxpZmVjeWNsZXNBbmREZXJpdmVkU3RhdGUuaGFzKF9pbnN0YW5jZSkgfHxcbiAgICAgICAgICAgICAgKGRpZFdhcm5BYm91dExlZ2FjeUxpZmVjeWNsZXNBbmREZXJpdmVkU3RhdGUuYWRkKF9pbnN0YW5jZSksXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgXCJVbnNhZmUgbGVnYWN5IGxpZmVjeWNsZXMgd2lsbCBub3QgYmUgY2FsbGVkIGZvciBjb21wb25lbnRzIHVzaW5nIG5ldyBjb21wb25lbnQgQVBJcy5cXG5cXG4lcyB1c2VzICVzIGJ1dCBhbHNvIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgbGVnYWN5IGxpZmVjeWNsZXM6JXMlcyVzXFxuXFxuVGhlIGFib3ZlIGxpZmVjeWNsZXMgc2hvdWxkIGJlIHJlbW92ZWQuIExlYXJuIG1vcmUgYWJvdXQgdGhpcyB3YXJuaW5nIGhlcmU6XFxuaHR0cHM6Ly9yZWFjdC5kZXYvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXNcIixcbiAgICAgICAgICAgICAgICBfaW5zdGFuY2UsXG4gICAgICAgICAgICAgICAgbmV3QXBpTmFtZSxcbiAgICAgICAgICAgICAgICBudWxsICE9PSBzdGF0ZSA/IFwiXFxuICBcIiArIHN0YXRlIDogXCJcIixcbiAgICAgICAgICAgICAgICBudWxsICE9PSBsYW5lID8gXCJcXG4gIFwiICsgbGFuZSA6
15852IFwiXCIsXG4gICAgICAgICAgICAgICAgbnVsbCAhPT0gZm91bmRXaWxsVXBkYXRlTmFtZSA/IFwiXFxuICBcIiArIGZvdW5kV2lsbFVwZGF0ZU5hbWUgOiBcIlwiXG4gICAgICAgICAgICAgICkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBfaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICAgIHN0YXRlID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgXCJDb21wb25lbnRcIjtcbiAgICAgICAgX2luc3RhbmNlLnJlbmRlciB8fFxuICAgICAgICAgIChDb21wb25lbnQucHJvdG90eXBlICYmXG4gICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgQ29tcG9uZW50LnByb3RvdHlwZS5yZW5kZXJcbiAgICAgICAgICAgID8gY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBcIk5vIGByZW5kZXJgIG1ldGhvZCBmb3VuZCBvbiB0aGUgJXMgaW5zdGFuY2U6IGRpZCB5b3UgYWNjaWRlbnRhbGx5IHJldHVybiBhbiBvYmplY3QgZnJvbSB0aGUgY29uc3RydWN0b3I/XCIsXG4gICAgICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgIFwiTm8gYHJlbmRlcmAgbWV0aG9kIGZvdW5kIG9uIHRoZSAlcyBpbnN0YW5jZTogeW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBkZWZpbmUgYHJlbmRlcmAuXCIsXG4gICAgICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICAgICAgKSk7XG4gICAgICAgICFfaW5zdGFuY2UuZ2V0SW5pdGlhbFN0YXRlIHx8XG4gICAgICAgICAgX2luc3RhbmNlLmdldEluaXRpYWxTdGF0ZS5pc1JlYWN0Q2xhc3NBcHByb3ZlZCB8fFxuICAgICAgICAgIF9pbnN0YW5jZS5zdGF0ZSB8fFxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcImdldEluaXRpYWxTdGF0ZSB3YXMgZGVmaW5lZCBvbiAlcywgYSBwbGFpbiBKYXZhU2NyaXB0IGNsYXNzLiBUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBjbGFzc2VzIGNyZWF0ZWQgdXNpbmcgUmVhY3QuY3JlYXRlQ2xhc3MuIERpZCB5b3UgbWVhbiB0byBkZWZpbmUgYSBzdGF0ZSBwcm9wZXJ0eSBpbnN0ZWFkP1wiLFxuICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICApO1xuICAgICAgICBfaW5zdGFuY2UuZ2V0RGVmYXVsdFByb3BzICYmXG4gICAgICAgICAgIV9pbnN0YW5jZS5nZXREZWZhdWx0UHJvcHMuaXNSZWFjdENsYXNzQXBwcm92ZWQgJiZcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJnZXREZWZhdWx0UHJvcHMgd2FzIGRlZmluZWQgb24gJXMsIGEgcGxhaW4gSmF2YVNjcmlwdCBjbGFzcy4gVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgY2xhc3NlcyBjcmVhdGVkIHVzaW5nIFJlYWN0LmNyZWF0ZUNsYXNzLiBVc2UgYSBzdGF0aWMgcHJvcGVydHkgdG8gZGVmaW5lIGRlZmF1bHRQcm9wcyBpbnN0ZWFkLlwiLFxuICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICApO1xuICAgICAgICBfaW5zdGFuY2UuY29udGV4dFR5cGUgJiZcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJjb250ZXh0VHlwZSB3YXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcy4gVXNlIGEgc3RhdGljIHByb3BlcnR5IHRvIGRlZmluZSBjb250ZXh0VHlwZSBpbnN0ZWFkLlwiLFxuICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICApO1xuICAgICAgICBDb21wb25lbnQuY2hpbGRDb250ZXh0VHlwZXMgJiZcbiAgICAgICAgICAhZGlkV2FybkFib3V0Q2hpbGRDb250ZXh0VHlwZXMuaGFzKENvbXBvbmVudCkgJiZcbiAgICAgICAgICAoZGlkV2FybkFib3V0Q2hpbGRDb250ZXh0VHlwZXMuYWRkKENvbXBvbmVudCksXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiJXMgdXNlcyB0aGUgbGVnYWN5IGNoaWxkQ29udGV4dFR5cGVzIEFQSSB3aGljaCB3YXMgcmVtb3ZlZCBpbiBSZWFjdCAxOS4gVXNlIFJlYWN0LmNyZWF0ZUNvbnRleHQoKSBpbnN0ZWFkLiAoaHR0cHM6Ly9yZWFjdC5kZXYvbGluay9sZWdhY3ktY29udGV4dClcIixcbiAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICAgKSk7XG4gICAgICAgIENvbXBvbmVudC5jb250ZXh0VHlwZXMgJiZcbiAgICAgICAgICAhZGlkV2FybkFib3V0Q29udGV4dFR5cGVzJDEuaGFzKENvbXBvbmVudCkgJiZcbiAgICAgICAgICAoZGlkV2FybkFib3V0Q29udGV4dFR5cGVzJDEuYWRkKENvbXBvbmVudCksXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiJXMgdXNlcyB0aGUgbGVnYWN5IGNvbnRleHRUeXBlcyBBUEkgd2hpY2ggd2FzIHJlbW92ZWQgaW4gUmVhY3QgMTkuIFVzZSBSZWFjdC5jcmVhdGVDb250ZXh0KCkgd2l0aCBzdGF0aWMgY29udGV4dFR5cGUgaW5zdGVhZC4gKGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvbGVnYWN5LWNvbnRleHQpXCIsXG4gICAgICAgICAgICBzdGF0ZVxuICAgICAgICAgICkpO1xuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBfaW5zdGFuY2UuY29tcG9uZW50U2hvdWxkVXBkYXRlICYmXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCBjb21wb25lbnRTaG91bGRVcGRhdGUoKS4gRGlkIHlvdSBtZWFuIHNob3VsZENvbXBvbmVudFVwZGF0ZSgpPyBUaGUgbmFtZSBpcyBwaHJhc2VkIGFzIGEgcXVlc3Rpb24gYmVjYXVzZSB0aGUgZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8gcmV0dXJuIGEgdmFsdWUuXCIsXG4gICAgICAgICAgICBzdGF0ZVxuICAgICAgICAgICk7XG4gICAgICAgIENvbXBvbmVudC5wcm90b3R5cGUgJiZcbiAgICAgICAgICBDb21wb25lbnQucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50ICYmXG4gICAgICAgICAgXCJ1bmRlZmluZWRcIiAhPT0gdHlwZW9mIF9pbnN0YW5jZS5zaG91bGRDb21wb25lbnRVcGRhdGUgJiZcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCIlcyBoYXMgYSBtZXRob2QgY2FsbGVkIHNob3VsZENvbXBvbmVudFVwZGF0ZSgpLiBzaG91bGRDb21wb25lbnRVcGRhdGUgc2hvdWxkIG5vdCBiZSB1c2VkIHdoZW4gZXh0ZW5kaW5nIFJlYWN0LlB1cmVDb21wb25lbnQuIFBsZWFzZSBleHRlbmQgUmVhY3QuQ29tcG9uZW50IGlmIHNob3VsZENvbXBvbmVudFVwZGF0ZSBpcyB1c2VkLlwiLFxuICAgICAgICAgICAgZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKENvbXBvbmVudCkgfHwgXCJBIHB1cmUgY29tcG9uZW50XCJcbiAgICAgICAgICApO1xuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBfaW5zdGFuY2UuY29tcG9uZW50RGlkVW5tb3VudCAmJlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIiVzIGhhcyBhIG
158521ldGhvZCBjYWxsZWQgY29tcG9uZW50RGlkVW5tb3VudCgpLiBCdXQgdGhlcmUgaXMgbm8gc3VjaCBsaWZlY3ljbGUgbWV0aG9kLiBEaWQgeW91IG1lYW4gY29tcG9uZW50V2lsbFVubW91bnQoKT9cIixcbiAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICAgKTtcbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgX2luc3RhbmNlLmNvbXBvbmVudERpZFJlY2VpdmVQcm9wcyAmJlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIiVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgY29tcG9uZW50RGlkUmVjZWl2ZVByb3BzKCkuIEJ1dCB0aGVyZSBpcyBubyBzdWNoIGxpZmVjeWNsZSBtZXRob2QuIElmIHlvdSBtZWFudCB0byB1cGRhdGUgdGhlIHN0YXRlIGluIHJlc3BvbnNlIHRvIGNoYW5naW5nIHByb3BzLCB1c2UgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpLiBJZiB5b3UgbWVhbnQgdG8gZmV0Y2ggZGF0YSBvciBydW4gc2lkZS1lZmZlY3RzIG9yIG11dGF0aW9ucyBhZnRlciBSZWFjdCBoYXMgdXBkYXRlZCB0aGUgVUksIHVzZSBjb21wb25lbnREaWRVcGRhdGUoKS5cIixcbiAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICAgKTtcbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgX2luc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMgJiZcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCIlcyBoYXMgYSBtZXRob2QgY2FsbGVkIGNvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMoKS4gRGlkIHlvdSBtZWFuIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKT9cIixcbiAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICAgKTtcbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgX2luc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjaWV2ZVByb3BzICYmXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcygpLiBEaWQgeW91IG1lYW4gVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoKT9cIixcbiAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICAgKTtcbiAgICAgICAgbGFuZSA9IF9pbnN0YW5jZS5wcm9wcyAhPT0gbm
15852V4dFByb3BzO1xuICAgICAgICB2b2lkIDAgIT09IF9pbnN0YW5jZS5wcm9wcyAmJlxuICAgICAgICAgIGxhbmUgJiZcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJXaGVuIGNhbGxpbmcgc3VwZXIoKSBpbiBgJXNgLCBtYWtlIHN1cmUgdG8gcGFzcyB1cCB0aGUgc2FtZSBwcm9wcyB0aGF0IHlvdXIgY29tcG9uZW50J3MgY29uc3RydWN0b3Igd2FzIHBhc3NlZC5cIixcbiAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICAgKTtcbiAgICAgICAgX2luc3RhbmNlLmRlZmF1bHRQcm9wcyAmJlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIlNldHRpbmcgZGVmYXVsdFByb3BzIGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IG9uICVzIGlzIG5vdCBzdXBwb3J0ZWQgYW5kIHdpbGwgYmUgaWdub3JlZC4gSW5zdGVhZCwgZGVmaW5lIGRlZmF1bHRQcm9wcyBhcyBhIHN0YXRpYyBwcm9wZXJ0eSBvbiAlcy5cIixcbiAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICApO1xuICAgICAgICBcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBfaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgfHxcbiAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBfaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlIHx8XG4gICAgICAgICAgZGlkV2FybkFib3V0R2V0U25hcHNob3RCZWZvcmVVcGRhdGVXaXRob3V0RGlkVXBkYXRlLmhhcyhDb21wb25lbnQpIHx8XG4gICAgICAgICAgKGRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZS5hZGQoQ29tcG9uZW50KSxcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCIlczogZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKSBzaG91bGQgYmUgdXNlZCB3aXRoIGNvbXBvbmVudERpZFVwZGF0ZSgpLiBUaGlzIGNvbXBvbmVudCBkZWZpbmVzIGdldFNuYXBzaG90QmVmb3JlVXBkYXRlKCkgb25seS5cIixcbiAgICAgICAgICAgIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpXG4gICAgICAgICAgKSk7XG4gICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIF9pbnN0YW5jZS5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgJiZcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCIlczogZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKCkgaXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBtZXRob2QgYW5kIHdpbGwgYmUgaWdub3JlZC4gSW5zdGVhZCwgZGVjbGFyZSBpdCBhcyBh
15852IHN0YXRpYyBtZXRob2QuXCIsXG4gICAgICAgICAgICBzdGF0ZVxuICAgICAgICAgICk7XG4gICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIF9pbnN0YW5jZS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgJiZcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCIlczogZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKCkgaXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBtZXRob2QgYW5kIHdpbGwgYmUgaWdub3JlZC4gSW5zdGVhZCwgZGVjbGFyZSBpdCBhcyBhIHN0YXRpYyBtZXRob2QuXCIsXG4gICAgICAgICAgICBzdGF0ZVxuICAgICAgICAgICk7XG4gICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIENvbXBvbmVudC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSAmJlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIiVzOiBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSgpIGlzIGRlZmluZWQgYXMgYSBzdGF0aWMgbWV0aG9kIGFuZCB3aWxsIGJlIGlnbm9yZWQuIEluc3RlYWQsIGRlY2xhcmUgaXQgYXMgYW4gaW5zdGFuY2UgbWV0aG9kLlwiLFxuICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICApO1xuICAgICAgICAobGFuZSA9IF9pbnN0YW5jZS5zdGF0ZSkgJiZcbiAgICAgICAgICAoXCJvYmplY3RcIiAhPT0gdHlwZW9mIGxhbmUgfHwgaXNBcnJheUltcGwobGFuZSkpICYmXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIiVzLnN0YXRlOiBtdXN0IGJlIHNldCB0byBhbiBvYmplY3Qgb3IgbnVsbFwiLCBzdGF0ZSk7XG4gICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIF9pbnN0YW5jZS5nZXRDaGlsZENvbnRleHQgJiZcbiAgICAgICAgICBcIm9iamVjdFwiICE9PSB0eXBlb2YgQ29tcG9uZW50LmNoaWxkQ29udGV4dFR5cGVzICYmXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiJXMuZ2V0Q2hpbGRDb250ZXh0KCk6IGNoaWxkQ29udGV4dFR5cGVzIG11c3QgYmUgZGVmaW5lZCBpbiBvcmRlciB0byB1c2UgZ2V0Q2hpbGRDb250ZXh0KCkuXCIsXG4gICAgICAgICAgICBzdGF0ZVxuICAgICAgICAgICk7XG4gICAgICAgIF9pbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgX2luc3RhbmNlLnByb3BzID0gbmV4dFByb3BzO1xuICAgICAgICBfaW5zdGFuY2Uuc3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICAgICAgICBfaW5zdGFuY2UucmVmcyA9IHt9O1xuICAgICAgICBpbml0aWFsaXplVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICBzdGF0ZSA9IENvbXBvbmVudC5jb250ZXh0VHlwZTtcbiAgICAgICAgX2luc3RhbmNlLmNvbnRleHQgPVxuICAgICAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiBzdGF0ZSAmJiBudWxsICE9PSBzdGF0ZVxuICAgICAgICAgICAgPyByZWFkQ29udGV4dChzdGF0ZSlcbiAgICAgICAgICAgIDogZW1wdHlDb250ZXh0T2JqZWN0O1xuICAgICAgICBfaW5zdGFuY2Uuc3RhdGUgPT09IG5leHRQcm9wcyAmJlxuICAgICAgICAgICgoc3RhdGUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCBcIkNvbXBvbmVudFwiKSxcbiAgICAgICAgICBkaWRXYXJuQWJvdXREaXJlY3RseUFzc2lnbmluZ1Byb3BzVG9TdGF0ZS5oYXMoc3RhdGUpIHx8XG4gICAgICAgICAgICAoZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGUuYWRkKHN0YXRlKSxcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIFwiJXM6IEl0IGlzIG5vdCByZWNvbW1lbmRlZCB0byBhc3NpZ24gcHJvcHMgZGlyZWN0bHkgdG8gc3RhdGUgYmVjYXVzZSB1cGRhdGVzIHRvIHByb3BzIHdvbid0IGJlIHJlZmxlY3RlZCBpbiBzdGF0ZS4gSW4gbW9zdCBjYXNlcywgaXQgaXMgYmV0dGVyIHRvIHVzZSBwcm9wcyBkaXJlY3RseS5cIixcbiAgICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICAgICkpKTtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUgJiZcbiAgICAgICAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5yZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZyhcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgX2luc3RhbmNlXG4gICAgICAgICAgKTtcbiAgICAgICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MucmVjb3JkVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3MoXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgX2luc3RhbmNlXG4gICAgICAgICk7XG4gICAgICAgIF9pbnN0YW5jZS5zdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gICAgICAgIHN0YXRlID0gQ29tcG9uZW50LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcztcbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2Ygc3RhdGUgJiZcbiAgICAgICAgICAoYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMoXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgIENvbXBvbmVudCxcbiAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgbmV4dFByb3BzXG4gICAgICAgICAgKSxcbiAgICAgICAgICAoX2luc3RhbmNlLnN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSkpO1xuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBDb21wb25lbnQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzIHx8XG4gICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgX2luc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlIHx8XG4gICAgICAgICAgKFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIF9pbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ICYmXG4gICAgICAgICAgICBcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBfaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50KSB8fFxuICAgICAgICAgICgoc3RhdGUgPSBfaW5zdGFuY2Uuc3RhdGUpLFxuICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIF9pbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgJiZcbiAgICAgICAgICAgIF9pbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQoKSxcbiAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBfaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCAmJlxuICAgICAgICAgICAgX2luc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKSxcbiAgICAgICAgICBzdGF0ZSAhPT0gX2luc3RhbmNlLnN0YXRlICYmXG4gICAgICAgICAgICAoY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCIlcy5jb21wb25lbnRXaWxsTW91bnQoKTogQXNzaWduaW5nIGRpcmVjdGx5IHRvIHRoaXMuc3RhdGUgaXMgZGVwcmVjYXRlZCAoZXhjZXB0IGluc2lkZSBhIGNvbXBvbmVudCdzIGNvbnN0cnVjdG9yKS4gVXNlIHNldFN0YXRlIGluc3RlYWQuXCIsXG4gICAgICAgICAgICAgIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIod29ya0luUHJvZ3Jlc3MpIHx8IFwiQ29tcG9uZW50XCJcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBjbGFzc0NvbXBvbmVudFVwZGF0ZXIuZW5xdWV1ZVJlcGxhY2VTdGF0ZShcbiAgICAgICAgICAgICAgX2luc3RhbmNlLFxuICAgICAgICAgICAgICBfaW5zdGFuY2Uuc3RhdGUsXG4gICAgICAgICAgICAgIG51bGxcbiAgICAgICAgICAgICkpLFxuICAgICAgICAgI
15852HByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgbmV4dFByb3BzLCBfaW5zdGFuY2UsIHJlbmRlckxhbmVzKSxcbiAgICAgICAgICBzdXNwZW5kSWZVcGRhdGVSZWFkRnJvbUVudGFuZ2xlZEFzeW5jQWN0aW9uKCksXG4gICAgICAgICAgKF9pbnN0YW5jZS5zdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUpKTtcbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgX2luc3RhbmNlLmNvbXBvbmVudERpZE1vdW50ICYmXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDQxOTQzMDgpO1xuICAgICAgICAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlICYmXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDI2ODQzNTQ1Nik7XG4gICAgICAgIF9pbnN0YW5jZSA9ICEwO1xuICAgICAgfSBlbHNlIGlmIChudWxsID09PSBjdXJyZW50KSB7XG4gICAgICAgIF9pbnN0YW5jZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgdmFyIHVucmVzb2x2ZWRPbGRQcm9wcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHM7XG4gICAgICAgIGxhbmUgPSByZXNvbHZlQ2xhc3NDb21wb25lbnRQcm9wcyhDb21wb25lbnQsIHVucmVzb2x2ZWRPbGRQcm9wcyk7XG4gICAgICAgIF9pbnN0YW5jZS5wcm9wcyA9IGxhbmU7XG4gICAgICAgIHZhciBvbGRDb250ZXh0ID0gX2luc3RhbmNlLmNvbnRleHQ7XG4gICAgICAgIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSBDb21wb25lbnQuY29udGV4dFR5cGU7XG4gICAgICAgIHN0YXRlID0gZW1wdHlDb250ZXh0T2JqZWN0O1xuICAgICAgICBcIm9iamVjdFwiID09PSB0eXBlb2YgZm91bmRXaWxsVXBkYXRlTmFtZSAmJlxuICAgICAgICAgIG51bGwgIT09IGZvdW5kV2lsbFVwZGF0ZU5hbWUgJiZcbiAgICAgICAgICAoc3RhdGUgPSByZWFkQ29udGV4dChmb3VuZFdpbGxVcGRhdGVOYW1lKSk7XG4gICAgICAgIG5ld0FwaU5hbWUgPSBDb21wb25lbnQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzO1xuICAgICAgICBmb3VuZFdpbGxVcGRhdGVOYW1lID1cbiAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBuZXdBcGlOYW1lIHx8XG4gICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgX2luc3RhbmNlLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlO1xuICAgICAgICB1bnJlc29sdmVkT2xkUHJvcHMgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMgIT09IHVucmVzb2x2ZWRPbGRQcm9wcztcbiAgICAgICAgZm91bmRXaWxsVXBkYXRlTmFtZSB8fFxuICAgICAgICAgIChcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBfaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgJiZcbiAgICAgICAgICAgIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIF9pbnN0YW5jZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKSB8fFxuICAgICAgICAgICgodW5yZXNvbHZlZE9sZFByb3BzIHx8IG9sZENvbnRleHQgIT09IHN0YXRlKSAmJlxuICAgICAgICAgICAgY2FsbENvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICBfaW5zdGFuY2UsXG4gICAgICAgICAgICAgIG5leHRQcm9wcyxcbiAgICAgICAgICAgICAgc3RhdGVcbiAgICAgICAgICAgICkpO1xuICAgICAgICBoYXNGb3JjZVVwZGF0ZSA9ICExO1xuICAgICAgICB2Y
15852XIgb2xkU3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICAgICAgICBfaW5zdGFuY2Uuc3RhdGUgPSBvbGRTdGF0ZTtcbiAgICAgICAgcHJvY2Vzc1VwZGF0ZVF1ZXVlKHdvcmtJblByb2dyZXNzLCBuZXh0UHJvcHMsIF9pbnN0YW5jZSwgcmVuZGVyTGFuZXMpO1xuICAgICAgICBzdXNwZW5kSWZVcGRhdGVSZWFkRnJvbUVudGFuZ2xlZEFzeW5jQWN0aW9uKCk7XG4gICAgICAgIG9sZENvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICAgICAgICB1bnJlc29sdmVkT2xkUHJvcHMgfHwgb2xkU3RhdGUgIT09IG9sZENvbnRleHQgfHwgaGFzRm9yY2VVcGRhdGVcbiAgICAgICAgICA/IChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBuZXdBcGlOYW1lICYmXG4gICAgICAgICAgICAgIChhcHBseURlcml2ZWRTdGF0ZUZyb21Qcm9wcyhcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgICBDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgbmV3QXBpTmFtZSxcbiAgICAgICAgICAgICAgICBuZXh0UHJvcHNcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKG9sZENvbnRleHQgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlKSksXG4gICAgICAgICAgICAobGFuZSA9XG4gICAgICAgICAgICAgIGhhc0ZvcmNlVXBkYXRlIHx8XG4gICAgICAgICAgICAgIGNoZWNrU2hvdWxkQ29tcG9uZW50VXBkYXRlKFxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICAgIENvbXBvbmVudCxcbiAgICAgICAgICAgICAgICBsYW5lLFxuICAgICAgICAgICAgICAgIG5leHRQcm9wcyxcbiAgICAgICAgICAgICAgICBvbGRTdGF0ZSxcbiAgICAgICAgICAgICAgICBvbGRDb250ZXh0LFxuICAgICAgICAgICAgICAgIHN0YXRlXG4gICAgICAgICAgICAgICkpXG4gICAgICAgICAgICAgID8gKGZvdW5kV2lsbFVwZGF0ZU5hbWUgfHxcbiAgICAgICAgICAgICAgICAgIChcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBfaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCAmJlxuICAgICAgICAgICAgICAgICAgICBcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBfaW5zdGFuY2UuY29tcG9uZW50V2lsbE1vdW50KSB8fFxuICAgICAgICAgICAgICAgICAgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIF9pbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQgJiZcbiAgICAgICAgICAgICAgICAgICAgX2luc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCgpLFxuICAgICAgICAgICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgX2luc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgJiZcbiAgICAgICAgICAgICAgICAgICAgX2luc3RhbmNlLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKSksXG4gICAgICAgICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgX2luc3RhbmNlLmNvbXBvbmVudERpZE1vdW50ICYmXG4gICAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gNDE5NDMwOCksXG4gICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBTdHJpY3RFZmZlY3RzTW9kZSkgIT09IE5vTW9kZSAmJlxuICAgICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDI2ODQzNTQ1NikpXG4gICAgICAgICAgICAgIDogKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIF9pbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCAmJlxuICAgICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDQxOTQzMDgpLFxuICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0RWZmZWN0c01vZGUpICE9PSBOb01vZGUgJiZcbiAgICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAyNjg0MzU0NTYpLFxuICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzID0gbmV4dFByb3BzKSxcbiAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IG9sZENvbnRleHQpKSxcbiAgICAgICAgICAgIChfaW5zdGFuY2UucHJvcHMgPSBuZXh0UHJvcHMpLFxuICAgICAgICAgICAgKF9pbnN0YW5jZS5zdGF0ZSA9IG9sZENvbnRleHQpLFxuICAgICAgICAgICAgKF9pbnN0YW5jZS5jb250ZXh0ID0gc3RhdGUpLFxuICAgICAgICAgICAgKF9pbnN0YW5jZSA9IGxhbmUpKVxuICAgICAgICAgIDogKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIF9pbnN0YW5jZS5jb21wb25lbnREaWRNb3VudCAmJlxuICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gNDE5NDMwOCksXG4gICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFN0cmljdEVmZmVjdHNNb2RlKSAhPT0gTm9Nb2RlICYmXG4gICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAyNjg0MzU0NTYpLFxuICAgICAgICAgICAgKF9pbnN0YW5jZSA9ICExKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfaW5zdGFuY2UgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICAgIGNsb25lVXBkYXRlUXVldWUoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICBzdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkUHJvcHM7XG4gICAgICAgIGZvdW5kV2lsbFVwZGF0ZU5hbWUgPSByZXNvbHZlQ2xhc3NDb21wb25lbnRQcm9wcyhDb21wb25lbnQsIHN0YXRlKTtcbiAgICAgICAgX2luc3RhbmNlLnByb3BzID0gZm91bmRXaWxsVXBkYXRlTmFtZTtcbiAgICAgICAgbmV3QXBpTmFtZSA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgICAgICAgb2xkU3RhdGUgPSBfaW5zdGFuY2UuY29udGV4dDtcbiAgICAgICAgb2xkQ29udGV4dCA9IENvbXBvbmVudC5jb250ZXh0VHlwZTtcbiAgICAgICAgbGFuZSA9IGVtcHR5Q29udGV4dE9iamVjdDtcbiAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIG9sZENvbnRleHQgJiZcbiAgICAgICAgICBudWxsICE9PSBvbGRDb250ZXh0ICYmXG4gICAgICAgICAgKGxhbmUgPSByZWFkQ29udGV4dChvbGRDb250ZXh0KSk7XG4gICAgICAgI
15852HVucmVzb2x2ZWRPbGRQcm9wcyA9IENvbXBvbmVudC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM7XG4gICAgICAgIChvbGRDb250ZXh0ID1cbiAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiB1bnJlc29sdmVkT2xkUHJvcHMgfHxcbiAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBfaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUpIHx8XG4gICAgICAgICAgKFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIF9pbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyAmJlxuICAgICAgICAgICAgXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgX2luc3RhbmNlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMpIHx8XG4gICAgICAgICAgKChzdGF0ZSAhPT0gbmV3QXBpTmFtZSB8fCBvbGRTdGF0ZSAhPT0gbGFuZSkgJiZcbiAgICAgICAgICAgIGNhbGxDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKFxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgX2luc3RhbmNlLFxuICAgICAgICAgICAgICBuZXh0UHJvcHMsXG4gICAgICAgICAgICAgIGxhbmVcbiAgICAgICAgICAgICkpO1xuICAgICAgICBoYXNGb3JjZVVwZGF0ZSA9ICExO1xuICAgICAgICBvbGRTdGF0ZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gICAgICAgIF9pbnN0YW5jZS5zdGF0ZSA9IG9sZFN0YXRlO1xuICAgICAgICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG5leHRQcm9wcywgX2luc3RhbmNlLCByZW5kZXJMYW5lcyk7XG4gICAgICAgIHN1c3BlbmRJZlVwZGF0ZVJlYWRGcm9tRW50YW5nbGVkQXN5bmNBY3Rpb24oKTtcbiAgICAgICAgdmFyIG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgc3RhdGUgIT09IG5ld0FwaU5hbWUgfHxcbiAgICAgICAgb2xkU3RhdGUgIT09IG5ld1N0YXRlIHx8XG4gICAgICAgIGhhc0ZvcmNlVXBkYXRlIHx8XG4gICAgICAgIChudWxsICE9PSBjdXJyZW50ICYmXG4gICAgICAgICAgbnVsbCAhPT0gY3VycmVudC5kZXBlbmRlbmNpZXMgJiZcbiAgICAgICAgICBjaGVja0lmQ29udGV4dENoYW5nZWQoY3VycmVudC5kZXBlbmRlbmNpZXMpKVxuICAgICAgICAgID8gKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHVucmVzb2x2ZWRPbGRQcm9wcyAmJlxuICAgICAgICAgICAgICAoYXBwbHlEZXJpdmVkU3RhdGVGcm9tUHJvcHMoXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgIHVucmVzb2x2ZWRPbGRQcm9wcyxcbiAgICAgICAgICAgICAgICBuZXh0UHJvcHNcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKG5ld1N0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSkpLFxuICAgICAgICAgICAgKGZvdW5kV2lsbFVwZGF0ZU5hbWUgPVxuICAgICAgICAgICAgICBoYXNGb3JjZVVwZGF0ZSB8fFxuICAgICAgICAgICAgICBjaGVja1Nob3VsZENvbXBvbmVudFVwZGF0ZShcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgICBDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgZm91bmRXaWxsVXBkYXRlTmFtZSxcbiAgICAgICAgICAgICAgICBuZXh0UHJvcHMsXG4gICAgICAgICAgICAgICAgb2xkU3RhdGUsXG4gICAgICAgICAgICAgICAgbmV3U3RhdGUsXG4gICAgICAgICAgICAgICAgbGFuZVxuICAgICAgICAgICAgICApIHx8XG4gICAgICAgICAgICAgIChudWxsICE9PSBjdXJyZW50ICYmXG4gICAgICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudC5kZXBlbmRlbmNpZXMgJiZcbiAgICAgICAgICAgICAgICBjaGVja0lmQ29udGV4dENoYW5nZWQoY3VycmVudC5kZXBlbmRlbmNpZXMpKSlcbiAgICAgICAgICAgICAgPyAob2xkQ29udGV4dCB8fFxuICAgICAgICAgICAgICAgICAgKFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIF9pbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSAmJlxuICAgICAgICAgICAgICAgICAgICBcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBfaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBfaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZSAmJlxuICAgICAgICAgICAgICAgICAgICBfaW5zdGFuY2UuY29tcG9uZW50V2lsbFVwZGF0ZShuZXh0UHJvcHMsIG5ld1N0YXRlLCBsYW5lKSxcbiAgICAgICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIF9pbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSAmJlxuICAgICAgICAgICAgICAgICAgICBfaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgbmV4dFByb3BzLFxuICAgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgIGxhbmVcbiAgICAgICAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgX2luc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZSAmJlxuICAgICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDQpLFxuICAgICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIF9pbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSAmJlxuICAgICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDEwMjQpKVxuICAgICAgICAgICAgICA6IChcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBfaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlIHx8XG4gICAgICAgICAgICAgICAgICAoc3RhdGUgPT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyAmJlxuICAgICAgICAgICAgICAgICAgICBvbGRTdGF0ZSA9PT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB8fFxuICAgICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDQpLFxuICAgICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIF9pbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSB8fFxuICAgICAgICAgICAgICAgICAgKHN0YXRlID09PSBjdXJyZW50Lm1lbW9pemVkUHJvcHMgJiZcbiAgICAgICAgICAgICAgICAgICAgb2xkU3RhdGUgPT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAxMDI0KSxcbiAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcyA9IG5leHRQcm9wcyksXG4gICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBuZXdTdGF0ZSkpLFxuICAgICAgICAgICAgKF9pbnN0YW5jZS5wcm9wcyA9IG5leHRQcm9wcyksXG4gICAgICAgICAgICAoX2luc3RhbmNlLnN0YXRlID0gbmV3U3RhdGUpLFxuICAgICAgICAgICAgKF9pbnN0YW5jZS5jb250ZXh0ID0gbGFuZSksXG4gICAgICAgICAgICAoX2luc3RhbmNlID0gZm91bmRXaWxsVXBkYXRlTmFtZSkpXG4gICAgICAgICAgOiAoXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgX2luc3RhbmNlLmNvbXBvbmVudERpZFVwZGF0ZSB8fFxuICAgICAgICAgICAgICAoc3RhdGUgPT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyAmJlxuICAgICAgICAgICAgICAgIG9sZFN0YXRlID09PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHx8XG4gICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA0KSxcbiAgICAgICAgICAgIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIF9pbnN0YW5jZS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSB8fFxuICAgICAgICAgICAgICAoc3RhdGUgPT09IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyAmJlxuICAgICAgICAgICAgICAgIG9sZFN0YXRlID09PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHx8XG4gICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAxMDI0KSxcbiAgICAgICAgICAgIChfaW5zdGFuY2UgPSAhMSkpO1xuICAgICAgfVxuICAgICAgbGFuZSA9IF9pbnN0YW5jZTtcbiAgICAgIG1hcmtSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgc3RhdGUgPSAwICE9PSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiAxMjgpO1xuICAgICAgaWYgKGxhbmUgfHwgc3RhdGUpIHtcbiAgICAgICAgbGFuZSA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgc2V0Q3VycmVudEZpYmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgaWYgKHN0YXRlICYmIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIENvbXBvbmVudC5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IpXG4gICAgICAgICAgKENvbXBvbmVudCA9IG51bGwpLCAocHJvZmlsZXJTdGFydFRpbWUgPSAtMSk7XG4gICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICgoQ29tcG9uZW50ID0gY2FsbFJlbmRlckluREVWKGxhbmUpKSxcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3RyaWN0TGVnYWN5TW9kZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoITApO1xuICAgICAgICAgI
15852HRyeSB7XG4gICAgICAgICAgICBjYWxsUmVuZGVySW5ERVYobGFuZSk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHNldElzU3RyaWN0TW9kZUZvckRldnRvb2xzKCExKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMTtcbiAgICAgICAgbnVsbCAhPT0gY3VycmVudCAmJiBzdGF0ZVxuICAgICAgICAgID8gKCh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlY29uY2lsZUNoaWxkRmliZXJzKFxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgY3VycmVudC5jaGlsZCxcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmNoaWxkID0gcmVjb25jaWxlQ2hpbGRGaWJlcnMoXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICBDb21wb25lbnQsXG4gICAgICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICAgICApKSlcbiAgICAgICAgICA6IHJlY29uY2lsZUNoaWxkcmVuKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCBDb21wb25lbnQsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IGxhbmUuc3RhdGU7XG4gICAgICAgIGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDtcbiAgICAgIH0gZWxzZVxuICAgICAgICBjdXJyZW50ID0gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhcbiAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICk7XG4gICAgICByZW5kZXJMYW5lcyA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgIF9pbnN0YW5jZSAmJlxuICAgICAgICByZW5kZXJMYW5lcy5wcm9wcyAhPT0gbm
15852V4dFByb3BzICYmXG4gICAgICAgIChkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzIHx8XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiSXQgbG9va3MgbGlrZSAlcyBpcyByZWFzc2lnbmluZyBpdHMgb3duIGB0aGlzLnByb3BzYCB3aGlsZSByZW5kZXJpbmcuIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBhbmQgY2FuIGxlYWQgdG8gY29uZnVzaW5nIGJ1Z3MuXCIsXG4gICAgICAgICAgICBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKHdvcmtJblByb2dyZXNzKSB8fCBcImEgY29tcG9uZW50XCJcbiAgICAgICAgICApLFxuICAgICAgICAoZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcyA9ICEwKSk7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgZnVuY3Rpb24gbW91bnRIb3N0Um9vdFdpdGhvdXRIeWRyYXRpbmcoXG4gICAgICBjdXJyZW50LFxuICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICBuZXh0Q2hpbGRyZW4sXG4gICAgICByZW5kZXJMYW5lc1xuICAgICkge1xuICAgICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMjU2O1xuICAgICAgcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5leHRDaGlsZHJlbiwgcmVuZGVyTGFuZXMpO1xuICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgIH1cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZUZ1bmN0aW9uQ29tcG9uZW50SW5EZXYod29ya0luUHJvZ3Jlc3MsIENvbXBvbmVudCkge1xuICAgICAgQ29tcG9uZW50ICYmXG4gICAgICAgIENvbXBvbmVudC5jaGlsZENvbnRleHRUeXBlcyAmJlxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiY2hpbGRDb250ZXh0VHlwZXMgY2Fubm90IGJlIGRlZmluZWQgb24gYSBmdW5jdGlvbiBjb21wb25lbnQuXFxuICAlcy5jaGlsZENvbnRleHRUeXBlcyA9IC4uLlwiLFxuICAgICAgICAgIENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCBcIkNvbXBvbmVudFwiXG4gICAgICAgICk7XG4gICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBDb21wb25lbnQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzICYmXG4gICAgICAgICgod29ya0luUHJvZ3Jlc3MgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoQ29tcG9uZW50KSB8fCBcIlVua25vd25cIiksXG4gICAgICAgIGRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnRbd29ya0luUHJvZ3Jlc3NdIHx8XG4gICAgICAgICAgKGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIiVzOiBGdW5jdGlvbiBjb21wb25lbnRzIGRvIG5vdCBzdXBwb3J0IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcy5cIixcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzXG4gICAgICAgICAgKSxcbiAgICAgICAgICAoZGlkV2FybkFib3V0R2V0RGVyaXZlZFN0YXRlT25GdW5jdGlvbkNvbXBvbmVudFt3b3JrSW5Qcm9ncmVzc10gPVxuICAgICAgICAgICAgITApKSk7XG4gICAgICBcIm9iamVjdFwiID09PSB0eXBlb2YgQ29tcG9uZW50LmNvbnRleHRUeXBlICYmXG4gICAgICAgIG51bGwgIT09IENvbXBvbmVudC5jb250ZXh0VHlwZSAmJlxuICAgICAgICAoKENvbXBvbmVudCA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShDb21wb25lbnQpIHx8IFwiVW5rbm93blwiKSxcbiAgICAgICAgZGlkV2FybkFib3V0Q29udGV4dFR5cGVPbkZ1bmN0aW9uQ29tcG9uZW50W0NvbXBvbmVudF0gfHxcbiAgICAgICAgICAoY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiJXM6IEZ1bmN0aW9uIGNvbXBvbmVudHMgZG8gbm90IHN1cHBvcnQgY29udGV4dFR5cGUuXCIsXG4gICAgICAgICAgICBDb21wb25lbnRcbiAgICAgICAgICApLFxuICAgICAgICAgIChkaWRXYXJuQWJvdXRDb250ZXh0VHlwZU9uRnVuY3Rpb25Db21wb25lbnRbQ29tcG9uZW50XSA9ICEwKSkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtb3VudFN1c3BlbnNlT2Zmc2NyZWVuU3RhdGUocmVuZGVyTGFuZXMpIHtcbiAgICAgIHJldHVybiB7IGJhc2VMYW5lczogcmVuZGVyTGFuZXMsIGNhY2hlUG9vbDogZ2V0U3VzcGVuZGVkQ2FjaGUoKSB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRSZW1haW5pbmdXb3JrSW5QcmltYXJ5VHJlZShcbiAgICAgIGN1cnJlbnQsXG4gICAgICBwcmltYXJ5VHJlZURpZERlZmVyLFxuICAgICAgcmVuZGVyTGFuZXNcbiAgICApIHtcbiAgICAgIGN1cnJlbnQgPSBudWxsICE9PSBjdXJyZW50ID8gY3VycmVudC5jaGlsZExhbmVzICYgfnJlbmRlckxhbmVzIDogMDtcbiAgICAgIHByaW1hcnlUcmVlRGlkRGVmZXIgJiYgKGN1cnJlbnQgfD0gd29ya0luUHJvZ3Jlc3NEZWZlcnJlZExhbmUpO1xuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZVN1c3BlbnNlQ29tcG9uZW50KGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAgICAgdmFyIG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgICAgIHNob3VsZFN1c3BlbmRJbXBsKHdvcmtJblByb2dyZXNzKSAmJiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMTI4KTtcbiAgICAgIHZhciBzaG93RmFsbGJhY2sgPSAhMSxcbiAgICAgICAgZGlkU3VzcGVuZCA9IDAgIT09ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIDEyOCksXG4gICAgICAgIEpTQ29tcGlsZXJfdGVtcDtcbiAgICAgIChKU0NvbXBpbGVyX3RlbXAgPSBkaWRTdXNwZW5kKSB8fFxuICAgICAgICAoSlNDb21waWxlcl90ZW1wID1cbiAgICAgICAgICBudWxsICE9PSBjdXJyZW50ICYmIG51bGwgPT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZVxuICAgICAgICAgICAgPyAhMVxuICAgICAgICAgICAgOiAwICE9PSAoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50ICYgRm9yY2VTdXNwZW5zZUZhbGxiYWNrKSk7XG4gICAgICBKU0NvbXBpbGVyX3RlbXAgJiYgKChzaG93RmFsbGJhY2sgPSAhMCksICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSAtMTI5KSk7XG4gICAgICBKU0NvbXBpbGVyX3RlbXAgPSAwICE9PSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiAzMik7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSAtMzM7XG4gICAgICBpZiAobnVsbCA9PT0gY3VycmVudCkge1xuICAgICAgICBpZiAoaXNIeWRyYXRpbmcpIHtcbiAgICAgICAgICBzaG93RmFsbGJhY2tcbiAgICAgICAgICAgID8gcHVzaFByaW1hcnlUcmVlU3VzcGVuc2VIYW5kbGVyKHdvcmtJblByb2dyZXNzKVxuICAgICAgICAgICAgOiByZXVzZVN1c3BlbnNlSGFuZGxlck9uU3RhY2sod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIChjdXJyZW50ID0gbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSlcbiAgICAgICAgICAgID8gKChyZW5kZXJMYW5lcyA9IGNhbkh5ZHJhdGVIeWRyYXRpb25Cb3VuZGFyeShcbiAgICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICAgI
15852HJvb3RPclNpbmdsZXRvbkNvbnRleHRcbiAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgIChyZW5kZXJMYW5lcyA9XG4gICAgICAgICAgICAgICAgbnVsbCAhPT0gcmVuZGVyTGFuZXMgJiYgcmVuZGVyTGFuZXMuZGF0YSAhPT0gQUNUSVZJVFlfU1RBUlRfREFUQVxuICAgICAgICAgICAgICAgICAgPyByZW5kZXJMYW5lc1xuICAgICAgICAgICAgICAgICAgOiBudWxsKSxcbiAgICAgICAgICAgICAgbnVsbCAhPT0gcmVuZGVyTGFuZXMgJiZcbiAgICAgICAgICAgICAgICAoKEpTQ29tcGlsZXJfdGVtcCA9IHtcbiAgICAgICAgICAgICAgICAgIGRlaHlkcmF0ZWQ6IHJlbmRlckxhbmVzLFxuICAgICAgICAgICAgICAgICAgdHJlZUNvbnRleHQ6IGdldFN1c3BlbmRlZFRyZWVDb250ZXh0KCksXG4gICAgICAgICAgICAgICAgICByZXRyeUxhbmU6IDUzNjg3MDkxMixcbiAgICAgICAgICAgICAgICAgIGh5ZHJhdGlvbkVycm9yczogbnVsbFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gSlNDb21waWxlcl90ZW1wKSxcbiAgICAgICAgICAgICAgICAoSlNDb21waWxlcl90ZW1wID1cbiAgICAgICAgICAgICAgICAgIGNyZWF0ZUZpYmVyRnJvbURlaHlkcmF0ZWRGcmFnbWVudChyZW5kZXJMYW5lcykpLFxuICAgICAgICAgICAgICAgIChKU0NvbXBpbGVyX3RlbXAucmV0dXJuID0gd29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IEpTQ29tcGlsZXJfdGVtcCksXG4gICAgICAgICAgICAgICAgKGh5ZHJhdGlvblBhcmVudEZpYmVyID0gd29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgICAgIChuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gbnVsbCkpKVxuICAgICAgICAgICAgOiAocmVuZGVyTGFuZXMgPSBudWxsKTtcbiAgICAgICAgICBpZiAobnVsbCA9PT0gcmVuZGVyTGFuZXMpXG4gICAgICAgICAgICB0aHJvdyAoXG4gICAgICAgICAgICAgICh3YXJuTm9uSHlkcmF0ZWRJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgY3VycmVudCksXG4gICAgICAgICAgICAgIHRocm93T25IeWRyYXRpb25NaXNtYXRjaCh3b3JrSW5Qcm9ncmVzcykpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGlzU3VzcGVuc2VJbnN0YW5jZUZhbGxiYWNrKHJlbmRlckxhbmVzKVxuICAgICAgICAgICAgPyAod29ya0luUHJvZ3Jlc3MubGFuZXMgPSAzMilcbiAgICAgICAgICAgIDogKHdvcmtJblByb2dyZXNzLmxhbmVzID0gNTM2ODcwOTEyKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBkaWRTdXNwZW5kID0gbmV4dFByb3BzLmNoaWxkcmVuO1xuICAgICAgICBuZXh0UHJvcHMgPSBuZXh0UHJvcHMuZmFsbGJhY2s7XG4gICAgICAgIGlmIChzaG93RmFsbGJhY2spXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHJldXNlU3VzcGVuc2VIYW5kbGVyT25TdGFjayh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAoc2hvd0ZhbGxiYWNrID0gd29ya0luUHJvZ3Jlc3MubW9kZSksXG4gICAgICAgICAgICAoZGlkU3VzcGVuZCA9IG1vdW50V29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihcbiAgICAgICAgICAgICAgeyBtb2RlOiBcImhpZGRlblwiLCBjaGlsZHJlbjogZGlkU3VzcGVuZCB9LFxuICAgICAgICAgICAgICBzaG93RmFsbGJhY2tcbiAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgKG5leHRQcm9wcyA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KFxuICAgICAgICAgICAgICBuZXh0UHJvcHMsXG4gICAgICAgICAgICAgIHNob3dGYWxsYmFjayxcbiAgICAgICAgICAgICAgcmVuZGVyTGFuZXMsXG4gICAgICAgICAgICAgIG51bGxcbiAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgKGRpZFN1c3BlbmQucmV0dXJuID0gd29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgKG5leHRQcm9wcy5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAoZGlkU3VzcGVuZC5zaWJsaW5nID0gbmV4dFByb3BzKSxcbiAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IGRpZFN1c3BlbmQpLFxuICAgICAgICAgICAgKG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLmNoaWxkKSxcbiAgICAgICAgICAgIChuZXh0UHJvcHMubWVtb2l6ZWRTdGF0ZSA9XG4gICAgICAgICAgICAgIG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcykpLFxuICAgICAgICAgICAgKG5leHRQcm9wcy5jaGlsZExhbmVzID0gZ2V0UmVtYWluaW5nV29ya0luUHJpbWFyeVRyZWUoXG4gICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgIEpTQ29tcGlsZXJfdGVtcCxcbiAgICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBTVVNQRU5ERURfTUFSS0VSKSxcbiAgICAgICAgICAgIGJhaWxvdXRPZmZzY3JlZW5Db21wb25lbnQobnVsbCwgbmV4dFByb3BzKVxuICAgICAgICAgICk7XG4gICAgICAgIHB1c2hQcmltYXJ5VHJlZVN1c3BlbnNlSGFuZGxlcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJldHVybiBtb3VudFN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBkaWRTdXNwZW5kKTtcbiAgICAgIH1cbiAgICAgIHZhciBwcmV2U3RhdGUgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGU7XG4gICAgICBpZiAobnVsbCAhPT0gcHJldlN0YXRlKSB7XG4gICAgICAgIHZhciBfZGVoeWRyYXRlZDIgPSBwcmV2U3RhdGUuZGVoeWRyYXRlZDtcbiAgICAgICAgaWYgKG51bGwgIT09IF9kZWh5ZHJhdGVkMilcbiAgICAgICAgICByZXR1cm4gdXBkYXRlRGVoeWRyYXRlZFN1c3BlbnNlQ29tcG9uZW50KFxuICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgZGlkU3VzcGVuZCxcbiAgICAgICAgICAgIEpTQ29tcGlsZXJfdGVtcCxcbiAgICAgICAgICAgIG5leHRQcm9wcyxcbiAgICAgICAgICAgIF9kZWh5ZHJhdGVkMixcbiAgICAgICAgICAgIHByZXZTdGF0ZSxcbiAgICAgICAgICAgI
15852HJlbmRlckxhbmVzXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChzaG93RmFsbGJhY2spXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgcmV1c2VTdXNwZW5zZUhhbmRsZXJPblN0YWNrKHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAoc2hvd0ZhbGxiYWNrID0gbmV4dFByb3BzLmZhbGxiYWNrKSxcbiAgICAgICAgICAoZGlkU3VzcGVuZCA9IHdvcmtJblByb2dyZXNzLm1vZGUpLFxuICAgICAgICAgIChwcmV2U3RhdGUgPSBjdXJyZW50LmNoaWxkKSxcbiAgICAgICAgICAoX2RlaHlkcmF0ZWQyID0gcHJldlN0YXRlLnNpYmxpbmcpLFxuICAgICAgICAgIChuZXh0UHJvcHMgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhwcmV2U3RhdGUsIHtcbiAgICAgICAgICAgIG1vZGU6IFwiaGlkZGVuXCIsXG4gICAgICAgICAgICBjaGlsZHJlbjogbmV4dFByb3BzLmNoaWxkcmVuXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIChuZXh0UHJvcHMuc3VidHJlZUZsYWdzID0gcHJldlN0YXRlLnN1YnRyZWVGbGFncyAmIDEyMDY5MTA5NzYpLFxuICAgICAgICAgIG51bGwgIT09IF9kZWh5ZHJhdGVkMlxuICAgICAgICAgICAgPyAoc2hvd0ZhbGxiYWNrID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoX2RlaHlkcmF0ZWQyLCBzaG93RmFsbGJhY2spKVxuICAgICAgICAgICAgOiAoKHNob3dGYWxsYmFjayA9IGNyZWF0ZUZpYmVyRnJvbUZyYWdtZW50KFxuICAgICAgICAgICAgICAgIHNob3dGYWxsYmFjayxcbiAgICAgICAgICAgICAgICBkaWRTdXNwZW5kLFxuICAgICAgICAgICAgICAgIHJlbmRlckxhbmVzLFxuICAgICAgICAgICAgICAgIG51bGxcbiAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgIChzaG93RmFsbGJhY2suZmxhZ3MgfD0gMikpLFxuICAgICAgICAgIChzaG93RmFsbGJhY2sucmV0dXJuID0gd29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgIChuZXh0UHJvcHMucmV0dXJuID0gd29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgIChuZXh0UHJvcHMuc2libGluZyA9IHNob3dGYWxsYmFjayksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLmNoaWxkID0gbmV4dFByb3BzKSxcbiAgICAgICAgICBiYWlsb3V0T2Zmc2NyZWVuQ29tcG9uZW50KG51bGwsIG5leHRQcm9wcyksXG4gICAgICAgICAgKG5leHRQcm9wcyA9IHdvcmtJblByb2dyZXNzLmNoaWxkKSxcbiAgICAgICAgICAoc2hvd0ZhbGxiYWNrID0gY3VycmVudC5jaGlsZC5tZW1vaXplZFN0YXRlKSxcbiAgICAgICAgICBudWxsID09PSBzaG93RmFsbGJhY2tcbiAgICAgICAgICAgID8gKHNob3dGYWxsYmFjayA9IG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcykpXG4gICAgICAgICAgICA6ICgoZGlkU3VzcGVuZCA9IHNob3dGYWxsYmFjay5jYWNoZVBvb2wpLFxuICAgICAgICAgICAgICBudWxsICE9PSBkaWRTdXNwZW5kXG4gICAgICAgICAgICAgICAgPyAoKHByZXZTdGF0ZSA9IENhY2hlQ29udGV4dC5fY3VycmVudFZhbHVlKSxcbiAgICAgICAgICAgICAgICAgIChkaWRTdXNwZW5kID1cbiAgICAgICAgICAgICAgICAgICAgZGlkU3VzcGVuZC5wYXJlbnQgIT09IHByZXZTdGF0ZVxuICAgICAgICAgICAgICAgICAgICAgID8geyBwYXJlbnQ6IHByZXZTdGF0ZSwgcG9vbDogcHJldlN0YXRlIH1cbiAgICAgICAgICAgICAgICAgICAgICA6IGRpZFN1c3BlbmQpKVxuICAgICAgICAgICAgICAgIDogKGRpZFN1c3BlbmQgPSBnZXRTdXNwZW5kZWRDYWNoZSgpKSxcbiAgICAgICAgICAgICAgKHNob3dGYWxsYmFjayA9IHtcbiAgICAgICAgICAgICAgICBiYXNlTGFuZXM6IHNob3dGYWxsYmFjay5iYXNlTGFuZXMgfCByZW5kZXJMYW5lcyxcbiAgICAgICAgICAgICAgICBjYWNoZVBvb2w6IGRpZFN1c3BlbmRcbiAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgIChuZXh0UHJvcHMubWVtb2l6ZWRTdGF0ZSA9IHNob3dGYWxsYmFjayksXG4gICAgICAgICAgKG5leHRQcm9wcy5jaGlsZExhbmVzID0gZ2V0UmVtYWluaW5nV29ya0luUHJpbWFyeVRyZWUoXG4gICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgSlNDb21waWxlcl90ZW1wLFxuICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICApKSxcbiAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IFNVU1BFTkRFRF9NQVJLRVIpLFxuICAgICAgICAgIGJhaWxvdXRPZmZzY3JlZW5Db21wb25lbnQoY3VycmVudC5jaGlsZCwgbmV4dFByb3BzKVxuICAgICAgICApO1xuICAgICAgbnVsbCAhPT0gcHJldlN0YXRlICYmXG4gICAgICAgIChyZW5kZXJMYW5lcyAmIDYyOTE0NTYwKSA9PT0gcmVuZGVyTGFuZXMgJiZcbiAgICAgICAgMCAhPT0gKHJlbmRlckxhbmVzICYgY3VycmVudC5sYW5lcykgJiZcbiAgICAgICAgbWFya1JlbmRlckRlcml2ZWRDYXVzZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICBwdXNoUHJpbWFyeVRyZWVTdXNwZW5zZUhhbmRsZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgcmVuZGVyTGFuZXMgPSBjdXJyZW50LmNoaWxkO1xuICAgICAgY3VycmVudCA9IHJlbmRlckxhbmVzLnNpYmxpbmc7XG4gICAgICByZW5kZXJMYW5lcyA9IGNyZWF0ZVdvcmtJblByb2dyZXNzKHJlbmRlckxhbmVzLCB7XG4gICAgICAgIG1vZGU6IFwidmlzaWJsZVwiLFxuICAgICAgICBjaGlsZHJlbjogbmV4dFByb3BzLmNoaWxkcmVuXG4gICAgICB9KTtcbiAgICAgIHJlbmRlckxhbmVzLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgcmVuZGVyTGFuZXMuc2libGluZyA9IG51bGw7XG4gICAgICBudWxsICE9PSBjdXJyZW50ICYmXG4gICAgICAgICgoSlNDb21waWxlcl90ZW1wID0gd29ya0luUHJvZ3Jlc3MuZGVsZXRpb25zKSxcbiAgICAgICAgbnVsbCA9PT0gSlNDb21waWxlcl90ZW1wXG4gICAgICAgICAgPyAoKHdvcmtJblByb2dyZXNzLmRlbGV0aW9ucyA9IFtjdXJyZW50XSksXG4gICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMTYpKVxuICAgICAgICAgIDogSlNDb21waWxlcl90ZW1wLnB1c2goY3VycmVudCkpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZW5kZXJMYW5lcztcbiAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIHJlbmRlckxhbmVzO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtb3VudFN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKHdvcmtJblByb2dyZXNzLCBwcmltYXJ5Q2hpbGRyZW4pIHtcbiAgICAgIHByaW1hcnlDaGlsZHJlbiA9IG1vdW50V29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihcbiAgICAgICAgeyBtb2RlOiBcInZpc2libGVcIiwgY2hpbGRyZW46IHByaW1hcnlDaGlsZHJlbiB9LFxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tb2RlXG4gICAgICApO1xuICAgICAgcHJpbWFyeUNoaWxkcmVuLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgcmV0dXJuICh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHByaW1hcnlDaGlsZHJlbik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1vdW50V29ya0luUHJvZ3Jlc3NPZmZzY3JlZW5GaWJlcihvZmZzY3JlZW5Qcm9wcywgbW9kZSkge1xuICAgICAgb2Zmc2NyZWVuUHJvcHMgP
15852SBjcmVhdGVGaWJlcigyMiwgb2Zmc2NyZWVuUHJvcHMsIG51bGwsIG1vZGUpO1xuICAgICAgb2Zmc2NyZWVuUHJvcHMubGFuZXMgPSAwO1xuICAgICAgcmV0dXJuIG9mZnNjcmVlblByb3BzO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXRyeVN1c3BlbnNlQ29tcG9uZW50V2l0aG91dEh5ZHJhdGluZyhcbiAgICAgIGN1cnJlbnQsXG4gICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgIHJlbmRlckxhbmVzXG4gICAgKSB7XG4gICAgICByZWNvbmNpbGVDaGlsZEZpYmVycyh3b3JrSW5Qcm9ncmVzcywgY3VycmVudC5jaGlsZCwgbnVsbCwgcmVuZGVyTGFuZXMpO1xuICAgICAgY3VycmVudCA9IG1vdW50U3VzcGVuc2VQcmltYXJ5Q2hpbGRyZW4oXG4gICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMuY2hpbGRyZW5cbiAgICAgICk7XG4gICAgICBjdXJyZW50LmZsYWdzIHw9IDI7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVEZWh5ZHJhdGVkU3VzcGVuc2VDb21wb25lbnQoXG4gICAgICBjdXJyZW50LFxuICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICBkaWRTdXNwZW5kLFxuICAgICAgZGlkUHJpbWFyeUNoaWxkcmVuRGVmZXIsXG4gICAgICBuZXh0UHJvcHMsXG4gICAgICBzdXNwZW5zZUluc3RhbmNlLFxuICAgICAgc3VzcGVuc2VTdGF0ZSxcbiAgICAgIHJlbmRlckxhbmVzXG4gICAgKSB7XG4gICAgICBpZiAoZGlkU3VzcGVuZCkge1xuICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiAyNTYpXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHB1c2hQcmltYXJ5VHJlZVN1c3BlbnNlSGFuZGxlcih3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gLTI1NyksXG4gICAgICAgICAgICByZXRyeVN1c3BlbnNlQ29tcG9uZW50V2l0aG91dEh5ZHJhdGluZyhcbiAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKG51bGwgIT09IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUpXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHJldXNlU3VzcGVuc2VIYW5kbGVyT25TdGFjayh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBjdXJyZW50LmNoaWxkKSxcbiAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAxMjgpLFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICk7XG4gICAgICAgIHJldXNlU3VzcGVuc2VIYW5kbGVyT25TdGFjayh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHZhciBmYWxsYmFja0NoaWxkcmVuID0gbmV4dFByb3BzLmZhbGxiYWNrLFxuICAgICAgICAgIGZpYmVyTW9kZSA9IHdvcmtJblByb2dyZXNzLm1vZGUsXG4gICAgICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBtb3VudFdvcmtJblByb2dyZXNzT2Zmc2NyZWVuRmliZXIoXG4gICAgICAgICAgICB7IG1vZGU6IFwidmlzaWJsZVwiLCBjaGlsZHJlbjogbmV4dFByb3BzLmNoaWxkcmVuIH0sXG4gICAgICAgICAgICBmaWJlck1vZGVcbiAgICAgICAgICApO1xuICAgICAgICBmYWxsYmFja0NoaWxkcmVuID0gY3JlYXRlRmliZXJGcm9tRnJhZ21lbnQoXG4gICAgICAgICAgZmFsbGJhY2tDaGlsZHJlbixcbiAgICAgICAgICBmaWJlck1vZGUsXG4gICAgICAgICAgcmVuZGVyTGFuZXMsXG4gICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgICBmYWxsYmFja0NoaWxkcmVuLmZsYWdzIHw9IDI7XG4gICAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50LnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgICBmYWxsYmFja0NoaWxkcmVuLnJldHVybiA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgICBwcmltYXJ5Q2hpbGRGcmFnbWVudC5zaWJsaW5nID0gZmFsbGJhY2tDaGlsZHJlbjtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgICAgICAgcmVjb25jaWxlQ2hpbGRGaWJlcnMod29ya0luUHJvZ3Jlc3MsIGN1cnJlbnQuY2hpbGQsIG51bGwsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgZmFsbGJhY2tDaGlsZHJlbiA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICBmYWxsYmFja0NoaWxkcmVuLm1lbW9pemVkU3RhdGUgPVxuICAgICAgICAgIG1vdW50U3VzcGVuc2VPZmZzY3JlZW5TdGF0ZShyZW5kZXJMYW5lcyk7XG4gICAgICAgIGZhbGxiYWNrQ2hpbGRyZW4uY2hpbGRMYW5lcyA9IGdldFJlbWFpbmluZ1dvcmtJblByaW1hcnlUcmVlKFxuICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgZGlkUHJpbWFyeUNoaWxkcmVuRGVmZXIsXG4gICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgKTtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IFNVU1BFTkRFRF9NQVJLRVI7XG4gICAgICAgIHJldHVybiBiYWlsb3V0T2Zmc2NyZWVuQ29tcG9uZW50KG51bGwsIGZhbGxiYWNrQ2hpbGRyZW4pO1xuICAgICAgfVxuICAgICAgcHVzaFByaW1hcnlUcmVlU3VzcGVuc2VIYW5kbGVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIHdhcm5JZkh5ZHJhdGluZygpO1xuICAgICAgMCAhPT0gKHJlbmRlckxhbmVzICYgNTM2ODcwOTEyKSAmJiBtYXJrUmVuZGVyRGVyaXZlZENhdXNlKHdvcmtJblByb2dyZXNzKTtcbiAgICAgIGlmIChpc1N1c3BlbnNlSW5zdGFuY2VGYWxsYmFjayhzdXNwZW5zZUluc3RhbmNlKSkge1xuICAgICAgICBkaWRQcmltYXJ5Q2hpbGRyZW5EZWZlciA9XG4gICAgICAgICAgc3VzcGVuc2VJbnN0YW5jZS5uZXh0U2libGluZyAmJiBzdXNwZW5zZUluc3RhbmNlLm5leHRTaWJsaW5nLmRhdGFzZXQ7XG4gICAgICAgIGlmIChkaWRQcmltYXJ5Q2hpbGRyZW5EZWZlcikge1xuICAgICAgICAgIGZhbGxiYWNrQ2hpbGRyZW4gPSBkaWRQcmltYXJ5Q2hpbGRyZW5EZWZlci5kZ3N0O1xuICAgICAgICAgI
15852HZhciBtZXNzYWdlID0gZGlkUHJpbWFyeUNoaWxkcmVuRGVmZXIubXNnO1xuICAgICAgICAgIGZpYmVyTW9kZSA9IGRpZFByaW1hcnlDaGlsZHJlbkRlZmVyLnN0Y2s7XG4gICAgICAgICAgcHJpbWFyeUNoaWxkRnJhZ21lbnQgPSBkaWRQcmltYXJ5Q2hpbGRyZW5EZWZlci5jc3RjaztcbiAgICAgICAgfVxuICAgICAgICBzdXNwZW5zZUluc3RhbmNlID0gbWVzc2FnZTtcbiAgICAgICAgc3VzcGVuc2VTdGF0ZSA9IGZhbGxiYWNrQ2hpbGRyZW47XG4gICAgICAgIG5leHRQcm9wcyA9IGZpYmVyTW9kZTtcbiAgICAgICAgZGlkUHJpbWFyeUNoaWxkcmVuRGVmZXIgPSBwcmltYXJ5Q2hpbGRGcmFnbWVudDtcbiAgICAgICAgZmFsbGJhY2tDaGlsZHJlbiA9IHN1c3BlbnNlU3RhdGU7XG4gICAgICAgIGZpYmVyTW9kZSA9IHN1c3BlbnNlSW5zdGFuY2U7XG4gICAgICAgIHByaW1hcnlDaGlsZEZyYWdtZW50ID0gbmV4dFByb3BzO1xuICAgICAgICBuZXh0UHJvcHMgPSBkaWRQcmltYXJ5Q2hpbGRyZW5EZWZlcjtcbiAgICAgICAgZmFsbGJhY2tDaGlsZHJlbiAhPT0gUkVBQ1RfUkVDT1ZFUkFCTEVfRElHRVNUICYmXG4gICAgICAgICAgKChkaWRQcmltYXJ5Q2hpbGRyZW5EZWZlciA9IGZpYmVyTW9kZVxuICAgICAgICAgICAgPyBFcnJvcihmaWJlck1vZGUpXG4gICAgICAgICAgICA6IEVycm9yKFxuICAgICAgICAgICAgICAgIFwiVGhlIHNlcnZlciBjb3VsZCBub3QgZmluaXNoIHRoaXMgU3VzcGVuc2UgYm91bmRhcnksIGxpa2VseSBkdWUgdG8gYW4gZXJyb3IgZHVyaW5nIHNlcnZlciByZW5kZXJpbmcuIFN3aXRjaGVkIHRvIGNsaWVudCByZW5kZXJpbmcuXCJcbiAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgKGRpZFByaW1hcnlDaGlsZHJlbkRlZmVyLnN0YWNrID0gcHJpbWFyeUNoaWxkRnJhZ21lbnQgfHwgXCJcIiksXG4gICAgICAgICAgKGRpZFByaW1hcnlDaGlsZHJlbkRlZmVyLmRpZ2VzdCA9IGZhbGxiYWNrQ2hpbGRyZW4pLFxuICAgICAgICAgIChmYWxsYmFja0NoaWxkcmVuID0gdm9pZCAwID09PSBuZXh0UHJvcHMgPyBudWxsIDogbmV4dFByb3BzKSxcbiAgICAgICAgICAoZmliZXJNb2RlID0ge1xuICAgICAgICAgICAgdmFsdWU6IGRpZFByaW1hcnlDaGlsZHJlbkRlZmVyLFxuICAgICAgICAgICAgc291cmNlOiBudWxsLFxuICAgICAgICAgICAgc3RhY2s6IGZhbGxiYWNrQ2hpbGRyZW5cbiAgICAgICAgICB9KSxcbiAgICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2YgZmFsbGJhY2tDaGlsZHJlbiAmJlxuICAgICAgICAgICAgQ2FwdHVyZWRTdGFja3Muc2V0KGRpZFByaW1hcnlDaGlsZHJlbkRlZmVyLCBmaWJlck1vZGUpLFxuICAgICAgICAgIHF1ZXVlSHlkcmF0aW9uRXJyb3IoZmliZXJNb2RlKSk7XG4gICAgICAgIHJldHVybiByZXRyeVN1c3BlbnNlQ29tcG9uZW50V2l0aG91dEh5ZHJhdGluZyhcbiAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBkaWRSZWNlaXZlVXBkYXRlIHx8XG4gICAgICAgIHByb3BhZ2F0ZVBhcmVudENvbnRleHRDaGFuZ2VzKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcywgITEpO1xuICAgICAgZGlkUHJpbWFyeUNoaWxkcmVuRGVmZXIgPSAwICE9PSAocmVuZGVyTGFuZXMgJiBjdXJyZW50LmNoaWxkTGFuZXMpO1xuICAgICAgaWYgKGRpZFJlY2VpdmVVcGRhdGUgfHwgZGlkUHJpbWFyeUNoaWxkcmVuRGVmZXIpIHtcbiAgICAgICAgaWYgKG51bGwgIT09IGN1cnJlbnRUcmVlSGlkZGVuU3RhY2tDdXJzb3IuY3VycmVudClcbiAgICAgICAgICByZXR1cm4gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoXG4gICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICk7XG4gICAgICAgIGRpZFByaW1hcnlDaGlsZHJlbkRlZmVyID0gd29ya0luUHJvZ3Jlc3NSb290O1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbnVsbCAhPT0gZGlkUHJpbWFyeUNoaWxkcmVuRGVmZXIgJiZcbiAgICAgICAgICAoKGZhbGxiYWNrQ2hpbGRyZW4gPSBnZXRCdW1wZWRMYW5lRm9ySHlkcmF0aW9uKFxuICAgICAgICAgICAgZGlkUHJpbWFyeUNoaWxkcmVuRGVmZXIsXG4gICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICkpLFxuICAgICAgICAgIDAgIT09IGZhbGxiYWNrQ2hpbGRyZW4gJiZcbiAgICAgICAgICAgIGZhbGxiYWNrQ2hpbGRyZW4gIT09IHN1c3BlbnNlU3RhdGUucmV0cnlMYW5lKVxuICAgICAgICApXG4gICAgICAgICAgdGhyb3cgKFxuICAgICAgICAgICAgKChzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZSA9IGZhbGxiYWNrQ2hpbGRyZW4pLFxuICAgICAgICAgICAgZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGN1cnJlbnQsIGZhbGxiYWNrQ2hpbGRyZW4pLFxuICAgICAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKFxuICAgICAgICAgICAgICBkaWRQcmltYXJ5Q2hpbGRyZW5EZWZlcixcbiAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgZmFsbGJhY2tDaGlsZHJlblxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIFNlbGVjdGl2ZUh5ZHJhdGlvbkV4Y2VwdGlvbilcbiAgICAgICAgICApO1xuICAgICAgICBpc1N1c3BlbnNlSW5zdGFuY2VQZW5kaW5nKHN1c3BlbnNlSW5zdGFuY2UpIHx8XG4gICAgICAgICAgcmVuZGVyRGlkU3VzcGVuZERlbGF5SWZQb3NzaWJsZSgpO1xuICAgICAgICByZXR1cm4gcmV0cnlTdXNwZW5zZUNvbXBvbmVudFdpdGhvdXRIeWRyYXRpbmcoXG4gICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKGlzU3VzcGVuc2VJbnN0YW5jZVBlbmRpbmcoc3VzcGVuc2VJbnN0YW5jZSkpXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDE5MiksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzLmNoaWxkID0gY3VycmVudC5jaGlsZCksXG4gICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgY3VycmVudCA9IHN1c3BlbnNlU3RhdGUudHJlZUNvbnRleHQ7XG4gICAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZ2V0TmV4dEh5ZHJhdGFibGUoc3VzcGVuc2VJbnN0YW5jZS5uZXh0U2libGluZyk7XG4gICAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgaXNIeWRyYXRpbmcgPSAhMDtcbiAgICAgIGh5ZHJhdGlvbkVycm9ycyA9IG51bGw7XG4gICAgICBkaWRTdXNwZW5kT3JFcnJvckRFViA9ICExO1xuICAgICAgaHlkcmF0aW9uRGlmZlJvb3RERVYgPSBudWxsO1xuICAgICAgcm9vdE9yU2luZ2xldG9uQ29udGV4dCA9ICExO1xuICAgICAgbnVsbCAhPT0gY3VycmVudCAmJiByZXN0b3JlU3VzcGVuZGVkVHJlZUNvbnRleHQod29ya0luUHJvZ3Jlc3MsIGN1cnJlbnQpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MgPSBtb3VudFN1c3BlbnNlUHJpbWFyeUNoaWxkcmVuKFxuICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgbmV4dFByb3BzLmNoaWxkcmVuXG4gICAgICApO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMTM0MjIxODI0O1xuICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzY2hlZHVsZVN1c3BlbnNlV29ya09uRmliZXIoZmliZXIsIHJlbmRlckxhbmVzLCBwcm9wYWdhdGlvblJvb3QpIHtcbiAgICAgIGZpYmVyLmxhbmVzIHw9IHJlbmRlckxhbmVzO1xuICAgICAgdmFyIGFsdGVybmF0ZSA9IGZpYmVyLmFsdGVybmF0ZTtcbiAgICAgIG51bGwgIT09IGFsdGVybmF0ZSAmJiAoYWx0ZXJuYXRlLmxhbmVzIHw9IHJlbmRlckxhbmVzKTtcbiAgICAgIHNjaGVkdWxlQ29udGV4dFdvcmtPblBhcmVudFBhdGgoXG4gICAgICAgIGZpYmVyLnJldHVybixcbiAgICAgICAgcmVuZGVyTGFuZXMsXG4gICAgICAgI
15852HByb3BhZ2F0aW9uUm9vdFxuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZmluZExhc3RDb250ZW50Um93KGZpcnN0Q2hpbGQpIHtcbiAgICAgIGZvciAodmFyIGxhc3RDb250ZW50Um93ID0gbnVsbDsgbnVsbCAhPT0gZmlyc3RDaGlsZDsgKSB7XG4gICAgICAgIHZhciBjdXJyZW50Um93ID0gZmlyc3RDaGlsZC5hbHRlcm5hdGU7XG4gICAgICAgIG51bGwgIT09IGN1cnJlbnRSb3cgJiZcbiAgICAgICAgICBudWxsID09PSBmaW5kRmlyc3RTdXNwZW5kZWQoY3VycmVudFJvdykgJiZcbiAgICAgICAgICAobGFzdENvbnRlbnRSb3cgPSBmaXJzdENoaWxkKTtcbiAgICAgICAgZmlyc3RDaGlsZCA9IGZpcnN0Q2hpbGQuc2libGluZztcbiAgICAgIH1cbiAgICAgIHJldHVybiBsYXN0Q29udGVudFJvdztcbiAgICB9XG4gICAgZnVuY3Rpb24gaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKFxuICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICBpc0JhY2t3YXJkcyxcbiAgICAgIHRhaWwsXG4gICAgICBsYXN0Q29udGVudFJvdyxcbiAgICAgIHRhaWxNb2RlLFxuICAgICAgdHJlZUZvcmtDb3VudFxuICAgICkge1xuICAgICAgdmFyIHJlbmRlclN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIG51bGwgPT09IHJlbmRlclN0YXRlXG4gICAgICAgID8gKHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSB7XG4gICAgICAgICAgICBpc0JhY2t3YXJkczogaXNCYWNrd2FyZHMsXG4gICAgICAgICAgICByZW5kZXJpbmc6IG51bGwsXG4gICAgICAgICAgICByZW5kZXJpbmdTdGFydFRpbWU6IDAsXG4gICAgICAgICAgICBsYXN0OiBsYXN0Q29udGVudFJvdyxcbiAgICAgICAgICAgIHRhaWw6IHRhaWwsXG4gICAgICAgICAgICB0YWlsTW9kZTogdGFpbE1vZGUsXG4gICAgICAgICAgICB0cmVlRm9ya0NvdW50OiB0cmVlRm9ya0NvdW50XG4gICAgICAgICAgfSlcbiAgICAgICAgOiAoKHJlbmRlclN0YXRlLmlzQmFja3dhcmRzID0gaXNCYWNrd2FyZHMpLFxuICAgICAgICAgIChyZW5kZXJTdGF0ZS5yZW5kZXJpbmcgPSBudWxsKSxcbiAgICAgICAgICAocmVuZGVyU3RhdGUucmVuZGVyaW5nU3RhcnRUaW1lID0gMCksXG4gICAgICAgICAgKHJlbmRlclN0YXRlLmxhc3QgPSBsYXN0Q29udGVudFJvdyksXG4gICAgICAgICAgKHJlbmRlclN0YXRlLnRhaWwgPSB0YWlsKSxcbiAgICAgICAgICAocmVuZGVyU3RhdGUudGFpbE1vZGUgPSB0YWlsTW9kZSksXG4gICAgICAgICAgKHJlbmRlclN0YXRlLnRyZWVGb3JrQ291bnQgPSB0cmVlRm9ya0NvdW50KSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJldmVyc2VDaGlsZHJlbihmaWJlcikge1xuICAgICAgdmFyIHJvdyA9IGZpYmVyLmNoaWxkO1xuICAgICAgZm9yIChmaWJlci5jaGlsZCA9IG51bGw7IG51bGwgIT09IHJvdzsgKSB7XG4gICAgICAgIHZhciBuZXh0Um93ID0gcm93LnNpYmxpbmc7XG4gICAgICAgIHJvdy5zaWJsaW5nID0gZmliZXIuY2hpbGQ7XG4gICAgICAgIGZpYmVyLmNoaWxkID0gcm93O1xuICAgICAgICByb3cgPSBuZXh0Um93O1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVTdXNwZW5zZUxpc3RDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gICAgICB2Y
15852XIgbmV4dFByb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLFxuICAgICAgICByZXZlYWxPcmRlciA9IG5leHRQcm9wcy5yZXZlYWxPcmRlcixcbiAgICAgICAgdGFpbE1vZGUgPSBuZXh0UHJvcHMudGFpbCxcbiAgICAgICAgbmV3Q2hpbGRyZW4gPSBuZXh0UHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIHN1c3BlbnNlQ29udGV4dCA9IHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudDtcbiAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIDEyOClcbiAgICAgICAgcmV0dXJuIHB1c2hTdXNwZW5zZUxpc3RDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUNvbnRleHQpLCBudWxsO1xuICAgICAgKG5leHRQcm9wcyA9IDAgIT09IChzdXNwZW5zZUNvbnRleHQgJiBGb3JjZVN1c3BlbnNlRmFsbGJhY2spKVxuICAgICAgICA/ICgoc3VzcGVuc2VDb250ZXh0ID1cbiAgICAgICAgICAgIChzdXNwZW5zZUNvbnRleHQgJiBTdWJ0cmVlU3VzcGVuc2VDb250ZXh0TWFzaykgfFxuICAgICAgICAgICAgRm9yY2VTdXNwZW5zZUZhbGxiYWNrKSxcbiAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMTI4KSlcbiAgICAgICAgOiAoc3VzcGVuc2VDb250ZXh0ICY9IFN1YnRyZWVTdXNwZW5zZUNvbnRleHRNYXNrKTtcbiAgICAgIHB1c2hTdXNwZW5zZUxpc3RDb250ZXh0KHdvcmtJblByb2dyZXNzLCBzdXNwZW5zZUNvbnRleHQpO1xuICAgICAgc3VzcGVuc2VDb250ZXh0ID0gbnVsbCA9PSByZXZlYWxPcmRlciA/IFwibnVsbFwiIDogcmV2ZWFsT3JkZXI7XG4gICAgICBpZiAoXG4gICAgICAgIG51bGwgIT0gcmV2ZWFsT3JkZXIgJiZcbiAgICAgICAgXCJmb3J3YXJkc1wiICE9PSByZXZlYWxPcmRlciAmJlxuICAgICAgICBcImJhY2t3YXJkc1wiICE9PSByZXZlYWxPcmRlciAmJlxuICAgICAgICBcInVuc3RhYmxlX2xlZ2FjeS1iYWNrd2FyZHNcIiAhPT0gcmV2ZWFsT3JkZXIgJiZcbiAgICAgICAgXCJ0b2dldGhlclwiICE9PSByZXZlYWxPcmRlciAmJlxuICAgICAgICBcImluZGVwZW5kZW50XCIgIT09IHJldmVhbE9yZGVyICYmXG4gICAgICAgICFkaWRXYXJuQWJvdXRSZXZlYWxPcmRlcltzdXNwZW5zZUNvbnRleHRdXG4gICAgICApXG4gICAgICAgIGlmIChcbiAgICAgICAgICAoKGRpZFdhcm5BYm91dFJldmVhbE9yZGVyW3N1c3BlbnNlQ29udGV4dF0gPSAhMCksXG4gICAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIHJldmVhbE9yZGVyKVxuICAgICAgICApXG4gICAgICAgICAgc3dpdGNoIChyZXZlYWxPcmRlci50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICBjYXNlIFwidG9nZXRoZXJcIjpcbiAgICAgICAgICAgIGNhc2UgXCJmb3J3YXJkc1wiOlxuICAgICAgICAgICAgY2FzZSBcImJhY2t3YXJkc1wiOlxuICAgICAgICAgICAgY2FzZSBcImluZGVwZW5kZW50XCI6XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgJ1wiJXNcIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgcmV2ZWFsT3JkZXIgb24gPFN1c3BlbnNlTGlzdCAvPi4gVXNlIGxvd2VyY2FzZSBcIiVzXCIgaW5zdGVhZC4nLFxuICAgICAgICAgICAgICAgIHJldmVhbE9yZGVyLFxuICAgICAgICAgICAgICAgIHJldmVhbE9yZGVyLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiZm9yd2FyZFwiOlxuICAgICAgICAgICAgY2FzZSBcImJhY2t3YXJkXCI6XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgJ1wiJXNcIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgcmV2ZWFsT3JkZXIgb24gPFN1c3BlbnNlTGlzdCAvPi4gUmVhY3QgdXNlcyB0aGUgLXMgc3VmZml4IGluIHRoZSBzcGVsbGluZy4gVXNlIFwiJXNzXCIgaW5zdGVhZC4nLFxuICAgICAgICAgICAgICAgIHJldmVhbE9yZGVyLFxuICAgICAgICAgICAgICAgIHJldmVhbE9yZGVyLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICdcIiVzXCIgaXMgbm90IGEgc3VwcG9ydGVkIHJldmVhbE9yZGVyIG9uIDxTdXNwZW5zZUxpc3QgLz4uIERpZCB5b3UgbWVhbiBcImluZGVwZW5kZW50XCIsIFwidG9nZXRoZXJcIiwgXCJmb3J3YXJkc1wiIG9yIFwiYmFja3dhcmRzXCI/JyxcbiAgICAgICAgICAgICAgICByZXZlYWxPcmRlclxuICAgICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAnJXMgaXMgbm90IGEgc3VwcG9ydGVkIHZhbHVlIGZvciByZXZlYWxPcmRlciBvbiA8U3VzcGVuc2VMaXN0IC8+LiBEaWQgeW91IG1lYW4gXCJpbmRlcGVuZGVudFwiLCBcInRvZ2V0aGVyXCIsIFwiZm9yd2FyZHNcIiBvciBcImJhY2t3YXJkc1wiPycsXG4gICAgICAgICAgICByZXZlYWxPcmRlclxuICAgICAgICAgICk7XG4gICAgICBzdXNwZW5zZUNvbnRleHQgPSBudWxsID09IHRhaWxNb2RlID8gXCJudWxsXCIgOiB0YWlsTW9kZTtcbiAgICAgIGRpZFdhcm5BYm91dFRhaWxPcHRpb25zW3N1c3BlbnNlQ29udGV4dF0gfHxcbiAgICAgICAgbnVsbCA9PSB0YWlsTW9kZSB8fFxuICAgICAgICAoXCJ2aXNpYmxlXCIgIT09IHRhaWxNb2RlICYmXG4gICAgICAgIFwiY29sbGFwc2VkXCIgIT09IHRhaWxNb2RlICYmXG4gICAgICAgIFwiaGlkZGVuXCIgIT09IHRhaWxNb2RlXG4gICAgICAgICAgPyAoKGRpZFdhcm5BYm91dFRhaWxPcHRpb25zW3N1c3BlbnNlQ29udGV4dF0gPSAhMCksXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAnXCIlc1wiIGlzIG5vdCBhIHN1cHBvcnRlZCB2YWx1ZSBmb3IgdGFpbCBvbiA8U3VzcGVuc2VMaXN0IC8+LiBEaWQgeW91IG1lYW4gXCJ2aXNpYmxlXCIsIFwiY29sbGFwc2VkXCIgb3IgXCJoaWRkZW5cIj8nLFxuICAgICAgICAgICAgICB0YWlsTW9kZVxuICAgICAgICAgICAgKSlcbiAgICAgICAgICA6IG51bGwgIT0gcmV2ZWFsT3JkZXIgJiZcbiAgICAgICAgICAgIFwiZm9yd2FyZHNcIiAhPT0gcmV2ZWFsT3JkZXIgJiZcbiAgICAgICAgICAgIFwiYmFja3dhcmRzXCIgIT09IHJldmVhbE9yZGVyICYmXG4gICAgICAgICAgICBcInVuc3RhYmxlX2xlZ2FjeS1iYWNrd2FyZHNcIiAhPT0gcmV2ZWFsT3JkZXIgJiZcbiAgICAgICAgICAgICgoZGlkV2Fyb
15852kFib3V0VGFpbE9wdGlvbnNbc3VzcGVuc2VDb250ZXh0XSA9ICEwKSxcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICc8U3VzcGVuc2VMaXN0IHRhaWw9XCIlc1wiIC8+IGlzIG9ubHkgdmFsaWQgaWYgcmV2ZWFsT3JkZXIgaXMgXCJmb3J3YXJkc1wiIChkZWZhdWx0KSBvciBcImJhY2t3YXJkc1wiLiBEaWQgeW91IG1lYW4gdG8gc3BlY2lmeSByZXZlYWxPcmRlcj1cImZvcndhcmRzXCI/JyxcbiAgICAgICAgICAgICAgdGFpbE1vZGVcbiAgICAgICAgICAgICkpKTtcbiAgICAgIGE6IGlmIChcbiAgICAgICAgKG51bGwgPT0gcmV2ZWFsT3JkZXIgfHxcbiAgICAgICAgICBcImZvcndhcmRzXCIgPT09IHJldmVhbE9yZGVyIHx8XG4gICAgICAgICAgXCJiYWNrd2FyZHNcIiA9PT0gcmV2ZWFsT3JkZXIgfHxcbiAgICAgICAgICBcInVuc3RhYmxlX2xlZ2FjeS1iYWNrd2FyZHNcIiA9PT0gcmV2ZWFsT3JkZXIpICYmXG4gICAgICAgIHZvaWQgMCAhPT0gbmV3Q2hpbGRyZW4gJiZcbiAgICAgICAgbnVsbCAhPT0gbmV3Q2hpbGRyZW4gJiZcbiAgICAgICAgITEgIT09IG5ld0NoaWxkcmVuXG4gICAgICApXG4gICAgICAgIGlmIChpc0FycmF5SW1wbChuZXdDaGlsZHJlbikpXG4gICAgICAgICAgZm9yIChcbiAgICAgICAgICAgIHN1c3BlbnNlQ29udGV4dCA9IDA7XG4gICAgICAgICAgICBzdXNwZW5zZUNvbnRleHQgPCBuZXdDaGlsZHJlbi5sZW5ndGg7XG4gICAgICAgICAgICBzdXNwZW5zZUNvbnRleHQrK1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAhdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChcbiAgICAgICAgICAgICAgICBuZXdDaGlsZHJlbltzdXNwZW5zZUNvbnRleHRdLFxuICAgICAgICAgICAgICAgIHN1c3BlbnNlQ29udGV4dFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAoKHN1c3BlbnNlQ29udGV4dCA9IGdldEl0ZXJhdG9yRm4obmV3Q2hpbGRyZW4pKSxcbiAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBzdXNwZW5zZUNvbnRleHQpXG4gICAgICAgICkge1xuICAgICAgICAgIGlmICgoc3VzcGVuc2VDb250ZXh0ID0gc3VzcGVuc2VDb250ZXh0LmNhbGwobmV3Q2hpbGRyZW4pKSlcbiAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgIHZhciBzdGVwID0gc3VzcGVuc2VDb250ZXh0Lm5leHQoKSwgX2kgPSAwO1xuICAgICAgICAgICAgICAhc3RlcC5kb25lO1xuICAgICAgICAgICAgICBzdGVwID0gc3VzcGVuc2VDb250ZXh0Lm5leHQoKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlmICghdmFsaWRhdGVTdXNwZW5zZUxpc3ROZXN0ZWRDaGlsZChzdGVwLnZhbHVlLCBfaSkpIGJyZWFrIGE7XG4gICAgICAgICAgICAgIF9pKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAnQSBzaW5nbGUgcm93IHdhcyBwYXNzZWQgdG8gYSA8U3VzcGVuc2VMaXN0IHJldmVhbE9yZGVyPVwiJXNcIiAvPi4gVGhpcyBpcyBub3QgdXNlZnVsIHNpbmNlIGl0IG5lZWRzIG11bHRpcGxlIHJvd3MuIERpZCB5b3UgbWVhbiB0byBwYXNzIG11bHRpcGxlIGNoaWxkcmVuIG9yIGFuIGFycmF5PycsXG4gICAgICAgICAgICByZXZlYWxPcmRlclxuICAgICAgICAgICk7XG4gICAgICBcImJhY2t3YXJkc1wiID09PSByZXZlYWxPcmRlciAmJiBudWxsICE9PSBjdXJyZW50XG4gICAgICAgID8gKHJldmVyc2VDaGlsZHJlbihjdXJyZW50KSxcbiAgICAgICAgICByZWNvbmNpbGVDaGlsZHJlbihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgbmV3Q2hpbGRyZW4sIHJlbmRlckxhbmVzKSxcbiAgICAgICAgICByZXZlcnNlQ2hpbGRyZW4oY3VycmVudCkpXG4gICAgICAgIDogcmVjb25jaWxlQ2hpbGRyZW4oY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIG5ld0NoaWxkcmVuLCByZW5kZXJMYW5lcyk7XG4gICAgICBpc0h5ZHJhdGluZ1xuICAgICAgICA/ICh3YXJuSWZOb3RIeWRyYXRpbmcoKSwgKG5ld0NoaWxkcmVuID0gdHJlZUZvcmtDb3VudCkpXG4gICAgICAgIDogKG5ld0NoaWxkcmVuID0gMCk7XG4gICAgICBpZiAoIW5leHRQcm9wcyAmJiBudWxsICE9PSBjdXJyZW50ICYmIDAgIT09IChjdXJyZW50LmZsYWdzICYgMTI4KSlcbiAgICAgICAgYTogZm9yIChjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7IG51bGwgIT09IGN1cnJlbnQ7ICkge1xuICAgICAgICAgIGlmICgxMyA9PT0gY3VycmVudC50YWcpXG4gICAgICAgICAgICBudWxsICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUgJiZcbiAgICAgICAgICAgICAgc2NoZWR1bGVTdXNwZW5zZVdvcmtPbkZpYmVyKGN1cnJlbnQsIHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgZWxzZSBpZiAoMTkgPT09IGN1cnJlbnQudGFnKVxuICAgICAgICAgICAgc2NoZWR1bGVTdXNwZW5zZVdvcmtPbkZpYmVyKGN1cnJlbnQsIHJlbmRlckxhbmVzLCB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgZWxzZSBpZiAobnVsbCAhPT0gY3VycmVudC5jaGlsZCkge1xuICAgICAgICAgICAgY3VycmVudC5jaGlsZC5yZXR1cm4gPSBjdXJyZW50O1xuICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuY2hpbGQ7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGN1cnJlbnQgPT09IHdvcmtJblByb2dyZXNzKSBicmVhayBhO1xuICAgICAgICAgIGZvciAoOyBudWxsID09PSBjdXJyZW50LnNpYmxpbmc7ICkge1xuICAgICAgICAgICAgaWYgKG51bGwgPT09IGN1cnJlbnQucmV0dXJuIHx8IGN1cnJlbnQucmV0dXJuID09PSB3b3JrSW5Qcm9ncmVzcylcbiAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3VycmVudC5zaWJsaW5nLnJldHVybiA9IGN1cnJlbnQucmV0dXJuO1xuICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnNpYmxpbmc7XG4gICAgICAgI
15852H1cbiAgICAgIHN3aXRjaCAocmV2ZWFsT3JkZXIpIHtcbiAgICAgICAgY2FzZSBcImJhY2t3YXJkc1wiOlxuICAgICAgICAgIHJlbmRlckxhbmVzID0gZmluZExhc3RDb250ZW50Um93KHdvcmtJblByb2dyZXNzLmNoaWxkKTtcbiAgICAgICAgICBudWxsID09PSByZW5kZXJMYW5lc1xuICAgICAgICAgICAgPyAoKHJldmVhbE9yZGVyID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQpLFxuICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBudWxsKSlcbiAgICAgICAgICAgIDogKChyZXZlYWxPcmRlciA9IHJlbmRlckxhbmVzLnNpYmxpbmcpLFxuICAgICAgICAgICAgICAocmVuZGVyTGFuZXMuc2libGluZyA9IG51bGwpLFxuICAgICAgICAgICAgICByZXZlcnNlQ2hpbGRyZW4od29ya0luUHJvZ3Jlc3MpKTtcbiAgICAgICAgICBpbml0U3VzcGVuc2VMaXN0UmVuZGVyU3RhdGUoXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICEwLFxuICAgICAgICAgICAgcmV2ZWFsT3JkZXIsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgdGFpbE1vZGUsXG4gICAgICAgICAgICBuZXdDaGlsZHJlblxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJ1bnN0YWJsZV9sZWdhY3ktYmFja3dhcmRzXCI6XG4gICAgICAgICAgcmVuZGVyTGFuZXMgPSBudWxsO1xuICAgICAgICAgIHJldmVhbE9yZGVyID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgZm9yICh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IG51bGw7IG51bGwgIT09IHJldmVhbE9yZGVyOyApIHtcbiAgICAgICAgICAgIGN1cnJlbnQgPSByZXZlYWxPcmRlci5hbHRlcm5hdGU7XG4gICAgICAgICAgICBpZiAobnVsbCAhPT0gY3VycmVudCAmJiBudWxsID09PSBmaW5kRmlyc3RTdXNwZW5kZWQoY3VycmVudCkpIHtcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZXZlYWxPcmRlcjtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyZW50ID0gcmV2ZWFsT3JkZXIuc2libGluZztcbiAgICAgICAgICAgIHJldmVhbE9yZGVyLnNpYmxpbmcgPSByZW5kZXJMYW5lcztcbiAgICAgICAgICAgIHJlbmRlckxhbmVzID0gcmV2ZWFsT3JkZXI7XG4gICAgICAgICAgICByZXZlYWxPcmRlciA9IGN1cnJlbnQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGluaXRTdXNwZW5zZUxpc3RSZW5kZXJTdGF0ZShcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgITAsXG4gICAgICAgICAgICByZW5kZXJMYW5lcyxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICB0YWlsTW9kZSxcbiAgICAgICAgICAgIG5ld0NoaWxkcmVuXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInRvZ2V0aGVyXCI6XG4gICAgICAgICAgaW5pdFN1c3BlbnNlTGlzdFJlbmRlclN0YXRlKFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAhMSxcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgdm9pZCAwLFxuICAgICAgICAgICAgbmV3Q2hpbGRyZW5cbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiaW5kZXBlbmRlbnRcIjpcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gbnVsbDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAocmVuZGVyTGFuZXMgPSBmaW5kTGFzdENvbnRlbnRSb3cod29ya0luUHJvZ3Jlc3MuY2hpbGQpKSxcbiAgICAgICAgICAgIG51bGwgPT09IHJlbmRlckxhbmVzXG4gICAgICAgICAgICAgID8gKChyZXZlYWxPcmRlciA9IHdvcmtJblByb2dyZXNzLmNoaWxkKSxcbiAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBudWxsKSlcbiAgICAgICAgICAgICAgOiAoKHJldmVhbE9yZGVyID0gcmVuZGVyTGFuZXMuc2libGluZyksXG4gICAgICAgICAgICAgICAgKHJlbmRlckxhbmVzLnNpYmxpbmcgPSBudWxsKSksXG4gICAgICAgICAgICBpbml0U3VzcGVuc2VMaXN0UmVuZGVyU3RhdGUoXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICAhMSxcbiAgICAgICAgICAgICAgcmV2ZWFsT3JkZXIsXG4gICAgICAgICAgICAgIHJlbmRlckxhbmVzLFxuICAgICAgICAgICAgICB0YWlsTW9kZSxcbiAgICAgICAgICAgICAgbmV3Q2hpbGRyZW5cbiAgICAgICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZUNvbnRleHRQcm92aWRlcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpIHtcbiAgICAgIHZhciBjb250ZXh0ID0gd29ya0luUHJvZ3Jlc3MudHlwZSxcbiAgICAgICAgbmV3UHJvcHMgP
15852SB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMsXG4gICAgICAgIG5ld1ZhbHVlID0gbmV3UHJvcHMudmFsdWU7XG4gICAgICBcInZhbHVlXCIgaW4gbmV3UHJvcHMgfHxcbiAgICAgICAgaGFzV2FybmVkQWJvdXRVc2luZ05vVmFsdWVQcm9wT25Db250ZXh0UHJvdmlkZXIgfHxcbiAgICAgICAgKChoYXNXYXJuZWRBYm91dFVzaW5nTm9WYWx1ZVByb3BPbkNvbnRleHRQcm92aWRlciA9ICEwKSxcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBcIlRoZSBgdmFsdWVgIHByb3AgaXMgcmVxdWlyZWQgZm9yIHRoZSBgPENvbnRleHQuUHJvdmlkZXI+YC4gRGlkIHlvdSBtaXNzcGVsbCBpdCBvciBmb3JnZXQgdG8gcGFzcyBpdD9cIlxuICAgICAgICApKTtcbiAgICAgIHB1c2hQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgY29udGV4dCwgbmV3VmFsdWUpO1xuICAgICAgcmVjb25jaWxlQ2hpbGRyZW4oXG4gICAgICAgIGN1cnJlbnQsXG4gICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICBuZXdQcm9wcy5jaGlsZHJlbixcbiAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICk7XG4gICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoXG4gICAgICBjdXJyZW50LFxuICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICByZW5kZXJMYW5lc1xuICAgICkge1xuICAgICAgbnVsbCAhPT0gY3VycmVudCAmJiAod29ya0luUHJvZ3Jlc3MuZGVwZW5kZW5jaWVzID0gY3VycmVudC5kZXBlbmRlbmNpZXMpO1xuICAgICAgcHJvZmlsZXJTdGFydFRpbWUgPSAtMTtcbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyB8PSB3b3JrSW5Qcm9ncmVzcy5sYW5lcztcbiAgICAgIGlmICgwID09PSAocmVuZGVyTGFuZXMgJiB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzKSlcbiAgICAgICAgaWYgKG51bGwgIT09IGN1cnJlbnQpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAocHJvcGFnYXRlUGFyZW50Q29udGV4dENoYW5nZXMoXG4gICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICByZW5kZXJMYW5lcyxcbiAgICAgICAgICAgICAgITFcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICAwID09PSAocmVuZGVyTGFuZXMgJiB3b3JrSW5Qcm9ncmVzcy5jaGlsZExhbmVzKSlcbiAgICAgICAgICApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIHJldHVybiBudWxsO1xuICAgICAgaWYgKG51bGwgIT09IGN1cnJlbnQgJiYgd29ya0luUHJvZ3Jlc3MuY2hpbGQgIT09IGN1cnJlbnQuY2hpbGQpXG4gICAgICAgIHRocm93IEVycm9yKFwiUmVzdW1pbmcgd29yayBub3QgeWV0IGltcGxlbWVudGVkLlwiKTtcbiAgICAgIGlmIChudWxsICE9PSB3b3JrSW5Qcm9ncmVzcy5jaGlsZCkge1xuICAgICAgICBjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgIHJlbmRlckxhbmVzID0gY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudCwgY3VycmVudC5wZW5kaW5nUHJvcHMpO1xuICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlbmRlckxhbmVzO1xuICAgICAgICBmb3IgKHJlbmRlckxhbmVzLnJldHVybiA9IHdvcmtJblByb2dyZXNzOyBudWxsICE9PSBjdXJyZW50LnNpYmxpbmc7IClcbiAgICAgICAgICAoY3VycmVudCA9IGN1cnJlbnQuc2libGluZyksXG4gICAgICAgICAgICAocmVuZGVyTGFuZXMgPSByZW5kZXJMYW5lcy5zaWJsaW5nID1cbiAgICAgICAgICAgICAgY3JlYXRlV29ya0luUHJvZ3Jlc3MoY3VycmVudCwgY3VycmVudC5wZW5kaW5nUHJvcHMpKSxcbiAgICAgICAgICAgIChyZW5kZXJMYW5lcy5yZXR1cm4gPSB3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgIHJlbmRlckxhbmVzLnNpYmxpbmcgPSBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja1NjaGVkdWxlZFVwZGF0ZU9yQ29udGV4dChjdXJyZW50LCByZW5kZXJMYW5lcykge1xuICAgICAgaWYgKDAgIT09IChjdXJyZW50LmxhbmVzICYgcmVuZGVyTGFuZXMpKSByZXR1cm4gITA7XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5kZXBlbmRlbmNpZXM7XG4gICAgICByZXR1cm4gbnVsbCAhPT0gY3VycmVudCAmJiBjaGVja0lmQ29udGV4dENoYW5nZWQoY3VycmVudCkgPyAhMCA6ICExO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhdHRlbXB0RWFybHlCYWlsb3V0SWZOb1NjaGVkdWxlZFVwZGF0ZShcbiAgICAgIGN1cnJlbnQsXG4gICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgIHJlbmRlckxhbmVzXG4gICAgKSB7XG4gICAgICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgcHVzaEhvc3RDb250YWluZXIoXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZS5jb250YWluZXJJbmZvXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwdXNoUHJvdmlkZXIoXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgIENhY2hlQ29udGV4dCxcbiAgICAgICAgICAgIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5jYWNoZVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI3OlxuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgcHVzaEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHB1c2hIb3N0Q29udGFpbmVyKFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUuY29udGFpbmVySW5mb1xuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgcHVzaFByb3ZpZGVyKFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlLFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRQcm9wcy52YWx1ZVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgMCAhPT0gKHJlbmRlckxhbmVzICYgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcykgJiZcbiAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA0KTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAyMDQ4O1xuICAgICAgICAgI
15852HZhciBzdGF0ZU5vZGUgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGU7XG4gICAgICAgICAgc3RhdGVOb2RlLmVmZmVjdER1cmF0aW9uID0gLTA7XG4gICAgICAgICAgc3RhdGVOb2RlLnBhc3NpdmVFZmZlY3REdXJhdGlvbiA9IC0wO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDMxOlxuICAgICAgICAgIGlmIChudWxsICE9PSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlKVxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDEyOCksXG4gICAgICAgICAgICAgIHB1c2hEZWh5ZHJhdGVkQWN0aXZpdHlTdXNwZW5zZUhhbmRsZXIod29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgIHN0YXRlTm9kZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgaWYgKG51bGwgIT09IHN0YXRlTm9kZSkge1xuICAgICAgICAgICAgaWYgKG51bGwgIT09IHN0YXRlTm9kZS5kZWh5ZHJhdGVkKVxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHB1c2hQcmltYXJ5VHJlZVN1c3BlbnNlSGFuZGxlcih3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDEyOCksXG4gICAgICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgc3RhdGVOb2RlID0gcHJvcGFnYXRlUGFyZW50Q29udGV4dENoYW5nZXMoXG4gICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICByZW5kZXJMYW5lcyxcbiAgICAgICAgICAgICAgITFcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB2Y
15852XIgcHJpbWFyeUNoaWxkTGFuZXMgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZC5jaGlsZExhbmVzO1xuICAgICAgICAgICAgaWYgKHN0YXRlTm9kZSB8fCAwICE9PSAocmVuZGVyTGFuZXMgJiBwcmltYXJ5Q2hpbGRMYW5lcykpXG4gICAgICAgICAgICAgIHJldHVybiB1cGRhdGVTdXNwZW5zZUNvbXBvbmVudChcbiAgICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBwdXNoUHJpbWFyeVRyZWVTdXNwZW5zZUhhbmRsZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgY3VycmVudCA9IGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoXG4gICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsICE9PSBjdXJyZW50ID8gY3VycmVudC5zaWJsaW5nIDogbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcHVzaFByaW1hcnlUcmVlU3VzcGVuc2VIYW5kbGVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICBpZiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiAxMjgpXG4gICAgICAgICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VMaXN0Q29tcG9uZW50KFxuICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgcHJpbWFyeUNoaWxkTGFuZXMgPSAwICE9PSAoY3VycmVudC5mbGFncyAmIDEyOCk7XG4gICAgICAgICAgc3RhdGVOb2RlID0gMCAhPT0gKHJlbmRlckxhbmVzICYgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcyk7XG4gICAgICAgICAgc3RhdGVOb2RlIHx8XG4gICAgICAgICAgICAocHJvcGFnYXRlUGFyZW50Q29udGV4dENoYW5nZXMoXG4gICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICByZW5kZXJMYW5lcyxcbiAgICAgICAgICAgICAgITFcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICAoc3RhdGVOb2RlID0gMCAhPT0gKHJlbmRlckxhbmVzICYgd29ya0luUHJvZ3Jlc3MuY2hpbGRMYW5lcykpKTtcbiAgICAgICAgICBpZiAocHJpbWFyeUNoaWxkTGFuZXMpIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZU5vZGUpXG4gICAgICAgICAgICAgIHJldHVybiB1cGRhdGVTdXNwZW5zZUxpc3RDb21wb25lbnQoXG4gICAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMTI4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBwcmltYXJ5Q2hpbGRMYW5lcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgbnVsbCAhPT0gcHJpbWFyeUNoaWxkTGFuZXMgJiZcbiAgICAgICAgICAgICgocHJpbWFyeUNoaWxkTGFuZXMucmVuZGVyaW5nID0gbnVsbCksXG4gICAgICAgICAgICAocHJpbWFyeUNoaWxkTGFuZXMudGFpbCA9IG51bGwpLFxuICAgICAgICAgICAgKHByaW1hcnlDaGlsZExhbmVzLmxhc3RFZmZlY3QgPSBudWxsKSk7XG4gICAgICAgICAgcHVzaFN1c3BlbnNlTGlzdENvbnRleHQod29ya0luUHJvZ3Jlc3MsIHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG4gICAgICAgICAgaWYgKHN0YXRlTm9kZSkgYnJlYWs7XG4gICAgICAgICAgZWxzZSByZXR1cm4gbnVsbDtcbiAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmxhbmVzID0gMCksXG4gICAgICAgICAgICB1cGRhdGVPZmZzY3JlZW5Db21wb25lbnQoXG4gICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICByZW5kZXJMYW5lcyxcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSAyNDpcbiAgICAgICAgICBwdXNoUHJvdmlkZXIoXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgIENhY2hlQ29udGV4dCxcbiAgICAgICAgICAgIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5jYWNoZVxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYmFpbG91dE9uQWxyZWFkeUZpbmlzaGVkV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBiZWdpbldvcmsoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKSB7XG4gICAgICBpZiAod29ya0luUHJvZ3Jlc3MuX2RlYnVnTmVlZHNSZW1vdW50ICYmIG51bGwgIT09IGN1cnJlbnQpIHtcbiAgICAgICAgcmVuZGVyTGFuZXMgPSBjcmVhdGVGaWJlckZyb21UeXBlQW5kUHJvcHMoXG4gICAgICAgICAgcmVzb2x2ZVR5cGVGb3JIb3RSZWxvYWRpbmcod29ya0luUHJvZ3Jlc3MuZWxlbWVudFR5cGUpLFxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmtleSxcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMsXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MuX2RlYnVnT3duZXIgfHwgbnVsbCxcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5tb2RlLFxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLmxhbmVzXG4gICAgICAgICk7XG4gICAgICAgIHJlbmRlckxhbmVzLl9kZWJ1Z1N0YWNrID0gd29ya0luUHJvZ3Jlc3MuX2RlYnVnU3RhY2s7XG4gICAgICAgIHJlbmRlckxhbmVzLl9kZWJ1Z1Rhc2sgPSB3b3JrSW5Qcm9ncmVzcy5fZGVidWdUYXNrO1xuICAgICAgICB2Y
15852XIgcmV0dXJuRmliZXIgPSB3b3JrSW5Qcm9ncmVzcy5yZXR1cm47XG4gICAgICAgIGlmIChudWxsID09PSByZXR1cm5GaWJlcikgdGhyb3cgRXJyb3IoXCJDYW5ub3Qgc3dhcCB0aGUgcm9vdCBmaWJlci5cIik7XG4gICAgICAgIGN1cnJlbnQuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlID0gbnVsbDtcbiAgICAgICAgcmVuZGVyTGFuZXMuaW5kZXggPSB3b3JrSW5Qcm9ncmVzcy5pbmRleDtcbiAgICAgICAgcmVuZGVyTGFuZXMuc2libGluZyA9IHdvcmtJblByb2dyZXNzLnNpYmxpbmc7XG4gICAgICAgIHJlbmRlckxhbmVzLnJldHVybiA9IHdvcmtJblByb2dyZXNzLnJldHVybjtcbiAgICAgICAgcmVuZGVyTGFuZXMucmVmID0gd29ya0luUHJvZ3Jlc3MucmVmO1xuICAgICAgICByZW5kZXJMYW5lcy5fZGVidWdJbmZvID0gd29ya0luUHJvZ3Jlc3MuX2RlYnVnSW5mbztcbiAgICAgICAgaWYgKHdvcmtJblByb2dyZXNzID09PSByZXR1cm5GaWJlci5jaGlsZClcbiAgICAgICAgICByZXR1cm5GaWJlci5jaGlsZCA9IHJlbmRlckxhbmVzO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB2YXIgcHJldlNpYmxpbmcgPSByZXR1cm5GaWJlci5jaGlsZDtcbiAgICAgICAgICBpZiAobnVsbCA9PT0gcHJldlNpYmxpbmcpXG4gICAgICAgICAgICB0aHJvdyBFcnJvcihcIkV4cGVjdGVkIHBhcmVudCB0byBoYXZlIGEgY2hpbGQuXCIpO1xuICAgICAgICAgIGZvciAoOyBwcmV2U2libGluZy5zaWJsaW5nICE9PSB3b3JrSW5Qcm9ncmVzczsgKVxuICAgICAgICAgICAgaWYgKCgocHJldlNpYmxpbmcgPSBwcmV2U2libGluZy5zaWJsaW5nKSwgbnVsbCA9PT0gcHJldlNpYmxpbmcpKVxuICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcIkV4cGVjdGVkIHRvIGZpbmQgdGhlIHByZXZpb3VzIHNpYmxpbmcuXCIpO1xuICAgICAgICAgIHByZXZTaWJsaW5nLnNpYmxpbmcgPSByZW5kZXJMYW5lcztcbiAgICAgICAgfVxuICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IHJldHVybkZpYmVyLmRlbGV0aW9ucztcbiAgICAgICAgbnVsbCA9PT0gd29ya0luUHJvZ3Jlc3NcbiAgICAgICAgICA/ICgocmV0dXJuRmliZXIuZGVsZXRpb25zID0gW2N1cnJlbnRdKSwgKHJldHVybkZpYmVyLmZsYWdzIHw9IDE2KSlcbiAgICAgICAgICA6IHdvcmtJblByb2dyZXNzLnB1c2goY3VycmVudCk7XG4gICAgICAgIHJlbmRlckxhbmVzLmZsYWdzIHw9IDEzNDIxNzczMDtcbiAgICAgICAgcmV0dXJuIHJlbmRlckxhbmVzO1xuICAgICAgfVxuICAgICAgaWYgKG51bGwgIT09IGN1cnJlbnQpXG4gICAgICAgIGlmIChcbiAgICAgICAgICBjdXJyZW50Lm1lbW9pemVkUHJvcHMgIT09IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyB8fFxuICAgICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgIT09IGN1cnJlbnQudHlwZVxuICAgICAgICApXG4gICAgICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9ICEwO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhY2hlY2tTY2hlZHVsZWRVcGRhdGVPckNvbnRleHQoY3VycmVudCwgcmVuZGVyTGFuZXMpICYmXG4gICAgICAgICAgICAwID09PSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiAxMjgpXG4gICAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgKGRpZFJlY2VpdmVVcGRhdGUgPSAhMSksXG4gICAgICAgICAgICAgIGF0dGVtcHRFYXJseUJhaWxvdXRJZk5vU2NoZWR1bGVkVXBkYXRlKFxuICAgICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBkaWRSZWNlaXZlVXBkYXRlID0gMCAhPT0gKGN1cnJlbnQuZmxhZ3MgJiAxMzEwNzIpID8gITAgOiAhMTtcbiAgICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGRpZFJlY2VpdmVVcGRhdGUgPSAhMTtcbiAgICAgICAgaWYgKChyZXR1cm5GaWJlciA9IGlzSHlkcmF0aW5nKSlcbiAgICAgICAgICB3YXJuSWZOb3RIeWRyYXRpbmcoKSxcbiAgICAgICAgICAgIChyZXR1cm5GaWJlciA9IDAgIT09ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIDEwNDg1NzYpKTtcbiAgICAgICAgcmV0dXJuRmliZXIgJiZcbiAgICAgICAgICAoKHJldHVybkZpYmVyID0gd29ya0luUHJvZ3Jlc3MuaW5kZXgpLFxuICAgICAgICAgIHdhcm5JZk5vdEh5ZHJhdGluZygpLFxuICAgICAgICAgIHB1c2hUcmVlSWQod29ya0luUHJvZ3Jlc3MsIHRyZWVGb3JrQ291bnQsIHJldHVybkZpYmVyKSk7XG4gICAgICB9XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IDA7XG4gICAgICBzd2l0Y2ggKHdvcmtJblByb2dyZXNzLnRhZykge1xuICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgIGE6IGlmIChcbiAgICAgICAgICAgICgocmV0dXJuRmliZXIgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMpLFxuICAgICAgICAgICAgKGN1cnJlbnQgPSByZXNvbHZlTGF6eSh3b3JrSW5Qcm9ncmVzcy5lbGVtZW50VHlwZSkpLFxuICAgICAgICAgICAgKGN1cnJlbnQgPSByZXNvbHZlVHlwZUZvckhvdFJlbG9hZGluZyhjdXJyZW50KSksXG4gICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MudHlwZSA9IGN1cnJlbnQpLFxuICAgICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgY3VycmVudClcbiAgICAgICAgICApXG4gICAgICAgICAgICBzaG91bGRDb25zdHJ1Y3QoY3VycmVudClcbiAgICAgICAgICAgICAgPyAoKHJldHVybkZpYmVyID0gcmVzb2x2ZUNsYXNzQ29tcG9uZW50UHJvcHMoXG4gICAgICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICAgICAgcmV0dXJuRmliZXJcbiAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MudGFnID0gMSksXG4gICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzID0gdXBkYXRlQ2xhc3NDb21wb25lbnQoXG4gICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICAgICAgICkpKVxuICAgICAgICAgICAgICA6ICgod29ya0luUHJvZ3Jlc3MudGFnID0gMCksXG4gICAgICAgICAgICAgICAgdmFsaWRhdGVGdW5jdGlvbkNvbXBvbmVudEluRGV2KHdvcmtJblByb2dyZXNzLCBjdXJyZW50KSxcbiAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MgPSB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChcbiAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICAgICAgICAgI
15852HJlbmRlckxhbmVzXG4gICAgICAgICAgICAgICAgKSkpO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHZvaWQgMCAhPT0gY3VycmVudCAmJiBudWxsICE9PSBjdXJyZW50KVxuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKChwcmV2U2libGluZyA9IGN1cnJlbnQuJCR0eXBlb2YpLFxuICAgICAgICAgICAgICAgIHByZXZTaWJsaW5nID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50YWcgPSAxMTtcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IHVwZGF0ZUZvcndhcmRSZWYoXG4gICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcmV2U2libGluZyA9PT0gUkVBQ1RfTUVNT19UWVBFKSB7XG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudGFnID0gMTQ7XG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSB1cGRhdGVNZW1vQ29tcG9uZW50KFxuICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgICAgIHJldHVybkZpYmVyLFxuICAgICAgICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJldlNpYmxpbmcgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSkge1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnRhZyA9IDEwO1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUgPSBjdXJyZW50O1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzID0gdXBkYXRlQ29udGV4dFByb3ZpZGVyKFxuICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzID0gXCJcIjtcbiAgICAgICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiZcbiAgICAgICAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIGN1cnJlbnQgJiZcbiAgICAgICAgICAgICAgY3VycmVudC4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFICYmXG4gICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcyA9XG4gICAgICAgICAgICAgICAgXCIgRGlkIHlvdSB3cmFwIGEgY29tcG9uZW50IGluIFJlYWN0LmxhenkoKSBtb3JlIHRoYW4gb25jZT9cIik7XG4gICAgICAgICAgICByZW5kZXJMYW5lcyA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShjdXJyZW50KSB8fCBjdXJyZW50O1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgIFwiRWxlbWVudCB0eX
15852BlIGlzIGludmFsaWQuIFJlY2VpdmVkIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvOiBcIiArXG4gICAgICAgICAgICAgICAgcmVuZGVyTGFuZXMgK1xuICAgICAgICAgICAgICAgIFwiLiBMYXp5IGVsZW1lbnQgdHlwZSBtdXN0IHJlc29sdmUgdG8gYSBjbGFzcyBvciBmdW5jdGlvbi5cIiArXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIHJldHVybiB1cGRhdGVGdW5jdGlvbkNvbXBvbmVudChcbiAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUsXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMsXG4gICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKHJldHVybkZpYmVyID0gd29ya0luUHJvZ3Jlc3MudHlwZSksXG4gICAgICAgICAgICAocHJldlNpYmxpbmcgPSByZXNvbHZlQ2xhc3NDb21wb25lbnRQcm9wcyhcbiAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wc1xuICAgICAgICAgICAgKSksXG4gICAgICAgICAgICB1cGRhdGVDbGFzc0NvbXBvbmVudChcbiAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgIHJldHVybkZpYmVyLFxuICAgICAgICAgICAgICBwcmV2U2libGluZyxcbiAgICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgYToge1xuICAgICAgICAgICAgcHVzaEhvc3RDb250YWluZXIoXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUuY29udGFpbmVySW5mb1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChudWxsID09PSBjdXJyZW50KVxuICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgICAgICBcIlNob3VsZCBoYXZlIGEgY3VycmVudCBmaWJlci4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC5cIlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuRmliZXIgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHM7XG4gICAgICAgICAgICB2Y
15852XIgcHJldlN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICAgIHByZXZTaWJsaW5nID0gcHJldlN0YXRlLmVsZW1lbnQ7XG4gICAgICAgICAgICBjbG9uZVVwZGF0ZVF1ZXVlKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIHByb2Nlc3NVcGRhdGVRdWV1ZSh3b3JrSW5Qcm9ncmVzcywgcmV0dXJuRmliZXIsIG51bGwsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgICAgIHZhciBuZXh0U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgICAgcmV0dXJuRmliZXIgPSBuZXh0U3RhdGUuY2FjaGU7XG4gICAgICAgICAgICBwdXNoUHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIENhY2hlQ29udGV4dCwgcmV0dXJuRmliZXIpO1xuICAgICAgICAgICAgcmV0dXJuRmliZXIgIT09IHByZXZTdGF0ZS5jYWNoZSAmJlxuICAgICAgICAgICAgICBwcm9wYWdhdGVDb250ZXh0Q2hhbmdlcyhcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgICBbQ2FjaGVDb250ZXh0XSxcbiAgICAgICAgICAgICAgICByZW5kZXJMYW5lcyxcbiAgICAgICAgICAgICAgICAhMFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgc3VzcGVuZElmVXBkYXRlUmVhZEZyb21FbnRhbmdsZWRBc3luY0FjdGlvbigpO1xuICAgICAgICAgICAgcmV0dXJuRmliZXIgPSBuZXh0U3RhdGUuZWxlbWVudDtcbiAgICAgICAgICAgIGlmIChwcmV2U3RhdGUuaXNEZWh5ZHJhdGVkKVxuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKChwcmV2U3RhdGUgPSB7XG4gICAgICAgICAgICAgICAgICBlbGVtZW50OiByZXR1cm5GaWJlcixcbiAgICAgICAgICAgICAgICAgIGlzRGVoeWRyYXRlZDogITEsXG4gICAgICAgICAgICAgICAgICBjYWNoZTogbmV4dFN0YXRlLmNhY2hlXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZSA9IHByZXZTdGF0ZSksXG4gICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBwcmV2U3RhdGUpLFxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzICYgMjU2KVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IG1vdW50SG9zdFJvb3RXaXRob3V0SHlkcmF0aW5nKFxuICAgICAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXR1cm5GaWJlciAhPT0gcHJldlNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICBwcmV2U2libGluZyA9IGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKFxuICAgICAgICAgICAgICAgICAgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIFwiVGhpcyByb290IHJlY2VpdmVkIGFuIGVhcmx5IHVwZGF0ZSwgYmVmb3JlIGFueXRoaW5nIHdhcyBhYmxlIGh5ZHJhdGUuIFN3aXRjaGVkIHRoZSBlbnRpcmUgcm9vdCB0byBjbGllbnQgcmVuZGVyaW5nLlwiXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHF1ZXVlSHlkcmF0aW9uRXJyb3IocHJldlNpYmxpbmcpO1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzID0gbW91bnRIb3N0Um9vdFdpdGhvdXRIeWRyYXRpbmcoXG4gICAgICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGN1cnJlbnQubm9kZVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuYm9keTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID1cbiAgICAgICAgICAgICAgICAgICAgICBcIkhUTUxcIiA9PT0gY3VycmVudC5ub2RlTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBjdXJyZW50Lm93bmVyRG9jdW1lbnQuYm9keVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBjdXJyZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZ2V0TmV4dEh5ZHJhdGFibGUoY3VycmVudC5maXJzdENoaWxkKTtcbiAgICAgICAgICAgICAgICBoeWRyYXRpb25QYXJlbnRGaWJlciA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgICAgICAgICAgIGlzSHlkcmF0aW5nID0gITA7XG4gICAgICAgICAgICAgICAgaHlkcmF0aW9uRXJyb3JzID0gbnVsbDtcbiAgICAgICAgICAgICAgICBkaWRTdXNwZW5kT3JFcnJvckRFViA9ICExO1xuICAgICAgICAgICAgICAgIGh5ZHJhdGlvbkRpZmZSb290REVWID0gbnVsbDtcbiAgICAgICAgICAgICAgICByb290T3JTaW5nbGV0b25Db250ZXh0ID0gITA7XG4gICAgICAgICAgICAgICAgcmVuZGVyTGFuZXMgPSBtb3VudENoaWxkRmliZXJzKFxuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZm9yICh3b3JrSW5Qcm9ncmVzcy5jaGlsZCA9IHJlbmRlckxhbmVzOyByZW5kZXJMYW5lczsgKVxuICAgICAgICAgICAgICAgICAgKHJlbmRlckxhbmVzLmZsYWdzID0gKHJlbmRlckxhbmVzLmZsYWdzICYgLTMpIHwgMTM0MjIxODI0KSxcbiAgICAgICAgICAgICAgICAgICAgKHJlbmRlckxhbmVzID0gcmVuZGVyTGFuZXMuc2libGluZyk7XG4gICAgICAgICAgICAgI
15852H1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG4gICAgICAgICAgICAgIGlmIChyZXR1cm5GaWJlciA9PT0gcHJldlNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IGJhaWxvdXRPbkFscmVhZHlGaW5pc2hlZFdvcmsoXG4gICAgICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZWNvbmNpbGVDaGlsZHJlbihcbiAgICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICAgIHJldHVybkZpYmVyLFxuICAgICAgICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgIGNhc2UgMjY6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIG1hcmtSZWYoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgbnVsbCA9PT0gY3VycmVudFxuICAgICAgICAgICAgICA/IChyZW5kZXJMYW5lcyA9IGdldFJlc291cmNlKFxuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSxcbiAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMsXG4gICAgICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICAgICA/ICh3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlID0gcmVuZGVyTGFuZXMpXG4gICAgICAgICAgICAgICAgOiBpc0h5ZHJhdGluZyB8fFxuICAgICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGNyZWF0ZUhvaXN0YWJsZUluc3RhbmNlKFxuICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlLFxuICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkQ29udGV4dChyb290SW5zdGFuY2VTdGFja0N1cnNvci5jdXJyZW50KSxcbiAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NcbiAgICAgICAgICAgICAgICAgICkpXG4gICAgICAgICAgICAgIDogKHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBnZXRSZXNvdXJjZShcbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnR5cGUsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50Lm1lbW9pemVkUHJvcHMsXG4gICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50Lm1lbW9pemVkU3RhdGVcbiAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBwdXNoSG9zdENvbnRleHQod29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgbnVsbCA9PT0gY3VycmVudCAmJlxuICAgICAgICAgICAgICBpc0h5ZHJhdGluZyAmJlxuICAgICAgICAgICAgICAoKHJldHVybkZpYmVyID0gcmVxdWlyZWRDb250ZXh0KHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLmN1cnJlbnQpKSxcbiAgICAgICAgICAgICAgKHByZXZTaWJsaW5nID0gZ2V0SG9zdENvbnRleHQoKSksXG4gICAgICAgICAgICAgIChyZXR1cm5GaWJlciA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9XG4gICAgICAgICAgICAgICAgcmVzb2x2ZVNpbmdsZXRvbkluc3RhbmNlKFxuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSxcbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyxcbiAgICAgICAgICAgICAgICAgIHJldHVybkZpYmVyLFxuICAgICAgICAgICAgICAgICAgcHJldlNpYmxpbmcsXG4gICAgICAgICAgICAgICAgICAhMVxuICAgICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICBkaWRTdXNwZW5kT3JFcnJvckRFViB8fFxuICAgICAgICAgICAgICAgICgocHJldlNpYmxpbmcgPSBkaWZmSHlkcmF0ZWRQcm9wZXJ0aWVzKFxuICAgICAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlLFxuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLFxuICAgICAgICAgICAgICAgICAgcHJldlNpYmxpbmdcbiAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICBudWxsICE9PSBwcmV2U2libGluZyAmJlxuICAgICAgICAgICAgICAgICAgKGJ1aWxkSHlkcmF0aW9uRGlmZk5vZGUod29ya0luUHJvZ3Jlc3MsIDApLnNlcnZlclByb3BzID1cbiAgICAgICAgICAgICAgICAgICAgcHJldlNpYmxpbmcpKSxcbiAgICAgICAgICAgICAgKGh5ZHJhdGlvblBhcmVudEZpYmVyID0gd29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgICAocm9vdE9yU2luZ2xldG9uQ29udGV4dCA9ICEwKSxcbiAgICAgICAgICAgICAgKHByZXZTaWJsaW5nID0gbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSksXG4gICAgICAgICAgICAgIGlzU2luZ2xldG9uU2NvcGUod29ya0luUHJvZ3Jlc3MudHlwZSlcbiAgICAgICAgICAgICAgICA/ICgocHJldmlvdXNIeWRyYXRhYmxlT25FbnRlcmluZ1Njb3BlZFNpbmdsZXRvbiA9IHByZXZTaWJsaW5nKSxcbiAgICAgICAgICAgICAgICAgIChuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZ2V0TmV4dEh5ZHJhdGFibGUoXG4gICAgICAgICAgICAgICAgICAgIHJldHVybkZpYmVyLmZpcnN0Q2hpbGRcbiAgICAgICAgICAgICAgICAgICkpKVxuICAgICAgICAgICAgICAgIDogKG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBwcmV2U2libGluZykpLFxuICAgICAgICAgICAgcmVjb25jaWxlQ2hpbGRyZW4oXG4gICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgI
15852HdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMuY2hpbGRyZW4sXG4gICAgICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgbWFya1JlZihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICBudWxsID09PSBjdXJyZW50ICYmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA0MTk0MzA0KSxcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmNoaWxkXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBudWxsID09PSBjdXJyZW50ICYmXG4gICAgICAgICAgICAgIGlzSHlkcmF0aW5nICYmXG4gICAgICAgICAgICAgICgocHJldlN0YXRlID0gZ2V0SG9zdENvbnRleHQoKSksXG4gICAgICAgICAgICAgIChyZXR1cm5GaWJlciA9IHZhbGlkYXRlRE9NTmVzdGluZyhcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlLFxuICAgICAgICAgICAgICAgIHByZXZTdGF0ZS5hbmNlc3RvckluZm9cbiAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgIChwcmV2U2libGluZyA9IG5leHRIeWRyYXRhYmxlSW5zdGFuY2UpLFxuICAgICAgICAgICAgICAobmV4dFN0YXRlID0gIXByZXZTaWJsaW5nKSB8fFxuICAgICAgICAgICAgICAgICgobmV4dFN0YXRlID0gY2FuSHlkcmF0ZUluc3RhbmNlKFxuICAgICAgICAgICAgICAgICAgcHJldlNpYmxpbmcsXG4gICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlLFxuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLFxuICAgICAgICAgICAgICAgICAgcm9vdE9yU2luZ2xldG9uQ29udGV4dFxuICAgICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICAgIG51bGwgIT09IG5leHRTdGF0ZVxuICAgICAgICAgICAgICAgICAgPyAoKHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IG5leHRTdGF0ZSksXG4gICAgICAgICAgICAgICAgICAgIGRpZFN1c3BlbmRPckVycm9yREVWIHx8XG4gICAgICAgICAgICAgICAgICAgICAgKChwcmV2U3RhdGUgPSBkaWZmSHlkcmF0ZWRQcm9wZXJ0aWVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZTdGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT09IHByZXZTdGF0ZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKGJ1aWxkSHlkcmF0aW9uRGlmZk5vZGUod29ya0luUHJvZ3Jlc3MsIDApLnNlcnZlclByb3BzID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldlN0YXRlKSksXG4gICAgICAgICAgICAgICAgICAgIChoeWRyYXRpb25QYXJlbnRGaWJlciA9IHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgICAgICAgICAgKG5leHRIeWRyYXRhYmxlSW5zdGFuY2UgPSBnZXROZXh0SHlkcmF0YWJsZShcbiAgICAgICAgICAgICAgICAgICAgICBuZXh0U3RhdGUuZmlyc3RDaGlsZFxuICAgICAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICAgICAgKHJvb3RPclNpbmdsZXRvbkNvbnRleHQgPSAhMSksXG4gICAgICAgICAgICAgICAgICAgIChwcmV2U3RhdGUgPSAhMCkpXG4gICAgICAgICAgICAgICAgICA6IChwcmV2U3RhdGUgPSAhMSksXG4gICAgICAgICAgICAgICAgKG5leHRTdGF0ZSA9ICFwcmV2U3RhdGUpKSxcbiAgICAgICAgICAgICAgbmV4dFN0YXRlICYmXG4gICAgICAgICAgICAgICAgKHJldHVybkZpYmVyICYmXG4gICAgICAgICAgICAgICAgICB3YXJuTm9uSHlkcmF0ZWRJbnN0YW5jZSh3b3JrSW5Qcm9ncmVzcywgcHJldlNpYmxpbmcpLFxuICAgICAgICAgICAgICAgIHRocm93T25IeWRyYXRpb25NaXNtYXRjaCh3b3JrSW5Qcm9ncmVzcykpKSxcbiAgICAgICAgICAgIHB1c2hIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAocHJldlNpYmxpbmcgPSB3b3JrSW5Qcm9ncmVzcy50eXBlKSxcbiAgICAgICAgICAgIChwcmV2U3RhdGUgPSB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMpLFxuICAgICAgICAgICAgKG5leHRTdGF0ZSA9IG51bGwgIT09IGN1cnJlbnQgPyBjdXJyZW50Lm1lbW9pemVkUHJvcHMgOiBudWxsKSxcbiAgICAgICAgICAgIChyZXR1cm5GaWJlciA9IHByZXZTdGF0ZS5jaGlsZHJlbiksXG4gICAgICAgICAgICBzaG91bGRTZXRUZXh0Q29udGVudChwcmV2U2libGluZywgcHJldlN0YXRlKVxuICAgICAgICAgICAgICA/IChyZXR1cm5GaWJlciA9IG51bGwpXG4gICAgICAgICAgICAgIDogbnVsbCAhPT0gbmV4dFN0YXRlICYmXG4gICAgICAgICAgICAgICAgc2hvdWxkU2V0VGV4dENvbnRlbnQocHJldlNpYmxpbmcsIG5leHRTdGF0ZSkgJiZcbiAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMzIpLFxuICAgICAgICAgICAgbnVsbCAhPT0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSAmJlxuICAgICAgICAgICAgICAoKHByZXZTaWJsaW5nID0gcmVuZGVyV2l0aEhvb2tzKFxuICAgICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgVHJhbnNpdGlvbkF3YXJlSG9zdENvbXBvbmVudCxcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgIChIb3N0VHJhbnNpdGlvbkNvbnRleHQuX2N1cnJlbnRWYWx1ZSA9IHByZXZTaWJsaW5nKSksXG4gICAgICAgICAgICBtYXJrUmVmKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgIHJlY29uY2lsZUNoaWxkcmVuKFxuICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgI
15852HJlbmRlckxhbmVzXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGRcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIG51bGwgPT09IGN1cnJlbnQgJiZcbiAgICAgICAgICAgICAgaXNIeWRyYXRpbmcgJiZcbiAgICAgICAgICAgICAgKChyZW5kZXJMYW5lcyA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyksXG4gICAgICAgICAgICAgIChjdXJyZW50ID0gZ2V0SG9zdENvbnRleHQoKSksXG4gICAgICAgICAgICAgIChyZXR1cm5GaWJlciA9IGN1cnJlbnQuYW5jZXN0b3JJbmZvLmN1cnJlbnQpLFxuICAgICAgICAgICAgICAocmVuZGVyTGFuZXMgPVxuICAgICAgICAgICAgICAgIG51bGwgIT0gcmV0dXJuRmliZXJcbiAgICAgICAgICAgICAgICAgID8gdmFsaWRhdGVUZXh0TmVzdGluZyhcbiAgICAgICAgICAgICAgICAgICAgICByZW5kZXJMYW5lcyxcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm5GaWJlci50YWcsXG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5hbmNlc3RvckluZm8uaW1wbGljaXRSb290U2NvcGVcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgOiAhMCksXG4gICAgICAgICAgICAgIChjdXJyZW50ID0gbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSksXG4gICAgICAgICAgICAgIChyZXR1cm5GaWJlciA9ICFjdXJyZW50KSB8fFxuICAgICAgICAgICAgICAgICgocmV0dXJuRmliZXIgPSBjYW5IeWRyYXRlVGV4dEluc3RhbmNlKFxuICAgICAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyxcbiAgICAgICAgICAgICAgICAgIHJvb3RPclNpbmdsZXRvbkNvbnRleHRcbiAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICBudWxsICE9PSByZXR1cm5GaWJlclxuICAgICAgICAgICAgICAgICAgPyAoKHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IHJldHVybkZpYmVyKSxcbiAgICAgICAgICAgICAgICAgICAgKGh5ZHJhdGlvblBhcmVudEZpYmVyID0gd29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgICAgICAgICAobmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGwpLFxuICAgICAgICAgICAgICAgICAgICAocmV0dXJuRmliZXIgPSAhMCkpXG4gICAgICAgICAgICAgICAgICA6IChyZXR1cm5GaWJlciA9ICExKSxcbiAgICAgICAgICAgICAgICAocmV0dXJuRmliZXIgPSAhcmV0dXJuRmliZXIpKSxcbiAgICAgICAgICAgICAgcmV0dXJuRmliZXIgJiZcbiAgICAgICAgICAgICAgICAocmVuZGVyTGFuZXMgJiZcbiAgICAgICAgICAgICAgICAgIHdhcm5Ob25IeWRyYXRlZEluc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdXJyZW50KSxcbiAgICAgICAgICAgICAgICB0aHJvd09uSHlkcmF0aW9uTWlzbWF0Y2god29ya0luUHJvZ3Jlc3MpKSksXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VDb21wb25lbnQoY3VycmVudCwgd29ya0luUHJvZ3Jlc3MsIHJlbmRlckxhbmVzKTtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBwdXNoSG9zdENvbnRhaW5lcihcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZS5jb250YWluZXJJbmZvXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgKHJldHVybkZpYmVyID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzKSxcbiAgICAgICAgICAgIG51bGwgPT09IGN1cnJlbnRcbiAgICAgICAgICAgICAgPyAod29ya0luUHJvZ3Jlc3MuY2hpbGQgPSByZWNvbmNpbGVDaGlsZEZpYmVycyhcbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgIHJldHVybkZpYmVyLFxuICAgICAgICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgICA6IHJlY29uY2lsZUNoaWxkcmVuKFxuICAgICAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZFxuICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZUZvcndhcmRSZWYoXG4gICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlLFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLFxuICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChyZXR1cm5GaWJlciA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyksXG4gICAgICAgICAgICBtYXJrUmVmKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgIHJlY29uY2lsZUNoaWxkcmVuKFxuICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGRcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHJlY29uY2lsZUNoaWxkcmVuKFxuICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLmNoaWxkcmVuLFxuICAgICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgI
15852HdvcmtJblByb2dyZXNzLmNoaWxkXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDQpLFxuICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDIwNDgpLFxuICAgICAgICAgICAgKHJldHVybkZpYmVyID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlKSxcbiAgICAgICAgICAgIChyZXR1cm5GaWJlci5lZmZlY3REdXJhdGlvbiA9IC0wKSxcbiAgICAgICAgICAgIChyZXR1cm5GaWJlci5wYXNzaXZlRWZmZWN0RHVyYXRpb24gPSAtMCksXG4gICAgICAgICAgICByZWNvbmNpbGVDaGlsZHJlbihcbiAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcy5jaGlsZHJlbixcbiAgICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZFxuICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZUNvbnRleHRQcm92aWRlcihjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChwcmV2U2libGluZyA9IHdvcmtJblByb2dyZXNzLnR5cGUuX2NvbnRleHQpLFxuICAgICAgICAgICAgKHJldHVybkZpYmVyID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLmNoaWxkcmVuKSxcbiAgICAgICAgICAgIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIHJldHVybkZpYmVyICYmXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgXCJBIGNvbnRleHQgY29uc3VtZXIgd2FzIHJlbmRlcmVkIHdpdGggbXVsdGlwbGUgY2hpbGRyZW4sIG9yIGEgY2hpbGQgdGhhdCBpc24ndCBhIGZ1bmN0aW9uLiBBIGNvbnRleHQgY29uc3VtZXIgZXhwZWN0cyBhIHNpbmdsZSBjaGlsZCB0aGF0IGlzIGEgZnVuY3Rpb24uIElmIHlvdSBkaWQgcGFzcyBhIGZ1bmN0aW9uLCBtYWtlIHN1cmUgdGhlcmUgaXMgbm8gdHJhaWxpbmcgb3IgbGVhZGluZyB3aGl0ZXNwYWNlIGFyb3VuZCBpdC5cIlxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgcHJlcGFyZVRvUmVhZENvbnRleHQod29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgKHByZXZTaWJsaW5nID0gcmVhZENvbnRleHQocHJldlNpYmxpbmcpKSxcbiAgICAgICAgICAgIChyZXR1cm5GaWJlciA9IGNhbGxDb21wb25lbnRJbkRFVihcbiAgICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgIHByZXZTaWJsaW5nLFxuICAgICAgICAgICAgICB2b2lkIDBcbiAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDEpLFxuICAgICAgICAgICAgcmVjb25jaWxlQ2hpbGRyZW4oXG4gICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICByZXR1cm5GaWJlcixcbiAgICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5jaGlsZFxuICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW9Db21wb25lbnQoXG4gICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50eXBlLFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLFxuICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgIHJldHVybiB1cGRhdGVTaW1wbGVNZW1vQ29tcG9uZW50KFxuICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSxcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyxcbiAgICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICByZXR1cm4gdXBkYXRlU3VzcGVuc2VMaXN0Q29tcG9uZW50KFxuICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIDMxOlxuICAgICAgICAgIHJldHVybiB1cGRhdGVBY3Rpdml0eUNvbXBvbmVudChjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMpO1xuICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgIHJldHVybiB1cGRhdGVPZmZzY3JlZW5Db21wb25lbnQoXG4gICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICByZW5kZXJMYW5lcyxcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wc1xuICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgMjQ6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHByZXBhcmVUb1JlYWRDb250ZXh0KHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgIChyZXR1cm5GaWJlciA9IHJlYWRDb250ZXh0KENhY2hlQ29udGV4dCkpLFxuICAgICAgICAgICAgbnVsbCA9PT0gY3VycmVudFxuICAgICAgICAgICAgICA/ICgocHJldlNpYmxpbmcgPSBwZWVrQ2FjaGVGcm9tUG9vbCgpKSxcbiAgICAgICAgICAgICAgICBudWxsID09PSBwcmV2U2libGluZyAmJlxuICAgICAgICAgICAgICAgICAgKChwcmV2U2libGluZyA9IHdvcmtJblByb2dyZXNzUm9vdCksXG4gICAgICAgICAgICAgICAgICAocHJldlN0YXRlID0gY3JlYXRlQ2FjaGUoKSksXG4gICAgICAgICAgICAgICAgICAocHJldlNpYmxpbmcucG9vbGVkQ2FjaGUgPSBwcmV2U3RhdGUpLFxuICAgICAgICAgICAgICAgICAgcmV0YWluQ2FjaGUocHJldlN0YXRlKSxcbiAgICAgICAgICAgICAgICAgIG51bGwgIT09IHByZXZTdGF0ZSAmJlxuICAgICAgICAgICAgICAgICAgICAocHJldlNpYmxpbmcucG9vbGVkQ2FjaGVMYW5lcyB8PSByZW5kZXJMYW5lcyksXG4gICAgICAgICAgICAgICAgICAocHJldlNpYmxpbmcgPSBwcmV2U3RhdGUpKSxcbiAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAgI
15852HBhcmVudDogcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgICAgICBjYWNoZTogcHJldlNpYmxpbmdcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBpbml0aWFsaXplVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgICAgIHB1c2hQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgQ2FjaGVDb250ZXh0LCBwcmV2U2libGluZykpXG4gICAgICAgICAgICAgIDogKDAgIT09IChjdXJyZW50LmxhbmVzICYgcmVuZGVyTGFuZXMpICYmXG4gICAgICAgICAgICAgICAgICAoY2xvbmVVcGRhdGVRdWV1ZShjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAgICAgICBwcm9jZXNzVXBkYXRlUXVldWUod29ya0luUHJvZ3Jlc3MsIG51bGwsIG51bGwsIHJlbmRlckxhbmVzKSxcbiAgICAgICAgICAgICAgICAgIHN1c3BlbmRJZlVwZGF0ZVJlYWRGcm9tRW50YW5nbGVkQXN5bmNBY3Rpb24oKSksXG4gICAgICAgICAgICAgICAgKHByZXZTaWJsaW5nID0gY3VycmVudC5tZW1vaXplZFN0YXRlKSxcbiAgICAgICAgICAgICAgICAocHJldlN0YXRlID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSksXG4gICAgICAgICAgICAgICAgcHJldlNpYmxpbmcucGFyZW50ICE9PSByZXR1cm5GaWJlclxuICAgICAgICAgICAgICAgICAgPyAoKHByZXZTaWJsaW5nID0ge1xuICAgICAgICAgICAgICAgICAgICAgIHBhcmVudDogcmV0dXJuRmliZXIsXG4gICAgICAgICAgICAgICAgICAgICAgY2FjaGU6IHJldHVybkZpYmVyXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9IHByZXZTaWJsaW5nKSxcbiAgICAgICAgICAgICAgICAgICAgMCA9PT0gd29ya0luUHJvZ3Jlc3MubGFuZXMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy51cGRhdGVRdWV1ZS5iYXNlU3RhdGUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2U2libGluZyksXG4gICAgICAgICAgICAgICAgICAgIHB1c2hQcm92aWRlcih3b3JrSW5Qcm9ncmVzcywgQ2FjaGVDb250ZXh0LCByZXR1cm5GaWJlcikpXG4gICAgICAgICAgICAgICAgICA6ICgocmV0dXJuRmliZXIgPSBwcmV2U3RhdGUuY2FjaGUpLFxuICAgICAgICAgICAgICAgICAgICBwdXNoUHJvdmlkZXIod29ya0luUHJvZ3Jlc3MsIENhY2hlQ29udGV4dCwgcmV0dXJuRmliZXIpLFxuICAgICAgICAgICAgICAgICAgICByZXR1cm5GaWJlciAhPT0gcHJldlNpYmxpbmcuY2FjaGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICBwcm9wYWdhdGVDb250ZXh0Q2hhbmdlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICAgICAgICAgICAgW0NhY2hlQ29udGV4dF0sXG4gICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJMYW5lcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICEwXG4gICAgICAgICAgICAgICAgICAgICAgKSkpLFxuICAgICAgICAgICAgcmVjb25jaWxlQ2hpbGRyZW4oXG4gICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5wZW5kaW5nUHJvcHMuY2hpbGRyZW4sXG4gICAgICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGRcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIDMwOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBudWxsID09PSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUgJiZcbiAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IHtcbiAgICAgICAgICAgICAgICBhdXRvTmFtZTogbnVsbCxcbiAgICAgICAgICAgICAgICBwYWlyZWQ6IG51bGwsXG4gICAgICAgICAgICAgICAgY2xvbmVzOiBudWxsLFxuICAgICAgICAgICAgICAgIHJlZjogbnVsbFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIChyZXR1cm5GaWJlciA9IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcyksXG4gICAgICAgICAgICBudWxsICE9IHJldHVybkZpYmVyLm5hbWUgJiYgXCJhdXRvXCIgIT09IHJldHVybkZpYmVyLm5hbWVcbiAgICAgICAgICAgICAgPyAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gbnVsbCA9PT0gY3VycmVudCA/IDE4ODgyNTYwIDogMTg4NzQzNjgpXG4gICAgICAgICAgICAgIDogaXNIeWRyYXRpbmcgJiYgcHVzaE1hdGVyaWFsaXplZFRyZWVJZCh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICB2b2lkIDAgIT09IHJldHVybkZpYmVyLmNsYXNzTmFtZSAmJlxuICAgICAgICAgICAgICAoKHByZXZTaWJsaW5nID1cbiAgICAgICAgICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2YgcmV0dXJuRmliZXIuY2xhc3NOYW1lXG4gICAgICAgICAgICAgICAgICA/IEpTT04uc3RyaW5naWZ5KHJldHVybkZpYmVyLmNsYXNzTmFtZSlcbiAgICAgICAgICAgICAgICAgIDogXCJ7Li4ufVwiKSxcbiAgICAgICAgICAgICAgZGlkV2FybkFib3V0Q2xhc3NOYW1lT25WaWV3VHJhbnNpdGlvbltwcmV2U2libGluZ10gfHxcbiAgICAgICAgICAgICAgICAoKGRpZFdhcm5BYm91dENsYXNzTmFtZU9uVmlld1RyYW5zaXRpb25bcHJldlNpYmxpbmddID0gITApLFxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAnPFZpZXdUcmFuc2l0aW9uPiBkb2VzblxcJ3QgYWNjZXB0IGEgXCJjbGFzc05hbWVcIiBwcm9wLiBJdCBoYXMgYmVlbiByZW5hbWVkIHRvIFwiZGVmYXVsdFwiLlxcbi0gICA8Vmlld1RyYW5zaXRpb24gY2xhc3NOYW1lPSVzPlxcbisgICA8Vmlld1RyYW5zaXRpb24gZGVmYXVsdD0lcz4nLFxuICAgICAgICAgICAgICAgICAgcHJldlNpYmxpbmcsXG4gICAgICAgICAgICAgICAgICBwcmV2U2libGluZ1xuICAgICAgICAgICAgICAgICkpKSxcbiAgICAgICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiYgY3VycmVudC5tZW1vaXplZFByb3BzLm5hbWUgIT09IHJldHVybkZpYmVyLm5hbWVcbiAgICAgICAgICAgICAgPyAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gNDE5NDgxNilcbiAgICAgICAgICAgICAgOiBtYXJrUmVmKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgI
15852HJlY29uY2lsZUNoaWxkcmVuKFxuICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgcmV0dXJuRmliZXIuY2hpbGRyZW4sXG4gICAgICAgICAgICAgIHJlbmRlckxhbmVzXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MuY2hpbGRcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIDI5OlxuICAgICAgICAgIHRocm93IHdvcmtJblByb2dyZXNzLnBlbmRpbmdQcm9wcztcbiAgICAgIH1cbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBcIlVua25vd24gdW5pdCBvZiB3b3JrIHRhZyAoXCIgK1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzLnRhZyArXG4gICAgICAgICAgXCIpLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiXG4gICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKSB7XG4gICAgICB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA0O1xuICAgIH1cbiAgICBmdW5jdGlvbiBwcmVsb2FkSW5zdGFuY2VBbmRTdXNwZW5kSWZOZWVkZWQoXG4gICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgIHR5cGUsXG4gICAgICBvbGRQcm9wcyxcbiAgICAgIG5ld1Byb3BzLFxuICAgICAgcmVuZGVyTGFuZXNcbiAgICApIHtcbiAgICAgIHZhciBKU0NvbXBpbGVyX3RlbXA7XG4gICAgICBpZiAoXG4gICAgICAgIChKU0NvbXBpbGVyX3RlbXAgPVxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgU3VzcGVuc2V5SW1hZ2VzTW9kZSkgIT09IE5vTW9kZSlcbiAgICAgIClcbiAgICAgICAgSlNDb21waWxlcl90ZW1wID1cbiAgICAgICAgICBudWxsID09PSBvbGRQcm9wc1xuICAgICAgICAgICAgPyBtYXlTdXNwZW5kQ29tbWl0KHR5cGUsIG5ld1Byb3BzKVxuICAgICAgICAgICAgOiBtYXlTdXNwZW5kQ29tbWl0KHR5cGUsIG5ld1Byb3BzKSAmJlxuICAgICAgICAgICAgICAobmV3UHJvcHMuc3JjICE9PSBvbGRQcm9wcy5zcmMgfHxcbiAgICAgICAgICAgICAgICBuZXdQcm9wcy5zcmNTZXQgIT09IG9sZFByb3BzLnNyY1NldCk7XG4gICAgICBpZiAoSlNDb21waWxlcl90ZW1wKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAoKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDE2Nzc3MjE2KSxcbiAgICAgICAgICAocmVuZGVyTGFuZXMgJiAzMzU1NDQxMjgpID09PSByZW5kZXJMYW5lcylcbiAgICAgICAgKVxuICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUuY29tcGxldGUpIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDgxOTI7XG4gICAgICAgICAgZWxzZSBpZiAoc2hvdWxkUmVtYWluT25QcmV2aW91c1NjcmVlbigpKSB3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA4MTkyO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRocm93IChcbiAgICAgICAgICAgICAgKChzdXNwZW5kZWRUaGVuYWJsZSA9IG5vb3BTdXNwZW5zZXlDb21taXRUaGVuYWJsZSksXG4gICAgICAgICAgICAgIFN1c3BlbnNleUNvbW1pdEV4Y2VwdGlvbilcbiAgICAgICAgICAgICk7XG4gICAgICB9IGVsc2Ugd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gLTE2Nzc3MjE3O1xuICAgIH1cbiAgICBmdW5jdGlvbiBwcmVsb2FkUmVzb3VyY2VBbmRTdXNwZW5kSWZOZWVkZWQod29ya0luUHJvZ3Jlc3MsIHJlc291cmNlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIFwic3R5bGVzaGVldFwiICE9PSByZXNvdXJjZS50eXBlIHx8XG4gICAgICAgIChyZXNvdXJjZS5zdGF0ZS5sb2FkaW5nICYgSW5zZXJ0ZWQpICE9PSBOb3RMb2FkZWRcbiAgICAgIClcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJj0gLTE2Nzc3MjE3O1xuICAgICAgZWxzZSBpZiAoKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAxNjc3NzIxNiksICFwcmVsb2FkUmVzb3VyY2UocmVzb3VyY2UpKSlcbiAgICAgICAgaWYgKHNob3VsZFJlbWFpbk9uUHJldmlvdXNTY3JlZW4oKSkgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gODE5MjtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHRocm93IChcbiAgICAgICAgICAgICgoc3VzcGVuZGVkVGhlbmFibGUgPSBub29wU3VzcGVuc2V5Q29tbWl0VGhlbmFibGUpLFxuICAgICAgICAgICAgU3VzcGVuc2V5Q29tbWl0RXhjZXB0aW9uKVxuICAgICAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNjaGVkdWxlUmV0cnlFZmZlY3Qod29ya0luUHJvZ3Jlc3MsIHJldHJ5UXVldWUpIHtcbiAgICAgIG51bGwgIT09IHJldHJ5UXVldWUgJiYgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDQpO1xuICAgICAgd29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiAxNjM4NCAmJlxuICAgICAgICAoKHJldHJ5UXVldWUgPVxuICAgICAgICAgIDIyICE9PSB3b3JrSW5Qcm9ncmVzcy50YWcgPyBjbGFpbU5leHRSZXRyeUxhbmUoKSA6IDUzNjg3MDkxMiksXG4gICAgICAgICh3b3JrSW5Qcm9ncmVzcy5sYW5lcyB8PSByZXRyeVF1ZXVlKSxcbiAgICAgICAgKHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmV0cnlMYW5lcyB8PSByZXRyeVF1ZXVlKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGN1dE9mZlRhaWxJZk5lZWRlZChyZW5kZXJTdGF0ZSwgaGFzUmVuZGVyZWRBVGFpbEZhbGxiYWNrKSB7XG4gICAgICBpZiAoIWlzSHlkcmF0aW5nKVxuICAgICAgICBzd2l0Y2ggKHJlbmRlclN0YXRlLnRhaWxNb2RlKSB7XG4gICAgICAgICAgY2FzZSBcInZpc2libGVcIjpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJjb2xsYXBzZWRcIjpcbiAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgIHZhciB0YWlsTm9kZSA9IHJlbmRlclN0YXRlLnRhaWwsIGxhc3RUYWlsTm9kZSA9IG51bGw7XG4gICAgICAgICAgICAgIG51bGwgIT09IHRhaWxOb2RlO1xuXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIG51bGwgIT09IHRhaWxOb2RlLmFsdGVybmF0ZSAmJiAobGFzdFRhaWxOb2RlID0gdGFpbE5vZGUpLFxuICAgICAgICAgICAgICAgICh0YWlsTm9kZSA9IHRhaWxOb2RlLnNpYmxpbmcpO1xuICAgICAgICAgICAgbnVsbCA9PT0gbGFzdFRhaWxOb2RlXG4gICAgICAgICAgICAgID8gaGFzUmVuZGVyZWRBVGFpbEZhbGxiYWNrIHx8IG51bGwgPT09IHJlbmRlclN0YXRlLnRhaWxcbiAgICAgICAgICAgICAgICA/IChyZW5kZXJTdGF0ZS50YWlsID0gbnVsbClcbiAgICAgICAgICAgICAgICA6IChyZW5kZXJTdGF0ZS50YWlsLnNpYmxpbmcgPSBudWxsKVxuICAgICAgICAgICAgICA6IChsYXN0VGFpbE5vZGUuc2libGluZyA9IG51bGwpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGhhc1JlbmRlcmVkQVRhaWxGYWxsYmFjayA9IHJlbmRlclN0YXRlLnRhaWw7XG4gICAgICAgICAgICBmb3IgKHRhaWxOb2RlID0gbnVsbDsgbnVsbCAhPT0gaGFzUmVuZGVyZWRBVGFpbEZhbGxiYWNrOyApXG4gICAgICAgICAgICAgIG51bGwgIT09IGhhc1JlbmRlcmVkQVRhaWxGYWxsYmFjay5hbHRlcm5hdGUgJiZcbiAgICAgICAgICAgICAgICAodGF
15852pbE5vZGUgPSBoYXNSZW5kZXJlZEFUYWlsRmFsbGJhY2spLFxuICAgICAgICAgICAgICAgIChoYXNSZW5kZXJlZEFUYWlsRmFsbGJhY2sgPSBoYXNSZW5kZXJlZEFUYWlsRmFsbGJhY2suc2libGluZyk7XG4gICAgICAgICAgICBudWxsID09PSB0YWlsTm9kZVxuICAgICAgICAgICAgICA/IChyZW5kZXJTdGF0ZS50YWlsID0gbnVsbClcbiAgICAgICAgICAgICAgOiAodGFpbE5vZGUuc2libGluZyA9IG51bGwpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGJ1YmJsZVByb3BlcnRpZXMoY29tcGxldGVkV29yaykge1xuICAgICAgdmFyIGRpZEJhaWxvdXQgPVxuICAgICAgICAgIG51bGwgIT09IGNvbXBsZXRlZFdvcmsuYWx0ZXJuYXRlICYmXG4gICAgICAgICAgY29tcGxldGVkV29yay5hbHRlcm5hdGUuY2hpbGQgPT09IGNvbXBsZXRlZFdvcmsuY2hpbGQsXG4gICAgICAgIG5ld0NoaWxkTGFuZXMgPSAwLFxuICAgICAgICBzdWJ0cmVlRmxhZ3MgPSAwO1xuICAgICAgaWYgKGRpZEJhaWxvdXQpXG4gICAgICAgIGlmICgoY29tcGxldGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgdmFyIF90cmVlQmFzZUR1cmF0aW9uID0gY29tcGxldGVkV29yay5zZWxmQmFzZUR1cmF0aW9uLFxuICAgICAgICAgICAgICBfY2hpbGQyID0gY29tcGxldGVkV29yay5jaGlsZDtcbiAgICAgICAgICAgIG51bGwgIT09IF9jaGlsZDI7XG5cbiAgICAgICAgICApXG4gICAgICAgICAgICAobmV3Q2hpbGRMYW5lcyB8PSBfY2hpbGQyLmxhbmVzIHwgX2NoaWxkMi5jaGlsZExhbmVzKSxcbiAgICAgICAgICAgICAgKHN1YnRyZWVGbGFncyB8PSBfY2hpbGQyLnN1YnRyZWVGbGFncyAmIDEyMDY5MTA5NzYpLFxuICAgICAgICAgICAgICAoc3VidHJlZUZsYWdzIHw9IF9jaGlsZDIuZmxhZ3MgJiAxMjA2OTEwOTc2KSxcbiAgICAgICAgICAgICAgKF90cmVlQmFzZUR1cmF0aW9uICs9IF9jaGlsZDIudHJlZUJhc2VEdXJhdGlvbiksXG4gICAgICAgICAgICAgIChfY2hpbGQyID0gX2NoaWxkMi5zaWJsaW5nKTtcbiAgICAgICAgICBjb21wbGV0ZWRXb3JrLnRyZWVCYXNlRHVyYXRpb24gPSBfdHJlZUJhc2VEdXJhdGlvbjtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgZm9yIChcbiAgICAgICAgICAgIF90cmVlQmFzZUR1cmF0aW9uID0gY29tcGxldGVkV29yay5jaGlsZDtcbiAgICAgICAgICAgIG51bGwgIT09IF90cmVlQmFzZUR1cmF0aW9uO1xuXG4gICAgICAgICAgKVxuICAgICAgICAgICAgKG5ld0NoaWxkTGFuZXMgfD1cbiAgICAgICAgICAgICAgX3RyZWVCYXNlRHVyYXRpb24ubGFuZXMgfCBfdHJlZUJhc2VEdXJhdGlvbi5jaGlsZExhbmVzKSxcbiAgICAgICAgICAgICAgKHN1YnRyZWVGbGFncyB8PSBfdHJlZUJhc2VEdXJhdGlvbi5zdWJ0cmVlRmxhZ3MgJiAxMjA2OTEwOTc2KSxcbiAgICAgICAgICAgICAgKHN1YnRyZWVGbGFncyB8PSBfdHJlZUJhc2VEdXJhdGlvbi5mbGFncyAmIDEyMDY5MTA5NzYpLFxuICAgICAgICAgICAgICAoX3RyZWVCYXNlRHVyYXRpb24ucmV0dXJuID0gY29tcGxldGVkV29yayksXG4gICAgICAgICAgICAgIChfdHJlZUJhc2VEdXJhdGlvbiA9IF90cmVlQmFzZUR1cmF0aW9uLnNpYmxpbmcpO1xuICAgICAgZWxzZSBpZiAoKGNvbXBsZXRlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgIF90cmVlQmFzZUR1cmF0aW9uID0gY29tcGxldGVkV29yay5hY3R1YWxEdXJhdGlvbjtcbiAgICAgICAgX2NoaWxkMiA9IGNvbXBsZXRlZFdvcmsuc2VsZkJhc2VEdXJhdGlvbjtcbiAgICAgICAgZm9yICh2YXIgY2hpbGQgPSBjb21wbGV0ZWRXb3JrLmNoaWxkOyBudWxsICE9PSBjaGlsZDsgKVxuICAgICAgICAgIChuZXdDaGlsZExhbmVzIHw9IGNoaWxkLmxhbmVzIHwgY2hpbGQuY2hpbGRMYW5lcyksXG4gICAgICAgICAgICAoc3VidHJlZUZsYWdzIHw9IGNoaWxkLnN1YnRyZWVGbGFncyksXG4gICAgICAgICAgICAoc3VidHJlZUZsYWdzIHw9IGNoaWxkLmZsYWdzKSxcbiAgICAgICAgICAgIChfdHJlZUJhc2VEdXJhdGlvbiArPSBjaGlsZC5hY3R1YWxEdXJhdGlvbiksXG4gICAgICAgICAgICAoX2NoaWxkMiArPSBjaGlsZC50cmVlQmFzZUR1cmF0aW9uKSxcbiAgICAgICAgICAgIChjaGlsZCA9IGNoaWxkLnNpYmxpbmcpO1xuICAgICAgICBjb21wbGV0ZWRXb3JrLmFjdHVhbER1cmF0aW9uID0gX3RyZWVCYXNlRHVyYXRpb247XG4gICAgICAgIGNvbXBsZXRlZFdvcmsudHJlZUJhc2VEdXJhdGlvbiA9IF9jaGlsZDI7XG4gICAgICB9IGVsc2VcbiAgICAgICAgZm9yIChcbiAgICAgICAgICBfdHJlZUJhc2VEdXJhdGlvbiA9IGNvbXBsZXRlZFdvcmsuY2hpbGQ7XG4gICAgICAgICAgbnVsbCAhPT0gX3RyZWVCYXNlRHVyYXRpb247XG5cbiAgICAgICAgKVxuICAgICAgICAgIChuZXdDaGlsZExhbmVzIHw9XG4gICAgICAgICAgICBfdHJlZUJhc2VEdXJhdGlvbi5sYW5lcyB8IF90cmVlQmFzZUR1cmF0aW9uLmNoaWxkTGFuZXMpLFxuICAgICAgICAgICAgKHN1YnRyZWVGbGFncyB8PSBfdHJlZUJhc2VEdXJhdGlvbi5zdWJ0cmVlRmxhZ3MpLFxuICAgICAgICAgICAgKHN1YnRyZWVGbGFncyB8PSBfdHJlZUJhc2VEdXJhdGlvbi5mbGFncyksXG4gICAgICAgICAgICAoX3RyZWVCYXNlRHVyYXRpb24ucmV0dXJuID0gY29tcGxldGVkV29yayksXG4gICAgICAgICAgICAoX3RyZWVCYXNlRHVyYXRpb24gPSBfdHJlZUJhc2VEdXJhdGlvbi5zaWJsaW5nKTtcbiAgICAgIGNvbXBsZXRlZFdvcmsuc3VidHJlZUZsYWdzIHw9IHN1YnRyZWVGbGFncztcbiAgICAgIGNvbXBsZXRlZFdvcmsuY2hpbGRMYW5lcyA9IG5ld0NoaWxkTGFuZXM7XG4gICAgICByZXR1cm4gZGlkQmFpbG91dDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tcGxldGVXb3JrKGN1cnJlbnQsIHdvcmtJblByb2dyZXNzLCByZW5kZXJMYW5lcykge1xuICAgICAgdmFyIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzO1xuICAgICAgcG9wVHJlZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICBjYXNlIDExOlxuICAgICAgICBjYXNlIDc6XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgY2FzZSA5OlxuICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgI
15852HJldHVybiBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKSwgbnVsbDtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHJldHVybiBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKSwgbnVsbDtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHJlbmRlckxhbmVzID0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlO1xuICAgICAgICAgIG5ld1Byb3BzID0gbnVsbDtcbiAgICAgICAgICBudWxsICE9PSBjdXJyZW50ICYmIChuZXdQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5jYWNoZSk7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZS5jYWNoZSAhPT0gbmV3UHJvcHMgJiZcbiAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAyMDQ4KTtcbiAgICAgICAgICBwb3BQcm92aWRlcihDYWNoZUNvbnRleHQsIHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICByZW5kZXJMYW5lcy5wZW5kaW5nQ29udGV4dCAmJlxuICAgICAgICAgICAgKChyZW5kZXJMYW5lcy5jb250ZXh0ID0gcmVuZGVyTGFuZXMucGVuZGluZ0NvbnRleHQpLFxuICAgICAgICAgICAgKHJlbmRlckxhbmVzLnBlbmRpbmdDb250ZXh0ID0gbnVsbCkpO1xuICAgICAgICAgIGlmIChudWxsID09PSBjdXJyZW50IHx8IG51bGwgPT09IGN1cnJlbnQuY2hpbGQpXG4gICAgICAgICAgICBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcylcbiAgICAgICAgICAgICAgPyAoZW1pdFBlbmRpbmdIeWRyYXRpb25XYXJuaW5ncygpLCBtYXJrVXBkYXRlKHdvcmtJblByb2dyZXNzKSlcbiAgICAgICAgICAgICAgOiBudWxsID09PSBjdXJyZW50IHx8XG4gICAgICAgICAgICAgICAgKGN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQgJiZcbiAgICAgICAgICAgICAgICAgIDAgPT09ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIDI1NikpIHx8XG4gICAgICAgICAgICAgICAgKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAxMDI0KSxcbiAgICAgICAgICAgICAgICB1cGdyYWRlSHlkcmF0aW9uRXJyb3JzVG9SZWNvdmVyYWJsZSgpKTtcbiAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgY2FzZSAyNjpcbiAgICAgICAgICB2Y
15852XIgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGUsXG4gICAgICAgICAgICBuZXh0UmVzb3VyY2UgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIG51bGwgPT09IGN1cnJlbnRcbiAgICAgICAgICAgID8gKG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgICBudWxsICE9PSBuZXh0UmVzb3VyY2VcbiAgICAgICAgICAgICAgICA/IChidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgICAgICAgIHByZWxvYWRSZXNvdXJjZUFuZFN1c3BlbmRJZk5lZWRlZChcbiAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgICAgIG5leHRSZXNvdXJjZVxuICAgICAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICAgICA6IChidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgICAgICAgIHByZWxvYWRJbnN0YW5jZUFuZFN1c3BlbmRJZk5lZWRlZChcbiAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIG5ld1Byb3BzLFxuICAgICAgICAgICAgICAgICAgICByZW5kZXJMYW5lc1xuICAgICAgICAgICAgICAgICAgKSkpXG4gICAgICAgICAgICA6IG5leHRSZXNvdXJjZVxuICAgICAgICAgICAgICA/IG5leHRSZXNvdXJjZSAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlXG4gICAgICAgICAgICAgICAgPyAobWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgICAgICAgIHByZWxvYWRSZXNvdXJjZUFuZFN1c3BlbmRJZk5lZWRlZChcbiAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgICAgIG5leHRSZXNvdXJjZVxuICAgICAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICAgICA6IChidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmPSAtMTY3NzcyMTcpKVxuICAgICAgICAgICAgICA6ICgoY3VycmVudCA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyksXG4gICAgICAgICAgICAgICAgY3VycmVudCAhPT0gbmV3UHJvcHMgJiYgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAgICAgcHJlbG9hZEluc3RhbmNlQW5kU3VzcGVuZElmTmVlZGVkKFxuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgICAgIG5ld1Byb3BzLFxuICAgICAgICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgY2FzZSAyNzpcbiAgICAgICAgICBwb3BIb3N0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgcmVuZGVyTGFuZXMgPSByZXF1aXJlZENvbnRleHQocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG4gICAgICAgICAgdHlwZSA9IHdvcmtJblByb2dyZXNzLnR5cGU7XG4gICAgICAgICAgaWYgKG51bGwgIT09IGN1cnJlbnQgJiYgbnVsbCAhPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUpXG4gICAgICAgICAgICBjdXJyZW50Lm1lbW9pemVkUHJvcHMgIT09IG5ld1Byb3BzICYmIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFuZXdQcm9wcykge1xuICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlKVxuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAgICAgXCJXZSBtdXN0IGhhdmUgbmV3IHByb3BzIGZvciBuZXcgbW91bnRzLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnN1YnRyZWVGbGFncyAmPSAtMzM1NTQ0MzM7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY3VycmVudCA9IGdldEhvc3RDb250ZXh0KCk7XG4gICAgICAgICAgICBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcylcbiAgICAgICAgICAgICAgPyBwcmVwYXJlVG9IeWRyYXRlSG9zdEluc3RhbmNlKHdvcmtJblByb2dyZXNzLCBjdXJyZW50KVxuICAgICAgICAgICAgICA6ICgoY3VycmVudCA9IHJlc29sdmVTaW5nbGV0b25JbnN0YW5jZShcbiAgICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgICBuZXdQcm9wcyxcbiAgICAgICAgICAgICAgICAgIHJlbmRlckxhbmVzLFxuICAgICAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICEwXG4gICAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSA9IGN1cnJlbnQpLFxuICAgICAgICAgICAgICAgIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzICY9IC0zMzU1NDQzMztcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIHBvcEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB0eXBlID0gd29ya0luUHJvZ3Jlc3MudHlwZTtcbiAgICAgICAgICBpZiAobnVsbCAhPT0gY3VycmVudCAmJiBudWxsICE9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZSlcbiAgICAgICAgICAgIGN1cnJlbnQubWVtb2l6ZWRQcm9wcyAhPT0gbm
15852V3UHJvcHMgJiYgbWFya1VwZGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoIW5ld1Byb3BzKSB7XG4gICAgICAgICAgICAgIGlmIChudWxsID09PSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUpXG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgICAgICBcIldlIG11c3QgaGF2ZSBuZXcgcHJvcHMgZm9yIG5ldyBtb3VudHMuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzICY9IC0zMzU1NDQzMztcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgX2N1cnJlbnRIb3N0Q29udGV4dCA9IGdldEhvc3RDb250ZXh0KCk7XG4gICAgICAgICAgICBpZiAocG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpKVxuICAgICAgICAgICAgICBwcmVwYXJlVG9IeWRyYXRlSG9zdEluc3RhbmNlKHdvcmtJblByb2dyZXNzLCBfY3VycmVudEhvc3RDb250ZXh0KTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBuZXh0UmVzb3VyY2UgPSByZXF1aXJlZENvbnRleHQocm9vdEluc3RhbmNlU3RhY2tDdXJzb3IuY3VycmVudCk7XG4gICAgICAgICAgICAgIHZhbGlkYXRlRE9NTmVzdGluZyh0eXBlLCBfY3VycmVudEhvc3RDb250ZXh0LmFuY2VzdG9ySW5mbyk7XG4gICAgICAgICAgICAgIF9jdXJyZW50SG9zdENvbnRleHQgPSBfY3VycmVudEhvc3RDb250ZXh0LmNvbnRleHQ7XG4gICAgICAgICAgICAgIG5leHRSZXNvdXJjZSA9IGdldE93bmVyRG9jdW1lbnRGcm9tUm9vdENvbnRhaW5lcihuZXh0UmVzb3VyY2UpO1xuICAgICAgICAgICAgICBzd2l0Y2ggKF9jdXJyZW50SG9zdENvbnRleHQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEhvc3RDb250ZXh0TmFtZXNwYWNlU3ZnOlxuICAgICAgICAgICAgICAgICAgbmV4dFJlc291cmNlID0gbmV4dFJlc291cmNlLmNyZWF0ZUVsZW1lbnROUyhcbiAgICAgICAgICAgICAgICAgICAgU1ZHX05BTUVTUEFDRSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgSG9zdENvbnRleHROYW1lc3BhY2VNYXRoOlxuICAgICAgICAgICAgICAgICAgbmV4dFJlc291cmNlID0gbmV4dFJlc291cmNlLmNyZWF0ZUVsZW1lbnROUyhcbiAgICAgICAgICAgICAgICAgICAgTUFUSF9OQU1FU1BBQ0UsXG4gICAgICAgICAgICAgICAgICAgIHR5cGVcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzdmdcIjpcbiAgICAgICAgICAgICAgICAgICAgICBuZXh0UmVzb3VyY2UgPSBuZXh0UmVzb3VyY2UuY3JlYXRlRWxlbWVudE5TKFxuICAgICAgICAgICAgICAgICAgICAgICAgU1ZHX05BTUVTUEFDRSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwibWF0aFwiOlxuICAgICAgICAgICAgICAgICAgICAgIG5leHRSZXNvdXJjZSA9IG5leHRSZXNvdXJjZS5jcmVhdGVFbGVtZW50TlMoXG4gICAgICAgICAgICAgICAgICAgICAgICBNQVRIX05BTUVTUEFDRSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2NyaXB0XCI6XG4gICAgICAgICAgICAgICAgICAgICAgbmV4dFJlc291cmNlID0gbmV4dFJlc291cmNlLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICAgICAgICAgICAgZGlkV2FyblNjcmlwdFRhZ3MgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzU2NyaXB0RGF0YUJsb2NrKG5ld1Byb3BzKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiRW5jb3VudGVyZWQgYSBzY3JpcHQgdGFnIHdoaWxlIHJlbmRlcmluZyBSZWFjdCBjb21wb25lbnQuIFNjcmlwdHMgaW5zaWRlIFJlYWN0IGNvbXBvbmVudHMgYXJlIG5ldmVyIGV4ZWN1dGVkIHdoZW4gcmVuZGVyaW5nIG9uIHRoZSBjbGllbnQuIENvbnNpZGVyIHVzaW5nIHRlbXBsYXRlIHRhZyBpbnN0ZWFkIChodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvdGVtcGxhdGUpLlwiXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgKGRpZFdhcm5TY3JpcHRUYWdzID0gITApKTtcbiAgICAgICAgICAgICAgICAgICAgICBuZXh0UmVzb3VyY2UuaW5uZXJIVE1MID0gXCI8c2NyaXB0PlxceDNjL3NjcmlwdD5cIjtcbiAgICAgICAgICAgICAgICAgICAgICBuZXh0UmVzb3VyY2UgPSBuZXh0UmVzb3VyY2UucmVtb3ZlQ2hpbGQoXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0UmVzb3VyY2UuZmlyc3RDaGlsZFxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzZWxlY3RcIjpcbiAgICAgICAgICAgICAgICAgICAgICBuZXh0UmVzb3VyY2UgPVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIG5ld1Byb3BzLmlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gbmV4dFJlc291cmNlLmNyZWF0ZUVsZW1lbnQoXCJzZWxlY3RcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXM6IG5ld1Byb3BzLmlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXh0UmVzb3VyY2UuY3JlYXRlRWxlbWVudChcInNlbGVjdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICBuZXdQcm9wcy5tdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAobmV4dFJlc291cmNlLm11bHRpcGxlID0gITApXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG5ld1Byb3BzLnNpemUgJiYgKG5leHRSZXNvdXJjZS5zaXplID0gbmV3UHJvcHMuc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgKG5leHRSZXNvdXJjZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2YgbmV3UHJvcHMuaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXh0UmVzb3VyY2UuY3JlYXRlRWxlbWVudCh0eXBlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpczogbmV3UHJvcHMuaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5leHRSZXNvdXJjZS5jcmVhdGVFbGVtZW50KHR5cGUpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC0xID09PSB0eXBlLmluZGV4T2YoXCItXCIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlICE9PSB0eXBlLnRvTG93ZXJDYXNlKCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI8JXMgLz4gaXMgdXN
15852pbmcgaW5jb3JyZWN0IGNhc2luZy4gVXNlIFBhc2NhbENhc2UgZm9yIFJlYWN0IGNvbXBvbmVudHMsIG9yIGxvd2VyY2FzZSBmb3IgSFRNTCBlbGVtZW50cy5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIltvYmplY3QgSFRNTFVua25vd25FbGVtZW50XVwiICE9PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuZXh0UmVzb3VyY2UpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzT3duUHJvcGVydHkuY2FsbCh3YXJuZWRVbmtub3duVGFncywgdHlwZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHdhcm5lZFVua25vd25UYWdzW3R5cGVdID0gITApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlRoZSB0YWcgPCVzPiBpcyB1bnJlY29nbml6ZWQgaW4gdGhpcyBicm93c2VyLiBJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgUmVhY3QgY29tcG9uZW50LCBzdGFydCBpdHMgbmFtZSB3aXRoIGFuIHVwcGVyY2FzZSBsZXR0ZXIuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG5leHRSZXNvdXJjZVtpbnRlcm5hbEluc3RhbmNlS2V5XSA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgICAgICAgICBuZXh0UmVzb3VyY2VbaW50ZXJuYWxQcm9wc0tleV0gPSBuZXdQcm9wcztcbiAgICAgICAgICAgICAgYTogZm9yIChcbiAgICAgICAgICAgICAgICBfY3VycmVudEhvc3RDb250ZXh0ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgICAgICAgbnVsbCAhPT0gX2N1cnJlbnRIb3N0Q29udGV4dDtcblxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICA1ID09PSBfY3VycmVudEhvc3RDb250ZXh0LnRhZyB8fFxuICAgICAgICAgICAgICAgICAgNiA9PT0gX2N1cnJlbnRIb3N0Q29udGV4dC50YWdcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICBuZXh0UmVzb3VyY2UuYXBwZW5kQ2hpbGQoX2N1cnJlbnRIb3N0Q29udGV4dC5zdGF0ZU5vZGUpO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgNCAhPT0gX2N1cnJlbnRIb3N0Q29udGV4dC50YWcgJiZcbiAgICAgICAgICAgICAgICAgIDI3ICE9PSBfY3VycmVudEhvc3RDb250ZXh0LnRhZyAmJlxuICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gX2N1cnJlbnRIb3N0Q29udGV4dC5jaGlsZFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgX2N1cnJlbnRIb3N0Q29udGV4dC5jaGlsZC5yZXR1cm4gPSBfY3VycmVudEhvc3RDb250ZXh0O1xuICAgICAgICAgICAgICAgICAgX2N1cnJlbnRIb3N0Q29udGV4dCA9IF9jdXJyZW50SG9zdENvbnRleHQuY2hpbGQ7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKF9jdXJyZW50SG9zdENvbnRleHQgPT09IHdvcmtJblByb2dyZXNzKSBicmVhayBhO1xuICAgICAgICAgICAgICAgIGZvciAoOyBudWxsID09PSBfY3VycmVudEhvc3RDb250ZXh0LnNpYmxpbmc7ICkge1xuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBudWxsID09PSBfY3VycmVudEhvc3RDb250ZXh0LnJldHVybiB8fFxuICAgICAgICAgICAgICAgICAgICBfY3VycmVudEhvc3RDb250ZXh0LnJldHVybiA9PT0gd29ya0luUHJvZ3Jlc3NcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgICAgICAgIF9jdXJyZW50SG9zdENvbnRleHQgPSBfY3VycmVudEhvc3RDb250ZXh0LnJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgX2N1cnJlbnRIb3N0Q29udGV4dC5zaWJsaW5nLnJldHVybiA9IF9jdXJyZW50SG9zdENvbnRleHQucmV0dXJuO1xuICAgICAgICAgICAgICAgIF9jdXJyZW50SG9zdENvbnRleHQgPSBfY3VycmVudEhvc3RDb250ZXh0LnNpYmxpbmc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gbmV4dFJlc291cmNlO1xuICAgICAgICAgICAgICBhOiBzd2l0Y2ggKFxuICAgICAgICAgICAgICAgIChzZXRJbml0aWFsUHJvcGVydGllcyhuZXh0UmVzb3VyY2UsIHR5cGUsIG5ld1Byb3BzKSwgdHlwZSlcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcImJ1dHRvblwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJpbnB1dFwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJzZWxlY3RcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwidGV4dGFyZWFcIjpcbiAgICAgICAgICAgICAgICAgIG5ld1Byb3BzID0gISFuZXdQcm9wcy5hdXRvRm9jdXM7XG4gICAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJpbWdcIjpcbiAgICAgICAgICAgICAgICAgIG5ld1Byb3BzID0gITA7XG4gICAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBuZXdQcm9wcyA9ICExO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG5ld1Byb3BzICYmIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy5zdWJ0cmVlRmxhZ3MgJj0gLTMzNTU0NDMzO1xuICAgICAgICAgIHByZWxvYWRJbnN0YW5jZUFuZFN1c3BlbmRJZk5lZWRlZChcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MudHlwZSxcbiAgICAgICAgICAgIG51bGwgPT09IGN1cnJlbnQgPyBudWxsIDogY3VycmVudC5tZW1vaXplZFByb3BzLFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MucGVuZGluZ1Byb3BzLFxuICAgICAgICAgICAgcmVuZGVyTGFuZXNcbiAgICAgICAgICApO1xuICAgICAgICAgI
15852HJldHVybiBudWxsO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgaWYgKGN1cnJlbnQgJiYgbnVsbCAhPSB3b3JrSW5Qcm9ncmVzcy5zdGF0ZU5vZGUpXG4gICAgICAgICAgICBjdXJyZW50Lm1lbW9pemVkUHJvcHMgIT09IG5ld1Byb3BzICYmIG1hcmtVcGRhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBcInN0cmluZ1wiICE9PSB0eXBlb2YgbmV3UHJvcHMgJiZcbiAgICAgICAgICAgICAgbnVsbCA9PT0gd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAgIFwiV2UgbXVzdCBoYXZlIG5ldyBwcm9wcyBmb3IgbmV3IG1vdW50cy4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgY3VycmVudCA9IHJlcXVpcmVkQ29udGV4dChyb290SW5zdGFuY2VTdGFja0N1cnNvci5jdXJyZW50KTtcbiAgICAgICAgICAgIHJlbmRlckxhbmVzID0gZ2V0SG9zdENvbnRleHQoKTtcbiAgICAgICAgICAgIGlmIChwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcykpIHtcbiAgICAgICAgICAgICAgY3VycmVudCA9IHdvcmtJblByb2dyZXNzLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgcmVuZGVyTGFuZXMgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFByb3BzO1xuICAgICAgICAgICAgICB0eXBlID0gIWRpZFN1c3BlbmRPckVycm9yREVWO1xuICAgICAgICAgICAgICBuZXdQcm9wcyA9IG51bGw7XG4gICAgICAgICAgICAgIG5leHRSZXNvdXJjZSA9IGh5ZHJhdGlvblBhcmVudEZpYmVyO1xuICAgICAgICAgICAgICBpZiAobnVsbCAhPT0gbmV4dFJlc291cmNlKVxuICAgICAgICAgICAgICAgIHN3aXRjaCAobmV4dFJlc291cmNlLnRhZykge1xuICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICB0eXBlICYmXG4gICAgICAgICAgICAgICAgICAgICAgKCh0eXBlID0gZGlmZkh5ZHJhdGVkVGV4dEZvckRldldhcm5pbmdzKFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlckxhbmVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3UHJvcHNcbiAgICAgICAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICAgICAgICBudWxsICE9PSB0eXBlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAoYnVpbGRIeWRyYXRpb25EaWZmTm9kZSh3b3JrSW5Qcm9ncmVzcywgMCkuc2VydmVyUHJvcHMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgY2FzZSAyNzpcbiAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgKG5ld1Byb3BzID0gbmV4dFJlc291cmNlLm1lbW9pemVkUHJvcHMpLFxuICAgICAgICAgICAgICAgICAgICAgIHR5cGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICgodHlwZSA9IGRpZmZIeWRyYXRlZFRleHRGb3JEZXZXYXJuaW5ncyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyTGFuZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Byb3BzXG4gICAgICAgICAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT09IHR5cGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ1aWxkSHlkcmF0aW9uRGlmZk5vZGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgICAgICAgICAgICAgICApLnNlcnZlclByb3BzID0gdHlwZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY3VycmVudFtpbnRlcm5hbEluc3RhbmNlS2V5XSA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgICAgICAgICBjdXJyZW50ID1cbiAgICAgICAgICAgICAgICBjdXJyZW50Lm5vZGVWYWx1ZSA9PT0gcmVuZGVyTGFuZXMgfHxcbiAgICAgICAgICAgICAgICAobnVsbCAhPT0gbmV3UHJvcHMgJiZcbiAgICAgICAgICAgICAgICAgICEwID09PSBuZXdQcm9wcy5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcpIHx8XG4gICAgICAgICAgICAgICAgY2hlY2tGb3JVbm1hdGNoZWRUZXh0KGN1cnJlbnQubm9kZVZhbHVlLCByZW5kZXJMYW5lcylcbiAgICAgICAgICAgICAgICAgID8gITBcbiAgICAgICAgICAgICAgICAgIDogITE7XG4gICAgICAgICAgICAgIGN1cnJlbnQgfHwgdGhyb3dPbkh5ZHJhdGlvbk1pc21hdGNoKHdvcmtJblByb2dyZXNzLCAhMCk7XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgKHR5cGUgPSByZW5kZXJMYW5lcy5hbmNlc3RvckluZm8uY3VycmVudCksXG4gICAgICAgICAgICAgICAgbnVsbCAhPSB0eXBlICYmXG4gICAgICAgICAgICAgICAgICB2YWxpZGF0ZVRleHROZXN0aW5nKFxuICAgICAgICAgICAgICAgICAgICBuZXdQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZS50YWcsXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlckxhbmVzLmFuY2VzdG9ySW5mby5pbXBsaWNpdFJvb3RTY29wZVxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAoY3VycmVudCA9XG4gICAgICAgICAgICAgICAgICBnZXRPd25lckRvY3VtZW50RnJvbVJvb3RDb250YWluZXIoY3VycmVudCkuY3JlYXRlVGV4dE5vZGUoXG4gICAgICAgICAgICAgICAgICAgIG5ld1Byb3BzXG4gICAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICAoY3VycmVudFtpbnRlcm5hbEluc3RhbmNlS2V5XSA9IHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlID0gY3VycmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgI
15852HJldHVybiBudWxsO1xuICAgICAgICBjYXNlIDMxOlxuICAgICAgICAgIHJlbmRlckxhbmVzID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICBpZiAobnVsbCA9PT0gY3VycmVudCB8fCBudWxsICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpIHtcbiAgICAgICAgICAgIG5ld1Byb3BzID0gcG9wSHlkcmF0aW9uU3RhdGUod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgICAgaWYgKG51bGwgIT09IHJlbmRlckxhbmVzKSB7XG4gICAgICAgICAgICAgIGlmIChudWxsID09PSBjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFuZXdQcm9wcylcbiAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIkEgZGVoeWRyYXRlZCBzdXNwZW5zZSBjb21wb25lbnQgd2FzIGNvbXBsZXRlZCB3aXRob3V0IGEgaHlkcmF0ZWQgbm9kZS4gVGhpcyBpcyBwcm9iYWJseSBhIGJ1ZyBpbiBSZWFjdC5cIlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICAgICAgICBjdXJyZW50ID0gbnVsbCAhPT0gY3VycmVudCA/IGN1cnJlbnQuZGVoeWRyYXRlZCA6IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50KVxuICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIFwiRXhwZWN0ZWQgdG8gaGF2ZSBhIGh5ZHJhdGVkIGFjdGl2aXR5IGluc3RhbmNlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRbaW50ZXJuYWxJbnN0YW5jZUtleV0gPSB3b3JrSW5Qcm9ncmVzcztcbiAgICAgICAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlICYmXG4gICAgICAgICAgICAgICAgICBudWxsICE9PSByZW5kZXJMYW5lcyAmJlxuICAgICAgICAgICAgICAgICAgKChjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQpLFxuICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudCAmJlxuICAgICAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiAtPVxuICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQudHJlZUJhc2VEdXJhdGlvbikpO1xuICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICBlbWl0UGVuZGluZ0h5ZHJhdGlvbldhcm5pbmdzKCksXG4gICAgICAgICAgICAgICAgICByZXNldEh5ZHJhdGlvblN0YXRlKCksXG4gICAgICAgICAgICAgICAgICAwID09PSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiAxMjgpICYmXG4gICAgICAgICAgICAgICAgICAgIChyZW5kZXJMYW5lcyA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsKSxcbiAgICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA0KSxcbiAgICAgICAgICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSAmJlxuICAgICAgICAgICAgICAgICAgICBudWxsICE9PSByZW5kZXJMYW5lcyAmJlxuICAgICAgICAgICAgICAgICAgICAoKGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZCksXG4gICAgICAgICAgICAgICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiAtPVxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC50cmVlQmFzZUR1cmF0aW9uKSk7XG4gICAgICAgICAgICAgIGN1cnJlbnQgPSAhMTtcbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAocmVuZGVyTGFuZXMgPSB1cGdyYWRlSHlkcmF0aW9uRXJyb3JzVG9SZWNvdmVyYWJsZSgpKSxcbiAgICAgICAgICAgICAgICBudWxsICE9PSBjdXJyZW50ICYmXG4gICAgICAgICAgICAgICAgICBudWxsICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUgJiZcbiAgICAgICAgICAgICAgICAgIChjdXJyZW50Lm1lbW9pemVkU3RhdGUuaHlkcmF0aW9uRXJyb3JzID0gcmVuZGVyTGFuZXMpLFxuICAgICAgICAgICAgICAgIChjdXJyZW50ID0gITApO1xuICAgICAgICAgICAgaWYgKCFjdXJyZW50KSB7XG4gICAgICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIDI1NilcbiAgICAgICAgICAgICAgICByZXR1cm4gcG9wU3VzcGVuc2VIYW5kbGVyKHdvcmtJblByb2dyZXNzKSwgd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgICAgICAgIHBvcFN1c3BlbnNlSGFuZGxlcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKDAgIT09ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIDEyOCkpXG4gICAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAgIFwiQ2xpZW50IHJlbmRlcmluZyBhbiBBY3Rpdml0eSBzdXNwZW5kZWQgaXQgYWdhaW4uIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuXCJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgbmV3UHJvcHMgP
15852SB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIG51bGwgPT09IGN1cnJlbnQgfHxcbiAgICAgICAgICAgIChudWxsICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUgJiZcbiAgICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlLmRlaHlkcmF0ZWQpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0eXBlID0gbmV3UHJvcHM7XG4gICAgICAgICAgICBuZXh0UmVzb3VyY2UgPSBwb3BIeWRyYXRpb25TdGF0ZSh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICBpZiAobnVsbCAhPT0gdHlwZSAmJiBudWxsICE9PSB0eXBlLmRlaHlkcmF0ZWQpIHtcbiAgICAgICAgICAgICAgaWYgKG51bGwgPT09IGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW5leHRSZXNvdXJjZSlcbiAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIkEgZGVoeWRyYXRlZCBzdXNwZW5zZSBjb21wb25lbnQgd2FzIGNvbXBsZXRlZCB3aXRob3V0IGEgaHlkcmF0ZWQgbm9kZS4gVGhpcyBpcyBwcm9iYWJseSBhIGJ1ZyBpbiBSZWFjdC5cIlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBuZXh0UmVzb3VyY2UgPSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgICAgICAgIG5leHRSZXNvdXJjZSA9XG4gICAgICAgICAgICAgICAgICBudWxsICE9PSBuZXh0UmVzb3VyY2UgPyBuZXh0UmVzb3VyY2UuZGVoeWRyYXRlZCA6IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKCFuZXh0UmVzb3VyY2UpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJFeHBlY3RlZCB0byBoYXZlIGEgaHlkcmF0ZWQgc3VzcGVuc2UgaW5zdGFuY2UuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCJcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgbmV4dFJlc291cmNlW2ludGVybmFsSW5zdGFuY2VLZXldID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSAmJlxuICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gdHlwZSAmJlxuICAgICAgICAgICAgICAgICAgKCh0eXBlID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQpLFxuICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gdHlwZSAmJlxuICAgICAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiAtPSB0eXBlLnRyZWVCYXNlRHVyYXRpb24pKTtcbiAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgZW1pdFBlbmRpbmdIeWRyYXRpb25XYXJuaW5ncygpLFxuICAgICAgICAgICAgICAgICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgMCA9PT0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgMTI4KSAmJlxuICAgICAgICAgICAgICAgICAgICAodHlwZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUgPSBudWxsKSxcbiAgICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA0KSxcbiAgICAgICAgICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSAmJlxuICAgICAgICAgICAgICAgICAgICBudWxsICE9PSB0eXBlICYmXG4gICAgICAgICAgICAgICAgICAgICgodHlwZSA9IHdvcmtJblByb2dyZXNzLmNoaWxkKSxcbiAgICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gdHlwZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy50cmVlQmFzZUR1cmF0aW9uIC09XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlLnRyZWVCYXNlRHVyYXRpb24pKTtcbiAgICAgICAgICAgICAgdHlwZSA9ICExO1xuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICh0eXBlID0gdXBncmFkZUh5ZHJhdGlvbkVycm9yc1RvUmVjb3ZlcmFibGUoKSksXG4gICAgICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudCAmJlxuICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlICYmXG4gICAgICAgICAgICAgICAgICAoY3VycmVudC5tZW1vaXplZFN0YXRlLmh5ZHJhdGlvbkVycm9ycyA9IHR5cGUpLFxuICAgICAgICAgICAgICAgICh0eXBlID0gITApO1xuICAgICAgICAgICAgaWYgKCF0eXBlKSB7XG4gICAgICAgICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIDI1NilcbiAgICAgICAgICAgICAgICByZXR1cm4gcG9wU3VzcGVuc2VIYW5kbGVyKHdvcmtJblByb2dyZXNzKSwgd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgICAgICAgIHBvcFN1c3BlbnNlSGFuZGxlcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBwb3BTdXNwZW5zZUhhbmRsZXIod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIGlmICgwICE9PSAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgJiAxMjgpKVxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmxhbmVzID0gcmVuZGVyTGFuZXMpLFxuICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlICYmXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJBY3R1YWxEdXJhdGlvbih3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzXG4gICAgICAgICAgICApO1xuICAgICAgICAgIHJlbmRlckxhbmVzID0gbnVsbCAhPT0gbmV3UHJvcHM7XG4gICAgICAgICAgY3VycmVudCA9IG51bGwgIT09IGN1cnJlbnQgJiYgbnVsbCAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgI
15852HJlbmRlckxhbmVzICYmXG4gICAgICAgICAgICAoKG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQpLFxuICAgICAgICAgICAgKHR5cGUgPSBudWxsKSxcbiAgICAgICAgICAgIG51bGwgIT09IG5ld1Byb3BzLmFsdGVybmF0ZSAmJlxuICAgICAgICAgICAgICBudWxsICE9PSBuZXdQcm9wcy5hbHRlcm5hdGUubWVtb2l6ZWRTdGF0ZSAmJlxuICAgICAgICAgICAgICBudWxsICE9PSBuZXdQcm9wcy5hbHRlcm5hdGUubWVtb2l6ZWRTdGF0ZS5jYWNoZVBvb2wgJiZcbiAgICAgICAgICAgICAgKHR5cGUgPSBuZXdQcm9wcy5hbHRlcm5hdGUubWVtb2l6ZWRTdGF0ZS5jYWNoZVBvb2wucG9vbCksXG4gICAgICAgICAgICAobmV4dFJlc291cmNlID0gbnVsbCksXG4gICAgICAgICAgICBudWxsICE9PSBuZXdQcm9wcy5tZW1vaXplZFN0YXRlICYmXG4gICAgICAgICAgICAgIG51bGwgIT09IG5ld1Byb3BzLm1lbW9pemVkU3RhdGUuY2FjaGVQb29sICYmXG4gICAgICAgICAgICAgIChuZXh0UmVzb3VyY2UgPSBuZXdQcm9wcy5tZW1vaXplZFN0YXRlLmNhY2hlUG9vbC5wb29sKSxcbiAgICAgICAgICAgIG5leHRSZXNvdXJjZSAhPT0gdHlwZSAmJiAobmV3UHJvcHMuZmxhZ3MgfD0gMjA0OCkpO1xuICAgICAgICAgIHJlbmRlckxhbmVzICE9PSBjdXJyZW50ICYmXG4gICAgICAgICAgICByZW5kZXJMYW5lcyAmJlxuICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmNoaWxkLmZsYWdzIHw9IDgxOTIpO1xuICAgICAgICAgIHNjaGVkdWxlUmV0cnlFZmZlY3Qod29ya0luUHJvZ3Jlc3MsIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlKTtcbiAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlICYmXG4gICAgICAgICAgICByZW5kZXJMYW5lcyAmJlxuICAgICAgICAgICAgKChjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuY2hpbGQpLFxuICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudCAmJlxuICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MudHJlZUJhc2VEdXJhdGlvbiAtPSBjdXJyZW50LnRyZWVCYXNlRHVyYXRpb24pKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgIG51bGwgPT09IGN1cnJlbnQgJiZcbiAgICAgICAgICAgICAgbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMoXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3Muc3RhdGVOb2RlLmNvbnRhaW5lckluZm9cbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA2NzEwODg2NCksXG4gICAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBwb3BQcm92aWRlcih3b3JrSW5Qcm9ncmVzcy50eXBlLCB3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIDE5OlxuICAgICAgICAgIHBvcFN1c3BlbnNlTGlzdENvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICAgIG5ld1Byb3BzID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICBpZiAobnVsbCA9PT0gbmV3UHJvcHMpIHJldHVybiBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKSwgbnVsbDtcbiAgICAgICAgICB0eXBlID0gMCAhPT0gKHdvcmtJblByb2dyZXNzLmZsYWdzICYgMTI4KTtcbiAgICAgICAgICBuZXh0UmVzb3VyY2UgPSBuZXdQcm9wcy5yZW5kZXJpbmc7XG4gICAgICAgICAgaWYgKG51bGwgPT09IG5leHRSZXNvdXJjZSlcbiAgICAgICAgICAgIGlmICh0eXBlKSBjdXRPZmZUYWlsSWZOZWVkZWQobmV3UHJvcHMsICExKTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyAhPT0gUm9vdEluUHJvZ3Jlc3MgfHxcbiAgICAgICAgICAgICAgICAobnVsbCAhPT0gY3VycmVudCAmJiAwICE9PSAoY3VycmVudC5mbGFncyAmIDEyOCkpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBmb3IgKGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5jaGlsZDsgbnVsbCAhPT0gY3VycmVudDsgKSB7XG4gICAgICAgICAgICAgICAgICBuZXh0UmVzb3VyY2UgPSBmaW5kRmlyc3RTdXNwZW5kZWQoY3VycmVudCk7XG4gICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPT0gbmV4dFJlc291cmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDEyODtcbiAgICAgICAgICAgICAgICAgICAgY3V0T2ZmVGFpbElmTmVlZGVkKG5ld1Byb3BzLCAhMSk7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBuZXh0UmVzb3VyY2UudXBkYXRlUXVldWU7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gY3VycmVudDtcbiAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVSZXRyeUVmZmVjdCh3b3JrSW5Qcm9ncmVzcywgY3VycmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLnN1YnRyZWVGbGFncyA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSByZW5kZXJMYW5lcztcbiAgICAgICAgICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgICAgICAgICByZW5kZXJMYW5lcyA9IHdvcmtJblByb2dyZXNzLmNoaWxkO1xuICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT09IHJlbmRlckxhbmVzO1xuXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICByZXNldFdvcmtJblByb2dyZXNzKHJlbmRlckxhbmVzLCBjdXJyZW50KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIChyZW5kZXJMYW5lcyA9IHJlbmRlckxhbmVzLnNpYmxpbmcpO1xuICAgICAgICAgICAgICAgICAgICBwdXNoU3VzcGVuc2VMaXN0Q29udGV4dChcbiAgICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgICAgICAgICAoc3VzcGVuc2VTdGFja0N1cnNvci5jdXJyZW50ICZcbiAgICAgICAgICAgICAgICAgICAgICAgIFN1YnRyZWVTdXNwZW5zZUNvbnRleHRNYXNrKSB8XG4gICAgICAgICAgICAgICAgICAgICAgICBGb3JjZVN1c3BlbnNlRmFsbGJhY2tcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaXNIeWRyYXRpbmcgJiZcbiAgICAgICAgICAgICAgICAgICAgICBwdXNoVHJlZUZvcmsod29ya0luUHJvZ3Jlc3MsIG5ld1Byb3BzLnRyZWVGb3JrQ291bnQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3MuY2hpbGQ7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5zaWJsaW5nO1xuICAgICAgICAgICAgICAgI
15852H1cbiAgICAgICAgICAgICAgbnVsbCAhPT0gbmV3UHJvcHMudGFpbCAmJlxuICAgICAgICAgICAgICAgIG5vdyQxKCkgPiB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJUYXJnZXRUaW1lICYmXG4gICAgICAgICAgICAgICAgKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAxMjgpLFxuICAgICAgICAgICAgICAgICh0eXBlID0gITApLFxuICAgICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChuZXdQcm9wcywgITEpLFxuICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IDQxOTQzMDQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICghdHlwZSlcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICgoY3VycmVudCA9IGZpbmRGaXJzdFN1c3BlbmRlZChuZXh0UmVzb3VyY2UpKSwgbnVsbCAhPT0gY3VycmVudClcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAxMjgpLFxuICAgICAgICAgICAgICAgICAgKHR5cGUgPSAhMCksXG4gICAgICAgICAgICAgICAgICAoY3VycmVudCA9IGN1cnJlbnQudXBkYXRlUXVldWUpLFxuICAgICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLnVwZGF0ZVF1ZXVlID0gY3VycmVudCksXG4gICAgICAgICAgICAgICAgICBzY2hlZHVsZVJldHJ5RWZmZWN0KHdvcmtJblByb2dyZXNzLCBjdXJyZW50KSxcbiAgICAgICAgICAgICAgICAgIGN1dE9mZlRhaWxJZk5lZWRlZChuZXdQcm9wcywgITApLFxuICAgICAgICAgICAgICAgICAgbnVsbCA9PT0gbmV3UHJvcHMudGFpbCAmJlxuICAgICAgICAgICAgICAgICAgICBcImNvbGxhcHNlZFwiICE9PSBuZXdQcm9wcy50YWlsTW9kZSAmJlxuICAgICAgICAgICAgICAgICAgICBcInZpc2libGVcIiAhPT0gbmV3UHJvcHMudGFpbE1vZGUgJiZcbiAgICAgICAgICAgICAgICAgICAgIW5leHRSZXNvdXJjZS5hbHRlcm5hdGUgJiZcbiAgICAgICAgICAgICAgICAgICAgIWlzSHlkcmF0aW5nKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIHJldHVybiBidWJibGVQcm9wZXJ0aWVzKHdvcmtJblByb2dyZXNzKSwgbnVsbDtcbiAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgMiAqIG5vdyQxKCkgLSBuZXdQcm9wcy5yZW5kZXJpbmdTdGFydFRpbWUgPlxuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyVGFyZ2V0VGltZSAmJlxuICAgICAgICAgICAgICAgICAgNTM2ODcwOTEyICE9PSByZW5kZXJMYW5lcyAmJlxuICAgICAgICAgICAgICAgICAgKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAxMjgpLFxuICAgICAgICAgICAgICAgICAgKHR5cGUgPSAhMCksXG4gICAgICAgICAgICAgICAgICBjdXRPZmZUYWlsSWZOZWVkZWQobmV3UHJvcHMsICExKSxcbiAgICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5sYW5lcyA9IDQxOTQzMDQpKTtcbiAgICAgICAgICAgIG5ld1Byb3BzLmlzQmFja3dhcmRzXG4gICAgICAgICAgICAgID8gKChuZXh0UmVzb3VyY2Uuc2libGluZyA9IHdvcmtJblByb2dyZXNzLmNoaWxkKSxcbiAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MuY2hpbGQgPSBuZXh0UmVzb3VyY2UpKVxuICAgICAgICAgICAgICA6ICgoY3VycmVudCA9IG5ld1Byb3BzLmxhc3QpLFxuICAgICAgICAgICAgICAgIG51bGwgIT09IGN1cnJlbnRcbiAgICAgICAgICAgICAgICAgID8gKGN1cnJlbnQuc2libGluZyA9IG5leHRSZXNvdXJjZSlcbiAgICAgICAgICAgICAgICAgIDogKHdvcmtJblByb2dyZXNzLmNoaWxkID0gbmV4dFJlc291cmNlKSxcbiAgICAgICAgICAgICAgICAobmV3UHJvcHMubGFzdCA9IG5leHRSZXNvdXJjZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobnVsbCAhPT0gbmV3UHJvcHMudGFpbCkge1xuICAgICAgICAgICAgY3VycmVudCA9IG5ld1Byb3BzLnRhaWw7XG4gICAgICAgICAgICBhOiB7XG4gICAgICAgICAgICAgIGZvciAocmVuZGVyTGFuZXMgPSBjdXJyZW50OyBudWxsICE9PSByZW5kZXJMYW5lczsgKSB7XG4gICAgICAgICAgICAgICAgaWYgKG51bGwgIT09IHJlbmRlckxhbmVzLmFsdGVybmF0ZSkge1xuICAgICAgICAgICAgICAgICAgcmVuZGVyTGFuZXMgPSAhMTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlbmRlckxhbmVzID0gcmVuZGVyTGFuZXMuc2libGluZztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZW5kZXJMYW5lcyA9ICEwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV3UHJvcHMucmVuZGVyaW5nID0gY3VycmVudDtcbiAgICAgICAgICAgIG5ld1Byb3BzLnRhaWwgPSBjdXJyZW50LnNpYmxpbmc7XG4gICAgICAgICAgICBuZXdQcm9wcy5yZW5kZXJpbmdTdGFydFRpbWUgPSBub3ckMSgpO1xuICAgICAgICAgICAgY3VycmVudC5zaWJsaW5nID0gbnVsbDtcbiAgICAgICAgICAgIG5leHRSZXNvdXJjZSA9IHN1c3BlbnNlU3RhY2tDdXJzb3IuY3VycmVudDtcbiAgICAgICAgICAgIG5leHRSZXNvdXJjZSA9IHR5cGVcbiAgICAgICAgICAgICAgPyAobmV4dFJlc291cmNlICYgU3VidHJlZVN1c3BlbnNlQ29udGV4dE1hc2spIHxcbiAgICAgICAgICAgICAgICBGb3JjZVN1c3BlbnNlRmFsbGJhY2tcbiAgICAgICAgICAgICAgOiBuZXh0UmVzb3VyY2UgJiBTdWJ0cmVlU3VzcGVuc2VDb250ZXh0TWFzaztcbiAgICAgICAgICAgIFwidmlzaWJsZVwiID09PSBuZXdQcm9wcy50YWlsTW9kZSB8fFxuICAgICAgICAgICAgXCJjb2xsYXBzZWRcIiA9PT0gbmV3UHJvcHMudGFpbE1vZGUgfHxcbiAgICAgICAgICAgICFyZW5kZXJMYW5lcyB8fFxuICAgICAgICAgICAgaXNIeWRyYXRpbmdcbiAgICAgICAgICAgICAgPyBwdXNoU3VzcGVuc2VMaXN0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcywgbmV4dFJlc291cmNlKVxuICAgICAgICAgICAgICA6ICgocmVuZGVyTGFuZXMgPSBuZXh0UmVzb3VyY2UpLFxuICAgICAgICAgICAgICAgIHB1c2goXG4gICAgICAgICAgICAgICAgICBzdXNwZW5zZUhhbmRsZXJTdGFja0N1cnNvcixcbiAgICAgICAgICAgICAgICAgI
15852HdvcmtJblByb2dyZXNzLFxuICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHB1c2goc3VzcGVuc2VTdGFja0N1cnNvciwgcmVuZGVyTGFuZXMsIHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgICAgICBudWxsID09PSBzaGVsbEJvdW5kYXJ5ICYmIChzaGVsbEJvdW5kYXJ5ID0gd29ya0luUHJvZ3Jlc3MpKTtcbiAgICAgICAgICAgIGlzSHlkcmF0aW5nICYmIHB1c2hUcmVlRm9yayh3b3JrSW5Qcm9ncmVzcywgbmV3UHJvcHMudHJlZUZvcmtDb3VudCk7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGNhc2UgMjI6XG4gICAgICAgIGNhc2UgMjM6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHBvcFN1c3BlbnNlSGFuZGxlcih3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICBwb3BIaWRkZW5Db250ZXh0KHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgIChuZXdQcm9wcyA9IG51bGwgIT09IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUpLFxuICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudFxuICAgICAgICAgICAgICA/IChudWxsICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpICE9PSBuZXdQcm9wcyAmJlxuICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA4MTkyKVxuICAgICAgICAgICAgICA6IG5ld1Byb3BzICYmICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA4MTkyKSxcbiAgICAgICAgICAgIG5ld1Byb3BzXG4gICAgICAgICAgICAgID8gMCAhPT0gKHJlbmRlckxhbmVzICYgNTM2ODcwOTEyKSAmJlxuICAgICAgICAgICAgICAgIDAgPT09ICh3b3JrSW5Qcm9ncmVzcy5mbGFncyAmIDEyOCkgJiZcbiAgICAgICAgICAgICAgICAoYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3Muc3VidHJlZUZsYWdzICYgNiAmJlxuICAgICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDgxOTIpKVxuICAgICAgICAgICAgICA6IGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgKHJlbmRlckxhbmVzID0gd29ya0luUHJvZ3Jlc3MudXBkYXRlUXVldWUpLFxuICAgICAgICAgICAgbnVsbCAhPT0gcmVuZGVyTGFuZXMgJiZcbiAgICAgICAgICAgICAgc2NoZWR1bGVSZXRyeUVmZmVjdCh3b3JrSW5Qcm9ncmVzcywgcmVuZGVyTGFuZXMucmV0cnlRdWV1ZSksXG4gICAgICAgICAgICAocmVuZGVyTGFuZXMgPSBudWxsKSxcbiAgICAgICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiZcbiAgICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlICYmXG4gICAgICAgICAgICAgIG51bGwgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5jYWNoZVBvb2wgJiZcbiAgICAgICAgICAgICAgKHJlbmRlckxhbmVzID0gY3VycmVudC5tZW1vaXplZFN0YXRlLmNhY2hlUG9vbC5wb29sKSxcbiAgICAgICAgICAgIChuZXdQcm9wcyA9IG51bGwpLFxuICAgICAgICAgICAgbnVsbCAhPT0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSAmJlxuICAgICAgICAgICAgICBudWxsICE9PSB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlLmNhY2hlUG9vbCAmJlxuICAgICAgICAgICAgICAobmV3UHJvcHMgP
15852SB3b3JrSW5Qcm9ncmVzcy5tZW1vaXplZFN0YXRlLmNhY2hlUG9vbC5wb29sKSxcbiAgICAgICAgICAgIG5ld1Byb3BzICE9PSByZW5kZXJMYW5lcyAmJiAod29ya0luUHJvZ3Jlc3MuZmxhZ3MgfD0gMjA0OCksXG4gICAgICAgICAgICBudWxsICE9PSBjdXJyZW50ICYmIHBvcChyZXN1bWVkQ2FjaGUsIHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIDI0OlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAocmVuZGVyTGFuZXMgPSBudWxsKSxcbiAgICAgICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiYgKHJlbmRlckxhbmVzID0gY3VycmVudC5tZW1vaXplZFN0YXRlLmNhY2hlKSxcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGUuY2FjaGUgIT09IHJlbmRlckxhbmVzICYmXG4gICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSAyMDQ4KSxcbiAgICAgICAgICAgIHBvcFByb3ZpZGVyKENhY2hlQ29udGV4dCwgd29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgYnViYmxlUHJvcGVydGllcyh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSAyNTpcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgY2FzZSAzMDpcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLmZsYWdzIHw9IDMzNTU0NDMyKSxcbiAgICAgICAgICAgIGJ1YmJsZVByb3BlcnRpZXMod29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgXCJVbmtub3duIHVuaXQgb2Ygd29yayB0YWcgKFwiICtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcy50YWcgK1xuICAgICAgICAgIFwiKS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIlxuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdW53aW5kV29yayhjdXJyZW50LCB3b3JrSW5Qcm9ncmVzcykge1xuICAgICAgcG9wVHJlZUNvbnRleHQod29ya0luUHJvZ3Jlc3MpO1xuICAgICAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzcy50YWcpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoY3VycmVudCA9IHdvcmtJblByb2dyZXNzLmZsYWdzKSxcbiAgICAgICAgICAgIGN1cnJlbnQgJiA2NTUzNlxuICAgICAgICAgICAgICA/ICgod29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSAoY3VycmVudCAmIC02NTUzNykgfCAxMjgpLFxuICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUgJiZcbiAgICAgICAgICAgICAgICAgIHRyYW5zZmVyQWN0dWFsRHVyYXRpb24od29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzKVxuICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHBvcFByb3ZpZGVyKENhY2hlQ29udGV4dCwgd29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgcG9wSG9zdENvbnRhaW5lcih3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAoY3VycmVudCA9IHdvcmtJblByb2dyZXNzLmZsYWdzKSxcbiAgICAgICAgICAgIDAgIT09IChjdXJyZW50ICYgNjU1MzYpICYmIDAgPT09IChjdXJyZW50ICYgMTI4KVxuICAgICAgICAgICAgICA/ICgod29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSAoY3VycmVudCAmIC02NTUzNykgfCAxMjgpLFxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzKVxuICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIDI2OlxuICAgICAgICBjYXNlIDI3OlxuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgcmV0dXJuIHBvcEhvc3RDb250ZXh0KHdvcmtJblByb2dyZXNzKSwgbnVsbDtcbiAgICAgICAgY2FzZSAzMTpcbiAgICAgICAgICBpZiAobnVsbCAhPT0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSkge1xuICAgICAgICAgICAgcG9wU3VzcGVuc2VIYW5kbGVyKHdvcmtJblByb2dyZXNzKTtcbiAgICAgICAgICAgIGlmIChudWxsID09PSB3b3JrSW5Qcm9ncmVzcy5hbHRlcm5hdGUpXG4gICAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAgIFwiVGhyZXcgaW4gbmV3bHkgbW91bnRlZCBkZWh5ZHJhdGVkIGNvbXBvbmVudC4gVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXNldEh5ZHJhdGlvblN0YXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN1cnJlbnQgPSB3b3JrSW5Qcm9ncmVzcy5mbGFncztcbiAgICAgICAgICByZXR1cm4gY3VycmVudCAmIDY1NTM2XG4gICAgICAgICAgICA/ICgod29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSAoY3VycmVudCAmIC02NTUzNykgfCAxMjgpLFxuICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlICYmXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJBY3R1YWxEdXJhdGlvbih3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzKVxuICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgIHBvcFN1c3BlbnNlSGFuZGxlcih3b3JrSW5Qcm9ncmVzcyk7XG4gICAgICAgICAgY3VycmVudCA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgaWYgKG51bGwgIT09IGN1cnJlbnQgJiYgbnVsbCAhPT0gY3VycmVudC5kZWh5ZHJhdGVkKSB7XG4gICAgICAgICAgICBpZiAobnVsbCA9PT0gd29ya0luUHJvZ3Jlc3MuYWx0ZXJuYXRlKVxuICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgICAgICBcIlRocmV3IGluIG5ld2x5IG1vdW50ZWQgZGVoeWRyYXRlZCBjb21wb25lbnQuIFRoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1
15852ZS5cIlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgcmVzZXRIeWRyYXRpb25TdGF0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3M7XG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQgJiA2NTUzNlxuICAgICAgICAgICAgPyAoKHdvcmtJblByb2dyZXNzLmZsYWdzID0gKGN1cnJlbnQgJiAtNjU1MzcpIHwgMTI4KSxcbiAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSAmJlxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQWN0dWFsRHVyYXRpb24od29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcylcbiAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgcG9wU3VzcGVuc2VMaXN0Q29udGV4dCh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAoY3VycmVudCA9IHdvcmtJblByb2dyZXNzLmZsYWdzKSxcbiAgICAgICAgICAgIGN1cnJlbnQgJiA2NTUzNlxuICAgICAgICAgICAgICA/ICgod29ya0luUHJvZ3Jlc3MuZmxhZ3MgPSAoY3VycmVudCAmIC02NTUzNykgfCAxMjgpLFxuICAgICAgICAgICAgICAgIChjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MubWVtb2l6ZWRTdGF0ZSksXG4gICAgICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudCAmJlxuICAgICAgICAgICAgICAgICAgKChjdXJyZW50LnJlbmRlcmluZyA9IG51bGwpLCAoY3VycmVudC50YWlsID0gbnVsbCkpLFxuICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzcy5mbGFncyB8PSA0KSxcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzcylcbiAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHJldHVybiBwb3BIb3N0Q29udGFpbmVyKHdvcmtJblByb2dyZXNzKSwgbnVsbDtcbiAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICByZXR1cm4gcG9wUHJvdmlkZXIod29ya0luUHJvZ3Jlc3MudHlwZSwgd29ya0luUHJvZ3Jlc3MpLCBudWxsO1xuICAgICAgICBjYXNlIDIyOlxuICAgICAgICBjYXNlIDIzOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBwb3BTdXNwZW5zZUhhbmRsZXIod29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgcG9wSGlkZGVuQ29udGV4dCh3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICBudWxsICE9PSBjdXJyZW50ICYmIHBvcChyZXN1bWVkQ2FjaGUsIHdvcmtJblByb2dyZXNzKSxcbiAgICAgICAgICAgIChjdXJyZW50ID0gd29ya0luUHJvZ3Jlc3MuZmxhZ3MpLFxuICAgICAgICAgICAgY3VycmVudCAmIDY1NTM2XG4gICAgICAgICAgICAgID8gKCh3b3JrSW5Qcm9ncmVzcy5mbGFncyA9IChjdXJyZW50ICYgLTY1NTM3KSB8IDEyOCksXG4gICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSAmJlxuICAgICAgICAgICAgICAgICAgdHJhbnNmZXJBY3R1YWxEdXJhdGlvbih3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3MpXG4gICAgICAgICAgICAgIDogbnVsbFxuICAgICAgICAgICk7XG4gICAgICAgIGNhc2UgMjQ6XG4gICAgICAgICAgcmV0dXJuIHBvcFByb3ZpZGVyKENhY2hlQ29udGV4dCwgd29ya0luUHJvZ3Jlc3MpLCBudWxsO1xuICAgICAgICBjYXNlIDI1OlxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB1bndpbmRJbnRlcnJ1cHRlZFdvcmsoY3VycmVudCwgaW50ZXJydXB0ZWRXb3JrKSB7XG4gICAgICBwb3BUcmVlQ29udGV4dChpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgc3dpdGNoIChpbnRlcnJ1cHRlZFdvcmsudGFnKSB7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBwb3BQcm92aWRlcihDYWNoZUNvbnRleHQsIGludGVycnVwdGVkV29yayk7XG4gICAgICAgICAgcG9wSG9zdENvbnRhaW5lcihpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI2OlxuICAgICAgICBjYXNlIDI3OlxuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgcG9wSG9zdENvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHBvcEhvc3RDb250YWluZXIoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzMTpcbiAgICAgICAgICBudWxsICE9PSBpbnRlcnJ1cHRlZFdvcmsubWVtb2l6ZWRTdGF0ZSAmJlxuICAgICAgICAgICAgcG9wU3VzcGVuc2VIYW5kbGVyKGludGVycnVwdGVkV29yayk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgcG9wU3VzcGVuc2VIYW5kbGVyKGludGVycnVwdGVkV29yayk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTk6XG4gICAgICAgICAgcG9wU3VzcGVuc2VMaXN0Q29udGV4dChpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIHBvcFByb3ZpZGVyKGludGVycnVwdGVkV29yay50eXBlLCBpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDIyOlxuICAgICAgICBjYXNlIDIzOlxuICAgICAgICAgIHBvcFN1c3BlbnNlSGFuZGxlcihpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgICAgIHBvcEhpZGRlbkNvbnRleHQoaW50ZXJydXB0ZWRXb3JrKTtcbiAgICAgICAgICBudWxsICE9PSBjdXJyZW50ICYmIHBvcChyZXN1bWVkQ2FjaGUsIGludGVycnVwdGVkV29yayk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjQ6XG4gICAgICAgICAgcG9wUHJvdmlkZXIoQ2FjaGVDb250ZXh0LCBpbnRlcnJ1cHRlZFdvcmspO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBzaG91bGRQcm9maWxlKGN1cnJlbnQpIHtcbiAgICAgIHJldHVybiAoY3VycmVudC5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbW1pdEhvb2tMYXlvdXRFZmZlY3RzKGZpbmlzaGVkV29yaywgaG9va0ZsYWdzKSB7XG4gICAgICBzaG91bGRQcm9maWxlKGZpbmlzaGVkV29yaylcbiAgICAgICAgPyAoc3RhcnRFZmZlY3RUaW1lcigpLFxuICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoaG9va0ZsYWdzLCBmaW5pc2hlZFdvcmspLFxuICAgICAgICAgI
15852HJlY29yZEVmZmVjdER1cmF0aW9uKCkpXG4gICAgICAgIDogY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChob29rRmxhZ3MsIGZpbmlzaGVkV29yayk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbW1pdEhvb2tMYXlvdXRVbm1vdW50RWZmZWN0cyhcbiAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICBob29rRmxhZ3NcbiAgICApIHtcbiAgICAgIHNob3VsZFByb2ZpbGUoZmluaXNoZWRXb3JrKVxuICAgICAgICA/IChzdGFydEVmZmVjdFRpbWVyKCksXG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KFxuICAgICAgICAgICAgaG9va0ZsYWdzLFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgbmVhcmVzdE1vdW50ZWRBbmNlc3RvclxuICAgICAgICAgICksXG4gICAgICAgICAgcmVjb3JkRWZmZWN0RHVyYXRpb24oKSlcbiAgICAgICAgOiBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoXG4gICAgICAgICAgICBob29rRmxhZ3MsXG4gICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICBuZWFyZXN0TW91bnRlZEFuY2VzdG9yXG4gICAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChmbGFncywgZmluaXNoZWRXb3JrKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgdXBkYXRlUXVldWUgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWUsXG4gICAgICAgICAgbGFzdEVmZmVjdCA9IG51bGwgIT09IHVwZGF0ZVF1ZXVlID8gdXBkYXRlUXVldWUubGFzdEVmZmVjdCA6IG51bGw7XG4gICAgICAgIGlmIChudWxsICE9PSBsYXN0RWZmZWN0KSB7XG4gICAgICAgICAgdmFyIGZpcnN0RWZmZWN0ID0gbGFzdEVmZmVjdC5uZXh0O1xuICAgICAgICAgIHVwZGF0ZVF1ZXVlID0gZmlyc3RFZmZlY3Q7XG4gICAgICAgICAgZG8ge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAodXBkYXRlUXVldWUudGFnICYgZmxhZ3MpID09PSBmbGFncyAmJlxuICAgICAgICAgICAgICAoKGxhc3RFZmZlY3QgPSB2b2lkIDApLFxuICAgICAgICAgICAgICAoZmxhZ3MgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzICYmXG4gICAgICAgICAgICAgICAgKGlzUnVubmluZ0luc2VydGlvbkVmZmVjdCA9ICEwKSxcbiAgICAgICAgICAgICAgKGxhc3RFZmZlY3QgPSBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgICAgY2FsbENyZWF0ZUluREVWLFxuICAgICAgICAgICAgICAgIHVwZGF0ZVF1ZXVlXG4gICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICAoZmxhZ3MgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzICYmXG4gICAgICAgICAgICAgICAgKGlzUnVubmluZ0luc2VydGlvbkVmZmVjdCA9ICExKSxcbiAgICAgICAgICAgICAgdm9pZCAwICE9PSBsYXN0RWZmZWN0ICYmIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIGxhc3RFZmZlY3QpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdmFyIGhvb2tOYW1lID0gdm9pZCAwO1xuICAgICAgICAgICAgICBob29rTmFtZSA9XG4gICAgICAgICAgICAgICAgMCAhPT0gKHVwZGF0ZVF1ZXVlLnRhZyAmIExheW91dClcbiAgICAgICAgICAgICAgICAgID8gXCJ1c2VMYXlvdXRFZmZlY3RcIlxuICAgICAgICAgICAgICAgICAgOiAwICE9PSAodXBkYXRlUXVldWUudGFnICYgSW5zZXJ0aW9uKVxuICAgICAgICAgICAgICAgICAgICA/IFwidXNlSW5zZXJ0aW9uRWZmZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgOiBcInVzZUVmZmVjdFwiO1xuICAgICAgICAgICAgICB2Y
15852XIgYWRkZW5kdW0gPSB2b2lkIDA7XG4gICAgICAgICAgICAgIGFkZGVuZHVtID1cbiAgICAgICAgICAgICAgICBudWxsID09PSBsYXN0RWZmZWN0XG4gICAgICAgICAgICAgICAgICA/IFwiIFlvdSByZXR1cm5lZCBudWxsLiBJZiB5b3VyIGVmZmVjdCBkb2VzIG5vdCByZXF1aXJlIGNsZWFuIHVwLCByZXR1cm4gdW5kZWZpbmVkIChvciBub3RoaW5nKS5cIlxuICAgICAgICAgICAgICAgICAgOiBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBsYXN0RWZmZWN0LnRoZW5cbiAgICAgICAgICAgICAgICAgICAgPyBcIlxcblxcbkl0IGxvb2tzIGxpa2UgeW91IHdyb3RlIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICBob29rTmFtZSArXG4gICAgICAgICAgICAgICAgICAgICAgXCIoYXN5bmMgKCkgPT4gLi4uKSBvciByZXR1cm5lZCBhIFByb21pc2UuIEluc3RlYWQsIHdyaXRlIHRoZSBhc3luYyBmdW5jdGlvbiBpbnNpZGUgeW91ciBlZmZlY3QgYW5kIGNhbGwgaXQgaW1tZWRpYXRlbHk6XFxuXFxuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgIGhvb2tOYW1lICtcbiAgICAgICAgICAgICAgICAgICAgICBcIigoKSA9PiB7XFxuICBhc3luYyBmdW5jdGlvbiBmZXRjaERhdGEoKSB7XFxuICAgIC8vIFlvdSBjYW4gYXdhaXQgaGVyZVxcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IE15QVBJLmdldERhdGEoc29tZUlkKTtcXG4gICAgLy8gLi4uXFxuICB9XFxuICBmZXRjaERhdGEoKTtcXG59LCBbc29tZUlkXSk7IC8vIE9yIFtdIGlmIGVmZmVjdCBkb2Vzbid0IG5lZWQgcHJvcHMgb3Igc3RhdGVcXG5cXG5MZWFybiBtb3JlIGFib3V0IGRhdGEgZmV0Y2hpbmcgd2l0aCBIb29rczogaHR0cHM6Ly9yZWFjdC5kZXYvbGluay9ob29rcy1kYXRhLWZldGNoaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgOiBcIiBZb3UgcmV0dXJuZWQ6IFwiICsgbGFzdEVmZmVjdDtcbiAgICAgICAgICAgICAgcnVuV2l0aEZpYmVySW5ERVYoXG4gICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChuLCBhKSB7XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIiVzIG11c3Qgbm90IHJldHVybiBhbnl0aGluZyBiZXNpZGVzIGEgZnVuY3Rpb24sIHdoaWNoIGlzIHVzZWQgZm9yIGNsZWFuLXVwLiVzXCIsXG4gICAgICAgICAgICAgICAgICAgIG4sXG4gICAgICAgICAgICAgICAgICAgIGFcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBob29rTmFtZSxcbiAgICAgICAgICAgICAgICBhZGRlbmR1bVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXBkYXRlUXVldWUgPSB1cGRhdGVRdWV1ZS5uZXh0O1xuICAgICAgICAgIH0gd2hpbGUgKHVwZGF0ZVF1ZXVlICE9PSBmaXJzdEVmZmVjdCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoXG4gICAgICBmbGFncyxcbiAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3JcbiAgICApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciB1cGRhdGVRdWV1ZSA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZSxcbiAgICAgICAgICBsYXN0RWZmZWN0ID0gbnVsbCAhPT0gdXBkYXRlUXVldWUgPyB1cGRhdGVRdWV1ZS5sYXN0RWZmZWN0IDogbnVsbDtcbiAgICAgICAgaWYgKG51bGwgIT09IGxhc3RFZmZlY3QpIHtcbiAgICAgICAgICB2Y
15852XIgZmlyc3RFZmZlY3QgPSBsYXN0RWZmZWN0Lm5leHQ7XG4gICAgICAgICAgdXBkYXRlUXVldWUgPSBmaXJzdEVmZmVjdDtcbiAgICAgICAgICBkbyB7XG4gICAgICAgICAgICBpZiAoKHVwZGF0ZVF1ZXVlLnRhZyAmIGZsYWdzKSA9PT0gZmxhZ3MpIHtcbiAgICAgICAgICAgICAgdmFyIGluc3QgPSB1cGRhdGVRdWV1ZS5pbnN0LFxuICAgICAgICAgICAgICAgIGRlc3Ryb3kgPSBpbnN0LmRlc3Ryb3k7XG4gICAgICAgICAgICAgIHZvaWQgMCAhPT0gZGVzdHJveSAmJlxuICAgICAgICAgICAgICAgICgoaW5zdC5kZXN0cm95ID0gdm9pZCAwKSxcbiAgICAgICAgICAgICAgICAoZmxhZ3MgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzICYmXG4gICAgICAgICAgICAgICAgICAoaXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0ID0gITApLFxuICAgICAgICAgICAgICAgIChsYXN0RWZmZWN0ID0gZmluaXNoZWRXb3JrKSxcbiAgICAgICAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgICAgICAgIGxhc3RFZmZlY3QsXG4gICAgICAgICAgICAgICAgICBjYWxsRGVzdHJveUluREVWLFxuICAgICAgICAgICAgICAgICAgbGFzdEVmZmVjdCxcbiAgICAgICAgICAgICAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICAgICAgICAgICAgICBkZXN0cm95XG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAoZmxhZ3MgJiBJbnNlcnRpb24pICE9PSBOb0ZsYWdzICYmXG4gICAgICAgICAgICAgICAgICAoaXNSdW5uaW5nSW5zZXJ0aW9uRWZmZWN0ID0gITEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVwZGF0ZVF1ZXVlID0gdXBkYXRlUXVldWUubmV4dDtcbiAgICAgICAgICB9IHdoaWxlICh1cGRhdGVRdWV1ZSAhPT0gZmlyc3RFZmZlY3QpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gY29tbWl0SG9va1Bhc3NpdmVNb3VudEVmZmVjdHMoZmluaXNoZWRXb3JrLCBob29rRmxhZ3MpIHtcbiAgICAgIHNob3VsZFByb2ZpbGUoZmluaXNoZWRXb3JrKVxuICAgICAgICA/IChzdGFydEVmZmVjdFRpbWVyKCksXG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RNb3VudChob29rRmxhZ3MsIGZpbmlzaGVkV29yayksXG4gICAgICAgICAgcmVjb3JkRWZmZWN0RHVyYXRpb24oKSlcbiAgICAgICAgOiBjb21taXRIb29rRWZmZWN0TGlzdE1vdW50KGhvb2tGbGFncywgZmluaXNoZWRXb3JrKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tbWl0SG9va1Bhc3NpdmVVbm1vdW50RWZmZWN0cyhcbiAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICBob29rRmxhZ3NcbiAgICApIHtcbiAgICAgIHNob3VsZFByb2ZpbGUoZmluaXNoZWRXb3JrKVxuICAgICAgICA/IChzdGFydEVmZmVjdFRpbWVyKCksXG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KFxuICAgICAgICAgICAgaG9va0ZsYWdzLFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgbmVhcmVzdE1vdW50ZWRBbmNlc3RvclxuICAgICAgICAgICksXG4gICAgICAgICAgcmVjb3JkRWZmZWN0RHVyYXRpb24oKSlcbiAgICAgICAgOiBjb21taXRIb29rRWZmZWN0TGlzdFVubW91bnQoXG4gICAgICAgICAgICBob29rRmxhZ3MsXG4gICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICBuZWFyZXN0TW91bnRlZEFuY2VzdG9yXG4gICAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tbWl0Q2xhc3NDYWxsYmFja3MoZmluaXNoZWRXb3JrKSB7XG4gICAgICB2Y
15852XIgdXBkYXRlUXVldWUgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWU7XG4gICAgICBpZiAobnVsbCAhPT0gdXBkYXRlUXVldWUpIHtcbiAgICAgICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgZmluaXNoZWRXb3JrLnR5cGUuZGVmYXVsdFByb3BzIHx8XG4gICAgICAgICAgXCJyZWZcIiBpbiBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcyB8fFxuICAgICAgICAgIGRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMgfHxcbiAgICAgICAgICAoaW5zdGFuY2UucHJvcHMgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzICYmXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIkV4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSBwcm9jZXNzaW5nIHRoZSB1cGRhdGUgcXVldWUuIFRoaXMgbWlnaHQgZWl0aGVyIGJlIGJlY2F1c2Ugb2YgYSBidWcgaW4gUmVhY3QsIG9yIGJlY2F1c2UgYSBjb21wb25lbnQgcmVhc3NpZ25zIGl0cyBvd24gYHRoaXMucHJvcHNgLiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIixcbiAgICAgICAgICAgICAgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8IFwiaW5zdGFuY2VcIlxuICAgICAgICAgICAgKSxcbiAgICAgICAgICBpbnN0YW5jZS5zdGF0ZSAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUgJiZcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIFwiRXhwZWN0ZWQgJXMgc3RhdGUgdG8gbWF0Y2ggbWVtb2l6ZWQgc3RhdGUgYmVmb3JlIHByb2Nlc3NpbmcgdGhlIHVwZGF0ZSBxdWV1ZS4gVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSBhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5zdGF0ZWAuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiLFxuICAgICAgICAgICAgICBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgXCJpbnN0YW5jZVwiXG4gICAgICAgICAgICApKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgIGNvbW1pdENhbGxiYWNrcyxcbiAgICAgICAgICAgIHVwZGF0ZVF1ZXVlLFxuICAgICAgICAgICAgaW5zdGFuY2VcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbGxHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZXMoaW5zdGFuY2UsIHByZXZQcm9wcywgcHJldlN0YXRlKSB7XG4gICAgICByZXR1cm4gaW5zdGFuY2UuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21taXRDbGFzc1NuYXBzaG90KGZpbmlzaGVkV29yaywgY3VycmVudCkge1xuICAgICAgdmFyIHByZXZQcm9wcyA9IGN1cnJlbnQubWVtb2l6ZWRQcm9wcyxcbiAgICAgICAgcHJldlN0YXRlID0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgICAgY3VycmVudCA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICBmaW5pc2hlZFdvcmsudHlwZS5kZWZhdWx0UHJvcHMgfHxcbiAgICAgICAgXCJyZWZcIiBpbiBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcyB8fFxuICAgICAgICBkaWRXYXJuQWJvdXRSZWFzc2lnbmluZ1Byb3BzIHx8XG4gICAgICAgIChjdXJyZW50LnByb3BzICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcyAmJlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBcIkV4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZS4gVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSBhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5wcm9wc2AuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiLFxuICAgICAgICAgICAgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaW5pc2hlZFdvcmspIHx8IFwiaW5zdGFuY2VcIlxuICAgICAgICAgICksXG4gICAgICAgIGN1cnJlbnQuc3RhdGUgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlICYmXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiRXhwZWN0ZWQgJXMgc3RhdGUgdG8gbWF0Y2ggbWVtb2l6ZWQgc3RhdGUgYmVmb3JlIGdldFNuYXBzaG90QmVmb3JlVXBkYXRlLiBUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlIGEgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIsXG4gICAgICAgICAgICBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgXCJpbnN0YW5jZVwiXG4gICAgICAgICAgKSk7XG4gICAgICB0cnkge1xuICAgICAgICB2Y
15852XIgcmVzb2x2ZWRQcmV2UHJvcHMgPSByZXNvbHZlQ2xhc3NDb21wb25lbnRQcm9wcyhcbiAgICAgICAgICBmaW5pc2hlZFdvcmsudHlwZSxcbiAgICAgICAgICBwcmV2UHJvcHNcbiAgICAgICAgKTtcbiAgICAgICAgdmFyIHNuYXBzaG90ID0gcnVuV2l0aEZpYmVySW5ERVYoXG4gICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgIGNhbGxHZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZXMsXG4gICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICByZXNvbHZlZFByZXZQcm9wcyxcbiAgICAgICAgICBwcmV2U3RhdGVcbiAgICAgICAgKTtcbiAgICAgICAgcHJldlByb3BzID0gZGlkV2FybkFib3V0VW5kZWZpbmVkU25hcHNob3RCZWZvcmVVcGRhdGU7XG4gICAgICAgIHZvaWQgMCAhPT0gc25hcHNob3QgfHxcbiAgICAgICAgICBwcmV2UHJvcHMuaGFzKGZpbmlzaGVkV29yay50eXBlKSB8fFxuICAgICAgICAgIChwcmV2UHJvcHMuYWRkKGZpbmlzaGVkV29yay50eXBlKSxcbiAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihmaW5pc2hlZFdvcmssIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIFwiJXMuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoKTogQSBzbmFwc2hvdCB2YWx1ZSAob3IgbnVsbCkgbXVzdCBiZSByZXR1cm5lZC4gWW91IGhhdmUgcmV0dXJuZWQgdW5kZWZpbmVkLlwiLFxuICAgICAgICAgICAgICBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSkpO1xuICAgICAgICBjdXJyZW50Ll9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlID0gc25hcHNob3Q7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gc2FmZWx5Q2FsbENvbXBvbmVudFdpbGxVbm1vdW50KFxuICAgICAgY3VycmVudCxcbiAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICBpbnN0YW5jZVxuICAgICkge1xuICAgICAgaW5zdGFuY2UucHJvcHMgPSByZXNvbHZlQ2xhc3NDb21wb25lbnRQcm9wcyhcbiAgICAgICAgY3VycmVudC50eXBlLFxuICAgICAgICBjdXJyZW50Lm1lbW9pemVkUHJvcHNcbiAgICAgICk7XG4gICAgICBpbnN0YW5jZS5zdGF0ZSA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIHNob3VsZFByb2ZpbGUoY3VycmVudClcbiAgICAgICAgPyAoc3RhcnRFZmZlY3RUaW1lcigpLFxuICAgICAgICAgIHJ1bldpdGhGaWJlckluREVWKFxuICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgIGNhbGxDb21wb25lbnRXaWxsVW5tb3VudEluREVWLFxuICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICAgICAgICBpbnN0YW5jZVxuICAgICAgICAgICksXG4gICAgICAgICAgcmVjb3JkRWZmZWN0RHVyYXRpb24oKSlcbiAgICAgICAgOiBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICBjYWxsQ29tcG9uZW50V2lsbFVubW91bnRJbkRFVixcbiAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLFxuICAgICAgICAgICAgaW5zdGFuY2VcbiAgICAgICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21taXRBdHRhY2hSZWYoZmluaXNoZWRXb3JrKSB7XG4gICAgICB2Y
15852XIgcmVmID0gZmluaXNoZWRXb3JrLnJlZjtcbiAgICAgIGlmIChudWxsICE9PSByZWYpIHtcbiAgICAgICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICAgICAgY2FzZSAyNjpcbiAgICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZVRvVXNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMzA6XG4gICAgICAgICAgICBpbnN0YW5jZVRvVXNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICAgIHZhciBuYW1lID0gZ2V0Vmlld1RyYW5zaXRpb25OYW1lKFxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcyxcbiAgICAgICAgICAgICAgaW5zdGFuY2VUb1VzZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChudWxsID09PSBpbnN0YW5jZVRvVXNlLnJlZiB8fCBpbnN0YW5jZVRvVXNlLnJlZi5uYW1lICE9PSBuYW1lKVxuICAgICAgICAgICAgICBpbnN0YW5jZVRvVXNlLnJlZiA9IGNyZWF0ZVZpZXdUcmFuc2l0aW9uSW5zdGFuY2UobmFtZSk7XG4gICAgICAgICAgICBpbnN0YW5jZVRvVXNlID0gaW5zdGFuY2VUb1VzZS5yZWY7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICBudWxsID09PSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlICYmXG4gICAgICAgICAgICAgICgoaW5zdGFuY2VUb1VzZSA9IG5ldyBGcmFnbWVudEluc3RhbmNlKGZpbmlzaGVkV29yaykpLFxuICAgICAgICAgICAgICB0cmF2ZXJzZUZyYWdtZW50SW5zdGFuY2VzQW5kVGV4dEluc3RhbmNlcyhcbiAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgICAgYWRkRnJhZ21lbnRIYW5kbGVUb0ZpYmVyLFxuICAgICAgICAgICAgICAgIGluc3RhbmNlVG9Vc2VcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKGZpbmlzaGVkV29yay5zdGF0ZU5vZGUgPSBpbnN0YW5jZVRvVXNlKSk7XG4gICAgICAgICAgICBpbnN0YW5jZVRvVXNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBpbnN0YW5jZVRvVXNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgcmVmKVxuICAgICAgICAgIGlmIChzaG91bGRQcm9maWxlKGZpbmlzaGVkV29yaykpXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBzdGFydEVmZmVjdFRpbWVyKCksXG4gICAgICAgICAgICAgICAgKGZpbmlzaGVkV29yay5yZWZDbGVhbnVwID0gcmVmKGluc3RhbmNlVG9Vc2UpKTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgIHJlY29yZEVmZmVjdER1cmF0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBmaW5pc2hlZFdvcmsucmVmQ2xlYW51cCA9IHJlZihpbnN0YW5jZVRvVXNlKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIFwic3RyaW5nXCIgPT09IHR5cGVvZiByZWZcbiAgICAgICAgICAgID8gY29uc29sZS5lcnJvcihcIlN0cmluZyByZWZzIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkLlwiKVxuICAgICAgICAgICAgOiByZWYuaGFzT3duUHJvcGVydHkoXCJjdXJyZW50XCIpIHx8XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgXCJVbmV4cGVjdGVkIHJlZiBvYmplY3QgcHJvdmlkZWQgZm9yICVzLiBVc2UgZWl0aGVyIGEgcmVmLXNldHRlciBmdW5jdGlvbiBvciBSZWFjdC5jcmVhdGVSZWYoKS5cIixcbiAgICAgICAgICAgICAgICBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaylcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIChyZWYuY3VycmVudCA9IGluc3RhbmNlVG9Vc2UpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBzYWZlbHlBdHRhY2hSZWYoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcnVuV2l0aEZpYmVySW5ERVYoY3VycmVudCwgY29tbWl0QXR0YWNoUmVmLCBjdXJyZW50KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gc2FmZWx5RGV0YWNoUmVmKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IpIHtcbiAgICAgIHZhciByZWYgPSBjdXJyZW50LnJlZixcbiAgICAgICAgcmVmQ2xlYW51cCA9IGN1cnJlbnQucmVmQ2xlYW51cDtcbiAgICAgIGlmIChudWxsICE9PSByZWYpXG4gICAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiByZWZDbGVhbnVwKVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoc2hvdWxkUHJvZmlsZShjdXJyZW50KSlcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBzdGFydEVmZmVjdFRpbWVyKCksIHJ1bldpdGhGaWJlckluREVWKGN1cnJlbnQsIHJlZkNsZWFudXApO1xuICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHJlY29yZEVmZmVjdER1cmF0aW9uKGN1cnJlbnQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHJ1bldpdGhGaWJlckluREVWKGN1cnJlbnQsIHJlZkNsZWFudXApO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcik7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIChjdXJyZW50LnJlZkNsZWFudXAgPSBudWxsKSxcbiAgICAgICAgICAgICAgKGN1cnJlbnQgPSBjdXJyZW50LmFsdGVybmF0ZSksXG4gICAgICAgICAgICAgIG51bGwgIT0gY3VycmVudCAmJiAoY3VycmVudC5yZWZDbGVhbnVwID0gbnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiByZWYpXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChzaG91bGRQcm9maWxlKGN1cnJlbnQpKVxuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgI
15852HN0YXJ0RWZmZWN0VGltZXIoKSwgcnVuV2l0aEZpYmVySW5ERVYoY3VycmVudCwgcmVmLCBudWxsKTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICByZWNvcmRFZmZlY3REdXJhdGlvbihjdXJyZW50KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBydW5XaXRoRmliZXJJbkRFVihjdXJyZW50LCByZWYsIG51bGwpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yJDgpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGN1cnJlbnQsIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsIGVycm9yJDgpO1xuICAgICAgICAgIH1cbiAgICAgICAgZWxzZSByZWYuY3VycmVudCA9IG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbW1pdFByb2ZpbGVyKFxuICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgY3VycmVudCxcbiAgICAgIGNvbW1pdFN0YXJ0VGltZSxcbiAgICAgIGVmZmVjdER1cmF0aW9uXG4gICAgKSB7XG4gICAgICB2YXIgX2ZpbmlzaGVkV29yayRtZW1vaXplID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMsXG4gICAgICAgIGlkID0gX2ZpbmlzaGVkV29yayRtZW1vaXplLmlkLFxuICAgICAgICBvbkNvbW1pdCA9IF9maW5pc2hlZFdvcmskbWVtb2l6ZS5vbkNvbW1pdDtcbiAgICAgIF9maW5pc2hlZFdvcmskbWVtb2l6ZSA9IF9maW5pc2hlZFdvcmskbWVtb2l6ZS5vblJlbmRlcjtcbiAgICAgIGN1cnJlbnQgPSBudWxsID09PSBjdXJyZW50ID8gXCJtb3VudFwiIDogXCJ1cGRhdGVcIjtcbiAgICAgIGN1cnJlbnRVcGRhdGVJc05lc3RlZCAmJiAoY3VycmVudCA9IFwibmVzdGVkLXVwZGF0ZVwiKTtcbiAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIF9maW5pc2hlZFdvcmskbWVtb2l6ZSAmJlxuICAgICAgICBfZmluaXNoZWRXb3JrJG1lbW9pemUoXG4gICAgICAgICAgaWQsXG4gICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICBmaW5pc2hlZFdvcmsuYWN0dWFsRHVyYXRpb24sXG4gICAgICAgICAgZmluaXNoZWRXb3JrLnRyZWVCYXNlRHVyYXRpb24sXG4gICAgICAgICAgZmluaXNoZWRXb3JrLmFjdHVhbFN0YXJ0VGltZSxcbiAgICAgICAgICBjb21taXRTdGFydFRpbWVcbiAgICAgICAgKTtcbiAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIG9uQ29tbWl0ICYmXG4gICAgICAgIG9uQ29tbWl0KGlkLCBjdXJyZW50LCBlZmZlY3REdXJhdGlvbiwgY29tbWl0U3RhcnRUaW1lKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tbWl0UHJvZmlsZXJQb3N0Q29tbWl0SW1wbChcbiAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgIGN1cnJlbnQsXG4gICAgICBjb21taXRTdGFydFRpbWUsXG4gICAgICBwYXNzaXZlRWZmZWN0RHVyYXRpb25cbiAgICApIHtcbiAgICAgIHZhciBfZmluaXNoZWRXb3JrJG1lbW9pemUyID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHM7XG4gICAgICBmaW5pc2hlZFdvcmsgPSBfZmluaXNoZWRXb3JrJG1lbW9pemUyLmlkO1xuICAgICAgX2ZpbmlzaGVkV29yayRtZW1vaXplMiA9IF9maW5pc2hlZFdvcmskbWVtb2l6ZTIub25Qb3N0Q29tbWl0O1xuICAgICAgY3VycmVudCA9IG51bGwgPT09IGN1cnJlbnQgPyBcIm1vdW50XCIgOiBcInVwZGF0ZVwiO1xuICAgICAgY3VycmVudFVwZGF0ZUlzTmVzdGVkICYmIChjdXJyZW50ID0gXCJuZXN0ZWQtdXBkYXRlXCIpO1xuICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgX2ZpbmlzaGVkV29yayRtZW1vaXplMiAmJlxuICAgICAgICBfZmluaXNoZWRXb3JrJG1lbW9pemUyKFxuICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgIHBhc3NpdmVFZmZlY3REdXJhdGlvbixcbiAgICAgICAgICBjb21taXRTdGFydFRpbWVcbiAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tbWl0TmV3Q2hpbGRUb0ZyYWdtZW50SW5zdGFuY2VzKGZpYmVyLCBwYXJlbnRGcmFnbWVudEluc3RhbmNlcykge1xuICAgICAgaWYgKFxuICAgICAgICAoNSA9PT0gZmliZXIudGFnIHx8IDI3ID09PSBmaWJlci50YWcgfHwgNiA9PT0gZmliZXIudGFnKSAmJlxuICAgICAgICBudWxsID09PSBmaWJlci5hbHRlcm5hdGUgJiZcbiAgICAgICAgbnVsbCAhPT0gcGFyZW50RnJhZ21lbnRJbnN0YW5jZXNcbiAgICAgIClcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJlbnRGcmFnbWVudEluc3RhbmNlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICBjb21taXROZXdDaGlsZFRvRnJhZ21lbnRJbnN0YW5jZShcbiAgICAgICAgICAgIGZpYmVyLnN0YXRlTm9kZSxcbiAgICAgICAgICAgIHBhcmVudEZyYWdtZW50SW5zdGFuY2VzW2ldXG4gICAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tbWl0RnJhZ21lbnRJbnN0YW5jZUluc2VydGlvbkVmZmVjdHMoZmliZXIpIHtcbiAgICAgIGZvciAodmFyIHBhcmVudCA9IGZpYmVyLnJldHVybjsgbnVsbCAhPT0gcGFyZW50OyApIHtcbiAgICAgICAgaXNGcmFnbWVudEluc3RhbmNlUGFyZW50KHBhcmVudCkgJiZcbiAgICAgICAgICBjb21taXROZXdDaGlsZFRvRnJhZ21lbnRJbnN0YW5jZShmaWJlci5zdGF0ZU5vZGUsIHBhcmVudC5zdGF0ZU5vZGUpO1xuICAgICAgICBpZiAoaXNGcmFnbWVudEluc3RhbmNlSG9zdEJvdW5kYXJ5KHBhcmVudCkpIGJyZWFrO1xuICAgICAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBjb21taXRGcmFnbWVudEluc3RhbmNlRGVsZXRpb25FZmZlY3RzKGZpYmVyKSB7XG4gICAgICBmb3IgKHZhciBwYXJlbnQgPSBmaWJlci5yZXR1cm47IG51bGwgIT09IHBhcmVudDsgKSB7XG4gICAgICAgIGlzRnJhZ21lbnRJbnN0YW5jZVBhcmVudChwYXJlbnQpICYmXG4gICAgICAgICAgZGVsZXRlQ2hpbGRGcm9tRnJhZ21lbnRJbnN0YW5jZShmaWJlci5zdGF0ZU5vZGUsIHBhcmVudC5zdGF0ZU5vZGUpO1xuICAgICAgICBpZiAoaXNGcmFnbWVudEluc3RhbmNlSG9zdEJvdW5kYXJ5KHBhcmVudCkpIGJyZWFrO1xuICAgICAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBpc0ZyYWdtZW50SW5zdGFuY2VIb3N0Qm91bmRhcnkoZmliZXIpIHtcbiAgICAgIHJldHVybiA1ID09PSBmaWJlci50YWcgfHwgMyA9PT0gZmliZXIudGFnIHx8IDI3ID09PSBmaWJlci50YWc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzRnJhZ21lbn
15852RJbnN0YW5jZVBhcmVudChmaWJlcikge1xuICAgICAgcmV0dXJuIGZpYmVyICYmIDcgPT09IGZpYmVyLnRhZyAmJiBudWxsICE9PSBmaWJlci5zdGF0ZU5vZGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbW1pdEhvc3RNb3VudChmaW5pc2hlZFdvcmspIHtcbiAgICAgIHZhciB0eXBlID0gZmluaXNoZWRXb3JrLnR5cGUsXG4gICAgICAgIHByb3BzID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMsXG4gICAgICAgIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJ1bldpdGhGaWJlckluREVWKFxuICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICBjb21taXRNb3VudCxcbiAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIHByb3BzLFxuICAgICAgICAgIGZpbmlzaGVkV29ya1xuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbW1pdEhvc3RVcGRhdGUoZmluaXNoZWRXb3JrLCBuZXdQcm9wcywgb2xkUHJvcHMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJ1bldpdGhGaWJlckluREVWKFxuICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICBjb21taXRVcGRhdGUsXG4gICAgICAgICAgZmluaXNoZWRXb3JrLnN0YXRlTm9kZSxcbiAgICAgICAgICBmaW5pc2hlZFdvcmsudHlwZSxcbiAgICAgICAgICBvbGRQcm9wcyxcbiAgICAgICAgICBuZXdQcm9wcyxcbiAgICAgICAgICBmaW5pc2hlZFdvcmtcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBpc0hvc3RQYXJlbnQoZmliZXIpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDUgPT09IGZpYmVyLnRhZyB8fFxuICAgICAgICAzID09PSBmaWJlci50YWcgfHxcbiAgICAgICAgMjYgPT09IGZpYmVyLnRhZyB8fFxuICAgICAgICAoMjcgPT09IGZpYmVyLnRhZyAmJiBpc1NpbmdsZXRvblNjb3BlKGZpYmVyLnR5cGUpKSB8fFxuICAgICAgICA0ID09PSBmaWJlci50YWdcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldEhvc3RTaWJsaW5nKGZpYmVyKSB7XG4gICAgICBhOiBmb3IgKDs7KSB7XG4gICAgICAgIGZvciAoOyBudWxsID09PSBmaWJlci5zaWJsaW5nOyApIHtcbiAgICAgICAgICBpZiAobnVsbCA9PT0gZmliZXIucmV0dXJuIHx8IGlzSG9zdFBhcmVudChmaWJlci5yZXR1cm4pKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICBmaWJlciA9IGZpYmVyLnJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmaWJlci5zaWJsaW5nLnJldHVybiA9IGZpYmVyLnJldHVybjtcbiAgICAgICAgZm9yIChcbiAgICAgICAgICBmaWJlciA9IGZpYmVyLnNpYmxpbmc7XG4gICAgICAgICAgNSAhPT0gZmliZXIudGFnICYmIDYgIT09IGZpYmVyLnRhZyAmJiAxOCAhPT0gZmliZXIudGFnO1xuXG4gICAgICAgICkge1xuICAgICAgICAgIGlmICgyNyA9PT0gZmliZXIudGFnICYmIGlzU2luZ2xldG9uU2NvcGUoZmliZXIudHlwZSkpIGNvbnRpbnVlIGE7XG4gICAgICAgICAgaWYgKGZpYmVyLmZsYWdzICYgMikgY29udGludWUgYTtcbiAgICAgICAgICBpZiAobnVsbCA9PT0gZmliZXIuY2hpbGQgfHwgNCA9PT0gZmliZXIudGFnKSBjb250aW51ZSBhO1xuICAgICAgICAgIGVsc2UgKGZpYmVyLmNoaWxkLnJldHVybiA9IGZpYmVyKSwgKGZpYmVyID0gZmliZXIuY2hpbGQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKGZpYmVyLmZsYWdzICYgMikpIHJldHVybiBmaWJlci5zdGF0ZU5vZGU7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZUludG9Db250YWluZXIoXG4gICAgICBub2RlLFxuICAgICAgYmVmb3JlLFxuICAgICAgcGFyZW50LFxuICAgICAgcGFyZW50RnJhZ21lbnRJbnN0YW5jZXNcbiAgICApIHtcbiAgICAgIHZhciB0YWcgPSBub2RlLnRhZztcbiAgICAgIGlmICg1ID09PSB0YWcgfHwgNiA9PT0gdGFnKVxuICAgICAgICAodGFnID0gbm9kZS5zdGF0ZU5vZGUpLFxuICAgICAgICAgIGJlZm9yZVxuICAgICAgICAgICAgPyAod2FybkZvclJlYWN0Q2hpbGRyZW5Db25mbGljdChwYXJlbnQpLFxuICAgICAgICAgICAgICAoOSA9PT0gcGFyZW50Lm5vZGVUeXBlXG4gICAgICAgICAgICAgICAgPyBwYXJlbnQuYm9keVxuICAgICAgICAgICAgICAgIDogXCJIVE1MXCIgPT09IHBhcmVudC5ub2RlTmFtZVxuICAgICAgICAgICAgICAgICAgPyBwYXJlbnQub3duZXJEb2N1bWVudC5ib2R5XG4gICAgICAgICAgICAgICAgICA6IHBhcmVudFxuICAgICAgICAgICAgICApLmluc2VydEJlZm9yZSh0YWcsIGJlZm9yZSkpXG4gICAgICAgICAgICA6ICh3YXJuRm9yUmVhY3RDaGlsZHJlbkNvbmZsaWN0KHBhcmVudCksXG4gICAgICAgICAgICAgIChiZWZvcmUgPVxuICAgICAgICAgICAgICAgIDkgPT09IHBhcmVudC5ub2RlVHlwZVxuICAgICAgICAgICAgICAgICAgPyBwYXJlbnQuYm9keVxuICAgICAgICAgICAgICAgICAgOiBcIkhUTUxcIiA9PT0gcGFyZW50Lm5vZGVOYW1lXG4gICAgICAgICAgICAgICAgICAgID8gcGFyZW50Lm93bmVyRG9jdW1lbnQuYm9keVxuICAgICAgICAgICAgICAgICAgICA6IHBhcmVudCksXG4gICAgICAgICAgICAgIGJlZm9yZS5hcHBlbmRDaGlsZCh0YWcpLFxuICAgICAgICAgICAgICAodGFnID0gcGFyZW50Ll9yZWFjdFJvb3RDb250YWluZXIpLFxuICAgICAgICAgICAgICAobnVsbCAhPT0gdGFnICYmIHZvaWQgMCAhPT0gdGFnKSB8fFxuICAgICAgICAgICAgICAgIG51bGwgIT09IGJlZm9yZS5vbmNsaWNrIHx8XG4gICAgICAgICAgICAgICAgKGJlZm9yZS5vbmNsaWNrID0gbm9vcCQxKSksXG4gICAgICAgICAgY29tbWl0TmV3Q2hpbGRUb0ZyYWdtZW50SW5zdGFuY2VzKG5vZGUsIHBhcmVudEZyYWdtZW50SW5zdGFuY2VzKSxcbiAgICAgICAgICAodmlld1RyYW5zaXRpb25NdXRhdGlvbkNvbnRleHQgPSAhMCk7XG4gICAgICBlbHNlIGlmIChcbiAgICAgICAgNCAhPT0gdGFnICYmXG4gICAgICAgICgyNyA9PT0gdGFnICYmXG4gICAgICAgICAgKGNvbW1pdE5ld0NoaWxkVG9GcmFnbWVudEluc3RhbmNlcyhub2RlLCBwYXJlbnRGcmFnbWVudEluc3RhbmNlcyksXG4gICAgICAgICAgKHBhcmVudEZyYWdtZW50SW5zdGFuY2VzID0gbnVsbCksXG4gICAgICAgICAgaXNTaW5nbGV0b25TY29wZShub2RlLnR5cGUpICYmXG4gICAgICAgICAgICAoKHBhcmVudCA9IG5vZGUuc3RhdGVOb2RlKSwgKGJlZm9yZSA9IG51bGwpKSksXG4gICAgICAgIChub2RlID0gbm9kZS5jaGlsZCksXG4gICAgICAgIG51bGwgIT09IG5vZGUpXG4gICAgICApXG4gICAgICAgIGZvciAoXG4gICAgICAgICAgaW5zZXJ0T3JBcHBlbmRQbGFjZW1lbnROb2RlSW50b0NvbnRhaW5lcihcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBiZWZvcmUsXG4gICAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgICBwYXJlbnRGcmFnbWVudEluc3RhbmNlc1xuICAgICAgICAgICksXG4gICAgICAgICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgICAgICAgIG51bGwgIT09IG5vZGU7XG5cbiAgICAgICAgKVxuICAgICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZUludG9Db250YWluZXIoXG4gICAgICAgICAgICBub2Rl
15852LFxuICAgICAgICAgICAgYmVmb3JlLFxuICAgICAgICAgICAgcGFyZW50LFxuICAgICAgICAgICAgcGFyZW50RnJhZ21lbnRJbnN0YW5jZXNcbiAgICAgICAgICApLFxuICAgICAgICAgICAgKG5vZGUgPSBub2RlLnNpYmxpbmcpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGUoXG4gICAgICBub2RlLFxuICAgICAgYmVmb3JlLFxuICAgICAgcGFyZW50LFxuICAgICAgcGFyZW50RnJhZ21lbnRJbnN0YW5jZXNcbiAgICApIHtcbiAgICAgIHZhciB0YWcgPSBub2RlLnRhZztcbiAgICAgIGlmICg1ID09PSB0YWcgfHwgNiA9PT0gdGFnKVxuICAgICAgICAodGFnID0gbm9kZS5zdGF0ZU5vZGUpLFxuICAgICAgICAgIGJlZm9yZSA/IHBhcmVudC5pbnNlcnRCZWZvcmUodGFnLCBiZWZvcmUpIDogcGFyZW50LmFwcGVuZENoaWxkKHRhZyksXG4gICAgICAgICAgY29tbWl0TmV3Q2hpbGRUb0ZyYWdtZW50SW5zdGFuY2VzKG5vZGUsIHBhcmVudEZyYWdtZW50SW5zdGFuY2VzKSxcbiAgICAgICAgICAodmlld1RyYW5zaXRpb25NdXRhdGlvbkNvbnRleHQgPSAhMCk7XG4gICAgICBlbHNlIGlmIChcbiAgICAgICAgNCAhPT0gdGFnICYmXG4gICAgICAgICgyNyA9PT0gdGFnICYmXG4gICAgICAgICAgKGNvbW1pdE5ld0NoaWxkVG9GcmFnbWVudEluc3RhbmNlcyhub2RlLCBwYXJlbnRGcmFnbWVudEluc3RhbmNlcyksXG4gICAgICAgICAgKHBhcmVudEZyYWdtZW50SW5zdGFuY2VzID0gbnVsbCksXG4gICAgICAgICAgaXNTaW5nbGV0b25TY29wZShub2RlLnR5cGUpICYmIChwYXJlbnQgPSBub2RlLnN0YXRlTm9kZSkpLFxuICAgICAgICAobm9kZSA9IG5vZGUuY2hpbGQpLFxuICAgICAgICBudWxsICE9PSBub2RlKVxuICAgICAgKVxuICAgICAgICBmb3IgKFxuICAgICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBiZWZvcmUsXG4gICAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgICBwYXJlbnRGcmFnbWVudEluc3RhbmNlc1xuICAgICAgICAgICksXG4gICAgICAgICAgICBub2RlID0gbm9kZS5zaWJsaW5nO1xuICAgICAgICAgIG51bGwgIT09IG5vZGU7XG5cbiAgICAgICAgKVxuICAgICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShcbiAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICBiZWZvcmUsXG4gICAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgICBwYXJlbnRGcmFnbWVudEluc3RhbmNlc1xuICAgICAgICAgICksXG4gICAgICAgICAgICAobm9kZSA9IG5vZGUuc2libGluZyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbW1pdFBsYWNlbWVudChmaW5pc2hlZFdvcmspIHtcbiAgICAgIGZvciAoXG4gICAgICAgIHZhciBob3N0UGFyZW50RmliZXIsIHBhcmVudEZpYmVyID0gZmluaXNoZWRXb3JrLnJldHVybjtcbiAgICAgICAgbnVsbCAhPT0gcGFyZW50RmliZXI7XG5cbiAgICAgICkge1xuICAgICAgICBpZiAoaXNIb3N0UGFyZW50KHBhcmVudEZpYmVyKSkge1xuICAgICAgICAgIGhvc3RQYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIucmV0dXJuO1xuICAgICAgfVxuICAgICAgcGFyZW50RmliZXIgPSBudWxsO1xuICAgICAgZm9yICh2YXIgcGFyZW50ID0gZmluaXNoZWRXb3JrLnJldHVybjsgbnVsbCAhPT0gcGFyZW50OyApIHtcbiAgICAgICAgaWYgKGlzRnJhZ21lbnRJbnN0YW5jZVBhcmVudChwYXJlbnQpKSB7XG4gICAgICAgICAgdmFyIGZyYWdtZW50SW5zdGFuY2UgPSBwYXJlbnQuc3RhdGVOb2RlO1xuICAgICAgICAgIG51bGwgPT09IHBhcmVudEZpYmVyXG4gICAgICAgICAgICA/IChwYXJlbnRGaWJlciA9IFtmcmFnbWVudEluc3RhbmNlXSlcbiAgICAgICAgICAgIDogcGFyZW50RmliZXIucHVzaChmcmFnbWVudEluc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNGcmFnbWVudEluc3RhbmNlSG9zdEJvdW5kYXJ5KHBhcmVudCkpIGJyZWFrO1xuICAgICAgICBwYXJlbnQgPSBwYXJlbnQucmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKG51bGwgPT0gaG9zdFBhcmVudEZpYmVyKVxuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBcIkV4cGVjdGVkIHRvIGZpbmQgYSBob3N0IHBhcmVudC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIlxuICAgICAgICApO1xuICAgICAgc3dpdGNoIChob3N0UGFyZW50RmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgMjc6XG4gICAgICAgICAgaG9zdFBhcmVudEZpYmVyID0gaG9zdFBhcmVudEZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICBwYXJlbnQgPSBnZXRIb3N0U2libGluZyhmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZShcbiAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgIHBhcmVudCxcbiAgICAgICAgICAgIGhvc3RQYXJlbnRGaWJlcixcbiAgICAgICAgICAgIHBhcmVudEZpYmVyXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIHBhcmVudCA9IGhvc3RQYXJlbnRGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgaG9zdFBhcmVudEZpYmVyLmZsYWdzICYgMzIgJiZcbiAgICAgICAgICAgIChyZXNldFRleHRDb250ZW50KHBhcmVudCksIChob3N0UGFyZW50RmliZXIuZmxhZ3MgJj0gLTMzKSk7XG4gICAgICAgICAgaG9zdFBhcmVudEZpYmVyID0gZ2V0SG9zdFNpYmxpbmcoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBpbnNlcnRPckFwcGVuZFBsYWNlbWVudE5vZGUoXG4gICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICBob3N0UGFyZW50RmliZXIsXG4gICAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgICBwYXJlbnRGaWJlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIGhvc3RQYXJlbnRGaWJlciA9IGhvc3RQYXJlbnRGaWJlci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztcbiAgICAgICAgICBwYXJlbnQgPSBnZXRIb3N0U2libGluZyhmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIGluc2VydE9yQXBwZW5kUGxhY2VtZW50Tm9kZUludG9Db250YWluZXIoXG4gICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICBwYXJlbnQsXG4gICAgICAgICAgICBob3N0UGFyZW50RmliZXIsXG4gICAgICAgICAgICBwYXJlbnRGaWJlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICBcIkludmFsaWQgaG9zdCBwYXJlbnQgZmliZXIuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCJcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBjb21taXRIb3N0U2luZ2xldG9uQWNxdWlzaXRpb24oZmluaXNoZWRXb3JrKSB7XG4gICAgICB2Y
15852XIgc2luZ2xldG9uID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZSxcbiAgICAgICAgcHJvcHMgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcztcbiAgICAgIHRyeSB7XG4gICAgICAgIHJ1bldpdGhGaWJlckluREVWKFxuICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICBhY3F1aXJlU2luZ2xldG9uSW5zdGFuY2UsXG4gICAgICAgICAgZmluaXNoZWRXb3JrLnR5cGUsXG4gICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgc2luZ2xldG9uLFxuICAgICAgICAgIGZpbmlzaGVkV29ya1xuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNrRW50ZXJWaWV3VHJhbnNpdGlvbnMocGxhY2VtZW50KSB7XG4gICAgICBpZiAoMzAgPT09IHBsYWNlbWVudC50YWcgfHwgMCAhPT0gKHBsYWNlbWVudC5zdWJ0cmVlRmxhZ3MgJiAzMzU1NDQzMikpXG4gICAgICAgIHNob3VsZFN0YXJ0Vmlld1RyYW5zaXRpb24gPSAhMDtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHVzaFZpZXdUcmFuc2l0aW9uQ2FuY2VsYWJsZVNjb3BlKCkge1xuICAgICAgdmFyIHByZXZDaGlsZHJlbiA9IHZpZXdUcmFuc2l0aW9uQ2FuY2VsYWJsZUNoaWxkcmVuO1xuICAgICAgdmlld1RyYW5zaXRpb25DYW5jZWxhYmxlQ2hpbGRyZW4gPSBudWxsO1xuICAgICAgcmV0dXJuIHByZXZDaGlsZHJlbjtcbiAgICB9XG4gICAgZnVuY3Rpb24gYXBwbHlWaWV3VHJhbnNpdGlvblRvSG9zdEluc3RhbmNlcyhcbiAgICAgIGZpYmVyLFxuICAgICAgbmFtZSxcbiAgICAgIGNsYXNzTmFtZSxcbiAgICAgIGNvbGxlY3RNZWFzdXJlbWVudHMsXG4gICAgICBzdG9wQXROZXN0ZWRWaWV3VHJhbnNpdGlvbnNcbiAgICApIHtcbiAgICAgIHZpZXdUcmFuc2l0aW9uSG9zdEluc3RhbmNlSWR4ID0gMDtcbiAgICAgIChuYW1lID0gYXBwbHlWaWV3VHJhbnNpdGlvblRvSG9zdEluc3RhbmNlc1JlY3Vyc2l2ZShcbiAgICAgICAgZmliZXIuY2hpbGQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgY29sbGVjdE1lYXN1cmVtZW50cyxcbiAgICAgICAgc3RvcEF0TmVzdGVkVmlld1RyYW5zaXRpb25zXG4gICAgICApKSAmJlxuICAgICAgICBudWxsICE9IGZpYmVyLl9kZWJ1Z1Rhc2sgJiZcbiAgICAgICAgbnVsbCA9PT0gYW5pbWF0aW5nVGFzayAmJlxuICAgICAgICAoYW5pbWF0aW5nVGFzayA9IGZpYmVyLl9kZWJ1Z1Rhc2spO1xuICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFwcGx5Vmlld1RyYW5zaXRpb25Ub0hvc3RJbnN0YW5jZXNSZWN1cnNpdmUoXG4gICAgICBjaGlsZCxcbiAgICAgIG5hbWUsXG4gICAgICBjbGFzc05hbWUsXG4gICAgICBjb2xsZWN0TWVhc3VyZW1lbnRzLFxuICAgICAgc3RvcEF0TmVzdGVkVmlld1RyYW5zaXRpb25zXG4gICAgKSB7XG4gICAgICBmb3IgKHZhciBpblZpZXdwb3J0ID0gITE7IG51bGwgIT09IGNoaWxkOyApIHtcbiAgICAgICAgaWYgKDUgPT09IGNoaWxkLnRhZykge1xuICAgICAgICAgIHZhciBfaW5zdGFuY2UgPSBjaGlsZC5zdGF0ZU5vZGU7XG4gICAgICAgICAgaWYgKG51bGwgIT09IGNvbGxlY3RNZWFzdXJlbWVudHMpIHtcbiAgICAgICAgICAgIHZhciBtZWFzdXJlbWVudCA9IG1lYXN1cmVJbnN0YW5jZShfaW5zdGFuY2UpO1xuICAgICAgICAgICAgY29sbGVjdE1lYXN1cmVtZW50cy5wdXNoKG1lYXN1cmVtZW50KTtcbiAgICAgICAgICAgIG1lYXN1cmVtZW50LnZpZXcgJiYgKGluVmlld3BvcnQgPSAhMCk7XG4gICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICBpblZpZXdwb3J0IHx8XG4gICAgICAgICAgICAgIChtZWFzdXJlSW5zdGFuY2UoX2luc3RhbmNlKS52aWV3ICYmIChpblZpZXdwb3J0ID0gITApKTtcbiAgICAgICAgICBzaG91bGRTdGFydFZpZXdUcmFuc2l0aW9uID0gITA7XG4gICAgICAgICAgYXBwbHlWaWV3VHJhbnNpdGlvbk5hbWUoXG4gICAgICAgICAgICBfaW5zdGFuY2UsXG4gICAgICAgICAgICAwID09PSB2aWV3VHJhbnNpdGlvbkhvc3RJbnN0YW5jZUlkeFxuICAgICAgICAgICAgICA/IG5hbWVcbiAgICAgICAgICAgICAgOiBuYW1lICsgXCJfXCIgKyB2aWV3VHJhbnNpdGlvbkhvc3RJbnN0YW5jZUlkeCxcbiAgICAgICAgICAgIGNsYXNzTmFtZVxuICAgICAgICAgICk7XG4gICAgICAgICAgdmlld1RyYW5zaXRpb25Ib3N0SW5zdGFuY2VJZHgrKztcbiAgICAgICAgfSBlbHNlIGlmICgyMiAhPT0gY2hpbGQudGFnIHx8IG51bGwgPT09IGNoaWxkLm1lbW9pemVkU3RhdGUpXG4gICAgICAgICAgKDMwID09PSBjaGlsZC50YWcgJiYgc3RvcEF0TmVzdGVkVmlld1RyYW5zaXRpb25zKSB8fFxuICAgICAgICAgICAgKGFwcGx5Vmlld1RyYW5zaXRpb25Ub0hvc3RJbnN0YW5jZXNSZWN1cnNpdmUoXG4gICAgICAgICAgICAgIGNoaWxkLmNoaWxkLFxuICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgICAgIGNvbGxlY3RNZWFzdXJlbWVudHMsXG4gICAgICAgICAgICAgIHN0b3BBdE5lc3RlZFZpZXdUcmFuc2l0aW9uc1xuICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgICAoaW5WaWV3cG9ydCA9ICEwKSk7XG4gICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICAgIH1cbiAgICAgIHJldHVybiBpblZpZXdwb3J0O1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXN0b3JlVmlld1RyYW5zaXRpb25Pbkhvc3RJbnN0YW5jZXMoXG4gICAgICBjaGlsZCxcbiAgICAgIHN0b3BBdE5lc3RlZFZpZXdUcmFuc2l0aW9uc1xuICAgICkge1xuICAgICAgZm9yICg7IG51bGwgIT09IGNoaWxkOyApIHtcbiAgICAgICAgaWYgKDUgPT09IGNoaWxkLnRhZylcbiAgICAgICAgICByZXN0b3JlVmlld1RyYW5zaXRpb25OYW1lKGNoaWxkLnN0YXRlTm9kZSwgY2hpbGQubWVtb2l6ZWRQcm9wcyk7XG4gICAgICAgIGVsc2UgaWYgKDIyICE9PSBjaGlsZC50YWcgfHwgbnVsbCA9PT0gY2hpbGQubWVtb2l6ZWRTdGF0ZSlcbiAgICAgICAgICAoMzAgPT09IGNoaWxkLnRhZyAmJiBzdG9wQXROZXN0ZWRWaWV3VHJhbnNpdGlvbnMpIHx8XG4gICAgICAgICAgICByZXN0b3JlVmlld1RyYW5zaXRpb25Pbkhvc3RJbnN0YW5jZXMoXG4gICAgICAgICAgICAgIGNoaWxkLmNoaWxkLFxuICAgICAgICAgICAgICBzdG9wQXROZXN0ZWRWaWV3VHJhbnNpdGlvbnNcbiAgICAgICAgICAgICk7XG4gICAgICAgIGNoaWxkID0gY2hpbGQuc2libGluZztcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gY29tbWl0QXBwZWFyaW5nUGFpclZpZXdUcmFuc2l0aW9ucyhwbGFjZW1lbnQpIHtcbiAgICAgIGlmICgwICE9PSAocGxhY2VtZW50LnN1YnRyZWVGbGFncyAmIDE4ODc0MzY4KSlcbiAgICAgICAgZm9yIChwbGFjZW1lbnQgPSBwbGFjZW1lbnQuY2hpbGQ7IG51bGwgIT09IHBsYWNlbWVudDsgKSB7XG4gICAgICAgICAgaWYgKDIyICE9PSBwbGFjZW1lbnQudGFnIHx8IG51bGwgPT09IHBsYWNlbWVudC5tZW1vaXplZFN0YXRlKVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAoY29tbWl0QXBwZWFyaW5nUGFpclZpZXdUcmFuc2l0aW9ucyhwbGFjZW1lbnQpLFxuICAgICAgICAgICAgICAzMCA9PT0gcGxhY2VtZW50LnRhZyAmJlxuICAgICAgICAgICAgICAgIDAgIT09IChwbGFjZW1lbnQuZmxhZ3MgJiAxODg3NDM2OCkgJiZcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnQuc3RhdGVOb2RlLnBhaXJlZClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB2Y
15852XIgcHJvcHMgPSBwbGFjZW1lbnQubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICAgICAgaWYgKG51bGwgPT0gcHJvcHMubmFtZSB8fCBcImF1dG9cIiA9PT0gcHJvcHMubmFtZSlcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgICAgICAgIFwiRm91bmQgYSBwYWlyIHdpdGggYW4gYXV0byBuYW1lLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LlwiXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgdmFyIG5hbWUgPSBwcm9wcy5uYW1lO1xuICAgICAgICAgICAgICBwcm9wcyA9IGdldFZpZXdUcmFuc2l0aW9uQ2xhc3NOYW1lKHByb3BzLmRlZmF1bHQsIHByb3BzLnNoYXJlKTtcbiAgICAgICAgICAgICAgXCJub25lXCIgIT09IHByb3BzICYmXG4gICAgICAgICAgICAgICAgKGFwcGx5Vmlld1RyYW5zaXRpb25Ub0hvc3RJbnN0YW5jZXMoXG4gICAgICAgICAgICAgICAgICBwbGFjZW1lbnQsXG4gICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgITFcbiAgICAgICAgICAgICAgICApIHx8XG4gICAgICAgICAgICAgICAgICByZXN0b3JlVmlld1RyYW5zaXRpb25Pbkhvc3RJbnN0YW5jZXMocGxhY2VtZW50LmNoaWxkLCAhMSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIHBsYWNlbWVudCA9IHBsYWNlbWVudC5zaWJsaW5nO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbW1pdEVudGVyVmlld1RyYW5zaXRpb25zKHBsYWNlbWVudCwgZ2VzdHVyZSkge1xuICAgICAgaWYgKDMwID09PSBwbGFjZW1lbnQudGFnKSB7XG4gICAgICAgIHZhciBzdGF0ZSA9IHBsYWNlbWVudC5zdGF0ZU5vZGUsXG4gICAgICAgICAgcHJvcHMgPSBwbGFjZW1lbnQubWVtb2l6ZWRQcm9wcyxcbiAgICAgICAgICBuYW1lID0gZ2V0Vmlld1RyYW5zaXRpb25OYW1lKHByb3BzLCBzdGF0ZSksXG4gICAgICAgICAgY2xhc3NOYW1lID0gZ2V0Vmlld1RyYW5zaXRpb25DbGFzc05hbWUoXG4gICAgICAgICAgICBwcm9wcy5kZWZhdWx0LFxuICAgICAgICAgICAgc3RhdGUucGFpcmVkID8gcHJvcHMuc2hhcmUgOiBwcm9wcy5lbnRlclxuICAgICAgICAgICk7XG4gICAgICAgIFwibm9uZVwiICE9PSBjbGFzc05hbWVcbiAgICAgICAgICA/IGFwcGx5Vmlld1RyYW5zaXRpb25Ub0hvc3RJbnN0YW5jZXMoXG4gICAgICAgICAgICAgIHBsYWNlbWVudCxcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAhMVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgPyAoY29tbWl0QXBwZWFyaW5nUGFpclZpZXdUcmFuc2l0aW9ucyhwbGFjZW1lbnQpLFxuICAgICAgICAgICAgICBzdGF0ZS5wYWlyZWQgfHxcbiAgICAgICAgICAgICAgICBnZXN0dXJlIHx8XG4gICAgICAgICAgICAgICAgc2NoZWR1bGVWaWV3VHJhbnNpdGlvbkV2ZW50KHBsYWNlbWVudCwgcHJvcHMub25FbnRlcikpXG4gICAgICAgICAgICA6IHJlc3RvcmVWaWV3VHJhbnNpdGlvbk9uSG9zdEluc3RhbmNlcyhwbGFjZW1lbnQuY2hpbGQsICExKVxuICAgICAgICAgIDogY29tbWl0QXBwZWFyaW5nUGFpclZpZXdUcmFuc2l0aW9ucyhwbGFjZW1lbnQpO1xuICAgICAgfSBlbHNlIGlmICgwICE9PSAocGxhY2VtZW50LnN1YnRyZWVGbGFncyAmIDMzNTU0NDMyKSlcbiAgICAgICAgZm9yIChwbGFjZW1lbnQgPSBwbGFjZW1lbnQuY2hpbGQ7IG51bGwgIT09IHBsYWNlbWVudDsgKVxuICAgICAgICAgIGNvbW1pdEVudGVyVmlld1RyYW5zaXRpb25zKHBsYWNlbWVudCwgZ2VzdHVyZSksXG4gICAgICAgICAgICAocGxhY2VtZW50ID0gcGxhY2VtZW50LnNpYmxpbmcpO1xuICAgICAgZWxzZSBjb21taXRBcHBlYXJpbmdQYWlyVmlld1RyYW5zaXRpb25zKHBsYWNlbWVudCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbW1pdERlbGV0ZWRQYWlyVmlld1RyYW5zaXRpb25zKGRlbGV0aW9uKSB7XG4gICAgICBpZiAoXG4gICAgICAgIG51bGwgIT09IGFwcGVhcmluZ1ZpZXdUcmFuc2l0aW9ucyAmJlxuICAgICAgICAwICE9PSBhcHBlYXJpbmdWaWV3VHJhbnNpdGlvbnMuc2l6ZVxuICAgICAgKSB7XG4gICAgICAgIHZhciBwYWlycyA9IGFwcGVhcmluZ1ZpZXdUcmFuc2l0aW9ucztcbiAgICAgICAgaWYgKDAgIT09IChkZWxldGlvbi5zdWJ0cmVlRmxhZ3MgJiAxODg3NDM2OCkpXG4gICAgICAgICAgZm9yIChkZWxldGlvbiA9IGRlbGV0aW9uLmNoaWxkOyBudWxsICE9PSBkZWxldGlvbjsgKSB7XG4gICAgICAgICAgICBpZiAoMjIgIT09IGRlbGV0aW9uLnRhZyB8fCBudWxsID09PSBkZWxldGlvbi5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgICAgICAgIGlmICgzMCA9PT0gZGVsZXRpb24udGFnICYmIDAgIT09IChkZWxldGlvbi5mbGFncyAmIDE4ODc0MzY4KSkge1xuICAgICAgICAgICAgICAgIHZhciBwcm9wcyA9IGRlbGV0aW9uLm1lbW9pemVkUHJvcHMsXG4gICAgICAgICAgICAgICAgICBuYW1lID0gcHJvcHMubmFtZTtcbiAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBuYW1lICYmIFwiYXV0b1wiICE9PSBuYW1lKSB7XG4gICAgICAgICAgICAgICAgICB2Y
15852XIgcGFpciA9IHBhaXJzLmdldChuYW1lKTtcbiAgICAgICAgICAgICAgICAgIGlmICh2b2lkIDAgIT09IHBhaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNsYXNzTmFtZSA9IGdldFZpZXdUcmFuc2l0aW9uQ2xhc3NOYW1lKFxuICAgICAgICAgICAgICAgICAgICAgIHByb3BzLmRlZmF1bHQsXG4gICAgICAgICAgICAgICAgICAgICAgcHJvcHMuc2hhcmVcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgXCJub25lXCIgIT09IGNsYXNzTmFtZSAmJlxuICAgICAgICAgICAgICAgICAgICAgIChhcHBseVZpZXdUcmFuc2l0aW9uVG9Ib3N0SW5zdGFuY2VzKFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICExXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAoKGNsYXNzTmFtZSA9IGRlbGV0aW9uLnN0YXRlTm9kZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChwYWlyLnBhaXJlZCA9IGNsYXNzTmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGFzc05hbWUucGFpcmVkID0gcGFpciksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlVmlld1RyYW5zaXRpb25FdmVudChkZWxldGlvbiwgcHJvcHMub25TaGFyZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHJlc3RvcmVWaWV3VHJhbnNpdGlvbk9uSG9zdEluc3RhbmNlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGlvbi5jaGlsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhMVxuICAgICAgICAgICAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgICAgICAgICAgcGFpcnMuZGVsZXRlKG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PT0gcGFpcnMuc2l6ZSkgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbW1pdERlbGV0ZWRQYWlyVmlld1RyYW5zaXRpb25zKGRlbGV0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlbGV0aW9uID0gZGVsZXRpb24uc2libGluZztcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbW1pdEV4aXRWaWV3VHJhbnNpdGlvbnMoZGVsZXRpb24pIHtcbiAgICAgIGlmICgzMCA9PT0gZGVsZXRpb24udGFnKSB7XG4gICAgICAgIHZhciBwcm9wcyA9IGRlbGV0aW9uLm1lbW9pemVkUHJvcHMsXG4gICAgICAgICAgbmFtZSA9IGdldFZpZXdUcmFuc2l0aW9uTmFtZShwcm9wcywgZGVsZXRpb24uc3RhdGVOb2RlKSxcbiAgICAgICAgICBwYWlyID1cbiAgICAgICAgICAgIG51bGwgIT09IGFwcGVhcmluZ1ZpZXdUcmFuc2l0aW9uc1xuICAgICAgICAgICAgICA/IGFwcGVhcmluZ1ZpZXdUcmFuc2l0aW9ucy5nZXQobmFtZSlcbiAgICAgICAgICAgICAgOiB2b2lkIDAsXG4gICAgICAgICAgY2xhc3NOYW1lID0gZ2V0Vmlld1RyYW5zaXRpb25DbGFzc05hbWUoXG4gICAgICAgICAgICBwcm9wcy5kZWZhdWx0LFxuICAgICAgICAgICAgdm9pZCAwICE9PSBwYWlyID8gcHJvcHMuc2hhcmUgOiBwcm9wcy5leGl0XG4gICAgICAgICAgKTtcbiAgICAgICAgXCJub25lXCIgIT09IGNsYXNzTmFtZSAmJlxuICAgICAgICAgIChhcHBseVZpZXdUcmFuc2l0aW9uVG9Ib3N0SW5zdGFuY2VzKFxuICAgICAgICAgICAgZGVsZXRpb24sXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICExXG4gICAgICAgICAgKVxuICAgICAgICAgICAgPyB2b2lkIDAgIT09IHBhaXJcbiAgICAgICAgICAgICAgPyAoKGNsYXNzTmFtZSA9IGRlbGV0aW9uLnN0YXRlTm9kZSksXG4gICAgICAgICAgICAgICAgKHBhaXIucGFpcmVkID0gY2xhc3NOYW1lKSxcbiAgICAgICAgICAgICAgICAoY2xhc3NOYW1lLnBhaXJlZCA9IHBhaXIpLFxuICAgICAgICAgICAgICAgIGFwcGVhcmluZ1ZpZXdUcmFuc2l0aW9ucy5kZWxldGUobmFtZSksXG4gICAgICAgICAgICAgICAgc2NoZWR1bGVWaWV3VHJhbnNpdGlvbkV2ZW50KGRlbGV0aW9uLCBwcm9wcy5vblNoYXJlKSlcbiAgICAgICAgICAgICAgOiBzY2hlZHVsZVZpZXdUcmFuc2l0aW9uRXZlbnQoZGVsZXRpb24sIHByb3BzLm9uRXhpdClcbiAgICAgICAgICAgIDogcmVzdG9yZVZpZXdUcmFuc2l0aW9uT25Ib3N0SW5zdGFuY2VzKGRlbGV0aW9uLmNoaWxkLCAhMSkpO1xuICAgICAgICBudWxsICE9PSBhcHBlYXJpbmdWaWV3VHJhbnNpdGlvbnMgJiZcbiAgICAgICAgICBjb21taXREZWxldGVkUGFpclZpZXdUcmFuc2l0aW9ucyhkZWxldGlvbik7XG4gICAgICB9IGVsc2UgaWYgKDAgIT09IChkZWxldGlvbi5zdWJ0cmVlRmxhZ3MgJiAzMzU1NDQzMikpXG4gICAgICAgIGZvciAoZGVsZXRpb24gPSBkZWxldGlvbi5jaGlsZDsgbnVsbCAhPT0gZGVsZXRpb247IClcbiAgICAgICAgICBjb21taXRFeGl0Vmlld1RyYW5zaXRpb25zKGRlbGV0aW9uKSwgKGRlbGV0aW9uID0gZGVsZXRpb24uc2libGluZyk7XG4gICAgICBlbHNlXG4gICAgICAgIG51bGwgIT09IGFwcGVhcmluZ1ZpZXdUcmFuc2l0aW9ucyAmJlxuICAgICAgICAgIGNvbW1pdERlbGV0ZWRQYWlyVmlld1RyYW5zaXRpb25zKGRlbGV0aW9uKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tbWl0TmVzdGVkVmlld1RyYW5zaXRpb25zKGNoYW5nZWRQYXJlbnQpIHtcbiAgICAgIGZvciAoY2hhbmdlZFBhcmVudCA9IGNoYW5nZWRQYXJlbnQuY2hpbGQ7IG51bGwgIT09IGNoYW5nZWRQYXJlbnQ7ICkge1xuICAgICAgICBpZiAoMzAgPT09IGNoYW5nZWRQYXJlbnQudGFnKSB7XG4gICAgICAgICAgdmFyIHByb3BzID0gY2hhbmdlZFBhcmVudC5tZW1vaXplZFByb3BzLFxuICAgICAgICAgICAgbmFtZSA9IGdldFZpZXdUcmFuc2l0aW9uTmFtZShwcm9wcywgY2hhbmdlZFBhcmVudC5zdGF0ZU5vZGUpO1xuICAgICAgICAgI
15852HByb3BzID0gZ2V0Vmlld1RyYW5zaXRpb25DbGFzc05hbWUocHJvcHMuZGVmYXVsdCwgcHJvcHMudXBkYXRlKTtcbiAgICAgICAgICBjaGFuZ2VkUGFyZW50LmZsYWdzICY9IC01O1xuICAgICAgICAgIFwibm9uZVwiICE9PSBwcm9wcyAmJlxuICAgICAgICAgICAgYXBwbHlWaWV3VHJhbnNpdGlvblRvSG9zdEluc3RhbmNlcyhcbiAgICAgICAgICAgICAgY2hhbmdlZFBhcmVudCxcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICAgIChjaGFuZ2VkUGFyZW50Lm1lbW9pemVkU3RhdGUgPSBbXSksXG4gICAgICAgICAgICAgICExXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAwICE9PSAoY2hhbmdlZFBhcmVudC5zdWJ0cmVlRmxhZ3MgJiAzMzU1NDQzMikgJiZcbiAgICAgICAgICAgIGNvbW1pdE5lc3RlZFZpZXdUcmFuc2l0aW9ucyhjaGFuZ2VkUGFyZW50KTtcbiAgICAgICAgY2hhbmdlZFBhcmVudCA9IGNoYW5nZWRQYXJlbnQuc2libGluZztcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcmVzdG9yZVBhaXJlZFZpZXdUcmFuc2l0aW9ucyhwYXJlbnQpIHtcbiAgICAgIGlmICgwICE9PSAocGFyZW50LnN1YnRyZWVGbGFncyAmIDE4ODc0MzY4KSlcbiAgICAgICAgZm9yIChwYXJlbnQgPSBwYXJlbnQuY2hpbGQ7IG51bGwgIT09IHBhcmVudDsgKSB7XG4gICAgICAgICAgaWYgKDIyICE9PSBwYXJlbnQudGFnIHx8IG51bGwgPT09IHBhcmVudC5tZW1vaXplZFN0YXRlKSB7XG4gICAgICAgICAgICBpZiAoMzAgPT09IHBhcmVudC50YWcgJiYgMCAhPT0gKHBhcmVudC5mbGFncyAmIDE4ODc0MzY4KSkge1xuICAgICAgICAgICAgICB2Y
15852XIgaW5zdGFuY2UgPSBwYXJlbnQuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICBudWxsICE9PSBpbnN0YW5jZS5wYWlyZWQgJiZcbiAgICAgICAgICAgICAgICAoKGluc3RhbmNlLnBhaXJlZCA9IG51bGwpLFxuICAgICAgICAgICAgICAgIHJlc3RvcmVWaWV3VHJhbnNpdGlvbk9uSG9zdEluc3RhbmNlcyhwYXJlbnQuY2hpbGQsICExKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN0b3JlUGFpcmVkVmlld1RyYW5zaXRpb25zKHBhcmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5zaWJsaW5nO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlc3RvcmVFbnRlck9yRXhpdFZpZXdUcmFuc2l0aW9ucyhmaWJlcikge1xuICAgICAgaWYgKDMwID09PSBmaWJlci50YWcpXG4gICAgICAgIChmaWJlci5zdGF0ZU5vZGUucGFpcmVkID0gbnVsbCksXG4gICAgICAgICAgcmVzdG9yZVZpZXdUcmFuc2l0aW9uT25Ib3N0SW5zdGFuY2VzKGZpYmVyLmNoaWxkLCAhMSksXG4gICAgICAgICAgcmVzdG9yZVBhaXJlZFZpZXdUcmFuc2l0aW9ucyhmaWJlcik7XG4gICAgICBlbHNlIGlmICgwICE9PSAoZmliZXIuc3VidHJlZUZsYWdzICYgMzM1NTQ0MzIpKVxuICAgICAgICBmb3IgKGZpYmVyID0gZmliZXIuY2hpbGQ7IG51bGwgIT09IGZpYmVyOyApXG4gICAgICAgICAgcmVzdG9yZUVudGVyT3JFeGl0Vmlld1RyYW5zaXRpb25zKGZpYmVyKSwgKGZpYmVyID0gZmliZXIuc2libGluZyk7XG4gICAgICBlbHNlIHJlc3RvcmVQYWlyZWRWaWV3VHJhbnNpdGlvbnMoZmliZXIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXN0b3JlTmVzdGVkVmlld1RyYW5zaXRpb25zKGNoYW5nZWRQYXJlbnQpIHtcbiAgICAgIGZvciAoY2hhbmdlZFBhcmVudCA9IGNoYW5nZWRQYXJlbnQuY2hpbGQ7IG51bGwgIT09IGNoYW5nZWRQYXJlbnQ7IClcbiAgICAgICAgMzAgPT09IGNoYW5nZWRQYXJlbnQudGFnXG4gICAgICAgICAgPyByZXN0b3JlVmlld1RyYW5zaXRpb25Pbkhvc3RJbnN0YW5jZXMoY2hhbmdlZFBhcmVudC5jaGlsZCwgITEpXG4gICAgICAgICAgOiAwICE9PSAoY2hhbmdlZFBhcmVudC5zdWJ0cmVlRmxhZ3MgJiAzMzU1NDQzMikgJiZcbiAgICAgICAgICAgIHJlc3RvcmVOZXN0ZWRWaWV3VHJhbnNpdGlvbnMoY2hhbmdlZFBhcmVudCksXG4gICAgICAgICAgKGNoYW5nZWRQYXJlbnQgPSBjaGFuZ2VkUGFyZW50LnNpYmxpbmcpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtZWFzdXJlVmlld1RyYW5zaXRpb25Ib3N0SW5zdGFuY2VzUmVjdXJzaXZlKFxuICAgICAgcGFyZW50Vmlld1RyYW5zaXRpb24sXG4gICAgICBjaGlsZCxcbiAgICAgIG5ld05hbWUsXG4gICAgICBvbGROYW1lLFxuICAgICAgY2xhc3NOYW1lLFxuICAgICAgcHJldmlvdXNNZWFzdXJlbWVudHMsXG4gICAgICBzdG9wQXROZXN0ZWRWaWV3VHJhbnNpdGlvbnNcbiAgICApIHtcbiAgICAgIGZvciAodmFyIGluVmlld3BvcnQgPSAhMTsgbnVsbCAhPT0gY2hpbGQ7ICkge1xuICAgICAgICBpZiAoNSA9PT0gY2hpbGQudGFnKSB7XG4gICAgICAgICAgdmFyIF9pbnN0YW5jZTIgPSBjaGlsZC5zdGF0ZU5vZGU7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgbnVsbCAhPT0gcHJldmlvdXNNZWFzdXJlbWVudHMgJiZcbiAgICAgICAgICAgIHZpZXdUcmFuc2l0aW9uSG9zdEluc3RhbmNlSWR4IDwgcHJldmlvdXNNZWFzdXJlbWVudHMubGVuZ3RoXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB2Y
15852XIgcHJldmlvdXNNZWFzdXJlbWVudCA9XG4gICAgICAgICAgICAgICAgcHJldmlvdXNNZWFzdXJlbWVudHNbdmlld1RyYW5zaXRpb25Ib3N0SW5zdGFuY2VJZHhdLFxuICAgICAgICAgICAgICBuZXh0TWVhc3VyZW1lbnQgPSBtZWFzdXJlSW5zdGFuY2UoX2luc3RhbmNlMik7XG4gICAgICAgICAgICBpZiAocHJldmlvdXNNZWFzdXJlbWVudC52aWV3IHx8IG5leHRNZWFzdXJlbWVudC52aWV3KVxuICAgICAgICAgICAgICBpblZpZXdwb3J0ID0gITA7XG4gICAgICAgICAgICB2YXIgSlNDb21waWxlcl90ZW1wO1xuICAgICAgICAgICAgaWYgKChKU0NvbXBpbGVyX3RlbXAgPSAwID09PSAocGFyZW50Vmlld1RyYW5zaXRpb24uZmxhZ3MgJiA0KSkpXG4gICAgICAgICAgICAgIGlmIChuZXh0TWVhc3VyZW1lbnQuY2xpcCkgSlNDb21waWxlcl90ZW1wID0gITA7XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIEpTQ29tcGlsZXJfdGVtcCA9IHByZXZpb3VzTWVhc3VyZW1lbnQucmVjdDtcbiAgICAgICAgICAgICAgICB2YXIgbmV3UmVjdCA9IG5leHRNZWFzdXJlbWVudC5yZWN0O1xuICAgICAgICAgICAgICAgIEpTQ29tcGlsZXJfdGVtcCA9XG4gICAgICAgICAgICAgICAgICBKU0NvbXBpbGVyX3RlbXAueSAhPT0gbmV3UmVjdC55IHx8XG4gICAgICAgICAgICAgICAgICBKU0NvbXBpbGVyX3RlbXAueCAhPT0gbmV3UmVjdC54IHx8XG4gICAgICAgICAgICAgICAgICBKU0NvbXBpbGVyX3RlbXAuaGVpZ2h0ICE9PSBuZXdSZWN0LmhlaWdodCB8fFxuICAgICAgICAgICAgICAgICAgSlNDb21waWxlcl90ZW1wLndpZHRoICE9PSBuZXdSZWN0LndpZHRoO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBKU0NvbXBpbGVyX3RlbXAgJiYgKHBhcmVudFZpZXdUcmFuc2l0aW9uLmZsYWdzIHw9IDQpO1xuICAgICAgICAgICAgbmV4dE1lYXN1cmVtZW50LmFic1xuICAgICAgICAgICAgICA/IChuZXh0TWVhc3VyZW1lbnQgPSAhcHJldmlvdXNNZWFzdXJlbWVudC5hYnMpXG4gICAgICAgICAgICAgIDogKChwcmV2aW91c01lYXN1cmVtZW50ID0gcHJldmlvdXNNZWFzdXJlbWVudC5yZWN0KSxcbiAgICAgICAgICAgICAgICAobmV4dE1lYXN1cmVtZW50ID0gbmV4dE1lYXN1cmVtZW50LnJlY3QpLFxuICAgICAgICAgICAgICAgIChuZXh0TWVhc3VyZW1lbnQgPVxuICAgICAgICAgICAgICAgICAgcHJldmlvdXNNZWFzdXJlbWVudC5oZWlnaHQgIT09IG5leHRNZWFzdXJlbWVudC5oZWlnaHQgfHxcbiAgICAgICAgICAgICAgICAgIHByZXZpb3VzTWVhc3VyZW1lbnQud2lkdGggIT09IG5leHRNZWFzdXJlbWVudC53aWR0aCkpO1xuICAgICAgICAgICAgbmV4dE1lYXN1cmVtZW50ICYmIChwYXJlbnRWaWV3VHJhbnNpdGlvbi5mbGFncyB8PSAzMik7XG4gICAgICAgICAgfSBlbHNlIHBhcmVudFZpZXdUcmFuc2l0aW9uLmZsYWdzIHw9IDMyO1xuICAgICAgICAgIDAgIT09IChwYXJlbnRWaWV3VHJhbnNpdGlvbi5mbGFncyAmIDQpICYmXG4gICAgICAgICAgICBhcHBseVZpZXdUcmFuc2l0aW9uTmFtZShcbiAgICAgICAgICAgICAgX2luc3RhbmNlMixcbiAgICAgICAgICAgICAgMCA9PT0gdmlld1RyYW5zaXRpb25Ib3N0SW5zdGFuY2VJZHhcbiAgICAgICAgICAgICAgICA/IG5ld05hbWVcbiAgICAgICAgICAgICAgICA6IG5ld05hbWUgKyBcIl9cIiArIHZpZXdUcmFuc2l0aW9uSG9zdEluc3RhbmNlSWR4LFxuICAgICAgICAgICAgICBjbGFzc05hbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgKGluVmlld3BvcnQgJiYgMCAhPT0gKHBhcmVudFZpZXdUcmFuc2l0aW9uLmZsYWdzICYgNCkpIHx8XG4gICAgICAgICAgICAobnVsbCA9PT0gdmlld1RyYW5zaXRpb25DYW5jZWxhYmxlQ2hpbGRyZW4gJiZcbiAgICAgICAgICAgICAgKHZpZXdUcmFuc2l0aW9uQ2FuY2VsYWJsZUNoaWxkcmVuID0gW10pLFxuICAgICAgICAgICAgdmlld1RyYW5zaXRpb25DYW5jZWxhYmxlQ2hpbGRyZW4ucHVzaChcbiAgICAgICAgICAgICAgX2luc3RhbmNlMixcbiAgICAgICAgICAgICAgMCA9PT0gdmlld1RyYW5zaXRpb25Ib3N0SW5zdGFuY2VJZHhcbiAgICAgICAgICAgICAgICA/IG9sZE5hbWVcbiAgICAgICAgICAgICAgICA6IG9sZE5hbWUgKyBcIl9cIiArIHZpZXdUcmFuc2l0aW9uSG9zdEluc3RhbmNlSWR4LFxuICAgICAgICAgICAgICBjaGlsZC5tZW1vaXplZFByb3BzXG4gICAgICAgICAgICApKTtcbiAgICAgICAgICB2aWV3VHJhbnNpdGlvbkhvc3RJbnN0YW5jZUlkeCsrO1xuICAgICAgICB9IGVsc2UgaWYgKDIyICE9PSBjaGlsZC50YWcgfHwgbnVsbCA9PT0gY2hpbGQubWVtb2l6ZWRTdGF0ZSlcbiAgICAgICAgICAzMCA9PT0gY2hpbGQudGFnICYmIHN0b3BBdE5lc3RlZFZpZXdUcmFuc2l0aW9uc1xuICAgICAgICAgICAgPyAocGFyZW50Vmlld1RyYW5zaXRpb24uZmxhZ3MgfD0gY2hpbGQuZmxhZ3MgJiAzMilcbiAgICAgICAgICAgIDogbWVhc3VyZVZpZXdUcmFuc2l0aW9uSG9zdEluc3RhbmNlc1JlY3Vyc2l2ZShcbiAgICAgICAgICAgICAgICBwYXJlbnRWaWV3VHJhbnNpdGlvbixcbiAgICAgICAgICAgICAgICBjaGlsZC5jaGlsZCxcbiAgICAgICAgICAgICAgICBuZXdOYW1lLFxuICAgICAgICAgICAgICAgIG9sZE5hbWUsXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICAgICAgICAgIHByZXZpb3VzTWVhc3VyZW1lbnRzLFxuICAgICAgICAgICAgICAgIHN0b3BBdE5lc3RlZFZpZXdUcmFuc2l0aW9uc1xuICAgICAgICAgICAgICApICYmIChpblZpZXdwb3J0ID0gITApO1xuICAgICAgICBjaGlsZCA9IGNoaWxkLnNpYmxpbmc7XG4gICAgICB9XG4gICAgICByZXR1cm4gaW5WaWV3cG9ydDtcbiAgICB9XG4gICAgZnVuY3Rpb24gbWVhc3VyZU5lc3RlZFZpZXdUcmFuc2l0aW9ucyhjaGFuZ2VkUGFyZW50LCBnZXN0dXJlKSB7XG4gICAgICBmb3IgKGNoYW5nZWRQYXJlbnQgPSBjaGFuZ2VkUGFyZW50LmNoaWxkOyBudWxsICE9PSBjaGFuZ2VkUGFyZW50OyApIHtcbiAgICAgICAgaWYgKDMwID09PSBjaGFuZ2VkUGFyZW50LnRhZykge1xuICAgICAgICAgIHZhciBwcm9wcyA9IGNoYW5nZWRQYXJlbnQubWVtb2l6ZWRQcm9wcyxcbiAgICAgICAgICAgI
15852HN0YXRlID0gY2hhbmdlZFBhcmVudC5zdGF0ZU5vZGUsXG4gICAgICAgICAgICBuYW1lID0gZ2V0Vmlld1RyYW5zaXRpb25OYW1lKHByb3BzLCBzdGF0ZSksXG4gICAgICAgICAgICBjbGFzc05hbWUgPSBnZXRWaWV3VHJhbnNpdGlvbkNsYXNzTmFtZShwcm9wcy5kZWZhdWx0LCBwcm9wcy51cGRhdGUpO1xuICAgICAgICAgIGlmIChnZXN0dXJlKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IHN0YXRlLmNsb25lcztcbiAgICAgICAgICAgIHZhciBwcmV2aW91c01lYXN1cmVtZW50cyA9XG4gICAgICAgICAgICAgIG51bGwgPT09IHN0YXRlID8gbnVsbCA6IHN0YXRlLm1hcChtZWFzdXJlQ2xvbmVkSW5zdGFuY2UpO1xuICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgKHByZXZpb3VzTWVhc3VyZW1lbnRzID0gY2hhbmdlZFBhcmVudC5tZW1vaXplZFN0YXRlKSxcbiAgICAgICAgICAgICAgKGNoYW5nZWRQYXJlbnQubWVtb2l6ZWRTdGF0ZSA9IG51bGwpO1xuICAgICAgICAgIHN0YXRlID0gY2hhbmdlZFBhcmVudDtcbiAgICAgICAgICB2YXIgY2hpbGQgPSBjaGFuZ2VkUGFyZW50LmNoaWxkLFxuICAgICAgICAgICAgbmV3TmFtZSA9IG5hbWU7XG4gICAgICAgICAgdmlld1RyYW5zaXRpb25Ib3N0SW5zdGFuY2VJZHggPSAwO1xuICAgICAgICAgIGNsYXNzTmFtZSA9IG1lYXN1cmVWaWV3VHJhbnNpdGlvbkhvc3RJbnN0YW5jZXNSZWN1cnNpdmUoXG4gICAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICAgIGNoaWxkLFxuICAgICAgICAgICAgbmV3TmFtZSxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgICBwcmV2aW91c01lYXN1cmVtZW50cyxcbiAgICAgICAgICAgICExXG4gICAgICAgICAgKTtcbiAgICAgICAgICAwICE9PSAoY2hhbmdlZFBhcmVudC5mbGFncyAmIDQpICYmXG4gICAgICAgICAgICBjbGFzc05hbWUgJiZcbiAgICAgICAgICAgIChnZXN0dXJlIHx8XG4gICAgICAgICAgICAgIHNjaGVkdWxlVmlld1RyYW5zaXRpb25FdmVudChjaGFuZ2VkUGFyZW50LCBwcm9wcy5vblVwZGF0ZSkpO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAwICE9PSAoY2hhbmdlZFBhcmVudC5zdWJ0cmVlRmxhZ3MgJiAzMzU1NDQzMikgJiZcbiAgICAgICAgICAgIG1lYXN1cmVOZXN0ZWRWaWV3VHJhbnNpdGlvbnMoY2hhbmdlZFBhcmVudCwgZ2VzdHVyZSk7XG4gICAgICAgIGNoYW5nZWRQYXJlbnQgPSBjaGFuZ2VkUGFyZW50LnNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNrTmFtZWRWaWV3VHJhbnNpdGlvbihmaWJlcikge1xuICAgICAgdmFyIG5hbWUgPSBmaWJlci5tZW1vaXplZFByb3BzLm5hbWU7XG4gICAgICBpZiAobnVsbCAhPSBuYW1lICYmIFwiYXV0b1wiICE9PSBuYW1lKSB7XG4gICAgICAgIHZhciBleGlzdGluZyA9IG1vdW50ZWROYW1lZFZpZXdUcmFuc2l0aW9ucy5nZXQobmFtZSk7XG4gICAgICAgIGlmICh2b2lkIDAgIT09IGV4aXN0aW5nKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZXhpc3RpbmcgIT09IGZpYmVyICYmXG4gICAgICAgICAgICBleGlzdGluZyAhPT0gZmliZXIuYWx0ZXJuYXRlICYmXG4gICAgICAgICAgICAhZGlkV2FybkFib3V0TmFtZVtuYW1lXVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZGlkV2FybkFib3V0TmFtZVtuYW1lXSA9ICEwO1xuICAgICAgICAgICAgdmFyIHN0cmluZ2lmaWVkTmFtZSA9IEpTT04uc3RyaW5naWZ5KG5hbWUpO1xuICAgICAgICAgICAgcnVuV2l0aEZpYmVySW5ERVYoZmliZXIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBcIlRoZXJlIGFyZSB0d28gPFZpZXdUcmFuc2l0aW9uIG5hbWU9JXM+IGNvbXBvbmVudHMgd2l0aCB0aGUgc2FtZSBuYW1lIG1vdW50ZWQgYXQgdGhlIHNhbWUgdGltZS4gVGhpcyBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGNhdXNlIFZpZXcgVHJhbnNpdGlvbnMgdG8gZXJyb3IuIFRyeSB0byB1c2UgYSBtb3JlIHVuaXF1ZSBuYW1lIGUuZy4gYnkgdXNpbmcgYSBuYW1lc3BhY2UgcHJlZml4IGFuZCBhZGRpbmcgdGhlIGlkIG9mIGFuIGl0ZW0gdG8gdGhlIG5hbWUuXCIsXG4gICAgICAgICAgICAgICAgc3RyaW5naWZpZWROYW1lXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJ1bldpdGhGaWJlckluREVWKGV4aXN0aW5nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgXCJUaGUgZXhpc3RpbmcgPFZpZXdUcmFuc2l0aW9uIG5hbWU9JXM+IGR1cGxpY2F0ZSBoYXMgdGhpcyBzdGFjayB0cmFjZS5cIixcbiAgICAgICAgICAgICAgICBzdHJpbmdpZmllZE5hbWVcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIG1vdW50ZWROYW1lZFZpZXdUcmFuc2l0aW9ucy5zZXQobmFtZSwgZmliZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB1bnRyYWNrTmFtZWRWaWV3VHJhbnNpdGlvbihmaWJlcikge1xuICAgICAgdmFyIG5hbWUgPSBmaWJlci5tZW1vaXplZFByb3BzLm5hbWU7XG4gICAgICBpZiAobnVsbCAhPSBuYW1lICYmIFwiYXV0b1wiICE9PSBuYW1lKSB7XG4gICAgICAgIHZhciBleGlzdGluZyA9IG1vdW50ZWROYW1lZFZpZXdUcmFuc2l0aW9ucy5nZXQobmFtZSk7XG4gICAgICAgIHZvaWQgMCA9PT0gZXhpc3RpbmcgfHxcbiAgICAgICAgICAoZXhpc3RpbmcgIT09IGZpYmVyICYmIGV4aXN0aW5nICE9PSBmaWJlci5hbHRlcm5hdGUpIHx8XG4gICAgICAgICAgbW91bnRlZE5hbWVkVmlld1RyYW5zaXRpb25zLmRlbGV0ZShuYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaXNIeWRyYXRpbmdQYXJlbnQoY3VycmVudCwgZmluaXNoZWRXb3JrKSB7XG4gICAgICByZXR1cm4gMzEgPT09IGZpbmlzaGVkV29yay50YWdcbiAgICAgICAgPyAoKGZpbmlzaGVkV29yayA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSxcbiAgICAgICAgICBudWxsICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUgJiYgbnVsbCA9PT0gZmluaXNoZWRXb3JrKVxuICAgICAgICA6IDEzID09PSBmaW5pc2hlZFdvcmsudGFnXG4gICAgICAgICAgPyAoKGN1cnJlbnQgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGUpLFxuICAgICAgICAgICAgKGZpbmlzaGVkV29yayA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSxcbiAgICAgICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiZcbiAgICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudC5kZWh5ZHJhdGVkICYmXG4gICAgICAgICAgICAgIChudWxsID09PSBmaW5pc2hlZFdvcmsgfHwgbnVsbCA9PT0gZmluaXNoZWRXb3JrLmRlaHlkcmF0ZWQ
15852pKVxuICAgICAgICAgIDogMyA9PT0gZmluaXNoZWRXb3JrLnRhZ1xuICAgICAgICAgICAgPyBjdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkICYmXG4gICAgICAgICAgICAgIDAgPT09IChmaW5pc2hlZFdvcmsuZmxhZ3MgJiAyNTYpXG4gICAgICAgICAgICA6ICExO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmlyc3RDaGlsZCwgY29tbWl0dGVkTGFuZXMpIHtcbiAgICAgIHJvb3QgPSByb290LmNvbnRhaW5lckluZm87XG4gICAgICBldmVudHNFbmFibGVkID0gX2VuYWJsZWQ7XG4gICAgICByb290ID0gZ2V0QWN0aXZlRWxlbWVudERlZXAocm9vdCk7XG4gICAgICBpZiAoaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKHJvb3QpKSB7XG4gICAgICAgIGlmIChcInNlbGVjdGlvblN0YXJ0XCIgaW4gcm9vdClcbiAgICAgICAgICB2YXIgSlNDb21waWxlcl90ZW1wID0ge1xuICAgICAgICAgICAgc3RhcnQ6IHJvb3Quc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgICAgICBlbmQ6IHJvb3Quc2VsZWN0aW9uRW5kXG4gICAgICAgICAgfTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgIEpTQ29tcGlsZXJfdGVtcCA9XG4gICAgICAgICAgICAgICgoSlNDb21waWxlcl90ZW1wID0gcm9vdC5vd25lckRvY3VtZW50KSAmJlxuICAgICAgICAgICAgICAgIEpTQ29tcGlsZXJfdGVtcC5kZWZhdWx0VmlldykgfHxcbiAgICAgICAgICAgICAgd2luZG93O1xuICAgICAgICAgICAgdmFyIHNlbGVjdGlvbiA9XG4gICAgICAgICAgICAgIEpTQ29tcGlsZXJfdGVtcC5nZXRTZWxlY3Rpb24gJiYgSlNDb21waWxlcl90ZW1wLmdldFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiAwICE9PSBzZWxlY3Rpb24ucmFuZ2VDb3VudCkge1xuICAgICAgICAgICAgICBKU0NvbXBpbGVyX3RlbXAgPSBzZWxlY3Rpb24uYW5jaG9yTm9kZTtcbiAgICAgICAgICAgICAgdmFyIGFuY2hvck9mZnNldCA9IHNlbGVjdGlvbi5hbmNob3JPZmZzZXQsXG4gICAgICAgICAgICAgICAgZm9jdXNOb2RlID0gc2VsZWN0aW9uLmZvY3VzTm9kZTtcbiAgICAgICAgICAgICAgc2VsZWN0aW9uID0gc2VsZWN0aW9uLmZvY3VzT2Zmc2V0O1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIEpTQ29tcGlsZXJfdGVtcC5ub2RlVHlwZSwgZm9jdXNOb2RlLm5vZGVUeXBlO1xuICAgICAgICAgICAgICB9IGNhdGNoIChlJDMpIHtcbiAgICAgICAgICAgICAgICBKU0NvbXBpbGVyX3RlbXAgPSBudWxsO1xuICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFyIGxlbmd0aCA9IDAsXG4gICAgICAgICAgICAgICAgc3RhcnQgPSAtMSxcbiAgICAgICAgICAgICAgICBlbmQgPSAtMSxcbiAgICAgICAgICAgICAgICBpbmRleFdpdGhpbkFuY2hvciA9IDAsXG4gICAgICAgICAgICAgICAgaW5kZXhXaXRoaW5Gb2N1cyA9IDAsXG4gICAgICAgICAgICAgICAgbm9kZSA9IHJvb3QsXG4gICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9IG51bGw7XG4gICAgICAgICAgICAgIGI6IGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuZXh0OyA7ICkge1xuICAgICAgICAgICAgICAgICAgbm9kZSAhPT0gSlNDb21waWxlcl90ZW1wIHx8XG4gICAgICAgICAgICAgICAgICAgICgwICE9PSBhbmNob3JPZmZzZXQgJiYgMyAhPT0gbm9kZS5ub2RlVHlwZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgKHN0YXJ0ID0gbGVuZ3RoICsgYW5jaG9yT2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgIG5vZGUgIT09IGZvY3VzTm9kZSB8fFxuICAgICAgICAgICAgICAgICAgICAoMCAhPT0gc2VsZWN0aW9uICYmIDMgIT09IG5vZGUubm9kZVR5cGUpIHx8XG4gICAgICAgICAgICAgICAgICAgIChlbmQgPSBsZW5ndGggKyBzZWxlY3Rpb24pO1xuICAgICAgICAgICAgICAgICAgMyA9PT0gbm9kZS5ub2RlVHlwZSAmJiAobGVuZ3RoICs9IG5vZGUubm9kZVZhbHVlLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gKG5leHQgPSBub2RlLmZpcnN0Q2hpbGQpKSBicmVhaztcbiAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUgPSBub2RlO1xuICAgICAgICAgICAgICAgICAgbm9kZSA9IG5leHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgICAgICAgIGlmIChub2RlID09PSByb290KSBicmVhayBiO1xuICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9PT0gSlNDb21waWxlcl90ZW1wICYmXG4gICAgICAgICAgICAgICAgICAgICsraW5kZXhXaXRoaW5BbmNob3IgPT09IGFuY2hvck9mZnNldCAmJlxuICAgICAgICAgICAgICAgICAgICAoc3RhcnQgPSBsZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9PT0gZm9jdXNOb2RlICYmXG4gICAgICAgICAgICAgICAgICAgICsraW5kZXhXaXRoaW5Gb2N1cyA9PT0gc2VsZWN0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgIChlbmQgPSBsZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT09IChuZXh0ID0gbm9kZS5uZXh0U2libGluZykpIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgbm9kZSA9IHBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICBwYXJlbnROb2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBub2RlID0gbmV4dDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBKU0NvbXBpbGVyX3RlbXAgPVxuICAgICAgICAgICAgICAgIC0xID09PSBzdGFydCB8fCAtMSA9PT0gZW5kID8gbnVsbCA6IHsgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZCB9O1xuICAgICAgICAgICAgfSBlbHNlIEpTQ29tcGlsZXJfdGVtcCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICBKU0NvbXBpbGVyX3RlbXAgPSBKU0NvbXBpbGVyX3RlbXAgfHwgeyBzdGFydDogMCwgZW5kOiAwIH07XG4gICAgICB9IGVsc2UgSlNDb21waWxlcl90ZW1wID0gbnVsbDtcbiAgICAgIHNlbGVjdGlvbkluZm9ybWF0aW9uID0ge1xuICAgICAgICBmb2N1c2VkRWxlbTogcm9vdCxcbiAgICAgICAgc2VsZWN0aW9uUmFuZ2U6IEpTQ29tcGlsZXJfdGVtcF
15852xuICAgICAgfTtcbiAgICAgIF9lbmFibGVkID0gITE7XG4gICAgICBjb21taXR0ZWRMYW5lcyA9IChjb21taXR0ZWRMYW5lcyAmIDMzNTU0NDA2NCkgPT09IGNvbW1pdHRlZExhbmVzO1xuICAgICAgbmV4dEVmZmVjdCA9IGZpcnN0Q2hpbGQ7XG4gICAgICBmb3IgKGZpcnN0Q2hpbGQgPSBjb21taXR0ZWRMYW5lcyA/IDkyNzAgOiAxMDI0OyBudWxsICE9PSBuZXh0RWZmZWN0OyApIHtcbiAgICAgICAgcm9vdCA9IG5leHRFZmZlY3Q7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBjb21taXR0ZWRMYW5lcyAmJlxuICAgICAgICAgICgoSlNDb21waWxlcl90ZW1wID0gcm9vdC5kZWxldGlvbnMpLCBudWxsICE9PSBKU0NvbXBpbGVyX3RlbXApXG4gICAgICAgIClcbiAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgYW5jaG9yT2Zmc2V0ID0gMDtcbiAgICAgICAgICAgIGFuY2hvck9mZnNldCA8IEpTQ29tcGlsZXJfdGVtcC5sZW5ndGg7XG4gICAgICAgICAgICBhbmNob3JPZmZzZXQrK1xuICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbW1pdHRlZExhbmVzICYmXG4gICAgICAgICAgICAgIGNvbW1pdEV4aXRWaWV3VHJhbnNpdGlvbnMoSlNDb21waWxlcl90ZW1wW2FuY2hvck9mZnNldF0pO1xuICAgICAgICBpZiAobnVsbCA9PT0gcm9vdC5hbHRlcm5hdGUgJiYgMCAhPT0gKHJvb3QuZmxhZ3MgJiAyKSlcbiAgICAgICAgICBjb21taXR0ZWRMYW5lcyAmJiB0cmFja0VudGVyVmlld1RyYW5zaXRpb25zKHJvb3QpLFxuICAgICAgICAgICAgY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzX2NvbXBsZXRlKGNvbW1pdHRlZExhbmVzKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKDIyID09PSByb290LnRhZylcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgKChKU0NvbXBpbGVyX3RlbXAgPSByb290LmFsdGVybmF0ZSksIG51bGwgIT09IHJvb3QubWVtb2l6ZWRTdGF0ZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBudWxsICE9PSBKU0NvbXBpbGVyX3RlbXAgJiZcbiAgICAgICAgICAgICAgICBudWxsID09PSBKU0NvbXBpbGVyX3RlbXAubWVtb2l6ZWRTdGF0ZSAmJlxuICAgICAgICAgICAgICAgIGNvbW1pdHRlZExhbmVzICYmXG4gICAgICAgICAgICAgICAgY29tbWl0RXhpdFZpZXdUcmFuc2l0aW9ucyhKU0NvbXBpbGVyX3RlbXApO1xuICAgICAgICAgICAgICBjb21taXRC
15852ZWZvcmVNdXRhdGlvbkVmZmVjdHNfY29tcGxldGUoY29tbWl0dGVkTGFuZXMpO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgIG51bGwgIT09IEpTQ29tcGlsZXJfdGVtcCAmJlxuICAgICAgICAgICAgICBudWxsICE9PSBKU0NvbXBpbGVyX3RlbXAubWVtb2l6ZWRTdGF0ZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNvbW1pdHRlZExhbmVzICYmIHRyYWNrRW50ZXJWaWV3VHJhbnNpdGlvbnMocm9vdCk7XG4gICAgICAgICAgICAgIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c19jb21wbGV0ZShjb21taXR0ZWRMYW5lcyk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIEpTQ29tcGlsZXJfdGVtcCA9IHJvb3QuY2hpbGQ7XG4gICAgICAgICAgMCAhPT0gKHJvb3Quc3VidHJlZUZsYWdzICYgZmlyc3RDaGlsZCkgJiYgbnVsbCAhPT0gSlNDb21waWxlcl90ZW1wXG4gICAgICAgICAgICA/ICgoSlNDb21waWxlcl90ZW1wLnJldHVybiA9IHJvb3QpLCAobmV4dEVmZmVjdCA9IEpTQ29tcGlsZXJfdGVtcCkpXG4gICAgICAgICAgICA6IChjb21taXR0ZWRMYW5lcyAmJiBjb21taXROZXN0ZWRWaWV3VHJhbnNpdGlvbnMocm9vdCksXG4gICAgICAgICAgICAgIGNvbW1pdEJlZm9yZU11dGF0aW9uRWZmZWN0c19jb21wbGV0ZShjb21taXR0ZWRMYW5lcykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhcHBlYXJpbmdWaWV3VHJhbnNpdGlvbnMgPSBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21taXRCZWZvcmVNdXRhdGlvbkVmZmVjdHNfY29tcGxldGUoXG4gICAgICBpc1ZpZXdUcmFuc2l0aW9uRWxpZ2libGUkanNjb21wJDBcbiAgICApIHtcbiAgICAgIGZvciAoOyBudWxsICE9PSBuZXh0RWZmZWN0OyApIHtcbiAgICAgICAgdmFyIGZpYmVyID0gbmV4dEVmZmVjdCxcbiAgICAgICAgICBmaW5pc2hlZFdvcmsgPSBmaWJlcixcbiAgICAgICAgICBpc1ZpZXdUcmFuc2l0aW9uRWxpZ2libGUgPSBpc1ZpZXdUcmFuc2l0aW9uRWxpZ2libGUkanNjb21wJDAsXG4gICAgICAgICAgY3VycmVudCA9IGZpbmlzaGVkV29yay5hbHRlcm5hdGUsXG4gICAgICAgICAgZmxhZ3MgPSBmaW5pc2hlZFdvcmsuZmxhZ3M7XG4gICAgICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAwICE9PSAoZmxhZ3MgJiAxMDI0KSAmJlxuICAgICAgICAgICAgICBudWxsICE9PSBjdXJyZW50ICYmXG4gICAgICAgICAgICAgIGNvbW1pdENsYXNzU25hcHNob3QoZmluaXNoZWRXb3JrLCBjdXJyZW50KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIGlmICgwICE9PSAoZmxhZ3MgJiAxMDI0KSlcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICgoaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlID1cbiAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yay5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyksXG4gICAgICAgICAgICAgICAgKGZpbmlzaGVkV29yayA9IGlzVmlld1RyYW5zaXRpb25FbGlnaWJsZS5ub2RlVHlwZSksXG4gICAgICAgICAgICAgICAgOSA9PT0gZmluaXNoZWRXb3JrKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgY2xlYXJDb250YWluZXJTcGFyaW5nbHkoaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlKTtcbiAgICAgICAgICAgICAgZWxzZSBpZiAoMSA9PT0gZmluaXNoZWRXb3JrKVxuICAgICAgICAgICAgICAgIHN3aXRjaCAoaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlLm5vZGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIFwiSEVBRFwiOlxuICAgICAgICAgICAgICAgICAgY2FzZSBcIkhUTUxcIjpcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJCT0RZXCI6XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyQ29udGFpbmVyU3BhcmluZ2x5KGlzVmlld1RyYW5zaXRpb25FbGlnaWJsZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlLnRleHRDb250ZW50ID0gXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgY2FzZSAyNjpcbiAgICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgY2FzZSAxNzpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMzA6XG4gICAgICAgICAgICBpc1ZpZXdUcmFuc2l0aW9uRWxpZ2libGUgJiZcbiAgICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudCAmJlxuICAgICAgICAgICAgICAoKGlzVmlld1RyYW5zaXRpb25FbGlnaWJsZSA9IGN1cnJlbnQpLFxuICAgICAgICAgICAgICAoY3VycmVudCA9IGZpbmlzaGVkV29yayksXG4gICAgICAgICAgICAgIChmaW5pc2hlZFdvcmsgPSBnZXRWaWV3VHJhbnNpdGlvbk5hbWUoXG4gICAgICAgICAgICAgICAgaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlLm1lbW9pemVkUHJvcHMsXG4gICAgICAgICAgICAgICAgaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlLnN0YXRlTm9kZVxuICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgKGN1cnJlbnQgPSBjdXJyZW50Lm1lbW9pemVkUHJvcHMpLFxuICAgICAgICAgICAgICAoY3VycmVudCA9IGdldFZpZXdUcmFuc2l0aW9uQ2xhc3NOYW1lKFxuICAgICAgICAgICAgICAgIGN1cnJlbnQuZGVmYXVsdCxcbiAgICAgICAgICAgICAgICBjdXJyZW50LnVwZGF0ZVxuICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgXCJub25lXCIgIT09IGN1cnJlbnQgJiZcbiAgICAgICAgICAgICAgICBhcHBseVZpZXdUcmFuc2l0aW9uVG9Ib3N0SW5zdGFuY2VzKFxuICAgICAgICAgICAgICAgICAgaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlLFxuICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgICAgIChpc1ZpZXdUcmFuc2l0aW9uRWxpZ2libGUubWVtb2l6ZWRTdGF0ZSA9IFtdKSxcbiAgICAgICAgICAgICAgICAgICEwXG4gICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgaWYgKDAgIT09IChmbGFncyAmIDEwMjQpKVxuICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgICAgICBcIlRoaXMgdW5pdCBvZiB3b3JrIHRhZyBzaG91bGQgbm90IGhhdmUgc2lkZS1lZmZlY3RzLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiXG4gICAgICAgICAgICAgICk7XG4gICAgICAgI
15852H1cbiAgICAgICAgaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlID0gZmliZXIuc2libGluZztcbiAgICAgICAgaWYgKG51bGwgIT09IGlzVmlld1RyYW5zaXRpb25FbGlnaWJsZSkge1xuICAgICAgICAgIGlzVmlld1RyYW5zaXRpb25FbGlnaWJsZS5yZXR1cm4gPSBmaWJlci5yZXR1cm47XG4gICAgICAgICAgbmV4dEVmZmVjdCA9IGlzVmlld1RyYW5zaXRpb25FbGlnaWJsZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBuZXh0RWZmZWN0ID0gZmliZXIucmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBjb21taXRMYXlvdXRFZmZlY3RPbkZpYmVyKGZpbmlzaGVkUm9vdCwgY3VycmVudCwgZmluaXNoZWRXb3JrKSB7XG4gICAgICB2YXIgcHJldkVmZmVjdFN0YXJ0ID0gcHVzaENvbXBvbmVudEVmZmVjdFN0YXJ0KCksXG4gICAgICAgIHByZXZFZmZlY3REdXJhdGlvbiA9IHB1c2hDb21wb25lbnRFZmZlY3REdXJhdGlvbigpLFxuICAgICAgICBwcmV2RWZmZWN0RXJyb3JzID0gcHVzaENvbXBvbmVudEVmZmVjdEVycm9ycygpLFxuICAgICAgICBwcmV2RWZmZWN0RGlkU3Bhd25VcGRhdGUgPSBwdXNoQ29tcG9uZW50RWZmZWN0RGlkU3Bhd25VcGRhdGUoKSxcbiAgICAgICAgZmxhZ3MgPSBmaW5pc2hlZFdvcmsuZmxhZ3M7XG4gICAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICBjYXNlIDExOlxuICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VMYXlvdXRFZmZlY3RzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBmbGFncyAmIDQgJiZcbiAgICAgICAgICAgIGNvbW1pdEhvb2tMYXlvdXRFZmZlY3RzKGZpbmlzaGVkV29yaywgTGF5b3V0IHwgSGFzRWZmZWN0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VMYXlvdXRFZmZlY3RzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBpZiAoZmxhZ3MgJiA0KVxuICAgICAgICAgICAgaWYgKCgoZmluaXNoZWRSb290ID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZSksIG51bGwgPT09IGN1cnJlbnQpKVxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsudHlwZS5kZWZhdWx0UHJvcHMgfHxcbiAgICAgICAgICAgICAgICBcInJlZlwiIGluIGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzIHx8XG4gICAgICAgICAgICAgICAgZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcyB8fFxuICAgICAgICAgICAgICAgIChmaW5pc2hlZFJvb3QucHJvcHMgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzICYmXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIkV4cGVjdGVkICVzIHByb3BzIHRvIG1hdGNoIG1lbW9pemVkIHByb3BzIGJlZm9yZSBjb21wb25lbnREaWRNb3VudC4gVGhpcyBtaWdodCBlaXRoZXIgYmUgYmVjYXVzZSBvZiBhIGJ1ZyBpbiBSZWFjdCwgb3IgYmVjYXVzZSBhIGNvbXBvbmVudCByZWFzc2lnbnMgaXRzIG93biBgdGhpcy5wcm9wc2AuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiLFxuICAgICAgICAgICAgICAgICAgICBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpbmlzaGVkV29yaykgfHwgXCJpbnN0YW5jZVwiXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkUm9vdC5zdGF0ZSAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUgJiZcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIFwiRXhwZWN0ZWQgJXMgc3RhdGUgdG8gbWF0Y2ggbWVtb2l6ZWQgc3RhdGUgYmVmb3JlIGNvbXBvbmVudERpZE1vdW50LiBUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlIGEgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIsXG4gICAgICAgICAgICAgICAgICAgIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCBcImluc3RhbmNlXCJcbiAgICAgICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICAgIHNob3VsZFByb2ZpbGUoZmluaXNoZWRXb3JrKVxuICAgICAgICAgICAgICAgICAgPyAoc3RhcnRFZmZlY3RUaW1lcigpLFxuICAgICAgICAgICAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgICAgICAgICAgY2FsbENvbXBvbmVudERpZE1vdW50SW5ERVYsXG4gICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkUm9vdFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICByZWNvcmRFZmZlY3REdXJhdGlvbigpKVxuICAgICAgICAgICAgICAgICAgOiBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgICAgICAgICAgY2FsbENvbXBvbmVudERpZE1vdW50SW5ERVYsXG4gICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkUm9vdFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBwcmV2UHJvcHMgPSByZXNvbHZlQ2xhc3NDb21wb25lbnRQcm9wcyhcbiAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsudHlwZSxcbiAgICAgICAgICAgICAgICBjdXJyZW50Lm1lbW9pemVkUHJvcHNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLnR5cGUuZGVmYXVsdFByb3BzIHx8XG4gICAgICAgICAgICAgICAgXCJyZWZcIiBpbiBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcyB8fFxuICAgICAgICAgICAgICAgIGRpZFdhcm5BYm91dFJlYXNzaWduaW5nUHJvcHMgfHxcbiAgICAgICAgICAgICAgICAoZmluaXNoZWRSb290LnByb3BzICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcyAmJlxuICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJFeHBlY3RlZCAlcyBwcm9wcyB0byBtYXRjaCBtZW1vaXplZCBwcm9wcyBiZWZvcmUgY29tcG9uZW50RGlkVXBkYXRlLiBUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlIGEgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnByb3BzYC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIsXG4gICAgICAgICAgICAgICAgICAgIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCBcImluc3RhbmNlXCJcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgZmluaXNoZWRSb290LnN0YXRlICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSAmJlxuICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJFeHBlY3RlZCAlcyBzdGF0ZSB0byBtYXRjaCBtZW1vaXplZCBzdGF0ZSBiZWZvcmUgY29tcG9uZW50RGlkVXBkYXRlLiBUaGlzIG1pZ2h0IGVpdGhlciBiZSBiZWNhdXNlIG9mIGEgYnVnIGluIFJlYWN0LCBvciBiZWNhdXNlIGEgY29tcG9uZW50IHJlYXNzaWducyBpdHMgb3duIGB0aGlzLnN0YXRlYC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCIsXG4gICAgICAgICAgICAgICAgICAgIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmluaXNoZWRXb3JrKSB8fCBcImluc3RhbmNlXCJcbiAgICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgICBzaG91bGRQcm9maWxlKGZpbmlzaGVkV29yaylcbiAgICAgICAgICAgICAgICA/IChzdGFydEVmZmVjdFRpbWVyKCksXG4gICAgICAgICAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICAgICAgICBjYWxsQ29tcG9uZW50RGlkVXBkYXRlSW5ERVYsXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgICAgICAgICBwcmV2UHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkUm9vdC5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZVxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgI
15852HJlY29yZEVmZmVjdER1cmF0aW9uKCkpXG4gICAgICAgICAgICAgICAgOiBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICAgICAgICBjYWxsQ29tcG9uZW50RGlkVXBkYXRlSW5ERVYsXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgICAgICAgICBwcmV2UHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkUm9vdC5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBmbGFncyAmIDY0ICYmIGNvbW1pdENsYXNzQ2FsbGJhY2tzKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgZmxhZ3MgJiA1MTIgJiYgc2FmZWx5QXR0YWNoUmVmKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBjdXJyZW50ID0gcHVzaE5lc3RlZEVmZmVjdER1cmF0aW9ucygpO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VMYXlvdXRFZmZlY3RzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBmbGFncyAmIDY0ICYmXG4gICAgICAgICAgICAoKGZsYWdzID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlKSwgbnVsbCAhPT0gZmxhZ3MpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBwcmV2UHJvcHMgPSBudWxsO1xuICAgICAgICAgICAgaWYgKG51bGwgIT09IGZpbmlzaGVkV29yay5jaGlsZClcbiAgICAgICAgICAgICAgc3dpdGNoIChmaW5pc2hlZFdvcmsuY2hpbGQudGFnKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAyNzpcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICBwcmV2UHJvcHMgPSBmaW5pc2hlZFdvcmsuY2hpbGQuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgcHJldlByb3BzID0gZmluaXNoZWRXb3JrLmNoaWxkLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcnVuV2l0aEZpYmVySW5ERVYoXG4gICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICAgIGNvbW1pdENhbGxiYWNrcyxcbiAgICAgICAgICAgICAgICBmbGFncyxcbiAgICAgICAgICAgICAgICBwcmV2UHJvcHNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBmaW5pc2hlZFJvb3QuZWZmZWN0RHVyYXRpb24gKz0gcG9wTmVzdGVkRWZmZWN0RHVyYXRpb25zKGN1cnJlbnQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgIG51bGwgPT09IGN1cnJlbnQgJiZcbiAgICAgICAgICAgIGZsYWdzICYgNCAmJlxuICAgICAgICAgICAgY29tbWl0SG9zdFNpbmdsZXRvbkFjcXVpc2l0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgIGNhc2UgMjY6XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTGF5b3V0RWZmZWN0cyhmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgaWYgKG51bGwgPT09IGN1cnJlbnQpXG4gICAgICAgICAgICBpZiAoZmxhZ3MgJiA0KSBjb21taXRIb3N0TW91bnQoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGZsYWdzICYgNjQpIHtcbiAgICAgICAgICAgICAgZmluaXNoZWRSb290ID0gZmluaXNoZWRXb3JrLnR5cGU7XG4gICAgICAgICAgICAgIGN1cnJlbnQgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICAgICAgcHJldlByb3BzID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICAgIGNvbW1pdEh5ZHJhdGVkSW5zdGFuY2UsXG4gICAgICAgICAgICAgICAgICBwcmV2UHJvcHMsXG4gICAgICAgICAgICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihcbiAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yay5yZXR1cm4sXG4gICAgICAgICAgICAgICAgICBlcnJvclxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICBmbGFncyAmIDUxMiAmJiBzYWZlbHlBdHRhY2hSZWYoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICBpZiAoZmxhZ3MgJiA0KSB7XG4gICAgICAgICAgICBmbGFncyA9IHB1c2hOZXN0ZWRFZmZlY3REdXJhdGlvbnMoKTtcbiAgICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VMYXlvdXRFZmZlY3RzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgIGZpbmlzaGVkUm9vdCA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgICAgICBmaW5pc2hlZFJvb3QuZWZmZWN0RHVyYXRpb24gKz0gYnViYmxlTmVzdGVkRWZmZWN0RHVyYXRpb25zKGZsYWdzKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJ1bldpdGhGaWJlckluREVWKFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICBjb21taXRQcm9maWxlcixcbiAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgICAgICBjb21taXRTdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgZmluaXNoZWRSb290LmVmZmVjdER1cmF0aW9uXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgI
15852H1cbiAgICAgICAgICB9IGVsc2UgcmVjdXJzaXZlbHlUcmF2ZXJzZUxheW91dEVmZmVjdHMoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDMxOlxuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VMYXlvdXRFZmZlY3RzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBmbGFncyAmIDQgJiZcbiAgICAgICAgICAgIGNvbW1pdEFjdGl2aXR5SHlkcmF0aW9uQ2FsbGJhY2tzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTGF5b3V0RWZmZWN0cyhmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgZmxhZ3MgJiA0ICYmXG4gICAgICAgICAgICBjb21taXRTdXNwZW5zZUh5ZHJhdGlvbkNhbGxiYWNrcyhmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgZmxhZ3MgJiA2NCAmJlxuICAgICAgICAgICAgKChmaW5pc2hlZFJvb3QgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSksXG4gICAgICAgICAgICBudWxsICE9PSBmaW5pc2hlZFJvb3QgJiZcbiAgICAgICAgICAgICAgKChmaW5pc2hlZFJvb3QgPSBmaW5pc2hlZFJvb3QuZGVoeWRyYXRlZCksXG4gICAgICAgICAgICAgIG51bGwgIT09IGZpbmlzaGVkUm9vdCAmJlxuICAgICAgICAgICAgICAgICgoZmxhZ3MgPSByZXRyeURlaHlkcmF0ZWRTdXNwZW5zZUJvdW5kYXJ5LmJpbmQoXG4gICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrXG4gICAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgICAgcmVnaXN0ZXJTdXNwZW5zZUluc3RhbmNlUmV0cnkoZmluaXNoZWRSb290LCBmbGFncykpKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgZmxhZ3MgPVxuICAgICAgICAgICAgbnVsbCAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUgfHwgb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuO1xuICAgICAgICAgIGlmICghZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciBuZXdPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID1cbiAgICAgICAgICAgICAgKG51bGwgIT09IGN1cnJlbnQgJiYgbnVsbCAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSB8fFxuICAgICAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuICAgICAgICAgICAgY3VycmVudCA9IG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbjtcbiAgICAgICAgICAgIHByZXZQcm9wcyA9IG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW47XG4gICAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gPSBmbGFncztcbiAgICAgICAgICAgIChvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gbmV3T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikgJiZcbiAgICAgICAgICAgICFwcmV2UHJvcHNcbiAgICAgICAgICAgICAgPyAoKGZsYWdzID0gSW5jbHVkZUhvc3RTaW5nbGV0b25zKSxcbiAgICAgICAgICAgICAgICAwICE9PSAoZmluaXNoZWRXb3JrLnN1YnRyZWVGbGFncyAmIDg3NzIpICYmXG4gICAgICAgICAgICAgICAgICAoZmxhZ3MgfD0gSW5jbHVkZVdvcmtJblByb2dyZXNzRWZmZWN0cyksXG4gICAgICAgICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZVJlYXBwZWFyTGF5b3V0RWZmZWN0cyhcbiAgICAgICAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICAgIGZsYWdzXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAoZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSAmJlxuICAgICAgICAgICAgICAgICAgMCA8PSBjb21wb25lbnRFZmZlY3RTdGFydFRpbWUgJiZcbiAgICAgICAgICAgICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0RW5kVGltZSAmJlxuICAgICAgICAgICAgICAgICAgMC4wNSA8IGNvbXBvbmVudEVmZmVjdEVuZFRpbWUgLSBjb21wb25lbnRFZmZlY3RTdGFydFRpbWUgJiZcbiAgICAgICAgICAgICAgICAgIGxvZ0NvbXBvbmVudFJlYXBwZWFyZWQoXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRFZmZlY3RFbmRUaW1lXG4gICAgICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgICA6IHJlY3Vyc2l2ZWx5VHJhdmVyc2VMYXlvdXRFZmZlY3RzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiA9IGN1cnJlbnQ7XG4gICAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gcHJldlByb3BzO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzMDpcbiAgICAgICAgICBmbGFncyAmIDE4ODc0MzY4ICYmIHRyYWNrTmFtZWRWaWV3VHJhbnNpdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VMYXlvdXRFZmZlY3RzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBmbGFncyAmIDUxMiAmJiBzYWZlbHlBdHRhY2hSZWYoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgIGZsYWdzICYgNTEyICYmIHNhZmVseUF0dGFjaFJlZihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VMYXlvdXRFZmZlY3RzKGZpbmlzaGVkUm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgIH1cbiAgICAgIChmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlICYmXG4gICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lICYmXG4gICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0RW5kVGltZSAmJlxuICAgICAgICAoKGNvbXBvbmVudEVmZmVjdFNwYXduZWRVcGRhdGUgfHwgMC4wNSA8IGNvbXBvbmVudEVmZmVjdER1cmF0aW9uKSAmJlxuICAgICAgICAgIGxvZ0NvbXBvbmVudEVmZmVjdChcbiAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgIGNvbXBvbmVudEVmZmVjdFN0YXJ0VGltZSxcbiAgICAgICAgICAgIGNvbXBvbmVudEVmZmVjdEVuZFRpbWUsXG4gICAgICAgICAgICBjb21wb25lbnRFZmZlY3REdXJhdGlvbixcbiAgICAgICAgICAgIGNvbXBvbmVudEVmZmVjdEVycm9yc1xuICAgICAgICAgICksXG4gICAgICAgIG51bGwgPT09IGZpbmlzaGVkV29yay5hbHRlcm5hdGUgJiZcbiAgICAgICAgICBudWxsICE9PSBmaW5pc2hlZFdvcmsucmV0dXJuICYmXG4gICAgICAgICAgbnVsbCAhPT0gZmluaXNoZWRXb3JrLnJldHVybi5hbHRlcm5hdGUgJiZcbiAgICAgICAgICAwLjA1IDwgY29tcG9uZW50RWZmZWN0RW5kVGltZSAtIGNvbXBvbmVudEVmZmVjdFN0YXJ0VGltZSAmJlxuICAgICAgICAgIChpc0h5ZHJhdGluZ1BhcmVudChcbiAgICAgICAgICAgIGZpbmlzaGVkV29yay5yZXR1cm4uYWx0ZXJuYXRlLFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLnJldHVyblxuICAgICAgICAgICkgfHxcbiAgICAgICAgICAgIGxvZ0NvbXBvbmVudFRyaWdnZXIoXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lLFxuICAgICAgICAgICAgICBjb21wb25lbnRFZmZlY3RFbmRUaW1lLFxuICAgICAgICAgICAgICBcIk1vdW50XCJcbiAgICAgICAgICAgICkpKTtcbiAgICAgIHBvcENvbXBvbmVudEVmZmVjdFN0YXJ0KHByZXZFZmZlY3RTdGFydCk7XG4gICAgICBwb3BDb21wb25lbnRFZmZlY3REdXJhdGlvbihwcmV2RWZmZWN0RHVyYXRpb24pO1xuICAgICAgY29tcG9uZW50RWZmZWN0RXJyb3JzID0gcHJldkVmZmVjdEVycm9ycztcbiAgICAgIGNvbXBvbmVudEVmZmVjdFNwYXduZWRVcGRhdGUgPSBwcmV2RWZmZWN0RGlkU3Bhd25VcGRhdGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhpZGVPclVuaGlkZUFsbENoaWxkcmVuKHBhcmVudEZpYmVyLCBpc0hpZGRlbikge1xuICAgICAgZm9yIChwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLmNoaWxkOyBudWxsICE9PSBwYXJlbnRGaWJlcjsgKVxuICAgICAgICBoaWRlT3JVbmhpZGVBbGxDaGlsZHJlbk9uRmliZXIocGFyZW50RmliZXIsIGlzSGlkZGVuKSxcbiAgICAgICAgICAocGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5zaWJsaW5nKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaGlkZU9yVW5oaWRlQWxsQ2hpbGRyZW5PbkZpYmVyKGZpYmVyLCBpc0hpZGRlbikge1xuICAgICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICBjYXNlIDI2OlxuICAgICAgICAgI
15852HRyeSB7XG4gICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBmaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgICBpc0hpZGRlblxuICAgICAgICAgICAgICA/IHJ1bldpdGhGaWJlckluREVWKGZpYmVyLCBoaWRlSW5zdGFuY2UsIGluc3RhbmNlKVxuICAgICAgICAgICAgICA6IHJ1bldpdGhGaWJlckluREVWKFxuICAgICAgICAgICAgICAgICAgZmliZXIsXG4gICAgICAgICAgICAgICAgICB1bmhpZGVJbnN0YW5jZSxcbiAgICAgICAgICAgICAgICAgIGZpYmVyLnN0YXRlTm9kZSxcbiAgICAgICAgICAgICAgICAgIGZpYmVyLm1lbW9pemVkUHJvcHNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGhpZGVPclVuaGlkZU5lYXJlc3RQb3J0YWxzKGZpYmVyLCBpc0hpZGRlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNjpcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlJGpzY29tcCQwID0gZmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgICAgaXNIaWRkZW5cbiAgICAgICAgICAgICAgPyBydW5XaXRoRmliZXJJbkRFVihmaWJlciwgaGlkZVRleHRJbnN0YW5jZSwgaW5zdGFuY2UkanNjb21wJDApXG4gICAgICAgICAgICAgIDogcnVuV2l0aEZpYmVySW5ERVYoXG4gICAgICAgICAgICAgICAgICBmaWJlcixcbiAgICAgICAgICAgICAgICAgIHVuaGlkZVRleHRJbnN0YW5jZSxcbiAgICAgICAgICAgICAgICAgIGluc3RhbmNlJGpzY29tcCQwLFxuICAgICAgICAgICAgICAgICAgZmliZXIubWVtb2l6ZWRQcm9wc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB2aWV3VHJhbnNpdGlvbk11dGF0aW9uQ29udGV4dCA9ICEwO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaWJlciwgZmliZXIucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE4OlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2Y
15852XIgaW5zdGFuY2UkanNjb21wJDEgPSBmaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgICBpc0hpZGRlblxuICAgICAgICAgICAgICA/IHJ1bldpdGhGaWJlckluREVWKFxuICAgICAgICAgICAgICAgICAgZmliZXIsXG4gICAgICAgICAgICAgICAgICBoaWRlRGVoeWRyYXRlZEJvdW5kYXJ5LFxuICAgICAgICAgICAgICAgICAgaW5zdGFuY2UkanNjb21wJDFcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDogcnVuV2l0aEZpYmVySW5ERVYoXG4gICAgICAgICAgICAgICAgICBmaWJlcixcbiAgICAgICAgICAgICAgICAgIHVuaGlkZURlaHlkcmF0ZWRCb3VuZGFyeSxcbiAgICAgICAgICAgICAgICAgIGZpYmVyLnN0YXRlTm9kZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpYmVyLCBmaWJlci5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjI6XG4gICAgICAgIGNhc2UgMjM6XG4gICAgICAgICAgbnVsbCA9PT0gZmliZXIubWVtb2l6ZWRTdGF0ZSAmJlxuICAgICAgICAgICAgaGlkZU9yVW5oaWRlQWxsQ2hpbGRyZW4oZmliZXIsIGlzSGlkZGVuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBoaWRlT3JVbmhpZGVBbGxDaGlsZHJlbihmaWJlciwgaXNIaWRkZW4pO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBoaWRlT3JVbmhpZGVOZWFyZXN0UG9ydGFscyhwYXJlbnRGaWJlciwgaXNIaWRkZW4kanNjb21wJDApIHtcbiAgICAgIGlmIChwYXJlbnRGaWJlci5zdWJ0cmVlRmxhZ3MgJiA2NzEwODg2NClcbiAgICAgICAgZm9yIChwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLmNoaWxkOyBudWxsICE9PSBwYXJlbnRGaWJlcjsgKSB7XG4gICAgICAgICAgYToge1xuICAgICAgICAgICAgdmFyIGZpYmVyID0gcGFyZW50RmliZXIsXG4gICAgICAgICAgICAgIGlzSGlkZGVuID0gaXNIaWRkZW4kanNjb21wJDA7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgaGlkZU9yVW5oaWRlQWxsQ2hpbGRyZW5PbkZpYmVyKGZpYmVyLCBpc0hpZGRlbik7XG4gICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICAgICAgICBudWxsID09PSBmaWJlci5tZW1vaXplZFN0YXRlICYmXG4gICAgICAgICAgICAgICAgICBoaWRlT3JVbmhpZGVOZWFyZXN0UG9ydGFscyhmaWJlciwgaXNIaWRkZW4pO1xuICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgaGlkZU9yVW5oaWRlTmVhcmVzdFBvcnRhbHMoZmliZXIsIGlzSGlkZGVuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5zaWJsaW5nO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzKGZpYmVyKSB7XG4gICAgICB2Y
15852XIgYWx0ZXJuYXRlID0gZmliZXIuYWx0ZXJuYXRlO1xuICAgICAgbnVsbCAhPT0gYWx0ZXJuYXRlICYmXG4gICAgICAgICgoZmliZXIuYWx0ZXJuYXRlID0gbnVsbCksIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzKGFsdGVybmF0ZSkpO1xuICAgICAgZmliZXIuY2hpbGQgPSBudWxsO1xuICAgICAgZmliZXIuZGVsZXRpb25zID0gbnVsbDtcbiAgICAgIGZpYmVyLnNpYmxpbmcgPSBudWxsO1xuICAgICAgNSA9PT0gZmliZXIudGFnICYmXG4gICAgICAgICgoYWx0ZXJuYXRlID0gZmliZXIuc3RhdGVOb2RlKSxcbiAgICAgICAgbnVsbCAhPT0gYWx0ZXJuYXRlICYmIGRldGFjaERlbGV0ZWRJbnN0YW5jZShhbHRlcm5hdGUpKTtcbiAgICAgIGZpYmVyLnN0YXRlTm9kZSA9IG51bGw7XG4gICAgICBmaWJlci5fZGVidWdPd25lciA9IG51bGw7XG4gICAgICBmaWJlci5yZXR1cm4gPSBudWxsO1xuICAgICAgZmliZXIuZGVwZW5kZW5jaWVzID0gbnVsbDtcbiAgICAgIGZpYmVyLm1lbW9pemVkUHJvcHMgPSBudWxsO1xuICAgICAgZmliZXIubWVtb2l6ZWRTdGF0ZSA9IG51bGw7XG4gICAgICBmaWJlci5wZW5kaW5nUHJvcHMgPSBudWxsO1xuICAgICAgZmliZXIuc3RhdGVOb2RlID0gbnVsbDtcbiAgICAgIGZpYmVyLnVwZGF0ZVF1ZXVlID0gbnVsbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhcbiAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICBwYXJlbnRcbiAgICApIHtcbiAgICAgIGZvciAocGFyZW50ID0gcGFyZW50LmNoaWxkOyBudWxsICE9PSBwYXJlbnQ7IClcbiAgICAgICAgY29tbWl0RGVsZXRpb25FZmZlY3RzT25GaWJlcihcbiAgICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgICAgbmVhcmVzdE1vdW50ZWRBbmNlc3RvcixcbiAgICAgICAgICBwYXJlbnRcbiAgICAgICAgKSxcbiAgICAgICAgICAocGFyZW50ID0gcGFyZW50LnNpYmxpbmcpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21taXREZWxldGlvbkVmZmVjdHNPbkZpYmVyKFxuICAgICAgZmluaXNoZWRSb290LFxuICAgICAgbmVhcmVzdE1vdW50ZWRBbmNlc3RvcixcbiAgICAgIGRlbGV0ZWRGaWJlclxuICAgICkge1xuICAgICAgaWYgKFxuICAgICAgICBpbmplY3RlZEhvb2sgJiZcbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJVbm1vdW50XG4gICAgICApXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJVbm1vdW50KHJlbmRlcmVySUQsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGhhc0xvZ2dlZEVycm9yIHx8XG4gICAgICAgICAgICAoKGhhc0xvZ2dlZEVycm9yID0gITApLFxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCJSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVvXCIsXG4gICAgICAgICAgICAgIGVyclxuICAgICAgICAgICAgKSk7XG4gICAgICAgIH1cbiAgICAgIHZhciBwcmV2RWZmZWN0U3RhcnQgPSBwdXNoQ29tcG9uZW50RWZmZWN0U3RhcnQoKSxcbiAgICAgICAgcHJldkVmZmVjdER1cmF0aW9uID0gcHVzaENvbXBvbmVudEVmZmVjdER1cmF0aW9uKCksXG4gICAgICAgIHByZXZFZmZlY3RFcnJvcnMgPSBwdXNoQ29tcG9uZW50RWZmZWN0RXJyb3JzKCksXG4gICAgICAgIHByZXZFZmZlY3REaWRTcGF3blVwZGF0ZSA9IHB1c2hDb21wb25lbnRFZmZlY3REaWRTcGF3blVwZGF0ZSgpO1xuICAgICAgc3dpdGNoIChkZWxldGVkRmliZXIudGFnKSB7XG4gICAgICAgIGNhc2UgMjY6XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiB8fFxuICAgICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhcbiAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICAgICAgICBkZWxldGVkRmliZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIGRlbGV0ZWRGaWJlci5tZW1vaXplZFN0YXRlXG4gICAgICAgICAgICA/IGRlbGV0ZWRGaWJlci5tZW1vaXplZFN0YXRlLmNvdW50LS1cbiAgICAgICAgICAgIDogZGVsZXRlZEZpYmVyLnN0YXRlTm9kZSAmJlxuICAgICAgICAgICAgICAhb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiAmJlxuICAgICAgICAgICAgICAoKGZpbmlzaGVkUm9vdCA9IGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGUpLFxuICAgICAgICAgICAgICBmaW5pc2hlZFJvb3QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChmaW5pc2hlZFJvb3QpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyNzpcbiAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuIHx8XG4gICAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoZGVsZXRlZEZpYmVyLCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yKTtcbiAgICAgICAgICBjb21taXRGcmFnbWVudEluc3RhbmNlRGVsZXRpb25FZmZlY3RzKGRlbGV0ZWRGaWJlcik7XG4gICAgICAgICAgdmFyIHByZXZIb3N0UGFyZW50ID0gaG9zdFBhcmVudCxcbiAgICAgICAgICAgIHByZXZIb3N0UGFyZW50SXNDb250YWluZXIgPSBob3N0UGFyZW50SXNDb250YWluZXI7XG4gICAgICAgICAgaXNTaW5nbGV0b25TY29wZShkZWxldGVkRmliZXIudHlwZSkgJiZcbiAgICAgICAgICAgICgoaG9zdFBhcmVudCA9IGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGUpLFxuICAgICAgICAgICAgKGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9ICExKSk7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhcbiAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICAgICAgICBkZWxldGVkRmliZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIHJ1bldpdGhGaWJlckluREVWKFxuICAgICAgICAgICAgZGVsZXRlZEZpYmVyLFxuICAgICAgICAgICAgcmVsZWFzZVNpbmdsZXRvbkluc3RhbmNlLFxuICAgICAgICAgICAgZGVsZXRlZEZpYmVyLnN0YXRlTm9kZSxcbiAgICAgICAgICAgIGRlbGV0ZWRGaWJlci50eXBlLFxuICAgICAgICAgICAgZGVsZXRlZEZpYmVyLm1lbW9pemVkUHJvcHNcbiAgICAgICAgICApO1xuICAgICAgICAgIGhvc3RQYXJlbnQgPSBwcmV2SG9zdFBhcmVudDtcbiAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSBwcmV2SG9zdFBhcmVudElzQ29udGFpbmVyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiB8fFxuICAgICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciksXG4gICAgICAgICAgICBjb21taXRGcmFnbWVudEluc3RhbmNlRGVsZXRpb25FZmZlY3RzKGRlbGV0ZWRGaWJlcik7XG4gICAgICAgIGNhc2UgNjpcbiAgICAgICAgICA2ID09PSBkZWxldGVkRmliZXIudGFnICYmXG4gICAgICAgICAgICBjb21taXRGcmFnbWVudEluc3RhbmNlRGVsZXRpb25FZmZlY3RzKGRlbGV0ZWRGaWJlcik7XG4gICAgICAgICAgcHJldkhvc3RQYXJlbnQgPSBob3N0UGFyZW50O1xuICAgICAgICAgI
15852HByZXZIb3N0UGFyZW50SXNDb250YWluZXIgPSBob3N0UGFyZW50SXNDb250YWluZXI7XG4gICAgICAgICAgaG9zdFBhcmVudCA9IG51bGw7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhcbiAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICAgICAgICBkZWxldGVkRmliZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIGhvc3RQYXJlbnQgPSBwcmV2SG9zdFBhcmVudDtcbiAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSBwcmV2SG9zdFBhcmVudElzQ29udGFpbmVyO1xuICAgICAgICAgIGlmIChudWxsICE9PSBob3N0UGFyZW50KVxuICAgICAgICAgICAgaWYgKGhvc3RQYXJlbnRJc0NvbnRhaW5lcilcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZWRGaWJlcixcbiAgICAgICAgICAgICAgICAgIHJlbW92ZUNoaWxkRnJvbUNvbnRhaW5lcixcbiAgICAgICAgICAgICAgICAgIGhvc3RQYXJlbnQsXG4gICAgICAgICAgICAgICAgICBkZWxldGVkRmliZXIuc3RhdGVOb2RlXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICh2aWV3VHJhbnNpdGlvbk11dGF0aW9uQ29udGV4dCA9ICEwKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZWRGaWJlcixcbiAgICAgICAgICAgICAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICAgICAgICAgICAgICBlcnJvclxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZWRGaWJlcixcbiAgICAgICAgICAgICAgICAgIHJlbW92ZUNoaWxkLFxuICAgICAgICAgICAgICAgICAgaG9zdFBhcmVudCxcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGVcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgKHZpZXdUcmFuc2l0aW9uTXV0YXRpb25Db250ZXh0ID0gITApO1xuICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKFxuICAgICAgICAgICAgICAgICAgZGVsZXRlZEZpYmVyLFxuICAgICAgICAgICAgICAgICAgbmVhcmVzdE1vdW50ZWRBbmNlc3RvcixcbiAgICAgICAgICAgICAgICAgIGVycm9yXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE4OlxuICAgICAgICAgIG51bGwgIT09IGhvc3RQYXJlbnQgJiZcbiAgICAgICAgICAgIChob3N0UGFyZW50SXNDb250YWluZXJcbiAgICAgICAgICAgICAgPyAoKGZpbmlzaGVkUm9vdCA9IGhvc3RQYXJlbnQpLFxuICAgICAgICAgICAgICAgIGNsZWFySHlkcmF0aW9uQm91bmRhcnkoXG4gICAgICAgICAgICAgICAgICA5ID09PSBmaW5pc2hlZFJvb3Qubm9kZVR5cGVcbiAgICAgICAgICAgICAgICAgICAgPyBmaW5pc2hlZFJvb3QuYm9keVxuICAgICAgICAgICAgICAgICAgICA6IFwiSFRNTFwiID09PSBmaW5pc2hlZFJvb3Qubm9kZU5hbWVcbiAgICAgICAgICAgICAgICAgICAgICA/IGZpbmlzaGVkUm9vdC5vd25lckRvY3VtZW50LmJvZHlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGVcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHJldHJ5SWZCbG9ja2VkT24oZmluaXNoZWRSb290KSlcbiAgICAgICAgICAgICAgOiBjbGVhckh5ZHJhdGlvbkJvdW5kYXJ5KGhvc3RQYXJlbnQsIGRlbGV0ZWRGaWJlci5zdGF0ZU5vZGUpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHByZXZIb3N0UGFyZW50ID0gaG9zdFBhcmVudDtcbiAgICAgICAgICBwcmV2SG9zdFBhcmVudElzQ29udGFpbmVyID0gaG9zdFBhcmVudElzQ29udGFpbmVyO1xuICAgICAgICAgIGhvc3RQYXJlbnQgPSBkZWxldGVkRmliZXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gITA7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhcbiAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICAgICAgICBkZWxldGVkRmliZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIGhvc3RQYXJlbnQgPSBwcmV2SG9zdFBhcmVudDtcbiAgICAgICAgICBob3N0UGFyZW50SXNDb250YWluZXIgPSBwcmV2SG9zdFBhcmVudElzQ29udGFpbmVyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgIGNhc2UgMTE6XG4gICAgICAgIGNhc2UgMTQ6XG4gICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KFxuICAgICAgICAgICAgSW5zZXJ0aW9uLFxuICAgICAgICAgICAgZGVsZXRlZEZpYmVyLFxuICAgICAgICAgICAgbmVhcmVzdE1vdW50ZWRBbmNlc3RvclxuICAgICAgICAgICk7XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiB8fFxuICAgICAgICAgICAgY29tbWl0SG9va0xheW91dFVubW91bnRFZmZlY3RzKFxuICAgICAgICAgICAgICBkZWxldGVkRmliZXIsXG4gICAgICAgICAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICAgICAgICAgIExheW91dFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgbmVhcmVzdE1vdW50ZWRBbmNlc3RvcixcbiAgICAgICAgICAgIGRlbGV0ZWRGaWJlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuIHx8XG4gICAgICAgICAgICAoc2FmZWx5RGV0YWNoUmVmKGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciksXG4gICAgICAgICAgICAocHJldkhvc3RQYXJlbnQgPSBkZWxldGVkRmliZXIuc3RhdGVOb2RlKSxcbiAgICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHByZXZIb3N0UGFyZW50LmNvbXBvbmVudFdpbGxVbm1vdW50ICYmXG4gICAgICAgICAgICAgI
15852HNhZmVseUNhbGxDb21wb25lbnRXaWxsVW5tb3VudChcbiAgICAgICAgICAgICAgICBkZWxldGVkRmliZXIsXG4gICAgICAgICAgICAgICAgbmVhcmVzdE1vdW50ZWRBbmNlc3RvcixcbiAgICAgICAgICAgICAgICBwcmV2SG9zdFBhcmVudFxuICAgICAgICAgICAgICApKTtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGVsZXRpb25FZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgbmVhcmVzdE1vdW50ZWRBbmNlc3RvcixcbiAgICAgICAgICAgIGRlbGV0ZWRGaWJlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjE6XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhcbiAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICAgICAgICBkZWxldGVkRmliZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPVxuICAgICAgICAgICAgKHByZXZIb3N0UGFyZW50ID0gb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbikgfHxcbiAgICAgICAgICAgIG51bGwgIT09IGRlbGV0ZWRGaWJlci5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoXG4gICAgICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgICAgICBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLFxuICAgICAgICAgICAgZGVsZXRlZEZpYmVyXG4gICAgICAgICAgKTtcbiAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gcHJldkhvc3RQYXJlbnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzA6XG4gICAgICAgICAgZGVsZXRlZEZpYmVyLmZsYWdzICYgMTg4NzQzNjggJiZcbiAgICAgICAgICAgIHVudHJhY2tOYW1lZFZpZXdUcmFuc2l0aW9uKGRlbGV0ZWRGaWJlcik7XG4gICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhcbiAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICAgICAgICBkZWxldGVkRmliZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiB8fFxuICAgICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGRlbGV0ZWRGaWJlciwgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvcik7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURlbGV0aW9uRWZmZWN0cyhcbiAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICAgICAgICBkZWxldGVkRmliZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEZWxldGlvbkVmZmVjdHMoXG4gICAgICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgICAgICBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLFxuICAgICAgICAgICAgZGVsZXRlZEZpYmVyXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIChkZWxldGVkRmliZXIubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlICYmXG4gICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lICYmXG4gICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0RW5kVGltZSAmJlxuICAgICAgICAoY29tcG9uZW50RWZmZWN0U3Bhd25lZFVwZGF0ZSB8fCAwLjA1IDwgY29tcG9uZW50RWZmZWN0RHVyYXRpb24pICYmXG4gICAgICAgIGxvZ0NvbXBvbmVudEVmZmVjdChcbiAgICAgICAgICBkZWxldGVkRmliZXIsXG4gICAgICAgICAgY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lLFxuICAgICAgICAgIGNvbXBvbmVudEVmZmVjdEVuZFRpbWUsXG4gICAgICAgICAgY29tcG9uZW50RWZmZWN0RHVyYXRpb24sXG4gICAgICAgICAgY29tcG9uZW50RWZmZWN0RXJyb3JzXG4gICAgICAgICk7XG4gICAgICBwb3BDb21wb25lbnRFZmZlY3RTdGFydChwcmV2RWZmZWN0U3RhcnQpO1xuICAgICAgcG9wQ29tcG9uZW50RWZmZWN0RHVyYXRpb24ocHJldkVmZmVjdER1cmF0aW9uKTtcbiAgICAgIGNvbXBvbmVudEVmZmVjdEVycm9ycyA9IHByZXZFZmZlY3RFcnJvcnM7XG4gICAgICBjb21wb25lbnRFZmZlY3RTcGF3bmVkVXBkYXRlID0gcHJldkVmZmVjdERpZFNwYXduVXBkYXRlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21taXRBY3Rpdml0eUh5ZHJhdGlvbkNhbGxiYWNrcyhmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yaykge1xuICAgICAgaWYgKFxuICAgICAgICBudWxsID09PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSAmJlxuICAgICAgICAoKGZpbmlzaGVkUm9vdCA9IGZpbmlzaGVkV29yay5hbHRlcm5hdGUpLFxuICAgICAgICBudWxsICE9PSBmaW5pc2hlZFJvb3QgJiZcbiAgICAgICAgICAoKGZpbmlzaGVkUm9vdCA9IGZpbmlzaGVkUm9vdC5tZW1vaXplZFN0YXRlKSwgbnVsbCAhPT0gZmluaXNoZWRSb290KSlcbiAgICAgICkge1xuICAgICAgICBmaW5pc2hlZFJvb3QgPSBmaW5pc2hlZFJvb3QuZGVoeWRyYXRlZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgIGNvbW1pdEh5ZHJhdGVkQWN0aXZpdHlJbnN0YW5jZSxcbiAgICAgICAgICAgIGZpbmlzaGVkUm9vdFxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gY29tbWl0U3VzcGVuc2VIeWRyYXRpb25DYWxsYmFja3MoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmspIHtcbiAgICAgIGlmIChcbiAgICAgICAgbnVsbCA9PT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUgJiZcbiAgICAgICAgKChmaW5pc2hlZFJvb3QgPSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlKSxcbiAgICAgICAgbnVsbCAhPT0gZmluaXNoZWRSb290ICYmXG4gICAgICAgICAgKChmaW5pc2hlZFJvb3QgPSBmaW5pc2hlZFJvb3QubWVtb2l6ZWRTdGF0ZSksXG4gICAgICAgICAgbnVsbCAhPT0gZmluaXNoZWRSb290ICYmXG4gICAgICAgICAgICAoKGZpbmlzaGVkUm9vdCA9IGZpbmlzaGVkUm9vdC5kZWh5ZHJhdGVkKSwgbnVsbCAhPT0gZmluaXNoZWRSb290KSkpXG4gICAgICApXG4gICAgICAgI
15852HRyeSB7XG4gICAgICAgICAgcnVuV2l0aEZpYmVySW5ERVYoXG4gICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICBjb21taXRIeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2UsXG4gICAgICAgICAgICBmaW5pc2hlZFJvb3RcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldFJldHJ5Q2FjaGUoZmluaXNoZWRXb3JrKSB7XG4gICAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICAgICAgY2FzZSAzMTpcbiAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICB2YXIgcmV0cnlDYWNoZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgICAgbnVsbCA9PT0gcmV0cnlDYWNoZSAmJlxuICAgICAgICAgICAgKHJldHJ5Q2FjaGUgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlID0gbmV3IFBvc3NpYmx5V2Vha1NldCgpKTtcbiAgICAgICAgICByZXR1cm4gcmV0cnlDYWNoZTtcbiAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKGZpbmlzaGVkV29yayA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGUpLFxuICAgICAgICAgICAgKHJldHJ5Q2FjaGUgPSBmaW5pc2hlZFdvcmsuX3JldHJ5Q2FjaGUpLFxuICAgICAgICAgICAgbnVsbCA9PT0gcmV0cnlDYWNoZSAmJlxuICAgICAgICAgICAgICAocmV0cnlDYWNoZSA9IGZpbmlzaGVkV29yay5fcmV0cnlDYWNoZSA9IG5ldyBQb3NzaWJseVdlYWtTZXQoKSksXG4gICAgICAgICAgICByZXRyeUNhY2hlXG4gICAgICAgICAgKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgIFwiVW5leHBlY3RlZCBTdXNwZW5zZSBoYW5kbGVyIHRhZyAoXCIgK1xuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsudGFnICtcbiAgICAgICAgICAgICAgXCIpLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LlwiXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gYXR0YWNoU3VzcGVuc2VSZXRyeUxpc3RlbmVycyhmaW5pc2hlZFdvcmssIHdha2VhYmxlcykge1xuICAgICAgdmFyIHJldHJ5Q2FjaGUgPSBnZXRSZXRyeUNhY2hlKGZpbmlzaGVkV29yayk7XG4gICAgICB3YWtlYWJsZXMuZm9yRWFjaChmdW5jdGlvbiAod2FrZWFibGUpIHtcbiAgICAgICAgaWYgKCFyZXRyeUNhY2hlLmhhcyh3YWtlYWJsZSkpIHtcbiAgICAgICAgICByZXRyeUNhY2hlLmFkZCh3YWtlYWJsZSk7XG4gICAgICAgICAgaWYgKGlzRGV2VG9vbHNQcmVzZW50KVxuICAgICAgICAgICAgaWYgKG51bGwgIT09IGluUHJvZ3Jlc3NMYW5lcyAmJiBudWxsICE9PSBpblByb2dyZXNzUm9vdClcbiAgICAgICAgICAgICAgcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhpblByb2dyZXNzUm9vdCwgaW5Qcm9ncmVzc0xhbmVzKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJFeHBlY3RlZCBmaW5pc2hlZCByb290IGFuZCBsYW5lcyB0byBiZSBzZXQuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuXCJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB2Y
15852XIgcmV0cnkgPSByZXNvbHZlUmV0cnlXYWtlYWJsZS5iaW5kKG51bGwsIGZpbmlzaGVkV29yaywgd2FrZWFibGUpO1xuICAgICAgICAgIHdha2VhYmxlLnRoZW4ocmV0cnksIHJldHJ5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMoXG4gICAgICByb290JGpzY29tcCQwLFxuICAgICAgcGFyZW50RmliZXIsXG4gICAgICBsYW5lc1xuICAgICkge1xuICAgICAgdmFyIGRlbGV0aW9ucyA9IHBhcmVudEZpYmVyLmRlbGV0aW9ucztcbiAgICAgIGlmIChudWxsICE9PSBkZWxldGlvbnMpXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVsZXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIHJvb3QgPSByb290JGpzY29tcCQwLFxuICAgICAgICAgICAgcmV0dXJuRmliZXIgPSBwYXJlbnRGaWJlcixcbiAgICAgICAgICAgIGRlbGV0ZWRGaWJlciA9IGRlbGV0aW9uc1tpXSxcbiAgICAgICAgICAgIHByZXZFZmZlY3RTdGFydCA9IHB1c2hDb21wb25lbnRFZmZlY3RTdGFydCgpLFxuICAgICAgICAgICAgcGFyZW50ID0gcmV0dXJuRmliZXI7XG4gICAgICAgICAgYTogZm9yICg7IG51bGwgIT09IHBhcmVudDsgKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBhcmVudC50YWcpIHtcbiAgICAgICAgICAgICAgY2FzZSAyNzpcbiAgICAgICAgICAgICAgICBpZiAoaXNTaW5nbGV0b25TY29wZShwYXJlbnQudHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgIGhvc3RQYXJlbnQgPSBwYXJlbnQuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gITE7XG4gICAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgIGhvc3RQYXJlbnQgPSBwYXJlbnQuc3RhdGVOb2RlO1xuICAgICAgICAgICAgICAgIGhvc3RQYXJlbnRJc0NvbnRhaW5lciA9ICExO1xuICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgIGhvc3RQYXJlbnQgPSBwYXJlbnQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gITA7XG4gICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5yZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChudWxsID09PSBob3N0UGFyZW50KVxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgIFwiRXhwZWN0ZWQgdG8gZmluZCBhIGhvc3QgcGFyZW50LiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGNvbW1pdERlbGV0aW9uRWZmZWN0c09uRmliZXIocm9vdCwgcmV0dXJuRmliZXIsIGRlbGV0ZWRGaWJlcik7XG4gICAgICAgICAgaG9zdFBhcmVudCA9IG51bGw7XG4gICAgICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gITE7XG4gICAgICAgICAgKGRlbGV0ZWRGaWJlci5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUgJiZcbiAgICAgICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lICYmXG4gICAgICAgICAgICAwIDw9IGNvbXBvbmVudEVmZmVjdEVuZFRpbWUgJiZcbiAgICAgICAgICAgIDAuMDUgPCBjb21wb25lbnRFZmZlY3RFbmRUaW1lIC0gY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lICYmXG4gICAgICAgICAgICBsb2dDb21wb25lbnRUcmlnZ2VyKFxuICAgICAgICAgICAgICBkZWxldGVkRmliZXIsXG4gICAgICAgICAgICAgIGNvbXBvbmVudEVmZmVjdFN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgY29tcG9uZW50RWZmZWN0RW5kVGltZSxcbiAgICAgICAgICAgICAgXCJVbm1vdW50XCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgcG9wQ29tcG9uZW50RWZmZWN0U3RhcnQocHJldkVmZmVjdFN0YXJ0KTtcbiAgICAgICAgICByb290ID0gZGVsZXRlZEZpYmVyO1xuICAgICAgICAgIHJldHVybkZpYmVyID0gcm9vdC5hbHRlcm5hdGU7XG4gICAgICAgICAgbnVsbCAhPT0gcmV0dXJuRmliZXIgJiYgKHJldHVybkZpYmVyLnJldHVybiA9IG51bGwpO1xuICAgICAgICAgIHJvb3QucmV0dXJuID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgaWYgKHBhcmVudEZpYmVyLnN1YnRyZWVGbGFncyAmIDEzODg2KVxuICAgICAgICBmb3IgKHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuY2hpbGQ7IG51bGwgIT09IHBhcmVudEZpYmVyOyApXG4gICAgICAgICAgY29tbWl0TXV0YXRpb25FZmZlY3RzT25GaWJlcihwYXJlbnRGaWJlciwgcm9vdCRqc2NvbXAkMCwgbGFuZXMpLFxuICAgICAgICAgICAgKHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuc2libGluZyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbW1pdE11dGF0aW9uRWZmZWN0c09uRmliZXIoZmluaXNoZWRXb3JrLCByb290LCBsYW5lcykge1xuICAgICAgdmFyIHByZXZFZmZlY3RTdGFydCA9IHB1c2hDb21wb25lbnRFZmZlY3RTdGFydCgpLFxuICAgICAgICBwcmV2RWZmZWN0RHVyYXRpb24gPSBwdXNoQ29tcG9uZW50RWZmZWN0RHVyYXRpb24oKSxcbiAgICAgICAgcHJldkVmZmVjdEVycm9ycyA9IHB1c2hDb21wb25lbnRFZmZlY3RFcnJvcnMoKSxcbiAgICAgICAgcHJldkVmZmVjdERpZFNwYXduVXBkYXRlID0gcHVzaENvbXBvbmVudEVmZmVjdERpZFNwYXduVXBkYXRlKCksXG4gICAgICAgIGN1cnJlbnQgPSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlLFxuICAgICAgICBmbGFncyA9IGZpbmlzaGVkV29yay5mbGFncztcbiAgICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgIGNhc2UgMTE6XG4gICAgICAgIGNhc2UgMTQ6XG4gICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZmxhZ3MgJiA0ICYmXG4gICAgICAgICAgICAoKGN1cnJlbnQgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWUpLFxuICAgICAgICAgICAgKGN1cnJlbnQgPSBudWxsICE9PSBjdXJyZW50ID8gY3VycmVudC5ldmVudHMgOiBudWxsKSxcbiAgICAgICAgICAgIG51bGwgIT09IGN1cnJlbnQpXG4gICAgICAgICAgKVxuICAgICAgICAgICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IGN1cnJlbnQubGVuZ3RoOyBpaSsrKSB7XG4gICAgICAgICAgICAgI
15852HZhciBfZXZlbnRQYXlsb2FkcyRpaTIgPSBjdXJyZW50W2lpXTtcbiAgICAgICAgICAgICAgX2V2ZW50UGF5bG9hZHMkaWkyLnJlZi5pbXBsID0gX2V2ZW50UGF5bG9hZHMkaWkyLm5leHRJbXBsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrLCBsYW5lcyk7XG4gICAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgZmxhZ3MgJiA0ICYmXG4gICAgICAgICAgICAoY29tbWl0SG9va0VmZmVjdExpc3RVbm1vdW50KFxuICAgICAgICAgICAgICBJbnNlcnRpb24gfCBIYXNFZmZlY3QsXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLnJldHVyblxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGNvbW1pdEhvb2tFZmZlY3RMaXN0TW91bnQoSW5zZXJ0aW9uIHwgSGFzRWZmZWN0LCBmaW5pc2hlZFdvcmspLFxuICAgICAgICAgICAgY29tbWl0SG9va0xheW91dFVubW91bnRFZmZlY3RzKFxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yay5yZXR1cm4sXG4gICAgICAgICAgICAgIExheW91dCB8IEhhc0VmZmVjdFxuICAgICAgICAgICAgKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yaywgbGFuZXMpO1xuICAgICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIGZsYWdzICYgNTEyICYmXG4gICAgICAgICAgICAob2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiB8fFxuICAgICAgICAgICAgICBudWxsID09PSBjdXJyZW50IHx8XG4gICAgICAgICAgICAgIHNhZmVseURldGFjaFJlZihjdXJyZW50LCBjdXJyZW50LnJldHVybikpO1xuICAgICAgICAgIGZsYWdzICYgNjQgJiZcbiAgICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiAmJlxuICAgICAgICAgICAgKChyb290ID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlKSxcbiAgICAgICAgICAgIG51bGwgIT09IHJvb3QgJiZcbiAgICAgICAgICAgICAgKChsYW5lcyA9IHJvb3QuY2FsbGJhY2tzKSxcbiAgICAgICAgICAgICAgbnVsbCAhPT0gbGFuZXMgJiZcbiAgICAgICAgICAgICAgICAoKGZsYWdzID0gcm9vdC5zaGFyZWQuaGlkZGVuQ2FsbGJhY2tzKSxcbiAgICAgICAgICAgICAgICAocm9vdC5zaGFyZWQuaGlkZGVuQ2FsbGJhY2tzID1cbiAgICAgICAgICAgICAgICAgIG51bGwgPT09IGZsYWdzID8gbGFuZXMgOiBmbGFncy5jb25jYXQobGFuZXMpKSkpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyNjpcbiAgICAgICAgICBpaSA9IGN1cnJlbnRIb2lzdGFibGVSb290O1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrLCBsYW5lcyk7XG4gICAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgZmxhZ3MgJiA1MTIgJiZcbiAgICAgICAgICAgIChvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuIHx8XG4gICAgICAgICAgICAgIG51bGwgPT09IGN1cnJlbnQgfHxcbiAgICAgICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGN1cnJlbnQsIGN1cnJlbnQucmV0dXJuKSk7XG4gICAgICAgICAgaWYgKGZsYWdzICYgNClcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgKChmbGFncyA9IG51bGwgIT09IGN1cnJlbnQgPyBjdXJyZW50Lm1lbW9pemVkU3RhdGUgOiBudWxsKSxcbiAgICAgICAgICAgICAgKGxhbmVzID0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUpLFxuICAgICAgICAgICAgICBudWxsID09PSBjdXJyZW50KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAobnVsbCA9PT0gbGFuZXMpXG4gICAgICAgICAgICAgICAgaWYgKG51bGwgPT09IGZpbmlzaGVkV29yay5zdGF0ZU5vZGUpXG4gICAgICAgICAgICAgICAgICBpZiAob2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuKVxuICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlID0gY3JlYXRlSG9pc3RhYmxlSW5zdGFuY2UoXG4gICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMsXG4gICAgICAgICAgICAgICAgICAgICAgcm9vdC5jb250YWluZXJJbmZvLFxuICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29ya1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICByb290ID0gZmluaXNoZWRXb3JrLnR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgbGFuZXMgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcztcbiAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IGlpLm93bmVyRG9jdW1lbnQgfHwgaWk7XG4gICAgICAgICAgICAgICAgICAgICAgYjogc3dpdGNoIChyb290KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGl0bGVcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGZsYWdzLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGl0bGVcIilbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY3VycmVudCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRbaW50ZXJuYWxIb2lzdGFibGVNYXJrZXJdIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFtpbnRlcm5hbEluc3RhbmNlS2V5XSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubmFtZXNwYWNlVVJJID09PSBTVkdfTkFNRVNQQUNFIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5oYXNBdHRyaWJ1dGUoXCJpdGVtcHJvcFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnQgPSBmbGFncy5jcmVhdGVFbGVtZW50KHJvb3QpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLmhlYWQuaW5zZXJ0QmVmb3JlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncy5xdWVyeVNlbGVjdG9yKFwiaGVhZCA+IHRpdGxlXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbml0aWFsUHJvcGVydGllcyhjdXJyZW50LCByb290LCBsYW5lcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRbaW50ZXJuYWxJbnN0YW5jZUtleV0gPSBmaW5pc2hlZFdvcms7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtOb2RlQXNIb2lzdGFibGUoY3VycmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgI
15852HJvb3QgPSBjdXJyZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImxpbmtcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpaSA9IGdldEh5ZHJhdGFibGVIb2lzdGFibGVDYWNoZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGlua1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJocmVmXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuZ2V0KHJvb3QgKyAobGFuZXMuaHJlZiB8fCBcIlwiKSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2V2ZW50UGF5bG9hZHMkaWkyID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ldmVudFBheWxvYWRzJGlpMiA8IGlpLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ldmVudFBheWxvYWRzJGlpMisrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGN1cnJlbnQgPSBpaVtfZXZlbnRQYXlsb2FkcyRpaTJdKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChudWxsID09IGxhbmVzLmhyZWYgfHwgXCJcIiA9PT0gbGFuZXMuaHJlZlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGxhbmVzLmhyZWYpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5nZXRBdHRyaWJ1dGUoXCJyZWxcIikgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSBsYW5lcy5yZWwgPyBudWxsIDogbGFuZXMucmVsKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuZ2V0QXR0cmlidXRlKFwidGl0bGVcIikgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSBsYW5lcy50aXRsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBsYW5lcy50aXRsZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmdldEF0dHJpYnV0ZShcImNyb3Nzb3JpZ2luXCIpID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bGwgPT0gbGFuZXMuY3Jvc3NPcmlnaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbGFuZXMuY3Jvc3NPcmlnaW4pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpLnNwbGljZShfZXZlbnRQYXlsb2FkcyRpaTIsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gZmxhZ3MuY3JlYXRlRWxlbWVudChyb290KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5pdGlhbFByb3BlcnRpZXMoY3VycmVudCwgcm9vdCwgbGFuZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncy5oZWFkLmFwcGVuZENoaWxkKGN1cnJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJtZXRhXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWkgPSBnZXRIeWRyYXRhYmxlSG9pc3RhYmxlQ2FjaGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm1ldGFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29udGVudFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLmdldChyb290ICsgKGxhbmVzLmNvbnRlbnQgfHwgXCJcIikpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ldmVudFBheWxvYWRzJGlpMiA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZXZlbnRQYXlsb2FkcyRpaTIgPCBpaS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZXZlbnRQYXlsb2FkcyRpaTIrK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjdXJyZW50ID0gaWlbX2V2ZW50UGF5bG9hZHMkaWkyXSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZXMuY29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbnRlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmdldEF0dHJpYnV0ZShcImNvbnRlbnRcIikgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bGwgPT0gbGFuZXMuY29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiXCIgKyBsYW5lcy5jb250ZW50KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuZ2V0QXR0cmlidXRlKFwibmFtZVwiKSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChudWxsID09IGxhbmVzLm5hbWUgPyBudWxsIDogbGFuZXMubmFtZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmdldEF0dHJpYnV0ZShcInByb3BlcnR5XCIpID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bGwgPT0gbGFuZXMucHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbGFuZXMucHJvcGVydHkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5nZXRBdHRyaWJ1dGUoXCJodHRwLWVxdWl2XCIpID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bGwgPT0gbGFuZXMuaHR0cEVxdWl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGxhbmVzLmh0dHBFcXVpdikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmdldEF0dHJpYnV0ZShcImNoYXJzZXRcIikgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSBsYW5lcy5jaGFyU2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGxhbmVzLmNoYXJTZXQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpLnNwbGljZShfZXZlbnRQYXlsb2FkcyRpaTIsIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gZmxhZ3MuY3JlYXRlRWxlbWVudChyb290KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5pdGlhbFByb3BlcnRpZXMoY3VycmVudCwgcm9vdCwgbGFuZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncy5oZWFkLmFwcGVuZENoaWxkKGN1cnJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgI
15852HRocm93IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnZXROb2Rlc0ZvclR5cGUgZW5jb3VudGVyZWQgYSB0eXBlIGl0IGRpZCBub3QgZXhwZWN0OiBcIicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXCIuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50W2ludGVybmFsSW5zdGFuY2VLZXldID0gZmluaXNoZWRXb3JrO1xuICAgICAgICAgICAgICAgICAgICAgIG1hcmtOb2RlQXNIb2lzdGFibGUoY3VycmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgcm9vdCA9IGN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLnN0YXRlTm9kZSA9IHJvb3Q7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuIHx8XG4gICAgICAgICAgICAgICAgICAgIG1vdW50SG9pc3RhYmxlKFxuICAgICAgICAgICAgICAgICAgICAgIGlpLFxuICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yay50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yay5zdGF0ZU5vZGVcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yay5zdGF0ZU5vZGUgPSBhY3F1aXJlUmVzb3VyY2UoXG4gICAgICAgICAgICAgICAgICBpaSxcbiAgICAgICAgICAgICAgICAgIGxhbmVzLFxuICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICBmbGFncyAhPT0gbGFuZXNcbiAgICAgICAgICAgICAgICA/IChudWxsID09PSBmbGFnc1xuICAgICAgICAgICAgICAgICAgICA/ICgocm9vdCA9IGN1cnJlbnQuc3RhdGVOb2RlKSxcbiAgICAgICAgICAgICAgICAgICAgICBudWxsID09PSByb290IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICByb290LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocm9vdCkpXG4gICAgICAgICAgICAgICAgICAgIDogZmxhZ3MuY291bnQtLSxcbiAgICAgICAgICAgICAgICAgIG51bGwgPT09IGxhbmVzXG4gICAgICAgICAgICAgICAgICAgID8gb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuIHx8XG4gICAgICAgICAgICAgICAgICAgICAgbW91bnRIb2lzdGFibGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBpaSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yay50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLnN0YXRlTm9kZVxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgOiBhY3F1aXJlUmVzb3VyY2UoaWksIGxhbmVzLCBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcykpXG4gICAgICAgICAgICAgICAgOiBudWxsID09PSBsYW5lcyAmJlxuICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZSAmJlxuICAgICAgICAgICAgICAgICAgY29tbWl0SG9zdFVwZGF0ZShcbiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZW1vaXplZFByb3BzXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrLCBsYW5lcyk7XG4gICAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgZmxhZ3MgJiA1MTIgJiZcbiAgICAgICAgICAgIChvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuIHx8XG4gICAgICAgICAgICAgIG51bGwgPT09IGN1cnJlbnQgfHxcbiAgICAgICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGN1cnJlbnQsIGN1cnJlbnQucmV0dXJuKSk7XG4gICAgICAgICAgbnVsbCAhPT0gY3VycmVudCAmJlxuICAgICAgICAgICAgZmxhZ3MgJiA0ICYmXG4gICAgICAgICAgICBjb21taXRIb3N0VXBkYXRlKFxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzLFxuICAgICAgICAgICAgICBjdXJyZW50Lm1lbW9pemVkUHJvcHNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBpaSA9IG9mZnNjcmVlbkRpcmVjdFBhcmVudElzSGlkZGVuO1xuICAgICAgICAgIG9mZnNjcmVlbkRpcmVjdFBhcmVudElzSGlkZGVuID0gITE7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmssIGxhbmVzKTtcbiAgICAgICAgICBvZmZzY3JlZW5EaXJlY3RQYXJlbnRJc0hpZGRlbiA9IGlpO1xuICAgICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIGZsYWdzICYgNTEyICYmXG4gICAgICAgICAgICAob2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiB8fFxuICAgICAgICAgICAgICBudWxsID09PSBjdXJyZW50IHx8XG4gICAgICAgICAgICAgIHNhZmVseURldGFjaFJlZihjdXJyZW50LCBjdXJyZW50LnJldHVybikpO1xuICAgICAgICAgIGlmIChmaW5pc2hlZFdvcmsuZmxhZ3MgJiAzMikge1xuICAgICAgICAgICAgcm9vdCA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihmaW5pc2hlZFdvcmssIHJlc2V0VGV4dENvbnRlbnQsIHJvb3QpLFxuICAgICAgICAgICAgICAgICh2aWV3VHJhbnNpdGlvbk11dGF0aW9uQ29udGV4dCA9ICEwKTtcbiAgICAgICAgICAgI
15852H0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBmbGFncyAmIDQgJiZcbiAgICAgICAgICAgIG51bGwgIT0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZSAmJlxuICAgICAgICAgICAgKChyb290ID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMpLFxuICAgICAgICAgICAgY29tbWl0SG9zdFVwZGF0ZShcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICByb290LFxuICAgICAgICAgICAgICBudWxsICE9PSBjdXJyZW50ID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogcm9vdFxuICAgICAgICAgICAgKSk7XG4gICAgICAgICAgZmxhZ3MgJiAxMDI0ICYmXG4gICAgICAgICAgICAoKG5lZWRzRm9ybVJlc2V0ID0gITApLFxuICAgICAgICAgICAgXCJmb3JtXCIgIT09IGZpbmlzaGVkV29yay50eXBlICYmXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgXCJVbmV4cGVjdGVkIGhvc3QgY29tcG9uZW50IHR5cGUuIEV4cGVjdGVkIGEgZm9ybS4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC5cIlxuICAgICAgICAgICAgICApKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrLCBsYW5lcyk7XG4gICAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgaWYgKGZsYWdzICYgNCkge1xuICAgICAgICAgICAgaWYgKG51bGwgPT09IGZpbmlzaGVkV29yay5zdGF0ZU5vZGUpXG4gICAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAgIFwiVGhpcyBzaG91bGQgaGF2ZSBhIHRleHQgbm9kZSBpbml0aWFsaXplZC4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgcm9vdCA9IGZpbmlzaGVkV29yay5tZW1vaXplZFByb3BzO1xuICAgICAgICAgICAgbGFuZXMgPSBudWxsICE9PSBjdXJyZW50ID8gY3VycmVudC5tZW1vaXplZFByb3BzIDogcm9vdDtcbiAgICAgICAgICAgIGZsYWdzID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJ1bldpdGhGaWJlckluREVWKFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICBjb21taXRUZXh0VXBkYXRlLFxuICAgICAgICAgICAgICAgIGZsYWdzLFxuICAgICAgICAgICAgICAgIGxhbmVzLFxuICAgICAgICAgICAgICAgIHJvb3RcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAodmlld1RyYW5zaXRpb25NdXRhdGlvbkNvbnRleHQgPSAhMCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBpaSA9IHB1c2hOZXN0ZWRFZmZlY3REdXJhdGlvbnMoKTtcbiAgICAgICAgICB2aWV3VHJhbnNpdGlvbk11dGF0aW9uQ29udGV4dCA9ICExO1xuICAgICAgICAgIHRhZ0NhY2hlcyA9IG51bGw7XG4gICAgICAgICAgX2V2ZW50UGF5bG9hZHMkaWkyID0gY3VycmVudEhvaXN0YWJsZVJvb3Q7XG4gICAgICAgICAgY3VycmVudEhvaXN0YWJsZVJvb3QgPSBnZXRIb2lzdGFibGVSb290KHJvb3QuY29udGFpbmVySW5mbyk7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmssIGxhbmVzKTtcbiAgICAgICAgICBjdXJyZW50SG9pc3RhYmxlUm9vdCA9IF9ldmVudFBheWxvYWRzJGlpMjtcbiAgICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBmbGFncyAmIDQgJiZcbiAgICAgICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiZcbiAgICAgICAgICAgIGN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWRcbiAgICAgICAgICApXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgICAgY29tbWl0SHlkcmF0ZWRDb250YWluZXIsXG4gICAgICAgICAgICAgICAgcm9vdC5jb250YWluZXJJbmZvXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBuZWVkc0Zvcm1SZXNldCAmJlxuICAgICAgICAgICAgKChuZWVkc0Zvcm1SZXNldCA9ICExKSwgcmVjdXJzaXZlbHlSZXNldEZvcm1zKGZpbmlzaGVkV29yaykpO1xuICAgICAgICAgIHJvb3QuZWZmZWN0RHVyYXRpb24gKz0gcG9wTmVzdGVkRWZmZWN0RHVyYXRpb25zKGlpKTtcbiAgICAgICAgICB2aWV3VHJhbnNpdGlvbk11dGF0aW9uQ29udGV4dCA9ICExO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgZmxhZ3MgPSBvZmZzY3JlZW5EaXJlY3RQYXJlbnRJc0hpZGRlbjtcbiAgICAgICAgICBvZmZzY3JlZW5EaXJlY3RQYXJlbnRJc0hpZGRlbiA9IG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbjtcbiAgICAgICAgICBjdXJyZW50ID0gcHVzaE11dGF0aW9uQ29udGV4dCgpO1xuICAgICAgICAgIGlpID0gY3VycmVudEhvaXN0YWJsZVJvb3Q7XG4gICAgICAgICAgY3VycmVudEhvaXN0YWJsZVJvb3QgPSBnZXRIb2lzdGFibGVSb290KFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLnN0YXRlTm9kZS5jb250YWluZXJJbmZvXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yaywgbGFuZXMpO1xuICAgICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIGN1cnJlbnRIb2lzdGFibGVSb290ID0gaWk7XG4gICAgICAgICAgdmlld1RyYW5zaXRpb25NdXRhdGlvbkNvbnRleHQgJiZcbiAgICAgICAgICAgIGluVXBkYXRlVmlld1RyYW5zaXRpb24gJiZcbiAgICAgICAgICAgIChyb290Vmlld1RyYW5zaXRpb25BZmZlY3RlZCA9ICEwKTtcbiAgICAgICAgICB2aWV3VHJhbnNpdGlvbk11dGF0aW9uQ29udGV4dCA9IGN1cnJlbnQ7XG4gICAgICAgICAgb2Zmc2NyZWVuRGlyZWN0UGFyZW50SXNIaWRkZW4gPSBmbGFncztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICBmbGFncyA9IHB1c2hOZXN0ZWRFZmZlY3REdXJhdGlvbnMoKTtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yaywgbGFuZXMpO1xuICAgICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIGZpbmlzaGVkV29yay5zdGF0ZU5vZGUuZWZmZWN0RHVyYXRpb24gKz1cbiAgICAgICAgICAgIGJ1YmJsZU5lc3RlZEVmZmVjdER1cmF0aW9ucyhmbGFncyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzE6XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmssIGxhbmVzKTtcbiAgICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBmbGFncyAmIDQgJiZcbiAgICAgICAgICAgICgocm9vdCA9IGZpbmlzaGVkV29yay51cGRhdGV
15852RdWV1ZSksXG4gICAgICAgICAgICBudWxsICE9PSByb290ICYmXG4gICAgICAgICAgICAgICgoZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlID0gbnVsbCksXG4gICAgICAgICAgICAgIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrLCByb290KSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrLCBsYW5lcyk7XG4gICAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgZmluaXNoZWRXb3JrLmNoaWxkLmZsYWdzICYgODE5MiAmJlxuICAgICAgICAgICAgKG51bGwgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlKSAhPT1cbiAgICAgICAgICAgICAgKG51bGwgIT09IGN1cnJlbnQgJiYgbnVsbCAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlKSAmJlxuICAgICAgICAgICAgKGdsb2JhbE1vc3RSZWNlbnRGYWxsYmFja1RpbWUgPSBub3ckMSgpKTtcbiAgICAgICAgICBmbGFncyAmIDQgJiZcbiAgICAgICAgICAgICgocm9vdCA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZSksXG4gICAgICAgICAgICBudWxsICE9PSByb290ICYmXG4gICAgICAgICAgICAgICgoZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlID0gbnVsbCksXG4gICAgICAgICAgICAgIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrLCByb290KSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgIGlpID0gbnVsbCAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgX2V2ZW50UGF5bG9hZHMkaWkyID1cbiAgICAgICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiYgbnVsbCAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIHZhciBwcmV2T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuLFxuICAgICAgICAgICAgcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuLFxuICAgICAgICAgICAgX3ByZXZPZmZzY3JlZW5EaXJlY3RQYXJlbnRJc0hpZGRlbjIgPSBvZmZzY3JlZW5EaXJlY3RQYXJlbnRJc0hpZGRlbjtcbiAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gPSBwcmV2T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuIHx8IGlpO1xuICAgICAgICAgIG9mZnNjcmVlbkRpcmVjdFBhcmVudElzSGlkZGVuID1cbiAgICAgICAgICAgIF9wcmV2T2Zmc2NyZWVuRGlyZWN0UGFyZW50SXNIaWRkZW4yIHx8IGlpO1xuICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPVxuICAgICAgICAgICAgcHJldk9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gfHwgX2V2ZW50UGF5bG9hZHMkaWkyO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrLCBsYW5lcyk7XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9IHByZXZPZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuO1xuICAgICAgICAgIG9mZnNjcmVlbkRpcmVjdFBhcmVudElzSGlkZGVuID0gX3ByZXZPZmZzY3JlZW5EaXJlY3RQYXJlbnRJc0hpZGRlbjI7XG4gICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gcHJldk9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbjtcbiAgICAgICAgICBfZXZlbnRQYXlsb2FkcyRpaTIgJiZcbiAgICAgICAgICAgICFpaSAmJlxuICAgICAgICAgICAgIXByZXZPZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gJiZcbiAgICAgICAgICAgICFwcmV2T2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiAmJlxuICAgICAgICAgICAgKGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUgJiZcbiAgICAgICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lICYmXG4gICAgICAgICAgICAwIDw9IGNvbXBvbmVudEVmZmVjdEVuZFRpbWUgJiZcbiAgICAgICAgICAgIDAuMDUgPCBjb21wb25lbnRFZmZlY3RFbmRUaW1lIC0gY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lICYmXG4gICAgICAgICAgICBsb2dDb21wb25lbnRSZWFwcGVhcmVkKFxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgIGNvbXBvbmVudEVmZmVjdFN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgY29tcG9uZW50RWZmZWN0RW5kVGltZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBmbGFncyAmIDgxOTIgJiZcbiAgICAgICAgICAgICgocm9vdCA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGUpLFxuICAgICAgICAgICAgKHJvb3QuX3Zpc2liaWxpdHkgPSBpaVxuICAgICAgICAgICAgICA/IHJvb3QuX3Zpc2liaWxpdHkgJiB+T2Zmc2NyZWVuVmlzaWJsZVxuICAgICAgICAgICAgICA6IHJvb3QuX3Zpc2liaWxpdHkgfCBPZmZzY3JlZW5WaXNpYmxlKSxcbiAgICAgICAgICAgICFpaSB8fFxuICAgICAgICAgICAgICBudWxsID09PSBjdXJyZW50IHx8XG4gICAgICAgICAgICAgIF9ldmVudFBheWxvYWRzJGlpMiB8fFxuICAgICAgICAgICAgICBvZmZzY3JlZW5TdWJ0cmVlSXNIaWRkZW4gfHxcbiAgICAgICAgICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiB8fFxuICAgICAgICAgICAgICAoKHJvb3QgPSBJbmNsdWRlSG9zdFNpbmdsZXRvbnMpLFxuICAgICAgICAgICAgICAobGFuZXMgPSBfZXZlbnRQYXlsb2FkcyRpaTIgfHwgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiksXG4gICAgICAgICAgICAgIChjdXJyZW50ID0gb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuKSxcbiAgICAgICAgICAgICAgKF9ldmVudFBheWxvYWRzJGlpMiA9IG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4pLFxuICAgICAgICAgICAgICAob2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gaWkgfHwgb2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuKSxcbiAgICAgICAgICAgICAgKG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gPSBsYW5lcyksXG4gICAgICAgICAgICAgI
15852HJlY3Vyc2l2ZWx5VHJhdmVyc2VEaXNhcHBlYXJMYXlvdXRFZmZlY3RzKGZpbmlzaGVkV29yaywgcm9vdCksXG4gICAgICAgICAgICAgIChmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlICYmXG4gICAgICAgICAgICAgICAgMCA8PSBjb21wb25lbnRFZmZlY3RTdGFydFRpbWUgJiZcbiAgICAgICAgICAgICAgICAwIDw9IGNvbXBvbmVudEVmZmVjdEVuZFRpbWUgJiZcbiAgICAgICAgICAgICAgICAwLjA1IDwgY29tcG9uZW50RWZmZWN0RW5kVGltZSAtIGNvbXBvbmVudEVmZmVjdFN0YXJ0VGltZSAmJlxuICAgICAgICAgICAgICAgIGxvZ0NvbXBvbmVudFRyaWdnZXIoXG4gICAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgICAgICBjb21wb25lbnRFZmZlY3RTdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgICBjb21wb25lbnRFZmZlY3RFbmRUaW1lLFxuICAgICAgICAgICAgICAgICAgXCJEaXNjb25uZWN0XCJcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAob2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gY3VycmVudCksXG4gICAgICAgICAgICAgIChvZmZzY3JlZW5TdWJ0cmVlV2FzSGlkZGVuID0gX2V2ZW50UGF5bG9hZHMkaWkyKSksXG4gICAgICAgICAgICAoIWlpICYmIG9mZnNjcmVlbkRpcmVjdFBhcmVudElzSGlkZGVuKSB8fFxuICAgICAgICAgICAgICBoaWRlT3JVbmhpZGVBbGxDaGlsZHJlbihmaW5pc2hlZFdvcmssIGlpKSk7XG4gICAgICAgICAgZmxhZ3MgJiA0ICYmXG4gICAgICAgICAgICAoKHJvb3QgPSBmaW5pc2hlZFdvcmsudXBkYXRlUXVldWUpLFxuICAgICAgICAgICAgbnVsbCAhPT0gcm9vdCAmJlxuICAgICAgICAgICAgICAoKGxhbmVzID0gcm9vdC5yZXRyeVF1ZXVlKSxcbiAgICAgICAgICAgICAgbnVsbCAhPT0gbGFuZXMgJiZcbiAgICAgICAgICAgICAgICAoKHJvb3QucmV0cnlRdWV1ZSA9IG51bGwpLFxuICAgICAgICAgICAgICAgIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrLCBsYW5lcykpKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTk6XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZU11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmssIGxhbmVzKTtcbiAgICAgICAgICBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBmbGFncyAmIDQgJiZcbiAgICAgICAgICAgICgocm9vdCA9IGZpbmlzaGVkV29yay51cGRhdGVRdWV1ZSksXG4gICAgICAgICAgICBudWxsICE9PSByb290ICYmXG4gICAgICAgICAgICAgICgoZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlID0gbnVsbCksXG4gICAgICAgICAgICAgIGF0dGFjaFN1c3BlbnNlUmV0cnlMaXN0ZW5lcnMoZmluaXNoZWRXb3JrLCByb290KSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDMwOlxuICAgICAgICAgIGZsYWdzICYgNTEyICYmXG4gICAgICAgICAgICAob2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiB8fFxuICAgICAgICAgICAgICBudWxsID09PSBjdXJyZW50IHx8XG4gICAgICAgICAgICAgIHNhZmVseURldGFjaFJlZihjdXJyZW50LCBjdXJyZW50LnJldHVybikpO1xuICAgICAgICAgIGZsYWdzID0gcHVzaE11dGF0aW9uQ29udGV4dCgpO1xuICAgICAgICAgIGlpID0gaW5VcGRhdGVWaWV3VHJhbnNpdGlvbjtcbiAgICAgICAgICBfZXZlbnRQYXlsb2FkcyRpaTIgPSAobGFuZXMgJiAzMzU1NDQwNjQpID09PSBsYW5lcztcbiAgICAgICAgICBwcmV2T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHM7XG4gICAgICAgICAgaW5VcGRhdGVWaWV3VHJhbnNpdGlvbiA9XG4gICAgICAgICAgICBfZXZlbnRQYXlsb2FkcyRpaTIgJiZcbiAgICAgICAgICAgIFwibm9uZVwiICE9PVxuICAgICAgICAgICAgICBnZXRWaWV3VHJhbnNpdGlvbkNsYXNzTmFtZShcbiAgICAgICAgICAgICAgICBwcmV2T2Zmc2NyZWVuU3VidHJlZUlzSGlkZGVuLmRlZmF1bHQsXG4gICAgICAgICAgICAgICAgcHJldk9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbi51cGRhdGVcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yaywgbGFuZXMpO1xuICAgICAgICAgIGNvbW1pdFJlY29uY2lsaWF0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIF9ldmVudFBheWxvYWRzJGlpMiAmJlxuICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudCAmJlxuICAgICAgICAgICAgdmlld1RyYW5zaXRpb25NdXRhdGlvbkNvbnRleHQgJiZcbiAgICAgICAgICAgIChmaW5pc2hlZFdvcmsuZmxhZ3MgfD0gNCk7XG4gICAgICAgICAgaW5VcGRhdGVWaWV3VHJhbnNpdGlvbiA9IGlpO1xuICAgICAgICAgIHZpZXdUcmFuc2l0aW9uTXV0YXRpb25Db250ZXh0ID0gZmxhZ3M7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjE6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgICBmbGFncyAmIDUxMiAmJlxuICAgICAgICAgICAgKG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gfHxcbiAgICAgICAgICAgICAgbnVsbCA9PT0gY3VycmVudCB8fFxuICAgICAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoY3VycmVudCwgY3VycmVudC5yZXR1cm4pKSxcbiAgICAgICAgICAgIGN1cnJlbnQgJiZcbiAgICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudC5zdGF0ZU5vZGUgJiZcbiAgICAgICAgICAgICAgKGN1cnJlbnQuc3RhdGVOb2RlLl9mcmFnbWVudEZpYmVyID0gZmluaXNoZWRXb3JrKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yaywgbGFuZXMpLFxuICAgICAgICAgICAgY29tbWl0UmVjb25jaWxpYXRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG4gICAgICB9XG4gICAgICAoZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSAmJlxuICAgICAgICAwIDw9IGNvbXBvbmVudEVmZmVjdFN0YXJ0VGltZSAmJlxuICAgICAgICAwIDw9IGNvbXBvbmVudEVmZmVjdEVuZFRpbWUgJiZcbiAgICAgICAgKChjb21wb25lbnRFZmZlY3RTcGF3bmVkVXBkYXRlIHx8IDAuMDUgPCBjb21wb25lbnRFZmZlY3REdXJhdGlvbikgJiZcbiAgICAgICAgICBsb2dDb21wb25lbnRFZmZlY3QoXG4gICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICBjb21wb25lbnRFZmZlY3RTdGFydFRpbWUsXG4gICAgICAgICAgICBjb21wb25lbnRFZmZlY3RFbmRUaW1lLFxuICAgICAgICAgICAgY29tcG9uZW50RWZmZWN0RHVyYXRpb24sXG4gICAgICAgICAgICBjb21wb25lbnRFZmZlY3RFcnJvcnNcbiAgICAgICAgICApLFxuICAgICAgICBudWxsID09PSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlICYmXG4gICAgICAgICAgbnVsbCAhPT0gZmluaXNoZWRXb3JrLnJldHVybiAmJlxuICAgICAgICAgIG51bGwgIT09IGZpbmlzaGVkV29yay5yZXR1cm4uYWx0ZXJuYXRlICYmXG4gICAgICAgICAgMC4wNSA8IGNvbXBvbmVudEVmZmVjdEVuZFRpbWUgLSBjb21wb25lbnRFZmZlY3RTdGFydFRpbWUgJiZcbiAgICAgICAgICAoaXNIeWRyYXRpbmdQYXJlbnQoXG4gICAgICAgICAgICBmaW5pc2hlZFdvcmsucmV0dXJuLmFsdGVybmF0ZSxcbiAgICAgICAgICAgIGZpbmlzaGVkV29yay5yZXR1cm5cbiAgICAgICAgICApIHx8XG4gICAgICAgICAgICBsb2dDb21wb25lbnRUcmlnZ2VyKFxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgIGNvbXBvbmVudEVmZmVjdFN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgY29tcG9uZW50RWZmZWN0RW5kVGltZSxcbiAgICAgICAgICAgICAgXCJNb3VudFwiXG4gICAgICAgICAgICApKSk7XG4gICAgICBwb3BDb21wb25lbnRFZmZlY3RTdGFydChwcmV2RWZmZWN0U3RhcnQpO1xuICAgICAgcG9wQ29tcG9uZW50RWZmZWN0RHVyYXRpb24ocHJldkVmZmVjdER1cmF0aW9uKTtcbiAgICAgIGNvbXBvbmVudEVmZmVjdEVycm9ycyA9IHByZXZFZmZlY3RFcnJvcnM7XG4gICAgICBjb21wb25lbnRFZmZlY3RTcGF3bmVkVXBkYXRlID0gcHJldkVmZmVjdERpZFNwYXduVXBkYXRlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21taXRSZWNvbmNpbGlhdGlvbkVmZmVjdHMoZmluaXNoZWRXb3JrKSB7XG4gICAgICB2Y
15852XIgZmxhZ3MgPSBmaW5pc2hlZFdvcmsuZmxhZ3M7XG4gICAgICBpZiAoZmxhZ3MgJiAyKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcnVuV2l0aEZpYmVySW5ERVYoZmluaXNoZWRXb3JrLCBjb21taXRQbGFjZW1lbnQsIGZpbmlzaGVkV29yayk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgZmluaXNoZWRXb3JrLmZsYWdzICY9IC0zO1xuICAgICAgfVxuICAgICAgZmxhZ3MgJiA0MDk2ICYmIChmaW5pc2hlZFdvcmsuZmxhZ3MgJj0gLTQwOTcpO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWN1cnNpdmVseVJlc2V0Rm9ybXMocGFyZW50RmliZXIpIHtcbiAgICAgIGlmIChwYXJlbnRGaWJlci5zdWJ0cmVlRmxhZ3MgJiAxMDI0KVxuICAgICAgICBmb3IgKHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuY2hpbGQ7IG51bGwgIT09IHBhcmVudEZpYmVyOyApIHtcbiAgICAgICAgICB2YXIgZmliZXIgPSBwYXJlbnRGaWJlcjtcbiAgICAgICAgICByZWN1cnNpdmVseVJlc2V0Rm9ybXMoZmliZXIpO1xuICAgICAgICAgIDUgPT09IGZpYmVyLnRhZyAmJlxuICAgICAgICAgICAgZmliZXIuZmxhZ3MgJiAxMDI0ICYmXG4gICAgICAgICAgICAoKGZpYmVyID0gZmliZXIuc3RhdGVOb2RlKSxcbiAgICAgICAgICAgIChfZW5hYmxlZCA9ICEwKSxcbiAgICAgICAgICAgIGZpYmVyLnJlc2V0KCksXG4gICAgICAgICAgICAoX2VuYWJsZWQgPSAhMSkpO1xuICAgICAgICAgIHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuc2libGluZztcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiByZWN1cnNpdmVseVRyYXZlcnNlQWZ0ZXJNdXRhdGlvbkVmZmVjdHMocm9vdCwgcGFyZW50RmliZXIpIHtcbiAgICAgIGlmIChwYXJlbnRGaWJlci5zdWJ0cmVlRmxhZ3MgJiA5MjcwKVxuICAgICAgICBmb3IgKHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuY2hpbGQ7IG51bGwgIT09IHBhcmVudEZpYmVyOyApXG4gICAgICAgICAgY29tbWl0QWZ0ZXJNdXRhdGlvbkVmZmVjdHNPbkZpYmVyKHBhcmVudEZpYmVyLCByb290KSxcbiAgICAgICAgICAgIChwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLnNpYmxpbmcpO1xuICAgICAgZWxzZSBtZWFzdXJlTmVzdGVkVmlld1RyYW5zaXRpb25zKHBhcmVudEZpYmVyLCAhMSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbW1pdEFmdGVyTXV0YXRpb25FZmZlY3RzT25GaWJlcihmaW5pc2hlZFdvcmssIHJvb3QpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gZmluaXNoZWRXb3JrLmFsdGVybmF0ZTtcbiAgICAgIGlmIChudWxsID09PSBjdXJyZW50KSBjb21taXRFbnRlclZpZXdUcmFuc2l0aW9ucyhmaW5pc2hlZFdvcmssICExKTtcbiAgICAgIGVsc2VcbiAgICAgICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgcm9vdFZpZXdUcmFuc2l0aW9uTmFtZUNhbmNlbGVkID0gdmlld1RyYW5zaXRpb25Db250ZXh0Q2hhbmdlZCA9ICExO1xuICAgICAgICAgICAgcHVzaFZpZXdUcmFuc2l0aW9uQ2FuY2VsYWJsZVNjb3BlKCk7XG4gICAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlQWZ0ZXJNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgIGlmICghdmlld1RyYW5zaXRpb25Db250ZXh0Q2hhbmdlZCAmJiAhcm9vdFZpZXdUcmFuc2l0aW9uQWZmZWN0ZWQpIHtcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrID0gdmlld1RyYW5zaXRpb25DYW5jZWxhYmxlQ2hpbGRyZW47XG4gICAgICAgICAgICAgIGlmIChudWxsICE9PSBmaW5pc2hlZFdvcmspXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaW5pc2hlZFdvcmsubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBmaW5pc2hlZFdvcmtbaV07XG4gICAgICAgICAgICAgICAgICB2Y
15852XIgb2xkTmFtZSA9IGZpbmlzaGVkV29ya1tpICsgMV07XG4gICAgICAgICAgICAgICAgICByZXN0b3JlVmlld1RyYW5zaXRpb25OYW1lKGN1cnJlbnQsIGZpbmlzaGVkV29ya1tpICsgMl0pO1xuICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICBudWxsICE9PSBjdXJyZW50ICYmXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuYW5pbWF0ZShcbiAgICAgICAgICAgICAgICAgICAgICB7IG9wYWNpdHk6IFswLCAwXSwgcG9pbnRlckV2ZW50czogW1wibm9uZVwiLCBcIm5vbmVcIl0gfSxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw6IFwiZm9yd2FyZHNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHBzZXVkb0VsZW1lbnQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiOjp2aWV3LXRyYW5zaXRpb24tZ3JvdXAoXCIgKyBvbGROYW1lICsgXCIpXCJcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsgPSByb290LmNvbnRhaW5lckluZm87XG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yayA9XG4gICAgICAgICAgICAgICAgOSA9PT0gZmluaXNoZWRXb3JrLm5vZGVUeXBlXG4gICAgICAgICAgICAgICAgICA/IGZpbmlzaGVkV29yay5kb2N1bWVudEVsZW1lbnRcbiAgICAgICAgICAgICAgICAgIDogZmluaXNoZWRXb3JrLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICAgICAgICBudWxsICE9PSBmaW5pc2hlZFdvcmsgJiZcbiAgICAgICAgICAgICAgICBcIlwiID09PSBmaW5pc2hlZFdvcmsuc3R5bGUudmlld1RyYW5zaXRpb25OYW1lICYmXG4gICAgICAgICAgICAgICAgKChmaW5pc2hlZFdvcmsuc3R5bGUudmlld1RyYW5zaXRpb25OYW1lID0gXCJub25lXCIpLFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yay5hbmltYXRlKFxuICAgICAgICAgICAgICAgICAgeyBvcGFjaXR5OiBbMCwgMF0sIHBvaW50ZXJFdmVudHM6IFtcIm5vbmVcIiwgXCJub25lXCJdIH0sXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAwLFxuICAgICAgICAgICAgICAgICAgICBmaWxsOiBcImZvcndhcmRzXCIsXG4gICAgICAgICAgICAgICAgICAgIHBzZXVkb0VsZW1lbnQ6IFwiOjp2aWV3LXRyYW5zaXRpb24tZ3JvdXAocm9vdClcIlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLmFuaW1hdGUoXG4gICAgICAgICAgICAgICAgICB7IHdpZHRoOiBbMCwgMF0sIGhlaWdodDogWzAsIDBdIH0sXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAwLFxuICAgICAgICAgICAgICAgICAgICBmaWxsOiBcImZvcndhcmRzXCIsXG4gICAgICAgICAgICAgICAgICAgIHBzZXVkb0VsZW1lbnQ6IFwiOjp2aWV3LXRyYW5zaXRpb25cIlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgICByb290Vmlld1RyYW5zaXRpb25OYW1lQ2FuY2VsZWQgPSAhMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZpZXdUcmFuc2l0aW9uQ2FuY2VsYWJsZUNoaWxkcmVuID0gbnVsbDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VBZnRlck11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgaSA9IHZpZXdUcmFuc2l0aW9uQ29udGV4dENoYW5nZWQ7XG4gICAgICAgICAgICB2aWV3VHJhbnNpdGlvbkNvbnRleHRDaGFuZ2VkID0gITE7XG4gICAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlQWZ0ZXJNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICAgIHZpZXdUcmFuc2l0aW9uQ29udGV4dENoYW5nZWQgJiYgKHJvb3RWaWV3VHJhbnNpdGlvbkFmZmVjdGVkID0gITApO1xuICAgICAgICAgICAgdmlld1RyYW5zaXRpb25Db250ZXh0Q2hhbmdlZCA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgICAgbnVsbCA9PT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUgJiZcbiAgICAgICAgICAgICAgKG51bGwgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZVxuICAgICAgICAgICAgICAgID8gY29tbWl0RW50ZXJWaWV3VHJhbnNpdGlvbnMoZmluaXNoZWRXb3JrLCAhMSlcbiAgICAgICAgICAgICAgICA6IHJlY3Vyc2l2ZWx5VHJhdmVyc2VBZnRlck11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMzA6XG4gICAgICAgICAgICBpID0gdmlld1RyYW5zaXRpb25Db250ZXh0Q2hhbmdlZDtcbiAgICAgICAgICAgIG9sZE5hbWUgPSBwdXNoVmlld1RyYW5zaXRpb25DYW5jZWxhYmxlU2NvcGUoKTtcbiAgICAgICAgICAgIHZpZXdUcmFuc2l0aW9uQ29udGV4dENoYW5nZWQgPSAhMTtcbiAgICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VBZnRlck11dGF0aW9uRWZmZWN0cyhyb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgICAgdmlld1RyYW5zaXRpb25Db250ZXh0Q2hhbmdlZCAmJiAoZmluaXNoZWRXb3JrLmZsYWdzIHw9IDQpO1xuICAgICAgICAgICAgdmFyIHByb3BzID0gZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMsXG4gICAgICAgICAgICAgIHN0YXRlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICAgIHJvb3QgPSBnZXRWaWV3VHJhbnNpdGlvbk5hbWUocHJvcHMsIHN0YXRlKTtcbiAgICAgICAgICAgIHN0YXRlID0gZ2V0Vmlld1RyYW5zaXRpb25OYW1lKGN1cnJlbnQubWVtb2l6ZWRQcm9wcywgc3RhdGUpO1xuICAgICAgICAgICAgdmFyIGNsYXNzTmFtZSA9IGdldFZpZXdUcmFuc2l0aW9uQ2xhc3NOYW1lKFxuICAgICAgICAgICAgICBwcm9wcy5kZWZh
15852dWx0LFxuICAgICAgICAgICAgICBwcm9wcy51cGRhdGVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBcIm5vbmVcIiA9PT0gY2xhc3NOYW1lXG4gICAgICAgICAgICAgID8gKHJvb3QgPSAhMSlcbiAgICAgICAgICAgICAgOiAoKHByb3BzID0gY3VycmVudC5tZW1vaXplZFN0YXRlKSxcbiAgICAgICAgICAgICAgICAoY3VycmVudC5tZW1vaXplZFN0YXRlID0gbnVsbCksXG4gICAgICAgICAgICAgICAgKGN1cnJlbnQgPSBmaW5pc2hlZFdvcmsuY2hpbGQpLFxuICAgICAgICAgICAgICAgICh2aWV3VHJhbnNpdGlvbkhvc3RJbnN0YW5jZUlkeCA9IDApLFxuICAgICAgICAgICAgICAgIChyb290ID0gbWVhc3VyZVZpZXdUcmFuc2l0aW9uSG9zdEluc3RhbmNlc1JlY3Vyc2l2ZShcbiAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgICAgICByb290LFxuICAgICAgICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICAgICAgICAgICEwXG4gICAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgICAgdmlld1RyYW5zaXRpb25Ib3N0SW5zdGFuY2VJZHggIT09XG4gICAgICAgICAgICAgICAgICAobnVsbCA9PT0gcHJvcHMgPyAwIDogcHJvcHMubGVuZ3RoKSAmJlxuICAgICAgICAgICAgICAgICAgKGZpbmlzaGVkV29yay5mbGFncyB8PSAzMikpO1xuICAgICAgICAgICAgMCAhPT0gKGZpbmlzaGVkV29yay5mbGFncyAmIDQpICYmIHJvb3RcbiAgICAgICAgICAgICAgPyAoc2NoZWR1bGVWaWV3VHJhbnNpdGlvbkV2ZW50KFxuICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLm1lbW9pemVkUHJvcHMub25VcGRhdGVcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICh2aWV3VHJhbnNpdGlvbkNhbmNlbGFibGVDaGlsZHJlbiA9IG9sZE5hbWUpKVxuICAgICAgICAgICAgICA6IG51bGwgIT09IG9sZE5hbWUgJiZcbiAgICAgICAgICAgICAgICAob2xkTmFtZS5wdXNoLmFwcGx5KG9sZE5hbWUsIHZpZXdUcmFuc2l0aW9uQ2FuY2VsYWJsZUNoaWxkcmVuKSxcbiAgICAgICAgICAgICAgICAodmlld1RyYW5zaXRpb25DYW5jZWxhYmxlQ2hpbGRyZW4gPSBvbGROYW1lKSk7XG4gICAgICAgICAgICB2aWV3VHJhbnNpdGlvbkNvbnRleHRDaGFuZ2VkID1cbiAgICAgICAgICAgICAgMCAhPT0gKGZpbmlzaGVkV29yay5mbGFncyAmIDMyKSA/ICEwIDogaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlQWZ0ZXJNdXRhdGlvbkVmZmVjdHMocm9vdCwgZmluaXNoZWRXb3JrKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiByZWN1cnNpdmVseVRyYXZlcnNlTGF5b3V0RWZmZWN0cyhyb290LCBwYXJlbnRGaWJlcikge1xuICAgICAgaWYgKHBhcmVudEZpYmVyLnN1YnRyZWVGbGFncyAmIDg3NzIpXG4gICAgICAgIGZvciAocGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5jaGlsZDsgbnVsbCAhPT0gcGFyZW50RmliZXI7IClcbiAgICAgICAgICBjb21taXRMYXlvdXRFZmZlY3RPbkZpYmVyKHJvb3QsIHBhcmVudEZpYmVyLmFsdGVybmF0ZSwgcGFyZW50RmliZXIpLFxuICAgICAgICAgICAgKHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuc2libGluZyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRpc2FwcGVhckxheW91dEVmZmVjdHMoZmluaXNoZWRXb3JrLCBsYXlvdXRFZmZlY3RUcmF2ZXJzYWxGbGFncykge1xuICAgICAgdmFyIHByZXZFZmZlY3RTdGFydCA9IHB1c2hDb21wb25lbnRFZmZlY3RTdGFydCgpLFxuICAgICAgICBwcmV2RWZmZWN0RHVyYXRpb24gPSBwdXNoQ29tcG9uZW50RWZmZWN0RHVyYXRpb24oKSxcbiAgICAgICAgcHJldkVmZmVjdEVycm9ycyA9IHB1c2hDb21wb25lbnRFZmZlY3RFcnJvcnMoKSxcbiAgICAgICAgcHJldkVmZmVjdERpZFNwYXduVXBkYXRlID0gcHVzaENvbXBvbmVudEVmZmVjdERpZFNwYXduVXBkYXRlKCk7XG4gICAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICBjYXNlIDExOlxuICAgICAgICBjYXNlIDE0OlxuICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgIGNvbW1pdEhvb2tMYXlvdXRVbm1vdW50RWZmZWN0cyhcbiAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgIGZpbmlzaGVkV29yay5yZXR1cm4sXG4gICAgICAgICAgICBMYXlvdXRcbiAgICAgICAgICApO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEaXNhcHBlYXJMYXlvdXRFZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgbGF5b3V0RWZmZWN0VHJhdmVyc2FsRmxhZ3NcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgc2FmZWx5RGV0YWNoUmVmKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVW5tb3VudCAmJlxuICAgICAgICAgICAgc2FmZWx5Q2FsbENvbXBvbmVudFdpbGxVbm1vdW50KFxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yay5yZXR1cm4sXG4gICAgICAgICAgICAgIGluc3RhbmNlXG4gICAgICAgICAgICApO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEaXNhcHBlYXJMYXlvdXRFZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgbGF5b3V0RWZmZWN0VHJhdmVyc2FsRmxhZ3NcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgIChsYXlvdXRFZmZlY3RUcmF2ZXJzYWxGbGFncyAmIEluY2x1ZGVIb3N0U2luZ2xldG9ucykgIT09XG4gICAgICAgICAgICBOb0xheW91dEVmZmVjdFRyYXZlcnNhbEZsYWdzICYmXG4gICAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICByZWxlYXNlU2luZ2xldG9uSW5zdGFuY2UsXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yay5zdGF0ZU5vZGUsXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yay50eXBlLFxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsubWVtb2l6ZWRQcm9wc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgI
15852HNhZmVseURldGFjaFJlZihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICAgICg1ICE9PSBmaW5pc2hlZFdvcmsudGFnICYmIDI3ICE9PSBmaW5pc2hlZFdvcmsudGFnKSB8fFxuICAgICAgICAgICAgY29tbWl0RnJhZ21lbnRJbnN0YW5jZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEaXNhcHBlYXJMYXlvdXRFZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgbGF5b3V0RWZmZWN0VHJhdmVyc2FsRmxhZ3NcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgY29tbWl0RnJhZ21lbnRJbnN0YW5jZURlbGV0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI2OlxuICAgICAgICAgIHNhZmVseURldGFjaFJlZihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICAgIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICBudWxsICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSB8fFxuICAgICAgICAgICAgbnVsbCA9PT0gaW5zdGFuY2UgfHxcbiAgICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVXYXNIaWRkZW4gfHxcbiAgICAgICAgICAgIGluc3RhbmNlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaW5zdGFuY2UpO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEaXNhcHBlYXJMYXlvdXRFZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgbGF5b3V0RWZmZWN0VHJhdmVyc2FsRmxhZ3NcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgIG51bGwgPT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlICYmXG4gICAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGlzYXBwZWFyTGF5b3V0RWZmZWN0cyhcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICBsYXlvdXRFZmZlY3RUcmF2ZXJzYWxGbGFnc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzMDpcbiAgICAgICAgICBmaW5pc2hlZFdvcmsuZmxhZ3MgJiAxODg3NDM2OCAmJlxuICAgICAgICAgICAgdW50cmFja05hbWVkVmlld1RyYW5zaXRpb24oZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBzYWZlbHlEZXRhY2hSZWYoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGlzYXBwZWFyTGF5b3V0RWZmZWN0cyhcbiAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgIGxheW91dEVmZmVjdFRyYXZlcnNhbEZsYWdzXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgIHNhZmVseURldGFjaFJlZihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4pO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEaXNhcHBlYXJMYXlvdXRFZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgbGF5b3V0RWZmZWN0VHJhdmVyc2FsRmxhZ3NcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgICAgKGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUgJiZcbiAgICAgICAgMCA8PSBjb21wb25lbnRFZmZlY3RTdGFydFRpbWUgJiZcbiAgICAgICAgMCA8PSBjb21wb25lbnRFZmZlY3RFbmRUaW1lICYmXG4gICAgICAgIChjb21wb25lbnRFZmZlY3RTcGF3bmVkVXBkYXRlIHx8IDAuMDUgPCBjb21wb25lbnRFZmZlY3REdXJhdGlvbikgJiZcbiAgICAgICAgbG9nQ29tcG9uZW50RWZmZWN0KFxuICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICBjb21wb25lbnRFZmZlY3RTdGFydFRpbWUsXG4gICAgICAgICAgY29tcG9uZW50RWZmZWN0RW5kVGltZSxcbiAgICAgICAgICBjb21wb25lbnRFZmZlY3REdXJhdGlvbixcbiAgICAgICAgICBjb21wb25lbnRFZmZlY3RFcnJvcnNcbiAgICAgICAgKTtcbiAgICAgIHBvcENvbXBvbmVudEVmZmVjdFN0YXJ0KHByZXZFZmZlY3RTdGFydCk7XG4gICAgICBwb3BDb21wb25lbnRFZmZlY3REdXJhdGlvbihwcmV2RWZmZWN0RHVyYXRpb24pO1xuICAgICAgY29tcG9uZW50RWZmZWN0RXJyb3JzID0gcHJldkVmZmVjdEVycm9ycztcbiAgICAgIGNvbXBvbmVudEVmZmVjdFNwYXduZWRVcGRhdGUgPSBwcmV2RWZmZWN0RGlkU3Bhd25VcGRhdGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEaXNhcHBlYXJMYXlvdXRFZmZlY3RzKFxuICAgICAgcGFyZW50RmliZXIsXG4gICAgICBsYXlvdXRFZmZlY3RUcmF2ZXJzYWxGbGFnc1xuICAgICkge1xuICAgICAgZm9yIChwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLmNoaWxkOyBudWxsICE9PSBwYXJlbnRGaWJlcjsgKVxuICAgICAgICBkaXNhcHBlYXJMYXlvdXRFZmZlY3RzKHBhcmVudEZpYmVyLCBsYXlvdXRFZmZlY3RUcmF2ZXJzYWxGbGFncyksXG4gICAgICAgICAgKHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuc2libGluZyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlYXBwZWFyTGF5b3V0RWZmZWN0cyhcbiAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgIGN1cnJlbnQsXG4gICAgICBmaW5pc2hlZFdvcmssXG4gICAgICBsYXlvdXRFZmZlY3RUcmF2ZXJzYWxGbGFnc1xuICAgICkge1xuICAgICAgdmFyIHByZXZFZmZlY3RTdGFydCA9IHB1c2hDb21wb25lbnRFZmZlY3RTdGFydCgpLFxuICAgICAgICBwcmV2RWZmZWN0RHVyYXRpb24gPSBwdXNoQ29tcG9uZW50RWZmZWN0RHVyYXRpb24oKSxcbiAgICAgICAgcHJldkVmZmVjdEVycm9ycyA9IHB1c2hDb21wb25lbnRFZmZlY3RFcnJvcnMoKSxcbiAgICAgICAgcHJldkVmZmVjdERpZFNwYXduVXBkYXRlID0gcHVzaENvbXBvbmVudEVmZmVjdERpZFNwYXduVXBkYXRlKCksXG4gICAgICAgIGZsYWdzID0gZmluaXNoZWRXb3JrLmZsYWdzLFxuICAgICAgICBpbmNsdWRlV29ya0luUHJvZ3Jlc3NFZmZlY3RzID1cbiAgICAgICAgICAobGF5b3V0RWZmZWN0VHJhdmVyc2FsRmxhZ3MgJiBJbmNsdWRlV29ya0luUHJvZ3Jlc3NFZmZlY3RzKSAhPT1cbiAgICAgICAgICBOb0xheW91dEVmZmVjdFRyYXZlcnNhbEZsYWdzO1xuICAgICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlUmVhcHBlYXJMYXlvdXRFZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgbGF5b3V0RWZmZWN0VHJhdmVyc2FsRmxhZ3NcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbW1pdEhvb2tMYXlvdXRFZmZlY3RzKGZpbmlzaGVkV29yaywgTGF5b3V0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgI
15852HJlY3Vyc2l2ZWx5VHJhdmVyc2VSZWFwcGVhckxheW91dEVmZmVjdHMoXG4gICAgICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICBsYXlvdXRFZmZlY3RUcmF2ZXJzYWxGbGFnc1xuICAgICAgICAgICk7XG4gICAgICAgICAgY3VycmVudCA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgY3VycmVudC5jb21wb25lbnREaWRNb3VudCAmJlxuICAgICAgICAgICAgcnVuV2l0aEZpYmVySW5ERVYoXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgY2FsbENvbXBvbmVudERpZE1vdW50SW5ERVYsXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgY3VycmVudFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjdXJyZW50ID0gZmluaXNoZWRXb3JrLnVwZGF0ZVF1ZXVlO1xuICAgICAgICAgIGlmIChudWxsICE9PSBjdXJyZW50KSB7XG4gICAgICAgICAgICBmaW5pc2hlZFJvb3QgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcnVuV2l0aEZpYmVySW5ERVYoXG4gICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICAgIGNvbW1pdEhpZGRlbkNhbGxiYWNrcyxcbiAgICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkUm9vdFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGluY2x1ZGVXb3JrSW5Qcm9ncmVzc0VmZmVjdHMgJiZcbiAgICAgICAgICAgIGZsYWdzICYgNjQgJiZcbiAgICAgICAgICAgIGNvbW1pdENsYXNzQ2FsbGJhY2tzKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgc2FmZWx5QXR0YWNoUmVmKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjc6XG4gICAgICAgICAgKGxheW91dEVmZmVjdFRyYXZlcnNhbEZsYWdzICYgSW5jbHVkZUhvc3RTaW5nbGV0b25zKSAhPT1cbiAgICAgICAgICAgIE5vTGF5b3V0RWZmZWN0VHJhdmVyc2FsRmxhZ3MgJiZcbiAgICAgICAgICAgIGNvbW1pdEhvc3RTaW5nbGV0b25BY3F1aXNpdGlvbihmaW5pc2hlZFdvcmspO1xuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgKDUgIT09IGZpbmlzaGVkV29yay50YWcgJiYgMjcgIT09IGZpbmlzaGVkV29yay50YWcpIHx8XG4gICAgICAgICAgICBjb21taXRGcmFnbWVudEluc3RhbmNlSW5zZXJ0aW9uRWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VSZWFwcGVhckxheW91dEVmZmVjdHMoXG4gICAgICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICBsYXlvdXRFZmZlY3RUcmF2ZXJzYWxGbGFnc1xuICAgICAgICAgICk7XG4gICAgICAgICAgaW5jbHVkZVdvcmtJblByb2dyZXNzRWZmZWN0cyAmJlxuICAgICAgICAgICAgbnVsbCA9PT0gY3VycmVudCAmJlxuICAgICAgICAgICAgZmxhZ3MgJiA0ICYmXG4gICAgICAgICAgICBjb21taXRIb3N0TW91bnQoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgICBzYWZlbHlBdHRhY2hSZWYoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICAgIGNvbW1pdEZyYWdtZW50SW5zdGFuY2VJbnNlcnRpb25FZmZlY3RzKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjY6XG4gICAgICAgICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICBudWxsICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSB8fFxuICAgICAgICAgICAgbnVsbCA9PT0gaW5zdGFuY2UgfHxcbiAgICAgICAgICAgIG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiB8fFxuICAgICAgICAgICAgbW91bnRIb2lzdGFibGUoXG4gICAgICAgICAgICAgIGdldEhvaXN0YWJsZVJvb3QoaW5zdGFuY2Uub3duZXJEb2N1bWVudCksXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yay50eXBlLFxuICAgICAgICAgICAgICBpbnN0YW5jZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlUmVhcHBlYXJMYXlvdXRFZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgbGF5b3V0RWZmZWN0VHJhdmVyc2FsRmxhZ3NcbiAgICAgICAgICApO1xuICAgICAgICAgIGluY2x1ZGVXb3JrSW5Qcm9ncmVzc0VmZmVjdHMgJiZcbiAgICAgICAgICAgIG51bGwgPT09IGN1cnJlbnQgJiZcbiAgICAgICAgICAgIGZsYWdzICYgNCAmJlxuICAgICAgICAgICAgY29tbWl0SG9zdE1vdW50KGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgc2FmZWx5QXR0YWNoUmVmKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgaWYgKGluY2x1ZGVXb3JrSW5Qcm9ncmVzc0VmZmVjdHMgJiYgZmxhZ3MgJiA0KSB7XG4gICAgICAgICAgICBmbGFncyA9IHB1c2hOZXN0ZWRFZmZlY3REdXJhdGlvbnMoKTtcbiAgICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VSZWFwcGVhckxheW91dEVmZmVjdHMoXG4gICAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICBsYXlvdXRFZmZlY3RUcmF2ZXJzYWxGbGFnc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGluY2x1ZGVXb3JrSW5Qcm9ncmVzc0VmZmVjdHMgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuICAgICAgICAgICAgaW5jbHVkZVdvcmtJblByb2dyZXNzRWZmZWN0cy5lZmZlY3REdXJhdGlvbiArPVxuICAgICAgICAgICAgICBidWJibGVOZXN0ZWRFZmZlY3REdXJhdGlvbnMoZmxhZ3MpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcnVuV2l0aEZpYmVySW5ERVYoXG4gICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICAgIGNvbW1pdFByb2ZpbGVyLFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgICAgIGNvbW1pdFN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICBpbmNsdWRlV29ya0luUHJvZ3Jlc3NFZmZlY3RzLmVmZmVjdER1cmF0aW9uXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihmaW5pc2hlZFdvcmssIGZpbmlzaGVkV29yay5yZXR1cm4sIGVycm9yKTtcbiAgICAgICAgICAgI
15852H1cbiAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VSZWFwcGVhckxheW91dEVmZmVjdHMoXG4gICAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICBsYXlvdXRFZmZlY3RUcmF2ZXJzYWxGbGFnc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzMTpcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlUmVhcHBlYXJMYXlvdXRFZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgbGF5b3V0RWZmZWN0VHJhdmVyc2FsRmxhZ3NcbiAgICAgICAgICApO1xuICAgICAgICAgIGluY2x1ZGVXb3JrSW5Qcm9ncmVzc0VmZmVjdHMgJiZcbiAgICAgICAgICAgIGZsYWdzICYgNCAmJlxuICAgICAgICAgICAgY29tbWl0QWN0aXZpdHlIeWRyYXRpb25DYWxsYmFja3MoZmluaXNoZWRSb290LCBmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VSZWFwcGVhckxheW91dEVmZmVjdHMoXG4gICAgICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICBsYXlvdXRFZmZlY3RUcmF2ZXJzYWxGbGFnc1xuICAgICAgICAgICk7XG4gICAgICAgICAgaW5jbHVkZVdvcmtJblByb2dyZXNzRWZmZWN0cyAmJlxuICAgICAgICAgICAgZmxhZ3MgJiA0ICYmXG4gICAgICAgICAgICBjb21taXRTdXNwZW5zZUh5ZHJhdGlvbkNhbGxiYWNrcyhmaW5pc2hlZFJvb3QsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgbnVsbCA9PT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUgJiZcbiAgICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VSZWFwcGVhckxheW91dEVmZmVjdHMoXG4gICAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICBsYXlvdXRFZmZlY3RUcmF2ZXJzYWxGbGFnc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICBzYWZlbHlBdHRhY2hSZWYoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzMDpcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlUmVhcHBlYXJMYXlvdXRFZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgbGF5b3V0RWZmZWN0VHJhdmVyc2FsRmxhZ3NcbiAgICAgICAgICApO1xuICAgICAgICAgIGZsYWdzICYgMTg4NzQzNjggJiYgdHJhY2tOYW1lZFZpZXdUcmFuc2l0aW9uKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgc2FmZWx5QXR0YWNoUmVmKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgICBzYWZlbHlBdHRhY2hSZWYoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlUmVhcHBlYXJMYXlvdXRFZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgbGF5b3V0RWZmZWN0VHJhdmVyc2FsRmxhZ3NcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgICAgKGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUgJiZcbiAgICAgICAgMCA8PSBjb21wb25lbnRFZmZlY3RTdGFydFRpbWUgJiZcbiAgICAgICAgMCA8PSBjb21wb25lbnRFZmZlY3RFbmRUaW1lICYmXG4gICAgICAgIChjb21wb25lbnRFZmZlY3RTcGF3bmVkVXBkYXRlIHx8IDAuMDUgPCBjb21wb25lbnRFZmZlY3REdXJhdGlvbikgJiZcbiAgICAgICAgbG9nQ29tcG9uZW50RWZmZWN0KFxuICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICBjb21wb25lbnRFZmZlY3RTdGFydFRpbWUsXG4gICAgICAgICAgY29tcG9uZW50RWZmZWN0RW5kVGltZSxcbiAgICAgICAgICBjb21wb25lbnRFZmZlY3REdXJhdGlvbixcbiAgICAgICAgICBjb21wb25lbnRFZmZlY3RFcnJvcnNcbiAgICAgICAgKTtcbiAgICAgIHBvcENvbXBvbmVudEVmZmVjdFN0YXJ0KHByZXZFZmZlY3RTdGFydCk7XG4gICAgICBwb3BDb21wb25lbnRFZmZlY3REdXJhdGlvbihwcmV2RWZmZWN0RHVyYXRpb24pO1xuICAgICAgY29tcG9uZW50RWZmZWN0RXJyb3JzID0gcHJldkVmZmVjdEVycm9ycztcbiAgICAgIGNvbXBvbmVudEVmZmVjdFNwYXduZWRVcGRhdGUgPSBwcmV2RWZmZWN0RGlkU3Bhd25VcGRhdGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlY3Vyc2l2ZWx5VHJhdmVyc2VSZWFwcGVhckxheW91dEVmZmVjdHMoXG4gICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICBwYXJlbnRGaWJlcixcbiAgICAgIGxheW91dEVmZmVjdFRyYXZlcnNhbEZsYWdzXG4gICAgKSB7XG4gICAgICBsYXlvdXRFZmZlY3RUcmF2ZXJzYWxGbGFncyA9XG4gICAgICAgIDAgIT09IChwYXJlbnRGaWJlci5zdWJ0cmVlRmxhZ3MgJiA4NzcyKVxuICAgICAgICAgID8gbGF5b3V0RWZmZWN0VHJhdmVyc2FsRmxhZ3NcbiAgICAgICAgICA6IGxheW91dEVmZmVjdFRyYXZlcnNhbEZsYWdzICYgfkluY2x1ZGVXb3JrSW5Qcm9ncmVzc0VmZmVjdHM7XG4gICAgICBmb3IgKHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuY2hpbGQ7IG51bGwgIT09IHBhcmVudEZpYmVyOyApXG4gICAgICAgIHJlYXBwZWFyTGF5b3V0RWZmZWN0cyhcbiAgICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgICAgcGFyZW50RmliZXIuYWx0ZXJuYXRlLFxuICAgICAgICAgIHBhcmVudEZpYmVyLFxuICAgICAgICAgIGxheW91dEVmZmVjdFRyYXZlcnNhbEZsYWdzXG4gICAgICAgICksXG4gICAgICAgICAgKHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuc2libGluZyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbW1pdE9mZnNjcmVlblBhc3NpdmVNb3VudEVmZmVjdHMoY3VycmVudCwgZmluaXNoZWRXb3JrKSB7XG4gICAgICB2Y
15852XIgcHJldmlvdXNDYWNoZSA9IG51bGw7XG4gICAgICBudWxsICE9PSBjdXJyZW50ICYmXG4gICAgICAgIG51bGwgIT09IGN1cnJlbnQubWVtb2l6ZWRTdGF0ZSAmJlxuICAgICAgICBudWxsICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUuY2FjaGVQb29sICYmXG4gICAgICAgIChwcmV2aW91c0NhY2hlID0gY3VycmVudC5tZW1vaXplZFN0YXRlLmNhY2hlUG9vbC5wb29sKTtcbiAgICAgIGN1cnJlbnQgPSBudWxsO1xuICAgICAgbnVsbCAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUgJiZcbiAgICAgICAgbnVsbCAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUuY2FjaGVQb29sICYmXG4gICAgICAgIChjdXJyZW50ID0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUuY2FjaGVQb29sLnBvb2wpO1xuICAgICAgY3VycmVudCAhPT0gcHJldmlvdXNDYWNoZSAmJlxuICAgICAgICAobnVsbCAhPSBjdXJyZW50ICYmIHJldGFpbkNhY2hlKGN1cnJlbnQpLFxuICAgICAgICBudWxsICE9IHByZXZpb3VzQ2FjaGUgJiYgcmVsZWFzZUNhY2hlKHByZXZpb3VzQ2FjaGUpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tbWl0Q2FjaGVQYXNzaXZlTW91bnRFZmZlY3QoY3VycmVudCwgZmluaXNoZWRXb3JrKSB7XG4gICAgICBjdXJyZW50ID0gbnVsbDtcbiAgICAgIG51bGwgIT09IGZpbmlzaGVkV29yay5hbHRlcm5hdGUgJiZcbiAgICAgICAgKGN1cnJlbnQgPSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlLm1lbW9pemVkU3RhdGUuY2FjaGUpO1xuICAgICAgZmluaXNoZWRXb3JrID0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGUuY2FjaGU7XG4gICAgICBmaW5pc2hlZFdvcmsgIT09IGN1cnJlbnQgJiZcbiAgICAgICAgKHJldGFpbkNhY2hlKGZpbmlzaGVkV29yayksIG51bGwgIT0gY3VycmVudCAmJiByZWxlYXNlQ2FjaGUoY3VycmVudCkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWN1cnNpdmVseVRyYXZlcnNlUGFzc2l2ZU1vdW50RWZmZWN0cyhcbiAgICAgIHJvb3QsXG4gICAgICBwYXJlbnRGaWJlcixcbiAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgY29tbWl0dGVkVHJhbnNpdGlvbnMsXG4gICAgICBlbmRUaW1lXG4gICAgKSB7XG4gICAgICB2Y
15852XIgaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlID1cbiAgICAgICAgKGNvbW1pdHRlZExhbmVzICYgMzM1NTQ0MDY0KSA9PT0gY29tbWl0dGVkTGFuZXM7XG4gICAgICBpZiAoXG4gICAgICAgIHBhcmVudEZpYmVyLnN1YnRyZWVGbGFncyAmIChpc1ZpZXdUcmFuc2l0aW9uRWxpZ2libGUgPyAxMDI2MiA6IDEwMjU2KSB8fFxuICAgICAgICAoMCAhPT0gcGFyZW50RmliZXIuYWN0dWFsRHVyYXRpb24gJiZcbiAgICAgICAgICAobnVsbCA9PT0gcGFyZW50RmliZXIuYWx0ZXJuYXRlIHx8XG4gICAgICAgICAgICBwYXJlbnRGaWJlci5hbHRlcm5hdGUuY2hpbGQgIT09IHBhcmVudEZpYmVyLmNoaWxkKSlcbiAgICAgIClcbiAgICAgICAgZm9yIChwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLmNoaWxkOyBudWxsICE9PSBwYXJlbnRGaWJlcjsgKVxuICAgICAgICAgIChpc1ZpZXdUcmFuc2l0aW9uRWxpZ2libGUgPSBwYXJlbnRGaWJlci5zaWJsaW5nKSxcbiAgICAgICAgICAgIGNvbW1pdFBhc3NpdmVNb3VudE9uRmliZXIoXG4gICAgICAgICAgICAgIHJvb3QsXG4gICAgICAgICAgICAgIHBhcmVudEZpYmVyLFxuICAgICAgICAgICAgICBjb21taXR0ZWRMYW5lcyxcbiAgICAgICAgICAgICAgY29tbWl0dGVkVHJhbnNpdGlvbnMsXG4gICAgICAgICAgICAgIG51bGwgIT09IGlzVmlld1RyYW5zaXRpb25FbGlnaWJsZVxuICAgICAgICAgICAgICAgID8gaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlLmFjdHVhbFN0YXJ0VGltZVxuICAgICAgICAgICAgICAgIDogZW5kVGltZVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIChwYXJlbnRGaWJlciA9IGlzVmlld1RyYW5zaXRpb25FbGlnaWJsZSk7XG4gICAgICBlbHNlXG4gICAgICAgIGlzVmlld1RyYW5zaXRpb25FbGlnaWJsZSAmJiByZXN0b3JlTmVzdGVkVmlld1RyYW5zaXRpb25zKHBhcmVudEZpYmVyKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tbWl0UGFzc2l2ZU1vdW50T25GaWJlcihcbiAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgY29tbWl0dGVkVHJhbnNpdGlvbnMsXG4gICAgICBlbmRUaW1lXG4gICAgKSB7XG4gICAgICB2Y
15852XIgcHJldkVmZmVjdFN0YXJ0ID0gcHVzaENvbXBvbmVudEVmZmVjdFN0YXJ0KCksXG4gICAgICAgIHByZXZFZmZlY3REdXJhdGlvbiA9IHB1c2hDb21wb25lbnRFZmZlY3REdXJhdGlvbigpLFxuICAgICAgICBwcmV2RWZmZWN0RXJyb3JzID0gcHVzaENvbXBvbmVudEVmZmVjdEVycm9ycygpLFxuICAgICAgICBwcmV2RWZmZWN0RGlkU3Bhd25VcGRhdGUgPSBwdXNoQ29tcG9uZW50RWZmZWN0RGlkU3Bhd25VcGRhdGUoKSxcbiAgICAgICAgcHJldkRlZXBFcXVhbGl0eSA9IGFscmVhZHlXYXJuZWRGb3JEZWVwRXF1YWxpdHksXG4gICAgICAgIGlzVmlld1RyYW5zaXRpb25FbGlnaWJsZSA9XG4gICAgICAgICAgKGNvbW1pdHRlZExhbmVzICYgMzM1NTQ0MDY0KSA9PT0gY29tbWl0dGVkTGFuZXM7XG4gICAgICBpc1ZpZXdUcmFuc2l0aW9uRWxpZ2libGUgJiZcbiAgICAgICAgbnVsbCA9PT0gZmluaXNoZWRXb3JrLmFsdGVybmF0ZSAmJlxuICAgICAgICBudWxsICE9PSBmaW5pc2hlZFdvcmsucmV0dXJuICYmXG4gICAgICAgIG51bGwgIT09IGZpbmlzaGVkV29yay5yZXR1cm4uYWx0ZXJuYXRlICYmXG4gICAgICAgIHJlc3RvcmVFbnRlck9yRXhpdFZpZXdUcmFuc2l0aW9ucyhmaW5pc2hlZFdvcmspO1xuICAgICAgdmFyIGZsYWdzID0gZmluaXNoZWRXb3JrLmZsYWdzO1xuICAgICAgc3dpdGNoIChmaW5pc2hlZFdvcmsudGFnKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAoZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSAmJlxuICAgICAgICAgICAgMCA8IGZpbmlzaGVkV29yay5hY3R1YWxTdGFydFRpbWUgJiZcbiAgICAgICAgICAgIDAgIT09IChmaW5pc2hlZFdvcmsuZmxhZ3MgJiAxKSAmJlxuICAgICAgICAgICAgbG9nQ29tcG9uZW50UmVuZGVyKFxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yay5hY3R1YWxTdGFydFRpbWUsXG4gICAgICAgICAgICAgIGVuZFRpbWUsXG4gICAgICAgICAgICAgIGluSHlkcmF0ZWRTdWJ0cmVlLFxuICAgICAgICAgICAgICBjb21taXR0ZWRMYW5lc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlUGFzc2l2ZU1vdW50RWZmZWN0cyhcbiAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgICAgICAgY29tbWl0dGVkVHJhbnNpdGlvbnMsXG4gICAgICAgICAgICBlbmRUaW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgICBmbGFncyAmIDIwNDggJiZcbiAgICAgICAgICAgIGNvbW1pdEhvb2tQYXNzaXZlTW91bnRFZmZlY3RzKGZpbmlzaGVkV29yaywgUGFzc2l2ZSB8IEhhc0VmZmVjdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAoZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSAmJlxuICAgICAgICAgICAgMCA8IGZpbmlzaGVkV29yay5hY3R1YWxTdGFydFRpbWUgJiZcbiAgICAgICAgICAgICgwICE9PSAoZmluaXNoZWRXb3JrLmZsYWdzICYgMTI4KVxuICAgICAgICAgICAgICA/IGxvZ0NvbXBvbmVudEVycm9yZWQoXG4gICAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsuYWN0dWFsU3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgZW5kVGltZSxcbiAgICAgICAgICAgICAgICAgIFtdXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICA6IDAgIT09IChmaW5pc2hlZFdvcmsuZmxhZ3MgJiAxKSAmJlxuICAgICAgICAgICAgICAgIGxvZ0NvbXBvbmVudFJlbmRlcihcbiAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yay5hY3R1YWxTdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgICBlbmRUaW1lLFxuICAgICAgICAgICAgICAgICAgaW5IeWRyYXRlZFN1YnRyZWUsXG4gICAgICAgICAgICAgICAgICBjb21taXR0ZWRMYW5lc1xuICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VQYXNzaXZlTW91bnRFZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgICBjb21taXR0ZWRUcmFuc2l0aW9ucyxcbiAgICAgICAgICAgIGVuZFRpbWVcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgdmFyIHByZXZQcm9maWxlckVmZmVjdER1cmF0aW9uID0gcHVzaE5lc3RlZEVmZmVjdER1cmF0aW9ucygpLFxuICAgICAgICAgICAgd2FzSW5IeWRyYXRlZFN1YnRyZWUgPSBpbkh5ZHJhdGVkU3VidHJlZTtcbiAgICAgICAgICBpbkh5ZHJhdGVkU3VidHJlZSA9XG4gICAgICAgICAgICBudWxsICE9PSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlICYmXG4gICAgICAgICAgICBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlLm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkICYmXG4gICAgICAgICAgICAwID09PSAoZmluaXNoZWRXb3JrLmZsYWdzICYgMjU2KTtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlUGFzc2l2ZU1vdW50RWZmZWN0cyhcbiAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgICAgICAgY29tbWl0dGVkVHJhbnNpdGlvbnMsXG4gICAgICAgICAgICBlbmRUaW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpbkh5ZHJhdGVkU3VidHJlZSA9IHdhc0luSHlkcmF0ZWRTdWJ0cmVlO1xuICAgICAgICAgIGlzVmlld1RyYW5zaXRpb25FbGlnaWJsZSAmJlxuICAgICAgICAgICAgcm9vdFZpZXdUcmFuc2l0aW9uTmFtZUNhbmNlbGVkICYmXG4gICAgICAgICAgICAoKGNvbW1pdHRlZExhbmVzID0gZmluaXNoZWRSb290LmNvbnRhaW5lckluZm8pLFxuICAgICAgICAgICAgKGNvbW1pdHRlZExhbmVzID1cbiAgICAgICAgICAgICAgOSA9PT0gY29tbWl0dGVkTGFuZXMubm9kZVR5cGVcbiAgICAgICAgICAgICAgICA/IGNvbW1pdHRlZExhbmVzLmJvZHlcbiAgICAgICAgICAgICAgICA6IFwiSFRNTFwiID09PSBjb21taXR0ZWRMYW5lcy5ub2RlTmFtZVxuICAgICAgICAgICAgICAgICAgPyBjb21taXR0ZWRMYW5lcy5vd25lckRvY3VtZW50LmJvZHlcbiAgICAgICAgICAgICAgICAgIDogY29tbWl0dGVkTGFuZXMpLFxuICAgICAgICAgICAgXCJyb290XCIgPT09IGNvbW1pdHRlZExhbmVzLnN0eWxlLnZpZXdUcmFuc2l0aW9uTmFtZSAmJlxuICAgICAgICAgICAgICAoY29tbWl0dGVkTGFuZXMuc3R5bGUudmlld1RyYW5zaXRpb25OYW1lID0gXCJcIiksXG4gICAgICAgICAgICAoY29tbWl0dGVkTGFuZXMgPSBjb21taXR0ZWRMYW5lcy5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCksXG4gICAgICAgICAgICBudWxsICE9PSBjb21taXR0ZWRMYW5lcyAmJlxuICAgICAgICAgICAgICBcIm5vbmVcIiA9PT0gY29tbWl0dGVkTGFuZXMuc3R5bGUudmlld1RyYW5zaXRpb25OYW1lICYmXG4gICAgICAgICAgICAgIChjb21taXR0ZWRMYW5lcy5zdHlsZS52aWV3VHJhbnNpdGlvbk5hbWUgPSBcIlwiKSk7XG4gICAgICAgICAgZmxhZ3MgJiAyMDQ4ICYmXG4gICAgICAgICAgICAoKGNvbW1pdHRlZExhbmVzID0gbnVsbCksXG4gICAgICAgICAgICBudWxsICE9PSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlICYmXG4gICAgICAgICAgICAgIChjb21taXR0ZWRMYW5lcyA9IGZpbmlzaGVkV29yay5hbHRlcm5hdGUubWVtb2l6ZWRTdGF0ZS5jYWNoZSksXG4gICAgICAgICAgICAoY29tbWl0dGVkVHJhbnNpdGlvbnMgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZS5jYWNoZSksXG4gICAgICAgICAgICBjb21taXR0ZWRUcmFuc2l0aW9ucyAhPT0gY29tbWl0dGVkTGFuZXMgJiZcbiAgICAgICAgICAgICAgKHJldGFpbkNhY2hlKGNvbW1pdHRlZF
15852RyYW5zaXRpb25zKSxcbiAgICAgICAgICAgICAgbnVsbCAhPSBjb21taXR0ZWRMYW5lcyAmJiByZWxlYXNlQ2FjaGUoY29tbWl0dGVkTGFuZXMpKSk7XG4gICAgICAgICAgZmluaXNoZWRSb290LnBhc3NpdmVFZmZlY3REdXJhdGlvbiArPSBwb3BOZXN0ZWRFZmZlY3REdXJhdGlvbnMoXG4gICAgICAgICAgICBwcmV2UHJvZmlsZXJFZmZlY3REdXJhdGlvblxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgaWYgKGZsYWdzICYgMjA0OCkge1xuICAgICAgICAgICAgZmxhZ3MgPSBwdXNoTmVzdGVkRWZmZWN0RHVyYXRpb25zKCk7XG4gICAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlUGFzc2l2ZU1vdW50RWZmZWN0cyhcbiAgICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgICAgICAgICBjb21taXR0ZWRUcmFuc2l0aW9ucyxcbiAgICAgICAgICAgICAgZW5kVGltZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGZpbmlzaGVkUm9vdCA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgICAgICBmaW5pc2hlZFJvb3QucGFzc2l2ZUVmZmVjdER1cmF0aW9uICs9XG4gICAgICAgICAgICAgIGJ1YmJsZU5lc3RlZEVmZmVjdER1cmF0aW9ucyhmbGFncyk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgICAgY29tbWl0UHJvZmlsZXJQb3N0Q29tbWl0SW1wbCxcbiAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLmFsdGVybmF0ZSxcbiAgICAgICAgICAgICAgICBjb21taXRTdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgZmluaXNoZWRSb290LnBhc3NpdmVFZmZlY3REdXJhdGlvblxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlUGFzc2l2ZU1vdW50RWZmZWN0cyhcbiAgICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgICAgICAgICBjb21taXR0ZWRUcmFuc2l0aW9ucyxcbiAgICAgICAgICAgICAgZW5kVGltZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzMTpcbiAgICAgICAgICBmbGFncyA9IGluSHlkcmF0ZWRTdWJ0cmVlO1xuICAgICAgICAgIHByZXZQcm9maWxlckVmZmVjdER1cmF0aW9uID1cbiAgICAgICAgICAgIG51bGwgIT09IGZpbmlzaGVkV29yay5hbHRlcm5hdGVcbiAgICAgICAgICAgICAgPyBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlLm1lbW9pemVkU3RhdGVcbiAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgIGlzVmlld1RyYW5zaXRpb25FbGlnaWJsZSA9IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlO1xuICAgICAgICAgIG51bGwgIT09IHByZXZQcm9maWxlckVmZmVjdER1cmF0aW9uICYmXG4gICAgICAgICAgbnVsbCA9PT0gaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlXG4gICAgICAgICAgICA/ICgoaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlID0gZmluaXNoZWRXb3JrLmRlbGV0aW9ucyksXG4gICAgICAgICAgICAgIG51bGwgIT09IGlzVmlld1RyYW5zaXRpb25FbGlnaWJsZSAmJlxuICAgICAgICAgICAgICAwIDwgaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAxOCA9PT0gaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlWzBdLnRhZ1xuICAgICAgICAgICAgICAgID8gKChpbkh5ZHJhdGVkU3VidHJlZSA9ICExKSxcbiAgICAgICAgICAgICAgICAgIChwcmV2UHJvZmlsZXJFZmZlY3REdXJhdGlvbiA9XG4gICAgICAgICAgICAgICAgICAgIHByZXZQcm9maWxlckVmZmVjdER1cmF0aW9uLmh5ZHJhdGlvbkVycm9ycyksXG4gICAgICAgICAgICAgICAgICBudWxsICE9PSBwcmV2UHJvZmlsZXJFZmZlY3REdXJhdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICBsb2dDb21wb25lbnRFcnJvcmVkKFxuICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsuYWN0dWFsU3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgICAgIGVuZFRpbWUsXG4gICAgICAgICAgICAgICAgICAgICAgcHJldlByb2ZpbGVyRWZmZWN0RHVyYXRpb25cbiAgICAgICAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICAgICA6IChpbkh5ZHJhdGVkU3VidHJlZSA9ICEwKSlcbiAgICAgICAgICAgIDogKGluSHlkcmF0ZWRTdWJ0cmVlID0gITEpO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VQYXNzaXZlTW91bnRFZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgICBjb21taXR0ZWRUcmFuc2l0aW9ucyxcbiAgICAgICAgICAgIGVuZFRpbWVcbiAgICAgICAgICApO1xuICAgICAgICAgIGluSHlkcmF0ZWRTdWJ0cmVlID0gZmxhZ3M7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgZmxhZ3MgPSBpbkh5ZHJhdGVkU3VidHJlZTtcbiAgICAgICAgICBwcmV2UHJvZmlsZXJFZmZlY3REdXJhdGlvbiA9XG4gICAgICAgICAgICBudWxsICE9PSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlXG4gICAgICAgICAgICAgID8gZmluaXNoZWRXb3JrLmFsdGVybmF0ZS5tZW1vaXplZFN0YXRlXG4gICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICBpc1ZpZXdUcmFuc2l0aW9uRWxpZ2libGUgPSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZTtcbiAgICAgICAgICBudWxsID09PSBwcmV2UHJvZmlsZXJFZmZlY3REdXJhdGlvbiB8fFxuICAgICAgICAgIG51bGwgPT09IHByZXZQcm9maWxlckVmZmVjdER1cmF0aW9uLmRlaHlkcmF0ZWQgfHxcbiAgICAgICAgICAobnVsbCAhPT0gaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlICYmXG4gICAgICAgICAgICBudWxsICE9PSBpc1ZpZXdUcmFuc2l0aW9uRWxpZ2libGUuZGV
15852oeWRyYXRlZClcbiAgICAgICAgICAgID8gKGluSHlkcmF0ZWRTdWJ0cmVlID0gITEpXG4gICAgICAgICAgICA6ICgoaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlID0gZmluaXNoZWRXb3JrLmRlbGV0aW9ucyksXG4gICAgICAgICAgICAgIG51bGwgIT09IGlzVmlld1RyYW5zaXRpb25FbGlnaWJsZSAmJlxuICAgICAgICAgICAgICAwIDwgaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAxOCA9PT0gaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlWzBdLnRhZ1xuICAgICAgICAgICAgICAgID8gKChpbkh5ZHJhdGVkU3VidHJlZSA9ICExKSxcbiAgICAgICAgICAgICAgICAgIChwcmV2UHJvZmlsZXJFZmZlY3REdXJhdGlvbiA9XG4gICAgICAgICAgICAgICAgICAgIHByZXZQcm9maWxlckVmZmVjdER1cmF0aW9uLmh5ZHJhdGlvbkVycm9ycyksXG4gICAgICAgICAgICAgICAgICBudWxsICE9PSBwcmV2UHJvZmlsZXJFZmZlY3REdXJhdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICBsb2dDb21wb25lbnRFcnJvcmVkKFxuICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsuYWN0dWFsU3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgICAgIGVuZFRpbWUsXG4gICAgICAgICAgICAgICAgICAgICAgcHJldlByb2ZpbGVyRWZmZWN0RHVyYXRpb25cbiAgICAgICAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICAgICA6IChpbkh5ZHJhdGVkU3VidHJlZSA9ICEwKSk7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZVBhc3NpdmVNb3VudEVmZmVjdHMoXG4gICAgICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICBjb21taXR0ZWRMYW5lcyxcbiAgICAgICAgICAgIGNvbW1pdHRlZFRyYW5zaXRpb25zLFxuICAgICAgICAgICAgZW5kVGltZVxuICAgICAgICAgICk7XG4gICAgICAgICAgaW5IeWRyYXRlZFN1YnRyZWUgPSBmbGFncztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyMzpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICB3YXNJbkh5ZHJhdGVkU3VidHJlZSA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgICAgcHJldlByb2ZpbGVyRWZmZWN0RHVyYXRpb24gPSBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlO1xuICAgICAgICAgIG51bGwgIT09IGZpbmlzaGVkV29yay5tZW1vaXplZFN0YXRlXG4gICAgICAgICAgICA/IChpc1ZpZXdUcmFuc2l0aW9uRWxpZ2libGUgJiZcbiAgICAgICAgICAgICAgICBudWxsICE9PSBwcmV2UHJvZmlsZXJFZmZlY3REdXJhdGlvbiAmJlxuICAgICAgICAgICAgICAgIG51bGwgPT09IHByZXZQcm9maWxlckVmZmVjdER1cmF0aW9uLm1lbW9pemVkU3RhdGUgJiZcbiAgICAgICAgICAgICAgICByZXN0b3JlRW50ZXJPckV4aXRWaWV3VHJhbnNpdGlvbnMocHJldlByb2ZpbGVyRWZmZWN0RHVyYXRpb24pLFxuICAgICAgICAgICAgICB3YXNJbkh5ZHJhdGVkU3VidHJlZS5fdmlzaWJpbGl0eSAmXG4gICAgICAgICAgICAgIE9mZnNjcmVlblBhc3NpdmVFZmZlY3RzQ29ubmVjdGVkXG4gICAgICAgICAgICAgICAgPyByZWN1cnNpdmVseVRyYXZlcnNlUGFzc2l2ZU1vdW50RWZmZWN0cyhcbiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgICAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgICAgICAgICAgICAgICBjb21taXR0ZWRUcmFuc2l0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgZW5kVGltZVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogcmVjdXJzaXZlbHlUcmF2ZXJzZUF0b21pY1Bhc3NpdmVFZmZlY3RzKFxuICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgICAgICAgICAgIGNvbW1pdHRlZFRyYW5zaXRpb25zLFxuICAgICAgICAgICAgICAgICAgICBlbmRUaW1lXG4gICAgICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgOiAoaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlICYmXG4gICAgICAgICAgICAgICAgbnVsbCAhPT0gcHJldlByb2ZpbGVyRWZmZWN0RHVyYXRpb24gJiZcbiAgICAgICAgICAgICAgICBudWxsICE9PSBwcmV2UHJvZmlsZXJFZmZlY3REdXJhdGlvbi5tZW1vaXplZFN0YXRlICYmXG4gICAgICAgICAgICAgICAgcmVzdG9yZUVudGVyT3JFeGl0Vmlld1RyYW5zaXRpb25zKGZpbmlzaGVkV29yayksXG4gICAgICAgICAgICAgIHdhc0luSHlkcmF0ZWRTdWJ0cmVlLl92aXNpYmlsaXR5ICZcbiAgICAgICAgICAgICAgT2Zmc2NyZWVuUGFzc2l2ZUVmZmVjdHNDb25uZWN0ZWRcbiAgICAgICAgICAgICAgICA/IHJlY3Vyc2l2ZWx5VHJhdmVyc2VQYXNzaXZlTW91bnRFZmZlY3RzKFxuICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgICAgICAgICAgIGNvbW1pdHRlZFRyYW5zaXRpb25zLFxuICAgICAgICAgICAgICAgICAgICBlbmRUaW1lXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiAoKHdhc0luSHlkcmF0ZWRTdWJ0cmVlLl92aXNpYmlsaXR5IHw9XG4gICAgICAgICAgICAgICAgICAgIE9mZnNjcmVlblBhc3NpdmVFZmZlY3RzQ29ubmVjdGVkKSxcbiAgICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VSZWNvbm5lY3RQYXNzaXZlRWZmZWN0cyhcbiAgICAgICAgICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgICAgICAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgICAgICAgICAgICAgICBjb21taXR0ZWRUcmFuc2l0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgMCAhPT0gKGZpbmlzaGVkV29yay5zdWJ0cmVlRmxhZ3MgJiAxMDI1NikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAoMCAhPT0gZmluaXNoZWRXb3JrLmFjdHVhbER1cmF0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAobnVsbCA9PT0gZmluaXNoZWRXb3JrLmFsdGVybmF0ZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlLmNoaWxkICE9PSBmaW5pc2hlZFdvcmsuY2hpbGQpKSxcbiAgICAgICAgICAgICAgICAgICAgZW5kVGltZVxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIChmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSA9PT0gTm9Nb2RlIHx8XG4gICAgICAgICAgICAgICAgICAgIGluSHlkcmF0ZWRTdWJ0cmVlIHx8XG4gICAgICAgICAgICAgICAgICAgICgoZmluaXNoZWRSb290ID0gZmluaXNoZWRXb3JrLmFjdHVhbFN0YXJ0VGltZSksXG4gICAgICAgICAgICAgICAgICAgIDAgPD0gZmluaXNoZWRSb290ICYmXG4gICAgICAgICAgICAgICAgICAgICAgMC4wNSA8IGVuZFRpbWUgLSBmaW5pc2hlZFJvb3QgJiZcbiAgICAgICAgICAgICAgICAgICAgICBsb2dDb21wb25lbnRSZWFwcGVhcmVkKFxuICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kVGltZVxuICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lICYmXG4gICAgICAgICAgICAgICAgICAgICAgMCA8PSBjb21wb25lbnRFZmZlY3RFbmRUaW1lICYmXG4gICAgICAgICAgICAgICAgICAgICAgMC4wNSA8XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRFZmZlY3RFbmRUaW1lIC0gY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lICYmXG4gICAgICAgICAgICAgICAgICAgICAgbG9nQ29tcG9uZW50UmVhcHBlYXJlZChcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEVmZmVjdFN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEVmZmVjdEVuZFRpbWVcbiAgICAgICAgICAgICAgICAgICAgICApKSkpO1xuICAgICAgICAgIGZsYWdzICYgMjA0OCAmJlxuICAgICAgICAgICAgY29tbWl0T2Zmc2NyZWVuUGFzc2l2ZU1vdW50RWZmZWN0cyhcbiAgICAgICAgICAgICAgcHJldlByb2ZpbGVyRWZmZWN0RHVyYXRpb24sXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29ya1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyNDpcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlUGFzc2l2ZU1vdW50RWZmZWN0cyhcbiAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgICAgICAgY29tbWl0dGVkVHJhbnNpdGlvbnMsXG4gICAgICAgICAgICBlbmRUaW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgICBmbGFncyAmIDIwNDggJiZcbiAgICAgICAgICAgIGNvbW1pdENhY2hlUGFzc2l2ZU1vdW50RWZmZWN0KGZpbmlzaGVkV29yay5hbHRlcm5hdGUsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzA6XG4gICAgICAgICAgaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlICYmXG4gICAgICAgICAgICAoKGZsYWdzID0gZmluaXNoZWRXb3JrLmFsdGVybmF0ZSksXG4gICAgICAgICAgICBudWxsICE9PSBmbGFncyAmJlxuICAgICAgICAgICAgICAocmVzdG9yZVZpZXdUcmFuc2l0aW9uT25Ib3N0SW5zdGFuY2VzKGZsYWdzLmNoaWxkLCAhMCksXG4gICAgICAgICAgICAgI
15852HJlc3RvcmVWaWV3VHJhbnNpdGlvbk9uSG9zdEluc3RhbmNlcyhmaW5pc2hlZFdvcmsuY2hpbGQsICEwKSkpO1xuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VQYXNzaXZlTW91bnRFZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgICBjb21taXR0ZWRUcmFuc2l0aW9ucyxcbiAgICAgICAgICAgIGVuZFRpbWVcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VQYXNzaXZlTW91bnRFZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgICBjb21taXR0ZWRUcmFuc2l0aW9ucyxcbiAgICAgICAgICAgIGVuZFRpbWVcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKChmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAoZmluaXNoZWRSb290ID1cbiAgICAgICAgICAgICFpbkh5ZHJhdGVkU3VidHJlZSAmJlxuICAgICAgICAgICAgbnVsbCA9PT0gZmluaXNoZWRXb3JrLmFsdGVybmF0ZSAmJlxuICAgICAgICAgICAgbnVsbCAhPT0gZmluaXNoZWRXb3JrLnJldHVybiAmJlxuICAgICAgICAgICAgbnVsbCAhPT0gZmluaXNoZWRXb3JrLnJldHVybi5hbHRlcm5hdGUpXG4gICAgICAgIClcbiAgICAgICAgICAoY29tbWl0dGVkTGFuZXMgPSBmaW5pc2hlZFdvcmsuYWN0dWFsU3RhcnRUaW1lKSxcbiAgICAgICAgICAgIDAgPD0gY29tbWl0dGVkTGFuZXMgJiZcbiAgICAgICAgICAgICAgMC4wNSA8IGVuZFRpbWUgLSBjb21taXR0ZWRMYW5lcyAmJlxuICAgICAgICAgICAgICBsb2dDb21wb25lbnRUcmlnZ2VyKFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICBjb21taXR0ZWRMYW5lcyxcbiAgICAgICAgICAgICAgICBlbmRUaW1lLFxuICAgICAgICAgICAgICAgIFwiTW91bnRcIlxuICAgICAgICAgICAgICApO1xuICAgICAgICAwIDw9IGNvbXBvbmVudEVmZmVjdFN0YXJ0VGltZSAmJlxuICAgICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0RW5kVGltZSAmJlxuICAgICAgICAgICgoY29tcG9uZW50RWZmZWN0U3Bhd25lZFVwZGF0ZSB8fCAwLjA1IDwgY29tcG9uZW50RWZmZWN0RHVyYXRpb24pICYmXG4gICAgICAgICAgICBsb2dDb21wb25lbnRFZmZlY3QoXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lLFxuICAgICAgICAgICAgICBjb21wb25lbnRFZmZlY3RFbmRUaW1lLFxuICAgICAgICAgICAgICBjb21wb25lbnRFZmZlY3REdXJhdGlvbixcbiAgICAgICAgICAgICAgY29tcG9uZW50RWZmZWN0RXJyb3JzXG4gICAgICAgICAgICApLFxuICAgICAgICAgIGZpbmlzaGVkUm9vdCAmJlxuICAgICAgICAgICAgMC4wNSA8IGNvbXBvbmVudEVmZmVjdEVuZFRpbWUgLSBjb21wb25lbnRFZmZlY3RTdGFydFRpbWUgJiZcbiAgICAgICAgICAgIGxvZ0NvbXBvbmVudFRyaWdnZXIoXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lLFxuICAgICAgICAgICAgICBjb21wb25lbnRFZmZlY3RFbmRUaW1lLFxuICAgICAgICAgICAgICBcIk1vdW50XCJcbiAgICAgICAgICAgICkpO1xuICAgICAgfVxuICAgICAgcG9wQ29tcG9uZW50RWZmZWN0U3RhcnQocHJldkVmZmVjdFN0YXJ0KTtcbiAgICAgIHBvcENvbXBvbmVudEVmZmVjdER1cmF0aW9uKHByZXZFZmZlY3REdXJhdGlvbik7XG4gICAgICBjb21wb25lbnRFZmZlY3RFcnJvcnMgPSBwcmV2RWZmZWN0RXJyb3JzO1xuICAgICAgY29tcG9uZW50RWZmZWN0U3Bhd25lZFVwZGF0ZSA9IHByZXZFZmZlY3REaWRTcGF3blVwZGF0ZTtcbiAgICAgIGFscmVhZHlXYXJuZWRGb3JEZWVwRXF1YWxpdHkgPSBwcmV2RGVlcEVxdWFsaXR5O1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWN1cnNpdmVseVRyYXZlcnNlUmVjb25uZWN0UGFzc2l2ZUVmZmVjdHMoXG4gICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICBwYXJlbnRGaWJlcixcbiAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgY29tbWl0dGVkVHJhbnNpdGlvbnMsXG4gICAgICBpbmNsdWRlV29ya0luUHJvZ3Jlc3NFZmZlY3RzLFxuICAgICAgZW5kVGltZVxuICAgICkge1xuICAgICAgaW5jbHVkZVdvcmtJblByb2dyZXNzRWZmZWN0cyA9XG4gICAgICAgIGluY2x1ZGVXb3JrSW5Qcm9ncmVzc0VmZmVjdHMgJiZcbiAgICAgICAgKDAgIT09IChwYXJlbnRGaWJlci5zdWJ0cmVlRmxhZ3MgJiAxMDI1NikgfHxcbiAgICAgICAgICAoMCAhPT0gcGFyZW50RmliZXIuYWN0dWFsRHVyYXRpb24gJiZcbiAgICAgICAgICAgIChudWxsID09PSBwYXJlbnRGaWJlci5hbHRlcm5hdGUgfHxcbiAgICAgICAgICAgICAgcGFyZW50RmliZXIuYWx0ZXJuYXRlLmNoaWxkICE9PSBwYXJlbnRGaWJlci5jaGlsZCkpKTtcbiAgICAgIGZvciAocGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5jaGlsZDsgbnVsbCAhPT0gcGFyZW50RmliZXI7ICkge1xuICAgICAgICB2Y
15852XIgbmV4dFNpYmxpbmcgPSBwYXJlbnRGaWJlci5zaWJsaW5nO1xuICAgICAgICByZWNvbm5lY3RQYXNzaXZlRWZmZWN0cyhcbiAgICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgICAgcGFyZW50RmliZXIsXG4gICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgY29tbWl0dGVkVHJhbnNpdGlvbnMsXG4gICAgICAgICAgaW5jbHVkZVdvcmtJblByb2dyZXNzRWZmZWN0cyxcbiAgICAgICAgICBudWxsICE9PSBuZXh0U2libGluZyA/IG5leHRTaWJsaW5nLmFjdHVhbFN0YXJ0VGltZSA6IGVuZFRpbWVcbiAgICAgICAgKTtcbiAgICAgICAgcGFyZW50RmliZXIgPSBuZXh0U2libGluZztcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcmVjb25uZWN0UGFzc2l2ZUVmZmVjdHMoXG4gICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICBmaW5pc2hlZFdvcmssXG4gICAgICBjb21taXR0ZWRMYW5lcyxcbiAgICAgIGNvbW1pdHRlZFRyYW5zaXRpb25zLFxuICAgICAgaW5jbHVkZVdvcmtJblByb2dyZXNzRWZmZWN0cyxcbiAgICAgIGVuZFRpbWVcbiAgICApIHtcbiAgICAgIHZhciBwcmV2RWZmZWN0U3RhcnQgPSBwdXNoQ29tcG9uZW50RWZmZWN0U3RhcnQoKSxcbiAgICAgICAgcHJldkVmZmVjdER1cmF0aW9uID0gcHVzaENvbXBvbmVudEVmZmVjdER1cmF0aW9uKCksXG4gICAgICAgIHByZXZFZmZlY3RFcnJvcnMgPSBwdXNoQ29tcG9uZW50RWZmZWN0RXJyb3JzKCksXG4gICAgICAgIHByZXZFZmZlY3REaWRTcGF3blVwZGF0ZSA9IHB1c2hDb21wb25lbnRFZmZlY3REaWRTcGF3blVwZGF0ZSgpLFxuICAgICAgICBwcmV2RGVlcEVxdWFsaXR5ID0gYWxyZWFkeVdhcm5lZEZvckRlZXBFcXVhbGl0eTtcbiAgICAgIGluY2x1ZGVXb3JrSW5Qcm9ncmVzc0VmZmVjdHMgJiZcbiAgICAgICAgKGZpbmlzaGVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUgJiZcbiAgICAgICAgMCA8IGZpbmlzaGVkV29yay5hY3R1YWxTdGFydFRpbWUgJiZcbiAgICAgICAgMCAhPT0gKGZpbmlzaGVkV29yay5mbGFncyAmIDEpICYmXG4gICAgICAgIGxvZ0NvbXBvbmVudFJlbmRlcihcbiAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgZmluaXNoZWRXb3JrLmFjdHVhbFN0YXJ0VGltZSxcbiAgICAgICAgICBlbmRUaW1lLFxuICAgICAgICAgIGluSHlkcmF0ZWRTdWJ0cmVlLFxuICAgICAgICAgIGNvbW1pdHRlZExhbmVzXG4gICAgICAgICk7XG4gICAgICB2Y
15852XIgZmxhZ3MgPSBmaW5pc2hlZFdvcmsuZmxhZ3M7XG4gICAgICBzd2l0Y2ggKGZpbmlzaGVkV29yay50YWcpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICBjYXNlIDExOlxuICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VSZWNvbm5lY3RQYXNzaXZlRWZmZWN0cyhcbiAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgICAgICAgY29tbWl0dGVkVHJhbnNpdGlvbnMsXG4gICAgICAgICAgICBpbmNsdWRlV29ya0luUHJvZ3Jlc3NFZmZlY3RzLFxuICAgICAgICAgICAgZW5kVGltZVxuICAgICAgICAgICk7XG4gICAgICAgICAgY29tbWl0SG9va1Bhc3NpdmVNb3VudEVmZmVjdHMoZmluaXNoZWRXb3JrLCBQYXNzaXZlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyMzpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICB2YXIgX2luc3RhbmNlNCA9IGZpbmlzaGVkV29yay5zdGF0ZU5vZGU7XG4gICAgICAgICAgbnVsbCAhPT0gZmluaXNoZWRXb3JrLm1lbW9pemVkU3RhdGVcbiAgICAgICAgICAgID8gX2luc3RhbmNlNC5fdmlzaWJpbGl0eSAmIE9mZnNjcmVlblBhc3NpdmVFZmZlY3RzQ29ubmVjdGVkXG4gICAgICAgICAgICAgID8gcmVjdXJzaXZlbHlUcmF2ZXJzZVJlY29ubmVjdFBhc3NpdmVFZmZlY3RzKFxuICAgICAgICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgICAgICAgICBjb21taXR0ZWRUcmFuc2l0aW9ucyxcbiAgICAgICAgICAgICAgICAgIGluY2x1ZGVXb3JrSW5Qcm9ncmVzc0VmZmVjdHMsXG4gICAgICAgICAgICAgICAgICBlbmRUaW1lXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICA6IHJlY3Vyc2l2ZWx5VHJhdmVyc2VBdG9taWNQYXNzaXZlRWZmZWN0cyhcbiAgICAgICAgICAgICAgICAgIGZpbmlzaGVkUm9vdCxcbiAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgICAgICAgICAgICAgY29tbWl0dGVkVHJhbnNpdGlvbnMsXG4gICAgICAgICAgICAgICAgICBlbmRUaW1lXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiAoKF9pbnN0YW5jZTQuX3Zpc2liaWxpdHkgfD0gT2Zmc2NyZWVuUGFzc2l2ZUVmZmVjdHNDb25uZWN0ZWQpLFxuICAgICAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlUmVjb25uZWN0UGFzc2l2ZUVmZmVjdHMoXG4gICAgICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgICBjb21taXR0ZWRMYW5lcyxcbiAgICAgICAgICAgICAgICBjb21taXR0ZWRUcmFuc2l0aW9ucyxcbiAgICAgICAgICAgICAgICBpbmNsdWRlV29ya0luUHJvZ3Jlc3NFZmZlY3RzLFxuICAgICAgICAgICAgICAgIGVuZFRpbWVcbiAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgaW5jbHVkZVdvcmtJblByb2dyZXNzRWZmZWN0cyAmJlxuICAgICAgICAgICAgZmxhZ3MgJiAyMDQ4ICYmXG4gICAgICAgICAgICBjb21taXRPZmZzY3JlZW5QYXNzaXZlTW91bnRFZmZlY3RzKFxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsuYWx0ZXJuYXRlLFxuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmtcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjQ6XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZVJlY29ubmVjdFBhc3NpdmVFZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgICBjb21taXR0ZWRUcmFuc2l0aW9ucyxcbiAgICAgICAgICAgIGluY2x1ZGVXb3JrSW5Qcm9ncmVzc0VmZmVjdHMsXG4gICAgICAgICAgICBlbmRUaW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpbmNsdWRlV29ya0luUHJvZ3Jlc3NFZmZlY3RzICYmXG4gICAgICAgICAgICBmbGFncyAmIDIwNDggJiZcbiAgICAgICAgICAgIGNvbW1pdENhY2hlUGFzc2l2ZU1vdW50RWZmZWN0KGZpbmlzaGVkV29yay5hbHRlcm5hdGUsIGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZVJlY29ubmVjdFBhc3NpdmVFZmZlY3RzKFxuICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgICBjb21taXR0ZWRUcmFuc2l0aW9ucyxcbiAgICAgICAgICAgIGluY2x1ZGVXb3JrSW5Qcm9ncmVzc0VmZmVjdHMsXG4gICAgICAgICAgICBlbmRUaW1lXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIChmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlICYmXG4gICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lICYmXG4gICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0RW5kVGltZSAmJlxuICAgICAgICAoY29tcG9uZW50RWZmZWN0U3Bhd25lZFVwZGF0ZSB8fCAwLjA1IDwgY29tcG9uZW50RWZmZWN0RHVyYXRpb24pICYmXG4gICAgICAgIGxvZ0NvbXBvbmVudEVmZmVjdChcbiAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lLFxuICAgICAgICAgIGNvbXBvbmVudEVmZmVjdEVuZFRpbWUsXG4gICAgICAgICAgY29tcG9uZW50RWZmZWN0RHVyYXRpb24sXG4gICAgICAgICAgY29tcG9uZW50RWZmZWN0RXJyb3JzXG4gICAgICAgICk7XG4gICAgICBwb3BDb21wb25lbnRFZmZlY3RTdGFydChwcmV2RWZmZWN0U3RhcnQpO1xuICAgICAgcG9wQ29tcG9uZW50RWZmZWN0RHVyYXRpb24ocHJldkVmZmVjdER1cmF0aW9uKTtcbiAgICAgIGNvbXBvbmVudEVmZmVjdEVycm9ycyA9IHByZXZFZmZlY3RFcnJvcnM7XG4gICAgICBjb21wb25lbnRFZmZlY3RTcGF3bmVkVXBkYXRlID0gcHJldkVmZmVjdERpZFNwYXduVXBkYXRlO1xuICAgICAgYWxyZWFkeVdhcm5lZEZvckRlZXBFcXVhbGl0eSA9IHByZXZEZWVwRXF1YWxpdHk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlY3Vyc2l2ZWx5VHJhdmVyc2VBdG9taWNQYXNzaXZlRWZmZWN0cyhcbiAgICAgIGZpbmlzaGVkUm9vdCRqc2NvbXAkMCxcbiAgICAgIHBhcmVudEZpYmVyLFxuICAgICAgY29tbWl0dGVkTGFuZXMkanNjb21wJDAsXG4gICAgICBjb21taXR0ZWRUcmFuc2l0aW9ucyRqc2NvbXAkMCxcbiAgICAgIGVuZFRpbWUkanNjb21wJDBcbiAgICApIHtcbiAgICAgIGlmIChcbiAgICAgICAgcGFyZW50RmliZXIuc3VidHJlZUZsYWdzICYgMTAyNTYgfHxcbiAgICAgICAgKDAgIT09IHBhcmVudEZpYmVyLmFjdHVhbER1cmF0aW9uICYmXG4gICAgICAgICAgKG51bGwgPT09IHBhcmVudEZpYmVyLmFsdGVybmF0ZSB8fFxuICAgICAgICAgICAgcGFyZW50RmliZXIuYWx0ZXJuYXRlLmNoaWxkICE9PSBwYXJlbnRGaWJlci5jaGlsZCkpXG4gICAgICApXG4gICAgICAgIGZvciAodmFyIGNoaWxkID0gcGFyZW50RmliZXIuY2hpbGQ7IG51bGwgIT09IGNoaWxkOyApIHtcbiAgICAgICAgICBwYXJlbnRGaWJlciA9IGNoaWxkLnNpYmxpbmc7XG4gICAgICAgICAgdmFyIGZpbmlzaGVkUm9vdCA9IGZpbmlzaGVkUm9vdCRqc2NvbXAkMCxcbiAgICAgICAgICAgIGNvbW1pdHRlZExhbmVzID0gY29tbWl0dGVkTGFuZXMkanNjb21wJDAsXG4gICAgICAgICAgICBjb21taXR0ZWRUcmFuc2l0aW9ucyA9IGNvbW1pdHRlZF
15852RyYW5zaXRpb25zJGpzY29tcCQwLFxuICAgICAgICAgICAgZW5kVGltZSA9XG4gICAgICAgICAgICAgIG51bGwgIT09IHBhcmVudEZpYmVyXG4gICAgICAgICAgICAgICAgPyBwYXJlbnRGaWJlci5hY3R1YWxTdGFydFRpbWVcbiAgICAgICAgICAgICAgICA6IGVuZFRpbWUkanNjb21wJDAsXG4gICAgICAgICAgICBwcmV2RGVlcEVxdWFsaXR5ID0gYWxyZWFkeVdhcm5lZEZvckRlZXBFcXVhbGl0eTtcbiAgICAgICAgICAoY2hpbGQubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlICYmXG4gICAgICAgICAgICAwIDwgY2hpbGQuYWN0dWFsU3RhcnRUaW1lICYmXG4gICAgICAgICAgICAwICE9PSAoY2hpbGQuZmxhZ3MgJiAxKSAmJlxuICAgICAgICAgICAgbG9nQ29tcG9uZW50UmVuZGVyKFxuICAgICAgICAgICAgICBjaGlsZCxcbiAgICAgICAgICAgICAgY2hpbGQuYWN0dWFsU3RhcnRUaW1lLFxuICAgICAgICAgICAgICBlbmRUaW1lLFxuICAgICAgICAgICAgICBpbkh5ZHJhdGVkU3VidHJlZSxcbiAgICAgICAgICAgICAgY29tbWl0dGVkTGFuZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgdmFyIGZsYWdzID0gY2hpbGQuZmxhZ3M7XG4gICAgICAgICAgc3dpdGNoIChjaGlsZC50YWcpIHtcbiAgICAgICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VBdG9taWNQYXNzaXZlRWZmZWN0cyhcbiAgICAgICAgICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgICAgICAgY29tbWl0dGVkVHJhbnNpdGlvbnMsXG4gICAgICAgICAgICAgICAgZW5kVGltZVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBmbGFncyAmIDIwNDggJiZcbiAgICAgICAgICAgICAgICBjb21taXRPZmZzY3JlZW5QYXNzaXZlTW91bnRFZmZlY3RzKGNoaWxkLmFsdGVybmF0ZSwgY2hpbGQpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjQ6XG4gICAgICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VBdG9taWNQYXNzaXZlRWZmZWN0cyhcbiAgICAgICAgICAgICAgICBmaW5pc2hlZFJvb3QsXG4gICAgICAgICAgICAgICAgY2hpbGQsXG4gICAgICAgICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgICAgICAgY29tbWl0dGVkVHJhbnNpdGlvbnMsXG4gICAgICAgICAgICAgICAgZW5kVGltZVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBmbGFncyAmIDIwNDggJiZcbiAgICAgICAgICAgICAgICBjb21taXRDYWNoZVBhc3NpdmVNb3VudEVmZmVjdChjaGlsZC5hbHRlcm5hdGUsIGNoaWxkKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlQXRvbWljUGFzc2l2ZUVmZmVjdHMoXG4gICAgICAgICAgICAgICAgZmluaXNoZWRSb290LFxuICAgICAgICAgICAgICAgIGNoaWxkLFxuICAgICAgICAgICAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgICAgICAgICAgIGNvbW1pdHRlZFRyYW5zaXRpb25zLFxuICAgICAgICAgICAgICAgIGVuZFRpbWVcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYWxyZWFkeVdhcm5lZEZvckRlZXBFcXVhbGl0eSA9IHByZXZEZWVwRXF1YWxpdHk7XG4gICAgICAgICAgY2hpbGQgPSBwYXJlbnRGaWJlcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiByZWN1cnNpdmVseUFjY3VtdWxhdGVTdXNwZW5zZXlDb21taXQoXG4gICAgICBwYXJlbnRGaWJlcixcbiAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgc3VzcGVuZGVkU3RhdGVcbiAgICApIHtcbiAgICAgIGlmIChwYXJlbnRGaWJlci5zdWJ0cmVlRmxhZ3MgJiBzdXNwZW5zZXlDb21taXRGbGFnKVxuICAgICAgICBmb3IgKHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuY2hpbGQ7IG51bGwgIT09IHBhcmVudEZpYmVyOyApXG4gICAgICAgICAgYWNjdW11bGF0ZVN1c3BlbnNleUNvbW1pdE9uRmliZXIoXG4gICAgICAgICAgICBwYXJlbnRGaWJlcixcbiAgICAgICAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgICAgICAgc3VzcGVuZGVkU3RhdGVcbiAgICAgICAgICApLFxuICAgICAgICAgICAgKHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuc2libGluZyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFjY3VtdWxhdGVTdXNwZW5zZXlDb21taXRPbkZpYmVyKFxuICAgICAgZmliZXIsXG4gICAgICBjb21taXR0ZWRMYW5lcyxcbiAgICAgIHN1c3BlbmRlZFN0YXRlXG4gICAgKSB7XG4gICAgICBzd2l0Y2ggKGZpYmVyLnRhZykge1xuICAgICAgICBjYXNlIDI2OlxuICAgICAgICAgIHJlY3Vyc2l2ZWx5QWNjdW11bGF0ZVN1c3BlbnNleUNvbW1pdChcbiAgICAgICAgICAgIGZpYmVyLFxuICAgICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgICBzdXNwZW5kZWRTdGF0ZVxuICAgICAgICAgICk7XG4gICAgICAgICAgZmliZXIuZmxhZ3MgJiBzdXNwZW5zZXlDb21taXRGbGFnICYmXG4gICAgICAgICAgICAobnVsbCAhPT0gZmliZXIubWVtb2l6ZWRTdGF0ZVxuICAgICAgICAgICAgICA/IHN1c3BlbmRSZXNvdXJjZShcbiAgICAgICAgICAgICAgICAgIHN1c3BlbmRlZFN0YXRlLFxuICAgICAgICAgICAgICAgICAgY3VycmVudEhvaXN0YWJsZVJvb3QsXG4gICAgICAgICAgICAgICAgICBmaWJlci5tZW1vaXplZFN0YXRlLFxuICAgICAgICAgICAgICAgICAgZmliZXIubWVtb2l6ZWRQcm9wc1xuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiAoKGZpYmVyID0gZmliZXIuc3RhdGVOb2RlKSxcbiAgICAgICAgICAgICAgICAoY29tbWl0dGVkTGFuZXMgJiAzMzU1NDQxMjgpID09PSBjb21taXR0ZWRMYW5lcyAmJlxuICAgICAgICAgICAgICAgICAgc3VzcGVuZEluc3RhbmNlKHN1c3BlbmRlZFN0YXRlLCBmaWJlcikpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIHJlY3Vyc2l2ZWx5QWNjdW11bGF0ZVN1c3BlbnNleUNvbW1pdChcbiAgICAgICAgICAgIGZpYmVyLFxuICAgICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgICBzdXNwZW5kZWRTdGF0ZVxuICAgICAgICAgICk7XG4gICAgICAgICAgZmliZXIuZmxhZ3MgJiBzdXNwZW5zZXlDb21taXRGbGFnICYmXG4gICAgICAgICAgICAoKGZpYmVyID0gZmliZXIuc3RhdGVOb2RlKSxcbiAgICAgICAgICAgIChjb21taXR0ZWRMYW5lcyAmIDMzNTU0NDEyOCkgPT09IGNvbW1pdHRlZExhbmVzICYmXG4gICAgICAgICAgICAgI
15852HN1c3BlbmRJbnN0YW5jZShzdXNwZW5kZWRTdGF0ZSwgZmliZXIpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgdmFyIHByZXZpb3VzSG9pc3RhYmxlUm9vdCA9IGN1cnJlbnRIb2lzdGFibGVSb290O1xuICAgICAgICAgIGN1cnJlbnRIb2lzdGFibGVSb290ID0gZ2V0SG9pc3RhYmxlUm9vdChcbiAgICAgICAgICAgIGZpYmVyLnN0YXRlTm9kZS5jb250YWluZXJJbmZvXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZWN1cnNpdmVseUFjY3VtdWxhdGVTdXNwZW5zZXlDb21taXQoXG4gICAgICAgICAgICBmaWJlcixcbiAgICAgICAgICAgIGNvbW1pdHRlZExhbmVzLFxuICAgICAgICAgICAgc3VzcGVuZGVkU3RhdGVcbiAgICAgICAgICApO1xuICAgICAgICAgIGN1cnJlbnRIb2lzdGFibGVSb290ID0gcHJldmlvdXNIb2lzdGFibGVSb290O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgIG51bGwgPT09IGZpYmVyLm1lbW9pemVkU3RhdGUgJiZcbiAgICAgICAgICAgICgocHJldmlvdXNIb2lzdGFibGVSb290ID0gZmliZXIuYWx0ZXJuYXRlKSxcbiAgICAgICAgICAgIG51bGwgIT09IHByZXZpb3VzSG9pc3RhYmxlUm9vdCAmJlxuICAgICAgICAgICAgbnVsbCAhPT0gcHJldmlvdXNIb2lzdGFibGVSb290Lm1lbW9pemVkU3RhdGVcbiAgICAgICAgICAgICAgPyAoKHByZXZpb3VzSG9pc3RhYmxlUm9vdCA9IHN1c3BlbnNleUNvbW1pdEZsYWcpLFxuICAgICAgICAgICAgICAgIChzdXNwZW5zZXlDb21taXRGbGFnID0gMTY3NzcyMTYpLFxuICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZWx5QWNjdW11bGF0ZVN1c3BlbnNleUNvbW1pdChcbiAgICAgICAgICAgICAgICAgIGZpYmVyLFxuICAgICAgICAgICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgICAgICAgICBzdXNwZW5kZWRTdGF0ZVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKHN1c3BlbnNleUNvbW1pdEZsYWcgPSBwcmV2aW91c0hvaXN0YWJsZVJvb3QpKVxuICAgICAgICAgICAgICA6IHJlY3Vyc2l2ZWx5QWNjdW11bGF0ZVN1c3BlbnNleUNvbW1pdChcbiAgICAgICAgICAgICAgICAgIGZpYmVyLFxuICAgICAgICAgICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgICAgICAgICBzdXNwZW5kZWRTdGF0ZVxuICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDMwOlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIDAgIT09IChmaWJlci5mbGFncyAmIHN1c3BlbnNleUNvbW1pdEZsYWcpICYmXG4gICAgICAgICAgICAoKHByZXZpb3VzSG9pc3RhYmxlUm9vdCA9IGZpYmVyLm1lbW9pemVkUHJvcHMubmFtZSksXG4gICAgICAgICAgICBudWxsICE9IHByZXZpb3VzSG9pc3RhYmxlUm9vdCAmJiBcImF1dG9cIiAhPT0gcHJldmlvdXNIb2lzdGFibGVSb290KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdmFyIHN0YXRlID0gZmliZXIuc3RhdGVOb2RlO1xuICAgICAgICAgICAgc3RhdGUucGFpcmVkID0gbnVsbDtcbiAgICAgICAgICAgIG51bGwgPT09IGFwcGVhcmluZ1ZpZXdUcmFuc2l0aW9ucyAmJlxuICAgICAgICAgICAgICAoYXBwZWFyaW5nVmlld1RyYW5zaXRpb25zID0gbmV3IE1hcCgpKTtcbiAgICAgICAgICAgIGFwcGVhcmluZ1ZpZXdUcmFuc2l0aW9ucy5zZXQocHJldmlvdXNIb2lzdGFibGVSb290LCBzdGF0ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlY3Vyc2l2ZWx5QWNjdW11bGF0ZVN1c3BlbnNleUNvbW1pdChcbiAgICAgICAgICAgIGZpYmVyLFxuICAgICAgICAgICAgY29tbWl0dGVkTGFuZXMsXG4gICAgICAgICAgICBzdXNwZW5kZWRTdGF0ZVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmVjdXJzaXZlbHlBY2N1bXVsYXRlU3VzcGVuc2V5Q29tbWl0KFxuICAgICAgICAgICAgZmliZXIsXG4gICAgICAgICAgICBjb21taXR0ZWRMYW5lcyxcbiAgICAgICAgICAgIHN1c3BlbmRlZFN0YXRlXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZGV0YWNoQWx0ZXJuYXRlU2libGluZ3MocGFyZW50RmliZXIpIHtcbiAgICAgIHZhciBwcmV2aW91c0ZpYmVyID0gcGFyZW50RmliZXIuYWx0ZXJuYXRlO1xuICAgICAgaWYgKFxuICAgICAgICBudWxsICE9PSBwcmV2aW91c0ZpYmVyICYmXG4gICAgICAgICgocGFyZW50RmliZXIgPSBwcmV2aW91c0ZpYmVyLmNoaWxkKSwgbnVsbCAhPT0gcGFyZW50RmliZXIpXG4gICAgICApIHtcbiAgICAgICAgcHJldmlvdXNGaWJlci5jaGlsZCA9IG51bGw7XG4gICAgICAgIGRvXG4gICAgICAgICAgKHByZXZpb3VzRmliZXIgPSBwYXJlbnRGaWJlci5zaWJsaW5nKSxcbiAgICAgICAgICAgIChwYXJlbnRGaWJlci5zaWJsaW5nID0gbnVsbCksXG4gICAgICAgICAgICAocGFyZW50RmliZXIgPSBwcmV2aW91c0ZpYmVyKTtcbiAgICAgICAgd2hpbGUgKG51bGwgIT09IHBhcmVudEZpYmVyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcmVjdXJzaXZlbHlUcmF2ZXJzZVBhc3NpdmVVbm1vdW50RWZmZWN0cyhwYXJlbnRGaWJlcikge1xuICAgICAgdmFyIGRlbGV0aW9ucyA9IHBhcmVudEZpYmVyLmRlbGV0aW9ucztcbiAgICAgIGlmICgwICE9PSAocGFyZW50RmliZXIuZmxhZ3MgJiAxNikpIHtcbiAgICAgICAgaWYgKG51bGwgIT09IGRlbGV0aW9ucylcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlbGV0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNoaWxkVG9EZWxldGUgPSBkZWxldGlvbnNbaV0sXG4gICAgICAgICAgICAgIHByZXZFZmZlY3RTdGFydCA9IHB1c2hDb21wb25lbnRFZmZlY3RTdGFydCgpO1xuICAgICAgICAgICAgbmV4dEVmZmVjdCA9IGNoaWxkVG9EZWxldGU7XG4gICAgICAgICAgICBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNJbnNpZGVPZkRlbGV0ZWRUcmVlX2JlZ2luKFxuICAgICAgICAgICAgICBjaGlsZFRvRGVsZXRlLFxuICAgICAgICAgICAgICBwYXJlbnRGaWJlclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIChjaGlsZFRvRGVsZXRlLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9
15852kZSAmJlxuICAgICAgICAgICAgICAwIDw9IGNvbXBvbmVudEVmZmVjdFN0YXJ0VGltZSAmJlxuICAgICAgICAgICAgICAwIDw9IGNvbXBvbmVudEVmZmVjdEVuZFRpbWUgJiZcbiAgICAgICAgICAgICAgMC4wNSA8IGNvbXBvbmVudEVmZmVjdEVuZFRpbWUgLSBjb21wb25lbnRFZmZlY3RTdGFydFRpbWUgJiZcbiAgICAgICAgICAgICAgbG9nQ29tcG9uZW50VHJpZ2dlcihcbiAgICAgICAgICAgICAgICBjaGlsZFRvRGVsZXRlLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudEVmZmVjdFN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICBjb21wb25lbnRFZmZlY3RFbmRUaW1lLFxuICAgICAgICAgICAgICAgIFwiVW5tb3VudFwiXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBwb3BDb21wb25lbnRFZmZlY3RTdGFydChwcmV2RWZmZWN0U3RhcnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgZGV0YWNoQWx0ZXJuYXRlU2libGluZ3MocGFyZW50RmliZXIpO1xuICAgICAgfVxuICAgICAgaWYgKHBhcmVudEZpYmVyLnN1YnRyZWVGbGFncyAmIDEwMjU2KVxuICAgICAgICBmb3IgKHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuY2hpbGQ7IG51bGwgIT09IHBhcmVudEZpYmVyOyApXG4gICAgICAgICAgY29tbWl0UGFzc2l2ZVVubW91bnRPbkZpYmVyKHBhcmVudEZpYmVyKSxcbiAgICAgICAgICAgIChwYXJlbnRGaWJlciA9IHBhcmVudEZpYmVyLnNpYmxpbmcpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudE9uRmliZXIoZmluaXNoZWRXb3JrKSB7XG4gICAgICB2Y
15852XIgcHJldkVmZmVjdFN0YXJ0ID0gcHVzaENvbXBvbmVudEVmZmVjdFN0YXJ0KCksXG4gICAgICAgIHByZXZFZmZlY3REdXJhdGlvbiA9IHB1c2hDb21wb25lbnRFZmZlY3REdXJhdGlvbigpLFxuICAgICAgICBwcmV2RWZmZWN0RXJyb3JzID0gcHVzaENvbXBvbmVudEVmZmVjdEVycm9ycygpLFxuICAgICAgICBwcmV2RWZmZWN0RGlkU3Bhd25VcGRhdGUgPSBwdXNoQ29tcG9uZW50RWZmZWN0RGlkU3Bhd25VcGRhdGUoKTtcbiAgICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgIGNhc2UgMTE6XG4gICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZVBhc3NpdmVVbm1vdW50RWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIGZpbmlzaGVkV29yay5mbGFncyAmIDIwNDggJiZcbiAgICAgICAgICAgIGNvbW1pdEhvb2tQYXNzaXZlVW5tb3VudEVmZmVjdHMoXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLnJldHVybixcbiAgICAgICAgICAgICAgUGFzc2l2ZSB8IEhhc0VmZmVjdFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHZhciBwcmV2UHJvZmlsZXJFZmZlY3REdXJhdGlvbiA9IHB1c2hOZXN0ZWRFZmZlY3REdXJhdGlvbnMoKTtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlUGFzc2l2ZVVubW91bnRFZmZlY3RzKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgZmluaXNoZWRXb3JrLnN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gKz1cbiAgICAgICAgICAgIHBvcE5lc3RlZEVmZmVjdER1cmF0aW9ucyhwcmV2UHJvZmlsZXJFZmZlY3REdXJhdGlvbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgcHJldlByb2ZpbGVyRWZmZWN0RHVyYXRpb24gPSBwdXNoTmVzdGVkRWZmZWN0RHVyYXRpb25zKCk7XG4gICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZVBhc3NpdmVVbm1vdW50RWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIGZpbmlzaGVkV29yay5zdGF0ZU5vZGUucGFzc2l2ZUVmZmVjdER1cmF0aW9uICs9XG4gICAgICAgICAgICBidWJibGVOZXN0ZWRFZmZlY3REdXJhdGlvbnMocHJldlByb2ZpbGVyRWZmZWN0RHVyYXRpb24pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgIHByZXZQcm9maWxlckVmZmVjdER1cmF0aW9uID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICBudWxsICE9PSBmaW5pc2hlZFdvcmsubWVtb2l6ZWRTdGF0ZSAmJlxuICAgICAgICAgIHByZXZQcm9maWxlckVmZmVjdER1cmF0aW9uLl92aXNpYmlsaXR5ICZcbiAgICAgICAgICAgIE9mZnNjcmVlblBhc3NpdmVFZmZlY3RzQ29ubmVjdGVkICYmXG4gICAgICAgICAgKG51bGwgPT09IGZpbmlzaGVkV29yay5yZXR1cm4gfHwgMTMgIT09IGZpbmlzaGVkV29yay5yZXR1cm4udGFnKVxuICAgICAgICAgICAgPyAoKHByZXZQcm9maWxlckVmZmVjdER1cmF0aW9uLl92aXNpYmlsaXR5ICY9XG4gICAgICAgICAgICAgICAgfk9mZnNjcmVlblBhc3NpdmVFZmZlY3RzQ29ubmVjdGVkKSxcbiAgICAgICAgICAgICAgcmVjdXJzaXZlbHlUcmF2ZXJzZURpc2Nvbm5lY3RQYXNzaXZlRWZmZWN0cyhmaW5pc2hlZFdvcmspLFxuICAgICAgICAgICAgICAoZmluaXNoZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSAmJlxuICAgICAgICAgICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lICYmXG4gICAgICAgICAgICAgICAgMCA8PSBjb21wb25lbnRFZmZlY3RFbmRUaW1lICYmXG4gICAgICAgICAgICAgICAgMC4wNSA8IGNvbXBvbmVudEVmZmVjdEVuZFRpbWUgLSBjb21wb25lbnRFZmZlY3RTdGFydFRpbWUgJiZcbiAgICAgICAgICAgICAgICBsb2dDb21wb25lbnRUcmlnZ2VyKFxuICAgICAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICAgICAgY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgY29tcG9uZW50RWZmZWN0RW5kVGltZSxcbiAgICAgICAgICAgICAgICAgIFwiRGlzY29ubmVjdFwiXG4gICAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgIDogcmVjdXJzaXZlbHlUcmF2ZXJzZVBhc3NpdmVVbm1vdW50RWZmZWN0cyhmaW5pc2hlZFdvcmspO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VQYXNzaXZlVW5tb3VudEVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgIH1cbiAgICAgIChmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlICYmXG4gICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lICYmXG4gICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0RW5kVGltZSAmJlxuICAgICAgICAoY29tcG9uZW50RWZmZWN0U3Bhd25lZFVwZGF0ZSB8fCAwLjA1IDwgY29tcG9uZW50RWZmZWN0RHVyYXRpb24pICYmXG4gICAgICAgIGxvZ0NvbXBvbmVudEVmZmVjdChcbiAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lLFxuICAgICAgICAgIGNvbXBvbmVudEVmZmVjdEVuZFRpbWUsXG4gICAgICAgICAgY29tcG9uZW50RWZmZWN0RHVyYXRpb24sXG4gICAgICAgICAgY29tcG9uZW50RWZmZWN0RXJyb3JzXG4gICAgICAgICk7XG4gICAgICBwb3BDb21wb25lbnRFZmZlY3RTdGFydChwcmV2RWZmZWN0U3RhcnQpO1xuICAgICAgcG9wQ29tcG9uZW50RWZmZWN0RHVyYXRpb24ocHJldkVmZmVjdER1cmF0aW9uKTtcbiAgICAgIGNvbXBvbmVudEVmZmVjdFNwYXduZWRVcGRhdGUgPSBwcmV2RWZmZWN0RGlkU3Bhd25VcGRhdGU7XG4gICAgICBjb21wb25lbnRFZmZlY3RFcnJvcnMgPSBwcmV2RWZmZWN0RXJyb3JzO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWN1cnNpdmVseVRyYXZlcnNlRGlzY29ubmVjdFBhc3NpdmVFZmZlY3RzKHBhcmVudEZpYmVyKSB7XG4gICAgICB2Y
15852XIgZGVsZXRpb25zID0gcGFyZW50RmliZXIuZGVsZXRpb25zO1xuICAgICAgaWYgKDAgIT09IChwYXJlbnRGaWJlci5mbGFncyAmIDE2KSkge1xuICAgICAgICBpZiAobnVsbCAhPT0gZGVsZXRpb25zKVxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVsZXRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2hpbGRUb0RlbGV0ZSA9IGRlbGV0aW9uc1tpXSxcbiAgICAgICAgICAgICAgcHJldkVmZmVjdFN0YXJ0ID0gcHVzaENvbXBvbmVudEVmZmVjdFN0YXJ0KCk7XG4gICAgICAgICAgICBuZXh0RWZmZWN0ID0gY2hpbGRUb0RlbGV0ZTtcbiAgICAgICAgICAgIGNvbW1pdFBhc3NpdmVVbm1vdW50RWZmZWN0c0luc2lkZU9mRGVsZXRlZFRyZWVfYmVnaW4oXG4gICAgICAgICAgICAgIGNoaWxkVG9EZWxldGUsXG4gICAgICAgICAgICAgIHBhcmVudEZpYmVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgKGNoaWxkVG9EZWxldGUubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlICYmXG4gICAgICAgICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lICYmXG4gICAgICAgICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0RW5kVGltZSAmJlxuICAgICAgICAgICAgICAwLjA1IDwgY29tcG9uZW50RWZmZWN0RW5kVGltZSAtIGNvbXBvbmVudEVmZmVjdFN0YXJ0VGltZSAmJlxuICAgICAgICAgICAgICBsb2dDb21wb25lbnRUcmlnZ2VyKFxuICAgICAgICAgICAgICAgIGNoaWxkVG9EZWxldGUsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgIGNvbXBvbmVudEVmZmVjdEVuZFRpbWUsXG4gICAgICAgICAgICAgICAgXCJVbm1vdW50XCJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHBvcENvbXBvbmVudEVmZmVjdFN0YXJ0KHByZXZFZmZlY3RTdGFydCk7XG4gICAgICAgICAgfVxuICAgICAgICBkZXRhY2hBbHRlcm5hdGVTaWJsaW5ncyhwYXJlbnRGaWJlcik7XG4gICAgICB9XG4gICAgICBmb3IgKHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuY2hpbGQ7IG51bGwgIT09IHBhcmVudEZpYmVyOyApXG4gICAgICAgIGRpc2Nvbm5lY3RQYXNzaXZlRWZmZWN0KHBhcmVudEZpYmVyKSxcbiAgICAgICAgICAocGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5zaWJsaW5nKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGlzY29ubmVjdFBhc3NpdmVFZmZlY3QoZmluaXNoZWRXb3JrKSB7XG4gICAgICB2Y
15852XIgcHJldkVmZmVjdFN0YXJ0ID0gcHVzaENvbXBvbmVudEVmZmVjdFN0YXJ0KCksXG4gICAgICAgIHByZXZFZmZlY3REdXJhdGlvbiA9IHB1c2hDb21wb25lbnRFZmZlY3REdXJhdGlvbigpLFxuICAgICAgICBwcmV2RWZmZWN0RXJyb3JzID0gcHVzaENvbXBvbmVudEVmZmVjdEVycm9ycygpLFxuICAgICAgICBwcmV2RWZmZWN0RGlkU3Bhd25VcGRhdGUgPSBwdXNoQ29tcG9uZW50RWZmZWN0RGlkU3Bhd25VcGRhdGUoKTtcbiAgICAgIHN3aXRjaCAoZmluaXNoZWRXb3JrLnRhZykge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgIGNhc2UgMTE6XG4gICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgY29tbWl0SG9va1Bhc3NpdmVVbm1vdW50RWZmZWN0cyhcbiAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgIGZpbmlzaGVkV29yay5yZXR1cm4sXG4gICAgICAgICAgICBQYXNzaXZlXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGlzY29ubmVjdFBhc3NpdmVFZmZlY3RzKGZpbmlzaGVkV29yayk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgdmFyIGluc3RhbmNlID0gZmluaXNoZWRXb3JrLnN0YXRlTm9kZTtcbiAgICAgICAgICBpbnN0YW5jZS5fdmlzaWJpbGl0eSAmIE9mZnNjcmVlblBhc3NpdmVFZmZlY3RzQ29ubmVjdGVkICYmXG4gICAgICAgICAgICAoKGluc3RhbmNlLl92aXNpYmlsaXR5ICY9IH5PZmZzY3JlZW5QYXNzaXZlRWZmZWN0c0Nvbm5lY3RlZCksXG4gICAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlRGlzY29ubmVjdFBhc3NpdmVFZmZlY3RzKGZpbmlzaGVkV29yaykpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VEaXNjb25uZWN0UGFzc2l2ZUVmZmVjdHMoZmluaXNoZWRXb3JrKTtcbiAgICAgIH1cbiAgICAgIChmaW5pc2hlZFdvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlICYmXG4gICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lICYmXG4gICAgICAgIDAgPD0gY29tcG9uZW50RWZmZWN0RW5kVGltZSAmJlxuICAgICAgICAoY29tcG9uZW50RWZmZWN0U3Bhd25lZFVwZGF0ZSB8fCAwLjA1IDwgY29tcG9uZW50RWZmZWN0RHVyYXRpb24pICYmXG4gICAgICAgIGxvZ0NvbXBvbmVudEVmZmVjdChcbiAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lLFxuICAgICAgICAgIGNvbXBvbmVudEVmZmVjdEVuZFRpbWUsXG4gICAgICAgICAgY29tcG9uZW50RWZmZWN0RHVyYXRpb24sXG4gICAgICAgICAgY29tcG9uZW50RWZmZWN0RXJyb3JzXG4gICAgICAgICk7XG4gICAgICBwb3BDb21wb25lbnRFZmZlY3RTdGFydChwcmV2RWZmZWN0U3RhcnQpO1xuICAgICAgcG9wQ29tcG9uZW50RWZmZWN0RHVyYXRpb24ocHJldkVmZmVjdER1cmF0aW9uKTtcbiAgICAgIGNvbXBvbmVudEVmZmVjdFNwYXduZWRVcGRhdGUgPSBwcmV2RWZmZWN0RGlkU3Bhd25VcGRhdGU7XG4gICAgICBjb21wb25lbnRFZmZlY3RFcnJvcnMgPSBwcmV2RWZmZWN0RXJyb3JzO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21taXRQYXNzaXZlVW5tb3VudEVmZmVjdHNJbnNpZGVPZkRlbGV0ZWRUcmVlX2JlZ2luKFxuICAgICAgZGVsZXRlZFN1YnRyZWVSb290LFxuICAgICAgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciRqc2NvbXAkMFxuICAgICkge1xuICAgICAgZm9yICg7IG51bGwgIT09IG5leHRFZmZlY3Q7ICkge1xuICAgICAgICB2Y
15852XIgZmliZXIgPSBuZXh0RWZmZWN0LFxuICAgICAgICAgIGN1cnJlbnQgPSBmaWJlcixcbiAgICAgICAgICBuZWFyZXN0TW91bnRlZEFuY2VzdG9yID0gbmVhcmVzdE1vdW50ZWRBbmNlc3RvciRqc2NvbXAkMCxcbiAgICAgICAgICBwcmV2RWZmZWN0U3RhcnQgPSBwdXNoQ29tcG9uZW50RWZmZWN0U3RhcnQoKSxcbiAgICAgICAgICBwcmV2RWZmZWN0RHVyYXRpb24gPSBwdXNoQ29tcG9uZW50RWZmZWN0RHVyYXRpb24oKSxcbiAgICAgICAgICBwcmV2RWZmZWN0RXJyb3JzID0gcHVzaENvbXBvbmVudEVmZmVjdEVycm9ycygpLFxuICAgICAgICAgIHByZXZFZmZlY3REaWRTcGF3blVwZGF0ZSA9IHB1c2hDb21wb25lbnRFZmZlY3REaWRTcGF3blVwZGF0ZSgpO1xuICAgICAgICBzd2l0Y2ggKGN1cnJlbnQudGFnKSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgIGNvbW1pdEhvb2tQYXNzaXZlVW5tb3VudEVmZmVjdHMoXG4gICAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICAgIG5lYXJlc3RNb3VudGVkQW5jZXN0b3IsXG4gICAgICAgICAgICAgIFBhc3NpdmVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDIzOlxuICAgICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgICBudWxsICE9PSBjdXJyZW50Lm1lbW9pemVkU3RhdGUgJiZcbiAgICAgICAgICAgICAgbnVsbCAhPT0gY3VycmVudC5tZW1vaXplZFN0YXRlLmNhY2hlUG9vbCAmJlxuICAgICAgICAgICAgICAoKG5lYXJlc3RNb3VudGVkQW5jZXN0b3IgPSBjdXJyZW50Lm1lbW9pemVkU3RhdGUuY2FjaGVQb29sLnBvb2wpLFxuICAgICAgICAgICAgICBudWxsICE9IG5lYXJlc3RNb3VudGVkQW5jZXN0b3IgJiZcbiAgICAgICAgICAgICAgICByZXRhaW5DYWNoZShuZWFyZXN0TW91bnRlZEFuY2VzdG9yKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDI0OlxuICAgICAgICAgICAgcmVsZWFzZUNhY2hlKGN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5jYWNoZSk7XG4gICAgICAgIH1cbiAgICAgICAgKGN1cnJlbnQubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlICYmXG4gICAgICAgICAgMCA8PSBjb21wb25lbnRFZmZlY3RTdGFydFRpbWUgJiZcbiAgICAgICAgICAwIDw9IGNvbXBvbmVudEVmZmVjdEVuZFRpbWUgJiZcbiAgICAgICAgICAoY29tcG9uZW50RWZmZWN0U3Bhd25lZFVwZGF0ZSB8fCAwLjA1IDwgY29tcG9uZW50RWZmZWN0RHVyYXRpb24pICYmXG4gICAgICAgICAgbG9nQ29tcG9uZW50RWZmZWN0KFxuICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgIGNvbXBvbmVudEVmZmVjdFN0YXJ0VGltZSxcbiAgICAgICAgICAgIGNvbXBvbmVudEVmZmVjdEVuZFRpbWUsXG4gICAgICAgICAgICBjb21wb25lbnRFZmZlY3REdXJhdGlvbixcbiAgICAgICAgICAgIGNvbXBvbmVudEVmZmVjdEVycm9yc1xuICAgICAgICAgICk7XG4gICAgICAgIHBvcENvbXBvbmVudEVmZmVjdFN0YXJ0KHByZXZFZmZlY3RTdGFydCk7XG4gICAgICAgIHBvcENvbXBvbmVudEVmZmVjdER1cmF0aW9uKHByZXZFZmZlY3REdXJhdGlvbik7XG4gICAgICAgIGNvbXBvbmVudEVmZmVjdFNwYXduZWRVcGRhdGUgPSBwcmV2RWZmZWN0RGlkU3Bhd25VcGRhdGU7XG4gICAgICAgIGNvbXBvbmVudEVmZmVjdEVycm9ycyA9IHByZXZFZmZlY3RFcnJvcnM7XG4gICAgICAgIGN1cnJlbnQgPSBmaWJlci5jaGlsZDtcbiAgICAgICAgaWYgKG51bGwgIT09IGN1cnJlbnQpIChjdXJyZW50LnJldHVybiA9IGZpYmVyKSwgKG5leHRFZmZlY3QgPSBjdXJyZW50KTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGE6IGZvciAoZmliZXIgPSBkZWxldGVkU3VidHJlZVJvb3Q7IG51bGwgIT09IG5leHRFZmZlY3Q7ICkge1xuICAgICAgICAgICAgY3VycmVudCA9IG5leHRFZmZlY3Q7XG4gICAgICAgICAgICBwcmV2RWZmZWN0U3RhcnQgPSBjdXJyZW50LnNpYmxpbmc7XG4gICAgICAgICAgICBwcmV2RWZmZWN0RHVyYXRpb24gPSBjdXJyZW50LnJldHVybjtcbiAgICAgICAgICAgIGRldGFjaEZpYmVyQWZ0ZXJFZmZlY3RzKGN1cnJlbnQpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IGZpYmVyKSB7XG4gICAgICAgICAgICAgIG5leHRFZmZlY3QgPSBudWxsO1xuICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG51bGwgIT09IHByZXZFZmZlY3RTdGFydCkge1xuICAgICAgICAgICAgICBwcmV2RWZmZWN0U3RhcnQucmV0dXJuID0gcHJldkVmZmVjdER1cmF0aW9uO1xuICAgICAgICAgICAgICBuZXh0RWZmZWN0ID0gcHJldkVmZmVjdFN0YXJ0O1xuICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV4dEVmZmVjdCA9IHByZXZFZmZlY3REdXJhdGlvbjtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIG9uQ29tbWl0Um9vdCgpIHtcbiAgICAgIGNvbW1pdEhvb2tzLmZvckVhY2goZnVuY3Rpb24gKGNvbW1pdEhvb2spIHtcbiAgICAgICAgcmV0dXJuIGNvbW1pdEhvb2soKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0NvbmN1cnJlbnRBY3RFbnZpcm9ubWVudCgpIHtcbiAgICAgIHZhciBpc1JlYWN0QWN0RW52aXJvbm1lbnRHbG9iYWwgPVxuICAgICAgICBcInVuZGVmaW5lZFwiICE9PSB0eXBlb2YgSVNfUkVBQ1RfQUNUX0VOVklST05NRU5UXG4gICAgICAgICAgPyBJU19SRUFDVF9BQ1RfRU5WSVJPTk1FTlRcbiAgICAgICAgICA6IHZvaWQgMDtcbiAgICAgIGlzUmVhY3RBY3RFbnZpcm9ubWVudEdsb2JhbCB8fFxuICAgICAgICBudWxsID09PSBSZWFjdFNoYXJlZEludGVybmFscy5hY3RRdWV1ZSB8fFxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiVGhlIGN1cnJlbnQgdGVzdGluZyBlbnZpcm9ubWVudCBpcyBub3QgY29uZmlndXJlZCB0byBzdXBwb3J0IGFjdCguLi4pXCJcbiAgICAgICAgKTtcbiAgICAgIHJldHVybiBpc1JlYWN0QWN0RW52aXJvbm1lbnRHbG9iYWw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKSB7XG4gICAgICBpZiAoXG4gICAgICAgIChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dCAmJlxuICAgICAgICAwICE9PSB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lc1xuICAgICAgKVxuICAgICAgICByZXR1cm4gd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgJiAtd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXM7XG4gICAgICB2Y
15852XIgdHJhbnNpdGlvbiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQ7XG4gICAgICBpZiAobnVsbCAhPT0gdHJhbnNpdGlvbilcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB0cmFuc2l0aW9uLl91cGRhdGVkRmliZXJzIHx8ICh0cmFuc2l0aW9uLl91cGRhdGVkRmliZXJzID0gbmV3IFNldCgpKSxcbiAgICAgICAgICB0cmFuc2l0aW9uLl91cGRhdGVkRmliZXJzLmFkZChmaWJlciksXG4gICAgICAgICAgbnVsbCAhPT0gbGFzdFN1c3BlbmRlZEZpYmVyICYmXG4gICAgICAgICAgICByZXNvbHZlVXBkYXRlUHJpb3JpdHkoKSA9PT0gRGlzY3JldGVFdmVudFByaW9yaXR5ICYmXG4gICAgICAgICAgICAobGFzdFN1c3BlbmRlZEZpYmVyID0gbnVsbCksXG4gICAgICAgICAgcmVxdWVzdFRyYW5zaXRpb25MYW5lKClcbiAgICAgICAgKTtcbiAgICAgIGZpYmVyID0gcmVzb2x2ZVVwZGF0ZVByaW9yaXR5KCk7XG4gICAgICBmaWJlciA9PT0gRGlzY3JldGVFdmVudFByaW9yaXR5ICYmIChsYXN0U3VzcGVuZGVkRmliZXIgPSBudWxsKTtcbiAgICAgIHJldHVybiBmaWJlcjtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVxdWVzdERlZmVycmVkTGFuZSgpIHtcbiAgICAgIGlmICgwID09PSB3b3JrSW5Qcm9ncmVzc0RlZmVycmVkTGFuZSlcbiAgICAgICAgaWYgKDAgPT09ICh3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAmIDUzNjg3MDkxMikgfHwgaXNIeWRyYXRpbmcpIHtcbiAgICAgICAgICB2YXIgbGFuZSA9IG5leHRUcmFuc2l0aW9uRGVmZXJyZWRMYW5lO1xuICAgICAgICAgIG5leHRUcmFuc2l0aW9uRGVmZXJyZWRMYW5lIDw8PSAxO1xuICAgICAgICAgIDAgPT09IChuZXh0VHJhbnNpdGlvbkRlZmVycmVkTGFuZSAmIDM5MzIxNjApICYmXG4gICAgICAgICAgICAobmV4dFRyYW5zaXRpb25EZWZlcnJlZExhbmUgPSAyNjIxNDQpO1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzRGVmZXJyZWRMYW5lID0gbGFuZTtcbiAgICAgICAgfSBlbHNlIHdvcmtJblByb2dyZXNzRGVmZXJyZWRMYW5lID0gNTM2ODcwOTEyO1xuICAgICAgbGFuZSA9IHN1c3BlbnNlSGFuZGxlclN0YWNrQ3Vyc29yLmN1cnJlbnQ7XG4gICAgICBudWxsICE9PSBsYW5lICYmIChsYW5lLmZsYWdzIHw9IDMyKTtcbiAgICAgIHJldHVybiB3b3JrSW5Qcm9ncmVzc0RlZmVycmVkTGFuZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2NoZWR1bGVWaWV3VHJhbnNpdGlvbkV2ZW50KGZpYmVyLCBjYWxsYmFjaykge1xuICAgICAgaWYgKG51bGwgIT0gY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIHN0YXRlID0gZmliZXIuc3RhdGVOb2RlLFxuICAgICAgICAgIGluc3RhbmNlID0gc3RhdGUucmVmO1xuICAgICAgICBudWxsID09PSBpbnN0YW5jZSAmJlxuICAgICAgICAgIChpbnN0YW5jZSA9IHN0YXRlLnJlZiA9XG4gICAgICAgICAgICBjcmVhdGVWaWV3VHJhbnNpdGlvbkluc3RhbmNlKFxuICAgICAgICAgICAgICBnZXRWaWV3VHJhbnNpdGlvbk5hbWUoZmliZXIubWVtb2l6ZWRQcm9wcywgc3RhdGUpXG4gICAgICAgICAgICApKTtcbiAgICAgICAgbnVsbCA9PT0gcGVuZGluZ1ZpZXdUcmFuc2l0aW9uRXZlbnRzICYmXG4gICAgICAgICAgKHBlbmRpbmdWaWV3VHJhbnNpdGlvbkV2ZW50cyA9IFtdKTtcbiAgICAgICAgcGVuZGluZ1ZpZXdUcmFuc2l0aW9uRXZlbnRzLnB1c2goY2FsbGJhY2suYmluZChudWxsLCBpbnN0YW5jZSkpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUpIHtcbiAgICAgIGlzUnVubmluZ0luc2VydGlvbkVmZmVjdCAmJlxuICAgICAgICBjb25zb2xlLmVycm9yKFwidXNlSW5zZXJ0aW9uRWZmZWN0IG11c3Qgbm90IHNjaGVkdWxlIHVwZGF0ZXMuXCIpO1xuICAgICAgaXNGbHVzaGluZ1Bhc3NpdmVFZmZlY3RzICYmIChkaWRTY2hlZHVsZVVwZGF0ZUR1cmluZ1Bhc3NpdmVFZmZlY3RzID0gITApO1xuICAgICAgaWYgKFxuICAgICAgICAocm9vdCA9PT0gd29ya0luUHJvZ3Jlc3NSb290ICYmXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uID09PSBTdXNwZW5kZWRPbkRhdGEgfHxcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uID09PSBTdXNwZW5kZWRPbkFjdGlvbikpIHx8XG4gICAgICAgIG51bGwgIT09IHJvb3QuY2FuY2VsUGVuZGluZ0NvbW1pdFxuICAgICAgKVxuICAgICAgICBwcmVwYXJlRnJlc2hTdGFjayhyb290LCAwKSxcbiAgICAgICAgICBtYXJrUm9vdFN1c3BlbmRlZChcbiAgICAgICAgICAgIHJvb3QsXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyxcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzRGVmZXJyZWRMYW5lLFxuICAgICAgICAgICAgITFcbiAgICAgICAgICApO1xuICAgICAgbWFya1Jvb3RVcGRhdGVkJDEocm9vdCwgbGFuZSk7XG4gICAgICBpZiAoXG4gICAgICAgIChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgIT09IE5vQ29udGV4dCAmJlxuICAgICAgICByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3RcbiAgICAgICkge1xuICAgICAgICBpZiAoaXNSZW5kZXJpbmcpXG4gICAgICAgICAgc3dpdGNoIChmaWJlci50YWcpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICByb290ID1cbiAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3MgJiYgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcih3b3JrSW5Qcm9ncmVzcykpIHx8XG4gICAgICAgICAgICAgICAgXCJVbmtub3duXCI7XG4gICAgICAgICAgICAgIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyRm9yQW5vdGhlckNvbXBvbmVudC5oYXMocm9vdCkgfHxcbiAgICAgICAgICAgICAgICAoZGlkV2FybkFib3V0VXBkYXRlSW5SZW5kZXJGb3JBbm90aGVyQ29tcG9uZW50LmFkZChyb290KSxcbiAgICAgICAgICAgICAgICAoZmliZXIgPSBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCBcIlVua25vd25cIiksXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgIFwiQ2Fubm90IHVwZGF0ZSBhIGNvbXBvbmVudCAoYCVzYCkgd2hpbGUgcmVuZGVyaW5nIGEgZGlmZmVyZW50IGNvbXBvbmVudCAoYCVzYCkuIFRvIGxvY2F0ZSB0aGUgYmFkIHNldFN0YXRlKCkgY2FsbCBpbnNpZGUgYCVzYCwgZm9sbG93IHRoZSBzdGFjayB0cmFjZSBhcyBkZXNjcmliZWQgaW4gaHR0cHM6Ly9yZWFjdC5kZXYvbGluay9zZXRzdGF0ZS1pbi1yZW5kZXJcIixcbiAgICAgICAgICAgICAgICAgIGZpYmVyLFxuICAgICAgICAgICAgICAgICAgcm9vdCxcbiAgICAgICAgICAgICAgICAgI
15852HJvb3RcbiAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyIHx8XG4gICAgICAgICAgICAgICAgKGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICBcIkNhbm5vdCB1cGRhdGUgZHVyaW5nIGFuIGV4aXN0aW5nIHN0YXRlIHRyYW5zaXRpb24gKHN1Y2ggYXMgd2l0aGluIGByZW5kZXJgKS4gUmVuZGVyIG1ldGhvZHMgc2hvdWxkIGJlIGEgcHVyZSBmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGUuXCJcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIChkaWRXYXJuQWJvdXRVcGRhdGVJblJlbmRlciA9ICEwKSk7XG4gICAgICAgICAgfVxuICAgICAgfSBlbHNlXG4gICAgICAgIGlzRGV2VG9vbHNQcmVzZW50ICYmIGFkZEZpYmVyVG9MYW5lc01hcChyb290LCBmaWJlciwgbGFuZSksXG4gICAgICAgICAgd2FybklmVXBkYXRlc05vdFdyYXBwZWRXaXRoQWN0REVWKGZpYmVyKSxcbiAgICAgICAgICByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QgJiZcbiAgICAgICAgICAgICgoZXhlY3V0aW9uQ29udGV4dCAmIFJlbmRlckNvbnRleHQpID09PSBOb0NvbnRleHQgJiZcbiAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzIHw9IGxhbmUpLFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZFdpdGhEZWxheSAmJlxuICAgICAgICAgICAgICBtYXJrUm9vdFN1c3BlbmRlZChcbiAgICAgICAgICAgICAgICByb290LFxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzLFxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzRGVmZXJyZWRMYW5lLFxuICAgICAgICAgICAgICAgICExXG4gICAgICAgICAgICAgICkpLFxuICAgICAgICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcGVyZm9ybVdvcmtPblJvb3Qocm9vdCwgbGFuZXMsIGZvcmNlU3luYykge1xuICAgICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgKFJlbmRlckNvbnRleHQgfCBDb21taXRDb250ZXh0KSkgIT09IE5vQ29udGV4dClcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJTaG91bGQgbm90IGFscmVhZHkgYmUgd29ya2luZy5cIik7XG4gICAgICBpZiAoMCAhPT0gd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgJiYgbnVsbCAhPT0gd29ya0luUHJvZ3Jlc3MpIHtcbiAgICAgICAgdmFyIHlpZWxkZWRGaWJlciA9IHdvcmtJblByb2dyZXNzLFxuICAgICAgICAgIHlpZWxkRW5kVGltZSA9IG5vdyQxKCk7XG4gICAgICAgIHN3aXRjaCAoeWllbGRSZWFzb24pIHtcbiAgICAgICAgICBjYXNlIFN1c3BlbmRlZE9uSW1tZWRpYXRlOlxuICAgICAgICAgIGNhc2UgU3VzcGVuZGVkT25EYXRhOlxuICAgICAgICAgICAgdmFyIHN0YXJ0VGltZSA9IHlpZWxkU3RhcnRUaW1lO1xuICAgICAgICAgICAgc3VwcG9ydHNVc2VyVGltaW5nICYmXG4gICAgICAgICAgICAgICgoeWllbGRlZEZpYmVyID0geWllbGRlZEZpYmVyLl9kZWJ1Z1Rhc2spXG4gICAgICAgICAgICAgICAgPyB5aWVsZGVkRmliZXIucnVuKFxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLnRpbWVTdGFtcC5iaW5kKFxuICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUsXG4gICAgICAgICAgICAgICAgICAgICAgXCJTdXNwZW5kZWRcIixcbiAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgICAgICAgeWllbGRFbmRUaW1lLFxuICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVFNfVFJBQ0ssXG4gICAgICAgICAgICAgICAgICAgICAgdm9pZCAwLFxuICAgICAgICAgICAgICAgICAgICAgIFwicHJpbWFyeS1saWdodFwiXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA6IGNvbnNvbGUudGltZVN0YW1wKFxuICAgICAgICAgICAgICAgICAgICBcIlN1c3BlbmRlZFwiLFxuICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgICAgIHlpZWxkRW5kVGltZSxcbiAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UU19UUkFDSyxcbiAgICAgICAgICAgICAgICAgICAgdm9pZCAwLFxuICAgICAgICAgICAgICAgICAgICBcInByaW1hcnktbGlnaHRcIlxuICAgICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFN1c3BlbmRlZE9uQWN0aW9uOlxuICAgICAgICAgICAgc3RhcnRUaW1lID0geWllbGRTdGFydFRpbWU7XG4gICAgICAgICAgICBzdXBwb3J0c1VzZXJUaW1pbmcgJiZcbiAgICAgICAgICAgICAgKCh5aWVsZGVkRmliZXIgPSB5aWVsZGVkRmliZXIuX2RlYnVnVGFzaylcbiAgICAgICAgICAgICAgICA/IHlpZWxkZWRGaWJlci5ydW4oXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUudGltZVN0YW1wLmJpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgY29uc29sZSxcbiAgICAgICAgICAgICAgICAgICAgICBcIkFjdGlvblwiLFxuICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICAgICAgICB5aWVsZEVuZFRpbWUsXG4gICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UU19UUkFDSyxcbiAgICAgICAgICAgICAgICAgICAgICB2b2lkIDAsXG4gICAgICAgICAgICAgICAgICAgICAgXCJwcmltYXJ5LWxpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogY29uc29sZS50aW1lU3RhbXAoXG4gICAgICAgICAgICAgICAgICAgIFwiQWN0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICAgICAgeWllbGRFbmRUaW1lLFxuICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRTX1RSQUNLLFxuICAgICAgICAgICAgICAgICAgICB2b2lkIDAsXG4gICAgICAgICAgICAgICAgICAgIFwicHJpbWFyeS1saWdodFwiXG4gICAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBzdXBwb3J0c1VzZXJUaW1pbmcgJiZcbiAgICAgICAgICAgICAgKCh5aWVsZGVkRmliZXIgPSB5aWVsZEVuZFRpbWUgLSB5aWVsZFN0YXJ0VGltZSksXG4gICAgICAgICAgICAgIDMgPiB5aWVsZGVkRmliZXIgfHxcbiAgICAgICAgICAgICAgICBjb25zb2xlLnRpbWVTdGFtcChcbiAgICAgICAgICAgICAgICAgIFwiQmxvY2tlZFwiLFxuICAgICAgICAgICAgICAgICAgeWllbGRTdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgICB5aWVsZEVuZFRpbWUsXG4gICAgICAgICAgICAgICAgICBDT01QT05FTlRTX1RSQUNLLFxuICAgICAgICAgICAgICAgICAgdm9pZCAwLFxuICAgICAgICAgICAgICAgICAgNSA+IHlpZWxkZWRGaWJlclxuICAgICAgICAgICAgICAgICAgICA/IFwicHJpbWFyeS1saWdodFwiXG4gICAgICAgICAgICAgICAgICAgIDogMTAgPiB5aWVsZGVkRmliZXJcbiAgICAgICAgICAgICAgICAgICAgICA/IFwicHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgOiAxMDAgPiB5aWVsZGVkRmliZXJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gXCJwcmltYXJ5LWRhcmtcIlxuICAgICAgICAgICAgICAgICAgICAgICAgOiBcImVycm9yXCJcbiAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc3RhcnRUaW1lID0gKGZvcmNlU3luYyA9XG4gICAgICAgICghZm9yY2VTeW5jICYmXG4gICAgICAgICAgMCA9PT0gKGxhbmVzICYgMTI3KSAmJlxuICAgICAgICAgIDAgPT09IChsYW5lcyAmIHJvb3QuZXhwaXJlZExhbmVzKSkgfHxcbiAgICAgICAgY2hlY2tJZlJvb3RJc1ByZXJlbmRlcmluZyhyb290LCBsYW5lcykpXG4gICAgICAgID8gcmVuZGVyUm9vdENvbmN1cnJlbnQocm9vdCwgbGFuZXMpXG4gICAgICAgIDogcmVuZGVyUm9vdFN5bmMocm9vdCwgbGFuZXMsICEwKTtcbiAgICAgIHZhciByZW5kZXJXYXNDb25jdXJyZW50ID0gZm9yY2VTeW5jO1xuICAgICAgZG8ge1xuICAgICAgICBpZiAoc3RhcnRUaW1lID09PSBSb290SW5Qcm9ncmVzcykge1xuICAgICAgICAgI
15852HdvcmtJblByb2dyZXNzUm9vdElzUHJlcmVuZGVyaW5nICYmXG4gICAgICAgICAgICAhZm9yY2VTeW5jICYmXG4gICAgICAgICAgICBtYXJrUm9vdFN1c3BlbmRlZChyb290LCBsYW5lcywgMCwgITEpO1xuICAgICAgICAgIGxhbmVzID0gd29ya0luUHJvZ3Jlc3NTdXNwZW5kZWRSZWFzb247XG4gICAgICAgICAgeWllbGRTdGFydFRpbWUgPSBub3coKTtcbiAgICAgICAgICB5aWVsZFJlYXNvbiA9IGxhbmVzO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHlpZWxkZWRGaWJlciA9IG5vdyQxKCk7XG4gICAgICAgICAgeWllbGRFbmRUaW1lID0gcm9vdC5jdXJyZW50LmFsdGVybmF0ZTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICByZW5kZXJXYXNDb25jdXJyZW50ICYmXG4gICAgICAgICAgICAhaXNSZW5kZXJDb25zaXN0ZW50V2l0aEV4dGVybmFsU3RvcmVzKHlpZWxkRW5kVGltZSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHNldEN1cnJlbnRUcmFja0Zyb21MYW5lcyhsYW5lcyk7XG4gICAgICAgICAgICB5aWVsZEVuZFRpbWUgPSByZW5kZXJTdGFydFRpbWU7XG4gICAgICAgICAgICBzdGFydFRpbWUgPSB5aWVsZGVkRmliZXI7XG4gICAgICAgICAgICAhc3VwcG9ydHNVc2VyVGltaW5nIHx8XG4gICAgICAgICAgICAgIHN0YXJ0VGltZSA8PSB5aWVsZEVuZFRpbWUgfHxcbiAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzVXBkYXRlVGFza1xuICAgICAgICAgICAgICAgID8gd29ya0luUHJvZ3Jlc3NVcGRhdGVUYXNrLnJ1bihcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS50aW1lU3RhbXAuYmluZChcbiAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLFxuICAgICAgICAgICAgICAgICAgICAgIFwiVGVhcmVkIFJlbmRlclwiLFxuICAgICAgICAgICAgICAgICAgICAgIHlpZWxkRW5kVGltZSxcbiAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudFRyYWNrLFxuICAgICAgICAgICAgICAgICAgICAgIExBTkVTX1RSQUNLX0dST1VQLFxuICAgICAgICAgICAgICAgICAgICAgIFwiZXJyb3JcIlxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiBjb25zb2xlLnRpbWVTdGFtcChcbiAgICAgICAgICAgICAgICAgICAgXCJUZWFyZWQgUmVuZGVyXCIsXG4gICAgICAgICAgICAgICAgICAgIHlpZWxkRW5kVGltZSxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VHJhY2ssXG4gICAgICAgICAgICAgICAgICAgIExBTkVTX1RSQUNLX0dST1VQLFxuICAgICAgICAgICAgICAgICAgICBcImVycm9yXCJcbiAgICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgZmluYWxpemVSZW5kZXIobGFuZXMsIHlpZWxkZWRGaWJlcik7XG4gICAgICAgICAgICBzdGFydFRpbWUgPSByZW5kZXJSb290U3luYyhyb290LCBsYW5lcywgITEpO1xuICAgICAgICAgICAgcmVuZGVyV2FzQ29uY3VycmVudCA9ICExO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdGFydFRpbWUgPT09IFJvb3RFcnJvcmVkKSB7XG4gICAgICAgICAgICByZW5kZXJXYXNDb25jdXJyZW50ID0gbGFuZXM7XG4gICAgICAgICAgICBpZiAocm9vdC5lcnJvclJlY292ZXJ5RGlzYWJsZWRMYW5lcyAmIHJlbmRlcldhc0NvbmN1cnJlbnQpXG4gICAgICAgICAgICAgIHZhciBlcnJvclJldHJ5TGFuZXMgPSAwO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAoZXJyb3JSZXRyeUxhbmVzID0gcm9vdC5wZW5kaW5nTGFuZXMgJiAtNTM2ODcwOTEzKSxcbiAgICAgICAgICAgICAgICAoZXJyb3JSZXRyeUxhbmVzID1cbiAgICAgICAgICAgICAgICAgIDAgIT09IGVycm9yUmV0cnlMYW5lc1xuICAgICAgICAgICAgICAgICAgICA/IGVycm9yUmV0cnlMYW5lc1xuICAgICAgICAgICAgICAgICAgICA6IGVycm9yUmV0cnlMYW5lcyAmIDUzNjg3MDkxMlxuICAgICAgICAgICAgICAgICAgICAgID8gNTM2ODcwOTEyXG4gICAgICAgICAgICAgICAgICAgICAgOiAwKTtcbiAgICAgICAgICAgIGlmICgwICE9PSBlcnJvclJldHJ5TGFuZXMpIHtcbiAgICAgICAgICAgICAgc2V0Q3VycmVudFRyYWNrRnJvbUxhbmVzKGxhbmVzKTtcbiAgICAgICAgICAgICAgbG9nRXJyb3JlZFJlbmRlclBoYXNlKFxuICAgICAgICAgICAgICAgIHJlbmRlclN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICB5aWVsZGVkRmliZXIsXG4gICAgICAgICAgICAgICAgbGFuZXMsXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NVcGRhdGVUYXNrXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGZpbmFsaXplUmVuZGVyKGxhbmVzLCB5aWVsZGVkRmliZXIpO1xuICAgICAgICAgICAgICBsYW5lcyA9IGVycm9yUmV0cnlMYW5lcztcbiAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgIHlpZWxkZWRGaWJlciA9IHJvb3Q7XG4gICAgICAgICAgICAgICAgc3RhcnRUaW1lID0gcmVuZGVyV2FzQ29uY3VycmVudDtcbiAgICAgICAgICAgICAgICByZW5kZXJXYXNDb25jdXJyZW50ID0gd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycztcbiAgICAgICAgICAgICAgICB2Y
15852XIgd2FzUm9vdERlaHlkcmF0ZWQgPVxuICAgICAgICAgICAgICAgICAgeWllbGRlZEZpYmVyLmN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQ7XG4gICAgICAgICAgICAgICAgd2FzUm9vdERlaHlkcmF0ZWQgJiZcbiAgICAgICAgICAgICAgICAgIChwcmVwYXJlRnJlc2hTdGFjayh5aWVsZGVkRmliZXIsIGVycm9yUmV0cnlMYW5lcykuZmxhZ3MgfD1cbiAgICAgICAgICAgICAgICAgICAgMjU2KTtcbiAgICAgICAgICAgICAgICBlcnJvclJldHJ5TGFuZXMgPSByZW5kZXJSb290U3luYyhcbiAgICAgICAgICAgICAgICAgIHlpZWxkZWRGaWJlcixcbiAgICAgICAgICAgICAgICAgIGVycm9yUmV0cnlMYW5lcyxcbiAgICAgICAgICAgICAgICAgICExXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICBlcnJvclJldHJ5TGFuZXMgIT09IFJvb3RFcnJvcmVkICYmXG4gICAgICAgICAgICAgICAgICBlcnJvclJldHJ5TGFuZXMgIT09IFJvb3RTdXNwZW5kZWRBdFRoZVNoZWxsXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzUm9vdERpZEF0dGFjaFBpbmdMaXN0ZW5lciAmJlxuICAgICAgICAgICAgICAgICAgICAhd2FzUm9vdERlaHlkcmF0ZWRcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB5aWVsZGVkRmliZXIuZXJyb3JSZWNvdmVyeURpc2FibGVkTGFuZXMgfD0gc3RhcnRUaW1lO1xuICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyB8PSBzdGFydFRpbWU7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSA9IFJvb3RTdXNwZW5kZWRXaXRoRGVsYXk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB5aWVsZGVkRmliZXIgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycztcbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID0gcmVuZGVyV2FzQ29uY3VycmVudDtcbiAgICAgICAgICAgICAgICAgIG51bGwgIT09IHlpZWxkZWRGaWJlciAmJlxuICAgICAgICAgICAgICAgICAgICAobnVsbCA9PT0gd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgICA/ICh3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyA9IHlpZWxkZWRGaWJlcilcbiAgICAgICAgICAgICAgICAgICAgICA6IHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLnB1c2guYXBwbHkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZGVkRmliZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdGFydFRpbWUgPSBlcnJvclJldHJ5TGFuZXM7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVuZGVyV2FzQ29uY3VycmVudCA9ICExO1xuICAgICAgICAgICAgICBpZiAoc3RhcnRUaW1lICE9PSBSb290RXJyb3JlZCkgY29udGludWU7XG4gICAgICAgICAgICAgIGVsc2UgeWllbGRlZEZpYmVyID0gbm93JDEoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0YXJ0VGltZSA9PT0gUm9vdEZhdGFsRXJyb3JlZCkge1xuICAgICAgICAgICAgc2V0Q3VycmVudFRyYWNrRnJvbUxhbmVzKGxhbmVzKTtcbiAgICAgICAgICAgIGxvZ0Vycm9yZWRSZW5kZXJQaGFzZShcbiAgICAgICAgICAgICAgcmVuZGVyU3RhcnRUaW1lLFxuICAgICAgICAgICAgICB5aWVsZGVkRmliZXIsXG4gICAgICAgICAgICAgIGxhbmVzLFxuICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1VwZGF0ZVRhc2tcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmaW5hbGl6ZVJlbmRlcihsYW5lcywgeWllbGRlZEZpYmVyKTtcbiAgICAgICAgICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIDApO1xuICAgICAgICAgICAgbWFya1Jvb3RTdXNwZW5kZWQocm9vdCwgbGFuZXMsIDAsICEwKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhOiB7XG4gICAgICAgICAgICBmb3JjZVN5bmMgPSByb290O1xuICAgICAgICAgICAgc3dpdGNoIChzdGFydFRpbWUpIHtcbiAgICAgICAgICAgICAgY2FzZSBSb290SW5Qcm9ncmVzczpcbiAgICAgICAgICAgICAgY2FzZSBSb290RmF0YWxFcnJvcmVkOlxuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFwiUm9vdCBkaWQgbm90IGNvbXBsZXRlLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LlwiKTtcbiAgICAgICAgICAgICAgY2FzZSBSb290U3VzcGVuZGVkV2l0aERlbGF5OlxuICAgICAgICAgICAgICAgIGlmICgobGFuZXMgJiA0MTk0MDQ4KSAhPT0gbGFuZXMgJiYgKGxhbmVzICYgNjI5MTQ1NjApICE9PSBsYW5lcylcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIFJvb3RTdXNwZW5kZWRBdFRoZVNoZWxsOlxuICAgICAgICAgICAgICAgIHNldEN1cnJlbnRUcmFja0Zyb21MYW5lcyhsYW5lcyk7XG4gICAgICAgICAgICAgICAgbG9nU3VzcGVuZGVkUmVuZGVyUGhhc2UoXG4gICAgICAgICAgICAgICAgICByZW5kZXJTdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgICB5aWVsZGVkRmliZXIsXG4gICAgICAgICAgICAgICAgICBsYW5lcyxcbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzVXBkYXRlVGFza1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZmluYWxpemVSZW5kZXIobGFuZXMsIHlpZWxkZWRGaWJlcik7XG4gICAgICAgICAgICAgICAgeWllbGRFbmRUaW1lID0gbGFuZXM7XG4gICAgICAgICAgICAgICAgMCAhPT0gKHlpZWxkRW5kVGltZSAmIDEyNylcbiAgICAgICAgICAgICAgICAgID8gKGJsb2NraW5nU3VzcGVuZGVkVGltZSA9IHlpZWxkZWRGaWJlcilcbiAgICAgICAgICAgICAgICAgIDogMCAhPT0gKHlpZWxkRW5kVGltZSAmIDQxOTQwNDgpICYmXG4gICAgICAgICAgICAgICAgICAgICh0cmFuc2l0aW9uU3VzcGVuZGVkVGltZSA9IHlpZWxkZWRGaWJlcik7XG4gICAgICAgICAgICAgICAgbWFya1Jvb3RTdXNwZW5kZWQoXG4gICAgICAgICAgICAgICAgICBmb3JjZVN5bmMsXG4gICAgICAgICAgICAgICAgICBsYW5lcyxcbiAgICAgICAgICAgICAgICAgI
15852HdvcmtJblByb2dyZXNzRGVmZXJyZWRMYW5lLFxuICAgICAgICAgICAgICAgICAgIXdvcmtJblByb2dyZXNzUm9vdERpZFNraXBTdXNwZW5kZWRTaWJsaW5nc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgICAgY2FzZSBSb290RXJyb3JlZDpcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyA9IG51bGw7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgUm9vdFN1c3BlbmRlZDpcbiAgICAgICAgICAgICAgY2FzZSBSb290Q29tcGxldGVkOlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFwiVW5rbm93biByb290IGV4aXQgc3RhdHVzLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChudWxsICE9PSBSZWFjdFNoYXJlZEludGVybmFscy5hY3RRdWV1ZSlcbiAgICAgICAgICAgICAgY29tcGxldGVSb290KFxuICAgICAgICAgICAgICAgIGZvcmNlU3luYyxcbiAgICAgICAgICAgICAgICB5aWVsZEVuZFRpbWUsXG4gICAgICAgICAgICAgICAgbGFuZXMsXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290UmVjb3ZlcmFibGVFcnJvcnMsXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyxcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3REaWRJbmNsdWRlUmVjdXJzaXZlUmVuZGVyVXBkYXRlLFxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzRGVmZXJyZWRMYW5lLFxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzLFxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmV0cnlMYW5lcyxcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3REaWRTa2lwU3VzcGVuZGVkU2libGluZ3MsXG4gICAgICAgICAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICByZW5kZXJTdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgeWllbGRlZEZpYmVyXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIChsYW5lcyAmIDYyOTE0NTYwKSA9PT0gbGFuZXMgJiZcbiAgICAgICAgICAgICAgICAoKHJlbmRlcldhc0NvbmN1cnJlbnQgPVxuICAgICAgICAgICAgICAgICAgZ2xvYmFsTW9zdFJlY2VudEZhbGxiYWNrVGltZSArXG4gICAgICAgICAgICAgICAgICBGQUxMQkFDS19USFJPVFRMRV9NUyAtXG4gICAgICAgICAgICAgICAgICBub3ckMSgpKSxcbiAgICAgICAgICAgICAgICAxMCA8IHJlbmRlcldhc0NvbmN1cnJlbnQpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIG1hcmtSb290U3VzcGVuZGVkKFxuICAgICAgICAgICAgICAgICAgZm9yY2VTeW5jLFxuICAgICAgICAgICAgICAgICAgbGFuZXMsXG4gICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc0RlZmVycmVkTGFuZSxcbiAgICAgICAgICAgICAgICAgICF3b3JrSW5Qcm9ncmVzc1Jvb3REaWRTa2lwU3VzcGVuZGVkU2libGluZ3NcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmICgwICE9PSBnZXROZXh0TGFuZXMoZm9yY2VTeW5jLCAwLCAhMCkpIGJyZWFrIGE7XG4gICAgICAgICAgICAgICAgcGVuZGluZ0VmZmVjdHNMYW5lcyA9IGxhbmVzO1xuICAgICAgICAgICAgICAgIGZvcmNlU3luYy50aW1lb3V0SGFuZGxlID0gc2NoZWR1bGVUaW1lb3V0KFxuICAgICAgICAgICAgICAgICAgY29tcGxldGVSb290V2hlblJlYWR5LmJpbmQoXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGZvcmNlU3luYyxcbiAgICAgICAgICAgICAgICAgICAgeWllbGRFbmRUaW1lLFxuICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZWNvdmVyYWJsZUVycm9ycyxcbiAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RGlkSW5jbHVkZVJlY3Vyc2l2ZVJlbmRlclVwZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgbGFuZXMsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzRGVmZXJyZWRMYW5lLFxuICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyxcbiAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NTdXNwZW5kZWRSZXRyeUxhbmVzLFxuICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3REaWRTa2lwU3VzcGVuZGVkU2libGluZ3MsXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICAgICAgXCJUaHJvdHRsZWRcIixcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyU3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgICB5aWVsZGVkRmliZXJcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICByZW5kZXJXYXNDb25jdXJyZW50XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbXBsZXRlUm9vdFdoZW5SZWFkeShcbiAgICAgICAgICAgICAgICBmb3JjZVN5bmMsXG4gICAgICAgICAgICAgICAgeWllbGRFbmRUaW1lLFxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzLFxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzVHJhbnNpdGlvbnMsXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RGlkSW5jbHVkZVJlY3Vyc2l2ZVJlbmRlclVwZGF0ZSxcbiAgICAgICAgICAgICAgICBsYW5lcyxcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc0RlZmVycmVkTGFuZSxcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyxcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1N1c3BlbmRlZFJldHJ5TGFuZXMsXG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RGlkU2tpcFN1c3BlbmRlZFNpYmxpbmdzLFxuICAgICAgICAgICAgICAgI
15852HN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgIHJlbmRlclN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICB5aWVsZGVkRmliZXJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9IHdoaWxlICgxKTtcbiAgICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChyb290KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tcGxldGVSb290V2hlblJlYWR5KFxuICAgICAgcm9vdCxcbiAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgIHJlY292ZXJhYmxlRXJyb3JzLFxuICAgICAgdHJhbnNpdGlvbnMsXG4gICAgICBkaWRJbmNsdWRlUmVuZGVyUGhhc2VVcGRhdGUsXG4gICAgICBsYW5lcyxcbiAgICAgIHNwYXduZWRMYW5lLFxuICAgICAgdXBkYXRlZExhbmVzLFxuICAgICAgc3VzcGVuZGVkUmV0cnlMYW5lcyxcbiAgICAgIGRpZFNraXBTdXNwZW5kZWRTaWJsaW5ncyxcbiAgICAgIGV4aXRTdGF0dXMsXG4gICAgICBzdXNwZW5kZWRDb21taXRSZWFzb24sXG4gICAgICBjb21wbGV0ZWRSZW5kZXJTdGFydFRpbWUsXG4gICAgICBjb21wbGV0ZWRSZW5kZXJFbmRUaW1lXG4gICAgKSB7XG4gICAgICByb290LnRpbWVvdXRIYW5kbGUgPSBub1RpbWVvdXQ7XG4gICAgICB2YXIgc3VidHJlZUZsYWdzID0gZmluaXNoZWRXb3JrLnN1YnRyZWVGbGFncyxcbiAgICAgICAgaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlID0gKGxhbmVzICYgMzM1NTQ0MDY0KSA9PT0gbGFuZXMsXG4gICAgICAgIHN1c3BlbmRlZFN0YXRlID0gbnVsbDtcbiAgICAgIGlmIChcbiAgICAgICAgaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlIHx8XG4gICAgICAgIHN1YnRyZWVGbGFncyAmIDgxOTIgfHxcbiAgICAgICAgMTY3ODU0MDggPT09IChzdWJ0cmVlRmxhZ3MgJiAxNjc4NTQwOClcbiAgICAgIClcbiAgICAgICAgaWYgKFxuICAgICAgICAgICgoc3VzcGVuZGVkU3RhdGUgPSB7XG4gICAgICAgICAgICBzdHlsZXNoZWV0czogbnVsbCxcbiAgICAgICAgICAgIGNvdW50OiAwLFxuICAgICAgICAgICAgaW1nQ291bnQ6IDAsXG4gICAgICAgICAgICBpbWdCeXRlczogMCxcbiAgICAgICAgICAgIHN1c3BlbnNleUltYWdlczogW10sXG4gICAgICAgICAgICB3YWl0aW5nRm9ySW1hZ2VzOiAhMCxcbiAgICAgICAgICAgIHdhaXRpbmdGb3JWaWV3VHJhbnNpdGlvbjogITEsXG4gICAgICAgICAgICB1bnN1c3BlbmQ6IG5vb3AkMVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIChhcHBlYXJpbmdWaWV3VHJhbnNpdGlvbnMgPSBudWxsKSxcbiAgICAgICAgICBhY2N1bXVsYXRlU3VzcGVuc2V5Q29tbWl0T25GaWJlcihmaW5pc2hlZFdvcmssIGxhbmVzLCBzdXNwZW5kZWRTdGF0ZSksXG4gICAgICAgICAgaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlICYmXG4gICAgICAgICAgICAoKHN1YnRyZWVGbGFncyA9IHN1c3BlbmRlZFN0YXRlKSxcbiAgICAgICAgICAgIChpc1ZpZXdUcmFuc2l0aW9uRWxpZ2libGUgPSByb290LmNvbnRhaW5lckluZm8pLFxuICAgICAgICAgICAgKGlzVmlld1RyYW5zaXRpb25FbGlnaWJsZSA9IChcbiAgICAgICAgICAgICAgOSA9PT0gaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlLm5vZGVUeXBlXG4gICAgICAgICAgICAgICAgPyBpc1ZpZXdUcmFuc2l0aW9uRWxpZ2libGVcbiAgICAgICAgICAgICAgICA6IGlzVmlld1RyYW5zaXRpb25FbGlnaWJsZS5vd25lckRvY3VtZW50XG4gICAgICAgICAgICApLl9fcmVhY3RWaWV3VHJhbnNpdGlvbiksXG4gICAgICAgICAgICBudWxsICE9IGlzVmlld1RyYW5zaXRpb25FbGlnaWJsZSAmJlxuICAgICAgICAgICAgICAoc3VidHJlZUZsYWdzLmNvdW50KyssXG4gICAgICAgICAgICAgIChzdWJ0cmVlRmxhZ3Mud2FpdGluZ0ZvclZpZXdUcmFuc2l0aW9uID0gITApLFxuICAgICAgICAgICAgICAoc3VidHJlZUZsYWdzID0gb25VbnN1c3BlbmQuYmluZChzdWJ0cmVlRmxhZ3MpKSxcbiAgICAgICAgICAgICAgaXNWaWV3VHJhbnNpdGlvbkVsaWdpYmxlLmZpbmlzaGVkLnRoZW4oXG4gICAgICAgICAgICAgICAgc3VidHJlZUZsYWdzLFxuICAgICAgICAgICAgICAgIHN1YnRyZWVGbGFnc1xuICAgICAgICAgICAgICApKSksXG4gICAgICAgICAgKHN1YnRyZWVGbGFncyA9XG4gICAgICAgICAgICAobGFuZXMgJiA2MjkxNDU2MCkgPT09IGxhbmVzXG4gICAgICAgICAgICAgID8gZ2xvYmFsTW9zdFJlY2VudEZhbGxiYWNrVGltZSAtIG5vdyQxKClcbiAgICAgICAgICAgICAgOiAobGFuZXMgJiA0MTk0MDQ4KSA9PT0gbGFuZXNcbiAgICAgICAgICAgICAgICA/IGdsb2JhbE1vc3RSZWNlbnRUcmFuc2l0aW9uVGltZSAtIG5vdyQxKClcbiAgICAgICAgICAgICAgICA6IDApLFxuICAgICAgICAgIChzdWJ0cmVlRmxhZ3MgPSB3YWl0Rm9yQ29tbWl0VG9CZVJlYWR5KHN1c3BlbmRlZFN0YXRlLCBzdWJ0cmVlRmxhZ3MpKSxcbiAgICAgICAgICBudWxsICE9PSBzdWJ0cmVlRmxhZ3MpXG4gICAgICAgICkge1xuICAgICAgICAgIHBlbmRpbmdFZmZlY3RzTGFuZXMgPSBsYW5lcztcbiAgICAgICAgICByb290LmNhbmNlbFBlbmRpbmdDb21taXQgPSBzdWJ0cmVlRmxhZ3MoXG4gICAgICAgICAgICBjb21wbGV0ZVJvb3QuYmluZChcbiAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgcm9vdCxcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgICAgICBsYW5lcyxcbiAgICAgICAgICAgICAgcmVjb3ZlcmFibGVFcnJvcnMsXG4gICAgICAgICAgICAgIHRyYW5zaXRpb25zLFxuICAgICAgICAgICAgICBkaWRJbmNsdWRlUmVuZGVyUGhhc2VVcGRhdGUsXG4gICAgICAgICAgICAgIHNwYXduZWRMYW5lLFxuICAgICAgICAgICAgICB1cGRhdGVkTGFuZXMsXG4gICAgICAgICAgICAgIHN1c3BlbmRlZFJldHJ5TGFuZXMsXG4gICAgICAgICAgICAgIGRpZFNraXBTdXNwZW5kZWRTaWJsaW5ncyxcbiAgICAgICAgICAgICAgZXhpdFN0YXR1cyxcbiAgICAgICAgICAgICAgc3VzcGVuZGVkU3RhdGUsXG4gICAgICAgICAgICAgIHN1c3BlbmRlZFN0YXRlLndhaXRpbmdGb3JWaWV3VHJhbnNpdGlvblxuICAgICAgICAgICAgICAgID8gXCJXYWl0aW5nIGZvciB0aGUgcHJldmlvdXMgQW5pbWF0aW9uXCJcbiAgICAgICAgICAgICAgICA6IDAgPCBzdXNwZW5kZWRTdGF0ZS5jb3VudFxuICAgICAgICAgICAgICAgICAgPyAwIDwgc3VzcGVuZGVkU3RhdGUuaW1nQ291bnRcbiAgICAgICAgICAgICAgICAgICAgPyBcIlN1c3BlbmRlZCBvbiBDU1MgYW5kIEltYWdlc1wiXG4gICAgICAgICAgICAgICAgICAgIDogXCJTdXNwZW5kZWQgb24gQ1NTXCJcbiAgICAgICAgICAgICAgICAgIDogMSA9PT0gc3VzcGVuZGVkU3RhdGUuaW1nQ291bnRcbiAgICAgICAgICAgICAgICAgICAgPyBcIlN1c3BlbmRlZCBvbiBhbiBJbWFnZVwiXG4gICAgICAgICAgICAgICAgICAgIDogMCA8IHN1c3BlbmRlZFN0YXRlLmltZ0NvdW50XG4gICAgICAgICAgICAgICAgICAgICAgPyBcIlN1c3BlbmRlZCBvbiBJbWFnZXNcIlxuICAgICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgICAgY29tcGxldGVkUmVuZGVyU3RhcnRUaW1lLFxuICAgICAgICAgICAgICBjb21wbGV0ZWRSZW5kZXJFbmRUaW1lXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICBtYXJrUm9vdFN1c3BlbmRlZChcbiAgICAgICAgICAgI
15852HJvb3QsXG4gICAgICAgICAgICBsYW5lcyxcbiAgICAgICAgICAgIHNwYXduZWRMYW5lLFxuICAgICAgICAgICAgIWRpZFNraXBTdXNwZW5kZWRTaWJsaW5nc1xuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICBjb21wbGV0ZVJvb3QoXG4gICAgICAgIHJvb3QsXG4gICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgbGFuZXMsXG4gICAgICAgIHJlY292ZXJhYmxlRXJyb3JzLFxuICAgICAgICB0cmFuc2l0aW9ucyxcbiAgICAgICAgZGlkSW5jbHVkZVJlbmRlclBoYXNlVXBkYXRlLFxuICAgICAgICBzcGF3bmVkTGFuZSxcbiAgICAgICAgdXBkYXRlZExhbmVzLFxuICAgICAgICBzdXNwZW5kZWRSZXRyeUxhbmVzLFxuICAgICAgICBkaWRTa2lwU3VzcGVuZGVkU2libGluZ3MsXG4gICAgICAgIGV4aXRTdGF0dXMsXG4gICAgICAgIHN1c3BlbmRlZFN0YXRlLFxuICAgICAgICBzdXNwZW5kZWRDb21taXRSZWFzb24sXG4gICAgICAgIGNvbXBsZXRlZFJlbmRlclN0YXJ0VGltZSxcbiAgICAgICAgY29tcGxldGVkUmVuZGVyRW5kVGltZVxuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaXNSZW5kZXJDb25zaXN0ZW50V2l0aEV4dGVybmFsU3RvcmVzKGZpbmlzaGVkV29yaykge1xuICAgICAgZm9yICh2YXIgbm9kZSA9IGZpbmlzaGVkV29yazsgOyApIHtcbiAgICAgICAgdmFyIHRhZyA9IG5vZGUudGFnO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKDAgPT09IHRhZyB8fCAxMSA9PT0gdGFnIHx8IDE1ID09PSB0YWcpICYmXG4gICAgICAgICAgbm9kZS5mbGFncyAmIDE2Mzg0ICYmXG4gICAgICAgICAgKCh0YWcgPSBub2RlLnVwZGF0ZVF1ZXVlKSxcbiAgICAgICAgICBudWxsICE9PSB0YWcgJiYgKCh0YWcgPSB0YWcuc3RvcmVzKSwgbnVsbCAhPT0gdGFnKSlcbiAgICAgICAgKVxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGFnLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2Y
15852XIgY2hlY2sgPSB0YWdbaV0sXG4gICAgICAgICAgICAgIGdldFNuYXBzaG90ID0gY2hlY2suZ2V0U25hcHNob3Q7XG4gICAgICAgICAgICBjaGVjayA9IGNoZWNrLnZhbHVlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaWYgKCFvYmplY3RJcyhnZXRTbmFwc2hvdCgpLCBjaGVjaykpIHJldHVybiAhMTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIHRhZyA9IG5vZGUuY2hpbGQ7XG4gICAgICAgIGlmIChub2RlLnN1YnRyZWVGbGFncyAmIDE2Mzg0ICYmIG51bGwgIT09IHRhZylcbiAgICAgICAgICAodGFnLnJldHVybiA9IG5vZGUpLCAobm9kZSA9IHRhZyk7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmIChub2RlID09PSBmaW5pc2hlZFdvcmspIGJyZWFrO1xuICAgICAgICAgIGZvciAoOyBudWxsID09PSBub2RlLnNpYmxpbmc7ICkge1xuICAgICAgICAgICAgaWYgKG51bGwgPT09IG5vZGUucmV0dXJuIHx8IG5vZGUucmV0dXJuID09PSBmaW5pc2hlZFdvcmspIHJldHVybiAhMDtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLnJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgbm9kZS5zaWJsaW5nLnJldHVybiA9IG5vZGUucmV0dXJuO1xuICAgICAgICAgIG5vZGUgPSBub2RlLnNpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAhMDtcbiAgICB9XG4gICAgZnVuY3Rpb24gbWFya1Jvb3RTdXNwZW5kZWQoXG4gICAgICByb290LFxuICAgICAgc3VzcGVuZGVkTGFuZXMsXG4gICAgICBzcGF3bmVkTGFuZSxcbiAgICAgIGRpZEF0dGVtcHRFbnRpcmVUcmVlXG4gICAgKSB7XG4gICAgICBzdXNwZW5kZWRMYW5lcyA9IGdldEVudGFuZ2xlZExhbmVzKHJvb3QsIHN1c3BlbmRlZExhbmVzKTtcbiAgICAgIHN1c3BlbmRlZExhbmVzICY9IH53b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcztcbiAgICAgIHN1c3BlbmRlZExhbmVzICY9IH53b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcztcbiAgICAgIHJvb3Quc3VzcGVuZGVkTGFuZXMgfD0gc3VzcGVuZGVkTGFuZXM7XG4gICAgICByb290LnBpbmdlZExhbmVzICY9IH5zdXNwZW5kZWRMYW5lcztcbiAgICAgIGRpZEF0dGVtcHRFbnRpcmVUcmVlICYmIChyb290Lndhcm1MYW5lcyB8PSBzdXNwZW5kZWRMYW5lcyk7XG4gICAgICBkaWRBdHRlbXB0RW50aXJlVHJlZSA9IHJvb3QuZXhwaXJhdGlvblRpbWVzO1xuICAgICAgZm9yICh2YXIgbGFuZXMgPSBzdXNwZW5kZWRMYW5lczsgMCA8IGxhbmVzOyApIHtcbiAgICAgICAgdmFyIGluZGV4ID0gMzEgLSBjbHozMihsYW5lcyksXG4gICAgICAgICAgbGFuZSA9IDEgPDwgaW5kZXg7XG4gICAgICAgIGRpZEF0dGVtcHRFbnRpcmVUcmVlW2luZGV4XSA9IC0xO1xuICAgICAgICBsYW5lcyAmPSB+bGFuZTtcbiAgICAgIH1cbiAgICAgIDAgIT09IHNwYXduZWRMYW5lICYmXG4gICAgICAgIG1hcmtTcGF3bmVkRGVmZXJyZWRMYW5lKHJvb3QsIHNwYXduZWRMYW5lLCBzdXNwZW5kZWRMYW5lcyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZsdXNoU3luY1dvcmskMSgpIHtcbiAgICAgIHJldHVybiAoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpID09PSBOb0NvbnRleHRcbiAgICAgICAgPyAoZmx1c2hTeW5jV29ya0Fjcm9zc1Jvb3RzX2ltcGwoMCwgITEpLCAhMSlcbiAgICAgICAgOiAhMDtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVzZXRXb3JrSW5Qcm9ncmVzc1N0YWNrKCkge1xuICAgICAgaWYgKG51bGwgIT09IHdvcmtJblByb2dyZXNzKSB7XG4gICAgICAgIGlmICh3b3JrSW5Qcm9ncmVzc1N1c3BlbmRlZFJlYXNvbiA9PT0gTm90U3VzcGVuZGVkKVxuICAgICAgICAgIHZhciBpbnRlcnJ1cHRlZFdvcmsgPSB3b3JrSW5Qcm9ncmVzcy5yZXR1cm47XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAoaW50ZXJydXB0ZWRXb3JrID0gd29ya0luUHJvZ3Jlc3MpLFxuICAgICAgICAgICAgcmVzZXRDb250ZXh0RGVwZW5kZW5jaWVzKCksXG4gICAgICAgICAgICByZXNldEhvb2tzT25VbndpbmQoaW50ZXJydXB0ZWRXb3JrKSxcbiAgICAgICAgICAgICh0aGVuYWJsZVN0YXRlJDEgPSBudWxsKSxcbiAgICAgICAgICAgICh0aGVuYWJsZUluZGV4Q291bnRlciQxID0gMCksXG4gICAgICAgICAgICAoaW50ZXJydXB0ZWRXb3JrID0gd29ya0luUHJvZ3Jlc3MpO1xuICAgICAgICBmb3IgKDsgbnVsbCAhPT0gaW50ZXJydXB0ZWRXb3JrOyApXG4gICAgICAgICAgdW53aW5kSW50ZXJydXB0ZWRXb3JrKGludGVycnVwdGVkV29yay5hbHRlcm5hdGUsIGludGVycnVwdGVkV29yayksXG4gICAgICAgICAgICAoaW50ZXJydXB0ZWRXb3JrID0gaW50ZXJydXB0ZWRXb3JrLnJldHVybik7XG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZmluYWxpemVSZW5kZXIobGFuZXMsIGZpbmFsaXphdGlvblRpbWUpIHtcbiAgICAgIDAgIT09IChsYW5lcyAmIDEyNykgJiYgKGJsb2NraW5nQ2xhbXBUaW1lID0gZmluYWxpemF0aW9uVGltZSk7XG4gICAgICAwICE9PSAobGFuZXMgJiA0MTk0MDQ4KSAmJiAodHJhbnNpdGlvbkNsYW1wVGltZSA9IGZpbmFsaXphdGlvblRpbWUpO1xuICAgICAgMCAhPT0gKGxhbmVzICYgNjI5MTQ1NjApICYmIChyZXRyeUNsYW1wVGltZSA9IGZpbmFsaXphdGlvblRpbWUpO1xuICAgICAgMCAhPT0gKGxhbmVzICYgMjA4MDM3NDc4NCkgJiYgKGlkbGVDbGFtcFRpbWUgPSBmaW5hbGl6YXRpb25UaW1lKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgbGFuZXMpIHtcbiAgICAgIHN1cHBvcnRzVXNlclRpbWluZyAmJlxuICAgICAgICAoY29uc29sZS50aW1lU3RhbXAoXG4gICAgICAgICAgXCJCbG9ja2luZyBUcmFja1wiLFxuICAgICAgICAgIDAuMDAzLFxuICAgICAgICAgIDAuMDAzLFxuICAgICAgICAgIFwiQmxvY2tpbmdcIixcbiAgICAgICAgICBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICBcInByaW1hcnktbGlnaHRcIlxuICAgICAgICApLFxuICAgICAgICBjb25zb2xlLnRpbWVTdGFtcChcbiAgICAgICAgICBcIlRyYW5zaXRpb24gVHJhY2tcIixcbiAgICAgICAgICAwLjAwMyxcbiAgICAgICAgICAwLjAwMyxcbiAgICAgICAgICBcIlRyYW5zaXRpb25cIixcbiAgICAgICAgICBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICBcInByaW1hcnktbGlnaHRcIlxuICAgICAgICApLFxuICAgICAgICBjb25zb2xlLnRpbWVTdGFtcChcbiAgICAgICAgICBcIlN1c3BlbnNlIFRyYWNrXCIsXG4gICAgICAgICAgMC4wMDMsXG4gICAgICAgICAgMC4wMDMsXG4gICAgICAgICAgXCJTdXNwZW5zZVwiLFxuICAgICAgICAgIExBTkVTX1RSQUNLX0dST1VQLFxuICAgICAgICAgIFwicHJpbWFyeS1saWdodFwiXG4gICAgICAgICksXG4gICAgICAgIGNvbnNvbGUudGltZVN0YW1wKFxuICAgICAgICAgIFwiSWRsZSBUcmFja1wiLFxuICAgICAgICAgIDAuMDAzLFxuICAgICAgICAgIDAuMDAzLFxuICAgICAgICAgIFwiSWRsZVwiLFxuICAgICAgICAgIExBTkVTX1RSQUNLX0dST1VQLFxuICAgICAgICAgIFwicHJpbWFyeS1saWdodFwiXG4gICAgICAgICkpO1xuICAgICAgdmFyIHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lID0gcmVuZGVyU3RhcnRUaW1lO1xuICAgICAgcmVuZGVyU3RhcnRUaW1lID0gbm93KCk7XG4gICAgICBpZiAoMCAhPT0gd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgJiYgMCA8IHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lKSB7XG4gICAgICAgI
15852HNldEN1cnJlbnRUcmFja0Zyb21MYW5lcyh3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290U3VzcGVuZGVkIHx8XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9PT0gUm9vdFN1c3BlbmRlZFdpdGhEZWxheVxuICAgICAgICApXG4gICAgICAgICAgbG9nU3VzcGVuZGVkUmVuZGVyUGhhc2UoXG4gICAgICAgICAgICBwcmV2aW91c1JlbmRlclN0YXJ0VGltZSxcbiAgICAgICAgICAgIHJlbmRlclN0YXJ0VGltZSxcbiAgICAgICAgICAgIGxhbmVzLFxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NVcGRhdGVUYXNrXG4gICAgICAgICAgKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdmFyIGVuZFRpbWUgPSByZW5kZXJTdGFydFRpbWUsXG4gICAgICAgICAgICBkZWJ1Z1Rhc2sgPSB3b3JrSW5Qcm9ncmVzc1VwZGF0ZVRhc2s7XG4gICAgICAgICAgaWYgKHN1cHBvcnRzVXNlclRpbWluZyAmJiAhKGVuZFRpbWUgPD0gcHJldmlvdXNSZW5kZXJTdGFydFRpbWUpKSB7XG4gICAgICAgICAgICB2YXIgY29sb3IgPVxuICAgICAgICAgICAgICAgIChsYW5lcyAmIDczODE5NzY1MykgPT09IGxhbmVzXG4gICAgICAgICAgICAgICAgICA/IFwidGVydGlhcnktZGFya1wiXG4gICAgICAgICAgICAgICAgICA6IFwicHJpbWFyeS1kYXJrXCIsXG4gICAgICAgICAgICAgIGxhYmVsID1cbiAgICAgICAgICAgICAgICAobGFuZXMgJiA1MzY4NzA5MTIpID09PSBsYW5lc1xuICAgICAgICAgICAgICAgICAgPyBcIlByZXdhcm1cIlxuICAgICAgICAgICAgICAgICAgOiAobGFuZXMgJiAyMDEzMjY3NDEpID09PSBsYW5lc1xuICAgICAgICAgICAgICAgICAgICA/IFwiSW50ZXJydXB0ZWQgSHlkcmF0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgOiBcIkludGVycnVwdGVkIFJlbmRlclwiO1xuICAgICAgICAgICAgZGVidWdUYXNrXG4gICAgICAgICAgICAgID8gZGVidWdUYXNrLnJ1bihcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUudGltZVN0YW1wLmJpbmQoXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1JlbmRlclN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICAgICAgZW5kVGltZSxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRyYWNrLFxuICAgICAgICAgICAgICAgICAgICBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICAgICAgICAgICAgY29sb3JcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDogY29uc29sZS50aW1lU3RhbXAoXG4gICAgICAgICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgICAgICAgIHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgZW5kVGltZSxcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFjayxcbiAgICAgICAgICAgICAgICAgIExBTkVTX1RSQUNLX0dST1VQLFxuICAgICAgICAgICAgICAgICAgY29sb3JcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmaW5hbGl6ZVJlbmRlcih3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcywgcmVuZGVyU3RhcnRUaW1lKTtcbiAgICAgIH1cbiAgICAgIHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lID0gd29ya0luUHJvZ3Jlc3NVcGRhdGVUYXNrO1xuICAgICAgd29ya0luUHJvZ3Jlc3NVcGRhdGVUYXNrID0gbnVsbDtcbiAgICAgIGlmICgwICE9PSAobGFuZXMgJiAxMjcpKSB7XG4gICAgICAgIHdvcmtJblByb2dyZXNzVXBkYXRlVGFzayA9IGJsb2NraW5nVXBkYXRlVGFzaztcbiAgICAgICAgZGVidWdUYXNrID1cbiAgICAgICAgICAwIDw9IGJsb2NraW5nVXBkYXRlVGltZSAmJiBibG9ja2luZ1VwZGF0ZVRpbWUgPCBibG9ja2luZ0NsYW1wVGltZVxuICAgICAgICAgICAgPyBibG9ja2luZ0NsYW1wVGltZVxuICAgICAgICAgICAgOiBibG9ja2luZ1VwZGF0ZVRpbWU7XG4gICAgICAgIGVuZFRpbWUgPVxuICAgICAgICAgIDAgPD0gYmxvY2tpbmdFdmVudFRpbWUgJiYgYmxvY2tpbmdFdmVudFRpbWUgPCBibG9ja2luZ0NsYW1wVGltZVxuICAgICAgICAgICAgPyBibG9ja2luZ0NsYW1wVGltZVxuICAgICAgICAgICAgOiBibG9ja2luZ0V2ZW50VGltZTtcbiAgICAgICAgY29sb3IgPVxuICAgICAgICAgIDAgPD0gZW5kVGltZSA/IGVuZFRpbWUgOiAwIDw9IGRlYnVnVGFzayA/IGRlYnVnVGFzayA6IHJlbmRlclN0YXJ0VGltZTtcbiAgICAgICAgMCA8PSBibG9ja2luZ1N1c3BlbmRlZFRpbWVcbiAgICAgICAgICA/IChzZXRDdXJyZW50VHJhY2tGcm9tTGFuZXMoMiksXG4gICAgICAgICAgICBsb2dTdXNwZW5kZWRXaXRoRGVsYXlQaGFzZShcbiAgICAgICAgICAgICAgYmxvY2tpbmdTdXNwZW5kZWRUaW1lLFxuICAgICAgICAgICAgICBjb2xvcixcbiAgICAgICAgICAgICAgbGFuZXMsXG4gICAgICAgICAgICAgIHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lXG4gICAgICAgICAgICApKVxuICAgICAgICAgIDogMCAhPT0gKGFuaW1hdGluZ0xhbmVzICYgMTI3KSAmJlxuICAgICAgICAgICAgKHNldEN1cnJlbnRUcmFja0Zyb21MYW5lcygyKSxcbiAgICAgICAgICAgIGxvZ0FuaW1hdGluZ1BoYXNlKGJsb2NraW5nQ2xhbXBUaW1lLCBjb2xvciwgYW5pbWF0aW5nVGFzaykpO1xuICAgICAgICBwcmV2aW91c1JlbmRlclN0YXJ0VGltZSA9IGRlYnVnVGFzaztcbiAgICAgICAgdmFyIGV2ZW50VGltZSA9IGVuZFRpbWUsXG4gICAgICAgICAgZXZlbnRUeXBlID0gYmxvY2tpbmdFdmVudFR5cGUsXG4gICAgICAgICAgZXZlbnRJc1JlcGVhdCA9IDAgPCBibG9ja2luZ0V2ZW50UmVwZWF0VGltZSxcbiAgICAgICAgICBpc1NwYXduZWRVcGRhdGUgPSBibG9ja2luZ1VwZGF0ZVR5cGUgPT09IFNQQVdORURfVVBEQVRFLFxuICAgICAgICAgIGlzUGluZ2VkVXBkYXRlID0gYmxvY2tpbmdVcGRhdGVUeXBlID09PSBQSU5HRURfVVBEQVRFO1xuICAgICAgICBkZWJ1Z1Rhc2sgPSByZW5kZXJTdGFydFRpbWU7XG4gICAgICAgIGVuZFRpbWUgPSBibG9ja2luZ1VwZGF0ZVRhc2s7XG4gICAgICAgIGNvbG9yID0gYmxvY2tpbmdVcGRhdGVNZXRob2ROYW1lO1xuICAgICAgICBsYWJlbCA9IGJsb2NraW5nVXBkYXRlQ29tcG9uZW50TmFtZTtcbiAgICAgICAgaWYgKHN1cHBvcnRzVXNlclRpbWluZykge1xuICAgICAgICAgIGN1cnJlbnRUcmFjayA9IFwiQmxvY2tpbmdcIjtcbiAgICAgICAgICAwIDwgcHJldmlvdXNSZW5kZXJTdGFydFRpbWVcbiAgICAgICAgICAgID8gcHJldmlvdXNSZW5kZXJTdGFydFRpbWUgPiBkZWJ1Z1Rhc2sgJiZcbiAgICAgICAgICAgICAgKHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lID0gZGVidWdUYXNrKVxuICAgICAgICAgICAgOiAocHJldmlvdXNSZW5kZXJTdGFydFRpbWUgPSBkZWJ1Z1Rhc2spO1xuICAgICAgICAgIDAgPCBldmVudFRpbWVcbiAgICAgICAgICAgID8gZXZlbnRUaW1lID4gcHJldmlvdXNSZW5kZXJTdGFydFRpbWUgJiZcbiAgICAgICAgICAgICAgKGV2ZW50VGltZSA9IHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lKVxuICAgICAgICAgICAgOiAoZXZlbnRUaW1lID0gcHJldmlvdXNSZW5kZXJTdGFydFRpbWUpO1xuICAgICAgICAgIGlmIChudWxsICE9PSBldmVudFR5cGUgJiYgcHJldmlvdXNSZW5kZXJTdGFydFRpbWUgPiBldmVudFRpbWUpIHtcbiAgICAgICAgICAgI
15852HZhciBjb2xvciRqc2NvbXAkMCA9IGV2ZW50SXNSZXBlYXQgPyBcInNlY29uZGFyeS1saWdodFwiIDogXCJ3YXJuaW5nXCI7XG4gICAgICAgICAgICBlbmRUaW1lXG4gICAgICAgICAgICAgID8gZW5kVGltZS5ydW4oXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLnRpbWVTdGFtcC5iaW5kKFxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLFxuICAgICAgICAgICAgICAgICAgICBldmVudElzUmVwZWF0ID8gXCJDb25zZWN1dGl2ZVwiIDogXCJFdmVudDogXCIgKyBldmVudFR5cGUsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VGltZSxcbiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNSZW5kZXJTdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFjayxcbiAgICAgICAgICAgICAgICAgICAgTEFORVNfVFJBQ0tfR1JPVVAsXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yJGpzY29tcCQwXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICA6IGNvbnNvbGUudGltZVN0YW1wKFxuICAgICAgICAgICAgICAgICAgZXZlbnRJc1JlcGVhdCA/IFwiQ29uc2VjdXRpdmVcIiA6IFwiRXZlbnQ6IFwiICsgZXZlbnRUeXBlLFxuICAgICAgICAgICAgICAgICAgZXZlbnRUaW1lLFxuICAgICAgICAgICAgICAgICAgcHJldmlvdXNSZW5kZXJTdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50VHJhY2ssXG4gICAgICAgICAgICAgICAgICBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICAgICAgICAgIGNvbG9yJGpzY29tcCQwXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVidWdUYXNrID4gcHJldmlvdXNSZW5kZXJTdGFydFRpbWUgJiZcbiAgICAgICAgICAgICgoZXZlbnRUaW1lID0gaXNTcGF3bmVkVXBkYXRlXG4gICAgICAgICAgICAgID8gXCJlcnJvclwiXG4gICAgICAgICAgICAgIDogKGxhbmVzICYgNzM4MTk3NjUzKSA9PT0gbGFuZXNcbiAgICAgICAgICAgICAgICA/IFwidGVydGlhcnktbGlnaHRcIlxuICAgICAgICAgICAgICAgIDogXCJwcmltYXJ5LWxpZ2h0XCIpLFxuICAgICAgICAgICAgKGlzU3Bhd25lZFVwZGF0ZSA9IGlzUGluZ2VkVXBkYXRlXG4gICAgICAgICAgICAgID8gXCJQcm9taXNlIFJlc29sdmVkXCJcbiAgICAgICAgICAgICAgOiBpc1NwYXduZWRVcGRhdGVcbiAgICAgICAgICAgICAgICA/IFwiQ2FzY2FkaW5nIFVwZGF0ZVwiXG4gICAgICAgICAgICAgICAgOiA1IDwgZGVidWdUYXNrIC0gcHJldmlvdXNSZW5kZXJTdGFydFRpbWVcbiAgICAgICAgICAgICAgICAgID8gXCJVcGRhdGUgQmxvY2tlZFwiXG4gICAgICAgICAgICAgICAgICA6IFwiVXBkYXRlXCIpLFxuICAgICAgICAgICAgKGlzUGluZ2VkVXBkYXRlID0gW10pLFxuICAgICAgICAgICAgbnVsbCAhPSBsYWJlbCAmJiBpc1BpbmdlZFVwZGF0ZS5wdXNoKFtcIkNvbXBvbmVudCBuYW1lXCIsIGxhYmVsXSksXG4gICAgICAgICAgICBudWxsICE9IGNvbG9yICYmIGlzUGluZ2VkVXBkYXRlLnB1c2goW1wiTWV0aG9kIG5hbWVcIiwgY29sb3JdKSxcbiAgICAgICAgICAgIChwcmV2aW91c1JlbmRlclN0YXJ0VGltZSA9IHtcbiAgICAgICAgICAgICAgc3RhcnQ6IHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lLFxuICAgICAgICAgICAgICBlbmQ6IGRlYnVnVGFzayxcbiAgICAgICAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgICAgICAgZGV2dG9vbHM6IHtcbiAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IGlzUGluZ2VkVXBkYXRlLFxuICAgICAgICAgICAgICAgICAgdHJhY2s6IGN1cnJlbnRUcmFjayxcbiAgICAgICAgICAgICAgICAgIHRyYWNrR3JvdXA6IExBTkVTX1RSQUNLX0dST1VQLFxuICAgICAgICAgICAgICAgICAgY29sb3I6IGV2ZW50VGltZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBlbmRUaW1lXG4gICAgICAgICAgICAgID8gZW5kVGltZS5ydW4oXG4gICAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZS5tZWFzdXJlLmJpbmQoXG4gICAgICAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlLFxuICAgICAgICAgICAgICAgICAgICBpc1NwYXduZWRVcGRhdGUsXG4gICAgICAgICAgICAgICAgICAgIHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICA6IHBlcmZvcm1hbmNlLm1lYXN1cmUoaXNTcGF3bmVkVXBkYXRlLCBwcmV2aW91c1JlbmRlclN0YXJ0VGltZSksXG4gICAgICAgICAgICBwZXJmb3JtYW5jZS5jbGVhck1lYXN1cmVzKGlzU3Bhd25lZFVwZGF0ZSkpO1xuICAgICAgICB9XG4gICAgICAgIGJsb2NraW5nVXBkYXRlVGltZSA9IC0xLjE7XG4gICAgICAgIGJsb2NraW5nVXBkYXRlVHlwZSA9IDA7XG4gICAgICAgIGJsb2NraW5nVXBkYXRlQ29tcG9uZW50TmFtZSA9IGJsb2NraW5nVXBkYXRlTWV0aG9kTmFtZSA9IG51bGw7XG4gICAgICAgIGJsb2NraW5nU3VzcGVuZGVkVGltZSA9IC0xLjE7XG4gICAgICAgIGJsb2NraW5nRXZlbnRSZXBlYXRUaW1lID0gYmxvY2tpbmdFdmVudFRpbWU7XG4gICAgICAgIGJsb2NraW5nRXZlbnRUaW1lID0gLTEuMTtcbiAgICAgICAgYmxvY2tpbmdDbGFtcFRpbWUgPSBub3coKTtcbiAgICAgIH1cbiAgICAgIDAgIT09IChsYW5lcyAmIDQxOTQwNDgpICYmXG4gICAgICAgICgod29ya0luUHJvZ3Jlc3NVcGRhdGVUYXNrID0gdHJhbnNpdGlvblVwZGF0ZVRhc2spLFxuICAgICAgICAoZGVidWdUYXNrID1cbiAgICAgICAgICAwIDw9IHRyYW5zaXRpb25TdGFydFRpbWUgJiYgdHJhbnNpdGlvblN0YXJ0VGltZSA8IHRyYW5zaXRpb25DbGFtcFRpbWVcbiAgICAgICAgICAgID8gdHJhbnNpdGlvbkNsYW1wVGltZVxuICAgICAgICAgICAgOiB0cmFuc2l0aW9uU3RhcnRUaW1lKSxcbiAgICAgICAgKHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lID1cbiAgICAgICAgICAwIDw9IHRyYW5zaXRpb25VcGRhdGVUaW1lICYmXG4gICAgICAgICAgdHJhbnNpdGlvblVwZGF0ZVRpbWUgPCB0cmFuc2l0aW9uQ2xhbXBUaW1lXG4gICAgICAgICAgICA/IHRyYW5zaXRpb25DbGFtcFRpbWVcbiAgICAgICAgICAgIDogdHJhbnNpdGlvblVwZGF0ZVRpbWUpLFxuICAgICAgICAoZW5kVGltZSA9XG4gICAgICAgICAgMCA8PSB0cmFuc2l0aW9uRXZlbnRUaW1lICYmIHRyYW5zaXRpb25FdmVudFRpbWUgPCB0cmFuc2l0aW9uQ2xhbXBUaW1lXG4gICAgICAgICAgICA/IHRyYW5zaXRpb25DbGFtcFRpbWVcbiAgICAgICAgICAgIDogdHJhbnNpdGlvbkV2ZW50VGltZSksXG4gICAgICAgIChjb2xvciA9XG4gICAgICAgICAgMCA8PSBlbmRUaW1lXG4gICAgICAgICAgICA/IGVuZFRpbWVcbiAgICAgICAgICAgIDogMCA8PSBwcmV2aW91c1JlbmRlclN0YXJ0VGltZVxuICAgICAgICAgICAgICA/IHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lXG4gICAgICAgICAgICAgIDogcmVuZGVyU3RhcnRUaW1lKSxcbiAgICAgICAgMCA8PSB0cmFuc2l0aW9uU3VzcGVuZGVkVGltZVxuICAgICAgICAgID8gKHNldEN1cnJlbnRUcmFja0Zyb21MYW5lcygyNTYpLFxuICAgICAgICAgICAgbG9nU3VzcGVuZGVkV2l0aERlbGF5UGhhc2UoXG4gICAgICAgICAgICAgI
15852HRyYW5zaXRpb25TdXNwZW5kZWRUaW1lLFxuICAgICAgICAgICAgICBjb2xvcixcbiAgICAgICAgICAgICAgbGFuZXMsXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzVXBkYXRlVGFza1xuICAgICAgICAgICAgKSlcbiAgICAgICAgICA6IDAgIT09IChhbmltYXRpbmdMYW5lcyAmIDQxOTQwNDgpICYmXG4gICAgICAgICAgICAoc2V0Q3VycmVudFRyYWNrRnJvbUxhbmVzKDI1NiksXG4gICAgICAgICAgICBsb2dBbmltYXRpbmdQaGFzZSh0cmFuc2l0aW9uQ2xhbXBUaW1lLCBjb2xvciwgYW5pbWF0aW5nVGFzaykpLFxuICAgICAgICAoaXNQaW5nZWRVcGRhdGUgPSBlbmRUaW1lKSxcbiAgICAgICAgKGV2ZW50VGltZSA9IHRyYW5zaXRpb25FdmVudFR5cGUpLFxuICAgICAgICAoZXZlbnRUeXBlID0gMCA8IHRyYW5zaXRpb25FdmVudFJlcGVhdFRpbWUpLFxuICAgICAgICAoZXZlbnRJc1JlcGVhdCA9IHRyYW5zaXRpb25VcGRhdGVUeXBlID09PSBQSU5HRURfVVBEQVRFKSxcbiAgICAgICAgKGNvbG9yID0gcmVuZGVyU3RhcnRUaW1lKSxcbiAgICAgICAgKGVuZFRpbWUgPSB0cmFuc2l0aW9uVXBkYXRlVGFzayksXG4gICAgICAgIChsYWJlbCA9IHRyYW5zaXRpb25VcGRhdGVNZXRob2ROYW1lKSxcbiAgICAgICAgKGlzU3Bhd25lZFVwZGF0ZSA9IHRyYW5zaXRpb25VcGRhdGVDb21wb25lbnROYW1lKSxcbiAgICAgICAgc3VwcG9ydHNVc2VyVGltaW5nICYmXG4gICAgICAgICAgKChjdXJyZW50VHJhY2sgPSBcIlRyYW5zaXRpb25cIiksXG4gICAgICAgICAgMCA8IHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lXG4gICAgICAgICAgICA/IHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lID4gY29sb3IgJiZcbiAgICAgICAgICAgICAgKHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lID0gY29sb3IpXG4gICAgICAgICAgICA6IChwcmV2aW91c1JlbmRlclN0YXJ0VGltZSA9IGNvbG9yKSxcbiAgICAgICAgICAwIDwgZGVidWdUYXNrXG4gICAgICAgICAgICA/IGRlYnVnVGFzayA+IHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lICYmXG4gICAgICAgICAgICAgIChkZWJ1Z1Rhc2sgPSBwcmV2aW91c1JlbmRlclN0YXJ0VGltZSlcbiAgICAgICAgICAgIDogKGRlYnVnVGFzayA9IHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lKSxcbiAgICAgICAgICAwIDwgaXNQaW5nZWRVcGRhdGVcbiAgICAgICAgICAgID8gaXNQaW5nZWRVcGRhdGUgPiBkZWJ1Z1Rhc2sgJiYgKGlzUGluZ2VkVXBkYXRlID0gZGVidWdUYXNrKVxuICAgICAgICAgICAgOiAoaXNQaW5nZWRVcGRhdGUgPSBkZWJ1Z1Rhc2spLFxuICAgICAgICAgIGRlYnVnVGFzayA+IGlzUGluZ2VkVXBkYXRlICYmXG4gICAgICAgICAgICBudWxsICE9PSBldmVudFRpbWUgJiZcbiAgICAgICAgICAgICgoY29sb3IkanNjb21wJDAgPSBldmVudFR5cGUgPyBcInNlY29uZGFyeS1saWdodFwiIDogXCJ3YXJuaW5nXCIpLFxuICAgICAgICAgICAgZW5kVGltZVxuICAgICAgICAgICAgICA/IGVuZFRpbWUucnVuKFxuICAgICAgICAgICAgICAgICAgY29uc29sZS50aW1lU3RhbXAuYmluZChcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlID8gXCJDb25zZWN1dGl2ZVwiIDogXCJFdmVudDogXCIgKyBldmVudFRpbWUsXG4gICAgICAgICAgICAgICAgICAgIGlzUGluZ2VkVXBkYXRlLFxuICAgICAgICAgICAgICAgICAgICBkZWJ1Z1Rhc2ssXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFjayxcbiAgICAgICAgICAgICAgICAgICAgTEFORVNfVFJBQ0tfR1JPVVAsXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yJGpzY29tcCQwXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICA6IGNvbnNvbGUudGltZVN0YW1wKFxuICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlID8gXCJDb25zZWN1dGl2ZVwiIDogXCJFdmVudDogXCIgKyBldmVudFRpbWUsXG4gICAgICAgICAgICAgICAgICBpc1BpbmdlZFVwZGF0ZSxcbiAgICAgICAgICAgICAgICAgIGRlYnVnVGFzayxcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFjayxcbiAgICAgICAgICAgICAgICAgIExBTkVTX1RSQUNLX0dST1VQLFxuICAgICAgICAgICAgICAgICAgY29sb3IkanNjb21wJDBcbiAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICBwcmV2aW91c1JlbmRlclN0YXJ0VGltZSA+IGRlYnVnVGFzayAmJlxuICAgICAgICAgICAgKGVuZFRpbWVcbiAgICAgICAgICAgICAgPyBlbmRUaW1lLnJ1bihcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUudGltZVN0YW1wLmJpbmQoXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUsXG4gICAgICAgICAgICAgICAgICAgIFwiQWN0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgIGRlYnVnVGFzayxcbiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNSZW5kZXJTdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFjayxcbiAgICAgICAgICAgICAgICAgICAgTEFORVNfVFJBQ0tfR1JPVVAsXG4gICAgICAgICAgICAgICAgICAgIFwicHJpbWFyeS1kYXJrXCJcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDogY29uc29sZS50aW1lU3RhbXAoXG4gICAgICAgICAgICAgICAgICBcIkFjdGlvblwiLFxuICAgICAgICAgICAgICAgICAgZGVidWdUYXNrLFxuICAgICAgICAgICAgICAgICAgcHJldmlvdXNSZW5kZXJTdGFydFRpbWUsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50VHJhY2ssXG4gICAgICAgICAgICAgICAgICBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICAgICAgICAgIFwicHJpbWFyeS1kYXJrXCJcbiAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICBjb2xvciA+IHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lICYmXG4gICAgICAgICAgICAoKGRlYnVnVGFzayA9IGV2ZW50SXNSZXBlYXRcbiAgICAgICAgICAgICAgPyBcIlByb21pc2UgUmVzb2x2ZWRcIlxuICAgICAgICAgICAgICA6IDUgPCBjb2xvciAtIHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lXG4gICAgICAgICAgICAgICAgPyBcIlVwZGF0ZSBCbG9ja2VkXCJcbiAgICAgICAgICAgICAgICA6IFwiVXBkYXRlXCIpLFxuICAgICAgICAgICAgKGlzUGluZ2VkVXBkYXRlID0gW10pLFxuICAgICAgICAgICAgbnVsbCAhPSBpc1NwYXduZWRVcGRhdGUgJiZcbiAgICAgICAgICAgICAgaXNQaW5nZWRVcGRhdGUucHVzaChbXCJDb21wb25lbnQgbmFtZVwiLCBpc1NwYXduZWRVcGRhdGVdKSxcbiAgICAgICAgICAgIG51bGwgIT0gbGFiZWwgJiYgaXNQaW5nZWRVcGRhdGUucHVzaChbXCJNZXRob2QgbmFtZVwiLCBsYWJlbF0pLFxuICAgICAgICAgICAgKHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lID0ge1xuICAgICAgICAgICAgICBzdGFydDogcHJldmlvdXNSZW5kZXJTdGFydFRpbWUsXG4gICAgICAgICAgICAgIGVuZDogY29sb3IsXG4gICAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICAgIGRldnRvb2xzOiB7XG4gICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBpc1BpbmdlZFVwZGF0ZSxcbiAgICAgICAgICAgICAgICAgI
15852HRyYWNrOiBjdXJyZW50VHJhY2ssXG4gICAgICAgICAgICAgICAgICB0cmFja0dyb3VwOiBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiBcInByaW1hcnktbGlnaHRcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBlbmRUaW1lXG4gICAgICAgICAgICAgID8gZW5kVGltZS5ydW4oXG4gICAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZS5tZWFzdXJlLmJpbmQoXG4gICAgICAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlLFxuICAgICAgICAgICAgICAgICAgICBkZWJ1Z1Rhc2ssXG4gICAgICAgICAgICAgICAgICAgIHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICA6IHBlcmZvcm1hbmNlLm1lYXN1cmUoZGVidWdUYXNrLCBwcmV2aW91c1JlbmRlclN0YXJ0VGltZSksXG4gICAgICAgICAgICBwZXJmb3JtYW5jZS5jbGVhck1lYXN1cmVzKGRlYnVnVGFzaykpKSxcbiAgICAgICAgKHRyYW5zaXRpb25VcGRhdGVUaW1lID0gdHJhbnNpdGlvblN0YXJ0VGltZSA9IC0xLjEpLFxuICAgICAgICAodHJhbnNpdGlvblVwZGF0ZVR5cGUgPSAwKSxcbiAgICAgICAgKHRyYW5zaXRpb25TdXNwZW5kZWRUaW1lID0gLTEuMSksXG4gICAgICAgICh0cmFuc2l0aW9uRXZlbnRSZXBlYXRUaW1lID0gdHJhbnNpdGlvbkV2ZW50VGltZSksXG4gICAgICAgICh0cmFuc2l0aW9uRXZlbnRUaW1lID0gLTEuMSksXG4gICAgICAgICh0cmFuc2l0aW9uQ2xhbXBUaW1lID0gbm93KCkpKTtcbiAgICAgIDAgIT09IChsYW5lcyAmIDYyOTE0NTYwKSAmJlxuICAgICAgICAwICE9PSAoYW5pbWF0aW5nTGFuZXMgJiA2MjkxNDU2MCkgJiZcbiAgICAgICAgKHNldEN1cnJlbnRUcmFja0Zyb21MYW5lcyg0MTk0MzA0KSxcbiAgICAgICAgbG9nQW5pbWF0aW5nUGhhc2UocmV0cnlDbGFtcFRpbWUsIHJlbmRlclN0YXJ0VGltZSwgYW5pbWF0aW5nVGFzaykpO1xuICAgICAgMCAhPT0gKGxhbmVzICYgMjA4MDM3NDc4NCkgJiZcbiAgICAgICAgMCAhPT0gKGFuaW1hdGluZ0xhbmVzICYgMjA4MDM3NDc4NCkgJiZcbiAgICAgICAgKHNldEN1cnJlbnRUcmFja0Zyb21MYW5lcygyNjg0MzU0NTYpLFxuICAgICAgICBsb2dBbmltYXRpbmdQaGFzZShpZGxlQ2xhbXBUaW1lLCByZW5kZXJTdGFydFRpbWUsIGFuaW1hdGluZ1Rhc2spKTtcbiAgICAgIHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lID0gcm9vdC50aW1lb3V0SGFuZGxlO1xuICAgICAgcHJldmlvdXNSZW5kZXJTdGFydFRpbWUgIT09IG5vVGltZW91dCAmJlxuICAgICAgICAoKHJvb3QudGltZW91dEhhbmRsZSA9IG5vVGltZW91dCksXG4gICAgICAgIGNhbmNlbFRpbWVvdXQocHJldmlvdXNSZW5kZXJTdGFydFRpbWUpKTtcbiAgICAgIHByZXZpb3VzUmVuZGVyU3RhcnRUaW1lID0gcm9vdC5jYW5jZWxQZW5kaW5nQ29tbWl0O1xuICAgICAgbnVsbCAhPT0gcHJldmlvdXNSZW5kZXJTdGFydFRpbWUgJiZcbiAgICAgICAgKChyb290LmNhbmNlbFBlbmRpbmdDb21taXQgPSBudWxsKSwgcHJldmlvdXNSZW5kZXJTdGFydFRpbWUoKSk7XG4gICAgICBwZW5kaW5nRWZmZWN0c0xhbmVzID0gMDtcbiAgICAgIHJlc2V0V29ya0luUHJvZ3Jlc3NTdGFjaygpO1xuICAgICAgd29ya0luUHJvZ3Jlc3NSb290ID0gcm9vdDtcbiAgICAgIHdvcmtJblByb2dyZXNzID0gcHJldmlvdXNSZW5kZXJTdGFydFRpbWUgPSBjcmVhdGVXb3JrSW5Qcm9ncmVzcyhcbiAgICAgICAgcm9vdC5jdXJyZW50LFxuICAgICAgICBudWxsXG4gICAgICApO1xuICAgICAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSBsYW5lcztcbiAgICAgIHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uID0gTm90U3VzcGVuZGVkO1xuICAgICAgd29ya0luUHJvZ3Jlc3NUaHJvd25WYWx1ZSA9IG51bGw7XG4gICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3REaWRTa2lwU3VzcGVuZGVkU2libGluZ3MgPSAhMTtcbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdElzUHJlcmVuZGVyaW5nID0gY2hlY2tJZlJvb3RJc1ByZXJlbmRlcmluZyhyb290LCBsYW5lcyk7XG4gICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3REaWRBdHRhY2hQaW5nTGlzdGVuZXIgPSAhMTtcbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290SW5Qcm9ncmVzcztcbiAgICAgIHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmV0cnlMYW5lcyA9XG4gICAgICAgIHdvcmtJblByb2dyZXNzRGVmZXJyZWRMYW5lID1cbiAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290UGluZ2VkTGFuZXMgPVxuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyA9XG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdFNraXBwZWRMYW5lcyA9XG4gICAgICAgICAgMDtcbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID0gd29ya0luUHJvZ3Jlc3NSb290Q29uY3VycmVudEVycm9ycyA9XG4gICAgICAgIG51bGw7XG4gICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3REaWRJbmNsdWRlUmVjdXJzaXZlUmVuZGVyVXBkYXRlID0gITE7XG4gICAgICBlbnRhbmdsZWRSZW5kZXJMYW5lcyA9IGdldEVudGFuZ2xlZExhbmVzKHJvb3QsIGxhbmVzKTtcbiAgICAgIGZpbmlzaFF1ZXVlaW5nQ29uY3VycmVudFVwZGF0ZXMoKTtcbiAgICAgIHJvb3QgPSBnZXRDdXJyZW50VGltZSgpO1xuICAgICAgMWUzIDwgcm9vdCAtIGxhc3RSZXNldFRpbWUgJiZcbiAgICAgICAgKChSZWFjdFNoYXJlZEludGVybmFscy5yZWNlbnRseUNyZWF0ZWRPd25lclN0YWNrcyA9IDApLFxuICAgICAgICAobGFzdFJlc2V0VGltZSA9IHJvb3QpKTtcbiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmRpc2NhcmRQZW5kaW5nV2FybmluZ3MoKTtcbiAgICAgIHJldHVybiBwcmV2aW91c1JlbmRlclN0YXJ0VGltZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlVGhyb3cocm9vdCwgdGhyb3duVmFsdWUpIHtcbiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyID0gbnVsbDtcbiAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBDb250ZXh0T25seURpc3BhdGNoZXI7XG4gICAgICBSZWFjdFNoYXJlZEludGVybmFscy5nZXRDdXJyZW50U3RhY2sgPSBudWxsO1xuICAgICAgaXNSZW5kZXJpbmcgPSAhMTtcbiAgICAgIGN1cnJlbnQgPSBudWxsO1xuICAgICAgdGhyb3duVmFsdWUgPT09IFN1c3BlbnNlRXhjZXB0aW9uIHx8XG4gICAgICB0aHJvd25WYWx1ZSA9PT0gU3VzcGVuc2VBY3Rpb25FeGNlcHRpb25cbiAgICAgICAgPyAoKHRocm93blZhbHVlID0gZ2V0U3VzcGVuZGVkVGhlbmFibGUoKSksXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uID0gU3VzcGVuZGVkT25JbW1lZGlhdGUpKVxuICAgICAgICA6IHRocm93blZhbHVlID09PSBTdXNwZW5zZXlDb21taXRFeGNlcHRpb25cbiAgICAgICAgICA/ICgodGhyb3duVmFsdWUgPSBnZXRTdXNwZW5kZWRUaGVuYWJsZSgpKSxcbiAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzc1N1c3BlbmRlZFJlYXNvbiA9IFN1c3BlbmRlZE9uSW5zdGFuY2UpKVxuICAgICAgICAgIDogKHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uID1cbiAgICAgICAgICAgICAgdGhyb3duVmFsdWUgPT09IFNlbGVjdGl2ZUh5ZHJhdGlvbkV4Y2VwdGlvblxuICAgICAgICAgICAgICAgID8gU3VzcGVuZGVkT25IeWRyYXRpb25cbiAgICAgICAgICAgICAgICA6IG51bGwgIT09IHRocm93blZhbHVlICYmXG4gICAgICAgICAgICAgICAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiB0aHJvd25WYWx1ZSAmJlxuICAgICAgICAgICAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiB0aHJvd25WYWx1ZS50aGVuXG4gICAgICAgICAgICAgICAgICA/IFN1c3BlbmRlZE9uRGVwcmVjYXRlZF
15852Rocm93UHJvbWlzZVxuICAgICAgICAgICAgICAgICAgOiBTdXNwZW5kZWRPbkVycm9yKTtcbiAgICAgIHdvcmtJblByb2dyZXNzVGhyb3duVmFsdWUgPSB0aHJvd25WYWx1ZTtcbiAgICAgIHZhciBlcnJvcmVkV29yayA9IHdvcmtJblByb2dyZXNzO1xuICAgICAgbnVsbCA9PT0gZXJyb3JlZFdvcmtcbiAgICAgICAgPyAoKHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290RmF0YWxFcnJvcmVkKSxcbiAgICAgICAgICBsb2dVbmNhdWdodEVycm9yKFxuICAgICAgICAgICAgcm9vdCxcbiAgICAgICAgICAgIGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKHRocm93blZhbHVlLCByb290LmN1cnJlbnQpXG4gICAgICAgICAgKSlcbiAgICAgICAgOiBlcnJvcmVkV29yay5tb2RlICYgUHJvZmlsZU1vZGUgJiZcbiAgICAgICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZER1cmF0aW9uKGVycm9yZWRXb3JrKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2hvdWxkUmVtYWluT25QcmV2aW91c1NjcmVlbigpIHtcbiAgICAgIHZhciBoYW5kbGVyID0gc3VzcGVuc2VIYW5kbGVyU3RhY2tDdXJzb3IuY3VycmVudDtcbiAgICAgIHJldHVybiBudWxsID09PSBoYW5kbGVyXG4gICAgICAgID8gITBcbiAgICAgICAgOiAod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgJiA0MTk0MDQ4KSA9PT1cbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzXG4gICAgICAgICAgPyBudWxsID09PSBzaGVsbEJvdW5kYXJ5XG4gICAgICAgICAgICA/ICEwXG4gICAgICAgICAgICA6ICExXG4gICAgICAgICAgOiAod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgJiA2MjkxNDU2MCkgPT09XG4gICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgfHxcbiAgICAgICAgICAgICAgMCAhPT0gKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzICYgNTM2ODcwOTEyKVxuICAgICAgICAgICAgPyBoYW5kbGVyID09PSBzaGVsbEJvdW5kYXJ5XG4gICAgICAgICAgICA6ICExO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwdXNoRGlzcGF0Y2hlcigpIHtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLkg7XG4gICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gQ29udGV4dE9ubHlEaXNwYXRjaGVyO1xuICAgICAgcmV0dXJuIG51bGwgPT09IHByZXZEaXNwYXRjaGVyID8gQ29udGV4dE9ubHlEaXNwYXRjaGVyIDogcHJldkRpc3BhdGNoZXI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHB1c2hBc3luY0Rpc3BhdGNoZXIoKSB7XG4gICAgICB2Y
15852XIgcHJldkFzeW5jRGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLkE7XG4gICAgICBSZWFjdFNoYXJlZEludGVybmFscy5BID0gRGVmYXVsdEFzeW5jRGlzcGF0Y2hlcjtcbiAgICAgIHJldHVybiBwcmV2QXN5bmNEaXNwYXRjaGVyO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtYXJrUmVuZGVyRGVyaXZlZENhdXNlKGZpYmVyKSB7XG4gICAgICBudWxsID09PSB3b3JrSW5Qcm9ncmVzc1VwZGF0ZVRhc2sgJiZcbiAgICAgICAgKHdvcmtJblByb2dyZXNzVXBkYXRlVGFzayA9XG4gICAgICAgICAgbnVsbCA9PSBmaWJlci5fZGVidWdUYXNrID8gbnVsbCA6IGZpYmVyLl9kZWJ1Z1Rhc2spO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZW5kZXJEaWRTdXNwZW5kRGVsYXlJZlBvc3NpYmxlKCkge1xuICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RTdXNwZW5kZWRXaXRoRGVsYXk7XG4gICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3REaWRTa2lwU3VzcGVuZGVkU2libGluZ3MgfHxcbiAgICAgICAgKCh3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAmIDQxOTQwNDgpICE9PVxuICAgICAgICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzICYmXG4gICAgICAgICAgbnVsbCAhPT0gc3VzcGVuc2VIYW5kbGVyU3RhY2tDdXJzb3IuY3VycmVudCkgfHxcbiAgICAgICAgKHdvcmtJblByb2dyZXNzUm9vdElzUHJlcmVuZGVyaW5nID0gITApO1xuICAgICAgKDAgPT09ICh3b3JrSW5Qcm9ncmVzc1Jvb3RTa2lwcGVkTGFuZXMgJiAxMzQyMTc3MjcpICYmXG4gICAgICAgIDAgPT09ICh3b3JrSW5Qcm9ncmVzc1Jvb3RJbnRlcmxlYXZlZFVwZGF0ZWRMYW5lcyAmIDEzNDIxNzcyNykpIHx8XG4gICAgICAgIG51bGwgPT09IHdvcmtJblByb2dyZXNzUm9vdCB8fFxuICAgICAgICBtYXJrUm9vdFN1c3BlbmRlZChcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3QsXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMsXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3NEZWZlcnJlZExhbmUsXG4gICAgICAgICAgITFcbiAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVuZGVyUm9vdFN5bmMocm9vdCwgbGFuZXMsIHNob3VsZFlpZWxkRm9yUHJlcmVuZGVyaW5nKSB7XG4gICAgICB2Y
15852XIgcHJldkV4ZWN1dGlvbkNvbnRleHQgPSBleGVjdXRpb25Db250ZXh0O1xuICAgICAgZXhlY3V0aW9uQ29udGV4dCB8PSBSZW5kZXJDb250ZXh0O1xuICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gcHVzaERpc3BhdGNoZXIoKSxcbiAgICAgICAgcHJldkFzeW5jRGlzcGF0Y2hlciA9IHB1c2hBc3luY0Rpc3BhdGNoZXIoKTtcbiAgICAgIGlmIChcbiAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290ICE9PSByb290IHx8XG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzICE9PSBsYW5lc1xuICAgICAgKSB7XG4gICAgICAgIGlmIChpc0RldlRvb2xzUHJlc2VudCkge1xuICAgICAgICAgIHZhciBtZW1vaXplZFVwZGF0ZXJzID0gcm9vdC5tZW1vaXplZFVwZGF0ZXJzO1xuICAgICAgICAgIDAgPCBtZW1vaXplZFVwZGF0ZXJzLnNpemUgJiZcbiAgICAgICAgICAgIChyZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKHJvb3QsIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzKSxcbiAgICAgICAgICAgIG1lbW9pemVkVXBkYXRlcnMuY2xlYXIoKSk7XG4gICAgICAgICAgbW92ZVBlbmRpbmdGaWJlcnNUb01lbW9pemVkKHJvb3QsIGxhbmVzKTtcbiAgICAgICAgfVxuICAgICAgICB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zID0gbnVsbDtcbiAgICAgICAgcHJlcGFyZUZyZXNoU3RhY2socm9vdCwgbGFuZXMpO1xuICAgICAgfVxuICAgICAgbGFuZXMgPSAhMTtcbiAgICAgIG1lbW9pemVkVXBkYXRlcnMgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzO1xuICAgICAgYTogZG9cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1N1c3BlbmRlZFJlYXNvbiAhPT0gTm90U3VzcGVuZGVkICYmXG4gICAgICAgICAgICBudWxsICE9PSB3b3JrSW5Qcm9ncmVzc1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgdmFyIHVuaXRPZldvcmsgPSB3b3JrSW5Qcm9ncmVzcyxcbiAgICAgICAgICAgICAgdGhyb3duVmFsdWUgPSB3b3JrSW5Qcm9ncmVzc1Rocm93blZhbHVlO1xuICAgICAgICAgICAgc3dpdGNoICh3b3JrSW5Qcm9ncmVzc1N1c3BlbmRlZFJlYXNvbikge1xuICAgICAgICAgICAgICBjYXNlIFN1c3BlbmRlZE9uSHlkcmF0aW9uOlxuICAgICAgICAgICAgICAgIHJlc2V0V29ya0luUHJvZ3Jlc3NTdGFjaygpO1xuICAgICAgICAgICAgICAgIG1lbW9pemVkVXBkYXRlcnMgPSBSb290U3VzcGVuZGVkQXRUaGVTaGVsbDtcbiAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICBjYXNlIFN1c3BlbmRlZE9uSW1tZWRpYXRlOlxuICAgICAgICAgICAgICBjYXNlIFN1c3BlbmRlZE9uRGF0YTpcbiAgICAgICAgICAgICAgY2FzZSBTdXNwZW5kZWRPbkFjdGlvbjpcbiAgICAgICAgICAgICAgY2FzZSBTdXNwZW5kZWRPbkRlcHJlY2F0ZWRUaHJvd1Byb21pc2U6XG4gICAgICAgICAgICAgICAgbnVsbCA9PT0gc3VzcGVuc2VIYW5kbGVyU3RhY2tDdXJzb3IuY3VycmVudCAmJiAobGFuZXMgPSAhMCk7XG4gICAgICAgICAgICAgICAgdmFyIHJlYXNvbiA9IHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uO1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uID0gTm90U3VzcGVuZGVkO1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzVGhyb3duVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRocm93QW5kVW53aW5kV29ya0xvb3Aocm9vdCwgdW5pdE9mV29yaywgdGhyb3duVmFsdWUsIHJlYXNvbik7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgc2hvdWxkWWllbGRGb3JQcmVyZW5kZXJpbmcgJiZcbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzUm9vdElzUHJlcmVuZGVyaW5nXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBtZW1vaXplZFVwZGF0ZXJzID0gUm9vdEluUHJvZ3Jlc3M7XG4gICAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAocmVhc29uID0gd29ya0luUHJvZ3Jlc3NTdXNwZW5kZWRSZWFzb24pLFxuICAgICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uID0gTm90U3VzcGVuZGVkKSxcbiAgICAgICAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzc1Rocm93blZhbHVlID0gbnVsbCksXG4gICAgICAgICAgICAgICAgICB0aHJvd0FuZFVud2luZFdvcmtMb29wKHJvb3QsIHVuaXRPZldvcmssIHRocm93blZhbHVlLCByZWFzb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB3b3JrTG9vcFN5bmMoKTtcbiAgICAgICAgICBtZW1vaXplZFVwZGF0ZXJzID0gd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBjYXRjaCAodGhyb3duVmFsdWUkOSkge1xuICAgICAgICAgIGhhbmRsZVRocm93KHJvb3QsIHRocm93blZhbHVlJDkpO1xuICAgICAgICB9XG4gICAgICB3aGlsZSAoMSk7XG4gICAgICBsYW5lcyAmJiByb290LnNoZWxsU3VzcGVuZENvdW50ZXIrKztcbiAgICAgIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpO1xuICAgICAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0O1xuICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuSCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuQSA9IHByZXZBc3luY0Rpc3BhdGNoZXI7XG4gICAgICBudWxsID09PSB3b3JrSW5Qcm9ncmVzcyAmJlxuICAgICAgICAoKHdvcmtJblByb2dyZXNzUm9vdCA9IG51bGwpLFxuICAgICAgICAod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSAwKSxcbiAgICAgICAgZmluaXNoUXVldWVpbmdDb25jdXJyZW50VXBkYXRlcygpKTtcbiAgICAgIHJldHVybiBtZW1vaXplZFVwZGF0ZXJzO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3b3JrTG9vcFN5bmMoKSB7XG4gICAgICBmb3IgKDsgbnVsbCAhPT0gd29ya0luUHJvZ3Jlc3M7ICkgcGVyZm9ybVVuaXRPZldvcmsod29ya0luUHJvZ3Jlc3MpO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZW5kZXJSb290Q29uY3VycmVudChyb290LCBsYW5lcykge1xuICAgICAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgICAgIGV4ZWN1dGlvbkNvbnRleHQgfD0gUmVuZGVyQ29udGV4dDtcbiAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IHB1c2hEaXNwYXRjaGVyKCksXG4gICAgICAgI
15852HByZXZBc3luY0Rpc3BhdGNoZXIgPSBwdXNoQXN5bmNEaXNwYXRjaGVyKCk7XG4gICAgICBpZiAoXG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdCAhPT0gcm9vdCB8fFxuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyAhPT0gbGFuZXNcbiAgICAgICkge1xuICAgICAgICBpZiAoaXNEZXZUb29sc1ByZXNlbnQpIHtcbiAgICAgICAgICB2YXIgbWVtb2l6ZWRVcGRhdGVycyA9IHJvb3QubWVtb2l6ZWRVcGRhdGVycztcbiAgICAgICAgICAwIDwgbWVtb2l6ZWRVcGRhdGVycy5zaXplICYmXG4gICAgICAgICAgICAocmVzdG9yZVBlbmRpbmdVcGRhdGVycyhyb290LCB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyksXG4gICAgICAgICAgICBtZW1vaXplZFVwZGF0ZXJzLmNsZWFyKCkpO1xuICAgICAgICAgIG1vdmVQZW5kaW5nRmliZXJzVG9NZW1vaXplZChyb290LCBsYW5lcyk7XG4gICAgICAgIH1cbiAgICAgICAgd29ya0luUHJvZ3Jlc3NUcmFuc2l0aW9ucyA9IG51bGw7XG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlclRhcmdldFRpbWUgPSBub3ckMSgpICsgUkVOREVSX1RJTUVPVVRfTVM7XG4gICAgICAgIHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIGxhbmVzKTtcbiAgICAgIH0gZWxzZVxuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RJc1ByZXJlbmRlcmluZyA9IGNoZWNrSWZSb290SXNQcmVyZW5kZXJpbmcoXG4gICAgICAgICAgcm9vdCxcbiAgICAgICAgICBsYW5lc1xuICAgICAgICApO1xuICAgICAgYTogZG9cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1N1c3BlbmRlZFJlYXNvbiAhPT0gTm90U3VzcGVuZGVkICYmXG4gICAgICAgICAgICBudWxsICE9PSB3b3JrSW5Qcm9ncmVzc1xuICAgICAgICAgIClcbiAgICAgICAgICAgIGI6IHN3aXRjaCAoXG4gICAgICAgICAgICAgICgobGFuZXMgPSB3b3JrSW5Qcm9ncmVzcyksXG4gICAgICAgICAgICAgIChtZW1vaXplZFVwZGF0ZXJzID0gd29ya0luUHJvZ3Jlc3NUaHJvd25WYWx1ZSksXG4gICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNhc2UgU3VzcGVuZGVkT25FcnJvcjpcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1N1c3BlbmRlZFJlYXNvbiA9IE5vdFN1c3BlbmRlZDtcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Rocm93blZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aHJvd0FuZFVud2luZFdvcmtMb29wKFxuICAgICAgICAgICAgICAgICAgcm9vdCxcbiAgICAgICAgICAgICAgICAgIGxhbmVzLFxuICAgICAgICAgICAgICAgICAgbWVtb2l6ZWRVcGRhdGVycyxcbiAgICAgICAgICAgICAgICAgIFN1c3BlbmRlZE9uRXJyb3JcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIFN1c3BlbmRlZE9uRGF0YTpcbiAgICAgICAgICAgICAgY2FzZSBTdXNwZW5kZWRPbkFjdGlvbjpcbiAgICAgICAgICAgICAgICBpZiAoaXNUaGVuYWJsZVJlc29sdmVkKG1lbW9pemVkVXBkYXRlcnMpKSB7XG4gICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1N1c3BlbmRlZFJlYXNvbiA9IE5vdFN1c3BlbmRlZDtcbiAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzVGhyb3duVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgcmVwbGF5U3VzcGVuZGVkVW5pdE9mV29yayhsYW5lcyk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGFuZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3NTdXNwZW5kZWRSZWFzb24gIT09IFN1c3BlbmRlZE9uRGF0YSAmJlxuICAgICAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1N1c3BlbmRlZFJlYXNvbiAhPT0gU3VzcGVuZGVkT25BY3Rpb24pIHx8XG4gICAgICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzUm9vdCAhPT0gcm9vdCB8fFxuICAgICAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3NTdXNwZW5kZWRSZWFzb24gPVxuICAgICAgICAgICAgICAgICAgICAgIFN1c3BlbmRlZEFuZFJlYWR5VG9Db250aW51ZSk7XG4gICAgICAgICAgICAgICAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBtZW1vaXplZFVwZGF0ZXJzLnRoZW4obGFuZXMsIGxhbmVzKTtcbiAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICBjYXNlIFN1c3BlbmRlZE9uSW1tZWRpYXRlOlxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uID0gU3VzcGVuZGVkQW5kUmVhZHlUb0NvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgIGNhc2UgU3VzcGVuZGVkT25JbnN0YW5jZTpcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1N1c3BlbmRlZFJlYXNvbiA9XG4gICAgICAgICAgICAgICAgICBTdXNwZW5kZWRPbkluc3RhbmNlQW5kUmVhZHlUb0NvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgIGNhc2UgU3VzcGVuZGVkQW5kUmVhZHlUb0NvbnRpbnVlOlxuICAgICAgICAgICAgICAgIGlzVGhlbmFibGVSZXNvbHZlZChtZW1vaXplZFVwZGF0ZXJzKVxuICAgICAgICAgICAgICAgICAgPyAoKHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uID0gTm90U3VzcGVuZGVkKSxcbiAgICAgICAgICAgICAgICAgICAgKHdvcmtJblByb2dyZXNzVGhyb3duVmFsdWUgPSBudWxsKSxcbiAgICAgICAgICAgICAgICAgICAgcmVwbGF5U3VzcGVuZGVkVW5pdE9mV29yayhsYW5lcykpXG4gICAgICAgICAgICAgICAgICA6ICgod29ya0luUHJvZ3Jlc3NTdXNwZW5kZWRSZWFzb24gPSBOb3RTdXNwZW5kZWQpLFxuICAgICAgICAgICAgICAgICAgICAod29ya0luUHJvZ3Jlc3NUaHJvd25WYWx1ZSA9IG51bGwpLFxuICAgICAgICAgICAgICAgICAgICB0aHJvd0FuZFVud2luZFdvcmtMb29wKFxuICAgICAgICAgICAgICAgICAgICAgI
15852HJvb3QsXG4gICAgICAgICAgICAgICAgICAgICAgbGFuZXMsXG4gICAgICAgICAgICAgICAgICAgICAgbWVtb2l6ZWRVcGRhdGVycyxcbiAgICAgICAgICAgICAgICAgICAgICBTdXNwZW5kZWRBbmRSZWFkeVRvQ29udGludWVcbiAgICAgICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgU3VzcGVuZGVkT25JbnN0YW5jZUFuZFJlYWR5VG9Db250aW51ZTpcbiAgICAgICAgICAgICAgICB2YXIgcmVzb3VyY2UgPSBudWxsO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAod29ya0luUHJvZ3Jlc3MudGFnKSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIDI2OlxuICAgICAgICAgICAgICAgICAgICByZXNvdXJjZSA9IHdvcmtJblByb2dyZXNzLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgICAgICAgICAgICB2YXIgaG9zdEZpYmVyID0gd29ya0luUHJvZ3Jlc3M7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBwcmVsb2FkUmVzb3VyY2UocmVzb3VyY2UpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGhvc3RGaWJlci5zdGF0ZU5vZGUuY29tcGxldGVcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NTdXNwZW5kZWRSZWFzb24gPSBOb3RTdXNwZW5kZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NUaHJvd25WYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgdmFyIHNpYmxpbmcgPSBob3N0RmliZXIuc2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPT0gc2libGluZykgd29ya0luUHJvZ3Jlc3MgPSBzaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVybkZpYmVyID0gaG9zdEZpYmVyLnJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgIT09IHJldHVybkZpYmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gKCh3b3JrSW5Qcm9ncmVzcyA9IHJldHVybkZpYmVyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZVVuaXRPZldvcmsocmV0dXJuRmliZXIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICA6ICh3b3JrSW5Qcm9ncmVzcyA9IG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBicmVhayBiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICBcIlVuZXhwZWN0ZWQgdHlwZSBvZiBmaWJlciB0cmlnZ2VyZWQgYSBzdXNwZW5zZXkgY29tbWl0LiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LlwiXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uID0gTm90U3VzcGVuZGVkO1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzVGhyb3duVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRocm93QW5kVW53aW5kV29ya0xvb3AoXG4gICAgICAgICAgICAgICAgICByb290LFxuICAgICAgICAgICAgICAgICAgbGFuZXMsXG4gICAgICAgICAgICAgICAgICBtZW1vaXplZFVwZGF0ZXJzLFxuICAgICAgICAgICAgICAgICAgU3VzcGVuZGVkT25JbnN0YW5jZUFuZFJlYWR5VG9Db250aW51ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgU3VzcGVuZGVkT25EZXByZWNhdGVkVGhyb3dQcm9taXNlOlxuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmVhc29uID0gTm90U3VzcGVuZGVkO1xuICAgICAgICAgICAgICAgIHdvcmtJblByb2dyZXNzVGhyb3duVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRocm93QW5kVW53aW5kV29ya0xvb3AoXG4gICAgICAgICAgICAgICAgICByb290LFxuICAgICAgICAgICAgICAgICAgbGFuZXMsXG4gICAgICAgICAgICAgICAgICBtZW1vaXplZFVwZGF0ZXJzLFxuICAgICAgICAgICAgICAgICAgU3VzcGVuZGVkT25EZXByZWNhdGVkVGhyb3dQcm9taXNlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBTdXNwZW5kZWRPbkh5ZHJhdGlvbjpcbiAgICAgICAgICAgICAgICByZXNldFdvcmtJblByb2dyZXNzU3RhY2soKTtcbiAgICAgICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdFN1c3BlbmRlZEF0VGhlU2hlbGw7XG4gICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgICAgICAgIFwiVW5leHBlY3RlZCBTdXNwZW5kZWRSZWFzb24uIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuXCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIG51bGwgIT09IFJlYWN0U2hhcmVkSW50ZXJuYWxzLmFjdFF1ZXVlXG4gICAgICAgICAgICA/IHdvcmtMb29wU3luYygpXG4gICAgICAgICAgICA6IHdvcmtMb29wQ29uY3VycmVudEJ5U2NoZWR1bGVyKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gY2F0Y2ggKHRocm93blZhbHVlJDEwKSB7XG4gICAgICAgICAgaGFuZGxlVGhyb3cocm9vdCwgdGhyb3duVmFsdWUkMTApO1xuICAgICAgICB9XG4gICAgICB3aGlsZSAoMSk7XG4gICAgICByZXNldENvbnRleHREZXBlbmRlbmNpZXMoKTtcbiAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkEgPSBwcmV2QXN5bmNEaXNwYXRjaGVyO1xuICAgICAgZXhlY3V0aW9uQ29udGV4dCA9IHByZXZFeGVjdXRpb25Db250ZXh0O1xuICAgICAgaWYgKG51bGwgIT09IHdvcmtJblByb2dyZXNzKSByZXR1cm4gUm9vdEluUHJvZ3Jlc3M7XG4gICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSBudWxsO1xuICAgICAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSAwO1xuICAgICAgZmluaXNoUXVldWVpbmdDb25jdXJyZW50VXBkYXRlcygpO1xuICAgICAgcmV0dXJuIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXM7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHdvcmtMb29wQ29uY3VycmVudEJ5U2NoZWR1bGVyKCkge1xuICAgICAgZm9yICg7IG51bGwgIT09IHdvcmtJblByb2dyZXNzICYmICFzaG91bGRZaWVsZCgpOyApXG4gICAgICAgI
15852HBlcmZvcm1Vbml0T2ZXb3JrKHdvcmtJblByb2dyZXNzKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcGVyZm9ybVVuaXRPZldvcmsodW5pdE9mV29yaykge1xuICAgICAgdmFyIGN1cnJlbnQgPSB1bml0T2ZXb3JrLmFsdGVybmF0ZTtcbiAgICAgICh1bml0T2ZXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZVxuICAgICAgICA/IChzdGFydFByb2ZpbGVyVGltZXIodW5pdE9mV29yayksXG4gICAgICAgICAgKGN1cnJlbnQgPSBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgIHVuaXRPZldvcmssXG4gICAgICAgICAgICBiZWdpbldvcmssXG4gICAgICAgICAgICBjdXJyZW50LFxuICAgICAgICAgICAgdW5pdE9mV29yayxcbiAgICAgICAgICAgIGVudGFuZ2xlZFJlbmRlckxhbmVzXG4gICAgICAgICAgKSksXG4gICAgICAgICAgc3RvcFByb2ZpbGVyVGltZXJJZlJ1bm5pbmdBbmRSZWNvcmREdXJhdGlvbih1bml0T2ZXb3JrKSlcbiAgICAgICAgOiAoY3VycmVudCA9IHJ1bldpdGhGaWJlckluREVWKFxuICAgICAgICAgICAgdW5pdE9mV29yayxcbiAgICAgICAgICAgIGJlZ2luV29yayxcbiAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICB1bml0T2ZXb3JrLFxuICAgICAgICAgICAgZW50YW5nbGVkUmVuZGVyTGFuZXNcbiAgICAgICAgICApKTtcbiAgICAgIHVuaXRPZldvcmsubWVtb2l6ZWRQcm9wcyA9IHVuaXRPZldvcmsucGVuZGluZ1Byb3BzO1xuICAgICAgbnVsbCA9PT0gY3VycmVudFxuICAgICAgICA/IGNvbXBsZXRlVW5pdE9mV29yayh1bml0T2ZXb3JrKVxuICAgICAgICA6ICh3b3JrSW5Qcm9ncmVzcyA9IGN1cnJlbnQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXBsYXlTdXNwZW5kZWRVbml0T2ZXb3JrKHVuaXRPZldvcmspIHtcbiAgICAgIHZhciBuZXh0ID0gcnVuV2l0aEZpYmVySW5ERVYodW5pdE9mV29yaywgcmVwbGF5QmVnaW5Xb3JrLCB1bml0T2ZXb3JrKTtcbiAgICAgIHVuaXRPZldvcmsubWVtb2l6ZWRQcm9wcyA9IHVuaXRPZldvcmsucGVuZGluZ1Byb3BzO1xuICAgICAgbnVsbCA9PT0gbmV4dCA/IGNvbXBsZXRlVW5pdE9mV29yayh1bml0T2ZXb3JrKSA6ICh3b3JrSW5Qcm9ncmVzcyA9IG5leHQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXBsYXlCZWdpbldvcmsodW5pdE9mV29yaykge1xuICAgICAgdmFyIGN1cnJlbnQgPSB1bml0T2ZXb3JrLmFsdGVybmF0ZSxcbiAgICAgICAgaXNQcm9maWxpbmdNb2RlID0gKHVuaXRPZldvcmsubW9kZSAmIFByb2ZpbGVNb2RlKSAhPT0gTm9Nb2RlO1xuICAgICAgaXNQcm9maWxpbmdNb2RlICYmIHN0YXJ0UHJvZmlsZXJUaW1lcih1bml0T2ZXb3JrKTtcbiAgICAgIHN3aXRjaCAodW5pdE9mV29yay50YWcpIHtcbiAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGN1cnJlbnQgPSByZXBsYXlGdW5jdGlvbkNvbXBvbmVudChcbiAgICAgICAgICAgIGN1cnJlbnQsXG4gICAgICAgICAgICB1bml0T2ZXb3JrLFxuICAgICAgICAgICAgdW5pdE9mV29yay5wZW5kaW5nUHJvcHMsXG4gICAgICAgICAgICB1bml0T2ZXb3JrLnR5cGUsXG4gICAgICAgICAgICB2b2lkIDAsXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lc1xuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTE6XG4gICAgICAgICAgY3VycmVudCA9IHJlcGxheUZ1bmN0aW9uQ29tcG9uZW50KFxuICAgICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICAgIHVuaXRPZldvcmssXG4gICAgICAgICAgICB1bml0T2ZXb3JrLnBlbmRpbmdQcm9wcyxcbiAgICAgICAgICAgIHVuaXRPZldvcmsudHlwZS5yZW5kZXIsXG4gICAgICAgICAgICB1bml0T2ZXb3JrLnJlZixcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIHJlc2V0SG9va3NPblVud2luZCh1bml0T2ZXb3JrKTtcbiAgICAgICAgICB2Y
15852XIgZmliZXIgPSB1bml0T2ZXb3JrO1xuICAgICAgICAgIGZpYmVyID09PSBoeWRyYXRpb25QYXJlbnRGaWJlciAmJlxuICAgICAgICAgICAgKGlzSHlkcmF0aW5nXG4gICAgICAgICAgICAgID8gKHBvcFRvTmV4dEhvc3RQYXJlbnQoZmliZXIpLFxuICAgICAgICAgICAgICAgIDUgPT09IGZpYmVyLnRhZyAmJlxuICAgICAgICAgICAgICAgICAgbnVsbCAhPSBmaWJlci5zdGF0ZU5vZGUgJiZcbiAgICAgICAgICAgICAgICAgIChuZXh0SHlkcmF0YWJsZUluc3RhbmNlID0gZmliZXIuc3RhdGVOb2RlKSlcbiAgICAgICAgICAgICAgOiAocG9wVG9OZXh0SG9zdFBhcmVudChmaWJlciksIChpc0h5ZHJhdGluZyA9ICEwKSkpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHVud2luZEludGVycnVwdGVkV29yayhjdXJyZW50LCB1bml0T2ZXb3JrKSxcbiAgICAgICAgICAgICh1bml0T2ZXb3JrID0gd29ya0luUHJvZ3Jlc3MgPVxuICAgICAgICAgICAgICByZXNldFdvcmtJblByb2dyZXNzKHVuaXRPZldvcmssIGVudGFuZ2xlZFJlbmRlckxhbmVzKSksXG4gICAgICAgICAgICAoY3VycmVudCA9IGJlZ2luV29yayhjdXJyZW50LCB1bml0T2ZXb3JrLCBlbnRhbmdsZWRSZW5kZXJMYW5lcykpO1xuICAgICAgfVxuICAgICAgaXNQcm9maWxpbmdNb2RlICYmXG4gICAgICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkRHVyYXRpb24odW5pdE9mV29yayk7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgZnVuY3Rpb24gdGhyb3dBbmRVbndpbmRXb3JrTG9vcChcbiAgICAgIHJvb3QsXG4gICAgICB1bml0T2ZXb3JrLFxuICAgICAgdGhyb3duVmFsdWUsXG4gICAgICBzdXNwZW5kZWRSZWFzb25cbiAgICApIHtcbiAgICAgIHJlc2V0Q29udGV4dERlcGVuZGVuY2llcygpO1xuICAgICAgcmVzZXRIb29rc09uVW53aW5kKHVuaXRPZldvcmspO1xuICAgICAgdGhlbmFibGVTdGF0ZSQxID0gbnVsbDtcbiAgICAgIHRoZW5hYmxlSW5kZXhDb3VudGVyJDEgPSAwO1xuICAgICAgdmFyIHJldHVybkZpYmVyID0gdW5pdE9mV29yay5yZXR1cm47XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhyb3dFeGNlcHRpb24oXG4gICAgICAgICAgICByb290LFxuICAgICAgICAgICAgcmV0dXJuRmliZXIsXG4gICAgICAgICAgICB1bml0T2ZXb3JrLFxuICAgICAgICAgICAgdGhyb3duVmFsdWUsXG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lc1xuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RGYXRhbEVycm9yZWQ7XG4gICAgICAgICAgbG9nVW5jYXVnaHRFcnJvcihcbiAgICAgICAgICAgIHJvb3QsXG4gICAgICAgICAgICBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcih0aHJvd25WYWx1ZSwgcm9vdC5jdXJyZW50KVxuICAgICAgICAgICk7XG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKG51bGwgIT09IHJldHVybkZpYmVyKSB0aHJvdyAoKHdvcmtJblByb2dyZXNzID0gcmV0dXJuRmliZXIpLCBlcnJvcik7XG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPSBSb290RmF0YWxFcnJvcmVkO1xuICAgICAgICBsb2dVbmNhdWdodEVycm9yKFxuICAgICAgICAgIHJvb3QsXG4gICAgICAgICAgY3JlYXRlQ2FwdHVyZWRWYWx1ZUF0RmliZXIodGhyb3duVmFsdWUsIHJvb3QuY3VycmVudClcbiAgICAgICAgKTtcbiAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodW5pdE9mV29yay5mbGFncyAmIDMyNzY4KSB7XG4gICAgICAgIGlmIChpc0h5ZHJhdGluZyB8fCBzdXNwZW5kZWRSZWFzb24gPT09IFN1c3BlbmRlZE9uRXJyb3IpIHJvb3QgPSAhMDtcbiAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290SXNQcmVyZW5kZXJpbmcgfHxcbiAgICAgICAgICAwICE9PSAod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgJiA1MzY4NzA5MTIpXG4gICAgICAgIClcbiAgICAgICAgICByb290ID0gITE7XG4gICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICgod29ya0luUHJvZ3Jlc3NSb290RGlkU2tpcFN1c3BlbmRlZFNpYmxpbmdzID0gcm9vdCA9ICEwKSxcbiAgICAgICAgICBzdXNwZW5kZWRSZWFzb24gPT09IFN1c3BlbmRlZE9uRGF0YSB8fFxuICAgICAgICAgICAgc3VzcGVuZGVkUmVhc29uID09PSBTdXNwZW5kZWRPbkFjdGlvbiB8fFxuICAgICAgICAgICAgc3VzcGVuZGVkUmVhc29uID09PSBTdXNwZW5kZWRPbkltbWVkaWF0ZSB8fFxuICAgICAgICAgICAgc3VzcGVuZGVkUmVhc29uID09PSBTdXNwZW5kZWRPbkRlcHJlY2F0ZWRUaHJvd1Byb21pc2UpXG4gICAgICAgIClcbiAgICAgICAgICAoc3VzcGVuZGVkUmVhc29uID0gc3VzcGVuc2VIYW5kbGVyU3RhY2tDdXJzb3IuY3VycmVudCksXG4gICAgICAgICAgICBudWxsICE9PSBzdXNwZW5kZWRSZWFzb24gJiZcbiAgICAgICAgICAgICAgMTMgPT09IHN1c3BlbmRlZFJlYXNvbi50YWcgJiZcbiAgICAgICAgICAgICAgKHN1c3BlbmRlZFJlYXNvbi5mbGFncyB8PSAxNjM4NCk7XG4gICAgICAgIHVud2luZFVuaXRPZldvcmsodW5pdE9mV29yaywgcm9vdCk7XG4gICAgICB9IGVsc2UgY29tcGxldGVVbml0T2ZXb3JrKHVuaXRPZldvcmspO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21wbGV0ZVVuaXRPZldvcmsodW5pdE9mV29yaykge1xuICAgICAgdmFyIGNvbXBsZXRlZFdvcmsgPSB1bml0T2ZXb3JrO1xuICAgICAgZG8ge1xuICAgICAgICBpZiAoMCAhPT0gKGNvbXBsZXRlZFdvcmsuZmxhZ3MgJiAzMjc2OCkpIHtcbiAgICAgICAgICB1bndpbmRVbml0T2ZXb3JrKFxuICAgICAgICAgICAgY29tcGxldGVkV29yayxcbiAgICAgICAgICAgIHdvcmtJblByb2dyZXNzUm9vdERpZFNraXBTdXNwZW5kZWRTaWJsaW5nc1xuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgI
15852HZhciBjdXJyZW50ID0gY29tcGxldGVkV29yay5hbHRlcm5hdGU7XG4gICAgICAgIHVuaXRPZldvcmsgPSBjb21wbGV0ZWRXb3JrLnJldHVybjtcbiAgICAgICAgc3RhcnRQcm9maWxlclRpbWVyKGNvbXBsZXRlZFdvcmspO1xuICAgICAgICBjdXJyZW50ID0gcnVuV2l0aEZpYmVySW5ERVYoXG4gICAgICAgICAgY29tcGxldGVkV29yayxcbiAgICAgICAgICBjb21wbGV0ZVdvcmssXG4gICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICBjb21wbGV0ZWRXb3JrLFxuICAgICAgICAgIGVudGFuZ2xlZFJlbmRlckxhbmVzXG4gICAgICAgICk7XG4gICAgICAgIChjb21wbGV0ZWRXb3JrLm1vZGUgJiBQcm9maWxlTW9kZSkgIT09IE5vTW9kZSAmJlxuICAgICAgICAgIHN0b3BQcm9maWxlclRpbWVySWZSdW5uaW5nQW5kUmVjb3JkSW5jb21wbGV0ZUR1cmF0aW9uKGNvbXBsZXRlZFdvcmspO1xuICAgICAgICBpZiAobnVsbCAhPT0gY3VycmVudCkge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzID0gY3VycmVudDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29tcGxldGVkV29yayA9IGNvbXBsZXRlZFdvcmsuc2libGluZztcbiAgICAgICAgaWYgKG51bGwgIT09IGNvbXBsZXRlZFdvcmspIHtcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IGNvbXBsZXRlZFdvcms7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHdvcmtJblByb2dyZXNzID0gY29tcGxldGVkV29yayA9IHVuaXRPZldvcms7XG4gICAgICB9IHdoaWxlIChudWxsICE9PSBjb21wbGV0ZWRXb3JrKTtcbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdEV4aXRTdGF0dXMgPT09IFJvb3RJblByb2dyZXNzICYmXG4gICAgICAgICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID0gUm9vdENvbXBsZXRlZCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVud2luZFVuaXRPZldvcmsodW5pdE9mV29yaywgc2tpcFNpYmxpbmdzKSB7XG4gICAgICBkbyB7XG4gICAgICAgIHZhciBuZXh0ID0gdW53aW5kV29yayh1bml0T2ZXb3JrLmFsdGVybmF0ZSwgdW5pdE9mV29yayk7XG4gICAgICAgIGlmIChudWxsICE9PSBuZXh0KSB7XG4gICAgICAgICAgbmV4dC5mbGFncyAmPSAzMjc2NztcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzcyA9IG5leHQ7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICgodW5pdE9mV29yay5tb2RlICYgUHJvZmlsZU1vZGUpICE9PSBOb01vZGUpIHtcbiAgICAgICAgICBzdG9wUHJvZmlsZXJUaW1lcklmUnVubmluZ0FuZFJlY29yZEluY29tcGxldGVEdXJhdGlvbih1bml0T2ZXb3JrKTtcbiAgICAgICAgICBuZXh0ID0gdW5pdE9mV29yay5hY3R1YWxEdXJhdGlvbjtcbiAgICAgICAgICBmb3IgKHZhciBjaGlsZCA9IHVuaXRPZldvcmsuY2hpbGQ7IG51bGwgIT09IGNoaWxkOyApXG4gICAgICAgICAgICAobmV4dCArPSBjaGlsZC5hY3R1YWxEdXJhdGlvbiksIChjaGlsZCA9IGNoaWxkLnNpYmxpbmcpO1xuICAgICAgICAgIHVuaXRPZldvcmsuYWN0dWFsRHVyYXRpb24gPSBuZXh0O1xuICAgICAgICB9XG4gICAgICAgIG5leHQgPSB1bml0T2ZXb3JrLnJldHVybjtcbiAgICAgICAgbnVsbCAhPT0gbmV4dCAmJlxuICAgICAgICAgICgobmV4dC5mbGFncyB8PSAzMjc2OCksXG4gICAgICAgICAgKG5leHQuc3VidHJlZUZsYWdzID0gMCksXG4gICAgICAgICAgKG5leHQuZGVsZXRpb25zID0gbnVsbCkpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIXNraXBTaWJsaW5ncyAmJlxuICAgICAgICAgICgodW5pdE9mV29yayA9IHVuaXRPZldvcmsuc2libGluZyksIG51bGwgIT09IHVuaXRPZldvcmspXG4gICAgICAgICkge1xuICAgICAgICAgIHdvcmtJblByb2dyZXNzID0gdW5pdE9mV29yaztcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgd29ya0luUHJvZ3Jlc3MgPSB1bml0T2ZXb3JrID0gbmV4dDtcbiAgICAgIH0gd2hpbGUgKG51bGwgIT09IHVuaXRPZldvcmspO1xuICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RTdXNwZW5kZWRBdFRoZVNoZWxsO1xuICAgICAgd29ya0luUHJvZ3Jlc3MgPSBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21wbGV0ZVJvb3QoXG4gICAgICByb290LFxuICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgbGFuZXMsXG4gICAgICByZWNvdmVyYWJsZUVycm9ycyxcbiAgICAgIHRyYW5zaXRpb25zLFxuICAgICAgZGlkSW5jbHVkZVJlbmRlclBoYXNlVXBkYXRlLFxuICAgICAgc3Bhd25lZExhbmUsXG4gICAgICB1cGRhdGVkTGFuZXMsXG4gICAgICBzdXNwZW5kZWRSZXRyeUxhbmVzLFxuICAgICAgZGlkU2tpcFN1c3BlbmRlZFNpYmxpbmdzLFxuICAgICAgZXhpdFN0YXR1cyxcbiAgICAgIHN1c3BlbmRlZFN0YXRlLFxuICAgICAgc3VzcGVuZGVkQ29tbWl0UmVhc29uLFxuICAgICAgY29tcGxldGVkUmVuZGVyU3RhcnRUaW1lLFxuICAgICAgY29tcGxldGVkUmVuZGVyRW5kVGltZVxuICAgICkge1xuICAgICAgcm9vdC5jYW5jZWxQZW5kaW5nQ29tbWl0ID0gbnVsbDtcbiAgICAgIGRvIGZsdXNoUGVuZGluZ0VmZmVjdHMoKTtcbiAgICAgIHdoaWxlIChwZW5kaW5nRWZmZWN0c1N0YXR1cyAhPT0gTk9fUEVORElOR19FRkZFQ1RTKTtcbiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmcoKTtcbiAgICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoUGVuZGluZ1Vuc2FmZUxpZmVjeWNsZVdhcm5pbmdzKCk7XG4gICAgICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KVxuICAgICAgICB0aHJvdyBFcnJvcihcIlNob3VsZCBub3QgYWxyZWFkeSBiZSB3b3JraW5nLlwiKTtcbiAgICAgIHNldEN1cnJlbnRUcmFja0Zyb21MYW5lcyhsYW5lcyk7XG4gICAgICBpZiAoZXhpdFN0YXR1cyA9PT0gUm9vdEVycm9yZWQpXG4gICAgICAgIGxvZ0Vycm9yZWRSZW5kZXJQaGFzZShcbiAgICAgICAgICBjb21wbGV0ZWRSZW5kZXJTdGFydFRpbWUsXG4gICAgICAgICAgY29tcGxldGVkUmVuZGVyRW5kVGltZSxcbiAgICAgICAgICBsYW5lcyxcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1VwZGF0ZVRhc2tcbiAgICAgICAgKTtcbiAgICAgIGVsc2UgaWYgKG51bGwgIT09IHJlY292ZXJhYmxlRXJyb3JzKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAoKGRpZFNraXBTdXNwZW5kZWRTaWJsaW5ncyA9XG4gICAgICAgICAgICBudWxsICE9PSBmaW5pc2hlZFdvcmsgJiZcbiAgICAgICAgICAgIG51bGwgIT09IGZpbmlzaGVkV29yay5hbHRlcm5hdGUgJiZcbiAgICAgICAgICAgIGZpbmlzaGVkV29yay5hbHRlcm5hdGUubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQgJiZcbiAgICAgICAgICAgIDAgIT09IChmaW5pc2hlZFdvcmsuZmxhZ3MgJiAyNTYpKSxcbiAgICAgICAgICAoZGlkSW5jbHVkZVJlbmRlclBoYXNlVXBkYXRlID0gd29ya0luUHJvZ3Jlc3NVcGRhdGVUYXNrKSxcbiAgICAgICAgICBzdXBwb3J0c1VzZXJUaW1pbmcgJiZcbiAgICAgICAgICAgICEoY29tcGxldGVkUmVuZGVyRW5kVGltZSA8PSBjb21wbGV0ZWRSZW5kZXJTdGFydFRpbWUpKVxuICAgICAgICApIHtcbiAgICAgICAgICBleGl0U3RhdHVzID0gW107XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWNvdmVyYWJsZUVycm9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGVycm9yID0gcmVjb3ZlcmFibGVFcnJvcnNbaV0udmFsdWU7XG4gICAgICAgICAgICBleGl0U3RhdHVzLnB1c2goW1xuICAgICAgICAgICAgICBcIlJlY292ZXJhYmxlIEVycm9yXCIsXG4gICAgICAgICAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiBlcnJvciAmJlxuICAgICAgICAgICAgICBudWxsICE9PSBlcnJvciAmJlxuICAgICAgICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2YgZXJyb3IubWVzc2FnZVxuICAgICAgICAgICAgICAgID8gU3RyaW5nKGVycm9yLm1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgOiBTdHJpbmcoZXJyb3IpXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29tcGxldGVkUmVuZGVyU3RhcnRUaW1lID0ge1xuICAgICAgICAgICAgc3RhcnQ6IGNvbXBsZXRlZFJlbmRlclN0YXJ0VGltZSxcbiAgICAgICAgICAgIGVuZDogY29tcGxldGVkUmVuZGVyRW5kVGltZSxcbiAgICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgICBkZXZ0b29sczoge1xuICAgICAgICAgICAgICAgIGNvbG9yOiBcInByaW1hcnktZGFya1wiLFxuICAgICAgICAgICAgICAgI
15852HRyYWNrOiBjdXJyZW50VHJhY2ssXG4gICAgICAgICAgICAgICAgdHJhY2tHcm91cDogTEFORVNfVFJBQ0tfR1JPVVAsXG4gICAgICAgICAgICAgICAgdG9vbHRpcFRleHQ6IGRpZFNraXBTdXNwZW5kZWRTaWJsaW5nc1xuICAgICAgICAgICAgICAgICAgPyBcIkh5ZHJhdGlvbiBGYWlsZWRcIlxuICAgICAgICAgICAgICAgICAgOiBcIlJlY292ZXJlZCBhZnRlciBFcnJvclwiLFxuICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IGV4aXRTdGF0dXNcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgZGlkSW5jbHVkZVJlbmRlclBoYXNlVXBkYXRlXG4gICAgICAgICAgICA/IGRpZEluY2x1ZGVSZW5kZXJQaGFzZVVwZGF0ZS5ydW4oXG4gICAgICAgICAgICAgICAgcGVyZm9ybWFuY2UubWVhc3VyZS5iaW5kKFxuICAgICAgICAgICAgICAgICAgcGVyZm9ybWFuY2UsXG4gICAgICAgICAgICAgICAgICBcIlJlY292ZXJlZFwiLFxuICAgICAgICAgICAgICAgICAgY29tcGxldGVkUmVuZGVyU3RhcnRUaW1lXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IHBlcmZvcm1hbmNlLm1lYXN1cmUoXCJSZWNvdmVyZWRcIiwgY29tcGxldGVkUmVuZGVyU3RhcnRUaW1lKTtcbiAgICAgICAgICBwZXJmb3JtYW5jZS5jbGVhck1lYXN1cmVzKFwiUmVjb3ZlcmVkXCIpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2VcbiAgICAgICAgKGRpZEluY2x1ZGVSZW5kZXJQaGFzZVVwZGF0ZSA9IHdvcmtJblByb2dyZXNzVXBkYXRlVGFzayksXG4gICAgICAgICAgIXN1cHBvcnRzVXNlclRpbWluZyB8fFxuICAgICAgICAgICAgY29tcGxldGVkUmVuZGVyRW5kVGltZSA8PSBjb21wbGV0ZWRSZW5kZXJTdGFydFRpbWUgfHxcbiAgICAgICAgICAgICgoZGlkU2tpcFN1c3BlbmRlZFNpYmxpbmdzID1cbiAgICAgICAgICAgICAgKGxhbmVzICYgNzM4MTk3NjUzKSA9PT0gbGFuZXMgPyBcInRlcnRpYXJ5LWRhcmtcIiA6IFwicHJpbWFyeS1kYXJrXCIpLFxuICAgICAgICAgICAgKGV4aXRTdGF0dXMgPVxuICAgICAgICAgICAgICAobGFuZXMgJiA1MzY4NzA5MTIpID09PSBsYW5lc1xuICAgICAgICAgICAgICAgID8gXCJQcmVwYXJlZFwiXG4gICAgICAgICAgICAgICAgOiAobGFuZXMgJiAyMDEzMjY3NDEpID09PSBsYW5lc1xuICAgICAgICAgICAgICAgICAgPyBcIkh5ZHJhdGVkXCJcbiAgICAgICAgICAgICAgICAgIDogXCJSZW5kZXJcIiksXG4gICAgICAgICAgICBkaWRJbmNsdWRlUmVuZGVyUGhhc2VVcGRhdGVcbiAgICAgICAgICAgICAgPyBkaWRJbmNsdWRlUmVuZGVyUGhhc2VVcGRhdGUucnVuKFxuICAgICAgICAgICAgICAgICAgY29uc29sZS50aW1lU3RhbXAuYmluZChcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZSxcbiAgICAgICAgICAgICAgICAgICAgZXhpdFN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGVkUmVuZGVyU3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWRSZW5kZXJFbmRUaW1lLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VHJhY2ssXG4gICAgICAgICAgICAgICAgICAgIExBTkVTX1RSQUNLX0dST1VQLFxuICAgICAgICAgICAgICAgICAgICBkaWRTa2lwU3VzcGVuZGVkU2libGluZ3NcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDogY29uc29sZS50aW1lU3RhbXAoXG4gICAgICAgICAgICAgICAgICBleGl0U3RhdHVzLFxuICAgICAgICAgICAgICAgICAgY29tcGxldGVkUmVuZGVyU3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgY29tcGxldGVkUmVuZGVyRW5kVGltZSxcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFjayxcbiAgICAgICAgICAgICAgICAgIExBTkVTX1RSQUNLX0dST1VQLFxuICAgICAgICAgICAgICAgICAgZGlkU2tpcFN1c3BlbmRlZFNpYmxpbmdzXG4gICAgICAgICAgICAgICAgKSk7XG4gICAgICBpZiAobnVsbCAhPT0gZmluaXNoZWRXb3JrKSB7XG4gICAgICAgIDAgPT09IGxhbmVzICYmXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiZmluaXNoZWRMYW5lcyBzaG91bGQgbm90IGJlIGVtcHR5IGR1cmluZyBhIGNvbW1pdC4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC5cIlxuICAgICAgICAgICk7XG4gICAgICAgIGlmIChmaW5pc2hlZFdvcmsgPT09IHJvb3QuY3VycmVudClcbiAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgIFwiQ2Fubm90IGNvbW1pdCB0aGUgc2FtZSB0cmVlIGFzIGJlZm9yZS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIlxuICAgICAgICAgICk7XG4gICAgICAgIHJvb3QgPT09IHdvcmtJblByb2dyZXNzUm9vdCAmJlxuICAgICAgICAgICgod29ya0luUHJvZ3Jlc3MgPSB3b3JrSW5Qcm9ncmVzc1Jvb3QgPSBudWxsKSxcbiAgICAgICAgICAod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgPSAwKSk7XG4gICAgICAgIHBlbmRpbmdGaW5pc2hlZFdvcmsgPSBmaW5pc2hlZFdvcms7XG4gICAgICAgIHBlbmRpbmdFZmZlY3RzUm9vdCA9IHJvb3Q7XG4gICAgICAgIHBlbmRpbmdFZmZlY3RzTGFuZXMgPSBsYW5lcztcbiAgICAgICAgcGVuZGluZ1Bhc3NpdmVUcmFuc2l0aW9ucyA9IHRyYW5zaXRpb25zO1xuICAgICAgICBwZW5kaW5nUmVjb3ZlcmFibGVFcnJvcnMgPSByZWNvdmVyYWJsZUVycm9ycztcbiAgICAgICAgcGVuZGluZ0VmZmVjdHNSZW5kZXJFbmRUaW1lID0gY29tcGxldGVkUmVuZGVyRW5kVGltZTtcbiAgICAgICAgcGVuZGluZ1N1c3BlbmRlZENvbW1pdFJlYXNvbiA9IHN1c3BlbmRlZENvbW1pdFJlYXNvbjtcbiAgICAgICAgcGVuZGluZ0RlbGF5ZWRDb21taXRSZWFzb24gPSBJTU1FRElBVEVfQ09NTUlUO1xuICAgICAgICBwZW5kaW5nU3VzcGVuZGVkVmlld1RyYW5zaXRpb25SZWFzb24gPSBudWxsO1xuICAgICAgICBjb21taXRSb290KFxuICAgICAgICAgIHJvb3QsXG4gICAgICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgICAgIGxhbmVzLFxuICAgICAgICAgI
15852HNwYXduZWRMYW5lLFxuICAgICAgICAgIHVwZGF0ZWRMYW5lcyxcbiAgICAgICAgICBzdXNwZW5kZWRSZXRyeUxhbmVzLFxuICAgICAgICAgIHN1c3BlbmRlZFN0YXRlLFxuICAgICAgICAgIHN1c3BlbmRlZENvbW1pdFJlYXNvbixcbiAgICAgICAgICBjb21wbGV0ZWRSZW5kZXJFbmRUaW1lXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbW1pdFJvb3QoXG4gICAgICByb290LFxuICAgICAgZmluaXNoZWRXb3JrLFxuICAgICAgbGFuZXMsXG4gICAgICBzcGF3bmVkTGFuZSxcbiAgICAgIHVwZGF0ZWRMYW5lcyxcbiAgICAgIHN1c3BlbmRlZFJldHJ5TGFuZXMsXG4gICAgICBzdXNwZW5kZWRTdGF0ZSxcbiAgICAgIHN1c3BlbmRlZENvbW1pdFJlYXNvbixcbiAgICAgIGNvbXBsZXRlZFJlbmRlckVuZFRpbWVcbiAgICApIHtcbiAgICAgIHZhciByZW1haW5pbmdMYW5lcyA9IGZpbmlzaGVkV29yay5sYW5lcyB8IGZpbmlzaGVkV29yay5jaGlsZExhbmVzO1xuICAgICAgcGVuZGluZ0VmZmVjdHNSZW1haW5pbmdMYW5lcyA9IHJlbWFpbmluZ0xhbmVzO1xuICAgICAgcmVtYWluaW5nTGFuZXMgfD0gY29uY3VycmVudGx5VXBkYXRlZExhbmVzO1xuICAgICAgbWFya1Jvb3RGaW5pc2hlZChcbiAgICAgICAgcm9vdCxcbiAgICAgICAgbGFuZXMsXG4gICAgICAgIHJlbWFpbmluZ0xhbmVzLFxuICAgICAgICBzcGF3bmVkTGFuZSxcbiAgICAgICAgdXBkYXRlZExhbmVzLFxuICAgICAgICBzdXNwZW5kZWRSZXRyeUxhbmVzXG4gICAgICApO1xuICAgICAgcGVuZGluZ1ZpZXdUcmFuc2l0aW9uRXZlbnRzID0gbnVsbDtcbiAgICAgIChsYW5lcyAmIDMzNTU0NDA2NCkgPT09IGxhbmVzXG4gICAgICAgID8gKChwZW5kaW5nVHJhbnNpdGlvblR5cGVzID0gY2xhaW1RdWV1ZWRUcmFuc2l0aW9uVHlwZXMocm9vdCkpLFxuICAgICAgICAgIChzcGF3bmVkTGFuZSA9IDEwMjYyKSlcbiAgICAgICAgOiAoKHBlbmRpbmdUcmFuc2l0aW9uVHlwZXMgPSBudWxsKSwgKHNwYXduZWRMYW5lID0gMTAyNTYpKTtcbiAgICAgIDAgIT09IGZpbmlzaGVkV29yay5hY3R1YWxEdXJhdGlvbiB8fFxuICAgICAgMCAhPT0gKGZpbmlzaGVkV29yay5zdWJ0cmVlRmxhZ3MgJiBzcGF3bmVkTGFuZSkgfHxcbiAgICAgIDAgIT09IChmaW5pc2hlZFdvcmsuZmxhZ3MgJiBzcGF3bmVkTGFuZSlcbiAgICAgICAgPyAoKHJvb3QuY2FsbGJhY2tOb2RlID0gbnVsbCksXG4gICAgICAgICAgKHJvb3QuY2FsbGJhY2tQcmlvcml0eSA9IDApLFxuICAgICAgICAgIHNjaGVkdWxlQ2FsbGJhY2skMShOb3JtYWxQcmlvcml0eSQxLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzY2hlZHVsZXJFdmVudCA9IHdpbmRvdy5ldmVudDtcbiAgICAgICAgICAgIHBlbmRpbmdEZWxheWVkQ29tbWl0UmVhc29uID09PSBJTU1FRElBVEVfQ09NTUlUICYmXG4gICAgICAgICAgICAgIChwZW5kaW5nRGVsYXllZENvbW1pdFJlYXNvbiA9IERFTEFZRURfUEFTU0lWRV9DT01NSVQpO1xuICAgICAgICAgICAgZmx1c2hQYXNzaXZlRWZmZWN0cygpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfSkpXG4gICAgICAgIDogKChyb290LmNhbGxiYWNrTm9kZSA9IG51bGwpLCAocm9vdC5jYWxsYmFja1ByaW9yaXR5ID0gMCkpO1xuICAgICAgY29tbWl0RXJyb3JzID0gbnVsbDtcbiAgICAgIGNvbW1pdFN0YXJ0VGltZSA9IG5vdygpO1xuICAgICAgbnVsbCAhPT0gc3VzcGVuZGVkQ29tbWl0UmVhc29uICYmXG4gICAgICAgIGxvZ1N1c3BlbmRlZENvbW1pdFBoYXNlKFxuICAgICAgICAgIGNvbXBsZXRlZFJlbmRlckVuZFRpbWUsXG4gICAgICAgICAgY29tbWl0U3RhcnRUaW1lLFxuICAgICAgICAgIHN1c3BlbmRlZENvbW1pdFJlYXNvbixcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1VwZGF0ZVRhc2tcbiAgICAgICAgKTtcbiAgICAgIHNob3VsZFN0YXJ0Vmlld1RyYW5zaXRpb24gPSAhMTtcbiAgICAgIHN1c3BlbmRlZENvbW1pdFJlYXNvbiA9IDAgIT09IChmaW5pc2hlZFdvcmsuZmxhZ3MgJiAxMzg3OCk7XG4gICAgICBpZiAoMCAhPT0gKGZpbmlzaGVkV29yay5zdWJ0cmVlRmxhZ3MgJiAxMzg3OCkgfHwgc3VzcGVuZGVkQ29tbWl0UmVhc29uKSB7XG4gICAgICAgIHN1c3BlbmRlZENvbW1pdFJlYXNvbiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQ7XG4gICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQgPSBudWxsO1xuICAgICAgICBjb21wbGV0ZWRSZW5kZXJFbmRUaW1lID0gUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucDtcbiAgICAgICAgUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucCA9IERpc2NyZXRlRXZlbnRQcmlvcml0eTtcbiAgICAgICAgc3Bhd25lZExhbmUgPSBleGVjdXRpb25Db250ZXh0O1xuICAgICAgICBleGVjdXRpb25Db250ZXh0IHw9IENvbW1pdENvbnRleHQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29tbWl0QmVmb3JlTXV0YXRpb25FZmZlY3RzKHJvb3QsIGZpbmlzaGVkV29yaywgbGFuZXMpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIChleGVjdXRpb25Db250ZXh0ID0gc3Bhd25lZExhbmUpLFxuICAgICAgICAgICAgKFJlYWN0RE9NU2hhcmVkSW50ZXJuYWxzLnAgPSBjb21wbGV0ZWRSZW5kZXJFbmRUaW1lKSxcbiAgICAgICAgICAgIChSZWFjdFNoYXJlZEludGVybmFscy5UID0gc3VzcGVuZGVkQ29tbWl0UmVhc29uKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcGVuZGluZ0VmZmVjdHNTdGF0dXMgPSBQRU5ESU5HX01VVEFUSU9OX1BIQVNFO1xuICAgICAgc2hvdWxkU3RhcnRWaWV3VHJhbnNpdGlvblxuICAgICAgICA/ICgoYW5pbWF0aW5nTGFuZXMgfD0gbGFuZXMpLFxuICAgICAgICAgIChhbmltYXRpbmdUYXNrID0gbnVsbCksXG4gICAgICAgICAgKHBlbmRpbmdWaWV3VHJhbnNpdGlvbiA9IHN0YXJ0Vmlld1RyYW5zaXRpb24oXG4gICAgICAgICAgICBzdXNwZW5kZWRTdGF0ZSxcbiAgICAgICAgICAgIHJvb3QuY29udGFpbmVySW5mbyxcbiAgICAgICAgICAgIHBlbmRpbmdUcmFuc2l0aW9uVHlwZXMsXG4gICAgICAgICAgICBmbHVzaE11dGF0aW9uRWZmZWN0cyxcbiAgICAgICAgICAgIGZsdXNoTGF5b3V0RWZmZWN0cyxcbiAgICAgICAgICAgIGZsdXNoQWZ0ZXJNdXRhdGlvbkVmZmVjdHMsXG4gICAgICAgICAgICBmbHVzaFNwYXduZWRXb3JrLFxuICAgICAgICAgICAgZmx1c2hQYXNzaXZlRWZmZWN0cyxcbiAgICAgICAgICAgI
15852HJlcG9ydFZpZXdUcmFuc2l0aW9uRXJyb3IsXG4gICAgICAgICAgICBzdXNwZW5kZWRWaWV3VHJhbnNpdGlvbixcbiAgICAgICAgICAgIGZpbmlzaGVkVmlld1RyYW5zaXRpb24uYmluZChudWxsLCBsYW5lcylcbiAgICAgICAgICApKSlcbiAgICAgICAgOiAoZmx1c2hNdXRhdGlvbkVmZmVjdHMoKSwgZmx1c2hMYXlvdXRFZmZlY3RzKCksIGZsdXNoU3Bhd25lZFdvcmsoKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlcG9ydFZpZXdUcmFuc2l0aW9uRXJyb3IoZXJyb3IpIHtcbiAgICAgIGlmIChwZW5kaW5nRWZmZWN0c1N0YXR1cyAhPT0gTk9fUEVORElOR19FRkZFQ1RTKSB7XG4gICAgICAgIHZhciBvblJlY292ZXJhYmxlRXJyb3IgPSBwZW5kaW5nRWZmZWN0c1Jvb3Qub25SZWNvdmVyYWJsZUVycm9yO1xuICAgICAgICBvblJlY292ZXJhYmxlRXJyb3IoZXJyb3IsIG1ha2VFcnJvckluZm8obnVsbCkpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBzdXNwZW5kZWRWaWV3VHJhbnNpdGlvbihyZWFzb24pIHtcbiAgICAgIGNvbW1pdEVuZFRpbWUgPSBub3coKTtcbiAgICAgIGxvZ0NvbW1pdFBoYXNlKFxuICAgICAgICBudWxsID09PSBwZW5kaW5nU3VzcGVuZGVkQ29tbWl0UmVhc29uXG4gICAgICAgICAgPyBwZW5kaW5nRWZmZWN0c1JlbmRlckVuZFRpbWVcbiAgICAgICAgICA6IGNvbW1pdFN0YXJ0VGltZSxcbiAgICAgICAgY29tbWl0RW5kVGltZSxcbiAgICAgICAgY29tbWl0RXJyb3JzLFxuICAgICAgICBwZW5kaW5nRGVsYXllZENvbW1pdFJlYXNvbiA9PT0gQUJPUlRFRF9WSUVXX1RSQU5TSVRJT05fQ09NTUlULFxuICAgICAgICB3b3JrSW5Qcm9ncmVzc1VwZGF0ZVRhc2tcbiAgICAgICk7XG4gICAgICBwZW5kaW5nU3VzcGVuZGVkQ29tbWl0UmVhc29uID0gcGVuZGluZ1N1c3BlbmRlZFZpZXdUcmFuc2l0aW9uUmVhc29uID1cbiAgICAgICAgcmVhc29uO1xuICAgIH1cbiAgICBmdW5jdGlvbiBmaW5pc2hlZFZpZXdUcmFuc2l0aW9uKGxhbmVzKSB7XG4gICAgICBpZiAoMCAhPT0gKGFuaW1hdGluZ0xhbmVzICYgbGFuZXMpKSB7XG4gICAgICAgIHZhciB0YXNrID0gYW5pbWF0aW5nVGFzaztcbiAgICAgICAgYW5pbWF0aW5nTGFuZXMgJj0gfmxhbmVzO1xuICAgICAgICBhbmltYXRpbmdUYXNrID0gbnVsbDtcbiAgICAgICAgMCAhPT0gKGxhbmVzICYgNDE5NDA0OCkgJiZcbiAgICAgICAgICAwID09PSAod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgJiA0MTk0MDQ4KSAmJlxuICAgICAgICAgIDAgPT09IChwZW5kaW5nRWZmZWN0c0xhbmVzICYgNDE5NDA0OCkgJiZcbiAgICAgICAgICAoc2V0Q3VycmVudFRyYWNrRnJvbUxhbmVzKDI1NiksXG4gICAgICAgICAgbG9nQW5pbWF0aW5nUGhhc2UodHJhbnNpdGlvbkNsYW1wVGltZSwgbm93JDEoKSwgdGFzaykpO1xuICAgICAgICAwICE9PSAobGFuZXMgJiA2MjkxNDU2MCkgJiZcbiAgICAgICAgICAwID09PSAod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgJiA2MjkxNDU2MCkgJiZcbiAgICAgICAgICAwID09PSAocGVuZGluZ0VmZmVjdHNMYW5lcyAmIDYyOTE0NTYwKSAmJlxuICAgICAgICAgIChzZXRDdXJyZW50VHJhY2tGcm9tTGFuZXMoNDE5NDMwNCksXG4gICAgICAgICAgbG9nQW5pbWF0aW5nUGhhc2UocmV0cnlDbGFtcFRpbWUsIG5vdyQxKCksIHRhc2spKTtcbiAgICAgICAgMCAhPT0gKGxhbmVzICYgMjA4MDM3NDc4NCkgJiZcbiAgICAgICAgICAwID09PSAod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgJiAyMDgwMzc0Nzg0KSAmJlxuICAgICAgICAgIDAgPT09IChwZW5kaW5nRWZmZWN0c0xhbmVzICYgMjA4MDM3NDc4NCkgJiZcbiAgICAgICAgICAoc2V0Q3VycmVudFRyYWNrRnJvbUxhbmVzKDI2ODQzNTQ1NiksXG4gICAgICAgICAgbG9nQW5pbWF0aW5nUGhhc2UoaWRsZUNsYW1wVGltZSwgbm93JDEoKSwgdGFzaykpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBmbHVzaEFmdGVyTXV0YXRpb25FZmZlY3RzKCkge1xuICAgICAgcGVuZGluZ0VmZmVjdHNTdGF0dXMgPT09IFBFTkRJTkdfQUZURVJfTVVUQVRJT05fUEhBU0UgJiZcbiAgICAgICAgKChwZW5kaW5nRWZmZWN0c1N0YXR1cyA9IE5PX1BFTkRJTkdfRUZGRUNUUyksXG4gICAgICAgIGNvbW1pdEFmdGVyTXV0YXRpb25FZmZlY3RzT25GaWJlcihcbiAgICAgICAgICBwZW5kaW5nRmluaXNoZWRXb3JrLFxuICAgICAgICAgIHBlbmRpbmdFZmZlY3RzUm9vdFxuICAgICAgICApLFxuICAgICAgICAocGVuZGluZ0VmZmVjdHNTdGF0dXMgPSBQRU5ESU5HX1NQQVdORURfV09SSykpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBmbHVzaE11dGF0aW9uRWZmZWN0cygpIHtcbiAgICAgIGlmIChwZW5kaW5nRWZmZWN0c1N0YXR1cyA9PT0gUEVORElOR19NVVRBVElPTl9QSEFTRSkge1xuICAgICAgICBwZW5kaW5nRWZmZWN0c1N0YXR1cyA9IE5PX1BFTkRJTkdfRUZGRUNUUztcbiAgICAgICAgdmFyIHJvb3QgPSBwZW5kaW5nRWZmZWN0c1Jvb3QsXG4gICAgICAgICAgZmluaXNoZWRXb3JrID0gcGVuZGluZ0ZpbmlzaGVkV29yayxcbiAgICAgICAgICBsYW5lcyA9IHBlbmRpbmdFZmZlY3RzTGFuZXMsXG4gICAgICAgICAgcm9vdE11dGF0aW9uSGFzRWZmZWN0ID0gMCAhPT0gKGZpbmlzaGVkV29yay5mbGFncyAmIDEzODc4KTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIDAgIT09IChmaW5pc2hlZFdvcmsuc3VidHJlZUZsYWdzICYgMTM4NzgpIHx8XG4gICAgICAgICAgcm9vdE11dGF0aW9uSGFzRWZmZWN0XG4gICAgICAgICkge1xuICAgICAgICAgIHJvb3RNdXRhdGlvbkhhc0VmZmVjdCA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQ7XG4gICAgICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuVCA9IG51bGw7XG4gICAgICAgICAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBSZWFjdERPTVNoYXJlZEludGVybmFscy5wO1xuICAgICAgICAgIFJlYWN0RE9NU2hhcmVkSW50ZXJuYWxzLnAgPSBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk7XG4gICAgICAgICAgdmFyIHByZXZFeGVjdXRpb25Db250ZXh0ID0gZXhlY3V0aW9uQ29udGV4dDtcbiAgICAgICAgICBleGVjdXRpb25Db250ZXh0IHw9IENvbW1pdENvbnRleHQ7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGluUHJvZ3Jlc3NMYW5lcyA9IGxhbmVzO1xuICAgICAgICAgICAgaW5Qcm9ncmVzc1Jvb3QgPSByb290O1xuICAgICAgICAgICAgaW5VcGRhdGVWaWV3VHJhbnNpdGlvbiA9IHJvb3RWaWV3VHJhbnNpdGlvbkFmZmVjdGVkID0gITE7XG4gICAgICAgICAgICByZXNldENvbXBvbmVudEVmZmVjdFRpbWVycygpO1xuICAgICAgICAgICAgY29tbWl0TXV0YXRpb25FZmZlY3RzT25GaWJlcihmaW5pc2hlZFdvcmssIHJvb3QsIGxhbmVzKTtcbiAgICAgICAgICAgIGluUHJvZ3Jlc3NSb290ID0gaW5Qcm9ncmVzc0xhbmVzID0gbnVsbDtcbiAgICAgICAgICAgIGxhbmVzID0gc2VsZWN0aW9uSW5mb3JtYXRpb247XG4gICAgICAgICAgICB2Y
15852XIgY3VyRm9jdXNlZEVsZW0gPSBnZXRBY3RpdmVFbGVtZW50RGVlcChyb290LmNvbnRhaW5lckluZm8pLFxuICAgICAgICAgICAgICBwcmlvckZvY3VzZWRFbGVtID0gbGFuZXMuZm9jdXNlZEVsZW0sXG4gICAgICAgICAgICAgIHByaW9yU2VsZWN0aW9uUmFuZ2UgPSBsYW5lcy5zZWxlY3Rpb25SYW5nZTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgY3VyRm9jdXNlZEVsZW0gIT09IHByaW9yRm9jdXNlZEVsZW0gJiZcbiAgICAgICAgICAgICAgcHJpb3JGb2N1c2VkRWxlbSAmJlxuICAgICAgICAgICAgICBwcmlvckZvY3VzZWRFbGVtLm93bmVyRG9jdW1lbnQgJiZcbiAgICAgICAgICAgICAgY29udGFpbnNOb2RlKFxuICAgICAgICAgICAgICAgIHByaW9yRm9jdXNlZEVsZW0ub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgcHJpb3JGb2N1c2VkRWxlbVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG51bGwgIT09IHByaW9yU2VsZWN0aW9uUmFuZ2UgJiZcbiAgICAgICAgICAgICAgICBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMocHJpb3JGb2N1c2VkRWxlbSlcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gcHJpb3JTZWxlY3Rpb25SYW5nZS5zdGFydCxcbiAgICAgICAgICAgICAgICAgIGVuZCA9IHByaW9yU2VsZWN0aW9uUmFuZ2UuZW5kO1xuICAgICAgICAgICAgICAgIHZvaWQgMCA9PT0gZW5kICYmIChlbmQgPSBzdGFydCk7XG4gICAgICAgICAgICAgICAgaWYgKFwic2VsZWN0aW9uU3RhcnRcIiBpbiBwcmlvckZvY3VzZWRFbGVtKVxuICAgICAgICAgICAgICAgICAgKHByaW9yRm9jdXNlZEVsZW0uc2VsZWN0aW9uU3RhcnQgPSBzdGFydCksXG4gICAgICAgICAgICAgICAgICAgIChwcmlvckZvY3VzZWRFbGVtLnNlbGVjdGlvbkVuZCA9IE1hdGgubWluKFxuICAgICAgICAgICAgICAgICAgICAgIGVuZCxcbiAgICAgICAgICAgICAgICAgICAgICBwcmlvckZvY3VzZWRFbGVtLnZhbHVlLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHZhciBkb2MgPSBwcmlvckZvY3VzZWRFbGVtLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHdpbiA9IChkb2MgJiYgZG9jLmRlZmF1bHRWaWV3KSB8fCB3aW5kb3c7XG4gICAgICAgICAgICAgICAgICBpZiAod2luLmdldFNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICB2Y
15852XIgc2VsZWN0aW9uID0gd2luLmdldFNlbGVjdGlvbigpLFxuICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHByaW9yRm9jdXNlZEVsZW0udGV4dENvbnRlbnQubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0JGpzY29tcCQwID0gTWF0aC5taW4oXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmlvclNlbGVjdGlvblJhbmdlLnN0YXJ0LFxuICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICBlbmQkanNjb21wJDAgPVxuICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAwID09PSBwcmlvclNlbGVjdGlvblJhbmdlLmVuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IHN0YXJ0JGpzY29tcCQwXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogTWF0aC5taW4ocHJpb3JTZWxlY3Rpb25SYW5nZS5lbmQsIGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICFzZWxlY3Rpb24uZXh0ZW5kICYmXG4gICAgICAgICAgICAgICAgICAgICAgc3RhcnQkanNjb21wJDAgPiBlbmQkanNjb21wJDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAoKGN1ckZvY3VzZWRFbGVtID0gZW5kJGpzY29tcCQwKSxcbiAgICAgICAgICAgICAgICAgICAgICAoZW5kJGpzY29tcCQwID0gc3RhcnQkanNjb21wJDApLFxuICAgICAgICAgICAgICAgICAgICAgIChzdGFydCRqc2NvbXAkMCA9IGN1ckZvY3VzZWRFbGVtKSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdGFydE1hcmtlciA9IGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmlvckZvY3VzZWRFbGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQkanNjb21wJDBcbiAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgIGVuZE1hcmtlciA9IGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmlvckZvY3VzZWRFbGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kJGpzY29tcCQwXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0TWFya2VyICYmXG4gICAgICAgICAgICAgICAgICAgICAgZW5kTWFya2VyICYmXG4gICAgICAgICAgICAgICAgICAgICAgKDEgIT09IHNlbGVjdGlvbi5yYW5nZUNvdW50IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24uYW5jaG9yTm9kZSAhPT0gc3RhcnRNYXJrZXIubm9kZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLmFuY2hvck9mZnNldCAhPT0gc3RhcnRNYXJrZXIub2Zmc2V0IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24uZm9jdXNOb2RlICE9PSBlbmRNYXJrZXIubm9kZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLmZvY3VzT2Zmc2V0ICE9PSBlbmRNYXJrZXIub2Zmc2V0KVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICB2Y
15852XIgcmFuZ2UgPSBkb2MuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICByYW5nZS5zZXRTdGFydChzdGFydE1hcmtlci5ub2RlLCBzdGFydE1hcmtlci5vZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICBzdGFydCRqc2NvbXAkMCA+IGVuZCRqc2NvbXAkMFxuICAgICAgICAgICAgICAgICAgICAgICAgPyAoc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLmV4dGVuZChlbmRNYXJrZXIubm9kZSwgZW5kTWFya2VyLm9mZnNldCkpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IChyYW5nZS5zZXRFbmQoZW5kTWFya2VyLm5vZGUsIGVuZE1hcmtlci5vZmZzZXQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBkb2MgPSBbXTtcbiAgICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb24gPSBwcmlvckZvY3VzZWRFbGVtO1xuICAgICAgICAgICAgICAgIChzZWxlY3Rpb24gPSBzZWxlY3Rpb24ucGFyZW50Tm9kZSk7XG5cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDEgPT09IHNlbGVjdGlvbi5ub2RlVHlwZSAmJlxuICAgICAgICAgICAgICAgICAgZG9jLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiBzZWxlY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6IHNlbGVjdGlvbi5zY3JvbGxMZWZ0LFxuICAgICAgICAgICAgICAgICAgICB0b3A6IHNlbGVjdGlvbi5zY3JvbGxUb3BcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBwcmlvckZvY3VzZWRFbGVtLmZvY3VzICYmXG4gICAgICAgICAgICAgICAgcHJpb3JGb2N1c2VkRWxlbS5mb2N1cygpO1xuICAgICAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgICAgIHByaW9yRm9jdXNlZEVsZW0gPSAwO1xuICAgICAgICAgICAgICAgIHByaW9yRm9jdXNlZEVsZW0gPCBkb2MubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHByaW9yRm9jdXNlZEVsZW0rK1xuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB2Y
15852XIgaW5mbyA9IGRvY1twcmlvckZvY3VzZWRFbGVtXTtcbiAgICAgICAgICAgICAgICBpbmZvLmVsZW1lbnQuc2Nyb2xsTGVmdCA9IGluZm8ubGVmdDtcbiAgICAgICAgICAgICAgICBpbmZvLmVsZW1lbnQuc2Nyb2xsVG9wID0gaW5mby50b3A7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9lbmFibGVkID0gISFldmVudHNFbmFibGVkO1xuICAgICAgICAgICAgc2VsZWN0aW9uSW5mb3JtYXRpb24gPSBldmVudHNFbmFibGVkID0gbnVsbDtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgKGV4ZWN1dGlvbkNvbnRleHQgPSBwcmV2RXhlY3V0aW9uQ29udGV4dCksXG4gICAgICAgICAgICAgIChSZWFjdERPTVNoYXJlZEludGVybmFscy5wID0gcHJldmlvdXNQcmlvcml0eSksXG4gICAgICAgICAgICAgIChSZWFjdFNoYXJlZEludGVybmFscy5UID0gcm9vdE11dGF0aW9uSGFzRWZmZWN0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcm9vdC5jdXJyZW50ID0gZmluaXNoZWRXb3JrO1xuICAgICAgICBwZW5kaW5nRWZmZWN0c1N0YXR1cyA9IFBFTkRJTkdfTEFZT1VUX1BIQVNFO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBmbHVzaExheW91dEVmZmVjdHMoKSB7XG4gICAgICBpZiAocGVuZGluZ0VmZmVjdHNTdGF0dXMgPT09IFBFTkRJTkdfTEFZT1VUX1BIQVNFKSB7XG4gICAgICAgIHBlbmRpbmdFZmZlY3RzU3RhdHVzID0gTk9fUEVORElOR19FRkZFQ1RTO1xuICAgICAgICB2YXIgc3VzcGVuZGVkVmlld1RyYW5zaXRpb25SZWFzb24gPVxuICAgICAgICAgIHBlbmRpbmdTdXNwZW5kZWRWaWV3VHJhbnNpdGlvblJlYXNvbjtcbiAgICAgICAgaWYgKG51bGwgIT09IHN1c3BlbmRlZFZpZXdUcmFuc2l0aW9uUmVhc29uKSB7XG4gICAgICAgICAgY29tbWl0U3RhcnRUaW1lID0gbm93KCk7XG4gICAgICAgICAgdmFyIHN0YXJ0VGltZSA9IGNvbW1pdEVuZFRpbWUsXG4gICAgICAgICAgICBlbmRUaW1lID0gY29tbWl0U3RhcnRUaW1lO1xuICAgICAgICAgICFzdXBwb3J0c1VzZXJUaW1pbmcgfHxcbiAgICAgICAgICAgIGVuZFRpbWUgPD0gc3RhcnRUaW1lIHx8XG4gICAgICAgICAgICAoYW5pbWF0aW5nVGFza1xuICAgICAgICAgICAgICA/IGFuaW1hdGluZ1Rhc2sucnVuKFxuICAgICAgICAgICAgICAgICAgY29uc29sZS50aW1lU3RhbXAuYmluZChcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZSxcbiAgICAgICAgICAgICAgICAgICAgc3VzcGVuZGVkVmlld1RyYW5zaXRpb25SZWFzb24sXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICAgICAgZW5kVGltZSxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRyYWNrLFxuICAgICAgICAgICAgICAgICAgICBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICAgICAgICAgICAgXCJzZWNvbmRhcnktbGlnaHRcIlxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBjb25zb2xlLnRpbWVTdGFtcChcbiAgICAgICAgICAgICAgICAgIHN1c3BlbmRlZFZpZXdUcmFuc2l0aW9uUmVhc29uLFxuICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgZW5kVGltZSxcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFjayxcbiAgICAgICAgICAgICAgICAgIExBTkVTX1RSQUNLX0dST1VQLFxuICAgICAgICAgICAgICAgICAgXCJzZWNvbmRhcnktbGlnaHRcIlxuICAgICAgICAgICAgICAgICkpO1xuICAgICAgICB9XG4gICAgICAgIHN1c3BlbmRlZFZpZXdUcmFuc2l0aW9uUmVhc29uID0gcGVuZGluZ0VmZmVjdHNSb290O1xuICAgICAgICBzdGFydFRpbWUgPSBwZW5kaW5nRmluaXNoZWRXb3JrO1xuICAgICAgICBlbmRUaW1lID0gcGVuZGluZ0VmZmVjdHNMYW5lcztcbiAgICAgICAgdmFyIHJvb3RIYXNMYXlvdXRFZmZlY3QgPSAwICE9PSAoc3RhcnRUaW1lLmZsYWdzICYgODc3Mik7XG4gICAgICAgIGlmICgwICE9PSAoc3RhcnRUaW1lLnN1YnRyZWVGbGFncyAmIDg3NzIpIHx8IHJvb3RIYXNMYXlvdXRFZmZlY3QpIHtcbiAgICAgICAgICByb290SGFzTGF5b3V0RWZmZWN0ID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuVDtcbiAgICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5UID0gbnVsbDtcbiAgICAgICAgICB2Y
15852XIgX3ByZXZpb3VzUHJpb3JpdHkgPSBSZWFjdERPTVNoYXJlZEludGVybmFscy5wO1xuICAgICAgICAgIFJlYWN0RE9NU2hhcmVkSW50ZXJuYWxzLnAgPSBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk7XG4gICAgICAgICAgdmFyIF9wcmV2RXhlY3V0aW9uQ29udGV4dCA9IGV4ZWN1dGlvbkNvbnRleHQ7XG4gICAgICAgICAgZXhlY3V0aW9uQ29udGV4dCB8PSBDb21taXRDb250ZXh0O1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAoaW5Qcm9ncmVzc0xhbmVzID0gZW5kVGltZSksXG4gICAgICAgICAgICAgIChpblByb2dyZXNzUm9vdCA9IHN1c3BlbmRlZFZpZXdUcmFuc2l0aW9uUmVhc29uKSxcbiAgICAgICAgICAgICAgcmVzZXRDb21wb25lbnRFZmZlY3RUaW1lcnMoKSxcbiAgICAgICAgICAgICAgY29tbWl0TGF5b3V0RWZmZWN0T25GaWJlcihcbiAgICAgICAgICAgICAgICBzdXNwZW5kZWRWaWV3VHJhbnNpdGlvblJlYXNvbixcbiAgICAgICAgICAgICAgICBzdGFydFRpbWUuYWx0ZXJuYXRlLFxuICAgICAgICAgICAgICAgIHN0YXJ0VGltZVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAoaW5Qcm9ncmVzc1Jvb3QgPSBpblByb2dyZXNzTGFuZXMgPSBudWxsKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgKGV4ZWN1dGlvbkNvbnRleHQgPSBfcHJldkV4ZWN1dGlvbkNvbnRleHQpLFxuICAgICAgICAgICAgICAoUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucCA9IF9wcmV2aW91c1ByaW9yaXR5KSxcbiAgICAgICAgICAgICAgKFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQgPSByb290SGFzTGF5b3V0RWZmZWN0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3VzcGVuZGVkVmlld1RyYW5zaXRpb25SZWFzb24gPSBwZW5kaW5nRWZmZWN0c1JlbmRlckVuZFRpbWU7XG4gICAgICAgIHN0YXJ0VGltZSA9IHBlbmRpbmdTdXNwZW5kZWRDb21taXRSZWFzb247XG4gICAgICAgIGNvbW1pdEVuZFRpbWUgPSBub3coKTtcbiAgICAgICAgbG9nQ29tbWl0UGhhc2UoXG4gICAgICAgICAgbnVsbCA9PT0gc3RhcnRUaW1lID8gc3VzcGVuZGVkVmlld1RyYW5zaXRpb25SZWFzb24gOiBjb21taXRTdGFydFRpbWUsXG4gICAgICAgICAgY29tbWl0RW5kVGltZSxcbiAgICAgICAgICBjb21taXRFcnJvcnMsXG4gICAgICAgICAgcGVuZGluZ0RlbGF5ZWRDb21taXRSZWFzb24gPT09IEFCT1JURURfVklFV19UUkFOU0lUSU9OX0NPTU1JVCxcbiAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1VwZGF0ZVRhc2tcbiAgICAgICAgKTtcbiAgICAgICAgcGVuZGluZ0VmZmVjdHNTdGF0dXMgPSBQRU5ESU5HX0FGVEVSX01VVEFUSU9OX1BIQVNFO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBmbHVzaFNwYXduZWRXb3JrKCkge1xuICAgICAgaWYgKFxuICAgICAgICBwZW5kaW5nRWZmZWN0c1N0YXR1cyA9PT0gUEVORElOR19TUEFXTkVEX1dPUksgfHxcbiAgICAgICAgcGVuZGluZ0VmZmVjdHNTdGF0dXMgPT09IFBFTkRJTkdfQUZURVJfTVVUQVRJT05fUEhBU0VcbiAgICAgICkge1xuICAgICAgICBpZiAocGVuZGluZ0VmZmVjdHNTdGF0dXMgPT09IFBFTkRJTkdfU1BBV05FRF9XT1JLKSB7XG4gICAgICAgICAgdmFyIHN0YXJ0Vmlld1RyYW5zaXRpb25TdGFydFRpbWUgPSBjb21taXRFbmRUaW1lO1xuICAgICAgICAgIGNvbW1pdEVuZFRpbWUgPSBub3coKTtcbiAgICAgICAgICB2Y
15852XIgZW5kVGltZSA9IGNvbW1pdEVuZFRpbWUsXG4gICAgICAgICAgICBhYm9ydGVkVmlld1RyYW5zaXRpb24gPVxuICAgICAgICAgICAgICBwZW5kaW5nRGVsYXllZENvbW1pdFJlYXNvbiA9PT0gQUJPUlRFRF9WSUVXX1RSQU5TSVRJT05fQ09NTUlUO1xuICAgICAgICAgICFzdXBwb3J0c1VzZXJUaW1pbmcgfHxcbiAgICAgICAgICAgIGVuZFRpbWUgPD0gc3RhcnRWaWV3VHJhbnNpdGlvblN0YXJ0VGltZSB8fFxuICAgICAgICAgICAgKGFuaW1hdGluZ1Rhc2tcbiAgICAgICAgICAgICAgPyBhbmltYXRpbmdUYXNrLnJ1bihcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUudGltZVN0YW1wLmJpbmQoXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUsXG4gICAgICAgICAgICAgICAgICAgIGFib3J0ZWRWaWV3VHJhbnNpdGlvblxuICAgICAgICAgICAgICAgICAgICAgID8gXCJJbnRlcnJ1cHRlZCBWaWV3IFRyYW5zaXRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgIDogXCJTdGFydGluZyBBbmltYXRpb25cIixcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRWaWV3VHJhbnNpdGlvblN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICAgICAgZW5kVGltZSxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRyYWNrLFxuICAgICAgICAgICAgICAgICAgICBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICAgICAgICAgICAgYWJvcnRlZFZpZXdUcmFuc2l0aW9uID8gXCJlcnJvclwiIDogXCJzZWNvbmRhcnktbGlnaHRcIlxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBjb25zb2xlLnRpbWVTdGFtcChcbiAgICAgICAgICAgICAgICAgIGFib3J0ZWRWaWV3VHJhbnNpdGlvblxuICAgICAgICAgICAgICAgICAgICA/IFwiSW50ZXJydXB0ZWQgVmlldyBUcmFuc2l0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgOiBcIlN0YXJ0aW5nIEFuaW1hdGlvblwiLFxuICAgICAgICAgICAgICAgICAgc3RhcnRWaWV3VHJhbnNpdGlvblN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICAgIGVuZFRpbWUsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50VHJhY2ssXG4gICAgICAgICAgICAgICAgICBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICAgICAgICAgIGFib3J0ZWRWaWV3VHJhbnNpdGlvbiA/IFwiIGVycm9yXCIgOiBcInNlY29uZGFyeS1saWdodFwiXG4gICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgcGVuZGluZ0RlbGF5ZWRDb21taXRSZWFzb24gIT09IEFCT1JURURfVklFV19UUkFOU0lUSU9OX0NPTU1JVCAmJlxuICAgICAgICAgICAgKHBlbmRpbmdEZWxheWVkQ29tbWl0UmVhc29uID0gQU5JTUFUSU9OX1NUQVJURURfQ09NTUlUKTtcbiAgICAgICAgfVxuICAgICAgICBwZW5kaW5nRWZmZWN0c1N0YXR1cyA9IE5PX1BFTkRJTkdfRUZGRUNUUztcbiAgICAgICAgc3RhcnRWaWV3VHJhbnNpdGlvblN0YXJ0VGltZSA9IHBlbmRpbmdWaWV3VHJhbnNpdGlvbjtcbiAgICAgICAgcGVuZGluZ1ZpZXdUcmFuc2l0aW9uID0gbnVsbDtcbiAgICAgICAgcmVxdWVzdFBhaW50KCk7XG4gICAgICAgIGVuZFRpbWUgPSBwZW5kaW5nRWZmZWN0c1Jvb3Q7XG4gICAgICAgIHZhciBmaW5pc2hlZFdvcmsgPSBwZW5kaW5nRmluaXNoZWRXb3JrO1xuICAgICAgICBhYm9ydGVkVmlld1RyYW5zaXRpb24gPSBwZW5kaW5nRWZmZWN0c0xhbmVzO1xuICAgICAgICB2Y
15852XIgcmVjb3ZlcmFibGVFcnJvcnMgPSBwZW5kaW5nUmVjb3ZlcmFibGVFcnJvcnMsXG4gICAgICAgICAgcGFzc2l2ZVN1YnRyZWVNYXNrID1cbiAgICAgICAgICAgIChhYm9ydGVkVmlld1RyYW5zaXRpb24gJiAzMzU1NDQwNjQpID09PSBhYm9ydGVkVmlld1RyYW5zaXRpb25cbiAgICAgICAgICAgICAgPyAxMDI2MlxuICAgICAgICAgICAgICA6IDEwMjU2O1xuICAgICAgICAocGFzc2l2ZVN1YnRyZWVNYXNrID1cbiAgICAgICAgICAwICE9PSBmaW5pc2hlZFdvcmsuYWN0dWFsRHVyYXRpb24gfHxcbiAgICAgICAgICAwICE9PSAoZmluaXNoZWRXb3JrLnN1YnRyZWVGbGFncyAmIHBhc3NpdmVTdWJ0cmVlTWFzaykgfHxcbiAgICAgICAgICAwICE9PSAoZmluaXNoZWRXb3JrLmZsYWdzICYgcGFzc2l2ZVN1YnRyZWVNYXNrKSlcbiAgICAgICAgICA/IChwZW5kaW5nRWZmZWN0c1N0YXR1cyA9IFBFTkRJTkdfUEFTU0lWRV9QSEFTRSlcbiAgICAgICAgICA6ICgocGVuZGluZ0VmZmVjdHNTdGF0dXMgPSBOT19QRU5ESU5HX0VGRkVDVFMpLFxuICAgICAgICAgICAgKHBlbmRpbmdGaW5pc2hlZFdvcmsgPSBwZW5kaW5nRWZmZWN0c1Jvb3QgPSBudWxsKSxcbiAgICAgICAgICAgIHJlbGVhc2VSb290UG9vbGVkQ2FjaGUoZW5kVGltZSwgZW5kVGltZS5wZW5kaW5nTGFuZXMpLFxuICAgICAgICAgICAgKG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA9IDApLFxuICAgICAgICAgICAgKHJvb3RXaXRoUGFzc2l2ZU5lc3RlZFVwZGF0ZXMgPSBudWxsKSk7XG4gICAgICAgIHZhciByZW1haW5pbmdMYW5lcyA9IGVuZFRpbWUucGVuZGluZ0xhbmVzO1xuICAgICAgICAwID09PSByZW1haW5pbmdMYW5lcyAmJiAobGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgPSBudWxsKTtcbiAgICAgICAgcGFzc2l2ZVN1YnRyZWVNYXNrIHx8IGNvbW1pdERvdWJsZUludm9rZUVmZmVjdHNJbkRFVihlbmRUaW1lKTtcbiAgICAgICAgcmVtYWluaW5nTGFuZXMgPSBsYW5lc1RvRXZlbnRQcmlvcml0eShhYm9ydGVkVmlld1RyYW5zaXRpb24pO1xuICAgICAgICBmaW5pc2hlZFdvcmsgPSBmaW5pc2hlZFdvcmsuc3RhdGVOb2RlO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaW5qZWN0ZWRIb29rICYmXG4gICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uQ29tbWl0RmliZXJSb290XG4gICAgICAgIClcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGRpZEVycm9yID0gMTI4ID09PSAoZmluaXNoZWRXb3JrLmN1cnJlbnQuZmxhZ3MgJiAxMjgpO1xuICAgICAgICAgICAgc3dpdGNoIChyZW1haW5pbmdMYW5lcykge1xuICAgICAgICAgICAgICBjYXNlIERpc2NyZXRlRXZlbnRQcmlvcml0eTpcbiAgICAgICAgICAgICAgICB2Y
15852XIgc2NoZWR1bGVyUHJpb3JpdHkgPSBJbW1lZGlhdGVQcmlvcml0eTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBDb250aW51b3VzRXZlbnRQcmlvcml0eTpcbiAgICAgICAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IFVzZXJCbG9ja2luZ1ByaW9yaXR5O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIERlZmF1bHRFdmVudFByaW9yaXR5OlxuICAgICAgICAgICAgICAgIHNjaGVkdWxlclByaW9yaXR5ID0gTm9ybWFsUHJpb3JpdHkkMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBJZGxlRXZlbnRQcmlvcml0eTpcbiAgICAgICAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IElkbGVQcmlvcml0eTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IE5vcm1hbFByaW9yaXR5JDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbmplY3RlZEhvb2sub25Db21taXRGaWJlclJvb3QoXG4gICAgICAgICAgICAgIHJlbmRlcmVySUQsXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29yayxcbiAgICAgICAgICAgICAgc2NoZWR1bGVyUHJpb3JpdHksXG4gICAgICAgICAgICAgIGRpZEVycm9yXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgfHxcbiAgICAgICAgICAgICAgKChoYXNMb2dnZWRFcnJvciA9ICEwKSxcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBcIlJlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJW9cIixcbiAgICAgICAgICAgICAgICBlcnJcbiAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgfVxuICAgICAgICBpc0RldlRvb2xzUHJlc2VudCAmJiBlbmRUaW1lLm1lbW9pemVkVXBkYXRlcnMuY2xlYXIoKTtcbiAgICAgICAgb25Db21taXRSb290KCk7XG4gICAgICAgIGlmIChudWxsICE9PSByZWNvdmVyYWJsZUVycm9ycykge1xuICAgICAgICAgIGRpZEVycm9yID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuVDtcbiAgICAgICAgICBzY2hlZHVsZXJQcmlvcml0eSA9IFJlYWN0RE9NU2hhcmVkSW50ZXJuYWxzLnA7XG4gICAgICAgICAgUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucCA9IERpc2NyZXRlRXZlbnRQcmlvcml0eTtcbiAgICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5UID0gbnVsbDtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIG9uUmVjb3ZlcmFibGVFcnJvciA9IGVuZFRpbWUub25SZWNvdmVyYWJsZUVycm9yO1xuICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrID0gMDtcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrIDwgcmVjb3ZlcmFibGVFcnJvcnMubGVuZ3RoO1xuICAgICAgICAgICAgICBmaW5pc2hlZFdvcmsrK1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHZhciByZWNvdmVyYWJsZUVycm9yID0gcmVjb3ZlcmFibGVFcnJvcnNbZmluaXNoZWRXb3JrXSxcbiAgICAgICAgICAgICAgICBlcnJvckluZm8gPSBtYWtlRXJyb3JJbmZvKHJlY292ZXJhYmxlRXJyb3Iuc3RhY2spO1xuICAgICAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgICAgICByZWNvdmVyYWJsZUVycm9yLnNvdXJjZSxcbiAgICAgICAgICAgICAgICBvblJlY292ZXJhYmxlRXJyb3IsXG4gICAgICAgICAgICAgICAgcmVjb3ZlcmFibGVFcnJvci52YWx1ZSxcbiAgICAgICAgICAgICAgICBlcnJvckluZm9cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgKFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQgPSBkaWRFcnJvciksXG4gICAgICAgICAgICAgIChSZWFjdERPTVNoYXJlZEludGVybmFscy5wID0gc2NoZWR1bGVyUHJpb3JpdHkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvblJlY292ZXJhYmxlRXJyb3IgPSBwZW5kaW5nVmlld1RyYW5zaXRpb25FdmVudHM7XG4gICAgICAgIHJlY292ZXJhYmxlRXJyb3IgPSBwZW5kaW5nVHJhbnNpdGlvblR5cGVzO1xuICAgICAgICBwZW5kaW5nVHJhbnNpdGlvblR5cGVzID0gbnVsbDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG51bGwgIT09IG9uUmVjb3ZlcmFibGVFcnJvciAmJlxuICAgICAgICAgICgocGVuZGluZ1ZpZXdUcmFuc2l0aW9uRXZlbnRzID0gbnVsbCksXG4gICAgICAgICAgbnVsbCA9PT0gcmVjb3ZlcmFibGVFcnJvciAmJiAocmVjb3ZlcmFibGVFcnJvciA9IFtdKSxcbiAgICAgICAgICBudWxsICE9PSBzdGFydFZpZXdUcmFuc2l0aW9uU3RhcnRUaW1lKVxuICAgICAgICApXG4gICAgICAgICAgZm9yIChcbiAgICAgICAgICAgIGVycm9ySW5mbyA9IDA7XG4gICAgICAgICAgICBlcnJvckluZm8gPCBvblJlY292ZXJhYmxlRXJyb3IubGVuZ3RoO1xuICAgICAgICAgICAgZXJyb3JJbmZvKytcbiAgICAgICAgICApXG4gICAgICAgICAgICAocmVjb3ZlcmFibGVFcnJvcnMgPSAoMCwgb25SZWNvdmVyYWJsZUVycm9yW2Vycm9ySW5mb10pKFxuICAgICAgICAgICAgICByZWNvdmVyYWJsZUVycm9yXG4gICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgdm9pZCAwICE9PSByZWNvdmVyYWJsZUVycm9ycyAmJlxuICAgICAgICAgICAgICAgIHN0YXJ0Vmlld1RyYW5zaXRpb25TdGFydFRpbWUuZmluaXNoZWQuZmluYWxseShcbiAgICAgICAgICAgICAgICAgIHJlY292ZXJhYmxlRXJyb3JzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgMCAhPT0gKHBlbmRpbmdFZmZlY3RzTGFuZXMgJiAzKSAmJiBmbHVzaFBlbmRpbmdFZmZlY3RzKCk7XG4gICAgICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChlbmRUaW1lKTtcbiAgICAgICAgcmVtYWluaW5nTGFuZXMgPSBlbmRUaW1lLnBlbmRpbmdMYW5lcztcbiAgICAgICAgMCAhPT0gKGFib3J0ZWRWaWV3VHJhbnNpdGlvbiAmIDI2MTkzMCkgJiYgMCAhPT0gKHJlbWFpbmluZ0xhbmVzICYgNDIpXG4gICAgICAgICAgPyAoKG5lc3RlZFVwZGF0ZVNjaG
15852VkdWxlZCA9ICEwKSxcbiAgICAgICAgICAgIGVuZFRpbWUgPT09IHJvb3RXaXRoTmVzdGVkVXBkYXRlc1xuICAgICAgICAgICAgICA/IG5lc3RlZFVwZGF0ZUNvdW50KytcbiAgICAgICAgICAgICAgOiAoKG5lc3RlZFVwZGF0ZUNvdW50ID0gMCksIChyb290V2l0aE5lc3RlZFVwZGF0ZXMgPSBlbmRUaW1lKSkpXG4gICAgICAgICAgOiAoKG5lc3RlZFVwZGF0ZUNvdW50ID0gMCksIChyb290V2l0aE5lc3RlZFVwZGF0ZXMgPSBudWxsKSk7XG4gICAgICAgIHBhc3NpdmVTdWJ0cmVlTWFzayB8fFxuICAgICAgICAgIGZpbmFsaXplUmVuZGVyKGFib3J0ZWRWaWV3VHJhbnNpdGlvbiwgY29tbWl0RW5kVGltZSk7XG4gICAgICAgIGZsdXNoU3luY1dvcmtBY3Jvc3NSb290c19pbXBsKDAsICExKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbWFrZUVycm9ySW5mbyhjb21wb25lbnRTdGFjaykge1xuICAgICAgY29tcG9uZW50U3RhY2sgPSB7IGNvbXBvbmVudFN0YWNrOiBjb21wb25lbnRTdGFjayB9O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbXBvbmVudFN0YWNrLCBcImRpZ2VzdFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAnWW91IGFyZSBhY2Nlc3NpbmcgXCJkaWdlc3RcIiBmcm9tIHRoZSBlcnJvckluZm8gb2JqZWN0IHBhc3NlZCB0byBvblJlY292ZXJhYmxlRXJyb3IuIFRoaXMgcHJvcGVydHkgaXMgbm8gbG9uZ2VyIHByb3ZpZGVkIGFzIHBhcnQgb2YgZXJyb3JJbmZvIGJ1dCBjYW4gYmUgYWNjZXNzZWQgYXMgYSBwcm9wZXJ0eSBvZiB0aGUgRXJyb3IgaW5zdGFuY2UgaXRzZWxmLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjb21wb25lbnRTdGFjaztcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVsZWFzZVJvb3RQb29sZWRDYWNoZShyb290LCByZW1haW5pbmdMYW5lcykge1xuICAgICAgMCA9PT0gKHJvb3QucG9vbGVkQ2FjaGVMYW5lcyAmPSByZW1haW5pbmdMYW5lcykgJiZcbiAgICAgICAgKChyZW1haW5pbmdMYW5lcyA9IHJvb3QucG9vbGVkQ2FjaGUpLFxuICAgICAgICBudWxsICE9IHJlbWFpbmluZ0xhbmVzICYmXG4gICAgICAgICAgKChyb290LnBvb2xlZENhY2hlID0gbnVsbCksIHJlbGVhc2VDYWNoZShyZW1haW5pbmdMYW5lcykpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZmx1c2hQZW5kaW5nRWZmZWN0cygpIHtcbiAgICAgIG51bGwgIT09IHBlbmRpbmdWaWV3VHJhbnNpdGlvbiAmJlxuICAgICAgICAocGVuZGluZ1ZpZXdUcmFuc2l0aW9uLnNraXBUcmFuc2l0aW9uKCksXG4gICAgICAgIGRpZFdhcm5BYm91dEludGVycnVwdGVkVmlld1RyYW5zaXRpb25zIHx8XG4gICAgICAgICAgKChkaWRXYXJuQWJvdXRJbnRlcnJ1cHRlZFZpZXdUcmFuc2l0aW9ucyA9ICEwKSxcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBcIkEgZmx1c2hTeW5jIHVwZGF0ZSBjYW5jZWxsZWQgYSBWaWV3IFRyYW5zaXRpb24gYmVjYXVzZSBpdCB3YXMgY2FsbGVkIHdoaWxlIHRoZSBWaWV3IFRyYW5zaXRpb24gd2FzIHN0aWxsIHByZXBhcmluZy4gVG8gcHJlc2VydmUgdGhlIHN5bmNocm9ub3VzIHNlbWFudGljcywgUmVhY3QgaGFkIHRvIHNraXAgdGhlIFZpZXcgVHJhbnNpdGlvbi4gSWYgeW91IGNhbiwgdHJ5IHRvIGF2b2lkIGZsdXNoU3luYygpIGluIGEgc2NlbmFyaW8gdGhhdCdzIGxpa2VseSB0byBpbnRlcmZlcmUuXCJcbiAgICAgICAgICApKSxcbiAgICAgICAgKHBlbmRpbmdWaWV3VHJhbnNpdGlvbiA9IG51bGwpLFxuICAgICAgICAocGVuZGluZ0RlbGF5ZWRDb21taXRSZWFzb24gPSBBQk9SVEVEX1ZJRVdfVFJBTlNJVElPTl9DT01NSVQpKTtcbiAgICAgIGZsdXNoTXV0YXRpb25FZmZlY3RzKCk7XG4gICAgICBmbHVzaExheW91dEVmZmVjdHMoKTtcbiAgICAgIGZsdXNoU3Bhd25lZFdvcmsoKTtcbiAgICAgIHJldHVybiBmbHVzaFBhc3NpdmVFZmZlY3RzKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZsdXNoUGFzc2l2ZUVmZmVjdHMoKSB7XG4gICAgICBpZiAocGVuZGluZ0VmZmVjdHNTdGF0dXMgIT09IFBFTkRJTkdfUEFTU0lWRV9QSEFTRSkgcmV0dXJuICExO1xuICAgICAgdmFyIHJvb3QgPSBwZW5kaW5nRWZmZWN0c1Jvb3QsXG4gICAgICAgIHJlbWFpbmluZ0xhbmVzID0gcGVuZGluZ0VmZmVjdHNSZW1haW5pbmdMYW5lcztcbiAgICAgIHBlbmRpbmdFZmZlY3RzUmVtYWluaW5nTGFuZXMgPSAwO1xuICAgICAgdmFyIHJlbmRlclByaW9yaXR5ID0gbGFuZXNUb0V2ZW50UHJpb3JpdHkocGVuZGluZ0VmZmVjdHNMYW5lcyksXG4gICAgICAgIHByaW9yaXR5ID1cbiAgICAgICAgICAwID09PSBEZWZhdWx0RXZlbnRQcmlvcml0eSB8fCBEZWZhdWx0RXZlbnRQcmlvcml0eSA+IHJlbmRlclByaW9yaXR5XG4gICAgICAgICAgICA/IERlZmF1bHRFdmVudFByaW9yaXR5XG4gICAgICAgICAgICA6IHJlbmRlclByaW9yaXR5O1xuICAgICAgcmVuZGVyUHJpb3JpdHkgPSBSZWFjdFNoYXJlZEludGVybmFscy5UO1xuICAgICAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBSZWFjdERPTVNoYXJlZEludGVybmFscy5wO1xuICAgICAgdHJ5IHtcbiAgICAgICAgUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucCA9IHByaW9yaXR5O1xuICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5UID0gbnVsbDtcbiAgICAgICAgdmFyIHRyYW5zaXRpb25zID0gcGVuZGluZ1Bhc3NpdmVUcmFuc2l0aW9ucztcbiAgICAgICAgcGVuZGluZ1Bhc3NpdmVUcmFuc2l0aW9ucyA9IG51bGw7XG4gICAgICAgIHByaW9yaXR5ID0gcGVuZGluZ0VmZmVjdHNSb290O1xuICAgICAgICB2Y
15852XIgbGFuZXMgPSBwZW5kaW5nRWZmZWN0c0xhbmVzO1xuICAgICAgICBwZW5kaW5nRWZmZWN0c1N0YXR1cyA9IE5PX1BFTkRJTkdfRUZGRUNUUztcbiAgICAgICAgcGVuZGluZ0ZpbmlzaGVkV29yayA9IHBlbmRpbmdFZmZlY3RzUm9vdCA9IG51bGw7XG4gICAgICAgIHBlbmRpbmdFZmZlY3RzTGFuZXMgPSAwO1xuICAgICAgICBpZiAoKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0KVxuICAgICAgICAgIHRocm93IEVycm9yKFwiQ2Fubm90IGZsdXNoIHBhc3NpdmUgZWZmZWN0cyB3aGlsZSBhbHJlYWR5IHJlbmRlcmluZy5cIik7XG4gICAgICAgIHNldEN1cnJlbnRUcmFja0Zyb21MYW5lcyhsYW5lcyk7XG4gICAgICAgIGlzRmx1c2hpbmdQYXNzaXZlRWZmZWN0cyA9ICEwO1xuICAgICAgICBkaWRTY2hlZHVsZVVwZGF0ZUR1cmluZ1Bhc3NpdmVFZmZlY3RzID0gITE7XG4gICAgICAgIHZhciBwYXNzaXZlRWZmZWN0U3RhcnRUaW1lID0gMDtcbiAgICAgICAgY29tbWl0RXJyb3JzID0gbnVsbDtcbiAgICAgICAgcGFzc2l2ZUVmZmVjdFN0YXJ0VGltZSA9IG5vdyQxKCk7XG4gICAgICAgIGlmIChwZW5kaW5nRGVsYXllZENvbW1pdFJlYXNvbiA9PT0gQU5JTUFUSU9OX1NUQVJURURfQ09NTUlUKVxuICAgICAgICAgIGxvZ0FuaW1hdGluZ1BoYXNlKFxuICAgICAgICAgICAgY29tbWl0RW5kVGltZSxcbiAgICAgICAgICAgIHBhc3NpdmVFZmZlY3RTdGFydFRpbWUsXG4gICAgICAgICAgICBhbmltYXRpbmdUYXNrXG4gICAgICAgICAgKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdmFyIHN0YXJ0VGltZSA9IGNvbW1pdEVuZFRpbWUsXG4gICAgICAgICAgICBlbmRUaW1lID0gcGFzc2l2ZUVmZmVjdFN0YXJ0VGltZSxcbiAgICAgICAgICAgIGRlbGF5ZWRVbnRpbFBhaW50ID1cbiAgICAgICAgICAgICAgcGVuZGluZ0RlbGF5ZWRDb21taXRSZWFzb24gPT09IERFTEFZRURfUEFTU0lWRV9DT01NSVQ7XG4gICAgICAgICAgIXN1cHBvcnRzVXNlclRpbWluZyB8fFxuICAgICAgICAgICAgZW5kVGltZSA8PSBzdGFydFRpbWUgfHxcbiAgICAgICAgICAgICh3b3JrSW5Qcm9ncmVzc1VwZGF0ZVRhc2tcbiAgICAgICAgICAgICAgPyB3b3JrSW5Qcm9ncmVzc1VwZGF0ZVRhc2sucnVuKFxuICAgICAgICAgICAgICAgICAgY29uc29sZS50aW1lU3RhbXAuYmluZChcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZSxcbiAgICAgICAgICAgICAgICAgICAgZGVsYXllZFVudGlsUGFpbnQgPyBcIldhaXRpbmcgZm9yIFBhaW50XCIgOiBcIldhaXRpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgICAgICBlbmRUaW1lLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VHJhY2ssXG4gICAgICAgICAgICAgICAgICAgIExBTkVTX1RSQUNLX0dST1VQLFxuICAgICAgICAgICAgICAgICAgICBcInNlY29uZGFyeS1saWdodFwiXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICA6IGNvbnNvbGUudGltZVN0YW1wKFxuICAgICAgICAgICAgICAgICAgZGVsYXllZFVudGlsUGFpbnQgPyBcIldhaXRpbmcgZm9yIFBhaW50XCIgOiBcIldhaXRpbmdcIixcbiAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgICAgICAgICAgIGVuZFRpbWUsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50VHJhY2ssXG4gICAgICAgICAgICAgICAgICBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICAgICAgICAgIFwic2Vjb25kYXJ5LWxpZ2h0XCJcbiAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgfVxuICAgICAgICBzdGFydFRpbWUgPSBleGVjdXRpb25Db250ZXh0O1xuICAgICAgICBleGVjdXRpb25Db250ZXh0IHw9IENvbW1pdENvbnRleHQ7XG4gICAgICAgIHZhciBmaW5pc2hlZFdvcmsgPSBwcmlvcml0eS5jdXJyZW50O1xuICAgICAgICByZXNldENvbXBvbmVudEVmZmVjdFRpbWVycygpO1xuICAgICAgICBjb21taXRQYXNzaXZlVW5tb3VudE9uRmliZXIoZmluaXNoZWRXb3JrKTtcbiAgICAgICAgdmFyIGZpbmlzaGVkV29yayRqc2NvbXAkMCA9IHByaW9yaXR5LmN1cnJlbnQ7XG4gICAgICAgIGZpbmlzaGVkV29yayA9IHBlbmRpbmdFZmZlY3RzUmVuZGVyRW5kVGltZTtcbiAgICAgICAgcmVzZXRDb21wb25lbnRFZmZlY3RUaW1lcnMoKTtcbiAgICAgICAgY29tbWl0UGFzc2l2ZU1vdW50T25GaWJlcihcbiAgICAgICAgICBwcmlvcml0eSxcbiAgICAgICAgICBmaW5pc2hlZFdvcmskanNjb21wJDAsXG4gICAgICAgICAgbGFuZXMsXG4gICAgICAgICAgdHJhbnNpdGlvbnMsXG4gICAgICAgICAgZmluaXNoZWRXb3JrXG4gICAgICAgICk7XG4gICAgICAgIGNvbW1pdERvdWJsZUludm9rZUVmZmVjdHNJbkRFVihwcmlvcml0eSk7XG4gICAgICAgIGV4ZWN1dGlvbkNvbnRleHQgPSBzdGFydFRpbWU7XG4gICAgICAgIHZhciBwYXNzaXZlRWZmZWN0c0VuZFRpbWUgPSBub3ckMSgpO1xuICAgICAgICBmaW5pc2hlZFdvcmskanNjb21wJDAgPSBwYXNzaXZlRWZmZWN0U3RhcnRUaW1lO1xuICAgICAgICBmaW5pc2hlZFdvcmsgPSB3b3JrSW5Qcm9ncmVzc1VwZGF0ZVRhc2s7XG4gICAgICAgIG51bGwgIT09IGNvbW1pdEVycm9yc1xuICAgICAgICAgID8gbG9nQ29tbWl0RXJyb3JlZChcbiAgICAgICAgICAgICAgZmluaXNoZWRXb3JrJGpzY29tcCQwLFxuICAgICAgICAgICAgICBwYXNzaXZlRWZmZWN0c0VuZFRpbWUsXG4gICAgICAgICAgICAgIGNvbW1pdEVycm9ycyxcbiAgICAgICAgICAgICAgITAsXG4gICAgICAgICAgICAgIGZpbmlzaGVkV29ya1xuICAgICAgICAgICAgKVxuICAgICAgICAgIDogIXN1cHBvcnRzVXNlclRpbWluZyB8fFxuICAgICAgICAgICAgcGFzc2l2ZUVmZmVjdHNFbmRUaW1lIDw9IGZpbmlzaGVkV29yayRqc2NvbXAkMCB8fFxuICAgICAgICAgICAgKGZpbmlzaGVkV29ya1xuICAgICAgICAgICAgICA/IGZpbmlzaGVkV29yay5ydW4oXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLnRpbWVTdGFtcC5iaW5kKFxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLF
15852xuICAgICAgICAgICAgICAgICAgICBcIlJlbWFpbmluZyBFZmZlY3RzXCIsXG4gICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkV29yayRqc2NvbXAkMCxcbiAgICAgICAgICAgICAgICAgICAgcGFzc2l2ZUVmZmVjdHNFbmRUaW1lLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50VHJhY2ssXG4gICAgICAgICAgICAgICAgICAgIExBTkVTX1RSQUNLX0dST1VQLFxuICAgICAgICAgICAgICAgICAgICBcInNlY29uZGFyeS1kYXJrXCJcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDogY29uc29sZS50aW1lU3RhbXAoXG4gICAgICAgICAgICAgICAgICBcIlJlbWFpbmluZyBFZmZlY3RzXCIsXG4gICAgICAgICAgICAgICAgICBmaW5pc2hlZFdvcmskanNjb21wJDAsXG4gICAgICAgICAgICAgICAgICBwYXNzaXZlRWZmZWN0c0VuZFRpbWUsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50VHJhY2ssXG4gICAgICAgICAgICAgICAgICBMQU5FU19UUkFDS19HUk9VUCxcbiAgICAgICAgICAgICAgICAgIFwic2Vjb25kYXJ5LWRhcmtcIlxuICAgICAgICAgICAgICAgICkpO1xuICAgICAgICBmaW5hbGl6ZVJlbmRlcihsYW5lcywgcGFzc2l2ZUVmZmVjdHNFbmRUaW1lKTtcbiAgICAgICAgZmx1c2hTeW5jV29ya0Fjcm9zc1Jvb3RzX2ltcGwoMCwgITEpO1xuICAgICAgICBkaWRTY2hlZHVsZVVwZGF0ZUR1cmluZ1Bhc3NpdmVFZmZlY3RzXG4gICAgICAgICAgPyBwcmlvcml0eSA9PT0gcm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlc1xuICAgICAgICAgICAgPyBuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQrK1xuICAgICAgICAgICAgOiAoKG5lc3RlZFBhc3NpdmVVcGRhdGVDb3VudCA9IDApLFxuICAgICAgICAgICAgICAocm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlcyA9IHByaW9yaXR5KSlcbiAgICAgICAgICA6IChuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQgPSAwKTtcbiAgICAgICAgZGlkU2NoZWR1bGVVcGRhdGVEdXJpbmdQYXNzaXZlRWZmZWN0cyA9IGlzRmx1c2hpbmdQYXNzaXZlRWZmZWN0cyA9ICExO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaW5qZWN0ZWRIb29rICYmXG4gICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgaW5qZWN0ZWRIb29rLm9uUG9zdENvbW1pdEZpYmVyUm9vdFxuICAgICAgICApXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGluamVjdGVkSG9vay5vblBvc3RDb21taXRGaWJlclJvb3QocmVuZGVyZXJJRCwgcHJpb3JpdHkpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaGFzTG9nZ2VkRXJyb3IgfHxcbiAgICAgICAgICAgICAgKChoYXNMb2dnZWRFcnJvciA9ICEwKSxcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBcIlJlYWN0IGluc3RydW1lbnRhdGlvbiBlbmNvdW50ZXJlZCBhbiBlcnJvcjogJW9cIixcbiAgICAgICAgICAgICAgICBlcnJcbiAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgfVxuICAgICAgICB2Y
15852XIgc3RhdGVOb2RlID0gcHJpb3JpdHkuY3VycmVudC5zdGF0ZU5vZGU7XG4gICAgICAgIHN0YXRlTm9kZS5lZmZlY3REdXJhdGlvbiA9IDA7XG4gICAgICAgIHN0YXRlTm9kZS5wYXNzaXZlRWZmZWN0RHVyYXRpb24gPSAwO1xuICAgICAgICByZXR1cm4gITA7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAoUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucCA9IHByZXZpb3VzUHJpb3JpdHkpLFxuICAgICAgICAgIChSZWFjdFNoYXJlZEludGVybmFscy5UID0gcmVuZGVyUHJpb3JpdHkpLFxuICAgICAgICAgIHJlbGVhc2VSb290UG9vbGVkQ2FjaGUocm9vdCwgcmVtYWluaW5nTGFuZXMpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvck9uUm9vdChyb290RmliZXIsIHNvdXJjZUZpYmVyLCBlcnJvcikge1xuICAgICAgc291cmNlRmliZXIgPSBjcmVhdGVDYXB0dXJlZFZhbHVlQXRGaWJlcihlcnJvciwgc291cmNlRmliZXIpO1xuICAgICAgcmVjb3JkRWZmZWN0RXJyb3Ioc291cmNlRmliZXIpO1xuICAgICAgc291cmNlRmliZXIgPSBjcmVhdGVSb290RXJyb3JVcGRhdGUocm9vdEZpYmVyLnN0YXRlTm9kZSwgc291cmNlRmliZXIsIDIpO1xuICAgICAgcm9vdEZpYmVyID0gZW5xdWV1ZVVwZGF0ZShyb290RmliZXIsIHNvdXJjZUZpYmVyLCAyKTtcbiAgICAgIG51bGwgIT09IHJvb3RGaWJlciAmJlxuICAgICAgICAobWFya1Jvb3RVcGRhdGVkJDEocm9vdEZpYmVyLCAyKSwgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3RGaWJlcikpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihcbiAgICAgIHNvdXJjZUZpYmVyLFxuICAgICAgbmVhcmVzdE1vdW50ZWRBbmNlc3RvcixcbiAgICAgIGVycm9yXG4gICAgKSB7XG4gICAgICBpc1J1bm5pbmdJbnNlcnRpb25FZmZlY3QgPSAhMTtcbiAgICAgIGlmICgzID09PSBzb3VyY2VGaWJlci50YWcpXG4gICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yT25Sb290KHNvdXJjZUZpYmVyLCBzb3VyY2VGaWJlciwgZXJyb3IpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGZvciAoOyBudWxsICE9PSBuZWFyZXN0TW91bnRlZEFuY2VzdG9yOyApIHtcbiAgICAgICAgICBpZiAoMyA9PT0gbmVhcmVzdE1vdW50ZWRBbmNlc3Rvci50YWcpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yT25Sb290KFxuICAgICAgICAgICAgICBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLFxuICAgICAgICAgICAgICBzb3VyY2VGaWJlcixcbiAgICAgICAgICAgICAgZXJyb3JcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICgxID09PSBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLnRhZykge1xuICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gbmVhcmVzdE1vdW50ZWRBbmNlc3Rvci5zdGF0ZU5vZGU7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT1cbiAgICAgICAgICAgICAgICB0eXBlb2YgbmVhcmVzdE1vdW50ZWRBbmNlc3Rvci50eXBlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciB8fFxuICAgICAgICAgICAgICAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50RGlkQ2F0Y2ggJiZcbiAgICAgICAgICAgICAgICAobnVsbCA9PT0gbGVnYWN5RXJyb3JCb3VuZGFyaWVzVGhhdEFscmVhZHlGYWlsZWQgfHxcbiAgICAgICAgICAgICAgICAgICFsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZC5oYXMoaW5zdGFuY2UpKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBzb3VyY2VGaWJlciA9IGNyZWF0ZUNhcHR1cmVkVmFsdWVBdEZpYmVyKGVycm9yLCBzb3VyY2VGaWJlcik7XG4gICAgICAgICAgICAgIHJlY29yZEVmZmVjdEVycm9yKHNvdXJjZUZpYmVyKTtcbiAgICAgICAgICAgICAgZXJyb3IgPSBjcmVhdGVDbGFzc0Vycm9yVXBkYXRlKDIpO1xuICAgICAgICAgICAgICBpbnN0YW5jZSA9IGVucXVldWVVcGRhdGUobmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IsIDIpO1xuICAgICAgICAgICAgICBudWxsICE9PSBpbnN0YW5jZSAmJlxuICAgICAgICAgICAgICAgIChpbml0aWFsaXplQ2xhc3NFcnJvclVwZGF0ZShcbiAgICAgICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgICAgICBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLFxuICAgICAgICAgICAgICAgICAgc291cmNlRmliZXJcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIG1hcmtSb290VXBkYXRlZCQxKGluc3RhbmNlLCAyKSxcbiAgICAgICAgICAgICAgICBlbnN1cmVSb290SXNTY2hlZHVsZWQoaW5zdGFuY2UpKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBuZWFyZXN0TW91bnRlZEFuY2VzdG9yID0gbmVhcmVzdE1vdW50ZWRBbmNlc3Rvci5yZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBcIkludGVybmFsIFJlYWN0IGVycm9yOiBBdHRlbXB0ZWQgdG8gY2FwdHVyZSBhIGNvbW1pdCBwaGFzZSBlcnJvciBpbnNpZGUgYSBkZXRhY2hlZCB0cmVlLiBUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiBSZWFjdC4gUG90ZW50aWFsIGNhdXNlcyBpbmNsdWRlIGRlbGV0aW5nIHRoZSBzYW1lIGZpYmVyIG1vcmUgdGhhbiBvbmNlLCBjb21taXR0aW5nIGFuIGFscmVhZHktZmluaXNoZWQgdHJlZSwgb3IgYW4gaW5jb25zaXN0ZW50IHJldHVybiBwb2ludGVyLlxcblxcbkVycm9yIG1lc3NhZ2U6XFxuXFxuJXNcIixcbiAgICAgICAgICBlcnJvclxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBhdHRhY2hQaW5nTGlzdGVuZXIocm9vdCwgd2FrZWFibGUsIGxhbmVzKSB7XG4gICAgICB2Y
15852XIgcGluZ0NhY2hlID0gcm9vdC5waW5nQ2FjaGU7XG4gICAgICBpZiAobnVsbCA9PT0gcGluZ0NhY2hlKSB7XG4gICAgICAgIHBpbmdDYWNoZSA9IHJvb3QucGluZ0NhY2hlID0gbmV3IFBvc3NpYmx5V2Vha01hcCgpO1xuICAgICAgICB2YXIgdGhyZWFkSURzID0gbmV3IFNldCgpO1xuICAgICAgICBwaW5nQ2FjaGUuc2V0KHdha2VhYmxlLCB0aHJlYWRJRHMpO1xuICAgICAgfSBlbHNlXG4gICAgICAgICh0aHJlYWRJRHMgPSBwaW5nQ2FjaGUuZ2V0KHdha2VhYmxlKSksXG4gICAgICAgICAgdm9pZCAwID09PSB0aHJlYWRJRHMgJiZcbiAgICAgICAgICAgICgodGhyZWFkSURzID0gbmV3IFNldCgpKSwgcGluZ0NhY2hlLnNldCh3YWtlYWJsZSwgdGhyZWFkSURzKSk7XG4gICAgICB0aHJlYWRJRHMuaGFzKGxhbmVzKSB8fFxuICAgICAgICAoKHdvcmtJblByb2dyZXNzUm9vdERpZEF0dGFjaFBpbmdMaXN0ZW5lciA9ICEwKSxcbiAgICAgICAgdGhyZWFkSURzLmFkZChsYW5lcyksXG4gICAgICAgIChwaW5nQ2FjaGUgPSBwaW5nU3VzcGVuZGVkUm9vdC5iaW5kKG51bGwsIHJvb3QsIHdha2VhYmxlLCBsYW5lcykpLFxuICAgICAgICBpc0RldlRvb2xzUHJlc2VudCAmJiByZXN0b3JlUGVuZGluZ1VwZGF0ZXJzKHJvb3QsIGxhbmVzKSxcbiAgICAgICAgd2FrZWFibGUudGhlbihwaW5nQ2FjaGUsIHBpbmdDYWNoZSkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwaW5nU3VzcGVuZGVkUm9vdChyb290LCB3YWtlYWJsZSwgcGluZ2VkTGFuZXMpIHtcbiAgICAgIHZhciBwaW5nQ2FjaGUgPSByb290LnBpbmdDYWNoZTtcbiAgICAgIG51bGwgIT09IHBpbmdDYWNoZSAmJiBwaW5nQ2FjaGUuZGVsZXRlKHdha2VhYmxlKTtcbiAgICAgIHJvb3QucGluZ2VkTGFuZXMgfD0gcm9vdC5zdXNwZW5kZWRMYW5lcyAmIHBpbmdlZExhbmVzO1xuICAgICAgcm9vdC53YXJtTGFuZXMgJj0gfnBpbmdlZExhbmVzO1xuICAgICAgMCAhPT0gKHBpbmdlZExhbmVzICYgMTI3KVxuICAgICAgICA/IDAgPiBibG9ja2luZ1VwZGF0ZVRpbWUgJiZcbiAgICAgICAgICAoKGJsb2NraW5nQ2xhbXBUaW1lID0gYmxvY2tpbmdVcGRhdGVUaW1lID0gbm93KCkpLFxuICAgICAgICAgIChibG9ja2luZ1VwZGF0ZVRhc2sgPSBjcmVhdGVUYXNrKFwiUHJvbWlzZSBSZXNvbHZlZFwiKSksXG4gICAgICAgICAgKGJsb2NraW5nVXBkYXRlVHlwZSA9IFBJTkdFRF9VUERBVEUpKVxuICAgICAgICA6IDAgIT09IChwaW5nZWRMYW5lcyAmIDQxOTQwNDgpICYmXG4gICAgICAgICAgMCA+IHRyYW5zaXRpb25VcGRhdGVUaW1lICYmXG4gICAgICAgICAgKCh0cmFuc2l0aW9uQ2xhbXBUaW1lID0gdHJhbnNpdGlvblVwZGF0ZVRpbWUgPSBub3coKSksXG4gICAgICAgICAgKHRyYW5zaXRpb25VcGRhdGVUYXNrID0gY3JlYXRlVGFzayhcIlByb21pc2UgUmVzb2x2ZWRcIikpLFxuICAgICAgICAgICh0cmFuc2l0aW9uVXBkYXRlVHlwZSA9IFBJTkdFRF9VUERBVEUpKTtcbiAgICAgIGlzQ29uY3VycmVudEFjdEVudmlyb25tZW50KCkgJiZcbiAgICAgICAgbnVsbCA9PT0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuYWN0UXVldWUgJiZcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBcIkEgc3VzcGVuZGVkIHJlc291cmNlIGZpbmlzaGVkIGxvYWRpbmcgaW5zaWRlIGEgdGVzdCwgYnV0IHRoZSBldmVudCB3YXMgbm90IHdyYXBwZWQgaW4gYWN0KC4uLikuXFxuXFxuV2hlbiB0ZXN0aW5nLCBjb2RlIHRoYXQgcmVzb2x2ZXMgc3VzcGVuZGVkIGRhdGEgc2hvdWxkIGJlIHdyYXBwZWQgaW50byBhY3QoLi4uKTpcXG5cXG5hY3QoKCkgPT4ge1xcbiAgLyogZmluaXNoIGxvYWRpbmcgc3VzcGVuZGVkIGRhdGEgKi9cXG59KTtcXG4vKiBhc3NlcnQgb24gdGhlIG91dHB1dCAqL1xcblxcblRoaXMgZW5zdXJlcyB0aGF0IHlvdSdyZSB0ZXN0aW5nIHRoZSBiZWhhdmlvciB0aGUgdXNlciB3b3VsZCBzZWUgaW4gdGhlIGJyb3dzZXIuIExlYXJuIG1vcmUgYXQgaHR0cHM6Ly9yZWFjdC5kZXYvbGluay93cmFwLXRlc3RzLXdpdGgtYWN0XCJcbiAgICAgICAgKTtcbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdCA9PT0gcm9vdCAmJlxuICAgICAgICAod29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgJiBwaW5nZWRMYW5lcykgPT09IHBpbmdlZExhbmVzICYmXG4gICAgICAgICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290U3VzcGVuZGVkV2l0aERlbGF5IHx8XG4gICAgICAgICh3b3JrSW5Qcm9ncmVzc1Jvb3RFeGl0U3RhdHVzID09PSBSb290U3VzcGVuZGVkICYmXG4gICAgICAgICAgKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzICYgNjI5MTQ1NjApID09PVxuICAgICAgICAgICAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgJiZcbiAgICAgICAgICBub3ckMSgpIC0gZ2xvYmFsTW9zdFJlY2VudEZhbGxiYWNrVGltZSA8IEZBTExCQUNLX1RIUk9UVExFX01TKVxuICAgICAgICAgID8gKGV4ZWN1dGlvbkNvbnRleHQgJiBSZW5kZXJDb250ZXh0KSA9PT0gTm9Db250ZXh0XG4gICAgICAgICAgICA/IHByZXBhcmVGcmVzaFN0YWNrKHJvb3QsIDApXG4gICAgICAgICAgICA6ICh3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyB8PSBwaW5nZWRMYW5lcylcbiAgICAgICAgICA6ICh3b3JrSW5Qcm9ncmVzc1Jvb3RQaW5nZWRMYW5lcyB8PSBwaW5nZWRMYW5lcyksXG4gICAgICAgIHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmV0cnlMYW5lcyA9PT0gd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMgJiZcbiAgICAgICAgICAod29ya0luUHJvZ3Jlc3NTdXNwZW5kZWRSZXRyeUxhbmVzID0gMCkpO1xuICAgICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKHJvb3QpO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXRyeVRpbWVkT3V0Qm91bmRhcnkoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKSB7XG4gICAgICAwID09PSByZXRyeUxhbmUgJiYgKHJldHJ5TGFuZSA9IGNsYWltTmV4dFJldHJ5TGFuZSgpKTtcbiAgICAgIGJvdW5kYXJ5RmliZXIgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKTtcbiAgICAgIG51bGwgIT09IGJvdW5kYXJ5RmliZXIgJiZcbiAgICAgICAgKG1hcmtSb290VXBkYXRlZCQxKGJvdW5kYXJ5RmliZXIsIHJldHJ5TGFuZSksXG4gICAgICAgIGVuc3VyZVJvb3RJc1NjaGVkdWxlZChib3VuZGFyeUZpYmVyKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJldHJ5RGVoeWRyYXRlZFN1c3BlbnNlQm91bmRhcnkoYm91bmRhcnlGaWJlcikge1xuICAgICAgdmFyIHN1c3BlbnNlU3RhdGUgPSBib3VuZGFyeUZpYmVyLm1lbW9pemVkU3RhdGUsXG4gICAgICAgI
15852HJldHJ5TGFuZSA9IDA7XG4gICAgICBudWxsICE9PSBzdXNwZW5zZVN0YXRlICYmIChyZXRyeUxhbmUgPSBzdXNwZW5zZVN0YXRlLnJldHJ5TGFuZSk7XG4gICAgICByZXRyeVRpbWVkT3V0Qm91bmRhcnkoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVzb2x2ZVJldHJ5V2FrZWFibGUoYm91bmRhcnlGaWJlciwgd2FrZWFibGUpIHtcbiAgICAgIHZhciByZXRyeUxhbmUgPSAwO1xuICAgICAgc3dpdGNoIChib3VuZGFyeUZpYmVyLnRhZykge1xuICAgICAgICBjYXNlIDMxOlxuICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgIHZhciByZXRyeUNhY2hlID0gYm91bmRhcnlGaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgdmFyIHN1c3BlbnNlU3RhdGUgPSBib3VuZGFyeUZpYmVyLm1lbW9pemVkU3RhdGU7XG4gICAgICAgICAgbnVsbCAhPT0gc3VzcGVuc2VTdGF0ZSAmJiAocmV0cnlMYW5lID0gc3VzcGVuc2VTdGF0ZS5yZXRyeUxhbmUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE5OlxuICAgICAgICAgIHJldHJ5Q2FjaGUgPSBib3VuZGFyeUZpYmVyLnN0YXRlTm9kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyMjpcbiAgICAgICAgICByZXRyeUNhY2hlID0gYm91bmRhcnlGaWJlci5zdGF0ZU5vZGUuX3JldHJ5Q2FjaGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICBcIlBpbmdlZCB1bmtub3duIHN1c3BlbnNlIGJvdW5kYXJ5IHR5cGUuIFRoaXMgaXMgcHJvYmFibHkgYSBidWcgaW4gUmVhY3QuXCJcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgICAgbnVsbCAhPT0gcmV0cnlDYWNoZSAmJiByZXRyeUNhY2hlLmRlbGV0ZSh3YWtlYWJsZSk7XG4gICAgICByZXRyeVRpbWVkT3V0Qm91bmRhcnkoYm91bmRhcnlGaWJlciwgcmV0cnlMYW5lKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVjdXJzaXZlbHlUcmF2ZXJzZUFuZERvdWJsZUludm9rZUVmZmVjdHNJbkRFVihcbiAgICAgIHJvb3QkanNjb21wJDAsXG4gICAgICBwYXJlbnRGaWJlcixcbiAgICAgIGlzSW5TdHJpY3RNb2RlXG4gICAgKSB7XG4gICAgICBpZiAoMCAhPT0gKHBhcmVudEZpYmVyLnN1YnRyZWVGbGFncyAmIDEzNDIyNTkyMCkpXG4gICAgICAgIGZvciAocGFyZW50RmliZXIgPSBwYXJlbnRGaWJlci5jaGlsZDsgbnVsbCAhPT0gcGFyZW50RmliZXI7ICkge1xuICAgICAgICAgIHZhciByb290ID0gcm9vdCRqc2NvbXAkMCxcbiAgICAgICAgICAgIGZpYmVyID0gcGFyZW50RmliZXIsXG4gICAgICAgICAgICBpc1N0cmljdE1vZGVGaWJlciA9IGZpYmVyLnR5cGUgPT09IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG4gICAgICAgICAgaXNTdHJpY3RNb2RlRmliZXIgPSBpc0luU3RyaWN0TW9kZSB8fCBpc1N0cmljdE1vZGVGaWJlcjtcbiAgICAgICAgICAyMiAhPT0gZmliZXIudGFnXG4gICAgICAgICAgICA/IGZpYmVyLmZsYWdzICYgMTM0MjE3NzI4XG4gICAgICAgICAgICAgID8gaXNTdHJpY3RNb2RlRmliZXIgJiZcbiAgICAgICAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgICAgICAgIGZpYmVyLFxuICAgICAgICAgICAgICAgICAgZG91YmxlSW52b2tlRWZmZWN0c09uRmliZXIsXG4gICAgICAgICAgICAgICAgICByb290LFxuICAgICAgICAgICAgICAgICAgZmliZXJcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDogcmVjdXJzaXZlbHlUcmF2ZXJzZUFuZERvdWJsZUludm9rZUVmZmVjdHNJbkRFVihcbiAgICAgICAgICAgICAgICAgIHJvb3QsXG4gICAgICAgICAgICAgICAgICBmaWJlcixcbiAgICAgICAgICAgICAgICAgIGlzU3RyaWN0TW9kZUZpYmVyXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiBudWxsID09PSBmaWJlci5tZW1vaXplZFN0YXRlICYmXG4gICAgICAgICAgICAgIChpc1N0cmljdE1vZGVGaWJlciAmJiBmaWJlci5mbGFncyAmIDEzNDIyNTkyMFxuICAgICAgICAgICAgICAgID8gcnVuV2l0aEZpYmVySW5ERVYoXG4gICAgICAgICAgICAgICAgICAgIGZpYmVyLFxuICAgICAgICAgICAgICAgICAgICBkb3VibGVJbnZva2VFZmZlY3RzT25GaWJlcixcbiAgICAgICAgICAgICAgICAgICAgcm9vdCxcbiAgICAgICAgICAgICAgICAgICAgZmliZXJcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA6IGZpYmVyLnN1YnRyZWVGbGFncyAmIDEzNDIxNzcyOCAmJlxuICAgICAgICAgICAgICAgICAgcnVuV2l0aEZpYmVySW5ERVYoXG4gICAgICAgICAgICAgICAgICAgIGZpYmVyLFxuICAgICAgICAgICAgICAgICAgICByZWN1cnNpdmVseVRyYXZlcnNlQW5kRG91YmxlSW52b2tlRWZmZWN0c0luREVWLFxuICAgICAgICAgICAgICAgICAgICByb290LFxuICAgICAgICAgICAgICAgICAgICBmaWJlcixcbiAgICAgICAgICAgICAgICAgICAgaXNTdHJpY3RNb2RlRmliZXJcbiAgICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgIHBhcmVudEZpYmVyID0gcGFyZW50RmliZXIuc2libGluZztcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBkb3VibGVJbnZva2VFZmZlY3RzT25GaWJlcihyb290LCBmaWJlcikge1xuICAgICAgc2V0SXNTdHJpY3RNb2RlRm9yRGV2dG9vbHMoITApO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZGlzYXBwZWFyTGF5b3V0RWZmZWN0cyhmaWJlciwgTm9MYXlvdXRFZmZlY3RUcmF2ZXJzYWxGbGFncyksXG4gICAgICAgICAgZGlzY29ubmVjdFBhc3NpdmVFZmZlY3QoZmliZXIpLFxuICAgICAgICAgIHJlYXBwZWFyTGF5b3V0RWZmZWN0cyhcbiAgICAgICAgICAgIHJvb3QsXG4gICAgICAgICAgICBmaWJlci5hbHRlcm5hdGUsXG4gICAgICAgICAgICBmaWJlcixcbiAgICAgICAgICAgIE5vTGF5b3V0RWZmZWN0VHJhdmVyc2FsRmxhZ3NcbiAgICAgICAgICApLFxuICAgICAgICAgIHJlY29ubmVjdFBhc3NpdmVFZmZlY3RzKHJvb3QsIGZpYmVyLCAwLCBudWxsLCAhMSwgMCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRJc1N0cmljdE1vZGVGb3JEZXZ0b29scyghMSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbW1pdERvdWJsZUludm9rZUVmZmVjdHNJbkRFVihyb290KSB7XG4gICAgICB2Y
15852XIgZG91YmxlSW52b2tlRWZmZWN0cyA9ICEwO1xuICAgICAgcm9vdC5jdXJyZW50Lm1vZGUgJiAoU3RyaWN0TGVnYWN5TW9kZSB8IFN0cmljdEVmZmVjdHNNb2RlKSB8fFxuICAgICAgICAoZG91YmxlSW52b2tlRWZmZWN0cyA9ICExKTtcbiAgICAgIHJlY3Vyc2l2ZWx5VHJhdmVyc2VBbmREb3VibGVJbnZva2VFZmZlY3RzSW5ERVYoXG4gICAgICAgIHJvb3QsXG4gICAgICAgIHJvb3QuY3VycmVudCxcbiAgICAgICAgZG91YmxlSW52b2tlRWZmZWN0c1xuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gd2FybkFib3V0VXBkYXRlT25Ob3RZZXRNb3VudGVkRmliZXJJbkRFVihmaWJlcikge1xuICAgICAgaWYgKChleGVjdXRpb25Db250ZXh0ICYgUmVuZGVyQ29udGV4dCkgPT09IE5vQ29udGV4dCkge1xuICAgICAgICB2YXIgdGFnID0gZmliZXIudGFnO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgMyA9PT0gdGFnIHx8XG4gICAgICAgICAgMSA9PT0gdGFnIHx8XG4gICAgICAgICAgMCA9PT0gdGFnIHx8XG4gICAgICAgICAgMTEgPT09IHRhZyB8fFxuICAgICAgICAgIDE0ID09PSB0YWcgfHxcbiAgICAgICAgICAxNSA9PT0gdGFnXG4gICAgICAgICkge1xuICAgICAgICAgIHRhZyA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoZmliZXIpIHx8IFwiUmVhY3RDb21wb25lbnRcIjtcbiAgICAgICAgICBpZiAobnVsbCAhPT0gZGlkV2FyblN0YXRlVXBkYXRlRm9yTm90WWV0TW91bnRlZENvbXBvbmVudCkge1xuICAgICAgICAgICAgaWYgKGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQuaGFzKHRhZykpIHJldHVybjtcbiAgICAgICAgICAgIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQuYWRkKHRhZyk7XG4gICAgICAgICAgfSBlbHNlIGRpZFdhcm5TdGF0ZVVwZGF0ZUZvck5vdFlldE1vdW50ZWRDb21wb25lbnQgPSBuZXcgU2V0KFt0YWddKTtcbiAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihmaWJlciwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCJDYW4ndCBwZXJmb3JtIGEgUmVhY3Qgc3RhdGUgdXBkYXRlIG9uIGEgY29tcG9uZW50IHRoYXQgaGFzbid0IG1vdW50ZWQgeWV0LiBUaGlzIGluZGljYXRlcyB0aGF0IHlvdSBoYXZlIGEgc2lkZS1lZmZlY3QgaW4geW91ciByZW5kZXIgZnVuY3Rpb24gdGhhdCBhc3luY2hyb25vdXNseSB0cmllcyB0byB1cGRhdGUgdGhlIGNvbXBvbmVudC4gTW92ZSB0aGlzIHdvcmsgdG8gdXNlRWZmZWN0IGluc3RlYWQuXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcmVzdG9yZVBlbmRpbmdVcGRhdGVycyhyb290LCBsYW5lcykge1xuICAgICAgaXNEZXZUb29sc1ByZXNlbnQgJiZcbiAgICAgICAgcm9vdC5tZW1vaXplZFVwZGF0ZXJzLmZvckVhY2goZnVuY3Rpb24gKHNjaGVkdWxpbmdGaWJlcikge1xuICAgICAgICAgIGFkZEZpYmVyVG9MYW5lc01hcChyb290LCBzY2hlZHVsaW5nRmliZXIsIGxhbmVzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNjaGVkdWxlQ2FsbGJhY2skMShwcmlvcml0eUxldmVsLCBjYWxsYmFjaykge1xuICAgICAgdmFyIGFjdFF1ZXVlID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuYWN0UXVldWU7XG4gICAgICByZXR1cm4gbnVsbCAhPT0gYWN0UXVldWVcbiAgICAgICAgPyAoYWN0UXVldWUucHVzaChjYWxsYmFjayksIGZha2VBY3RDYWxsYmFja05vZGUkMSlcbiAgICAgICAgOiBzY2hlZHVsZUNhbGxiYWNrJDMocHJpb3JpdHlMZXZlbCwgY2FsbGJhY2spO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3YXJuSWZVcGRhdGVzTm90V3JhcHBlZFdpdGhBY3RERVYoZmliZXIpIHtcbiAgICAgIGlzQ29uY3VycmVudEFjdEVudmlyb25tZW50KCkgJiZcbiAgICAgICAgbnVsbCA9PT0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuYWN0UXVldWUgJiZcbiAgICAgICAgcnVuV2l0aEZpYmVySW5ERVYoZmliZXIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJBbiB1cGRhdGUgdG8gJXMgaW5zaWRlIGEgdGVzdCB3YXMgbm90IHdyYXBwZWQgaW4gYWN0KC4uLikuXFxuXFxuV2hlbiB0ZXN0aW5nLCBjb2RlIHRoYXQgY2F1c2VzIFJlYWN0IHN0YXRlIHVwZGF0ZXMgc2hvdWxkIGJlIHdyYXBwZWQgaW50byBhY3QoLi4uKTpcXG5cXG5hY3QoKCkgPT4ge1xcbiAgLyogZmlyZSBldmVudHMgdGhhdCB1cGRhdGUgc3RhdGUgKi9cXG59KTtcXG4vKiBhc3NlcnQgb24gdGhlIG91dHB1dCAqL1xcblxcblRoaXMgZW5zdXJlcyB0aGF0IHlvdSdyZSB0ZXN0aW5nIHRoZSBiZWhhdmlvciB0aGUgdXNlciB3b3VsZCBzZWUgaW4gdGhlIGJyb3dzZXIuIExlYXJuIG1vcmUgYXQgaHR0cHM6Ly9yZWFjdC5kZXYvbGluay93cmFwLXRlc3RzLXdpdGgtYWN0XCIsXG4gICAgICAgICAgICBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBlbnN1cmVSb290SXNTY2hlZHVsZWQocm9vdCkge1xuICAgICAgcm9vdCAhPT0gbGFzdFNjaGVkdWxlZFJvb3QgJiZcbiAgICAgICAgbnVsbCA9PT0gcm9vdC5uZXh0ICYmXG4gICAgICAgIChudWxsID09PSBsYXN0U2NoZWR1bGVkUm9vdFxuICAgICAgICAgID8gKGZpcnN0U2NoZWR1bGVkUm9vdCA9IGxhc3RTY2hlZHVsZWRSb290ID0gcm9vdClcbiAgICAgICAgICA6IChsYXN0U2NoZWR1bGVkUm9vdCA9IGxhc3RTY2hlZHVsZWRSb290Lm5leHQgPSByb290KSk7XG4gICAgICBtaWdodEhhdmVQZW5kaW5nU3luY1dvcmsgPSAhMDtcbiAgICAgIG51bGwgIT09IFJlYWN0U2hhcmVkSW50ZXJuYWxzLmFjdFF1ZXVlXG4gICAgICAgID8gZGlkU2NoZWR1bGVNaWNyb3Rhc2tfYWN0IHx8XG4gICAgICAgICAgKChkaWRTY2hlZHVsZU1pY3JvdGFza19hY3QgPSAhMCksIHNjaGVkdWxlSW1tZWRpYXRlUm9vdFNjaGVkdWxlVGFzaygpKVxuICAgICAgICA6IGRpZFNjaGVkdWxlTWljcm90YXNrIHx8XG4gICAgICAgICAgKChkaWRTY2hlZHVsZU1pY3JvdGFzayA9ICEwKSwgc2NoZWR1bGVJbW1lZGlhdGVSb290U2NoZWR1bGVUYXNrKCkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBmbHVzaFN5bmNXb3JrQWNyb3NzUm9vdHNfaW1wbChzeW5jVHJhbnNpdGlvbkxhbmVzLCBvbmx5TGVnYWN5KSB7XG4gICAgICBpZiAoIWlzRmx1c2hpbmdXb3JrICYmIG1pZ2h0SGF2ZVBlbmRpbmdTeW5jV29yaykge1xuICAgICAgICBpc0ZsdXNoaW5nV29yayA9ICEwO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgdmFyIGRpZFBlcmZvcm1Tb21lV29yayA9ICExO1xuICAgICAgICAgIGZvciAodmFyIHJvb3QgPSBmaXJzdFNjaGVkdWxlZFJvb3Q7IG51bGwgIT09IHJvb3Q7ICkge1xuICAgICAgICAgICAgaWYgKCFvbmx5TGVnYWN5KVxuICAgICAgICAgICAgICBpZiAoMCAhPT0gc3luY1RyYW5zaXRpb25MYW5lcykge1xuICAgICAgICAgICAgICAgI
15852HZhciBwZW5kaW5nTGFuZXMgPSByb290LnBlbmRpbmdMYW5lcztcbiAgICAgICAgICAgICAgICBpZiAoMCA9PT0gcGVuZGluZ0xhbmVzKSB2YXIgbmV4dExhbmVzID0gMDtcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHZhciBzdXNwZW5kZWRMYW5lcyA9IHJvb3Quc3VzcGVuZGVkTGFuZXMsXG4gICAgICAgICAgICAgICAgICAgIHBpbmdlZExhbmVzID0gcm9vdC5waW5nZWRMYW5lcztcbiAgICAgICAgICAgICAgICAgIG5leHRMYW5lcyA9XG4gICAgICAgICAgICAgICAgICAgICgxIDw8ICgzMSAtIGNsejMyKDQyIHwgc3luY1RyYW5zaXRpb25MYW5lcykgKyAxKSkgLSAxO1xuICAgICAgICAgICAgICAgICAgbmV4dExhbmVzICY9IHBlbmRpbmdMYW5lcyAmIH4oc3VzcGVuZGVkTGFuZXMgJiB+cGluZ2VkTGFuZXMpO1xuICAgICAgICAgICAgICAgICAgbmV4dExhbmVzID1cbiAgICAgICAgICAgICAgICAgICAgbmV4dExhbmVzICYgMjAxMzI2NzQxXG4gICAgICAgICAgICAgICAgICAgICAgPyAobmV4dExhbmVzICYgMjAxMzI2NzQxKSB8IDFcbiAgICAgICAgICAgICAgICAgICAgICA6IG5leHRMYW5lc1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXh0TGFuZXMgfCAyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDAgIT09IG5leHRMYW5lcyAmJlxuICAgICAgICAgICAgICAgICAgKChkaWRQZXJmb3JtU29tZVdvcmsgPSAhMCksXG4gICAgICAgICAgICAgICAgICBwZXJmb3JtU3luY1dvcmtPblJvb3Qocm9vdCwgbmV4dExhbmVzKSk7XG4gICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIChuZXh0TGFuZXMgPSB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyksXG4gICAgICAgICAgICAgICAgICAobmV4dExhbmVzID0gZ2V0TmV4dExhbmVzKFxuICAgICAgICAgICAgICAgICAgICByb290LFxuICAgICAgICAgICAgICAgICAgICByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3QgPyBuZXh0TGFuZXMgOiAwLFxuICAgICAgICAgICAgICAgICAgICBudWxsICE9PSByb290LmNhbmNlbFBlbmRpbmdDb21taXQgfHxcbiAgICAgICAgICAgICAgICAgICAgICByb290LnRpbWVvdXRIYW5kbGUgIT09IG5vVGltZW91dFxuICAgICAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgICAgICAwID09PSAobmV4dExhbmVzICYgMykgfHxcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tJZlJvb3RJc1ByZXJlbmRlcmluZyhyb290LCBuZXh0TGFuZXMpIHx8XG4gICAgICAgICAgICAgICAgICAgICgoZGlkUGVyZm9ybVNvbWVXb3JrID0gITApLFxuICAgICAgICAgICAgICAgICAgICBwZXJmb3JtU3luY1dvcmtPblJvb3Qocm9vdCwgbmV4dExhbmVzKSk7XG4gICAgICAgICAgICByb290ID0gcm9vdC5uZXh0O1xuICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoZGlkUGVyZm9ybVNvbWVXb3JrKTtcbiAgICAgICAgaXNGbHVzaGluZ1dvcmsgPSAhMTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcHJvY2Vzc1Jvb3RTY2hlZHVsZUluSW1tZWRpYXRlVGFzaygpIHtcbiAgICAgIHNjaGVkdWxlckV2ZW50ID0gd2luZG93LmV2ZW50O1xuICAgICAgcHJvY2Vzc1Jvb3RTY2hlZHVsZUluTWljcm90YXNrKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHByb2Nlc3NSb290U2NoZWR1bGVJbk1pY3JvdGFzaygpIHtcbiAgICAgIG1pZ2h0SGF2ZVBlbmRpbmdTeW5jV29yayA9XG4gICAgICAgIGRpZFNjaGVkdWxlTWljcm90YXNrX2FjdCA9XG4gICAgICAgIGRpZFNjaGVkdWxlTWljcm90YXNrID1cbiAgICAgICAgICAhMTtcbiAgICAgIHZhciBzeW5jVHJhbnNpdGlvbkxhbmVzID0gMDtcbiAgICAgIDAgIT09IGN1cnJlbnRFdmVudFRyYW5zaXRpb25MYW5lICYmXG4gICAgICAgIHNob3VsZEF0dGVtcHRFYWdlclRyYW5zaXRpb24oKSAmJlxuICAgICAgICAoc3luY1RyYW5zaXRpb25MYW5lcyA9IGN1cnJlbnRFdmVudFRyYW5zaXRpb25MYW5lKTtcbiAgICAgIGZvciAoXG4gICAgICAgIHZhciBjdXJyZW50VGltZSA9IG5vdyQxKCksIHByZXYgPSBudWxsLCByb290ID0gZmlyc3RTY2hlZHVsZWRSb290O1xuICAgICAgICBudWxsICE9PSByb290O1xuXG4gICAgICApIHtcbiAgICAgICAgdmFyIG5leHQgPSByb290Lm5leHQsXG4gICAgICAgICAgbmV4dExhbmVzID0gc2NoZWR1bGVUYXNrRm9yUm9vdER1cmluZ01pY3JvdGFzayhyb290LCBjdXJyZW50VGltZSk7XG4gICAgICAgIGlmICgwID09PSBuZXh0TGFuZXMpXG4gICAgICAgICAgKHJvb3QubmV4dCA9IG51bGwpLFxuICAgICAgICAgICAgbnVsbCA9PT0gcHJldiA/IChmaXJzdFNjaGVkdWxlZFJvb3QgPSBuZXh0KSA6IChwcmV2Lm5leHQgPSBuZXh0KSxcbiAgICAgICAgICAgIG51bGwgPT09IG5leHQgJiYgKGxhc3RTY2hlZHVsZWRSb290ID0gcHJldik7XG4gICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICgocHJldiA9IHJvb3QpLCAwICE9PSBzeW5jVHJhbnNpdGlvbkxhbmVzIHx8IDAgIT09IChuZXh0TGFuZXMgJiAzKSlcbiAgICAgICAgKVxuICAgICAgICAgIG1pZ2h0SGF2ZVBlbmRpbmdTeW5jV29yayA9ICEwO1xuICAgICAgICByb290ID0gbmV4dDtcbiAgICAgIH1cbiAgICAgIChwZW5kaW5nRWZmZWN0c1N0YXR1cyAhPT0gTk9fUEVORElOR19FRkZFQ1RTICYmXG4gICAgICAgIHBlbmRpbmdFZmZlY3RzU3RhdHVzICE9PSBQRU5ESU5HX1BBU1NJVkVfUEhBU0UpIHx8XG4gICAgICAgIGZsdXNoU3luY1dvcmtBY3Jvc3NSb290c19pbXBsKHN5bmNUcmFuc2l0aW9uTGFuZXMsICExKTtcbiAgICAgIDAgIT09IGN1cnJlbnRFdmVudFRyYW5zaXRpb25MYW5lICYmIChjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZSA9IDApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzY2hlZHVsZVRhc2tGb3JSb290RHVyaW5nTWljcm90YXNrKHJvb3QsIGN1cnJlbnRUaW1lKSB7XG4gICAgICBmb3IgKFxuICAgICAgICB2Y
15852XIgc3VzcGVuZGVkTGFuZXMgPSByb290LnN1c3BlbmRlZExhbmVzLFxuICAgICAgICAgIHBpbmdlZExhbmVzID0gcm9vdC5waW5nZWRMYW5lcyxcbiAgICAgICAgICBleHBpcmF0aW9uVGltZXMgPSByb290LmV4cGlyYXRpb25UaW1lcyxcbiAgICAgICAgICBsYW5lcyA9IHJvb3QucGVuZGluZ0xhbmVzICYgLTYyOTE0NTYxO1xuICAgICAgICAwIDwgbGFuZXM7XG5cbiAgICAgICkge1xuICAgICAgICB2YXIgaW5kZXggPSAzMSAtIGNsejMyKGxhbmVzKSxcbiAgICAgICAgICBsYW5lID0gMSA8PCBpbmRleCxcbiAgICAgICAgICBleHBpcmF0aW9uVGltZSA9IGV4cGlyYXRpb25UaW1lc1tpbmRleF07XG4gICAgICAgIGlmICgtMSA9PT0gZXhwaXJhdGlvblRpbWUpIHtcbiAgICAgICAgICBpZiAoMCA9PT0gKGxhbmUgJiBzdXNwZW5kZWRMYW5lcykgfHwgMCAhPT0gKGxhbmUgJiBwaW5nZWRMYW5lcykpXG4gICAgICAgICAgICBleHBpcmF0aW9uVGltZXNbaW5kZXhdID0gY29tcHV0ZUV4cGlyYXRpb25UaW1lKGxhbmUsIGN1cnJlbnRUaW1lKTtcbiAgICAgICAgfSBlbHNlIGV4cGlyYXRpb25UaW1lIDw9IGN1cnJlbnRUaW1lICYmIChyb290LmV4cGlyZWRMYW5lcyB8PSBsYW5lKTtcbiAgICAgICAgbGFuZXMgJj0gfmxhbmU7XG4gICAgICB9XG4gICAgICBjdXJyZW50VGltZSA9IHdvcmtJblByb2dyZXNzUm9vdDtcbiAgICAgIHN1c3BlbmRlZExhbmVzID0gd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXM7XG4gICAgICBzdXNwZW5kZWRMYW5lcyA9IGdldE5leHRMYW5lcyhcbiAgICAgICAgcm9vdCxcbiAgICAgICAgcm9vdCA9PT0gY3VycmVudFRpbWUgPyBzdXNwZW5kZWRMYW5lcyA6IDAsXG4gICAgICAgIG51bGwgIT09IHJvb3QuY2FuY2VsUGVuZGluZ0NvbW1pdCB8fCByb290LnRpbWVvdXRIYW5kbGUgIT09IG5vVGltZW91dFxuICAgICAgKTtcbiAgICAgIHBpbmdlZExhbmVzID0gcm9vdC5jYWxsYmFja05vZGU7XG4gICAgICBpZiAoXG4gICAgICAgIDAgPT09IHN1c3BlbmRlZExhbmVzIHx8XG4gICAgICAgIChyb290ID09PSBjdXJyZW50VGltZSAmJlxuICAgICAgICAgICh3b3JrSW5Qcm9ncmVzc1N1c3BlbmRlZFJlYXNvbiA9PT0gU3VzcGVuZGVkT25EYXRhIHx8XG4gICAgICAgICAgICB3b3JrSW5Qcm9ncmVzc1N1c3BlbmRlZFJlYXNvbiA9PT0gU3VzcGVuZGVkT25BY3Rpb24pKSB8fFxuICAgICAgICBudWxsICE9PSByb290LmNhbmNlbFBlbmRpbmdDb21taXRcbiAgICAgIClcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBudWxsICE9PSBwaW5nZWRMYW5lcyAmJiBjYW5jZWxDYWxsYmFjayhwaW5nZWRMYW5lcyksXG4gICAgICAgICAgKHJvb3QuY2FsbGJhY2tOb2RlID0gbnVsbCksXG4gICAgICAgICAgKHJvb3QuY2FsbGJhY2tQcmlvcml0eSA9IDApXG4gICAgICAgICk7XG4gICAgICBpZiAoXG4gICAgICAgIDAgPT09IChzdXNwZW5kZWRMYW5lcyAmIDMpIHx8XG4gICAgICAgIGNoZWNrSWZSb290SXNQcmVyZW5kZXJpbmcocm9vdCwgc3VzcGVuZGVkTGFuZXMpXG4gICAgICApIHtcbiAgICAgICAgY3VycmVudFRpbWUgPSBzdXNwZW5kZWRMYW5lcyAmIC1zdXNwZW5kZWRMYW5lcztcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGN1cnJlbnRUaW1lICE9PSByb290LmNhbGxiYWNrUHJpb3JpdHkgfHxcbiAgICAgICAgICAobnVsbCAhPT0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuYWN0UXVldWUgJiZcbiAgICAgICAgICAgIHBpbmdlZExhbmVzICE9PSBmYWtlQWN0Q2FsbGJhY2tOb2RlKVxuICAgICAgICApXG4gICAgICAgICAgY2FuY2VsQ2FsbGJhY2socGluZ2VkTGFuZXMpO1xuICAgICAgICBlbHNlIHJldHVybiBjdXJyZW50VGltZTtcbiAgICAgICAgc3dpdGNoIChsYW5lc1RvRXZlbnRQcmlvcml0eShzdXNwZW5kZWRMYW5lcykpIHtcbiAgICAgICAgICBjYXNlIERpc2NyZXRlRXZlbnRQcmlvcml0eTpcbiAgICAgICAgICBjYXNlIENvbnRpbnVvdXNFdmVudFByaW9yaXR5OlxuICAgICAgICAgICAgc3VzcGVuZGVkTGFuZXMgPSBVc2VyQmxvY2tpbmdQcmlvcml0eTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgRGVmYXVsdEV2ZW50UHJpb3JpdHk6XG4gICAgICAgICAgICBzdXNwZW5kZWRMYW5lcyA9IE5vcm1hbFByaW9yaXR5JDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIElkbGVFdmVudFByaW9yaXR5OlxuICAgICAgICAgICAgc3VzcGVuZGVkTGFuZXMgPSBJZGxlUHJpb3JpdHk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgc3VzcGVuZGVkTGFuZXMgPSBOb3JtYWxQcmlvcml0eSQxO1xuICAgICAgICB9XG4gICAgICAgIHBpbmdlZExhbmVzID0gcGVyZm9ybVdvcmtPblJvb3RWaWFTY2hlZHVsZXJUYXNrLmJpbmQobnVsbCwgcm9vdCk7XG4gICAgICAgIG51bGwgIT09IFJlYWN0U2hhcmVkSW50ZXJuYWxzLmFjdFF1ZXVlXG4gICAgICAgICAgPyAoUmVhY3RTaGFyZWRJbnRlcm5hbHMuYWN0UXVldWUucHVzaChwaW5nZWRMYW5lcyksXG4gICAgICAgICAgICAoc3VzcGVuZGVkTGFuZXMgPSBmYWtlQWN0Q2FsbGJhY2tOb2RlKSlcbiAgICAgICAgICA6IChzdXNwZW5kZWRMYW5lcyA9IHNjaGVkdWxlQ2FsbGJhY2skMyhzdXNwZW5kZWRMYW5lcywgcGluZ2VkTGFuZXMpKTtcbiAgICAgICAgcm9vdC5jYWxsYmFja1ByaW9yaXR5ID0gY3VycmVudFRpbWU7XG4gICAgICAgIHJvb3QuY2FsbGJhY2tOb2RlID0gc3VzcGVuZGVkTGFuZXM7XG4gICAgICAgIHJldHVybiBjdXJyZW50VGltZTtcbiAgICAgIH1cbiAgICAgIG51bGwgIT09IHBpbmdlZExhbmVzICYmIGNhbmNlbENhbGxiYWNrKHBpbmdlZExhbmVzKTtcbiAgICAgIHJvb3QuY2FsbGJhY2tQcmlvcml0eSA9IDI7XG4gICAgICByb290LmNhbGxiYWNrTm9kZSA9IG51bGw7XG4gICAgICByZXR1cm4gMjtcbiAgICB9XG4gICAgZnVuY3Rpb24gcGVyZm9ybVdvcmtPblJvb3RWaWFTY2hlZHVsZXJUYXNrKHJvb3QsIGRpZFRpbWVvdXQpIHtcbiAgICAgIG5lc3RlZFVwZGF0ZVNjaGVkdWxlZCA9IGN1cnJlbnRVcGRhdGVJc05lc3RlZCA9ICExO1xuICAgICAgc2NoZWR1bGVyRXZlbnQgPSB3aW5kb3cuZXZlbnQ7XG4gICAgICBpZiAoXG4gICAgICAgI
15852HBlbmRpbmdFZmZlY3RzU3RhdHVzICE9PSBOT19QRU5ESU5HX0VGRkVDVFMgJiZcbiAgICAgICAgcGVuZGluZ0VmZmVjdHNTdGF0dXMgIT09IFBFTkRJTkdfUEFTU0lWRV9QSEFTRVxuICAgICAgKVxuICAgICAgICByZXR1cm4gKHJvb3QuY2FsbGJhY2tOb2RlID0gbnVsbCksIChyb290LmNhbGxiYWNrUHJpb3JpdHkgPSAwKSwgbnVsbDtcbiAgICAgIHZhciBvcmlnaW5hbENhbGxiYWNrTm9kZSA9IHJvb3QuY2FsbGJhY2tOb2RlO1xuICAgICAgcGVuZGluZ0RlbGF5ZWRDb21taXRSZWFzb24gPT09IElNTUVESUFURV9DT01NSVQgJiZcbiAgICAgICAgKHBlbmRpbmdEZWxheWVkQ29tbWl0UmVhc29uID0gREVMQVlFRF9QQVNTSVZFX0NPTU1JVCk7XG4gICAgICBpZiAoZmx1c2hQZW5kaW5nRWZmZWN0cygpICYmIHJvb3QuY2FsbGJhY2tOb2RlICE9PSBvcmlnaW5hbENhbGxiYWNrTm9kZSlcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMkanNjb21wJDAgPVxuICAgICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcztcbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzJGpzY29tcCQwID0gZ2V0TmV4dExhbmVzKFxuICAgICAgICByb290LFxuICAgICAgICByb290ID09PSB3b3JrSW5Qcm9ncmVzc1Jvb3RcbiAgICAgICAgICA/IHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzJGpzY29tcCQwXG4gICAgICAgICAgOiAwLFxuICAgICAgICBudWxsICE9PSByb290LmNhbmNlbFBlbmRpbmdDb21taXQgfHwgcm9vdC50aW1lb3V0SGFuZGxlICE9PSBub1RpbWVvdXRcbiAgICAgICk7XG4gICAgICBpZiAoMCA9PT0gd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyTGFuZXMkanNjb21wJDApIHJldHVybiBudWxsO1xuICAgICAgcGVyZm9ybVdvcmtPblJvb3QoXG4gICAgICAgIHJvb3QsXG4gICAgICAgIHdvcmtJblByb2dyZXNzUm9vdFJlbmRlckxhbmVzJGpzY29tcCQwLFxuICAgICAgICBkaWRUaW1lb3V0XG4gICAgICApO1xuICAgICAgc2NoZWR1bGVUYXNrRm9yUm9vdER1cmluZ01pY3JvdGFzayhyb290LCBub3ckMSgpKTtcbiAgICAgIHJldHVybiBudWxsICE9IHJvb3QuY2FsbGJhY2tOb2RlICYmXG4gICAgICAgIHJvb3QuY2FsbGJhY2tOb2RlID09PSBvcmlnaW5hbENhbGxiYWNrTm9kZVxuICAgICAgICA/IHBlcmZvcm1Xb3JrT25Sb290VmlhU2NoZWR1bGVyVGFzay5iaW5kKG51bGwsIHJvb3QpXG4gICAgICAgIDogbnVsbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gcGVyZm9ybVN5bmNXb3JrT25Sb290KHJvb3QsIGxhbmVzKSB7XG4gICAgICBpZiAoZmx1c2hQZW5kaW5nRWZmZWN0cygpKSByZXR1cm4gbnVsbDtcbiAgICAgIGN1cnJlbnRVcGRhdGVJc05lc3RlZCA9IG5lc3RlZFVwZGF0ZVNjaGVkdWxlZDtcbiAgICAgIG5lc3RlZFVwZGF0ZVNjaGVkdWxlZCA9ICExO1xuICAgICAgcGVyZm9ybVdvcmtPblJvb3Qocm9vdCwgbGFuZXMsICEwKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2FuY2VsQ2FsbGJhY2soY2FsbGJhY2tOb2RlKSB7XG4gICAgICBjYWxsYmFja05vZGUgIT09IGZha2VBY3RDYWxsYmFja05vZGUgJiZcbiAgICAgICAgbnVsbCAhPT0gY2FsbGJhY2tOb2RlICYmXG4gICAgICAgIGNhbmNlbENhbGxiYWNrJDEoY2FsbGJhY2tOb2RlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2NoZWR1bGVJbW1lZGlhdGVSb290U2NoZWR1bGVUYXNrKCkge1xuICAgICAgbnVsbCAhPT0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuYWN0UXVldWUgJiZcbiAgICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuYWN0UXVldWUucHVzaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcHJvY2Vzc1Jvb3RTY2hlZHVsZUluTWljcm90YXNrKCk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgc2NoZWR1bGVNaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICAoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpICE9PSBOb0NvbnRleHRcbiAgICAgICAgICA/IHNjaGVkdWxlQ2FsbGJhY2skMyhcbiAgICAgICAgICAgICAgSW1tZWRpYXRlUHJpb3JpdHksXG4gICAgICAgICAgICAgIHByb2Nlc3NSb290U2NoZWR1bGVJbkltbWVkaWF0ZVRhc2tcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IHByb2Nlc3NSb290U2NoZWR1bGVJbk1pY3JvdGFzaygpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlcXVlc3RUcmFuc2l0aW9uTGFuZSgpIHtcbiAgICAgIGlmICgwID09PSBjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZSkge1xuICAgICAgICB2Y
15852XIgYWN0aW9uU2NvcGVMYW5lID0gY3VycmVudEVudGFuZ2xlZExhbmU7XG4gICAgICAgIDAgPT09IGFjdGlvblNjb3BlTGFuZSAmJlxuICAgICAgICAgICgoYWN0aW9uU2NvcGVMYW5lID0gbmV4dFRyYW5zaXRpb25VcGRhdGVMYW5lKSxcbiAgICAgICAgICAobmV4dFRyYW5zaXRpb25VcGRhdGVMYW5lIDw8PSAxKSxcbiAgICAgICAgICAwID09PSAobmV4dFRyYW5zaXRpb25VcGRhdGVMYW5lICYgMjYxODg4KSAmJlxuICAgICAgICAgICAgKG5leHRUcmFuc2l0aW9uVXBkYXRlTGFuZSA9IDI1NikpO1xuICAgICAgICBjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZSA9IGFjdGlvblNjb3BlTGFuZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjdXJyZW50RXZlbnRUcmFuc2l0aW9uTGFuZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29lcmNlRm9ybUFjdGlvblByb3AoYWN0aW9uUHJvcCkge1xuICAgICAgaWYgKFxuICAgICAgICBudWxsID09IGFjdGlvblByb3AgfHxcbiAgICAgICAgXCJzeW1ib2xcIiA9PT0gdHlwZW9mIGFjdGlvblByb3AgfHxcbiAgICAgICAgXCJib29sZWFuXCIgPT09IHR5cGVvZiBhY3Rpb25Qcm9wXG4gICAgICApXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGFjdGlvblByb3ApIHJldHVybiBhY3Rpb25Qcm9wO1xuICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbihhY3Rpb25Qcm9wLCBcImFjdGlvblwiKTtcbiAgICAgIHJldHVybiBzYW5pdGl6ZVVSTChhY3Rpb25Qcm9wKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZXh0cmFjdEV2ZW50cyQxKFxuICAgICAgZGlzcGF0Y2hRdWV1ZSxcbiAgICAgIGRvbUV2ZW50TmFtZSxcbiAgICAgIG1heWJlVGFyZ2V0SW5zdCxcbiAgICAgIG5hdGl2ZUV2ZW50LFxuICAgICAgbmF0aXZlRXZlbnRUYXJnZXRcbiAgICApIHtcbiAgICAgIGlmIChcbiAgICAgICAgXCJzdWJtaXRcIiA9PT0gZG9tRXZlbnROYW1lICYmXG4gICAgICAgIG1heWJlVGFyZ2V0SW5zdCAmJlxuICAgICAgICBtYXliZVRhcmdldEluc3Quc3RhdGVOb2RlID09PSBuYXRpdmVFdmVudFRhcmdldFxuICAgICAgKSB7XG4gICAgICAgIHZhciBhY3Rpb24gPSBjb2VyY2VGb3JtQWN0aW9uUHJvcChcbiAgICAgICAgICAgIChuYXRpdmVFdmVudFRhcmdldFtpbnRlcm5hbFByb3BzS2V5XSB8fCBudWxsKS5hY3Rpb25cbiAgICAgICAgICApLFxuICAgICAgICAgIHN1Ym1pdHRlciA9IG5hdGl2ZUV2ZW50LnN1Ym1pdHRlcjtcbiAgICAgICAgc3VibWl0dGVyICYmXG4gICAgICAgICAgKChkb21FdmVudE5hbWUgPSAoZG9tRXZlbnROYW1lID0gc3VibWl0dGVyW2ludGVybmFsUHJvcHNLZXldIHx8IG51bGwpXG4gICAgICAgICAgICA/IGNvZXJjZUZvcm1BY3Rpb25Qcm9wKGRvbUV2ZW50TmFtZS5mb3JtQWN0aW9uKVxuICAgICAgICAgICAgOiBzdWJtaXR0ZXIuZ2V0QXR0cmlidXRlKFwiZm9ybUFjdGlvblwiKSksXG4gICAgICAgICAgbnVsbCAhPT0gZG9tRXZlbnROYW1lICYmXG4gICAgICAgICAgICAoKGFjdGlvbiA9IGRvbUV2ZW50TmFtZSksIChzdWJtaXR0ZXIgPSBudWxsKSkpO1xuICAgICAgICB2Y
15852XIgZXZlbnQgPSBuZXcgU3ludGhldGljRXZlbnQoXG4gICAgICAgICAgXCJhY3Rpb25cIixcbiAgICAgICAgICBcImFjdGlvblwiLFxuICAgICAgICAgIG51bGwsXG4gICAgICAgICAgbmF0aXZlRXZlbnQsXG4gICAgICAgICAgbmF0aXZlRXZlbnRUYXJnZXRcbiAgICAgICAgKTtcbiAgICAgICAgZGlzcGF0Y2hRdWV1ZS5wdXNoKHtcbiAgICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgICAgbGlzdGVuZXJzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGluc3RhbmNlOiBudWxsLFxuICAgICAgICAgICAgICBsaXN0ZW5lcjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChuYXRpdmVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoMCAhPT0gY3VycmVudEV2ZW50VHJhbnNpdGlvbkxhbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKG5hdGl2ZUV2ZW50VGFyZ2V0LCBzdWJtaXR0ZXIpLFxuICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdTdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmc6ICEwLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZm9ybURhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IG5hdGl2ZUV2ZW50VGFyZ2V0Lm1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogYWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmZyZWV6ZShwZW5kaW5nU3RhdGUpO1xuICAgICAgICAgICAgICAgICAgICBzdGFydEhvc3RUcmFuc2l0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgIG1heWJlVGFyZ2V0SW5zdCxcbiAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nU3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgYWN0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgIChldmVudC5wcmV2ZW50RGVmYXVsdCgpLFxuICAgICAgICAgICAgICAgICAgICAoZm9ybURhdGEgPSBuZXcgRm9ybURhdGEobmF0aXZlRXZlbnRUYXJnZXQsIHN1Ym1pdHRlcikpLFxuICAgICAgICAgICAgICAgICAgICAocGVuZGluZ1N0YXRlID0ge1xuICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmc6ICEwLFxuICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGZvcm1EYXRhLFxuICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZDogbmF0aXZlRXZlbnRUYXJnZXQubWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogYWN0aW9uXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZnJlZXplKHBlbmRpbmdTdGF0ZSksXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0SG9zdFRyYW5zaXRpb24oXG4gICAgICAgICAgICAgICAgICAgICAgbWF5YmVUYXJnZXRJbnN0LFxuICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGFcbiAgICAgICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGN1cnJlbnRUYXJnZXQ6IG5hdGl2ZUV2ZW50VGFyZ2V0XG4gICAgICAgICAgICB9XG4gICAgICAgICAgXVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZXhlY3V0ZURpc3BhdGNoKGV2ZW50LCBsaXN0ZW5lciwgY3VycmVudFRhcmdldCkge1xuICAgICAgZXZlbnQuY3VycmVudFRhcmdldCA9IGN1cnJlbnRUYXJnZXQ7XG4gICAgICB0cnkge1xuICAgICAgICBsaXN0ZW5lcihldmVudCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXBvcnRHbG9iYWxFcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgICBldmVudC5jdXJyZW50VGFyZ2V0ID0gbnVsbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHJvY2Vzc0Rpc3BhdGNoUXVldWUoZGlzcGF0Y2hRdWV1ZSwgZXZlbnRTeXN0ZW1GbGFncykge1xuICAgICAgZXZlbnRTeXN0ZW1GbGFncyA9IDAgIT09IChldmVudFN5c3RlbUZsYWdzICYgNCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpc3BhdGNoUXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIF9kaXNwYXRjaFF1ZXVlJGkgPSBkaXNwYXRjaFF1ZXVlW2ldO1xuICAgICAgICBhOiB7XG4gICAgICAgICAgdmFyIHByZXZpb3VzSW5zdGFuY2UgPSB2b2lkIDAsXG4gICAgICAgICAgICBldmVudCA9IF9kaXNwYXRjaFF1ZXVlJGkuZXZlbnQ7XG4gICAgICAgICAgX2Rpc3BhdGNoUXVldWUkaSA9IF9kaXNwYXRjaFF1ZXVlJGkubGlzdGVuZXJzO1xuICAgICAgICAgIGlmIChldmVudFN5c3RlbUZsYWdzKVxuICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgdmFyIGkkanNjb21wJDAgPSBfZGlzcGF0Y2hRdWV1ZSRpLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgIDAgPD0gaSRqc2NvbXAkMDtcbiAgICAgICAgICAgICAgaSRqc2NvbXAkMC0tXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdmFyIF9kaXNwYXRjaExpc3RlbmVycyRpID0gX2Rpc3BhdGNoUXVldWUkaVtpJGpzY29tcCQwXSxcbiAgICAgICAgICAgICAgICBpbnN0YW5jZSA9IF9kaXNwYXRjaExpc3RlbmVycyRpLmluc3RhbmNlLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRUYXJnZXQgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkaS5jdXJyZW50VGFyZ2V0O1xuICAgICAgICAgICAgICBfZGlzcGF0Y2hMaXN0ZW5lcnMkaSA9IF9kaXNwYXRjaExpc3RlbmVycyRpLmxpc3RlbmVyO1xuICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UgIT09IHByZXZpb3VzSW5zdGFuY2UgJiYgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSlcbiAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICBudWxsICE9PSBpbnN0YW5jZVxuICAgICAgICAgICAgICAgID8gcnVuV2l0aEZpYmVySW5ERVYoXG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgICAgICAgICAgICBleGVjdXRlRGlzcGF0Y2gsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICBfZGlzcGF0Y2hMaXN0ZW5lcnMkaSxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRhcmdldFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogZXhlY3V0ZURpc3Bh
15852dGNoKGV2ZW50LCBfZGlzcGF0Y2hMaXN0ZW5lcnMkaSwgY3VycmVudFRhcmdldCk7XG4gICAgICAgICAgICAgIHByZXZpb3VzSW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgICBpJGpzY29tcCQwID0gMDtcbiAgICAgICAgICAgICAgaSRqc2NvbXAkMCA8IF9kaXNwYXRjaFF1ZXVlJGkubGVuZ3RoO1xuICAgICAgICAgICAgICBpJGpzY29tcCQwKytcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBfZGlzcGF0Y2hMaXN0ZW5lcnMkaSA9IF9kaXNwYXRjaFF1ZXVlJGlbaSRqc2NvbXAkMF07XG4gICAgICAgICAgICAgIGluc3RhbmNlID0gX2Rpc3BhdGNoTGlzdGVuZXJzJGkuaW5zdGFuY2U7XG4gICAgICAgICAgICAgIGN1cnJlbnRUYXJnZXQgPSBfZGlzcGF0Y2hMaXN0ZW5lcnMkaS5jdXJyZW50VGFyZ2V0O1xuICAgICAgICAgICAgICBfZGlzcGF0Y2hMaXN0ZW5lcnMkaSA9IF9kaXNwYXRjaExpc3RlbmVycyRpLmxpc3RlbmVyO1xuICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UgIT09IHByZXZpb3VzSW5zdGFuY2UgJiYgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSlcbiAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICBudWxsICE9PSBpbnN0YW5jZVxuICAgICAgICAgICAgICAgID8gcnVuV2l0aEZpYmVySW5ERVYoXG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgICAgICAgICAgICBleGVjdXRlRGlzcGF0Y2gsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICBfZGlzcGF0Y2hMaXN0ZW5lcnMkaSxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRhcmdldFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogZXhlY3V0ZURpc3BhdGNoKGV2ZW50LCBfZGlzcGF0Y2hMaXN0ZW5lcnMkaSwgY3VycmVudFRhcmdldCk7XG4gICAgICAgICAgICAgIHByZXZpb3VzSW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KGRvbUV2ZW50TmFtZSwgdGFyZ2V0RWxlbWVudCkge1xuICAgICAgbm9uRGVsZWdhdGVkRXZlbnRzLmhhcyhkb21FdmVudE5hbWUpIHx8XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgJ0RpZCBub3QgZXhwZWN0IGEgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudCgpIGNhbGwgZm9yIFwiJXNcIi4gVGhpcyBpcyBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuJyxcbiAgICAgICAgICBkb21FdmVudE5hbWVcbiAgICAgICAgKTtcbiAgICAgIHZhciBsaXN0ZW5lclNldCA9IHRhcmdldEVsZW1lbnRbaW50ZXJuYWxFdmVudEhhbmRsZXJzS2V5XTtcbiAgICAgIHZvaWQgMCA9PT0gbGlzdGVuZXJTZXQgJiZcbiAgICAgICAgKGxpc3RlbmVyU2V0ID0gdGFyZ2V0RWxlbWVudFtpbnRlcm5hbEV2ZW50SGFuZGxlcnNLZXldID0gbmV3IFNldCgpKTtcbiAgICAgIHZhciBsaXN0ZW5lclNldEtleSA9IGRvbUV2ZW50TmFtZSArIFwiX19idWJibGVcIjtcbiAgICAgIGxpc3RlbmVyU2V0LmhhcyhsaXN0ZW5lclNldEtleSkgfHxcbiAgICAgICAgKGFkZFRyYXBwZWRFdmVudExpc3RlbmVyKHRhcmdldEVsZW1lbnQsIGRvbUV2ZW50TmFtZSwgMiwgITEpLFxuICAgICAgICBsaXN0ZW5lclNldC5hZGQobGlzdGVuZXJTZXRLZXkpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbGlzdGVuVG9OYXRpdmVFdmVudChkb21FdmVudE5hbWUsIGlzQ2FwdHVyZVBoYXNlTGlzdGVuZXIsIHRhcmdldCkge1xuICAgICAgbm9uRGVsZWdhdGVkRXZlbnRzLmhhcyhkb21FdmVudE5hbWUpICYmXG4gICAgICAgICFpc0NhcHR1cmVQaGFzZUxpc3RlbmVyICYmXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgJ0RpZCBub3QgZXhwZWN0IGEgbGlzdGVuVG9OYXRpdmVFdmVudCgpIGNhbGwgZm9yIFwiJXNcIiBpbiB0aGUgYnViYmxlIHBoYXNlLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLFxuICAgICAgICAgIGRvbUV2ZW50TmFtZVxuICAgICAgICApO1xuICAgICAgdmFyIGV2ZW50U3lzdGVtRmxhZ3MgPSAwO1xuICAgICAgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lciAmJiAoZXZlbnRTeXN0ZW1GbGFncyB8PSA0KTtcbiAgICAgIGFkZFRyYXBwZWRFdmVudExpc3RlbmVyKFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIGRvbUV2ZW50TmFtZSxcbiAgICAgICAgZXZlbnRTeXN0ZW1GbGFncyxcbiAgICAgICAgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lclxuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbGlzdGVuVG9BbGxTdXBwb3J0ZWRFdmVudHMocm9vdENvbnRhaW5lckVsZW1lbnQpIHtcbiAgICAgIGlmICghcm9vdENvbnRhaW5lckVsZW1lbnRbbGlzdGVuaW5nTWFya2VyXSkge1xuICAgICAgICByb290Q29udGFpbmVyRWxlbWVudFtsaXN0ZW5pbmdNYXJrZXJdID0gITA7XG4gICAgICAgIGFsbE5hdGl2ZUV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChkb21FdmVudE5hbWUpIHtcbiAgICAgICAgICBcInNlbGVjdGlvbmNoYW5nZVwiICE9PSBkb21FdmVudE5hbWUgJiZcbiAgICAgICAgICAgIChub25EZWxlZ2F0ZWRFdmVudHMuaGFzKGRvbUV2ZW50TmFtZSkgfHxcbiAgICAgICAgICAgICAgbGlzdGVuVG9OYXRpdmVFdmVudChkb21FdmVudE5hbWUsICExLCByb290Q29udGFpbmVyRWxlbWVudCksXG4gICAgICAgICAgICBsaXN0ZW5Ub05hdGl2ZUV2ZW50KGRvbUV2ZW50TmFtZSwgITAsIHJvb3RDb250YWluZXJFbGVtZW50KSk7XG4gICAgICAgIH0pO1xuICAgICAgICB2Y
15852XIgb3duZXJEb2N1bWVudCA9XG4gICAgICAgICAgOSA9PT0gcm9vdENvbnRhaW5lckVsZW1lbnQubm9kZVR5cGVcbiAgICAgICAgICAgID8gcm9vdENvbnRhaW5lckVsZW1lbnRcbiAgICAgICAgICAgIDogcm9vdENvbnRhaW5lckVsZW1lbnQub3duZXJEb2N1bWVudDtcbiAgICAgICAgbnVsbCA9PT0gb3duZXJEb2N1bWVudCB8fFxuICAgICAgICAgIG93bmVyRG9jdW1lbnRbbGlzdGVuaW5nTWFya2VyXSB8fFxuICAgICAgICAgICgob3duZXJEb2N1bWVudFtsaXN0ZW5pbmdNYXJrZXJdID0gITApLFxuICAgICAgICAgIGxpc3RlblRvTmF0aXZlRXZlbnQoXCJzZWxlY3Rpb25jaGFuZ2VcIiwgITEsIG93bmVyRG9jdW1lbnQpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gYWRkVHJhcHBlZEV2ZW50TGlzdGVuZXIoXG4gICAgICB0YXJnZXRDb250YWluZXIsXG4gICAgICBkb21FdmVudE5hbWUsXG4gICAgICBldmVudFN5c3RlbUZsYWdzLFxuICAgICAgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lclxuICAgICkge1xuICAgICAgc3dpdGNoIChnZXRFdmVudFByaW9yaXR5KGRvbUV2ZW50TmFtZSkpIHtcbiAgICAgICAgY2FzZSBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk6XG4gICAgICAgICAgdmFyIGxpc3RlbmVyV3JhcHBlciA9IGRpc3BhdGNoRGlzY3JldGVFdmVudDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDb250aW51b3VzRXZlbnRQcmlvcml0eTpcbiAgICAgICAgICBsaXN0ZW5lcldyYXBwZXIgPSBkaXNwYXRjaENvbnRpbnVvdXNFdmVudDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBsaXN0ZW5lcldyYXBwZXIgPSBkaXNwYXRjaEV2ZW50O1xuICAgICAgfVxuICAgICAgZXZlbnRTeXN0ZW1GbGFncyA9IGxpc3RlbmVyV3JhcHBlci5iaW5kKFxuICAgICAgICBudWxsLFxuICAgICAgICBkb21FdmVudE5hbWUsXG4gICAgICAgIGV2ZW50U3lzdGVtRmxhZ3MsXG4gICAgICAgIHRhcmdldENvbnRhaW5lclxuICAgICAgKTtcbiAgICAgIGxpc3RlbmVyV3JhcHBlciA9IHZvaWQgMDtcbiAgICAgICFwYXNzaXZlQnJvd3NlckV2ZW50c1N1cHBvcnRlZCB8fFxuICAgICAgICAoXCJ0b3VjaHN0YXJ0XCIgIT09IGRvbUV2ZW50TmFtZSAmJlxuICAgICAgICAgIFwidG91Y2htb3ZlXCIgIT09IGRvbUV2ZW50TmFtZSAmJlxuICAgICAgICAgIFwid2hlZWxcIiAhPT0gZG9tRXZlbnROYW1lKSB8fFxuICAgICAgICAobGlzdGVuZXJXcmFwcGVyID0gITApO1xuICAgICAgaXNDYXB0dXJlUGhhc2VMaXN0ZW5lclxuICAgICAgICA/IHZvaWQgMCAhPT0gbGlzdGVuZXJXcmFwcGVyXG4gICAgICAgICAgPyB0YXJnZXRDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihkb21FdmVudE5hbWUsIGV2ZW50U3lzdGVtRmxhZ3MsIHtcbiAgICAgICAgICAgICAgY2FwdHVyZTogITAsXG4gICAgICAgICAgICAgIHBhc3NpdmU6IGxpc3RlbmVyV3JhcHBlclxuICAgICAgICAgICAgfSlcbiAgICAgICAgICA6IHRhcmdldENvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgITApXG4gICAgICAgIDogdm9pZCAwICE9PSBsaXN0ZW5lcldyYXBwZXJcbiAgICAgICAgICA/IHRhcmdldENvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywge1xuICAgICAgICAgICAgICBwYXNzaXZlOiBsaXN0ZW5lcldyYXBwZXJcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgOiB0YXJnZXRDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgZG9tRXZlbnROYW1lLFxuICAgICAgICAgICAgICBldmVudFN5c3RlbUZsYWdzLFxuICAgICAgICAgICAgICAhMVxuICAgICAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGlzcGF0Y2hFdmVudEZvclBsdWdpbkV2ZW50U3lzdGVtKFxuICAgICAgZG9tRXZlbnROYW1lLFxuICAgICAgZXZlbnRTeXN0ZW1GbGFncyxcbiAgICAgIG5hdGl2ZUV2ZW50LFxuICAgICAgdGFyZ2V0SW5zdCRqc2NvbXAkMCxcbiAgICAgIHRhcmdldENvbnRhaW5lclxuICAgICkge1xuICAgICAgdmFyIGFuY2VzdG9ySW5zdCA9IHRhcmdldEluc3QkanNjb21wJDA7XG4gICAgICBpZiAoXG4gICAgICAgIDAgPT09IChldmVudFN5c3RlbUZsYWdzICYgMSkgJiZcbiAgICAgICAgMCA9PT0gKGV2ZW50U3lzdGVtRmxhZ3MgJiAyKSAmJlxuICAgICAgICBudWxsICE9PSB0YXJnZXRJbnN0JGpzY29tcCQwXG4gICAgICApXG4gICAgICAgIGE6IGZvciAoOzspIHtcbiAgICAgICAgICBpZiAobnVsbCA9PT0gdGFyZ2V0SW5zdCRqc2NvbXAkMCkgcmV0dXJuO1xuICAgICAgICAgIHZhciBub2RlVGFnID0gdGFyZ2V0SW5zdCRqc2NvbXAkMC50YWc7XG4gICAgICAgICAgaWYgKDMgPT09IG5vZGVUYWcgfHwgNCA9PT0gbm9kZVRhZykge1xuICAgICAgICAgICAgdmFyIGNvbnRhaW5lciA9IHRhcmdldEluc3QkanNjb21wJDAuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgICBpZiAoY29udGFpbmVyID09PSB0YXJnZXRDb250YWluZXIpIGJyZWFrO1xuICAgICAgICAgICAgaWYgKDQgPT09IG5vZGVUYWcpXG4gICAgICAgICAgICAgIGZvciAobm9kZVRhZyA9IHRhcmdldEluc3QkanNjb21wJDAucmV0dXJuOyBudWxsICE9PSBub2RlVGFnOyApIHtcbiAgICAgICAgICAgICAgICB2Y
15852XIgZ3JhbmRUYWcgPSBub2RlVGFnLnRhZztcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAoMyA9PT0gZ3JhbmRUYWcgfHwgNCA9PT0gZ3JhbmRUYWcpICYmXG4gICAgICAgICAgICAgICAgICBub2RlVGFnLnN0YXRlTm9kZS5jb250YWluZXJJbmZvID09PSB0YXJnZXRDb250YWluZXJcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgbm9kZVRhZyA9IG5vZGVUYWcucmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKDsgbnVsbCAhPT0gY29udGFpbmVyOyApIHtcbiAgICAgICAgICAgICAgbm9kZVRhZyA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKGNvbnRhaW5lcik7XG4gICAgICAgICAgICAgIGlmIChudWxsID09PSBub2RlVGFnKSByZXR1cm47XG4gICAgICAgICAgICAgIGdyYW5kVGFnID0gbm9kZVRhZy50YWc7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICA1ID09PSBncmFuZFRhZyB8fFxuICAgICAgICAgICAgICAgIDYgPT09IGdyYW5kVGFnIHx8XG4gICAgICAgICAgICAgICAgMjYgPT09IGdyYW5kVGFnIHx8XG4gICAgICAgICAgICAgICAgMjcgPT09IGdyYW5kVGFnXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRhcmdldEluc3QkanNjb21wJDAgPSBhbmNlc3Rvckluc3QgPSBub2RlVGFnO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlIGE7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29udGFpbmVyID0gY29udGFpbmVyLnBhcmVudE5vZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRhcmdldEluc3QkanNjb21wJDAgPSB0YXJnZXRJbnN0JGpzY29tcCQwLnJldHVybjtcbiAgICAgICAgfVxuICAgICAgYmF0Y2hlZFVwZGF0ZXMkMShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0YXJnZXRJbnN0ID0gYW5jZXN0b3JJbnN0LFxuICAgICAgICAgIG5hdGl2ZUV2ZW50VGFyZ2V0ID0gZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpLFxuICAgICAgICAgIGRpc3BhdGNoUXVldWUgPSBbXTtcbiAgICAgICAgYToge1xuICAgICAgICAgIHZhciByZWFjdE5hbWUgPSB0b3BMZXZlbEV2ZW50c1RvUmVhY3ROYW1lcy5nZXQoZG9tRXZlbnROYW1lKTtcbiAgICAgICAgICBpZiAodm9pZCAwICE9PSByZWFjdE5hbWUpIHtcbiAgICAgICAgICAgIHZhciBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNFdmVudCxcbiAgICAgICAgICAgICAgcmVhY3RFdmVudFR5cGUgPSBkb21FdmVudE5hbWU7XG4gICAgICAgICAgICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgICAgICAgICAgICBjYXNlIFwia2V5cHJlc3NcIjpcbiAgICAgICAgICAgICAgICBpZiAoMCA9PT0gZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCkpIGJyZWFrIGE7XG4gICAgICAgICAgICAgIGNhc2UgXCJrZXlkb3duXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJrZXl1cFwiOlxuICAgICAgICAgICAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0tleWJvYXJkRXZlbnQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgXCJmb2N1c2luXCI6XG4gICAgICAgICAgICAgICAgcmVhY3RFdmVudFR5cGUgPSBcImZvY3VzXCI7XG4gICAgICAgICAgICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljRm9jdXNFdmVudDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBcImZvY3Vzb3V0XCI6XG4gICAgICAgICAgICAgICAgcmVhY3RFdmVudFR5cGUgPSBcImJsdXJcIjtcbiAgICAgICAgICAgICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNGb2N1c0V2ZW50O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIFwiYmVmb3JlYmx1clwiOlxuICAgICAgICAgICAgICBjYXNlIFwiYWZ0ZXJibHVyXCI6XG4gICAgICAgICAgICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljRm9jdXNFdmVudDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBcImNsaWNrXCI6XG4gICAgICAgICAgICAgICAgaWYgKDIgPT09IG5hdGl2ZUV2ZW50LmJ1dHRvbikgYnJlYWsgYTtcbiAgICAgICAgICAgICAgY2FzZSBcImF1eGNsaWNrXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJkYmxjbGlja1wiOlxuICAgICAgICAgICAgICBjYXNlIFwibW91c2Vkb3duXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJtb3VzZW1vdmVcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIm1vdXNldXBcIjpcbiAgICAgICAgICAgICAgY2FzZSBcIm1vdXNlb3V0XCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJtb3VzZW92ZXJcIjpcbiAgICAgICAgICAgICAgY2FzZSBcImNvbnRleHRtZW51XCI6XG4gICAgICAgICAgICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljTW91c2VFdmVudDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBcImRyYWdcIjpcbiAgICAgICAgICAgICAgY2FzZSBcImRyYWdlbmRcIjpcbiAgICAgICAgICAgICAgY2FzZSBcImRyYWdlbnRlclwiOlxuICAgICAgICAgICAgICBjYXNlIFwiZHJhZ2V4aXRcIjpcbiAgICAgICAgICAgICAgY2FzZSBcImRyYWdsZWF2ZVwiOlxuICAgICAgICAgICAgICBjYXNlIFwiZHJhZ292ZXJcIjpcbiAgICAgICAgICAgICAgY2FzZSBcImRyYWdzdGFydFwiOlxuICAgICAgICAgICAgICBjYXNlIFwiZHJvcFwiOlxuICAgICAgICAgICAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0RyYWdFdmVudDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBcInRvdWNoY2FuY2VsXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJ0b3VjaGVuZFwiOlxuICAgICAgICAgICAgICBjYXNlIFwidG91Y2htb3ZlXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJ0b3VjaHN0YXJ0XCI6XG4gICAgICAgICAgICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljVG91Y2hFdmVudDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBBTklNQVRJT05fRU5EOlxuICAgICAgICAgICAgICBjYXNlIEFOSU1BVElPTl9JVEVSQVRJT046XG4gICAgICAgICAgICAgIGNhc2UgQU5JTUFUSU9OX1NUQVJUOlxuICAgICAgICAgICAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIFRSQU5TSVRJT05fRU5EOlxuICAgICAgICAgICAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1RyYW5zaXRpb25FdmVudDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBcInNjcm9sbFwiOlxuICAgICAgICAgICAgICBjYXNlIFwic2Nyb2xsZW5kXCI6XG4gICAgICAgICAgICAgICAgU3ludGhldGljRXZlbn
15852RDdG9yID0gU3ludGhldGljVUlFdmVudDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBcIndoZWVsXCI6XG4gICAgICAgICAgICAgICAgU3ludGhldGljRXZlbnRDdG9yID0gU3ludGhldGljV2hlZWxFdmVudDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBcImNvcHlcIjpcbiAgICAgICAgICAgICAgY2FzZSBcImN1dFwiOlxuICAgICAgICAgICAgICBjYXNlIFwicGFzdGVcIjpcbiAgICAgICAgICAgICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNDbGlwYm9hcmRFdmVudDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBcImdvdHBvaW50ZXJjYXB0dXJlXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJsb3N0cG9pbnRlcmNhcHR1cmVcIjpcbiAgICAgICAgICAgICAgY2FzZSBcInBvaW50ZXJjYW5jZWxcIjpcbiAgICAgICAgICAgICAgY2FzZSBcInBvaW50ZXJkb3duXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJwb2ludGVybW92ZVwiOlxuICAgICAgICAgICAgICBjYXNlIFwicG9pbnRlcm91dFwiOlxuICAgICAgICAgICAgICBjYXNlIFwicG9pbnRlcm92ZXJcIjpcbiAgICAgICAgICAgICAgY2FzZSBcInBvaW50ZXJ1cFwiOlxuICAgICAgICAgICAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1BvaW50ZXJFdmVudDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBcInN1Ym1pdFwiOlxuICAgICAgICAgICAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciA9IFN5bnRoZXRpY1N1Ym1pdEV2ZW50O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIFwidG9nZ2xlXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJiZWZvcmV0b2dnbGVcIjpcbiAgICAgICAgICAgICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNUb2dnbGVFdmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBpbkNhcHR1cmVQaGFzZSA9IDAgIT09IChldmVudFN5c3RlbUZsYWdzICYgNCksXG4gICAgICAgICAgICAgIGFjY3VtdWxhdGVUYXJnZXRPbmx5ID1cbiAgICAgICAgICAgICAgICAhaW5DYXB0dXJlUGhhc2UgJiZcbiAgICAgICAgICAgICAgICAoXCJzY3JvbGxcIiA9PT0gZG9tRXZlbnROYW1lIHx8IFwic2Nyb2xsZW5kXCIgPT09IGRvbUV2ZW50TmFtZSksXG4gICAgICAgICAgICAgIHJlYWN0RXZlbnROYW1lID0gaW5DYXB0dXJlUGhhc2VcbiAgICAgICAgICAgICAgICA/IG51bGwgIT09IHJlYWN0TmFtZVxuICAgICAgICAgICAgICAgICAgPyByZWFjdE5hbWUgKyBcIkNhcHR1cmVcIlxuICAgICAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgICAgICAgOiByZWFjdE5hbWU7XG4gICAgICAgICAgICBpbkNhcHR1cmVQaGFzZSA9IFtdO1xuICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgdmFyIGluc3RhbmNlID0gdGFyZ2V0SW5zdCwgbGFzdEhvc3RDb21wb25lbnQ7XG4gICAgICAgICAgICAgIG51bGwgIT09IGluc3RhbmNlO1xuXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdmFyIF9pbnN0YW5jZTIgPSBpbnN0YW5jZTtcbiAgICAgICAgICAgICAgbGFzdEhvc3RDb21wb25lbnQgPSBfaW5zdGFuY2UyLnN0YXRlTm9kZTtcbiAgICAgICAgICAgICAgX2luc3RhbmNlMiA9IF9pbnN0YW5jZTIudGFnO1xuICAgICAgICAgICAgICAoNSAhPT0gX2luc3RhbmNlMiAmJiAyNiAhPT0gX2luc3RhbmNlMiAmJiAyNyAhPT0gX2luc3RhbmNlMikgfHxcbiAgICAgICAgICAgICAgICBudWxsID09PSBsYXN0SG9zdENvbXBvbmVudCB8fFxuICAgICAgICAgICAgICAgIG51bGwgPT09IHJlYWN0RXZlbnROYW1lIHx8XG4gICAgICAgICAgICAgICAgKChfaW5zdGFuY2UyID0gZ2V0TGlzdGVuZXIoaW5zdGFuY2UsIHJlYWN0RXZlbnROYW1lKSksXG4gICAgICAgICAgICAgICAgbnVsbCAhPSBfaW5zdGFuY2UyICYmXG4gICAgICAgICAgICAgICAgICBpbkNhcHR1cmVQaGFzZS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICBjcmVhdGVEaXNwYXRjaExpc3RlbmVyKFxuICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgICAgICAgICAgICAgIF9pbnN0YW5jZTIsXG4gICAgICAgICAgICAgICAgICAgICAgbGFzdEhvc3RDb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICAgIGlmIChhY2N1bXVsYXRlVGFyZ2V0T25seSkgYnJlYWs7XG4gICAgICAgICAgICAgIGluc3RhbmNlID0gaW5zdGFuY2UucmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgMCA8IGluQ2FwdHVyZVBoYXNlLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAoKHJlYWN0TmFtZSA9IG5ldyBTeW50aGV0aWNFdmVudEN0b3IoXG4gICAgICAgICAgICAgICAgcmVhY3ROYW1lLFxuICAgICAgICAgICAgICAgIHJlYWN0RXZlbnRUeXBlLFxuICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgbmF0aXZlRXZlbnQsXG4gICAgICAgICAgICAgICAgbmF0aXZlRXZlbnRUYXJnZXRcbiAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICAgICAgICAgICAgZXZlbnQ6IHJlYWN0TmFtZSxcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcnM6IGluQ2FwdHVyZVBoYXNlXG4gICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKDAgPT09IChldmVudFN5c3RlbUZsYWdzICYgNykpIHtcbiAgICAgICAgICBhOiB7XG4gICAgICAgICAgICBTeW50aGV0aWNFdmVudEN0b3IgPVxuICAgICAgICAgICAgICBcIm1vdXNlb3ZlclwiID09PSBkb21FdmVudE5hbWUgfHwgXCJwb2ludGVyb3ZlclwiID09PSBkb21FdmVudE5hbWU7XG4gICAgICAgICAgICByZWFjdE5hbWUgPVxuICAgICAgICAgICAgICBcIm1vdXNlb3V0XCIgPT09IGRvbUV2ZW50TmFtZSB8fCBcInBvaW50ZXJvdXRcIiA9PT0gZG9tRXZlbnROYW1lO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBTeW50aGV0aWNFdmVudEN0b3IgJiZcbiAgICAgICAgICAgICAgbmF0aXZlRXZlbnQgIT09IGN1cnJlbnRSZXBsYXlpbmdFdmVudCAmJlxuICAgICAgICAgICAgICAocmVhY3R
15852FdmVudFR5cGUgPVxuICAgICAgICAgICAgICAgIG5hdGl2ZUV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgbmF0aXZlRXZlbnQuZnJvbUVsZW1lbnQpICYmXG4gICAgICAgICAgICAgIChnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShyZWFjdEV2ZW50VHlwZSkgfHxcbiAgICAgICAgICAgICAgICByZWFjdEV2ZW50VHlwZVtpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5XSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgIGlmIChyZWFjdE5hbWUgfHwgU3ludGhldGljRXZlbnRDdG9yKSB7XG4gICAgICAgICAgICAgIHJlYWN0RXZlbnRUeXBlID1cbiAgICAgICAgICAgICAgICBuYXRpdmVFdmVudFRhcmdldC53aW5kb3cgPT09IG5hdGl2ZUV2ZW50VGFyZ2V0XG4gICAgICAgICAgICAgICAgICA/IG5hdGl2ZUV2ZW50VGFyZ2V0XG4gICAgICAgICAgICAgICAgICA6IChTeW50aGV0aWNFdmVudEN0b3IgPSBuYXRpdmVFdmVudFRhcmdldC5vd25lckRvY3VtZW50KVxuICAgICAgICAgICAgICAgICAgICA/IFN5bnRoZXRpY0V2ZW50Q3Rvci5kZWZhdWx0VmlldyB8fFxuICAgICAgICAgICAgICAgICAgICAgIFN5bnRoZXRpY0V2ZW50Q3Rvci5wYXJlbnRXaW5kb3dcbiAgICAgICAgICAgICAgICAgICAgOiB3aW5kb3c7XG4gICAgICAgICAgICAgIGlmIChyZWFjdE5hbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAoKFN5bnRoZXRpY0V2ZW50Q3RvciA9XG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZUV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgbmF0aXZlRXZlbnQudG9FbGVtZW50KSxcbiAgICAgICAgICAgICAgICAgIChyZWFjdE5hbWUgPSB0YXJnZXRJbnN0KSxcbiAgICAgICAgICAgICAgICAgIChTeW50aGV0aWNFdmVudEN0b3IgPSBTeW50aGV0aWNFdmVudEN0b3JcbiAgICAgICAgICAgICAgICAgICAgPyBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShTeW50aGV0aWNFdmVudEN0b3IpXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbCksXG4gICAgICAgICAgICAgICAgICBudWxsICE9PSBTeW50aGV0aWNFdmVudEN0b3IgJiZcbiAgICAgICAgICAgICAgICAgICAgKChhY2N1bXVsYXRlVGFyZ2V0T25seSA9XG4gICAgICAgICAgICAgICAgICAgICAgZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcihTeW50aGV0aWNFdmVudEN0b3IpKSxcbiAgICAgICAgICAgICAgICAgICAgKGluQ2FwdHVyZVBoYXNlID0gU3ludGhldGljRXZlbnRDdG9yLnRhZyksXG4gICAgICAgICAgICAgICAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvciAhPT0gYWNjdW11bGF0ZVRhcmdldE9ubHkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAoNSAhPT0gaW5DYXB0dXJlUGhhc2UgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIDI3ICE9PSBpbkNhcHR1cmVQaGFzZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgNiAhPT0gaW5DYXB0dXJlUGhhc2UpKSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICBTeW50aGV0aWNFdmVudEN0b3IgPSBudWxsO1xuICAgICAgICAgICAgICB9IGVsc2UgKHJlYWN0TmFtZSA9IG51bGwpLCAoU3ludGhldGljRXZlbnRDdG9yID0gdGFyZ2V0SW5zdCk7XG4gICAgICAgICAgICAgIGlmIChyZWFjdE5hbWUgIT09IFN5bnRoZXRpY0V2ZW50Q3Rvcikge1xuICAgICAgICAgICAgICAgIGluQ2FwdHVyZVBoYXNlID0gU3ludGhldGljTW91c2VFdmVudDtcbiAgICAgICAgICAgICAgICBfaW5zdGFuY2UyID0gXCJvbk1vdXNlTGVhdmVcIjtcbiAgICAgICAgICAgICAgICByZWFjdEV2ZW50TmFtZSA9IFwib25Nb3VzZUVudGVyXCI7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2UgPSBcIm1vdXNlXCI7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgXCJwb2ludGVyb3V0XCIgPT09IGRvbUV2ZW50TmFtZSB8fFxuICAgICAgICAgICAgICAgICAgXCJwb2ludGVyb3ZlclwiID09PSBkb21FdmVudE5hbWVcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAoaW5DYXB0dXJlUGhhc2UgPSBTeW50aGV0aWNQb2ludGVyRXZlbnQpLFxuICAgICAgICAgICAgICAgICAgICAoX2luc3RhbmNlMiA9IFwib25Qb2ludGVyTGVhdmVcIiksXG4gICAgICAgICAgICAgICAgICAgIChyZWFjdEV2ZW50TmFtZSA9IFwib25Qb2ludGVyRW50ZXJcIiksXG4gICAgICAgICAgICAgICAgICAgIChpbnN0YW5jZSA9IFwicG9pbnRlclwiKTtcbiAgICAgICAgICAgICAgICBhY2N1bXVsYXRlVGFyZ2V0T25seSA9XG4gICAgICAgICAgICAgICAgICBudWxsID09IHJlYWN0TmFtZVxuICAgICAgICAgICAgICAgICAgICA/IHJlYWN0RXZlbnRUeXBlXG4gICAgICAgICAgICAgICAgICAgIDogZ2V0Tm9kZUZyb21JbnN0YW5jZShyZWFjdE5hbWUpO1xuICAgICAgICAgICAgICAgIGxhc3RIb3N0Q29tcG9uZW50ID1cbiAgICAgICAgICAgICAgICAgIG51bGwgPT0gU3ludGhldGljRXZlbnRDdG9yXG4gICAgICAgICAgICAgICAgICAgID8gcmVhY3RFdmVudFR5cGVcbiAgICAgICAgICAgICAgICAgICAgOiBnZXROb2RlRnJvbUluc3RhbmNlKFN5bnRoZXRpY0V2ZW50Q3Rvcik7XG4gICAgICAgICAgICAgICAgcmVhY3RFdmVudFR5cGUgPSBuZXcgaW5DYXB0dXJlUGhhc2UoXG4gICAgICAgICAgICAgICAgICBfaW5zdGFuY2UyLFxuICAgICAgICAgICAgICAgICAgaW5zdGFuY2UgKyBcImxlYXZlXCIsXG4gICAgICAgICAgICAgICAgICByZWFjdE5hbWUsXG4gICAgICAgICAgICAgICAgICBuYXRpdmVFdmVudCxcbiAgICAgICAgICAgICAgICAgIG5hdGl2ZUV2ZW50VGFyZ2V0XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZWFjdEV2ZW50VHlwZS50YXJnZXQgPSBhY2N1bXVsYXRlVGFyZ2V0T25seTtcbiAgICAgICAgICAgICAgICByZWFjdEV2ZW50VHlwZS5yZWxhdGVkVGFyZ2V0ID0gbGFzdEhvc3RDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgX2luc3RhbmNlMiA9IG51bGw7XG4gICAgICAgICAgICAgICAgZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUobmF0aXZlRXZlbnRUYXJnZXQpID09PSB0YXJnZXRJbnN0ICYmXG4gICAgICAgICAgICAgICAgICAoKGluQ2FwdHVyZVBoYXNlID0gbmV3IGluQ2FwdHVyZVBoYXNlKFxuICAgICAgICAgICAgICAgICAgICByZWFjdEV2ZW50TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UgKyBcImVudGVyXCIsXG4gICAgICAgICAgICAgICAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvcixcbiAgICAgICAgICAgICAgICAgICAgbmF0aXZlRXZlbnQsXG4gICAgICAgICAgICAgICAgICAgIG5hdGl2ZUV2ZW50VGFyZ2V0XG4gICAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICAgIChpbkNhcHR1cmVQaGFzZS50YXJnZXQgPSBsYXN0SG9zdENvbXBvbmVudCksXG4gICAgICAgICAgICAgICAgICAoaW5DYXB0dXJlUGhhc2UucmVsYXRlZF
15852RhcmdldCA9IGFjY3VtdWxhdGVUYXJnZXRPbmx5KSxcbiAgICAgICAgICAgICAgICAgIChfaW5zdGFuY2UyID0gaW5DYXB0dXJlUGhhc2UpKTtcbiAgICAgICAgICAgICAgICBhY2N1bXVsYXRlVGFyZ2V0T25seSA9IF9pbnN0YW5jZTI7XG4gICAgICAgICAgICAgICAgaW5DYXB0dXJlUGhhc2UgPVxuICAgICAgICAgICAgICAgICAgcmVhY3ROYW1lICYmIFN5bnRoZXRpY0V2ZW50Q3RvclxuICAgICAgICAgICAgICAgICAgICA/IGdldExvd2VzdENvbW1vbkFuY2VzdG9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhY3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgU3ludGhldGljRXZlbnRDdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UGFyZW50XG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICAgICAgbnVsbCAhPT0gcmVhY3ROYW1lICYmXG4gICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlRW50ZXJMZWF2ZUxpc3RlbmVyc0ZvckV2ZW50KFxuICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaFF1ZXVlLFxuICAgICAgICAgICAgICAgICAgICByZWFjdEV2ZW50VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgcmVhY3ROYW1lLFxuICAgICAgICAgICAgICAgICAgICBpbkNhcHR1cmVQaGFzZSxcbiAgICAgICAgICAgICAgICAgICAgITFcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgbnVsbCAhPT0gU3ludGhldGljRXZlbnRDdG9yICYmXG4gICAgICAgICAgICAgICAgICBudWxsICE9PSBhY2N1bXVsYXRlVGFyZ2V0T25seSAmJlxuICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZUVudGVyTGVhdmVMaXN0ZW5lcnNGb3JFdmVudChcbiAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hRdWV1ZSxcbiAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZVRhcmdldE9ubHksXG4gICAgICAgICAgICAgICAgICAgIFN5bnRoZXRpY0V2ZW50Q3RvcixcbiAgICAgICAgICAgICAgICAgICAgaW5DYXB0dXJlUGhhc2UsXG4gICAgICAgICAgICAgICAgICAgICEwXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgIHJlYWN0TmFtZSA9IHRhcmdldEluc3QgPyBnZXROb2RlRnJvbUluc3RhbmNlKHRhcmdldEluc3QpIDogd2luZG93O1xuICAgICAgICAgICAgU3ludGhldGljRXZlbnRDdG9yID1cbiAgICAgICAgICAgICAgcmVhY3ROYW1lLm5vZGVOYW1lICYmIHJlYWN0TmFtZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBcInNlbGVjdFwiID09PSBTeW50aGV0aWNFdmVudEN0b3IgfHxcbiAgICAgICAgICAgICAgKFwiaW5wdXRcIiA9PT0gU3ludGhldGljRXZlbnRDdG9yICYmIFwiZmlsZVwiID09PSByZWFjdE5hbWUudHlwZSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgdmFyIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvckNoYW5nZUV2ZW50O1xuICAgICAgICAgICAgZWxzZSBpZiAoaXNUZXh0SW5wdXRFbGVtZW50KHJlYWN0TmFtZSkpXG4gICAgICAgICAgICAgIGlmIChpc0lucHV0RXZlbnRTdXBwb3J0ZWQpXG4gICAgICAgICAgICAgICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRPckNoYW5nZUV2ZW50O1xuICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JJbnB1dEV2ZW50UG9seWZpbGw7XG4gICAgICAgICAgICAgICAgdmFyIGhhbmRsZUV2ZW50RnVuYyA9IGhhbmRsZUV2ZW50c0ZvcklucHV0RXZlbnRQb2x5ZmlsbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAoU3ludGhldGljRXZlbnRDdG9yID0gcmVhY3ROYW1lLm5vZGVOYW1lKSxcbiAgICAgICAgICAgICAgICAhU3ludGhldGljRXZlbnRDdG9yIHx8XG4gICAgICAgICAgICAgICAgXCJpbnB1dFwiICE9PSBTeW50aGV0aWNFdmVudEN0b3IudG9Mb3dlckNhc2UoKSB8fFxuICAgICAgICAgICAgICAgIChcImNoZWNrYm94XCIgIT09IHJlYWN0TmFtZS50eXBlICYmIFwicmFkaW9cIiAhPT0gcmVhY3ROYW1lLnR5cGUpXG4gICAgICAgICAgICAgICAgICA/IHRhcmdldEluc3QgJiZcbiAgICAgICAgICAgICAgICAgICAgaXNDdXN0b21FbGVtZW50KHRhcmdldEluc3QuZWxlbWVudFR5cGUpICYmXG4gICAgICAgICAgICAgICAgICAgIChnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JDaGFuZ2VFdmVudClcbiAgICAgICAgICAgICAgICAgIDogKGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvckNsaWNrRXZlbnQpO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBnZXRUYXJnZXRJbnN0RnVuYyAmJlxuICAgICAgICAgICAgICAoZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0RnVuYyhkb21FdmVudE5hbWUsIHRhcmdldEluc3QpKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGNyZWF0ZUFuZEFjY3VtdWxhdGVDaGFuZ2VFdmVudChcbiAgICAgICAgICAgICAgICBkaXNwYXRjaFF1ZXVlLFxuICAgICAgICAgICAgICAgIGdldFRhcmdldEluc3RGdW5jLFxuICAgICAgICAgICAgICAgIG5hdGl2ZUV2ZW50LFxuICAgICAgICAgICAgICAgIG5hdGl2ZUV2ZW50VGFyZ2V0XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYW5kbGVFdmVudEZ1bmMgJiZcbiAgICAgICAgICAgICAgaGFuZGxlRXZlbnRGdW5jKGRvbUV2ZW50TmFtZSwgcmVhY3ROYW1lLCB0YXJnZXRJbnN0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGFuZGxlRXZlbnRGdW5jID0gdGFyZ2V0SW5zdFxuICAgICAgICAgICAgPyBnZXROb2RlRnJvbUluc3RhbmNlKHRhcmdldEluc3QpXG4gICAgICAgICAgICA6IHdpbmRvdztcbiAgICAgICAgICBzd2l0Y2ggKGRvbUV2ZW50TmFtZSkge1xuICAgICAgICAgICAgY2FzZSBcImZvY3VzaW5cIjpcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGlzVGV4dElucHV0RWxlbWVudChoYW5kbGVFdmVudEZ1bmMpIHx8XG4gICAgICAgICAgICAgICAgXCJ0cnVlXCIgPT09IGhhbmRsZUV2ZW50RnVuYy5jb250ZW50RWRpdGFibGVcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIChhY3RpdmVFbGVtZW50ID0gaGFuZGxlRXZlbnRGdW5jKSxcbiAgICAgICAgICAgICAgICAgIChhY3RpdmVFbGVtZW50SW5zdCA9IHRhcmdldEluc3QpLFxuICAgICAgICAgICAgICAgICAgKGxhc3RTZWxlY3Rpb24gPSBudWxsKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiZm9jdXNvdXRcIjpcbiAgICAgICAgICAgICAgbGFzdFNlbGVjdGlvbiA9IGFjdGl2ZUVsZW1lbnRJbnN0ID0gYWN0aXZlRWxlbWVudCA9IG51bGw7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm1vdXNlZG93blwiOlxuICAgICAgICAgICAgICBtb3VzZURvd24gPSAhMDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiY29udGV4dG1lbnVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJtb3VzZXVwXCI6XG4gICAgICAgICAgICBjYXNlIFwiZHJhZ2VuZFwiOlxuICAgICAgICAgICAgICBtb3VzZURvd24gPSAhMTtcbiAgICAgICAgICAgICAgY29uc3RydWN0U2VsZWN0RXZlbnQoXG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hRdWV1ZSxcbiAgICAgICAgICAgICAgICBuYXRpdmVFdmVudCxcbiAgICAgICAgICAgICAgICBuYXRpdmVFdmVudFRhcmdldFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJzZWxlY3Rpb25jaGFuZ2VcIjpcbiAgICAgICAgICAgICAgaWYgKHNraXBTZWxlY3Rpb25DaGFuZ2VFdmVudCkgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwia2V5ZG93blwiOlxuICAgICAgICAgICAgY2FzZSBcImtleXVwXCI6XG4gICAgICAgICAgICAgIGNvbnN0cnVjdFNlbGVjdEV2ZW50KFxuICAgICAgICAgICAgICAgIGRpc3BhdGNoUXVldWUsXG4gICAgICAgICAgICAgICAgbmF0aXZlRXZlbnQsXG4gICAgICAgICAgICAgICAgbmF0aXZlRXZlbnRUYXJnZXRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGZhbGxiYWNrRGF0YTtcbiAgICAgICAgICBpZiAoY2FuVXNlQ29tcG9zaXRpb25
15852FdmVudClcbiAgICAgICAgICAgIGI6IHtcbiAgICAgICAgICAgICAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwiY29tcG9zaXRpb25zdGFydFwiOlxuICAgICAgICAgICAgICAgICAgdmFyIGV2ZW50VHlwZSA9IFwib25Db21wb3NpdGlvblN0YXJ0XCI7XG4gICAgICAgICAgICAgICAgICBicmVhayBiO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJjb21wb3NpdGlvbmVuZFwiOlxuICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlID0gXCJvbkNvbXBvc2l0aW9uRW5kXCI7XG4gICAgICAgICAgICAgICAgICBicmVhayBiO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJjb21wb3NpdGlvbnVwZGF0ZVwiOlxuICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlID0gXCJvbkNvbXBvc2l0aW9uVXBkYXRlXCI7XG4gICAgICAgICAgICAgICAgICBicmVhayBiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGV2ZW50VHlwZSA9IHZvaWQgMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBpc0NvbXBvc2luZ1xuICAgICAgICAgICAgICA/IGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZChkb21FdmVudE5hbWUsIG5hdGl2ZUV2ZW50KSAmJlxuICAgICAgICAgICAgICAgIChldmVudFR5cGUgPSBcIm9uQ29tcG9zaXRpb25FbmRcIilcbiAgICAgICAgICAgICAgOiBcImtleWRvd25cIiA9PT0gZG9tRXZlbnROYW1lICYmXG4gICAgICAgICAgICAgICAgbmF0aXZlRXZlbnQua2V5Q29kZSA9PT0gU1RBUlRfS0VZQ09ERSAmJlxuICAgICAgICAgICAgICAgIChldmVudFR5cGUgPSBcIm9uQ29tcG9zaXRpb25TdGFydFwiKTtcbiAgICAgICAgICBldmVudFR5cGUgJiZcbiAgICAgICAgICAgICh1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSAmJlxuICAgICAgICAgICAgICBcImtvXCIgIT09IG5hdGl2ZUV2ZW50LmxvY2FsZSAmJlxuICAgICAgICAgICAgICAoaXNDb21wb3NpbmcgfHwgXCJvbkNvbXBvc2l0aW9uU3RhcnRcIiAhPT0gZXZlbnRUeXBlXG4gICAgICAgICAgICAgICAgPyBcIm9uQ29tcG9zaXRpb25FbmRcIiA9PT0gZXZlbnRUeXBlICYmXG4gICAgICAgICAgICAgICAgICBpc0NvbXBvc2luZyAmJlxuICAgICAgICAgICAgICAgICAgKGZhbGxiYWNrRGF0YSA9IGdldERhdGEoKSlcbiAgICAgICAgICAgICAgICA6ICgocm9vdCA9IG5hdGl2ZUV2ZW50VGFyZ2V0KSxcbiAgICAgICAgICAgICAgICAgIChzdGFydFRleHQgPSBcInZhbHVlXCIgaW4gcm9vdCA/IHJvb3QudmFsdWUgOiByb290LnRleHRDb250ZW50KSxcbiAgICAgICAgICAgICAgICAgIChpc0NvbXBvc2luZyA9ICEwKSkpLFxuICAgICAgICAgICAgKGhhbmRsZUV2ZW50RnVuYyA9IGFjY3VtdWxhdGVUd29QaGFzZUxpc3RlbmVycyhcbiAgICAgICAgICAgICAgdGFyZ2V0SW5zdCxcbiAgICAgICAgICAgICAgZXZlbnRUeXBlXG4gICAgICAgICAgICApKSxcbiAgICAgICAgICAgIDAgPCBoYW5kbGVFdmVudEZ1bmMubGVuZ3RoICYmXG4gICAgICAgICAgICAgICgoZXZlbnRUeXBlID0gbmV3IFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQoXG4gICAgICAgICAgICAgICAgZXZlbnRUeXBlLFxuICAgICAgICAgICAgICAgIGRvbUV2ZW50TmFtZSxcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgIG5hdGl2ZUV2ZW50LFxuICAgICAgICAgICAgICAgIG5hdGl2ZUV2ZW50VGFyZ2V0XG4gICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICBkaXNwYXRjaFF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgICAgIGV2ZW50OiBldmVudFR5cGUsXG4gICAgICAgICAgICAgICAgbGlzdGVuZXJzOiBoYW5kbGVFdmVudEZ1bmNcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIGZhbGxiYWNrRGF0YVxuICAgICAgICAgICAgICAgID8gKGV2ZW50VHlwZS5kYXRhID0gZmFsbGJhY2tEYXRhKVxuICAgICAgICAgICAgICAgIDogKChmYWxsYmFja0RhdGEgPSBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KSksXG4gICAgICAgICAgICAgICAgICBudWxsICE9PSBmYWxsYmFja0RhdGEgJiYgKGV2ZW50VHlwZS5kYXRhID0gZmFsbGJhY2tEYXRhKSkpKTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAoZmFsbGJhY2tEYXRhID0gY2FuVXNlVGV4dElucHV0RXZlbnRcbiAgICAgICAgICAgICAgPyBnZXROYXRpdmVCZWZvcmVJbnB1dENoYXJzKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpXG4gICAgICAgICAgICAgIDogZ2V0RmFsbGJhY2tCZWZvcmVJbnB1dENoYXJzKGRvbUV2ZW50TmFtZSwgbmF0aXZlRXZlbnQpKVxuICAgICAgICAgIClcbiAgICAgICAgICAgIChldmVudFR5cGUgPSBhY2N1bXVsYXRlVHdvUGhhc2VMaXN0ZW5lcnMoXG4gICAgICAgICAgICAgIHRhcmdldEluc3QsXG4gICAgICAgICAgICAgIFwib25CZWZvcmVJbnB1dFwiXG4gICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgMCA8IGV2ZW50VHlwZS5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAoKGhhbmRsZUV2ZW50RnVuYyA9IG5ldyBTeW50aGV0aWNJbnB1dEV2ZW50KFxuICAgICAgICAgICAgICAgICAgXCJvbkJlZm9yZUlucHV0XCIsXG4gICAgICAgICAgICAgICAgICBcImJlZm9yZWlucHV0XCIsXG4gICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgbmF0aXZlRXZlbnQsXG4gICAgICAgICAgICAgICAgICBuYXRpdmVFdmVudFRhcmdldFxuICAgICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICAgIGRpc3BhdGNoUXVldWUucHVzaCh7XG4gICAgICAgICAgICAgICAgICBldmVudDogaGFuZGxlRXZlbnRGdW5jLFxuICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzOiBldmVudFR5cGVcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAoaGFuZGxlRXZlbnRGdW5jLmRhdGEgPSBmYWxsYmFja0RhdGEpKTtcbiAgICAgICAgICBleHRyYWN0RXZlbnRzJDEoXG4gICAgICAgICAgICBkaXNwYXRjaFF1ZXVlLFxuICAgICAgICAgICAgZG9tRXZlbnROYW1lLFxuICAgICAgICAgICAgdGFyZ2V0SW5zdCxcbiAgICAgICAgICAgIG5hdGl2ZUV2ZW50LFxuICAgICAgICAgICAgbmF0aXZlRXZlbnRUYXJnZXRcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgI
15852HByb2Nlc3NEaXNwYXRjaFF1ZXVlKGRpc3BhdGNoUXVldWUsIGV2ZW50U3lzdGVtRmxhZ3MpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIoaW5zdGFuY2UsIGxpc3RlbmVyLCBjdXJyZW50VGFyZ2V0KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpbnN0YW5jZTogaW5zdGFuY2UsXG4gICAgICAgIGxpc3RlbmVyOiBsaXN0ZW5lcixcbiAgICAgICAgY3VycmVudFRhcmdldDogY3VycmVudFRhcmdldFxuICAgICAgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYWNjdW11bGF0ZVR3b1BoYXNlTGlzdGVuZXJzKHRhcmdldEZpYmVyLCByZWFjdE5hbWUpIHtcbiAgICAgIGZvciAoXG4gICAgICAgIHZhciBjYXB0dXJlTmFtZSA9IHJlYWN0TmFtZSArIFwiQ2FwdHVyZVwiLCBsaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgbnVsbCAhPT0gdGFyZ2V0RmliZXI7XG5cbiAgICAgICkge1xuICAgICAgICB2YXIgX2luc3RhbmNlMyA9IHRhcmdldEZpYmVyLFxuICAgICAgICAgIHN0YXRlTm9kZSA9IF9pbnN0YW5jZTMuc3RhdGVOb2RlO1xuICAgICAgICBfaW5zdGFuY2UzID0gX2luc3RhbmNlMy50YWc7XG4gICAgICAgICg1ICE9PSBfaW5zdGFuY2UzICYmIDI2ICE9PSBfaW5zdGFuY2UzICYmIDI3ICE9PSBfaW5zdGFuY2UzKSB8fFxuICAgICAgICAgIG51bGwgPT09IHN0YXRlTm9kZSB8fFxuICAgICAgICAgICgoX2luc3RhbmNlMyA9IGdldExpc3RlbmVyKHRhcmdldEZpYmVyLCBjYXB0dXJlTmFtZSkpLFxuICAgICAgICAgIG51bGwgIT0gX2luc3RhbmNlMyAmJlxuICAgICAgICAgICAgbGlzdGVuZXJzLnVuc2hpZnQoXG4gICAgICAgICAgICAgIGNyZWF0ZURpc3BhdGNoTGlzdGVuZXIodGFyZ2V0RmliZXIsIF9pbnN0YW5jZTMsIHN0YXRlTm9kZSlcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKF9pbnN0YW5jZTMgPSBnZXRMaXN0ZW5lcih0YXJnZXRGaWJlciwgcmVhY3ROYW1lKSksXG4gICAgICAgICAgbnVsbCAhPSBfaW5zdGFuY2UzICYmXG4gICAgICAgICAgICBsaXN0ZW5lcnMucHVzaChcbiAgICAgICAgICAgICAgY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcih0YXJnZXRGaWJlciwgX2luc3RhbmNlMywgc3RhdGVOb2RlKVxuICAgICAgICAgICAgKSk7XG4gICAgICAgIGlmICgzID09PSB0YXJnZXRGaWJlci50YWcpIHJldHVybiBsaXN0ZW5lcnM7XG4gICAgICAgIHRhcmdldEZpYmVyID0gdGFyZ2V0RmliZXIucmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRQYXJlbnQoaW5zdCkge1xuICAgICAgaWYgKG51bGwgPT09IGluc3QpIHJldHVybiBudWxsO1xuICAgICAgZG8gaW5zdCA9IGluc3QucmV0dXJuO1xuICAgICAgd2hpbGUgKGluc3QgJiYgNSAhPT0gaW5zdC50YWcgJiYgMjcgIT09IGluc3QudGFnKTtcbiAgICAgIHJldHVybiBpbnN0ID8gaW5zdCA6IG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFjY3VtdWxhdGVFbnRlckxlYXZlTGlzdGVuZXJzRm9yRXZlbnQoXG4gICAgICBkaXNwYXRjaFF1ZXVlLFxuICAgICAgZXZlbnQsXG4gICAgICB0YXJnZXQsXG4gICAgICBjb21tb24sXG4gICAgICBpbkNhcHR1cmVQaGFzZVxuICAgICkge1xuICAgICAgZm9yIChcbiAgICAgICAgdmFyIHJlZ2lzdHJhdGlvbk5hbWUgPSBldmVudC5fcmVhY3ROYW1lLCBsaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgbnVsbCAhPT0gdGFyZ2V0ICYmIHRhcmdldCAhPT0gY29tbW9uO1xuXG4gICAgICApIHtcbiAgICAgICAgdmFyIF9pbnN0YW5jZTQgPSB0YXJnZXQsXG4gICAgICAgICAgYWx0ZXJuYXRlID0gX2luc3RhbmNlNC5hbHRlcm5hdGUsXG4gICAgICAgICAgc3RhdGVOb2RlID0gX2luc3RhbmNlNC5zdGF0ZU5vZGU7XG4gICAgICAgIF9pbnN0YW5jZTQgPSBfaW5zdGFuY2U0LnRhZztcbiAgICAgICAgaWYgKG51bGwgIT09IGFsdGVybmF0ZSAmJiBhbHRlcm5hdGUgPT09IGNvbW1vbikgYnJlYWs7XG4gICAgICAgICg1ICE9PSBfaW5zdGFuY2U0ICYmIDI2ICE9PSBfaW5zdGFuY2U0ICYmIDI3ICE9PSBfaW5zdGFuY2U0KSB8fFxuICAgICAgICAgIG51bGwgPT09IHN0YXRlTm9kZSB8fFxuICAgICAgICAgICgoYWx0ZXJuYXRlID0gc3RhdGVOb2RlKSxcbiAgICAgICAgICBpbkNhcHR1cmVQaGFzZVxuICAgICAgICAgICAgPyAoKHN0YXRlTm9kZSA9IGdldExpc3RlbmVyKHRhcmdldCwgcmVnaXN0cmF0aW9uTmFtZSkpLFxuICAgICAgICAgICAgICBudWxsICE9IHN0YXRlTm9kZSAmJlxuICAgICAgICAgICAgICAgIGxpc3RlbmVycy51bnNoaWZ0KFxuICAgICAgICAgICAgICAgICAgY3JlYXRlRGlzcGF0Y2hMaXN0ZW5lcih0YXJnZXQsIHN0YXRlTm9kZSwgYWx0ZXJuYXRlKVxuICAgICAgICAgICAgICAgICkpXG4gICAgICAgICAgICA6IGluQ2FwdHVyZVBoYXNlIHx8XG4gICAgICAgICAgICAgICgoc3RhdGVOb2RlID0gZ2V0TGlzdGVuZXIodGFyZ2V0LCByZWdpc3RyYXRpb25OYW1lKSksXG4gICAgICAgICAgICAgIG51bGwgIT0gc3RhdGVOb2RlICYmXG4gICAgICAgICAgICAgICAgbGlzdGVuZXJzLnB1c2goXG4gICAgICAgICAgICAgICAgICBjcmVhdGVEaXNwYXRjaExpc3RlbmVyKHRhcmdldCwgc3RhdGVOb2RlLCBhbHRlcm5hdGUpXG4gICAgICAgICAgICAgICAgKSkpO1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQucmV0dXJuO1xuICAgICAgfVxuICAgICAgMCAhPT0gbGlzdGVuZXJzLmxlbmd0aCAmJlxuICAgICAgICBkaXNwYXRjaFF1ZXVlLnB1c2goeyBldmVudDogZXZlbnQsIGxpc3RlbmVyczogbGlzdGVuZXJzIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50KHR5cGUsIHByb3BzKSB7XG4gICAgICB2YWxpZGF0ZVByb3BlcnRpZXMkMih0eXBlLCBwcm9wcyk7XG4gICAgICAoXCJpbnB1dFwiICE9PSB0eXBlICYmIFwidGV4dGFyZWFcIiAhPT0gdHlwZSAmJiBcInNlbGVjdFwiICE9PSB0eXBlKSB8fFxuICAgICAgICBudWxsID09IHByb3BzIHx8XG4gICAgICAgIG51bGwgIT09IHByb3BzLnZhbHVlIHx8XG4gICAgICAgIGRpZFdhcm5WYWx1ZU51bGwgfHxcbiAgICAgICAgKChkaWRXYXJuVmFsdWVOdWxsID0gITApLFxuICAgICAgICBcInNlbGVjdFwiID09PSB0eXBlICYmIHByb3BzLm11bHRpcGxlXG4gICAgICAgICAgPyBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcImB2YWx1ZWAgcHJvcCBvbiBgJXNgIHNob3VsZCBub3QgYmUgbnVsbC4gQ29uc2lkZXIgdXNpbmcgYW4gZW1wdHkgYXJyYXkgd2hlbiBgbXVsdGlwbGVgIGlzIHNldCB0byBgdHJ1ZWAgdG8gY2xlYXIgdGhlIGNvbXBvbmVudCBvciBgdW5kZWZpbmVkYCBmb3IgdW5jb250cm9sbGVkIGNvbXBvbmVudHMuXCIsXG4gICAgICAgICAgICAgI
15852HR5cGVcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIFwiYHZhbHVlYCBwcm9wIG9uIGAlc2Agc2hvdWxkIG5vdCBiZSBudWxsLiBDb25zaWRlciB1c2luZyBhbiBlbXB0eSBzdHJpbmcgdG8gY2xlYXIgdGhlIGNvbXBvbmVudCBvciBgdW5kZWZpbmVkYCBmb3IgdW5jb250cm9sbGVkIGNvbXBvbmVudHMuXCIsXG4gICAgICAgICAgICAgIHR5cGVcbiAgICAgICAgICAgICkpO1xuICAgICAgdmFyIGV2ZW50UmVnaXN0cnkgPSB7XG4gICAgICAgIHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXM6IHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMsXG4gICAgICAgIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXM6IHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXNcbiAgICAgIH07XG4gICAgICBpc0N1c3RvbUVsZW1lbnQodHlwZSkgfHxcbiAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIHByb3BzLmlzIHx8XG4gICAgICAgIHdhcm5Vbmtub3duUHJvcGVydGllcyh0eXBlLCBwcm9wcywgZXZlbnRSZWdpc3RyeSk7XG4gICAgICBwcm9wcy5jb250ZW50RWRpdGFibGUgJiZcbiAgICAgICAgIXByb3BzLnN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyAmJlxuICAgICAgICBudWxsICE9IHByb3BzLmNoaWxkcmVuICYmXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJBIGNvbXBvbmVudCBpcyBgY29udGVudEVkaXRhYmxlYCBhbmQgY29udGFpbnMgYGNoaWxkcmVuYCBtYW5hZ2VkIGJ5IFJlYWN0LiBJdCBpcyBub3cgeW91ciByZXNwb25zaWJpbGl0eSB0byBndWFyYW50ZWUgdGhhdCBub25lIG9mIHRob3NlIG5vZGVzIGFyZSB1bmV4cGVjdGVkbHkgbW9kaWZpZWQgb3IgZHVwbGljYXRlZC4gVGhpcyBpcyBwcm9iYWJseSBub3QgaW50ZW50aW9uYWwuXCJcbiAgICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gd2FybkZvclByb3BEaWZmZXJlbmNlKFxuICAgICAgcHJvcE5hbWUsXG4gICAgICBzZXJ2ZXJWYWx1ZSxcbiAgICAgIGNsaWVudFZhbHVlLFxuICAgICAgc2VydmVyRGlmZmVyZW5jZXNcbiAgICApIHtcbiAgICAgIHNlcnZlclZhbHVlICE9PSBjbGllbnRWYWx1ZSAmJlxuICAgICAgICAoKGNsaWVudFZhbHVlID0gbm9ybWFsaXplTWFya3VwRm9yVGV4dE9yQXR0cmlidXRlKGNsaWVudFZhbHVlKSksXG4gICAgICAgIG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShzZXJ2ZXJWYWx1ZSkgIT09IGNsaWVudFZhbHVlICYmXG4gICAgICAgICAgKHNlcnZlckRpZmZlcmVuY2VzW3Byb3BOYW1lXSA9IHNlcnZlclZhbHVlKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhhc1ZpZXdUcmFuc2l0aW9uKGh0bWxFbGVtZW50KSB7XG4gICAgICByZXR1cm4gISEoXG4gICAgICAgIGh0bWxFbGVtZW50LmdldEF0dHJpYnV0ZShcInZ0LXNoYXJlXCIpIHx8XG4gICAgICAgIGh0bWxFbGVtZW50LmdldEF0dHJpYnV0ZShcInZ0LWV4aXRcIikgfHxcbiAgICAgICAgaHRtbEVsZW1lbnQuZ2V0QXR0cmlidXRlKFwidnQtZW50ZXJcIikgfHxcbiAgICAgICAgaHRtbEVsZW1lbnQuZ2V0QXR0cmlidXRlKFwidnQtdXBkYXRlXCIpXG4gICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0V4cGVjdGVkVmlld1RyYW5zaXRpb25OYW1lKGh0bWxFbGVtZW50KSB7XG4gICAgICBpZiAoIWhhc1ZpZXdUcmFuc2l0aW9uKGh0bWxFbGVtZW50KSkgcmV0dXJuICExO1xuICAgICAgdmFyIGV4cGVjdGVkVnROYW1lID0gaHRtbEVsZW1lbnQuZ2V0QXR0cmlidXRlKFwidnQtbmFtZVwiKTtcbiAgICAgIGh0bWxFbGVtZW50ID0gaHRtbEVsZW1lbnQuc3R5bGVbXCJ2aWV3LXRyYW5zaXRpb24tbmFtZVwiXTtcbiAgICAgIHJldHVybiBleHBlY3RlZFZ0TmFtZVxuICAgICAgICA/IGV4cGVjdGVkVnROYW1lID09PSBodG1sRWxlbWVudFxuICAgICAgICA6IGh0bWxFbGVtZW50LnN0YXJ0c1dpdGgoXCJfVF9cIik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHdhcm5Gb3JFeHRyYUF0dHJpYnV0ZXMoXG4gICAgICBkb21FbGVtZW50LFxuICAgICAgYXR0cmlidXRlTmFtZXMsXG4gICAgICBzZXJ2ZXJEaWZmZXJlbmNlc1xuICAgICkge1xuICAgICAgYXR0cmlidXRlTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkge1xuICAgICAgICBcInN0eWxlXCIgPT09IGF0dHJpYnV0ZU5hbWVcbiAgICAgICAgICA/IFwiXCIgIT09IGRvbUVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpICYmXG4gICAgICAgICAgICAoKGF0dHJpYnV0ZU5hbWUgPSBkb21FbGVtZW50LnN0eWxlKSxcbiAgICAgICAgICAgICgoKDEgPT09IGF0dHJpYnV0ZU5hbWUubGVuZ3RoICYmXG4gICAgICAgICAgICAgIFwidmlldy10cmFuc2l0aW9uLW5hbWVcIiA9PT0gYXR0cmlidXRlTmFtZVswXSkgfHxcbiAgICAgICAgICAgICAgKDIgPT09IGF0dHJpYnV0ZU5hbWUubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgXCJ2aWV3LXRyYW5zaXRpb24tY2xhc3NcIiA9PT0gYXR0cmlidXRlTmFtZVswXSAmJlxuICAgICAgICAgICAgICAgIFwidmlldy10cmFuc2l0aW9uLW5hbWVcIiA9PT0gYXR0cmlidXRlTmFtZVsxXSkpICYmXG4gICAgICAgICAgICAgIGlzRXhwZWN0ZWRWaWV3VHJhbnNpdGlvbk5hbWUoZG9tRWxlbWVudCkpIHx8XG4gICAgICAgICAgICAgIChzZXJ2ZXJEaWZmZXJlbmNlcy5zdHlsZSA9XG4gICAgICAgICAgICAgICAgZ2V0U3R5bGVzT2JqZWN0RnJvbUVsZW1lbnQoZG9tRWxlbWVudCkpKVxuICAgICAgICAgIDogKHNlcnZlckRpZmZlcmVuY2VzW2dldFByb3BOYW1lRnJvbUF0dHJpYnV0ZU5hbWUoYXR0cmlidXRlTmFtZSldID1cbiAgICAgICAgICAgICAgZG9tRWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcihyZWdpc3RyYXRpb25OYW1lLCBsaXN0ZW5lcikge1xuICAgICAgITEgPT09IGxpc3RlbmVyXG4gICAgICAgID8gY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiRXhwZWN0ZWQgYCVzYCBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLCBpbnN0ZWFkIGdvdCBgZmFsc2VgLlxcblxcbklmIHlvdSB1c2VkIHRvIGNvbmRpdGlvbmFsbHkgb21pdCBpdCB3aXRoICVzPXtjb25kaXRpb24gJiYgdmFsdWV9LCBwYXNzICVzPXtjb25kaXRpb24gPyB2YWx1ZSA6IHVuZGVmaW5lZH0gaW5zdGVhZC5cIixcbiAgICAgICAgICAgI
15852HJlZ2lzdHJhdGlvbk5hbWUsXG4gICAgICAgICAgICByZWdpc3RyYXRpb25OYW1lLFxuICAgICAgICAgICAgcmVnaXN0cmF0aW9uTmFtZVxuICAgICAgICAgIClcbiAgICAgICAgOiBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJFeHBlY3RlZCBgJXNgIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24sIGluc3RlYWQgZ290IGEgdmFsdWUgb2YgYCVzYCB0eXBlLlwiLFxuICAgICAgICAgICAgcmVnaXN0cmF0aW9uTmFtZSxcbiAgICAgICAgICAgIHR5cGVvZiBsaXN0ZW5lclxuICAgICAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZUhUTUwocGFyZW50LCBodG1sKSB7XG4gICAgICBwYXJlbnQgPVxuICAgICAgICBwYXJlbnQubmFtZXNwYWNlVVJJID09PSBNQVRIX05BTUVTUEFDRSB8fFxuICAgICAgICBwYXJlbnQubmFtZXNwYWNlVVJJID09PSBTVkdfTkFNRVNQQUNFXG4gICAgICAgICAgPyBwYXJlbnQub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXG4gICAgICAgICAgICAgIHBhcmVudC5uYW1lc3BhY2VVUkksXG4gICAgICAgICAgICAgIHBhcmVudC50YWdOYW1lXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBwYXJlbnQub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KHBhcmVudC50YWdOYW1lKTtcbiAgICAgIHBhcmVudC5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgcmV0dXJuIHBhcmVudC5pbm5lckhUTUw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShtYXJrdXApIHtcbiAgICAgIHdpbGxDb2VyY2lvblRocm93KG1hcmt1cCkgJiZcbiAgICAgICAgKGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJUaGUgcHJvdmlkZWQgSFRNTCBtYXJrdXAgdXNlcyBhIHZhbHVlIG9mIHVuc3VwcG9ydGVkIHR5cGUgJXMuIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSB1c2luZyBpdCBoZXJlLlwiLFxuICAgICAgICAgIHR5cGVOYW1lKG1hcmt1cClcbiAgICAgICAgKSxcbiAgICAgICAgdGVzdFN0cmluZ0NvZXJjaW9uKG1hcmt1cCkpO1xuICAgICAgcmV0dXJuIChcInN0cmluZ1wiID09PSB0eXBlb2YgbWFya3VwID8gbWFya3VwIDogXCJcIiArIG1hcmt1cClcbiAgICAgICAgLnJlcGxhY2UoTk9STUFMSVpFX05FV0xJTkVTX1JFR0VYLCBcIlxcblwiKVxuICAgICAgICAucmVwbGFjZShOT1JNQUxJWkVfTlVMTF9BTkRfUkVQTEFDRU1FTlRfUkVHRVgsIFwiXCIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja0ZvclVubWF0Y2hlZFRleHQoc2VydmVyVGV4dCwgY2xpZW50VGV4dCkge1xuICAgICAgY2xpZW50VGV4dCA9IG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZShjbGllbnRUZXh0KTtcbiAgICAgIHJldHVybiBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUoc2VydmVyVGV4dCkgPT09IGNsaWVudFRleHRcbiAgICAgICAgPyAhMFxuICAgICAgICA6ICExO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzZXRQcm9wKGRvbUVsZW1lbnQsIHRhZywga2V5LCB2YWx1ZSwgcHJvcHMsIHByZXZWYWx1ZSkge1xuICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSBcImNoaWxkcmVuXCI6XG4gICAgICAgICAgaWYgKFwic3RyaW5nXCIgPT09IHR5cGVvZiB2YWx1ZSlcbiAgICAgICAgICAgIHZhbGlkYXRlVGV4dE5lc3RpbmcodmFsdWUsIHRhZywgITEpLFxuICAgICAgICAgICAgICBcImJvZHlcIiA9PT0gdGFnIHx8XG4gICAgICAgICAgICAgICAgKFwidGV4dGFyZWFcIiA9PT0gdGFnICYmIFwiXCIgPT09IHZhbHVlKSB8fFxuICAgICAgICAgICAgICAgIHNldFRleHRDb250ZW50KGRvbUVsZW1lbnQsIHZhbHVlKTtcbiAgICAgICAgICBlbHNlIGlmIChcIm51bWJlclwiID09PSB0eXBlb2YgdmFsdWUgfHwgXCJiaWdpbnRcIiA9PT0gdHlwZW9mIHZhbHVlKVxuICAgICAgICAgICAgdmFsaWRhdGVUZXh0TmVzdGluZyhcIlwiICsgdmFsdWUsIHRhZywgITEpLFxuICAgICAgICAgICAgICBcImJvZHlcIiAhPT0gdGFnICYmIHNldFRleHRDb250ZW50KGRvbUVsZW1lbnQsIFwiXCIgKyB2YWx1ZSk7XG4gICAgICAgICAgZWxzZSByZXR1cm47XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJjbGFzc05hbWVcIjpcbiAgICAgICAgICBzZXRWYWx1ZUZvcktub3duQXR0cmlidXRlKGRvbUVsZW1lbnQsIFwiY2xhc3NcIiwgdmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwidGFiSW5kZXhcIjpcbiAgICAgICAgICBzZXRWYWx1ZUZvcktub3duQXR0cmlidXRlKGRvbUVsZW1lbnQsIFwidGFiaW5kZXhcIiwgdmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZGlyXCI6XG4gICAgICAgIGNhc2UgXCJyb2xlXCI6XG4gICAgICAgIGNhc2UgXCJ2aWV3Qm94XCI6XG4gICAgICAgIGNhc2UgXCJ3aWR0aFwiOlxuICAgICAgICBjYXNlIFwiaGVpZ2h0XCI6XG4gICAgICAgICAgc2V0VmFsdWVGb3JLbm93bkF0dHJpYnV0ZShkb21FbGVtZW50LCBrZXksIHZhbHVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInN0eWxlXCI6XG4gICAgICAgICAgc2V0VmFsdWVGb3JTdHlsZXMoZG9tRWxlbWVudCwgdmFsdWUsIHByZXZWYWx1ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjYXNlIFwiZGF0YVwiOlxuICAgICAgICAgIGlmIChcIm9iamVjdFwiICE9PSB0YWcpIHtcbiAgICAgICAgICAgIHNldFZhbHVlRm9yS25vd25BdHRyaWJ1dGUoZG9tRWxlbWVudCwgXCJkYXRhXCIsIHZhbHVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSBcInNyY1wiOlxuICAgICAgICBjYXNlIFwiaHJlZlwiOlxuICAgICAgICAgIGlmIChcIlwiID09PSB2YWx1ZSAmJiAoXCJhXCIgIT09IHRhZyB8fCBcImhyZWZcIiAhPT0ga2V5KSkge1xuICAgICAgICAgICAgXCJzcmNcIiA9PT0ga2V5XG4gICAgICAgICAgICAgID8gY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICdBbiBlbXB0eSBzdHJpbmcgKFwiXCIpIHdhcyBwYXNzZWQgdG8gdGhlICVzIGF0dHJpYnV0ZS4gVGhpcyBtYXkgY2F1c2UgdGhlIGJyb3dzZXIgdG8gZG93bmxvYWQgdGhlIHdob2xlI
15852HBhZ2UgYWdhaW4gb3ZlciB0aGUgbmV0d29yay4gVG8gZml4IHRoaXMsIGVpdGhlciBkbyBub3QgcmVuZGVyIHRoZSBlbGVtZW50IGF0IGFsbCBvciBwYXNzIG51bGwgdG8gJXMgaW5zdGVhZCBvZiBhbiBlbXB0eSBzdHJpbmcuJyxcbiAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgIGtleVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgJ0FuIGVtcHR5IHN0cmluZyAoXCJcIikgd2FzIHBhc3NlZCB0byB0aGUgJXMgYXR0cmlidXRlLiBUbyBmaXggdGhpcywgZWl0aGVyIGRvIG5vdCByZW5kZXIgdGhlIGVsZW1lbnQgYXQgYWxsIG9yIHBhc3MgbnVsbCB0byAlcyBpbnN0ZWFkIG9mIGFuIGVtcHR5IHN0cmluZy4nLFxuICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAga2V5XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGRvbUVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGtleSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgbnVsbCA9PSB2YWx1ZSB8fFxuICAgICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgdmFsdWUgfHxcbiAgICAgICAgICAgIFwic3ltYm9sXCIgPT09IHR5cGVvZiB2YWx1ZSB8fFxuICAgICAgICAgICAgXCJib29sZWFuXCIgPT09IHR5cGVvZiB2YWx1ZVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZG9tRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoa2V5KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBrZXkpO1xuICAgICAgICAgIHZhbHVlID0gc2FuaXRpemVVUkwodmFsdWUpO1xuICAgICAgICAgIGRvbUVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYWN0aW9uXCI6XG4gICAgICAgIGNhc2UgXCJmb3JtQWN0aW9uXCI6XG4gICAgICAgICAgbnVsbCAhPSB2YWx1ZSAmJlxuICAgICAgICAgICAgKFwiZm9ybVwiID09PSB0YWdcbiAgICAgICAgICAgICAgPyBcImZvcm1BY3Rpb25cIiA9PT0ga2V5XG4gICAgICAgICAgICAgICAgPyBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIllvdSBjYW4gb25seSBwYXNzIHRoZSBmb3JtQWN0aW9uIHByb3AgdG8gPGlucHV0PiBvciA8YnV0dG9uPi4gVXNlIHRoZSBhY3Rpb24gcHJvcCBvbiA8Zm9ybT4uXCJcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA6IFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHZhbHVlICYmXG4gICAgICAgICAgICAgICAgICAoKG51bGwgPT0gcHJvcHMuZW5jVHlwZSAmJiBudWxsID09IHByb3BzLm1ldGhvZCkgfHxcbiAgICAgICAgICAgICAgICAgICAgZGlkV2FybkZvcm1BY3Rpb25NZXRob2QgfHxcbiAgICAgICAgICAgICAgICAgICAgKChkaWRXYXJuRm9ybUFjdGlvbk1ldGhvZCA9ICEwKSxcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICBcIkNhbm5vdCBzcGVjaWZ5IGEgZW5jVHlwZSBvciBtZXRob2QgZm9yIGEgZm9ybSB0aGF0IHNwZWNpZmllcyBhIGZ1bmN0aW9uIGFzIHRoZSBhY3Rpb24uIFJlYWN0IHByb3ZpZGVzIHRob3NlIGF1dG9tYXRpY2FsbHkuIFRoZXkgd2lsbCBnZXQgb3ZlcnJpZGRlbi5cIlxuICAgICAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICAgIG51bGwgPT0gcHJvcHMudGFyZ2V0IHx8XG4gICAgICAgICAgICAgICAgICAgIGRpZFdhcm5Gb3JtQWN0aW9uVGFyZ2V0IHx8XG4gICAgICAgICAgICAgICAgICAgICgoZGlkV2FybkZvcm1BY3Rpb25UYXJnZXQgPSAhMCksXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgXCJDYW5ub3Qgc3BlY2lmeSBhIHRhcmdldCBmb3IgYSBmb3JtIHRoYXQgc3BlY2lmaWVzIGEgZnVuY3Rpb24gYXMgdGhlIGFjdGlvbi4gVGhlIGZ1bmN0aW9uIHdpbGwgYWx3YXlzIGJlIGV4ZWN1dGVkIGluIHRoZSBzYW1lIHdpbmRvdy5cIlxuICAgICAgICAgICAgICAgICAgICApKSlcbiAgICAgICAgICAgICAgOiBcImlucHV0XCIgPT09IHRhZyB8fCBcImJ1dHRvblwiID09PSB0YWdcbiAgICAgICAgICAgICAgICA/IFwiYWN0aW9uXCIgPT09IGtleVxuICAgICAgICAgICAgICAgICAgPyBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgIFwiWW91IGNhbiBvbmx5IHBhc3MgdGhlIGFjdGlvbiBwcm9wIHRvIDxmb3JtPi4gVXNlIHRoZSBmb3JtQWN0aW9uIHByb3Agb24gPGlucHV0PiBvciA8YnV0dG9uPi5cIlxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICA6IFwiaW5wdXRcIiAhPT0gdGFnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgXCJzdWJtaXRcIiA9PT0gcHJvcHMudHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICAgIFwiaW1hZ2VcIiA9PT0gcHJvcHMudHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICAgIGRpZFdhcm5Gb3JtQWN0aW9uVHlwZVxuICAgICAgICAgICAgICAgICAgICA/IFwiYnV0dG9uXCIgIT09IHRhZyB8fFxuICAgICAgICAgICAgICAgICAgICAgIG51bGwgPT0gcHJvcHMudHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICAgIFwic3VibWl0XCIgPT09IHByb3BzLnR5cGUgfHxcbiAgICAgICAgICAgICAgICAgICAgICBkaWRXYXJuRm9ybUFjdGlvblR5cGVcbiAgICAgICAgICAgICAgICAgICAgICA/IFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHZhbHVlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSBwcm9wcy5uYW1lIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRpZFdhcm5Gb3JtQWN0aW9uTmFtZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoKGRpZFdhcm5Gb3JtQWN0aW9uTmFtZSA9ICEwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ2Fubm90IHNwZWNpZnkgYSBcIm5hbWVcIiBwcm9wIGZvciBhIGJ1dHRvbiB0aGF0IHNwZWNpZmllcyBhIGZ1bmN0aW9uIGFzIGEgZm9ybUFjdGlvbi4gUmVhY3QgbmVlZHMgaXQgdG8gZW5jb2RlIHdoaWNoIGFjdGlvbiBzaG91bGQgYmUgaW52b2tlZC4gSXQgd2lsbCBnZXQgb3ZlcnJpZGRlbi4nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKG51bGwgPT0gcHJvcHMuZm9ybUVuY1R5cGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCA9PSBwcm9wcy5mb3JtTWV0aG9kKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkaWRXYXJuRm9ybUFjdGlvbk1ldGhvZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoKGRpZFdhcm5Gb3JtQWN0aW9uTWV0aG9kID0gITApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiQ2Fubm90IHNwZWNpZnkgYSBmb3JtRW5jVHlwZSBvciBmb3JtTWV0aG9kIGZvciBhIGJ1dHRvbiB0aGF0IHNwZWNpZmllcyBhIGZ1bmN0aW9uIGFzIGEgZm9ybUFjdGlvbi4gUmVhY3QgcHJvdmlkZXMgdGhvc2UgYXV0b21hdGljYWxseS4gVGhleSB3aWxsIGdldCBvdmVycmlkZGVuLlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCA9PSBwcm9wcy5mb3JtVGFyZ2V0IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRpZFdhcm5Gb3JtQWN0aW9uVGFyZ2V0IHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICgoZGlkV2Fyb
15852kZvcm1BY3Rpb25UYXJnZXQgPSAhMCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJDYW5ub3Qgc3BlY2lmeSBhIGZvcm1UYXJnZXQgZm9yIGEgYnV0dG9uIHRoYXQgc3BlY2lmaWVzIGEgZnVuY3Rpb24gYXMgYSBmb3JtQWN0aW9uLiBUaGUgZnVuY3Rpb24gd2lsbCBhbHdheXMgYmUgZXhlY3V0ZWQgaW4gdGhlIHNhbWUgd2luZG93LlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICkpKVxuICAgICAgICAgICAgICAgICAgICAgIDogKChkaWRXYXJuRm9ybUFjdGlvblR5cGUgPSAhMCksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnQSBidXR0b24gY2FuIG9ubHkgc3BlY2lmeSBhIGZvcm1BY3Rpb24gYWxvbmcgd2l0aCB0eXBlPVwic3VibWl0XCIgb3Igbm8gdHlwZS4nXG4gICAgICAgICAgICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgICAgICAgICA6ICgoZGlkV2FybkZvcm1BY3Rpb25UeXBlID0gITApLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAnQW4gaW5wdXQgY2FuIG9ubHkgc3BlY2lmeSBhIGZvcm1BY3Rpb24gYWxvbmcgd2l0aCB0eXBlPVwic3VibWl0XCIgb3IgdHlwZT1cImltYWdlXCIuJ1xuICAgICAgICAgICAgICAgICAgICAgICkpXG4gICAgICAgICAgICAgICAgOiBcImFjdGlvblwiID09PSBrZXlcbiAgICAgICAgICAgICAgICAgID8gY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICBcIllvdSBjYW4gb25seSBwYXNzIHRoZSBhY3Rpb24gcHJvcCB0byA8Zm9ybT4uXCJcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgOiBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgIFwiWW91IGNhbiBvbmx5IHBhc3MgdGhlIGZvcm1BY3Rpb24gcHJvcCB0byA8aW5wdXQ+IG9yIDxidXR0b24+LlwiXG4gICAgICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICAgICAgZG9tRWxlbWVudC5zZXRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgXCJqYXZhc2NyaXB0OnRocm93IG5ldyBFcnJvcignQSBSZWFjdCBmb3JtIHdhcyB1bmV4cGVjdGVkbHkgc3VibWl0dGVkLiBJZiB5b3UgY2FsbGVkIGZvcm0uc3VibWl0KCkgbWFudWFsbHksIGNvbnNpZGVyIHVzaW5nIGZvcm0ucmVxdWVzdFN1Ym1pdCgpIGluc3RlYWQuIElmIHlvdVxcXFwncmUgdHJ5aW5nIHRvIHVzZSBldmVudC5zdG9wUHJvcGFnYXRpb24oKSBpbiBhIHN1Ym1pdCBldmVudCBoYW5kbGVyLCBjb25zaWRlciBhbHNvIGNhbGxpbmcgZXZlbnQucHJldmVudERlZmF1bHQoKS4nKVwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBwcmV2VmFsdWUgJiZcbiAgICAgICAgICAgICAgKFwiZm9ybUFjdGlvblwiID09PSBrZXlcbiAgICAgICAgICAgICAgICA/IChcImlucHV0XCIgIT09IHRhZyAmJlxuICAgICAgICAgICAgICAgICAgICBzZXRQcm9wKGRvbUVsZW1lbnQsIHRhZywgXCJuYW1lXCIsIHByb3BzLm5hbWUsIHByb3BzLCBudWxsKSxcbiAgICAgICAgICAgICAgICAgIHNldFByb3AoXG4gICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHRhZyxcbiAgICAgICAgICAgICAgICAgICAgXCJmb3JtRW5jVHlwZVwiLFxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5mb3JtRW5jVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIG51bGxcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICBzZXRQcm9wKFxuICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgICAgICAgIFwiZm9ybU1ldGhvZFwiLFxuICAgICAgICAgICAgICAgICAgICBwcm9wcy5mb3JtTWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIHNldFByb3AoXG4gICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHRhZyxcbiAgICAgICAgICAgICAgICAgICAgXCJmb3JtVGFyZ2V0XCIsXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLmZvcm1UYXJnZXQsXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgICAgIDogKHNldFByb3AoXG4gICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHRhZyxcbiAgICAgICAgICAgICAgICAgICAgXCJlbmNUeXBlXCIsXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLmVuY1R5cGUsXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgc2V0UHJvcChkb21FbGVtZW50LCB0YWcsIFwibWV0aG9kXCIsIHByb3BzLm1ldGhvZCwgcHJvcHMsIG51bGwpLFxuICAgICAgICAgICAgICAgICAgc2V0UHJvcChcbiAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICAgICAgICBcInRhcmdldFwiLFxuICAgICAgICAgICAgICAgICAgICBwcm9wcy50YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICAgICAgICApKSk7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgbnVsbCA9PSB2YWx1ZSB8fFxuICAgICAgICAgICAgXCJzeW1ib2xcIiA9PT0gdHlwZW9mIHZhbHVlIHx8XG4gICAgICAgICAgICBcImJvb2xlYW5cIiA9PT0gdHlwZW9mIHZhbHVlXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBkb21FbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24odmFsdWUsIGtleSk7XG4gICAgICAgICAgdmFsdWUgPSBzYW5pdGl6ZVVSTCh2YWx1ZSk7XG4gICAgICAgICAgZG9tRWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJvbkNsaWNrXCI6XG4gICAgICAgICAgbnVsbCAhPSB2YWx1ZSAmJlxuICAgICAgICAgICAgKFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIHZhbHVlICYmXG4gICAgICAgICAgICAgI
15852Hdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcihrZXksIHZhbHVlKSxcbiAgICAgICAgICAgIChkb21FbGVtZW50Lm9uY2xpY2sgPSBub29wJDEpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgXCJvblNjcm9sbFwiOlxuICAgICAgICAgIG51bGwgIT0gdmFsdWUgJiZcbiAgICAgICAgICAgIChcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiB2YWx1ZSAmJlxuICAgICAgICAgICAgICB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXIoa2V5LCB2YWx1ZSksXG4gICAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KFwic2Nyb2xsXCIsIGRvbUVsZW1lbnQpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgXCJvblNjcm9sbEVuZFwiOlxuICAgICAgICAgIG51bGwgIT0gdmFsdWUgJiZcbiAgICAgICAgICAgIChcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiB2YWx1ZSAmJlxuICAgICAgICAgICAgICB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXIoa2V5LCB2YWx1ZSksXG4gICAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KFwic2Nyb2xsZW5kXCIsIGRvbUVsZW1lbnQpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgXCJkYW5nZXJvdXNseVNldElubmVySFRNTFwiOlxuICAgICAgICAgIGlmIChudWxsICE9IHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoXCJvYmplY3RcIiAhPT0gdHlwZW9mIHZhbHVlIHx8ICEoXCJfX2h0bWxcIiBpbiB2YWx1ZSkpXG4gICAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAgIFwiYHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYCBtdXN0IGJlIGluIHRoZSBmb3JtIGB7X19odG1sOiAuLi59YC4gUGxlYXNlIHZpc2l0IGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvZGFuZ2Vyb3VzbHktc2V0LWlubmVyLWh0bWwgZm9yIG1vcmUgaW5mb3JtYXRpb24uXCJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGtleSA9IHZhbHVlLl9faHRtbDtcbiAgICAgICAgICAgIGlmIChudWxsICE9IGtleSkge1xuICAgICAgICAgICAgICBpZiAobnVsbCAhPSBwcm9wcy5jaGlsZHJlbilcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgICAgICAgIFwiQ2FuIG9ubHkgc2V0IG9uZSBvZiBgY2hpbGRyZW5gIG9yIGBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTGAuXCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAobnVsbCAhPSBwcmV2VmFsdWUgPyBwcmV2VmFsdWUuX19odG1sIDogdm9pZCAwKSAhPT0ga2V5ICYmXG4gICAgICAgICAgICAgICAgKGRvbUVsZW1lbnQuaW5uZXJIVE1MID0ga2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJtdWx0aXBsZVwiOlxuICAgICAgICAgIGRvbUVsZW1lbnQubXVsdGlwbGUgPVxuICAgICAgICAgICAgdmFsdWUgJiYgXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgdmFsdWUgJiYgXCJzeW1ib2xcIiAhPT0gdHlwZW9mIHZhbHVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwibXV0ZWRcIjpcbiAgICAgICAgICBkb21FbGVtZW50Lm11dGVkID1cbiAgICAgICAgICAgIHZhbHVlICYmIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIHZhbHVlICYmIFwic3ltYm9sXCIgIT09IHR5cGVvZiB2YWx1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZ1wiOlxuICAgICAgICBjYXNlIFwic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nXCI6XG4gICAgICAgIGNhc2UgXCJkZWZhdWx0VmFsdWVcIjpcbiAgICAgICAgY2FzZSBcImRlZmF1bHRDaGVja2VkXCI6XG4gICAgICAgIGNhc2UgXCJpbm5lckhUTUxcIjpcbiAgICAgICAgY2FzZSBcInJlZlwiOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYXV0b0ZvY3VzXCI6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJ4bGlua0hyZWZcIjpcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBudWxsID09IHZhbHVlIHx8XG4gICAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiB2YWx1ZSB8fFxuICAgICAgICAgICAgXCJib29sZWFuXCIgPT09IHR5cGVvZiB2YWx1ZSB8fFxuICAgICAgICAgICAgXCJzeW1ib2xcIiA9PT0gdHlwZW9mIHZhbHVlXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBkb21FbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShcInhsaW5rOmhyZWZcIik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbih2YWx1ZSwga2V5KTtcbiAgICAgICAgICBrZXkgPSBzYW5pdGl6ZVVSTCh2YWx1ZSk7XG4gICAgICAgICAgZG9tRWxlbWVudC5zZXRBdHRyaWJ1dGVOUyh4bGlua05hbWVzcGFjZSwgXCJ4bGluazpocmVmXCIsIGtleSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJjb250ZW50RWRpdGFibGVcIjpcbiAgICAgICAgY2FzZSBcInNwZWxsQ2hlY2tcIjpcbiAgICAgICAgY2FzZSBcImRyYWdnYWJsZVwiOlxuICAgICAgICBjYXNlIFwidmFsdWVcIjpcbiAgICAgICAgY2FzZSBcImF1dG9SZXZlcnNlXCI6XG4gICAgICAgIGNhc2UgXCJleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkXCI6XG4gICAgICAgIGNhc2UgXCJmb2N1c2FibGVcIjpcbiAgICAgICAgY2FzZSBcInByZXNlcnZlQWxwaGFcIjpcbiAgICAgICAgICBudWxsICE9IHZhbHVlICYmXG4gICAgICAgICAgXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgdmFsdWUgJiZcbiAgICAgICAgICBcInN5bWJvbFwiICE9PSB0eXBlb2YgdmFsdWVcbiAgICAgICAgICAgID8gKGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24odmFsdWUsIGtleSksXG4gICAgICAgICAgICAgIGRvbUVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUpKVxuICAgICAgICAgICAgOiBkb21FbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiaW5lcnRcIjpcbiAgICAgICAgICBcIlwiICE9PSB2YWx1ZSB8fFxuICAgICAgICAgICAgZGlkV2Fyb
15852kZvck5ld0Jvb2xlYW5Qcm9wc1dpdGhFbXB0eVZhbHVlW2tleV0gfHxcbiAgICAgICAgICAgICgoZGlkV2FybkZvck5ld0Jvb2xlYW5Qcm9wc1dpdGhFbXB0eVZhbHVlW2tleV0gPSAhMCksXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIlJlY2VpdmVkIGFuIGVtcHR5IHN0cmluZyBmb3IgYSBib29sZWFuIGF0dHJpYnV0ZSBgJXNgLiBUaGlzIHdpbGwgdHJlYXQgdGhlIGF0dHJpYnV0ZSBhcyBpZiBpdCB3ZXJlIGZhbHNlLiBFaXRoZXIgcGFzcyBgZmFsc2VgIHRvIHNpbGVuY2UgdGhpcyB3YXJuaW5nLCBvciBwYXNzIGB0cnVlYCBpZiB5b3UgdXNlZCBhbiBlbXB0eSBzdHJpbmcgaW4gZWFybGllciB2ZXJzaW9ucyBvZiBSZWFjdCB0byBpbmRpY2F0ZSB0aGlzIGF0dHJpYnV0ZSBpcyB0cnVlLlwiLFxuICAgICAgICAgICAgICBrZXlcbiAgICAgICAgICAgICkpO1xuICAgICAgICBjYXNlIFwiYWxsb3dGdWxsU2NyZWVuXCI6XG4gICAgICAgIGNhc2UgXCJhc3luY1wiOlxuICAgICAgICBjYXNlIFwiYXV0b1BsYXlcIjpcbiAgICAgICAgY2FzZSBcImNvbnRyb2xzXCI6XG4gICAgICAgIGNhc2UgXCJjcmVkZW50aWFsbGVzc1wiOlxuICAgICAgICBjYXNlIFwiZGVmYXVsdFwiOlxuICAgICAgICBjYXNlIFwiZGVmZXJcIjpcbiAgICAgICAgY2FzZSBcImRpc2FibGVkXCI6XG4gICAgICAgIGNhc2UgXCJkaXNhYmxlUGljdHVyZUluUGljdHVyZVwiOlxuICAgICAgICBjYXNlIFwiZGlzYWJsZVJlbW90ZVBsYXliYWNrXCI6XG4gICAgICAgIGNhc2UgXCJmb3JtTm9WYWxpZGF0ZVwiOlxuICAgICAgICBjYXNlIFwiaGlkZGVuXCI6XG4gICAgICAgIGNhc2UgXCJsb29wXCI6XG4gICAgICAgIGNhc2UgXCJub01vZHVsZVwiOlxuICAgICAgICBjYXNlIFwibm9WYWxpZGF0ZVwiOlxuICAgICAgICBjYXNlIFwib3BlblwiOlxuICAgICAgICBjYXNlIFwicGxheXNJbmxpbmVcIjpcbiAgICAgICAgY2FzZSBcInJlYWRPbmx5XCI6XG4gICAgICAgIGNhc2UgXCJyZXF1aXJlZFwiOlxuICAgICAgICBjYXNlIFwicmV2ZXJzZWRcIjpcbiAgICAgICAgY2FzZSBcInNjb3BlZFwiOlxuICAgICAgICBjYXNlIFwic2VhbWxlc3NcIjpcbiAgICAgICAgY2FzZSBcIml0ZW1TY29wZVwiOlxuICAgICAgICAgIHZhbHVlICYmIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIHZhbHVlICYmIFwic3ltYm9sXCIgIT09IHR5cGVvZiB2YWx1ZVxuICAgICAgICAgICAgPyBkb21FbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIFwiXCIpXG4gICAgICAgICAgICA6IGRvbUVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGtleSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJjYXB0dXJlXCI6XG4gICAgICAgIGNhc2UgXCJkb3dubG9hZFwiOlxuICAgICAgICAgICEwID09PSB2YWx1ZVxuICAgICAgICAgICAgPyBkb21FbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIFwiXCIpXG4gICAgICAgICAgICA6ICExICE9PSB2YWx1ZSAmJlxuICAgICAgICAgICAgICAgIG51bGwgIT0gdmFsdWUgJiZcbiAgICAgICAgICAgICAgICBcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiB2YWx1ZSAmJlxuICAgICAgICAgICAgICAgIFwic3ltYm9sXCIgIT09IHR5cGVvZiB2YWx1ZVxuICAgICAgICAgICAgICA/IChjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBrZXkpLFxuICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUpKVxuICAgICAgICAgICAgICA6IGRvbUVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGtleSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJjb2xzXCI6XG4gICAgICAgIGNhc2UgXCJyb3dzXCI6XG4gICAgICAgIGNhc2UgXCJzaXplXCI6XG4gICAgICAgIGNhc2UgXCJzcGFuXCI6XG4gICAgICAgICAgbnVsbCAhPSB2YWx1ZSAmJlxuICAgICAgICAgIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIHZhbHVlICYmXG4gICAgICAgICAgXCJzeW1ib2xcIiAhPT0gdHlwZW9mIHZhbHVlICYmXG4gICAgICAgICAgIWlzTmFOKHZhbHVlKSAmJlxuICAgICAgICAgIDEgPD0gdmFsdWVcbiAgICAgICAgICAgID8gKGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24odmFsdWUsIGtleSksXG4gICAgICAgICAgICAgIGRvbUVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUpKVxuICAgICAgICAgICAgOiBkb21FbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwicm93U3BhblwiOlxuICAgICAgICBjYXNlIFwic3RhcnRcIjpcbiAgICAgICAgICBudWxsID09IHZhbHVlIHx8XG4gICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgdmFsdWUgfHxcbiAgICAgICAgICBcInN5bWJvbFwiID09PSB0eXBlb2YgdmFsdWUgfHxcbiAgICAgICAgICBpc05hTih2YWx1ZSlcbiAgICAgICAgICAgID8gZG9tRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoa2V5KVxuICAgICAgICAgICAgOiAoY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbih2YWx1ZSwga2V5KSxcbiAgICAgICAgICAgICAgZG9tRWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWx1ZSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwicG9wb3ZlclwiOlxuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJiZWZvcmV0b2dnbGVcIiwgZG9tRWxlbWVudCk7XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcInRvZ2dsZVwiLCBkb21FbGVtZW50KTtcbiAgICAgICAgICBzZXRWYWx1ZUZvckF0dHJpYnV0ZShkb21FbGVtZW50LCBcInBvcG92ZXJcIiwgdmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwieGxpbmtBY3R1YXRlXCI6XG4gICAgICAgICAgc2V0VmFsdWVGb3JOYW1lc3BhY2VkQXR0cmlidXRlKFxuICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgIHhsaW5rTmFtZXNwYWNlLFxuICAgICAgICAgICAgXCJ4bGluazphY3R1YXRlXCIsXG4gICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJ4bGlua0FyY3JvbGVcIjpcbiAgICAgICAgICBzZXRWYWx1ZUZvck5hbWVzcGFjZWRBdHRyaWJ1dGUoXG4gICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgeGxpbmtOYW1lc3BhY2UsXG4gICAgICAgICAgICBcInhsaW5rOmFyY3JvbGVcIixcbiAgICAgICAgICAgI
15852HZhbHVlXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInhsaW5rUm9sZVwiOlxuICAgICAgICAgIHNldFZhbHVlRm9yTmFtZXNwYWNlZEF0dHJpYnV0ZShcbiAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICB4bGlua05hbWVzcGFjZSxcbiAgICAgICAgICAgIFwieGxpbms6cm9sZVwiLFxuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwieGxpbmtTaG93XCI6XG4gICAgICAgICAgc2V0VmFsdWVGb3JOYW1lc3BhY2VkQXR0cmlidXRlKFxuICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgIHhsaW5rTmFtZXNwYWNlLFxuICAgICAgICAgICAgXCJ4bGluazpzaG93XCIsXG4gICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJ4bGlua1RpdGxlXCI6XG4gICAgICAgICAgc2V0VmFsdWVGb3JOYW1lc3BhY2VkQXR0cmlidXRlKFxuICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgIHhsaW5rTmFtZXNwYWNlLFxuICAgICAgICAgICAgXCJ4bGluazp0aXRsZVwiLFxuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwieGxpbmtUeXBlXCI6XG4gICAgICAgICAgc2V0VmFsdWVGb3JOYW1lc3BhY2VkQXR0cmlidXRlKFxuICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgIHhsaW5rTmFtZXNwYWNlLFxuICAgICAgICAgICAgXCJ4bGluazp0eXBlXCIsXG4gICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJ4bWxCYXNlXCI6XG4gICAgICAgICAgc2V0VmFsdWVGb3JOYW1lc3BhY2VkQXR0cmlidXRlKFxuICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgIHhtbE5hbWVzcGFjZSxcbiAgICAgICAgICAgIFwieG1sOmJhc2VcIixcbiAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInhtbExhbmdcIjpcbiAgICAgICAgICBzZXRWYWx1ZUZvck5hbWVzcGFjZWRBdHRyaWJ1dGUoXG4gICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgeG1sTmFtZXNwYWNlLFxuICAgICAgICAgICAgXCJ4bWw6bGFuZ1wiLFxuICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwieG1sU3BhY2VcIjpcbiAgICAgICAgICBzZXRWYWx1ZUZvck5hbWVzcGFjZWRBdHRyaWJ1dGUoXG4gICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgeG1sTmFtZXNwYWNlLFxuICAgICAgICAgICAgXCJ4bWw6c3BhY2VcIixcbiAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImlzXCI6XG4gICAgICAgICAgbnVsbCAhPSBwcmV2VmFsdWUgJiZcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICdDYW5ub3QgdXBkYXRlIHRoZSBcImlzXCIgcHJvcCBhZnRlciBpdCBoYXMgYmVlbiBpbml0aWFsaXplZC4nXG4gICAgICAgICAgICApO1xuICAgICAgICAgIHNldFZhbHVlRm9yQXR0cmlidXRlKGRvbUVsZW1lbnQsIFwiaXNcIiwgdmFsdWUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiaW5uZXJUZXh0XCI6XG4gICAgICAgIGNhc2UgXCJ0ZXh0Q29udGVudFwiOlxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY2FzZSBcInBvcG92ZXJUYXJnZXRcIjpcbiAgICAgICAgICBkaWRXYXJuUG9wb3ZlclRhcmdldE9iamVjdCB8fFxuICAgICAgICAgICAgbnVsbCA9PSB2YWx1ZSB8fFxuICAgICAgICAgICAgXCJvYmplY3RcIiAhPT0gdHlwZW9mIHZhbHVlIHx8XG4gICAgICAgICAgICAoKGRpZFdhcm5Qb3BvdmVyVGFyZ2V0T2JqZWN0ID0gITApLFxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCJUaGUgYHBvcG92ZXJUYXJnZXRgIHByb3AgZXhwZWN0cyB0aGUgSUQgb2YgYW4gRWxlbWVudCBhcyBhIHN0cmluZy4gUmVjZWl2ZWQgJXMgaW5zdGVhZC5cIixcbiAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgICkpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICEoMiA8IGtleS5sZW5ndGgpIHx8XG4gICAgICAgICAgICAoXCJvXCIgIT09IGtleVswXSAmJiBcIk9cIiAhPT0ga2V5WzBdKSB8fFxuICAgICAgICAgICAgKFwiblwiICE9PSBrZXlbMV0gJiYgXCJOXCIgIT09IGtleVsxXSlcbiAgICAgICAgICApXG4gICAgICAgICAgICAoa2V5ID0gZ2V0QXR0cmlidXRlQWxpYXMoa2V5KSksXG4gICAgICAgICAgICAgIHNldFZhbHVlRm9yQXR0cmlidXRlKGRvbUVsZW1lbnQsIGtleSwgdmFsdWUpO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llcy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmXG4gICAgICAgICAgICAgIG51bGwgIT0gdmFsdWUgJiZcbiAgICAgICAgICAgICAgXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgdmFsdWUgJiZcbiAgICAgICAgICAgICAgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyKGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZpZXdUcmFuc2l0aW9uTXV0YXRpb25Db250ZXh0ID0gITA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNldFByb3BPbkN1c3RvbUVsZW1lbnQoXG4gICAgICBkb21FbGVtZW50LFxuICAgICAgdGFnLFxuICAgICAga2V5LFxuICAgICAgdmFsdWUsXG4gICAgICBwcm9wcyxcbiAgICAgIHByZXZWYWx1ZVxuICAgICkge1xuICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSBcInN0eWxlXCI6XG4gICAgICAgICAgc2V0VmFsdWVGb3JTdHlsZXMoZG9tRWxlbWVudCwgdmFsdWUsIHByZXZWYWx1ZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjYXNlIFwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxcIjpcbiAgICAgICAgICBpZiAobnVsbCAhPSB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKFwib2JqZWN0XCIgIT09IHR5cGVvZiB2YWx1ZSB8fCAhKFwiX19odG1sXCIgaW4gdmFsdWUpKVxuICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgICAgICBcImBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTGAgbXVzdCBiZSBpbiB0aGUgZm9ybSBge19faHRtbDogLi4ufWAuIFBsZWFzZSB2aXNpdCBodHRwczovL3JlYWN0LmRldi9saW5rL2Rhbmdlcm91c2x5LXNldC1pbm5lci1odG1sIGZvciBtb3JlIGluZm9ybWF0aW9uLlwiXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBrZXkgPSB2YWx1ZS
158525fX2h0bWw7XG4gICAgICAgICAgICBpZiAobnVsbCAhPSBrZXkpIHtcbiAgICAgICAgICAgICAgaWYgKG51bGwgIT0gcHJvcHMuY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgICAgICBcIkNhbiBvbmx5IHNldCBvbmUgb2YgYGNoaWxkcmVuYCBvciBgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgLlwiXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgKG51bGwgIT0gcHJldlZhbHVlID8gcHJldlZhbHVlLl9faHRtbCA6IHZvaWQgMCkgIT09IGtleSAmJlxuICAgICAgICAgICAgICAgIChkb21FbGVtZW50LmlubmVySFRNTCA9IGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiY2hpbGRyZW5cIjpcbiAgICAgICAgICBpZiAoXCJzdHJpbmdcIiA9PT0gdHlwZW9mIHZhbHVlKSBzZXRUZXh0Q29udGVudChkb21FbGVtZW50LCB2YWx1ZSk7XG4gICAgICAgICAgZWxzZSBpZiAoXCJudW1iZXJcIiA9PT0gdHlwZW9mIHZhbHVlIHx8IFwiYmlnaW50XCIgPT09IHR5cGVvZiB2YWx1ZSlcbiAgICAgICAgICAgIHNldFRleHRDb250ZW50KGRvbUVsZW1lbnQsIFwiXCIgKyB2YWx1ZSk7XG4gICAgICAgICAgZWxzZSByZXR1cm47XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJvblNjcm9sbFwiOlxuICAgICAgICAgIG51bGwgIT0gdmFsdWUgJiZcbiAgICAgICAgICAgIChcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiB2YWx1ZSAmJlxuICAgICAgICAgICAgICB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXIoa2V5LCB2YWx1ZSksXG4gICAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KFwic2Nyb2xsXCIsIGRvbUVsZW1lbnQpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgXCJvblNjcm9sbEVuZFwiOlxuICAgICAgICAgIG51bGwgIT0gdmFsdWUgJiZcbiAgICAgICAgICAgIChcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiB2YWx1ZSAmJlxuICAgICAgICAgICAgICB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXIoa2V5LCB2YWx1ZSksXG4gICAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KFwic2Nyb2xsZW5kXCIsIGRvbUVsZW1lbnQpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgXCJvbkNsaWNrXCI6XG4gICAgICAgICAgbnVsbCAhPSB2YWx1ZSAmJlxuICAgICAgICAgICAgKFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIHZhbHVlICYmXG4gICAgICAgICAgICAgIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcihrZXksIHZhbHVlKSxcbiAgICAgICAgICAgIChkb21FbGVtZW50Lm9uY2xpY2sgPSBub29wJDEpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgXCJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmdcIjpcbiAgICAgICAgY2FzZSBcInN1cHByZXNzSHlkcmF0aW9uV2FybmluZ1wiOlxuICAgICAgICBjYXNlIFwiaW5uZXJIVE1MXCI6XG4gICAgICAgIGNhc2UgXCJyZWZcIjpcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgXCJpbm5lclRleHRcIjpcbiAgICAgICAgY2FzZSBcInRleHRDb250ZW50XCI6XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KGtleSkpXG4gICAgICAgICAgICBudWxsICE9IHZhbHVlICYmXG4gICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIHZhbHVlICYmXG4gICAgICAgICAgICAgIHdhcm5Gb3JJbnZhbGlkRXZlbnRMaXN0ZW5lcihrZXksIHZhbHVlKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICBhOiB7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBcIm9cIiA9PT0ga2V5WzBdICYmXG4gICAgICAgICAgICAgICAgXCJuXCIgPT09IGtleVsxXSAmJlxuICAgICAgICAgICAgICAgICgocHJvcHMgPSBrZXkuZW5kc1dpdGgoXCJDYXB0dXJlXCIpKSxcbiAgICAgICAgICAgICAgICAocHJldlZhbHVlID0ga2V5LnNsaWNlKDIsIHByb3BzID8ga2V5Lmxlbmd0aCAtIDcgOiB2b2lkIDApKSxcbiAgICAgICAgICAgICAgICAodGFnID0gZG9tRWxlbWVudFtpbnRlcm5hbFByb3BzS2V5XSB8fCBudWxsKSxcbiAgICAgICAgICAgICAgICAodGFnID0gbnVsbCAhPSB0YWcgPyB0YWdba2V5XSA6IG51bGwpLFxuICAgICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHRhZyAmJlxuICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHByZXZWYWx1ZSwgdGFnLCBwcm9wcyksXG4gICAgICAgICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgdmFsdWUpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIHRhZyAmJlxuICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gdGFnICYmXG4gICAgICAgICAgICAgICAgICAoa2V5IGluIGRvbUVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgPyAoZG9tRWxlbWVudFtrZXldID0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgOiBkb21FbGVtZW50Lmhhc0F0dHJpYnV0ZShrZXkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoa2V5KSk7XG4gICAgICAgICAgICAgICAgZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHByZXZWYWx1ZSwgdmFsdWUsIHByb3BzKTtcbiAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZpZXdUcmFuc2l0aW9uTXV0YXRpb25Db250ZXh0ID0gITA7XG4gICAgICAgICAgICAgIGtleSBpbiBkb21FbGVtZW50XG4gICAgICAgICAgICAgICAgPyAoZG9tRWxlbWVudFtrZXldID0gdmFsdWUpXG4gICAgICAgICAgICAgICAgOiAhMCA9PT0gdmFsdWVcbiAgICAgICAgICAgICAgICAgID8gZG9tRWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCBcIlwiKVxuICAgICAgICAgICAgICAgICAgOiBzZXRWYWx1ZUZvckF0dHJpYnV0ZShkb21FbGVtZW50LCBrZXksIHZhbHVlKTtcbiAgICAgICAgICAgI
15852H1cbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2aWV3VHJhbnNpdGlvbk11dGF0aW9uQ29udGV4dCA9ICEwO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzZXRJbml0aWFsUHJvcGVydGllcyhkb21FbGVtZW50LCB0YWcsIHByb3BzKSB7XG4gICAgICB2YWxpZGF0ZVByb3BlcnRpZXNJbkRldmVsb3BtZW50KHRhZywgcHJvcHMpO1xuICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgY2FzZSBcImRpdlwiOlxuICAgICAgICBjYXNlIFwic3BhblwiOlxuICAgICAgICBjYXNlIFwic3ZnXCI6XG4gICAgICAgIGNhc2UgXCJwYXRoXCI6XG4gICAgICAgIGNhc2UgXCJhXCI6XG4gICAgICAgIGNhc2UgXCJnXCI6XG4gICAgICAgIGNhc2UgXCJwXCI6XG4gICAgICAgIGNhc2UgXCJsaVwiOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiaW1nXCI6XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcImVycm9yXCIsIGRvbUVsZW1lbnQpO1xuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJsb2FkXCIsIGRvbUVsZW1lbnQpO1xuICAgICAgICAgIHZhciBoYXNTcmMgPSAhMSxcbiAgICAgICAgICAgIGhhc1NyY1NldCA9ICExLFxuICAgICAgICAgICAgcHJvcEtleTtcbiAgICAgICAgICBmb3IgKHByb3BLZXkgaW4gcHJvcHMpXG4gICAgICAgICAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgICAgICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BLZXldO1xuICAgICAgICAgICAgICBpZiAobnVsbCAhPSBwcm9wVmFsdWUpXG4gICAgICAgICAgICAgICAgc3dpdGNoIChwcm9wS2V5KSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIFwic3JjXCI6XG4gICAgICAgICAgICAgICAgICAgIGhhc1NyYyA9ICEwO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJzcmNTZXRcIjpcbiAgICAgICAgICAgICAgICAgICAgaGFzU3JjU2V0ID0gITA7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgY2FzZSBcImNoaWxkcmVuXCI6XG4gICAgICAgICAgICAgICAgICBjYXNlIFwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgdGFnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIGlzIGEgdm9pZCBlbGVtZW50IHRhZyBhbmQgbXVzdCBuZWl0aGVyIGhhdmUgYGNoaWxkcmVuYCBub3IgdXNlIGBkYW5nZXJvdXNseVNldElubmVySFRNTGAuXCJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHNldFByb3AoZG9tRWxlbWVudCwgdGFnLCBwcm9wS2V5LCBwcm9wVmFsdWUsIHByb3BzLCBudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgaGFzU3JjU2V0ICYmXG4gICAgICAgICAgICBzZXRQcm9wKGRvbUVsZW1lbnQsIHRhZywgXCJzcmNTZXRcIiwgcHJvcHMuc3JjU2V0LCBwcm9wcywgbnVsbCk7XG4gICAgICAgICAgaGFzU3JjICYmIHNldFByb3AoZG9tRWxlbWVudCwgdGFnLCBcInNyY1wiLCBwcm9wcy5zcmMsIHByb3BzLCBudWxsKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgXCJpbnB1dFwiOlxuICAgICAgICAgIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHMoXCJpbnB1dFwiLCBwcm9wcyk7XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcImludmFsaWRcIiwgZG9tRWxlbWVudCk7XG4gICAgICAgICAgdmFyIGRlZmF1bHRWYWx1ZSA9IChwcm9wS2V5ID0gcHJvcFZhbHVlID0gaGFzU3JjU2V0ID0gbnVsbCksXG4gICAgICAgICAgICBjaGVja2VkID0gbnVsbCxcbiAgICAgICAgICAgIGRlZmF1bHRDaGVja2VkID0gbnVsbDtcbiAgICAgICAgICBmb3IgKGhhc1NyYyBpbiBwcm9wcylcbiAgICAgICAgICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eShoYXNTcmMpKSB7XG4gICAgICAgICAgICAgIHZhciBfcHJvcFZhbHVlID0gcHJvcHNbaGFzU3JjXTtcbiAgICAgICAgICAgICAgaWYgKG51bGwgIT0gX3Byb3BWYWx1ZSlcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGhhc1NyYykge1xuICAgICAgICAgICAgICAgICAgY2FzZSBcIm5hbWVcIjpcbiAgICAgICAgICAgICAgICAgICAgaGFzU3JjU2V0ID0gX3Byb3BWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICBjYXNlIFwidHlwZVwiOlxuICAgICAgICAgICAgICAgICAgICBwcm9wVmFsdWUgPSBfcHJvcFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJjaGVja2VkXCI6XG4gICAgICAgICAgICAgICAgICAgIGNoZWNrZWQgPSBfcHJvcFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJkZWZhdWx0Q2hlY2tlZFwiOlxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q2hlY2tlZCA9IF9wcm9wVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgY2FzZSBcInZhbHVlXCI6XG4gICAgICAgICAgICAgICAgICAgIHByb3BLZXkgPSBfcHJvcFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJkZWZhdWx0VmFsdWVcIjpcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gX3Byb3BWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICBjYXNlIFwiY2hpbGRyZW5cIjpcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJkYW5nZXJvdXNseVNldElubmVySFRNTFwiOlxuICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBfcHJvcFZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgaXMgYSB2b2lkIGVsZW1lbnQgdGFnIGFuZCBtdXN0IG5laXRoZXIgaGF2ZSBgY2hpbGRyZW5gIG5vciB1c2UgYGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYC5cIlxuICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgc2V0UHJvcChkb21FbGVtZW50LCB0YWcsIGhhc1NyYywgX3Byb3BWYWx1ZSwgcHJvcHMsIG51bGwpO1xuICAgICAgICAgICAgICAgI
15852H1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB2YWxpZGF0ZUlucHV0UHJvcHMoZG9tRWxlbWVudCwgcHJvcHMpO1xuICAgICAgICAgIGluaXRJbnB1dChcbiAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICBwcm9wS2V5LFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgY2hlY2tlZCxcbiAgICAgICAgICAgIGRlZmF1bHRDaGVja2VkLFxuICAgICAgICAgICAgcHJvcFZhbHVlLFxuICAgICAgICAgICAgaGFzU3JjU2V0LFxuICAgICAgICAgICAgITFcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY2FzZSBcInNlbGVjdFwiOlxuICAgICAgICAgIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHMoXCJzZWxlY3RcIiwgcHJvcHMpO1xuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJpbnZhbGlkXCIsIGRvbUVsZW1lbnQpO1xuICAgICAgICAgIGhhc1NyYyA9IHByb3BWYWx1ZSA9IHByb3BLZXkgPSBudWxsO1xuICAgICAgICAgIGZvciAoaGFzU3JjU2V0IGluIHByb3BzKVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBwcm9wcy5oYXNPd25Qcm9wZXJ0eShoYXNTcmNTZXQpICYmXG4gICAgICAgICAgICAgICgoZGVmYXVsdFZhbHVlID0gcHJvcHNbaGFzU3JjU2V0XSksIG51bGwgIT0gZGVmYXVsdFZhbHVlKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBzd2l0Y2ggKGhhc1NyY1NldCkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ2YWx1ZVwiOlxuICAgICAgICAgICAgICAgICAgcHJvcEtleSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJkZWZhdWx0VmFsdWVcIjpcbiAgICAgICAgICAgICAgICAgIHByb3BWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJtdWx0aXBsZVwiOlxuICAgICAgICAgICAgICAgICAgaGFzU3JjID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBzZXRQcm9wKFxuICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgICAgICAgIGhhc1NyY1NldCxcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgbnVsbFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIHZhbGlkYXRlU2VsZWN0UHJvcHMoZG9tRWxlbWVudCwgcHJvcHMpO1xuICAgICAgICAgIHRhZyA9IHByb3BLZXk7XG4gICAgICAgICAgcHJvcHMgPSBwcm9wVmFsdWU7XG4gICAgICAgICAgZG9tRWxlbWVudC5tdWx0aXBsZSA9ICEhaGFzU3JjO1xuICAgICAgICAgIG51bGwgIT0gdGFnXG4gICAgICAgICAgICA/IHVwZGF0ZU9wdGlvbnMoZG9tRWxlbWVudCwgISFoYXNTcmMsIHRhZywgITEpXG4gICAgICAgICAgICA6IG51bGwgIT0gcHJvcHMgJiYgdXBkYXRlT3B0aW9ucyhkb21FbGVtZW50LCAhIWhhc1NyYywgcHJvcHMsICEwKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgXCJ0ZXh0YXJlYVwiOlxuICAgICAgICAgIGNoZWNrQ29udHJvbGxlZFZhbHVlUHJvcHMoXCJ0ZXh0YXJlYVwiLCBwcm9wcyk7XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcImludmFsaWRcIiwgZG9tRWxlbWVudCk7XG4gICAgICAgICAgcHJvcEtleSA9IGhhc1NyY1NldCA9IGhhc1NyYyA9IG51bGw7XG4gICAgICAgICAgZm9yIChwcm9wVmFsdWUgaW4gcHJvcHMpXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHByb3BzLmhhc093blByb3BlcnR5KHByb3BWYWx1ZSkgJiZcbiAgICAgICAgICAgICAgKChkZWZhdWx0VmFsdWUgPSBwcm9wc1twcm9wVmFsdWVdKSwgbnVsbCAhPSBkZWZhdWx0VmFsdWUpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIHN3aXRjaCAocHJvcFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInZhbHVlXCI6XG4gICAgICAgICAgICAgICAgICBoYXNTcmMgPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGVmYXVsdFZhbHVlXCI6XG4gICAgICAgICAgICAgICAgICBoYXNTcmNTZXQgPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiY2hpbGRyZW5cIjpcbiAgICAgICAgICAgICAgICAgIHByb3BLZXkgPSBkZWZhdWx0VmFsdWU7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxcIjpcbiAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IGRlZmF1bHRWYWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgXCJgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgIGRvZXMgbm90IG1ha2Ugc2Vuc2Ugb24gPHRleHRhcmVhPi5cIlxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIHNldFByb3AoXG4gICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHRhZyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgdmFsaWRhdGVUZXh0YXJlYVByb3BzKGRvbUVsZW1lbnQsIHByb3BzKTtcbiAgICAgICAgICBpbml0VGV4dGFyZWEoZG9tRWxlbWVudCwgaGFzU3JjLCBoYXNTcmNTZXQsIHByb3BLZXkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY2FzZSBcIm9wdGlvblwiOlxuICAgICAgICAgI
15852HZhbGlkYXRlT3B0aW9uUHJvcHMoZG9tRWxlbWVudCwgcHJvcHMpO1xuICAgICAgICAgIGZvciAoY2hlY2tlZCBpbiBwcm9wcylcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgcHJvcHMuaGFzT3duUHJvcGVydHkoY2hlY2tlZCkgJiZcbiAgICAgICAgICAgICAgKChoYXNTcmMgPSBwcm9wc1tjaGVja2VkXSksIG51bGwgIT0gaGFzU3JjKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBzd2l0Y2ggKGNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic2VsZWN0ZWRcIjpcbiAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQuc2VsZWN0ZWQgPVxuICAgICAgICAgICAgICAgICAgICBoYXNTcmMgJiZcbiAgICAgICAgICAgICAgICAgICAgXCJmdW5jdGlvblwiICE9PSB0eXBlb2YgaGFzU3JjICYmXG4gICAgICAgICAgICAgICAgICAgIFwic3ltYm9sXCIgIT09IHR5cGVvZiBoYXNTcmM7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgc2V0UHJvcChkb21FbGVtZW50LCB0YWcsIGNoZWNrZWQsIGhhc1NyYywgcHJvcHMsIG51bGwpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjYXNlIFwiZGlhbG9nXCI6XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcImJlZm9yZXRvZ2dsZVwiLCBkb21FbGVtZW50KTtcbiAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KFwidG9nZ2xlXCIsIGRvbUVsZW1lbnQpO1xuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJjYW5jZWxcIiwgZG9tRWxlbWVudCk7XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcImNsb3NlXCIsIGRvbUVsZW1lbnQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiaWZyYW1lXCI6XG4gICAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KFwibG9hZFwiLCBkb21FbGVtZW50KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInZpZGVvXCI6XG4gICAgICAgIGNhc2UgXCJhdWRpb1wiOlxuICAgICAgICAgIGZvciAoaGFzU3JjID0gMDsgaGFzU3JjIDwgbWVkaWFFdmVudFR5cGVzLmxlbmd0aDsgaGFzU3JjKyspXG4gICAgICAgICAgICBsaXN0ZW5Ub05vbkRlbGVnYXRlZEV2ZW50KG1lZGlhRXZlbnRUeXBlc1toYXNTcmNdLCBkb21FbGVtZW50KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImltYWdlXCI6XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcImVycm9yXCIsIGRvbUVsZW1lbnQpO1xuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJsb2FkXCIsIGRvbUVsZW1lbnQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZGV0YWlsc1wiOlxuICAgICAgICAgIGxpc3RlblRvTm9uRGVsZWdhdGVkRXZlbnQoXCJ0b2dnbGVcIiwgZG9tRWxlbWVudCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJlbWJlZFwiOlxuICAgICAgICBjYXNlIFwic291cmNlXCI6XG4gICAgICAgIGNhc2UgXCJsaW5rXCI6XG4gICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcImVycm9yXCIsIGRvbUVsZW1lbnQpLFxuICAgICAgICAgICAgbGlzdGVuVG9Ob25EZWxlZ2F0ZWRFdmVudChcImxvYWRcIiwgZG9tRWxlbWVudCk7XG4gICAgICAgIGNhc2UgXCJhcmVhXCI6XG4gICAgICAgIGNhc2UgXCJiYXNlXCI6XG4gICAgICAgIGNhc2UgXCJiclwiOlxuICAgICAgICBjYXNlIFwiY29sXCI6XG4gICAgICAgIGNhc2UgXCJoclwiOlxuICAgICAgICBjYXNlIFwia2V5Z2VuXCI6XG4gICAgICAgIGNhc2UgXCJtZXRhXCI6XG4gICAgICAgIGNhc2UgXCJwYXJhbVwiOlxuICAgICAgICBjYXNlIFwidHJhY2tcIjpcbiAgICAgICAgY2FzZSBcIndiclwiOlxuICAgICAgICBjYXNlIFwibWVudWl0ZW1cIjpcbiAgICAgICAgICBmb3IgKGRlZmF1bHRDaGVja2VkIGluIHByb3BzKVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBwcm9wcy5oYXNPd25Qcm9wZXJ0eShkZWZhdWx0Q2hlY2tlZCkgJiZcbiAgICAgICAgICAgICAgKChoYXNTcmMgPSBwcm9wc1tkZWZhdWx0Q2hlY2tlZF0pLCBudWxsICE9IGhhc1NyYylcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgc3dpdGNoIChkZWZhdWx0Q2hlY2tlZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJjaGlsZHJlblwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJkYW5nZXJvdXNseVNldElubmVySFRNTFwiOlxuICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIHRhZyArXG4gICAgICAgICAgICAgICAgICAgICAgXCIgaXMgYSB2b2lkIGVsZW1lbnQgdGFnIGFuZCBtdXN0IG5laXRoZXIgaGF2ZSBgY2hpbGRyZW5gIG5vciB1c2UgYGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYC5cIlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgc2V0UHJvcChkb21FbGVtZW50LCB0YWcsIGRlZmF1bHRDaGVja2VkLCBoYXNTcmMsIHByb3BzLCBudWxsKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoaXNDdXN0b21FbGVtZW50KHRhZykpIHtcbiAgICAgICAgICAgIGZvciAoX3Byb3BWYWx1ZSBpbiBwcm9wcylcbiAgICAgICAgICAgICAgcHJvcHMuaGFzT3duUHJvcGVydHkoX3Byb3BWYWx1ZSkgJiZcbiAgICAgICAgICAgICAgICAoKGhhc1NyYyA9IHByb3BzW19wcm9wVmFsdWVdKSxcbiAgICAgICAgICAgICAgICB2b2lkIDAgIT09IGhhc1NyYyAmJlxuICAgICAgICAgICAgICAgICAgc2V0UHJvcE9uQ3VzdG9tRWxlbWVudChcbiAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICAgICAgICBfcHJvcFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBoYXNTcmMsXG4gICAgICAgICAgICAgICAgICAgI
15852HByb3BzLFxuICAgICAgICAgICAgICAgICAgICB2b2lkIDBcbiAgICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAoZGVmYXVsdFZhbHVlIGluIHByb3BzKVxuICAgICAgICBwcm9wcy5oYXNPd25Qcm9wZXJ0eShkZWZhdWx0VmFsdWUpICYmXG4gICAgICAgICAgKChoYXNTcmMgPSBwcm9wc1tkZWZhdWx0VmFsdWVdKSxcbiAgICAgICAgICBudWxsICE9IGhhc1NyYyAmJlxuICAgICAgICAgICAgc2V0UHJvcChkb21FbGVtZW50LCB0YWcsIGRlZmF1bHRWYWx1ZSwgaGFzU3JjLCBwcm9wcywgbnVsbCkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB1cGRhdGVQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHRhZywgbGFzdFByb3BzLCBuZXh0UHJvcHMpIHtcbiAgICAgIHZhbGlkYXRlUHJvcGVydGllc0luRGV2ZWxvcG1lbnQodGFnLCBuZXh0UHJvcHMpO1xuICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgY2FzZSBcImRpdlwiOlxuICAgICAgICBjYXNlIFwic3BhblwiOlxuICAgICAgICBjYXNlIFwic3ZnXCI6XG4gICAgICAgIGNhc2UgXCJwYXRoXCI6XG4gICAgICAgIGNhc2UgXCJhXCI6XG4gICAgICAgIGNhc2UgXCJnXCI6XG4gICAgICAgIGNhc2UgXCJwXCI6XG4gICAgICAgIGNhc2UgXCJsaVwiOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiaW5wdXRcIjpcbiAgICAgICAgICB2YXIgbmFtZSA9IG51bGwsXG4gICAgICAgICAgICB0eXBlID0gbnVsbCxcbiAgICAgICAgICAgIHZhbHVlID0gbnVsbCxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IG51bGwsXG4gICAgICAgICAgICBsYXN0RGVmYXVsdFZhbHVlID0gbnVsbCxcbiAgICAgICAgICAgIGNoZWNrZWQgPSBudWxsLFxuICAgICAgICAgICAgZGVmYXVsdENoZWNrZWQgPSBudWxsO1xuICAgICAgICAgIGZvciAocHJvcEtleSBpbiBsYXN0UHJvcHMpIHtcbiAgICAgICAgICAgIHZhciBsYXN0UHJvcCA9IGxhc3RQcm9wc1twcm9wS2V5XTtcbiAgICAgICAgICAgIGlmIChsYXN0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgJiYgbnVsbCAhPSBsYXN0UHJvcClcbiAgICAgICAgICAgICAgc3dpdGNoIChwcm9wS2V5KSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcImNoZWNrZWRcIjpcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ2YWx1ZVwiOlxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImRlZmF1bHRWYWx1ZVwiOlxuICAgICAgICAgICAgICAgICAgbGFzdERlZmF1bHRWYWx1ZSA9IGxhc3RQcm9wO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHxcbiAgICAgICAgICAgICAgICAgICAgc2V0UHJvcChcbiAgICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgIHRhZyxcbiAgICAgICAgICAgICAgICAgICAgICBwcm9wS2V5LFxuICAgICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgbmV4dFByb3BzLFxuICAgICAgICAgICAgICAgICAgICAgIGxhc3RQcm9wXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yICh2YXIgX3Byb3BLZXk4IGluIG5leHRQcm9wcykge1xuICAgICAgICAgICAgdmFyIHByb3BLZXkgPSBuZXh0UHJvcHNbX3Byb3BLZXk4XTtcbiAgICAgICAgICAgIGxhc3RQcm9wID0gbGFzdFByb3BzW19wcm9wS2V5OF07XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIG5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShfcHJvcEtleTgpICYmXG4gICAgICAgICAgICAgIChudWxsICE9IHByb3BLZXkgfHwgbnVsbCAhPSBsYXN0UHJvcClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgc3dpdGNoIChfcHJvcEtleTgpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwidHlwZVwiOlxuICAgICAgICAgICAgICAgICAgcHJvcEtleSAhPT0gbGFzdFByb3AgJiYgKHZpZXdUcmFuc2l0aW9uTXV0YXRpb25Db250ZXh0ID0gITApO1xuICAgICAgICAgICAgICAgICAgdHlwZSA9IHByb3BLZXk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibmFtZVwiOlxuICAgICAgICAgICAgICAgICAgcHJvcEtleSAhPT0gbGFzdFByb3AgJiYgKHZpZXdUcmFuc2l0aW9uTXV0YXRpb25Db250ZXh0ID0gITApO1xuICAgICAgICAgICAgICAgICAgbmFtZSA9IHByb3BLZXk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiY2hlY2tlZFwiOlxuICAgICAgICAgICAgICAgICAgcHJvcEtleSAhPT0gbGFzdFByb3AgJiYgKHZpZXdUcmFuc2l0aW9uTXV0YXRpb25Db250ZXh0ID0gITApO1xuICAgICAgICAgICAgICAgICAgY2hlY2tlZCA9IHByb3BLZXk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGVmYXVsdENoZWNrZWRcIjpcbiAgICAgICAgICAgICAgICAgIHByb3BLZXkgIT09IGxhc3RQcm9wICYmICh2aWV3VHJhbnNpdGlvbk11dGF0aW9uQ29udGV4dCA9ICEwKTtcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHRDaGVja2VkID0gcHJvcEtleTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ2YWx1ZVwiOlxuICAgICAgICAgICAgICAgICAgcHJvcEtleSAhPT0gbGFzdFByb3AgJiYgKHZpZXdUcmFuc2l0aW9uTXV0YXRpb25Db250ZXh0ID0gITApO1xuICAgICAgICAgICAgICAgICAgdmFsdWUgPSBwcm9wS2V5O1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImRlZmF1bHRWYWx1ZVwiOlxuICAgICAgICAgICAgICAgICAgcHJvcEtleSAhPT0gbGFzdFByb3AgJiYgKHZpZXdUcmFuc2l0aW9uTXV0YXRpb25Db250ZXh0ID0gITApO1xuICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gcHJvcEtleTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJjaGlsZHJlblwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJkYW5nZXJvdXNseVNldElubmVySFRNTFwiOlxuICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gcHJv
15852cEtleSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgdGFnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIGlzIGEgdm9pZCBlbGVtZW50IHRhZyBhbmQgbXVzdCBuZWl0aGVyIGhhdmUgYGNoaWxkcmVuYCBub3IgdXNlIGBkYW5nZXJvdXNseVNldElubmVySFRNTGAuXCJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBwcm9wS2V5ICE9PSBsYXN0UHJvcCAmJlxuICAgICAgICAgICAgICAgICAgICBzZXRQcm9wKFxuICAgICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICAgICAgICAgIF9wcm9wS2V5OCxcbiAgICAgICAgICAgICAgICAgICAgICBwcm9wS2V5LFxuICAgICAgICAgICAgICAgICAgICAgIG5leHRQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgICBsYXN0UHJvcFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRhZyA9XG4gICAgICAgICAgICBcImNoZWNrYm94XCIgPT09IGxhc3RQcm9wcy50eXBlIHx8IFwicmFkaW9cIiA9PT0gbGFzdFByb3BzLnR5cGVcbiAgICAgICAgICAgICAgPyBudWxsICE9IGxhc3RQcm9wcy5jaGVja2VkXG4gICAgICAgICAgICAgIDogbnVsbCAhPSBsYXN0UHJvcHMudmFsdWU7XG4gICAgICAgICAgbmV4dFByb3BzID1cbiAgICAgICAgICAgIFwiY2hlY2tib3hcIiA9PT0gbmV4dFByb3BzLnR5cGUgfHwgXCJyYWRpb1wiID09PSBuZXh0UHJvcHMudHlwZVxuICAgICAgICAgICAgICA/IG51bGwgIT0gbmV4dFByb3BzLmNoZWNrZWRcbiAgICAgICAgICAgICAgOiBudWxsICE9IG5leHRQcm9wcy52YWx1ZTtcbiAgICAgICAgICB0YWcgfHxcbiAgICAgICAgICAgICFuZXh0UHJvcHMgfHxcbiAgICAgICAgICAgIGRpZFdhcm5VbmNvbnRyb2xsZWRUb0NvbnRyb2xsZWQgfHxcbiAgICAgICAgICAgIChjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIkEgY29tcG9uZW50IGlzIGNoYW5naW5nIGFuIHVuY29udHJvbGxlZCBpbnB1dCB0byBiZSBjb250cm9sbGVkLiBUaGlzIGlzIGxpa2VseSBjYXVzZWQgYnkgdGhlIHZhbHVlIGNoYW5naW5nIGZyb20gdW5kZWZpbmVkIHRvIGEgZGVmaW5lZCB2YWx1ZSwgd2hpY2ggc2hvdWxkIG5vdCBoYXBwZW4uIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgZWxlbWVudCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBjb21wb25lbnQuIE1vcmUgaW5mbzogaHR0cHM6Ly9yZWFjdC5kZXYvbGluay9jb250cm9sbGVkLWNvbXBvbmVudHNcIlxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIChkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkID0gITApKTtcbiAgICAgICAgICAhdGFnIHx8XG4gICAgICAgICAgICBuZXh0UHJvcHMgfHxcbiAgICAgICAgICAgIGRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQgfHxcbiAgICAgICAgICAgIChjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIkEgY29tcG9uZW50IGlzIGNoYW5naW5nIGEgY29udHJvbGxlZCBpbnB1dCB0byBiZSB1bmNvbnRyb2xsZWQuIFRoaXMgaXMgbGlrZWx5IGNhdXNlZCBieSB0aGUgdmFsdWUgY2hhbmdpbmcgZnJvbSBhIGRlZmluZWQgdG8gdW5kZWZpbmVkLCB3aGljaCBzaG91bGQgbm90IGhhcHBlbi4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCBlbGVtZW50IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbXBvbmVudC4gTW9yZSBpbmZvOiBodHRwczovL3JlYWN0LmRldi9saW5rL2NvbnRyb2xsZWQtY29tcG9uZW50c1wiXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgKGRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQgPSAhMCkpO1xuICAgICAgICAgIHVwZGF0ZUlucHV0KFxuICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgbGFzdERlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAgIGNoZWNrZWQsXG4gICAgICAgICAgICBkZWZhdWx0Q2hlY2tlZCxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBuYW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgXCJzZWxlY3RcIjpcbiAgICAgICAgICBwcm9wS2V5ID0gdmFsdWUgPSBkZWZhdWx0VmFsdWUgPSBfcHJvcEtleTggPSBudWxsO1xuICAgICAgICAgIGZvciAodHlwZSBpbiBsYXN0UHJvcHMpXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICgobGFzdERlZmF1bHRWYWx1ZSA9IGxhc3RQcm9wc1t0eXBlXSksXG4gICAgICAgICAgICAgIGxhc3RQcm9wcy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSAmJiBudWxsICE9IGxhc3REZWZhdWx0VmFsdWUpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ2YWx1ZVwiOlxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm11bHRpcGxlXCI6XG4gICAgICAgICAgICAgICAgICBwcm9wS2V5ID0gbGFzdERlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgbmV4dFByb3BzLmhhc093blByb3BlcnR5KHR5cGUpIHx8XG4gICAgICAgICAgICAgICAgICAgIHNldFByb3AoXG4gICAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgIG5leHRQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgICBsYXN0RGVmYXVsdFZhbHVlXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKG5hbWUgaW4gbmV4dFByb3BzKVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAoKHR5cGUgPSBuZXh0UHJvcHNbbmFtZV0pLFxuICAgICAgICAgICAgICAobGFzdERlZmF1bHRWYWx1ZSA9IGxhc3RQcm9wc1tuYW1lXSksXG4gICAgICAgICAgICAgIG5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJlxuICAgICAgICAgICAgICAgIChudWxsICE9IHR5cGUgfHwgbnVsbCAhPSBsYXN0RGVmYXVsdFZhbHVlKSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInZhbHVlXCI6XG4gICAgICAgICAgICAgICAgICB0eX
15852BlICE9PSBsYXN0RGVmYXVsdFZhbHVlICYmXG4gICAgICAgICAgICAgICAgICAgICh2aWV3VHJhbnNpdGlvbk11dGF0aW9uQ29udGV4dCA9ICEwKTtcbiAgICAgICAgICAgICAgICAgIF9wcm9wS2V5OCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGVmYXVsdFZhbHVlXCI6XG4gICAgICAgICAgICAgICAgICB0eXBlICE9PSBsYXN0RGVmYXVsdFZhbHVlICYmXG4gICAgICAgICAgICAgICAgICAgICh2aWV3VHJhbnNpdGlvbk11dGF0aW9uQ29udGV4dCA9ICEwKTtcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IHR5cGU7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibXVsdGlwbGVcIjpcbiAgICAgICAgICAgICAgICAgIHR5cGUgIT09IGxhc3REZWZhdWx0VmFsdWUgJiZcbiAgICAgICAgICAgICAgICAgICAgKHZpZXdUcmFuc2l0aW9uTXV0YXRpb25Db250ZXh0ID0gITApLFxuICAgICAgICAgICAgICAgICAgICAodmFsdWUgPSB0eXBlKTtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgdHlwZSAhPT0gbGFzdERlZmF1bHRWYWx1ZSAmJlxuICAgICAgICAgICAgICAgICAgICBzZXRQcm9wKFxuICAgICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICBuZXh0UHJvcHMsXG4gICAgICAgICAgICAgICAgICAgICAgbGFzdERlZmF1bHRWYWx1ZVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgbmV4dFByb3BzID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICAgIHRhZyA9IHZhbHVlO1xuICAgICAgICAgIGxhc3RQcm9wcyA9IHByb3BLZXk7XG4gICAgICAgICAgbnVsbCAhPSBfcHJvcEtleThcbiAgICAgICAgICAgID8gdXBkYXRlT3B0aW9ucyhkb21FbGVtZW50LCAhIXRhZywgX3Byb3BLZXk4LCAhMSlcbiAgICAgICAgICAgIDogISFsYXN0UHJvcHMgIT09ICEhdGFnICYmXG4gICAgICAgICAgICAgIChudWxsICE9IG5leHRQcm9wc1xuICAgICAgICAgICAgICAgID8gdXBkYXRlT3B0aW9ucyhkb21FbGVtZW50LCAhIXRhZywgbmV4dFByb3BzLCAhMClcbiAgICAgICAgICAgICAgICA6IHVwZGF0ZU9wdGlvbnMoZG9tRWxlbWVudCwgISF0YWcsIHRhZyA/IFtdIDogXCJcIiwgITEpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgXCJ0ZXh0YXJlYVwiOlxuICAgICAgICAgIHByb3BLZXkgPSBfcHJvcEtleTggPSBudWxsO1xuICAgICAgICAgIGZvciAoZGVmYXVsdFZhbHVlIGluIGxhc3RQcm9wcylcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgKChuYW1lID0gbGFzdFByb3BzW2RlZmF1bHRWYWx1ZV0pLFxuICAgICAgICAgICAgICBsYXN0UHJvcHMuaGFzT3duUHJvcGVydHkoZGVmYXVsdFZhbHVlKSAmJlxuICAgICAgICAgICAgICAgIG51bGwgIT0gbmFtZSAmJlxuICAgICAgICAgICAgICAgICFuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkoZGVmYXVsdFZhbHVlKSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgc3dpdGNoIChkZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwidmFsdWVcIjpcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJjaGlsZHJlblwiOlxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIHNldFByb3AoZG9tRWxlbWVudCwgdGFnLCBkZWZhdWx0VmFsdWUsIG51bGwsIG5leHRQcm9wcywgbmFtZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKHZhbHVlIGluIG5leHRQcm9wcylcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgKChuYW1lID0gbmV4dFByb3BzW3ZhbHVlXSksXG4gICAgICAgICAgICAgICh0eXBlID0gbGFzdFByb3BzW3ZhbHVlXSksXG4gICAgICAgICAgICAgIG5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkgJiYgKG51bGwgIT0gbmFtZSB8fCBudWxsICE9IHR5cGUpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInZhbHVlXCI6XG4gICAgICAgICAgICAgICAgICBuYW1lICE9PSB0eXBlICYmICh2aWV3VHJhbnNpdGlvbk11dGF0aW9uQ29udGV4dCA9ICEwKTtcbiAgICAgICAgICAgICAgICAgIF9wcm9wS2V5OCA9IG5hbWU7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGVmYXVsdFZhbHVlXCI6XG4gICAgICAgICAgICAgICAgICBuYW1lICE9PSB0eXBlICYmICh2aWV3VHJhbnNpdGlvbk11dGF0aW9uQ29udGV4dCA9ICEwKTtcbiAgICAgICAgICAgICAgICAgIHByb3BLZXkgPSBuYW1lO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImNoaWxkcmVuXCI6XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxcIjpcbiAgICAgICAgICAgICAgICAgIGlmIChudWxsICE9IG5hbWUpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgIFwiYGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYCBkb2VzIG5vdCBtYWtlIHNlbnNlIG9uIDx0ZXh0YXJlYT4uXCJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBuYW1lICE9PSB0eXBlICYmXG4gICAgICAgICAgICAgICAgICAgIHNldFByb3AoZG9tRWxlbWVudCwgdGFnLCB2YWx1ZSwgbmFtZSwgbmV4dFByb3BzLCB0eXBlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIHVwZGF0ZVRleHRhcmVhKGRvbUVsZW1lbnQsIF9wcm9wS2V5OCwgcHJvcEtleSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjYXNlIFwib3B0aW9uXCI6XG4gICAgICAgICAgZm9yICh2YXIgX3Byb3BLZXkxMyBpbiBsYXN0UHJvcHMpXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICgoX3Byb3BLZXk4ID0gbGFzdFByb3BzW19wcm9wS2V5MTNdKSxcbiAgICAgICAgICAgICAgbGFzdFByb3BzLmhhc093blByb3BlcnR5KF9wcm9wS2V5MTMpICYmXG4gICAgICAgICAgICAgICAgbnVsbCAhPSBfcHJvcEtleTggJiZcbiAgICAgICAgICAgICAgICAhbmV4dFByb3BzLmhhc093blByb3BlcnR5KF9wcm9wS2V5MTMpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBzd2l0Y2ggKF9wcm9wS2V5MTMpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic2VsZWN0ZWRcIjpcbiAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQuc2VsZWN0ZWQgPSAhMTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBzZXRQcm9wKFxuICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgICAgICAgIF9wcm9wS2V5MTMsXG4gICAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICAgIG5leHRQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgX3Byb3BLZXk4XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChsYXN0RGVmYXVsdFZhbHVlIGluIG5leHRQcm9wcylcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgKChfcHJvcEtleTggPSBuZXh0UHJvcHNbbGFzdERlZmF1bHRWYWx1ZV0pLFxuICAgICAgICAgICAgICAocHJvcEtleSA9IGxhc3RQcm9wc1tsYXN0RGVmYXVsdFZhbHVlXSksXG4gICAgICAgICAgICAgIG5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShsYXN0RGVmYXVsdFZhbHVlKSAmJlxuICAgICAgICAgICAgICAgIF9wcm9wS2V5OCAhPT0gcHJvcEtleSAmJlxuICAgICAgICAgICAgICAgIChudWxsICE9IF9wcm9wS2V5OCB8fCBudWxsICE9IHByb3BLZXkpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBzd2l0Y2ggKGxhc3REZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic2VsZWN0ZWRcIjpcbiAgICAgICAgICAgICAgICAgIF9wcm9wS2V5OCAhPT0gcHJvcEtleSAmJiAodmlld1RyYW5zaXRpb25NdXRhdGlvbkNvbnRleHQgPSAhMCk7XG4gICAgICAgICAgICAgICAgICBkb21FbGVtZW50LnNlbGVjdGVkID1cbiAgICAgICAgICAgICAgICAgICAgX3Byb3BLZXk4ICYmXG4gICAgICAgICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIF9wcm9wS2V5OCAmJlxuICAgICAgICAgICAgICAgICAgICBcInN5bWJvbFwiICE9PSB0eXBlb2YgX3Byb3BLZXk4O1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgI
15852HNldFByb3AoXG4gICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHRhZyxcbiAgICAgICAgICAgICAgICAgICAgbGFzdERlZmF1bHRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgX3Byb3BLZXk4LFxuICAgICAgICAgICAgICAgICAgICBuZXh0UHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIHByb3BLZXlcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgXCJpbWdcIjpcbiAgICAgICAgY2FzZSBcImxpbmtcIjpcbiAgICAgICAgY2FzZSBcImFyZWFcIjpcbiAgICAgICAgY2FzZSBcImJhc2VcIjpcbiAgICAgICAgY2FzZSBcImJyXCI6XG4gICAgICAgIGNhc2UgXCJjb2xcIjpcbiAgICAgICAgY2FzZSBcImVtYmVkXCI6XG4gICAgICAgIGNhc2UgXCJoclwiOlxuICAgICAgICBjYXNlIFwia2V5Z2VuXCI6XG4gICAgICAgIGNhc2UgXCJtZXRhXCI6XG4gICAgICAgIGNhc2UgXCJwYXJhbVwiOlxuICAgICAgICBjYXNlIFwic291cmNlXCI6XG4gICAgICAgIGNhc2UgXCJ0cmFja1wiOlxuICAgICAgICBjYXNlIFwid2JyXCI6XG4gICAgICAgIGNhc2UgXCJtZW51aXRlbVwiOlxuICAgICAgICAgIGZvciAodmFyIF9wcm9wS2V5MTUgaW4gbGFzdFByb3BzKVxuICAgICAgICAgICAgKF9wcm9wS2V5OCA9IGxhc3RQcm9wc1tfcHJvcEtleTE1XSksXG4gICAgICAgICAgICAgIGxhc3RQcm9wcy5oYXNPd25Qcm9wZXJ0eShfcHJvcEtleTE1KSAmJlxuICAgICAgICAgICAgICAgIG51bGwgIT0gX3Byb3BLZXk4ICYmXG4gICAgICAgICAgICAgICAgIW5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShfcHJvcEtleTE1KSAmJlxuICAgICAgICAgICAgICAgIHNldFByb3AoXG4gICAgICAgICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICAgICAgX3Byb3BLZXkxNSxcbiAgICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgICBuZXh0UHJvcHMsXG4gICAgICAgICAgICAgICAgICBfcHJvcEtleThcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgIGZvciAoY2hlY2tlZCBpbiBuZXh0UHJvcHMpXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICgoX3Byb3BLZXk4ID0gbmV4dFByb3BzW2NoZWNrZWRdKSxcbiAgICAgICAgICAgICAgKHByb3BLZXkgPSBsYXN0UHJvcHNbY2hlY2tlZF0pLFxuICAgICAgICAgICAgICBuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkoY2hlY2tlZCkgJiZcbiAgICAgICAgICAgICAgICBfcHJvcEtleTggIT09IHByb3BLZXkgJiZcbiAgICAgICAgICAgICAgICAobnVsbCAhPSBfcHJvcEtleTggfHwgbnVsbCAhPSBwcm9wS2V5KSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgc3dpdGNoIChjaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcImNoaWxkcmVuXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCI6XG4gICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBfcHJvcEtleTgpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgIHRhZyArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIiBpcyBhIHZvaWQgZWxlbWVudCB0YWcgYW5kIG11c3QgbmVpdGhlciBoYXZlIGBjaGlsZHJlbmAgbm9yIHVzZSBgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgLlwiXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgc2V0UHJvcChcbiAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgdGFnLFxuICAgICAgICAgICAgICAgICAgICBjaGVja2VkLFxuICAgICAgICAgICAgICAgICAgICBfcHJvcEtleTgsXG4gICAgICAgICAgICAgICAgICAgIG5leHRQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcEtleVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoaXNDdXN0b21FbGVtZW50KHRhZykpIHtcbiAgICAgICAgICAgIGZvciAodmFyIF9wcm9wS2V5MTcgaW4gbGFzdFByb3BzKVxuICAgICAgICAgICAgICAoX3Byb3BLZXk4ID0gbGFzdFByb3BzW19wcm9wS2V5MTddKSxcbiAgICAgICAgICAgICAgICBsYXN0UHJvcHMuaGFzT3duUHJvcGVydHkoX3Byb3BLZXkxNykgJiZcbiAgICAgICAgICAgICAgICAgIHZvaWQgMCAhPT0gX3Byb3BLZXk4ICYmXG4gICAgICAgICAgICAgICAgICAhbmV4dFByb3BzLmhhc093blByb3BlcnR5KF9wcm9wS2V5MTcpICYmXG4gICAgICAgICAgICAgICAgICBzZXRQcm9wT25DdXN0b21FbGVtZW50KFxuICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICB0YWcsXG4gICAgICAgICAgICAgICAgICAgIF9wcm9wS2V5MTcsXG4gICAgICAgICAgICAgICAgICAgIHZvaWQgMCxcbiAgICAgICAgICAgICAgICAgICAgbmV4dFByb3BzLFxuICAgICAgICAgICAgICAgICAgICBfcHJvcEtleThcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmb3IgKGRlZmF1bHRDaGVja2VkIGluIG5leHRQcm9wcylcbiAgICAgICAgICAgICAgKF9wcm9wS2V5OCA9IG5leHRQcm9wc1tkZWZhdWx0Q2hlY2tlZF0pLFxuICAgICAgICAgICAgICAgIChwcm9wS2V5ID0gbGFzdFByb3BzW2RlZmF1bHRDaGVja2VkXSksXG4gICAgICAgICAgICAgICAgIW5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShkZWZhdWx0Q2hlY2tlZCkgfHxcbiAgICAgICAgICAgICAgICAgIF9wcm9wS2V5OCA9PT0gcHJvcEtleSB8fFxuICAgICAgICAgICAgICAgICAgKHZvaWQgMCA9PT0gX3Byb3BLZXk4ICYmIHZvaWQgMCA9PT0gcHJvcEtleSkgfHxcbiAgICAgICAgICAgICAgICAgIHNldFByb3BPbkN1c3RvbUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgI
15852HRhZyxcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdENoZWNrZWQsXG4gICAgICAgICAgICAgICAgICAgIF9wcm9wS2V5OCxcbiAgICAgICAgICAgICAgICAgICAgbmV4dFByb3BzLFxuICAgICAgICAgICAgICAgICAgICBwcm9wS2V5XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAodmFyIF9wcm9wS2V5MTkgaW4gbGFzdFByb3BzKVxuICAgICAgICAoX3Byb3BLZXk4ID0gbGFzdFByb3BzW19wcm9wS2V5MTldKSxcbiAgICAgICAgICBsYXN0UHJvcHMuaGFzT3duUHJvcGVydHkoX3Byb3BLZXkxOSkgJiZcbiAgICAgICAgICAgIG51bGwgIT0gX3Byb3BLZXk4ICYmXG4gICAgICAgICAgICAhbmV4dFByb3BzLmhhc093blByb3BlcnR5KF9wcm9wS2V5MTkpICYmXG4gICAgICAgICAgICBzZXRQcm9wKGRvbUVsZW1lbnQsIHRhZywgX3Byb3BLZXkxOSwgbnVsbCwgbmV4dFByb3BzLCBfcHJvcEtleTgpO1xuICAgICAgZm9yIChsYXN0UHJvcCBpbiBuZXh0UHJvcHMpXG4gICAgICAgIChfcHJvcEtleTggPSBuZXh0UHJvcHNbbGFzdFByb3BdKSxcbiAgICAgICAgICAocHJvcEtleSA9IGxhc3RQcm9wc1tsYXN0UHJvcF0pLFxuICAgICAgICAgICFuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkobGFzdFByb3ApIHx8XG4gICAgICAgICAgICBfcHJvcEtleTggPT09IHByb3BLZXkgfHxcbiAgICAgICAgICAgIChudWxsID09IF9wcm9wS2V5OCAmJiBudWxsID09IHByb3BLZXkpIHx8XG4gICAgICAgICAgICBzZXRQcm9wKGRvbUVsZW1lbnQsIHRhZywgbGFzdFByb3AsIF9wcm9wS2V5OCwgbmV4dFByb3BzLCBwcm9wS2V5KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0UHJvcE5hbWVGcm9tQXR0cmlidXRlTmFtZShhdHRyTmFtZSkge1xuICAgICAgc3dpdGNoIChhdHRyTmFtZSkge1xuICAgICAgICBjYXNlIFwiY2xhc3NcIjpcbiAgICAgICAgICByZXR1cm4gXCJjbGFzc05hbWVcIjtcbiAgICAgICAgY2FzZSBcImZvclwiOlxuICAgICAgICAgIHJldHVybiBcImh0bWxGb3JcIjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gYXR0ck5hbWU7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldFN0eWxlc09iamVjdEZyb21FbGVtZW50KGRvbUVsZW1lbnQpIHtcbiAgICAgIGZvciAoXG4gICAgICAgIHZhciBzZXJ2ZXJWYWx1ZUluT2JqZWN0Rm9ybSA9IHt9LCBzdHlsZSA9IGRvbUVsZW1lbnQuc3R5bGUsIGkgPSAwO1xuICAgICAgICBpIDwgc3R5bGUubGVuZ3RoO1xuICAgICAgICBpKytcbiAgICAgICkge1xuICAgICAgICB2Y
15852XIgc3R5bGVOYW1lID0gc3R5bGVbaV07XG4gICAgICAgIChcInZpZXctdHJhbnNpdGlvbi1uYW1lXCIgPT09IHN0eWxlTmFtZSAmJlxuICAgICAgICAgIGlzRXhwZWN0ZWRWaWV3VHJhbnNpdGlvbk5hbWUoZG9tRWxlbWVudCkpIHx8XG4gICAgICAgICAgKHNlcnZlclZhbHVlSW5PYmplY3RGb3JtW3N0eWxlTmFtZV0gPVxuICAgICAgICAgICAgc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShzdHlsZU5hbWUpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZXJ2ZXJWYWx1ZUluT2JqZWN0Rm9ybTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGlmZkh5ZHJhdGVkU3R5bGVzKGRvbUVsZW1lbnQsIHZhbHVlJGpzY29tcCQwLCBzZXJ2ZXJEaWZmZXJlbmNlcykge1xuICAgICAgaWYgKG51bGwgIT0gdmFsdWUkanNjb21wJDAgJiYgXCJvYmplY3RcIiAhPT0gdHlwZW9mIHZhbHVlJGpzY29tcCQwKVxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiVGhlIGBzdHlsZWAgcHJvcCBleHBlY3RzIGEgbWFwcGluZyBmcm9tIHN0eWxlIHByb3BlcnRpZXMgdG8gdmFsdWVzLCBub3QgYSBzdHJpbmcuIEZvciBleGFtcGxlLCBzdHlsZT17e21hcmdpblJpZ2h0OiBzcGFjaW5nICsgJ2VtJ319IHdoZW4gdXNpbmcgSlNYLlwiXG4gICAgICAgICk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgdmFyIGNsaWVudFZhbHVlO1xuICAgICAgICB2YXIgZGVsaW1pdGVyID0gKGNsaWVudFZhbHVlID0gXCJcIiksXG4gICAgICAgICAgc3R5bGVOYW1lO1xuICAgICAgICBmb3IgKHN0eWxlTmFtZSBpbiB2YWx1ZSRqc2NvbXAkMClcbiAgICAgICAgICBpZiAodmFsdWUkanNjb21wJDAuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gdmFsdWUkanNjb21wJDBbc3R5bGVOYW1lXTtcbiAgICAgICAgICAgIG51bGwgIT0gdmFsdWUgJiZcbiAgICAgICAgICAgICAgXCJib29sZWFuXCIgIT09IHR5cGVvZiB2YWx1ZSAmJlxuICAgICAgICAgICAgICBcIlwiICE9PSB2YWx1ZSAmJlxuICAgICAgICAgICAgICAoMCA9PT0gc3R5bGVOYW1lLmluZGV4T2YoXCItLVwiKVxuICAgICAgICAgICAgICAgID8gKGNoZWNrQ1NTUHJvcGVydHlTdHJpbmdDb2VyY2lvbih2YWx1ZSwgc3R5bGVOYW1lKSxcbiAgICAgICAgICAgICAgICAgIChjbGllbnRWYWx1ZSArPVxuICAgICAgICAgICAgICAgICAgICBkZWxpbWl0ZXIgKyBzdHlsZU5hbWUgKyBcIjpcIiArIChcIlwiICsgdmFsdWUpLnRyaW0oKSkpXG4gICAgICAgICAgICAgICAgOiBcIm51bWJlclwiICE9PSB0eXBlb2YgdmFsdWUgfHxcbiAgICAgICAgICAgICAgICAgICAgMCA9PT0gdmFsdWUgfHxcbiAgICAgICAgICAgICAgICAgICAgdW5pdGxlc3NOdW1iZXJzLmhhcyhzdHlsZU5hbWUpXG4gICAgICAgICAgICAgICAgICA/IChjaGVja0NTU1Byb3BlcnR5U3RyaW5nQ29lcmNpb24odmFsdWUsIHN0eWxlTmFtZSksXG4gICAgICAgICAgICAgICAgICAgIChjbGllbnRWYWx1ZSArPVxuICAgICAgICAgICAgICAgICAgICAgIGRlbGltaXRlciArXG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGVOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSh1cHBlcmNhc2VQYXR0ZXJuLCBcIi0kMVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKG1zUGF0dGVybiQxLCBcIi1tcy1cIikgK1xuICAgICAgICAgICAgICAgICAgICAgIFwiOlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAoXCJcIiArIHZhbHVlKS50cmltKCkpKVxuICAgICAgICAgICAgICAgICAgOiAoY2xpZW50VmFsdWUgKz1cbiAgICAgICAgICAgICAgICAgICAgICBkZWxpbWl0ZXIgK1xuICAgICAgICAgICAgICAgICAgICAgIHN0eWxlTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UodXBwZXJjYXNlUGF0dGVybiwgXCItJDFcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShtc1BhdHRlcm4kMSwgXCItbXMtXCIpICtcbiAgICAgICAgICAgICAgICAgICAgICBcIjpcIiArXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWUgK1xuICAgICAgICAgICAgICAgICAgICAgIFwicHhcIiksXG4gICAgICAgICAgICAgIChkZWxpbWl0ZXIgPSBcIjtcIikpO1xuICAgICAgICAgIH1cbiAgICAgICAgY2xpZW50VmFsdWUgPSBjbGllbnRWYWx1ZSB8fCBudWxsO1xuICAgICAgICB2YWx1ZSRqc2NvbXAkMCA9IGRvbUVsZW1lbnQuZ2V0QXR0cmlidXRlKFwic3R5bGVcIik7XG4gICAgICAgIHZhbHVlJGpzY29tcCQwICE9PSBjbGllbnRWYWx1ZSAmJlxuICAgICAgICAgICgoY2xpZW50VmFsdWUgPSBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUoY2xpZW50VmFsdWUpKSxcbiAgICAgICAgICAodmFsdWUkanNjb21wJDAgPSBub3JtYWxpemVNYXJrdXBGb3JUZXh0T3JBdHRyaWJ1dGUodmFsdWUkanNjb21wJDApKSxcbiAgICAgICAgICB2YWx1ZSRqc2NvbXAkMCA9PT0gY2xpZW50VmFsdWUgfHxcbiAgICAgICAgICAgIChcIjtcIiA9PT0gdmFsdWUkanNjb21wJDBbdmFsdWUkanNjb21wJDAubGVuZ3RoIC0gMV0gJiZcbiAgICAgICAgICAgICAgaGFzVmlld1RyYW5zaXRpb24oZG9tRWxlbWVudCkpIHx8XG4gICAgICAgICAgICAoc2VydmVyRGlmZmVyZW5jZXMuc3R5bGUgPSBnZXRTdHlsZXNPYmplY3RGcm9tRWxlbWVudChkb21FbGVtZW50KSkpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBoeWRyYXRlQXR0cmlidXRlKFxuICAgICAgZG9tRWxlbWVudCxcbiAgICAgIHByb3BLZXksXG4gICAgICBhdHRyaWJ1dGVOYW1lLFxuICAgICAgdmFsdWUsXG4gICAgICBleHRyYUF0dHJpYnV0ZXMsXG4gICAgICBzZXJ2ZXJEaWZmZXJlbmNlc1xuICAgICkge1xuICAgICAgZXh0cmFBdHRyaWJ1dGVzLmRlbGV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgIGRvbUVsZW1lbnQgPSBkb21FbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgIGlmIChudWxsID09PSBkb21FbGVtZW50KVxuICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICBjYXNlIFwic3ltYm9sXCI6XG4gICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICAgI
15852HJldHVybjtcbiAgICAgICAgfVxuICAgICAgZWxzZSBpZiAobnVsbCAhPSB2YWx1ZSlcbiAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICBjYXNlIFwic3ltYm9sXCI6XG4gICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIChjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBwcm9wS2V5KSxcbiAgICAgICAgICAgICAgZG9tRWxlbWVudCA9PT0gXCJcIiArIHZhbHVlKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBkb21FbGVtZW50LCB2YWx1ZSwgc2VydmVyRGlmZmVyZW5jZXMpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBoeWRyYXRlQm9vbGVhbkF0dHJpYnV0ZShcbiAgICAgIGRvbUVsZW1lbnQsXG4gICAgICBwcm9wS2V5LFxuICAgICAgYXR0cmlidXRlTmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgZXh0cmFBdHRyaWJ1dGVzLFxuICAgICAgc2VydmVyRGlmZmVyZW5jZXNcbiAgICApIHtcbiAgICAgIGV4dHJhQXR0cmlidXRlcy5kZWxldGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICBkb21FbGVtZW50ID0gZG9tRWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICBpZiAobnVsbCA9PT0gZG9tRWxlbWVudCkge1xuICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICAgIGNhc2UgXCJzeW1ib2xcIjpcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm47XG4gICAgICB9IGVsc2VcbiAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICBjYXNlIFwic3ltYm9sXCI6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgaWYgKHZhbHVlKSByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBkb21FbGVtZW50LCB2YWx1ZSwgc2VydmVyRGlmZmVyZW5jZXMpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBoeWRyYXRlQm9vbGVhbmlzaEF0dHJpYnV0ZShcbiAgICAgIGRvbUVsZW1lbnQsXG4gICAgICBwcm9wS2V5LFxuICAgICAgYXR0cmlidXRlTmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgZXh0cmFBdHRyaWJ1dGVzLFxuICAgICAgc2VydmVyRGlmZmVyZW5jZXNcbiAgICApIHtcbiAgICAgIGV4dHJhQXR0cmlidXRlcy5kZWxldGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICBkb21FbGVtZW50ID0gZG9tRWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICBpZiAobnVsbCA9PT0gZG9tRWxlbWVudClcbiAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICAgICAgY2FzZSBcImZ1bmN0aW9uXCI6XG4gICAgICAgICAgY2FzZSBcInN5bWJvbFwiOlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICBlbHNlIGlmIChudWxsICE9IHZhbHVlKVxuICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICAgIGNhc2UgXCJzeW1ib2xcIjpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIChjaGVja0F0dHJpYnV0ZVN0cmluZ0NvZXJjaW9uKHZhbHVlLCBhdHRyaWJ1dGVOYW1lKSxcbiAgICAgICAgICAgICAgZG9tRWxlbWVudCA9PT0gXCJcIiArIHZhbHVlKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBkb21FbGVtZW50LCB2YWx1ZSwgc2VydmVyRGlmZmVyZW5jZXMpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBoeWRyYXRlTnVtZXJpY0F0dHJpYnV0ZShcbiAgICAgIGRvbUVsZW1lbnQsXG4gICAgICBwcm9wS2V5LFxuICAgICAgYXR0cmlidXRlTmFtZSxcbiAgICAgIHZhbHVlLFxuICAgICAgZXh0cmFBdHRyaWJ1dGVzLFxuICAgICAgc2VydmVyRGlmZmVyZW5jZXNcbiAgICApIHtcbiAgICAgIGV4dHJhQXR0cmlidXRlcy5kZWxldGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICBkb21FbGVtZW50ID0gZG9tRWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICBpZiAobnVsbCA9PT0gZG9tRWxlbWVudClcbiAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICAgICAgY2FzZSBcImZ1bmN0aW9uXCI6XG4gICAgICAgICAgY2FzZSBcInN5bWJvbFwiOlxuICAgICAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmIChpc05hTih2YWx1ZSkpIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgZWxzZSBpZiAobnVsbCAhPSB2YWx1ZSlcbiAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICBjYXNlIFwic3ltYm9sXCI6XG4gICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICFpc05hTih2YWx1ZSkgJiZcbiAgICAgICAgICAgICAgKGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24odmFsdWUsIHByb3BLZXkpLFxuICAgICAgICAgICAgICBkb21FbGVtZW50ID09PSBcIlwiICsgdmFsdWUpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKHByb3BLZXksIGRvbUVsZW1lbnQsIHZhbHVlLCBzZXJ2ZXJEaWZmZXJlbmNlcyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGh5ZHJhdGVTYW5pdGl6ZWRBdHRyaWJ1dGUoXG4gICAgICBkb21FbGVtZW50LFxuICAgICAgcHJvcEtleSxcbiAgICAgIGF0dHJpYnV0ZU5hbWUsXG4gICAgICB2YWx1ZSxcbiAgICAgIGV4dHJhQXR0cmlidXRlcyxcbiAgICAgIHNlcnZlckRpZmZlcmVuY2VzXG4gICAgKSB7XG4gICAgICBleHRyYUF0dHJpYnV0ZXMuZGVsZXRlKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgZG9tRWxlbWVudCA9IGRvbUVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgaWYgKG51bGwgPT09IGRvbUVsZW1lbnQpXG4gICAgICAgI
15852HN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgICAgICAgY2FzZSBcInVuZGVmaW5lZFwiOlxuICAgICAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICAgIGNhc2UgXCJzeW1ib2xcIjpcbiAgICAgICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICBlbHNlIGlmIChudWxsICE9IHZhbHVlKVxuICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICAgIGNhc2UgXCJzeW1ib2xcIjpcbiAgICAgICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgKGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24odmFsdWUsIHByb3BLZXkpLFxuICAgICAgICAgICAgICAoYXR0cmlidXRlTmFtZSA9IHNhbml0aXplVVJMKFwiXCIgKyB2YWx1ZSkpLFxuICAgICAgICAgICAgICBkb21FbGVtZW50ID09PSBhdHRyaWJ1dGVOYW1lKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShwcm9wS2V5LCBkb21FbGVtZW50LCB2YWx1ZSwgc2VydmVyRGlmZmVyZW5jZXMpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkaWZmSHlkcmF0ZWRQcm9wZXJ0aWVzKGRvbUVsZW1lbnQsIHRhZywgcHJvcHMsIGhvc3RDb250ZXh0KSB7XG4gICAgICBmb3IgKFxuICAgICAgICB2Y
15852XIgc2VydmVyRGlmZmVyZW5jZXMgPSB7fSxcbiAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMgPSBuZXcgU2V0KCksXG4gICAgICAgICAgYXR0cmlidXRlcyA9IGRvbUVsZW1lbnQuYXR0cmlidXRlcyxcbiAgICAgICAgICBpID0gMDtcbiAgICAgICAgaSA8IGF0dHJpYnV0ZXMubGVuZ3RoO1xuICAgICAgICBpKytcbiAgICAgIClcbiAgICAgICAgc3dpdGNoIChhdHRyaWJ1dGVzW2ldLm5hbWUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgIGNhc2UgXCJ2YWx1ZVwiOlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImNoZWNrZWRcIjpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJzZWxlY3RlZFwiOlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcInZ0LW5hbWVcIjpcbiAgICAgICAgICBjYXNlIFwidnQtdXBkYXRlXCI6XG4gICAgICAgICAgY2FzZSBcInZ0LWVudGVyXCI6XG4gICAgICAgICAgY2FzZSBcInZ0LWV4aXRcIjpcbiAgICAgICAgICBjYXNlIFwidnQtc2hhcmVcIjpcbiAgICAgICAgICBjYXNlIFwidnQtcGFyZW50LWVudGVyXCI6XG4gICAgICAgICAgY2FzZSBcInZ0LXBhcmVudC1leGl0XCI6XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVzLmFkZChhdHRyaWJ1dGVzW2ldLm5hbWUpO1xuICAgICAgICB9XG4gICAgICBpZiAoaXNDdXN0b21FbGVtZW50KHRhZykpXG4gICAgICAgIGZvciAodmFyIHByb3BLZXkgaW4gcHJvcHMpIHtcbiAgICAgICAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHByb3BzW3Byb3BLZXldO1xuICAgICAgICAgICAgaWYgKG51bGwgIT0gdmFsdWUpXG4gICAgICAgICAgICAgIGlmIChyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKVxuICAgICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIHZhbHVlICYmXG4gICAgICAgICAgICAgICAgICB3YXJuRm9ySW52YWxpZEV2ZW50TGlzdGVuZXIocHJvcEtleSwgdmFsdWUpO1xuICAgICAgICAgICAgICBlbHNlIGlmICghMCAhPT0gcHJvcHMuc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nKVxuICAgICAgICAgICAgICAgIHN3aXRjaCAocHJvcEtleSkge1xuICAgICAgICAgICAgICAgICAgY2FzZSBcImNoaWxkcmVuXCI6XG4gICAgICAgICAgICAgICAgICAgIChcInN0cmluZ1wiICE9PSB0eXBlb2YgdmFsdWUgJiYgXCJudW1iZXJcIiAhPT0gdHlwZW9mIHZhbHVlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiY2hpbGRyZW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQudGV4dENvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckRpZmZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICBjYXNlIFwic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nXCI6XG4gICAgICAgICAgICAgICAgICBjYXNlIFwic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nXCI6XG4gICAgICAgICAgICAgICAgICBjYXNlIFwiZGVmYXVsdFZhbHVlXCI6XG4gICAgICAgICAgICAgICAgICBjYXNlIFwiZGVmYXVsdENoZWNrZWRcIjpcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJpbm5lckhUTUxcIjpcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJyZWZcIjpcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICBjYXNlIFwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxcIjpcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyA9IGRvbUVsZW1lbnQuaW5uZXJIVE1MO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID8gdmFsdWUuX19odG1sIDogdm9pZCAwO1xuICAgICAgICAgICAgICAgICAgICBudWxsICE9IHZhbHVlICYmXG4gICAgICAgICAgICAgICAgICAgICAgKCh2YWx1ZSA9IG5vcm1hbGl6ZUhUTUwoZG9tRWxlbWVudCwgdmFsdWUpKSxcbiAgICAgICAgICAgICAgICAgICAgICB3YXJuRm9yUHJvcERpZmZlcmVuY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyRGlmZmVyZW5jZXNcbiAgICAgICAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICBjYXNlIFwic3R5bGVcIjpcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVzLmRlbGV0ZShwcm9wS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgZGlmZkh5ZHJhdGVkU3R5bGVzKGRvbUVsZW1lbnQsIHZhbHVlLCBzZXJ2ZXJEaWZmZXJlbmNlcyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgY2FzZSBcIm9mZnNldFBhcmVudFwiOlxuICAgICAgICAgICAgICAgICAgY2FzZSBcIm9mZnNldFRvcFwiOlxuICAgICAgICAgICAgICAgICAgY2FzZSBcIm9mZnNldExlZnRcIjpcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJvZmZzZXRXaWR0aFwiOlxuICAgICAgICAgICAgICAgICAgY2FzZSBcIm9mZnNldEhlaWdodFwiOlxuICAgICAgICAgICAgICAgICAgY2FzZSBcImlzQ29udGVudEVkaXRhYmxlXCI6XG4gICAgICAgICAgICAgICAgICBjYXNlIFwib3V0ZXJUZXh0XCI6XG4gICAgICAgICAgICAgICAgICBjYXNlIFwib3V0ZXJIVE1MXCI6XG4gICAgICAgICAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlcy5kZWxldGUocHJvcEtleS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICBcIkFzc2lnbm1lbnQgdG8gcmVhZC1vbmx5IHByb3BlcnR5IHdpbGwgcmVzdWx0IGluIGEgbm8tb3A6IGAlc2BcIixcbiAgICAgICAgICAgICAgICAgICAgICBwcm9wS2V5XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgY2FzZSBcImNsYXNzTmFtZVwiOlxuICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMuZGVsZXRlKFwiY2xhc3NcIik7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBnZXRWYWx1ZUZvckF0dHJpYnV0ZU9uQ3VzdG9tQ29tcG9uZW50KFxuICAgICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgXCJjbGFzc1wiLFxuICAgICAgICAgICAgICAgICAgICAgI
15852HZhbHVlXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShcbiAgICAgICAgICAgICAgICAgICAgICBcImNsYXNzTmFtZVwiLFxuICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgc2VydmVyRGlmZmVyZW5jZXNcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBob3N0Q29udGV4dC5jb250ZXh0ID09PSBIb3N0Q29udGV4dE5hbWVzcGFjZU5vbmUgJiZcbiAgICAgICAgICAgICAgICAgICAgXCJzdmdcIiAhPT0gdGFnICYmXG4gICAgICAgICAgICAgICAgICAgIFwibWF0aFwiICE9PSB0YWdcbiAgICAgICAgICAgICAgICAgICAgICA/IGV4dHJhQXR0cmlidXRlcy5kZWxldGUocHJvcEtleS50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgICAgICAgICAgICAgIDogZXh0cmFBdHRyaWJ1dGVzLmRlbGV0ZShwcm9wS2V5KSxcbiAgICAgICAgICAgICAgICAgICAgICAoYXR0cmlidXRlcyA9IGdldFZhbHVlRm9yQXR0cmlidXRlT25DdXN0b21Db21wb25lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcEtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcEtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckRpZmZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBlbHNlXG4gICAgICAgIGZvciAodmFsdWUgaW4gcHJvcHMpXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgcHJvcHMuaGFzT3duUHJvcGVydHkodmFsdWUpICYmXG4gICAgICAgICAgICAoKHByb3BLZXkgPSBwcm9wc1t2YWx1ZV0pLCBudWxsICE9IHByb3BLZXkpXG4gICAgICAgICAgKVxuICAgICAgICAgICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXMuaGFzT3duUHJvcGVydHkodmFsdWUpKVxuICAgICAgICAgICAgICBcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBwcm9wS2V5ICYmXG4gICAgICAgICAgICAgICAgd2FybkZvckludmFsaWRFdmVudExpc3RlbmVyKHZhbHVlLCBwcm9wS2V5KTtcbiAgICAgICAgICAgIGVsc2UgaWYgKCEwICE9PSBwcm9wcy5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcpXG4gICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwiY2hpbGRyZW5cIjpcbiAgICAgICAgICAgICAgICAgIChcInN0cmluZ1wiICE9PSB0eXBlb2YgcHJvcEtleSAmJlxuICAgICAgICAgICAgICAgICAgICBcIm51bWJlclwiICE9PSB0eXBlb2YgcHJvcEtleSkgfHxcbiAgICAgICAgICAgICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKFxuICAgICAgICAgICAgICAgICAgICAgIFwiY2hpbGRyZW5cIixcbiAgICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50LnRleHRDb250ZW50LFxuICAgICAgICAgICAgICAgICAgICAgIHByb3BLZXksXG4gICAgICAgICAgICAgICAgICAgICAgc2VydmVyRGlmZmVyZW5jZXNcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmdcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcInZhbHVlXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImNoZWNrZWRcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwic2VsZWN0ZWRcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGVmYXVsdFZhbHVlXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImRlZmF1bHRDaGVja2VkXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImlubmVySFRNTFwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJyZWZcIjpcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJkYW5nZXJvdXNseVNldElubmVySFRNTFwiOlxuICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyA9IGRvbUVsZW1lbnQuaW5uZXJIVE1MO1xuICAgICAgICAgICAgICAgICAgcHJvcEtleSA9IHByb3BLZXkgPyBwcm9wS2V5Ll9faHRtbCA6IHZvaWQgMDtcbiAgICAgICAgICAgICAgICAgIG51bGwgIT0gcHJvcEtleSAmJlxuICAgICAgICAgICAgICAgICAgICAoKHByb3BLZXkgPSBub3JtYWxpemVIVE1MKGRvbUVsZW1lbnQsIHByb3BLZXkpKSxcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyAhPT0gcHJvcEtleSAmJlxuICAgICAgICAgICAgICAgICAgICAgIChzZXJ2ZXJEaWZmZXJlbmNlc1t2YWx1ZV0gPSB7IF9faHRtbDogYXR0cmlidXRlcyB9KSk7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIFwiY2xhc3NOYW1lXCI6XG4gICAgICAgICAgICAgICAgICBoeWRyYXRlQXR0cmlidXRlKFxuICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgXCJjbGFzc1wiLFxuICAgICAgICAgICAgICAgICAgICBwcm9wS2V5LFxuICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgIHNlcnZlckRpZmZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSBcInRhYkluZGV4XCI6XG4gICAgICAgICAgICAgICAgICBoeWRyYXRlQXR0cmlidXRlKFxuICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgXCJ0YWJpbmRleFwiLFxuICAgICAgICAgICAgICAgICAgICBwcm9wS2V5LFxuICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgI
15852HNlcnZlckRpZmZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSBcInN0eWxlXCI6XG4gICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMuZGVsZXRlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgIGRpZmZIeWRyYXRlZFN0eWxlcyhkb21FbGVtZW50LCBwcm9wS2V5LCBzZXJ2ZXJEaWZmZXJlbmNlcyk7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIFwibXVsdGlwbGVcIjpcbiAgICAgICAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlcy5kZWxldGUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudC5tdWx0aXBsZSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcEtleSxcbiAgICAgICAgICAgICAgICAgICAgc2VydmVyRGlmZmVyZW5jZXNcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIFwibXV0ZWRcIjpcbiAgICAgICAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlcy5kZWxldGUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudC5tdXRlZCxcbiAgICAgICAgICAgICAgICAgICAgcHJvcEtleSxcbiAgICAgICAgICAgICAgICAgICAgc2VydmVyRGlmZmVyZW5jZXNcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIFwiYXV0b0ZvY3VzXCI6XG4gICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMuZGVsZXRlKFwiYXV0b2ZvY3VzXCIpO1xuICAgICAgICAgICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudC5hdXRvZm9jdXMsXG4gICAgICAgICAgICAgICAgICAgIHByb3BLZXksXG4gICAgICAgICAgICAgICAgICAgIHNlcnZlckRpZmZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSBcImRhdGFcIjpcbiAgICAgICAgICAgICAgICAgIGlmIChcIm9iamVjdFwiICE9PSB0YWcpIHtcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVzLmRlbGV0ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBkb21FbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGFcIik7XG4gICAgICAgICAgICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICAgIHByb3BLZXksXG4gICAgICAgICAgICAgICAgICAgICAgc2VydmVyRGlmZmVyZW5jZXNcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSBcInNyY1wiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJocmVmXCI6XG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgICAgXCJcIiAhPT0gcHJvcEtleSB8fFxuICAgICAgICAgICAgICAgICAgICAgIChcImFcIiA9PT0gdGFnICYmIFwiaHJlZlwiID09PSB2YWx1ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAoXCJvYmplY3RcIiA9PT0gdGFnICYmIFwiZGF0YVwiID09PSB2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIFwic3JjXCIgPT09IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgPyBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnQW4gZW1wdHkgc3RyaW5nIChcIlwiKSB3YXMgcGFzc2VkIHRvIHRoZSAlcyBhdHRyaWJ1dGUuIFRoaXMgbWF5IGNhdXNlIHRoZSBicm93c2VyIHRvIGRvd25sb2FkIHRoZSB3aG9sZSBwYWdlIGFnYWluIG92ZXIgdGhlIG5ldHdvcmsuIFRvIGZpeCB0aGlzLCBlaXRoZXIgZG8gbm90IHJlbmRlciB0aGUgZWxlbWVudCBhdCBhbGwgb3IgcGFzcyBudWxsIHRvICVzIGluc3RlYWQgb2YgYW4gZW1wdHkgc3RyaW5nLicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgIDogY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FuIGVtcHR5IHN0cmluZyAoXCJcIikgd2FzIHBhc3NlZCB0byB0aGUgJXMgYXR0cmlidXRlLiBUbyBmaXggdGhpcywgZWl0aGVyIGRvIG5vdCByZW5kZXIgdGhlIGVsZW1lbnQgYXQgYWxsIG9yIHBhc3MgbnVsbCB0byAlcyBpbnN0ZWFkIG9mIGFuIGVtcHR5IHN0cmluZy4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaHlkcmF0ZVNhbml0aXplZEF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBwcm9wS2V5LFxuICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgIHNlcnZlckRpZmZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSBcImFjdGlvblwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJmb3JtQWN0aW9uXCI6XG4gICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gZG9tRWxlbWVudC5nZXRBdHRyaWJ1dGUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHByb3BLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVzLmRlbGV0ZSh2YWx1ZS
1585250b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgXCJmb3JtQWN0aW9uXCIgPT09IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgPyAoZXh0cmFBdHRyaWJ1dGVzLmRlbGV0ZShcIm5hbWVcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMuZGVsZXRlKFwiZm9ybWVuY3R5cGVcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMuZGVsZXRlKFwiZm9ybW1ldGhvZFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlcy5kZWxldGUoXCJmb3JtdGFyZ2V0XCIpKVxuICAgICAgICAgICAgICAgICAgICAgIDogKGV4dHJhQXR0cmlidXRlcy5kZWxldGUoXCJlbmN0eXBlXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVzLmRlbGV0ZShcIm1ldGhvZFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlcy5kZWxldGUoXCJ0YXJnZXRcIikpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlcyA9PT0gRVhQRUNURURfRk9STV9BQ1RJT05fVVJMKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlcy5kZWxldGUodmFsdWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICAgICAgICAgIHdhcm5Gb3JQcm9wRGlmZmVyZW5jZShcbiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICBcImZ1bmN0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgcHJvcEtleSxcbiAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJEaWZmZXJlbmNlc1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGh5ZHJhdGVTYW5pdGl6ZWRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgICAgICAgICBwcm9wS2V5LFxuICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgIHNlcnZlckRpZmZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSBcInhsaW5rSHJlZlwiOlxuICAgICAgICAgICAgICAgICAgaHlkcmF0ZVNhbml0aXplZEF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIFwieGxpbms6aHJlZlwiLFxuICAgICAgICAgICAgICAgICAgICBwcm9wS2V5LFxuICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgIHNlcnZlckRpZmZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSBcImNvbnRlbnRFZGl0YWJsZVwiOlxuICAgICAgICAgICAgICAgICAgaHlkcmF0ZUJvb2xlYW5pc2hBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBcImNvbnRlbnRlZGl0YWJsZVwiLFxuICAgICAgICAgICAgICAgICAgICBwcm9wS2V5LFxuICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgIHNlcnZlckRpZmZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSBcInNwZWxsQ2hlY2tcIjpcbiAgICAgICAgICAgICAgICAgIGh5ZHJhdGVCb29sZWFuaXNoQXR0cmlidXRlKFxuICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgXCJzcGVsbGNoZWNrXCIsXG4gICAgICAgICAgICAgICAgICAgIHByb3BLZXksXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgc2VydmVyRGlmZmVyZW5jZXNcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIFwiZHJhZ2dhYmxlXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImF1dG9SZXZlcnNlXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWRcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiZm9jdXNhYmxlXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcInByZXNlcnZlQWxwaGFcIjpcbiAgICAgICAgICAgICAgICAgIGh5ZHJhdGVCb29sZWFuaXNoQXR0cmlidXRlKFxuICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHByb3BLZXksXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgc2VydmVyRGlmZmVyZW5jZXNcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIFwiYWxsb3dGdWxsU2NyZWVuXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImFzeW5jXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImF1dG9QbGF5XCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImNvbnRyb2xzXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImNyZWRlbnRpYWxsZXNzXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImRlZmF1bHRcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGVmZXJcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGlzYWJsZWRcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGlzYWJsZVBpY3R1cmVJblBpY3R1cmVcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGlzYWJsZVJlbW90ZVBsYXliYWNrXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImZvcm1Ob1ZhbGlkYXRlXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImhpZGRlblwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJsb29wXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcIm5vTW9kdWxlXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcIm5vVmFsaWRhdGVcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwib3BlblwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJwbGF5c0lubGluZVwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJyZWFkT25seVwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJyZXF1aXJlZFwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJyZXZlcnNlZFwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJzY29wZWRcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwic2VhbWxlc3NcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiaXRlbVNjb3BlXCI6XG4gICAgICAgICAgICAgICAgICBoeWRyYXRlQm9vbGVhbkF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgI
15852HZhbHVlLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICAgICAgICAgIHByb3BLZXksXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgc2VydmVyRGlmZmVyZW5jZXNcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIFwiY2FwdHVyZVwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJkb3dubG9hZFwiOlxuICAgICAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgICAgICBpID0gZG9tRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGF0dHJpYnV0ZU5hbWUgPSAoYXR0cmlidXRlcyA9IHZhbHVlKSxcbiAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJEaWZmZXJlbmNlcyRqc2NvbXAkMCA9IHNlcnZlckRpZmZlcmVuY2VzO1xuICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMuZGVsZXRlKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBpID0gaS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09PSBpKVxuICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHByb3BLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInN5bWJvbFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCExID09PSBwcm9wS2V5KSBicmVhayBhO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobnVsbCAhPSBwcm9wS2V5KVxuICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHByb3BLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInN5bWJvbFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghMCA9PT0gcHJvcEtleSAmJiBcIlwiID09PSBpKSBicmVhayBhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbihwcm9wS2V5LCBhdHRyaWJ1dGVzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID09PSBcIlwiICsgcHJvcEtleSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB3YXJuRm9yUHJvcERpZmZlcmVuY2UoXG4gICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgICBpLFxuICAgICAgICAgICAgICAgICAgICAgIHByb3BLZXksXG4gICAgICAgICAgICAgICAgICAgICAgc2VydmVyRGlmZmVyZW5jZXMkanNjb21wJDBcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJjb2xzXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcInJvd3NcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwic2l6ZVwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCJzcGFuXCI6XG4gICAgICAgICAgICAgICAgICBhOiB7XG4gICAgICAgICAgICAgICAgICAgIGkgPSBkb21FbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlcyA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJEaWZmZXJlbmNlcyRqc2NvbXAkMCA9IHNlcnZlckRpZmZlcmVuY2VzO1xuICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMuZGVsZXRlKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBpID0gaS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09PSBpKVxuICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHByb3BLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInN5bWJvbFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihwcm9wS2V5KSB8fCAxID4gcHJvcEtleSkgYnJlYWsgYTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG51bGwgIT0gcHJvcEtleSlcbiAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBwcm9wS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzeW1ib2xcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoaXNOYU4ocHJvcEtleSkgfHwgMSA+IHByb3BLZXkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24ocHJvcEtleSwgYX
15852R0cmlidXRlcyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9PT0gXCJcIiArIHByb3BLZXkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKFxuICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICAgICAgICAgICBwcm9wS2V5LFxuICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckRpZmZlcmVuY2VzJGpzY29tcCQwXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIFwicm93U3BhblwiOlxuICAgICAgICAgICAgICAgICAgaHlkcmF0ZU51bWVyaWNBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBcInJvd3NwYW5cIixcbiAgICAgICAgICAgICAgICAgICAgcHJvcEtleSxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJEaWZmZXJlbmNlc1xuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzdGFydFwiOlxuICAgICAgICAgICAgICAgICAgaHlkcmF0ZU51bWVyaWNBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcEtleSxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJEaWZmZXJlbmNlc1xuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ4SGVpZ2h0XCI6XG4gICAgICAgICAgICAgICAgICBoeWRyYXRlQXR0cmlidXRlKFxuICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgXCJ4LWhlaWdodFwiLFxuICAgICAgICAgICAgICAgICAgICBwcm9wS2V5LFxuICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgIHNlcnZlckRpZmZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSBcInhsaW5rQWN0dWF0ZVwiOlxuICAgICAgICAgICAgICAgICAgaHlkcmF0ZUF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIFwieGxpbms6YWN0dWF0ZVwiLFxuICAgICAgICAgICAgICAgICAgICBwcm9wS2V5LFxuICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgIHNlcnZlckRpZmZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSBcInhsaW5rQXJjcm9sZVwiOlxuICAgICAgICAgICAgICAgICAgaHlkcmF0ZUF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIFwieGxpbms6YXJjcm9sZVwiLFxuICAgICAgICAgICAgICAgICAgICBwcm9wS2V5LFxuICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgIHNlcnZlckRpZmZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSBcInhsaW5rUm9sZVwiOlxuICAgICAgICAgICAgICAgICAgaHlkcmF0ZUF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIFwieGxpbms6cm9sZVwiLFxuICAgICAgICAgICAgICAgICAgICBwcm9wS2V5LFxuICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgIHNlcnZlckRpZmZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSBcInhsaW5rU2hvd1wiOlxuICAgICAgICAgICAgICAgICAgaHlkcmF0ZUF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIFwieGxpbms6c2hvd1wiLFxuICAgICAgICAgICAgICAgICAgICBwcm9wS2V5LFxuICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgIHNlcnZlckRpZmZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSBcInhsaW5rVGl0bGVcIjpcbiAgICAgICAgICAgICAgICAgIGh5ZHJhdGVBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBcInhsaW5rOnRpdGxlXCIsXG4gICAgICAgICAgICAgICAgICAgIHByb3BLZXksXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgc2VydmVyRGlmZmVyZW5jZXNcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIFwieGxpbmtUeXBlXCI6XG4gICAgICAgICAgICAgICAgICBoeWRyYXRlQXR0cmlidXRlKFxuICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgXCJ4bGluazp0eXBlXCIsXG4gICAgICAgICAgICAgICAgICAgI
15852HByb3BLZXksXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgc2VydmVyRGlmZmVyZW5jZXNcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIFwieG1sQmFzZVwiOlxuICAgICAgICAgICAgICAgICAgaHlkcmF0ZUF0dHJpYnV0ZShcbiAgICAgICAgICAgICAgICAgICAgZG9tRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIFwieG1sOmJhc2VcIixcbiAgICAgICAgICAgICAgICAgICAgcHJvcEtleSxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJEaWZmZXJlbmNlc1xuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ4bWxMYW5nXCI6XG4gICAgICAgICAgICAgICAgICBoeWRyYXRlQXR0cmlidXRlKFxuICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgXCJ4bWw6bGFuZ1wiLFxuICAgICAgICAgICAgICAgICAgICBwcm9wS2V5LFxuICAgICAgICAgICAgICAgICAgICBleHRyYUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgIHNlcnZlckRpZmZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSBcInhtbFNwYWNlXCI6XG4gICAgICAgICAgICAgICAgICBoeWRyYXRlQXR0cmlidXRlKFxuICAgICAgICAgICAgICAgICAgICBkb21FbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgXCJ4bWw6c3BhY2VcIixcbiAgICAgICAgICAgICAgICAgICAgcHJvcEtleSxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJEaWZmZXJlbmNlc1xuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJpbmVydFwiOlxuICAgICAgICAgICAgICAgICAgXCJcIiAhPT0gcHJvcEtleSB8fFxuICAgICAgICAgICAgICAgICAgICBkaWRXYXJuRm9yTmV3Qm9vbGVhblByb3BzV2l0aEVtcHR5VmFsdWVbdmFsdWVdIHx8XG4gICAgICAgICAgICAgICAgICAgICgoZGlkV2FybkZvck5ld0Jvb2xlYW5Qcm9wc1dpdGhFbXB0eVZhbHVlW3ZhbHVlXSA9ICEwKSxcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICBcIlJlY2VpdmVkIGFuIGVtcHR5IHN0cmluZyBmb3IgYSBib29sZWFuIGF0dHJpYnV0ZSBgJXNgLiBUaGlzIHdpbGwgdHJlYXQgdGhlIGF0dHJpYnV0ZSBhcyBpZiBpdCB3ZXJlIGZhbHNlLiBFaXRoZXIgcGFzcyBgZmFsc2VgIHRvIHNpbGVuY2UgdGhpcyB3YXJuaW5nLCBvciBwYXNzIGB0cnVlYCBpZiB5b3UgdXNlZCBhbiBlbXB0eSBzdHJpbmcgaW4gZWFybGllciB2ZXJzaW9ucyBvZiBSZWFjdCB0byBpbmRpY2F0ZSB0aGlzIGF0dHJpYnV0ZSBpcyB0cnVlLlwiLFxuICAgICAgICAgICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgICAgICAgaHlkcmF0ZUJvb2xlYW5BdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICAgICAgIGRvbUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcEtleSxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJEaWZmZXJlbmNlc1xuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICEoMiA8IHZhbHVlLmxlbmd0aCkgfHxcbiAgICAgICAgICAgICAgICAgICAgKFwib1wiICE9PSB2YWx1ZVswXSAmJiBcIk9cIiAhPT0gdmFsdWVbMF0pIHx8XG4gICAgICAgICAgICAgICAgICAgIChcIm5cIiAhPT0gdmFsdWVbMV0gJiYgXCJOXCIgIT09IHZhbHVlWzFdKVxuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGkgPSBnZXRBdHRyaWJ1dGVBbGlhcyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSAhMTtcbiAgICAgICAgICAgICAgICAgICAgaG9zdENvbnRleHQuY29udGV4dCA9PT0gSG9zdENvbnRleHROYW1lc3BhY2VOb25lICYmXG4gICAgICAgICAgICAgICAgICAgIFwic3ZnXCIgIT09IHRhZyAmJlxuICAgICAgICAgICAgICAgICAgICBcIm1hdGhcIiAhPT0gdGFnXG4gICAgICAgICAgICAgICAgICAgICAgPyBleHRyYUF0dHJpYnV0ZXMuZGVsZXRlKGkudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgICAgICAgICAgICAgICA6ICgoYXR0cmlidXRlTmFtZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKGF0dHJpYnV0ZU5hbWUgPSBwb3NzaWJsZVN0YW5kYXJkTmFtZXMuaGFzT3duUHJvcGVydHkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBwb3NzaWJsZVN0YW5kYXJkTmFtZXNbYXR0cmlidXRlTmFtZV0gfHwgbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gYXR0cmlidXRlTmFtZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVOYW1lICE9PSB2YWx1ZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoKGF0dHJpYnV0ZXMgPSAhMCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhQXR0cmlidXRlcy5kZWxldGUoYXR0cmlidXRlTmFtZSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFBdHRyaWJ1dGVzLmRlbGV0ZShpKSk7XG4gICAgICAgICAgICAgICAgICAgIGE6IGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAoKGF0dHJpYnV0ZU5hbWUgPSBkb21FbGVtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgICAoc2VydmVyRGlmZmVyZW5jZXMkanNjb21wJDAgPSBpKSxcbiAgICAgICAgICAgICAgICAgICAgICAoaSA9IHByb3BLZXkpLFxuICAgICAgICAgICAgICAgICAgICAgIGlzQXR0cmlidXRlTmFtZVNhZmUoc2VydmVyRGlmZmVyZW5jZXMkanNjb21wJDApKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlTmFtZS5oYXNBdHRyaWJ1dGUoc2VydmVyRGlmZmVyZW5jZXMkanNjb21wJDApXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgKGF0dHJpYnV0ZU5hbWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5vbmNlXCIgPT09IHNlcnZlckRpZmZlcmVuY2VzJGpzY29tcCQwLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGF0dHJpYnV0ZU5hbWUubm9uY2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGF0dHJpYnV0ZU5hbWUuZ2V0QXR0cmlidXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJEaWZmZXJlbmNlcyRqc2NvbXAkMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQXR0cmlidXRlU3RyaW5nQ29lcmNpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJEaWZmZXJlbmNlcyRqc2NvbXAkMFxuICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoaSA9IGF0dHJpYnV0ZU5hbWUgPT09IFwiXCIgKyBpID8gaSA6IGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlb2YgaSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInN5bWJvbFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChhdHRyaWJ1dGVOYW1lID0gc2VydmVyRGlmZmVyZW5jZXMkanNjb21wJDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNsaWNlKDAsIDUpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGF0YS1cIiAhPT0gYXR0cmlidXRlTmFtZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImFyaWEtXCIgIT09IGF0dHJpYnV0ZU5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgICAgICAgICAgICAgI
15852H1cbiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSB2b2lkIDAgPT09IGkgPyB2b2lkIDAgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzIHx8XG4gICAgICAgICAgICAgICAgICAgICAgd2FybkZvclByb3BEaWZmZXJlbmNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcEtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckRpZmZlcmVuY2VzXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgMCA8IGV4dHJhQXR0cmlidXRlcy5zaXplICYmXG4gICAgICAgICEwICE9PSBwcm9wcy5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcgJiZcbiAgICAgICAgd2FybkZvckV4dHJhQXR0cmlidXRlcyhkb21FbGVtZW50LCBleHRyYUF0dHJpYnV0ZXMsIHNlcnZlckRpZmZlcmVuY2VzKTtcbiAgICAgIHJldHVybiAwID09PSBPYmplY3Qua2V5cyhzZXJ2ZXJEaWZmZXJlbmNlcykubGVuZ3RoXG4gICAgICAgID8gbnVsbFxuICAgICAgICA6IHNlcnZlckRpZmZlcmVuY2VzO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwcm9wTmFtZXNMaXN0Sm9pbihsaXN0LCBjb21iaW5hdG9yKSB7XG4gICAgICBzd2l0Y2ggKGxpc3QubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIHJldHVybiBsaXN0WzBdO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgcmV0dXJuIGxpc3RbMF0gKyBcIiBcIiArIGNvbWJpbmF0b3IgKyBcIiBcIiArIGxpc3RbMV07XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGxpc3Quc2xpY2UoMCwgLTEpLmpvaW4oXCIsIFwiKSArXG4gICAgICAgICAgICBcIiwgXCIgK1xuICAgICAgICAgICAgY29tYmluYXRvciArXG4gICAgICAgICAgICBcIiBcIiArXG4gICAgICAgICAgICBsaXN0W2xpc3QubGVuZ3RoIC0gMV1cbiAgICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBpc0xpa2VseVN0YXRpY1Jlc291cmNlKGluaXRpYXRvclR5cGUpIHtcbiAgICAgIHN3aXRjaCAoaW5pdGlhdG9yVHlwZSkge1xuICAgICAgICBjYXNlIFwiY3NzXCI6XG4gICAgICAgIGNhc2UgXCJzY3JpcHRcIjpcbiAgICAgICAgY2FzZSBcImZvbnRcIjpcbiAgICAgICAgY2FzZSBcImltZ1wiOlxuICAgICAgICBjYXNlIFwiaW1hZ2VcIjpcbiAgICAgICAgY2FzZSBcImlucHV0XCI6XG4gICAgICAgIGNhc2UgXCJsaW5rXCI6XG4gICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZXN0aW1hdGVCYW5kd2lkdGgoKSB7XG4gICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgcGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5VHlwZSkge1xuICAgICAgICBmb3IgKFxuICAgICAgICAgIHZhciBjb3VudCA9IDAsXG4gICAgICAgICAgICBiaXRzID0gMCxcbiAgICAgICAgICAgIHJlc291cmNlRW50cmllcyA9IHBlcmZvcm1hbmNlLmdldEVudHJpZXNCeVR5cGUoXCJyZXNvdXJjZVwiKSxcbiAgICAgICAgICAgIGkgPSAwO1xuICAgICAgICAgIGkgPCByZXNvdXJjZUVudHJpZXMubGVuZ3RoO1xuICAgICAgICAgIGkrK1xuICAgICAgICApIHtcbiAgICAgICAgICB2Y
15852XIgZW50cnkgPSByZXNvdXJjZUVudHJpZXNbaV0sXG4gICAgICAgICAgICB0cmFuc2ZlclNpemUgPSBlbnRyeS50cmFuc2ZlclNpemUsXG4gICAgICAgICAgICBpbml0aWF0b3JUeXBlID0gZW50cnkuaW5pdGlhdG9yVHlwZSxcbiAgICAgICAgICAgIGR1cmF0aW9uID0gZW50cnkuZHVyYXRpb247XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHJhbnNmZXJTaXplICYmXG4gICAgICAgICAgICBkdXJhdGlvbiAmJlxuICAgICAgICAgICAgaXNMaWtlbHlTdGF0aWNSZXNvdXJjZShpbml0aWF0b3JUeXBlKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgaW5pdGlhdG9yVHlwZSA9IDA7XG4gICAgICAgICAgICBkdXJhdGlvbiA9IGVudHJ5LnJlc3BvbnNlRW5kO1xuICAgICAgICAgICAgZm9yIChpICs9IDE7IGkgPCByZXNvdXJjZUVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgdmFyIG92ZXJsYXBFbnRyeSA9IHJlc291cmNlRW50cmllc1tpXSxcbiAgICAgICAgICAgICAgICBvdmVybGFwU3RhcnRUaW1lID0gb3ZlcmxhcEVudHJ5LnN0YXJ0VGltZTtcbiAgICAgICAgICAgICAgaWYgKG92ZXJsYXBTdGFydFRpbWUgPiBkdXJhdGlvbikgYnJlYWs7XG4gICAgICAgICAgICAgIHZhciBvdmVybGFwVHJhbnNmZXJTaXplID0gb3ZlcmxhcEVudHJ5LnRyYW5zZmVyU2l6ZSxcbiAgICAgICAgICAgICAgICBvdmVybGFwSW5pdGlhdG9yVHlwZSA9IG92ZXJsYXBFbnRyeS5pbml0aWF0b3JUeXBlO1xuICAgICAgICAgICAgICBvdmVybGFwVHJhbnNmZXJTaXplICYmXG4gICAgICAgICAgICAgICAgaXNMaWtlbHlTdGF0aWNSZXNvdXJjZShvdmVybGFwSW5pdGlhdG9yVHlwZSkgJiZcbiAgICAgICAgICAgICAgICAoKG92ZXJsYXBFbnRyeSA9IG92ZXJsYXBFbnRyeS5yZXNwb25zZUVuZCksXG4gICAgICAgICAgICAgICAgKGluaXRpYXRvclR5cGUgKz1cbiAgICAgICAgICAgICAgICAgIG92ZXJsYXBUcmFuc2ZlclNpemUgKlxuICAgICAgICAgICAgICAgICAgKG92ZXJsYXBFbnRyeSA8IGR1cmF0aW9uXG4gICAgICAgICAgICAgICAgICAgID8gMVxuICAgICAgICAgICAgICAgICAgICA6IChkdXJhdGlvbiAtIG92ZXJsYXBTdGFydFRpbWUpIC9cbiAgICAgICAgICAgICAgICAgICAgICAob3ZlcmxhcEVudHJ5IC0gb3ZlcmxhcFN0YXJ0VGltZSkpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAtLWk7XG4gICAgICAgICAgICBiaXRzICs9XG4gICAgICAgICAgICAgICg4ICogKHRyYW5zZmVyU2l6ZSArIGluaXRpYXRvclR5cGUpKSAvIChlbnRyeS5kdXJhdGlvbiAvIDFlMyk7XG4gICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgaWYgKDEwIDwgY291bnQpIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoMCA8IGNvdW50KSByZXR1cm4gYml0cyAvIGNvdW50IC8gMWU2O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5hdmlnYXRvci5jb25uZWN0aW9uICYmXG4gICAgICAgICgoY291bnQgPSBuYXZpZ2F0b3IuY29ubmVjdGlvbi5kb3dubGluayksIFwibnVtYmVyXCIgPT09IHR5cGVvZiBjb3VudClcbiAgICAgICAgPyBjb3VudFxuICAgICAgICA6IDU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldE93bmVyRG9jdW1lbnRGcm9tUm9vdENvbnRhaW5lcihyb290Q29udGFpbmVyRWxlbWVudCkge1xuICAgICAgcmV0dXJuIDkgPT09IHJvb3RDb250YWluZXJFbGVtZW50Lm5vZGVUeXBlXG4gICAgICAgID8gcm9vdENvbnRhaW5lckVsZW1lbnRcbiAgICAgICAgOiByb290Q29udGFpbmVyRWxlbWVudC5vd25lckRvY3VtZW50O1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRPd25Ib3N0Q29udGV4dChuYW1lc3BhY2VVUkkpIHtcbiAgICAgIHN3aXRjaCAobmFtZXNwYWNlVVJJKSB7XG4gICAgICAgIGNhc2UgU1ZHX05BTUVTUEFDRTpcbiAgICAgICAgICByZXR1cm4gSG9zdENvbnRleHROYW1lc3BhY2VTdmc7XG4gICAgICAgIGNhc2UgTUFUSF9OQU1FU1BBQ0U6XG4gICAgICAgICAgcmV0dXJuIEhvc3RDb250ZXh0TmFtZXNwYWNlTWF0aDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gSG9zdENvbnRleHROYW1lc3BhY2VOb25lO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRDaGlsZEhvc3RDb250ZXh0UHJvZChwYXJlbnROYW1lc3BhY2UsIHR5cGUpIHtcbiAgICAgIGlmIChwYXJlbnROYW1lc3BhY2UgPT09IEhvc3RDb250ZXh0TmFtZXNwYWNlTm9uZSlcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgY2FzZSBcInN2Z1wiOlxuICAgICAgICAgICAgcmV0dXJuIEhvc3RDb250ZXh0TmFtZXNwYWNlU3ZnO1xuICAgICAgICAgIGNhc2UgXCJtYXRoXCI6XG4gICAgICAgICAgICByZXR1cm4gSG9zdENvbnRleHROYW1lc3BhY2VNYXRoO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gSG9zdENvbnRleHROYW1lc3BhY2VOb25lO1xuICAgICAgICB9XG4gICAgICByZXR1cm4gcGFyZW50TmFtZXNwYWNlID09PSBIb3N0Q29udGV4dE5hbWVzcGFjZVN2ZyAmJlxuICAgICAgICBcImZvcmVpZ25PYmplY3RcIiA9PT0gdHlwZVxuICAgICAgICA/IEhvc3RDb250ZXh0TmFtZXNwYWNlTm9uZVxuICAgICAgICA6IHBhcmVudE5hbWVzcGFjZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY3JlYXRlSG9pc3RhYmxlSW5zdGFuY2UoXG4gICAgICB0eXBlLFxuICAgICAgcHJvcHMsXG4gICAgICByb290Q29udGFpbmVySW5zdGFuY2UsXG4gICAgICBpbnRlcm5hbEluc3RhbmNlSGFuZGxlXG4gICAgKSB7XG4gICAgICByb290Q29udGFpbmVySW5zdGFuY2UgPSBnZXRPd25lckRvY3VtZW50RnJvbVJvb3RDb250YWluZXIoXG4gICAgICAgIHJvb3RDb250YWluZXJJbnN0YW5jZVxuICAgICAgKS5jcmVhdGVFbGVtZW50KHR5cGUpO1xuICAgICAgcm9vdENvbnRhaW5lckluc3RhbmNlW2ludGVybmFsSW5zdGFuY2VLZXldID0gaW50ZXJuYWxJbnN0YW5jZUhhbmRsZTtcbiAgICAgIHJvb3RDb250YWluZXJJbnN0YW5jZVtpbnRlcm5hbFByb3BzS2V5XSA9IHByb3BzO1xuICAgICAgc2V0SW5pdGlhbFByb3BlcnRpZXMocm9vdENvbnRhaW5lckluc3RhbmNlLCB0eXBlLCBwcm9wcyk7XG4gICAgICBtYXJrTm9kZUFzSG9pc3RhYmxlKHJvb3RDb250YWluZXJJbnN0YW5jZSk7XG4gICAgICByZXR1cm4gcm9vdENvbnRhaW5lckluc3RhbmNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc1NjcmlwdERhdGFCbG9jayhwcm9wcykge1xuICAgICAgcHJvcHMgP
15852SBwcm9wcy50eXBlO1xuICAgICAgaWYgKFwic3RyaW5nXCIgIT09IHR5cGVvZiBwcm9wcyB8fCBcIlwiID09PSBwcm9wcykgcmV0dXJuICExO1xuICAgICAgcHJvcHMgPSBwcm9wcy50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKFxuICAgICAgICBcIm1vZHVsZVwiID09PSBwcm9wcyB8fFxuICAgICAgICBcImltcG9ydG1hcFwiID09PSBwcm9wcyB8fFxuICAgICAgICBcInNwZWN1bGF0aW9ucnVsZXNcIiA9PT0gcHJvcHNcbiAgICAgIClcbiAgICAgICAgcmV0dXJuICExO1xuICAgICAgc3dpdGNoIChwcm9wcykge1xuICAgICAgICBjYXNlIFwiYXBwbGljYXRpb24vZWNtYXNjcmlwdFwiOlxuICAgICAgICBjYXNlIFwiYXBwbGljYXRpb24vamF2YXNjcmlwdFwiOlxuICAgICAgICBjYXNlIFwiYXBwbGljYXRpb24veC1lY21hc2NyaXB0XCI6XG4gICAgICAgIGNhc2UgXCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHRcIjpcbiAgICAgICAgY2FzZSBcInRleHQvZWNtYXNjcmlwdFwiOlxuICAgICAgICBjYXNlIFwidGV4dC9qYXZhc2NyaXB0XCI6XG4gICAgICAgIGNhc2UgXCJ0ZXh0L2phdmFzY3JpcHQxLjBcIjpcbiAgICAgICAgY2FzZSBcInRleHQvamF2YXNjcmlwdDEuMVwiOlxuICAgICAgICBjYXNlIFwidGV4dC9qYXZhc2NyaXB0MS4yXCI6XG4gICAgICAgIGNhc2UgXCJ0ZXh0L2phdmFzY3JpcHQxLjNcIjpcbiAgICAgICAgY2FzZSBcInRleHQvamF2YXNjcmlwdDEuNFwiOlxuICAgICAgICBjYXNlIFwidGV4dC9qYXZhc2NyaXB0MS41XCI6XG4gICAgICAgIGNhc2UgXCJ0ZXh0L2pzY3JpcHRcIjpcbiAgICAgICAgY2FzZSBcInRleHQvbGl2ZXNjcmlwdFwiOlxuICAgICAgICBjYXNlIFwidGV4dC94LWVjbWFzY3JpcHRcIjpcbiAgICAgICAgY2FzZSBcInRleHQveC1qYXZhc2NyaXB0XCI6XG4gICAgICAgICAgcmV0dXJuICExO1xuICAgICAgfVxuICAgICAgcmV0dXJuICEwO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzaG91bGRTZXRUZXh0Q29udGVudCh0eXBlLCBwcm9wcykge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgXCJ0ZXh0YXJlYVwiID09PSB0eXBlIHx8XG4gICAgICAgIFwibm9zY3JpcHRcIiA9PT0gdHlwZSB8fFxuICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2YgcHJvcHMuY2hpbGRyZW4gfHxcbiAgICAgICAgXCJudW1iZXJcIiA9PT0gdHlwZW9mIHByb3BzLmNoaWxkcmVuIHx8XG4gICAgICAgIFwiYmlnaW50XCIgPT09IHR5cGVvZiBwcm9wcy5jaGlsZHJlbiB8fFxuICAgICAgICAoXCJvYmplY3RcIiA9PT0gdHlwZW9mIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICYmXG4gICAgICAgICAgbnVsbCAhPT0gcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgJiZcbiAgICAgICAgICBudWxsICE9IHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MLl9faHRtbClcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNob3VsZEF0dGVtcHRFYWdlclRyYW5zaXRpb24oKSB7XG4gICAgICB2Y
15852XIgZXZlbnQgPSB3aW5kb3cuZXZlbnQ7XG4gICAgICBpZiAoZXZlbnQgJiYgXCJwb3BzdGF0ZVwiID09PSBldmVudC50eXBlKSB7XG4gICAgICAgIGlmIChldmVudCA9PT0gY3VycmVudFBvcHN0YXRlVHJhbnNpdGlvbkV2ZW50KSByZXR1cm4gITE7XG4gICAgICAgIGN1cnJlbnRQb3BzdGF0ZVRyYW5zaXRpb25FdmVudCA9IGV2ZW50O1xuICAgICAgICByZXR1cm4gITA7XG4gICAgICB9XG4gICAgICBjdXJyZW50UG9wc3RhdGVUcmFuc2l0aW9uRXZlbnQgPSBudWxsO1xuICAgICAgcmV0dXJuICExO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXNvbHZlRXZlbnRUeXBlKCkge1xuICAgICAgdmFyIGV2ZW50ID0gd2luZG93LmV2ZW50O1xuICAgICAgcmV0dXJuIGV2ZW50ICYmIGV2ZW50ICE9PSBzY2hlZHVsZXJFdmVudCA/IGV2ZW50LnR5cGUgOiBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXNvbHZlRXZlbnRUaW1lU3RhbXAoKSB7XG4gICAgICB2YXIgZXZlbnQgPSB3aW5kb3cuZXZlbnQ7XG4gICAgICByZXR1cm4gZXZlbnQgJiYgZXZlbnQgIT09IHNjaGVkdWxlckV2ZW50ID8gZXZlbnQudGltZVN0YW1wIDogLTEuMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlRXJyb3JJbk5leHRUaWNrKGVycm9yKSB7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tbWl0TW91bnQoZG9tRWxlbWVudCwgdHlwZSwgbmV3UHJvcHMpIHtcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFwiYnV0dG9uXCI6XG4gICAgICAgIGNhc2UgXCJpbnB1dFwiOlxuICAgICAgICBjYXNlIFwic2VsZWN0XCI6XG4gICAgICAgIGNhc2UgXCJ0ZXh0YXJlYVwiOlxuICAgICAgICAgIG5ld1Byb3BzLmF1dG9Gb2N1cyAmJiBkb21FbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJpbWdcIjpcbiAgICAgICAgICBuZXdQcm9wcy5zcmNcbiAgICAgICAgICAgID8gKGRvbUVsZW1lbnQuc3JjID0gbmV3UHJvcHMuc3JjKVxuICAgICAgICAgICAgOiBuZXdQcm9wcy5zcmNTZXQgJiYgKGRvbUVsZW1lbnQuc3Jjc2V0ID0gbmV3UHJvcHMuc3JjU2V0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gY29tbWl0SHlkcmF0ZWRJbnN0YW5jZSgpIHt9XG4gICAgZnVuY3Rpb24gY29tbWl0VXBkYXRlKGRvbUVsZW1lbnQsIHR5cGUsIG9sZFByb3BzLCBuZXdQcm9wcykge1xuICAgICAgdXBkYXRlUHJvcGVydGllcyhkb21FbGVtZW50LCB0eXBlLCBvbGRQcm9wcywgbmV3UHJvcHMpO1xuICAgICAgZG9tRWxlbWVudFtpbnRlcm5hbFByb3BzS2V5XSA9IG5ld1Byb3BzO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXNldFRleHRDb250ZW50KGRvbUVsZW1lbnQpIHtcbiAgICAgIHNldFRleHRDb250ZW50KGRvbUVsZW1lbnQsIFwiXCIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21taXRUZXh0VXBkYXRlKHRleHRJbnN0YW5jZSwgb2xkVGV4dCwgbmV3VGV4dCkge1xuICAgICAgdGV4dEluc3RhbmNlLm5vZGVWYWx1ZSA9IG5ld1RleHQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHdhcm5Gb3JSZWFjdENoaWxkcmVuQ29uZmxpY3QoY29udGFpbmVyKSB7XG4gICAgICBpZiAoIWNvbnRhaW5lci5fX3JlYWN0V2FybmVkQWJvdXRDaGlsZHJlbkNvbmZsaWN0KSB7XG4gICAgICAgIHZhciBwcm9wcyA9IGNvbnRhaW5lcltpbnRlcm5hbFByb3BzS2V5XSB8fCBudWxsO1xuICAgICAgICBpZiAobnVsbCAhPT0gcHJvcHMpIHtcbiAgICAgICAgICB2Y
15852XIgZmliZXIgPSBnZXRJbnN0YW5jZUZyb21Ob2RlKGNvbnRhaW5lcik7XG4gICAgICAgICAgbnVsbCAhPT0gZmliZXIgJiZcbiAgICAgICAgICAgIChcInN0cmluZ1wiID09PSB0eXBlb2YgcHJvcHMuY2hpbGRyZW4gfHxcbiAgICAgICAgICAgIFwibnVtYmVyXCIgPT09IHR5cGVvZiBwcm9wcy5jaGlsZHJlblxuICAgICAgICAgICAgICA/ICgoY29udGFpbmVyLl9fcmVhY3RXYXJuZWRBYm91dENoaWxkcmVuQ29uZmxpY3QgPSAhMCksXG4gICAgICAgICAgICAgICAgcnVuV2l0aEZpYmVySW5ERVYoZmliZXIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICdDYW5ub3QgdXNlIGEgcmVmIG9uIGEgUmVhY3QgZWxlbWVudCBhcyBhIGNvbnRhaW5lciB0byBgY3JlYXRlUm9vdGAgb3IgYGNyZWF0ZVBvcnRhbGAgaWYgdGhhdCBlbGVtZW50IGFsc28gc2V0cyBcImNoaWxkcmVuXCIgdGV4dCBjb250ZW50IHVzaW5nIFJlYWN0LiBJdCBzaG91bGQgYmUgYSBsZWFmIHdpdGggbm8gY2hpbGRyZW4uIE90aGVyd2lzZSBpdFxcJ3MgYW1iaWd1b3VzIHdoaWNoIGNoaWxkcmVuIHNob3VsZCBiZSB1c2VkLidcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgIDogbnVsbCAhPSBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAmJlxuICAgICAgICAgICAgICAgICgoY29udGFpbmVyLl9fcmVhY3RXYXJuZWRBYm91dENoaWxkcmVuQ29uZmxpY3QgPSAhMCksXG4gICAgICAgICAgICAgICAgcnVuV2l0aEZpYmVySW5ERVYoZmliZXIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICdDYW5ub3QgdXNlIGEgcmVmIG9uIGEgUmVhY3QgZWxlbWVudCBhcyBhIGNvbnRhaW5lciB0byBgY3JlYXRlUm9vdGAgb3IgYGNyZWF0ZVBvcnRhbGAgaWYgdGhhdCBlbGVtZW50IGFsc28gc2V0cyBcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCIgdXNpbmcgUmVhY3QuIEl0IHNob3VsZCBiZSBhIGxlYWYgd2l0aCBubyBjaGlsZHJlbi4gT3RoZXJ3aXNlIGl0XFwncyBhbWJpZ3VvdXMgd2hpY2ggY2hpbGRyZW4gc2hvdWxkIGJlIHVzZWQuJ1xuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzU2luZ2xldG9uU2NvcGUodHlwZSkge1xuICAgICAgcmV0dXJuIFwiaGVhZFwiID09PSB0eXBlO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZW1vdmVDaGlsZChwYXJlbnRJbnN0YW5jZSwgY2hpbGQpIHtcbiAgICAgIHBhcmVudEluc3RhbmNlLnJlbW92ZUNoaWxkKGNoaWxkKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVtb3ZlQ2hpbGRGcm9tQ29udGFpbmVyKGNvbnRhaW5lciwgY2hpbGQpIHtcbiAgICAgICg5ID09PSBjb250YWluZXIubm9kZVR5cGVcbiAgICAgICAgPyBjb250YWluZXIuYm9keVxuICAgICAgICA6IFwiSFRNTFwiID09PSBjb250YWluZXIubm9kZU5hbWVcbiAgICAgICAgICA/IGNvbnRhaW5lci5vd25lckRvY3VtZW50LmJvZHlcbiAgICAgICAgICA6IGNvbnRhaW5lclxuICAgICAgKS5yZW1vdmVDaGlsZChjaGlsZCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNsZWFySHlkcmF0aW9uQm91bmRhcnkocGFyZW50SW5zdGFuY2UsIGh5ZHJhdGlvbkluc3RhbmNlKSB7XG4gICAgICB2Y
15852XIgbm9kZSA9IGh5ZHJhdGlvbkluc3RhbmNlLFxuICAgICAgICBkZXB0aCA9IDA7XG4gICAgICBkbyB7XG4gICAgICAgIHZhciBuZXh0Tm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIHBhcmVudEluc3RhbmNlLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgICAgICBpZiAobmV4dE5vZGUgJiYgOCA9PT0gbmV4dE5vZGUubm9kZVR5cGUpXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgKChub2RlID0gbmV4dE5vZGUuZGF0YSksXG4gICAgICAgICAgICBub2RlID09PSBTVVNQRU5TRV9FTkRfREFUQSB8fCBub2RlID09PSBBQ1RJVklUWV9FTkRfREFUQSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGlmICgwID09PSBkZXB0aCkge1xuICAgICAgICAgICAgICBwYXJlbnRJbnN0YW5jZS5yZW1vdmVDaGlsZChuZXh0Tm9kZSk7XG4gICAgICAgICAgICAgIHJldHJ5SWZCbG9ja2VkT24oaHlkcmF0aW9uSW5zdGFuY2UpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZXB0aC0tO1xuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBub2RlID09PSBTVVNQRU5TRV9TVEFSVF9EQVRBIHx8XG4gICAgICAgICAgICBub2RlID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEgfHxcbiAgICAgICAgICAgIG5vZGUgPT09IFNVU1BFTlNFX1FVRVVFRF9TVEFSVF9EQVRBIHx8XG4gICAgICAgICAgICBub2RlID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBIHx8XG4gICAgICAgICAgICBub2RlID09PSBBQ1RJVklUWV9TVEFSVF9EQVRBXG4gICAgICAgICAgKVxuICAgICAgICAgICAgZGVwdGgrKztcbiAgICAgICAgICBlbHNlIGlmIChub2RlID09PSBQUkVBTUJMRV9DT05UUklCVVRJT05fSFRNTClcbiAgICAgICAgICAgIGNsZWFyU2luZ2xldG9uUHJlYW1ibGVDb250cmlidXRpb24oXG4gICAgICAgICAgICAgIHBhcmVudEluc3RhbmNlLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XG4gICAgICAgICAgICApO1xuICAgICAgICAgIGVsc2UgaWYgKG5vZGUgPT09IFBSRUFNQkxFX0NPTlRSSUJVVElPTl9IRUFEKSB7XG4gICAgICAgICAgICBub2RlID0gcGFyZW50SW5zdGFuY2Uub3duZXJEb2N1bWVudC5oZWFkO1xuICAgICAgICAgICAgY2xlYXJTaW5nbGV0b25QcmVhbWJsZUNvbnRyaWJ1dGlvbihub2RlKTtcbiAgICAgICAgICAgIGZvciAodmFyIG5vZGUkanNjb21wJDAgPSBub2RlLmZpcnN0Q2hpbGQ7IG5vZGUkanNjb21wJDA7ICkge1xuICAgICAgICAgICAgICB2Y
15852XIgbmV4dE5vZGUkanNjb21wJDAgPSBub2RlJGpzY29tcCQwLm5leHRTaWJsaW5nLFxuICAgICAgICAgICAgICAgIG5vZGVOYW1lID0gbm9kZSRqc2NvbXAkMC5ub2RlTmFtZTtcbiAgICAgICAgICAgICAgbm9kZSRqc2NvbXAkMFtpbnRlcm5hbEhvaXN0YWJsZU1hcmtlcl0gfHxcbiAgICAgICAgICAgICAgICBcIlNDUklQVFwiID09PSBub2RlTmFtZSB8fFxuICAgICAgICAgICAgICAgIFwiU1RZTEVcIiA9PT0gbm9kZU5hbWUgfHxcbiAgICAgICAgICAgICAgICAoXCJMSU5LXCIgPT09IG5vZGVOYW1lICYmXG4gICAgICAgICAgICAgICAgICBcInN0eWxlc2hlZXRcIiA9PT0gbm9kZSRqc2NvbXAkMC5yZWwudG9Mb3dlckNhc2UoKSkgfHxcbiAgICAgICAgICAgICAgICBub2RlLnJlbW92ZUNoaWxkKG5vZGUkanNjb21wJDApO1xuICAgICAgICAgICAgICBub2RlJGpzY29tcCQwID0gbmV4dE5vZGUkanNjb21wJDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICBub2RlID09PSBQUkVBTUJMRV9DT05UUklCVVRJT05fQk9EWSAmJlxuICAgICAgICAgICAgICBjbGVhclNpbmdsZXRvblByZWFtYmxlQ29udHJpYnV0aW9uKFxuICAgICAgICAgICAgICAgIHBhcmVudEluc3RhbmNlLm93bmVyRG9jdW1lbnQuYm9keVxuICAgICAgICAgICAgICApO1xuICAgICAgICBub2RlID0gbmV4dE5vZGU7XG4gICAgICB9IHdoaWxlIChub2RlKTtcbiAgICAgIHJldHJ5SWZCbG9ja2VkT24oaHlkcmF0aW9uSW5zdGFuY2UpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBoaWRlT3JVbmhpZGVEZWh5ZHJhdGVkQm91bmRhcnkoc3VzcGVuc2VJbnN0YW5jZSwgaXNIaWRkZW4pIHtcbiAgICAgIHZhciBub2RlID0gc3VzcGVuc2VJbnN0YW5jZTtcbiAgICAgIHN1c3BlbnNlSW5zdGFuY2UgPSAwO1xuICAgICAgZG8ge1xuICAgICAgICB2Y
15852XIgbmV4dE5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgICAgICAxID09PSBub2RlLm5vZGVUeXBlXG4gICAgICAgICAgPyBpc0hpZGRlblxuICAgICAgICAgICAgPyAoKG5vZGUuX3N0YXNoZWREaXNwbGF5ID0gbm9kZS5zdHlsZS5kaXNwbGF5KSxcbiAgICAgICAgICAgICAgKG5vZGUuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiKSlcbiAgICAgICAgICAgIDogKChub2RlLnN0eWxlLmRpc3BsYXkgPSBub2RlLl9zdGFzaGVkRGlzcGxheSB8fCBcIlwiKSxcbiAgICAgICAgICAgICAgXCJcIiA9PT0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKSAmJlxuICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKFwic3R5bGVcIikpXG4gICAgICAgICAgOiAzID09PSBub2RlLm5vZGVUeXBlICYmXG4gICAgICAgICAgICAoaXNIaWRkZW5cbiAgICAgICAgICAgICAgPyAoKG5vZGUuX3N0YXNoZWRUZXh0ID0gbm9kZS5ub2RlVmFsdWUpLCAobm9kZS5ub2RlVmFsdWUgPSBcIlwiKSlcbiAgICAgICAgICAgICAgOiAobm9kZS5ub2RlVmFsdWUgPSBub2RlLl9zdGFzaGVkVGV4dCB8fCBcIlwiKSk7XG4gICAgICAgIGlmIChuZXh0Tm9kZSAmJiA4ID09PSBuZXh0Tm9kZS5ub2RlVHlwZSlcbiAgICAgICAgICBpZiAoKChub2RlID0gbmV4dE5vZGUuZGF0YSksIG5vZGUgPT09IFNVU1BFTlNFX0VORF9EQVRBKSlcbiAgICAgICAgICAgIGlmICgwID09PSBzdXNwZW5zZUluc3RhbmNlKSBicmVhaztcbiAgICAgICAgICAgIGVsc2Ugc3VzcGVuc2VJbnN0YW5jZS0tO1xuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgIChub2RlICE9PSBTVVNQRU5TRV9TVEFSVF9EQVRBICYmXG4gICAgICAgICAgICAgIG5vZGUgIT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSAmJlxuICAgICAgICAgICAgICBub2RlICE9PSBTVVNQRU5TRV9RVUVVRURfU1RBUlRfREFUQSAmJlxuICAgICAgICAgICAgICBub2RlICE9PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBKSB8fFxuICAgICAgICAgICAgICBzdXNwZW5zZUluc3RhbmNlKys7XG4gICAgICAgIG5vZGUgPSBuZXh0Tm9kZTtcbiAgICAgIH0gd2hpbGUgKG5vZGUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBoaWRlRGVoeWRyYXRlZEJvdW5kYXJ5KHN1c3BlbnNlSW5zdGFuY2UpIHtcbiAgICAgIGhpZGVPclVuaGlkZURlaHlkcmF0ZWRCb3VuZGFyeShzdXNwZW5zZUluc3RhbmNlLCAhMCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhpZGVJbnN0YW5jZShpbnN0YW5jZSkge1xuICAgICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5zdHlsZTtcbiAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGluc3RhbmNlLnNldFByb3BlcnR5XG4gICAgICAgID8gaW5zdGFuY2Uuc2V0UHJvcGVydHkoXCJkaXNwbGF5XCIsIFwibm9uZVwiLCBcImltcG9ydGFudFwiKVxuICAgICAgICA6IChpbnN0YW5jZS5kaXNwbGF5ID0gXCJub25lXCIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBoaWRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSkge1xuICAgICAgdGV4dEluc3RhbmNlLm5vZGVWYWx1ZSA9IFwiXCI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVuaGlkZURlaHlkcmF0ZWRCb3VuZGFyeShkZWh5ZHJhdGVkSW5zdGFuY2UpIHtcbiAgICAgIGhpZGVPclVuaGlkZURlaHlkcmF0ZWRCb3VuZGFyeShkZWh5ZHJhdGVkSW5zdGFuY2UsICExKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdW5oaWRlSW5zdGFuY2UoaW5zdGFuY2UsIHByb3BzKSB7XG4gICAgICBwcm9wcyA9IHByb3BzW1NUWUxFXTtcbiAgICAgIHByb3BzID1cbiAgICAgICAgdm9pZCAwICE9PSBwcm9wcyAmJiBudWxsICE9PSBwcm9wcyAmJiBwcm9wcy5oYXNPd25Qcm9wZXJ0eShcImRpc3BsYXlcIilcbiAgICAgICAgICA/IHByb3BzLmRpc3BsYXlcbiAgICAgICAgICA6IG51bGw7XG4gICAgICBpbnN0YW5jZS5zdHlsZS5kaXNwbGF5ID1cbiAgICAgICAgbnVsbCA9PSBwcm9wcyB8fCBcImJvb2xlYW5cIiA9PT0gdHlwZW9mIHByb3BzID8gXCJcIiA6IChcIlwiICsgcHJvcHMpLnRyaW0oKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdW5oaWRlVGV4dEluc3RhbmNlKHRleHRJbnN0YW5jZSwgdGV4dCkge1xuICAgICAgdGV4dEluc3RhbmNlLm5vZGVWYWx1ZSA9IHRleHQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHdhcm5Gb3JCbG9ja0luc2lkZUlubGluZShpbnN0YW5jZSkge1xuICAgICAgZm9yICh2YXIgbmV4dE5vZGUgPSBpbnN0YW5jZS5maXJzdENoaWxkOyBudWxsICE9IG5leHROb2RlOyApIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIDEgPT09IG5leHROb2RlLm5vZGVUeXBlICYmXG4gICAgICAgICAgXCJibG9ja1wiID09PSBnZXRDb21wdXRlZFN0eWxlKG5leHROb2RlKS5kaXNwbGF5XG4gICAgICAgICkge1xuICAgICAgICAgIHZhciBmaWJlciA9XG4gICAgICAgICAgICBnZXRJbnN0YW5jZUZyb21Ob2RlKG5leHROb2RlKSB8fCBnZXRJbnN0YW5jZUZyb21Ob2RlKGluc3RhbmNlKTtcbiAgICAgICAgICBydW5XaXRoRmliZXJJbkRFVihcbiAgICAgICAgICAgIGZpYmVyLFxuICAgICAgICAgICAgZnVuY3Rpb24gKHBhcmVudFRhZywgY2hpbGRUYWcpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBcIllvdSdyZSBhYm91dCB0byBzdGFydCBhIDxWaWV3VHJhbnNpdGlvbj4gYXJvdW5kIGEgZGlzcGxheTogaW5saW5lIGVsZW1lbnQgPCVzPiwgd2hpY2ggaXRzZWxmIGhhcyBhIGRpc3BsYXk6IGJsb2NrIGVsZW1lbnQgPCVzPiBpbnNpZGUgaXQuIFRoaXMgbWlnaHQgdHJpZ2dlciBhIGJ1ZyBpbiBTYWZhcmkgd2hpY2ggY2F1c2VzIHRoZSBWaWV3IFRyYW5zaXRpb24gdG8gYmUgc2tpcHBlZCB3aXRoIGEgZHVwbGljYXRlIG5hbWUgZXJyb3IuXFxuaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI5MDkyM1wiLFxuICAgICAgICAgICAgICAgIHBhcmVudFRhZy50b0xvY2FsZUxvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgICAgIGNoaWxkVGFnLnRvTG9jYWxlTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbnN0YW5jZS50YWdOYW1lLFxuICAgICAgICAgICAgbmV4dE5vZGUudGFnTmFtZVxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgI
15852H1cbiAgICAgICAgaWYgKG51bGwgIT0gbmV4dE5vZGUuZmlyc3RDaGlsZCkgbmV4dE5vZGUgPSBuZXh0Tm9kZS5maXJzdENoaWxkO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAobmV4dE5vZGUgPT09IGluc3RhbmNlKSBicmVhaztcbiAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgO1xuICAgICAgICAgICAgbnVsbCA9PSBuZXh0Tm9kZS5uZXh0U2libGluZyAmJlxuICAgICAgICAgICAgbnVsbCAhPSBuZXh0Tm9kZS5wYXJlbnROb2RlICYmXG4gICAgICAgICAgICBuZXh0Tm9kZS5wYXJlbnROb2RlICE9PSBpbnN0YW5jZTtcblxuICAgICAgICAgIClcbiAgICAgICAgICAgIG5leHROb2RlID0gbmV4dE5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICBuZXh0Tm9kZSA9IG5leHROb2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFwcGx5Vmlld1RyYW5zaXRpb25OYW1lKGluc3RhbmNlLCBuYW1lLCBjbGFzc05hbWUpIHtcbiAgICAgIG5hbWUgPVxuICAgICAgICBDU1MuZXNjYXBlKG5hbWUpICE9PSBuYW1lID8gXCJyLVwiICsgYnRvYShuYW1lKS5yZXBsYWNlKC89L2csIFwiXCIpIDogbmFtZTtcbiAgICAgIGluc3RhbmNlLnN0eWxlLnZpZXdUcmFuc2l0aW9uTmFtZSA9IG5hbWU7XG4gICAgICBudWxsICE9IGNsYXNzTmFtZSAmJiAoaW5zdGFuY2Uuc3R5bGUudmlld1RyYW5zaXRpb25DbGFzcyA9IGNsYXNzTmFtZSk7XG4gICAgICBjbGFzc05hbWUgPSBnZXRDb21wdXRlZFN0eWxlKGluc3RhbmNlKTtcbiAgICAgIGlmIChcImlubGluZVwiID09PSBjbGFzc05hbWUuZGlzcGxheSkge1xuICAgICAgICBuYW1lID0gaW5zdGFuY2UuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICAgICAgaWYgKDEgPT09IG5hbWUubGVuZ3RoKSB2YXIgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ID0gMTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGZvciAodmFyIGkgPSAoSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ID0gMCk7IGkgPCBuYW1lLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2Y
15852XIgcmVjdCA9IG5hbWVbaV07XG4gICAgICAgICAgICAwIDwgcmVjdC53aWR0aCAmJiAwIDwgcmVjdC5oZWlnaHQgJiYgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0Kys7XG4gICAgICAgICAgfVxuICAgICAgICAxID09PSBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHRcbiAgICAgICAgICA/ICgoaW5zdGFuY2UgPSBpbnN0YW5jZS5zdHlsZSksXG4gICAgICAgICAgICAoaW5zdGFuY2UuZGlzcGxheSA9IDEgPT09IG5hbWUubGVuZ3RoID8gXCJpbmxpbmUtYmxvY2tcIiA6IFwiYmxvY2tcIiksXG4gICAgICAgICAgICAoaW5zdGFuY2UubWFyZ2luVG9wID0gXCItXCIgKyBjbGFzc05hbWUucGFkZGluZ1RvcCksXG4gICAgICAgICAgICAoaW5zdGFuY2UubWFyZ2luQm90dG9tID0gXCItXCIgKyBjbGFzc05hbWUucGFkZGluZ0JvdHRvbSkpXG4gICAgICAgICAgOiB3YXJuRm9yQmxvY2tJbnNpZGVJbmxpbmUoaW5zdGFuY2UpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiByZXN0b3JlVmlld1RyYW5zaXRpb25OYW1lKGluc3RhbmNlLCBwcm9wcykge1xuICAgICAgaW5zdGFuY2UgPSBpbnN0YW5jZS5zdHlsZTtcbiAgICAgIHByb3BzID0gcHJvcHNbU1RZTEVdO1xuICAgICAgdmFyIHZpZXdUcmFuc2l0aW9uTmFtZSA9XG4gICAgICAgIG51bGwgIT0gcHJvcHNcbiAgICAgICAgICA/IHByb3BzLmhhc093blByb3BlcnR5KFwidmlld1RyYW5zaXRpb25OYW1lXCIpXG4gICAgICAgICAgICA/IHByb3BzLnZpZXdUcmFuc2l0aW9uTmFtZVxuICAgICAgICAgICAgOiBwcm9wcy5oYXNPd25Qcm9wZXJ0eShcInZpZXctdHJhbnNpdGlvbi1uYW1lXCIpXG4gICAgICAgICAgICAgID8gcHJvcHNbXCJ2aWV3LXRyYW5zaXRpb24tbmFtZVwiXVxuICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICA6IG51bGw7XG4gICAgICBpbnN0YW5jZS52aWV3VHJhbnNpdGlvbk5hbWUgPVxuICAgICAgICBudWxsID09IHZpZXdUcmFuc2l0aW9uTmFtZSB8fCBcImJvb2xlYW5cIiA9PT0gdHlwZW9mIHZpZXdUcmFuc2l0aW9uTmFtZVxuICAgICAgICAgID8gXCJcIlxuICAgICAgICAgIDogKFwiXCIgKyB2aWV3VHJhbnNpdGlvbk5hbWUpLnRyaW0oKTtcbiAgICAgIHZpZXdUcmFuc2l0aW9uTmFtZSA9XG4gICAgICAgIG51bGwgIT0gcHJvcHNcbiAgICAgICAgICA/IHByb3BzLmhhc093blByb3BlcnR5KFwidmlld1RyYW5zaXRpb25DbGFzc1wiKVxuICAgICAgICAgICAgPyBwcm9wcy52aWV3VHJhbnNpdGlvbkNsYXNzXG4gICAgICAgICAgICA6IHByb3BzLmhhc093blByb3BlcnR5KFwidmlldy10cmFuc2l0aW9uLWNsYXNzXCIpXG4gICAgICAgICAgICAgID8gcHJvcHNbXCJ2aWV3LXRyYW5zaXRpb24tY2xhc3NcIl1cbiAgICAgICAgICAgICAgOiBudWxsXG4gICAgICAgICAgOiBudWxsO1xuICAgICAgaW5zdGFuY2Uudmlld1RyYW5zaXRpb25DbGFzcyA9XG4gICAgICAgIG51bGwgPT0gdmlld1RyYW5zaXRpb25OYW1lIHx8IFwiYm9vbGVhblwiID09PSB0eXBlb2Ygdmlld1RyYW5zaXRpb25OYW1lXG4gICAgICAgICAgPyBcIlwiXG4gICAgICAgICAgOiAoXCJcIiArIHZpZXdUcmFuc2l0aW9uTmFtZSkudHJpbSgpO1xuICAgICAgXCJpbmxpbmUtYmxvY2tcIiA9PT0gaW5zdGFuY2UuZGlzcGxheSAmJlxuICAgICAgICAobnVsbCA9PSBwcm9wc1xuICAgICAgICAgID8gKGluc3RhbmNlLmRpc3BsYXkgPSBpbnN0YW5jZS5tYXJnaW4gPSBcIlwiKVxuICAgICAgICAgIDogKCh2aWV3VHJhbnNpdGlvbk5hbWUgPSBwcm9wcy5kaXNwbGF5KSxcbiAgICAgICAgICAgIChpbnN0YW5jZS5kaXNwbGF5ID1cbiAgICAgICAgICAgICAgbnVsbCA9PSB2aWV3VHJhbnNpdGlvbk5hbWUgfHxcbiAgICAgICAgICAgICAgXCJib29sZWFuXCIgPT09IHR5cGVvZiB2aWV3VHJhbnNpdGlvbk5hbWVcbiAgICAgICAgICAgICAgICA/IFwiXCJcbiAgICAgICAgICAgICAgICA6IHZpZXdUcmFuc2l0aW9uTmFtZSksXG4gICAgICAgICAgICAodmlld1RyYW5zaXRpb25OYW1lID0gcHJvcHMubWFyZ2luKSxcbiAgICAgICAgICAgIG51bGwgIT0gdmlld1RyYW5zaXRpb25OYW1lXG4gICAgICAgICAgICAgID8gKGluc3RhbmNlLm1hcmdpbiA9IHZpZXdUcmFuc2l0aW9uTmFtZSlcbiAgICAgICAgICAgICAgOiAoKHZpZXdUcmFuc2l0aW9uTmFtZSA9IHByb3BzLmhhc093blByb3BlcnR5KFwibWFyZ2luVG9wXCIpXG4gICAgICAgICAgICAgICAgICA/IHByb3BzLm1hcmdpblRvcFxuICAgICAgICAgICAgICAgICAgOiBwcm9wc1tcIm1hcmdpbi10b3BcIl0pLFxuICAgICAgICAgICAgICAgIChpbnN0YW5jZS5tYXJnaW5Ub3AgPVxuICAgICAgICAgICAgICAgICAgbnVsbCA9PSB2aWV3VHJhbnNpdGlvbk5hbWUgfHxcbiAgICAgICAgICAgICAgICAgIFwiYm9vbGVhblwiID09PSB0eXBlb2Ygdmlld1RyYW5zaXRpb25OYW1lXG4gICAgICAgICAgICAgICAgICAgID8gXCJcIlxuICAgICAgICAgICAgICAgICAgICA6IHZpZXdUcmFuc2l0aW9uTmFtZSksXG4gICAgICAgICAgICAgICAgKHByb3BzID0gcHJvcHMuaGFzT3duUHJvcGVydHkoXCJtYXJnaW5Cb3R0b21cIilcbiAgICAgICAgICAgICAgICAgID8gcHJvcHMubWFyZ2luQm90dG9tXG4gICAgICAgICAgICAgICAgICA6IHByb3BzW1wibWFyZ2luLWJvdHRvbVwiXSksXG4gICAgICAgICAgICAgICAgKGluc3RhbmNlLm1hcmdpbkJvdHRvbSA9XG4gICAgICAgICAgICAgICAgICBudWxsID09IHByb3BzIHx8IFwiYm9vbGVhblwiID09PSB0eXBlb2YgcHJvcHMgPyBcIlwiIDogcHJvcHMpKSkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjcmVhdGVNZWFzdXJlbWVudChyZWN0LCBjb21wdXRlZFN0eWxlLCBlbGVtZW50KSB7XG4gICAgICBlbGVtZW50ID0gZWxlbWVudC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVjdDogcmVjdCxcbiAgICAgICAgYWJzOlxuICAgICAgICAgIFwiYWJzb2x1dGVcIiA9PT0gY29tcHV0ZWRTdHlsZS5wb3NpdGlvbiB8fFxuICAgICAgICAgIFwiZml4ZWRcIiA9PT0gY29tcHV0ZWRTdHlsZS5wb3NpdGlvbixcbiAgICAgICAgY2xpcDpcbiAgICAgICAgICBcIm5vbmVcIiAhPT0gY29tcHV0ZWRTdHlsZS5jbGlwUGF0aCB8fFxuICAgICAgICAgIFwidmlzaWJsZVwiICE9PSBjb21wdXRlZFN0eWxlLm92ZXJmbG93IHx8XG4gICAgICAgICAgXCJub25lXCIgIT09IGNvbXB1dGVkU3R5bGUuZmlsdGVyIHx8XG4gICAgICAgICAgXCJub25lXCIgIT09IGNvbXB1dGVkU3R5bGUubWFzayB8fFxuICAgICAgICAgIFwibm9uZVwiICE9PSBjb21wdXRlZFN0eWxlLm1hc2sgfHxcbiAgICAgICAgICBcIjBweFwiICE9PSBjb21wdXRlZFN0eWxlLmJvcmRlclJhZGl1cyxcbiAgICAgICAgdmlldzpcbiAgICAgICAgICAwIDw9IHJlY3QuYm90dG9tICYmXG4gICAgICAgICAgMCA8PSByZWN0LnJpZ2h0ICYmXG4gICAgICAgICAgcmVjdC50b3AgPD0gZWxlbWVudC5pbm5lckhlaWdodCAmJlxuICAgICAgICAgI
15852HJlY3QubGVmdCA8PSBlbGVtZW50LmlubmVyV2lkdGhcbiAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1lYXN1cmVJbnN0YW5jZShpbnN0YW5jZSkge1xuICAgICAgdmFyIHJlY3QgPSBpbnN0YW5jZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgY29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoaW5zdGFuY2UpO1xuICAgICAgcmV0dXJuIGNyZWF0ZU1lYXN1cmVtZW50KHJlY3QsIGNvbXB1dGVkU3R5bGUsIGluc3RhbmNlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbWVhc3VyZUNsb25lZEluc3RhbmNlKGluc3RhbmNlKSB7XG4gICAgICB2YXIgbWVhc3VyZWRSZWN0ID0gaW5zdGFuY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBtZWFzdXJlZFJlY3QgPSBuZXcgRE9NUmVjdChcbiAgICAgICAgbWVhc3VyZWRSZWN0LnggKyAyZTQsXG4gICAgICAgIG1lYXN1cmVkUmVjdC55ICsgMmU0LFxuICAgICAgICBtZWFzdXJlZFJlY3Qud2lkdGgsXG4gICAgICAgIG1lYXN1cmVkUmVjdC5oZWlnaHRcbiAgICAgICk7XG4gICAgICB2YXIgY29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoaW5zdGFuY2UpO1xuICAgICAgcmV0dXJuIGNyZWF0ZU1lYXN1cmVtZW50KG1lYXN1cmVkUmVjdCwgY29tcHV0ZWRTdHlsZSwgaW5zdGFuY2UpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjdXN0b21pemVWaWV3VHJhbnNpdGlvbkVycm9yKGVycm9yLCBpZ25vcmVBYm9ydCkge1xuICAgICAgaWYgKFwib2JqZWN0XCIgPT09IHR5cGVvZiBlcnJvciAmJiBudWxsICE9PSBlcnJvcilcbiAgICAgICAgc3dpdGNoIChlcnJvci5uYW1lKSB7XG4gICAgICAgICAgY2FzZSBcIlRpbWVvdXRFcnJvclwiOlxuICAgICAgICAgICAgcmV0dXJuIEVycm9yKFxuICAgICAgICAgICAgICBcIkEgVmlld1RyYW5zaXRpb24gdGltZWQgb3V0IGJlY2F1c2UgYSBOYXZpZ2F0aW9uIHN0YWxsZWQuIFRoaXMgY2FuIGhhcHBlbiBpZiBhIE5hdmlnYXRpb24gaXMgYmxvY2tlZCBvbiBSZWFjdCBpdHNlbGYuIFN1Y2ggYXMgaWYgaXQncyByZXNvbHZlZCBpbnNpZGUgdXNlRWZmZWN0LiBUaGlzIGNhbiBiZSBzb2x2ZWQgYnkgbW92aW5nIHRoZSByZXNvbHV0aW9uIHRvIHVzZUxheW91dEVmZmVjdC5cIixcbiAgICAgICAgICAgICAgeyBjYXVzZTogZXJyb3IgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjYXNlIFwiQWJvcnRFcnJvclwiOlxuICAgICAgICAgICAgcmV0dXJuIGlnbm9yZUFib3J0XG4gICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICA6IEVycm9yKFxuICAgICAgICAgICAgICAgICAgXCJBIFZpZXdUcmFuc2l0aW9uIHdhcyBhYm9ydGVkIGVhcmx5LiBUaGlzIG1pZ2h0IGJlIGJlY2F1c2UgeW91IGhhdmUgb3RoZXIgVmlldyBUcmFuc2l0aW9uIGxpYnJhcmllcyBvbiB0aGUgcGFnZSBhbmQgb25seSBvbmUgY2FuIHJ1biBhdCBhIHRpbWUuIFRvIGF2b2lkIHRoaXMsIHVzZSBvbmx5IFJlYWN0J3MgYnVpbHQtaW4gPFZpZXdUcmFuc2l0aW9uPiB0byBjb29yZGluYXRlLlwiLFxuICAgICAgICAgICAgICAgICAgeyBjYXVzZTogZXJyb3IgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgY2FzZSBcIkludmFsaWRTdGF0ZUVycm9yXCI6XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIFwiVmlldyB0cmFuc2l0aW9uIHdhcyBza2lwcGVkIGJlY2F1c2UgZG9jdW1lbnQgdmlzaWJpbGl0eSBzdGF0ZSBpcyBoaWRkZW4uXCIgPT09XG4gICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSB8fFxuICAgICAgICAgICAgICBcIlNraXBwaW5nIHZpZXcgdHJhbnNpdGlvbiBiZWNhdXNlIGRvY3VtZW50IHZpc2liaWxpdHkgc3RhdGUgaGFzIGJlY29tZSBoaWRkZW4uXCIgPT09XG4gICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSB8fFxuICAgICAgICAgICAgICBcIlNraXBwaW5nIHZpZXcgdHJhbnNpdGlvbiBiZWNhdXNlIHZpZXdwb3J0IHNpemUgY2hhbmdlZC5cIiA9PT1cbiAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlIHx8XG4gICAgICAgICAgICAgIFwiVHJhbnNpdGlvbiB3YXMgYWJvcnRlZCBiZWNhdXNlIG9mIGludmFsaWQgc3RhdGVcIiA9PT1cbiAgICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZvcmNlTGF5b3V0KG93bmVyRG9jdW1lbnQpIHtcbiAgICAgIHJldHVybiBvd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHdhaXRGb3JJbWFnZVRvTG9hZChyZXNvbHZlKSB7XG4gICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsIHJlc29sdmUpO1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgcmVzb2x2ZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0YXJ0Vmlld1RyYW5zaXRpb24oXG4gICAgICBzdXNwZW5kZWRTdGF0ZSxcbiAgICAgIHJvb3RDb250YWluZXIsXG4gICAgICB0cmFuc2l0aW9uVHlwZXMsXG4gICAgICBtdXRhdGlvbkNhbGxiYWNrLFxuICAgICAgbGF5b3V0Q2FsbGJhY2ssXG4gICAgICBhZnRlck11dGF0aW9uQ2FsbGJhY2ssXG4gICAgICBzcGF3bmVkV29ya0NhbGxiYWNrLFxuICAgICAgcGFzc2l2ZUNhbGxiYWNrLFxuICAgICAgZXJyb3JDYWxsYmFjayxcbiAgICAgIGJsb2NrZWRDYWxsYmFjayxcbiAgICAgIGZpbmlzaGVkQW5pbWF0aW9uXG4gICAgKSB7XG4gICAgICB2Y
15852XIgb3duZXJEb2N1bWVudCA9XG4gICAgICAgIDkgPT09IHJvb3RDb250YWluZXIubm9kZVR5cGVcbiAgICAgICAgICA/IHJvb3RDb250YWluZXJcbiAgICAgICAgICA6IHJvb3RDb250YWluZXIub3duZXJEb2N1bWVudDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciB0cmFuc2l0aW9uID0gb3duZXJEb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKHtcbiAgICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBvd25lcldpbmRvdyA9IG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcsXG4gICAgICAgICAgICAgIHBlbmRpbmdOYXZpZ2F0aW9uID1cbiAgICAgICAgICAgICAgICBvd25lcldpbmRvdy5uYXZpZ2F0aW9uICYmIG93bmVyV2luZG93Lm5hdmlnYXRpb24udHJhbnNpdGlvbixcbiAgICAgICAgICAgICAgcHJldmlvdXNGb250TG9hZGluZ1N0YXR1cyA9IG93bmVyRG9jdW1lbnQuZm9udHMuc3RhdHVzO1xuICAgICAgICAgICAgbXV0YXRpb25DYWxsYmFjaygpO1xuICAgICAgICAgICAgdmFyIGJsb2NraW5nUHJvbWlzZXMgPSBbXTtcbiAgICAgICAgICAgIFwibG9hZGVkXCIgPT09IHByZXZpb3VzRm9udExvYWRpbmdTdGF0dXMgJiZcbiAgICAgICAgICAgICAgKGZvcmNlTGF5b3V0KG93bmVyRG9jdW1lbnQpLFxuICAgICAgICAgICAgICBcImxvYWRpbmdcIiA9PT0gb3duZXJEb2N1bWVudC5mb250cy5zdGF0dXMgJiZcbiAgICAgICAgICAgICAgICBibG9ja2luZ1Byb21pc2VzLnB1c2gob3duZXJEb2N1bWVudC5mb250cy5yZWFkeSkpO1xuICAgICAgICAgICAgcHJldmlvdXNGb250TG9hZGluZ1N0YXR1cyA9IGJsb2NraW5nUHJvbWlzZXMubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKG51bGwgIT09IHN1c3BlbmRlZFN0YXRlKVxuICAgICAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgICAgIHZhciBzdXNwZW5zZXlJbWFnZXMgPSBzdXNwZW5kZWRTdGF0ZS5zdXNwZW5zZXlJbWFnZXMsXG4gICAgICAgICAgICAgICAgICBpbWdCeXRlcyA9IDAsXG4gICAgICAgICAgICAgICAgICBpID0gMDtcbiAgICAgICAgICAgICAgICBpIDwgc3VzcGVuc2V5SW1hZ2VzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpKytcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdmFyIHN1c3BlbnNleUltYWdlID0gc3VzcGVuc2V5SW1hZ2VzW2ldO1xuICAgICAgICAgICAgICAgIGlmICghc3VzcGVuc2V5SW1hZ2UuY29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICAgIHZhciByZWN0ID0gc3VzcGVuc2V5SW1hZ2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIDAgPCByZWN0LmJvdHRvbSAmJlxuICAgICAgICAgICAgICAgICAgICAwIDwgcmVjdC5yaWdodCAmJlxuICAgICAgICAgICAgICAgICAgICByZWN0LnRvcCA8IG93bmVyV2luZG93LmlubmVySGVpZ2h0ICYmXG4gICAgICAgICAgICAgICAgICAgIHJlY3QubGVmdCA8IG93bmVyV2luZG93LmlubmVyV2lkdGhcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBpbWdCeXRlcyArPSBlc3RpbWF0ZUltYWdlQnl0ZXMoc3VzcGVuc2V5SW1hZ2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW1nQnl0ZXMgPiBlc3RpbWF0ZWRCeXRlc1dpdGhpbkxpbWl0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgYmxvY2tpbmdQcm9taXNlcy5sZW5ndGggPSBwcmV2aW91c0ZvbnRMb2FkaW5nU3RhdHVzO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHN1c3BlbnNleUltYWdlID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgICAgICAgd2FpdEZvckltYWdlVG9Mb2FkLmJpbmQoc3VzcGVuc2V5SW1hZ2UpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGJsb2NraW5nUHJvbWlzZXMucHVzaChzdXNwZW5zZXlJbWFnZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoMCA8IGJsb2NraW5nUHJvbWlzZXMubGVuZ3RoKVxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIGJsb2NrZWRDYWxsYmFjayhcbiAgICAgICAgICAgICAgICAgIDAgPCBwcmV2aW91c0ZvbnRMb2FkaW5nU3RhdHVzXG4gICAgICAgICAgICAgICAgICAgID8gYmxvY2tpbmdQcm9taXNlcy5sZW5ndGggPiBwcmV2aW91c0ZvbnRMb2FkaW5nU3RhdHVzXG4gICAgICAgICAgICAgICAgICAgICAgPyBcIldhaXRpbmcgb24gRm9udHMgYW5kIEltYWdlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgOiBcIldhaXRpbmcgb24gRm9udHNcIlxuICAgICAgICAgICAgICAgICAgICA6IFwiV2FpdGluZyBvbiBJbWFnZXNcIlxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKG93bmVyV2luZG93ID0gUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKGJsb2NraW5nUHJvbWlzZXMpLFxuICAgICAgICAgICAgICAgICAgbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoXG4gICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICAgICAgICAgICAgICBTVVNQRU5TRVlfRk9OVF9BTkRfSU1BR0VfVElNRU9VVFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBdKS50aGVuKGxheW91dENhbGxiYWNrLCBsYXlvdXRDYWxsYmFjaykpLFxuICAgICAgICAgICAgICAgIChwZW5kaW5nTmF2aWdhdGlvblxuICAgICAgICAgICAgICAgICAgPyBQcm9taXNlLmFsbFNldHRsZWQoW1xuICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdOYXZpZ2F0aW9uLmZpbmlzaGVkLFxuICAgICAgICAgICAgICAgICAgICAgIG93bmVyV2luZG93XG4gICAgICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgICA6IG93bmVyV2luZG93XG4gICAgICAgICAgICAgICAgKS50aGVuKGFmdGVyTXV0YXRpb25DYWxsYmFjaywgYWZ0ZXJNdXRhdGlvbkNhbGxiYWNrKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgbGF5b3V0Q2FsbGJhY2soKTtcbiAgICAgICAgICAgIGlmIChwZW5kaW5nTmF2aWdhdGlvbilcbiAgICAgICAgICAgICAgcmV0dXJuIHBlbmRpbmdOYXZpZ2F0aW9uLmZpbmlzaGVkLnRoZW4oXG4gICAgICAgICAgICAgICAgYWZ0ZXJNdXRhdGlvbkNhbGxiYWNrLFxuICAgICAgICAgICAgICAgIGFmdGVyTXV0YXRpb25DYWxsYmFja1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgYWZ0ZXJNdXRhdGlvbkNhbGxiYWNrKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB0eX
15852BlczogdHJhbnNpdGlvblR5cGVzXG4gICAgICAgIH0pO1xuICAgICAgICBvd25lckRvY3VtZW50Ll9fcmVhY3RWaWV3VHJhbnNpdGlvbiA9IHRyYW5zaXRpb247XG4gICAgICAgIHZhciB2aWV3VHJhbnNpdGlvbkFuaW1hdGlvbnMgPSBbXTtcbiAgICAgICAgdHJhbnNpdGlvbi5yZWFkeS50aGVuKFxuICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgIHZhciBhbmltYXRpb25zID0gb3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QW5pbWF0aW9ucyh7XG4gICAgICAgICAgICAgICAgICBzdWJ0cmVlOiAhMFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGkgPSAwO1xuICAgICAgICAgICAgICBpIDwgYW5pbWF0aW9ucy5sZW5ndGg7XG4gICAgICAgICAgICAgIGkrK1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHZhciBhbmltYXRpb24gPSBhbmltYXRpb25zW2ldLFxuICAgICAgICAgICAgICAgIGVmZmVjdCA9IGFuaW1hdGlvbi5lZmZlY3QsXG4gICAgICAgICAgICAgICAgcHNldWRvRWxlbWVudCA9IGVmZmVjdC5wc2V1ZG9FbGVtZW50O1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbnVsbCAhPSBwc2V1ZG9FbGVtZW50ICYmXG4gICAgICAgICAgICAgICAgcHNldWRvRWxlbWVudC5zdGFydHNXaXRoKFwiOjp2aWV3LXRyYW5zaXRpb25cIilcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdmlld1RyYW5zaXRpb25BbmltYXRpb25zLnB1c2goYW5pbWF0aW9uKTtcbiAgICAgICAgICAgICAgICBhbmltYXRpb24gPSBlZmZlY3QuZ2V0S2V5ZnJhbWVzKCk7XG4gICAgICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgICAgIHZhciBoZWlnaHQgPSAocHNldWRvRWxlbWVudCA9IHZvaWQgMCksXG4gICAgICAgICAgICAgICAgICAgIHVuY2hhbmdlZERpbWVuc2lvbnMgPSAhMCxcbiAgICAgICAgICAgICAgICAgICAgaiA9IDA7XG4gICAgICAgICAgICAgICAgICBqIDwgYW5pbWF0aW9uLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgIGorK1xuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgdmFyIGtleWZyYW1lID0gYW5pbWF0aW9uW2pdLFxuICAgICAgICAgICAgICAgICAgICB3ID0ga2V5ZnJhbWUud2lkdGg7XG4gICAgICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSBwc2V1ZG9FbGVtZW50KSBwc2V1ZG9FbGVtZW50ID0gdztcbiAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBzZXVkb0VsZW1lbnQgIT09IHcpIHtcbiAgICAgICAgICAgICAgICAgICAgdW5jaGFuZ2VkRGltZW5zaW9ucyA9ICExO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHcgPSBrZXlmcmFtZS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICBpZiAodm9pZCAwID09PSBoZWlnaHQpIGhlaWdodCA9IHc7XG4gICAgICAgICAgICAgICAgICBlbHNlIGlmIChoZWlnaHQgIT09IHcpIHtcbiAgICAgICAgICAgICAgICAgICAgdW5jaGFuZ2VkRGltZW5zaW9ucyA9ICExO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSBrZXlmcmFtZS53aWR0aDtcbiAgICAgICAgICAgICAgICAgIGRlbGV0ZSBrZXlmcmFtZS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICBcIm5vbmVcIiA9PT0ga2V5ZnJhbWUudHJhbnNmb3JtICYmIGRlbGV0ZSBrZXlmcmFtZS50cmFuc2Zvcm07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHVuY2hhbmdlZERpbWVuc2lvbnMgJiZcbiAgICAgICAgICAgICAgICAgIHZvaWQgMCAhPT0gcHNldWRvRWxlbWVudCAmJlxuICAgICAgICAgICAgICAgICAgdm9pZCAwICE9PSBoZWlnaHQgJiZcbiAgICAgICAgICAgICAgICAgIChlZmZlY3Quc2V0S2V5ZnJhbWVzKGFuaW1hdGlvbiksXG4gICAgICAgICAgICAgICAgICAodW5jaGFuZ2VkRGltZW5zaW9ucyA9IGdldENvbXB1dGVkU3R5bGUoXG4gICAgICAgICAgICAgICAgICAgIGVmZmVjdC50YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgIGVmZmVjdC5wc2V1ZG9FbGVtZW50XG4gICAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgICAgICAgIHVuY2hhbmdlZERpbWVuc2lvbnMud2lkdGggIT09IHBzZXVkb0VsZW1lbnQgfHxcbiAgICAgICAgICAgICAgICAgICAgdW5jaGFuZ2VkRGltZW5zaW9ucy5oZWlnaHQgIT09IGhlaWdodCkgJiZcbiAgICAgICAgICAgICAgICAgICgodW5jaGFuZ2VkRGltZW5zaW9ucyA9IGFuaW1hdGlvblswXSksXG4gICAgICAgICAgICAgICAgICAodW5jaGFuZ2VkRGltZW5zaW9ucy53aWR0aCA9IHBzZXVkb0VsZW1lbnQpLFxuICAgICAgICAgICAgICAgICAgKHVuY2hhbmdlZERpbWVuc2lvbnMuaGVpZ2h0ID0gaGVpZ2h0KSxcbiAgICAgICAgICAgICAgICAgICh1bmNoYW5nZWREaW1lbnNpb25zID0gYW5pbWF0aW9uW2FuaW1hdGlvbi5sZW5ndGggLSAxXSksXG4gICAgICAgICAgICAgICAgICAodW5jaGFuZ2VkRGltZW5zaW9ucy53aWR0aCA9IHBzZXVkb0VsZW1lbnQpLFxuICAgICAgICAgICAgICAgICAgKHVuY2hhbmdlZERpbWVuc2lvbnMuaGVpZ2h0ID0gaGVpZ2h0KSxcbiAgICAgICAgICAgICAgICAgIGVmZmVjdC5zZXRLZXlmcmFtZXMoYW5pbWF0aW9uKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNwYXduZWRXb3JrQ2FsbGJhY2soKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgb3duZXJEb2N1bWVudC5fX3JlYWN0Vmlld1RyYW5zaXRpb24gPT09IHRyYW5zaXRpb24gJiZcbiAgICAgICAgICAgICAgKG93bmVyRG9jdW1lbnQuX19yZWFjdFZpZXdUcmFuc2l0aW9uID0gbnVsbCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAoZXJyb3IgPSBjdXN0b21pemVWaWV3VHJhbnNpdGlvbkVycm9yKGVycm9yLCAhMSkpLFxuICAgICAgICAgICAgICAgIG51bGwgIT09IGVycm9yICYmIGVycm9yQ2FsbGJhY2soZXJyb3IpO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgbXV0YXRpb25DYWxsYmFjaygpLFxuICAgICAgICAgICAgICAgIGxheW91dENhbGxiYWNrKCksXG4gICAgICAgICAgICAgICAgc3B
15852hd25lZFdvcmtDYWxsYmFjaygpLFxuICAgICAgICAgICAgICAgIGZpbmlzaGVkQW5pbWF0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICB0cmFuc2l0aW9uLmZpbmlzaGVkLmZpbmFsbHkoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmlld1RyYW5zaXRpb25BbmltYXRpb25zLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgdmlld1RyYW5zaXRpb25BbmltYXRpb25zW2ldLmNhbmNlbCgpO1xuICAgICAgICAgIG93bmVyRG9jdW1lbnQuX19yZWFjdFZpZXdUcmFuc2l0aW9uID09PSB0cmFuc2l0aW9uICYmXG4gICAgICAgICAgICAob3duZXJEb2N1bWVudC5fX3JlYWN0Vmlld1RyYW5zaXRpb24gPSBudWxsKTtcbiAgICAgICAgICBmaW5pc2hlZEFuaW1hdGlvbigpO1xuICAgICAgICAgIHBhc3NpdmVDYWxsYmFjaygpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRyYW5zaXRpb247XG4gICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbXV0YXRpb25DYWxsYmFjaygpLFxuICAgICAgICAgIGxheW91dENhbGxiYWNrKCksXG4gICAgICAgICAgZmluaXNoZWRBbmltYXRpb24oKSxcbiAgICAgICAgICBzcGF3bmVkV29ya0NhbGxiYWNrKCksXG4gICAgICAgICAgbnVsbFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBWaWV3VHJhbnNpdGlvblBzZXVkb0VsZW1lbnQocHNldWRvLCBuYW1lKSB7XG4gICAgICB0aGlzLl9zY29wZSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICAgIHRoaXMuX3NlbGVjdG9yID0gXCI6OnZpZXctdHJhbnNpdGlvbi1cIiArIHBzZXVkbyArIFwiKFwiICsgbmFtZSArIFwiKVwiO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjcmVhdGVWaWV3VHJhbnNpdGlvbkluc3RhbmNlKG5hbWUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgIGdyb3VwOiBuZXcgVmlld1RyYW5zaXRpb25Qc2V1ZG9FbGVtZW50KFwiZ3JvdXBcIiwgbmFtZSksXG4gICAgICAgIGltYWdlUGFpcjogbmV3IFZpZXdUcmFuc2l0aW9uUHNldWRvRWxlbWVudChcImltYWdlLXBhaXJcIiwgbmFtZSksXG4gICAgICAgIG9sZDogbmV3IFZpZXdUcmFuc2l0aW9uUHNldWRvRWxlbWVudChcIm9sZFwiLCBuYW1lKSxcbiAgICAgICAgbmV3OiBuZXcgVmlld1RyYW5zaXRpb25Qc2V1ZG9FbGVtZW50KFwibmV3XCIsIG5hbWUpXG4gICAgICB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBGcmFnbWVudEluc3RhbmNlKGZyYWdtZW50RmliZXIpIHtcbiAgICAgIHRoaXMuX2ZyYWdtZW50RmliZXIgPSBmcmFnbWVudEZpYmVyO1xuICAgICAgdGhpcy5fb2JzZXJ2ZXJzID0gdGhpcy5fZXZlbnRMaXN0ZW5lcnMgPSBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyVG9DaGlsZChcbiAgICAgIGNoaWxkLFxuICAgICAgdHlwZSxcbiAgICAgIGxpc3RlbmVyLFxuICAgICAgb3B0aW9uc09yVXNlQ2FwdHVyZVxuICAgICkge1xuICAgICAgZ2V0SW5zdGFuY2VGcm9tSG9zdEZpYmVyKGNoaWxkKS5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICB0eXBlLFxuICAgICAgICBsaXN0ZW5lcixcbiAgICAgICAgb3B0aW9uc09yVXNlQ2FwdHVyZVxuICAgICAgKTtcbiAgICAgIHJldHVybiAhMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lckZyb21DaGlsZChcbiAgICAgIGNoaWxkLFxuICAgICAgdHlwZSxcbiAgICAgIGxpc3RlbmVyLFxuICAgICAgb3B0aW9uc09yVXNlQ2FwdHVyZVxuICAgICkge1xuICAgICAgZ2V0SW5zdGFuY2VGcm9tSG9zdEZpYmVyKGNoaWxkKS5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgICB0eXBlLFxuICAgICAgICBsaXN0ZW5lcixcbiAgICAgICAgb3B0aW9uc09yVXNlQ2FwdHVyZVxuICAgICAgKTtcbiAgICAgIHJldHVybiAhMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0QXR0YWNoT3B0aW9ucyhvcHRzKSB7XG4gICAgICByZXR1cm4gbnVsbCAhPSBvcHRzICYmXG4gICAgICAgIFwiYm9vbGVhblwiICE9PSB0eXBlb2Ygb3B0cyAmJlxuICAgICAgICAoITAgPT09IG9wdHMub25jZSB8fCBvcHRzLnNpZ25hbCBpbnN0YW5jZW9mIEFib3J0U2lnbmFsKVxuICAgICAgICA/IHsgY2FwdHVyZTogb3B0cy5jYXB0dXJlLCBwYXNzaXZlOiBvcHRzLnBhc3NpdmUgfVxuICAgICAgICA6IG9wdHM7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZUxpc3RlbmVyT3B0aW9ucyhvcHRzKSB7XG4gICAgICByZXR1cm4gbnVsbCA9PSBvcHRzXG4gICAgICAgID8gXCJjPTBcIlxuICAgICAgICA6IFwiYm9vbGVhblwiID09PSB0eXBlb2Ygb3B0c1xuICAgICAgICAgID8gXCJjPVwiICsgKG9wdHMgPyBcIjFcIiA6IFwiMFwiKVxuICAgICAgICAgIDogXCJjPVwiICsgKG9wdHMuY2FwdHVyZSA/IFwiMVwiIDogXCIwXCIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpbmRleE9mRXZlbnRMaXN0ZW5lcihcbiAgICAgIGV2ZW50TGlzdGVuZXJzLFxuICAgICAgdHlwZSxcbiAgICAgIGxpc3RlbmVyLFxuICAgICAgb3B0aW9uc09yVXNlQ2FwdHVyZVxuICAgICkge1xuICAgICAgaWYgKDAgPT09IGV2ZW50TGlzdGVuZXJzLmxlbmd0aCkgcmV0dXJuIC0xO1xuICAgICAgb3B0aW9uc09yVXNlQ2FwdHVyZSA9IG5vcm1hbGl6ZUxpc3RlbmVyT3B0aW9ucyhvcHRpb25zT3JVc2VDYXB0dXJlKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGl0ZW0gPSBldmVudExpc3RlbmVyc1tpXTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGl0ZW0udHlwZSA9PT0gdHlwZSAmJlxuICAgICAgICAgIGl0ZW0ubGlzdGVuZXIgPT09IGxpc3RlbmVyICYmXG4gICAgICAgICAgbm9ybWFsaXplTGlzdGVuZXJPcHRpb25zKGl0ZW0ub3B0aW9uc09yVXNlQ2FwdHVyZSkgPT09XG4gICAgICAgICAgICBvcHRpb25zT3JVc2VDYXB0dXJlXG4gICAgICAgIClcbiAgICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2V0Rm9jdXNPbkZpYmVySWZGb2N1c2FibGUoZmliZXIsIGZvY3VzT3B0aW9ucykge1xuICAgICAgaWYgKDYgPT09IGZpYmVyLnRhZykgcmV0dXJuICExO1xuICAgICAgZmliZXIgPSBnZXRJbnN0YW5jZUZyb21Ib3N0RmliZXIoZmliZXIpO1xuICAgICAgcmV0dXJuIHNldEZvY3VzSWZGb2N1c2FibGUoZmliZXIsIGZvY3VzT3B0aW9ucyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbGxlY3RDaGlsZHJlbihjaGlsZCwgY29sbGVjdGlvbikge1xuICAgICAgY29sbGVjdGlvbi5wdXNoKGNoaWxkKTtcbiAgICAgIHJldHVybiAhMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYmx1ckFjdGl2ZUVsZW1lbnRXaXRoaW5GcmFnbWVudChjaGlsZCwgYWN0aXZlRWxlbWVudCkge1xuICAgICAgaWYgKDYgPT09IGNoaWxkLnRhZykgcmV0dXJuICExO1xuICAgICAgY2hpbGQgPSBnZXRJbnN0YW5jZUZyb21Ib3N0RmliZXIoY2hpbGQpO1xuICAgICAgcmV0dXJuIGNoaWxkID09PSBhY3RpdmVFbGVtZW50IHx8IGNoaWxkLmNvbnRhaW5zKGFjdGl2ZUVsZW1lbnQpXG4gICAgICAgID8gKGFjdGl2ZUVsZW1lbnQuYmx1cigpLCAhMClcbiAgICAgICAgOiAhMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gb2JzZXJ2ZUNoaWxkKGNoaWxkLCBvYnNlcnZlcikge1xuICAgICAgaWYgKDYgPT09IGNoaWxkLnRhZykgcmV0dXJuICExO1xuICAgICAgY2hpbGQgPSBnZXRJbnN0YW5jZUZyb21Ib3N0RmliZXIoY2hpbGQpO1xuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShjaGlsZCk7XG4gICAgICByZXR1cm4gITE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVub2JzZXJ2ZUNoaWxkKGNoaWxkLCBvYnNlcnZlcikge1xuICAgICAgaWYgKDYgPT09IGNoaWxkLnRhZykgcmV0dXJuICExO1xuICAgICAgY2hpbGQgPSBnZXRJbnN0YW5jZUZyb21Ib3N0RmliZXIoY2hpbGQpO1xuICAgICAgb2JzZXJ2ZXIudW5vYnNlcnZlKGNoaWxkKTtcbiAgICAgIHJldHVybiAhMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2NoZWR1bGVQZW5kaW5nSW50ZXJzZWN0aW9uVW5vYnNlcnZlKFxuICAgICAgZnJhZ21lbn
15852RJbnN0YW5jZSxcbiAgICAgIG9ic2VydmVyLFxuICAgICAgaW5zdGFuY2VcbiAgICApIHtcbiAgICAgIHBlbmRpbmdJbnRlcnNlY3Rpb25Vbm9ic2VydmVzLnB1c2goe1xuICAgICAgICBmcmFnbWVudEluc3RhbmNlOiBmcmFnbWVudEluc3RhbmNlLFxuICAgICAgICBvYnNlcnZlcjogb2JzZXJ2ZXIsXG4gICAgICAgIGluc3RhbmNlOiBpbnN0YW5jZVxuICAgICAgfSk7XG4gICAgICBpbnRlcnNlY3Rpb25Vbm9ic2VydmVTY2hlZHVsZWQgfHxcbiAgICAgICAgKChpbnRlcnNlY3Rpb25Vbm9ic2VydmVTY2hlZHVsZWQgPSAhMCksXG4gICAgICAgIHJlcXVlc3RQb3N0UGFpbnRDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaW50ZXJzZWN0aW9uVW5vYnNlcnZlU2NoZWR1bGVkID0gITE7XG4gICAgICAgICAgdmFyIHBlbmRpbmcgPSBwZW5kaW5nSW50ZXJzZWN0aW9uVW5vYnNlcnZlcztcbiAgICAgICAgICBwZW5kaW5nSW50ZXJzZWN0aW9uVW5vYnNlcnZlcyA9IFtdO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGVuZGluZy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGl0ZW0gPSBwZW5kaW5nW2ldO1xuICAgICAgICAgICAgaXRlbS5vYnNlcnZlci51bm9ic2VydmUoaXRlbS5pbnN0YW5jZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbGxlY3RDbGllbnRSZWN0cyhjaGlsZCwgcmVjdHMpIHtcbiAgICAgIGlmICg2ID09PSBjaGlsZC50YWcpIHtcbiAgICAgICAgY2hpbGQgPSBjaGlsZC5zdGF0ZU5vZGU7XG4gICAgICAgIHZhciByYW5nZSA9IGNoaWxkLm93bmVyRG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKGNoaWxkKTtcbiAgICAgICAgcmVjdHMucHVzaC5hcHBseShyZWN0cywgcmFuZ2UuZ2V0Q2xpZW50UmVjdHMoKSk7XG4gICAgICB9IGVsc2VcbiAgICAgICAgKGNoaWxkID0gZ2V0SW5zdGFuY2VGcm9tSG9zdEZpYmVyKGNoaWxkKSksXG4gICAgICAgICAgcmVjdHMucHVzaC5hcHBseShyZWN0cywgY2hpbGQuZ2V0Q2xpZW50UmVjdHMoKSk7XG4gICAgICByZXR1cm4gITE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlRG9jdW1lbnRQb3NpdGlvbldpdGhGaWJlclRyZWUoXG4gICAgICBkb2
15852N1bWVudFBvc2l0aW9uLFxuICAgICAgZnJhZ21lbnRGaWJlcixcbiAgICAgIHByZWNlZGluZ0JvdW5kYXJ5RmliZXIsXG4gICAgICBmb2xsb3dpbmdCb3VuZGFyeUZpYmVyLFxuICAgICAgb3RoZXJOb2RlXG4gICAgKSB7XG4gICAgICB2YXIgb3RoZXJGaWJlciA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKG90aGVyTm9kZSk7XG4gICAgICBpZiAoZG9jdW1lbnRQb3NpdGlvbiAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTkVEX0JZKSB7XG4gICAgICAgIGlmICgocHJlY2VkaW5nQm91bmRhcnlGaWJlciA9ICEhb3RoZXJGaWJlcikpXG4gICAgICAgICAgYToge1xuICAgICAgICAgICAgZm9yICg7IG51bGwgIT09IG90aGVyRmliZXI7ICkge1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgNyA9PT0gb3RoZXJGaWJlci50YWcgJiZcbiAgICAgICAgICAgICAgICAob3RoZXJGaWJlciA9PT0gZnJhZ21lbnRGaWJlciB8fFxuICAgICAgICAgICAgICAgICAgb3RoZXJGaWJlci5hbHRlcm5hdGUgPT09IGZyYWdtZW50RmliZXIpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHByZWNlZGluZ0JvdW5kYXJ5RmliZXIgPSAhMDtcbiAgICAgICAgICAgICAgICBicmVhayBhO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG90aGVyRmliZXIgPSBvdGhlckZpYmVyLnJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByZWNlZGluZ0JvdW5kYXJ5RmliZXIgPSAhMTtcbiAgICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcmVjZWRpbmdCb3VuZGFyeUZpYmVyO1xuICAgICAgfVxuICAgICAgaWYgKGRvY3VtZW50UG9zaXRpb24gJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5TKSB7XG4gICAgICAgIGlmIChudWxsID09PSBvdGhlckZpYmVyKVxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAob3RoZXJGaWJlciA9IG90aGVyTm9kZS5vd25lckRvY3VtZW50KSxcbiAgICAgICAgICAgIG90aGVyTm9kZSA9PT0gb3RoZXJGaWJlciB8fFxuICAgICAgICAgICAgICBvdGhlck5vZGUgPT09IG90aGVyRmliZXIuZG9jdW1lbnRFbGVtZW50IHx8XG4gICAgICAgICAgICAgIG90aGVyTm9kZSA9PT0gb3RoZXJGaWJlci5ib2R5XG4gICAgICAgICAgKTtcbiAgICAgICAgYToge1xuICAgICAgICAgIG90aGVyRmliZXIgPSBmcmFnbWVudEZpYmVyO1xuICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICBmcmFnbWVudEZpYmVyID1cbiAgICAgICAgICAgICAgZ2V0RnJhZ21lbnRQYXJlbnRJbnN0YW5jZU9yQ29udGFpbmVyRmliZXIoZnJhZ21lbnRGaWJlcik7XG4gICAgICAgICAgICBudWxsICE9PSBvdGhlckZpYmVyO1xuXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgKDUgIT09IG90aGVyRmliZXIudGFnICYmXG4gICAgICAgICAgICAgICAgICAzICE9PSBvdGhlckZpYmVyLnRhZyAmJlxuICAgICAgICAgICAgICAgICAgMjcgIT09IG90aGVyRmliZXIudGFnKSB8fFxuICAgICAgICAgICAgICAgIChvdGhlckZpYmVyICE9PSBmcmFnbWVudEZpYmVyICYmXG4gICAgICAgICAgICAgICAgICBvdGhlckZpYmVyLmFsdGVybmF0ZSAhPT0gZnJhZ21lbnRGaWJlcilcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIG90aGVyRmliZXIgPSAhMDtcbiAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG90aGVyRmliZXIgPSBvdGhlckZpYmVyLnJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3RoZXJGaWJlciA9ICExO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdGhlckZpYmVyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRvY3VtZW50UG9zaXRpb24gJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElOR1xuICAgICAgICA/ICgoZnJhZ21lbnRGaWJlciA9ICEhb3RoZXJGaWJlcikgJiZcbiAgICAgICAgICAgICEoZnJhZ21lbnRGaWJlciA9IG90aGVyRmliZXIgPT09IHByZWNlZGluZ0JvdW5kYXJ5RmliZXIpICYmXG4gICAgICAgICAgICAoKGZyYWdtZW50RmliZXIgPSBnZXRMb3dlc3RDb21tb25BbmNlc3RvcihcbiAgICAgICAgICAgICAgcHJlY2VkaW5nQm91bmRhcnlGaWJlcixcbiAgICAgICAgICAgICAgb3RoZXJGaWJlcixcbiAgICAgICAgICAgICAgZ2V0UGFyZW50Rm9yRnJhZ21lbnRBbmNlc3RvcnNcbiAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgbnVsbCA9PT0gZnJhZ21lbnRGaWJlclxuICAgICAgICAgICAgICA/IChmcmFnbWVudEZpYmVyID0gITEpXG4gICAgICAgICAgICAgIDogKHRyYXZlcnNlVmlzaWJsZUluc3RhbmNlc0FuZFRleHRJbnN0YW5jZXMoXG4gICAgICAgICAgICAgICAgICBmcmFnbWVudEZpYmVyLFxuICAgICAgICAgICAgICAgICAgITAsXG4gICAgICAgICAgICAgICAgICBpc0ZpYmVyUHJlY2VkaW5nQ2hlY2ssXG4gICAgICAgICAgICAgICAgICBvdGhlckZpYmVyLFxuICAgICAgICAgICAgICAgICAgcHJlY2VkaW5nQm91bmRhcnlGaWJlclxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKG90aGVyRmliZXIgPSBzZWFyY2hUYXJnZXQpLFxuICAgICAgICAgICAgICAgIChzZWFyY2hUYXJnZXQgPSBudWxsKSxcbiAgICAgICAgICAgICAgICAoZnJhZ21lbnRGaWJlciA9IG51bGwgIT09IG90aGVyRmliZXIpKSksXG4gICAgICAgICAgZnJhZ21lbnRGaWJlcilcbiAgICAgICAgOiBkb2N1bWVudFBvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkdcbiAgICAgICAgICA/ICgoZnJhZ21lbnRGaWJlciA9ICEhb3RoZXJGaWJlcikgJiZcbiAgICAgICAgICAgICAgIShmcmFnbWVudEZpYmVyID0gb3RoZXJGaWJlciA9PT0gZm9sbG93aW5nQm91bmRhcnlGaWJlcikgJiZcbiAgICAgICAgICAgICAgKChmcmFnbWVudEZpYmVyID0gZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IoXG4gICAgICAgICAgICAgICAgZm9sbG93aW5nQm91bmRhcnlGaWJlcixcbiAgICAgICAgICAgICAgICBvdGhlckZpYmVyLFxuICAgICAgICAgICAgICAgIGdldFBhcmVudEZvckZyYWdtZW50QW5jZXN0b3JzXG4gICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICBudWxsID09PSBmcmFnbWVudEZpYmVyXG4gICAgICAgICAgICAgICAgPyAoZnJhZ21lbn
15852RGaWJlciA9ICExKVxuICAgICAgICAgICAgICAgIDogKHRyYXZlcnNlVmlzaWJsZUluc3RhbmNlc0FuZFRleHRJbnN0YW5jZXMoXG4gICAgICAgICAgICAgICAgICAgIGZyYWdtZW50RmliZXIsXG4gICAgICAgICAgICAgICAgICAgICEwLFxuICAgICAgICAgICAgICAgICAgICBpc0ZpYmVyRm9sbG93aW5nQ2hlY2ssXG4gICAgICAgICAgICAgICAgICAgIG90aGVyRmliZXIsXG4gICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZ0JvdW5kYXJ5RmliZXJcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAob3RoZXJGaWJlciA9IHNlYXJjaFRhcmdldCksXG4gICAgICAgICAgICAgICAgICAoc2VhcmNoQm91bmRhcnkgPSBzZWFyY2hUYXJnZXQgPSBudWxsKSxcbiAgICAgICAgICAgICAgICAgIChmcmFnbWVudEZpYmVyID0gbnVsbCAhPT0gb3RoZXJGaWJlcikpKSxcbiAgICAgICAgICAgIGZyYWdtZW50RmliZXIpXG4gICAgICAgICAgOiAhMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2Nyb2xsVGV4dE5vZGVJbnRvVmlldyh0ZXh0Tm9kZSwgcmVzb2x2ZWRBbGlnblRvVG9wKSB7XG4gICAgICB2YXIgcmFuZ2UgPSB0ZXh0Tm9kZS5vd25lckRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHModGV4dE5vZGUpO1xuICAgICAgdGV4dE5vZGUgPSByYW5nZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHdpbmRvdy5zY3JvbGxUbyhcbiAgICAgICAgd2luZG93LnNjcm9sbFggKyB0ZXh0Tm9kZS5sZWZ0LFxuICAgICAgICByZXNvbHZlZEFsaWduVG9Ub3BcbiAgICAgICAgICA/IHdpbmRvdy5zY3JvbGxZICsgdGV4dE5vZGUudG9wXG4gICAgICAgICAgOiB3aW5kb3cuc2Nyb2xsWSArIHRleHROb2RlLmJvdHRvbSAtIHdpbmRvdy5pbm5lckhlaWdodFxuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYWRkRnJhZ21lbnRIYW5kbGVUb0ZpYmVyKGNoaWxkLCBmcmFnbWVudEluc3RhbmNlKSB7XG4gICAgICBjaGlsZCA9IGdldEluc3RhbmNlRnJvbUhvc3RGaWJlcihjaGlsZCk7XG4gICAgICBhZGRGcmFnbWVudEhhbmRsZVRvSW5zdGFuY2UoY2hpbGQsIGZyYWdtZW50SW5zdGFuY2UpO1xuICAgICAgcmV0dXJuICExO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhZGRGcmFnbWVudEhhbmRsZVRvSW5zdGFuY2UoaW5zdGFuY2UsIGZyYWdtZW50SW5zdGFuY2UpIHtcbiAgICAgIG51bGwgPT0gaW5zdGFuY2UucmVhY3RGcmFnbWVudHMgJiYgKGluc3RhbmNlLnJlYWN0RnJhZ21lbnRzID0gbmV3IFNldCgpKTtcbiAgICAgIGluc3RhbmNlLnJlYWN0RnJhZ21lbnRzLmFkZChmcmFnbWVudEluc3RhbmNlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tbWl0TmV3Q2hpbGRUb0ZyYWdtZW50SW5zdGFuY2UoY2hpbGRJbnN0YW5jZSwgZnJhZ21lbnRJbnN0YW5jZSkge1xuICAgICAgdmFyIGV2ZW50TGlzdGVuZXJzID0gZnJhZ21lbnRJbnN0YW5jZS5fZXZlbnRMaXN0ZW5lcnM7XG4gICAgICBpZiAobnVsbCAhPT0gZXZlbnRMaXN0ZW5lcnMpXG4gICAgICAgIGZvciAoXG4gICAgICAgICAgdmFyIGkkanNjb21wJDAgPSAwO1xuICAgICAgICAgIGkkanNjb21wJDAgPCBldmVudExpc3RlbmVycy5sZW5ndGg7XG4gICAgICAgICAgaSRqc2NvbXAkMCsrXG4gICAgICAgICkge1xuICAgICAgICAgIHZhciBfZXZlbnRMaXN0ZW5lcnMkaTIgPSBldmVudExpc3RlbmVyc1tpJGpzY29tcCQwXTtcbiAgICAgICAgICBjaGlsZEluc3RhbmNlLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICBfZXZlbnRMaXN0ZW5lcnMkaTIudHlwZSxcbiAgICAgICAgICAgIF9ldmVudExpc3RlbmVycyRpMi5hdHRhY2hlZExpc3RlbmVyLFxuICAgICAgICAgICAgZ2V0QXR0YWNoT3B0aW9ucyhfZXZlbnRMaXN0ZW5lcnMkaTIub3B0aW9uc09yVXNlQ2FwdHVyZSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAzICE9PSBjaGlsZEluc3RhbmNlLm5vZGVUeXBlICYmXG4gICAgICAgICgoZXZlbnRMaXN0ZW5lcnMgPSBmcmFnbWVudEluc3RhbmNlLl9vYnNlcnZlcnMpLFxuICAgICAgICBudWxsICE9PSBldmVudExpc3RlbmVycyAmJlxuICAgICAgICAgIGV2ZW50TGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24gKG9ic2VydmVyKSB7XG4gICAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgICB2Y
15852XIgd3JpdGVJZHggPSAwLCBpID0gMDtcbiAgICAgICAgICAgICAgaSA8IHBlbmRpbmdJbnRlcnNlY3Rpb25Vbm9ic2VydmVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgaSsrXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdmFyIHBlbmRpbmcgPSBwZW5kaW5nSW50ZXJzZWN0aW9uVW5vYnNlcnZlc1tpXTtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHBlbmRpbmcuZnJhZ21lbnRJbnN0YW5jZSAhPT0gZnJhZ21lbnRJbnN0YW5jZSB8fFxuICAgICAgICAgICAgICAgIHBlbmRpbmcub2JzZXJ2ZXIgIT09IG9ic2VydmVyIHx8XG4gICAgICAgICAgICAgICAgcGVuZGluZy5pbnN0YW5jZSAhPT0gY2hpbGRJbnN0YW5jZVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgcGVuZGluZ0ludGVyc2VjdGlvblVub2JzZXJ2ZXNbd3JpdGVJZHgrK10gPSBwZW5kaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGVuZGluZ0ludGVyc2VjdGlvblVub2JzZXJ2ZXMubGVuZ3RoID0gd3JpdGVJZHg7XG4gICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGNoaWxkSW5zdGFuY2UpO1xuICAgICAgICAgIH0pLFxuICAgICAgICBhZGRGcmFnbWVudEhhbmRsZVRvSW5zdGFuY2UoY2hpbGRJbnN0YW5jZSwgZnJhZ21lbnRJbnN0YW5jZSkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWxldGVDaGlsZEZyb21GcmFnbWVudEluc3RhbmNlKGNoaWxkSW5zdGFuY2UsIGZyYWdtZW50SW5zdGFuY2UpIHtcbiAgICAgIHZhciBldmVudExpc3RlbmVycyA9IGZyYWdtZW50SW5zdGFuY2UuX2V2ZW50TGlzdGVuZXJzO1xuICAgICAgaWYgKG51bGwgIT09IGV2ZW50TGlzdGVuZXJzKVxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50TGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIF9ldmVudExpc3RlbmVycyRpMyA9IGV2ZW50TGlzdGVuZXJzW2ldO1xuICAgICAgICAgIGNoaWxkSW5zdGFuY2UucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgIF9ldmVudExpc3RlbmVycyRpMy50eXBlLFxuICAgICAgICAgICAgX2V2ZW50TGlzdGVuZXJzJGkzLmF0dGFjaGVkTGlzdGVuZXIsXG4gICAgICAgICAgICBnZXRBdHRhY2hPcHRpb25zKF9ldmVudExpc3RlbmVycyRpMy5vcHRpb25zT3JVc2VDYXB0dXJlKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIDMgIT09IGNoaWxkSW5zdGFuY2Uubm9kZVR5cGUgJiZcbiAgICAgICAgKChldmVudExpc3RlbmVycyA9IGZyYWdtZW50SW5zdGFuY2UuX29ic2VydmVycyksXG4gICAgICAgIG51bGwgIT09IGV2ZW50TGlzdGVuZXJzICYmXG4gICAgICAgICAgZXZlbnRMaXN0ZW5lcnMuZm9yRWFjaChmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIFwic3RyaW5nXCIgPT09IHR5cGVvZiBvYnNlcnZlci5yb290TWFyZ2luXG4gICAgICAgICAgICAgID8gc2NoZWR1bGVQZW5kaW5nSW50ZXJzZWN0aW9uVW5vYnNlcnZlKFxuICAgICAgICAgICAgICAgICAgZnJhZ21lbnRJbnN0YW5jZSxcbiAgICAgICAgICAgICAgICAgIG9ic2VydmVyLFxuICAgICAgICAgICAgICAgICAgY2hpbGRJbnN0YW5jZVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBvYnNlcnZlci51bm9ic2VydmUoY2hpbGRJbnN0YW5jZSk7XG4gICAgICAgICAgfSksXG4gICAgICAgIG51bGwgIT0gY2hpbGRJbnN0YW5jZS5yZWFjdEZyYWdtZW50cyAmJlxuICAgICAgICAgIGNoaWxkSW5zdGFuY2UucmVhY3RGcmFnbWVudHMuZGVsZXRlKGZyYWdtZW50SW5zdGFuY2UpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2xlYXJDb250YWluZXJTcGFyaW5nbHkoY29udGFpbmVyKSB7XG4gICAgICB2Y
15852XIgbmV4dE5vZGUgPSBjb250YWluZXIuZmlyc3RDaGlsZDtcbiAgICAgIG5leHROb2RlICYmIDEwID09PSBuZXh0Tm9kZS5ub2RlVHlwZSAmJiAobmV4dE5vZGUgPSBuZXh0Tm9kZS5uZXh0U2libGluZyk7XG4gICAgICBmb3IgKDsgbmV4dE5vZGU7ICkge1xuICAgICAgICB2YXIgbm9kZSA9IG5leHROb2RlO1xuICAgICAgICBuZXh0Tm9kZSA9IG5leHROb2RlLm5leHRTaWJsaW5nO1xuICAgICAgICBzd2l0Y2ggKG5vZGUubm9kZU5hbWUpIHtcbiAgICAgICAgICBjYXNlIFwiSFRNTFwiOlxuICAgICAgICAgIGNhc2UgXCJIRUFEXCI6XG4gICAgICAgICAgY2FzZSBcIkJPRFlcIjpcbiAgICAgICAgICAgIGNsZWFyQ29udGFpbmVyU3BhcmluZ2x5KG5vZGUpO1xuICAgICAgICAgICAgZGV0YWNoRGVsZXRlZEluc3RhbmNlKG5vZGUpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgY2FzZSBcIlNDUklQVFwiOlxuICAgICAgICAgIGNhc2UgXCJTVFlMRVwiOlxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgY2FzZSBcIkxJTktcIjpcbiAgICAgICAgICAgIGlmIChcInN0eWxlc2hlZXRcIiA9PT0gbm9kZS5yZWwudG9Mb3dlckNhc2UoKSkgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBjYW5IeWRyYXRlSW5zdGFuY2UoaW5zdGFuY2UsIHR5cGUsIHByb3BzLCBpblJvb3RPclNpbmdsZXRvbikge1xuICAgICAgZm9yICg7IDEgPT09IGluc3RhbmNlLm5vZGVUeXBlOyApIHtcbiAgICAgICAgdmFyIGFueVByb3BzID0gcHJvcHM7XG4gICAgICAgIGlmIChpbnN0YW5jZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSB0eXBlLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhaW5Sb290T3JTaW5nbGV0b24gJiZcbiAgICAgICAgICAgIChcIklOUFVUXCIgIT09IGluc3RhbmNlLm5vZGVOYW1lIHx8IFwiaGlkZGVuXCIgIT09IGluc3RhbmNlLnR5cGUpXG4gICAgICAgICAgKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSBpZiAoIWluUm9vdE9yU2luZ2xldG9uKVxuICAgICAgICAgIGlmIChcImlucHV0XCIgPT09IHR5cGUgJiYgXCJoaWRkZW5cIiA9PT0gaW5zdGFuY2UudHlwZSkge1xuICAgICAgICAgICAgY2hlY2tBdHRyaWJ1dGVTdHJpbmdDb2VyY2lvbihhbnlQcm9wcy5uYW1lLCBcIm5hbWVcIik7XG4gICAgICAgICAgICB2Y
15852XIgbmFtZSA9IG51bGwgPT0gYW55UHJvcHMubmFtZSA/IG51bGwgOiBcIlwiICsgYW55UHJvcHMubmFtZTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgXCJoaWRkZW5cIiA9PT0gYW55UHJvcHMudHlwZSAmJlxuICAgICAgICAgICAgICBpbnN0YW5jZS5nZXRBdHRyaWJ1dGUoXCJuYW1lXCIpID09PSBuYW1lXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgICB9IGVsc2UgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgICBlbHNlIGlmICghaW5zdGFuY2VbaW50ZXJuYWxIb2lzdGFibGVNYXJrZXJdKVxuICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcIm1ldGFcIjpcbiAgICAgICAgICAgICAgaWYgKCFpbnN0YW5jZS5oYXNBdHRyaWJ1dGUoXCJpdGVtcHJvcFwiKSkgYnJlYWs7XG4gICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgICAgIGNhc2UgXCJsaW5rXCI6XG4gICAgICAgICAgICAgIG5hbWUgPSBpbnN0YW5jZS5nZXRBdHRyaWJ1dGUoXCJyZWxcIik7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBcInN0eWxlc2hlZXRcIiA9PT0gbmFtZSAmJlxuICAgICAgICAgICAgICAgIGluc3RhbmNlLmhhc0F0dHJpYnV0ZShcImRhdGEtcHJlY2VkZW5jZVwiKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIG5hbWUgIT09IGFueVByb3BzLnJlbCB8fFxuICAgICAgICAgICAgICAgIGluc3RhbmNlLmdldEF0dHJpYnV0ZShcImhyZWZcIikgIT09XG4gICAgICAgICAgICAgICAgICAobnVsbCA9PSBhbnlQcm9wcy5ocmVmIHx8IFwiXCIgPT09IGFueVByb3BzLmhyZWZcbiAgICAgICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgICAgIDogYW55UHJvcHMuaHJlZikgfHxcbiAgICAgICAgICAgICAgICBpbnN0YW5jZS5nZXRBdHRyaWJ1dGUoXCJjcm9zc29yaWdpblwiKSAhPT1cbiAgICAgICAgICAgICAgICAgIChudWxsID09IGFueVByb3BzLmNyb3NzT3JpZ2luXG4gICAgICAgICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICAgICAgICA6IGFueVByb3BzLmNyb3NzT3JpZ2luKSB8fFxuICAgICAgICAgICAgICAgIGluc3RhbmNlLmdldEF0dHJpYnV0ZShcInRpdGxlXCIpICE9PVxuICAgICAgICAgICAgICAgICAgKG51bGwgPT0gYW55UHJvcHMudGl0bGUgPyBudWxsIDogYW55UHJvcHMudGl0bGUpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgICAgICAgICAgY2FzZSBcInN0eWxlXCI6XG4gICAgICAgICAgICAgIGlmIChpbnN0YW5jZS5oYXNBdHRyaWJ1dGUoXCJkYXRhLXByZWNlZGVuY2VcIikpIGJyZWFrO1xuICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgICAgICAgICBjYXNlIFwic2NyaXB0XCI6XG4gICAgICAgICAgICAgIG5hbWUgPSBpbnN0YW5jZS5nZXRBdHRyaWJ1dGUoXCJzcmNcIik7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAobmFtZSAhPT0gKG51bGwgPT0gYW55UHJvcHMuc3JjID8gbnVsbCA6IGFueVByb3BzLnNyYykgfHxcbiAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmdldEF0dHJpYnV0ZShcInR5cGVcIikgIT09XG4gICAgICAgICAgICAgICAgICAgIChudWxsID09IGFueVByb3BzLnR5cGUgPyBudWxsIDogYW55UHJvcHMudHlwZSkgfHxcbiAgICAgICAgICAgICAgICAgIGluc3RhbmNlLmdldEF0dHJpYnV0ZShcImNyb3Nzb3JpZ2luXCIpICE9PVxuICAgICAgICAgICAgICAgICAgICAobnVsbCA9PSBhbnlQcm9wcy5jcm9zc09yaWdpblxuICAgICAgICAgICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgIDogYW55UHJvcHMuY3Jvc3NPcmlnaW4pKSAmJlxuICAgICAgICAgICAgICAgIG5hbWUgJiZcbiAgICAgICAgICAgICAgICBpbnN0YW5jZS5oYXNBdHRyaWJ1dGUoXCJhc3luY1wiKSAmJlxuICAgICAgICAgICAgICAgICFpbnN0YW5jZS5oYXNBdHRyaWJ1dGUoXCJpdGVtcHJvcFwiKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICAgICAgICB9XG4gICAgICAgIGluc3RhbmNlID0gZ2V0TmV4dEh5ZHJhdGFibGUoaW5zdGFuY2UubmV4dFNpYmxpbmcpO1xuICAgICAgICBpZiAobnVsbCA9PT0gaW5zdGFuY2UpIGJyZWFrO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbkh5ZHJhdGVUZXh0SW5zdGFuY2UoaW5zdGFuY2UsIHRleHQsIGluUm9vdE9yU2luZ2xldG9uKSB7XG4gICAgICBpZiAoXCJcIiA9PT0gdGV4dCkgcmV0dXJuIG51bGw7XG4gICAgICBmb3IgKDsgMyAhPT0gaW5zdGFuY2Uubm9kZVR5cGU7ICkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKDEgIT09IGluc3RhbmNlLm5vZGVUeXBlIHx8XG4gICAgICAgICAgICBcIklOUFVUXCIgIT09IGluc3RhbmNlLm5vZGVOYW1lIHx8XG4gICAgICAgICAgICBcImhpZGRlblwiICE9PSBpbnN0YW5jZS50eXBlKSAmJlxuICAgICAgICAgICFpblJvb3RPclNpbmdsZXRvblxuICAgICAgICApXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGluc3RhbmNlID0gZ2V0TmV4dEh5ZHJhdGFibGUoaW5zdGFuY2UubmV4dFNpYmxpbmcpO1xuICAgICAgICBpZiAobnVsbCA9PT0gaW5zdGFuY2UpIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjYW5IeWRyYXRlSHlkcmF0aW9uQm91bmRhcnkoaW5zdGFuY2UsIGluUm9vdE9yU2luZ2xldG9uKSB7XG4gICAgICBmb3IgKDsgOCAhPT0gaW5zdGFuY2Uubm9kZVR5cGU7ICkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgKDEgIT09IGluc3RhbmNlLm5vZGVUeXBlIHx8XG4gICAgICAgICAgICBcIklOUFVUXCIgIT09IGluc3RhbmNlLm5vZGVOYW1lIHx8XG4gICAgICAgICAgICBcImhpZGRlblwiICE9PSBpbnN0YW5jZS50eXBlKSAmJlxuICAgICAgICAgIC
15852FpblJvb3RPclNpbmdsZXRvblxuICAgICAgICApXG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIGluc3RhbmNlID0gZ2V0TmV4dEh5ZHJhdGFibGUoaW5zdGFuY2UubmV4dFNpYmxpbmcpO1xuICAgICAgICBpZiAobnVsbCA9PT0gaW5zdGFuY2UpIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc1N1c3BlbnNlSW5zdGFuY2VQZW5kaW5nKGluc3RhbmNlKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBpbnN0YW5jZS5kYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEgfHxcbiAgICAgICAgaW5zdGFuY2UuZGF0YSA9PT0gU1VTUEVOU0VfUVVFVUVEX1NUQVJUX0RBVEFcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzU3VzcGVuc2VJbnN0YW5jZUZhbGxiYWNrKGluc3RhbmNlKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBpbnN0YW5jZS5kYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBIHx8XG4gICAgICAgIChpbnN0YW5jZS5kYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEgJiZcbiAgICAgICAgICBpbnN0YW5jZS5vd25lckRvY3VtZW50LnJlYWR5U3RhdGUgIT09IERPQ1VNRU5UX1JFQURZX1NUQVRFX0xPQURJTkcpXG4gICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWdpc3RlclN1c3BlbnNlSW5zdGFuY2VSZXRyeShpbnN0YW5jZSwgY2FsbGJhY2spIHtcbiAgICAgIHZhciBvd25lckRvY3VtZW50ID0gaW5zdGFuY2Uub3duZXJEb2N1bWVudDtcbiAgICAgIGlmIChpbnN0YW5jZS5kYXRhID09PSBTVVNQRU5TRV9RVUVVRURfU1RBUlRfREFUQSlcbiAgICAgICAgaW5zdGFuY2UuX3JlYWN0UmV0cnkgPSBjYWxsYmFjaztcbiAgICAgIGVsc2UgaWYgKFxuICAgICAgICBpbnN0YW5jZS5kYXRhICE9PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEgfHxcbiAgICAgICAgb3duZXJEb2N1bWVudC5yZWFkeVN0YXRlICE9PSBET0NVTUVOVF9SRUFEWV9TVEFURV9MT0FESU5HXG4gICAgICApXG4gICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgb3duZXJEb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCBsaXN0ZW5lcik7XG4gICAgICAgIH07XG4gICAgICAgIG93bmVyRG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIiwgbGlzdGVuZXIpO1xuICAgICAgICBpbnN0YW5jZS5fcmVhY3RSZXRyeSA9IGxpc3RlbmVyO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBnZXROZXh0SHlkcmF0YWJsZShub2RlKSB7XG4gICAgICBmb3IgKDsgbnVsbCAhPSBub2RlOyBub2RlID0gbm9kZS5uZXh0U2libGluZykge1xuICAgICAgICB2Y
15852XIgbm9kZVR5cGUgPSBub2RlLm5vZGVUeXBlO1xuICAgICAgICBpZiAoMSA9PT0gbm9kZVR5cGUgfHwgMyA9PT0gbm9kZVR5cGUpIGJyZWFrO1xuICAgICAgICBpZiAoOCA9PT0gbm9kZVR5cGUpIHtcbiAgICAgICAgICBub2RlVHlwZSA9IG5vZGUuZGF0YTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBub2RlVHlwZSA9PT0gU1VTUEVOU0VfU1RBUlRfREFUQSB8fFxuICAgICAgICAgICAgbm9kZVR5cGUgPT09IFNVU1BFTlNFX0ZBTExCQUNLX1NUQVJUX0RBVEEgfHxcbiAgICAgICAgICAgIG5vZGVUeXBlID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEgfHxcbiAgICAgICAgICAgIG5vZGVUeXBlID09PSBTVVNQRU5TRV9RVUVVRURfU1RBUlRfREFUQSB8fFxuICAgICAgICAgICAgbm9kZVR5cGUgPT09IEFDVElWSVRZX1NUQVJUX0RBVEEgfHxcbiAgICAgICAgICAgIG5vZGVUeXBlID09PSBGT1JNX1NUQVRFX0lTX01BVENISU5HIHx8XG4gICAgICAgICAgICBub2RlVHlwZSA9PT0gRk9STV9TVEFURV9JU19OT1RfTUFUQ0hJTkdcbiAgICAgICAgICApXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBpZiAobm9kZVR5cGUgPT09IFNVU1BFTlNFX0VORF9EQVRBIHx8IG5vZGVUeXBlID09PSBBQ1RJVklUWV9FTkRfREFUQSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVzY3JpYmVIeWRyYXRhYmxlSW5zdGFuY2VGb3JEZXZXYXJuaW5ncyhpbnN0YW5jZSkge1xuICAgICAgaWYgKDEgPT09IGluc3RhbmNlLm5vZGVUeXBlKSB7XG4gICAgICAgIGZvciAoXG4gICAgICAgICAgdmFyIEpTQ29tcGlsZXJfdGVtcF9jb25zdCA9IGluc3RhbmNlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICBzZXJ2ZXJEaWZmZXJlbmNlcyA9IHt9LFxuICAgICAgICAgICAgYXR0cmlidXRlcyA9IGluc3RhbmNlLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICBpID0gMDtcbiAgICAgICAgICBpIDwgYXR0cmlidXRlcy5sZW5ndGg7XG4gICAgICAgICAgaSsrXG4gICAgICAgICkge1xuICAgICAgICAgIHZhciBhdHRyID0gYXR0cmlidXRlc1tpXTtcbiAgICAgICAgICBzZXJ2ZXJEaWZmZXJlbmNlc1tnZXRQcm9wTmFtZUZyb21BdHRyaWJ1dGVOYW1lKGF0dHIubmFtZSldID1cbiAgICAgICAgICAgIFwic3R5bGVcIiA9PT0gYXR0ci5uYW1lLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgPyBnZXRTdHlsZXNPYmplY3RGcm9tRWxlbWVudChpbnN0YW5jZSlcbiAgICAgICAgICAgICAgOiBhdHRyLnZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHR5cGU6IEpTQ29tcGlsZXJfdGVtcF9jb25zdCwgcHJvcHM6IHNlcnZlckRpZmZlcmVuY2VzIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gOCA9PT0gaW5zdGFuY2Uubm9kZVR5cGVcbiAgICAgICAgPyBpbnN0YW5jZS5kYXRhID09PSBBQ1RJVklUWV9TVEFSVF9EQVRBXG4gICAgICAgICAgPyB7IHR5cGU6IFwiQWN0aXZpdHlcIiwgcHJvcHM6IHt9IH1cbiAgICAgICAgICA6IHsgdHlwZTogXCJTdXNwZW5zZVwiLCBwcm9wczoge30gfVxuICAgICAgICA6IGluc3RhbmNlLm5vZGVWYWx1ZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGlmZkh5ZHJhdGVkVGV4dEZvckRldldhcm5pbmdzKHRleHRJbnN0YW5jZSwgdGV4dCwgcGFyZW50UHJvcHMpIHtcbiAgICAgIHJldHVybiBudWxsID09PSBwYXJlbnRQcm9wcyB8fFxuICAgICAgICAhMCAhPT0gcGFyZW50UHJvcHNbU1VQUFJFU1NfSFlEUkFUSU9OX1dBUk5JTkddXG4gICAgICAgID8gKHRleHRJbnN0YW5jZS5ub2RlVmFsdWUgPT09IHRleHRcbiAgICAgICAgICAgID8gKHRleHRJbnN0YW5jZSA9IG51bGwpXG4gICAgICAgICAgICA6ICgodGV4dCA9IG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZSh0ZXh0KSksXG4gICAgICAgICAgICAgICh0ZXh0SW5zdGFuY2UgPVxuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZU1hcmt1cEZvclRleHRPckF0dHJpYnV0ZSh0ZXh0SW5zdGFuY2Uubm9kZVZhbHVlKSA9PT1cbiAgICAgICAgICAgICAgICB0ZXh0XG4gICAgICAgICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgICAgICAgIDogdGV4dEluc3RhbmNlLm5vZGVWYWx1ZSkpLFxuICAgICAgICAgIHRleHRJbnN0YW5jZSlcbiAgICAgICAgOiBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXROZXh0SHlkcmF0YWJsZUluc3RhbmNlQWZ0ZXJIeWRyYXRpb25Cb3VuZGFyeShcbiAgICAgIGh5ZHJhdGlvbkluc3RhbmNlXG4gICAgKSB7XG4gICAgICBoeWRyYXRpb25JbnN0YW5jZSA9IGh5ZHJhdGlvbkluc3RhbmNlLm5leHRTaWJsaW5nO1xuICAgICAgZm9yICh2YXIgZGVwdGggPSAwOyBoeWRyYXRpb25JbnN0YW5jZTsgKSB7XG4gICAgICAgIGlmICg4ID09PSBoeWRyYXRpb25JbnN0YW5jZS5ub2RlVHlwZSkge1xuICAgICAgICAgIHZhciBkYXRhID0gaHlkcmF0aW9uSW5zdGFuY2UuZGF0YTtcbiAgICAgICAgICBpZiAoZGF0YSA9PT0gU1VTUEVOU0VfRU5EX0RBVEEgfHwgZGF0YSA9PT0gQUNUSVZJVFlfRU5EX0RBVEEpIHtcbiAgICAgICAgICAgIGlmICgwID09PSBkZXB0aClcbiAgICAgICAgICAgICAgcmV0dXJuIGdldE5leHRIeWRyYXRhYmxlKGh5ZHJhdGlvbkluc3RhbmNlLm5leHRTaWJsaW5nKTtcbiAgICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAoZGF0YSAhPT0gU1VTUEVOU0VfU1RBUlRfREFUQSAmJlxuICAgICAgICAgICAgICBkYXRhICE9PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBICYmXG4gICAgICAgICAgICAgIGRhdGEgIT09IFNVU1BFTlNFX1BFTkRJTkdfU1RBUlRfREFUQSAmJlxuICAgICAgICAgICAgICBkYXRhICE9PSBTVVNQRU5TRV9RVUVVRURfU1RBUlRfREFUQSAmJlxuICAgICAgICAgICAgICBkYXRhICE9PSBBQ1RJVklUWV9TVEFSVF9EQVRBKSB8fFxuICAgICAgICAgICAgICBkZXB0aCsrO1xuICAgICAgICB9XG4gICAgICAgIGh5ZHJhdGlvbkluc3RhbmNlID0gaHlkcmF0aW9uSW5zdGFuY2UubmV4dFNpYmxpbmc7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0UGFyZW50SHlkcmF0aW9uQm91bmRhcnkodGFyZ2V0SW5zdGFuY2UpIHtcbiAgICAgIHRhcmdldEluc3RhbmNlID0gdGFyZ2V0SW5zdGFuY2UucHJldmlvdXNTaWJsaW5nO1xuICAgICAgZm9yICh2YXIgZGVwdGggPSAwOyB0YXJnZXRJbnN0YW5jZTsgKSB7XG4gICAgICAgIGlmICg4ID09PSB0YXJnZXRJbnN0YW5jZS5ub2RlVHlwZSkge1xuICAgICAgICAgI
15852HZhciBkYXRhID0gdGFyZ2V0SW5zdGFuY2UuZGF0YTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBkYXRhID09PSBTVVNQRU5TRV9TVEFSVF9EQVRBIHx8XG4gICAgICAgICAgICBkYXRhID09PSBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBIHx8XG4gICAgICAgICAgICBkYXRhID09PSBTVVNQRU5TRV9QRU5ESU5HX1NUQVJUX0RBVEEgfHxcbiAgICAgICAgICAgIGRhdGEgPT09IFNVU1BFTlNFX1FVRVVFRF9TVEFSVF9EQVRBIHx8XG4gICAgICAgICAgICBkYXRhID09PSBBQ1RJVklUWV9TVEFSVF9EQVRBXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAoMCA9PT0gZGVwdGgpIHJldHVybiB0YXJnZXRJbnN0YW5jZTtcbiAgICAgICAgICAgIGRlcHRoLS07XG4gICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAoZGF0YSAhPT0gU1VTUEVOU0VfRU5EX0RBVEEgJiYgZGF0YSAhPT0gQUNUSVZJVFlfRU5EX0RBVEEpIHx8XG4gICAgICAgICAgICAgIGRlcHRoKys7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0SW5zdGFuY2UgPSB0YXJnZXRJbnN0YW5jZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tbWl0SHlkcmF0ZWRDb250YWluZXIoY29udGFpbmVyKSB7XG4gICAgICByZXRyeUlmQmxvY2tlZE9uKGNvbnRhaW5lcik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbW1pdEh5ZHJhdGVkQWN0aXZpdHlJbnN0YW5jZShhY3Rpdml0eUluc3RhbmNlKSB7XG4gICAgICByZXRyeUlmQmxvY2tlZE9uKGFjdGl2aXR5SW5zdGFuY2UpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21taXRIeWRyYXRlZFN1c3BlbnNlSW5zdGFuY2Uoc3VzcGVuc2VJbnN0YW5jZSkge1xuICAgICAgcmV0cnlJZkJsb2NrZWRPbihzdXNwZW5zZUluc3RhbmNlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2V0Rm9jdXNJZkZvY3VzYWJsZShub2RlLCBmb2N1c09wdGlvbnMpIHtcbiAgICAgIGZ1bmN0aW9uIGhhbmRsZUZvY3VzKCkge1xuICAgICAgICBkaWRGb2N1cyA9ICEwO1xuICAgICAgfVxuICAgICAgaWYgKG5vZGUub3duZXJEb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBub2RlKSByZXR1cm4gITA7XG4gICAgICB2Y
15852XIgZGlkRm9jdXMgPSAhMTtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5vZGUub3duZXJEb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgaGFuZGxlRm9jdXMsICEwKSxcbiAgICAgICAgICAobm9kZS5mb2N1cyB8fCBIVE1MRWxlbWVudC5wcm90b3R5cGUuZm9jdXMpLmNhbGwobm9kZSwgZm9jdXNPcHRpb25zKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIG5vZGUub3duZXJEb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgaGFuZGxlRm9jdXMsICEwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkaWRGb2N1cztcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVxdWVzdFBvc3RQYWludENhbGxiYWNrKGNhbGxiYWNrKSB7XG4gICAgICBsb2NhbFJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGxvY2FsUmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uICh0aW1lKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHRpbWUpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXNvbHZlU2luZ2xldG9uSW5zdGFuY2UoXG4gICAgICB0eXBlLFxuICAgICAgcHJvcHMsXG4gICAgICByb290Q29udGFpbmVySW5zdGFuY2UsXG4gICAgICBob3N0Q29udGV4dCxcbiAgICAgIHZhbGlkYXRlRE9NTmVzdGluZ0RldlxuICAgICkge1xuICAgICAgdmFsaWRhdGVET01OZXN0aW5nRGV2ICYmXG4gICAgICAgIHZhbGlkYXRlRE9NTmVzdGluZyh0eXBlLCBob3N0Q29udGV4dC5hbmNlc3RvckluZm8pO1xuICAgICAgcHJvcHMgPSBnZXRPd25lckRvY3VtZW50RnJvbVJvb3RDb250YWluZXIocm9vdENvbnRhaW5lckluc3RhbmNlKTtcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFwiaHRtbFwiOlxuICAgICAgICAgIHR5cGUgPSBwcm9wcy5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgICAgaWYgKCF0eXBlKVxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgIFwiUmVhY3QgZXhwZWN0ZWQgYW4gPGh0bWw+IGVsZW1lbnQgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgdG8gZXhpc3QgaW4gdGhlIERvY3VtZW50IGJ1dCBvbmUgd2FzIG5vdCBmb3VuZC4gUmVhY3QgbmV2ZXIgcmVtb3ZlcyB0aGUgZG9jdW1lbnRFbGVtZW50IGZvciBhbnkgRG9jdW1lbnQgaXQgcmVuZGVycyBpbnRvIHNvIHRoZSBjYXVzZSBpcyBsaWtlbHkgaW4gc29tZSBvdGhlciBzY3JpcHQgcnVubmluZyBvbiB0aGlzIHBhZ2UuXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICAgIGNhc2UgXCJoZWFkXCI6XG4gICAgICAgICAgdHlwZSA9IHByb3BzLmhlYWQ7XG4gICAgICAgICAgaWYgKCF0eXBlKVxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgIFwiUmVhY3QgZXhwZWN0ZWQgYSA8aGVhZD4gZWxlbWVudCAoZG9jdW1lbnQuaGVhZCkgdG8gZXhpc3QgaW4gdGhlIERvY3VtZW50IGJ1dCBvbmUgd2FzIG5vdCBmb3VuZC4gUmVhY3QgbmV2ZXIgcmVtb3ZlcyB0aGUgaGVhZCBmb3IgYW55IERvY3VtZW50IGl0IHJlbmRlcnMgaW50byBzbyB0aGUgY2F1c2UgaXMgbGlrZWx5IGluIHNvbWUgb3RoZXIgc2NyaXB0IHJ1bm5pbmcgb24gdGhpcyBwYWdlLlwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgICBjYXNlIFwiYm9keVwiOlxuICAgICAgICAgIHR5cGUgPSBwcm9wcy5ib2R5O1xuICAgICAgICAgIGlmICghdHlwZSlcbiAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICBcIlJlYWN0IGV4cGVjdGVkIGEgPGJvZHk+IGVsZW1lbnQgKGRvY3VtZW50LmJvZHkpIHRvIGV4aXN0IGluIHRoZSBEb2N1bWVudCBidXQgb25lIHdhcyBub3QgZm91bmQuIFJlYWN0IG5ldmVyIHJlbW92ZXMgdGhlIGJvZHkgZm9yIGFueSBEb2N1bWVudCBpdCByZW5kZXJzIGludG8gc28gdGhlIGNhdXNlIGlzIGxpa2VseSBpbiBzb21lIG90aGVyIHNjcmlwdCBydW5uaW5nIG9uIHRoaXMgcGFnZS5cIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgIFwicmVzb2x2ZVNpbmdsZXRvbkluc3RhbmNlIHdhcyBjYWxsZWQgd2l0aCBhbiBlbGVtZW50IHR5cGUgdGhhdCBpcyBub3Qgc3VwcG9ydGVkLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LlwiXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gYWNxdWlyZVNpbmdsZXRvbkluc3RhbmNlKFxuICAgICAgdHlwZSxcbiAgICAgIHByb3BzLFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBpbnRlcm5hbEluc3RhbmNlSGFuZGxlXG4gICAgKSB7XG4gICAgICBpZiAoXG4gICAgICAgICFpbnN0YW5jZVtpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5XSAmJlxuICAgICAgICBnZXRJbnN0YW5jZUZyb21Ob2RlKGluc3RhbmNlKVxuICAgICAgKSB7XG4gICAgICAgIHZhciB0YWdOYW1lID0gaW5zdGFuY2UudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiWW91IGFyZSBtb3VudGluZyBhIG5ldyAlcyBjb21wb25lbnQgd2hlbiBhIHByZXZpb3VzIG9uZSBoYXMgbm90IGZpcnN0IHVubW91bnRlZC4gSXQgaXMgYW4gZXJyb3IgdG8gcmVuZGVyIG1vcmUgdGhhbiBvbmUgJXMgY29tcG9uZW50IGF0IGEgdGltZSBhbmQgYXR0cmlidXRlcyBhbmQgY2hpbGRyZW4gb2YgdGhlc2UgY29tcG9uZW50cyB3aWxsIGxpa2VseSBmYWlsIGluIHVucHJlZGljdGFibGUgd2F5cy4gUGxlYXNlIG9ubHkgcmVuZGVyIGEgc2luZ2xlIGluc3RhbmNlIG9mIDwlcz4gYW5kIGlmIHlvdSBuZWVkIHRvIG1vdW50IGEgbmV3IG9uZSwgZW5zdXJlIGFueSBwcmV2aW91cyBvbmVzIGhhdmUgdW5tb3VudGVkIGZpcnN0LlwiLFxuICAgICAgICAgIHRhZ05hbWUsXG4gICAgICAgICAgdGFnTmFtZSxcbiAgICAgICAgICB0YWdOYW1lXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBcImh0bWxcIjpcbiAgICAgICAgY2FzZSBcImhlYWRcIjpcbiAgICAgICAgY2FzZSBcImJvZHlcIjpcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJhY3F1aXJlU2luZ2xldG9uSW5zdGFuY2Ugd2FzIGNhbGxlZCB3aXRoIGFuIGVsZW1lbnQgdHlwZSB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQuIFRoaXMgaXMgYSBidW
15852cgaW4gUmVhY3QuXCJcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgICAgZm9yICh0YWdOYW1lID0gaW5zdGFuY2UuYXR0cmlidXRlczsgdGFnTmFtZS5sZW5ndGg7IClcbiAgICAgICAgaW5zdGFuY2UucmVtb3ZlQXR0cmlidXRlTm9kZSh0YWdOYW1lWzBdKTtcbiAgICAgIHNldEluaXRpYWxQcm9wZXJ0aWVzKGluc3RhbmNlLCB0eXBlLCBwcm9wcyk7XG4gICAgICBpbnN0YW5jZVtpbnRlcm5hbEluc3RhbmNlS2V5XSA9IGludGVybmFsSW5zdGFuY2VIYW5kbGU7XG4gICAgICBpbnN0YW5jZVtpbnRlcm5hbFByb3BzS2V5XSA9IHByb3BzO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWxlYXNlU2luZ2xldG9uSW5zdGFuY2UoaW5zdGFuY2UsIHR5cGUsIHByb3BzKSB7XG4gICAgICBmb3IgKHZhciBwcm9wS2V5IGluIHByb3BzKSB7XG4gICAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wS2V5XTtcbiAgICAgICAgcHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgJiZcbiAgICAgICAgICBudWxsICE9IHByb3BWYWx1ZSAmJlxuICAgICAgICAgIHNldFByb3AoaW5zdGFuY2UsIHR5cGUsIHByb3BLZXksIG51bGwsIGVtcHR5UHJvcHMsIHByb3BWYWx1ZSk7XG4gICAgICB9XG4gICAgICBudWxsICE9IHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICYmIChpbnN0YW5jZS50ZXh0Q29udGVudCA9IFwiXCIpO1xuICAgICAgaW5zdGFuY2Uub25jbGljayA9PT0gbm9vcCQxICYmIChpbnN0YW5jZS5vbmNsaWNrID0gbnVsbCk7XG4gICAgICBkZXRhY2hEZWxldGVkSW5zdGFuY2UoaW5zdGFuY2UpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjbGVhclNpbmdsZXRvblByZWFtYmxlQ29udHJpYnV0aW9uKGluc3RhbmNlKSB7XG4gICAgICBmb3IgKHZhciBhdHRyaWJ1dGVzID0gaW5zdGFuY2UuYXR0cmlidXRlczsgYXR0cmlidXRlcy5sZW5ndGg7IClcbiAgICAgICAgaW5zdGFuY2UucmVtb3ZlQXR0cmlidXRlTm9kZShhdHRyaWJ1dGVzWzBdKTtcbiAgICAgIGRldGFjaERlbGV0ZWRJbnN0YW5jZShpbnN0YW5jZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldEhvaXN0YWJsZVJvb3QoY29udGFpbmVyKSB7XG4gICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgY29udGFpbmVyLmdldFJvb3ROb2RlKSB7XG4gICAgICAgIHZhciByb290Tm9kZSA9IGNvbnRhaW5lci5nZXRSb290Tm9kZSgpO1xuICAgICAgICBpZiAoOSA9PT0gcm9vdE5vZGUubm9kZVR5cGUgfHwgMTEgPT09IHJvb3ROb2RlLm5vZGVUeXBlKVxuICAgICAgICAgIHJldHVybiByb290Tm9kZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiA5ID09PSBjb250YWluZXIubm9kZVR5cGUgPyBjb250YWluZXIgOiBjb250YWluZXIub3duZXJEb2N1bWVudDtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHJlY29ubmVjdEFzKHJlbCwgaHJlZiwgY3Jvc3NPcmlnaW4pIHtcbiAgICAgIHZhciBvd25lckRvY3VtZW50ID0gZ2xvYmFsRG9jdW1lbnQ7XG4gICAgICBpZiAob3duZXJEb2N1bWVudCAmJiBcInN0cmluZ1wiID09PSB0eXBlb2YgaHJlZiAmJiBocmVmKSB7XG4gICAgICAgIHZhciBsaW1pdGVkRXNjYXBlZEhyZWYgPVxuICAgICAgICAgIGVzY2FwZVNlbGVjdG9yQXR0cmlidXRlVmFsdWVJbnNpZGVEb3VibGVRdW90ZXMoaHJlZik7XG4gICAgICAgIGxpbWl0ZWRFc2NhcGVkSHJlZiA9XG4gICAgICAgICAgJ2xpbmtbcmVsPVwiJyArIHJlbCArICdcIl1baHJlZj1cIicgKyBsaW1pdGVkRXNjYXBlZEhyZWYgKyAnXCJdJztcbiAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIGNyb3NzT3JpZ2luICYmXG4gICAgICAgICAgKGxpbWl0ZWRFc2NhcGVkSHJlZiArPSAnW2Nyb3Nzb3JpZ2luPVwiJyArIGNyb3NzT3JpZ2luICsgJ1wiXScpO1xuICAgICAgICBwcmVjb25uZWN0c1NldC5oYXMobGltaXRlZEVzY2FwZWRIcmVmKSB8fFxuICAgICAgICAgIChwcmVjb25uZWN0c1NldC5hZGQobGltaXRlZEVzY2FwZWRIcmVmKSxcbiAgICAgICAgICAocmVsID0geyByZWw6IHJlbCwgY3Jvc3NPcmlnaW46IGNyb3NzT3JpZ2luLCBocmVmOiBocmVmIH0pLFxuICAgICAgICAgIG51bGwgPT09IG93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihsaW1pdGVkRXNjYXBlZEhyZWYpICYmXG4gICAgICAgICAgICAoKGhyZWYgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsaW5rXCIpKSxcbiAgICAgICAgICAgIHNldEluaXRpYWxQcm9wZXJ0aWVzKGhyZWYsIFwibGlua1wiLCByZWwpLFxuICAgICAgICAgICAgbWFya05vZGVBc0hvaXN0YWJsZShocmVmKSxcbiAgICAgICAgICAgIG93bmVyRG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChocmVmKSkpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRSZXNvdXJjZSh0eXBlLCBjdXJyZW50UHJvcHMsIHBlbmRpbmdQcm9wcywgY3VycmVudFJlc291cmNlKSB7XG4gICAgICB2Y
15852XIgcmVzb3VyY2VSb290ID0gKHJlc291cmNlUm9vdCA9IHJvb3RJbnN0YW5jZVN0YWNrQ3Vyc29yLmN1cnJlbnQpXG4gICAgICAgID8gZ2V0SG9pc3RhYmxlUm9vdChyZXNvdXJjZVJvb3QpXG4gICAgICAgIDogbnVsbDtcbiAgICAgIGlmICghcmVzb3VyY2VSb290KVxuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAnXCJyZXNvdXJjZVJvb3RcIiB3YXMgZXhwZWN0ZWQgdG8gZXhpc3QuIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJ1xuICAgICAgICApO1xuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgXCJtZXRhXCI6XG4gICAgICAgIGNhc2UgXCJ0aXRsZVwiOlxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBjYXNlIFwic3R5bGVcIjpcbiAgICAgICAgICByZXR1cm4gXCJzdHJpbmdcIiA9PT0gdHlwZW9mIHBlbmRpbmdQcm9wcy5wcmVjZWRlbmNlICYmXG4gICAgICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2YgcGVuZGluZ1Byb3BzLmhyZWZcbiAgICAgICAgICAgID8gKChwZW5kaW5nUHJvcHMgPSBnZXRTdHlsZUtleShwZW5kaW5nUHJvcHMuaHJlZikpLFxuICAgICAgICAgICAgICAoY3VycmVudFByb3BzID1cbiAgICAgICAgICAgICAgICBnZXRSZXNvdXJjZXNGcm9tUm9vdChyZXNvdXJjZVJvb3QpLmhvaXN0YWJsZVN0eWxlcyksXG4gICAgICAgICAgICAgIChjdXJyZW50UmVzb3VyY2UgPSBjdXJyZW50UHJvcHMuZ2V0KHBlbmRpbmdQcm9wcykpLFxuICAgICAgICAgICAgICBjdXJyZW50UmVzb3VyY2UgfHxcbiAgICAgICAgICAgICAgICAoKGN1cnJlbnRSZXNvdXJjZSA9IHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwic3R5bGVcIixcbiAgICAgICAgICAgICAgICAgIGluc3RhbmNlOiBudWxsLFxuICAgICAgICAgICAgICAgICAgY291bnQ6IDAsXG4gICAgICAgICAgICAgICAgICBzdGF0ZTogbnVsbFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRQcm9wcy5zZXQocGVuZGluZ1Byb3BzLCBjdXJyZW50UmVzb3VyY2UpKSxcbiAgICAgICAgICAgICAgY3VycmVudFJlc291cmNlKVxuICAgICAgICAgICAgOiB7IHR5cGU6IFwidm9pZFwiLCBpbnN0YW5jZTogbnVsbCwgY291bnQ6IDAsIHN0YXRlOiBudWxsIH07XG4gICAgICAgIGNhc2UgXCJsaW5rXCI6XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgXCJzdHlsZXNoZWV0XCIgPT09IHBlbmRpbmdQcm9wcy5yZWwgJiZcbiAgICAgICAgICAgIFwic3RyaW5nXCIgPT09IHR5cGVvZiBwZW5kaW5nUHJvcHMuaHJlZiAmJlxuICAgICAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIHBlbmRpbmdQcm9wcy5wcmVjZWRlbmNlXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0eXBlID0gZ2V0U3R5bGVLZXkocGVuZGluZ1Byb3BzLmhyZWYpO1xuICAgICAgICAgICAgdmFyIF9zdHlsZXMgPSBnZXRSZXNvdXJjZXNGcm9tUm9vdChyZXNvdXJjZVJvb3QpLmhvaXN0YWJsZVN0eWxlcyxcbiAgICAgICAgICAgICAgX3Jlc291cmNlID0gX3N0eWxlcy5nZXQodHlwZSk7XG4gICAgICAgICAgICBfcmVzb3VyY2UgfHxcbiAgICAgICAgICAgICAgKChyZXNvdXJjZVJvb3QgPSByZXNvdXJjZVJvb3Qub3duZXJEb2N1bWVudCB8fCByZXNvdXJjZVJvb3QpLFxuICAgICAgICAgICAgICAoX3Jlc291cmNlID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwic3R5bGVzaGVldFwiLFxuICAgICAgICAgICAgICAgIGluc3RhbmNlOiBudWxsLFxuICAgICAgICAgICAgICAgIGNvdW50OiAwLFxuICAgICAgICAgICAgICAgIHN0YXRlOiB7IGxvYWRpbmc6IE5vdExvYWRlZCwgcHJlbG9hZDogbnVsbCB9XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBfc3R5bGVzLnNldCh0eXBlLCBfcmVzb3VyY2UpLFxuICAgICAgICAgICAgICAoX3N0eWxlcyA9IHJlc291cmNlUm9vdC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICAgICAgIGdldFN0eWxlc2hlZXRTZWxlY3RvckZyb21LZXkodHlwZSlcbiAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICAgICA/IF9zdHlsZXMuX3AgfHxcbiAgICAgICAgICAgICAgICAgICgoX3Jlc291cmNlLmluc3RhbmNlID0gX3N0eWxlcyksXG4gICAgICAgICAgICAgICAgICAoX3Jlc291cmNlLnN0YXRlLmxvYWRpbmcgPSBMb2FkZWQgfCBJbnNlcnRlZCkpXG4gICAgICAgICAgICAgICAgOiAoKF9zdHlsZXMgPSBwcmVsb2FkUHJvcHNNYXAuZ2V0KHR5cGUpKSxcbiAgICAgICAgICAgICAgICAgIF9zdHlsZXMgfHxcbiAgICAgICAgICAgICAgICAgICAgKChfc3R5bGVzID0ge1xuICAgICAgICAgICAgICAgICAgICAgIHJlbDogXCJwcmVsb2FkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgYXM6IFwic3R5bGVcIixcbiAgICAgICAgICAgICAgICAgICAgICBocmVmOiBwZW5kaW5nUHJvcHMuaHJlZixcbiAgICAgICAgICAgICAgICAgICAgICBjcm9zc09yaWdpbjogcGVuZGluZ1Byb3BzLmNyb3NzT3JpZ2luLFxuICAgICAgICAgICAgICAgICAgICAgIGludGVncml0eTogcGVuZGluZ1Byb3BzLmludGVncml0eSxcbiAgICAgICAgICAgICAgICAgICAgICBtZWRpYTogcGVuZGluZ1Byb3BzLm1lZGlhLFxuICAgICAgICAgICAgICAgICAgICAgIGhyZWZMYW5nOiBwZW5kaW5nUHJvcHMuaHJlZkxhbmcsXG4gICAgICAgICAgICAgICAgICAgICAgcmVmZXJyZXJQb2xpY3k6IHBlbmRpbmdQcm9wcy5yZWZlcnJlclBvbGljeVxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgcHJlbG9hZFByb3BzTWFwLnNldCh0eXBlLCBfc3R5bGVzKSksXG4gICAgICAgICAgICAgICAgICBwcmVsb2FkU3R5bGVzaGVldChcbiAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VSb290LFxuICAgICAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgICAgICBfc3R5bGVzLFxuICAgICAgICAgICAgICAgICAgICBfcmVzb3VyY2Uuc3RhdGVcbiAgICAgICAgICAgICAgICAgICkpKTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UHJvcHMgJiYgbnVsbCA9PT0gY3VycmVudFJlc291cmNlKVxuICAgICAgICAgICAgICB0aHJvdyAoXG4gICAgICAgICAgICAgICAgKChwZW5kaW5nUHJvcHMgPVxuICAgICAgICAgICAgICAgICAgXCJcXG5cXG4gIC0gXCIgK1xuICAgICAgICAgICAgICAgICAgZGVzY3JpYmVMaW5rRm9yUmVzb3VyY2VFcnJvckRFVihjdXJyZW50UHJvcHMpICtcbiAgICAgICAgICAgICAgICAgIFwiXFxuICArIFwiICtcbiAgICAgICAgICAgICAgICAgIGRlc2NyaWJlTGlua0ZvclJlc291cmNlRXJyb3JERVYocGVuZGluZ1Byb3BzKSksXG4gICAgICAgICAgICAgICAgRXJyb3IoXG4gICAgICAgICAgICAgICAgICBcIkV4cGVjdGVkIDxsaW5rPiBub3QgdG8gdXBkYXRlIHRvIGJlIHVwZGF0ZWQgdG8gYSBzdHlsZXNoZWV0IHdpdGggcHJlY2VkZW5jZS4gQ2hlY2sgdGhlIGByZWxgLCBgaHJlZmAsIGFuZCBgcHJlY2VkZW5jZWAgcHJvcHMgb2YgdGhpcyBjb21wb25lbnQuIEFsdGVybmF0aXZlbHksIGNoZWNrIHdoZXRoZXIgdHdvIGRpZmZlcmVudCA8bGluaz4gY29tcG9uZW50cyByZW5kZXIgaW4gdGhlIHNhbWUgc2xvdCBvciBzaGFyZSB0aGUgc2FtZSBrZXkuXCIgK1xuICAgICAgICAgICAgICAgICAgICBwZW5kaW5nUHJvcHNcbiAgICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIF9yZXNvdXJjZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGN1cnJlbnRQcm9wcyAmJiBudWxsICE9PSBjdXJyZW50UmVzb3VyY2UpXG4gICAgICAgICAgICB0aHJvdyAoXG4gICAgICAgICAgICAgICgocGVuZGluZ1Byb3BzID1cbiAgICAgICAgICAgICAgICBcIlxcblxcbiAgLSBcIiArXG4gICAgICAgICAgICAgICAgZGVzY3JpYmVMaW5rRm9yUmVzb3VyY2VFcnJvckRFVihjdXJyZW50UHJvcHMpICtcbiAgICAgICAgICAgICAgICBcIlxcbiAgKyBcIiArXG4gICAgICAgICAgICAgICAgZGVzY3JpYmVMaW5rRm9yUmVzb3VyY2VFcnJvckRFVihwZW5kaW5nUHJvcHMpKSxcbiAgICAgICAgICAgICAgRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJFeHBlY3RlZCBzdHlsZXNoZWV0IHdpdGggcHJlY2VkZW5jZSB0byBub3QgYmUgdXBkYXRlZCB0byBhIGRpZmZlcmVudCBraW5kIG9mIDxsaW5rPi4gQ2hlY2sgdGhlIGByZWxgLCBgaHJlZmAsIGFuZCBgcHJlY2VkZW5jZWAgcHJvcHMgb2YgdGhpcyBjb21wb25lbnQuIEFsdGVybmF0aXZlbHksIGNoZWNrIHdoZXRoZXIgdHdvIGRpZmZlcmVudCA8bGluaz4gY29tcG9uZW50cyByZW5kZXIgaW4gdGhlIHNhbWUgc2xvdCBvciBzaGFyZSB0aGUgc2FtZSBrZXkuXCIgK1xuICAgICAgICAgICAgICAgICAgcGVuZGluZ1Byb3BzXG4gICAgICAgICAgICAgICkpXG4gICAgICAgICAgICApO1xuICAgICAgICAgI
15852HJldHVybiBudWxsO1xuICAgICAgICBjYXNlIFwic2NyaXB0XCI6XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChjdXJyZW50UHJvcHMgPSBwZW5kaW5nUHJvcHMuYXN5bmMpLFxuICAgICAgICAgICAgKHBlbmRpbmdQcm9wcyA9IHBlbmRpbmdQcm9wcy5zcmMpLFxuICAgICAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIHBlbmRpbmdQcm9wcyAmJlxuICAgICAgICAgICAgY3VycmVudFByb3BzICYmXG4gICAgICAgICAgICBcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBjdXJyZW50UHJvcHMgJiZcbiAgICAgICAgICAgIFwic3ltYm9sXCIgIT09IHR5cGVvZiBjdXJyZW50UHJvcHNcbiAgICAgICAgICAgICAgPyAoKHBlbmRpbmdQcm9wcyA9IGdldFNjcmlwdEtleShwZW5kaW5nUHJvcHMpKSxcbiAgICAgICAgICAgICAgICAoY3VycmVudFByb3BzID1cbiAgICAgICAgICAgICAgICAgIGdldFJlc291cmNlc0Zyb21Sb290KHJlc291cmNlUm9vdCkuaG9pc3RhYmxlU2NyaXB0cyksXG4gICAgICAgICAgICAgICAgKGN1cnJlbnRSZXNvdXJjZSA9IGN1cnJlbnRQcm9wcy5nZXQocGVuZGluZ1Byb3BzKSksXG4gICAgICAgICAgICAgICAgY3VycmVudFJlc291cmNlIHx8XG4gICAgICAgICAgICAgICAgICAoKGN1cnJlbnRSZXNvdXJjZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzY3JpcHRcIixcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2U6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGNvdW50OiAwLFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZTogbnVsbFxuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICBjdXJyZW50UHJvcHMuc2V0KHBlbmRpbmdQcm9wcywgY3VycmVudFJlc291cmNlKSksXG4gICAgICAgICAgICAgICAgY3VycmVudFJlc291cmNlKVxuICAgICAgICAgICAgICA6IHsgdHlwZTogXCJ2b2lkXCIsIGluc3RhbmNlOiBudWxsLCBjb3VudDogMCwgc3RhdGU6IG51bGwgfVxuICAgICAgICAgICk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAnZ2V0UmVzb3VyY2UgZW5jb3VudGVyZWQgYSB0eXBlIGl0IGRpZCBub3QgZXhwZWN0OiBcIicgK1xuICAgICAgICAgICAgICB0eXBlICtcbiAgICAgICAgICAgICAgJ1wiLiB0aGlzIGlzIGEgYnVnIGluIFJlYWN0LidcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBkZXNjcmliZUxpbmtGb3JSZXNvdXJjZUVycm9yREVWKHByb3BzKSB7XG4gICAgICB2Y
15852XIgZGVzY3JpYmVkUHJvcHMgPSAwLFxuICAgICAgICBkZXNjcmlwdGlvbiA9IFwiPGxpbmtcIjtcbiAgICAgIFwic3RyaW5nXCIgPT09IHR5cGVvZiBwcm9wcy5yZWxcbiAgICAgICAgPyAoZGVzY3JpYmVkUHJvcHMrKywgKGRlc2NyaXB0aW9uICs9ICcgcmVsPVwiJyArIHByb3BzLnJlbCArICdcIicpKVxuICAgICAgICA6IGhhc093blByb3BlcnR5LmNhbGwocHJvcHMsIFwicmVsXCIpICYmXG4gICAgICAgICAgKGRlc2NyaWJlZFByb3BzKyssXG4gICAgICAgICAgKGRlc2NyaXB0aW9uICs9XG4gICAgICAgICAgICAnIHJlbD1cIicgK1xuICAgICAgICAgICAgKG51bGwgPT09IHByb3BzLnJlbCA/IFwibnVsbFwiIDogXCJpbnZhbGlkIHR5cGUgXCIgKyB0eXBlb2YgcHJvcHMucmVsKSArXG4gICAgICAgICAgICAnXCInKSk7XG4gICAgICBcInN0cmluZ1wiID09PSB0eXBlb2YgcHJvcHMuaHJlZlxuICAgICAgICA/IChkZXNjcmliZWRQcm9wcysrLCAoZGVzY3JpcHRpb24gKz0gJyBocmVmPVwiJyArIHByb3BzLmhyZWYgKyAnXCInKSlcbiAgICAgICAgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3BzLCBcImhyZWZcIikgJiZcbiAgICAgICAgICAoZGVzY3JpYmVkUHJvcHMrKyxcbiAgICAgICAgICAoZGVzY3JpcHRpb24gKz1cbiAgICAgICAgICAgICcgaHJlZj1cIicgK1xuICAgICAgICAgICAgKG51bGwgPT09IHByb3BzLmhyZWZcbiAgICAgICAgICAgICAgPyBcIm51bGxcIlxuICAgICAgICAgICAgICA6IFwiaW52YWxpZCB0eXBlIFwiICsgdHlwZW9mIHByb3BzLmhyZWYpICtcbiAgICAgICAgICAgICdcIicpKTtcbiAgICAgIFwic3RyaW5nXCIgPT09IHR5cGVvZiBwcm9wcy5wcmVjZWRlbmNlXG4gICAgICAgID8gKGRlc2NyaWJlZFByb3BzKyssXG4gICAgICAgICAgKGRlc2NyaXB0aW9uICs9ICcgcHJlY2VkZW5jZT1cIicgKyBwcm9wcy5wcmVjZWRlbmNlICsgJ1wiJykpXG4gICAgICAgIDogaGFzT3duUHJvcGVydHkuY2FsbChwcm9wcywgXCJwcmVjZWRlbmNlXCIpICYmXG4gICAgICAgICAgKGRlc2NyaWJlZFByb3BzKyssXG4gICAgICAgICAgKGRlc2NyaXB0aW9uICs9XG4gICAgICAgICAgICBcIiBwcmVjZWRlbmNlPXtcIiArXG4gICAgICAgICAgICAobnVsbCA9PT0gcHJvcHMucHJlY2VkZW5jZVxuICAgICAgICAgICAgICA/IFwibnVsbFwiXG4gICAgICAgICAgICAgIDogXCJpbnZhbGlkIHR5cGUgXCIgKyB0eXBlb2YgcHJvcHMucHJlY2VkZW5jZSkgK1xuICAgICAgICAgICAgXCJ9XCIpKTtcbiAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHByb3BzKS5sZW5ndGggPiBkZXNjcmliZWRQcm9wcyAmJlxuICAgICAgICAoZGVzY3JpcHRpb24gKz0gXCIgLi4uXCIpO1xuICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uICsgXCIgLz5cIjtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0U3R5bGVLZXkoaHJlZikge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgJ2hyZWY9XCInICsgZXNjYXBlU2VsZWN0b3JBdHRyaWJ1dGVWYWx1ZUluc2lkZURvdWJsZVF1b3RlcyhocmVmKSArICdcIidcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldFN0eWxlc2hlZXRTZWxlY3RvckZyb21LZXkoa2V5KSB7XG4gICAgICByZXR1cm4gJ2xpbmtbcmVsPVwic3R5bGVzaGVldFwiXVsnICsga2V5ICsgXCJdXCI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0eWxlc2hlZXRQcm9wc0Zyb21SYXdQcm9wcyhyYXdQcm9wcykge1xuICAgICAgcmV0dXJuIGFzc2lnbih7fSwgcmF3UHJvcHMsIHtcbiAgICAgICAgXCJkYXRhLXByZWNlZGVuY2VcIjogcmF3UHJvcHMucHJlY2VkZW5jZSxcbiAgICAgICAgcHJlY2VkZW5jZTogbnVsbFxuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHByZWxvYWRTdHlsZXNoZWV0KG93bmVyRG9jdW1lbnQsIGtleSwgcHJlbG9hZFByb3BzLCBzdGF0ZSkge1xuICAgICAgaWYgKFxuICAgICAgICAoa2V5ID0gb3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICdsaW5rW3JlbD1cInByZWxvYWRcIl1bYXM9XCJzdHlsZVwiXVsnICsga2V5ICsgXCJdXCJcbiAgICAgICAgKSlcbiAgICAgICkge1xuICAgICAgICBpZiAoITAgIT09IGtleVtpbnRlcm5hbExvYWRQZW5kaW5nS2V5XSkge1xuICAgICAgICAgIHN0YXRlLmxvYWRpbmcgPSBMb2FkZWQ7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9IGVsc2VcbiAgICAgICAgKGtleSA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpbmtcIikpLFxuICAgICAgICAgIChrZXlbaW50ZXJuYWxMb2FkUGVuZGluZ0tleV0gPSAhMCksXG4gICAgICAgICAgKGtleS5vbmxvYWQgPSBrZXkub25lcnJvciA9IGNsZWFyUGVuZGluZ0xvYWRPbk5vZGUuYmluZChudWxsLCBrZXkpKSxcbiAgICAgICAgICBzZXRJbml0aWFsUHJvcGVydGllcyhrZXksIFwibGlua1wiLCBwcmVsb2FkUHJvcHMpLFxuICAgICAgICAgIG1hcmtOb2RlQXNIb2lzdGFibGUoa2V5KSxcbiAgICAgICAgICBvd25lckRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoa2V5KTtcbiAgICAgIHN0YXRlLnByZWxvYWQgPSBrZXk7XG4gICAgICBrZXkuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKHN0YXRlLmxvYWRpbmcgfD0gTG9hZGVkKTtcbiAgICAgIH0pO1xuICAgICAga2V5LmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAoc3RhdGUubG9hZGluZyB8PSBFcnJvcmVkKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRTY3JpcHRLZXkoc3JjKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAnW3NyYz1cIicgKyBlc2NhcGVTZWxlY3RvckF0dHJpYnV0ZVZhbHVlSW5zaWRlRG91YmxlUXVvdGVzKHNyYykgKyAnXCJdJ1xuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0U2NyaXB0U2VsZWN0b3JGcm9tS2V5KGtleSkge1xuICAgICAgcmV0dXJuIFwic2NyaXB0W2FzeW5jXVwiICsga2V5O1xuICAgIH1cbiAgICBmdW5jdGlvbiBhY3F1aXJlUmVzb3VyY2UoaG9pc3RhYmxlUm9vdCwgcmVzb3VyY2UsIHByb3BzKSB7XG4gICAgICByZXNvdXJjZS5jb3VudCsrO1xuICAgICAgaWYgKG51bGwgPT09IHJlc291cmNlLmluc3RhbmNlKVxuICAgICAgICBzd2l0Y2ggKHJlc291cmNlLnR5cGUpIHtcbiAgICAgICAgICBjYXNlIFwic3R5bGVcIjpcbiAgICAgICAgICAgI
15852HZhciBpbnN0YW5jZSA9IGhvaXN0YWJsZVJvb3QucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAgICAgJ3N0eWxlW2RhdGEtaHJlZn49XCInICtcbiAgICAgICAgICAgICAgICBlc2NhcGVTZWxlY3RvckF0dHJpYnV0ZVZhbHVlSW5zaWRlRG91YmxlUXVvdGVzKHByb3BzLmhyZWYpICtcbiAgICAgICAgICAgICAgICAnXCJdJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZSlcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAocmVzb3VyY2UuaW5zdGFuY2UgPSBpbnN0YW5jZSksXG4gICAgICAgICAgICAgICAgbWFya05vZGVBc0hvaXN0YWJsZShpbnN0YW5jZSksXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHZhciBzdHlsZVByb3BzID0gYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgICAgICAgICBcImRhdGEtaHJlZlwiOiBwcm9wcy5ocmVmLFxuICAgICAgICAgICAgICBcImRhdGEtcHJlY2VkZW5jZVwiOiBwcm9wcy5wcmVjZWRlbmNlLFxuICAgICAgICAgICAgICBocmVmOiBudWxsLFxuICAgICAgICAgICAgICBwcmVjZWRlbmNlOiBudWxsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGluc3RhbmNlID0gKFxuICAgICAgICAgICAgICBob2lzdGFibGVSb290Lm93bmVyRG9jdW1lbnQgfHwgaG9pc3RhYmxlUm9vdFxuICAgICAgICAgICAgKS5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG4gICAgICAgICAgICBtYXJrTm9kZUFzSG9pc3RhYmxlKGluc3RhbmNlKTtcbiAgICAgICAgICAgIHNldEluaXRpYWxQcm9wZXJ0aWVzKGluc3RhbmNlLCBcInN0eWxlXCIsIHN0eWxlUHJvcHMpO1xuICAgICAgICAgICAgaW5zZXJ0U3R5bGVzaGVldChpbnN0YW5jZSwgcHJvcHMucHJlY2VkZW5jZSwgaG9pc3RhYmxlUm9vdCk7XG4gICAgICAgICAgICByZXR1cm4gKHJlc291cmNlLmluc3RhbmNlID0gaW5zdGFuY2UpO1xuICAgICAgICAgIGNhc2UgXCJzdHlsZXNoZWV0XCI6XG4gICAgICAgICAgICBzdHlsZVByb3BzID0gZ2V0U3R5bGVLZXkocHJvcHMuaHJlZik7XG4gICAgICAgICAgICB2Y
15852XIgX2luc3RhbmNlID0gaG9pc3RhYmxlUm9vdC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICAgICBnZXRTdHlsZXNoZWV0U2VsZWN0b3JGcm9tS2V5KHN0eWxlUHJvcHMpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKF9pbnN0YW5jZSlcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAocmVzb3VyY2Uuc3RhdGUubG9hZGluZyB8PSBJbnNlcnRlZCksXG4gICAgICAgICAgICAgICAgKHJlc291cmNlLmluc3RhbmNlID0gX2luc3RhbmNlKSxcbiAgICAgICAgICAgICAgICBtYXJrTm9kZUFzSG9pc3RhYmxlKF9pbnN0YW5jZSksXG4gICAgICAgICAgICAgICAgX2luc3RhbmNlXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpbnN0YW5jZSA9IHN0eWxlc2hlZXRQcm9wc0Zyb21SYXdQcm9wcyhwcm9wcyk7XG4gICAgICAgICAgICAoc3R5bGVQcm9wcyA9IHByZWxvYWRQcm9wc01hcC5nZXQoc3R5bGVQcm9wcykpICYmXG4gICAgICAgICAgICAgIGFkb3B0UHJlbG9hZFByb3BzRm9yU3R5bGVzaGVldChpbnN0YW5jZSwgc3R5bGVQcm9wcyk7XG4gICAgICAgICAgICBfaW5zdGFuY2UgPSAoXG4gICAgICAgICAgICAgIGhvaXN0YWJsZVJvb3Qub3duZXJEb2N1bWVudCB8fCBob2lzdGFibGVSb290XG4gICAgICAgICAgICApLmNyZWF0ZUVsZW1lbnQoXCJsaW5rXCIpO1xuICAgICAgICAgICAgbWFya05vZGVBc0hvaXN0YWJsZShfaW5zdGFuY2UpO1xuICAgICAgICAgICAgdmFyIGxpbmtJbnN0YW5jZSA9IF9pbnN0YW5jZTtcbiAgICAgICAgICAgIGxpbmtJbnN0YW5jZS5fcCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgICAgbGlua0luc3RhbmNlLm9ubG9hZCA9IHJlc29sdmU7XG4gICAgICAgICAgICAgIGxpbmtJbnN0YW5jZS5vbmVycm9yID0gcmVqZWN0O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBzZXRJbml0aWFsUHJvcGVydGllcyhfaW5zdGFuY2UsIFwibGlua1wiLCBpbnN0YW5jZSk7XG4gICAgICAgICAgICByZXNvdXJjZS5zdGF0ZS5sb2FkaW5nIHw9IEluc2VydGVkO1xuICAgICAgICAgICAgaW5zZXJ0U3R5bGVzaGVldChfaW5zdGFuY2UsIHByb3BzLnByZWNlZGVuY2UsIGhvaXN0YWJsZVJvb3QpO1xuICAgICAgICAgICAgcmV0dXJuIChyZXNvdXJjZS5pbnN0YW5jZSA9IF9pbnN0YW5jZSk7XG4gICAgICAgICAgY2FzZSBcInNjcmlwdFwiOlxuICAgICAgICAgICAgX2luc3RhbmNlID0gZ2V0U2NyaXB0S2V5KHByb3BzLnNyYyk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIChzdHlsZVByb3BzID0gaG9pc3RhYmxlUm9vdC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICAgICAgIGdldFNjcmlwdFNlbGVjdG9yRnJvbUtleShfaW5zdGFuY2UpXG4gICAgICAgICAgICAgICkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgKHJlc291cmNlLmluc3RhbmNlID0gc3R5bGVQcm9wcyksXG4gICAgICAgICAgICAgICAgbWFya05vZGVBc0hvaXN0YWJsZShzdHlsZVByb3BzKSxcbiAgICAgICAgICAgICAgICBzdHlsZVByb3BzXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpbnN0YW5jZSA9IHByb3BzO1xuICAgICAgICAgICAgaWYgKChzdHlsZVByb3BzID0gcHJlbG9hZFByb3BzTWFwLmdldChfaW5zdGFuY2UpKSlcbiAgICAgICAgICAgICAgKGluc3RhbmNlID0gYXNzaWduKHt9LCBwcm9wcykpLFxuICAgICAgICAgICAgICAgIGFkb3B0UHJlbG9hZFByb3BzRm9yU2NyaXB0KGluc3RhbmNlLCBzdHlsZVByb3BzKTtcbiAgICAgICAgICAgIGhvaXN0YWJsZVJvb3QgPSBob2lzdGFibGVSb290Lm93bmVyRG9jdW1lbnQgfHwgaG9pc3RhYmxlUm9vdDtcbiAgICAgICAgICAgIHN0eWxlUHJvcHMgPSBob2lzdGFibGVSb290LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XG4gICAgICAgICAgICBtYXJrTm9kZUFzSG9pc3RhYmxlKHN0eWxlUHJvcHMpO1xuICAgICAgICAgICAgc2V0SW5pdGlhbFByb3BlcnRpZXMoc3R5bGVQcm9wcywgXCJsaW5rXCIsIGluc3RhbmNlKTtcbiAgICAgICAgICAgIGhvaXN0YWJsZVJvb3QuaGVhZC5hcHBlbmRDaGlsZChzdHlsZVByb3BzKTtcbiAgICAgICAgICAgIHJldHVybiAocmVzb3VyY2UuaW5zdGFuY2UgPSBzdHlsZVByb3BzKTtcbiAgICAgICAgICBjYXNlIFwidm9pZFwiOlxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAnYWNxdWlyZVJlc291cmNlIGVuY291bnRlcmVkIGEgcmVzb3VyY2UgdHlwZSBpdCBkaWQgbm90IGV4cGVjdDogXCInICtcbiAgICAgICAgICAgICAgICByZXNvdXJjZS50eXBlICtcbiAgICAgICAgICAgICAgICAnXCIuIHRoaXMgaXMgYSBidWcgaW4gUmVhY3QuJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgZWxzZVxuICAgICAgICBcInN0eWxlc2hlZXRcIiA9PT0gcmVzb3VyY2UudHlwZSAmJlxuICAgICAgICAgIChyZXNvdXJjZS5zdGF0ZS5sb2FkaW5nICYgSW5zZXJ0ZWQpID09PSBOb3RMb2FkZWQgJiZcbiAgICAgICAgICAoKGluc3RhbmNlID0gcmVzb3VyY2UuaW5zdGFuY2UpLFxuICAgICAgICAgIChyZXNvdXJjZS5zdGF0ZS5sb2FkaW5nIHw9IEluc2VydGVkKSxcbiAgICAgICAgICBpbnNlcnRTdHlsZXNoZWV0KGluc3RhbmNlLCBwcm9wcy5wcmVjZWRlbmNlLCBob2lzdGFibGVSb290KSk7XG4gICAgICByZXR1cm4gcmVzb3VyY2UuaW5zdGFuY2U7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGluc2VydFN0eWxlc2hlZXQoaW5zdGFuY2UsIHByZWNlZGVuY2UsIHJvb3QpIHtcbiAgICAgIGZvciAoXG4gICAgICAgIHZhciBub2RlcyA9IHJvb3QucXVlcnlTZWxlY3RvckFsbChcbiAgICAgICAgICAgICdsaW5rW3JlbD1cInN0eWxlc2hlZXRcIl1bZGF0YS1wcmVjZWRlbmNlXSxzdHlsZVtkYXRhLXByZWNlZGVuY2VdJ1xuICAgICAgICAgICksXG4gICAgICAgICAgbGFzdCA9IG5vZGVzLmxlbmd0aCA/IG5vZGVzW25vZGVzLmxlbmd0aCAtIDFdIDogbnVsbCxcbiAgICAgICAgICBwcmlvciA9IGxhc3QsXG4gICAgICAgICAgaSA9IDA7XG4gICAgICAgIGkgPCBub2Rlcy5sZW5ndGg7XG4gICAgICAgIGkrK1xuICAgICAgKSB7XG4gICAgICAgI
15852HZhciBub2RlID0gbm9kZXNbaV07XG4gICAgICAgIGlmIChub2RlLmRhdGFzZXQucHJlY2VkZW5jZSA9PT0gcHJlY2VkZW5jZSkgcHJpb3IgPSBub2RlO1xuICAgICAgICBlbHNlIGlmIChwcmlvciAhPT0gbGFzdCkgYnJlYWs7XG4gICAgICB9XG4gICAgICBwcmlvclxuICAgICAgICA/IHByaW9yLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGluc3RhbmNlLCBwcmlvci5uZXh0U2libGluZylcbiAgICAgICAgOiAoKHByZWNlZGVuY2UgPSA5ID09PSByb290Lm5vZGVUeXBlID8gcm9vdC5oZWFkIDogcm9vdCksXG4gICAgICAgICAgcHJlY2VkZW5jZS5pbnNlcnRCZWZvcmUoaW5zdGFuY2UsIHByZWNlZGVuY2UuZmlyc3RDaGlsZCkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhZG9wdFByZWxvYWRQcm9wc0ZvclN0eWxlc2hlZXQoc3R5bGVzaGVldFByb3BzLCBwcmVsb2FkUHJvcHMpIHtcbiAgICAgIG51bGwgPT0gc3R5bGVzaGVldFByb3BzLmNyb3NzT3JpZ2luICYmXG4gICAgICAgIChzdHlsZXNoZWV0UHJvcHMuY3Jvc3NPcmlnaW4gPSBwcmVsb2FkUHJvcHMuY3Jvc3NPcmlnaW4pO1xuICAgICAgbnVsbCA9PSBzdHlsZXNoZWV0UHJvcHMucmVmZXJyZXJQb2xpY3kgJiZcbiAgICAgICAgKHN0eWxlc2hlZXRQcm9wcy5yZWZlcnJlclBvbGljeSA9IHByZWxvYWRQcm9wcy5yZWZlcnJlclBvbGljeSk7XG4gICAgICBudWxsID09IHN0eWxlc2hlZXRQcm9wcy50aXRsZSAmJlxuICAgICAgICAoc3R5bGVzaGVldFByb3BzLnRpdGxlID0gcHJlbG9hZFByb3BzLnRpdGxlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYWRvcHRQcmVsb2FkUHJvcHNGb3JTY3JpcHQoc2NyaXB0UHJvcHMsIHByZWxvYWRQcm9wcykge1xuICAgICAgbnVsbCA9PSBzY3JpcHRQcm9wcy5jcm9zc09yaWdpbiAmJlxuICAgICAgICAoc2NyaXB0UHJvcHMuY3Jvc3NPcmlnaW4gPSBwcmVsb2FkUHJvcHMuY3Jvc3NPcmlnaW4pO1xuICAgICAgbnVsbCA9PSBzY3JpcHRQcm9wcy5yZWZlcnJlclBvbGljeSAmJlxuICAgICAgICAoc2NyaXB0UHJvcHMucmVmZXJyZXJQb2xpY3kgPSBwcmVsb2FkUHJvcHMucmVmZXJyZXJQb2xpY3kpO1xuICAgICAgbnVsbCA9PSBzY3JpcHRQcm9wcy5pbnRlZ3JpdHkgJiZcbiAgICAgICAgKHNjcmlwdFByb3BzLmludGVncml0eSA9IHByZWxvYWRQcm9wcy5pbnRlZ3JpdHkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRIeWRyYXRhYmxlSG9pc3RhYmxlQ2FjaGUodHlwZSwga2V5QXR0cmlidXRlLCBvd25lckRvY3VtZW50KSB7XG4gICAgICBpZiAobnVsbCA9PT0gdGFnQ2FjaGVzKSB7XG4gICAgICAgIHZhciBjYWNoZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgdmFyIGNhY2hlcyA9ICh0YWdDYWNoZXMgPSBuZXcgTWFwKCkpO1xuICAgICAgICBjYWNoZXMuc2V0KG93bmVyRG9jdW1lbnQsIGNhY2hlKTtcbiAgICAgIH0gZWxzZVxuICAgICAgICAoY2FjaGVzID0gdGFnQ2FjaGVzKSxcbiAgICAgICAgICAoY2FjaGUgPSBjYWNoZXMuZ2V0KG93bmVyRG9jdW1lbnQpKSxcbiAgICAgICAgICBjYWNoZSB8fCAoKGNhY2hlID0gbmV3IE1hcCgpKSwgY2FjaGVzLnNldChvd25lckRvY3VtZW50LCBjYWNoZSkpO1xuICAgICAgaWYgKGNhY2hlLmhhcyh0eXBlKSkgcmV0dXJuIGNhY2hlO1xuICAgICAgY2FjaGUuc2V0KHR5cGUsIG51bGwpO1xuICAgICAgb3duZXJEb2N1bWVudCA9IG93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUodHlwZSk7XG4gICAgICBmb3IgKGNhY2hlcyA9IDA7IGNhY2hlcyA8IG93bmVyRG9jdW1lbnQubGVuZ3RoOyBjYWNoZXMrKykge1xuICAgICAgICB2Y
15852XIgbm9kZSA9IG93bmVyRG9jdW1lbnRbY2FjaGVzXTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICEoXG4gICAgICAgICAgICBub2RlW2ludGVybmFsSG9pc3RhYmxlTWFya2VyXSB8fFxuICAgICAgICAgICAgbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XSB8fFxuICAgICAgICAgICAgKFwibGlua1wiID09PSB0eXBlICYmIFwic3R5bGVzaGVldFwiID09PSBub2RlLmdldEF0dHJpYnV0ZShcInJlbFwiKSlcbiAgICAgICAgICApICYmXG4gICAgICAgICAgbm9kZS5uYW1lc3BhY2VVUkkgIT09IFNWR19OQU1FU1BBQ0VcbiAgICAgICAgKSB7XG4gICAgICAgICAgdmFyIG5vZGVLZXkgPSBub2RlLmdldEF0dHJpYnV0ZShrZXlBdHRyaWJ1dGUpIHx8IFwiXCI7XG4gICAgICAgICAgbm9kZUtleSA9IHR5cGUgKyBub2RlS2V5O1xuICAgICAgICAgIHZhciBleGlzdGluZyA9IGNhY2hlLmdldChub2RlS2V5KTtcbiAgICAgICAgICBleGlzdGluZyA/IGV4aXN0aW5nLnB1c2gobm9kZSkgOiBjYWNoZS5zZXQobm9kZUtleSwgW25vZGVdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNhY2hlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtb3VudEhvaXN0YWJsZShob2lzdGFibGVSb290LCB0eXBlLCBpbnN0YW5jZSkge1xuICAgICAgaG9pc3RhYmxlUm9vdCA9IGhvaXN0YWJsZVJvb3Qub3duZXJEb2N1bWVudCB8fCBob2lzdGFibGVSb290O1xuICAgICAgaG9pc3RhYmxlUm9vdC5oZWFkLmluc2VydEJlZm9yZShcbiAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgIFwidGl0bGVcIiA9PT0gdHlwZSA/IGhvaXN0YWJsZVJvb3QucXVlcnlTZWxlY3RvcihcImhlYWQgPiB0aXRsZVwiKSA6IG51bGxcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzSG9zdEhvaXN0YWJsZVR5cGUodHlwZSwgcHJvcHMsIGhvc3RDb250ZXh0KSB7XG4gICAgICB2Y
15852XIgb3V0c2lkZUhvc3RDb250YWluZXJDb250ZXh0ID1cbiAgICAgICAgIWhvc3RDb250ZXh0LmFuY2VzdG9ySW5mby5jb250YWluZXJUYWdJblNjb3BlO1xuICAgICAgaWYgKFxuICAgICAgICBob3N0Q29udGV4dC5jb250ZXh0ID09PSBIb3N0Q29udGV4dE5hbWVzcGFjZVN2ZyB8fFxuICAgICAgICBudWxsICE9IHByb3BzLml0ZW1Qcm9wXG4gICAgICApXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgIW91dHNpZGVIb3N0Q29udGFpbmVyQ29udGV4dCB8fFxuICAgICAgICAgICAgbnVsbCA9PSBwcm9wcy5pdGVtUHJvcCB8fFxuICAgICAgICAgICAgKFwibWV0YVwiICE9PSB0eXBlICYmXG4gICAgICAgICAgICAgIFwidGl0bGVcIiAhPT0gdHlwZSAmJlxuICAgICAgICAgICAgICBcInN0eWxlXCIgIT09IHR5cGUgJiZcbiAgICAgICAgICAgICAgXCJsaW5rXCIgIT09IHR5cGUgJiZcbiAgICAgICAgICAgICAgXCJzY3JpcHRcIiAhPT0gdHlwZSkgfHxcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIFwiQ2Fubm90IHJlbmRlciBhIDwlcz4gb3V0c2lkZSB0aGUgbWFpbiBkb2N1bWVudCBpZiBpdCBoYXMgYW4gYGl0ZW1Qcm9wYCBwcm9wLiBgaXRlbVByb3BgIHN1Z2dlc3RzIHRoZSB0YWcgYmVsb25ncyB0byBhbiBgaXRlbVNjb3BlYCB3aGljaCBjYW4gYXBwZWFyIGFueXdoZXJlIGluIHRoZSBET00uIElmIHlvdSB3ZXJlIGludGVuZGluZyBmb3IgUmVhY3QgdG8gaG9pc3QgdGhpcyA8JXM+IHJlbW92ZSB0aGUgYGl0ZW1Qcm9wYCBwcm9wLiBPdGhlcndpc2UsIHRyeSBtb3ZpbmcgdGhpcyB0YWcgaW50byB0aGUgPGhlYWQ+IG9yIDxib2R5PiBvZiB0aGUgRG9jdW1lbnQuXCIsXG4gICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgIHR5cGVcbiAgICAgICAgICAgICksXG4gICAgICAgICAgITFcbiAgICAgICAgKTtcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFwibWV0YVwiOlxuICAgICAgICBjYXNlIFwidGl0bGVcIjpcbiAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgIGNhc2UgXCJzdHlsZVwiOlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIFwic3RyaW5nXCIgIT09IHR5cGVvZiBwcm9wcy5wcmVjZWRlbmNlIHx8XG4gICAgICAgICAgICBcInN0cmluZ1wiICE9PSB0eXBlb2YgcHJvcHMuaHJlZiB8fFxuICAgICAgICAgICAgXCJcIiA9PT0gcHJvcHMuaHJlZlxuICAgICAgICAgICkge1xuICAgICAgICAgICAgb3V0c2lkZUhvc3RDb250YWluZXJDb250ZXh0ICYmXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgJ0Nhbm5vdCByZW5kZXIgYSA8c3R5bGU+IG91dHNpZGUgdGhlIG1haW4gZG9jdW1lbnQgd2l0aG91dCBrbm93aW5nIGl0cyBwcmVjZWRlbmNlIGFuZCBhIHVuaXF1ZSBocmVmIGtleS4gUmVhY3QgY2FuIGhvaXN0IGFuZCBkZWR1cGxpY2F0ZSA8c3R5bGU+IHRhZ3MgaWYgeW91IHByb3ZpZGUgYSBgcHJlY2VkZW5jZWAgcHJvcCBhbG9uZyB3aXRoIGFuIGBocmVmYCBwcm9wIHRoYXQgZG9lcyBub3QgY29uZmxpY3Qgd2l0aCB0aGUgYGhyZWZgIHZhbHVlcyB1c2VkIGluIGFueSBvdGhlciBob2lzdGVkIDxzdHlsZT4gb3IgPGxpbmsgcmVsPVwic3R5bGVzaGVldFwiIC4uLj4gdGFncy4gIE5vdGUgdGhhdCBob2lzdGluZyA8c3R5bGU+IHRhZ3MgaXMgY29uc2lkZXJlZCBhbiBhZHZhbmNlZCBmZWF0dXJlIHRoYXQgbW9zdCB3aWxsIG5vdCB1c2UgZGlyZWN0bHkuIENvbnNpZGVyIG1vdmluZyB0aGUgPHN0eWxlPiB0YWcgdG8gdGhlIDxoZWFkPiBvciBjb25zaWRlciBhZGRpbmcgYSBgcHJlY2VkZW5jZT1cImRlZmF1bHRcImAgYW5kIGBocmVmPVwic29tZSB1bmlxdWUgcmVzb3VyY2UgaWRlbnRpZmllclwiYC4nXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgICBjYXNlIFwibGlua1wiOlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIFwic3RyaW5nXCIgIT09IHR5cGVvZiBwcm9wcy5yZWwgfHxcbiAgICAgICAgICAgIFwic3RyaW5nXCIgIT09IHR5cGVvZiBwcm9wcy5ocmVmIHx8XG4gICAgICAgICAgICBcIlwiID09PSBwcm9wcy5ocmVmIHx8XG4gICAgICAgICAgICBwcm9wcy5vbkxvYWQgfHxcbiAgICAgICAgICAgIHByb3BzLm9uRXJyb3JcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgXCJzdHlsZXNoZWV0XCIgPT09IHByb3BzLnJlbCAmJlxuICAgICAgICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2YgcHJvcHMucHJlY2VkZW5jZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHR5cGUgPSBwcm9wcy5ocmVmO1xuICAgICAgICAgICAgICB2Y
15852XIgb25FcnJvciA9IHByb3BzLm9uRXJyb3IsXG4gICAgICAgICAgICAgICAgZGlzYWJsZWQgPSBwcm9wcy5kaXNhYmxlZDtcbiAgICAgICAgICAgICAgaG9zdENvbnRleHQgPSBbXTtcbiAgICAgICAgICAgICAgcHJvcHMub25Mb2FkICYmIGhvc3RDb250ZXh0LnB1c2goXCJgb25Mb2FkYFwiKTtcbiAgICAgICAgICAgICAgb25FcnJvciAmJiBob3N0Q29udGV4dC5wdXNoKFwiYG9uRXJyb3JgXCIpO1xuICAgICAgICAgICAgICBudWxsICE9IGRpc2FibGVkICYmIGhvc3RDb250ZXh0LnB1c2goXCJgZGlzYWJsZWRgXCIpO1xuICAgICAgICAgICAgICBvbkVycm9yID0gcHJvcE5hbWVzTGlzdEpvaW4oaG9zdENvbnRleHQsIFwiYW5kXCIpO1xuICAgICAgICAgICAgICBvbkVycm9yICs9IDEgPT09IGhvc3RDb250ZXh0Lmxlbmd0aCA/IFwiIHByb3BcIiA6IFwiIHByb3BzXCI7XG4gICAgICAgICAgICAgIGRpc2FibGVkID1cbiAgICAgICAgICAgICAgICAxID09PSBob3N0Q29udGV4dC5sZW5ndGggPyBcImFuIFwiICsgb25FcnJvciA6IFwidGhlIFwiICsgb25FcnJvcjtcbiAgICAgICAgICAgICAgaG9zdENvbnRleHQubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICdSZWFjdCBlbmNvdW50ZXJlZCBhIDxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiBocmVmPVwiJXNcIiAuLi4gLz4gd2l0aCBhIGBwcmVjZWRlbmNlYCBwcm9wIHRoYXQgYWxzbyBpbmNsdWRlZCAlcy4gVGhlIHByZXNlbmNlIG9mIGxvYWRpbmcgYW5kIGVycm9yIGhhbmRsZXJzIGluZGljYXRlcyBhbiBpbnRlbnQgdG8gbWFuYWdlIHRoZSBzdHlsZXNoZWV0IGxvYWRpbmcgc3RhdGUgZnJvbSB5b3VyIGZyb20geW91ciBDb21wb25lbnQgY29kZSBhbmQgUmVhY3Qgd2lsbCBub3QgaG9pc3Qgb3IgZGVkdXBsaWNhdGUgdGhpcyBzdHlsZXNoZWV0LiBJZiB5b3VyIGludGVudCB3YXMgdG8gaGF2ZSBSZWFjdCBob2lzdCBhbmQgZGVkdXBsY2lhdGUgdGhpcyBzdHlsZXNoZWV0IHVzaW5nIHRoZSBgcHJlY2VkZW5jZWAgcHJvcCByZW1vdmUgdGhlICVzLCBvdGhlcndpc2UgcmVtb3ZlIHRoZSBgcHJlY2VkZW5jZWAgcHJvcC4nLFxuICAgICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkLFxuICAgICAgICAgICAgICAgICAgb25FcnJvclxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXRzaWRlSG9zdENvbnRhaW5lckNvbnRleHQgJiZcbiAgICAgICAgICAgICAgKFwic3RyaW5nXCIgIT09IHR5cGVvZiBwcm9wcy5yZWwgfHxcbiAgICAgICAgICAgICAgXCJzdHJpbmdcIiAhPT0gdHlwZW9mIHByb3BzLmhyZWYgfHxcbiAgICAgICAgICAgICAgXCJcIiA9PT0gcHJvcHMuaHJlZlxuICAgICAgICAgICAgICAgID8gY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJDYW5ub3QgcmVuZGVyIGEgPGxpbms+IG91dHNpZGUgdGhlIG1haW4gZG9jdW1lbnQgd2l0aG91dCBhIGByZWxgIGFuZCBgaHJlZmAgcHJvcC4gVHJ5IGFkZGluZyBhIGByZWxgIGFuZC9vciBgaHJlZmAgcHJvcCB0byB0aGlzIDxsaW5rPiBvciBtb3ZpbmcgdGhlIGxpbmsgaW50byB0aGUgPGhlYWQ+IHRhZ1wiXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiAocHJvcHMub25FcnJvciB8fCBwcm9wcy5vbkxvYWQpICYmXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICBcIkNhbm5vdCByZW5kZXIgYSA8bGluaz4gd2l0aCBvbkxvYWQgb3Igb25FcnJvciBsaXN0ZW5lcnMgb3V0c2lkZSB0aGUgbWFpbiBkb2N1bWVudC4gVHJ5IHJlbW92aW5nIG9uTG9hZD17Li4ufSBhbmQgb25FcnJvcj17Li4ufSBvciBtb3ZpbmcgaXQgaW50byB0aGUgcm9vdCA8aGVhZD4gdGFnIG9yIHNvbWV3aGVyZSBpbiB0aGUgPGJvZHk+LlwiXG4gICAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzd2l0Y2ggKHByb3BzLnJlbCkge1xuICAgICAgICAgICAgY2FzZSBcInN0eWxlc2hlZXRcIjpcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAodHlwZSA9IHByb3BzLnByZWNlZGVuY2UpLFxuICAgICAgICAgICAgICAgIChwcm9wcyA9IHByb3BzLmRpc2FibGVkKSxcbiAgICAgICAgICAgICAgICBcInN0cmluZ1wiICE9PSB0eXBlb2YgdHlwZSAmJlxuICAgICAgICAgICAgICAgICAgb3V0c2lkZUhvc3RDb250YWluZXJDb250ZXh0ICYmXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAnQ2Fubm90IHJlbmRlciBhIDxsaW5rIHJlbD1cInN0eWxlc2hlZXRcIiAvPiBvdXRzaWRlIHRoZSBtYWluIGRvY3VtZW50IHdpdGhvdXQga25vd2luZyBpdHMgcHJlY2VkZW5jZS4gQ29uc2lkZXIgYWRkaW5nIHByZWNlZGVuY2U9XCJkZWZhdWx0XCIgb3IgbW92aW5nIGl0IGludG8gdGhlIHJvb3QgPGhlYWQ+IHRhZy4nXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIFwic3RyaW5nXCIgPT09IHR5cGVvZiB0eXBlICYmIG51bGwgPT0gcHJvcHNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHJldHVybiAhMDtcbiAgICAgICAgICB9XG4gICAgICAgIGNhc2UgXCJzY3JpcHRcIjpcbiAgICAgICAgICB0eXBlID1cbiAgICAgICAgICAgIHByb3BzLmFzeW5jICYmXG4gICAgICAgICAgICBcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBwcm9wcy5hc3luYyAmJlxuICAgICAgICAgICAgXCJzeW1ib2xcIiAhPT0gdHlwZW9mIHByb3BzLmFzeW5jO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICF0eXBlIHx8XG4gICAgICAgICAgICBwcm9wcy5vbkxvYWQgfHxcbiAgICAgICAgICAgIHByb3BzLm9uRXJyb3IgfHxcbiAgICAgICAgICAgICFwcm9wcy5zcmMgfHxcbiAgICAgICAgICAgIFwic3RyaW5nXCIgIT09IHR5cGVvZiBwcm9wcy5zcmNcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIG91dHNpZGVIb3N0Q29udGFpbmVyQ29udGV4dCAmJlxuICAgICAgICAgICAgICAodHlwZVxuICAgICAgICAgICAgICAgID8gcHJvcHMub25Mb2FkIHx8IHByb3BzLm9uRXJyb3JcbiAgICAgICAgICAgICAgICAgID8gY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICBcIkNhbm5vdCByZW5kZXIgYSA8c2NyaXB0PiB3aXRoIG9uTG9hZCBvciBvbkVycm9yIGxpc3RlbmVycyBvdXRzaWRlIHRoZSBtYWluIGRvY3VtZW50LiBUcnkgcmVtb3Zpbmcgb25Mb2FkPXsuLi59IGFuZCBvbkVycm9yPXsuLi59IG9yIG1vdmluZyBpdCBpbnRvIHRoZSByb290IDxoZWFkPiB0YWcgb3Igc29tZXdoZXJlIGluIHRoZSA8Ym9keT4uXCJcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgOiBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgIFwiQ2Fubm90IHJlbmRlciBhIDxzY3JpcHQ+IG91dHNpZGUgdGhlIG1haW4gZG9jdW1lbnQgd2l0aG91dCBgYXN5bmM9e3RydWV9YCBhbmQgYS
15852Bub24tZW1wdHkgYHNyY2AgcHJvcC4gRW5zdXJlIHRoZXJlIGlzIGEgdmFsaWQgYHNyY2AgYW5kIGVpdGhlciBtYWtlIHRoZSBzY3JpcHQgYXN5bmMgb3IgbW92ZSBpdCBpbnRvIHRoZSByb290IDxoZWFkPiB0YWcgb3Igc29tZXdoZXJlIGluIHRoZSA8Ym9keT4uXCJcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgJ0Nhbm5vdCByZW5kZXIgYSBzeW5jIG9yIGRlZmVyIDxzY3JpcHQ+IG91dHNpZGUgdGhlIG1haW4gZG9jdW1lbnQgd2l0aG91dCBrbm93aW5nIGl0cyBvcmRlci4gVHJ5IGFkZGluZyBhc3luYz1cIlwiIG9yIG1vdmluZyBpdCBpbnRvIHRoZSByb290IDxoZWFkPiB0YWcuJ1xuICAgICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuICEwO1xuICAgICAgICBjYXNlIFwibm9zY3JpcHRcIjpcbiAgICAgICAgY2FzZSBcInRlbXBsYXRlXCI6XG4gICAgICAgICAgb3V0c2lkZUhvc3RDb250YWluZXJDb250ZXh0ICYmXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIkNhbm5vdCByZW5kZXIgPCVzPiBvdXRzaWRlIHRoZSBtYWluIGRvY3VtZW50LiBUcnkgbW92aW5nIGl0IGludG8gdGhlIHJvb3QgPGhlYWQ+IHRhZy5cIixcbiAgICAgICAgICAgICAgdHlwZVxuICAgICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAhMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbWF5U3VzcGVuZENvbW1pdCh0eXBlLCBwcm9wcykge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgXCJpbWdcIiA9PT0gdHlwZSAmJlxuICAgICAgICBudWxsICE9IHByb3BzLnNyYyAmJlxuICAgICAgICBcIlwiICE9PSBwcm9wcy5zcmMgJiZcbiAgICAgICAgbnVsbCA9PSBwcm9wcy5vbkxvYWQgJiZcbiAgICAgICAgXCJsYXp5XCIgIT09IHByb3BzLmxvYWRpbmdcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHByZWxvYWRSZXNvdXJjZShyZXNvdXJjZSkge1xuICAgICAgcmV0dXJuIFwic3R5bGVzaGVldFwiID09PSByZXNvdXJjZS50eXBlICYmXG4gICAgICAgIChyZXNvdXJjZS5zdGF0ZS5sb2FkaW5nICYgU2V0dGxlZCkgPT09IE5vdExvYWRlZFxuICAgICAgICA/ICExXG4gICAgICAgIDogITA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGVzdGltYXRlSW1hZ2VCeXRlcyhpbnN0YW5jZSkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKGluc3RhbmNlLndpZHRoIHx8IDEwMCkgKlxuICAgICAgICAoaW5zdGFuY2UuaGVpZ2h0IHx8IDEwMCkgKlxuICAgICAgICAoXCJudW1iZXJcIiA9PT0gdHlwZW9mIGRldmljZVBpeGVsUmF0aW8gPyBkZXZpY2VQaXhlbFJhdGlvIDogMSkgKlxuICAgICAgICAwLjI1XG4gICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzdXNwZW5kSW5zdGFuY2Uoc3RhdGUsIGluc3RhbmNlKSB7XG4gICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBpbnN0YW5jZS5kZWNvZGUgJiZcbiAgICAgICAgKHN0YXRlLmltZ0NvdW50KyssXG4gICAgICAgIGluc3RhbmNlLmNvbXBsZXRlIHx8XG4gICAgICAgICAgKChzdGF0ZS5pbWdCeXRlcyArPSBlc3RpbWF0ZUltYWdlQnl0ZXMoaW5zdGFuY2UpKSxcbiAgICAgICAgICBzdGF0ZS5zdXNwZW5zZXlJbWFnZXMucHVzaChpbnN0YW5jZSkpLFxuICAgICAgICAoc3RhdGUgPSBvblVuc3VzcGVuZEltZy5iaW5kKHN0YXRlKSksXG4gICAgICAgIGluc3RhbmNlLmRlY29kZSgpLnRoZW4oc3RhdGUsIHN0YXRlKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN1c3BlbmRSZXNvdXJjZShzdGF0ZSwgaG9pc3RhYmxlUm9vdCwgcmVzb3VyY2UsIHByb3BzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIFwic3R5bGVzaGVldFwiID09PSByZXNvdXJjZS50eXBlICYmXG4gICAgICAgIChcInN0cmluZ1wiICE9PSB0eXBlb2YgcHJvcHMubWVkaWEgfHxcbiAgICAgICAgICAhMSAhPT0gbWF0Y2hNZWRpYShwcm9wcy5tZWRpYSkubWF0Y2hlcykgJiZcbiAgICAgICAgKHJlc291cmNlLnN0YXRlLmxvYWRpbmcgJiBJbnNlcnRlZCkgPT09IE5vdExvYWRlZFxuICAgICAgKSB7XG4gICAgICAgIGlmIChudWxsID09PSByZXNvdXJjZS5pbnN0YW5jZSkge1xuICAgICAgICAgIHZhciBrZXkgPSBnZXRTdHlsZUtleShwcm9wcy5ocmVmKSxcbiAgICAgICAgICAgIGluc3RhbmNlID0gaG9pc3RhYmxlUm9vdC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICAgICBnZXRTdHlsZXNoZWV0U2VsZWN0b3JGcm9tS2V5KGtleSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGluc3RhbmNlKSB7XG4gICAgICAgICAgICBob2lzdGFibGVSb290ID0gaW5zdGFuY2UuX3A7XG4gICAgICAgICAgICBudWxsICE9PSBob2lzdGFibGVSb290ICYmXG4gICAgICAgICAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiBob2lzdGFibGVSb290ICYmXG4gICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGhvaXN0YWJsZVJvb3QudGhlbiAmJlxuICAgICAgICAgICAgICAoc3RhdGUuY291bnQrKyxcbiAgICAgICAgICAgICAgKHN0YXRlID0gb25VbnN1c3BlbmQuYmluZChzdGF0ZSkpLFxuICAgICAgICAgICAgICBob2lzdGFibGVSb290LnRoZW4oc3RhdGUsIHN0YXRlKSk7XG4gICAgICAgICAgICByZXNvdXJjZS5zdGF0ZS5sb2FkaW5nIHw9IEluc2VydGVkO1xuICAgICAgICAgICAgcmVzb3VyY2UuaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgICAgICAgIG1hcmtOb2RlQXNIb2lzdGFibGUoaW5zdGFuY2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbnN0YW5jZSA9IGhvaXN0YWJsZVJvb3Qub3duZXJEb2N1bWVudCB8fCBob2lzdGFibGVSb290O1xuICAgICAgICAgIHByb3BzID0gc3R5bGVzaGVldFByb3BzRnJvbVJhd1Byb3BzKHByb3BzKTtcbiAgICAgICAgICAoa2V5ID0gcHJlbG9hZFByb3BzTWFwLmdldChrZXkpKSAmJlxuICAgICAgICAgICAgYWRvcHRQcmVsb2FkUHJvcHNGb3JTdHlsZXNoZWV0KHByb3BzLCBrZXkpO1xuICAgICAgICAgIGluc3RhbmNlID0gaW5zdGFuY2UuY3JlYXRlRWxlbWVudChcImxpbmtcIik7XG4gICAgICAgICAgbWFya05vZGVBc0hvaXN0YWJsZShpbnN0YW5jZSk7XG4gICAgICAgICAgdmFyIGxpbmtJbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgICAgIGxpbmtJbnN0YW5jZS5fcCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIGxpbmtJbnN0YW5jZS5vbmxvYWQgPSByZXNvbHZlO1xuICAgICAgICAgICAgbGlua0luc3RhbmNlLm9uZXJyb3IgPSByZWplY3Q7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc2V0SW5pdGlhbFByb3BlcnRpZXMoaW5zdGFuY2UsIFwibGlua1wiLCBwcm9wcyk7XG4gICAgICAgICAgcmVzb3VyY2UuaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgICAgfVxuICAgICAgICBudWxsID09PSBzdGF0ZS5zdHlsZXNoZWV0cyAmJiAoc3RhdGUuc3R5bGVzaGVldHMgPSBuZXcgTWFwKCkpO1xuICAgICAgICBzdGF0ZS5zdHlsZXNoZWV0cy5zZXQocmVzb3VyY2UsIGhvaXN0YWJsZVJvb3QpO1xuICAgICAgICAoaG9pc3RhYmxlUm9vdCA9IHJlc291cmNlLnN0YXRlLnByZWxvYWQpICYmXG4gICAgICAgICAgKHJlc291cmNlLnN0YXRlLmxvYWRpbmcgJiBTZXR0bGVkKSA9PT0gTm90TG9hZGVkICYmXG4gICAgICAgICAgKHN0YXRlLmNvdW50KyssXG4gICAgICAgICAgKHJlc291cmNlID0gb25VbnN1c3BlbmQuYmluZChzdGF0ZSkpLFxuICAgICAgICAgIGhvaXN0YWJsZVJvb3QuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIiwgcmVzb3VyY2UpLFxuICAgICAgICAgIGhvaXN0YWJsZVJvb3QuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIHJlc291cmNlKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHdhaXRGb3JDb21taXRUb0JlUmVhZHkoc3RhdGUsIHRpbWVvdXRPZmZzZXQpIHtcbiAgICAgIHN0YXRlLnN0eWxlc2hlZXRzICYmXG4gICAgICAgIDAgPT09IHN0YXRlLmNvdW50ICYmXG4gICAgICAgIGluc2VydFN1c3BlbmRlZFN0eWxlc2hlZXRzKHN0YXRlLCBzdGF0ZS5zdHlsZXNoZWV0cyk7XG4gICAgICByZXR1cm4gMCA8IHN0YXRlLmNvdW50IHx8IDAgPCBzdGF0ZS5pbWdDb3VudFxuICAgICAgICA/IGZ1bmN0aW9uIChjb21taXQpIHtcbiAgICAgICAgICAgI
15852HZhciBzdHlsZXNoZWV0VGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgc3RhdGUuc3R5bGVzaGVldHMgJiZcbiAgICAgICAgICAgICAgICBpbnNlcnRTdXNwZW5kZWRTdHlsZXNoZWV0cyhzdGF0ZSwgc3RhdGUuc3R5bGVzaGVldHMpO1xuICAgICAgICAgICAgICBpZiAoc3RhdGUudW5zdXNwZW5kKSB7XG4gICAgICAgICAgICAgICAgdmFyIHVuc3VzcGVuZCA9IHN0YXRlLnVuc3VzcGVuZDtcbiAgICAgICAgICAgICAgICBzdGF0ZS51bnN1c3BlbmQgPSBudWxsO1xuICAgICAgICAgICAgICAgIHVuc3VzcGVuZCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBTVVNQRU5TRVlfU1RZTEVTSEVFVF9USU1FT1VUICsgdGltZW91dE9mZnNldCk7XG4gICAgICAgICAgICAwIDwgc3RhdGUuaW1nQnl0ZXMgJiZcbiAgICAgICAgICAgICAgMCA9PT0gZXN0aW1hdGVkQnl0ZXNXaXRoaW5MaW1pdCAmJlxuICAgICAgICAgICAgICAoZXN0aW1hdGVkQnl0ZXNXaXRoaW5MaW1pdCA9XG4gICAgICAgICAgICAgICAgMTI1ICogZXN0aW1hdGVCYW5kd2lkdGgoKSAqIFNVU1BFTlNFWV9JTUFHRV9USU1FX0VTVElNQVRFKTtcbiAgICAgICAgICAgIHZhciBpbWdUaW1lciA9IHNldFRpbWVvdXQoXG4gICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZS53YWl0aW5nRm9ySW1hZ2VzID0gITE7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgMCA9PT0gc3RhdGUuY291bnQgJiZcbiAgICAgICAgICAgICAgICAgIChzdGF0ZS5zdHlsZXNoZWV0cyAmJlxuICAgICAgICAgICAgICAgICAgICBpbnNlcnRTdXNwZW5kZWRTdHlsZXNoZWV0cyhzdGF0ZSwgc3RhdGUuc3R5bGVzaGVldHMpLFxuICAgICAgICAgICAgICAgICAgc3RhdGUudW5zdXNwZW5kKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgdmFyIHVuc3VzcGVuZCA9IHN0YXRlLnVuc3VzcGVuZDtcbiAgICAgICAgICAgICAgICAgIHN0YXRlLnVuc3VzcGVuZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICB1bnN1c3BlbmQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIChzdGF0ZS5pbWdCeXRlcyA+IGVzdGltYXRlZEJ5dGVzV2l0aGluTGltaXRcbiAgICAgICAgICAgICAgICA/IDUwXG4gICAgICAgICAgICAgICAgOiBTVVNQRU5TRVlfSU1BR0VfVElNRU9VVCkgKyB0aW1lb3V0T2Zmc2V0XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgc3RhdGUudW5zdXNwZW5kID0gY29tbWl0O1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgc3RhdGUudW5zdXNwZW5kID0gbnVsbDtcbiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHN0eWxlc2hlZXRUaW1lcik7XG4gICAgICAgICAgICAgIGNsZWFyVGltZW91dChpbWdUaW1lcik7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgOiBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja0lmRnVsbHlVbnN1c3BlbmRlZChzdGF0ZSkge1xuICAgICAgaWYgKFxuICAgICAgICAwID09PSBzdGF0ZS5jb3VudCAmJlxuICAgICAgICAoMCA9PT0gc3RhdGUuaW1nQ291bnQgfHwgIXN0YXRlLndhaXRpbmdGb3JJbWFnZXMpXG4gICAgICApXG4gICAgICAgIGlmIChzdGF0ZS5zdHlsZXNoZWV0cylcbiAgICAgICAgICBpbnNlcnRTdXNwZW5kZWRTdHlsZXNoZWV0cyhzdGF0ZSwgc3RhdGUuc3R5bGVzaGVldHMpO1xuICAgICAgICBlbHNlIGlmIChzdGF0ZS51bnN1c3BlbmQpIHtcbiAgICAgICAgICB2Y
15852XIgdW5zdXNwZW5kID0gc3RhdGUudW5zdXNwZW5kO1xuICAgICAgICAgIHN0YXRlLnVuc3VzcGVuZCA9IG51bGw7XG4gICAgICAgICAgdW5zdXNwZW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gb25VbnN1c3BlbmQoKSB7XG4gICAgICB0aGlzLmNvdW50LS07XG4gICAgICBjaGVja0lmRnVsbHlVbnN1c3BlbmRlZCh0aGlzKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gb25VbnN1c3BlbmRJbWcoKSB7XG4gICAgICB0aGlzLmltZ0NvdW50LS07XG4gICAgICBjaGVja0lmRnVsbHlVbnN1c3BlbmRlZCh0aGlzKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaW5zZXJ0U3VzcGVuZGVkU3R5bGVzaGVldHMoc3RhdGUsIHJlc291cmNlcykge1xuICAgICAgc3RhdGUuc3R5bGVzaGVldHMgPSBudWxsO1xuICAgICAgbnVsbCAhPT0gc3RhdGUudW5zdXNwZW5kICYmXG4gICAgICAgIChzdGF0ZS5jb3VudCsrLFxuICAgICAgICAocHJlY2VkZW5jZXNCeVJvb3QgPSBuZXcgTWFwKCkpLFxuICAgICAgICByZXNvdXJjZXMuZm9yRWFjaChpbnNlcnRTdHlsZXNoZWV0SW50b1Jvb3QsIHN0YXRlKSxcbiAgICAgICAgKHByZWNlZGVuY2VzQnlSb290ID0gbnVsbCksXG4gICAgICAgIG9uVW5zdXNwZW5kLmNhbGwoc3RhdGUpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaW5zZXJ0U3R5bGVzaGVldEludG9Sb290KHJvb3QsIHJlc291cmNlKSB7XG4gICAgICBpZiAoIShyZXNvdXJjZS5zdGF0ZS5sb2FkaW5nICYgSW5zZXJ0ZWQpKSB7XG4gICAgICAgIHZhciBwcmVjZWRlbmNlcyA9IHByZWNlZGVuY2VzQnlSb290LmdldChyb290KTtcbiAgICAgICAgaWYgKHByZWNlZGVuY2VzKSB2YXIgbGFzdCA9IHByZWNlZGVuY2VzLmdldChMQVNUX1BSRUNFREVOQ0UpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBwcmVjZWRlbmNlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICBwcmVjZWRlbmNlc0J5Um9vdC5zZXQocm9vdCwgcHJlY2VkZW5jZXMpO1xuICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICB2Y
15852XIgbm9kZXMgPSByb290LnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICAgICAgICAgICAgXCJsaW5rW2RhdGEtcHJlY2VkZW5jZV0sc3R5bGVbZGF0YS1wcmVjZWRlbmNlXVwiXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIGkgPSAwO1xuICAgICAgICAgICAgaSA8IG5vZGVzLmxlbmd0aDtcbiAgICAgICAgICAgIGkrK1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgXCJMSU5LXCIgPT09IG5vZGUubm9kZU5hbWUgfHxcbiAgICAgICAgICAgICAgXCJub3QgYWxsXCIgIT09IG5vZGUuZ2V0QXR0cmlidXRlKFwibWVkaWFcIilcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgcHJlY2VkZW5jZXMuc2V0KG5vZGUuZGF0YXNldC5wcmVjZWRlbmNlLCBub2RlKSwgKGxhc3QgPSBub2RlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGFzdCAmJiBwcmVjZWRlbmNlcy5zZXQoTEFTVF9QUkVDRURFTkNFLCBsYXN0KTtcbiAgICAgICAgfVxuICAgICAgICBub2RlcyA9IHJlc291cmNlLmluc3RhbmNlO1xuICAgICAgICBub2RlID0gbm9kZXMuZ2V0QXR0cmlidXRlKFwiZGF0YS1wcmVjZWRlbmNlXCIpO1xuICAgICAgICBpID0gcHJlY2VkZW5jZXMuZ2V0KG5vZGUpIHx8IGxhc3Q7XG4gICAgICAgIGkgPT09IGxhc3QgJiYgcHJlY2VkZW5jZXMuc2V0KExBU1RfUFJFQ0VERU5DRSwgbm9kZXMpO1xuICAgICAgICBwcmVjZWRlbmNlcy5zZXQobm9kZSwgbm9kZXMpO1xuICAgICAgICB0aGlzLmNvdW50Kys7XG4gICAgICAgIGxhc3QgPSBvblVuc3VzcGVuZC5iaW5kKHRoaXMpO1xuICAgICAgICBub2Rlcy5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLCBsYXN0KTtcbiAgICAgICAgbm9kZXMuYWRkRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIGxhc3QpO1xuICAgICAgICBpXG4gICAgICAgICAgPyBpLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGVzLCBpLm5leHRTaWJsaW5nKVxuICAgICAgICAgIDogKChyb290ID0gOSA9PT0gcm9vdC5ub2RlVHlwZSA/IHJvb3QuaGVhZCA6IHJvb3QpLFxuICAgICAgICAgICAgcm9vdC5pbnNlcnRCZWZvcmUobm9kZXMsIHJvb3QuZmlyc3RDaGlsZCkpO1xuICAgICAgICByZXNvdXJjZS5zdGF0ZS5sb2FkaW5nIHw9IEluc2VydGVkO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBGaWJlclJvb3ROb2RlKFxuICAgICAgY29udGFpbmVySW5mbyxcbiAgICAgIHRhZyxcbiAgICAgIGh5ZHJhdGUsXG4gICAgICBpZGVudGlmaWVyUHJlZml4LFxuICAgICAgb25VbmNhdWdodEVycm9yLFxuICAgICAgb25DYXVnaHRFcnJvcixcbiAgICAgIG9uUmVjb3ZlcmFibGVFcnJvcixcbiAgICAgIG9uRGVmYXVsdFRyYW5zaXRpb25JbmRpY2F0b3IsXG4gICAgICBmb3JtU3RhdGVcbiAgICApIHtcbiAgICAgIHRoaXMudGFnID0gMTtcbiAgICAgIHRoaXMuY29udGFpbmVySW5mbyA9IGNvbnRhaW5lckluZm87XG4gICAgICB0aGlzLnBpbmdDYWNoZSA9IHRoaXMuY3VycmVudCA9IHRoaXMucGVuZGluZ0NoaWxkcmVuID0gbnVsbDtcbiAgICAgIHRoaXMudGltZW91dEhhbmRsZSA9IG5vVGltZW91dDtcbiAgICAgIHRoaXMuY2FsbGJhY2tOb2RlID1cbiAgICAgICAgdGhpcy5uZXh0ID1cbiAgICAgICAgdGhpcy5wZW5kaW5nQ29udGV4dCA9XG4gICAgICAgIHRoaXMuY29udGV4dCA9XG4gICAgICAgIHRoaXMuY2FuY2VsUGVuZGluZ0NvbW1pdCA9XG4gICAgICAgICAgbnVsbDtcbiAgICAgIHRoaXMuY2FsbGJhY2tQcmlvcml0eSA9IDA7XG4gICAgICB0aGlzLmV4cGlyYXRpb25UaW1lcyA9IGNyZWF0ZUxhbmVNYXAoLTEpO1xuICAgICAgdGhpcy5lbnRhbmdsZWRMYW5lcyA9XG4gICAgICAgIHRoaXMuc2hlbGxTdXNwZW5kQ291bnRlciA9XG4gICAgICAgIHRoaXMuZXJyb3JSZWNvdmVyeURpc2FibGVkTGFuZXMgPVxuICAgICAgICB0aGlzLmV4cGlyZWRMYW5lcyA9XG4gICAgICAgIHRoaXMud2FybUxhbmVzID1cbiAgICAgICAgdGhpcy5waW5nZWRMYW5lcyA9XG4gICAgICAgIHRoaXMuc3VzcGVuZGVkTGFuZXMgPVxuICAgICAgICB0aGlzLnBlbmRpbmdMYW5lcyA9XG4gICAgICAgICAgMDtcbiAgICAgIHRoaXMuZW50YW5nbGVtZW50cyA9IGNyZWF0ZUxhbmVNYXAoMCk7XG4gICAgICB0aGlzLmhpZGRlblVwZGF0ZXMgPSBjcmVhdGVMYW5lTWFwKG51bGwpO1xuICAgICAgdGhpcy5pZGVudGlmaWVyUHJlZml4ID0gaWRlbnRpZmllclByZWZpeDtcbiAgICAgIHRoaXMub25VbmNhdWdodEVycm9yID0gb25VbmNhdWdodEVycm9yO1xuICAgICAgdGhpcy5vbkNhdWdodEVycm9yID0gb25DYXVnaHRFcnJvcjtcbiAgICAgIHRoaXMub25SZWNvdmVyYWJsZUVycm9yID0gb25SZWNvdmVyYWJsZUVycm9yO1xuICAgICAgdGhpcy5wb29sZWRDYWNoZSA9IG51bGw7XG4gICAgICB0aGlzLnBvb2xlZENhY2hlTGFuZXMgPSAwO1xuICAgICAgdGhpcy5mb3JtU3RhdGUgPSBmb3JtU3RhdGU7XG4gICAgICB0aGlzLnRyYW5zaXRpb25UeXBlcyA9IG51bGw7XG4gICAgICB0aGlzLmluY29tcGxldGVUcmFuc2l0aW9ucyA9IG5ldyBNYXAoKTtcbiAgICAgIHRoaXMucGFzc2l2ZUVmZmVjdER1cmF0aW9uID0gdGhpcy5lZmZlY3REdXJhdGlvbiA9IC0wO1xuICAgICAgdGhpcy5tZW1vaXplZFVwZGF0ZXJzID0gbmV3IFNldCgpO1xuICAgICAgY29udGFpbmVySW5mbyA9IHRoaXMucGVuZGluZ1VwZGF0ZXJzTGFuZU1hcCA9IFtdO1xuICAgICAgZm9yICh0YWcgPSAwOyAzMSA+IHRhZzsgdGFnKyspIGNvbnRhaW5lckluZm8ucHVzaChuZXcgU2V0KCkpO1xuICAgICAgdGhpcy5fZGVidWdSb290VHlwZSA9IGh5ZHJhdGUgPyBcImh5ZHJhdGVSb290KClcIiA6IFwiY3JlYXRlUm9vdCgpXCI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZUZpYmVyUm9vdChcbiAgICAgIGNvbnRhaW5lckluZm8sXG4gICAgICB0YWcsXG4gICAgICBoeWRyYXRlLFxuICAgICAgaW5pdGlhbENoaWxkcmVuLFxuICAgICAgaHlkcmF0aW9uQ2FsbGJhY2tzLFxuICAgICAgaXNTdHJpY3RNb2RlLFxuICAgICAgaWRlbnRpZmllclByZWZpeCxcbiAgICAgIGZvcm1TdGF0ZSxcbiAgICAgIG9uVW5jYXVnaHRFcnJvcixcbiAgICAgIG9uQ2F1Z2h0RXJyb3IsXG4gICAgICBvblJlY292ZXJhYmxlRXJyb3IsXG4gICAgICBvbkRlZmF1bHRUcmFuc2l0aW9uSW5kaWNhdG9yXG4gICAgKSB7XG4gICAgICBjb250YWluZXJJbmZvID0gbmV3IEZpYmVyUm9vdE5vZGUoXG4gICAgICAgIGNvbnRhaW5lckluZm8sXG4gICAgICAgI
15852HRhZyxcbiAgICAgICAgaHlkcmF0ZSxcbiAgICAgICAgaWRlbnRpZmllclByZWZpeCxcbiAgICAgICAgb25VbmNhdWdodEVycm9yLFxuICAgICAgICBvbkNhdWdodEVycm9yLFxuICAgICAgICBvblJlY292ZXJhYmxlRXJyb3IsXG4gICAgICAgIG9uRGVmYXVsdFRyYW5zaXRpb25JbmRpY2F0b3IsXG4gICAgICAgIGZvcm1TdGF0ZVxuICAgICAgKTtcbiAgICAgIHRhZyA9IENvbmN1cnJlbnRNb2RlO1xuICAgICAgITAgPT09IGlzU3RyaWN0TW9kZSAmJiAodGFnIHw9IFN0cmljdExlZ2FjeU1vZGUgfCBTdHJpY3RFZmZlY3RzTW9kZSk7XG4gICAgICB0YWcgfD0gUHJvZmlsZU1vZGU7XG4gICAgICBpc1N0cmljdE1vZGUgPSBjcmVhdGVGaWJlcigzLCBudWxsLCBudWxsLCB0YWcpO1xuICAgICAgY29udGFpbmVySW5mby5jdXJyZW50ID0gaXNTdHJpY3RNb2RlO1xuICAgICAgaXNTdHJpY3RNb2RlLnN0YXRlTm9kZSA9IGNvbnRhaW5lckluZm87XG4gICAgICB0YWcgPSBjcmVhdGVDYWNoZSgpO1xuICAgICAgcmV0YWluQ2FjaGUodGFnKTtcbiAgICAgIGNvbnRhaW5lckluZm8ucG9vbGVkQ2FjaGUgPSB0YWc7XG4gICAgICByZXRhaW5DYWNoZSh0YWcpO1xuICAgICAgaXNTdHJpY3RNb2RlLm1lbW9pemVkU3RhdGUgPSB7XG4gICAgICAgIGVsZW1lbnQ6IGluaXRpYWxDaGlsZHJlbixcbiAgICAgICAgaXNEZWh5ZHJhdGVkOiBoeWRyYXRlLFxuICAgICAgICBjYWNoZTogdGFnXG4gICAgICB9O1xuICAgICAgaW5pdGlhbGl6ZVVwZGF0ZVF1ZXVlKGlzU3RyaWN0TW9kZSk7XG4gICAgICByZXR1cm4gY29udGFpbmVySW5mbztcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0Q29udGV4dEZvclN1YnRyZWUocGFyZW50Q29tcG9uZW50KSB7XG4gICAgICBpZiAoIXBhcmVudENvbXBvbmVudCkgcmV0dXJuIGVtcHR5Q29udGV4dE9iamVjdDtcbiAgICAgIHBhcmVudENvbXBvbmVudCA9IGVtcHR5Q29udGV4dE9iamVjdDtcbiAgICAgIHJldHVybiBwYXJlbnRDb21wb25lbnQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVwZGF0ZUNvbnRhaW5lckltcGwoXG4gICAgICByb290RmliZXIsXG4gICAgICBsYW5lLFxuICAgICAgZWxlbWVudCxcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIHBhcmVudENvbXBvbmVudCxcbiAgICAgIGNhbGxiYWNrXG4gICAgKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGluamVjdGVkSG9vayAmJlxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBpbmplY3RlZEhvb2sub25TY2hlZHVsZUZpYmVyUm9vdFxuICAgICAgKVxuICAgICAgICB0cnkge1xuICAgICAgICAgIGluamVjdGVkSG9vay5vblNjaGVkdWxlRmliZXJSb290KHJlbmRlcmVySUQsIGNvbnRhaW5lciwgZWxlbWVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGhhc0xvZ2dlZEVycm9yIHx8XG4gICAgICAgICAgICAoKGhhc0xvZ2dlZEVycm9yID0gITApLFxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCJSZWFjdCBpbnN0cnVtZW50YXRpb24gZW5jb3VudGVyZWQgYW4gZXJyb3I6ICVvXCIsXG4gICAgICAgICAgICAgIGVyclxuICAgICAgICAgICAgKSk7XG4gICAgICAgIH1cbiAgICAgIHBhcmVudENvbXBvbmVudCA9IGdldENvbnRleHRGb3JTdWJ0cmVlKHBhcmVudENvbXBvbmVudCk7XG4gICAgICBudWxsID09PSBjb250YWluZXIuY29udGV4dFxuICAgICAgICA/IChjb250YWluZXIuY29udGV4dCA9IHBhcmVudENvbXBvbmVudClcbiAgICAgICAgOiAoY29udGFpbmVyLnBlbmRpbmdDb250ZXh0ID0gcGFyZW50Q29tcG9uZW50KTtcbiAgICAgIGlzUmVuZGVyaW5nICYmXG4gICAgICAgIG51bGwgIT09IGN1cnJlbnQgJiZcbiAgICAgICAgIWRpZFdhcm5BYm91dE5lc3RlZFVwZGF0ZXMgJiZcbiAgICAgICAgKChkaWRXYXJuQWJvdXROZXN0ZWRVcGRhdGVzID0gITApLFxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiUmVuZGVyIG1ldGhvZHMgc2hvdWxkIGJlIGEgcHVyZSBmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGU7IHRyaWdnZXJpbmcgbmVzdGVkIGNvbXBvbmVudCB1cGRhdGVzIGZyb20gcmVuZGVyIGlzIG5vdCBhbGxvd2VkLiBJZiBuZWNlc3NhcnksIHRyaWdnZXIgbmVzdGVkIHVwZGF0ZXMgaW4gY29tcG9uZW50RGlkVXBkYXRlLlxcblxcbkNoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mICVzLlwiLFxuICAgICAgICAgIGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoY3VycmVudCkgfHwgXCJVbmtub3duXCJcbiAgICAgICAgKSk7XG4gICAgICBjb250YWluZXIgPSBjcmVhdGVVcGRhdGUobGFuZSk7XG4gICAgICBjb250YWluZXIucGF5bG9hZCA9IHsgZWxlbWVudDogZWxlbWVudCB9O1xuICAgICAgY2FsbGJhY2sgPSB2b2lkIDAgPT09IGNhbGxiYWNrID8gbnVsbCA6IGNhbGxiYWNrO1xuICAgICAgbnVsbCAhPT0gY2FsbGJhY2sgJiZcbiAgICAgICAgKFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIGNhbGxiYWNrICYmXG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiRXhwZWN0ZWQgdGhlIGxhc3Qgb3B0aW9uYWwgYGNhbGxiYWNrYCBhcmd1bWVudCB0byBiZSBhIGZ1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy5cIixcbiAgICAgICAgICAgIGNhbGxiYWNrXG4gICAgICAgICAgKSxcbiAgICAgICAgKGNvbnRhaW5lci5jYWxsYmFjayA9IGNhbGxiYWNrKSk7XG4gICAgICBlbGVtZW50ID0gZW5xdWV1ZVVwZGF0ZShyb290RmliZXIsIGNvbnRhaW5lciwgbGFuZSk7XG4gICAgICBudWxsICE9PSBlbGVtZW50ICYmXG4gICAgICAgIChzdGFydFVwZGF0ZVRpbWVyQnlMYW5lKGxhbmUsIFwicm9vdC5yZW5kZXIoKVwiLCBudWxsKSxcbiAgICAgICAgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKGVsZW1lbnQsIHJvb3RGaWJlciwgbGFuZSksXG4gICAgICAgIGVudGFuZ2xlVHJhbnNpdGlvbnMoZWxlbWVudCwgcm9vdEZpYmVyLCBsYW5lKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1hcmtSZXRyeUxhbmVJbXBsKGZpYmVyLCByZXRyeUxhbmUpIHtcbiAgICAgIGZpYmVyID0gZmliZXIubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIGlmIChudWxsICE9PSBmaWJlciAmJiBudWxsICE9PSBmaWJlci5kZWh5ZHJhdGVkKSB7XG4gICAgICAgI
15852HZhciBhID0gZmliZXIucmV0cnlMYW5lO1xuICAgICAgICBmaWJlci5yZXRyeUxhbmUgPSAwICE9PSBhICYmIGEgPCByZXRyeUxhbmUgPyBhIDogcmV0cnlMYW5lO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBtYXJrUmV0cnlMYW5lSWZOb3RIeWRyYXRlZChmaWJlciwgcmV0cnlMYW5lKSB7XG4gICAgICBtYXJrUmV0cnlMYW5lSW1wbChmaWJlciwgcmV0cnlMYW5lKTtcbiAgICAgIChmaWJlciA9IGZpYmVyLmFsdGVybmF0ZSkgJiYgbWFya1JldHJ5TGFuZUltcGwoZmliZXIsIHJldHJ5TGFuZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uKGZpYmVyKSB7XG4gICAgICBpZiAoMTMgPT09IGZpYmVyLnRhZyB8fCAzMSA9PT0gZmliZXIudGFnKSB7XG4gICAgICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCA2NzEwODg2NCk7XG4gICAgICAgIG51bGwgIT09IHJvb3QgJiYgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHJvb3QsIGZpYmVyLCA2NzEwODg2NCk7XG4gICAgICAgIG1hcmtSZXRyeUxhbmVJZk5vdEh5ZHJhdGVkKGZpYmVyLCA2NzEwODg2NCk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGF0dGVtcHRIeWRyYXRpb25BdEN1cnJlbnRQcmlvcml0eShmaWJlcikge1xuICAgICAgaWYgKDEzID09PSBmaWJlci50YWcgfHwgMzEgPT09IGZpYmVyLnRhZykge1xuICAgICAgICB2YXIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGZpYmVyKTtcbiAgICAgICAgbGFuZSA9IGdldEJ1bXBlZExhbmVGb3JIeWRyYXRpb25CeUxhbmUobGFuZSk7XG4gICAgICAgIHZhciByb290ID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCBsYW5lKTtcbiAgICAgICAgbnVsbCAhPT0gcm9vdCAmJiBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIGxhbmUpO1xuICAgICAgICBtYXJrUmV0cnlMYW5lSWZOb3RIeWRyYXRlZChmaWJlciwgbGFuZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldEN1cnJlbnRGaWJlckZvckRldlRvb2xzKCkge1xuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRpc3BhdGNoRGlzY3JldGVFdmVudChcbiAgICAgIGRvbUV2ZW50TmFtZSxcbiAgICAgIGV2ZW50U3lzdGVtRmxhZ3MsXG4gICAgICBjb250YWluZXIsXG4gICAgICBuYXRpdmVFdmVudFxuICAgICkge1xuICAgICAgdmFyIHByZXZUcmFuc2l0aW9uID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuVDtcbiAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQgPSBudWxsO1xuICAgICAgdmFyIHByZXZpb3VzUHJpb3JpdHkgPSBSZWFjdERPTVNoYXJlZEludGVybmFscy5wO1xuICAgICAgdHJ5IHtcbiAgICAgICAgKFJlYWN0RE9NU2hhcmVkSW50ZXJuYWxzLnAgPSBEaXNjcmV0ZUV2ZW50UHJpb3JpdHkpLFxuICAgICAgICAgIGRpc3BhdGNoRXZlbnQoZG9tRXZlbnROYW1lLCBldmVudFN5c3RlbUZsYWdzLCBjb250YWluZXIsIG5hdGl2ZUV2ZW50KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIChSZWFjdERPTVNoYXJlZEludGVybmFscy5wID0gcHJldmlvdXNQcmlvcml0eSksXG4gICAgICAgICAgKFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQgPSBwcmV2VHJhbnNpdGlvbik7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRpc3BhdGNoQ29udGludW91c0V2ZW50KFxuICAgICAgZG9tRXZlbnROYW1lLFxuICAgICAgZXZlbnRTeXN0ZW1GbGFncyxcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIG5hdGl2ZUV2ZW50XG4gICAgKSB7XG4gICAgICB2Y
15852XIgcHJldlRyYW5zaXRpb24gPSBSZWFjdFNoYXJlZEludGVybmFscy5UO1xuICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuVCA9IG51bGw7XG4gICAgICB2YXIgcHJldmlvdXNQcmlvcml0eSA9IFJlYWN0RE9NU2hhcmVkSW50ZXJuYWxzLnA7XG4gICAgICB0cnkge1xuICAgICAgICAoUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucCA9IENvbnRpbnVvdXNFdmVudFByaW9yaXR5KSxcbiAgICAgICAgICBkaXNwYXRjaEV2ZW50KGRvbUV2ZW50TmFtZSwgZXZlbnRTeXN0ZW1GbGFncywgY29udGFpbmVyLCBuYXRpdmVFdmVudCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAoUmVhY3RET01TaGFyZWRJbnRlcm5hbHMucCA9IHByZXZpb3VzUHJpb3JpdHkpLFxuICAgICAgICAgIChSZWFjdFNoYXJlZEludGVybmFscy5UID0gcHJldlRyYW5zaXRpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBkaXNwYXRjaEV2ZW50KFxuICAgICAgZG9tRXZlbnROYW1lLFxuICAgICAgZXZlbnRTeXN0ZW1GbGFncyxcbiAgICAgIHRhcmdldENvbnRhaW5lcixcbiAgICAgIG5hdGl2ZUV2ZW50XG4gICAgKSB7XG4gICAgICBpZiAoX2VuYWJsZWQpIHtcbiAgICAgICAgdmFyIGJsb2NrZWRPbiA9IGZpbmRJbnN0YW5jZUJsb2NraW5nRXZlbnQobmF0aXZlRXZlbnQpO1xuICAgICAgICBpZiAobnVsbCA9PT0gYmxvY2tlZE9uKVxuICAgICAgICAgIGRpc3BhdGNoRXZlbnRGb3JQbHVnaW5FdmVudFN5c3RlbShcbiAgICAgICAgICAgIGRvbUV2ZW50TmFtZSxcbiAgICAgICAgICAgIGV2ZW50U3lzdGVtRmxhZ3MsXG4gICAgICAgICAgICBuYXRpdmVFdmVudCxcbiAgICAgICAgICAgIHJldHVybl90YXJnZXRJbnN0LFxuICAgICAgICAgICAgdGFyZ2V0Q29udGFpbmVyXG4gICAgICAgICAgKSxcbiAgICAgICAgICAgIGNsZWFySWZDb250aW51b3VzRXZlbnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCk7XG4gICAgICAgIGVsc2UgaWYgKFxuICAgICAgICAgIHF1ZXVlSWZDb250aW51b3VzRXZlbnQoXG4gICAgICAgICAgICBibG9ja2VkT24sXG4gICAgICAgICAgICBkb21FdmVudE5hbWUsXG4gICAgICAgICAgICBldmVudFN5c3RlbUZsYWdzLFxuICAgICAgICAgICAgdGFyZ2V0Q29udGFpbmVyLFxuICAgICAgICAgICAgbmF0aXZlRXZlbnRcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgICBuYXRpdmVFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgKGNsZWFySWZDb250aW51b3VzRXZlbnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCksXG4gICAgICAgICAgZXZlbnRTeXN0ZW1GbGFncyAmIDQgJiZcbiAgICAgICAgICAgIC0xIDwgZGlzY3JldGVSZXBsYXlhYmxlRXZlbnRzLmluZGV4T2YoZG9tRXZlbnROYW1lKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgZm9yICg7IG51bGwgIT09IGJsb2NrZWRPbjsgKSB7XG4gICAgICAgICAgICB2Y
15852XIgZmliZXIgPSBnZXRJbnN0YW5jZUZyb21Ob2RlKGJsb2NrZWRPbik7XG4gICAgICAgICAgICBpZiAobnVsbCAhPT0gZmliZXIpXG4gICAgICAgICAgICAgIHN3aXRjaCAoZmliZXIudGFnKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgZmliZXIgPSBmaWJlci5zdGF0ZU5vZGU7XG4gICAgICAgICAgICAgICAgICBpZiAoZmliZXIuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbGFuZXMgPSBnZXRIaWdoZXN0UHJpb3JpdHlMYW5lcyhmaWJlci5wZW5kaW5nTGFuZXMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoMCAhPT0gbGFuZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICB2YXIgcm9vdCA9IGZpYmVyO1xuICAgICAgICAgICAgICAgICAgICAgIHJvb3QucGVuZGluZ0xhbmVzIHw9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgZm9yIChyb290LmVudGFuZ2xlZExhbmVzIHw9IDI7IGxhbmVzOyApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsYW5lID0gMSA8PCAoMzEgLSBjbHozMihsYW5lcykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcm9vdC5lbnRhbmdsZW1lbnRzWzFdIHw9IGxhbmU7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYW5lcyAmPSB+bGFuZTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKGZpYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAoZXhlY3V0aW9uQ29udGV4dCAmIChSZW5kZXJDb250ZXh0IHwgQ29tbWl0Q29udGV4dCkpID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgTm9Db250ZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAoKHdvcmtJblByb2dyZXNzUm9vdFJlbmRlclRhcmdldFRpbWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICBub3ckMSgpICsgUkVOREVSX1RJTUVPVVRfTVMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hTeW5jV29ya0Fjcm9zc1Jvb3RzX2ltcGwoMCwgITEpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzMTpcbiAgICAgICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgICAgICAgKHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIDIpKSxcbiAgICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gcm9vdCAmJiBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIDIpLFxuICAgICAgICAgICAgICAgICAgICBmbHVzaFN5bmNXb3JrJDEoKSxcbiAgICAgICAgICAgICAgICAgICAgbWFya1JldHJ5TGFuZUlmTm90SHlkcmF0ZWQoZmliZXIsIDIpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBmaWJlciA9IGZpbmRJbnN0YW5jZUJsb2NraW5nRXZlbnQobmF0aXZlRXZlbnQpO1xuICAgICAgICAgICAgbnVsbCA9PT0gZmliZXIgJiZcbiAgICAgICAgICAgICAgZGlzcGF0Y2hFdmVudEZvclBsdWdpbkV2ZW50U3lzdGVtKFxuICAgICAgICAgICAgICAgIGRvbUV2ZW50TmFtZSxcbiAgICAgICAgICAgICAgICBldmVudFN5c3RlbUZsYWdzLFxuICAgICAgICAgICAgICAgIG5hdGl2ZUV2ZW50LFxuICAgICAgICAgICAgICAgIHJldHVybl90YXJnZXRJbnN0LFxuICAgICAgICAgICAgICAgIHRhcmdldENvbnRhaW5lclxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGZpYmVyID09PSBibG9ja2VkT24pIGJyZWFrO1xuICAgICAgICAgICAgYmxvY2tlZE9uID0gZmliZXI7XG4gICAgICAgICAgfVxuICAgICAgICAgIG51bGwgIT09IGJsb2NrZWRPbiAmJiBuYXRpdmVFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgZGlzcGF0Y2hFdmVudEZvclBsdWdpbkV2ZW50U3lzdGVtKFxuICAgICAgICAgICAgZG9tRXZlbnROYW1lLFxuICAgICAgICAgICAgZXZlbnRTeXN0ZW1GbGFncyxcbiAgICAgICAgICAgIG5hdGl2ZUV2ZW50LFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIHRhcmdldENvbnRhaW5lclxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZpbmRJbnN0YW5jZUJsb2NraW5nRXZlbnQobmF0aXZlRXZlbnQpIHtcbiAgICAgIG5hdGl2ZUV2ZW50ID0gZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpO1xuICAgICAgcmV0dXJuIGZpbmRJbnN0YW5jZUJsb2NraW5nVGFyZ2V0KG5hdGl2ZUV2ZW50KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZmluZEluc3RhbmNlQmxvY2tpbmdUYXJnZXQodGFyZ2V0Tm9kZSkge1xuICAgICAgcmV0dXJuX3RhcmdldEluc3QgPSBudWxsO1xuICAgICAgdGFyZ2V0Tm9kZSA9IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKHRhcmdldE5vZGUpO1xuICAgICAgaWYgKG51bGwgIT09IHRhcmdldE5vZGUpIHtcbiAgICAgICAgdmFyIG5lYXJlc3RNb3VudGVkID0gZ2V0TmVhcmVzdE1vdW50ZWRGaWJlcih0YXJnZXROb2RlKTtcbiAgICAgICAgaWYgKG51bGwgPT09IG5lYXJlc3RNb3VudGVkKSB0YXJnZXROb2RlID0gbnVsbDtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdmFyIHRhZyA9IG5lYXJlc3RNb3VudGVkLnRhZztcbiAgICAgICAgICBpZiAoMTMgPT09IHRhZykge1xuICAgICAgICAgICAgdGFyZ2V0Tm9kZSA9IGdldFN1c3BlbnNlSW5zdGFuY2VGcm9tRmliZXIobmVhcmVzdE1vdW50ZWQpO1xuICAgICAgICAgICAgaWYgKG51bGwgIT09IHRhcmdldE5vZGUpIHJldHVybiB0YXJnZXROb2RlO1xuICAgICAgICAgICAgdGFyZ2V0Tm9kZSA9IG51bGw7XG4gICAgICAgICAgfSBlbHNlIGlmICgzMSA9PT0gdGFnKSB7XG4gICAgICAgICAgICB0YXJnZXROb2RlID0gZ2V0QWN0aXZpdHlJbnN0YW5jZUZyb21GaWJlcihuZWFyZXN0TW91bnRlZCk7XG4gICAgICAgICAgICBpZiAobnVsbCAhPT0gdGFyZ2V0Tm9kZSkgcmV0dXJuIHRhcmdldE5vZGU7XG4gICAgICAgICAgICB0YXJnZXROb2RlID0gbnVsbDtcbiAgICAgICAgICB9IGVsc2UgaWYgKDMgPT09IHRhZykge1xuICAgICAgICAgICAgaWYgKG5lYXJlc3RNb3VudGVkLnN0YXRlTm9kZS5jdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkKVxuICAgICAgICAgICAgICByZXR1cm4gMyA9PT0gbmVhcmVzdE1vdW50ZWQudGFnXG4gICAgICAgICAgICAgICAgPyBuZWFyZXN0TW91bnRlZC5zdGF0ZU5vZGUuY29udGFpbmVySW5mb1xuICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgI
15852HRhcmdldE5vZGUgPSBudWxsO1xuICAgICAgICAgIH0gZWxzZSBuZWFyZXN0TW91bnRlZCAhPT0gdGFyZ2V0Tm9kZSAmJiAodGFyZ2V0Tm9kZSA9IG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm5fdGFyZ2V0SW5zdCA9IHRhcmdldE5vZGU7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0RXZlbnRQcmlvcml0eShkb21FdmVudE5hbWUpIHtcbiAgICAgIHN3aXRjaCAoZG9tRXZlbnROYW1lKSB7XG4gICAgICAgIGNhc2UgXCJiZWZvcmV0b2dnbGVcIjpcbiAgICAgICAgY2FzZSBcImNhbmNlbFwiOlxuICAgICAgICBjYXNlIFwiY2xpY2tcIjpcbiAgICAgICAgY2FzZSBcImNsb3NlXCI6XG4gICAgICAgIGNhc2UgXCJjb250ZXh0bWVudVwiOlxuICAgICAgICBjYXNlIFwiY29weVwiOlxuICAgICAgICBjYXNlIFwiY3V0XCI6XG4gICAgICAgIGNhc2UgXCJhdXhjbGlja1wiOlxuICAgICAgICBjYXNlIFwiZGJsY2xpY2tcIjpcbiAgICAgICAgY2FzZSBcImRyYWdlbmRcIjpcbiAgICAgICAgY2FzZSBcImRyYWdzdGFydFwiOlxuICAgICAgICBjYXNlIFwiZHJvcFwiOlxuICAgICAgICBjYXNlIFwiZm9jdXNpblwiOlxuICAgICAgICBjYXNlIFwiZm9jdXNvdXRcIjpcbiAgICAgICAgY2FzZSBcImlucHV0XCI6XG4gICAgICAgIGNhc2UgXCJpbnZhbGlkXCI6XG4gICAgICAgIGNhc2UgXCJrZXlkb3duXCI6XG4gICAgICAgIGNhc2UgXCJrZXlwcmVzc1wiOlxuICAgICAgICBjYXNlIFwia2V5dXBcIjpcbiAgICAgICAgY2FzZSBcIm1vdXNlZG93blwiOlxuICAgICAgICBjYXNlIFwibW91c2V1cFwiOlxuICAgICAgICBjYXNlIFwicGFzdGVcIjpcbiAgICAgICAgY2FzZSBcInBhdXNlXCI6XG4gICAgICAgIGNhc2UgXCJwbGF5XCI6XG4gICAgICAgIGNhc2UgXCJwb2ludGVyY2FuY2VsXCI6XG4gICAgICAgIGNhc2UgXCJwb2ludGVyZG93blwiOlxuICAgICAgICBjYXNlIFwicG9pbnRlcnVwXCI6XG4gICAgICAgIGNhc2UgXCJyYXRlY2hhbmdlXCI6XG4gICAgICAgIGNhc2UgXCJyZXNldFwiOlxuICAgICAgICBjYXNlIFwic2Vla2VkXCI6XG4gICAgICAgIGNhc2UgXCJzdWJtaXRcIjpcbiAgICAgICAgY2FzZSBcInRvZ2dsZVwiOlxuICAgICAgICBjYXNlIFwidG91Y2hjYW5jZWxcIjpcbiAgICAgICAgY2FzZSBcInRvdWNoZW5kXCI6XG4gICAgICAgIGNhc2UgXCJ0b3VjaHN0YXJ0XCI6XG4gICAgICAgIGNhc2UgXCJ2b2x1bWVjaGFuZ2VcIjpcbiAgICAgICAgY2FzZSBcImNoYW5nZVwiOlxuICAgICAgICBjYXNlIFwic2VsZWN0aW9uY2hhbmdlXCI6XG4gICAgICAgIGNhc2UgXCJ0ZXh0SW5wdXRcIjpcbiAgICAgICAgY2FzZSBcImNvbXBvc2l0aW9uc3RhcnRcIjpcbiAgICAgICAgY2FzZSBcImNvbXBvc2l0aW9uZW5kXCI6XG4gICAgICAgIGNhc2UgXCJjb21wb3NpdGlvbnVwZGF0ZVwiOlxuICAgICAgICBjYXNlIFwiYmVmb3JlYmx1clwiOlxuICAgICAgICBjYXNlIFwiYWZ0ZXJibHVyXCI6XG4gICAgICAgIGNhc2UgXCJiZWZvcmVpbnB1dFwiOlxuICAgICAgICBjYXNlIFwiYmx1clwiOlxuICAgICAgICBjYXNlIFwiZnVsbHNjcmVlbmNoYW5nZVwiOlxuICAgICAgICBjYXNlIFwiZnVsbHNjcmVlbmVycm9yXCI6XG4gICAgICAgIGNhc2UgXCJmb2N1c1wiOlxuICAgICAgICBjYXNlIFwiaGFzaGNoYW5nZVwiOlxuICAgICAgICBjYXNlIFwicG9wc3RhdGVcIjpcbiAgICAgICAgY2FzZSBcInNlbGVjdFwiOlxuICAgICAgICBjYXNlIFwic2VsZWN0c3RhcnRcIjpcbiAgICAgICAgICByZXR1cm4gRGlzY3JldGVFdmVudFByaW9yaXR5O1xuICAgICAgICBjYXNlIFwiZHJhZ1wiOlxuICAgICAgICBjYXNlIFwiZHJhZ2VudGVyXCI6XG4gICAgICAgIGNhc2UgXCJkcmFnZXhpdFwiOlxuICAgICAgICBjYXNlIFwiZHJhZ2xlYXZlXCI6XG4gICAgICAgIGNhc2UgXCJkcmFnb3ZlclwiOlxuICAgICAgICBjYXNlIFwibW91c2Vtb3ZlXCI6XG4gICAgICAgIGNhc2UgXCJtb3VzZW91dFwiOlxuICAgICAgICBjYXNlIFwibW91c2VvdmVyXCI6XG4gICAgICAgIGNhc2UgXCJwb2ludGVybW92ZVwiOlxuICAgICAgICBjYXNlIFwicG9pbnRlcm91dFwiOlxuICAgICAgICBjYXNlIFwicG9pbnRlcm92ZXJcIjpcbiAgICAgICAgY2FzZSBcInJlc2l6ZVwiOlxuICAgICAgICBjYXNlIFwic2Nyb2xsXCI6XG4gICAgICAgIGNhc2UgXCJ0b3VjaG1vdmVcIjpcbiAgICAgICAgY2FzZSBcIndoZWVsXCI6XG4gICAgICAgIGNhc2UgXCJtb3VzZWVudGVyXCI6XG4gICAgICAgIGNhc2UgXCJtb3VzZWxlYXZlXCI6XG4gICAgICAgIGNhc2UgXCJwb2ludGVyZW50ZXJcIjpcbiAgICAgICAgY2FzZSBcInBvaW50ZXJsZWF2ZVwiOlxuICAgICAgICAgIHJldHVybiBDb250aW51b3VzRXZlbnRQcmlvcml0eTtcbiAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICBzd2l0Y2ggKGdldEN1cnJlbnRQcmlvcml0eUxldmVsKCkpIHtcbiAgICAgICAgICAgIGNhc2UgSW1tZWRpYXRlUHJpb3JpdHk6XG4gICAgICAgICAgICAgIHJldHVybiBEaXNjcmV0ZUV2ZW50UHJpb3JpdHk7XG4gICAgICAgICAgICBjYXNlIFVzZXJCbG9ja2luZ1ByaW9yaXR5OlxuICAgICAgICAgICAgICByZXR1cm4gQ29udGludW91c0V2ZW50UHJpb3JpdHk7XG4gICAgICAgICAgICBjYXNlIE5vcm1hbFByaW9yaXR5JDE6XG4gICAgICAgICAgICBjYXNlIExvd1ByaW9yaXR5OlxuICAgICAgICAgICAgICByZXR1cm4gRGVmYXVsdEV2ZW50UHJpb3JpdHk7XG4gICAgICAgICAgICBjYXNlIElkbGVQcmlvcml0eTpcbiAgICAgICAgICAgICAgcmV0dXJuIElkbGVFdmVudFByaW9yaXR5O1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgcmV0dXJuIERlZmF1bHRFdmVudFByaW9yaXR5O1xuICAgICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gRGVmYXVsdEV2ZW50UHJpb3JpdHk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNsZWFySWZDb250aW51b3VzRXZlbnQoZG9tRXZlbnROYW1lLCBuYXRpdmVFdmVudCkge1xuICAgICAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICAgICAgY2FzZSBcImZvY3VzaW5cIjpcbiAgICAgICAgY2FzZSBcImZvY3Vzb3V0XCI6XG4gICAgICAgICAgcXVldWVkRm9jdXMgPSBudWxsO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZHJhZ2VudGVyXCI6XG4gICAgICAgIGNhc2UgXCJkcmFnbGVhdmVcIjpcbiAgICAgICAgICBxdWV1ZWREcmFnID0gbnVsbDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIm1vdXNlb3ZlclwiOlxuICAgICAgICBjYXNlIFwibW91c2VvdXRcIjpcbiAgICAgICAgICBxdWV1ZWRNb3VzZSA9IG51bGw7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJwb2ludGVyb3ZlclwiOlxuICAgICAgICBjYXNlIFwicG9pbnRlcm91dFwiOlxuICAgICAgICAgI
15852HF1ZXVlZFBvaW50ZXJzLmRlbGV0ZShuYXRpdmVFdmVudC5wb2ludGVySWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZ290cG9pbnRlcmNhcHR1cmVcIjpcbiAgICAgICAgY2FzZSBcImxvc3Rwb2ludGVyY2FwdHVyZVwiOlxuICAgICAgICAgIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5kZWxldGUobmF0aXZlRXZlbnQucG9pbnRlcklkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChcbiAgICAgIGV4aXN0aW5nUXVldWVkRXZlbnQsXG4gICAgICBibG9ja2VkT24sXG4gICAgICBkb21FdmVudE5hbWUsXG4gICAgICBldmVudFN5c3RlbUZsYWdzLFxuICAgICAgdGFyZ2V0Q29udGFpbmVyLFxuICAgICAgbmF0aXZlRXZlbnRcbiAgICApIHtcbiAgICAgIGlmIChcbiAgICAgICAgbnVsbCA9PT0gZXhpc3RpbmdRdWV1ZWRFdmVudCB8fFxuICAgICAgICBleGlzdGluZ1F1ZXVlZEV2ZW50Lm5hdGl2ZUV2ZW50ICE9PSBuYXRpdmVFdmVudFxuICAgICAgKVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIChleGlzdGluZ1F1ZXVlZEV2ZW50ID0ge1xuICAgICAgICAgICAgYmxvY2tlZE9uOiBibG9ja2VkT24sXG4gICAgICAgICAgICBkb21FdmVudE5hbWU6IGRvbUV2ZW50TmFtZSxcbiAgICAgICAgICAgIGV2ZW50U3lzdGVtRmxhZ3M6IGV2ZW50U3lzdGVtRmxhZ3MsXG4gICAgICAgICAgICBuYXRpdmVFdmVudDogbmF0aXZlRXZlbnQsXG4gICAgICAgICAgICB0YXJnZXRDb250YWluZXJzOiBbdGFyZ2V0Q29udGFpbmVyXVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIG51bGwgIT09IGJsb2NrZWRPbiAmJlxuICAgICAgICAgICAgKChibG9ja2VkT24gPSBnZXRJbnN0YW5jZUZyb21Ob2RlKGJsb2NrZWRPbikpLFxuICAgICAgICAgICAgbnVsbCAhPT0gYmxvY2tlZE9uICYmIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uKGJsb2NrZWRPbikpLFxuICAgICAgICAgIGV4aXN0aW5nUXVldWVkRXZlbnRcbiAgICAgICAgKTtcbiAgICAgIGV4aXN0aW5nUXVldWVkRXZlbnQuZXZlbnRTeXN0ZW1GbGFncyB8PSBldmVudFN5c3RlbUZsYWdzO1xuICAgICAgYmxvY2tlZE9uID0gZXhpc3RpbmdRdWV1ZWRFdmVudC50YXJnZXRDb250YWluZXJzO1xuICAgICAgbnVsbCAhPT0gdGFyZ2V0Q29udGFpbmVyICYmXG4gICAgICAgIC0xID09PSBibG9ja2VkT24uaW5kZXhPZih0YXJnZXRDb250YWluZXIpICYmXG4gICAgICAgIGJsb2NrZWRPbi5wdXNoKHRhcmdldENvbnRhaW5lcik7XG4gICAgICByZXR1cm4gZXhpc3RpbmdRdWV1ZWRFdmVudDtcbiAgICB9XG4gICAgZnVuY3Rpb24gcXVldWVJZkNvbnRpbnVvdXNFdmVudChcbiAgICAgIGJsb2NrZWRPbixcbiAgICAgIGRvbUV2ZW50TmFtZSxcbiAgICAgIGV2ZW50U3lzdGVtRmxhZ3MsXG4gICAgICB0YXJnZXRDb250YWluZXIsXG4gICAgICBuYXRpdmVFdmVudFxuICAgICkge1xuICAgICAgc3dpdGNoIChkb21FdmVudE5hbWUpIHtcbiAgICAgICAgY2FzZSBcImZvY3VzaW5cIjpcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgKHF1ZXVlZEZvY3VzID0gYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChcbiAgICAgICAgICAgICAgcXVldWVkRm9jdXMsXG4gICAgICAgICAgICAgIGJsb2NrZWRPbixcbiAgICAgICAgICAgICAgZG9tRXZlbnROYW1lLFxuICAgICAgICAgICAgICBldmVudFN5c3RlbUZsYWdzLFxuICAgICAgICAgICAgICB0YXJnZXRDb250YWluZXIsXG4gICAgICAgICAgICAgIG5hdGl2ZUV2ZW50XG4gICAgICAgICAgICApKSxcbiAgICAgICAgICAgICEwXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSBcImRyYWdlbnRlclwiOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAocXVldWVkRHJhZyA9IGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoXG4gICAgICAgICAgICAgIHF1ZXVlZERyYWcsXG4gICAgICAgICAgICAgIGJsb2NrZWRPbixcbiAgICAgICAgICAgICAgZG9tRXZlbnROYW1lLFxuICAgICAgICAgICAgICBldmVudFN5c3RlbUZsYWdzLFxuICAgICAgICAgICAgICB0YXJnZXRDb250YWluZXIsXG4gICAgICAgICAgICAgIG5hdGl2ZUV2ZW50XG4gICAgICAgICAgICApKSxcbiAgICAgICAgICAgICEwXG4gICAgICAgICAgKTtcbiAgICAgICAgY2FzZSBcIm1vdXNlb3ZlclwiOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAocXVldWVkTW91c2UgPSBhY2N1bXVsYXRlT3JDcmVhdGVDb250aW51b3VzUXVldWVkUmVwbGF5YWJsZUV2ZW50KFxuICAgICAgICAgICAgICBxdWV1ZWRNb3VzZSxcbiAgICAgICAgICAgICAgYmxvY2tlZE9uLFxuICAgICAgICAgICAgICBkb21FdmVudE5hbWUsXG4gICAgICAgICAgICAgIGV2ZW50U3lzdGVtRmxhZ3MsXG4gICAgICAgICAgICAgIHRhcmdldENvbnRhaW5lcixcbiAgICAgICAgICAgICAgbmF0aXZlRXZlbnRcbiAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgITBcbiAgICAgICAgICApO1xuICAgICAgICBjYXNlIFwicG9pbnRlcm92ZXJcIjpcbiAgICAgICAgICB2Y
15852XIgcG9pbnRlcklkID0gbmF0aXZlRXZlbnQucG9pbnRlcklkO1xuICAgICAgICAgIHF1ZXVlZFBvaW50ZXJzLnNldChcbiAgICAgICAgICAgIHBvaW50ZXJJZCxcbiAgICAgICAgICAgIGFjY3VtdWxhdGVPckNyZWF0ZUNvbnRpbnVvdXNRdWV1ZWRSZXBsYXlhYmxlRXZlbnQoXG4gICAgICAgICAgICAgIHF1ZXVlZFBvaW50ZXJzLmdldChwb2ludGVySWQpIHx8IG51bGwsXG4gICAgICAgICAgICAgIGJsb2NrZWRPbixcbiAgICAgICAgICAgICAgZG9tRXZlbnROYW1lLFxuICAgICAgICAgICAgICBldmVudFN5c3RlbUZsYWdzLFxuICAgICAgICAgICAgICB0YXJnZXRDb250YWluZXIsXG4gICAgICAgICAgICAgIG5hdGl2ZUV2ZW50XG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgIGNhc2UgXCJnb3Rwb2ludGVyY2FwdHVyZVwiOlxuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAocG9pbnRlcklkID0gbmF0aXZlRXZlbnQucG9pbnRlcklkKSxcbiAgICAgICAgICAgIHF1ZXVlZFBvaW50ZXJDYXB0dXJlcy5zZXQoXG4gICAgICAgICAgICAgIHBvaW50ZXJJZCxcbiAgICAgICAgICAgICAgYWNjdW11bGF0ZU9yQ3JlYXRlQ29udGludW91c1F1ZXVlZFJlcGxheWFibGVFdmVudChcbiAgICAgICAgICAgICAgICBxdWV1ZWRQb2ludGVyQ2FwdHVyZXMuZ2V0KHBvaW50ZXJJZCkgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICBibG9ja2VkT24sXG4gICAgICAgICAgICAgICAgZG9tRXZlbnROYW1lLFxuICAgICAgICAgICAgICAgIGV2ZW50U3lzdGVtRmxhZ3MsXG4gICAgICAgICAgICAgICAgdGFyZ2V0Q29udGFpbmVyLFxuICAgICAgICAgICAgICAgIG5hdGl2ZUV2ZW50XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICAhMFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gITE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGF0dGVtcHRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldChxdWV1ZWRUYXJnZXQpIHtcbiAgICAgIHZhciB0YXJnZXRJbnN0ID0gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUocXVldWVkVGFyZ2V0LnRhcmdldCk7XG4gICAgICBpZiAobnVsbCAhPT0gdGFyZ2V0SW5zdCkge1xuICAgICAgICB2Y
15852XIgbmVhcmVzdE1vdW50ZWQgPSBnZXROZWFyZXN0TW91bnRlZEZpYmVyKHRhcmdldEluc3QpO1xuICAgICAgICBpZiAobnVsbCAhPT0gbmVhcmVzdE1vdW50ZWQpXG4gICAgICAgICAgaWYgKCgodGFyZ2V0SW5zdCA9IG5lYXJlc3RNb3VudGVkLnRhZyksIDEzID09PSB0YXJnZXRJbnN0KSkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAoKHRhcmdldEluc3QgPSBnZXRTdXNwZW5zZUluc3RhbmNlRnJvbUZpYmVyKG5lYXJlc3RNb3VudGVkKSksXG4gICAgICAgICAgICAgIG51bGwgIT09IHRhcmdldEluc3QpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcXVldWVkVGFyZ2V0LmJsb2NrZWRPbiA9IHRhcmdldEluc3Q7XG4gICAgICAgICAgICAgIHJ1bldpdGhQcmlvcml0eShxdWV1ZWRUYXJnZXQucHJpb3JpdHksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBhdHRlbXB0SHlkcmF0aW9uQXRDdXJyZW50UHJpb3JpdHkobmVhcmVzdE1vdW50ZWQpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoMzEgPT09IHRhcmdldEluc3QpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgKCh0YXJnZXRJbnN0ID0gZ2V0QWN0aXZpdHlJbnN0YW5jZUZyb21GaWJlcihuZWFyZXN0TW91bnRlZCkpLFxuICAgICAgICAgICAgICBudWxsICE9PSB0YXJnZXRJbnN0KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSB0YXJnZXRJbnN0O1xuICAgICAgICAgICAgICBydW5XaXRoUHJpb3JpdHkocXVldWVkVGFyZ2V0LnByaW9yaXR5LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgYXR0ZW1wdEh5ZHJhdGlvbkF0Q3VycmVudFByaW9yaXR5KG5lYXJlc3RNb3VudGVkKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgMyA9PT0gdGFyZ2V0SW5zdCAmJlxuICAgICAgICAgICAgbmVhcmVzdE1vdW50ZWQuc3RhdGVOb2RlLmN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPVxuICAgICAgICAgICAgICAzID09PSBuZWFyZXN0TW91bnRlZC50YWdcbiAgICAgICAgICAgICAgICA/IG5lYXJlc3RNb3VudGVkLnN0YXRlTm9kZS5jb250YWluZXJJbmZvXG4gICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50KHF1ZXVlZEV2ZW50KSB7XG4gICAgICBpZiAobnVsbCAhPT0gcXVldWVkRXZlbnQuYmxvY2tlZE9uKSByZXR1cm4gITE7XG4gICAgICBmb3IgKFxuICAgICAgICB2Y
15852XIgdGFyZ2V0Q29udGFpbmVycyA9IHF1ZXVlZEV2ZW50LnRhcmdldENvbnRhaW5lcnM7XG4gICAgICAgIDAgPCB0YXJnZXRDb250YWluZXJzLmxlbmd0aDtcblxuICAgICAgKSB7XG4gICAgICAgIHZhciBuZXh0QmxvY2tlZE9uID0gZmluZEluc3RhbmNlQmxvY2tpbmdFdmVudChxdWV1ZWRFdmVudC5uYXRpdmVFdmVudCk7XG4gICAgICAgIGlmIChudWxsID09PSBuZXh0QmxvY2tlZE9uKSB7XG4gICAgICAgICAgbmV4dEJsb2NrZWRPbiA9IHF1ZXVlZEV2ZW50Lm5hdGl2ZUV2ZW50O1xuICAgICAgICAgIHZhciBuYXRpdmVFdmVudENsb25lID0gbmV3IG5leHRCbG9ja2VkT24uY29uc3RydWN0b3IoXG4gICAgICAgICAgICAgIG5leHRCbG9ja2VkT24udHlwZSxcbiAgICAgICAgICAgICAgbmV4dEJsb2NrZWRPblxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGV2ZW50ID0gbmF0aXZlRXZlbnRDbG9uZTtcbiAgICAgICAgICBudWxsICE9PSBjdXJyZW50UmVwbGF5aW5nRXZlbnQgJiZcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIFwiRXhwZWN0ZWQgY3VycmVudGx5IHJlcGxheWluZyBldmVudCB0byBiZSBudWxsLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGN1cnJlbnRSZXBsYXlpbmdFdmVudCA9IGV2ZW50O1xuICAgICAgICAgIG5leHRCbG9ja2VkT24udGFyZ2V0LmRpc3BhdGNoRXZlbnQobmF0aXZlRXZlbnRDbG9uZSk7XG4gICAgICAgICAgbnVsbCA9PT0gY3VycmVudFJlcGxheWluZ0V2ZW50ICYmXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIkV4cGVjdGVkIGN1cnJlbnRseSByZXBsYXlpbmcgZXZlbnQgdG8gbm90IGJlIG51bGwuIFRoaXMgZXJyb3IgaXMgbGlrZWx5IGNhdXNlZCBieSBhIGJ1ZyBpbiBSZWFjdC4gUGxlYXNlIGZpbGUgYW4gaXNzdWUuXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY3VycmVudFJlcGxheWluZ0V2ZW50ID0gbnVsbDtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICh0YXJnZXRDb250YWluZXJzID0gZ2V0SW5zdGFuY2VGcm9tTm9kZShuZXh0QmxvY2tlZE9uKSksXG4gICAgICAgICAgICBudWxsICE9PSB0YXJnZXRDb250YWluZXJzICYmXG4gICAgICAgICAgICAgIGF0dGVtcHRDb250aW51b3VzSHlkcmF0aW9uKHRhcmdldENvbnRhaW5lcnMpLFxuICAgICAgICAgICAgKHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9IG5leHRCbG9ja2VkT24pLFxuICAgICAgICAgICAgITFcbiAgICAgICAgICApO1xuICAgICAgICB0YXJnZXRDb250YWluZXJzLnNoaWZ0KCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gITA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnRJbk1hcChxdWV1ZWRFdmVudCwga2V5LCBtYXApIHtcbiAgICAgIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnQocXVldWVkRXZlbnQpICYmIG1hcC5kZWxldGUoa2V5KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVwbGF5VW5ibG9ja2VkRXZlbnRzKCkge1xuICAgICAgaGFzU2NoZWR1bGVkUmVwbGF5QXR0ZW1wdCA9ICExO1xuICAgICAgbnVsbCAhPT0gcXVldWVkRm9jdXMgJiZcbiAgICAgICAgYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudChxdWV1ZWRGb2N1cykgJiZcbiAgICAgICAgKHF1ZXVlZEZvY3VzID0gbnVsbCk7XG4gICAgICBudWxsICE9PSBxdWV1ZWREcmFnICYmXG4gICAgICAgIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnQocXVldWVkRHJhZykgJiZcbiAgICAgICAgKHF1ZXVlZERyYWcgPSBudWxsKTtcbiAgICAgIG51bGwgIT09IHF1ZXVlZE1vdXNlICYmXG4gICAgICAgIGF0dGVtcHRSZXBsYXlDb250aW51b3VzUXVldWVkRXZlbnQocXVldWVkTW91c2UpICYmXG4gICAgICAgIChxdWV1ZWRNb3VzZSA9IG51bGwpO1xuICAgICAgcXVldWVkUG9pbnRlcnMuZm9yRWFjaChhdHRlbXB0UmVwbGF5Q29udGludW91c1F1ZXVlZEV2ZW50SW5NYXApO1xuICAgICAgcXVldWVkUG9pbnRlckNhcHR1cmVzLmZvckVhY2goYXR0ZW1wdFJlcGxheUNvbnRpbnVvdXNRdWV1ZWRFdmVudEluTWFwKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZEV2ZW50LCB1bmJsb2NrZWQpIHtcbiAgICAgIHF1ZXVlZEV2ZW50LmJsb2NrZWRPbiA9PT0gdW5ibG9ja2VkICYmXG4gICAgICAgICgocXVldWVkRXZlbnQuYmxvY2tlZE9uID0gbnVsbCksXG4gICAgICAgIGhhc1NjaGVkdWxlZFJlcGxheUF0dGVtcHQgfHxcbiAgICAgICAgICAoKGhhc1NjaGVkdWxlZFJlcGxheUF0dGVtcHQgPSAhMCksXG4gICAgICAgICAgU2NoZWR1bGVyLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2soXG4gICAgICAgICAgICBTY2hlZHVsZXIudW5zdGFibGVfTm9ybWFsUHJpb3JpdHksXG4gICAgICAgICAgICByZXBsYXlVbmJsb2NrZWRFdmVudHNcbiAgICAgICAgICApKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNjaGVkdWxlUmVwbGF5UXVldWVJZk5lZWRlZChmb3JtUmVwbGF5aW5nUXVldWUpIHtcbiAgICAgIGxhc3RTY2hlZHVsZWRSZXBsYXlRdWV1ZSAhPT0gZm9ybVJlcGxheWluZ1F1ZXVlICYmXG4gICAgICAgICgobGFzdFNjaGVkdWxlZFJlcGxheVF1ZXVlID0gZm9ybVJlcGxheWluZ1F1ZXVlKSxcbiAgICAgICAgU2NoZWR1bGVyLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2soXG4gICAgICAgICAgU2NoZWR1bGVyLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LFxuICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxhc3RTY2hlZHVsZWRSZXBsYXlRdWV1ZSA9PT0gZm9ybVJlcGxheWluZ1F1ZXVlICYmXG4gICAgICAgICAgICAgIChsYXN0U2NoZWR1bGVkUmVwbGF5UXVldWUgPSBudWxsKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZm9ybVJlcGxheWluZ1F1ZXVlLmxlbmd0aDsgaSArPSAzKSB7XG4gICAgICAgICAgICAgI
15852HZhciBmb3JtID0gZm9ybVJlcGxheWluZ1F1ZXVlW2ldLFxuICAgICAgICAgICAgICAgIHN1Ym1pdHRlck9yQWN0aW9uID0gZm9ybVJlcGxheWluZ1F1ZXVlW2kgKyAxXSxcbiAgICAgICAgICAgICAgICBmb3JtRGF0YSA9IGZvcm1SZXBsYXlpbmdRdWV1ZVtpICsgMl07XG4gICAgICAgICAgICAgIGlmIChcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBzdWJtaXR0ZXJPckFjdGlvbilcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICBudWxsID09PSBmaW5kSW5zdGFuY2VCbG9ja2luZ1RhcmdldChzdWJtaXR0ZXJPckFjdGlvbiB8fCBmb3JtKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGVsc2UgYnJlYWs7XG4gICAgICAgICAgICAgIHZhciBmb3JtSW5zdCA9IGdldEluc3RhbmNlRnJvbU5vZGUoZm9ybSk7XG4gICAgICAgICAgICAgIG51bGwgIT09IGZvcm1JbnN0ICYmXG4gICAgICAgICAgICAgICAgKGZvcm1SZXBsYXlpbmdRdWV1ZS5zcGxpY2UoaSwgMyksXG4gICAgICAgICAgICAgICAgKGkgLT0gMyksXG4gICAgICAgICAgICAgICAgKGZvcm0gPSB7XG4gICAgICAgICAgICAgICAgICBwZW5kaW5nOiAhMCxcbiAgICAgICAgICAgICAgICAgIGRhdGE6IGZvcm1EYXRhLFxuICAgICAgICAgICAgICAgICAgbWV0aG9kOiBmb3JtLm1ldGhvZCxcbiAgICAgICAgICAgICAgICAgIGFjdGlvbjogc3VibWl0dGVyT3JBY3Rpb25cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBPYmplY3QuZnJlZXplKGZvcm0pLFxuICAgICAgICAgICAgICAgIHN0YXJ0SG9zdFRyYW5zaXRpb24oXG4gICAgICAgICAgICAgICAgICBmb3JtSW5zdCxcbiAgICAgICAgICAgICAgICAgIGZvcm0sXG4gICAgICAgICAgICAgICAgICBzdWJtaXR0ZXJPckFjdGlvbixcbiAgICAgICAgICAgICAgICAgIGZvcm1EYXRhXG4gICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICApKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmV0cnlJZkJsb2NrZWRPbih1bmJsb2NrZWQpIHtcbiAgICAgIGZ1bmN0aW9uIHVuYmxvY2socXVldWVkRXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWRFdmVudCwgdW5ibG9ja2VkKTtcbiAgICAgIH1cbiAgICAgIG51bGwgIT09IHF1ZXVlZEZvY3VzICYmXG4gICAgICAgIHNjaGVkdWxlQ2FsbGJhY2tJZlVuYmxvY2tlZChxdWV1ZWRGb2N1cywgdW5ibG9ja2VkKTtcbiAgICAgIG51bGwgIT09IHF1ZXVlZERyYWcgJiYgc2NoZWR1bGVDYWxsYmFja0lmVW5ibG9ja2VkKHF1ZXVlZERyYWcsIHVuYmxvY2tlZCk7XG4gICAgICBudWxsICE9PSBxdWV1ZWRNb3VzZSAmJlxuICAgICAgICBzY2hlZHVsZUNhbGxiYWNrSWZVbmJsb2NrZWQocXVldWVkTW91c2UsIHVuYmxvY2tlZCk7XG4gICAgICBxdWV1ZWRQb2ludGVycy5mb3JFYWNoKHVuYmxvY2spO1xuICAgICAgcXVldWVkUG9pbnRlckNhcHR1cmVzLmZvckVhY2godW5ibG9jayk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2Y
15852XIgcXVldWVkVGFyZ2V0ID0gcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzW2ldO1xuICAgICAgICBxdWV1ZWRUYXJnZXQuYmxvY2tlZE9uID09PSB1bmJsb2NrZWQgJiYgKHF1ZXVlZFRhcmdldC5ibG9ja2VkT24gPSBudWxsKTtcbiAgICAgIH1cbiAgICAgIGZvciAoXG4gICAgICAgIDtcbiAgICAgICAgMCA8IHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0cy5sZW5ndGggJiZcbiAgICAgICAgKChpID0gcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzWzBdKSwgbnVsbCA9PT0gaS5ibG9ja2VkT24pO1xuXG4gICAgICApXG4gICAgICAgIGF0dGVtcHRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldChpKSxcbiAgICAgICAgICBudWxsID09PSBpLmJsb2NrZWRPbiAmJiBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMuc2hpZnQoKTtcbiAgICAgIGkgPSAodW5ibG9ja2VkLm93bmVyRG9jdW1lbnQgfHwgdW5ibG9ja2VkKS4kJHJlYWN0Rm9ybVJlcGxheTtcbiAgICAgIGlmIChudWxsICE9IGkpXG4gICAgICAgIGZvciAocXVldWVkVGFyZ2V0ID0gMDsgcXVldWVkVGFyZ2V0IDwgaS5sZW5ndGg7IHF1ZXVlZFRhcmdldCArPSAzKSB7XG4gICAgICAgICAgdmFyIGZvcm0gPSBpW3F1ZXVlZFRhcmdldF0sXG4gICAgICAgICAgICBzdWJtaXR0ZXJPckFjdGlvbiA9IGlbcXVldWVkVGFyZ2V0ICsgMV0sXG4gICAgICAgICAgICBmb3JtUHJvcHMgPSBmb3JtW2ludGVybmFsUHJvcHNLZXldIHx8IG51bGw7XG4gICAgICAgICAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHN1Ym1pdHRlck9yQWN0aW9uKVxuICAgICAgICAgICAgZm9ybVByb3BzIHx8IHNjaGVkdWxlUmVwbGF5UXVldWVJZk5lZWRlZChpKTtcbiAgICAgICAgICBlbHNlIGlmIChmb3JtUHJvcHMpIHtcbiAgICAgICAgICAgIHZhciBhY3Rpb24gPSBudWxsO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBzdWJtaXR0ZXJPckFjdGlvbiAmJlxuICAgICAgICAgICAgICBzdWJtaXR0ZXJPckFjdGlvbi5oYXNBdHRyaWJ1dGUoXCJmb3JtQWN0aW9uXCIpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAoKGZvcm0gPSBzdWJtaXR0ZXJPckFjdGlvbiksXG4gICAgICAgICAgICAgICAgKGZvcm1Qcm9wcyA9IHN1Ym1pdHRlck9yQWN0aW9uW2ludGVybmFsUHJvcHNLZXldIHx8IG51bGwpKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgYWN0aW9uID0gZm9ybVByb3BzLmZvcm1BY3Rpb247XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChudWxsICE9PSBmaW5kSW5zdGFuY2VCbG9ja2luZ1RhcmdldChmb3JtKSkgY29udGludWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgYWN0aW9uID0gZm9ybVByb3BzLmFjdGlvbjtcbiAgICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGFjdGlvblxuICAgICAgICAgICAgICA/IChpW3F1ZXVlZFRhcmdldCArIDFdID0gYWN0aW9uKVxuICAgICAgICAgICAgICA6IChpLnNwbGljZShxdWV1ZWRUYXJnZXQsIDMpLCAocXVldWVkVGFyZ2V0IC09IDMpKTtcbiAgICAgICAgICAgIHNjaGVkdWxlUmVwbGF5UXVldWVJZk5lZWRlZChpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZGVmYXVsdE9uRGVmYXVsdFRyYW5zaXRpb25JbmRpY2F0b3IoKSB7XG4gICAgICBmdW5jdGlvbiBoYW5kbGVOYXZpZ2F0ZShldmVudCkge1xuICAgICAgICBldmVudC5jYW5JbnRlcmNlcHQgJiZcbiAgICAgICAgICBcInJlYWN0LXRyYW5zaXRpb25cIiA9PT0gZXZlbnQuaW5mbyAmJlxuICAgICAgICAgIGV2ZW50LmludGVyY2VwdCh7XG4gICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZS
15852hmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAocGVuZGluZ1Jlc29sdmUgPSByZXNvbHZlKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZm9jdXNSZXNldDogXCJtYW51YWxcIixcbiAgICAgICAgICAgIHNjcm9sbDogXCJtYW51YWxcIlxuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gaGFuZGxlTmF2aWdhdGVDb21wbGV0ZSgpIHtcbiAgICAgICAgbnVsbCAhPT0gcGVuZGluZ1Jlc29sdmUgJiYgKHBlbmRpbmdSZXNvbHZlKCksIChwZW5kaW5nUmVzb2x2ZSA9IG51bGwpKTtcbiAgICAgICAgaXNDYW5jZWxsZWQgfHwgc2V0VGltZW91dChzdGFydEZha2VOYXZpZ2F0aW9uLCAyMCk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBzdGFydEZha2VOYXZpZ2F0aW9uKCkge1xuICAgICAgICBpZiAoIWlzQ2FuY2VsbGVkICYmICFuYXZpZ2F0aW9uLnRyYW5zaXRpb24pIHtcbiAgICAgICAgICB2YXIgY3VycmVudEVudHJ5ID0gbmF2aWdhdGlvbi5jdXJyZW50RW50cnk7XG4gICAgICAgICAgY3VycmVudEVudHJ5ICYmXG4gICAgICAgICAgICBudWxsICE9IGN1cnJlbnRFbnRyeS51cmwgJiZcbiAgICAgICAgICAgIG5hdmlnYXRpb24ubmF2aWdhdGUoY3VycmVudEVudHJ5LnVybCwge1xuICAgICAgICAgICAgICBzdGF0ZTogY3VycmVudEVudHJ5LmdldFN0YXRlKCksXG4gICAgICAgICAgICAgIGluZm86IFwicmVhY3QtdHJhbnNpdGlvblwiLFxuICAgICAgICAgICAgICBoaXN0b3J5OiBcInJlcGxhY2VcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChcIm9iamVjdFwiID09PSB0eXBlb2YgbmF2aWdhdGlvbikge1xuICAgICAgICB2Y
15852XIgaXNDYW5jZWxsZWQgPSAhMSxcbiAgICAgICAgICBwZW5kaW5nUmVzb2x2ZSA9IG51bGw7XG4gICAgICAgIG5hdmlnYXRpb24uYWRkRXZlbnRMaXN0ZW5lcihcIm5hdmlnYXRlXCIsIGhhbmRsZU5hdmlnYXRlKTtcbiAgICAgICAgbmF2aWdhdGlvbi5hZGRFdmVudExpc3RlbmVyKFwibmF2aWdhdGVzdWNjZXNzXCIsIGhhbmRsZU5hdmlnYXRlQ29tcGxldGUpO1xuICAgICAgICBuYXZpZ2F0aW9uLmFkZEV2ZW50TGlzdGVuZXIoXCJuYXZpZ2F0ZWVycm9yXCIsIGhhbmRsZU5hdmlnYXRlQ29tcGxldGUpO1xuICAgICAgICBzZXRUaW1lb3V0KHN0YXJ0RmFrZU5hdmlnYXRpb24sIDEwMCk7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaXNDYW5jZWxsZWQgPSAhMDtcbiAgICAgICAgICBuYXZpZ2F0aW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJuYXZpZ2F0ZVwiLCBoYW5kbGVOYXZpZ2F0ZSk7XG4gICAgICAgICAgbmF2aWdhdGlvbi5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgXCJuYXZpZ2F0ZXN1Y2Nlc3NcIixcbiAgICAgICAgICAgIGhhbmRsZU5hdmlnYXRlQ29tcGxldGVcbiAgICAgICAgICApO1xuICAgICAgICAgIG5hdmlnYXRpb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgIFwibmF2aWdhdGVlcnJvclwiLFxuICAgICAgICAgICAgaGFuZGxlTmF2aWdhdGVDb21wbGV0ZVxuICAgICAgICAgICk7XG4gICAgICAgICAgbnVsbCAhPT0gcGVuZGluZ1Jlc29sdmUgJiZcbiAgICAgICAgICAgIChwZW5kaW5nUmVzb2x2ZSgpLCAocGVuZGluZ1Jlc29sdmUgPSBudWxsKSk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIFJlYWN0RE9NUm9vdChpbnRlcm5hbFJvb3QpIHtcbiAgICAgIHRoaXMuX2ludGVybmFsUm9vdCA9IGludGVybmFsUm9vdDtcbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhY3RET01IeWRyYXRpb25Sb290KGludGVybmFsUm9vdCkge1xuICAgICAgdGhpcy5faW50ZXJuYWxSb290ID0gaW50ZXJuYWxSb290O1xuICAgIH1cbiAgICBmdW5jdGlvbiB3YXJuSWZSZWFjdERPTUNvbnRhaW5lckluREVWKGNvbnRhaW5lcikge1xuICAgICAgY29udGFpbmVyW2ludGVybmFsQ29udGFpbmVySW5zdGFuY2VLZXldICYmXG4gICAgICAgIChjb250YWluZXIuX3JlYWN0Um9vdENvbnRhaW5lclxuICAgICAgICAgID8gY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCJZb3UgYXJlIGNhbGxpbmcgUmVhY3RET01DbGllbnQuY3JlYXRlUm9vdCgpIG9uIGEgY29udGFpbmVyIHRoYXQgd2FzIHByZXZpb3VzbHkgcGFzc2VkIHRvIFJlYWN0RE9NLnJlbmRlcigpLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIFwiWW91IGFyZSBjYWxsaW5nIFJlYWN0RE9NQ2xpZW50LmNyZWF0ZVJvb3QoKSBvbiBhIGNvbnRhaW5lciB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcGFzc2VkIHRvIGNyZWF0ZVJvb3QoKSBiZWZvcmUuIEluc3RlYWQsIGNhbGwgcm9vdC5yZW5kZXIoKSBvbiB0aGUgZXhpc3Rpbmcgcm9vdCBpbnN0ZWFkIGlmIHlvdSB3YW50IHRvIHVwZGF0ZSBpdC5cIlxuICAgICAgICAgICAgKSk7XG4gICAgfVxuICAgIFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gJiZcbiAgICAgIFwiZnVuY3Rpb25cIiA9PT1cbiAgICAgICAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQgJiZcbiAgICAgIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQoRXJyb3IoKSk7XG4gICAgdmFyIFNjaGVkdWxlciA9IHJlcXVpcmUoXCJzY2hlZHVsZXJcIiksXG4gICAgICBSZWFjdCA9IHJlcXVpcmUoXCJyZWFjdFwiKSxcbiAgICAgIFJlYWN0RE9NID0gcmVxdWlyZShcInJlYW
15852N0LWRvbVwiKSxcbiAgICAgIHNlYXJjaFRhcmdldCA9IG51bGwsXG4gICAgICBzZWFyY2hCb3VuZGFyeSA9IG51bGwsXG4gICAgICBhc3NpZ24gPSBPYmplY3QuYXNzaWduLFxuICAgICAgUkVBQ1RfTEVHQUNZX0VMRU1FTlRfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5lbGVtZW50XCIpLFxuICAgICAgUkVBQ1RfRUxFTUVOVF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnRyYW5zaXRpb25hbC5lbGVtZW50XCIpLFxuICAgICAgUkVBQ1RfUE9SVEFMX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QucG9ydGFsXCIpLFxuICAgICAgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5mcmFnbWVudFwiKSxcbiAgICAgIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3Quc3RyaWN0X21vZGVcIiksXG4gICAgICBSRUFDVF9QUk9GSUxFUl9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnByb2ZpbGVyXCIpLFxuICAgICAgUkVBQ1RfQ09OU1VNRVJfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5jb25zdW1lclwiKSxcbiAgICAgIFJFQUNUX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5jb250ZXh0XCIpLFxuICAgICAgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5mb3J3YXJkX3JlZlwiKSxcbiAgICAgIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3Quc3VzcGVuc2VcIiksXG4gICAgICBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3Quc3VzcGVuc2VfbGlzdFwiKSxcbiAgICAgIFJFQUNUX01FTU9fVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5tZW1vXCIpLFxuICAgICAgUkVBQ1RfTEFaWV9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmxhenlcIik7XG4gICAgU3ltYm9sLmZvcihcInJlYWN0LnNjb3BlXCIpO1xuICAgIHZhciBSRUFDVF9BQ1RJVklUWV9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmFjdGl2aXR5XCIpLFxuICAgICAgUkVBQ1RfTEVHQUNZX0hJRERFTl9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmxlZ2FjeV9oaWRkZW5cIik7XG4gICAgU3ltYm9sLmZvcihcInJlYWN0LnRyYWNpbmdfbWFya2VyXCIpO1xuICAgIHZhciBSRUFDVF9NRU1PX0NBQ0hFX1NFTlRJTkVMID0gU3ltYm9sLmZvcihcInJlYWN0Lm1lbW9fY2FjaGVfc2VudGluZWxcIiksXG4gICAgICBSRUFDVF9WSUVXX1RSQU5TSVRJT05fVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC52aWV3X3RyYW5zaXRpb25cIiksXG4gICAgICBSRUFDVF9SRUNPVkVSQUJMRV9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnJlY292ZXJhYmxlXCIpLFxuICAgICAgTUFZQkVfSVRFUkFUT1JfU1lNQk9MID0gU3ltYm9sLml0ZXJhdG9yLFxuICAgICAgUkVBQ1RfQ0xJRU5UX1JFRkVSRU5DRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5jbGllbnQucmVmZXJlbmNlXCIpLFxuICAgICAgaXNBcnJheUltcGwgPSBBcnJheS5pc0FycmF5LFxuICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPVxuICAgICAgICBSZWFjdC5fX0NMSUVOVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9XQVJOX1VTRVJTX1RIRVlfQ0FOTk9UX1VQR1JBREUsXG4gICAgICBSZWFjdERPTVNoYXJlZEludGVybmFscyA9XG4gICAgICAgIFJlYWN0RE9NLl9fRE9NX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1dBUk5fVVNFUlNfVEhFWV9DQU5OT1RfVVBHUkFERSxcbiAgICAgIE5vdFBlbmRpbmcgPSBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgcGVuZGluZzogITEsXG4gICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgIG1ldGhvZDogbnVsbCxcbiAgICAgICAgYWN0aW9uOiBudWxsXG4gICAgICB9KSxcbiAgICAgIHZhbHVlU3RhY2sgPSBbXTtcbiAgICB2YXIgZmliZXJTdGFjayA9IFtdO1xuICAgIHZhciBpbmRleCRqc2NvbXAkMCA9IC0xLFxuICAgICAgY29udGV4dFN0YWNrQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKG51bGwpLFxuICAgICAgY29udGV4dEZpYmVyU3RhY2tDdXJzb3IgPSBjcmVhdGVDdXJzb3IobnVsbCksXG4gICAgICByb290SW5zdGFuY2VTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihudWxsKSxcbiAgICAgIGhvc3RUcmFuc2l0aW9uUHJvdmlkZXJDdXJzb3IgPSBjcmVhdGVDdXJzb3IobnVsbCksXG4gICAgICBkaXNhYmxlZERlcHRoID0gMCxcbiAgICAgIHByZXZMb2csXG4gICAgICBwcmV2SW5mbyxcbiAgICAgIHByZXZXYXJuLFxuICAgICAgcHJldkVycm9yLFxuICAgICAgcHJldkdyb3VwLFxuICAgICAgcHJldkdyb3VwQ29sbGFwc2VkLFxuICAgICAgcHJldkdyb3VwRW5kO1xuICAgIGRpc2FibGVkTG9nLl9fcmVhY3REaXNhYmxlZExvZyA9ICEwO1xuICAgIHZhciBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICByZWVudHJ5ID0gITE7XG4gICAgdmFyIGNvbXBvbmVudEZyYW1lQ2FjaGUgPSBuZXcgKFxuICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgV2Vha01hcCA/IFdlYWtNYXAgOiBNYXBcbiAgICApKCk7XG4gICAgdmFyIGN1cnJlbnQgPSBudWxsLFxuICAgICAgaXNSZW5kZXJpbmcgPSAhMSxcbiAgICAgIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxcbiAgICAgIHNjaGVkdWxlQ2FsbGJhY2skMyA9IFNjaGVkdWxlci51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrLFxuICAgICAgY2FuY2VsQ2FsbGJhY2skMSA9IFNjaGVkdWxlci51bnN0YWJsZV9jYW5jZWxDYWxsYmFjayxcbiAgICAgIHNob3VsZFlpZWxkID0gU2NoZWR1bGVyLnVuc3RhYmxlX3Nob3VsZFlpZWxkLFxuICAgICAgcmVxdWVzdFBhaW50ID0gU2NoZWR1bGVyLnVuc3RhYmxlX3JlcXVlc3RQYWludCxcbiAgICAgIG5vdyQxID0gU2NoZWR1bGVyLnVuc3RhYmxlX25vdyxcbiAgICAgIGdldEN1cnJlbnRQcmlvcml0eUxldmVsID0gU2NoZWR1bGVyLnVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsLFxuICAgICAgSW1tZWRpYXRlUHJpb3JpdHkgPSBTY2hlZHVsZXIudW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHksXG4gICAgICBVc2VyQmxvY2tpbmdQcmlvcml0eSA9IFNjaGVkdWxlci51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eSxcbiAgICAgIE5vcm1hbFByaW9yaXR5JDEgPSBTY2hlZHVsZXIudW5zdGFibGVfTm9ybWFsUHJpb3JpdHksXG4gICAgICBMb3dQcmlvcml0eSA9IFNjaGVkdWxlci51bnN0YWJsZV9Mb3dQcmlvcml0eSxcbiAgICAgIElkbGVQcmlvcml0eSA9IFNjaGVkdWxlci51bnN0YWJsZV9JZGxlUHJpb3JpdHksXG4gICAgICBsb2ckMSA9IFNjaGVkdWxlci5sb2csXG4gICAgICB1bnN0YWJsZV9zZXREaXNhYmxlWWllbGRWYWx1ZSA9IFNjaGVkdWxlci51bnN0YWJsZV9zZXREaXNhYmxlWWllbGRWYWx1ZSxcbiAgICAgIHJlbmRlcmVySUQgPSBudWxsLFxuICAgICAgaW5qZWN0ZWRIb29rID0gbnVsbCxcbiAgICAgIGhhc0xvZ2dlZEVycm9yID0gITEsXG4gICAgICBpc0RldlRvb2xzUHJlc2VudCA9IFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18sXG4gICAgICBjbHozMiA9IE1hdGguY2x6MzIgPyBNYXRoLmNsejMyIDogY2x6MzJGYWxsYmFjayxcbiAgICAgIGxvZyA9IE1hdGgubG9nLFxuICAgICAgTE4yID0gTWF0aC5MTjIsXG4gICAgICBuZXh0VHJhbnNpdGlvblVwZGF0ZUxhbmUgPSAyNTYsXG4gICAgICBuZXh0VHJhbnNpdGlvbkRlZmVycmVkTGFuZSA9IDI2MjE0NCxcbiAgICAgIG5leHRSZXRyeUxhbmUgPSA0MTk0MzA0LFxuICAgICAgRGlzY3JldGVFdmVudFByaW9yaXR5ID0gMixcbiAgICAgIENvbnRpbnVvdXNFdmVudFByaW9yaXR5ID0gOCxcbiAgICAgIERlZmF1bHRFdmVudFByaW9yaXR5ID0gMzIsXG4gICAgICBJZGxlRXZlbnRQcmlvcml0eSA9IDI2ODQzNTQ1NixcbiAgICAgIHJhbmRvbUtleSA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmc
15852oMzYpLnNsaWNlKDIpLFxuICAgICAgaW50ZXJuYWxJbnN0YW5jZUtleSA9IFwiX19yZWFjdEZpYmVyJFwiICsgcmFuZG9tS2V5LFxuICAgICAgaW50ZXJuYWxQcm9wc0tleSA9IFwiX19yZWFjdFByb3BzJFwiICsgcmFuZG9tS2V5LFxuICAgICAgaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleSA9IFwiX19yZWFjdENvbnRhaW5lciRcIiArIHJhbmRvbUtleSxcbiAgICAgIGludGVybmFsRXZlbnRIYW5kbGVyc0tleSA9IFwiX19yZWFjdEV2ZW50cyRcIiArIHJhbmRvbUtleSxcbiAgICAgIGludGVybmFsRXZlbnRIYW5kbGVyTGlzdGVuZXJzS2V5ID0gXCJfX3JlYWN0TGlzdGVuZXJzJFwiICsgcmFuZG9tS2V5LFxuICAgICAgaW50ZXJuYWxFdmVudEhhbmRsZXNTZXRLZXkgPSBcIl9fcmVhY3RIYW5kbGVzJFwiICsgcmFuZG9tS2V5LFxuICAgICAgaW50ZXJuYWxSb290Tm9kZVJlc291cmNlc0tleSA9IFwiX19yZWFjdFJlc291cmNlcyRcIiArIHJhbmRvbUtleSxcbiAgICAgIGludGVybmFsSG9pc3RhYmxlTWFya2VyID0gXCJfX3JlYWN0TWFya2VyJFwiICsgcmFuZG9tS2V5LFxuICAgICAgaW50ZXJuYWxMb2FkUGVuZGluZ0tleSA9IFwiX19yZWFjdExvYWQkXCIgKyByYW5kb21LZXksXG4gICAgICBhbGxOYXRpdmVFdmVudHMgPSBuZXcgU2V0KCksXG4gICAgICByZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzID0ge30sXG4gICAgICBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzID0ge30sXG4gICAgICBoYXNSZWFkT25seVZhbHVlID0ge1xuICAgICAgICBidXR0b246ICEwLFxuICAgICAgICBjaGVja2JveDogITAsXG4gICAgICAgIGltYWdlOiAhMCxcbiAgICAgICAgaGlkZGVuOiAhMCxcbiAgICAgICAgcmFkaW86ICEwLFxuICAgICAgICByZXNldDogITAsXG4gICAgICAgIHN1Ym1pdDogITBcbiAgICAgIH0sXG4gICAgICBWQUxJRF9BVFRSSUJVVEVfTkFNRV9SRUdFWCA9IFJlZ0V4cChcbiAgICAgICAgXCJeWzpBLVpfYS16XFxcXHUwMEMwLVxcXFx1MDBENlxcXFx1MDBEOC1cXFxcdTAwRjZcXFxcdTAwRjgtXFxcXHUwMkZGXFxcXHUwMzcwLVxcXFx1MDM3RFxcXFx1MDM3Ri1cXFxcdTFGRkZcXFxcdTIwMEMtXFxcXHUyMDBEXFxcXHUyMDcwLVxcXFx1MjE4RlxcXFx1MkMwMC1cXFxcdTJGRUZcXFxcdTMwMDEtXFxcXHVEN0ZGXFxcXHVGOTAwLVxcXFx1RkRDRlxcXFx1RkRGMC1cXFxcdUZGRkRdWzpBLVpfYS16XFxcXHUwMEMwLVxcXFx1MDBENlxcXFx1MDBEOC1cXFxcdTAwRjZcXFxcdTAwRjgtXFxcXHUwMkZGXFxcXHUwMzcwLVxcXFx1MDM3RFxcXFx1MDM3Ri1cXFxcdTFGRkZcXFxcdTIwMEMtXFxcXHUyMDBEXFxcXHUyMDcwLVxcXFx1MjE4RlxcXFx1MkMwMC1cXFxcdTJGRUZcXFxcdTMwMDEtXFxcXHVEN0ZGXFxcXHVGOTAwLVxcXFx1RkRDRlxcXFx1RkRGMC1cXFxcdUZGRkRcXFxcLS4wLTlcXFxcdTAwQjdcXFxcdTAzMDAtXFxcXHUwMzZGXFxcXHUyMDNGLVxcXFx1MjA0MF0qJFwiXG4gICAgICApLFxuICAgICAgaWxsZWdhbEF0dHJpYnV0ZU5hbWVDYWNoZSA9IHt9LFxuICAgICAgdmFsaWRhdGVkQXR0cmlidXRlTmFtZUNhY2hlID0ge30sXG4gICAgICB2aWV3VHJhbnNpdGlvbk11dGF0aW9uQ29udGV4dCA9ICExLFxuICAgICAgZXNjYXBlU2VsZWN0b3JBdHRyaWJ1dGVWYWx1ZUluc2lkZURvdWJsZVF1b3Rlc1JlZ2V4ID0gL1tcXG5cIlxcXFxdL2csXG4gICAgICBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUkMSA9ICExLFxuICAgICAgZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCA9ICExLFxuICAgICAgZGlkV2FyblNlbGVjdGVkU2V0T25PcHRpb24gPSAhMSxcbiAgICAgIGRpZFdhcm5JbnZhbGlkQ2hpbGQgPSAhMSxcbiAgICAgIGRpZFdhcm5JbnZhbGlkSW5uZXJIVE1MID0gITE7XG4gICAgdmFyIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSA9ICExO1xuICAgIHZhciB2YWx1ZVByb3BOYW1lcyA9IFtcInZhbHVlXCIsIFwiZGVmYXVsdFZhbHVlXCJdLFxuICAgICAgZGlkV2FyblZhbERlZmF1bHRWYWwgPSAhMSxcbiAgICAgIG5lZWRzRXNjYXBpbmcgPSAvW1wiJyY8PlxcblxcdF18Xlxcc3xcXHMkLyxcbiAgICAgIHNwZWNpYWxUYWdzID1cbiAgICAgICAgXCJhZGRyZXNzIGFwcGxldCBhcmVhIGFydGljbGUgYXNpZGUgYmFzZSBiYXNlZm9udCBiZ3NvdW5kIGJsb2NrcXVvdGUgYm9keSBiciBidXR0b24gY2FwdGlvbiBjZW50ZXIgY29sIGNvbGdyb3VwIGRkIGRldGFpbHMgZGlyIGRpdiBkbCBkdCBlbWJlZCBmaWVsZHNldCBmaWdjYXB0aW9uIGZpZ3VyZSBmb290ZXIgZm9ybSBmcmFtZSBmcmFtZXNldCBoMSBoMiBoMyBoNCBoNSBoNiBoZWFkIGhlYWRlciBoZ3JvdXAgaHIgaHRtbCBpZnJhbWUgaW1nIGlucHV0IGlzaW5kZXggbGkgbGluayBsaXN0aW5nIG1haW4gbWFycXVlZSBtZW51IG1lbnVpdGVtIG1ldGEgbmF2IG5vZW1iZWQgbm9mcmFtZXMgbm9zY3JpcHQgb2JqZWN0IG9sIHAgcGFyYW0gcGxhaW50ZXh0IHByZSBzY3JpcHQgc2VjdGlvbiBzZWxlY3Qgc291cmNlIHN0eWxlIHN1bW1hcnkgdGFibGUgdGJvZHkgdGQgdGVtcGxhdGUgdGV4dGFyZWEgdGZvb3QgdGggdGhlYWQgdGl0bGUgdHIgdHJhY2sgdWwgd2JyIHhtcFwiLnNwbGl0KFxuICAgICAgICAgIFwiIFwiXG4gICAgICAgICksXG4gICAgICBpblNjb3BlVGFncyA9XG4gICAgICAgIFwiYXBwbGV0IGNhcHRpb24gaHRtbCB0YWJsZSB0ZCB0aCBtYXJxdWVlIG9iamVjdCBzZWxlY3QgdGVtcGxhdGUgZm9yZWlnbk9iamVjdCBkZXNjIHRpdGxlXCIuc3BsaXQoXG4gICAgICAgICAgXCIgXCJcbiAgICAgICAgKSxcbiAgICAgIGJ1dHRvblNjb3BlVGFncyA9IGluU2NvcGVUYWdzLmNvbmNhdChbXCJidXR0b25cIl0pLFxuICAgICAgaW1wbGllZEVuZFRhZ3MgPSBcImRkIGR0IGxpIG9wdGlvbiBvcHRncm91cCBwIHJwIHJ0XCIuc3BsaXQoXCIgXCIpLFxuICAgICAgZW1wdHlBbmNlc3RvckluZm9EZXYgPSB7XG4gICAgICAgIGN1cnJlbnQ6IG51bGwsXG4gICAgICAgIGZvcm1UYWc6IG51bGwsXG4gICAgICAgIGFUYWdJblNjb3BlOiBudWxsLFxuICAgICAgICBidXR0b25UYWdJblNjb3BlOiBudWxsLFxuICAgICAgICBub2JyVGFnSW5TY29wZTogbnVsbCxcbiAgICAgICAgcFRhZ0luQnV0dG9uU2NvcGU6IG51bGwsXG4gICAgICAgIGxpc3RJdGVtVGFnQXV0b2Nsb3Npbmc6IG51bGwsXG4gICAgICAgIGRsSXRlbVRhZ0F1dG9jbG9zaW5nOiBudWxsLFxuICAgICAgICBjb250YWluZXJUYWdJblNjb3BlOiBudWxsLFxuICAgICAgICBpbXBsaWNpdFJvb3RTY29wZTogITFcbiAgICAgIH0sXG4gICAgICBkaWRXYXJuID0ge30sXG4gICAgICBzaG9ydGhhbmRUb0xvbmdoYW5kID0ge1xuICAgICAgICBhbmltYXRpb246XG4gICAgICAgICAgXCJhbmltYXRpb25EZWxheSBhbmltYXRpb25EaXJlY3Rpb24gYW5pbWF0aW9uRHVyYXRpb24gYW5pbWF0aW9uRmlsbE1vZGUgYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQgYW5pbWF0aW9uTmFtZSBhbmltYXRpb25QbGF5U3RhdGUgYW5pbWF0aW9uVGltaW5nRnVuY3Rpb25cIi5zcGxpdChcbiAgICAgICAgICAgIFwiIFwiXG4gICAgICAgICAgKSxcbiAgICAgICAgYmFja2dyb3VuZDpcbiAgICAgICAgICBcImJhY2tncm91bmRBdHRhY2htZW50IGJhY2tncm91bmRDbGlwIGJhY2tncm91bmRDb2xvciBiYWNrZ3JvdW5kSW1hZ2UgYmFja2dyb3VuZE9yaWdpbiBiYWNrZ3JvdW5kUG9zaXRpb25YIGJhY2tncm91bmRQb3NpdGlvblkgYmFja2dyb3VuZFJlcGVhdCBiYWNrZ3JvdW5kU2l6ZVwiLnNwbGl0KFxuICAgICAgICAgICAgXCIgXCJcbiAgICAgICAgICApLFxuICAgICAgICBiYWNrZ3JvdW5kUG9zaXRpb246IFtcImJhY2tncm91bmRQb3NpdGlvblhcIiwgXCJiYWNrZ3JvdW5kUG9zaXRpb25ZXCJdLFxuICAgICAgICBib3JkZXI6XG4gICAgICAgICAgXCJib3JkZXJCb3R0b21Db2xvciBib3JkZXJCb3R0b21TdHlsZSBib3JkZXJCb3R0b21XaWR0aCBib3JkZXJJbWFnZU91dHNldCBib3JkZXJJbWFnZVJlcGVhdCBib3JkZXJJbWFnZVNsaWNlIGJvcmRlckltYWdlU291cmNlIGJvcmRlckltYWdlV2lkdGggYm9yZGVyTGVmdENvbG9yIGJvcmRlckxlZnRTdHlsZSBib3JkZXJMZWZ0V2lkdGggYm9yZGVyUmlnaHRDb2xvciBib3JkZXJSaWdodFN0eWxlIGJvcmRlclJpZ2h0V2lkdGggYm9yZGVyVG9wQ29sb3IgYm9yZGVyVG9wU3R5bGUgYm9yZGVyVG9wV2lkdGhcIi5zcGxpdChcbiAgICAgICAgICAgIFwiIFwiXG4gICAgICAgICAgKSxcbiAgICAgICAgYm9yZGVyQmxvY2s6XG4gICAgICAgICAgXCJib3JkZXJCbG9ja0VuZENvbG9yIGJvcmRlckJsb2NrRW5kU3R5bGUgYm9yZGVyQmxvY2tFbmRXaWR0aCBib3JkZXJCbG9ja1N0YXJ0Q29sb3IgYm9yZGVyQmxvY2tTdGFydFN0eWxlIGJvcmRlckJsb2NrU3RhcnRXaWR0aFwiLnNwbGl0KFxuICAgICAgICAgICAgXCIgXCJcbiAgICAgICAgICApLFxuICAgICAgICBib3JkZXJCbG9ja0NvbG9yOiBbXCJib3JkZXJCbG9ja0VuZENvbG9yXCIsIFwiYm9yZGVyQmxvY2tTdGFydENvbG9yXCJdLFxuICAgICAgICBib3JkZXJCbG9ja0VuZDogW1xuICAgICAgICAgIFwiYm9yZGVyQmxvY2tFbmRDb2xvclwiLFxuICAgICAgICAgIFwiYm9yZGVyQmxvY2tFbmRTdHlsZVwiLFxuICAgICAgICAgIFwiYm9yZGVyQmxvY2tFbmRXaWR0aFwiXG4gICAgICAgIF0sXG4gICAgICAgIGJvcmRlckJsb2NrU3RhcnQ6IFtcbiAgICAgICAgICBcImJvcmRlckJsb2NrU3RhcnRDb2xvclwiLFxuICAgICAgICAgIFwiYm9yZGVyQmxvY2tTdGFydFN0eWxlXCIsXG4gICAgICAgICAgXCJib3JkZXJCbG9ja1N0YXJ0V2lkdGhcIlxuICAgICAgICBdLFxuICAgICAgICBib3JkZXJCbG9ja1N0eWxlOiBbXCJib3JkZXJCbG9ja0VuZFN0eWxlXCIsIFwiYm9yZGVyQmxvY2tTdGFydFN0eWxlXCJdLFxuICAgICAgICBib3JkZXJCbG9ja1dpZHR
15852oOiBbXCJib3JkZXJCbG9ja0VuZFdpZHRoXCIsIFwiYm9yZGVyQmxvY2tTdGFydFdpZHRoXCJdLFxuICAgICAgICBib3JkZXJCb3R0b206IFtcbiAgICAgICAgICBcImJvcmRlckJvdHRvbUNvbG9yXCIsXG4gICAgICAgICAgXCJib3JkZXJCb3R0b21TdHlsZVwiLFxuICAgICAgICAgIFwiYm9yZGVyQm90dG9tV2lkdGhcIlxuICAgICAgICBdLFxuICAgICAgICBib3JkZXJDb2xvcjogW1xuICAgICAgICAgIFwiYm9yZGVyQm90dG9tQ29sb3JcIixcbiAgICAgICAgICBcImJvcmRlckxlZnRDb2xvclwiLFxuICAgICAgICAgIFwiYm9yZGVyUmlnaHRDb2xvclwiLFxuICAgICAgICAgIFwiYm9yZGVyVG9wQ29sb3JcIlxuICAgICAgICBdLFxuICAgICAgICBib3JkZXJJbWFnZTogW1xuICAgICAgICAgIFwiYm9yZGVySW1hZ2VPdXRzZXRcIixcbiAgICAgICAgICBcImJvcmRlckltYWdlUmVwZWF0XCIsXG4gICAgICAgICAgXCJib3JkZXJJbWFnZVNsaWNlXCIsXG4gICAgICAgICAgXCJib3JkZXJJbWFnZVNvdXJjZVwiLFxuICAgICAgICAgIFwiYm9yZGVySW1hZ2VXaWR0aFwiXG4gICAgICAgIF0sXG4gICAgICAgIGJvcmRlcklubGluZTpcbiAgICAgICAgICBcImJvcmRlcklubGluZUVuZENvbG9yIGJvcmRlcklubGluZUVuZFN0eWxlIGJvcmRlcklubGluZUVuZFdpZHRoIGJvcmRlcklubGluZVN0YXJ0Q29sb3IgYm9yZGVySW5saW5lU3RhcnRTdHlsZSBib3JkZXJJbmxpbmVTdGFydFdpZHRoXCIuc3BsaXQoXG4gICAgICAgICAgICBcIiBcIlxuICAgICAgICAgICksXG4gICAgICAgIGJvcmRlcklubGluZUNvbG9yOiBbXCJib3JkZXJJbmxpbmVFbmRDb2xvclwiLCBcImJvcmRlcklubGluZVN0YXJ0Q29sb3JcIl0sXG4gICAgICAgIGJvcmRlcklubGluZUVuZDogW1xuICAgICAgICAgIFwiYm9yZGVySW5saW5lRW5kQ29sb3JcIixcbiAgICAgICAgICBcImJvcmRlcklubGluZUVuZFN0eWxlXCIsXG4gICAgICAgICAgXCJib3JkZXJJbmxpbmVFbmRXaWR0aFwiXG4gICAgICAgIF0sXG4gICAgICAgIGJvcmRlcklubGluZVN0YXJ0OiBbXG4gICAgICAgICAgXCJib3JkZXJJbmxpbmVTdGFydENvbG9yXCIsXG4gICAgICAgICAgXCJib3JkZXJJbmxpbmVTdGFydFN0eWxlXCIsXG4gICAgICAgICAgXCJib3JkZXJJbmxpbmVTdGFydFdpZHRoXCJcbiAgICAgICAgXSxcbiAgICAgICAgYm9yZGVySW5saW5lU3R5bGU6IFtcImJvcmRlcklubGluZUVuZFN0eWxlXCIsIFwiYm9yZGVySW5saW5lU3RhcnRTdHlsZVwiXSxcbiAgICAgICAgYm9yZGVySW5saW5lV2lkdGg6IFtcImJvcmRlcklubGluZUVuZFdpZHRoXCIsIFwiYm9yZGVySW5saW5lU3RhcnRXaWR0aFwiXSxcbiAgICAgICAgYm9yZGVyTGVmdDogW1wiYm9yZGVyTGVmdENvbG9yXCIsIFwiYm9yZGVyTGVmdFN0eWxlXCIsIFwiYm9yZGVyTGVmdFdpZHRoXCJdLFxuICAgICAgICBib3JkZXJSYWRpdXM6IFtcbiAgICAgICAgICBcImJvcmRlckJvdHRvbUxlZnRSYWRpdXNcIixcbiAgICAgICAgICBcImJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzXCIsXG4gICAgICAgICAgXCJib3JkZXJUb3BMZWZ0UmFkaXVzXCIsXG4gICAgICAgICAgXCJib3JkZXJUb3BSaWdodFJhZGl1c1wiXG4gICAgICAgIF0sXG4gICAgICAgIGJvcmRlclJpZ2h0OiBbXG4gICAgICAgICAgXCJib3JkZXJSaWdodENvbG9yXCIsXG4gICAgICAgICAgXCJib3JkZXJSaWdodFN0eWxlXCIsXG4gICAgICAgICAgXCJib3JkZXJSaWdodFdpZHRoXCJcbiAgICAgICAgXSxcbiAgICAgICAgYm9yZGVyU3R5bGU6IFtcbiAgICAgICAgICBcImJvcmRlckJvdHRvbVN0eWxlXCIsXG4gICAgICAgICAgXCJib3JkZXJMZWZ0U3R5bGVcIixcbiAgICAgICAgICBcImJvcmRlclJpZ2h0U3R5bGVcIixcbiAgICAgICAgICBcImJvcmRlclRvcFN0eWxlXCJcbiAgICAgICAgXSxcbiAgICAgICAgYm9yZGVyVG9wOiBbXCJib3JkZXJUb3BDb2xvclwiLCBcImJvcmRlclRvcFN0eWxlXCIsIFwiYm9yZGVyVG9wV2lkdGhcIl0sXG4gICAgICAgIGJvcmRlcldpZHRoOiBbXG4gICAgICAgICAgXCJib3JkZXJCb3R0b21XaWR0aFwiLFxuICAgICAgICAgIFwiYm9yZGVyTGVmdFdpZHRoXCIsXG4gICAgICAgICAgXCJib3JkZXJSaWdodFdpZHRoXCIsXG4gICAgICAgICAgXCJib3JkZXJUb3BXaWR0aFwiXG4gICAgICAgIF0sXG4gICAgICAgIGNvbG9yQWRqdXN0OiBbXCJwcmludENvbG9yQWRqdXN0XCJdLFxuICAgICAgICBjb2x1bW5SdWxlOiBbXCJjb2x1bW5SdWxlQ29sb3JcIiwgXCJjb2x1bW5SdWxlU3R5bGVcIiwgXCJjb2x1bW5SdWxlV2lkdGhcIl0sXG4gICAgICAgIGNvbHVtbnM6IFtcImNvbHVtbkNvdW50XCIsIFwiY29sdW1uV2lkdGhcIl0sXG4gICAgICAgIGNvbnRhaW5JbnRyaW5zaWNTaXplOiBbXG4gICAgICAgICAgXCJjb250YWluSW50cmluc2ljSGVpZ2h0XCIsXG4gICAgICAgICAgXCJjb250YWluSW50cmluc2ljV2lkdGhcIlxuICAgICAgICBdLFxuICAgICAgICBjb250YWluZXI6IFtcImNvbnRhaW5lck5hbWVcIiwgXCJjb250YWluZXJUeXBlXCJdLFxuICAgICAgICBmbGV4OiBbXCJmbGV4QmFzaXNcIiwgXCJmbGV4R3Jvd1wiLCBcImZsZXhTaHJpbmtcIl0sXG4gICAgICAgIGZsZXhGbG93OiBbXCJmbGV4RGlyZWN0aW9uXCIsIFwiZmxleFdyYXBcIl0sXG4gICAgICAgIGZvbnQ6IFwiZm9udEZhbWlseSBmb250RmVhdHVyZVNldHRpbmdzIGZvbnRLZXJuaW5nIGZvbnRMYW5ndWFnZU92ZXJyaWRlIGZvbnRTaXplIGZvbnRTaXplQWRqdXN0IGZvbnRTdHJldGNoIGZvbnRTdHlsZSBmb250VmFyaWFudCBmb250VmFyaWFudEFsdGVybmF0ZXMgZm9udFZhcmlhbnRDYXBzIGZvbnRWYXJpYW50RWFzdEFzaWFuIGZvbnRWYXJpYW50TGlnYXR1cmVzIGZvbnRWYXJpYW50TnVtZXJpYyBmb250VmFyaWFudFBvc2l0aW9uIGZvbnRXZWlnaHQgbGluZUhlaWdodFwiLnNwbGl0KFxuICAgICAgICAgIFwiIFwiXG4gICAgICAgICksXG4gICAgICAgIGZvbnRTeW50aGVzaXM6IFtcbiAgICAgICAgICBcImZvbnRTeW50aGVzaXNQb3NpdGlvblwiLFxuICAgICAgICAgIFwiZm9udFN5bnRoZXNpc1NtYWxsQ2Fwc1wiLFxuICAgICAgICAgIFwiZm9udFN
158525bnRoZXNpc1N0eWxlXCIsXG4gICAgICAgICAgXCJmb250U3ludGhlc2lzV2VpZ2h0XCJcbiAgICAgICAgXSxcbiAgICAgICAgZm9udFZhcmlhbnQ6XG4gICAgICAgICAgXCJmb250VmFyaWFudEFsdGVybmF0ZXMgZm9udFZhcmlhbnRDYXBzIGZvbnRWYXJpYW50RWFzdEFzaWFuIGZvbnRWYXJpYW50TGlnYXR1cmVzIGZvbnRWYXJpYW50TnVtZXJpYyBmb250VmFyaWFudFBvc2l0aW9uXCIuc3BsaXQoXG4gICAgICAgICAgICBcIiBcIlxuICAgICAgICAgICksXG4gICAgICAgIGdhcDogW1wiY29sdW1uR2FwXCIsIFwicm93R2FwXCJdLFxuICAgICAgICBncmlkOiBcImdyaWRBdXRvQ29sdW1ucyBncmlkQXV0b0Zsb3cgZ3JpZEF1dG9Sb3dzIGdyaWRUZW1wbGF0ZUFyZWFzIGdyaWRUZW1wbGF0ZUNvbHVtbnMgZ3JpZFRlbXBsYXRlUm93c1wiLnNwbGl0KFxuICAgICAgICAgIFwiIFwiXG4gICAgICAgICksXG4gICAgICAgIGdyaWRBcmVhOiBbXG4gICAgICAgICAgXCJncmlkQ29sdW1uRW5kXCIsXG4gICAgICAgICAgXCJncmlkQ29sdW1uU3RhcnRcIixcbiAgICAgICAgICBcImdyaWRSb3dFbmRcIixcbiAgICAgICAgICBcImdyaWRSb3dTdGFydFwiXG4gICAgICAgIF0sXG4gICAgICAgIGdyaWRDb2x1bW46IFtcImdyaWRDb2x1bW5FbmRcIiwgXCJncmlkQ29sdW1uU3RhcnRcIl0sXG4gICAgICAgIGdyaWRDb2x1bW5HYXA6IFtcImNvbHVtbkdhcFwiXSxcbiAgICAgICAgZ3JpZEdhcDogW1wiY29sdW1uR2FwXCIsIFwicm93R2FwXCJdLFxuICAgICAgICBncmlkUm93OiBbXCJncmlkUm93RW5kXCIsIFwiZ3JpZFJvd1N0YXJ0XCJdLFxuICAgICAgICBncmlkUm93R2FwOiBbXCJyb3dHYXBcIl0sXG4gICAgICAgIGdyaWRUZW1wbGF0ZTogW1xuICAgICAgICAgIFwiZ3JpZFRlbXBsYXRlQXJlYXNcIixcbiAgICAgICAgICBcImdyaWRUZW1wbGF0ZUNvbHVtbnNcIixcbiAgICAgICAgICBcImdyaWRUZW1wbGF0ZVJvd3NcIlxuICAgICAgICBdLFxuICAgICAgICBpbnNldDogW1wiYm90dG9tXCIsIFwibGVmdFwiLCBcInJpZ2h0XCIsIFwidG9wXCJdLFxuICAgICAgICBpbnNldEJsb2NrOiBbXCJpbnNldEJsb2NrRW5kXCIsIFwiaW5zZXRCbG9ja1N0YXJ0XCJdLFxuICAgICAgICBpbnNldElubGluZTogW1wiaW5zZXRJbmxpbmVFbmRcIiwgXCJpbnNldElubGluZVN0YXJ0XCJdLFxuICAgICAgICBsaXN0U3R5bGU6IFtcImxpc3RTdHlsZUltYWdlXCIsIFwibGlzdFN0eWxlUG9zaXRpb25cIiwgXCJsaXN0U3R5bGVUeXBlXCJdLFxuICAgICAgICBtYXJnaW46IFtcIm1hcmdpbkJvdHRvbVwiLCBcIm1hcmdpbkxlZnRcIiwgXCJtYXJnaW5SaWdodFwiLCBcIm1hcmdpblRvcFwiXSxcbiAgICAgICAgbWFyZ2luQmxvY2s6IFtcIm1hcmdpbkJsb2NrRW5kXCIsIFwibWFyZ2luQmxvY2tTdGFydFwiXSxcbiAgICAgICAgbWFyZ2luSW5saW5lOiBbXCJtYXJnaW5JbmxpbmVFbmRcIiwgXCJtYXJnaW5JbmxpbmVTdGFydFwiXSxcbiAgICAgICAgbWFya2VyOiBbXCJtYXJrZXJFbmRcIiwgXCJtYXJrZXJNaWRcIiwgXCJtYXJrZXJTdGFydFwiXSxcbiAgICAgICAgbWFzazogXCJtYXNrQ2xpcCBtYXNrQ29tcG9zaXRlIG1hc2tJbWFnZSBtYXNrTW9kZSBtYXNrT3JpZ2luIG1hc2tQb3NpdGlvblggbWFza1Bvc2l0aW9uWSBtYXNrUmVwZWF0IG1hc2tTaXplXCIuc3BsaXQoXG4gICAgICAgICAgXCIgXCJcbiAgICAgICAgKSxcbiAgICAgICAgbWFza1Bvc2l0aW9uOiBbXCJtYXNrUG9zaXRpb25YXCIsIFwibWFza1Bvc2l0aW9uWVwiXSxcbiAgICAgICAgb2Zmc2V0OiBbXG4gICAgICAgICAgXCJvZmZzZXRBbmNob3JcIixcbiAgICAgICAgICBcIm9mZnNldERpc3RhbmNlXCIsXG4gICAgICAgICAgXCJvZmZzZXRQYXRoXCIsXG4gICAgICAgICAgXCJvZmZzZXRQb3NpdGlvblwiLFxuICAgICAgICAgIFwib2Zmc2V0Um90YXRlXCJcbiAgICAgICAgXSxcbiAgICAgICAgb3V0bGluZTogW1wib3V0bGluZUNvbG9yXCIsIFwib3V0bGluZVN0eWxlXCIsIFwib3V0bGluZVdpZHRoXCJdLFxuICAgICAgICBvdmVyZmxvdzogW1wib3ZlcmZsb3dYXCIsIFwib3ZlcmZsb3dZXCJdLFxuICAgICAgICBvdmVyc2Nyb2xsQmVoYXZpb3I6IFtcIm92ZXJzY3JvbGxCZWhhdmlvclhcIiwgXCJvdmVyc2Nyb2xsQmVoYXZpb3JZXCJdLFxuICAgICAgICBwYWRkaW5nOiBbXCJwYWRkaW5nQm90dG9tXCIsIFwicGFkZGluZ0xlZnRcIiwgXCJwYWRkaW5nUmlnaHRcIiwgXCJwYWRkaW5nVG9wXCJdLFxuICAgICAgICBwYWRkaW5nQmxvY2s6IFtcInBhZGRpbmdCbG9ja0VuZFwiLCBcInBhZGRpbmdCbG9ja1N0YXJ0XCJdLFxuICAgICAgICBwYWRkaW5nSW5saW5lOiBbXCJwYWRkaW5nSW5saW5lRW5kXCIsIFwicGFkZGluZ0lubGluZVN0YXJ0XCJdLFxuICAgICAgICBwYWdlQnJlYWtBZnRlcjogW1wiYnJlYWtBZnRlclwiXSxcbiAgICAgICAgcGFnZUJyZWFrQmVmb3JlOiBbXCJicmVha0JlZm9yZVwiXSxcbiAgICAgICAgcGFnZUJyZWFrSW5zaWRlOiBbXCJicmVha0luc2lkZVwiXSxcbiAgICAgICAgcGxhY2VDb250ZW50OiBbXCJhbGlnbkNvbnRlbnRcIiwgXCJqdXN0aWZ5Q29udGVudFwiXSxcbiAgICAgICAgcGxhY2VJdGVtczogW1wiYWxpZ25JdGVtc1wiLCBcImp1c3RpZnlJdGVtc1wiXSxcbiAgICAgICAgcGxhY2VTZWxmOiBbXCJhbGlnblNlbGZcIiwgXCJqdXN0aWZ5U2VsZlwiXSxcbiAgICAgICAgc2Nyb2xsTWFyZ2luOiBbXG4gICAgICAgICAgXCJzY3JvbGxNYXJnaW5Cb3R0b21cIixcbiAgICAgICAgICBcInNjcm9sbE1hcmdpbkxlZnRcIixcbiAgICAgICAgICBcInNjcm9sbE1hcmdpblJpZ2h0XCIsXG4gICAgICAgICAgXCJzY3JvbGxNYXJnaW5Ub3BcIlxuICAgICAgICBdLFxuICAgICAgICBzY3JvbGxNYXJnaW5CbG9jazogW1wic2Nyb2xsTWFyZ2luQmxvY2tFbmRcIiwgXCJzY3JvbGxNYXJnaW5CbG9ja1N0YXJ0XCJdLFxuICAgICAgICBzY3JvbGxNYXJnaW5JbmxpbmU6IFtcbiAgICAgICAgICBcInNjcm9sbE1hcmdpbklubGluZUVuZFwiLFxuICAgICAgICAgIFwic2Nyb2xsTWFyZ2luSW5saW5lU3RhcnRcIlxuICAgICAgICBdLFxuICAgICAgICBzY3JvbGxQYWRkaW5nOiBbXG4gICAgICAgICAgXCJzY3JvbGxQYWRkaW5nQm90dG9tXCIsXG4gICAgICAgICAgXCJzY3JvbGxQYWRkaW5nTGVmdFwiLFxuICAgICAgICAgIFwic2Nyb2xsUGFkZGluZ1JpZ2h0XCIsXG4gICAgICAgICAgXCJzY3JvbGxQYWRkaW5nVG9wXCJcbiAgICAgICAgXSxcbiAgICAgICAgc2Nyb2xsUGFkZGluZ0Jsb2NrOiBbXG4gICAgICAgICAgXCJzY3JvbGxQYWRkaW5nQmxvY2tFbmRcIixcbiAgICAgICAgICBcInNjcm9sbFBhZGRpbmdCbG9ja1N0YXJ0XCJcbiAgICAgICAgXSxcbiAgICAgICAgc2Nyb2xsUGFkZGluZ0lubGluZTogW1xuICAgICAgICAgIFwic2Nyb2xsUGFkZGluZ0lubGluZUVuZFwiLFxuICAgICAgICAgIFwic2Nyb2xsUGFkZGluZ0lubGluZVN0YXJ0XCJcbiAgICAgICAgXSxcbiAgICAgICAgdGV4dERlY29yYXRpb246IFtcbiAgICAgICAgICBcInRleHREZWNvcmF0aW9uQ29sb3JcIixcbiAgICAgICAgICBcInRleHREZWNvcmF0aW9uTGluZVwiLFxuICAgICAgICAgIFwidG
15852V4dERlY29yYXRpb25TdHlsZVwiLFxuICAgICAgICAgIFwidGV4dERlY29yYXRpb25UaGlja25lc3NcIlxuICAgICAgICBdLFxuICAgICAgICB0ZXh0RW1waGFzaXM6IFtcInRleHRFbXBoYXNpc0NvbG9yXCIsIFwidGV4dEVtcGhhc2lzU3R5bGVcIl0sXG4gICAgICAgIHRleHRXcmFwOiBbXCJ0ZXh0V3JhcE1vZGVcIiwgXCJ0ZXh0V3JhcFN0eWxlXCJdLFxuICAgICAgICB0cmFuc2l0aW9uOiBbXG4gICAgICAgICAgXCJ0cmFuc2l0aW9uQmVoYXZpb3JcIixcbiAgICAgICAgICBcInRyYW5zaXRpb25EZWxheVwiLFxuICAgICAgICAgIFwidHJhbnNpdGlvbkR1cmF0aW9uXCIsXG4gICAgICAgICAgXCJ0cmFuc2l0aW9uUHJvcGVydHlcIixcbiAgICAgICAgICBcInRyYW5zaXRpb25UaW1pbmdGdW5jdGlvblwiXG4gICAgICAgIF0sXG4gICAgICAgIHZlcnRpY2FsQWxpZ246IFtcImFsaWdubWVudEJhc2VsaW5lXCIsIFwiYmFzZWxpbmVTaGlmdFwiLCBcImJhc2VsaW5lU291cmNlXCJdLFxuICAgICAgICB3aGl0ZVNwYWNlOiBbXCJ0ZXh0V3JhcE1vZGVcIiwgXCJ3aGl0ZVNwYWNlQ29sbGFwc2VcIl0sXG4gICAgICAgIHdvcmRXcmFwOiBbXCJvdmVyZmxvd1dyYXBcIl1cbiAgICAgIH0sXG4gICAgICB1cHBlcmNhc2VQYXR0ZXJuID0gLyhbQS1aXSkvZyxcbiAgICAgIG1zUGF0dGVybiQxID0gL15tcy0vLFxuICAgICAgYmFkVmVuZG9yZWRTdHlsZU5hbWVQYXR0ZXJuID0gL14oPzp3ZWJraXR8bW96fG8pW0EtWl0vLFxuICAgICAgbXNQYXR0ZXJuID0gL14tbXMtLyxcbiAgICAgIGh5cGhlblBhdHRlcm4gPSAvLSguKS9nLFxuICAgICAgYmFkU3R5bGVWYWx1ZVdpdGhTZW1pY29sb25QYXR0ZXJuID0gLztcXHMqJC8sXG4gICAgICB3YXJuZWRTdHlsZU5hbWVzID0ge30sXG4gICAgICB3YXJuZWRTdHlsZVZhbHVlcyA9IHt9LFxuICAgICAgd2FybmVkRm9yTmFOVmFsdWUgPSAhMSxcbiAgICAgIHdhcm5lZEZvckluZmluaXR5VmFsdWUgPSAhMSxcbiAgICAgIHVuaXRsZXNzTnVtYmVycyA9IG5ldyBTZXQoXG4gICAgICAgIFwiYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQgYXNwZWN0UmF0aW8gYm9yZGVySW1hZ2VPdXRzZXQgYm9yZGVySW1hZ2VTbGljZSBib3JkZXJJbWFnZVdpZHRoIGJveEZsZXggYm94RmxleEdyb3VwIGJveE9yZGluYWxHcm91cCBjb2x1bW5Db3VudCBjb2x1bW5zIGZsZXggZmxleEdyb3cgZmxleFBvc2l0aXZlIGZsZXhTaHJpbmsgZmxleE5lZ2F0aXZlIGZsZXhPcmRlciBncmlkQXJlYSBncmlkUm93IGdyaWRSb3dFbmQgZ3JpZFJvd1NwYW4gZ3JpZFJvd1N0YXJ0IGdyaWRDb2x1bW4gZ3JpZENvbHVtbkVuZCBncmlkQ29sdW1uU3BhbiBncmlkQ29sdW1uU3RhcnQgZm9udFdlaWdodCBsaW5lQ2xhbXAgbGluZUhlaWdodCBvcGFjaXR5IG9yZGVyIG9ycGhhbnMgc2NhbGUgdGFiU2l6ZSB3aWRvd3MgekluZGV4IHpvb20gZmlsbE9wYWNpdHkgZmxvb2RPcGFjaXR5IHN0b3BPcGFjaXR5IHN0cm9rZURhc2hhcnJheSBzdHJva2VEYXNob2Zmc2V0IHN0cm9rZU1pdGVybGltaXQgc3Ryb2tlT3BhY2l0eSBzdHJva2VXaWR0aCBNb3pBbmltYXRpb25JdGVyYXRpb25Db3VudCBNb3pCb3hGbGV4IE1vekJveEZsZXhHcm91cCBNb3pMaW5lQ2xhbXAgbXNBbmltYXRpb25JdGVyYXRpb25Db3VudCBtc0ZsZXggbXNab29tIG1zRmxleEdyb3cgbXNGbGV4TmVnYXRpdmUgbXNGbGV4T3JkZXIgbXNGbGV4UG9zaXRpdmUgbXNGbGV4U2hyaW5rIG1zR3JpZENvbHVtbiBtc0dyaWRDb2x1bW5TcGFuIG1zR3JpZFJvdyBtc0dyaWRSb3dTcGFuIFdlYmtpdEFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50IFdlYmtpdEJveEZsZXggV2ViS2l0Qm94RmxleEdyb3VwIFdlYmtpdEJveE9yZGluYWxHcm91cCBXZWJraXRDb2x1bW5Db3VudCBXZWJraXRDb2x1bW5zIFdlYmtpdEZsZXggV2Via2l0RmxleEdyb3cgV2Via2l0RmxleFBvc2l0aXZlIFdlYmtpdEZsZXhTaHJpbmsgV2Via2l0TGluZUNsYW1wXCIuc3BsaXQoXG4gICAgICAgICAgXCIgXCJcbiAgICAgICAgKVxuICAgICAgKSxcbiAgICAgIE1BVEhfTkFNRVNQQUNFID0gXCJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MXCIsXG4gICAgICBTVkdfTkFNRVNQQUNFID0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgICAgYWxpYXNlcyA9IG5ldyBNYXAoW1xuICAgICAgICBbXCJhY2NlcHRDaGFyc2V0XCIsIFwiYWNjZXB0LWNoYXJzZXRcIl0sXG4gICAgICAgIFtcImh0bWxGb3JcIiwgXCJmb3JcIl0sXG4gICAgICAgIFtcImh0dHBFcXVpdlwiLCBcImh0dHAtZXF1aXZcIl0sXG4gICAgICAgIFtcImNyb3NzT3JpZ2luXCIsIFwiY3Jvc3NvcmlnaW5cIl0sXG4gICAgICAgIFtcImFjY2VudEhlaWdodFwiLCBcImFjY2VudC1oZWlnaHRcIl0sXG4gICAgICAgIFtcImFsaWdubWVudEJhc2VsaW5lXCIsIFwiYWxpZ25tZW50LWJhc2VsaW5lXCJdLFxuICAgICAgICBbXCJhcmFiaWNGb3JtXCIsIFwiYXJhYmljLWZvcm1cIl0sXG4gICAgICAgIFtcImJhc2VsaW5lU2hpZnRcIiwgXCJiYXNlbGluZS1zaGlmdFwiXSxcbiAgICAgICAgW1wiY2FwSGVpZ2h0XCIsIFwiY2FwLWhlaWdodFwiXSxcbiAgICAgICAgW1wiY2xpcFBhdGhcIiwgXCJjbGlwLXBhdGhcIl0sXG4gICAgICAgIFtcImNsaXBSdWxlXCIsIFwiY2xpcC1ydWxlXCJdLFxuICAgICAgICBbXCJjb2xvckludGVycG9sYXRpb25cIiwgXCJjb2xvci1pbnRlcnBvbGF0aW9uXCJdLFxuICAgICAgICBbXCJjb2xvckludGVycG9sYXRpb25GaWx0ZXJzXCIsIFwiY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzXCJdLFxuICAgICAgICBbXCJjb2xvclByb2ZpbGVcIiwgXCJjb2xvci1wcm9maWxlXCJdLFxuICAgICAgICBbXCJjb2xvclJlbmRlcmluZ1wiLCBcImNvbG9yLXJlbmRlcmluZ1wiXSxcbiAgICAgICAgW1wiZG9taW5hbnRCYXNlbGluZVwiLCBcImRvbWluYW50LWJhc2VsaW5lXCJdLFxuICAgICAgICBbXCJlbmFibGVCYWNrZ3JvdW5kXCIsIFwiZW5hYmxlLWJhY2tncm91bmRcIl0sXG4gICAgICAgIFtcImZpbGxPcGFjaXR5XCIsIFwiZmlsbC1vcGFjaXR5XCJdLFxuICAgICAgICBbXCJmaWxsUnVsZVwiLCBcImZpbGwtcnVsZVwiXSxcbiAgICAgICAgW1wiZmxvb2RDb2xvclwiLCBcImZsb29kLWNvbG9yXCJdLFxuICAgICAgICBbXCJmbG9vZE9wYWNpdHlcIiwgXCJmbG9vZC1vcGFjaXR5XCJdLFxuICAgICAgICBbXCJmb250RmFtaWx5XCIsIFwiZm9udC1mYW1pbHlcIl0sXG4gICAgICAgIFtcImZvbnRTaXplXCIsIFwiZm9udC1zaXplXCJdLFxuICAgICAgICBbXCJmb250U2l6ZU
15852FkanVzdFwiLCBcImZvbnQtc2l6ZS1hZGp1c3RcIl0sXG4gICAgICAgIFtcImZvbnRTdHJldGNoXCIsIFwiZm9udC1zdHJldGNoXCJdLFxuICAgICAgICBbXCJmb250U3R5bGVcIiwgXCJmb250LXN0eWxlXCJdLFxuICAgICAgICBbXCJmb250VmFyaWFudFwiLCBcImZvbnQtdmFyaWFudFwiXSxcbiAgICAgICAgW1wiZm9udFdlaWdodFwiLCBcImZvbnQtd2VpZ2h0XCJdLFxuICAgICAgICBbXCJnbHlwaE5hbWVcIiwgXCJnbHlwaC1uYW1lXCJdLFxuICAgICAgICBbXCJnbHlwaE9yaWVudGF0aW9uSG9yaXpvbnRhbFwiLCBcImdseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWxcIl0sXG4gICAgICAgIFtcImdseXBoT3JpZW50YXRpb25WZXJ0aWNhbFwiLCBcImdseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsXCJdLFxuICAgICAgICBbXCJob3JpekFkdlhcIiwgXCJob3Jpei1hZHYteFwiXSxcbiAgICAgICAgW1wiaG9yaXpPcmlnaW5YXCIsIFwiaG9yaXotb3JpZ2luLXhcIl0sXG4gICAgICAgIFtcImltYWdlUmVuZGVyaW5nXCIsIFwiaW1hZ2UtcmVuZGVyaW5nXCJdLFxuICAgICAgICBbXCJsZXR0ZXJTcGFjaW5nXCIsIFwibGV0dGVyLXNwYWNpbmdcIl0sXG4gICAgICAgIFtcImxpZ2h0aW5nQ29sb3JcIiwgXCJsaWdodGluZy1jb2xvclwiXSxcbiAgICAgICAgW1wibWFya2VyRW5kXCIsIFwibWFya2VyLWVuZFwiXSxcbiAgICAgICAgW1wibWFya2VyTWlkXCIsIFwibWFya2VyLW1pZFwiXSxcbiAgICAgICAgW1wibWFya2VyU3RhcnRcIiwgXCJtYXJrZXItc3RhcnRcIl0sXG4gICAgICAgIFtcIm1hc2tUeXBlXCIsIFwibWFzay10eXBlXCJdLFxuICAgICAgICBbXCJvdmVybGluZVBvc2l0aW9uXCIsIFwib3ZlcmxpbmUtcG9zaXRpb25cIl0sXG4gICAgICAgIFtcIm92ZXJsaW5lVGhpY2tuZXNzXCIsIFwib3ZlcmxpbmUtdGhpY2tuZXNzXCJdLFxuICAgICAgICBbXCJwYWludE9yZGVyXCIsIFwicGFpbnQtb3JkZXJcIl0sXG4gICAgICAgIFtcInBhbm9zZS0xXCIsIFwicGFub3NlLTFcIl0sXG4gICAgICAgIFtcInBvaW50ZXJFdmVudHNcIiwgXCJwb2ludGVyLWV2ZW50c1wiXSxcbiAgICAgICAgW1wicmVuZGVyaW5nSW50ZW50XCIsIFwicmVuZGVyaW5nLWludGVudFwiXSxcbiAgICAgICAgW1wic2hhcGVSZW5kZXJpbmdcIiwgXCJzaGFwZS1yZW5kZXJpbmdcIl0sXG4gICAgICAgIFtcInN0b3BDb2xvclwiLCBcInN0b3AtY29sb3JcIl0sXG4gICAgICAgIFtcInN0b3BPcGFjaXR5XCIsIFwic3RvcC1vcGFjaXR5XCJdLFxuICAgICAgICBbXCJzdHJpa2V0aHJvdWdoUG9zaXRpb25cIiwgXCJzdHJpa2V0aHJvdWdoLXBvc2l0aW9uXCJdLFxuICAgICAgICBbXCJzdHJpa2V0aHJvdWdoVGhpY2tuZXNzXCIsIFwic3RyaWtldGhyb3VnaC10aGlja25lc3NcIl0sXG4gICAgICAgIFtcInN0cm9rZURhc2hhcnJheVwiLCBcInN0cm9rZS1kYXNoYXJyYXlcIl0sXG4gICAgICAgIFtcInN0cm9rZURhc2hvZmZzZXRcIiwgXCJzdHJva2UtZGFzaG9mZnNldFwiXSxcbiAgICAgICAgW1wic3Ryb2tlTGluZWNhcFwiLCBcInN0cm9rZS1saW5lY2FwXCJdLFxuICAgICAgICBbXCJzdHJva2VMaW5lam9pblwiLCBcInN0cm9rZS1saW5lam9pblwiXSxcbiAgICAgICAgW1wic3Ryb2tlTWl0ZXJsaW1pdFwiLCBcInN0cm9rZS1taXRlcmxpbWl0XCJdLFxuICAgICAgICBbXCJzdHJva2VPcGFjaXR5XCIsIFwic3Ryb2tlLW9wYWNpdHlcIl0sXG4gICAgICAgIFtcInN0cm9rZVdpZHRoXCIsIFwic3Ryb2tlLXdpZHRoXCJdLFxuICAgICAgICBbXCJ0ZXh0QW5jaG9yXCIsIFwidGV4dC1hbmNob3JcIl0sXG4gICAgICAgIFtcInRleHREZWNvcmF0aW9uXCIsIFwidGV4dC1kZWNvcmF0aW9uXCJdLFxuICAgICAgICBbXCJ0ZXh0UmVuZGVyaW5nXCIsIFwidGV4dC1yZW5kZXJpbmdcIl0sXG4gICAgICAgIFtcInRyYW5zZm9ybU9yaWdpblwiLCBcInRyYW5zZm9ybS1vcmlnaW5cIl0sXG4gICAgICAgIFtcInVuZGVybGluZVBvc2l0aW9uXCIsIFwidW5kZXJsaW5lLXBvc2l0aW9uXCJdLFxuICAgICAgICBbXCJ1bmRlcmxpbmVUaGlja25lc3NcIiwgXCJ1bmRlcmxpbmUtdGhpY2tuZXNzXCJdLFxuICAgICAgICBbXCJ1bmljb2RlQmlkaVwiLCBcInVuaWNvZGUtYmlkaVwiXSxcbiAgICAgICAgW1widW5pY29kZVJhbmdlXCIsIFwidW5pY29kZS1yYW5nZVwiXSxcbiAgICAgICAgW1widW5pdHNQZXJFbVwiLCBcInVuaXRzLXBlci1lbVwiXSxcbiAgICAgICAgW1widkFscGhhYmV0aWNcIiwgXCJ2LWFscGhhYmV0aWNcIl0sXG4gICAgICAgIFtcInZIYW5naW5nXCIsIFwidi1oYW5naW5nXCJdLFxuICAgICAgICBbXCJ2SWRlb2dyYXBoaWNcIiwgXCJ2LWlkZW9ncmFwaGljXCJdLFxuICAgICAgICBbXCJ2TWF0aGVtYXRpY2FsXCIsIFwidi1tYXRoZW1hdGljYWxcIl0sXG4gICAgICAgIFtcInZlY3RvckVmZmVjdFwiLCBcInZlY3Rvci1lZmZlY3RcIl0sXG4gICAgICAgIFtcInZlcnRBZHZZXCIsIFwidmVydC1hZHYteVwiXSxcbiAgICAgICAgW1widmVydE9yaWdpblhcIiwgXCJ2ZXJ0LW9yaWdpbi14XCJdLFxuICAgICAgICBbXCJ2ZXJ0T3JpZ2luWVwiLCBcInZlcnQtb3Jp
15852Z2luLXlcIl0sXG4gICAgICAgIFtcIndvcmRTcGFjaW5nXCIsIFwid29yZC1zcGFjaW5nXCJdLFxuICAgICAgICBbXCJ3cml0aW5nTW9kZVwiLCBcIndyaXRpbmctbW9kZVwiXSxcbiAgICAgICAgW1wieG1sbnNYbGlua1wiLCBcInhtbG5zOnhsaW5rXCJdLFxuICAgICAgICBbXCJ4SGVpZ2h0XCIsIFwieC1oZWlnaHRcIl1cbiAgICAgIF0pLFxuICAgICAgcG9zc2libGVTdGFuZGFyZE5hbWVzID0ge1xuICAgICAgICBhY2NlcHQ6IFwiYWNjZXB0XCIsXG4gICAgICAgIGFjY2VwdGNoYXJzZXQ6IFwiYWNjZXB0Q2hhcnNldFwiLFxuICAgICAgICBcImFjY2VwdC1jaGFyc2V0XCI6IFwiYWNjZXB0Q2hhcnNldFwiLFxuICAgICAgICBhY2Nlc3NrZXk6IFwiYWNjZXNzS2V5XCIsXG4gICAgICAgIGFjdGlvbjogXCJhY3Rpb25cIixcbiAgICAgICAgYWxsb3dmdWxsc2NyZWVuOiBcImFsbG93RnVsbFNjcmVlblwiLFxuICAgICAgICBhbHQ6IFwiYWx0XCIsXG4gICAgICAgIGFzOiBcImFzXCIsXG4gICAgICAgIGFzeW5jOiBcImFzeW5jXCIsXG4gICAgICAgIGF1dG9jYXBpdGFsaXplOiBcImF1dG9DYXBpdGFsaXplXCIsXG4gICAgICAgIGF1dG9jb21wbGV0ZTogXCJhdXRvQ29tcGxldGVcIixcbiAgICAgICAgYXV0b2NvcnJlY3Q6IFwiYXV0b0NvcnJlY3RcIixcbiAgICAgICAgYXV0b2ZvY3VzOiBcImF1dG9Gb2N1c1wiLFxuICAgICAgICBhdXRvcGxheTogXCJhdXRvUGxheVwiLFxuICAgICAgICBhdXRvc2F2ZTogXCJhdXRvU2F2ZVwiLFxuICAgICAgICBjYXB0dXJlOiBcImNhcHR1cmVcIixcbiAgICAgICAgY2VsbHBhZGRpbmc6IFwiY2VsbFBhZGRpbmdcIixcbiAgICAgICAgY2VsbHNwYWNpbmc6IFwiY2VsbFNwYWNpbmdcIixcbiAgICAgICAgY2hhbGxlbmdlOiBcImNoYWxsZW5nZVwiLFxuICAgICAgICBjaGFyc2V0OiBcImNoYXJTZXRcIixcbiAgICAgICAgY2hlY2tlZDogXCJjaGVja2VkXCIsXG4gICAgICAgIGNoaWxkcmVuOiBcImNoaWxkcmVuXCIsXG4gICAgICAgIGNpdGU6IFwiY2l0ZVwiLFxuICAgICAgICBjbGFzczogXCJjbGFzc05hbWVcIixcbiAgICAgICAgY2xhc3NpZDogXCJjbGFzc0lEXCIsXG4gICAgICAgIGNsYXNzbmFtZTogXCJjbGFzc05hbWVcIixcbiAgICAgICAgY29sczogXCJjb2xzXCIsXG4gICAgICAgIGNvbHNwYW46IFwiY29sU3BhblwiLFxuICAgICAgICBjb250ZW50OiBcImNvbnRlbnRcIixcbiAgICAgICAgY29udGVudGVkaXRhYmxlOiBcImNvbnRlbnRFZGl0YWJsZVwiLFxuICAgICAgICBjb250ZXh0bWVudTogXCJjb250ZXh0TWVudVwiLFxuICAgICAgICBjb250cm9sczogXCJjb250cm9sc1wiLFxuICAgICAgICBjb250cm9sc2xpc3Q6IFwiY29udHJvbHNMaXN0XCIsXG4gICAgICAgIGNvb3JkczogXCJjb29yZHNcIixcbiAgICAgICAgY3JlZGVudGlhbGxlc3M6IFwiY3JlZGVudGlhbGxlc3NcIixcbiAgICAgICAgY3Jvc3NvcmlnaW46IFwiY3Jvc3NPcmlnaW5cIixcbiAgICAgICAgZGFuZ2Vyb3VzbHlzZXRpbm5lcmh0bWw6IFwiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxcIixcbiAgICAgICAgZGF0YTogXCJkYXRhXCIsXG4gICAgICAgIGRhdGV0aW1lOiBcImRhdGVUaW1lXCIsXG4gICAgICAgIGRlZmF1bHQ6IFwiZGVmYXVsdFwiLFxuICAgICAgICBkZWZhdWx0Y2hlY2tlZDogXCJkZWZhdWx0Q2hlY2tlZFwiLFxuICAgICAgICBkZWZhdWx0dmFsdWU6IFwiZGVmYXVsdFZhbHVlXCIsXG4gICAgICAgIGRlZmVyOiBcImRlZmVyXCIsXG4gICAgICAgIGRpcjogXCJkaXJcIixcbiAgICAgICAgZGlzYWJsZWQ6IFwiZGlzYWJsZWRcIixcbiAgICAgICAgZGlzYWJsZXBpY3R1cmVpbnBpY3R1cmU6IFwiZGlzYWJsZVBpY3R1cmVJblBpY3R1cmVcIixcbiAgICAgICAgZGlzYWJsZXJlbW90ZXBsYXliYWNrOiBcImRpc2FibGVSZW1vdGVQbGF5YmFja1wiLFxuICAgICAgICBkb3dubG9hZDogXCJkb3dubG9hZFwiLFxuICAgICAgICBkcmFnZ2FibGU6IFwiZHJhZ2dhYmxlXCIsXG4gICAgICAgIGVuY3R5cGU6IFwiZW5jVHlwZVwiLFxuICAgICAgICBlbnRlcmtleWhpbnQ6IFwiZW50ZXJLZXlIaW50XCIsXG4gICAgICAgIGZldGNocHJpb3JpdHk6IFwiZmV0Y2hQcmlvcml0eVwiLFxuICAgICAgICBmb3I6IFwiaHRtbEZvclwiLFxuICAgICAgICBmb3JtOiBcImZvcm1cIixcbiAgICAgICAgZm9ybW1ldGhvZDogXCJmb3JtTWV0aG9kXCIsXG4gICAgICAgIGZvcm1hY3Rpb246IFwiZm9ybUFjdGlvblwiLFxuICAgICAgICBmb3JtZW5jdHlwZTogXCJmb3JtRW5jVHlwZVwiLFxuICAgICAgICBmb3Jtbm92YWxpZGF0ZTogXCJmb3JtTm9WYWxpZGF0ZVwiLFxuICAgICAgICBmb3JtdGFyZ2V0OiBcImZvcm1UYXJnZXRcIixcbiAgICAgICAgZnJhbWVib3JkZXI6IFwiZnJhbWVCb3JkZXJcIixcbiAgICAgICAgaGVhZGVyczogXCJoZWFkZXJzXCIsXG4gICAgICAgIGhlaWdodDogXCJoZWlnaHRcIixcbiAgICAgICAgaGlkZGVuOiBcImhpZGRlblwiLFxuICAgICAgICBoaWdoOiBcImhpZ2hcIixcbiAgICAgICAgaHJlZjogXCJocmVmXCIsXG4gICAgICAgIGhyZWZsYW5nOiBcImhyZWZMYW5nXCIsXG4gICAgICAgIGh0bWxmb3I6IFwiaHRtbEZvclwiLFxuICAgICAgICBodHRwZXF1aXY6IFwiaHR0cEVxdWl2XCIsXG4gICAgICAgIFwiaHR0cC1lcXVpdlwiOiBcImh0dHBFcXVpdlwiLFxuICAgICAgICBpY29uOiBcImljb25cIixcbiAgICAgICAgaWQ6IFwiaWRcIixcbiAgICAgICAgaW1hZ2VzaXplczogXCJpbWFnZVNpemVzXCIsXG4gICAgICAgIGltYWdlc3Jjc2V0OiBcImltYWdlU3JjU2V0XCIsXG4gICAgICAgIGluZXJ0OiBcImluZXJ0XCIsXG4gICAgICAgIGlubmVyaHRtbDogXCJpbm5lckhUTUxcIixcbiAgICAgICAgaW5wdXRtb2RlOiBcImlucHV0TW9kZVwiLFxuICAgICAgICBpbnRlZ3JpdHk6IFwiaW50ZWdyaXR5XCIsXG4gICAgICAgIGlzOiBcImlzXCIsXG4gICAgICAgIGl0ZW1pZDogXCJpdGVtSURcIixcbiAgICAgICAgaXRlbXByb3A6IFwiaXRlbVByb3BcIixcbiAgICAgICAgaXRlbXJlZjogXCJpdGVtUmVmXCIsXG4gICAgICAgIGl0ZW1zY29wZTogXCJpdGVtU2NvcGVcIixcbiAgICAgICAgaXRlbXR5cGU6IFwiaXRlbVR5cGVcIixcbiAgICAgICAga2V5cGFyYW1zOiBcImtleVBhcmFtc1wiLFxuICAgICAgICBrZXl0eXBlOiBcImtleVR5cGVcIixcbiAgICAgICAga2luZDogXCJraW5kXCIsXG4gICAgICAgIGxhYmVsOiBcImxhYmVsXCIsXG4gICAgICAgIGxhbmc6IFwibGFuZ1wiLFxuICAgICAgICBsaXN0OiBcImxpc3RcIixcbiAgICAgICAgbG9vcDogXCJsb29wXCIsXG4gICAgICAgIGxvdzogXCJsb3dcIixcbiAgICAgICAgbWFuaWZlc3Q6IFwibWFuaWZlc3RcIixcbiAgICAgICAgbWFyZ2lud2lkdGg6IFwibWFyZ2luV2lkdGhcIixcbiAgICAgICAgbWFyZ2luaGVpZ2h0OiBcIm1hcmdpbkhlaWdodFwiLFxuICAgICAgICBtYXg6IFwibWF4XCIsXG4gICAgICAgIG1heGxlbmd0aDogXCJtYXhMZW5ndGhcIixcbiAgICAgICAgbWVkaWE6IFwibWVkaWFcIixcbiAgICAgICAgbWVkaWFncm91cDogXCJtZWRpYUdyb3VwXCIsXG4gICAgICAgIG1ldGhvZDogXCJtZXRob2RcIixcbiAgICAgICAgbWluOiBcIm1pblwiLFxuICAgICAgICBtaW5sZW5ndGg6IFwibWluTGVuZ3RoXCIsXG4gICAgICAgIG11bHRpcGxlOiBcIm11bHRpcGxlXCIsXG4gICAgICAgIG11dGVkOiBcIm11dG
15852VkXCIsXG4gICAgICAgIG5hbWU6IFwibmFtZVwiLFxuICAgICAgICBub21vZHVsZTogXCJub01vZHVsZVwiLFxuICAgICAgICBub25jZTogXCJub25jZVwiLFxuICAgICAgICBub3ZhbGlkYXRlOiBcIm5vVmFsaWRhdGVcIixcbiAgICAgICAgb3BlbjogXCJvcGVuXCIsXG4gICAgICAgIG9wdGltdW06IFwib3B0aW11bVwiLFxuICAgICAgICBwYXR0ZXJuOiBcInBhdHRlcm5cIixcbiAgICAgICAgcGxhY2Vob2xkZXI6IFwicGxhY2Vob2xkZXJcIixcbiAgICAgICAgcGxheXNpbmxpbmU6IFwicGxheXNJbmxpbmVcIixcbiAgICAgICAgcG9zdGVyOiBcInBvc3RlclwiLFxuICAgICAgICBwcmVsb2FkOiBcInByZWxvYWRcIixcbiAgICAgICAgcHJvZmlsZTogXCJwcm9maWxlXCIsXG4gICAgICAgIHJhZGlvZ3JvdXA6IFwicmFkaW9Hcm91cFwiLFxuICAgICAgICByZWFkb25seTogXCJyZWFkT25seVwiLFxuICAgICAgICByZWZlcnJlcnBvbGljeTogXCJyZWZlcnJlclBvbGljeVwiLFxuICAgICAgICByZWw6IFwicmVsXCIsXG4gICAgICAgIHJlcXVpcmVkOiBcInJlcXVpcmVkXCIsXG4gICAgICAgIHJldmVyc2VkOiBcInJldmVyc2VkXCIsXG4gICAgICAgIHJvbGU6IFwicm9sZVwiLFxuICAgICAgICByb3dzOiBcInJvd3NcIixcbiAgICAgICAgcm93c3BhbjogXCJyb3dTcGFuXCIsXG4gICAgICAgIHNhbmRib3g6IFwic2FuZGJveFwiLFxuICAgICAgICBzY29wZTogXCJzY29wZVwiLFxuICAgICAgICBzY29wZWQ6IFwic2NvcGVkXCIsXG4gICAgICAgIHNjcm9sbGluZzogXCJzY3JvbGxpbmdcIixcbiAgICAgICAgc2VhbWxlc3M6IFwic2VhbWxlc3NcIixcbiAgICAgICAgc2VsZWN0ZWQ6IFwic2VsZWN0ZWRcIixcbiAgICAgICAgc2hhcGU6IFwic2hhcGVcIixcbiAgICAgICAgc2l6ZTogXCJzaXplXCIsXG4gICAgICAgIHNpemVzOiBcInNpemVzXCIsXG4gICAgICAgIHNwYW46IFwic3BhblwiLFxuICAgICAgICBzcGVsbGNoZWNrOiBcInNwZWxsQ2hlY2tcIixcbiAgICAgICAgc3JjOiBcInNyY1wiLFxuICAgICAgICBzcmNkb2M6IFwic3JjRG9jXCIsXG4gICAgICAgIHNyY2xhbmc6IFwic3JjTGFuZ1wiLFxuICAgICAgICBzcmNzZXQ6IFwic3JjU2V0XCIsXG4gICAgICAgIHN0YXJ0OiBcInN0YXJ0XCIsXG4gICAgICAgIHN0ZXA6IFwic3RlcFwiLFxuICAgICAgICBzdHlsZTogXCJzdHlsZVwiLFxuICAgICAgICBzdW1tYXJ5OiBcInN1bW1hcnlcIixcbiAgICAgICAgdGFiaW5kZXg6IFwidGFiSW5kZXhcIixcbiAgICAgICAgdGFyZ2V0OiBcInRhcmdldFwiLFxuICAgICAgICB0aXRsZTogXCJ0aXRsZVwiLFxuICAgICAgICB0eXBlOiBcInR5cGVcIixcbiAgICAgICAgdXNlbWFwOiBcInVzZU1hcFwiLFxuICAgICAgICB2YWx1ZTogXCJ2YWx1ZVwiLFxuICAgICAgICB3aWR0aDogXCJ3aWR0aFwiLFxuICAgICAgICB3bW9kZTogXCJ3bW9kZVwiLFxuICAgICAgICB3cmFwOiBcIndyYXBcIixcbiAgICAgICAgYWJvdXQ6IFwiYWJvdXRcIixcbiAgICAgICAgYWNjZW50aGVpZ2h0OiBcImFjY2VudEhlaWdodFwiLFxuICAgICAgICBcImFjY2VudC1oZWlnaHRcIjogXCJhY2NlbnRIZWlnaHRcIixcbiAgICAgICAgYWNjdW11bGF0ZTogXCJhY2N1bXVsYXRlXCIsXG4gICAgICAgIGFkZGl0aXZlOiBcImFkZGl0aXZlXCIsXG4gICAgICAgIGFsaWdubWVudGJhc2VsaW5lOiBcImFsaWdubWVudEJhc2VsaW5lXCIsXG4gICAgICAgIFwiYWxpZ25tZW50LWJhc2VsaW5lXCI6IFwiYWxpZ25tZW50QmFzZWxpbmVcIixcbiAgICAgICAgYWxsb3dyZW9yZGVyOiBcImFsbG93UmVvcmRlclwiLFxuICAgICAgICBhbHBoYWJldGljOiBcImFscGhhYmV0aWNcIixcbiAgICAgICAgYW1wbGl0dWRlOiBcImFtcGxpdHVkZVwiLFxuICAgICAgICBhcmFiaWNmb3JtOiBcImFyYWJpY0Zvcm1cIixcbiAgICAgICAgXCJhcmFiaWMtZm9ybVwiOiBcImFyYWJpY0Zvcm1cIixcbiAgICAgICAgYXNjZW50OiBcImFzY2VudFwiLFxuICAgICAgICBhdHRyaWJ1dGVuYW1lOiBcImF0dHJpYnV0ZU5hbWVcIixcbiAgICAgICAgYXR0cmlidXRldHlwZTogXCJhdHRyaWJ1dGVUeXBlXCIsXG4gICAgICAgIGF1dG9yZXZlcnNlOiBcImF1dG9SZXZlcnNlXCIsXG4gICAgICAgIGF6aW11dGg6IFwiYXppbXV0aFwiLFxuICAgICAgICBiYXNlZnJlcXVlbmN5OiBcImJhc2VGcmVxdWVuY3lcIixcbiAgICAgICAgYmFzZWxpbmVzaGlmdDogXCJiYXNlbGluZVNoaWZ0XCIsXG4gICAgICAgIFwiYmFzZWxpbmUtc2hpZnRcIjogXCJiYXNlbGluZVNoaWZ0XCIsXG4gICAgICAgIGJhc2Vwcm9maWxlOiBcImJhc2VQcm9maWxlXCIsXG4gICAgICAgIGJib3g6IFwiYmJveFwiLFxuICAgICAgICBiZWdpbjogXCJiZWdpblwiLFxuICAgICAgICBiaWFzOiBcImJpYXNcIixcbiAgICAgICAgYnk6IFwiYnlcIixcbiAgICAgICAgY2FsY21vZGU6IFwiY2FsY01vZGVcIixcbiAgICAgICAgY2FwaGVpZ2h0OiBcImNhcEhlaWdodFwiLFxuICAgICAgICBcImNhcC1oZWlnaHRcIjogXCJjYXBIZWlnaHRcIixcbiAgICAgICAgY2xpcDogXCJjbGlwXCIsXG4gICAgICAgIGNsaXBwYXRoOiBcImNsaXBQYXRoXCIsXG4gICAgICAgIFwiY2xpcC1wYXRoXCI6IFwiY2xpcFBhdGhcIixcbiAgICAgICAgY2xpcHBhdGh1bml0czogXCJjbGlwUGF0aFVuaXRzXCIsXG4gICAgICAgIGNsaXBydWxlOiBcImNsaXBSdWxlXCIsXG4gICAgICAgIFwiY2xpcC1ydWxlXCI6IFwiY2xpcFJ1bGVcIixcbiAgICAgICAgY29sb3I6IFwiY29sb3JcIixcbiAgICAgICAgY29sb3JpbnRlcnBvbGF0aW9uOiBcImNvbG9ySW50ZXJwb2xhdGlvblwiLFxuICAgICAgICBcImNvbG9yLWludGVycG9sYXRpb25cIjogXCJjb2xvckludGVycG9sYXRpb25cIixcbiAgICAgICAgY29sb3JpbnRlcnBvbGF0aW9uZmlsdGVyczogXCJjb2xvckludGVycG9sYXRpb25GaWx0ZXJzXCIsXG4gICAgICAgIFwiY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzXCI6IFwiY29sb3JJbnRlcnBvbGF0aW9uRmlsdGVyc1wiLFxuICAgICAgICBjb2xvcnByb2ZpbGU6IFwiY29sb3JQcm9maWxlXCIsXG4gICAgICAgIFwiY29sb3ItcHJvZmlsZVwiOiBcImNvbG9yUHJvZmlsZVwiLFxuICAgICAgICBjb2xvcnJlbmRlcmluZzogXCJjb2xvclJlbmRlcmluZ1wiLFxuICAgICAgICBcImNvbG9yLXJlbmRlcmluZ1wiOiBcImNvbG9yUmVuZGVyaW5nXCIsXG4gICAgICAgIGNvbnRlbn
15852RzY3JpcHR0eXBlOiBcImNvbnRlbnRTY3JpcHRUeXBlXCIsXG4gICAgICAgIGNvbnRlbnRzdHlsZXR5cGU6IFwiY29udGVudFN0eWxlVHlwZVwiLFxuICAgICAgICBjdXJzb3I6IFwiY3Vyc29yXCIsXG4gICAgICAgIGN4OiBcImN4XCIsXG4gICAgICAgIGN5OiBcImN5XCIsXG4gICAgICAgIGQ6IFwiZFwiLFxuICAgICAgICBkYXRhdHlwZTogXCJkYXRhdHlwZVwiLFxuICAgICAgICBkZWNlbGVyYXRlOiBcImRlY2VsZXJhdGVcIixcbiAgICAgICAgZGVzY2VudDogXCJkZXNjZW50XCIsXG4gICAgICAgIGRpZmZ1c2Vjb25zdGFudDogXCJkaWZmdXNlQ29uc3RhbnRcIixcbiAgICAgICAgZGlyZWN0aW9uOiBcImRpcmVjdGlvblwiLFxuICAgICAgICBkaXNwbGF5OiBcImRpc3BsYXlcIixcbiAgICAgICAgZGl2aXNvcjogXCJkaXZpc29yXCIsXG4gICAgICAgIGRvbWluYW50YmFzZWxpbmU6IFwiZG9taW5hbnRCYXNlbGluZVwiLFxuICAgICAgICBcImRvbWluYW50LWJhc2VsaW5lXCI6IFwiZG9taW5hbnRCYXNlbGluZVwiLFxuICAgICAgICBkdXI6IFwiZHVyXCIsXG4gICAgICAgIGR4OiBcImR4XCIsXG4gICAgICAgIGR5OiBcImR5XCIsXG4gICAgICAgIGVkZ2Vtb2RlOiBcImVkZ2VNb2RlXCIsXG4gICAgICAgIGVsZXZhdGlvbjogXCJlbGV2YXRpb25cIixcbiAgICAgICAgZW5hYmxlYmFja2dyb3VuZDogXCJlbmFibGVCYWNrZ3JvdW5kXCIsXG4gICAgICAgIFwiZW5hYmxlLWJhY2tncm91bmRcIjogXCJlbmFibGVCYWNrZ3JvdW5kXCIsXG4gICAgICAgIGVuZDogXCJlbmRcIixcbiAgICAgICAgZXhwb25lbnQ6IFwiZXhwb25lbnRcIixcbiAgICAgICAgZXh0ZXJuYWxyZXNvdXJjZXNyZXF1aXJlZDogXCJleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkXCIsXG4gICAgICAgIGZpbGw6IFwiZmlsbFwiLFxuICAgICAgICBmaWxsb3BhY2l0eTogXCJmaWxsT3BhY2l0eVwiLFxuICAgICAgICBcImZpbGwtb3BhY2l0eVwiOiBcImZpbGxPcGFjaXR5XCIsXG4gICAgICAgIGZpbGxydWxlOiBcImZpbGxSdWxlXCIsXG4gICAgICAgIFwiZmlsbC1ydWxlXCI6IFwiZmlsbFJ1bGVcIixcbiAgICAgICAgZmlsdGVyOiBcImZpbHRlclwiLFxuICAgICAgICBmaWx0ZXJyZXM6IFwiZmlsdGVyUmVzXCIsXG4gICAgICAgIGZpbHRlcnVuaXRzOiBcImZpbHRlclVuaXRzXCIsXG4gICAgICAgIGZsb29kb3BhY2l0eTogXCJmbG9vZE9wYWNpdHlcIixcbiAgICAgICAgXCJmbG9vZC1vcGFjaXR5XCI6IFwiZmxvb2RPcGFjaXR5XCIsXG4gICAgICAgIGZsb29kY29sb3I6IFwiZmxvb2RDb2xvclwiLFxuICAgICAgICBcImZsb29kLWNvbG9yXCI6IFwiZmxvb2RDb2xvclwiLFxuICAgICAgICBmb2N1c2FibGU6IFwiZm9jdXNhYmxlXCIsXG4gICAgICAgIGZvbnRmYW1pbHk6IFwiZm9udEZhbWlseVwiLFxuICAgICAgICBcImZvbnQtZmFtaWx5XCI6IFwiZm9udEZhbWlseVwiLFxuICAgICAgICBmb250c2l6ZTogXCJmb250U2l6ZVwiLFxuICAgICAgICBcImZvbnQtc2l6ZVwiOiBcImZvbnRTaXplXCIsXG4gICAgICAgIGZvbnRzaXplYWRqdXN0OiBcImZvbnRTaXplQWRqdXN0XCIsXG4gICAgICAgIFwiZm9udC1zaXplLWFkanVzdFwiOiBcImZvbnRTaXplQWRqdXN0XCIsXG4gICAgICAgIGZvbnRzdHJldGNoOiBcImZvbnRTdHJldGNoXCIsXG4gICAgICAgIFwiZm9udC1zdHJldGNoXCI6IFwiZm9udFN0cmV0Y2hcIixcbiAgICAgICAgZm9udHN0eWxlOiBcImZvbnRTdHlsZVwiLFxuICAgICAgICBcImZvbnQtc3R5bGVcIjogXCJmb250U3R5bGVcIixcbiAgICAgICAgZm9udHZhcmlhbnQ6IFwiZm9udFZhcmlhbnRcIixcbiAgICAgICAgXCJmb250LXZhcmlhbnRcIjogXCJmb250VmFyaWFudFwiLFxuICAgICAgICBmb250d2VpZ2h0OiBcImZvbnRXZWlnaHRcIixcbiAgICAgICAgXCJmb250LXdlaWdodFwiOiBcImZvbnRXZWlnaHRcIixcbiAgICAgICAgZm9ybWF0OiBcImZvcm1hdFwiLFxuICAgICAgICBmcm9tOiBcImZyb21cIixcbiAgICAgICAgZng6IFwiZnhcIixcbiAgICAgICAgZnk6IFwiZnlcIixcbiAgICAgICAgZzE6IFwiZzFcIixcbiAgICAgICAgZzI6IFwiZzJcIixcbiAgICAgICAgZ2x5cGhuYW1lOiBcImdseXBoTmFtZVwiLFxuICAgICAgICBcImdseXBoLW5hbWVcIjogXCJnbHlwaE5hbWVcIixcbiAgICAgICAgZ2x5cGhvcmllbnRhdGlvbmhvcml6b250YWw6IFwiZ2x5cGhPcmllbnRhdGlvbkhvcml6b250YWxcIixcbiAgICAgICAgXCJnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsXCI6IFwiZ2x5cGhPcmllbnRhdGlvbkhvcml6b250YWxcIixcbiAgICAgICAgZ2x5cGhvcmllbnRhdGlvbnZlcnRpY2FsOiBcImdseXBoT3JpZW50YXRpb25WZXJ0aWNhbFwiLFxuICAgICAgICBcImdseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsXCI6IFwiZ2x5cGhPcmllbnRhdGlvblZlcnRpY2FsXCIsXG4gICAgICAgIGdseXBocmVmOiBcImdseXBoUmVmXCIsXG4gICAgICAgIGdyYWRpZW50dHJhbnNmb3JtOiBcImdyYWRpZW50VHJhbnNmb3JtXCIsXG4gICAgICAgIGdyYWRpZW50dW5pdHM6IFwiZ3JhZGllbnRVbml0c1wiLFxuICAgICAgICBoYW5naW5nOiBcImhhbmdpbmdcIixcbiAgICAgICAgaG9yaXphZHZ4OiBcImhvcml6QWR2WFwiLFxuICAgICAgICBcImhvcml6LWFkdi14XCI6IFwiaG9yaXpBZHZYXCIsXG4gICAgICAgIGhvcml6b3JpZ2lueDogXCJob3Jpek9yaWdpblhcIixcbiAgICAgICAgXCJob3Jpei1vcmlnaW4teFwiOiBcImhvcml6T3JpZ2luWFwiLFxuICAgICAgICBpZGVvZ3JhcGhpYzogXCJpZGVvZ3JhcGh
15852pY1wiLFxuICAgICAgICBpbWFnZXJlbmRlcmluZzogXCJpbWFnZVJlbmRlcmluZ1wiLFxuICAgICAgICBcImltYWdlLXJlbmRlcmluZ1wiOiBcImltYWdlUmVuZGVyaW5nXCIsXG4gICAgICAgIGluMjogXCJpbjJcIixcbiAgICAgICAgaW46IFwiaW5cIixcbiAgICAgICAgaW5saXN0OiBcImlubGlzdFwiLFxuICAgICAgICBpbnRlcmNlcHQ6IFwiaW50ZXJjZXB0XCIsXG4gICAgICAgIGsxOiBcImsxXCIsXG4gICAgICAgIGsyOiBcImsyXCIsXG4gICAgICAgIGszOiBcImszXCIsXG4gICAgICAgIGs0OiBcIms0XCIsXG4gICAgICAgIGs6IFwia1wiLFxuICAgICAgICBrZXJuZWxtYXRyaXg6IFwia2VybmVsTWF0cml4XCIsXG4gICAgICAgIGtlcm5lbHVuaXRsZW5ndGg6IFwia2VybmVsVW5pdExlbmd0aFwiLFxuICAgICAgICBrZXJuaW5nOiBcImtlcm5pbmdcIixcbiAgICAgICAga2V5cG9pbnRzOiBcImtleVBvaW50c1wiLFxuICAgICAgICBrZXlzcGxpbmVzOiBcImtleVNwbGluZXNcIixcbiAgICAgICAga2V5dGltZXM6IFwia2V5VGltZXNcIixcbiAgICAgICAgbGVuZ3RoYWRqdXN0OiBcImxlbmd0aEFkanVzdFwiLFxuICAgICAgICBsZXR0ZXJzcGFjaW5nOiBcImxldHRlclNwYWNpbmdcIixcbiAgICAgICAgXCJsZXR0ZXItc3BhY2luZ1wiOiBcImxldHRlclNwYWNpbmdcIixcbiAgICAgICAgbGlnaHRpbmdjb2xvcjogXCJsaWdodGluZ0NvbG9yXCIsXG4gICAgICAgIFwibGlnaHRpbmctY29sb3JcIjogXCJsaWdodGluZ0NvbG9yXCIsXG4gICAgICAgIGxpbWl0aW5nY29uZWFuZ2xlOiBcImxpbWl0aW5nQ29uZUFuZ2xlXCIsXG4gICAgICAgIGxvY2FsOiBcImxvY2FsXCIsXG4gICAgICAgIG1hcmtlcmVuZDogXCJtYXJrZXJFbmRcIixcbiAgICAgICAgXCJtYXJrZXItZW5kXCI6IFwibWFya2VyRW5kXCIsXG4gICAgICAgIG1hcmtlcmhlaWdodDogXCJtYXJrZXJIZWlnaHRcIixcbiAgICAgICAgbWFya2VybWlkOiBcIm1hcmtlck1pZFwiLFxuICAgICAgICBcIm1hcmtlci1taWRcIjogXCJtYXJrZXJNaWRcIixcbiAgICAgICAgbWFya2Vyc3RhcnQ6IFwibWFya2VyU3RhcnRcIixcbiAgICAgICAgXCJtYXJrZXItc3RhcnRcIjogXCJtYXJrZXJTdGFydFwiLFxuICAgICAgICBtYXJrZXJ1bml0czogXCJtYXJrZXJVbml0c1wiLFxuICAgICAgICBtYXJrZXJ3aWR0aDogXCJtYXJrZXJXaWR0aFwiLFxuICAgICAgICBtYXNrOiBcIm1hc2tcIixcbiAgICAgICAgbWFza2NvbnRlbnR1bml0czogXCJtYXNrQ29udGVudFVuaXRzXCIsXG4gICAgICAgIG1hc2t0eXBlOiBcIm1hc2tUeXBlXCIsXG4gICAgICAgIG1hc2t1bml0czogXCJtYXNrVW5pdHNcIixcbiAgICAgICAgbWF0aGVtYXRpY2FsOiBcIm1hdGhlbWF0aWNhbFwiLFxuICAgICAgICBtb2RlOiBcIm1vZGVcIixcbiAgICAgICAgbnVtb2N0YXZlczogXCJudW1PY3RhdmVzXCIsXG4gICAgICAgIG9mZnNldDogXCJvZmZzZXRcIixcbiAgICAgICAgb3BhY2l0eTogXCJvcGFjaXR5XCIsXG4gICAgICAgIG9wZXJhdG9yOiBcIm9wZXJhdG9yXCIsXG4gICAgICAgIG9yZGVyOiBcIm9yZGVyXCIsXG4gICAgICAgIG9yaWVudDogXCJvcmllbnRcIixcbiAgICAgICAgb3JpZW50YXRpb246IFwib3JpZW50YXRpb25cIixcbiAgICAgICAgb3JpZ2luOiBcIm9yaWdpblwiLFxuICAgICAgICBvdmVyZmxvdzogXCJvdmVyZmxvd1wiLFxuICAgICAgICBvdmVybGluZXBvc2l0aW9uOiBcIm92ZXJsaW5lUG9zaXRpb25cIixcbiAgICAgICAgXCJvdmVybGluZS1wb3NpdGlvblwiOiBcIm92ZXJsaW5lUG9zaXRpb25cIixcbiAgICAgICAgb3ZlcmxpbmV0aGlja25lc3M6IFwib3ZlcmxpbmVUaGlja25lc3NcIixcbiAgICAgICAgXCJvdmVybGluZS10aGlja25lc3NcIjogXCJvdmVybGluZVRoaWNrbmVzc1wiLFxuICAgICAgICBwYWludG9yZGVyOiBcInBhaW50T3JkZXJcIixcbiAgICAgICAgXCJwYWludC1vcmRlclwiOiBcInBhaW50T3JkZXJcIixcbiAgICAgICAgcGFub3NlMTogXCJwYW5vc2UxXCIsXG4gICAgICAgIFwicGFub3NlLTFcIjogXCJwYW5vc2UxXCIsXG4gICAgICAgIHBhdGhsZW5ndGg6IFwicGF0aExlbmd0aFwiLFxuICAgICAgICBwYXR0ZXJuY29udGVudHVuaXRzOiBcInBhdHRlcm5Db250ZW50VW5pdHNcIixcbiAgICAgICAgcGF0dGVybnRyYW5zZm9ybTogXCJwYXR0ZXJuVHJhbnNmb3JtXCIsXG4gICAgICAgIHBhdHRlcm51bml0czogXCJwYXR0ZXJuVW5pdHNcIixcbiAgICAgICAgcG9pbnRlcmV2ZW50czogXCJwb2ludGVyRXZlbnRzXCIsXG4gICAgICAgIFwicG9pbnRlci1ldmVudHNcIjogXCJwb2ludGVyRXZlbnRzXCIsXG4gICAgICAgIHBvaW50czogXCJwb2ludHNcIixcbiAgICAgICAgcG9pbnRzYXR4OiBcInBvaW50c0F0WFwiLFxuICAgICAgICBwb2ludHNhdHk6IFwicG9pbnRzQXRZXCIsXG4gICAgICAgIHBvaW50c2F0ejogXCJwb2ludHNBdFpcIixcbiAgICAgICAgcG9wb3ZlcjogXCJwb3BvdmVyXCIsXG4gICAgICAgIHBvcG92ZXJ0YXJnZXQ6IFwicG9wb3ZlclRhcmdldFwiLFxuICAgICAgICBwb3BvdmVydGFyZ2V0YWN0aW9uOiBcInBvcG92ZXJUYXJnZXRBY3Rpb25cIixcbiAgICAgICAgcHJlZml4OiBcInByZWZpeFwiLFxuICAgICAgICBwcmVzZXJ2ZWFscGhhOiBcInByZXNlcnZlQWxwaGFcIixcbiAgICAgICAgcHJlc2VydmVhc3BlY3RyYXRpbzogXCJwcmVzZXJ2ZUFzcGVjdFJhdGlvXCIsXG4gICAgICAgIHByaW1pdGl2ZXVuaXRzOiBcInByaW1pdGl2ZVVuaXRzXCIsXG4gICAgICAgIHByb3BlcnR5OiBcInByb3BlcnR5XCIsXG4gICAgICAgIHI6IFwiclwiLFxuICAgICAgICByYWRpdXM6IFwicmFkaXVzXCIsXG4gICAgICAgIHJlZng6IFwicmVmWFwiLFxuICAgICAgICByZWZ5OiBcInJlZllcIixcbiAgICAgICAgcmVuZGVyaW5naW50ZW50OiBcInJlbmRlcmluZ0ludGVudFwiLFxuICAgICAgICBcInJlbmRlcmluZy1pbnRlbnRcIjogXCJyZW5kZXJpbmdJbnRlbnRcIixcbiAgICAgICAgcmVwZWF0Y291bnQ6IFwicmVwZWF0Q291bnRcIixcbiAgICAgICAgcmVwZWF0ZHVyOiBcInJlcGVhdER1clwiLFxuICAgICAgICByZXF1aXJlZGV4dGVuc2lvbnM6IFwicmVxdWlyZWRFeHRlbnNpb25zXCIsXG4gICAgICAgI
15852HJlcXVpcmVkZmVhdHVyZXM6IFwicmVxdWlyZWRGZWF0dXJlc1wiLFxuICAgICAgICByZXNvdXJjZTogXCJyZXNvdXJjZVwiLFxuICAgICAgICByZXN0YXJ0OiBcInJlc3RhcnRcIixcbiAgICAgICAgcmVzdWx0OiBcInJlc3VsdFwiLFxuICAgICAgICByZXN1bHRzOiBcInJlc3VsdHNcIixcbiAgICAgICAgcm90YXRlOiBcInJvdGF0ZVwiLFxuICAgICAgICByeDogXCJyeFwiLFxuICAgICAgICByeTogXCJyeVwiLFxuICAgICAgICBzY2FsZTogXCJzY2FsZVwiLFxuICAgICAgICBzZWN1cml0eTogXCJzZWN1cml0eVwiLFxuICAgICAgICBzZWVkOiBcInNlZWRcIixcbiAgICAgICAgc2hhcGVyZW5kZXJpbmc6IFwic2hhcGVSZW5kZXJpbmdcIixcbiAgICAgICAgXCJzaGFwZS1yZW5kZXJpbmdcIjogXCJzaGFwZVJlbmRlcmluZ1wiLFxuICAgICAgICBzbG9wZTogXCJzbG9wZVwiLFxuICAgICAgICBzcGFjaW5nOiBcInNwYWNpbmdcIixcbiAgICAgICAgc3BlY3VsYXJjb25zdGFudDogXCJzcGVjdWxhckNvbnN0YW50XCIsXG4gICAgICAgIHNwZWN1bGFyZXhwb25lbnQ6IFwic3BlY3VsYXJFeHBvbmVudFwiLFxuICAgICAgICBzcGVlZDogXCJzcGVlZFwiLFxuICAgICAgICBzcHJlYWRtZXRob2Q6IFwic3ByZWFkTWV0aG9kXCIsXG4gICAgICAgIHN0YXJ0b2Zmc2V0OiBcInN0YXJ0T2Zmc2V0XCIsXG4gICAgICAgIHN0ZGRldmlhdGlvbjogXCJzdGREZXZpYXRpb25cIixcbiAgICAgICAgc3RlbWg6IFwic3RlbWhcIixcbiAgICAgICAgc3RlbXY6IFwic3RlbXZcIixcbiAgICAgICAgc3RpdGNodGlsZXM6IFwic3RpdGNoVGlsZXNcIixcbiAgICAgICAgc3RvcGNvbG9yOiBcInN0b3BDb2xvclwiLFxuICAgICAgICBcInN0b3AtY29sb3JcIjogXCJzdG9wQ29sb3JcIixcbiAgICAgICAgc3RvcG9wYWNpdHk6IFwic3RvcE9wYWNpdHlcIixcbiAgICAgICAgXCJzdG9wLW9wYWNpdHlcIjogXCJzdG9wT3BhY2l0eVwiLFxuICAgICAgICBzdHJpa2V0aHJvdWdocG9zaXRpb246IFwic3RyaWtldGhyb3VnaFBvc2l0aW9uXCIsXG4gICAgICAgIFwic3RyaWtldGhyb3VnaC1wb3NpdGlvblwiOiBcInN0cmlrZXRocm91Z2hQb3NpdGlvblwiLFxuICAgICAgICBzdHJpa2V0aHJvdWdodGhpY2tuZXNzOiBcInN0cmlrZXRocm91Z2hUaGlja25lc3NcIixcbiAgICAgICAgXCJzdHJpa2V0aHJvdWdoLXRoaWNrbmVzc1wiOiBcInN0cmlrZXRocm91Z2hUaGlja25lc3NcIixcbiAgICAgICAgc3RyaW5nOiBcInN0cmluZ1wiLFxuICAgICAgICBzdHJva2U6IFwic3Ryb2tlXCIsXG4gICAgICAgIHN0cm9rZWRhc2hhcnJheTogXCJzdHJva2VEYXNoYXJyYXlcIixcbiAgICAgICAgXCJzdHJva2UtZGFzaGFycmF5XCI6IFwic3Ryb2tlRGFzaGFycmF5XCIsXG4gICAgICAgIHN0cm9rZWRhc2hvZmZzZXQ6IFwic3Ryb2tlRGFzaG9mZnNldFwiLFxuICAgICAgICBcInN0cm9rZS1kYXNob2Zmc2V0XCI6IFwic3Ryb2tlRGFzaG9mZnNldFwiLFxuICAgICAgICBzdHJva2VsaW5lY2FwOiBcInN0cm9rZUxpbmVjYXBcIixcbiAgICAgICAgXCJzdHJva2UtbGluZWNhcFwiOiBcInN0cm9rZUxpbmVjYXBcIixcbiAgICAgICAgc3Ryb2tlbGluZWpvaW46IFwic3Ryb2tlTGluZWpvaW5cIixcbiAgICAgICAgXCJzdHJva2UtbGluZWpvaW5cIjogXCJzdHJva2VMaW5lam9pblwiLFxuICAgICAgICBzdHJva2VtaXRlcmxpbWl0OiBcInN0cm9rZU1pdGVybGltaXRcIixcbiAgICAgICAgXCJzdHJva2UtbWl0ZXJsaW1pdFwiOiBcInN0cm9rZU1pdGVybGltaXRcIixcbiAgICAgICAgc3Ryb2tld2lkdGg6IFwic3Ryb2tlV2lkdGhcIixcbiAgICAgICAgXCJzdHJva2Utd2lkdGhcIjogXCJzdHJva2VXaWR0aFwiLFxuICAgICAgICBzdHJva2VvcGFjaXR5OiBcInN0cm9rZU9wYWNpdHlcIixcbiAgICAgICAgXCJzdHJva2Utb3BhY2l0eVwiOiBcInN0cm9rZU9wYWNpdHlcIixcbiAgICAgICAgc3VwcHJlc3Njb250ZW50ZWRpdGFibGV3YXJuaW5nOiBcInN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZ1wiLFxuICAgICAgICBzdXBwcmVzc2h5ZHJhdGlvbndhcm5pbmc6IFwic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nXCIsXG4gICAgICAgIHN1cmZhY2VzY2FsZTogXCJzdXJmYWNlU2NhbGVcIixcbiAgICAgICAgc3lzdGVtbGFuZ3VhZ2U6IFwic3lzdGVtTGFuZ3VhZ2VcIixcbiAgICAgICAgdGFibGV2YWx1ZXM6IFwidGFibGVWYWx1ZXNcIixcbiAgICAgICAgdGFyZ2V0eDogXCJ0YXJnZXRYXCIsXG4gICAgICAgIHRhcmdldHk6IFwidGFyZ2V0WVwiLFxuICAgICAgICB0ZXh0YW5jaG9yOiBcInRleHRBbmNob3JcIixcbiAgICAgICAgXCJ0ZXh0LWFuY2hvclwiOiBcInRleHRBbmNob3JcIixcbiAgICAgICAgdGV4dGRlY29yYXRpb246IFwidGV4dERlY29yYXRpb25cIixcbiAgICAgICAgXCJ0ZXh0LWRlY29yYXRpb25cIjogXCJ0ZXh0RGVjb3JhdGlvblwiLFxuICAgICAgICB0ZXh0bGVuZ3RoOiBcInRleHRMZW5ndGhcIixcbiAgICAgICAgdGV4dHJlbmRlcmluZzogXCJ0ZXh0UmVuZGVyaW5nXCIsXG4gICAgICAgIFwidGV4dC1yZW5kZXJpbmdcIjogXCJ0ZXh0UmVuZGVyaW5nXCIsXG4gICAgICAgIHRvOiBcInRvXCIsXG4gICAgICAgIHRyYW5zZm9ybTogXCJ0cmFuc2Zvcm1cIixcbiAgICAgICAgdHJhbnNmb3Jtb3JpZ2luOiBcInRyYW5zZm9ybU9yaWdpblwiLFxuICAgICAgICBcInRyYW5zZm9ybS1vcmlnaW5cIjogXCJ0cmFuc2Zvcm1PcmlnaW5cIixcbiAgICAgICAgdHlwZW9mOiBcInR5cGVvZlwiLFxuICAgICAgICB1MTogXCJ1MVwiLFxuICAgICAgICB1MjogXCJ1MlwiLFxuICAgICAgICB1bmRlcmxpbmVwb3NpdGlvbjogXCJ1bmRlcmxpbmVQb3NpdGlvblwiLFxuICAgICAgICBcInVuZGVybGluZS1wb3NpdGlvblwiOiBcInVuZGVybGluZVBvc2l0aW9uXCIsXG4gICAgICAgIHVuZGVybGluZXRoaWNrbmVzczogXCJ1bmRlcmxpbmVUaGlja25lc3NcIixcbiAgICAgICAgXCJ1bmRlcmxpbmUtdGhpY2tuZXNzXCI6IFwidW5kZXJsaW5lVGhpY2tuZXNzXCIsXG4gICAgICAgIHVuaWNvZGU6IFwidW5pY29kZVwiLFxuICAgICAgICB1bmljb2RlYmlkaTogXCJ1bmljb2RlQmlkaVwiLFxuICAgICAgICBcInVuaWNvZGUtYmlkaVwiOiBcInVuaWNvZGVCaWRpXCIsXG4gICAgICAgI
15852HVuaWNvZGVyYW5nZTogXCJ1bmljb2RlUmFuZ2VcIixcbiAgICAgICAgXCJ1bmljb2RlLXJhbmdlXCI6IFwidW5pY29kZVJhbmdlXCIsXG4gICAgICAgIHVuaXRzcGVyZW06IFwidW5pdHNQZXJFbVwiLFxuICAgICAgICBcInVuaXRzLXBlci1lbVwiOiBcInVuaXRzUGVyRW1cIixcbiAgICAgICAgdW5zZWxlY3RhYmxlOiBcInVuc2VsZWN0YWJsZVwiLFxuICAgICAgICB2YWxwaGFiZXRpYzogXCJ2QWxwaGFiZXRpY1wiLFxuICAgICAgICBcInYtYWxwaGFiZXRpY1wiOiBcInZBbHBoYWJldGljXCIsXG4gICAgICAgIHZhbHVlczogXCJ2YWx1ZXNcIixcbiAgICAgICAgdmVjdG9yZWZmZWN0OiBcInZlY3RvckVmZmVjdFwiLFxuICAgICAgICBcInZlY3Rvci1lZmZlY3RcIjogXCJ2ZWN0b3JFZmZlY3RcIixcbiAgICAgICAgdmVyc2lvbjogXCJ2ZXJzaW9uXCIsXG4gICAgICAgIHZlcnRhZHZ5OiBcInZlcnRBZHZZXCIsXG4gICAgICAgIFwidmVydC1hZHYteVwiOiBcInZlcnRBZHZZXCIsXG4gICAgICAgIHZlcnRvcmlnaW54OiBcInZlcnRPcmlnaW5YXCIsXG4gICAgICAgIFwidmVydC1vcmlnaW4teFwiOiBcInZlcnRPcmlnaW5YXCIsXG4gICAgICAgIHZlcnRvcmlnaW55OiBcInZlcnRPcmlnaW5ZXCIsXG4gICAgICAgIFwidmVydC1vcmlnaW4teVwiOiBcInZlcnRPcmlnaW5ZXCIsXG4gICAgICAgIHZoYW5naW5nOiBcInZIYW5naW5nXCIsXG4gICAgICAgIFwidi1oYW5naW5nXCI6IFwidkhhbmdpbmdcIixcbiAgICAgICAgdmlkZW9ncmFwaGljOiBcInZJZGVvZ3JhcGh
15852pY1wiLFxuICAgICAgICBcInYtaWRlb2dyYXBoaWNcIjogXCJ2SWRlb2dyYXBoaWNcIixcbiAgICAgICAgdmlld2JveDogXCJ2aWV3Qm94XCIsXG4gICAgICAgIHZpZXd0YXJnZXQ6IFwidmlld1RhcmdldFwiLFxuICAgICAgICB2aXNpYmlsaXR5OiBcInZpc2liaWxpdHlcIixcbiAgICAgICAgdm1hdGhlbWF0aWNhbDogXCJ2TWF0aGVtYXRpY2FsXCIsXG4gICAgICAgIFwidi1tYXRoZW1hdGljYWxcIjogXCJ2TWF0aGVtYXRpY2FsXCIsXG4gICAgICAgIHZvY2FiOiBcInZvY2FiXCIsXG4gICAgICAgIHdpZHRoczogXCJ3aWR0aHNcIixcbiAgICAgICAgd29yZHNwYWNpbmc6IFwid29yZFNwYWNpbmdcIixcbiAgICAgICAgXCJ3b3JkLXNwYWNpbmdcIjogXCJ3b3JkU3BhY2luZ1wiLFxuICAgICAgICB3cml0aW5nbW9kZTogXCJ3cml0aW5nTW9kZVwiLFxuICAgICAgICBcIndyaXRpbmctbW9kZVwiOiBcIndyaXRpbmdNb2RlXCIsXG4gICAgICAgIHgxOiBcIngxXCIsXG4gICAgICAgIHgyOiBcIngyXCIsXG4gICAgICAgIHg6IFwieFwiLFxuICAgICAgICB4Y2hhbm5lbHNlbGVjdG9yOiBcInhDaGFubmVsU2VsZWN0b3JcIixcbiAgICAgICAgeGhlaWdodDogXCJ4SGVpZ2h0XCIsXG4gICAgICAgIFwieC1oZWlnaHRcIjogXCJ4SGVpZ2h0XCIsXG4gICAgICAgIHhsaW5rYWN0dWF0ZTogXCJ4bGlua0FjdHVhdGVcIixcbiAgICAgICAgXCJ4bGluazphY3R1YXRlXCI6IFwieGxpbmtBY3R1YXRlXCIsXG4gICAgICAgIHhsaW5rYXJjcm9sZTogXCJ4bGlua0FyY3JvbGVcIixcbiAgICAgICAgXCJ4bGluazphcmNyb2xlXCI6IFwieGxpbmtBcmNyb2xlXCIsXG4gICAgICAgIHhsaW5raHJlZjogXCJ4bGlua0hyZWZcIixcbiAgICAgICAgXCJ4bGluazpocmVmXCI6IFwieGxpbmtIcmVmXCIsXG4gICAgICAgIHhsaW5rcm9sZTogXCJ4bGlua1JvbGVcIixcbiAgICAgICAgXCJ4bGluazpyb2xlXCI6IFwieGxpbmtSb2xlXCIsXG4gICAgICAgIHhsaW5rc2hvdzogXCJ4bGlua1Nob3dcIixcbiAgICAgICAgXCJ4bGluazpzaG93XCI6IFwieGxpbmtTaG93XCIsXG4gICAgICAgIHhsaW5rdGl0bGU6IFwieGxpbmtUaXRsZVwiLFxuICAgICAgICBcInhsaW5rOnRpdGxlXCI6IFwieGxpbmtUaXRsZVwiLFxuICAgICAgICB4bGlua3R5cGU6IFwieGxpbmtUeXBlXCIsXG4gICAgICAgIFwieGxpbms6dHlwZVwiOiBcInhsaW5rVHlwZVwiLFxuICAgICAgICB4bWxiYXNlOiBcInhtbEJhc2VcIixcbiAgICAgICAgXCJ4bWw6YmFzZVwiOiBcInhtbEJhc2VcIixcbiAgICAgICAgeG1sbGFuZzogXCJ4bWxMYW5nXCIsXG4gICAgICAgIFwieG1sOmxhbmdcIjogXCJ4bWxMYW5nXCIsXG4gICAgICAgIHhtbG5zOiBcInhtbG5zXCIsXG4gICAgICAgIFwieG1sOnNwYWNlXCI6IFwieG1sU3BhY2VcIixcbiAgICAgICAgeG1sbnN4bGluazogXCJ4bWxuc1hsaW5rXCIsXG4gICAgICAgIFwieG1sbnM6eGxpbmtcIjogXCJ4bWxuc1hsaW5rXCIsXG4gICAgICAgIHhtbHNwYWNlOiBcInhtbFNwYWNlXCIsXG4gICAgICAgIHkxOiBcInkxXCIsXG4gICAgICAgIHkyOiBcInkyXCIsXG4gICAgICAgIHk6IFwieVwiLFxuICAgICAgICB5Y2hhbm5lbHNlbGVjdG9yOiBcInlDaGFubmVsU2VsZWN0b3JcIixcbiAgICAgICAgejogXCJ6XCIsXG4gICAgICAgIHpvb21hbmRwYW46IFwiem9vbUFuZFBhblwiXG4gICAgICB9LFxuICAgICAgYXJpYVByb3BlcnRpZXMgPSB7XG4gICAgICAgIFwiYXJpYS1jdXJyZW50XCI6IDAsXG4gICAgICAgIFwiYXJpYS1kZXNjcmlwdGlvblwiOiAwLFxuICAgICAgICBcImFyaWEtZGV0YWlsc1wiOiAwLFxuICAgICAgICBcImFyaWEtZGlzYWJsZWRcIjogMCxcbiAgICAgICAgXCJhcmlhLWhpZGRlblwiOiAwLFxuICAgICAgICBcImFyaWEtaW52YWxpZFwiOiAwLFxuICAgICAgICBcImFyaWEta2V5c2hvcnRjdXRzXCI6IDAsXG4gICAgICAgIFwiYXJpYS1sYWJlbFwiOiAwLFxuICAgICAgICBcImFyaWEtcm9sZWRlc2NyaXB0aW9uXCI6IDAsXG4gICAgICAgIFwiYXJpYS1hdXRvY29tcGxldGVcIjogMCxcbiAgICAgICAgXCJhcmlhLWNoZWNrZWRcIjogMCxcbiAgICAgICAgXCJhcmlhLWV4cGFuZGVkXCI6IDAsXG4gICAgICAgIFwiYXJpYS1oYXNwb3B1cFwiOiAwLFxuICAgICAgICBcImFyaWEtbGV2ZWxcIjogMCxcbiAgICAgICAgXCJhcmlhLW1vZGFsXCI6IDAsXG4gICAgICAgIFwiYXJpYS1tdWx0aWxpbmVcIjogMCxcbiAgICAgICAgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiOiAwLFxuICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogMCxcbiAgICAgICAgXCJhcmlhLXBsYWNlaG9sZGVyXCI6IDAsXG4gICAgICAgIFwiYXJpYS1wcmVzc2VkXCI6IDAsXG4gICAgICAgIFwiYXJpYS1yZWFkb25seVwiOiAwLFxuICAgICAgICBcImFyaWEtcmVxdWlyZWRcIjogMCxcbiAgICAgICAgXCJhcmlhLXNlbGVjdGVkXCI6IDAsXG4gICAgICAgIFwiYXJpYS1zb3J0XCI6IDAsXG4gICAgICAgIFwiYXJpYS12YWx1ZW1heFwiOiAwLFxuICAgICAgICBcImFyaWEtdmFsdWVtaW5cIjogMCxcbiAgICAgICAgXCJhcmlhLXZhbHVlbm93XCI6IDAsXG4gICAgICAgIFwiYXJpYS12YWx1ZXRleHRcIjogMCxcbiAgICAgICAgXCJhcmlhLWF0b21pY1wiOiAwLFxuICAgICAgICBcImFyaWEtYnVzeVwiOiAwLFxuICAgICAgICBcImFyaWEtbGl2ZVwiOiAwLFxuICAgICAgICBcImFyaWEtcmVsZXZhbnRcIjogMCxcbiAgICAgICAgXCJhcmlhLWRyb3BlZmZlY3RcIjogMCxcbiAgICAgICAgXCJhcmlhLWdyYWJiZWRcIjogMCxcbiAgICAgICAgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIjogMCxcbiAgICAgICAgXCJhcmlhLWNvbGNvdW50XCI6IDAsXG4gICAgICAgIFwiYXJpYS1jb2xpbmRleFwiOiAwLFxuICAgICAgICBcImFyaWEtY29sc3BhblwiOiAwLFxuICAgICAgICBcImFyaWEtY29udHJvbHNcIjogMCxcbiAgICAgICAgXCJhcmlhLWRlc2NyaWJlZGJ5XCI6IDAsXG4gICAgICAgIFwiYXJpYS1lcnJvcm1lc3NhZ2VcIjogMCxcbiAgICAgICAgXCJhcmlhLWZsb3d0b1wiOiAwLFxuICAgICAgICBcImFyaWEtbGFiZWxsZWRieVwiOiAwLFxuICAgICAgICBcImFyaWEtb3duc1wiOiAwLFxuICAgICAgICBcImFyaWEtcG9zaW5zZXRcIjogMCxcbiAgICAgICAgXCJhcmlhLXJvd2NvdW50XCI6IDAsXG4gICAgICAgIFwiYXJpYS1yb3dpbmRleFwiOiAwLFxuICAgICAgICBcImFyaWEtcm93c3BhblwiOiAwLFxuICAgICAgICBcImFyaWEtc2V0c2l6ZVwiOiAwLFxuICAgICAgICBcImFyaWEtYnJhaWxsZWxhYmVsXCI6IDAsXG4gICAgICAgIFwiYXJpYS1icmFpbGxlcm9sZWRlc2NyaXB0aW9uXCI6IDAsXG4gICAgICAgIFwiYXJpYS1jb2xpbmRleHRleHRcIjogMCxcbiAgICAgICAgXCJhcmlhLXJvd2luZGV4dGV4dFwiOiAwXG4gICAgICB9LFxuICAgICAgd2FybmVkUHJvcGVydGllcyQxID0ge30sXG4gICAgICByQVJJQSQxID0gUmVnRXhwKFxuICAgICAgICBcIl4oYXJpYSktWzpBLVpfYS16XFxcXHUwMEMwLVxcXFx1MDBENlxcXFx1MDBEOC1cXFxcdTAwRjZcXFxcdTAwRjgtXFxcXHUwMkZGXFxcXHUwMzcwLVxcXFx1MDM3RFxcXFx1MDM3Ri1cXFxcdTFGRkZcXFxcdTIwMEMtXFxcXHUyMDBEXFxcXHUyMDcwLVxcXFx1MjE4RlxcXFx1MkMwMC1cXFxcdTJGRUZcXFxcdTMwMDEtXFxcXHVEN0ZGXFxcXHVGOTAwLVxcXFx1RkRDRlxcXFx1RkRGMC1cXFxcdUZGRkRcXFxcLS4wLTlcXFxcdTAwQjdcXFxcdTAzMDAtXFxcXHUwMzZGXFxcXHUyMDNGLVxcXFx1MjA0MF0qJFwiXG4gICAgICApLFxuICAgICAgckFSSUFDYW1lbCQxID0gUmVnRXhwKFxuICAgICAgICBcIl4oYXJpYSlbQS1aXVs6QS1aX2EtelxcXFx1MDBDMC1cXFxcdTAwRDZcXFxcdTAwRDgtXFxcXHUwMEY2XFxcXHUwMEY4LVxcXFx1MDJGRlxcXFx1MDM3MC1cXFxcdTAzN0RcXFxcdTAzN0YtXFxcXHUxRkZGXFxcXHUyMDBDLVxcXFx1MjAwRFxcXFx1MjA3MC1cXFxcdTIxOEZcXFxcdTJDMDAtXFxcXHUyRkVGXFxcXHUzMDAxLVxcXFx1RDdGRlxcXFx1RjkwMC1cXFxcdUZEQ0ZcXFxcdUZERjAtXFxcXHVGRkZEXFxcXC0uMC05XFxcXHUwMEI3XFxcXHUwMzAwLVxcXFx1MDM2RlxcXFx1MjAzRi1cXFxcdTIwNDBdKiRcIlxuICAgICAgKSxcbiAgICAgIGRpZFdhcm5WYWx1ZU51bGwgPSAhMSxcbiAgICAgIHdhcm5lZFByb3BlcnRpZXMgPSB7fSxcbiAgICAgIEVWRU5UX05BTUVfUkVHRVggPSAvXm9uLi8sXG4gICAgICBJTlZBTElEX0VWRU5UX05BTUVfUkVHRVggPSAvXm9uW15BLVpdLyxcbiAgICAgIHJBUklBID0gUmVnRXhwKFxuICAgICAgICBcIl4oYXJpYSktWzpBLVpfYS16XFxcXHUwMEMwLVxcXFx1MDBENlxcXFx1MDBEOC1cXFxcdTAwRjZcXFxcdTAwRjgtXFxcXHUwMkZGXFxcXHUwMzcwLVxcXFx1MDM3RFxcXFx1MDM3Ri1cXFxcdTFGRkZcXFxcdTIwMEMtXFxcXHUyMDBEXFxcXHUyMDcwLVxcXFx1MjE4RlxcXFx1MkMwMC1cXFxcdTJGRUZcXFxcdTMwMDEtXFxcXHVEN0ZGXFxcXHVGOTAwLVxcXFx1RkRDRlxcXFx1RkRGMC1cXFxcdUZGRkRcXFxcLS4wLTlcXFxcdTAwQjdcXFxcdTAzMDAtXFxcXHUwMzZGXFxcXHUyMDNGLVxcXFx1MjA0MF0qJFwiXG4gICAgICApLFxuICAgICAgckFSSUFDYW1lbCA9IFJlZ0V4cChcbiAgICAgICAgXCJeKGFyaWEpW0EtWl1bOkEtWl9hLXpcXFxcdTAwQzAtXFxcXHUwMEQ2XFxcXHUwMEQ4LVxcXFx1MDBGNlxcXFx1MDBGOC1cXFxcdTAyRkZcXFxcdTAzNzAtXFxcXHUwMzdEXFxcXHUwMzdGLVxcXFx1MUZGRlxcXFx1MjAwQy1cXFxcdTIwMERcXFxcdTIwNzAtXFxcXHUyMThGXFxcXHUyQzAwLVxcXFx1MkZFRlxcXFx1MzAwMS1cXFxcdUQ3RkZcXFxcdUY5MDAtXFxcXHVGRENGXFxcXHVGREYwLVxcXFx1RkZGRFxcXFwtLjAtOVxcXFx1MDBCN1xcXFx1MDMwMC1cXFxcdTAzNkZcXFxcdTIwM0YtXFxcXHUyMDQwXSokXCJcbiAgICAgICksXG4gICAgICBpc0phdmFTY3JpcHRQcm90b2NvbCA9XG4gICAgICAgIC9eW1xcdTAwMDAtXFx1MDAxRiBdKmpbXFxyXFxuXFx0XSphW1xcclxcblxcdF0qdltcXHJcXG5cXHRdKmFbXFxyXFxuXFx0XSpzW1xcclxcblxcdF0qY1tcXHJcXG5cXHRdKnJbXFxyX
15852FxuXFx0XSppW1xcclxcblxcdF0qcFtcXHJcXG5cXHRdKnRbXFxyXFxuXFx0XSo6L2ksXG4gICAgICBjdXJyZW50UmVwbGF5aW5nRXZlbnQgPSBudWxsLFxuICAgICAgcmVzdG9yZVRhcmdldCA9IG51bGwsXG4gICAgICByZXN0b3JlUXVldWUgPSBudWxsLFxuICAgICAgaXNJbnNpZGVFdmVudEhhbmRsZXIgPSAhMSxcbiAgICAgIGNhblVzZURPTSA9ICEoXG4gICAgICAgIFwidW5kZWZpbmVkXCIgPT09IHR5cGVvZiB3aW5kb3cgfHxcbiAgICAgICAgXCJ1bmRlZmluZWRcIiA9PT0gdHlwZW9mIHdpbmRvdy5kb2N1bWVudCB8fFxuICAgICAgICBcInVuZGVmaW5lZFwiID09PSB0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnRcbiAgICAgICksXG4gICAgICBwYXNzaXZlQnJvd3NlckV2ZW50c1N1cHBvcnRlZCA9ICExO1xuICAgIGlmIChjYW5Vc2VET00pXG4gICAgICB0cnkge1xuICAgICAgICB2YXIgb3B0aW9ucyRqc2NvbXAkMCA9IHt9O1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3B0aW9ucyRqc2NvbXAkMCwgXCJwYXNzaXZlXCIsIHtcbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHBhc3NpdmVCcm93c2VyRXZlbnRzU3VwcG9ydGVkID0gITA7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJ0ZXN0XCIsIG9wdGlvbnMkanNjb21wJDAsIG9wdGlvbnMkanNjb21wJDApO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRlc3RcIiwgb3B0aW9ucyRqc2NvbXAkMCwgb3B0aW9ucyRqc2NvbXAkMCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHBhc3NpdmVCcm93c2VyRXZlbnRzU3VwcG9ydGVkID0gITE7XG4gICAgICB9XG4gICAgdmFyIHJvb3QgPSBudWxsLFxuICAgICAgc3RhcnRUZXh0ID0gbnVsbCxcbiAgICAgIGZhbGxiYWNrVGV4dCA9IG51bGwsXG4gICAgICBFdmVudEludGVyZmFjZSA9IHtcbiAgICAgICAgZXZlbnRQaGFzZTogMCxcbiAgICAgICAgYnViYmxlczogMCxcbiAgICAgICAgY2FuY2VsYWJsZTogMCxcbiAgICAgICAgdGltZVN0YW1wOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICByZXR1cm4gZXZlbnQudGltZVN0YW1wIHx8IERhdGUubm93KCk7XG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHRQcmV2ZW50ZWQ6IDAsXG4gICAgICAgIGlzVHJ1c3RlZDogMFxuICAgICAgfSxcbiAgICAgIFN5bnRoZXRpY0V2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoRXZlbnRJbnRlcmZhY2UpLFxuICAgICAgVUlFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgRXZlbnRJbnRlcmZhY2UsIHsgdmlldzogMCwgZGV0YWlsOiAwIH0pLFxuICAgICAgU3ludGhldGljVUlFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFVJRXZlbnRJbnRlcmZhY2UpLFxuICAgICAgbGFzdE1vdmVtZW50WCxcbiAgICAgIGxhc3RNb3ZlbWVudFksXG4gICAgICBsYXN0TW91c2VFdmVudCxcbiAgICAgIE1vdXNlRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIFVJRXZlbnRJbnRlcmZhY2UsIHtcbiAgICAgICAgc2NyZWVuWDogMCxcbiAgICAgICAgc2NyZWVuWTogMCxcbiAgICAgICAgY2xpZW50WDogMCxcbiAgICAgICAgY2xpZW50WTogMCxcbiAgICAgICAgcGFnZVg6IDAsXG4gICAgICAgIHBhZ2VZOiAwLFxuICAgICAgICBjdHJsS2V5OiAwLFxuICAgICAgICBzaGlmdEtleTogMCxcbiAgICAgICAgYWx0S2V5OiAwLFxuICAgICAgICBtZXRhS2V5OiAwLFxuICAgICAgICBnZXRNb2RpZmllclN0YXRlOiBnZXRFdmVudE1vZGlmaWVyU3RhdGUsXG4gICAgICAgIGJ1dHRvbjogMCxcbiAgICAgICAgYnV0dG9uczogMCxcbiAgICAgICAgcmVsYXRlZFRhcmdldDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgcmV0dXJuIHZvaWQgMCA9PT0gZXZlbnQucmVsYXRlZFRhcmdldFxuICAgICAgICAgICAgPyBldmVudC5mcm9tRWxlbWVudCA9PT0gZXZlbnQuc3JjRWxlbWVudFxuICAgICAgICAgICAgICA/IGV2ZW50LnRvRWxlbWVudFxuICAgICAgICAgICAgICA6IGV2ZW50LmZyb21FbGVtZW50XG4gICAgICAgICAgICA6IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7XG4gICAgICAgIH0sXG4gICAgICAgIG1vdmVtZW50WDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgaWYgKFwibW92ZW1lbnRYXCIgaW4gZXZlbnQpIHJldHVybiBldmVudC5tb3ZlbWVudFg7XG4gICAgICAgICAgZXZlbnQgIT09IGxhc3RNb3VzZUV2ZW50ICYmXG4gICAgICAgICAgICAobGFzdE1vdXNlRXZlbnQgJiYgXCJtb3VzZW1vdmVcIiA9PT0gZXZlbnQudHlwZVxuICAgICAgICAgICAgICA/ICgobGFzdE1vdmVtZW50WCA9IGV2ZW50LnNjcmVlblggLSBsYXN0TW91c2VFdmVudC5zY3JlZW5YKSxcbiAgICAgICAgICAgICAgICAobGFzdE1vdmVtZW50WSA9IGV2ZW50LnNjcmVlblkgLSBsYXN0TW91c2VFdmVudC5zY3JlZW5ZKSlcbiAgICAgICAgICAgICAgOiAobGFzdE1vdmVtZW50WSA9IGxhc3RNb3ZlbWVudFggPSAwKSxcbiAgICAgICAgICAgIChsYXN0TW91c2VFdmVudCA9IGV2ZW50KSk7XG4gICAgICAgICAgcmV0dXJuIGxhc3RNb3ZlbWVudFg7XG4gICAgICAgIH0sXG4gICAgICAgIG1vdmVtZW50WTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgcmV0dXJuIFwibW92ZW1lbnRZXCIgaW4gZXZlbnQgPyBldmVudC5tb3ZlbWVudFkgOiBsYXN0TW92ZW1lbnRZO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIFN5bnRoZXRpY01vdXNlRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChNb3VzZUV2ZW50SW50ZXJmYWNlKSxcbiAgICAgIERyYWdFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgTW91c2VFdmVudEludGVyZmFjZSwgeyBkYXRhV
15852HJhbnNmZXI6IDAgfSksXG4gICAgICBTeW50aGV0aWNEcmFnRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChEcmFnRXZlbnRJbnRlcmZhY2UpLFxuICAgICAgRm9jdXNFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgVUlFdmVudEludGVyZmFjZSwgeyByZWxhdGVkVGFyZ2V0OiAwIH0pLFxuICAgICAgU3ludGhldGljRm9jdXNFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KEZvY3VzRXZlbnRJbnRlcmZhY2UpLFxuICAgICAgQW5pbWF0aW9uRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gICAgICAgIGFuaW1hdGlvbk5hbWU6IDAsXG4gICAgICAgIGVsYXBzZWRUaW1lOiAwLFxuICAgICAgICBwc2V1ZG9FbGVtZW50OiAwXG4gICAgICB9KSxcbiAgICAgIFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoQW5pbWF0aW9uRXZlbnRJbnRlcmZhY2UpLFxuICAgICAgQ2xpcGJvYXJkRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gICAgICAgIGNsaXBib2FyZERhdGE6IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIHJldHVybiBcImNsaXBib2FyZERhdGFcIiBpbiBldmVudFxuICAgICAgICAgICAgPyBldmVudC5jbGlwYm9hcmREYXRhXG4gICAgICAgICAgICA6IHdpbmRvdy5jbGlwYm9hcmREYXRhO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIFN5bnRoZXRpY0NsaXBib2FyZEV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoQ2xpcGJvYXJkRXZlbnRJbnRlcmZhY2UpLFxuICAgICAgQ29tcG9zaXRpb25FdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgRXZlbnRJbnRlcmZhY2UsIHsgZGF0YTogMCB9KSxcbiAgICAgIFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChcbiAgICAgICAgQ29tcG9zaXRpb25FdmVudEludGVyZmFjZVxuICAgICAgKSxcbiAgICAgIFN5bnRoZXRpY0lucHV0RXZlbnQgPSBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50LFxuICAgICAgbm9ybWFsaXplS2V5ID0ge1xuICAgICAgICBFc2M6IFwiRXNjYXBlXCIsXG4gICAgICAgIFNwYWNlYmFyOiBcIiBcIixcbiAgICAgICAgTGVmdDogXCJBcnJvd0xlZnRcIixcbiAgICAgICAgVXA6IFwiQXJyb3dVcFwiLFxuICAgICAgICBSaWdodDogXCJBcnJvd1JpZ2h0XCIsXG4gICAgICAgIERvd246IFwiQXJyb3dEb3duXCIsXG4gICAgICAgIERlbDogXCJEZWxldGVcIixcbiAgICAgICAgV2luOiBcIk9TXCIsXG4gICAgICAgIE1lbnU6IFwiQ29udGV4dE1lbnVcIixcbiAgICAgICAgQXBwczogXCJDb250ZXh0TWVudVwiLFxuICAgICAgICBTY3JvbGw6IFwiU2Nyb2xsTG9ja1wiLFxuICAgICAgICBNb3pQcmludGFibGVLZXk6IFwiVW5pZGVudGlmaWVkXCJcbiAgICAgIH0sXG4gICAgICB0cmFuc2xhdGVUb0tleSA9IHtcbiAgICAgICAgODogXCJCYWNrc3BhY2VcIixcbiAgICAgICAgOTogXCJUYWJcIixcbiAgICAgICAgMTI6IFwiQ2xlYXJcIixcbiAgICAgICAgMTM6IFwiRW50ZXJcIixcbiAgICAgICAgMTY6IFwiU2hpZnRcIixcbiAgICAgICAgMTc6IFwiQ29udHJvbFwiLFxuICAgICAgICAxODogXCJBbHRcIixcbiAgICAgICAgMTk6IFwiUGF1c2VcIixcbiAgICAgICAgMjA6IFwiQ2Fwc0xvY2tcIixcbiAgICAgICAgMjc6IFwiRXNjYXBlXCIsXG4gICAgICAgIDMyOiBcIiBcIixcbiAgICAgICAgMzM6IFwiUGFnZVVwXCIsXG4gICAgICAgIDM0OiBcIlBhZ2VEb3duXCIsXG4gICAgICAgIDM1OiBcIkVuZFwiLFxuICAgICAgICAzNjogXCJIb21lXCIsXG4gICAgICAgIDM3OiBcIkFycm93TGVmdFwiLFxuICAgICAgICAzODogXCJBcnJvd1VwXCIsXG4gICAgICAgIDM5OiBcIkFycm93UmlnaHRcIixcbiAgICAgICAgNDA6IFwiQXJyb3dEb3duXCIsXG4gICAgICAgIDQ1OiBcIkluc2VydFwiLFxuICAgICAgICA0NjogXCJEZWxldGVcIixcbiAgICAgICAgMTEyOiBcIkYxXCIsXG4gICAgICAgIDExMzogXCJGMlwiLFxuICAgICAgICAxMTQ6IFwiRjNcIixcbiAgICAgICAgMTE1OiBcIkY0XCIsXG4gICAgICAgIDExNjogXCJGNVwiLFxuICAgICAgICAxMTc6IFwiRjZcIixcbiAgICAgICAgMTE4OiBcIkY3XCIsXG4gICAgICAgIDExOTogXCJGOFwiLFxuICAgICAgICAxMjA6IFwiRjlcIixcbiAgICAgICAgMTIxOiBcIkYxMFwiLFxuICAgICAgICAxMjI6IFwiRjExXCIsXG4gICAgICAgIDEyMzogXCJGMTJcIixcbiAgICAgICAgMTQ0OiBcIk51bUxvY2tcIixcbiAgICAgICAgMTQ1OiBcIlNjcm9sbExvY2tcIixcbiAgICAgICAgMjI0OiBcIk1ldGFcIlxuICAgICAgfSxcbiAgICAgIG1vZGlmaWVyS2V5VG9Qcm9wID0ge1xuICAgICAgICBBbHQ6IFwiYWx0S2V5XCIsXG4gICAgICAgIENvbnRyb2w6IFwiY3RybEtleVwiLFxuICAgICAgICBNZXRhOiBcIm1ldGFLZXlcIixcbiAgICAgICAgU2hpZnQ6IFwic2hpZnRLZXlcIlxuICAgICAgfSxcbiAgICAgIEtleWJvYXJkRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIFVJRXZlbnRJbnRlcmZhY2UsIHtcbiAgICAgICAga2V5OiBmdW5jdGlvbiAobmF0aXZlRXZlbnQpIHtcbiAgICAgICAgICBpZiAobmF0aXZlRXZlbnQua2V5KSB7XG4gICAgICAgICAgICB2Y
15852XIga2V5ID0gbm9ybWFsaXplS2V5W25hdGl2ZUV2ZW50LmtleV0gfHwgbmF0aXZlRXZlbnQua2V5O1xuICAgICAgICAgICAgaWYgKFwiVW5pZGVudGlmaWVkXCIgIT09IGtleSkgcmV0dXJuIGtleTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFwia2V5cHJlc3NcIiA9PT0gbmF0aXZlRXZlbnQudHlwZVxuICAgICAgICAgICAgPyAoKG5hdGl2ZUV2ZW50ID0gZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCkpLFxuICAgICAgICAgICAgICAxMyA9PT0gbmF0aXZlRXZlbnQgPyBcIkVudGVyXCIgOiBTdHJpbmcuZnJvbUNoYXJDb2RlKG5hdGl2ZUV2ZW50KSlcbiAgICAgICAgICAgIDogXCJrZXlkb3duXCIgPT09IG5hdGl2ZUV2ZW50LnR5cGUgfHwgXCJrZXl1cFwiID09PSBuYXRpdmVFdmVudC50eXBlXG4gICAgICAgICAgICAgID8gdHJhbnNsYXRlVG9LZXlbbmF0aXZlRXZlbnQua2V5Q29kZV0gfHwgXCJVbmlkZW50aWZpZWRcIlxuICAgICAgICAgICAgICA6IFwiXCI7XG4gICAgICAgIH0sXG4gICAgICAgIGNvZGU6IDAsXG4gICAgICAgIGxvY2F0aW9uOiAwLFxuICAgICAgICBjdHJsS2V5OiAwLFxuICAgICAgICBzaGlmdEtleTogMCxcbiAgICAgICAgYWx0S2V5OiAwLFxuICAgICAgICBtZXRhS2V5OiAwLFxuICAgICAgICByZXBlYXQ6IDAsXG4gICAgICAgIGxvY2FsZTogMCxcbiAgICAgICAgZ2V0TW9kaWZpZXJTdGF0ZTogZ2V0RXZlbnRNb2RpZmllclN0YXRlLFxuICAgICAgICBjaGFyQ29kZTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgcmV0dXJuIFwia2V5cHJlc3NcIiA9PT0gZXZlbnQudHlwZSA/IGdldEV2ZW50Q2hhckNvZGUoZXZlbnQpIDogMDtcbiAgICAgICAgfSxcbiAgICAgICAga2V5Q29kZTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgcmV0dXJuIFwia2V5ZG93blwiID09PSBldmVudC50eXBlIHx8IFwia2V5dXBcIiA9PT0gZXZlbnQudHlwZVxuICAgICAgICAgICAgPyBldmVudC5rZXlDb2RlXG4gICAgICAgICAgICA6IDA7XG4gICAgICAgIH0sXG4gICAgICAgIHdoaWNoOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICByZXR1cm4gXCJrZXlwcmVzc1wiID09PSBldmVudC50eXBlXG4gICAgICAgICAgICA/IGdldEV2ZW50Q2hhckNvZGUoZXZlbnQpXG4gICAgICAgICAgICA6IFwia2V5ZG93blwiID09PSBldmVudC50eXBlIHx8IFwia2V5dXBcIiA9PT0gZXZlbnQudHlwZVxuICAgICAgICAgICAgICA/IGV2ZW50LmtleUNvZGVcbiAgICAgICAgICAgICAgOiAwO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIFN5bnRoZXRpY0tleWJvYXJkRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChLZXlib2FyZEV2ZW50SW50ZXJmYWNlKSxcbiAgICAgIFBvaW50ZXJFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgTW91c2VFdmVudEludGVyZmFjZSwge1xuICAgICAgICBwb2ludGVySWQ6IDAsXG4gICAgICAgIHdpZHRoOiAwLFxuICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgIHByZXNzdXJlOiAwLFxuICAgICAgICB0YW5nZW50aWFsUHJlc3N1cmU6IDAsXG4gICAgICAgIHRpbHRYOiAwLFxuICAgICAgICB0aWx0WTogMCxcbiAgICAgICAgdHdpc3Q6IDAsXG4gICAgICAgIHBvaW50ZXJUeXBlOiAwLFxuICAgICAgICBpc1ByaW1hcnk6IDBcbiAgICAgIH0pLFxuICAgICAgU3ludGhldGljUG9pbnRlckV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoUG9pbnRlckV2ZW50SW50ZXJmYWNlKSxcbiAgICAgIFN1Ym1pdEV2ZW50SW50ZXJmYWNlID0gYXNzaWduKHt9LCBFdmVudEludGVyZmFjZSwgeyBzdWJtaXR0ZXI6IDAgfSksXG4gICAgICBTeW50aGV0aWNTdWJtaXRFdmVudCA9IGNyZWF0ZVN5bnRoZXRpY0V2ZW50KFN1Ym1pdEV2ZW50SW50ZXJmYWNlKSxcbiAgICAgIFRvdWNoRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIFVJRXZlbnRJbnRlcmZhY2UsIHtcbiAgICAgICAgdG91Y2hlczogMCxcbiAgICAgICAgdGFyZ2V0VG91Y2hlczogMCxcbiAgICAgICAgY2hhbmdlZFRvdWNoZXM6IDAsXG4gICAgICAgIGFsdEtleTogMCxcbiAgICAgICAgbWV0YUtleTogMCxcbiAgICAgICAgY3RybEtleTogMCxcbiAgICAgICAgc2hpZnRLZXk6IDAsXG4gICAgICAgIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZVxuICAgICAgfSksXG4gICAgICBTeW50aGV0aWNUb3VjaEV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoVG91Y2hFdmVudEludGVyZmFjZSksXG4gICAgICBUcmFuc2l0aW9uRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIEV2ZW50SW50ZXJmYWNlLCB7XG4gICAgICAgIHByb3BlcnR5TmFtZTogMCxcbiAgICAgICAgZWxhcHNlZFRpbWU6IDAsXG4gICAgICAgIHBzZXVkb0VsZW1lbnQ6IDBcbiAgICAgIH0pLFxuICAgICAgU3ludGhldGljVHJhbnNpdGlvbkV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoVHJhbnNpdGlvbkV2ZW50SW50ZXJmYWNlKSxcbiAgICAgIFdoZWVsRXZlbnRJbnRlcmZhY2UgPSBhc3NpZ24oe30sIE1vdXNlRXZlbnRJbnRlcmZhY2UsIHtcbiAgICAgICAgZGVsdGFYOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICByZXR1cm4gXCJkZWx0YVhcIiBpbiBldmVudFxuICAgICAgICAgICAgPyBldmVudC5kZWx0YVhcbiAgICAgICAgICAgIDogXCJ3aGVlbERlbHRhWFwiIGluIGV2ZW50XG4gICAgICAgICAgICAgID8gLWV2ZW50LndoZWVsRGVsdGFYXG4gICAgICAgICAgICAgIDogMDtcbiAgICAgICAgfSxcbiAgICAgICAgZGVsdGFZOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICByZXR1cm4gXCJkZWx0YVlcIiBpbiBldmVudFxuICAgICAgICAgICAgPyBldmVudC5kZWx0YVlcbiAgICAgICAgICAgIDogXCJ3aGVlbERlbHRhWVwiIGluIGV2ZW50XG4gICAgICAgICAgICAgID8gLWV2ZW50LndoZWVsRGVsdGFZXG4gICAgICAgICAgICAgIDogXCJ3aGVlbERlbHRhXCIgaW4gZXZlbnRcbiAgICAgICAgICAgICAgICA/IC1ldmVudC53aGVlbERlbHRhXG4gICAgICAgICAgICAgICAgOiAwO1xuICAgICAgICB9LFxuICAgICAgICBkZWx0YVo6IDAsXG4gICAgICAgIGRlbHRhTW9kZTogMFxuICAgICAgfSksXG4gICAgICBTeW50aGV0aWNXaGVlbEV2ZW50ID0gY3JlYXRlU3ludGhldGljRXZlbnQoV2hlZWxFdmVudEludGVyZmFjZSksXG4gICAgICBUb2dnbGVFdmVudEludGVyZmFjZSA9IGFzc2lnbih7fSwgRXZlbnRJbnRlcmZhY2UsIHtcbiAgICAgICAgbmV3
15852U3RhdGU6IDAsXG4gICAgICAgIG9sZFN0YXRlOiAwLFxuICAgICAgICBzb3VyY2U6IDBcbiAgICAgIH0pLFxuICAgICAgU3ludGhldGljVG9nZ2xlRXZlbnQgPSBjcmVhdGVTeW50aGV0aWNFdmVudChUb2dnbGVFdmVudEludGVyZmFjZSksXG4gICAgICBFTkRfS0VZQ09ERVMgPSBbOSwgMTMsIDI3LCAzMl0sXG4gICAgICBTVEFSVF9LRVlDT0RFID0gMjI5LFxuICAgICAgY2FuVXNlQ29tcG9zaXRpb25FdmVudCA9IGNhblVzZURPTSAmJiBcIkNvbXBvc2l0aW9uRXZlbnRcIiBpbiB3aW5kb3csXG4gICAgICBkb2N1bWVudE1vZGUgPSBudWxsO1xuICAgIGNhblVzZURPTSAmJlxuICAgICAgXCJkb2N1bWVudE1vZGVcIiBpbiBkb2N1bWVudCAmJlxuICAgICAgKGRvY3VtZW50TW9kZSA9IGRvY3VtZW50LmRvY3VtZW50TW9kZSk7XG4gICAgdmFyIGNhblVzZVRleHRJbnB1dEV2ZW50ID1cbiAgICAgICAgY2FuVXNlRE9NICYmIFwiVGV4dEV2ZW50XCIgaW4gd2luZG93ICYmICFkb2N1bWVudE1vZGUsXG4gICAgICB1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSA9XG4gICAgICAgIGNhblVzZURPTSAmJlxuICAgICAgICAoIWNhblVzZUNvbXBvc2l0aW9uRXZlbnQgfHxcbiAgICAgICAgICAoZG9jdW1lbnRNb2RlICYmIDggPCBkb2N1bWVudE1vZGUgJiYgMTEgPj0gZG9jdW1lbnRNb2RlKSksXG4gICAgICBTUEFDRUJBUl9DT0RFID0gMzIsXG4gICAgICBTUEFDRUJBUl9DSEFSID0gU3RyaW5nLmZyb21DaGFyQ29kZShTUEFDRUJBUl9DT0RFKSxcbiAgICAgIGhhc1NwYWNlS2V5cHJlc3MgPSAhMSxcbiAgICAgIGlzQ29tcG9zaW5nID0gITEsXG4gICAgICBzdXBwb3J0ZWRJbnB1dFR5cGVzID0ge1xuICAgICAgICBjb2xvcjogITAsXG4gICAgICAgIGRhdGU6ICEwLFxuICAgICAgICBkYXRldGltZTogITAsXG4gICAgICAgIFwiZGF0ZXRpbWUtbG9jYWxcIjogITAsXG4gICAgICAgIGVtYWlsOiAhMCxcbiAgICAgICAgbW9udGg6ICEwLFxuICAgICAgICBudW1iZXI6ICEwLFxuICAgICAgICBwYXNzd29yZDogITAsXG4gICAgICAgIHJhbmdlOiAhMCxcbiAgICAgICAgc2VhcmNoOiAhMCxcbiAgICAgICAgdGVsOiAhMCxcbiAgICAgICAgdGV4dDogITAsXG4gICAgICAgIHRpbWU6ICEwLFxuICAgICAgICB1cmw6ICEwLFxuICAgICAgICB3ZWVrOiAhMFxuICAgICAgfSxcbiAgICAgIGFjdGl2ZUVsZW1lbnQkMSA9IG51bGwsXG4gICAgICBhY3RpdmVFbGVtZW50SW5zdCQxID0gbnVsbCxcbiAgICAgIGlzSW5wdXRFdmVudFN1cHBvcnRlZCA9ICExO1xuICAgIGNhblVzZURPTSAmJlxuICAgICAgKGlzSW5wdXRFdmVudFN1cHBvcnRlZCA9XG4gICAgICAgIGlzRXZlbnRTdXBwb3J0ZWQoXCJpbnB1dFwiKSAmJlxuICAgICAgICAoIWRvY3VtZW50LmRvY3VtZW50TW9kZSB8fCA5IDwgZG9jdW1lbnQuZG9jdW1lbnRNb2RlKSk7XG4gICAgdmFyIG9iamVjdElzID0gXCJmdW5jdGlvblwiID09PSB0eXBlb2YgT2JqZWN0LmlzID8gT2JqZWN0LmlzIDogaXMsXG4gICAgICBza2lwU2VsZWN0aW9uQ2hhbmdlRXZlbnQgPVxuICAgICAgICBjYW5Vc2VET00gJiYgXCJkb2N1bWVudE1vZGVcIiBpbiBkb2N1bWVudCAmJiAxMSA+PSBkb2N1bWVudC5kb2N1bWVudE1vZGUsXG4gICAgICBhY3RpdmVFbGVtZW50ID0gbnVsbCxcbiAgICAgIGFjdGl2ZUVsZW1lbnRJbnN0ID0gbnVsbCxcbiAgICAgIGxhc3RTZWxlY3Rpb24gPSBudWxsLFxuICAgICAgbW91c2VEb3duID0gITEsXG4gICAgICB2ZW5kb3JQcmVmaXhlcyA9IHtcbiAgICAgICAgYW5pbWF0aW9uZW5kOiBtYWtlUHJlZml4TWFwKFwiQW5pbWF0aW9uXCIsIFwiQW5pbWF0aW9uRW5kXCIpLFxuICAgICAgICBhbmltYXRpb25pdGVyYXRpb246IG1ha2VQcmVmaXhNYXAoXCJBbmltYXRpb25cIiwgXCJBbmltYXRpb25JdGVyYXRpb25cIiksXG4gICAgICAgIGFuaW1hdGlvbnN0YXJ0OiBtYWtlUHJlZml4TWFwKFwiQW5pbWF0aW9uXCIsIFwiQW5pbWF0aW9uU3RhcnRcIiksXG4gICAgICAgIHRyYW5zaXRpb25ydW46IG1ha2VQcmVmaXhNYXAoXCJUcmFuc2l0aW9uXCIsIFwiVHJhbnNpdGlvblJ1blwiKSxcbiAgICAgICAgdHJhbnNpdGlvbnN0YXJ0OiBtYWtlUHJlZml4TWFwKFwiVHJhbnNpdGlvblwiLCBcIlRyYW5zaXRpb25TdGFydFwiKSxcbiAgICAgICAgdHJhbnNpdGlvbmNhbmNlbDogbWFrZVByZWZpeE1hcChcIlRyYW5zaXRpb25cIiwgXCJUcmFuc2l0aW9uQ2FuY2VsXCIpLFxuICAgICAgICB0cmFuc2l0aW9uZW5kOiBtYWtlUHJlZml4TWFwKFwiVHJhbnNpdGlvblwiLCBcIlRyYW5zaXRpb25FbmRcIilcbiAgICAgIH0sXG4gICAgICBwcmVmaXhlZEV2ZW50TmFtZXMgPSB7fSxcbiAgICAgIHN0eWxlID0ge307XG4gICAgY2FuVXNlRE9NICYmXG4gICAgICAoKHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKS5zdHlsZSksXG4gICAgICBcIkFuaW1hdGlvbkV2ZW50XCIgaW4gd2luZG93IHx8XG4gICAgICAgIChkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uZW5kLmFuaW1hdGlvbixcbiAgICAgICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLmFuaW1hdGlvbml0ZXJhdGlvbi5hbmltYXRpb24sXG4gICAgICAgIGRlbGV0ZSB2ZW5kb3JQcmVmaXhlcy5hbmltYXRpb25zdGFydC5hbmltYXRpb24pLFxuICAgICAgXCJUcmFuc2l0aW9uRXZlbnRcIiBpbiB3aW5kb3cgfHxcbiAgICAgICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLnRyYW5zaXRpb25lbmQudHJhbnNpdGlvbik7XG4gICAgdmFyIEFOSU1BVElPTl9FTkQgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZShcImFuaW1hdGlvbmVuZFwiKSxcbiAgICAgIEFOSU1BVElPTl9JVEVSQVRJT04gPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZShcImFuaW1hdGlvbml0ZXJhdGlvblwiKSxcbiAgICAgIEFOSU1BVElPTl9TVEFSVCA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKFwiYW5pbWF0aW9uc3RhcnRcIiksXG4gICAgICBUUkFOU0lUSU9OX1JVTiA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKFwidHJhbnNpdGlvbnJ1blwiKSxcbiAgICAgIFRSQU5TSVRJT05fU1RBUlQgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZShcInRyYW5zaXRpb25zdGFydFwiKSxcbiAgICAgIFRSQU5TSVRJT05fQ0FOQ0VMID0gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoXCJ0cmFuc2l0aW9uY2FuY2VsXCIpLFxuICAgICAgVFJBTlNJVElPTl9FTkQgPSBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZShcInRyYW5zaXRpb25lbmRcIiksXG4gICAgICB0b3BMZXZlbEV2ZW50c1RvUmVhY3ROYW1lcyA9IG5ldyBNYXAoKSxcbiAgICAgIHNpbXBsZUV2ZW50UGx1Z2luRXZlbnRzID1cbiAgICAgICAgXCJhYm9ydCBhdXhDbGljayBiZWZvcmVUb2dnbGUgY2FuY2VsIGNhblBsYXkgY2FuUGxheVRocm91Z2ggY2xpY2sgY2xvc2UgY29udGV4dE1lbnUgY29weSBjdXQgZHJhZyBkcmFnRW5kIGRyYWdFbnRlciBkcmFnRXhpdCBkcmFnTGVhdmUgZHJhZ092ZXIgZHJhZ1N0YXJ0IGRyb3AgZHVyYXRpb25DaGFuZ2UgZW1wdGllZCBlbmNyeXB0ZWQgZW5kZWQgZXJyb3IgZnVsbHNjcmVlbkNoYW5nZSBmdWxsc2NyZWVuRXJyb3IgZ290UG9pbnRlckNhcHR1cmUgaW5wdXQgaW52YWxpZCBrZXlEb3duIGtleVByZXNzIGtleVVwIGxvYWQgbG9hZGVkRGF0YSBsb2FkZWRNZXRhZGF0YSBsb2FkU3RhcnQgbG9zdFBvaW50ZXJDYXB0dXJlIG1vdXNlRG93biBtb3VzZU1vdmUgbW91c2VPdXQgbW91c2VPdmVyIG1vdXNlVXAgcGFzdGUgcGF1c2Ug
15852cGxheSBwbGF5aW5nIHBvaW50ZXJDYW5jZWwgcG9pbnRlckRvd24gcG9pbnRlck1vdmUgcG9pbnRlck91dCBwb2ludGVyT3ZlciBwb2ludGVyVXAgcHJvZ3Jlc3MgcmF0ZUNoYW5nZSByZXNldCByZXNpemUgc2Vla2VkIHNlZWtpbmcgc3RhbGxlZCBzdWJtaXQgc3VzcGVuZCB0aW1lVXBkYXRlIHRvdWNoQ2FuY2VsIHRvdWNoRW5kIHRvdWNoU3RhcnQgdm9sdW1lQ2hhbmdlIHNjcm9sbCB0b2dnbGUgdG91Y2hNb3ZlIHdhaXRpbmcgd2hlZWxcIi5zcGxpdChcbiAgICAgICAgICBcIiBcIlxuICAgICAgICApO1xuICAgIHNpbXBsZUV2ZW50UGx1Z2luRXZlbnRzLnB1c2goXCJzY3JvbGxFbmRcIik7XG4gICAgdmFyIGdsb2JhbENsaWVudElkQ291bnRlciQxID0gMCxcbiAgICAgIGxhc3RSZXNldFRpbWUgPSAwO1xuICAgIGlmIChcbiAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiBwZXJmb3JtYW5jZSAmJlxuICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgcGVyZm9ybWFuY2Uubm93XG4gICAgKSB7XG4gICAgICB2YXIgbG9jYWxQZXJmb3JtYW5jZSA9IHBlcmZvcm1hbmNlO1xuICAgICAgdmFyIGdldEN1cnJlbnRUaW1lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbG9jYWxQZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBsb2NhbERhdGUgPSBEYXRlO1xuICAgICAgZ2V0Q3VycmVudFRpbWUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBsb2NhbERhdGUubm93KCk7XG4gICAgICB9O1xuICAgIH1cbiAgICB2YXIgcmVwb3J0R2xvYmFsRXJyb3IgPVxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiByZXBvcnRFcnJvclxuICAgICAgICAgID8gcmVwb3J0RXJyb3JcbiAgICAgICAgICA6IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIHdpbmRvdyAmJlxuICAgICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHdpbmRvdy5FcnJvckV2ZW50XG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHZhciBldmVudCA9IG5ldyB3aW5kb3cuRXJyb3JFdmVudChcImVycm9yXCIsIHtcbiAgICAgICAgICAgICAgICAgIGJ1YmJsZXM6ICEwLFxuICAgICAgICAgICAgICAgICAgY2FuY2VsYWJsZTogITAsXG4gICAgICAgICAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICBcIm9iamVjdFwiID09PSB0eXBlb2YgZXJyb3IgJiZcbiAgICAgICAgICAgICAgICAgICAgbnVsbCAhPT0gZXJyb3IgJiZcbiAgICAgICAgICAgICAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIGVycm9yLm1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICA/IFN0cmluZyhlcnJvci5tZXNzYWdlKVxuICAgICAgICAgICAgICAgICAgICAgIDogU3RyaW5nKGVycm9yKSxcbiAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvclxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICghd2luZG93LmRpc3BhdGNoRXZlbnQoZXZlbnQpKSByZXR1cm47XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIHByb2Nlc3MgJiZcbiAgICAgICAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBwcm9jZXNzLmVtaXRcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5lbWl0KFwidW5jYXVnaHRFeGNlcHRpb25cIiwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH0sXG4gICAgICBPTUlUVEVEX1BST1BfRVJST1IgPVxuICAgICAgICBcIlRoaXMgb2JqZWN0IGhhcyBiZWVuIG9taXR0ZWQgYnkgUmVhY3QgaW4gdGhlIGNvbnNvbGUgbG9nIHRvIGF2b2lkIHNlbmRpbmcgdG9vIG11Y2ggZGF0YSBmcm9tIHRoZSBzZXJ2ZXIuIFRyeSBsb2dnaW5nIHNtYWxsZXIgb3IgbW9yZSBzcGVjaWZpYyBvYmplY3RzLlwiLFxuICAgICAgRU1QVFlfQVJSQVkgPSAwLFxuICAgICAgQ09NUExFWF9BUlJBWSA9IDEsXG4gICAgICBQUklNSVRJVkVfQVJSQVkgPSAyLFxuICAgICAgRU5UUklFU19BUlJBWSA9IDMsXG4gICAgICBPQkpFQ1RfV0lEVEhfTElNSVQgPSAxMDAsXG4gICAgICBSRU1PVkVEID0gXCItXFx1MDBhMFwiLFxuICAgICAgQURERUQgPSBcIitcXHUwMGEwXCIsXG4gICAgICBVTkNIQU5HRUQgPSBcIlxcdTIwMDdcXHUwMGEwXCIsXG4gICAgICBzdXBwb3J0c1VzZXJUaW1pbmcgPVxuICAgICAgICBcInVuZGVmaW5lZFwiICE9PSB0eXBlb2YgY29uc29sZSAmJlxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBjb25zb2xlLnRpbWVTdGFtcCAmJlxuICAgICAgICBcInVuZGVmaW5lZFwiICE9PSB0eXBlb2YgcGVyZm9ybWFuY2UgJiZcbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgcGVyZm9ybWFuY2UubWVhc3VyZSxcbiAgICAgIENPTVBPTkVOVFNfVFJBQ0sgPSBcIkNvbXBvbmVudHMgXFx1MjY5YlwiLFxuICAgICAgTEFORVNfVFJBQ0tfR1JPVVAgPSBcIlNjaGVkdWxlciBcXHUyNjliXCIsXG4gICAgICBjdXJyZW50VHJhY2sgPSBcIkJsb2NraW5nXCIsXG4gICAgICBhbHJlYWR5V2FybmVkRm9yRGVlcEVxdWFsaXR5ID0gITEsXG4gICAgICByZXVzYWJsZUNvbXBvbmVudERldlRvb2xEZXRhaWxzID0ge1xuICAgICAgICBjb2xvcjogXCJwcmltYXJ5XCIsXG4gICAgICAgIHByb3BlcnRpZXM6IG51bGwsXG4gICAgICAgIHRvb2x0aXBUZXh0OiBcIlwiLFxuICAgICAgICB0cmFjazogQ09NUE9ORU5UU19UUkFDS1xuICAgICAgfSxcbiAgICAgIHJldXNhYmxlQ29tcG9uZW50T3B0aW9ucyA9IHtcbiAgICAgICAgc3RhcnQ6IC0wLFxuICAgICAgICBlbmQ6IC0wLFxuICAgICAgICBkZXRhaWw6IHsgZGV2dG9vbHM6IHJldXNhYmxlQ29tcG9uZW50RGV2VG9vbERldGFpbHMgfVxuICAgICAgfSxcbiAgICAgIHJldXNhYmxlQ2hhbmdlZFByb3BzRW50cnkgPSBbXCJDaGFuZ2VkIFByb3BzXCIsIFwiXCJdLFxuICAgICAgREVFUF9FUVVBTElUWV9XQVJOSU5HID1cbiAgICAgICAgXCJUaGlzIGNvbXBvbmVudCByZWNlaXZlZCBkZW
15852VwbHkgZXF1YWwgcHJvcHMuIEl0IG1pZ2h0IGJlbmVmaXQgZnJvbSB1c2VNZW1vIG9yIHRoZSBSZWFjdCBDb21waWxlciBpbiBpdHMgb3duZXIuXCIsXG4gICAgICByZXVzYWJsZURlZXBseUVxdWFsUHJvcHNFbnRyeSA9IFtcIkNoYW5nZWQgUHJvcHNcIiwgREVFUF9FUVVBTElUWV9XQVJOSU5HXSxcbiAgICAgIE9mZnNjcmVlblZpc2libGUgPSAxLFxuICAgICAgT2Zmc2NyZWVuUGFzc2l2ZUVmZmVjdHNDb25uZWN0ZWQgPSAyLFxuICAgICAgY29uY3VycmVudFF1ZXVlcyA9IFtdLFxuICAgICAgY29uY3VycmVudFF1ZXVlc0luZGV4ID0gMCxcbiAgICAgIGNvbmN1cnJlbnRseVVwZGF0ZWRMYW5lcyA9IDAsXG4gICAgICBlbXB0eUNvbnRleHRPYmplY3QgPSB7fTtcbiAgICBPYmplY3QuZnJlZXplKGVtcHR5Q29udGV4dE9iamVjdCk7XG4gICAgdmFyIHJlc29sdmVGYW1pbHkgPSBudWxsLFxuICAgICAgZmFpbGVkQm91bmRhcmllcyA9IG51bGwsXG4gICAgICBOb01vZGUgPSAwLFxuICAgICAgQ29uY3VycmVudE1vZGUgPSAxLFxuICAgICAgUHJvZmlsZU1vZGUgPSAyLFxuICAgICAgU3RyaWN0TGVnYWN5TW9kZSA9IDgsXG4gICAgICBTdHJpY3RFZmZlY3RzTW9kZSA9IDE2LFxuICAgICAgU3VzcGVuc2V5SW1hZ2VzTW9kZSA9IDMyO1xuICAgIHZhciBoYXNCYWRNYXBQb2x5ZmlsbCA9ICExO1xuICAgIHRyeSB7XG4gICAgICB2YXIgbm9uRXh0ZW5zaWJsZU9iamVjdCA9IE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSk7XG4gICAgICBuZXcgTWFwKFtbbm9uRXh0ZW5zaWJsZU9iamVjdCwgbnVsbF1dKTtcbiAgICAgIG5ldyBTZXQoW25vbkV4dGVuc2libGVPYmplY3RdKTtcbiAgICB9IGNhdGNoIChlJDQpIHtcbiAgICAgIGhhc0JhZE1hcFBvbHlmaWxsID0gITA7XG4gICAgfVxuICAgIHZhciBDYXB0dXJlZFN0YWNrcyA9IG5ldyBXZWFrTWFwKCksXG4gICAgICBmb3JrU3RhY2sgPSBbXSxcbiAgICAgIGZvcmtTdGFja0luZGV4ID0gMCxcbiAgICAgIHRyZWVGb3JrUHJvdmlkZXIgPSBudWxsLFxuICAgICAgdHJlZUZvcmtDb3VudCA9IDAsXG4gICAgICBpZFN0YWNrID0gW10sXG4gICAgICBpZFN0YWNrSW5kZXggPSAwLFxuICAgICAgdHJlZUNvbnRleHRQcm92aWRlciA9IG51bGwsXG4gICAgICB0cmVlQ29udGV4dElkID0gMSxcbiAgICAgIHRyZWVDb250ZXh0T3ZlcmZsb3cgPSBcIlwiLFxuICAgICAgaHlkcmF0aW9uUGFyZW50RmliZXIgPSBudWxsLFxuICAgICAgbmV4dEh5ZHJhdGFibGVJbnN0YW5jZSA9IG51bGwsXG4gICAgICBpc0h5ZHJhdGluZyA9ICExLFxuICAgICAgZGlkU3VzcGVuZE9yRXJyb3JERVYgPSAhMSxcbiAgICAgIGh5ZHJhdGlvbkRpZmZSb290REVWID0gbnVsbCxcbiAgICAgIGh5ZHJhdGlvbkVycm9ycyA9IG51bGwsXG4gICAgICByb290T3JTaW5nbGV0b25Db250ZXh0ID0gITEsXG4gICAgICBIeWRyYXRpb25NaXNtYXRjaEV4Y2VwdGlvbiA9IEVycm9yKFxuICAgICAgICBcIkh5ZHJhdGlvbiBNaXNtYXRjaCBFeGNlcHRpb246IFRoaXMgaXMgbm90IGEgcmVhbCBlcnJvciwgYW5kIHNob3VsZCBub3QgbGVhayBpbnRvIHVzZXJzcGFjZS4gSWYgeW91J3JlIHNlZWluZyB0aGlzLCBpdCdzIGxpa2VseSBhIGJ1ZyBpbiBSZWFjdC5cIlxuICAgICAgKSxcbiAgICAgIHZhbHVlQ3Vyc29yID0gY3JlYXRlQ3Vyc29yKG51bGwpO1xuICAgIHZhciByZW5kZXJlckN1cnNvckRFViA9IGNyZWF0ZUN1cnNvcihudWxsKTtcbiAgICB2YXIgcmVuZGVyZXJTaWdpbCA9IHt9O1xuICAgIHZhciBjdXJyZW50bHlSZW5kZXJpbmdGaWJlciQxID0gbnVsbCxcbiAgICAgIGxhc3RDb250ZXh0RGVwZW5kZW5jeSA9IG51bGwsXG4gICAgICBpc0Rpc2FsbG93ZWRDb250ZXh0UmVhZEluREVWID0gITEsXG4gICAgICBBYm9ydENvbnRyb2xsZXJMb2NhbCA9XG4gICAgICAgIFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBBYm9ydENvbnRyb2xsZXJcbiAgICAgICAgICA/IEFib3J0Q29udHJvbGxlclxuICAgICAgICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICB2Y
15852XIgbGlzdGVuZXJzID0gW10sXG4gICAgICAgICAgICAgICAgc2lnbmFsID0gKHRoaXMuc2lnbmFsID0ge1xuICAgICAgICAgICAgICAgICAgYWJvcnRlZDogITEsXG4gICAgICAgICAgICAgICAgICBhZGRFdmVudExpc3RlbmVyOiBmdW5jdGlvbiAodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0aGlzLmFib3J0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHNpZ25hbC5hYm9ydGVkID0gITA7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbGlzdGVuZXIoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICBzY2hlZHVsZUNhbGxiYWNrJDIgPSBTY2hlZHVsZXIudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayxcbiAgICAgIE5vcm1hbFByaW9yaXR5ID0gU2NoZWR1bGVyLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LFxuICAgICAgQ2FjaGVDb250ZXh0ID0ge1xuICAgICAgICAkJHR5cGVvZjogUkVBQ1RfQ09OVEVYVF9UWVBFLFxuICAgICAgICBDb25zdW1lcjogbnVsbCxcbiAgICAgICAgUHJvdmlkZXI6IG51bGwsXG4gICAgICAgIF9jdXJyZW50VmFsdWU6IG51bGwsXG4gICAgICAgIF9jdXJyZW50VmFsdWUyOiBudWxsLFxuICAgICAgICBfdGhyZWFkQ291bnQ6IDAsXG4gICAgICAgIF9jdXJyZW50UmVuZGVyZXI6IG51bGwsXG4gICAgICAgIF9jdXJyZW50UmVuZGVyZXIyOiBudWxsXG4gICAgICB9LFxuICAgICAgZW50YW5nbGVkVHJhbnNpdGlvblR5cGVzID0gbnVsbCxcbiAgICAgIG5vdyA9IFNjaGVkdWxlci51bnN0YWJsZV9ub3csXG4gICAgICBjcmVhdGVUYXNrID0gY29uc29sZS5jcmVhdGVUYXNrXG4gICAgICAgID8gY29uc29sZS5jcmVhdGVUYXNrXG4gICAgICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfSxcbiAgICAgIFNQQVdORURfVVBEQVRFID0gMSxcbiAgICAgIFBJTkdFRF9VUERBVEUgPSAyLFxuICAgICAgcmVuZGVyU3RhcnRUaW1lID0gLTAsXG4gICAgICBjb21taXRTdGFydFRpbWUgPSAtMCxcbiAgICAgIGNvbW1pdEVuZFRpbWUgPSAtMCxcbiAgICAgIGNvbW1pdEVycm9ycyA9IG51bGwsXG4gICAgICBwcm9maWxlclN0YXJ0VGltZSA9IC0xLjEsXG4gICAgICBwcm9maWxlckVmZmVjdER1cmF0aW9uID0gLTAsXG4gICAgICBjb21wb25lbnRFZmZlY3REdXJhdGlvbiA9IC0wLFxuICAgICAgY29tcG9uZW50RWZmZWN0U3RhcnRUaW1lID0gLTEuMSxcbiAgICAgIGNvbXBvbmVudEVmZmVjdEVuZFRpbWUgPSAtMS4xLFxuICAgICAgY29tcG9uZW50RWZmZWN0RXJyb3JzID0gbnVsbCxcbiAgICAgIGNvbXBvbmVudEVmZmVjdFNwYXduZWRVcGRhdGUgPSAhMSxcbiAgICAgIGJsb2NraW5nQ2xhbXBUaW1lID0gLTAsXG4gICAgICBibG9ja2luZ1VwZGF0ZVRpbWUgPSAtMS4xLFxuICAgICAgYmxvY2tpbmdVcGRhdGVUYXNrID0gbnVsbCxcbiAgICAgIGJsb2NraW5nVXBkYXRlVHlwZSA9IDAsXG4gICAgICBibG9ja2luZ1VwZGF0ZU1ldGhvZE5hbWUgPSBudWxsLFxuICAgICAgYmxvY2tpbmdVcGRhdGVDb21wb25lbnROYW1lID0gbnVsbCxcbiAgICAgIGJsb2NraW5nRXZlbnRUaW1lID0gLTEuMSxcbiAgICAgIGJsb2NraW5nRXZlbnRUeXBlID0gbnVsbCxcbiAgICAgIGJsb2NraW5nRXZlbnRSZXBlYXRUaW1lID0gLTEuMSxcbiAgICAgIGJsb2NraW5nU3VzcGVuZGVkVGltZSA9IC0xLjEsXG4gICAgICB0cmFuc2l0aW9uQ2xhbXBUaW1lID0gLTAsXG4gICAgICB0cmFuc2l0aW9uU3RhcnRUaW1lID0gLTEuMSxcbiAgICAgIHRyYW5zaXRpb25VcGRhdGVUaW1lID0gLTEuMSxcbiAgICAgIHRyYW5zaXRpb25VcGRhdGVUeXBlID0gMCxcbiAgICAgIHRyYW5zaXRpb25VcGRhdGVUYXNrID0gbnVsbCxcbiAgICAgIHRyYW5zaXRpb25VcGRhdGVNZXRob2ROYW1lID0gbnVsbCxcbiAgICAgIHRyYW5zaXRpb25VcGRhdGVDb21wb25lbnROYW1lID0gbnVsbCxcbiAgICAgIHRyYW5zaXRpb25FdmVudFRpbWUgPSAtMS4xLFxuICAgICAgdHJhbnNpdGlvbkV2ZW50VHlwZSA9IG51bGwsXG4gICAgICB0cmFuc2l0aW9uRXZlbnRSZXBlYXRUaW1lID0gLTEuMSxcbiAgICAgIHRyYW5zaXRpb25TdXNwZW5kZWRUaW1lID0gLTEuMSxcbiAgICAgIHJldHJ5Q2xhbXBUaW1lID0gLTAsXG4gICAgICBpZGxlQ2xhbXBUaW1lID0gLTAsXG4gICAgICBhbmltYXRpbmdMYW5lcyA9IDAsXG4gICAgICBhbmltYXRpbmdUYXNrID0gbnVsbCxcbiAgICAgIHlpZWxkUmVhc29uID0gMCxcbiAgICAgIHlpZWxkU3RhcnRUaW1lID0gLTEuMSxcbiAgICAgIGN1cnJlbnRVcGRhdGVJc05lc3RlZCA9ICExLFxuICAgICAgbmVzdGVkVXBkYXRlU2NoZWR1bGVkID0gITEsXG4gICAgICBjdXJyZW50RW50YW5nbGVkTGlzdGVuZXJzID0gbnVsbCxcbiAgICAgIGN1cnJlbnRFbnRhbmdsZWRQZW5kaW5nQ291bnQgPSAwLFxuICAgICAgY3VycmVudEVudGFuZ2xlZExhbmUgPSAwLFxuICAgICAgY3VycmVudEVudGFuZ2xlZEFjdGlvblRoZW5hYmxlID0gbnVsbCxcbiAgICAgIHByZXZPblN0YXJ0VHJhbnNpdGlvbkZpbmlzaCA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlM7XG4gICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuUyA9IGZ1bmN0aW9uICh0cmFuc2l0aW9uLCByZXR1cm5WYWx1ZSkge1xuICAgICAgZ2xvYmFsTW9zdFJlY2VudFRyYW5zaXRpb25UaW1lID0gbm93JDEoKTtcbiAgICAgIGlmIChcbiAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIHJldHVyblZhbHVlICYmXG4gICAgICAgIG51bGwgIT09IHJldHVyblZhbHVlICYmXG4gICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHJldHVyblZhbHVlLnRoZW5cbiAgICAgICkge1xuICAgICAgICBpZiAoMCA+IHRyYW5zaXRpb25TdGFydFRpbWUgJiYgMCA+IHRyYW5zaXRpb25VcGRhdGVUaW1lKSB7XG4gICAgICAgICAgdHJhbnNpdGlvblN0YXJ0VGltZSA9IG5vdygpO1xuICAgICAgICAgI
15852HZhciBuZXdFdmVudFRpbWUgPSByZXNvbHZlRXZlbnRUaW1lU3RhbXAoKSxcbiAgICAgICAgICAgIG5ld0V2ZW50VHlwZSA9IHJlc29sdmVFdmVudFR5cGUoKTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBuZXdFdmVudFRpbWUgIT09IHRyYW5zaXRpb25FdmVudFJlcGVhdFRpbWUgfHxcbiAgICAgICAgICAgIG5ld0V2ZW50VHlwZSAhPT0gdHJhbnNpdGlvbkV2ZW50VHlwZVxuICAgICAgICAgIClcbiAgICAgICAgICAgIHRyYW5zaXRpb25FdmVudFJlcGVhdFRpbWUgPSAtMS4xO1xuICAgICAgICAgIHRyYW5zaXRpb25FdmVudFRpbWUgPSBuZXdFdmVudFRpbWU7XG4gICAgICAgICAgdHJhbnNpdGlvbkV2ZW50VHlwZSA9IG5ld0V2ZW50VHlwZTtcbiAgICAgICAgfVxuICAgICAgICBlbnRhbmdsZUFzeW5jQWN0aW9uKHRyYW5zaXRpb24sIHJldHVyblZhbHVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChudWxsICE9PSBlbnRhbmdsZWRUcmFuc2l0aW9uVHlwZXMpXG4gICAgICAgIGZvciAobmV3RXZlbnRUaW1lID0gZmlyc3RTY2hlZHVsZWRSb290OyBudWxsICE9PSBuZXdFdmVudFRpbWU7IClcbiAgICAgICAgICBxdWV1ZVRyYW5zaXRpb25UeXBlcyhuZXdFdmVudFRpbWUsIGVudGFuZ2xlZFRyYW5zaXRpb25UeXBlcyksXG4gICAgICAgICAgICAobmV3RXZlbnRUaW1lID0gbmV3RXZlbnRUaW1lLm5leHQpO1xuICAgICAgbmV3RXZlbnRUaW1lID0gdHJhbnNpdGlvbi50eXBlcztcbiAgICAgIGlmIChudWxsICE9PSBuZXdFdmVudFRpbWUpIHtcbiAgICAgICAgZm9yIChuZXdFdmVudFR5cGUgPSBmaXJzdFNjaGVkdWxlZFJvb3Q7IG51bGwgIT09IG5ld0V2ZW50VHlwZTsgKVxuICAgICAgICAgIHF1ZXVlVHJhbnNpdGlvblR5cGVzKG5ld0V2ZW50VHlwZSwgbmV3RXZlbnRUaW1lKSxcbiAgICAgICAgICAgIChuZXdFdmVudFR5cGUgPSBuZXdFdmVudFR5cGUubmV4dCk7XG4gICAgICAgIGlmICgwICE9PSBjdXJyZW50RW50YW5nbGVkTGFuZSkge1xuICAgICAgICAgIG5ld0V2ZW50VHlwZSA9IGVudGFuZ2xlZFRyYW5zaXRpb25UeXBlcztcbiAgICAgICAgICBudWxsID09PSBuZXdFdmVudFR5cGUgJiZcbiAgICAgICAgICAgIChuZXdFdmVudFR5cGUgPSBlbnRhbmdsZWRUcmFuc2l0aW9uVHlwZXMgPSBbXSk7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdFdmVudFRpbWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciB0cmFuc2l0aW9uVHlwZSA9IG5ld0V2ZW50VGltZVtpXTtcbiAgICAgICAgICAgIC0xID09PSBuZXdFdmVudFR5cGUuaW5kZXhPZih0cmFuc2l0aW9uVHlwZSkgJiZcbiAgICAgICAgICAgICAgbmV3RXZlbnRUeXBlLnB1c2godHJhbnNpdGlvblR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbnVsbCAhPT0gcHJldk9uU3RhcnRUcmFuc2l0aW9uRmluaXNoICYmXG4gICAgICAgIHByZXZPblN0YXJ0VHJhbnNpdGlvbkZpbmlzaCh0cmFuc2l0aW9uLCByZXR1cm5WYWx1ZSk7XG4gICAgfTtcbiAgICB2YXIgcmVzdW1lZENhY2hlID0gY3JlYXRlQ3Vyc29yKG51bGwpLFxuICAgICAgUmVhY3RTdHJpY3RNb2RlV2FybmluZ3MgPSB7XG4gICAgICAgIHJlY29yZFVuc2FmZUxpZmVjeWNsZVdhcm5pbmdzOiBmdW5jdGlvbiAoKSB7fSxcbiAgICAgICAgZmx1c2hQZW5kaW5nVW5zYWZlTGlmZWN5Y2xlV2FybmluZ3M6IGZ1bmN0aW9uICgpIHt9LFxuICAgICAgICByZWNvcmRMZWdhY3lDb250ZXh0V2FybmluZzogZnVuY3Rpb24gKCkge30sXG4gICAgICAgIGZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmc6IGZ1bmN0aW9uICgpIHt9LFxuICAgICAgICBkaXNjYXJkUGVuZGluZ1dhcm5pbmdzOiBmdW5jdGlvbiAoKSB7fVxuICAgICAgfSxcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdLFxuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncyA9IFtdLFxuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdLFxuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MgPSBbXSxcbiAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXSxcbiAgICAgIHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzID0gW10sXG4gICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzID0gbmV3IFNldCgpO1xuICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZFVuc2FmZUxpZmVjeWNsZVdhcm5pbmdzID0gZnVuY3Rpb24gKFxuICAgICAgZmliZXIsXG4gICAgICBpbnN0YW5jZVxuICAgICkge1xuICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5oYXMoZmliZXIudHlwZSkgfHxcbiAgICAgICAgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGluc3RhbmNlLmNvbXBvbmVudFdpbGxNb3VudCAmJlxuICAgICAgICAgICEwICE9PSBpbnN0YW5jZS5jb21wb25lbnRXaWxsTW91bnQuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAmJlxuICAgICAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5wdXNoKGZpYmVyKSxcbiAgICAgICAgZmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUgJiZcbiAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50ICYmXG4gICAgICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5wdXNoKGZpYmVyKSxcbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyAmJlxuICAgICAgICAgICEwICE9PVxuICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcy5fX3N1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5nICYmXG4gICAgICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5wdXNoKGZpYmVyKSxcbiAgICAgICAgZmliZXIubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUgJiZcbiAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBpbnN0YW5jZS5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyAmJlxuICAgICAgICAgI
15852HBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLnB1c2goZmliZXIpLFxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBpbnN0YW5jZS5jb21wb25lbnRXaWxsVXBkYXRlICYmXG4gICAgICAgICAgITAgIT09IGluc3RhbmNlLmNvbXBvbmVudFdpbGxVcGRhdGUuX19zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZyAmJlxuICAgICAgICAgIHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MucHVzaChmaWJlciksXG4gICAgICAgIGZpYmVyLm1vZGUgJiBTdHJpY3RMZWdhY3lNb2RlICYmXG4gICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgaW5zdGFuY2UuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgJiZcbiAgICAgICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5wdXNoKGZpYmVyKSk7XG4gICAgfTtcbiAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5mbHVzaFBlbmRpbmdVbnNhZmVMaWZlY3ljbGVXYXJuaW5ncyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcbiAgICAgIDAgPCBwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MubGVuZ3RoICYmXG4gICAgICAgIChwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgICBjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5hZGQoXG4gICAgICAgICAgICBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCBcIkNvbXBvbmVudFwiXG4gICAgICAgICAgKTtcbiAgICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgICAgfSksXG4gICAgICAgIChwZW5kaW5nQ29tcG9uZW50V2lsbE1vdW50V2FybmluZ3MgPSBbXSkpO1xuICAgICAgdmFyIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcbiAgICAgIDAgPCBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzLmxlbmd0aCAmJlxuICAgICAgICAocGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsTW91bnRXYXJuaW5ncy5mb3JFYWNoKGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgICAgIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5hZGQoXG4gICAgICAgICAgICBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCBcIkNvbXBvbmVudFwiXG4gICAgICAgICAgKTtcbiAgICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgICAgfSksXG4gICAgICAgIChwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW10pKTtcbiAgICAgIHZhciBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG4gICAgICAwIDwgcGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5sZW5ndGggJiZcbiAgICAgICAgKHBlbmRpbmdDb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMuYWRkKFxuICAgICAgICAgICAgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgXCJDb21wb25lbnRcIlxuICAgICAgICAgICk7XG4gICAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICAgIH0pLFxuICAgICAgICAocGVuZGluZ0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdKSk7XG4gICAgICB2Y
15852XIgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcbiAgICAgIDAgPCBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncy5sZW5ndGggJiZcbiAgICAgICAgKHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzLmZvckVhY2goXG4gICAgICAgICAgZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgICAgICBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzLmFkZChcbiAgICAgICAgICAgICAgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgXCJDb21wb25lbnRcIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGRpZFdhcm5BYm91dFVuc2FmZUxpZmVjeWNsZXMuYWRkKGZpYmVyLnR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgKSxcbiAgICAgICAgKHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW10pKTtcbiAgICAgIHZhciBjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMgPSBuZXcgU2V0KCk7XG4gICAgICAwIDwgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5sZW5ndGggJiZcbiAgICAgICAgKHBlbmRpbmdDb21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MuZm9yRWFjaChmdW5jdGlvbiAoZmliZXIpIHtcbiAgICAgICAgICBjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMuYWRkKFxuICAgICAgICAgICAgZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgXCJDb21wb25lbnRcIlxuICAgICAgICAgICk7XG4gICAgICAgICAgZGlkV2FybkFib3V0VW5zYWZlTGlmZWN5Y2xlcy5hZGQoZmliZXIudHlwZSk7XG4gICAgICAgIH0pLFxuICAgICAgICAocGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdKSk7XG4gICAgICB2Y
15852XIgVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcbiAgICAgIDAgPCBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncy5sZW5ndGggJiZcbiAgICAgICAgKHBlbmRpbmdVTlNBRkVfQ29tcG9uZW50V2lsbFVwZGF0ZVdhcm5pbmdzLmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgICAgVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGVVbmlxdWVOYW1lcy5hZGQoXG4gICAgICAgICAgICBnZXRDb21wb25lbnROYW1lRnJvbUZpYmVyKGZpYmVyKSB8fCBcIkNvbXBvbmVudFwiXG4gICAgICAgICAgKTtcbiAgICAgICAgICBkaWRXYXJuQWJvdXRVbnNhZmVMaWZlY3ljbGVzLmFkZChmaWJlci50eXBlKTtcbiAgICAgICAgfSksXG4gICAgICAgIChwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdKSk7XG4gICAgICBpZiAoMCA8IFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5zaXplKSB7XG4gICAgICAgIHZhciBzb3J0ZWROYW1lcyA9IHNldFRvU29ydGVkU3RyaW5nKFxuICAgICAgICAgIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lc1xuICAgICAgICApO1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiVXNpbmcgVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCBpbiBzdHJpY3QgbW9kZSBpcyBub3QgcmVjb21tZW5kZWQgYW5kIG1heSBpbmRpY2F0ZSBidWdzIGluIHlvdXIgY29kZS4gU2VlIGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbiogTW92ZSBjb2RlIHdpdGggc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZE1vdW50LCBhbmQgc2V0IGluaXRpYWwgc3RhdGUgaW4gdGhlIGNvbnN0cnVjdG9yLlxcblxcblBsZWFzZSB1cGRhdGUgdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOiAlc1wiLFxuICAgICAgICAgIHNvcnRlZE5hbWVzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAwIDwgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNVbmlxdWVOYW1lcy5zaXplICYmXG4gICAgICAgICgoc29ydGVkTmFtZXMgPSBzZXRUb1NvcnRlZFN0cmluZyhcbiAgICAgICAgICBVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU5hbWVzXG4gICAgICAgICkpLFxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiVXNpbmcgVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgaW4gc3RyaWN0IG1vZGUgaXMgbm90IHJlY29tbWVuZGVkIGFuZCBtYXkgaW5kaWNhdGUgYnVncyBpbiB5b3VyIGNvZGUuIFNlZSBodHRwczovL3JlYWN0LmRldi9saW5rL3Vuc2FmZS1jb21wb25lbnQtbGlmZWN5Y2xlcyBmb3IgZGV0YWlscy5cXG5cXG4qIE1vdmUgZGF0YSBmZXRjaGluZyBjb2RlIG9yIHNpZGUgZWZmZWN0cyB0byBjb21wb25lbnREaWRVcGRhdGUuXFxuKiBJZiB5b3UncmUgdXBkYXRpbmcgc3RhdGUgd2hlbmV2ZXIgcHJvcHMgY2hhbmdlLCByZWZhY3RvciB5b3VyIGNvZGUgdG8gdXNlIG1lbW9pemF0aW9uIHRlY2huaXF1ZXMgb3IgbW92ZSBpdCB0byBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLiBMZWFybiBtb3JlIGF0OiBodHRwczovL3JlYWN0LmRldi9saW5rL2Rlcml2ZWQtc3RhdGVcXG5cXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXNcIixcbiAgICAgICAgICBzb3J0ZWROYW1lc1xuICAgICAgICApKTtcbiAgICAgIDAgPCBVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzLnNpemUgJiZcbiAgICAgICAgKChzb3J0ZWROYW1lcyA9IHNldFRvU29ydGVkU3RyaW5nKFxuICAgICAgICAgIFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXNcbiAgICAgICAgKSksXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJVc2luZyBVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSBpbiBzdHJpY3QgbW9kZSBpcyBub3QgcmVjb21tZW5kZWQgYW5kIG1heSBpbmRpY2F0ZSBidWdzIGluIHlvdXIgY29kZS4gU2VlIGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbiogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cXG5cXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXNcIixcbiAgICAgICAgICBzb3J0ZWROYW1lc1xuICAgICAgICApKTtcbiAgICAgIDAgPCBjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcy5zaXplICYmXG4gICAgICAgICgoc29ydGVkTmFtZXMgPSBzZXRUb1NvcnRlZFN0cmluZyhjb21wb25lbnRXaWxsTW91bnRVbmlxdWVOYW1lcykpLFxuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgXCJjb21wb25lbnRXaWxsTW91bnQgaGFzIGJlZW4gcmVuYW1lZCwgYW5kIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgdXNlLiBTZWUgaHR0cHM6Ly9yZWFjdC5kZXYvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuKiBNb3ZlIGNvZGUgd2l0aCBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkTW91bnQsIGFuZCBzZXQgaW5pdGlhbCBzdGF0ZSBpbiB0aGUgY29uc3RydWN0b3IuXFxuKiBSZW5hbWUgY29tcG9uZW50V2lsbE1vdW50IHRvIFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQgdG8gc3VwcHJlc3MgdGhpcyB3YXJuaW5nIGluIG5vbi1zdHJpY3QgbW9kZS4gSW4gUmVhY3QgMTgueCwgb25seSB0aGUgVU5TQUZFXyBuYW1lIHdpbGwgd29yay4gVG8gcmVuYW1lIGFsbCBkZXByZWNhdGVkIGxpZmVjeWNsZXMgdG8gdGhlaXIgbmV3IG5hbWVzLCB5b3UgY2FuIHJ1biBgbnB4IHJlYWN0LWNvZGVtb2QgcmVuYW1lLXVuc2FmZS1saWZlY3ljbGVzYCBpbiB5b3VyIHByb2plY3Qgc291cmNlIGZvbGRlci5cXG5cXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXNcIixcbiAgICAgICAgICBzb3J0ZWROYW1lc1xuICAgICAgICApKTtcbiAgICAgIDAgPCBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzVW5pcXVlTmFtZXMuc2l6ZSAmJlxuICAgICAgICAoKHNvcnRlZE5hbWVzID0gc2V0VG9Tb3J0ZWRTdHJpbmcoXG4gICAgICAgICAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1VuaXF1ZU
158525hbWVzXG4gICAgICAgICkpLFxuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgXCJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIGhhcyBiZWVuIHJlbmFtZWQsIGFuZCBpcyBub3QgcmVjb21tZW5kZWQgZm9yIHVzZS4gU2VlIGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvdW5zYWZlLWNvbXBvbmVudC1saWZlY3ljbGVzIGZvciBkZXRhaWxzLlxcblxcbiogTW92ZSBkYXRhIGZldGNoaW5nIGNvZGUgb3Igc2lkZSBlZmZlY3RzIHRvIGNvbXBvbmVudERpZFVwZGF0ZS5cXG4qIElmIHlvdSdyZSB1cGRhdGluZyBzdGF0ZSB3aGVuZXZlciBwcm9wcyBjaGFuZ2UsIHJlZmFjdG9yIHlvdXIgY29kZSB0byB1c2UgbWVtb2l6YXRpb24gdGVjaG5pcXVlcyBvciBtb3ZlIGl0IHRvIHN0YXRpYyBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMuIExlYXJuIG1vcmUgYXQ6IGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvZGVyaXZlZC1zdGF0ZVxcbiogUmVuYW1lIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgdG8gVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgdG8gc3VwcHJlc3MgdGhpcyB3YXJuaW5nIGluIG5vbi1zdHJpY3QgbW9kZS4gSW4gUmVhY3QgMTgueCwgb25seSB0aGUgVU5TQUZFXyBuYW1lIHdpbGwgd29yay4gVG8gcmVuYW1lIGFsbCBkZXByZWNhdGVkIGxpZmVjeWNsZXMgdG8gdGhlaXIgbmV3IG5hbWVzLCB5b3UgY2FuIHJ1biBgbnB4IHJlYWN0LWNvZGVtb2QgcmVuYW1lLXVuc2FmZS1saWZlY3ljbGVzYCBpbiB5b3VyIHByb2plY3Qgc291cmNlIGZvbGRlci5cXG5cXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXNcIixcbiAgICAgICAgICBzb3J0ZWROYW1lc1xuICAgICAgICApKTtcbiAgICAgIDAgPCBjb21wb25lbnRXaWxsVXBkYXRlVW5pcXVlTmFtZXMuc2l6ZSAmJlxuICAgICAgICAoKHNvcnRlZE5hbWVzID0gc2V0VG9Tb3J0ZWRTdHJpbmcoY29tcG9uZW50V2lsbFVwZGF0ZVVuaXF1ZU5hbWVzKSksXG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBcImNvbXBvbmVudFdpbGxVcGRhdGUgaGFzIGJlZW4gcmVuYW1lZCwgYW5kIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgdXNlLiBTZWUgaHR0cHM6Ly9yZWFjdC5kZXYvbGluay91bnNhZmUtY29tcG9uZW50LWxpZmVjeWNsZXMgZm9yIGRldGFpbHMuXFxuXFxuKiBNb3ZlIGRhdGEgZmV0Y2hpbmcgY29kZSBvciBzaWRlIGVmZmVjdHMgdG8gY29tcG9uZW50RGlkVXBkYXRlLlxcbiogUmVuYW1lIGNvbXBvbmVudFdpbGxVcGRhdGUgdG8gVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUgdG8gc3VwcHJlc3MgdGhpcyB3YXJuaW5nIGluIG5vbi1zdHJpY3QgbW9kZS4gSW4gUmVhY3QgMTgueCwgb25seSB0aGUgVU5TQUZFXyBuYW1lIHdpbGwgd29yay4gVG8gcmVuYW1lIGFsbCBkZXByZWNhdGVkIGxpZmVjeWNsZXMgdG8gdGhlaXIgbmV3IG5hbWVzLCB5b3UgY2FuIHJ1biBgbnB4IHJlYWN0LWNvZGVtb2QgcmVuYW1lLXVuc2FmZS1saWZlY3ljbGVzYCBpbiB5b3VyIHByb2plY3Qgc291cmNlIGZvbGRlci5cXG5cXG5QbGVhc2UgdXBkYXRlIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50czogJXNcIixcbiAgICAgICAgICBzb3J0ZWROYW1lc1xuICAgICAgICApKTtcbiAgICB9O1xuICAgIHZhciBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcgPSBuZXcgTWFwKCksXG4gICAgICBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0ID0gbmV3IFNldCgpO1xuICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLnJlY29yZExlZ2FjeUNvbnRleHRXYXJuaW5nID0gZnVuY3Rpb24gKFxuICAgICAgZmliZXIsXG4gICAgICBpbnN0YW5jZVxuICAgICkge1xuICAgICAgdmFyIHN0cmljdFJvb3QgPSBudWxsO1xuICAgICAgZm9yICh2YXIgbm9kZSA9IGZpYmVyOyBudWxsICE9PSBub2RlOyApXG4gICAgICAgIG5vZGUubW9kZSAmIFN0cmljdExlZ2FjeU1vZGUgJiYgKHN0cmljdFJvb3QgPSBub2RlKSxcbiAgICAgICAgICAobm9kZSA9IG5vZGUucmV0dXJuKTtcbiAgICAgIG51bGwgPT09IHN0cmljdFJvb3RcbiAgICAgICAgPyBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJFeHBlY3RlZCB0byBmaW5kIGEgU3RyaWN0TW9kZSBjb21wb25lbnQgaW4gYSBzdHJpY3QgbW9kZSB0cmVlLiBUaGlzIGVycm9yIGlzIGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiXG4gICAgICAgICAgKVxuICAgICAgICA6ICFkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0LmhhcyhmaWJlci50eXBlKSAmJlxuICAgICAgICAgICgobm9kZSA9IHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZy5nZXQoc3RyaWN0Um9vdCkpLFxuICAgICAgICAgIG51bGwgIT0gZmliZXIudHlwZS5jb250ZXh0VHlwZXMgfHxcbiAgICAgICAgICAgIG51bGwgIT0gZmliZXIudHlwZS5jaGlsZENvbnRleHRUeXBlcyB8fFxuICAgICAgICAgICAgKG51bGwgIT09IGluc3RhbmNlICYmXG4gICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGluc3RhbmNlLmdldENoaWxkQ29udGV4dCkpICYmXG4gICAgICAgICAgKHZvaWQgMCA9PT0gbm9kZSAmJlxuICAgICAgICAgICAgKChub2RlID0gW10pLCBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcuc2V0KHN0cmljdFJvb3QsIG5vZGUpKSxcbiAgICAgICAgICBub2RlLnB1c2goZmliZXIpKTtcbiAgICB9O1xuICAgIFJlYWN0U3RyaWN0TW9kZVdhcm5pbmdzLmZsdXNoTGVnYWN5Q29udGV4dFdhcm5pbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBwZW5kaW5nTGVnYWN5Q29udGV4dFdhcm5pbmcuZm9yRWFjaChmdW5jdGlvbiAoZmliZXJBcnJheSkge1xuICAgICAgICBpZiAoMCAhPT0gZmliZXJBcnJheS5sZW5ndGgpIHtcbiAgICAgICAgICB2Y
15852XIgZmlyc3RGaWJlciA9IGZpYmVyQXJyYXlbMF0sXG4gICAgICAgICAgICB1bmlxdWVOYW1lcyA9IG5ldyBTZXQoKTtcbiAgICAgICAgICBmaWJlckFycmF5LmZvckVhY2goZnVuY3Rpb24gKGZpYmVyKSB7XG4gICAgICAgICAgICB1bmlxdWVOYW1lcy5hZGQoZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihmaWJlcikgfHwgXCJDb21wb25lbnRcIik7XG4gICAgICAgICAgICBkaWRXYXJuQWJvdXRMZWdhY3lDb250ZXh0LmFkZChmaWJlci50eXBlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2YXIgc29ydGVkTmFtZXMgPSBzZXRUb1NvcnRlZFN0cmluZyh1bmlxdWVOYW1lcyk7XG4gICAgICAgICAgcnVuV2l0aEZpYmVySW5ERVYoZmlyc3RGaWJlciwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCJMZWdhY3kgY29udGV4dCBBUEkgaGFzIGJlZW4gZGV0ZWN0ZWQgd2l0aGluIGEgc3RyaWN0LW1vZGUgdHJlZS5cXG5cXG5UaGUgb2xkIEFQSSB3aWxsIGJlIHN1cHBvcnRlZCBpbiBhbGwgMTYueCByZWxlYXNlcywgYnV0IGFwcGxpY2F0aW9ucyB1c2luZyBpdCBzaG91bGQgbWlncmF0ZSB0byB0aGUgbmV3IHZlcnNpb24uXFxuXFxuUGxlYXNlIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHM6ICVzXFxuXFxuTGVhcm4gbW9yZSBhYm91dCB0aGlzIHdhcm5pbmcgaGVyZTogaHR0cHM6Ly9yZWFjdC5kZXYvbGluay9sZWdhY3ktY29udGV4dFwiLFxuICAgICAgICAgICAgICBzb3J0ZWROYW1lc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgICBSZWFjdFN0cmljdE1vZGVXYXJuaW5ncy5kaXNjYXJkUGVuZGluZ1dhcm5pbmdzID0gZnVuY3Rpb24gKCkge1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxNb3VudFdhcm5pbmdzID0gW107XG4gICAgICBwZW5kaW5nQ29tcG9uZW50V2lsbFJlY2VpdmVQcm9wc1dhcm5pbmdzID0gW107XG4gICAgICBwZW5kaW5nVU5TQUZFX0NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHNXYXJuaW5ncyA9IFtdO1xuICAgICAgcGVuZGluZ0NvbXBvbmVudFdpbGxVcGRhdGVXYXJuaW5ncyA9IFtdO1xuICAgICAgcGVuZGluZ1VOU0FGRV9Db21wb25lbnRXaWxsVXBkYXRlV2FybmluZ3MgPSBbXTtcbiAgICAgIHBlbmRpbmdMZWdhY3lDb250ZXh0V2FybmluZyA9IG5ldyBNYXAoKTtcbiAgICB9O1xuICAgIHZhciBSRUFDVF9SRUNPVkVSQUJMRV9ESUdFU1QgPSBcIlwiLFxuICAgICAgY2FsbENvbXBvbmVudCA9IHtcbiAgICAgICAgcmVhY3Rfc3RhY2tfYm90dG9tX2ZyYW1lOiBmdW5jdGlvbiAoQ29tcG9uZW50LCBwcm9wcywgc2Vjb25kQXJnKSB7XG4gICAgICAgICAgdmFyIHdhc1JlbmRlcmluZyA9IGlzUmVuZGVyaW5nO1xuICAgICAgICAgIGlzUmVuZGVyaW5nID0gITA7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBDb21wb25lbnQocHJvcHMsIHNlY29uZEFyZyk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlzUmVuZGVyaW5nID0gd2FzUmVuZGVyaW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGNhbGxDb21wb25lbnRJbkRFViA9XG4gICAgICAgIGNhbGxDb21wb25lbnQucmVhY3Rfc3RhY2tfYm90dG9tX2ZyYW1lLmJpbmQoY2FsbENvbXBvbmVudCksXG4gICAgICBjYWxsUmVuZGVyID0ge1xuICAgICAgICByZWFjdF9zdGFja19ib3R0b21fZnJhbWU6IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgICAgICAgIHZhciB3YXNSZW5kZXJpbmcgPSBpc1JlbmRlcmluZztcbiAgICAgICAgICBpc1JlbmRlcmluZyA9ICEwO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2UucmVuZGVyKCk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlzUmVuZGVyaW5nID0gd2FzUmVuZGVyaW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGNhbGxSZW5kZXJJbkRFViA9IGNhbGxSZW5kZXIucmVhY3Rfc3RhY2tfYm90dG9tX2ZyYW1lLmJpbmQoY2FsbFJlbmRlciksXG4gICAgICBjYWxsQ29tcG9uZW50RGlkTW91bnQgPSB7XG4gICAgICAgIHJlYWN0X3N0YWNrX2JvdHRvbV9mcmFtZTogZnVuY3Rpb24gKGZpbmlzaGVkV29yaywgaW5zdGFuY2UpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoZmluaXNoZWRXb3JrLCBmaW5pc2hlZFdvcmsucmV0dXJuLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgY2FsbENvbXBvbmVudERpZE1vdW50SW5ERVYgPVxuICAgICAgICBjYWxsQ29tcG9uZW50RGlkTW91bnQucmVhY3Rfc3RhY2tfYm90dG9tX2ZyYW1lLmJpbmQoXG4gICAgICAgICAgY2FsbENvbXBvbmVudERpZE1vdW50XG4gICAgICAgICksXG4gICAgICBjYWxsQ29tcG9uZW50RGlkVXBkYXRlID0ge1xuICAgICAgICByZWFjdF9zdGFja19ib3R0b21fZnJhbWU6IGZ1bmN0aW9uIChcbiAgICAgICAgICBmaW5pc2hlZFdvcmssXG4gICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgcHJldlByb3BzLFxuICAgICAgICAgIHByZXZTdGF0ZSxcbiAgICAgICAgICBzbmFwc2hvdFxuICAgICAgICApIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaW5zdGFuY2UuY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlLCBzbmFwc2hvdCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhcHR1cmVDb21taXRQaGFzZUVycm9yKGZpbmlzaGVkV29yaywgZmluaXNoZWRXb3JrLnJldHVybiwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGNhbGxDb21wb25lbnREaWRVcGRhdGVJbkRFViA9XG4gICAgICAgIGNhbGxDb21wb25lbnREaWRVcGRhdGUucmVhY3Rfc3RhY2tfYm90dG9tX2ZyYW1lLmJpbmQoXG4gICAgICAgICAgY2FsbENvbXBvbmVudERpZFVwZGF0ZVxuICAgICAgICApLFxuICAgICAgY2FsbENvbXBvbmVudERpZENhdGNoID0ge1xuICAgICAgICByZWFjdF9zdGFja19ib3R0b21fZnJhbWU6IGZ1bmN0aW9uIChpbnN0YW5jZSwgZXJyb3JJbmZvKSB7XG4gICAgICAgICAgdmFyIHN0YWNrID0gZXJyb3JJbmZvLnN0YWNrO1xuICAgICAgICAgIGluc3RhbmNlLmNvbXBvbmVudERpZENhdGNoKGVycm9ySW5mby52YWx1ZSwge1xuICAgICAgICAgICAgY29tcG9uZW50U3RhY2s6IG51bGwgIT09IHN0YWNrID8gc3RhY2sgOiBcIlwiXG4gICAgICAgICAgfSk7XG4gICAgICAgI
15852H1cbiAgICAgIH0sXG4gICAgICBjYWxsQ29tcG9uZW50RGlkQ2F0Y2hJbkRFViA9XG4gICAgICAgIGNhbGxDb21wb25lbnREaWRDYXRjaC5yZWFjdF9zdGFja19ib3R0b21fZnJhbWUuYmluZChcbiAgICAgICAgICBjYWxsQ29tcG9uZW50RGlkQ2F0Y2hcbiAgICAgICAgKSxcbiAgICAgIGNhbGxDb21wb25lbnRXaWxsVW5tb3VudCA9IHtcbiAgICAgICAgcmVhY3Rfc3RhY2tfYm90dG9tX2ZyYW1lOiBmdW5jdGlvbiAoXG4gICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLFxuICAgICAgICAgIGluc3RhbmNlXG4gICAgICAgICkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpbnN0YW5jZS5jb21wb25lbnRXaWxsVW5tb3VudCgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjYXB0dXJlQ29tbWl0UGhhc2VFcnJvcihjdXJyZW50LCBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgY2FsbENvbXBvbmVudFdpbGxVbm1vdW50SW5ERVYgPVxuICAgICAgICBjYWxsQ29tcG9uZW50V2lsbFVubW91bnQucmVhY3Rfc3RhY2tfYm90dG9tX2ZyYW1lLmJpbmQoXG4gICAgICAgICAgY2FsbENvbXBvbmVudFdpbGxVbm1vdW50XG4gICAgICAgICksXG4gICAgICBjYWxsQ3JlYXRlID0ge1xuICAgICAgICByZWFjdF9zdGFja19ib3R0b21fZnJhbWU6IGZ1bmN0aW9uIChlZmZlY3QpIHtcbiAgICAgICAgICB2YXIgY3JlYXRlID0gZWZmZWN0LmNyZWF0ZTtcbiAgICAgICAgICBlZmZlY3QgPSBlZmZlY3QuaW5zdDtcbiAgICAgICAgICBjcmVhdGUgPSBjcmVhdGUoKTtcbiAgICAgICAgICByZXR1cm4gKGVmZmVjdC5kZXN0cm95ID0gY3JlYXRlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGNhbGxDcmVhdGVJbkRFViA9IGNhbGxDcmVhdGUucmVhY3Rfc3RhY2tfYm90dG9tX2ZyYW1lLmJpbmQoY2FsbENyZWF0ZSksXG4gICAgICBjYWxsRGVzdHJveSA9IHtcbiAgICAgICAgcmVhY3Rfc3RhY2tfYm90dG9tX2ZyYW1lOiBmdW5jdGlvbiAoXG4gICAgICAgICAgY3VycmVudCxcbiAgICAgICAgICBuZWFyZXN0TW91bnRlZEFuY2VzdG9yLFxuICAgICAgICAgIGRlc3Ryb3lcbiAgICAgICAgKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRlc3Ryb3koKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY2FwdHVyZUNvbW1pdFBoYXNlRXJyb3IoY3VycmVudCwgbmVhcmVzdE1vdW50ZWRBbmNlc3RvciwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGNhbGxEZXN0cm95SW5ERVYgPSBjYWxsRGVzdHJveS5yZWFjdF9zdGFja19ib3R0b21fZnJhbWUuYmluZChjYWxsRGVzdHJveSksXG4gICAgICBjYWxsTGF6eUluaXQgPSB7XG4gICAgICAgIHJlYWN0X3N0YWNrX2JvdHRvbV9mcmFtZTogZnVuY3Rpb24gKGxhenkpIHtcbiAgICAgICAgICB2Y
15852XIgaW5pdCA9IGxhenkuX2luaXQ7XG4gICAgICAgICAgcmV0dXJuIGluaXQobGF6eS5fcGF5bG9hZCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBjYWxsTGF6eUluaXRJbkRFViA9XG4gICAgICAgIGNhbGxMYXp5SW5pdC5yZWFjdF9zdGFja19ib3R0b21fZnJhbWUuYmluZChjYWxsTGF6eUluaXQpLFxuICAgICAgU3VzcGVuc2VFeGNlcHRpb24gPSBFcnJvcihcbiAgICAgICAgXCJTdXNwZW5zZSBFeGNlcHRpb246IFRoaXMgaXMgbm90IGEgcmVhbCBlcnJvciEgSXQncyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgb2YgYHVzZWAgdG8gaW50ZXJydXB0IHRoZSBjdXJyZW50IHJlbmRlci4gWW91IG11c3QgZWl0aGVyIHJldGhyb3cgaXQgaW1tZWRpYXRlbHksIG9yIG1vdmUgdGhlIGB1c2VgIGNhbGwgb3V0c2lkZSBvZiB0aGUgYHRyeS9jYXRjaGAgYmxvY2suIENhcHR1cmluZyB3aXRob3V0IHJldGhyb3dpbmcgd2lsbCBsZWFkIHRvIHVuZXhwZWN0ZWQgYmVoYXZpb3IuXFxuXFxuVG8gaGFuZGxlIGFzeW5jIGVycm9ycywgd3JhcCB5b3VyIGNvbXBvbmVudCBpbiBhbiBlcnJvciBib3VuZGFyeSwgb3IgY2FsbCB0aGUgcHJvbWlzZSdzIGAuY2F0Y2hgIG1ldGhvZCBhbmQgcGFzcyB0aGUgcmVzdWx0IHRvIGB1c2VgLlwiXG4gICAgICApLFxuICAgICAgU3VzcGVuc2V5Q29tbWl0RXhjZXB0aW9uID0gRXJyb3IoXG4gICAgICAgIFwiU3VzcGVuc2UgRXhjZXB0aW9uOiBUaGlzIGlzIG5vdCBhIHJlYWwgZXJyb3IsIGFuZCBzaG91bGQgbm90IGxlYWsgaW50byB1c2Vyc3BhY2UuIElmIHlvdSdyZSBzZWVpbmcgdGhpcywgaXQncyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuXCJcbiAgICAgICksXG4gICAgICBTdXNwZW5zZUFjdGlvbkV4Y2VwdGlvbiA9IEVycm9yKFxuICAgICAgICBcIlN1c3BlbnNlIEV4Y2VwdGlvbj
15852ogVGhpcyBpcyBub3QgYSByZWFsIGVycm9yISBJdCdzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCBvZiBgdXNlQWN0aW9uU3RhdGVgIHRvIGludGVycnVwdCB0aGUgY3VycmVudCByZW5kZXIuIFlvdSBtdXN0IGVpdGhlciByZXRocm93IGl0IGltbWVkaWF0ZWx5LCBvciBtb3ZlIHRoZSBgdXNlQWN0aW9uU3RhdGVgIGNhbGwgb3V0c2lkZSBvZiB0aGUgYHRyeS9jYXRjaGAgYmxvY2suIENhcHR1cmluZyB3aXRob3V0IHJldGhyb3dpbmcgd2lsbCBsZWFkIHRvIHVuZXhwZWN0ZWQgYmVoYXZpb3IuXFxuXFxuVG8gaGFuZGxlIGFzeW5jIGVycm9ycywgd3JhcCB5b3VyIGNvbXBvbmVudCBpbiBhbiBlcnJvciBib3VuZGFyeS5cIlxuICAgICAgKSxcbiAgICAgIG5vb3BTdXNwZW5zZXlDb21taXRUaGVuYWJsZSA9IHtcbiAgICAgICAgdGhlbjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAnSW50ZXJuYWwgUmVhY3QgZXJyb3I6IEEgbGlzdGVuZXIgd2FzIHVuZXhwZWN0ZWRseSBhdHRhY2hlZCB0byBhIFwibm9vcFwiIHRoZW5hYmxlLiBUaGlzIGlzIGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGxhc3RTdXNwZW5kZWRGaWJlciA9IG51bGwsXG4gICAgICBsYXN0U3VzcGVuZGVkU3RhY2sgPSBudWxsLFxuICAgICAgZGlkSXNzdWVVc2VXYXJuaW5nID0gITEsXG4gICAgICBzdXNwZW5kZWRUaGVuYWJsZSA9IG51bGwsXG4gICAgICBuZWVkc1RvUmVzZXRTdXNwZW5kZWRUaGVuYWJsZURFViA9ICExLFxuICAgICAgdGhlbmFibGVTdGF0ZSQxID0gbnVsbCxcbiAgICAgIHRoZW5hYmxlSW5kZXhDb3VudGVyJDEgPSAwLFxuICAgICAgY3VycmVudERlYnVnSW5mbyA9IG51bGwsXG4gICAgICBkaWRXYXJuQWJvdXRNYXBzO1xuICAgIHZhciBkaWRXYXJuQWJvdXRHZW5lcmF0b3JzID0gKGRpZFdhcm5BYm91dE1hcHMgPSAhMSk7XG4gICAgdmFyIG93bmVySGFzS2V5VXNlV2FybmluZyA9IHt9O1xuICAgIHZhciBvd25lckhhc0Z1bmN0aW9uVHlwZVdhcm5pbmcgPSB7fTtcbiAgICB2YXIgb3duZXJIYXNTeW1ib2xUeXBlV2FybmluZyA9IHt9O1xuICAgIHdhcm5Gb3JNaXNzaW5nS2V5ID0gZnVuY3Rpb24gKHJldHVybkZpYmVyLCB3b3JrSW5Qcm9ncmVzcywgY2hpbGQpIHtcbiAgICAgIGlmIChcbiAgICAgICAgbnVsbCAhPT0gY2hpbGQgJiZcbiAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIGNoaWxkICYmXG4gICAgICAgIGNoaWxkLl9zdG9yZSAmJlxuICAgICAgICAoKCFjaGlsZC5fc3RvcmUudmFsaWRhdGVkICYmIG51bGwgPT0gY2hpbGQua2V5KSB8fFxuICAgICAgICAgIDIgPT09IGNoaWxkLl9zdG9yZS52YWxpZGF0ZWQpXG4gICAgICApIHtcbiAgICAgICAgaWYgKFwib2JqZWN0XCIgIT09IHR5cGVvZiBjaGlsZC5fc3RvcmUpXG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICBcIlJlYWN0IENvbXBvbmVudCBpbiB3YXJuRm9yTWlzc2luZ0tleSBzaG91bGQgaGF2ZSBhIF9zdG9yZS4gVGhpcyBlcnJvciBpcyBsaWtlbHkgY2F1c2VkIGJ5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIlxuICAgICAgICAgICk7XG4gICAgICAgIGNoaWxkLl9zdG9yZS52YWxpZGF0ZWQgPSAxO1xuICAgICAgICB2Y
15852XIgY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIocmV0dXJuRmliZXIpLFxuICAgICAgICAgIGNvbXBvbmVudEtleSA9IGNvbXBvbmVudE5hbWUgfHwgXCJudWxsXCI7XG4gICAgICAgIGlmICghb3duZXJIYXNLZXlVc2VXYXJuaW5nW2NvbXBvbmVudEtleV0pIHtcbiAgICAgICAgICBvd25lckhhc0tleVVzZVdhcm5pbmdbY29tcG9uZW50S2V5XSA9ICEwO1xuICAgICAgICAgIGNoaWxkID0gY2hpbGQuX293bmVyO1xuICAgICAgICAgIHJldHVybkZpYmVyID0gcmV0dXJuRmliZXIuX2RlYnVnT3duZXI7XG4gICAgICAgICAgdmFyIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8gPSBcIlwiO1xuICAgICAgICAgIHJldHVybkZpYmVyICYmXG4gICAgICAgICAgICBcIm51bWJlclwiID09PSB0eXBlb2YgcmV0dXJuRmliZXIudGFnICYmXG4gICAgICAgICAgICAoY29tcG9uZW50S2V5ID0gZ2V0Q29tcG9uZW50TmFtZUZyb21GaWJlcihyZXR1cm5GaWJlcikpICYmXG4gICAgICAgICAgICAoY3VycmVudENvbXBvbmVudEVycm9ySW5mbyA9XG4gICAgICAgICAgICAgIFwiXFxuXFxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYFwiICsgY29tcG9uZW50S2V5ICsgXCJgLlwiKTtcbiAgICAgICAgICBjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvIHx8XG4gICAgICAgICAgICAoY29tcG9uZW50TmFtZSAmJlxuICAgICAgICAgICAgICAoY3VycmVudENvbXBvbmVudEVycm9ySW5mbyA9XG4gICAgICAgICAgICAgICAgXCJcXG5cXG5DaGVjayB0aGUgdG9wLWxldmVsIHJlbmRlciBjYWxsIHVzaW5nIDxcIiArXG4gICAgICAgICAgICAgICAgY29tcG9uZW50TmFtZSArXG4gICAgICAgICAgICAgICAgXCI+LlwiKSk7XG4gICAgICAgICAgdmFyIGNoaWxkT3duZXJBcHBlbmRpeCA9IFwiXCI7XG4gICAgICAgICAgbnVsbCAhPSBjaGlsZCAmJlxuICAgICAgICAgICAgcmV0dXJuRmliZXIgIT09IGNoaWxkICYmXG4gICAgICAgICAgICAoKGNvbXBvbmVudE5hbWUgPSBudWxsKSxcbiAgICAgICAgICAgIFwibnVtYmVyXCIgPT09IHR5cGVvZiBjaGlsZC50YWdcbiAgICAgICAgICAgICAgPyAoY29tcG9uZW50TmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tRmliZXIoY2hpbGQpKVxuICAgICAgICAgICAgICA6IFwic3RyaW5nXCIgPT09IHR5cGVvZiBjaGlsZC5uYW1lICYmIChjb21wb25lbnROYW1lID0gY2hpbGQubmFtZSksXG4gICAgICAgICAgICBjb21wb25lbnROYW1lICYmXG4gICAgICAgICAgICAgIChjaGlsZE93bmVyQXBwZW5kaXggPVxuICAgICAgICAgICAgICAgIFwiIEl0IHdhcyBwYXNzZWQgYSBjaGlsZCBmcm9tIFwiICsgY29tcG9uZW50TmFtZSArIFwiLlwiKSk7XG4gICAgICAgICAgcnVuV2l0aEZpYmVySW5ERVYod29ya0luUHJvZ3Jlc3MsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICdFYWNoIGNoaWxkIGluIGEgbGlzdCBzaG91bGQgaGF2ZSBhIHVuaXF1ZSBcImtleVwiIHByb3AuJXMlcyBTZWUgaHR0cHM6Ly9yZWFjdC5kZXYvbGluay93YXJuaW5nLWtleXMgZm9yIG1vcmUgaW5mb3JtYXRpb24uJyxcbiAgICAgICAgICAgICAgY3VycmVudENvbXBvbmVudEVycm9ySW5mbyxcbiAgICAgICAgICAgICAgY2hpbGRPd25lckFwcGVuZGl4XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgcmVjb25jaWxlQ2hpbGRGaWJlcnMgPSBjcmVhdGVDaGlsZFJlY29uY2lsZXIoITApLFxuICAgICAgbW91bnRDaGlsZEZpYmVycyA9IGNyZWF0ZUNoaWxkUmVjb25jaWxlcighMSksXG4gICAgICBVcGRhdGVTdGF0ZSA9IDAsXG4gICAgICBSZXBsYWNlU3RhdGUgPSAxLFxuICAgICAgRm9yY2VVcGRhdGUgPSAyLFxuICAgICAgQ2FwdHVyZVVwZGF0ZSA9IDMsXG4gICAgICBoYXNGb3JjZVVwZGF0ZSA9ICExO1xuICAgIHZhciBkaWRXYXJuVXBkYXRlSW5zaWRlVXBkYXRlID0gITE7XG4gICAgdmFyIGN1cnJlbnRseVByb2Nlc3NpbmdRdWV1ZSA9IG51bGw7XG4gICAgdmFyIGRpZFJlYWRGcm9tRW50YW5nbGVkQXN5bmNBY3Rpb24gPSAhMSxcbiAgICAgIGN1cnJlbnRUcmVlSGlkZGVuU3RhY2tDdXJzb3IgPSBjcmVhdGVDdXJzb3IobnVsbCksXG4gICAgICBwcmV2RW50YW5nbGVkUmVuZGVyTGFuZXNDdXJzb3IgPSBjcmVhdGVDdXJzb3IoMCksXG4gICAgICBzdXNwZW5zZUhhbmRsZXJTdGFja0N1cnNvciA9IGNyZWF0ZUN1cnNvcihudWxsKSxcbiAgICAgIHNoZWxsQm91bmRhcnkgPSBudWxsLFxuICAgICAgU3VidHJlZVN1c3BlbnNlQ29udGV4dE1hc2sgPSAxLFxuICAgICAgRm9yY2VTdXNwZW5zZUZhbGxiYWNrID0gMixcbiAgICAgIHN1c3BlbnNlU3RhY2tDdXJzb3IgPSBjcmVhdGVDdXJzb3IoMCksXG4gICAgICBOb0ZsYWdzID0gMCxcbiAgICAgIEhhc0VmZmVjdCA9IDEsXG4gICAgICBJbnNlcnRpb24gPSAyLFxuICAgICAgTGF5b3V0ID0gNCxcbiAgICAgIFBhc3NpdmUgPSA4LFxuICAgICAgZGlkV2FyblVuY2FjaGVkR2V0U25hcHNob3Q7XG4gICAgdmFyIGRpZFdhcm5BYm91dE1pc21hdGNoZWRIb29rc0ZvckNvbXBvbmVudCA9IG5ldyBTZXQoKTtcbiAgICB2YXIgZGlkV2FybkFib3V0VXNlV3JhcHBlZEluVHJ5Q2F0Y2ggPSBuZXcgU2V0KCk7XG4gICAgdmFyIGRpZFdhcm5BYm91dEFzeW5jQ2xpZW50Q29tcG9uZW50ID0gbmV3IFNldCgpO1xuICAgIHZhciBkaWRXYXJuQWJvdXRVc2VGb3JtU3RhdGUgPSBuZXcgU2V0KCk7XG4gICAgdmFyIHJlbmRlckxhbmVzID0gMCxcbiAgICAgIGN1cnJlbnRseVJlbmRlcmluZ0ZpYmVyID0gbnVsbCxcbiAgICAgIGN1cnJlbnRIb29rID0gbnVsbCxcbiAgICAgIHdvcmtJblByb2dyZXNzSG9vayA9IG51bGwsXG4gICAgICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlID0gITEsXG4gICAgICBkaWRTY2hlZHVsZVJlbmRlclBoYXNlVXBkYXRlRHVyaW5nVGhpc1Bhc3MgPSAhMSxcbiAgICAgIHNob3VsZERvdWJsZUludm9rZVVzZXJGbnNJbkhvb2tzREVWID0gITEsXG4gICAgICBsb2NhbElkQ291bnRlciA9IDAsXG4gICAgICB0aGVuYWJsZUluZGV4Q291bnRlciA9IDAsXG4gICAgICB0aGVuYWJsZVN0YXRlID0gbnVsbCxcbiAgICAgIGdsb2JhbENsaWVudElkQ29
158521bnRlciA9IDAsXG4gICAgICBSRV9SRU5ERVJfTElNSVQgPSAyNSxcbiAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gbnVsbCxcbiAgICAgIGhvb2tUeXBlc0RldiA9IG51bGwsXG4gICAgICBob29rVHlwZXNVcGRhdGVJbmRleERldiA9IC0xLFxuICAgICAgaWdub3JlUHJldmlvdXNEZXBlbmRlbmNpZXMgPSAhMSxcbiAgICAgIENvbnRleHRPbmx5RGlzcGF0Y2hlciA9IHtcbiAgICAgICAgcmVhZENvbnRleHQ6IHJlYWRDb250ZXh0LFxuICAgICAgICB1c2U6IHVzZSxcbiAgICAgICAgdXNlQ2FsbGJhY2s6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgICAgICAgdXNlQ29udGV4dDogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICAgICAgICB1c2VFZmZlY3Q6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgICAgICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICAgICAgICB1c2VMYXlvdXRFZmZlY3Q6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgICAgICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gICAgICAgIHVzZU1lbW86IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgICAgICAgdXNlUmVkdWNlcjogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICAgICAgICB1c2VSZWY6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgICAgICAgdXNlU3RhdGU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgICAgICAgdXNlRGVidWdWYWx1ZTogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICAgICAgICB1c2VEZWZlcnJlZFZhbHVlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gICAgICAgIHVzZVRyYW5zaXRpb246IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgICAgICAgdXNlU3luY0V4dGVybmFsU3RvcmU6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgICAgICAgdXNlSWQ6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgICAgICAgdXNlSG9zdFRyYW5zaXRpb25TdGF0dXM6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgICAgICAgdXNlRm9ybVN0YXRlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gICAgICAgIHVzZUFjdGlvblN0YXRlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gICAgICAgIHVzZU9wdGltaXN0aWM6IHRocm93SW52YWxpZEhvb2tFcnJvcixcbiAgICAgICAgdXNlTWVtb0NhY2hlOiB0aHJvd0ludmFsaWRIb29rRXJyb3IsXG4gICAgICAgIHVzZUNhY2hlUmVmcmVzaDogdGhyb3dJbnZhbGlkSG9va0Vycm9yLFxuICAgICAgICB1c2VFZmZlY3RFdmVudDogdGhyb3dJbnZhbGlkSG9va0Vycm9yXG4gICAgICB9LFxuICAgICAgSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWID0gbnVsbCxcbiAgICAgIEhvb2tzRGlzcGF0Y2hlck9uTW91bnRXaXRoSG9va1R5cGVzSW5ERVYgPSBudWxsLFxuICAgICAgSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFViA9IG51bGwsXG4gICAgICBIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSBudWxsLFxuICAgICAgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFViA9IG51bGwsXG4gICAgICBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFViA9IG51bGwsXG4gICAgICBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWID0gbnVsbDtcbiAgICBIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSB7XG4gICAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgICAgfSxcbiAgICAgIHVzZTogdXNlLFxuICAgICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlQ2FsbGJhY2tcIjtcbiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICAgIHJldHVybiBtb3VudENhbGxiYWNrKGNhbGxiYWNrLCBkZXBzKTtcbiAgICAgIH0sXG4gICAgICB1c2VDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlQ29udGV4dFwiO1xuICAgICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgICB9LFxuICAgICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VFZmZlY3RcIjtcbiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICAgIHJldHVybiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgICAgfSxcbiAgICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlSW1wZXJhdGl2ZUhhbmRsZVwiO1xuICAgICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgICBjaGVja0RlcHNBcmVBcnJheURldihkZXBzKTtcbiAgICAgICAgcmV0dXJuIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9LFxuICAgICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VJbnNlcnRpb25FZmZlY3RcIjtcbiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICAgIG1vdW50RWZmZWN0SW1wbCg0LCBJbnNlcnRpb24sIGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9LFxuICAgICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VMYXlvdXRFZmZlY3RcIjtcbiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICAgI
15852HJldHVybiBtb3VudExheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgICAgfSxcbiAgICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZU1lbW9cIjtcbiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgY2hlY2tEZXBzQXJlQXJyYXlEZXYoZGVwcyk7XG4gICAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLkg7XG4gICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBtb3VudE1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlUmVkdWNlclwiO1xuICAgICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5IO1xuICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gbW91bnRSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVzZVJlZjogZnVuY3Rpb24gKGluaXRpYWxWYWx1ZSkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlUmVmXCI7XG4gICAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiBtb3VudFJlZihpbml0aWFsVmFsdWUpO1xuICAgICAgfSxcbiAgICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VTdGF0ZVwiO1xuICAgICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgICB2Y
15852XIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5IO1xuICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZURlYnVnVmFsdWVcIjtcbiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgIH0sXG4gICAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGluaXRpYWxWYWx1ZSkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlRGVmZXJyZWRWYWx1ZVwiO1xuICAgICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gbW91bnREZWZlcnJlZFZhbHVlKHZhbHVlLCBpbml0aWFsVmFsdWUpO1xuICAgICAgfSxcbiAgICAgIHVzZVRyYW5zaXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZVRyYW5zaXRpb25cIjtcbiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIG1vdW50VHJhbnNpdGlvbigpO1xuICAgICAgfSxcbiAgICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoXG4gICAgICAgIHN1YnNjcmliZSxcbiAgICAgICAgZ2V0U25hcHNob3QsXG4gICAgICAgIGdldFNlcnZlclNuYXBzaG90XG4gICAgICApIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZVN5bmNFeHRlcm5hbFN0b3JlXCI7XG4gICAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiBtb3VudFN5bmNFeHRlcm5hbFN0b3JlKFxuICAgICAgICAgIHN1YnNjcmliZSxcbiAgICAgICAgICBnZXRTbmFwc2hvdCxcbiAgICAgICAgICBnZXRTZXJ2ZXJTbmFwc2hvdFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VJZFwiO1xuICAgICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gbW91bnRJZCgpO1xuICAgICAgfSxcbiAgICAgIHVzZUZvcm1TdGF0ZTogZnVuY3Rpb24gKGFjdGlvbiwgaW5pdGlhbFN0YXRlKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VGb3JtU3RhdGVcIjtcbiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgd2Fybk9uVXNlRm9ybVN0YXRlSW5EZXYoKTtcbiAgICAgICAgcmV0dXJuIG1vdW50QWN0aW9uU3RhdGUoYWN0aW9uLCBpbml0aWFsU3RhdGUpO1xuICAgICAgfSxcbiAgICAgIHVzZUFjdGlvblN0YXRlOiBmdW5jdGlvbiAoYWN0aW9uLCBpbml0aWFsU3RhdGUpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZUFjdGlvblN0YXRlXCI7XG4gICAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiBtb3VudEFjdGlvblN0YXRlKGFjdGlvbiwgaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0sXG4gICAgICB1c2VPcHRpbWlzdGljOiBmdW5jdGlvbiAocGFzc3Rocm91Z2gpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZU9wdGltaXN0aWNcIjtcbiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIG1vdW50T3B0aW1pc3RpYyhwYXNzdGhyb3VnaCk7XG4gICAgICB9LFxuICAgICAgdXNlSG9zdFRyYW5zaXRpb25TdGF0dXM6IHVzZUhvc3RUcmFuc2l0aW9uU3RhdHVzLFxuICAgICAgdXNlTWVtb0NhY2hlOiB1c2VNZW1vQ2FjaGUsXG4gICAgICB1c2VDYWNoZVJlZnJlc2g6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZUNhY2hlUmVmcmVzaFwiO1xuICAgICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gbW91bnRSZWZyZXNoKCk7XG4gICAgICB9LFxuICAgICAgdXNlRWZmZWN0RXZlbnQ6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlRWZmZWN0RXZlbnRcIjtcbiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIG1vdW50RXZlbnQoY2FsbGJhY2spO1xuICAgICAgfVxuICAgIH07XG4gICAgSG9va3NEaXNwYXRjaGVyT25Nb3VudFdpdGhIb29rVHlwZXNJbkRFViA9IHtcbiAgICAgIHJlYWRDb250ZXh0OiBmdW5jdGlvbiAoY29udGV4dCkge1xuICAgICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgICB9LFxuICAgICAgdXNlOiB1c2UsXG4gICAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VDYWxsYmFja1wiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIG1vdW50Q2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgICAgfSxcbiAgICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VDb250ZXh0XCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgICB9LFxuICAgICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VFZmZlY3RcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgICAgfSxcbiAgICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlSW1wZXJhdGl2ZUhhbmRsZVwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9LFxuICAgICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VJbnNlcnRpb25
15852FZmZlY3RcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIG1vdW50RWZmZWN0SW1wbCg0LCBJbnNlcnRpb24sIGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9LFxuICAgICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VMYXlvdXRFZmZlY3RcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiBtb3VudExheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgICAgfSxcbiAgICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZU1lbW9cIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLkg7XG4gICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBtb3VudE1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlUmVkdWNlclwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuSDtcbiAgICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuSCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIG1vdW50UmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZVJlZlwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIG1vdW50UmVmKGluaXRpYWxWYWx1ZSk7XG4gICAgICB9LFxuICAgICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZVN0YXRlXCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICB2Y
15852XIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5IO1xuICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZURlYnVnVmFsdWVcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB9LFxuICAgICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBpbml0aWFsVmFsdWUpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZURlZmVycmVkVmFsdWVcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiBtb3VudERlZmVycmVkVmFsdWUodmFsdWUsIGluaXRpYWxWYWx1ZSk7XG4gICAgICB9LFxuICAgICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlVHJhbnNpdGlvblwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIG1vdW50VHJhbnNpdGlvbigpO1xuICAgICAgfSxcbiAgICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoXG4gICAgICAgIHN1YnNjcmliZSxcbiAgICAgICAgZ2V0U25hcHNob3QsXG4gICAgICAgIGdldFNlcnZlclNuYXBzaG90XG4gICAgICApIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZVN5bmNFeHRlcm5hbFN0b3JlXCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gbW91bnRTeW5jRXh0ZXJuYWxTdG9yZShcbiAgICAgICAgICBzdWJzY3JpYmUsXG4gICAgICAgICAgZ2V0U25hcHNob3QsXG4gICAgICAgICAgZ2V0U2VydmVyU25hcHNob3RcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlSWRcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiBtb3VudElkKCk7XG4gICAgICB9LFxuICAgICAgdXNlQWN0aW9uU3RhdGU6IGZ1bmN0aW9uIChhY3Rpb24sIGluaXRpYWxTdGF0ZSkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlQWN0aW9uU3RhdGVcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiBtb3VudEFjdGlvblN0YXRlKGFjdGlvbiwgaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0sXG4gICAgICB1c2VGb3JtU3RhdGU6IGZ1bmN0aW9uIChhY3Rpb24sIGluaXRpYWxTdGF0ZSkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlRm9ybVN0YXRlXCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICB3YXJuT25Vc2VGb3JtU3RhdGVJbkRldigpO1xuICAgICAgICByZXR1cm4gbW91bnRBY3Rpb25TdGF0ZShhY3Rpb24sIGluaXRpYWxTdGF0ZSk7XG4gICAgICB9LFxuICAgICAgdXNlT3B0aW1pc3RpYzogZnVuY3Rpb24gKHBhc3N0aHJvdWdoKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VPcHRpbWlzdGljXCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gbW91bnRPcHRpbWlzdGljKHBhc3N0aHJvdWdoKTtcbiAgICAgIH0sXG4gICAgICB1c2VIb3N0VHJhbnNpdGlvblN0YXR1czogdXNlSG9zdFRyYW5zaXRpb25TdGF0dXMsXG4gICAgICB1c2VNZW1vQ2FjaGU6IHVzZU1lbW9DYWNoZSxcbiAgICAgIHVzZUNhY2hlUmVmcmVzaDogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlQ2FjaGVSZWZyZXNoXCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gbW91bnRSZWZyZXNoKCk7XG4gICAgICB9LFxuICAgICAgdXNlRWZmZWN0RXZlbnQ6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlRWZmZWN0RXZlbnRcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiBtb3VudEV2ZW50KGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSB7XG4gICAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgICAgfSxcbiAgICAgIHVzZTogdXNlLFxuICAgICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlQ2FsbGJhY2tcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgICB9LFxuICAgICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZUNvbnRleHRcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICAgIH0sXG4gICAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZUVmZmVjdFwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgdXBkYXRlRWZmZWN0SW1wbCgyMDQ4LCBQYXNzaXZlLCBjcmVhdGUsIGRlcHMpO1xuICAgICAgfSxcbiAgICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlSW1wZXJhdGl2ZUhhbmRsZVwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgICAgfSxcbiAgICAgIHVzZUluc2VydGlvbkVmZmVjd
15852DogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlSW5zZXJ0aW9uRWZmZWN0XCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gdXBkYXRlRWZmZWN0SW1wbCg0LCBJbnNlcnRpb24sIGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9LFxuICAgICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VMYXlvdXRFZmZlY3RcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKDQsIExheW91dCwgY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0sXG4gICAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VNZW1vXCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5IO1xuICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlUmVkdWNlclwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuSDtcbiAgICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuSCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiB1cGRhdGVSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVzZVJlZjogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlUmVmXCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCkubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIH0sXG4gICAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlU3RhdGVcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLkg7XG4gICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gdXBkYXRlUmVkdWNlcihiYXNpY1N0YXRlUmVkdWNlcik7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuSCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlRGVidWdWYWx1ZVwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIH0sXG4gICAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGluaXRpYWxWYWx1ZSkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlRGVmZXJyZWRWYWx1ZVwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZURlZmVycmVkVmFsdWUodmFsdWUsIGluaXRpYWxWYWx1ZSk7XG4gICAgICB9LFxuICAgICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlVHJhbnNpdGlvblwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVRyYW5zaXRpb24oKTtcbiAgICAgIH0sXG4gICAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKFxuICAgICAgICBzdWJzY3JpYmUsXG4gICAgICAgIGdldFNuYXBzaG90LFxuICAgICAgICBnZXRTZXJ2ZXJTbmFwc2hvdFxuICAgICAgKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VTeW5jRXh0ZXJuYWxTdG9yZVwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVN5bmNFeHRlcm5hbFN0b3JlKFxuICAgICAgICAgIHN1YnNjcmliZSxcbiAgICAgICAgICBnZXRTbmFwc2hvdCxcbiAgICAgICAgICBnZXRTZXJ2ZXJTbmFwc2hvdFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIHVzZUlkOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VJZFwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpLm1lbW9pemVkU3RhdGU7XG4gICAgICB9LFxuICAgICAgdXNlRm9ybVN0YXRlOiBmdW5jdGlvbiAoYWN0aW9uKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VGb3JtU3RhdGVcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHdhcm5PblVzZUZvcm1TdGF0ZUluRGV2KCk7XG4gICAgICAgIHJldHVybiB1cGRhdGVBY3Rpb25TdGF0ZShhY3Rpb24pO1xuICAgICAgfSxcbiAgICAgIHVzZUFjdGlvblN0YXRlOiBmdW5jdGlvbiAoYWN0aW9uKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VBY3Rpb25TdGF0ZVwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZUFjdGlvblN0YXRlKGFjdGlvbik7XG4gICAgICB9LFxuICAgICAgdXNlT3B0aW1pc3RpYzogZnVuY3Rpb24gKHBhc3N0aHJvdWdoLCByZWR1Y2VyKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VPcHRpbWlzdGljXCI7XG4gICAgICAgI
15852HVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gdXBkYXRlT3B0aW1pc3RpYyhwYXNzdGhyb3VnaCwgcmVkdWNlcik7XG4gICAgICB9LFxuICAgICAgdXNlSG9zdFRyYW5zaXRpb25TdGF0dXM6IHVzZUhvc3RUcmFuc2l0aW9uU3RhdHVzLFxuICAgICAgdXNlTWVtb0NhY2hlOiB1c2VNZW1vQ2FjaGUsXG4gICAgICB1c2VDYWNoZVJlZnJlc2g6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZUNhY2hlUmVmcmVzaFwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVdvcmtJblByb2dyZXNzSG9vaygpLm1lbW9pemVkU3RhdGU7XG4gICAgICB9LFxuICAgICAgdXNlRWZmZWN0RXZlbnQ6IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlRWZmZWN0RXZlbnRcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiB1cGRhdGVFdmVudChjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfTtcbiAgICBIb29rc0Rpc3BhdGNoZXJPblJlcmVuZGVySW5ERVYgPSB7XG4gICAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgICAgfSxcbiAgICAgIHVzZTogdXNlLFxuICAgICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlQ2FsbGJhY2tcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgICB9LFxuICAgICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZUNvbnRleHRcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICAgIH0sXG4gICAgICB1c2VFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZUVmZmVjdFwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgdXBkYXRlRWZmZWN0SW1wbCgyMDQ4LCBQYXNzaXZlLCBjcmVhdGUsIGRlcHMpO1xuICAgICAgfSxcbiAgICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlSW1wZXJhdGl2ZUhhbmRsZVwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgICAgfSxcbiAgICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlSW5zZXJ0aW9uRWZmZWN0XCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gdXBkYXRlRWZmZWN0SW1wbCg0LCBJbnNlcnRpb24sIGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9LFxuICAgICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VMYXlvdXRFZmZlY3RcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKDQsIExheW91dCwgY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0sXG4gICAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VNZW1vXCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICB2Y
15852XIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5IO1xuICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFVjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gdXBkYXRlTWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVzZVJlZHVjZXI6IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VSZWR1Y2VyXCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5IO1xuICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uUmVyZW5kZXJJbkRFVjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gcmVyZW5kZXJSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVzZVJlZjogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlUmVmXCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCkubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIH0sXG4gICAgICB1c2VTdGF0ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlU3RhdGVcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLkg7XG4gICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiByZXJlbmRlclJlZHVjZXIoYmFzaWNTdGF0ZVJlZHVjZXIpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZURlYnVnVmFsdWVcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB9LFxuICAgICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBpbml0aWFsVmFsdWUpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZURlZmVycmVkVmFsdWVcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiByZXJlbmRlckRlZmVycmVkVmFsdWUodmFsdWUsIGluaXRpYWxWYWx1ZSk7XG4gICAgICB9LFxuICAgICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlVHJhbnNpdGlvblwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIHJlcmVuZGVyVHJhbnNpdGlvbigpO1xuICAgICAgfSxcbiAgICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoXG4gICAgICAgIHN1YnNjcmliZSxcbiAgICAgICAgZ2V0U25hcHNob3QsXG4gICAgICAgIGdldFNlcnZlclNuYXBzaG90XG4gICAgICApIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZVN5bmNFeHRlcm5hbFN0b3JlXCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gdXBkYXRlU3luY0V4dGVybmFsU3RvcmUoXG4gICAgICAgICAgc3Vic2NyaWJlLFxuICAgICAgICAgIGdldFNuYXBzaG90LFxuICAgICAgICAgIGdldFNlcnZlclNuYXBzaG90XG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgdXNlSWQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZUlkXCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCkubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIH0sXG4gICAgICB1c2VGb3JtU3RhdGU6IGZ1bmN0aW9uIChhY3Rpb24pIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZUZvcm1TdGF0ZVwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgd2Fybk9uVXNlRm9ybVN0YXRlSW5EZXYoKTtcbiAgICAgICAgcmV0dXJuIHJlcmVuZGVyQWN0aW9uU3RhdGUoYWN0aW9uKTtcbiAgICAgIH0sXG4gICAgICB1c2VBY3Rpb25TdGF0ZTogZnVuY3Rpb24gKGFjdGlvbikge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlQWN0aW9uU3RhdGVcIjtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiByZXJlbmRlckFjdGlvblN0YXRlKGFjdGlvbik7XG4gICAgICB9LFxuICAgICAgdXNlT3B0aW1pc3RpYzogZnVuY3Rpb24gKHBhc3N0aHJvdWdoLCByZWR1Y2VyKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VPcHRpbWlzdGljXCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gcmVyZW5kZXJPcHRpbWlzdGljKHBhc3N0aHJvdWdoLCByZWR1Y2VyKTtcbiAgICAgIH0sXG4gICAgICB1c2VIb3N0VHJhbnNpdGlvblN0YXR1czogdXNlSG9zdFRyYW5zaXRpb25TdGF0dXMsXG4gICAgICB1c2VNZW1vQ2FjaGU6IHVzZU1lbW9DYWNoZSxcbiAgICAgIHVzZUNhY2hlUmVmcmVzaDogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlQ2FjaGVSZWZyZXNoXCI7XG4gICAgICAgI
15852HVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCkubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIH0sXG4gICAgICB1c2VFZmZlY3RFdmVudDogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VFZmZlY3RFdmVudFwiO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZUV2ZW50KGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVYgPSB7XG4gICAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgd2FybkludmFsaWRDb250ZXh0QWNjZXNzKCk7XG4gICAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICAgIH0sXG4gICAgICB1c2U6IGZ1bmN0aW9uICh1c2FibGUpIHtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIHJldHVybiB1c2UodXNhYmxlKTtcbiAgICAgIH0sXG4gICAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VDYWxsYmFja1wiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIG1vdW50Q2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgICAgfSxcbiAgICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VDb250ZXh0XCI7XG4gICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgICB9LFxuICAgICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VFZmZlY3RcIjtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiBtb3VudEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgICAgfSxcbiAgICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlSW1wZXJhdGl2ZUhhbmRsZVwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIG1vdW50SW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9LFxuICAgICAgdXNlSW5zZXJ0aW9uRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VJbnNlcnRpb25FZmZlY3RcIjtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICAgIG1vdW50RWZmZWN0SW1wbCg0LCBJbnNlcnRpb24sIGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9LFxuICAgICAgdXNlTGF5b3V0RWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VMYXlvdXRFZmZlY3RcIjtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiBtb3VudExheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgICAgfSxcbiAgICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZU1lbW9cIjtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLkg7XG4gICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25Nb3VudEluREVWO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBtb3VudE1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlUmVkdWNlclwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuSDtcbiAgICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuSCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPbk1vdW50SW5ERVY7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIG1vdW50UmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1c2VSZWY6IGZ1bmN0aW9uIChpbml0aWFsVmFsdWUpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZVJlZlwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIG1vdW50UmVmKGluaXRpYWxWYWx1ZSk7XG4gICAgICB9LFxuICAgICAgdXNlU3RhdGU6IGZ1bmN0aW9uIChpbml0aWFsU3RhdGUpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZVN0YXRlXCI7XG4gICAgICAgI
15852Hdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgICB2YXIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5IO1xuICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uTW91bnRJbkRFVjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gbW91bnRTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBwcmV2RGlzcGF0Y2hlcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHVzZURlYnVnVmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZURlYnVnVmFsdWVcIjtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICB9LFxuICAgICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBpbml0aWFsVmFsdWUpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZURlZmVycmVkVmFsdWVcIjtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiBtb3VudERlZmVycmVkVmFsdWUodmFsdWUsIGluaXRpYWxWYWx1ZSk7XG4gICAgICB9LFxuICAgICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlVHJhbnNpdGlvblwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIG1vdW50VHJhbnNpdGlvbigpO1xuICAgICAgfSxcbiAgICAgIHVzZVN5bmNFeHRlcm5hbFN0b3JlOiBmdW5jdGlvbiAoXG4gICAgICAgIHN1YnNjcmliZSxcbiAgICAgICAgZ2V0U25hcHNob3QsXG4gICAgICAgIGdldFNlcnZlclNuYXBzaG90XG4gICAgICApIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZVN5bmNFeHRlcm5hbFN0b3JlXCI7XG4gICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gbW91bnRTeW5jRXh0ZXJuYWxTdG9yZShcbiAgICAgICAgICBzdWJzY3JpYmUsXG4gICAgICAgICAgZ2V0U25hcHNob3QsXG4gICAgICAgICAgZ2V0U2VydmVyU25hcHNob3RcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlSWRcIjtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiBtb3VudElkKCk7XG4gICAgICB9LFxuICAgICAgdXNlRm9ybVN0YXRlOiBmdW5jdGlvbiAoYWN0aW9uLCBpbml0aWFsU3RhdGUpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZUZvcm1TdGF0ZVwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIG1vdW50QWN0aW9uU3RhdGUoYWN0aW9uLCBpbml0aWFsU3RhdGUpO1xuICAgICAgfSxcbiAgICAgIHVzZUFjdGlvblN0YXRlOiBmdW5jdGlvbiAoYWN0aW9uLCBpbml0aWFsU3RhdGUpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZUFjdGlvblN0YXRlXCI7XG4gICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gbW91bnRBY3Rpb25TdGF0ZShhY3Rpb24sIGluaXRpYWxTdGF0ZSk7XG4gICAgICB9LFxuICAgICAgdXNlT3B0aW1pc3RpYzogZnVuY3Rpb24gKHBhc3N0aHJvdWdoKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VPcHRpbWlzdGljXCI7XG4gICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICBtb3VudEhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gbW91bnRPcHRpbWlzdGljKHBhc3N0aHJvdWdoKTtcbiAgICAgIH0sXG4gICAgICB1c2VNZW1vQ2FjaGU6IGZ1bmN0aW9uIChzaXplKSB7XG4gICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICByZXR1cm4gdXNlTWVtb0NhY2hlKHNpemUpO1xuICAgICAgfSxcbiAgICAgIHVzZUhvc3RUcmFuc2l0aW9uU3RhdHVzOiB1c2VIb3N0VHJhbnNpdGlvblN0YXR1cyxcbiAgICAgIHVzZUNhY2hlUmVmcmVzaDogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlQ2FjaGVSZWZyZXNoXCI7XG4gICAgICAgIG1vdW50SG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiBtb3VudFJlZnJlc2goKTtcbiAgICAgIH0sXG4gICAgICB1c2VFZmZlY3RFdmVudDogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VFZmZlY3RFdmVudFwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgbW91bnRIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIG1vdW50RXZlbnQoY2FsbGJhY2spO1xuICAgICAgfVxuICAgIH07XG4gICAgSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVYgPSB7XG4gICAgICByZWFkQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgd2FybkludmFsaWRDb250ZXh0QWNjZXNzKCk7XG4gICAgICAgIHJldHVybiByZWFkQ29udGV4dChjb250ZXh0KTtcbiAgICAgIH0sXG4gICAgICB1c2U6IGZ1bmN0aW9uICh1c2FibGUpIHtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIHJldHVybiB1c2UodXNhYmxlKTtcbiAgICAgIH0sXG4gICAgICB1c2VDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VDYWxsYmFja1wiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgI
15852HJldHVybiB1cGRhdGVDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgICB9LFxuICAgICAgdXNlQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZUNvbnRleHRcIjtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgICB9LFxuICAgICAgdXNlRWZmZWN0OiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VFZmZlY3RcIjtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICB1cGRhdGVFZmZlY3RJbXBsKDIwNDgsIFBhc3NpdmUsIGNyZWF0ZSwgZGVwcyk7XG4gICAgICB9LFxuICAgICAgdXNlSW1wZXJhdGl2ZUhhbmRsZTogZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VJbXBlcmF0aXZlSGFuZGxlXCI7XG4gICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZUltcGVyYXRpdmVIYW5kbGUocmVmLCBjcmVhdGUsIGRlcHMpO1xuICAgICAgfSxcbiAgICAgIHVzZUluc2VydGlvbkVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlSW5zZXJ0aW9uRWZmZWN0XCI7XG4gICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdEltcGwoNCwgSW5zZXJ0aW9uLCBjcmVhdGUsIGRlcHMpO1xuICAgICAgfSxcbiAgICAgIHVzZUxheW91dEVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlTGF5b3V0RWZmZWN0XCI7XG4gICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZUVmZmVjdEltcGwoNCwgTGF5b3V0LCBjcmVhdGUsIGRlcHMpO1xuICAgICAgfSxcbiAgICAgIHVzZU1lbW86IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZU1lbW9cIjtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICB2Y
15852XIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5IO1xuICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZU1lbW8oY3JlYXRlLCBkZXBzKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1c2VSZWR1Y2VyOiBmdW5jdGlvbiAocmVkdWNlciwgaW5pdGlhbEFyZywgaW5pdCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlUmVkdWNlclwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLkg7XG4gICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gdXBkYXRlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1c2VSZWY6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZVJlZlwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKS5tZW1vaXplZFN0YXRlO1xuICAgICAgfSxcbiAgICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VTdGF0ZVwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLkg7XG4gICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gdXBkYXRlUmVkdWNlcihiYXNpY1N0YXRlUmVkdWNlcik7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuSCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXNlRGVidWdWYWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlRGVidWdWYWx1ZVwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICB9LFxuICAgICAgdXNlRGVmZXJyZWRWYWx1ZTogZnVuY3Rpb24gKHZhbHVlLCBpbml0aWFsVmFsdWUpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZURlZmVycmVkVmFsdWVcIjtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gdXBkYXRlRGVmZXJyZWRWYWx1ZSh2YWx1ZSwgaW5pdGlhbFZhbHVlKTtcbiAgICAgIH0sXG4gICAgICB1c2VUcmFuc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VUcmFuc2l0aW9uXCI7XG4gICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZVRyYW5zaXRpb24oKTtcbiAgICAgIH0sXG4gICAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKFxuICAgICAgICBzdWJzY3JpYmUsXG4gICAgICAgIGdldFNuYXBzaG90LFxuICAgICAgICBnZXRTZXJ2ZXJTbmFwc2hvdFxuICAgICAgKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VTeW5jRXh0ZXJuYWxTdG9yZVwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiB1cGRhdGVTeW5jRXh0ZXJuYWxTdG9yZShcbiAgICAgICAgICBzdWJzY3JpYmUsXG4gICAgICAgICAgZ2V0U25hcHNob3QsXG4gICAgICAgICAgZ2V0U2VydmVyU25hcHNob3RcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlSWRcIjtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCkubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIH0sXG4gICAgICB1c2VGb3JtU3RhdGU6IGZ1bmN0aW9uIChhY3Rpb24pIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZUZvcm1TdGF0ZVwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiB1cGRhdGVBY3Rpb25TdGF0ZShhY3Rpb24pO1xuICAgICAgfSxcbiAgICAgIHVzZUFjdGlvblN0YXRlOiBmdW5jdGlvbiAoYWN0aW9uKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VBY3Rpb25TdGF0ZVwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiB1cGRhdGVBY3Rpb25TdGF0ZShhY3Rpb24pO1xuICAgICAgfSxcbiAgICAgIHVzZU9wdGltaXN0aWM6IGZ1bmN0aW9uIChwYXNzdGhyb3VnaCwgcmVkdWNlcikge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlT3B0aW1pc3RpY1wiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgI
15852HJldHVybiB1cGRhdGVPcHRpbWlzdGljKHBhc3N0aHJvdWdoLCByZWR1Y2VyKTtcbiAgICAgIH0sXG4gICAgICB1c2VNZW1vQ2FjaGU6IGZ1bmN0aW9uIChzaXplKSB7XG4gICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICByZXR1cm4gdXNlTWVtb0NhY2hlKHNpemUpO1xuICAgICAgfSxcbiAgICAgIHVzZUhvc3RUcmFuc2l0aW9uU3RhdHVzOiB1c2VIb3N0VHJhbnNpdGlvblN0YXR1cyxcbiAgICAgIHVzZUNhY2hlUmVmcmVzaDogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlQ2FjaGVSZWZyZXNoXCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCkubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIH0sXG4gICAgICB1c2VFZmZlY3RFdmVudDogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VFZmZlY3RFdmVudFwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiB1cGRhdGVFdmVudChjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfTtcbiAgICBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25SZXJlbmRlckluREVWID0ge1xuICAgICAgcmVhZENvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIHdhcm5JbnZhbGlkQ29udGV4dEFjY2VzcygpO1xuICAgICAgICByZXR1cm4gcmVhZENvbnRleHQoY29udGV4dCk7XG4gICAgICB9LFxuICAgICAgdXNlOiBmdW5jdGlvbiAodXNhYmxlKSB7XG4gICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICByZXR1cm4gdXNlKHVzYWJsZSk7XG4gICAgICB9LFxuICAgICAgdXNlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgZGVwcykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlQ2FsbGJhY2tcIjtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gdXBkYXRlQ2FsbGJhY2soY2FsbGJhY2ssIGRlcHMpO1xuICAgICAgfSxcbiAgICAgIHVzZUNvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VDb250ZXh0XCI7XG4gICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KGNvbnRleHQpO1xuICAgICAgfSxcbiAgICAgIHVzZUVmZmVjdDogZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlRWZmZWN0XCI7XG4gICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgdXBkYXRlRWZmZWN0SW1wbCgyMDQ4LCBQYXNzaXZlLCBjcmVhdGUsIGRlcHMpO1xuICAgICAgfSxcbiAgICAgIHVzZUltcGVyYXRpdmVIYW5kbGU6IGZ1bmN0aW9uIChyZWYsIGNyZWF0ZSwgZGVwcykge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlSW1wZXJhdGl2ZUhhbmRsZVwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiB1cGRhdGVJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0sXG4gICAgICB1c2VJbnNlcnRpb25FZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZUluc2VydGlvbkVmZmVjdFwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKDQsIEluc2VydGlvbiwgY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0sXG4gICAgICB1c2VMYXlvdXRFZmZlY3Q6IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZUxheW91dEVmZmVjdFwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiB1cGRhdGVFZmZlY3RJbXBsKDQsIExheW91dCwgY3JlYXRlLCBkZXBzKTtcbiAgICAgIH0sXG4gICAgICB1c2VNZW1vOiBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VNZW1vXCI7XG4gICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgdmFyIHByZXZEaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuSDtcbiAgICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuSCA9IEludmFsaWROZXN0ZWRIb29rc0Rpc3BhdGNoZXJPblVwZGF0ZUluREVWO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiB1cGRhdGVNZW1vKGNyZWF0ZSwgZGVwcyk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMuSCA9IHByZXZEaXNwYXRjaGVyO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXNlUmVkdWNlcjogZnVuY3Rpb24gKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZVJlZHVjZXJcIjtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICB2Y
15852XIgcHJldkRpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5IO1xuICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gSW52YWxpZE5lc3RlZEhvb2tzRGlzcGF0Y2hlck9uVXBkYXRlSW5ERVY7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIHJlcmVuZGVyUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1c2VSZWY6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZVJlZlwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiB1cGRhdGVXb3JrSW5Qcm9ncmVzc0hvb2soKS5tZW1vaXplZFN0YXRlO1xuICAgICAgfSxcbiAgICAgIHVzZVN0YXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VTdGF0ZVwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHZhciBwcmV2RGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLkg7XG4gICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBJbnZhbGlkTmVzdGVkSG9va3NEaXNwYXRjaGVyT25VcGRhdGVJbkRFVjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gcmVyZW5kZXJSZWR1Y2VyKGJhc2ljU3RhdGVSZWR1Y2VyKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5IID0gcHJldkRpc3BhdGNoZXI7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1c2VEZWJ1Z1ZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VEZWJ1Z1ZhbHVlXCI7XG4gICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgIH0sXG4gICAgICB1c2VEZWZlcnJlZFZhbHVlOiBmdW5jdGlvbiAodmFsdWUsIGluaXRpYWxWYWx1ZSkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlRGVmZXJyZWRWYWx1ZVwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiByZXJlbmRlckRlZmVycmVkVmFsdWUodmFsdWUsIGluaXRpYWxWYWx1ZSk7XG4gICAgICB9LFxuICAgICAgdXNlVHJhbnNpdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlVHJhbnNpdGlvblwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiByZXJlbmRlclRyYW5zaXRpb24oKTtcbiAgICAgIH0sXG4gICAgICB1c2VTeW5jRXh0ZXJuYWxTdG9yZTogZnVuY3Rpb24gKFxuICAgICAgICBzdWJzY3JpYmUsXG4gICAgICAgIGdldFNuYXBzaG90LFxuICAgICAgICBnZXRTZXJ2ZXJTbmFwc2hvdFxuICAgICAgKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VTeW5jRXh0ZXJuYWxTdG9yZVwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiB1cGRhdGVTeW5jRXh0ZXJuYWxTdG9yZShcbiAgICAgICAgICBzdWJzY3JpYmUsXG4gICAgICAgICAgZ2V0U25hcHNob3QsXG4gICAgICAgICAgZ2V0U2VydmVyU25hcHNob3RcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICB1c2VJZDogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlSWRcIjtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCkubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIH0sXG4gICAgICB1c2VGb3JtU3RhdGU6IGZ1bmN0aW9uIChhY3Rpb24pIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZUZvcm1TdGF0ZVwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgIHJldHVybiByZXJlbmRlckFjdGlvblN0YXRlKGFjdGlvbik7XG4gICAgICB9LFxuICAgICAgdXNlQWN0aW9uU3RhdGU6IGZ1bmN0aW9uIChhY3Rpb24pIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZUFjdGlvblN0YXRlXCI7XG4gICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICB1cGRhdGVIb29rVHlwZXNEZXYoKTtcbiAgICAgICAgcmV0dXJuIHJlcmVuZGVyQWN0aW9uU3RhdGUoYWN0aW9uKTtcbiAgICAgIH0sXG4gICAgICB1c2VPcHRpbWlzdGljOiBmdW5jdGlvbiAocGFzc3Rocm91Z2gsIHJlZHVjZXIpIHtcbiAgICAgICAgY3VycmVudEhvb2tOYW1lSW5EZXYgPSBcInVzZU9wdGltaXN0aWNcIjtcbiAgICAgICAgd2FybkludmFsaWRIb29rQWNjZXNzKCk7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gcmVyZW5kZXJPcHRpbWlzdGljKHBhc3N0aHJvdWdoLCByZWR1Y2VyKTtcbiAgICAgIH0sXG4gICAgICB1c2VNZW1vQ2FjaGU6IGZ1bmN0aW9uIChzaXplKSB7XG4gICAgICAgIHdhcm5JbnZhbGlkSG9va0FjY2VzcygpO1xuICAgICAgICByZXR1cm4gdXNlTWVtb0NhY2hlKHNpemUpO1xuICAgICAgfSxcbiAgICAgIHVzZUhvc3RUcmFuc2l0aW9uU3RhdHVzOiB1c2VIb3N0VHJhbnNpdGlvblN0YXR1cyxcbiAgICAgIHVzZUNhY2hlUmVmcmVzaDogZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXJyZW50SG9va05hbWVJbkRldiA9IFwidXNlQ2FjaGVSZWZyZXNoXCI7XG4gICAgICAgIHVwZGF0ZUhvb2tUeXBlc0RldigpO1xuICAgICAgICByZXR1cm4gdXBkYXRlV29ya0luUHJvZ3Jlc3NIb29rKCkubWVtb2l6ZWRTdGF0ZTtcbiAgICAgIH0sXG4gICAgICB1c2VFZmZlY3RFdmVudDogZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgIGN1cnJlbnRIb29rTmFtZUluRGV2ID0gXCJ1c2VFZmZlY3RFdmVudFwiO1xuICAgICAgICB3YXJuSW52YWxpZEhvb2tBY2Nlc3MoKTtcbiAgICAgICAgdXBkYXRlSG9va1R5cGVzRGV2KCk7XG4gICAgICAgI
15852HJldHVybiB1cGRhdGVFdmVudChjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgZmFrZUludGVybmFsSW5zdGFuY2UgPSB7fTtcbiAgICB2YXIgZGlkV2FybkFib3V0U3RhdGVBc3NpZ25tZW50Rm9yQ29tcG9uZW50ID0gbmV3IFNldCgpO1xuICAgIHZhciBkaWRXYXJuQWJvdXRVbmluaXRpYWxpemVkU3RhdGUgPSBuZXcgU2V0KCk7XG4gICAgdmFyIGRpZFdhcm5BYm91dEdldFNuYXBzaG90QmVmb3JlVXBkYXRlV2l0aG91dERpZFVwZGF0ZSA9IG5ldyBTZXQoKTtcbiAgICB2YXIgZGlkV2FybkFib3V0TGVnYWN5TGlmZWN5Y2xlc0FuZERlcml2ZWRTdGF0ZSA9IG5ldyBTZXQoKTtcbiAgICB2YXIgZGlkV2FybkFib3V0RGlyZWN0bHlBc3NpZ25pbmdQcm9wc1RvU3RhdGUgPSBuZXcgU2V0KCk7XG4gICAgdmFyIGRpZFdhcm5BYm91dFVuZGVmaW5lZERlcml2ZWRTdGF0ZSA9IG5ldyBTZXQoKTtcbiAgICB2YXIgZGlkV2FybkFib3V0Q29udGV4dFR5cGVzJDEgPSBuZXcgU2V0KCk7XG4gICAgdmFyIGRpZFdhcm5BYm91dENoaWxkQ29udGV4dFR5cGVzID0gbmV3IFNldCgpO1xuICAgIHZhciBkaWRXYXJuQWJvdXRJbnZhbGlkYXRlQ29udGV4dFR5cGUgPSBuZXcgU2V0KCk7XG4gICAgdmFyIGRpZFdhcm5PbkludmFsaWRDYWxsYmFjayA9IG5ldyBTZXQoKTtcbiAgICBPYmplY3QuZnJlZXplKGZha2VJbnRlcm5hbEluc3RhbmNlKTtcbiAgICB2YXIgY2xhc3NDb21wb25lbnRVcGRhdGVyID0ge1xuICAgICAgICBlbnF1ZXVlU2V0U3RhdGU6IGZ1bmN0aW9uIChpbnN0LCBwYXlsb2FkLCBjYWxsYmFjaykge1xuICAgICAgICAgIGluc3QgPSBpbnN0Ll9yZWFjdEludGVybmFscztcbiAgICAgICAgICB2Y
15852XIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGluc3QpLFxuICAgICAgICAgICAgdXBkYXRlID0gY3JlYXRlVXBkYXRlKGxhbmUpO1xuICAgICAgICAgIHVwZGF0ZS5wYXlsb2FkID0gcGF5bG9hZDtcbiAgICAgICAgICB2b2lkIDAgIT09IGNhbGxiYWNrICYmXG4gICAgICAgICAgICBudWxsICE9PSBjYWxsYmFjayAmJlxuICAgICAgICAgICAgKHdhcm5PbkludmFsaWRDYWxsYmFjayhjYWxsYmFjayksICh1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjaykpO1xuICAgICAgICAgIHBheWxvYWQgPSBlbnF1ZXVlVXBkYXRlKGluc3QsIHVwZGF0ZSwgbGFuZSk7XG4gICAgICAgICAgbnVsbCAhPT0gcGF5bG9hZCAmJlxuICAgICAgICAgICAgKHN0YXJ0VXBkYXRlVGltZXJCeUxhbmUobGFuZSwgXCJ0aGlzLnNldFN0YXRlKClcIiwgaW5zdCksXG4gICAgICAgICAgICBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocGF5bG9hZCwgaW5zdCwgbGFuZSksXG4gICAgICAgICAgICBlbnRhbmdsZVRyYW5zaXRpb25zKHBheWxvYWQsIGluc3QsIGxhbmUpKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW5xdWV1ZVJlcGxhY2VTdGF0ZTogZnVuY3Rpb24gKGluc3QsIHBheWxvYWQsIGNhbGxiYWNrKSB7XG4gICAgICAgICAgaW5zdCA9IGluc3QuX3JlYWN0SW50ZXJuYWxzO1xuICAgICAgICAgIHZhciBsYW5lID0gcmVxdWVzdFVwZGF0ZUxhbmUoaW5zdCksXG4gICAgICAgICAgICB1cGRhdGUgPSBjcmVhdGVVcGRhdGUobGFuZSk7XG4gICAgICAgICAgdXBkYXRlLnRhZyA9IFJlcGxhY2VTdGF0ZTtcbiAgICAgICAgICB1cGRhdGUucGF5bG9hZCA9IHBheWxvYWQ7XG4gICAgICAgICAgdm9pZCAwICE9PSBjYWxsYmFjayAmJlxuICAgICAgICAgICAgbnVsbCAhPT0gY2FsbGJhY2sgJiZcbiAgICAgICAgICAgICh3YXJuT25JbnZhbGlkQ2FsbGJhY2soY2FsbGJhY2spLCAodXBkYXRlLmNhbGxiYWNrID0gY2FsbGJhY2spKTtcbiAgICAgICAgICBwYXlsb2FkID0gZW5xdWV1ZVVwZGF0ZShpbnN0LCB1cGRhdGUsIGxhbmUpO1xuICAgICAgICAgIG51bGwgIT09IHBheWxvYWQgJiZcbiAgICAgICAgICAgIChzdGFydFVwZGF0ZVRpbWVyQnlMYW5lKGxhbmUsIFwidGhpcy5yZXBsYWNlU3RhdGUoKVwiLCBpbnN0KSxcbiAgICAgICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihwYXlsb2FkLCBpbnN0LCBsYW5lKSxcbiAgICAgICAgICAgIGVudGFuZ2xlVHJhbnNpdGlvbnMocGF5bG9hZCwgaW5zdCwgbGFuZSkpO1xuICAgICAgICB9LFxuICAgICAgICBlbnF1ZXVlRm9yY2VVcGRhdGU6IGZ1bmN0aW9uIChpbnN0LCBjYWxsYmFjaykge1xuICAgICAgICAgIGluc3QgPSBpbnN0Ll9yZWFjdEludGVybmFscztcbiAgICAgICAgICB2Y
15852XIgbGFuZSA9IHJlcXVlc3RVcGRhdGVMYW5lKGluc3QpLFxuICAgICAgICAgICAgdXBkYXRlID0gY3JlYXRlVXBkYXRlKGxhbmUpO1xuICAgICAgICAgIHVwZGF0ZS50YWcgPSBGb3JjZVVwZGF0ZTtcbiAgICAgICAgICB2b2lkIDAgIT09IGNhbGxiYWNrICYmXG4gICAgICAgICAgICBudWxsICE9PSBjYWxsYmFjayAmJlxuICAgICAgICAgICAgKHdhcm5PbkludmFsaWRDYWxsYmFjayhjYWxsYmFjayksICh1cGRhdGUuY2FsbGJhY2sgPSBjYWxsYmFjaykpO1xuICAgICAgICAgIGNhbGxiYWNrID0gZW5xdWV1ZVVwZGF0ZShpbnN0LCB1cGRhdGUsIGxhbmUpO1xuICAgICAgICAgIG51bGwgIT09IGNhbGxiYWNrICYmXG4gICAgICAgICAgICAoc3RhcnRVcGRhdGVUaW1lckJ5TGFuZShsYW5lLCBcInRoaXMuZm9yY2VVcGRhdGUoKVwiLCBpbnN0KSxcbiAgICAgICAgICAgIHNjaGVkdWxlVXBkYXRlT25GaWJlcihjYWxsYmFjaywgaW5zdCwgbGFuZSksXG4gICAgICAgICAgICBlbnRhbmdsZVRyYW5zaXRpb25zKGNhbGxiYWNrLCBpbnN0LCBsYW5lKSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBjb21wb25lbnROYW1lID0gbnVsbCxcbiAgICAgIGVycm9yQm91bmRhcnlOYW1lID0gbnVsbCxcbiAgICAgIFNlbGVjdGl2ZUh5ZHJhdGlvbkV4Y2VwdGlvbiA9IEVycm9yKFxuICAgICAgICBcIlRoaXMgaXMgbm90IGEgcmVhbCBlcnJvci4gSXQncyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgb2YgUmVhY3QncyBzZWxlY3RpdmUgaHlkcmF0aW9uIGZlYXR1cmUuIElmIHRoaXMgbGVha3MgaW50byB1c2Vyc3BhY2UsIGl0J3MgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiXG4gICAgICApLFxuICAgICAgZGlkUmVjZWl2ZVVwZGF0ZSA9ICExO1xuICAgIHZhciBkaWRXYXJuQWJvdXRCYWRDbGFzcyA9IHt9O1xuICAgIHZhciBkaWRXYXJuQWJvdXRDb250ZXh0VHlwZU9uRnVuY3Rpb25Db21wb25lbnQgPSB7fTtcbiAgICB2YXIgZGlkV2FybkFib3V0Q29udGV4dFR5cGVzID0ge307XG4gICAgdmFyIGRpZFdhcm5BYm91dEdldERlcml2ZWRTdGF0ZU9uRnVuY3Rpb25Db21wb25lbnQgPSB7fTtcbiAgICB2YXIgZGlkV2FybkFib3V0UmVhc3NpZ25pbmdQcm9wcyA9ICExO1xuICAgIHZhciBkaWRXYXJuQWJvdXRSZXZlYWxPcmRlciA9IHt9O1xuICAgIHZhciBkaWRXYXJuQWJvdXRUYWlsT3B0aW9ucyA9IHt9O1xuICAgIHZhciBkaWRXYXJuQWJvdXRDbGFzc05hbWVPblZpZXdUcmFuc2l0aW9uID0ge307XG4gICAgdmFyIFNVU1BFTkRFRF9NQVJLRVIgPSB7XG4gICAgICAgIGRlaHlkcmF0ZWQ6IG51bGwsXG4gICAgICAgIHRyZWVDb250ZXh0OiBudWxsLFxuICAgICAgICByZXRyeUxhbmU6IDAsXG4gICAgICAgIGh5ZHJhdGlvbkVycm9yczogbnVsbFxuICAgICAgfSxcbiAgICAgIGhhc1dhcm5lZEFib3V0VXNpbmdOb1ZhbHVlUHJvcE9uQ29udGV4dFByb3ZpZGVyID0gITEsXG4gICAgICBkaWRXYXJuQWJvdXRVbmRlZmluZWRTbmFwc2hvdEJlZm9yZVVwZGF0ZSA9IG51bGw7XG4gICAgZGlkV2FybkFib3V0VW5kZWZpbmVkU25hcHNob3RCZWZvcmVVcGRhdGUgPSBuZXcgU2V0KCk7XG4gICAgdmFyIHNob3VsZFN0YXJ0Vmlld1RyYW5zaXRpb24gPSAhMSxcbiAgICAgIGFwcGVhcmluZ1ZpZXdUcmFuc2l0aW9ucyA9IG51bGwsXG4gICAgICB2aWV3VHJhbnNpdGlvbkNhbmNlbGFibGVDaGlsZHJlbiA9IG51bGwsXG4gICAgICB2aWV3VHJhbnNpdGlvbkhvc3RJbnN0YW5jZUlkeCA9IDAsXG4gICAgICBtb3VudGVkTmFtZWRWaWV3VHJhbnNpdGlvbnMgPSBuZXcgTWFwKCksXG4gICAgICBkaWRXYXJuQWJvdXROYW1lID0ge30sXG4gICAgICBOb0xheW91dEVmZmVjdFRyYXZlcnNhbEZsYWdzID0gMCxcbiAgICAgIEluY2x1ZGVXb3JrSW5Qcm9ncmVzc0VmZmVjdHMgPSAxLFxuICAgICAgSW5jbHVkZUhvc3RTaW5nbGV0b25zID0gMixcbiAgICAgIG9mZnNjcmVlblN1YnRyZWVJc0hpZGRlbiA9ICExLFxuICAgICAgb2Zmc2NyZWVuU3VidHJlZVdhc0hpZGRlbiA9ICExLFxuICAgICAgb2Zmc2NyZWVuRGlyZWN0UGFyZW50SXNIaWRkZW4gPSAhMSxcbiAgICAgIG5lZWRzRm9ybVJlc2V0ID0gITEsXG4gICAgICBQb3NzaWJseVdlYWtTZXQgPSBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBXZWFrU2V0ID8gV2Vha1NldCA6IFNldCxcbiAgICAgIG5leHRFZmZlY3QgPSBudWxsLFxuICAgICAgaW5Qcm9ncmVzc0xhbmVzID0gbnVsbCxcbiAgICAgIGluUHJvZ3Jlc3NSb290ID0gbnVsbCxcbiAgICAgIHZpZXdUcmFuc2l0aW9uQ29udGV4dENoYW5nZWQgPSAhMSxcbiAgICAgIGluVXBkYXRlVmlld1RyYW5zaXRpb24gPSAhMSxcbiAgICAgIHJvb3RWaWV3VHJhbnNpdGlvbkFmZmVjdGVkID0gITEsXG4gICAgICByb290Vmlld1RyYW5zaXRpb25OYW1lQ2FuY2VsZWQgPSAhMSxcbiAgICAgIGhvc3RQYXJlbnQgPSBudWxsLFxuICAgICAgaG9zdFBhcmVudElzQ29udGFpbmVyID0gITEsXG4gICAgICBjdXJyZW50SG9pc3RhYmxlUm9vdCA9IG51bGwsXG4gICAgICBpbkh5ZHJhdGVkU3VidHJlZSA9ICExLFxuICAgICAgc3VzcGVuc2V5Q29tbWl0RmxhZyA9IDgxOTIsXG4gICAgICBEZWZhdWx0QXN5bmNEaXNwYXRjaGVyID0ge1xuICAgICAgICBnZXRDYWNoZUZvclR5cGU6IGZ1bmN0aW9uIChyZXNvdXJjZVR5cGUpIHtcbiAgICAgICAgICB2Y
15852XIgY2FjaGUgPSByZWFkQ29udGV4dChDYWNoZUNvbnRleHQpLFxuICAgICAgICAgICAgY2FjaGVGb3JUeXBlID0gY2FjaGUuZGF0YS5nZXQocmVzb3VyY2VUeXBlKTtcbiAgICAgICAgICB2b2lkIDAgPT09IGNhY2hlRm9yVHlwZSAmJlxuICAgICAgICAgICAgKChjYWNoZUZvclR5cGUgPSByZXNvdXJjZVR5cGUoKSksXG4gICAgICAgICAgICBjYWNoZS5kYXRhLnNldChyZXNvdXJjZVR5cGUsIGNhY2hlRm9yVHlwZSkpO1xuICAgICAgICAgIHJldHVybiBjYWNoZUZvclR5cGU7XG4gICAgICAgIH0sXG4gICAgICAgIGNhY2hlU2lnbmFsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIHJlYWRDb250ZXh0KENhY2hlQ29udGV4dCkuY29udHJvbGxlci5zaWduYWw7XG4gICAgICAgIH0sXG4gICAgICAgIGdldE93bmVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgaWYgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIFN5bWJvbCAmJiBTeW1ib2wuZm9yKSB7XG4gICAgICB2YXIgc3ltYm9sRm9yID0gU3ltYm9sLmZvcjtcbiAgICAgIHN5bWJvbEZvcihcInNlbGVjdG9yLmNvbXBvbmVudFwiKTtcbiAgICAgIHN5bWJvbEZvcihcInNlbGVjdG9yLmhhc19wc2V1ZG9fY2xhc3NcIik7XG4gICAgICBzeW1ib2xGb3IoXCJzZWxlY3Rvci5yb2xlXCIpO1xuICAgICAgc3ltYm9sRm9yKFwic2VsZWN0b3IudGVzdF9pZFwiKTtcbiAgICAgIHN5bWJvbEZvcihcInNlbGVjdG9yLnRleHRcIik7XG4gICAgfVxuICAgIHZhciBjb21taXRIb29rcyA9IFtdLFxuICAgICAgUG9zc2libHlXZWFrTWFwID0gXCJmdW5jdGlvblwiID09PSB0eXBlb2YgV2Vha01hcCA/IFdlYWtNYXAgOiBNYXAsXG4gICAgICBOb0NvbnRleHQgPSAwLFxuICAgICAgUmVuZGVyQ29udGV4dCA9IDIsXG4gICAgICBDb21taXRDb250ZXh0ID0gNCxcbiAgICAgIFJvb3RJblByb2dyZXNzID0gMCxcbiAgICAgIFJvb3RGYXRhbEVycm9yZWQgPSAxLFxuICAgICAgUm9vdEVycm9yZWQgPSAyLFxuICAgICAgUm9vdFN1c3BlbmRlZCA9IDMsXG4gICAgICBSb290U3VzcGVuZGVkV2l0aERlbGF5ID0gNCxcbiAgICAgIFJvb3RTdXNwZW5kZWRBdFRoZVNoZWxsID0gNixcbiAgICAgIFJvb3RDb21wbGV0ZWQgPSA1LFxuICAgICAgZXhlY3V0aW9uQ29udGV4dCA9IE5vQ29udGV4dCxcbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdCA9IG51bGwsXG4gICAgICB3b3JrSW5Qcm9ncmVzcyA9IG51bGwsXG4gICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RSZW5kZXJMYW5lcyA9IDAsXG4gICAgICBOb3RTdXNwZW5kZWQgPSAwLFxuICAgICAgU3VzcGVuZGVkT25FcnJvciA9IDEsXG4gICAgICBTdXNwZW5kZWRPbkRhdGEgPSAyLFxuICAgICAgU3VzcGVuZGVkT25JbW1lZGlhdGUgPSAzLFxuICAgICAgU3VzcGVuZGVkT25JbnN0YW5jZSA9IDQsXG4gICAgICBTdXNwZW5kZWRPbkluc3RhbmNlQW5kUmVhZHlUb0NvbnRpbnVlID0gNSxcbiAgICAgIFN1c3BlbmRlZE9uRGVwcmVjYXRlZFRocm93UHJvbWlzZSA9IDYsXG4gICAgICBTdXNwZW5kZWRBbmRSZWFkeVRvQ29udGludWUgPSA3LFxuICAgICAgU3VzcGVuZGVkT25IeWRyYXRpb24gPSA4LFxuICAgICAgU3VzcGVuZGVkT25BY3Rpb24gPSA5LFxuICAgICAgd29ya0luUHJvZ3Jlc3NTdXNwZW5kZWRSZWFzb24gPSBOb3RTdXNwZW5kZWQsXG4gICAgICB3b3JrSW5Qcm9ncmVzc1Rocm93blZhbHVlID0gbnVsbCxcbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdERpZFNraXBTdXNwZW5kZWRTaWJsaW5ncyA9ICExLFxuICAgICAgd29ya0luUHJvZ3Jlc3NSb290SXNQcmVyZW5kZXJpbmcgPSAhMSxcbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdERpZEF0dGFjaFBpbmdMaXN0ZW5lciA9ICExLFxuICAgICAgZW50YW5nbGVkUmVuZGVyTGFuZXMgPSAwLFxuICAgICAgd29ya0luUHJvZ3Jlc3NSb290RXhpdFN0YXR1cyA9IFJvb3RJblByb2dyZXNzLFxuICAgICAgd29ya0luUHJvZ3Jlc3NSb290U2tpcHBlZExhbmVzID0gMCxcbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdEludGVybGVhdmVkVXBkYXRlZExhbmVzID0gMCxcbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdFBpbmdlZExhbmVzID0gMCxcbiAgICAgIHdvcmtJblByb2dyZXNzRGVmZXJyZWRMYW5lID0gMCxcbiAgICAgIHdvcmtJblByb2dyZXNzU3VzcGVuZGVkUmV0cnlMYW5lcyA9IDAsXG4gICAgICB3b3JrSW5Qcm9ncmVzc1Jvb3RDb25jdXJyZW50RXJyb3JzID0gbnVsbCxcbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdFJlY292ZXJhYmxlRXJyb3JzID0gbnVsbCxcbiAgICAgIHdvcmtJblByb2dyZXNzUm9vdERpZEluY2x1ZGVSZWN1cnNpdmVSZW5kZXJVcGRhdGUgPSAhMSxcbiAgICAgIGdsb2JhbE1vc3RSZWNlbnRGYWxsYmFja1RpbWUgPSAwLFxuICAgICAgZ2xvYmFsTW9zdFJlY2VudFRyYW5zaXRpb25UaW1lID0gMCxcbiAgICAgIEZBTExCQUNLX1RIUk9UVExFX01TID0gMzAwLFxuICAgICAgd29ya0luUHJvZ3Jlc3NSb290UmVuZGVyVGFyZ2V0VGltZSA9IEluZmluaXR5LFxuICAgICAgUkVOREVSX1RJTUVPVVRfTVMgPSA1MDAsXG4gICAgICB3b3JrSW5Qcm9ncmVzc1RyYW5zaXRpb25zID0gbnVsbCxcbiAgICAgIHdvcmtJblByb2dyZXNzVXBkYXRlVGFzayA9IG51bGwsXG4gICAgICBsZWdhY3lFcnJvckJvdW5kYXJpZXNUaGF0QWxyZWFkeUZhaWxlZCA9IG51bGwsXG4gICAgICBJTU1FRElBVEVfQ09NTUlUID0gMCxcbiAgICAgIEFCT1JURURfVklFV19UUkFOU0lUSU9OX0NPTU1JVCA9IDEsXG4gICAgICBERUxBWUVEX1BBU1NJVkVfQ09NTUlUID0gMixcbiAgICAgIEFOSU1BVElPTl9TVEFSVEVEX0NPTU1JVCA9IDMsXG4gICAgICBOT19QRU5ESU5HX0VGRkVDVFMgPSAwLFxuICAgICAgUEVORElOR19NVVRBVElPTl9QSEFTRSA9IDEsXG4gICAgICBQRU5ESU5HX0xBWU9VVF9QSEFTRSA9IDIsXG4gICAgICBQRU5ESU5HX0FGVEVSX01VVEFUSU9OX1BIQVNFID0gMyxcbiAgICAgIFBFTkRJTkdfU1BBV05FRF9XT1JLID0gNCxcbiAgICAgIFBFTkRJTkdfUEFTU0lWRV9QSEFTRSA9IDUsXG4gICAgICBwZW5kaW5nRWZmZWN0c1N0YXR1cyA9IDAsXG4gICAgICBwZW5kaW5nRWZmZWN0c1Jvb3QgPSBudWxsLFxuICAgICAgcGVuZGluZ0ZpbmlzaGVkV29yayA9IG51bGwsXG4gICAgICBwZW5kaW5nRWZmZWN0c0xhbmVzID0gMCxcbiAgICAgIHBlbmRpbmdFZmZlY3RzUmVtYWluaW5nTGFuZXMgPSAwLFxuICAgICAgcGVuZGluZ0VmZmVjdHNSZW5kZXJFbmRUaW1lID0gLTAsXG4gICAgICBwZW5kaW5nUGFzc2l2ZVRyYW5zaXRpb25zID0gbnVsbCxcbiAgICAgIHBlbmRpbmdSZWNvdmVyYWJsZUVycm9ycyA9IG51bGwsXG4gICAgICBwZW5kaW5nVmlld1RyYW5zaXRpb24gPSBudWxsLFxuICAgICAgcGVuZGluZ1ZpZXdUcmFuc2l0aW9uRXZlbnRzID0gbnVsbCxcbiAgICAgIHBlbmRpbmdUcmFuc2l0aW9uVHlwZXMgPSBudWxsLFxuICAgICAgcGVuZGluZ1N1c3BlbmRlZENvbW1pdFJlYXNvbiA9IG51bGwsXG4gICAgICBwZW5kaW5nRGVsYXllZENvbW1pdFJlYXNvbiA9IElNTUVESUFURV9DT01NSVQsXG4gICAgICBwZW5kaW5nU3VzcGVuZGVkVmlld1RyYW5zaXRpb25SZWFzb24gPSBudWxsLFxuICAgICAgTkVTVEVEX1VQREFURV9MSU1JVCA9IDUwLFxuICAgICAgbmVzdGVkVXBkYXRlQ291bnQgPSAwLFxuICAgICAgcm9vdFdpdGhOZXN0ZWRVcGRhdGVzID0gbnVsbCxcbiAgICAgIGlzRmx1c2hpbmdQYXNzaXZlRWZmZWN0cyA9ICExLFxuICAgICAgZGlkU2NoZWR1bGVVcGRhdGVEdXJpbmdQYXNzaXZlRWZmZWN0cyA9ICExLFxuICAgICAgTkVTVEVEX1BBU1NJVkVfVVBEQVRFX0xJTUlUID0gNTAsXG4gICAgICBuZXN0ZWRQYXNzaXZlVXBkYXRlQ291bnQgPSAwLFxuICAgICAgcm9vdFdpdGhQYXNzaXZlTmVzdGVkVXBkYXRlcyA9IG51bGwsXG4gICAgICBpc1J1bm5pbmdJbnNlcnRpb25
15852FZmZlY3QgPSAhMSxcbiAgICAgIGRpZFdhcm5BYm91dEludGVycnVwdGVkVmlld1RyYW5zaXRpb25zID0gITEsXG4gICAgICBkaWRXYXJuU3RhdGVVcGRhdGVGb3JOb3RZZXRNb3VudGVkQ29tcG9uZW50ID0gbnVsbCxcbiAgICAgIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyID0gITE7XG4gICAgdmFyIGRpZFdhcm5BYm91dFVwZGF0ZUluUmVuZGVyRm9yQW5vdGhlckNvbXBvbmVudCA9IG5ldyBTZXQoKTtcbiAgICB2YXIgZmFrZUFjdENhbGxiYWNrTm9kZSQxID0ge30sXG4gICAgICBmaXJzdFNjaGVkdWxlZFJvb3QgPSBudWxsLFxuICAgICAgbGFzdFNjaGVkdWxlZFJvb3QgPSBudWxsLFxuICAgICAgZGlkU2NoZWR1bGVNaWNyb3Rhc2sgPSAhMSxcbiAgICAgIGRpZFNjaGVkdWxlTWljcm90YXNrX2FjdCA9ICExLFxuICAgICAgbWlnaHRIYXZlUGVuZGluZ1N5bmNXb3JrID0gITEsXG4gICAgICBpc0ZsdXNoaW5nV29yayA9ICExLFxuICAgICAgY3VycmVudEV2ZW50VHJhbnNpdGlvbkxhbmUgPSAwLFxuICAgICAgZmFrZUFjdENhbGxiYWNrTm9kZSA9IHt9O1xuICAgIChmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNpbXBsZUV2ZW50UGx1Z2luRXZlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBldmVudE5hbWUgPSBzaW1wbGVFdmVudFBsdWdpbkV2ZW50c1tpXSxcbiAgICAgICAgICBkb21FdmVudE5hbWUgPSBldmVudE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgZXZlbnROYW1lID0gZXZlbnROYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBldmVudE5hbWUuc2xpY2UoMSk7XG4gICAgICAgIHJlZ2lzdGVyU2ltcGxlRXZlbnQoZG9tRXZlbnROYW1lLCBcIm9uXCIgKyBldmVudE5hbWUpO1xuICAgICAgfVxuICAgICAgcmVnaXN0ZXJTaW1wbGVFdmVudChBTklNQVRJT05fRU5ELCBcIm9uQW5pbWF0aW9uRW5kXCIpO1xuICAgICAgcmVnaXN0ZXJTaW1wbGVFdmVudChBTklNQVRJT05fSVRFUkFUSU9OLCBcIm9uQW5pbWF0aW9uSXRlcmF0aW9uXCIpO1xuICAgICAgcmVnaXN0ZXJTaW1wbGVFdmVudChBTklNQVRJT05fU1RBUlQsIFwib25BbmltYXRpb25TdGFydFwiKTtcbiAgICAgIHJlZ2lzdGVyU2ltcGxlRXZlbnQoXCJkYmxjbGlja1wiLCBcIm9uRG91YmxlQ2xpY2tcIik7XG4gICAgICByZWdpc3RlclNpbXBsZUV2ZW50KFwiZm9jdXNpblwiLCBcIm9uRm9jdXNcIik7XG4gICAgICByZWdpc3RlclNpbXBsZUV2ZW50KFwiZm9jdXNvdXRcIiwgXCJvbkJsdXJcIik7XG4gICAgICByZWdpc3RlclNpbXBsZUV2ZW50KFRSQU5TSVRJT05fUlVOLCBcIm9uVHJhbnNpdGlvblJ1blwiKTtcbiAgICAgIHJlZ2lzdGVyU2ltcGxlRXZlbnQoVFJBTlNJVElPTl9TVEFSVCwgXCJvblRyYW5zaXRpb25TdGFydFwiKTtcbiAgICAgIHJlZ2lzdGVyU2ltcGxlRXZlbnQoVFJBTlNJVElPTl9DQU5DRUwsIFwib25UcmFuc2l0aW9uQ2FuY2VsXCIpO1xuICAgICAgcmVnaXN0ZXJTaW1wbGVFdmVudChUUkFOU0lUSU9OX0VORCwgXCJvblRyYW5zaXRpb25FbmRcIik7XG4gICAgfSkoKTtcbiAgICByZWdpc3RlckRpcmVjdEV2ZW50KFwib25Nb3VzZUVudGVyXCIsIFtcIm1vdXNlb3V0XCIsIFwibW91c2VvdmVyXCJdKTtcbiAgICByZWdpc3RlckRpcmVjdEV2ZW50KFwib25Nb3VzZUxlYXZlXCIsIFtcIm1vdXNlb3V0XCIsIFwibW91c2VvdmVyXCJdKTtcbiAgICByZWdpc3RlckRpcmVjdEV2ZW50KFwib25Qb2ludGVyRW50ZXJcIiwgW1wicG9pbnRlcm91dFwiLCBcInBvaW50ZXJvdmVyXCJdKTtcbiAgICByZWdpc3RlckRpcmVjdEV2ZW50KFwib25Qb2ludGVyTGVhdmVcIiwgW1wicG9pbnRlcm91dFwiLCBcInBvaW50ZXJvdmVyXCJdKTtcbiAgICByZWdpc3RlclR3b1BoYXNlRXZlbnQoXG4gICAgICBcIm9uQ2hhbmdlXCIsXG4gICAgICBcImNoYW5nZSBjbGljayBmb2N1c2luIGZvY3Vzb3V0IGlucHV0IGtleWRvd24ga2V5dXAgc2VsZWN0aW9uY2hhbmdlXCIuc3BsaXQoXG4gICAgICAgIFwiIFwiXG4gICAgICApXG4gICAgKTtcbiAgICByZWdpc3RlclR3b1BoYXNlRXZlbnQoXG4gICAgICBcIm9uU2VsZWN0XCIsXG4gICAgICBcImZvY3Vzb3V0IGNvbnRleHRtZW51IGRyYWdlbmQgZm9jdXNpbiBrZXlkb3duIGtleXVwIG1vdXNlZG93biBtb3VzZXVwIHNlbGVjdGlvbmNoYW5nZVwiLnNwbGl0KFxuICAgICAgICBcIiBcIlxuICAgICAgKVxuICAgICk7XG4gICAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KFwib25CZWZvcmVJbnB1dFwiLCBbXG4gICAgICBcImNvbXBvc2l0aW9uZW5kXCIsXG4gICAgICBcImtleXByZXNzXCIsXG4gICAgICBcInRleHRJbnB1dFwiLFxuICAgICAgXCJwYXN0ZVwiXG4gICAgXSk7XG4gICAgcmVnaXN0ZXJUd29QaGFzZUV2ZW50KFxuICAgICAgXCJvbkNvbXBvc2l0aW9uRW5kXCIsXG4gICAgICBcImNvbXBvc2l0aW9uZW5kIGZvY3Vzb3V0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duXCIuc3BsaXQoXCIgXCIpXG4gICAgKTtcbiAgICByZWdpc3RlclR3b1BoYXNlRXZlbnQoXG4gICAgICBcIm9uQ29tcG9zaXRpb25TdGFydFwiLFxuICAgICAgXCJjb21wb3NpdGlvbnN0YXJ0IGZvY3Vzb3V0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duXCIuc3BsaXQoXCIgXCIpXG4gICAgKTtcbiAgICByZWdpc3RlclR3b1BoYXNlRXZlbnQoXG4gICAgICBcIm9uQ29tcG9zaXRpb25VcGRhdGVcIixcbiAgICAgIFwiY29tcG9zaXRpb251cGRhdGUgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd25cIi5zcGxpdChcIiBcIilcbiAgICApO1xuICAgIHZhciBtZWRpYUV2ZW50VHlwZXMgPVxuICAgICAgICBcImFib3J0IGNhbnBsYXkgY2FucGxheXRocm91Z2ggZHVyYXRpb25jaGFuZ2UgZW1wdGllZCBlbmNyeXB0ZWQgZW5kZWQgZXJyb3IgbG9hZGVkZGF0YSBsb2FkZWRtZXRhZGF0YSBsb2Fkc3RhcnQgcGF1c2UgcGxheSBwbGF5aW5nIHByb2dyZXNzIHJhdGVjaGFuZ2UgcmVzaXplIHNlZWtlZCBzZWVraW5nIHN0YWxsZWQgc3VzcGVuZCB0aW1ldXBkYXRlIHZvbHVtZWNoYW5nZSB3YWl0aW5nXCIuc3BsaXQoXG4gICAgICAgICAgXCIgXCJcbiAgICAgICAgKSxcbiAgICAgIG5vbkRlbGVnYXRlZEV2ZW50cyA9IG5ldyBTZXQoXG4gICAgICAgIFwiYmVmb3JldG9nZ2xlIGNhbmNlbCBjbG9zZSBpbnZhbGlkIGxvYWQgc2Nyb2xsIHNjcm9sbGVuZCB0b2dnbGVcIlxuICAgICAgICAgIC5zcGxpdChcIiBcIilcbiAgICAgICAgICAuY29uY2F0KG1lZGlhRXZlbnRUeXBlcylcbiAgICAgICksXG4gICAgICBsaXN0ZW5pbmdNYXJrZXIgPSBcIl9yZWFjdExpc3RlbmluZ1wiICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiksXG4gICAgICBkaWRXYXJuQ29udHJvbGxlZFRvVW5jb250cm9sbGVkID0gITEsXG4gICAgICBkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkID0gITEsXG4gICAgICBkaWRXYXJuRm9ybUFjdGlvblR5cGUgPSAhMSxcbiAgICAgIGRpZFdhcm5Gb3JtQWN0aW9uTmFtZSA9ICExLFxuICAgICAgZGlkV2Fyb
15852kZvcm1BY3Rpb25UYXJnZXQgPSAhMSxcbiAgICAgIGRpZFdhcm5Gb3JtQWN0aW9uTWV0aG9kID0gITEsXG4gICAgICBkaWRXYXJuUG9wb3ZlclRhcmdldE9iamVjdCA9ICExO1xuICAgIHZhciBkaWRXYXJuRm9yTmV3Qm9vbGVhblByb3BzV2l0aEVtcHR5VmFsdWUgPSB7fTtcbiAgICB2YXIgTk9STUFMSVpFX05FV0xJTkVTX1JFR0VYID0gL1xcclxcbj8vZyxcbiAgICAgIE5PUk1BTElaRV9OVUxMX0FORF9SRVBMQUNFTUVOVF9SRUdFWCA9IC9cXHUwMDAwfFxcdUZGRkQvZyxcbiAgICAgIHhsaW5rTmFtZXNwYWNlID0gXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIsXG4gICAgICB4bWxOYW1lc3BhY2UgPSBcImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZVwiLFxuICAgICAgZW1wdHlQcm9wcyA9IHt9LFxuICAgICAgRVhQRUNURURfRk9STV9BQ1RJT05fVVJMID1cbiAgICAgICAgXCJqYXZhc2NyaXB0OnRocm93IG5ldyBFcnJvcignUmVhY3QgZm9ybSB1bmV4cGVjdGVkbHkgc3VibWl0dGVkLicpXCIsXG4gICAgICBTVVBQUkVTU19IWURSQVRJT05fV0FSTklORyA9IFwic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nXCIsXG4gICAgICBBQ1RJVklUWV9TVEFSVF9EQVRBID0gXCImXCIsXG4gICAgICBBQ1RJVklUWV9FTkRfREFUQSA9IFwiLyZcIixcbiAgICAgIFNVU1BFTlNFX1NUQVJUX0RBVEEgPSBcIiRcIixcbiAgICAgIFNVU1BFTlNFX0VORF9EQVRBID0gXCIvJFwiLFxuICAgICAgU1VTUEVOU0VfUEVORElOR19TVEFSVF9EQVRBID0gXCIkP1wiLFxuICAgICAgU1VTUEVOU0VfUVVFVUVEX1NUQVJUX0RBVEEgPSBcIiR+XCIsXG4gICAgICBTVVNQRU5TRV9GQUxMQkFDS19TVEFSVF9EQVRBID0gXCIkIVwiLFxuICAgICAgUFJFQU1CTEVfQ09OVFJJQlVUSU9OX0hUTUwgPSBcImh0bWxcIixcbiAgICAgIFBSRUFNQkxFX0NPTlRSSUJVVElPTl9CT0RZID0gXCJib2R5XCIsXG4gICAgICBQUkVBTUJMRV9DT05UUklCVVRJT05fSEVBRCA9IFwiaGVhZFwiLFxuICAgICAgRk9STV9TVEFURV9JU19NQVRDSElORyA9IFwiRiFcIixcbiAgICAgIEZPUk1fU1RBVEVfSVNfTk9UX01BVENISU5HID0gXCJGXCIsXG4gICAgICBET0NVTUVOVF9SRUFEWV9TVEFURV9MT0FESU5HID0gXCJsb2FkaW5nXCIsXG4gICAgICBTVFlMRSA9IFwic3R5bGVcIixcbiAgICAgIEhvc3RDb250ZXh0TmFtZXNwYWNlTm9uZSA9IDAsXG4gICAgICBIb3N0Q29udGV4dE5hbWVzcGFjZVN2ZyA9IDEsXG4gICAgICBIb3N0Q29udGV4dE5hbWVzcGFjZU1hdGggPSAyLFxuICAgICAgZXZlbnRzRW5hYmxlZCA9IG51bGwsXG4gICAgICBzZWxlY3Rpb25JbmZvcm1hdGlvbiA9IG51bGwsXG4gICAgICBkaWRXYXJuU2NyaXB0VGFncyA9ICExLFxuICAgICAgd2FybmVkVW5rbm93blRhZ3MgPSB7IGRpYWxvZzogITAsIHdlYnZpZXc6ICEwIH0sXG4gICAgICBjdXJyZW50UG9wc3RhdGVUcmFuc2l0aW9uRXZlbnQgPSBudWxsLFxuICAgICAgc2NoZWR1bGVyRXZlbnQgPSB2b2lkIDAsXG4gICAgICBzY2hlZHVsZVRpbWVvdXQgPSBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBzZXRUaW
158521lb3V0ID8gc2V0VGltZW91dCA6IHZvaWQgMCxcbiAgICAgIGNhbmNlbFRpbWVvdXQgPVxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBjbGVhclRpbWVvdXQgPyBjbGVhclRpbWVvdXQgOiB2b2lkIDAsXG4gICAgICBub1RpbWVvdXQgPSAtMSxcbiAgICAgIGxvY2FsUHJvbWlzZSA9IFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIFByb21pc2UgPyBQcm9taXNlIDogdm9pZCAwLFxuICAgICAgbG9jYWxSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPVxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICAgICAgICA/IHJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICAgIDogc2NoZWR1bGVUaW1lb3V0LFxuICAgICAgc2NoZWR1bGVNaWNyb3Rhc2sgPVxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBxdWV1ZU1pY3JvdGFza1xuICAgICAgICAgID8gcXVldWVNaWNyb3Rhc2tcbiAgICAgICAgICA6IFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBsb2NhbFByb21pc2VcbiAgICAgICAgICAgID8gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsUHJvbWlzZVxuICAgICAgICAgICAgICAgICAgLnJlc29sdmUobnVsbClcbiAgICAgICAgICAgICAgICAgIC50aGVuKGNhbGxiYWNrKVxuICAgICAgICAgICAgICAgICAgLmNhdGNoKGhhbmRsZUVycm9ySW5OZXh0VGljayk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogc2NoZWR1bGVUaW1lb3V0LFxuICAgICAgU1VTUEVOU0VZX0ZPTlRfQU5EX0lNQUdFX1RJTUVPVVQgPSA1MDA7XG4gICAgVmlld1RyYW5zaXRpb25Qc2V1ZG9FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlID0gZnVuY3Rpb24gKFxuICAgICAga2V5ZnJhbWVzLFxuICAgICAgb3B0aW9uc1xuICAgICkge1xuICAgICAgb3B0aW9ucyA9XG4gICAgICAgIFwibnVtYmVyXCIgPT09IHR5cGVvZiBvcHRpb25zXG4gICAgICAgICAgPyB7IGR1cmF0aW9uOiBvcHRpb25zIH1cbiAgICAgICAgICA6IGFzc2lnbih7fSwgb3B0aW9ucyk7XG4gICAgICBvcHRpb25zLnBzZXVkb0VsZW1lbnQgPSB0aGlzLl9zZWxlY3RvcjtcbiAgICAgIHJldHVybiB0aGlzLl9zY29wZS5hbmltYXRlKGtleWZyYW1lcywgb3B0aW9ucyk7XG4gICAgfTtcbiAgICBWaWV3VHJhbnNpdGlvblBzZXVkb0VsZW1lbnQucHJvdG90eXBlLmdldEFuaW1hdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKFxuICAgICAgICB2Y
15852XIgc2NvcGUgPSB0aGlzLl9zY29wZSxcbiAgICAgICAgICBzZWxlY3RvciA9IHRoaXMuX3NlbGVjdG9yLFxuICAgICAgICAgIGFuaW1hdGlvbnMgPSBzY29wZS5nZXRBbmltYXRpb25zKHsgc3VidHJlZTogITAgfSksXG4gICAgICAgICAgcmVzdWx0ID0gW10sXG4gICAgICAgICAgaSA9IDA7XG4gICAgICAgIGkgPCBhbmltYXRpb25zLmxlbmd0aDtcbiAgICAgICAgaSsrXG4gICAgICApIHtcbiAgICAgICAgdmFyIGVmZmVjdCA9IGFuaW1hdGlvbnNbaV0uZWZmZWN0O1xuICAgICAgICBudWxsICE9PSBlZmZlY3QgJiZcbiAgICAgICAgICBlZmZlY3QudGFyZ2V0ID09PSBzY29wZSAmJlxuICAgICAgICAgIGVmZmVjdC5wc2V1ZG9FbGVtZW50ID09PSBzZWxlY3RvciAmJlxuICAgICAgICAgIHJlc3VsdC5wdXNoKGFuaW1hdGlvbnNbaV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIFZpZXdUcmFuc2l0aW9uUHNldWRvRWxlbWVudC5wcm90b3R5cGUuZ2V0Q29tcHV0ZWRTdHlsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBnZXRDb21wdXRlZFN0eWxlKHRoaXMuX3Njb3BlLCB0aGlzLl9zZWxlY3Rvcik7XG4gICAgfTtcbiAgICBGcmFnbWVudEluc3RhbmNlLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKFxuICAgICAgdHlwZSxcbiAgICAgIGxpc3RlbmVyLFxuICAgICAgb3B0aW9uc09yVXNlQ2FwdHVyZVxuICAgICkge1xuICAgICAgdmFyIHNpZ25hbCA9IG51bGwsXG4gICAgICAgIGNsZWFudXAgPSBudWxsO1xuICAgICAgaWYgKFxuICAgICAgICBudWxsICE9IG9wdGlvbnNPclVzZUNhcHR1cmUgJiZcbiAgICAgICAgXCJib29sZWFuXCIgIT09IHR5cGVvZiBvcHRpb25zT3JVc2VDYXB0dXJlICYmXG4gICAgICAgICgoc2lnbmFsID0gb3B0aW9uc09yVXNlQ2FwdHVyZS5zaWduYWwgfHwgbnVsbCksXG4gICAgICAgIG51bGwgIT09IHNpZ25hbCAmJiBzaWduYWwuYWJvcnRlZClcbiAgICAgIClcbiAgICAgICAgcmV0dXJuO1xuICAgICAgbnVsbCA9PT0gdGhpcy5fZXZlbnRMaXN0ZW5lcnMgJiYgKHRoaXMuX2V2ZW50TGlzdGVuZXJzID0gW10pO1xuICAgICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50TGlzdGVuZXJzO1xuICAgICAgaWYgKFxuICAgICAgICAtMSA9PT1cbiAgICAgICAgaW5kZXhPZkV2ZW50TGlzdGVuZXIobGlzdGVuZXJzLCB0eXBlLCBsaXN0ZW5lciwgb3B0aW9uc09yVXNlQ2FwdHVyZSlcbiAgICAgICkge1xuICAgICAgICB2Y
15852XIgZnJhZ21lbnRJbnN0YW5jZSA9IHRoaXMsXG4gICAgICAgICAgYXR0YWNoZWRMaXN0ZW5lciA9IGxpc3RlbmVyO1xuICAgICAgICBudWxsICE9IG9wdGlvbnNPclVzZUNhcHR1cmUgJiZcbiAgICAgICAgICBcImJvb2xlYW5cIiAhPT0gdHlwZW9mIG9wdGlvbnNPclVzZUNhcHR1cmUgJiZcbiAgICAgICAgICAhMCA9PT0gb3B0aW9uc09yVXNlQ2FwdHVyZS5vbmNlICYmXG4gICAgICAgICAgKGF0dGFjaGVkTGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGZyYWdtZW50SW5zdGFuY2UucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgbGlzdGVuZXIsXG4gICAgICAgICAgICAgIG9wdGlvbnNPclVzZUNhcHR1cmVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBsaXN0ZW5lclxuICAgICAgICAgICAgICA/IGxpc3RlbmVyLmNhbGwodGhpcywgZXZlbnQpXG4gICAgICAgICAgICAgIDogbGlzdGVuZXIuaGFuZGxlRXZlbnQoZXZlbnQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICBudWxsICE9PSBzaWduYWwgJiZcbiAgICAgICAgICAoKGNsZWFudXAgPSBmcmFnbWVudEluc3RhbmNlLnJlbW92ZUV2ZW50TGlzdGVuZXIuYmluZChcbiAgICAgICAgICAgIGZyYWdtZW50SW5zdGFuY2UsXG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgbGlzdGVuZXIsXG4gICAgICAgICAgICBvcHRpb25zT3JVc2VDYXB0dXJlXG4gICAgICAgICAgKSksXG4gICAgICAgICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBjbGVhbnVwLCB7IG9uY2U6ICEwIH0pLFxuICAgICAgICAgIChjbGVhbnVwID0gc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIuYmluZChcbiAgICAgICAgICAgIHNpZ25hbCxcbiAgICAgICAgICAgIFwiYWJvcnRcIixcbiAgICAgICAgICAgIGNsZWFudXBcbiAgICAgICAgICApKSk7XG4gICAgICAgIHNpZ25hbCA9IGdldEF0dGFjaE9wdGlvbnMob3B0aW9uc09yVXNlQ2FwdHVyZSk7XG4gICAgICAgIGxpc3RlbmVycy5wdXNoKHtcbiAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgIGxpc3RlbmVyOiBsaXN0ZW5lcixcbiAgICAgICAgICBvcHRpb25zT3JVc2VDYXB0dXJlOiBvcHRpb25zT3JVc2VDYXB0dXJlLFxuICAgICAgICAgIGF0dGFjaGVkTGlzdGVuZXI6IGF0dGFjaGVkTGlzdGVuZXIsXG4gICAgICAgICAgY2xlYW51cDogY2xlYW51cFxuICAgICAgICB9KTtcbiAgICAgICAgdHJhdmVyc2VGcmFnbWVudEluc3RhbmNlc0FuZFRleHRJbnN0YW5jZXMoXG4gICAgICAgICAgdGhpcy5fZnJhZ21lbnRGaWJlcixcbiAgICAgICAgICBhZGRFdmVudExpc3RlbmVyVG9DaGlsZCxcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIGF0dGFjaGVkTGlzdGVuZXIsXG4gICAgICAgICAgc2lnbmFsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLl9ldmVudExpc3RlbmVycyA9IGxpc3RlbmVycztcbiAgICB9O1xuICAgIEZyYWdtZW50SW5zdGFuY2UucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAoXG4gICAgICB0eXBlLFxuICAgICAgbGlzdGVuZXIsXG4gICAgICBvcHRpb25zT3JVc2VDYXB0dXJlXG4gICAgKSB7XG4gICAgICB2Y
15852XIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRMaXN0ZW5lcnM7XG4gICAgICBpZiAoXG4gICAgICAgIG51bGwgIT09IGxpc3RlbmVycyAmJlxuICAgICAgICAoKGxpc3RlbmVyID0gaW5kZXhPZkV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgbGlzdGVuZXJzLFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgbGlzdGVuZXIsXG4gICAgICAgICAgb3B0aW9uc09yVXNlQ2FwdHVyZVxuICAgICAgICApKSxcbiAgICAgICAgLTEgIT09IGxpc3RlbmVyKVxuICAgICAgKSB7XG4gICAgICAgIHZhciBfbGlzdGVuZXJzJGluZGV4ID0gbGlzdGVuZXJzW2xpc3RlbmVyXTtcbiAgICAgICAgb3B0aW9uc09yVXNlQ2FwdHVyZSA9IF9saXN0ZW5lcnMkaW5kZXguYXR0YWNoZWRMaXN0ZW5lcjtcbiAgICAgICAgdmFyIGNsZWFudXAgPSBfbGlzdGVuZXJzJGluZGV4LmNsZWFudXA7XG4gICAgICAgIF9saXN0ZW5lcnMkaW5kZXggPSBnZXRBdHRhY2hPcHRpb25zKFxuICAgICAgICAgIF9saXN0ZW5lcnMkaW5kZXgub3B0aW9uc09yVXNlQ2FwdHVyZVxuICAgICAgICApO1xuICAgICAgICB0cmF2ZXJzZUZyYWdtZW50SW5zdGFuY2VzQW5kVGV4dEluc3RhbmNlcyhcbiAgICAgICAgICB0aGlzLl9mcmFnbWVudEZpYmVyLFxuICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJGcm9tQ2hpbGQsXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICBvcHRpb25zT3JVc2VDYXB0dXJlLFxuICAgICAgICAgIF9saXN0ZW5lcnMkaW5kZXhcbiAgICAgICAgKTtcbiAgICAgICAgbGlzdGVuZXJzLnNwbGljZShsaXN0ZW5lciwgMSk7XG4gICAgICAgIG51bGwgIT09IGNsZWFudXAgJiYgY2xlYW51cCgpO1xuICAgICAgfVxuICAgIH07XG4gICAgRnJhZ21lbnRJbnN0YW5jZS5wcm90b3R5cGUuZGlzcGF0Y2hFdmVudCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgdmFyIHBhcmVudEhvc3RGaWJlciA9IGdldEZyYWdtZW50UGFyZW50SW5zdGFuY2VPckNvbnRhaW5lckZpYmVyKFxuICAgICAgICB0aGlzLl9mcmFnbWVudEZpYmVyXG4gICAgICApO1xuICAgICAgaWYgKG51bGwgPT09IHBhcmVudEhvc3RGaWJlcikgcmV0dXJuICEwO1xuICAgICAgcGFyZW50SG9zdEZpYmVyID0gZ2V0SW5zdGFuY2VGcm9tSG9zdEZpYmVyKHBhcmVudEhvc3RGaWJlcik7XG4gICAgICB2Y
15852XIgZXZlbnRMaXN0ZW5lcnMgPSB0aGlzLl9ldmVudExpc3RlbmVycztcbiAgICAgIGlmIChcbiAgICAgICAgKG51bGwgIT09IGV2ZW50TGlzdGVuZXJzICYmIDAgPCBldmVudExpc3RlbmVycy5sZW5ndGgpIHx8XG4gICAgICAgICFldmVudC5idWJibGVzXG4gICAgICApIHtcbiAgICAgICAgdmFyIHRlbXAgPVxuICAgICAgICAgIDkgPT09IHBhcmVudEhvc3RGaWJlci5ub2RlVHlwZVxuICAgICAgICAgICAgPyBwYXJlbnRIb3N0RmliZXIuY3JlYXRlQ29tbWVudChcIlwiKVxuICAgICAgICAgICAgOiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKTtcbiAgICAgICAgaWYgKGV2ZW50TGlzdGVuZXJzKVxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBfZXZlbnRMaXN0ZW5lcnMkaSA9IGV2ZW50TGlzdGVuZXJzW2ldO1xuICAgICAgICAgICAgdGVtcC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgICBfZXZlbnRMaXN0ZW5lcnMkaS50eXBlLFxuICAgICAgICAgICAgICBfZXZlbnRMaXN0ZW5lcnMkaS5hdHRhY2hlZExpc3RlbmVyLFxuICAgICAgICAgICAgICBnZXRBdHRhY2hPcHRpb25zKF9ldmVudExpc3RlbmVycyRpLm9wdGlvbnNPclVzZUNhcHR1cmUpXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgcGFyZW50SG9zdEZpYmVyLmFwcGVuZENoaWxkKHRlbXApO1xuICAgICAgICBldmVudCA9IHRlbXAuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgIGlmIChldmVudExpc3RlbmVycylcbiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZXZlbnRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAoX2V2ZW50TGlzdGVuZXJzJGkgPSBldmVudExpc3RlbmVyc1tpXSksXG4gICAgICAgICAgICAgIHRlbXAucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgICBfZXZlbnRMaXN0ZW5lcnMkaS50eXBlLFxuICAgICAgICAgICAgICAgIF9ldmVudExpc3RlbmVycyRpLmF0dGFjaGVkTGlzdGVuZXIsXG4gICAgICAgICAgICAgICAgZ2V0QXR0YWNoT3B0aW9ucyhfZXZlbnRMaXN0ZW5lcnMkaS5vcHRpb25zT3JVc2VDYXB0dXJlKVxuICAgICAgICAgICAgICApO1xuICAgICAgICBwYXJlbnRIb3N0RmliZXIucmVtb3ZlQ2hpbGQodGVtcCk7XG4gICAgICAgIHJldHVybiBldmVudDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXJlbnRIb3N0RmliZXIuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgfTtcbiAgICBGcmFnbWVudEluc3RhbmNlLnByb3RvdHlwZS5mb2N1cyA9IGZ1bmN0aW9uIChmb2N1c09wdGlvbnMpIHtcbiAgICAgIHRyYXZlcnNlVmlzaWJsZUluc3RhbmNlc0FuZFRleHRJbnN0YW5jZXMoXG4gICAgICAgIHRoaXMuX2ZyYWdtZW50RmliZXIuY2hpbGQsXG4gICAgICAgICEwLFxuICAgICAgICBzZXRGb2N1c09uRmliZXJJZkZvY3VzYWJsZSxcbiAgICAgICAgZm9jdXNPcHRpb25zLFxuICAgICAgICB2b2lkIDAsXG4gICAgICAgIHZvaWQgMFxuICAgICAgKTtcbiAgICB9O1xuICAgIEZyYWdtZW50SW5zdGFuY2UucHJvdG90eXBlLmZvY3VzTGFzdCA9IGZ1bmN0aW9uIChmb2N1c09wdGlvbnMpIHtcbiAgICAgIHZhciBjaGlsZHJlbiA9IFtdO1xuICAgICAgdHJhdmVyc2VWaXNpYmxlSW5zdGFuY2VzQW5kVGV4dEluc3RhbmNlcyhcbiAgICAgICAgdGhpcy5fZnJhZ21lbnRGaWJlci5jaGlsZCxcbiAgICAgICAgITAsXG4gICAgICAgIGNvbGxlY3RDaGlsZHJlbixcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgIHZvaWQgMCxcbiAgICAgICAgdm9pZCAwXG4gICAgICApO1xuICAgICAgZm9yIChcbiAgICAgICAgdmFyIGkgPSBjaGlsZHJlbi5sZW5ndGggLSAxO1xuICAgICAgICAwIDw9IGkgJiYgIXNldEZvY3VzT25GaWJlcklmRm9jdXNhYmxlKGNoaWxkcmVuW2ldLCBmb2N1c09wdGlvbnMpO1xuICAgICAgICBpLS1cbiAgICAgICk7XG4gICAgfTtcbiAgICBGcmFnbWVudEluc3RhbmNlLnByb3RvdHlwZS5ibHVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHBhcmVudEhvc3RGaWJlciA9IGdldEZyYWdtZW50UGFyZW50SW5zdGFuY2VPckNvbnRhaW5lckZpYmVyKFxuICAgICAgICB0aGlzLl9mcmFnbWVudEZpYmVyXG4gICAgICApO1xuICAgICAgbnVsbCAhPT0gcGFyZW50SG9zdEZpYmVyICYmXG4gICAgICAgICgocGFyZW50SG9zdEZpYmVyID0gZ2V0SW5zdGFuY2VGcm9tSG9zdEZpYmVyKHBhcmVudEhvc3RGaWJlcikpLFxuICAgICAgICAocGFyZW50SG9zdEZpYmVyID1cbiAgICAgICAgICBnZXRPd25lckRvY3VtZW50RnJvbVJvb3RDb250YWluZXIocGFyZW50SG9zdEZpYmVyKS5hY3RpdmVFbGVtZW50KSxcbiAgICAgICAgbnVsbCAhPT0gcGFyZW50SG9zdEZpYmVyICYmXG4gICAgICAgICAgdHJhdmVyc2VGcmFnbWVudEluc3RhbmNlc0FuZFRleHRJbnN0YW5jZXMoXG4gICAgICAgICAgICB0aGlzLl9mcmFnbWVudEZpYmVyLFxuICAgICAgICAgICAgYmx1ckFjdGl2ZUVsZW1lbnRXaXRoaW5GcmFnbWVudCxcbiAgICAgICAgICAgIHBhcmVudEhvc3RGaWJlclxuICAgICAgICAgICkpO1xuICAgIH07XG4gICAgRnJhZ21lbnRJbnN0YW5jZS5wcm90b3R5cGUub2JzZXJ2ZVVzaW5nID0gZnVuY3Rpb24gKG9ic2VydmVyKSB7XG4gICAgICB2Y
15852XIgaGFzVGV4dCA9ICExLFxuICAgICAgICBoYXNFbGVtZW50ID0gITE7XG4gICAgICB0cmF2ZXJzZUZyYWdtZW50SW5zdGFuY2VzQW5kVGV4dEluc3RhbmNlcyhcbiAgICAgICAgdGhpcy5fZnJhZ21lbnRGaWJlcixcbiAgICAgICAgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgaWYgKDYgPT09IGNoaWxkLnRhZykgaGFzVGV4dCA9ICEwO1xuICAgICAgICAgIGVsc2UgcmV0dXJuIChoYXNFbGVtZW50ID0gITApO1xuICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGhhc1RleHQgJiZcbiAgICAgICAgIWhhc0VsZW1lbnQgJiZcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBcIm9ic2VydmVVc2luZygpIHdhcyBjYWxsZWQgb24gYSBGcmFnbWVudEluc3RhbmNlIHdpdGggb25seSB0ZXh0IGNoaWxkcmVuLiBPYnNlcnZlcnMgZG8gbm90IHdvcmsgb24gdGV4dCBub2Rlcy5cIlxuICAgICAgICApO1xuICAgICAgbnVsbCA9PT0gdGhpcy5fb2JzZXJ2ZXJzICYmICh0aGlzLl9vYnNlcnZlcnMgPSBuZXcgU2V0KCkpO1xuICAgICAgdGhpcy5fb2JzZXJ2ZXJzLmFkZChvYnNlcnZlcik7XG4gICAgICB0cmF2ZXJzZUZyYWdtZW50SW5zdGFuY2VzQW5kVGV4dEluc3RhbmNlcyhcbiAgICAgICAgdGhpcy5fZnJhZ21lbnRGaWJlcixcbiAgICAgICAgb2JzZXJ2ZUNoaWxkLFxuICAgICAgICBvYnNlcnZlclxuICAgICAgKTtcbiAgICB9O1xuICAgIEZyYWdtZW50SW5zdGFuY2UucHJvdG90eXBlLnVub2JzZXJ2ZVVzaW5nID0gZnVuY3Rpb24gKG9ic2VydmVyKSB7XG4gICAgICB2Y
15852XIgb2JzZXJ2ZXJzID0gdGhpcy5fb2JzZXJ2ZXJzO1xuICAgICAgaWYgKG51bGwgIT09IG9ic2VydmVycyAmJiBvYnNlcnZlcnMuaGFzKG9ic2VydmVyKSkge1xuICAgICAgICBvYnNlcnZlcnMuZGVsZXRlKG9ic2VydmVyKTtcbiAgICAgICAgdHJhdmVyc2VGcmFnbWVudEluc3RhbmNlc0FuZFRleHRJbnN0YW5jZXMoXG4gICAgICAgICAgdGhpcy5fZnJhZ21lbnRGaWJlcixcbiAgICAgICAgICB1bm9ic2VydmVDaGlsZCxcbiAgICAgICAgICBvYnNlcnZlclxuICAgICAgICApO1xuICAgICAgICBmb3IgKFxuICAgICAgICAgIHZhciBpID0gKG9ic2VydmVycyA9IDApO1xuICAgICAgICAgIGkgPCBwZW5kaW5nSW50ZXJzZWN0aW9uVW5vYnNlcnZlcy5sZW5ndGg7XG4gICAgICAgICAgaSsrXG4gICAgICAgICkge1xuICAgICAgICAgIHZhciBwZW5kaW5nID0gcGVuZGluZ0ludGVyc2VjdGlvblVub2JzZXJ2ZXNbaV07XG4gICAgICAgICAgcGVuZGluZy5mcmFnbWVudEluc3RhbmNlID09PSB0aGlzICYmIHBlbmRpbmcub2JzZXJ2ZXIgPT09IG9ic2VydmVyXG4gICAgICAgICAgICA/IG9ic2VydmVyLnVub2JzZXJ2ZShwZW5kaW5nLmluc3RhbmNlKVxuICAgICAgICAgICAgOiAocGVuZGluZ0ludGVyc2VjdGlvblVub2JzZXJ2ZXNbb2JzZXJ2ZXJzKytdID0gcGVuZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgcGVuZGluZ0ludGVyc2VjdGlvblVub2JzZXJ2ZXMubGVuZ3RoID0gb2JzZXJ2ZXJzO1xuICAgICAgfSBlbHNlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJZb3UgYXJlIGNhbGxpbmcgdW5vYnNlcnZlVXNpbmcoKSB3aXRoIGFuIG9ic2VydmVyIHRoYXQgaXMgbm90IGJlaW5nIG9ic2VydmVkIHdpdGggdGhpcyBmcmFnbWVudCBpbnN0YW5jZS4gRmlyc3QgYXR0YWNoIHRoZSBvYnNlcnZlciB3aXRoIG9ic2VydmVVc2luZygpXCJcbiAgICAgICAgKTtcbiAgICB9O1xuICAgIHZhciBwZW5kaW5nSW50ZXJzZWN0aW9uVW5vYnNlcnZlcyA9IFtdLFxuICAgICAgaW50ZXJzZWN0aW9uVW5vYnNlcnZlU2NoZWR1bGVkID0gITE7XG4gICAgRnJhZ21lbnRJbnN0YW5jZS5wcm90b3R5cGUuZ2V0Q2xpZW50UmVjdHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2Y
15852XIgcmVjdHMgPSBbXTtcbiAgICAgIHRyYXZlcnNlRnJhZ21lbnRJbnN0YW5jZXNBbmRUZXh0SW5zdGFuY2VzKFxuICAgICAgICB0aGlzLl9mcmFnbWVudEZpYmVyLFxuICAgICAgICBjb2xsZWN0Q2xpZW50UmVjdHMsXG4gICAgICAgIHJlY3RzXG4gICAgICApO1xuICAgICAgcmV0dXJuIHJlY3RzO1xuICAgIH07XG4gICAgRnJhZ21lbnRJbnN0YW5jZS5wcm90b3R5cGUuZ2V0Um9vdE5vZGUgPSBmdW5jdGlvbiAoZ2V0Um9vdE5vZGVPcHRpb25zKSB7XG4gICAgICB2YXIgcGFyZW50SG9zdEZpYmVyID0gZ2V0RnJhZ21lbnRQYXJlbnRJbnN0YW5jZU9yQ29udGFpbmVyRmliZXIoXG4gICAgICAgIHRoaXMuX2ZyYWdtZW50RmliZXJcbiAgICAgICk7XG4gICAgICByZXR1cm4gbnVsbCA9PT0gcGFyZW50SG9zdEZpYmVyXG4gICAgICAgID8gdGhpc1xuICAgICAgICA6IGdldEluc3RhbmNlRnJvbUhvc3RGaWJlcihwYXJlbnRIb3N0RmliZXIpLmdldFJvb3ROb2RlKFxuICAgICAgICAgICAgZ2V0Um9vdE5vZGVPcHRpb25zXG4gICAgICAgICAgKTtcbiAgICB9O1xuICAgIEZyYWdtZW50SW5zdGFuY2UucHJvdG90eXBlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uID0gZnVuY3Rpb24gKG90aGVyTm9kZSkge1xuICAgICAgdmFyIHBhcmVudEhvc3RGaWJlciA9IGdldEZyYWdtZW50UGFyZW50SW5zdGFuY2VPckNvbnRhaW5lckZpYmVyKFxuICAgICAgICB0aGlzLl9mcmFnbWVudEZpYmVyXG4gICAgICApO1xuICAgICAgaWYgKG51bGwgPT09IHBhcmVudEhvc3RGaWJlcikgcmV0dXJuIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRElTQ09OTkVDVEVEO1xuICAgICAgdmFyIGNoaWxkcmVuID0gW107XG4gICAgICB0cmF2ZXJzZUZyYWdtZW50SW5zdGFuY2VzQW5kVGV4dEluc3RhbmNlcyhcbiAgICAgICAgdGhpcy5fZnJhZ21lbnRGaWJlcixcbiAgICAgICAgY29sbGVjdENoaWxkcmVuLFxuICAgICAgICBjaGlsZHJlblxuICAgICAgKTtcbiAgICAgIHZhciBwYXJlbnRIb3N0SW5zdGFuY2UgPSBnZXRJbnN0YW5jZUZyb21Ib3N0RmliZXIocGFyZW50SG9zdEZpYmVyKTtcbiAgICAgIGlmICgwID09PSBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgcGFyZW50SG9zdEZpYmVyID0gcGFyZW50SG9zdEluc3RhbmNlO1xuICAgICAgICBpZiAoZmliZXJJc1BvcnRhbGVkSW50b0hvc3QodGhpcy5fZnJhZ21lbnRGaWJlcikpIHtcbiAgICAgICAgICBhOiB7XG4gICAgICAgICAgICBmb3IgKGNoaWxkcmVuID0gdGhpcy5fZnJhZ21lbnRGaWJlci5yZXR1cm47IG51bGwgIT09IGNoaWxkcmVuOyApIHtcbiAgICAgICAgICAgICAgaWYgKDQgPT09IGNoaWxkcmVuLnRhZykge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4uc3RhdGVOb2RlLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgICAgICAgYnJlYWsgYTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgMyA9PT0gY2hpbGRyZW4udGFnIHx8XG4gICAgICAgICAgICAgICAgNSA9PT0gY2hpbGRyZW4udGFnIHx8XG4gICAgICAgICAgICAgICAgMjcgPT09IGNoaWxkcmVuLnRhZ1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4ucmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2hpbGRyZW4gPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBudWxsICE9IGNoaWxkcmVuICYmIChwYXJlbnRIb3N0RmliZXIgPSBjaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICAgICAgY2hpbGRyZW4gPSB0aGlzLl9mcmFnbWVudEZpYmVyO1xuICAgICAgICB2Y
15852XIgcmVzdWx0ID0gKHBhcmVudEhvc3RJbnN0YW5jZSA9XG4gICAgICAgICAgcGFyZW50SG9zdEZpYmVyLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG90aGVyTm9kZSkpO1xuICAgICAgICBwYXJlbnRIb3N0RmliZXIgPT09IG90aGVyTm9kZVxuICAgICAgICAgID8gKHJlc3VsdCA9IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTlMpXG4gICAgICAgICAgOiBwYXJlbnRIb3N0SW5zdGFuY2UgJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5FRF9CWSAmJlxuICAgICAgICAgICAgKChjaGlsZHJlbiA9XG4gICAgICAgICAgICAgIGdldEZyYWdtZW50SW5zdGFuY2VPclRleHRJbnN0YW5jZVNpYmxpbmdzKGNoaWxkcmVuKVsxXSksXG4gICAgICAgICAgICBudWxsID09PSBjaGlsZHJlblxuICAgICAgICAgICAgICA/IChyZXN1bHQgPSBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElORylcbiAgICAgICAgICAgICAgOiAoKG90aGVyTm9kZSA9XG4gICAgICAgICAgICAgICAgICBnZXRJbnN0YW5jZUZyb21Ib3N0RmliZXIoY2hpbGRyZW4pLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKFxuICAgICAgICAgICAgICAgICAgICBvdGhlck5vZGVcbiAgICAgICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICAgIChyZXN1bHQgPVxuICAgICAgICAgICAgICAgICAgMCA9PT0gb3RoZXJOb2RlIHx8XG4gICAgICAgICAgICAgICAgICBvdGhlck5vZGUgJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lOR1xuICAgICAgICAgICAgICAgICAgICA/IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HXG4gICAgICAgICAgICAgICAgICAgIDogTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkcpKSk7XG4gICAgICAgIHJldHVybiAocmVzdWx0IHw9IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fSU1QTEVNRU5UQVRJT05fU1BFQ0lGSUMpO1xuICAgICAgfVxuICAgICAgcGFyZW50SG9zdEZpYmVyID0gZ2V0SW5zdGFuY2VGcm9tSG9zdEZpYmVyKGNoaWxkcmVuWzBdKTtcbiAgICAgIHJlc3VsdCA9IGdldEluc3RhbmNlRnJvbUhvc3RGaWJlcihjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXSk7XG4gICAgICB2Y
15852XIgcGFyZW50SG9zdEluc3RhbmNlRnJvbURPTSA9IGZpYmVySXNQb3J0YWxlZEludG9Ib3N0KFxuICAgICAgICB0aGlzLl9mcmFnbWVudEZpYmVyXG4gICAgICApXG4gICAgICAgID8gcGFyZW50SG9zdEZpYmVyLnBhcmVudEVsZW1lbnRcbiAgICAgICAgOiBwYXJlbnRIb3N0SW5zdGFuY2U7XG4gICAgICBpZiAobnVsbCA9PSBwYXJlbnRIb3N0SW5zdGFuY2VGcm9tRE9NKVxuICAgICAgICByZXR1cm4gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9ESVNDT05ORUNURUQ7XG4gICAgICBwYXJlbnRIb3N0SW5zdGFuY2UgPVxuICAgICAgICBwYXJlbnRIb3N0SW5zdGFuY2VGcm9tRE9NLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHBhcmVudEhvc3RGaWJlcikgJlxuICAgICAgICBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5FRF9CWTtcbiAgICAgIHBhcmVudEhvc3RJbnN0YW5jZUZyb21ET00gPVxuICAgICAgICBwYXJlbnRIb3N0SW5zdGFuY2VGcm9tRE9NLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHJlc3VsdCkgJlxuICAgICAgICBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5FRF9CWTtcbiAgICAgIHZhciBmaXJzdFJlc3VsdCA9IHBhcmVudEhvc3RGaWJlci5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihvdGhlck5vZGUpLFxuICAgICAgICBsYXN0UmVzdWx0ID0gcmVzdWx0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG90aGVyTm9kZSksXG4gICAgICAgIG90aGVyTm9kZUlzV2l0aGluRmlyc3RPckxhc3RDaGlsZCA9XG4gICAgICAgICAgZmlyc3RSZXN1bHQgJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5FRF9CWSB8fFxuICAgICAgICAgIGxhc3RSZXN1bHQgJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5FRF9CWTtcbiAgICAgIGxhc3RSZXN1bHQgPVxuICAgICAgICBwYXJlbnRIb3N0SW5zdGFuY2UgJiZcbiAgICAgICAgcGFyZW50SG9zdEluc3RhbmNlRnJvbURPTSAmJlxuICAgICAgICBmaXJzdFJlc3VsdCAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HICYmXG4gICAgICAgIGxhc3RSZXN1bHQgJiBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElORztcbiAgICAgIHBhcmVudEhvc3RGaWJlciA9XG4gICAgICAgIChwYXJlbnRIb3N0SW5zdGFuY2UgJiYgcGFyZW50SG9zdEZpYmVyID09PSBvdGhlck5vZGUpIHx8XG4gICAgICAgIChwYXJlbnRIb3N0SW5zdGFuY2VGcm9tRE9NICYmIHJlc3VsdCA9PT0gb3RoZXJOb2RlKSB8fFxuICAgICAgICBvdGhlck5vZGVJc1dpdGhpbkZpcnN0T3JMYXN0Q2hpbGQgfHxcbiAgICAgICAgbGFzdFJlc3VsdFxuICAgICAgICAgID8gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQllcbiAgICAgICAgICA6ICghcGFyZW50SG9zdEluc3RhbmNlICYmIHBhcmVudEhvc3RGaWJlciA9PT0gb3RoZXJOb2RlKSB8fFxuICAgICAgICAgICAgICAoIXBhcmVudEhvc3RJbnN0YW5jZUZyb21ET00gJiYgcmVzdWx0ID09PSBvdGhlck5vZGUpXG4gICAgICAgICAgICA/IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fSU1QTEVNRU5UQVRJT05fU1BFQ0lGSUNcbiAgICAgICAgICAgIDogZmlyc3RSZXN1bHQ7XG4gICAgICByZXR1cm4gcGFyZW50SG9zdEZpYmVyICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9ESVNDT05ORUNURUQgfHxcbiAgICAgICAgcGFyZW50SG9zdEZpYmVyICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9JTVBMRU1
15852FTlRBVElPTl9TUEVDSUZJQyB8fFxuICAgICAgICB2YWxpZGF0ZURvY3VtZW50UG9zaXRpb25XaXRoRmliZXJUcmVlKFxuICAgICAgICAgIHBhcmVudEhvc3RGaWJlcixcbiAgICAgICAgICB0aGlzLl9mcmFnbWVudEZpYmVyLFxuICAgICAgICAgIGNoaWxkcmVuWzBdLFxuICAgICAgICAgIGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdLFxuICAgICAgICAgIG90aGVyTm9kZVxuICAgICAgICApXG4gICAgICAgID8gcGFyZW50SG9zdEZpYmVyXG4gICAgICAgIDogTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9JTVBMRU1FTlRBVElPTl9TUEVDSUZJQztcbiAgICB9O1xuICAgIEZyYWdtZW50SW5zdGFuY2UucHJvdG90eXBlLnNjcm9sbEludG9WaWV3ID0gZnVuY3Rpb24gKGFsaWduVG9Ub3ApIHtcbiAgICAgIGlmIChcIm9iamVjdFwiID09PSB0eXBlb2YgYWxpZ25Ub1RvcClcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgXCJGcmFnbWVudEluc3RhbmNlLnNjcm9sbEludG9WaWV3KCkgZG9lcyBub3Qgc3VwcG9ydCBzY3JvbGxJbnRvVmlld09wdGlvbnMuIFVzZSB0aGUgYWxpZ25Ub1RvcCBib29sZWFuIGluc3RlYWQuXCJcbiAgICAgICAgKTtcbiAgICAgIHZhciBjaGlsZHJlbiA9IFtdO1xuICAgICAgdHJhdmVyc2VGcmFnbWVudEluc3RhbmNlc0FuZFRleHRJbnN0YW5jZXMoXG4gICAgICAgIHRoaXMuX2ZyYWdtZW50RmliZXIsXG4gICAgICAgIGNvbGxlY3RDaGlsZHJlbixcbiAgICAgICAgY2hpbGRyZW5cbiAgICAgICk7XG4gICAgICB2YXIgcmVzb2x2ZWRBbGlnblRvVG9wID0gITEgIT09IGFsaWduVG9Ub3A7XG4gICAgICBpZiAoMCA9PT0gY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgIHZhciBob3N0U2libGluZ3MgPSBnZXRGcmFnbWVudEluc3RhbmNlT3JUZXh0SW5zdGFuY2VTaWJsaW5ncyhcbiAgICAgICAgICB0aGlzLl9mcmFnbWVudEZpYmVyXG4gICAgICAgICk7XG4gICAgICAgIGhvc3RTaWJsaW5ncyA9IHJlc29sdmVkQWxpZ25Ub1RvcFxuICAgICAgICAgID8gaG9zdFNpYmxpbmdzWzFdIHx8XG4gICAgICAgICAgICBob3N0U2libGluZ3NbMF0gfHxcbiAgICAgICAgICAgIGdldEZyYWdtZW50UGFyZW50SW5zdGFuY2VPckNvbnRhaW5lckZpYmVyKHRoaXMuX2ZyYWdtZW50RmliZXIpXG4gICAgICAgICAgOiBob3N0U2libGluZ3NbMF0gfHwgaG9zdFNpYmxpbmdzWzFdO1xuICAgICAgICBpZiAobnVsbCA9PT0gaG9zdFNpYmxpbmdzKSByZXR1cm47XG4gICAgICAgIGlmICg2ID09PSBob3N0U2libGluZ3MudGFnKSB7XG4gICAgICAgICAgYWxpZ25Ub1RvcCA9IGdldEluc3RhbmNlRnJvbUhvc3RGaWJlcihob3N0U2libGluZ3MpO1xuICAgICAgICAgIHNjcm9sbFRleHROb2RlSW50b1ZpZXcoYWxpZ25Ub1RvcCwgcmVzb2x2ZWRBbGlnblRvVG9wKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaG9zdFNpYmxpbmdzID0gZ2V0SW5zdGFuY2VGcm9tSG9zdEZpYmVyKGhvc3RTaWJsaW5ncyk7XG4gICAgICAgIGlmICg5ICE9PSBob3N0U2libGluZ3Mubm9kZVR5cGUpIHtcbiAgICAgICAgICBpZiAoMTEgPT09IGhvc3RTaWJsaW5ncy5ub2RlVHlwZSkge1xuICAgICAgICAgICAgcmVzb2x2ZWRBbGlnblRvVG9wID1cbiAgICAgICAgICAgICAgXCJob3N0XCIgaW4gaG9zdFNpYmxpbmdzID8gaG9zdFNpYmxpbmdzLmhvc3QgOiBudWxsO1xuICAgICAgICAgICAgbnVsbCAhPT0gcmVzb2x2ZWRBbGlnblRvVG9wXG4gICAgICAgICAgICAgID8gcmVzb2x2ZWRBbGlnblRvVG9wLnNjcm9sbEludG9WaWV3KGFsaWduVG9Ub3ApXG4gICAgICAgICAgICAgIDogY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgXCJZb3UgYXJlIGF0dGVtcHRpbmcgdG8gc2Nyb2xsIGEgRnJhZ21lbnRJbnN0YW5jZSB0aGF0IGlzIG9ubHkgbW91bnRlZCBpbnNpZGUgYSBkZXRhY2hlZCBEb2N1bWVudEZyYWdtZW50LiBObyBzY3JvbGwgd2FzIHBlcmZvcm1lZC5cIlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGhvc3RTaWJsaW5ncy5zY3JvbGxJbnRvVmlldyhhbGlnblRvVG9wKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yIChcbiAgICAgICAgaG9zdFNpYmxpbmdzID0gcmVzb2x2ZWRBbGlnblRvVG9wID8gY2hpbGRyZW4ubGVuZ3RoIC0gMSA6IDA7XG4gICAgICAgIGhvc3RTaWJsaW5ncyAhPT0gKHJlc29sdmVkQWxpZ25Ub1RvcCA/IC0xIDogY2hpbGRyZW4ubGVuZ3RoKTtcblxuICAgICAgKSB7XG4gICAgICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2hvc3RTaWJsaW5nc107XG4gICAgICAgIDYgPT09IGNoaWxkLnRhZ1xuICAgICAgICAgID8gKChjaGlsZCA9IGdldEluc3RhbmNlRnJvbUhvc3RGaWJlcihjaGlsZCkpLFxuICAgICAgICAgICAgc2Nyb2xsVGV4dE5vZGVJbnRvVmlldyhjaGlsZCwgcmVzb2x2ZWRBbGlnblRvVG9wKSlcbiAgICAgICAgICA6IGdldEluc3RhbmNlRnJvbUhvc3RGaWJlcihjaGlsZCkuc2Nyb2xsSW50b1ZpZXcoYWxpZ25Ub1RvcCk7XG4gICAgICAgIGhvc3RTaWJsaW5ncyArPSByZXNvbHZlZEFsaWduVG9Ub3AgPyAtMSA6IDE7XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgcHJldmlvdXNIeWRyYXRhYmxlT25FbnRlcmluZ1Njb3BlZFNpbmdsZXRvbiA9IG51bGwsXG4gICAgICBOb3RMb2FkZWQgPSAwLFxuICAgICAgTG9hZGVkID0gMSxcbiAgICAgIEVycm9yZWQgPSAyLFxuICAgICAgU2V0dGxlZCA9IDMsXG4gICAgICBJbnNlcnRlZCA9IDQsXG4gICAgICBwcmVsb2FkUHJvcHNNYXAgPSBuZXcgTWFwKCksXG4gICAgICBwcmVjb25uZWN0c1NldCA9IG5ldyBTZXQoKSxcbiAgICAgIHByZXZpb3VzRGlzcGF0Y2hlciA9IFJlYWN0RE9NU2hhcmVkSW50ZXJuYWxzLmQ7XG4gICAgUmVhY3RET01TaGFyZWRJbnRlcm5hbHMuZCA9IHtcbiAgICAgIGY6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHByZXZpb3VzV2FzUmVuZGVyaW5nID0gcHJldmlvdXNEaXNwYXRjaGVyLmYoKSxcbiAgICAgICAgICB3YXNSZW5kZXJpbmcgPSBmbHVzaFN5bmNXb3JrJDEoKTtcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzV2FzUmVuZGVyaW5nIHx8IHdhc1JlbmRlcmluZztcbiAgICAgIH0sXG4gICAgICByOiBmdW5jdGlvbiAoZm9ybSkge1xuICAgICAgICB2Y
15852XIgZm9ybUluc3QgPSBnZXRJbnN0YW5jZUZyb21Ob2RlKGZvcm0pO1xuICAgICAgICBudWxsICE9PSBmb3JtSW5zdCAmJiA1ID09PSBmb3JtSW5zdC50YWcgJiYgXCJmb3JtXCIgPT09IGZvcm1JbnN0LnR5cGVcbiAgICAgICAgICA/IHJlcXVlc3RGb3JtUmVzZXQkMShmb3JtSW5zdClcbiAgICAgICAgICA6IHByZXZpb3VzRGlzcGF0Y2hlci5yKGZvcm0pO1xuICAgICAgfSxcbiAgICAgIEQ6IGZ1bmN0aW9uIChocmVmKSB7XG4gICAgICAgIHByZXZpb3VzRGlzcGF0Y2hlci5EKGhyZWYpO1xuICAgICAgICBwcmVjb25uZWN0QXMoXCJkbnMtcHJlZmV0Y2hcIiwgaHJlZiwgbnVsbCk7XG4gICAgICB9LFxuICAgICAgQzogZnVuY3Rpb24gKGhyZWYsIGNyb3NzT3JpZ2luKSB7XG4gICAgICAgIHByZXZpb3VzRGlzcGF0Y2hlci5DKGhyZWYsIGNyb3NzT3JpZ2luKTtcbiAgICAgICAgcHJlY29ubmVjdEFzKFwicHJlY29ubmVjdFwiLCBocmVmLCBjcm9zc09yaWdpbik7XG4gICAgICB9LFxuICAgICAgTDogZnVuY3Rpb24gKGhyZWYsIGFzLCBvcHRpb25zKSB7XG4gICAgICAgIHByZXZpb3VzRGlzcGF0Y2hlci5MKGhyZWYsIGFzLCBvcHRpb25zKTtcbiAgICAgICAgdmFyIG93bmVyRG9jdW1lbnQgPSBnbG9iYWxEb2N1bWVudDtcbiAgICAgICAgaWYgKG93bmVyRG9jdW1lbnQgJiYgaHJlZiAmJiBhcykge1xuICAgICAgICAgIHZhciBwcmVsb2FkU2VsZWN0b3IgPVxuICAgICAgICAgICAgJ2xpbmtbcmVsPVwicHJlbG9hZFwiXVthcz1cIicgK1xuICAgICAgICAgICAgZXNjYXBlU2VsZWN0b3JBdHRyaWJ1dGVWYWx1ZUluc2lkZURvdWJsZVF1b3RlcyhhcykgK1xuICAgICAgICAgICAgJ1wiXSc7XG4gICAgICAgICAgXCJpbWFnZVwiID09PSBhc1xuICAgICAgICAgICAgPyBvcHRpb25zICYmIG9wdGlvbnMuaW1hZ2VTcmNTZXRcbiAgICAgICAgICAgICAgPyAoKHByZWxvYWRTZWxlY3RvciArPVxuICAgICAgICAgICAgICAgICAgJ1tpbWFnZXNyY3NldD1cIicgK1xuICAgICAgICAgICAgICAgICAgZXNjYXBlU2VsZWN0b3JBdHRyaWJ1dGVWYWx1ZUluc2lkZURvdWJsZVF1b3RlcyhcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5pbWFnZVNyY1NldFxuICAgICAgICAgICAgICAgICAgKSArXG4gICAgICAgICAgICAgICAgICAnXCJdJyksXG4gICAgICAgICAgICAgICAgXCJzdHJpbmdcIiA9PT0gdHlwZW9mIG9wdGlvbnMuaW1hZ2VTaXplcyAmJlxuICAgICAgICAgICAgICAgICAgKHByZWxvYWRTZWxlY3RvciArPVxuICAgICAgICAgICAgICAgICAgICAnW2ltYWdlc2l6ZXM9XCInICtcbiAgICAgICAgICAgICAgICAgICAgZXNjYXBlU2VsZWN0b3JBdHRyaWJ1dGVWYWx1ZUluc2lkZURvdWJsZVF1b3RlcyhcbiAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmltYWdlU2l6ZXNcbiAgICAgICAgICAgICAgICAgICAgKSArXG4gICAgICAgICAgICAgICAgICAgICdcIl0nKSlcbiAgICAgICAgICAgICAgOiAocHJlbG9hZFNlbGVjdG9yICs9XG4gICAgICAgICAgICAgICAgICAnW2hyZWY9XCInICtcbiAgICAgICAgICAgICAgICAgIGVzY2FwZVNlbGVjdG9yQXR0cmlidXRlVmFsdWVJbnNpZGVEb3VibGVRdW90ZXMoaHJlZikgK1xuICAgICAgICAgICAgICAgICAgJ1wiXScpXG4gICAgICAgICAgICA6IChwcmVsb2FkU2VsZWN0b3IgKz1cbiAgICAgICAgICAgICAgICAnW2hyZWY9XCInICtcbiAgICAgICAgICAgICAgICBlc2NhcGVTZWxlY3RvckF0dHJpYnV0ZVZhbHVlSW5zaWRlRG91YmxlUXVvdGVzKGhyZWYpICtcbiAgICAgICAgICAgICAgICAnXCJdJyk7XG4gICAgICAgICAgdmFyIGtleSA9IHByZWxvYWRTZWxlY3RvcjtcbiAgICAgICAgICBzd2l0Y2ggKGFzKSB7XG4gICAgICAgICAgICBjYXNlIFwic3R5bGVcIjpcbiAgICAgICAgICAgICAga2V5ID0gZ2V0U3R5bGVLZXkoaHJlZik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInNjcmlwdFwiOlxuICAgICAgICAgICAgICBrZXkgPSBnZXRTY3JpcHRLZXkoaHJlZik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgIHByZWxvYWRQcm9wc01hcC5oYXMoa2V5KSB8fFxuICAgICAgICAgICAgICAoKGhyZWYgPSBhc3NpZ24oXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgcmVsOiBcInByZWxvYWRcIixcbiAgICAgICAgICAgICAgICAgIGhyZWY6XG4gICAgICAgICAgICAgICAgICAgIFwiaW1hZ2VcIiA9PT0gYXMgJiYgb3B0aW9ucyAmJiBvcHRpb25zLmltYWdlU3JjU2V0XG4gICAgICAgICAgICAgICAgICAgICAgPyB2b2lkIDBcbiAgICAgICAgICAgICAgICAgICAgICA6IGhyZWYsXG4gICAgICAgICAgICAgICAgICBhczogYXNcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgIHByZWxvYWRQcm9wc01hcC5zZXQoa2V5LCBocmVmKSxcbiAgICAgICAgICAgICAgbnVsbCAhPT0gb3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yKHByZWxvYWRTZWxlY3RvcikgfHxcbiAgICAgICAgICAgICAgICAoXCJzdHlsZVwiID09PSBhcyAmJlxuICAgICAgICAgICAgICAgICAgb3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICAgICAgICAgICBnZXRTdHlsZXNoZWV0U2VsZWN0b3JGcm9tS2V5KGtleSlcbiAgICAgICAgICAgICAgICAgICkpIHx8XG4gICAgICAgICAgICAgICAgKFwic2NyaXB0XCIgPT09IGFzICYmXG4gICAgICAgICAgICAgICAgICBvd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZ2V0U2NyaXB0U2VsZWN0b3JGcm9tS2V5KGtleSkpKSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHZhciBpbnN0YW5jZSA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpbmtcIik7XG4gICAgICAgICAgICBzZXRJbml0aWFsUHJvcGVydGllcyhpbnN0YW5jZSwgXCJsaW5rXCIsIGhyZWYpO1xuICAgICAgICAgICAgXCJzdHlsZVwiID09PSBhcyAmJlxuICAgICAgICAgICAgICAoKGluc3RhbmNlW2ludGVybmFsTG9hZFBlbmRpbmdLZXldID0gITApLFxuICAgICAgICAgICAgICAoaW5zdGFuY2Uub25sb2FkID0gaW5zdGFuY2Uub25lcnJvciA9XG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgY2xlYXJQZW5kaW5nTG9hZE9uTm9kZShpbnN0YW5jZSk7XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgbWFya05vZGVBc0hvaXN0YWJsZShpbnN0YW5jZSk7XG4gICAgICAgICAgICBvd25lckRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoaW5zdGFuY2UpO1xuICAgICAgICAgI
15852H1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG06IGZ1bmN0aW9uIChocmVmLCBvcHRpb25zKSB7XG4gICAgICAgIHByZXZpb3VzRGlzcGF0Y2hlci5tKGhyZWYsIG9wdGlvbnMpO1xuICAgICAgICB2YXIgb3duZXJEb2N1bWVudCA9IGdsb2JhbERvY3VtZW50O1xuICAgICAgICBpZiAob3duZXJEb2N1bWVudCAmJiBocmVmKSB7XG4gICAgICAgICAgdmFyIGFzID1cbiAgICAgICAgICAgICAgb3B0aW9ucyAmJiBcInN0cmluZ1wiID09PSB0eXBlb2Ygb3B0aW9ucy5hcyA/IG9wdGlvbnMuYXMgOiBcInNjcmlwdFwiLFxuICAgICAgICAgICAgcHJlbG9hZFNlbGVjdG9yID1cbiAgICAgICAgICAgICAgJ2xpbmtbcmVsPVwibW9kdWxlcHJlbG9hZFwiXVthcz1cIicgK1xuICAgICAgICAgICAgICBlc2NhcGVTZWxlY3RvckF0dHJpYnV0ZVZhbHVlSW5zaWRlRG91YmxlUXVvdGVzKGFzKSArXG4gICAgICAgICAgICAgICdcIl1baHJlZj1cIicgK1xuICAgICAgICAgICAgICBlc2NhcGVTZWxlY3RvckF0dHJpYnV0ZVZhbHVlSW5zaWRlRG91YmxlUXVvdGVzKGhyZWYpICtcbiAgICAgICAgICAgICAgJ1wiXScsXG4gICAgICAgICAgICBrZXkgPSBwcmVsb2FkU2VsZWN0b3I7XG4gICAgICAgICAgc3dpdGNoIChhcykge1xuICAgICAgICAgICAgY2FzZSBcImF1ZGlvd29ya2xldFwiOlxuICAgICAgICAgICAgY2FzZSBcInBhaW50d29ya2xldFwiOlxuICAgICAgICAgICAgY2FzZSBcInNlcnZpY2V3b3JrZXJcIjpcbiAgICAgICAgICAgIGNhc2UgXCJzaGFyZWR3b3JrZXJcIjpcbiAgICAgICAgICAgIGNhc2UgXCJ3b3JrZXJcIjpcbiAgICAgICAgICAgIGNhc2UgXCJzY3JpcHRcIjpcbiAgICAgICAgICAgICAga2V5ID0gZ2V0U2NyaXB0S2V5KGhyZWYpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhcHJlbG9hZFByb3BzTWFwLmhhcyhrZXkpICYmXG4gICAgICAgICAgICAoKGhyZWYgPSBhc3NpZ24oeyByZWw6IFwibW9kdWxlcHJlbG9hZFwiLCBocmVmOiBocmVmIH0sIG9wdGlvbnMpKSxcbiAgICAgICAgICAgIHByZWxvYWRQcm9wc01hcC5zZXQoa2V5LCBocmVmKSxcbiAgICAgICAgICAgIG51bGwgPT09IG93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihwcmVsb2FkU2VsZWN0b3IpKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgc3dpdGNoIChhcykge1xuICAgICAgICAgICAgICBjYXNlIFwiYXVkaW93b3JrbGV0XCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJwYWludHdvcmtsZXRcIjpcbiAgICAgICAgICAgICAgY2FzZSBcInNlcnZpY2V3b3JrZXJcIjpcbiAgICAgICAgICAgICAgY2FzZSBcInNoYXJlZHdvcmtlclwiOlxuICAgICAgICAgICAgICBjYXNlIFwid29ya2VyXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCJzY3JpcHRcIjpcbiAgICAgICAgICAgICAgICBpZiAob3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yKGdldFNjcmlwdFNlbGVjdG9yRnJvbUtleShrZXkpKSlcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFzID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlua1wiKTtcbiAgICAgICAgICAgIHNldEluaXRpYWxQcm9wZXJ0aWVzKGFzLCBcImxpbmtcIiwgaHJlZik7XG4gICAgICAgICAgICBtYXJrTm9kZUFzSG9pc3RhYmxlKGFzKTtcbiAgICAgICAgICAgIG93bmVyRG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChhcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgWDogZnVuY3Rpb24gKHNyYywgb3B0aW9ucykge1xuICAgICAgICBwcmV2aW91c0Rpc3BhdGNoZXIuWChzcmMsIG9wdGlvbnMpO1xuICAgICAgICB2Y
15852XIgb3duZXJEb2N1bWVudCA9IGdsb2JhbERvY3VtZW50O1xuICAgICAgICBpZiAob3duZXJEb2N1bWVudCAmJiBzcmMpIHtcbiAgICAgICAgICB2YXIgc2NyaXB0cyA9IGdldFJlc291cmNlc0Zyb21Sb290KG93bmVyRG9jdW1lbnQpLmhvaXN0YWJsZVNjcmlwdHMsXG4gICAgICAgICAgICBrZXkgPSBnZXRTY3JpcHRLZXkoc3JjKSxcbiAgICAgICAgICAgIHJlc291cmNlID0gc2NyaXB0cy5nZXQoa2V5KTtcbiAgICAgICAgICByZXNvdXJjZSB8fFxuICAgICAgICAgICAgKChyZXNvdXJjZSA9IG93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAgICAgZ2V0U2NyaXB0U2VsZWN0b3JGcm9tS2V5KGtleSlcbiAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgcmVzb3VyY2UgfHxcbiAgICAgICAgICAgICAgKChzcmMgPSBhc3NpZ24oeyBzcmM6IHNyYywgYXN5bmM6ICEwIH0sIG9wdGlvbnMpKSxcbiAgICAgICAgICAgICAgKG9wdGlvbnMgPSBwcmVsb2FkUHJvcHNNYXAuZ2V0KGtleSkpICYmXG4gICAgICAgICAgICAgICAgYWRvcHRQcmVsb2FkUHJvcHNGb3JTY3JpcHQoc3JjLCBvcHRpb25zKSxcbiAgICAgICAgICAgICAgKHJlc291cmNlID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpKSxcbiAgICAgICAgICAgICAgbWFya05vZGVBc0hvaXN0YWJsZShyZXNvdXJjZSksXG4gICAgICAgICAgICAgIHNldEluaXRpYWxQcm9wZXJ0aWVzKHJlc291cmNlLCBcImxpbmtcIiwgc3JjKSxcbiAgICAgICAgICAgICAgb3duZXJEb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHJlc291cmNlKSksXG4gICAgICAgICAgICAocmVzb3VyY2UgPSB7XG4gICAgICAgICAgICAgIHR5cGU6IFwic2NyaXB0XCIsXG4gICAgICAgICAgICAgIGluc3RhbmNlOiByZXNvdXJjZSxcbiAgICAgICAgICAgICAgY291bnQ6IDEsXG4gICAgICAgICAgICAgIHN0YXRlOiBudWxsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHNjcmlwdHMuc2V0KGtleSwgcmVzb3VyY2UpKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFM6IGZ1bmN0aW9uIChocmVmLCBwcmVjZWRlbmNlLCBvcHRpb25zKSB7XG4gICAgICAgIHByZXZpb3VzRGlzcGF0Y2hlci5TKGhyZWYsIHByZWNlZGVuY2UsIG9wdGlvbnMpO1xuICAgICAgICB2Y
15852XIgb3duZXJEb2N1bWVudCA9IGdsb2JhbERvY3VtZW50O1xuICAgICAgICBpZiAob3duZXJEb2N1bWVudCAmJiBocmVmKSB7XG4gICAgICAgICAgdmFyIHN0eWxlcyA9IGdldFJlc291cmNlc0Zyb21Sb290KG93bmVyRG9jdW1lbnQpLmhvaXN0YWJsZVN0eWxlcyxcbiAgICAgICAgICAgIGtleSA9IGdldFN0eWxlS2V5KGhyZWYpO1xuICAgICAgICAgIHByZWNlZGVuY2UgPSBwcmVjZWRlbmNlIHx8IFwiZGVmYXVsdFwiO1xuICAgICAgICAgIHZhciByZXNvdXJjZSA9IHN0eWxlcy5nZXQoa2V5KTtcbiAgICAgICAgICBpZiAoIXJlc291cmNlKSB7XG4gICAgICAgICAgICB2YXIgc3RhdGUgPSB7IGxvYWRpbmc6IE5vdExvYWRlZCwgcHJlbG9hZDogbnVsbCB9O1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAocmVzb3VyY2UgPSBvd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgICAgICAgZ2V0U3R5bGVzaGVldFNlbGVjdG9yRnJvbUtleShrZXkpXG4gICAgICAgICAgICAgICkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIHN0YXRlLmxvYWRpbmcgPSBMb2FkZWQgfCBJbnNlcnRlZDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBocmVmID0gYXNzaWduKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHJlbDogXCJzdHlsZXNoZWV0XCIsXG4gICAgICAgICAgICAgICAgICBocmVmOiBocmVmLFxuICAgICAgICAgICAgICAgICAgXCJkYXRhLXByZWNlZGVuY2VcIjogcHJlY2VkZW5jZVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAob3B0aW9ucyA9IHByZWxvYWRQcm9wc01hcC5nZXQoa2V5KSkgJiZcbiAgICAgICAgICAgICAgICBhZG9wdFByZWxvYWRQcm9wc0ZvclN0eWxlc2hlZXQoaHJlZiwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgIHZhciBsaW5rID0gKHJlc291cmNlID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGlua1wiKSk7XG4gICAgICAgICAgICAgIG1hcmtOb2RlQXNIb2lzdGFibGUobGluayk7XG4gICAgICAgICAgICAgIHNldEluaXRpYWxQcm9wZXJ0aWVzKGxpbmssIFwibGlua1wiLCBocmVmKTtcbiAgICAgICAgICAgICAgbGluay5fcCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgICAgICBsaW5rLm9ubG9hZCA9IHJlc29sdmU7XG4gICAgICAgICAgICAgICAgbGluay5vbmVycm9yID0gcmVqZWN0O1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgbGluay5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUubG9hZGluZyB8PSBMb2FkZWQ7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUubG9hZGluZyB8PSBFcnJvcmVkO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgc3RhdGUubG9hZGluZyB8PSBJbnNlcnRlZDtcbiAgICAgICAgICAgICAgaW5zZXJ0U3R5bGVzaGVldChyZXNvdXJjZSwgcHJlY2VkZW5jZSwgb3duZXJEb2N1bWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvdXJjZSA9IHtcbiAgICAgICAgICAgICAgdHlwZTogXCJzdHlsZXNoZWV0XCIsXG4gICAgICAgICAgICAgIGluc3RhbmNlOiByZXNvdXJjZSxcbiAgICAgICAgICAgICAgY291bnQ6IDEsXG4gICAgICAgICAgICAgIHN0YXRlOiBzdGF0ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHN0eWxlcy5zZXQoa2V5LCByZXNvdXJjZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgTTogZnVuY3Rpb24gKHNyYywgb3B0aW9ucykge1xuICAgICAgICBwcmV2aW91c0Rpc3BhdGNoZXIuTShzcmMsIG9wdGlvbnMpO1xuICAgICAgICB2Y
15852XIgb3duZXJEb2N1bWVudCA9IGdsb2JhbERvY3VtZW50O1xuICAgICAgICBpZiAob3duZXJEb2N1bWVudCAmJiBzcmMpIHtcbiAgICAgICAgICB2YXIgc2NyaXB0cyA9IGdldFJlc291cmNlc0Zyb21Sb290KG93bmVyRG9jdW1lbnQpLmhvaXN0YWJsZVNjcmlwdHMsXG4gICAgICAgICAgICBrZXkgPSBnZXRTY3JpcHRLZXkoc3JjKSxcbiAgICAgICAgICAgIHJlc291cmNlID0gc2NyaXB0cy5nZXQoa2V5KTtcbiAgICAgICAgICByZXNvdXJjZSB8fFxuICAgICAgICAgICAgKChyZXNvdXJjZSA9IG93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAgICAgZ2V0U2NyaXB0U2VsZWN0b3JGcm9tS2V5KGtleSlcbiAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgcmVzb3VyY2UgfHxcbiAgICAgICAgICAgICAgKChzcmMgPSBhc3NpZ24oeyBzcmM6IHNyYywgYXN5bmM6ICEwLCB0eXBlOiBcIm1vZHVsZVwiIH0sIG9wdGlvbnMpKSxcbiAgICAgICAgICAgICAgKG9wdGlvbnMgPSBwcmVsb2FkUHJvcHNNYXAuZ2V0KGtleSkpICYmXG4gICAgICAgICAgICAgICAgYWRvcHRQcmVsb2FkUHJvcHNGb3JTY3JpcHQoc3JjLCBvcHRpb25zKSxcbiAgICAgICAgICAgICAgKHJlc291cmNlID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpKSxcbiAgICAgICAgICAgICAgbWFya05vZGVBc0hvaXN0YWJsZShyZXNvdXJjZSksXG4gICAgICAgICAgICAgIHNldEluaXRpYWxQcm9wZXJ0aWVzKHJlc291cmNlLCBcImxpbmtcIiwgc3JjKSxcbiAgICAgICAgICAgICAgb3duZXJEb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHJlc291cmNlKSksXG4gICAgICAgICAgICAocmVzb3VyY2UgPSB7XG4gICAgICAgICAgICAgIHR5cGU6IFwic2NyaXB0XCIsXG4gICAgICAgICAgICAgIGluc3RhbmNlOiByZXNvdXJjZSxcbiAgICAgICAgICAgICAgY291bnQ6IDEsXG4gICAgICAgICAgICAgIHN0YXRlOiBudWxsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHNjcmlwdHMuc2V0KGtleSwgcmVzb3VyY2UpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgdmFyIGdsb2JhbERvY3VtZW50ID0gXCJ1bmRlZmluZWRcIiA9PT0gdHlwZW9mIGRvY3VtZW50ID8gbnVsbCA6IGRvY3VtZW50LFxuICAgICAgdGFnQ2FjaGVzID0gbnVsbCxcbiAgICAgIFNVU1BFTlNFWV9TVFlMRVNIRUVUX1RJTUVPVVQgPSA2ZTQsXG4gICAgICBTVVNQRU5TRVlfSU1BR0VfVElNRU9VVCA9IDgwMCxcbiAgICAgIFNVU1BFTlNFWV9JTUFHRV9USU1FX0VTVElNQVRFID0gNTAwLFxuICAgICAgZXN0aW1hdGVkQnl0ZXNXaXRoaW5MaW1pdCA9IDAsXG4gICAgICBMQVNUX1BSRUNFREVOQ0UgPSBudWxsLFxuICAgICAgcHJlY2VkZW5jZXNCeVJvb3QgPSBudWxsLFxuICAgICAgTm90UGVuZGluZ1RyYW5zaXRpb24gPSBOb3RQZW5kaW5nLFxuICAgICAgSG9zdFRyYW5zaXRpb25Db250ZXh0ID0ge1xuICAgICAgICAkJHR5cGVvZjogUkVBQ1RfQ09OVEVYVF9UWVBFLFxuICAgICAgICBQcm92aWRlcjogbnVsbCxcbiAgICAgICAgQ29uc3VtZXI6IG51bGwsXG4gICAgICAgIF9jdXJyZW50VmFsdWU6IE5vdFBlbmRpbmdUcmFuc2l0aW9uLFxuICAgICAgICBfY3VycmVudFZhbHVlMjogTm90UGVuZGluZ1RyYW5zaXRpb24sXG4gICAgICAgIF90aHJlYWRDb3VudDogMFxuICAgICAgfSxcbiAgICAgIGJhZGdlRm9ybWF0ID0gXCIlYyVzJWNcIixcbiAgICAgIGJhZGdlU3R5bGUgPVxuICAgICAgICBcImJhY2tncm91bmQ6ICNlNmU2ZTY7YmFja2dyb3VuZDogbGlnaHQtZGFyayhyZ2JhKDAsMCwwLDAuMSksIHJnYmEoMjU1LDI1NSwyNTUsMC4yNSkpO2NvbG9yOiAjMDAwMDAwO2NvbG9yOiBsaWdodC1kYXJrKCMwMDAwMDAsICNmZmZmZmYpO2JvcmRlci1yYWRpdXM6IDJweFwiLFxuICAgICAgcmVzZXRTdHlsZSA9IFwiXCIsXG4gICAgICBwYWQgPSBcIiBcIixcbiAgICAgIGJpbmQgPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZDtcbiAgICB2YXIgZGlkV2FybkFib3V0TmVzdGVkVXBkYXRlcyA9ICExO1xuICAgIHZhciBvdmVycmlkZUhvb2tTdGF0ZSA9IG51bGwsXG4gICAgICBvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGggPSBudWxsLFxuICAgICAgb3ZlcnJpZGVIb29rU3RhdGVSZW5hbWVQYXRoID0gbnVsbCxcbiAgICAgIG92ZXJyaWRlUHJvcHMgPSBudWxsLFxuICAgICAgb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGggPSBudWxsLFxuICAgICAgb3ZlcnJpZGVQcm9wc1JlbmFtZVBhdGggPSBudWxsLFxuICAgICAgc2NoZWR1bGVVcGRhdGUgPSBudWxsLFxuICAgICAgc2NoZWR1bGVSZXRyeSA9IG51bGwsXG4gICAgICBzZXRFcnJvckhhbmRsZXIgPSBudWxsLFxuICAgICAgc2V0U3VzcGVuc2VIYW5kbGVyID0gbnVsbDtcbiAgICBvdmVycmlkZUhvb2tTdGF0ZSA9IGZ1bmN0aW9uIChmaWJlciwgaWQsIHBhdGgsIHZhbHVlKSB7XG4gICAgICBpZCA9IGZpbmRIb29rKGZpYmVyLCBpZCk7XG4gICAgICBudWxsICE9PSBpZCAmJlxuICAgICAgICAoKHBhdGggPSBjb3B5V2l0aFNldEltcGwoaWQubWVtb2l6ZWRTdGF0ZSwgcGF0aCwgMCwgdmFsdWUpKSxcbiAgICAgICAgKGlkLm1lbW9pemVkU3RhdGUgPSBwYXRoKSxcbiAgICAgICAgKGlkLmJhc2VTdGF0ZSA9IHBhdGgpLFxuICAgICAgICAoZmliZXIubWVtb2l6ZWRQcm9wcyA9IGFzc2lnbih7fSwgZmliZXIubWVtb2l6ZWRQcm9wcykpLFxuICAgICAgICAocGF0aCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgMikpLFxuICAgICAgICBudWxsICE9PSBwYXRoICYmIHNjaGVkdWxlVXBkYXRlT25GaWJlcihwYXRoLCBmaWJlciwgMikpO1xuICAgIH07XG4gICAgb3ZlcnJpZGVIb29rU3RhdGVEZWxldGVQYXRoID0gZnVuY3Rpb24gKGZpYmVyLCBpZCwgcGF0aCkge1xuICAgICAgaWQgPSBmaW5kSG9vayhmaWJlciwgaWQpO1xuICAgICAgbnVsbCAhPT0gaWQgJiZcbiAgICAgICAgKChwYXRoID0gY29weVdpdGhEZWxldGVJbXBsKGlkLm1lbW9pemVkU3RhdGUsIHBhdGgsIDApKSxcbiAgICAgICAgKGlkLm1lbW9pemVkU3RhdGUgPSBwYXRoKSxcbiAgICAgICAgKGlkLmJhc2VTdGF0ZSA9IHBhdGgpLFxuICAgICAgICAoZmliZXIubWVtb2l6ZWRQcm9wcyA9IGFzc2lnbih7fSwgZmliZXIubWVtb2l6ZWRQcm9wcykpLFxuICAgICAgICAocGF0aCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgMikpLFxuICAgICAgICBudWxsICE9PSBwYXRoICYmIHNjaGVkdWxlVXBkYXRlT25GaWJlcihwYXRoLCBmaWJlciwgMikpO1xuICAgIH07XG4gICAgb3ZlcnJpZGVIb29rU3Rh
15852dGVSZW5hbWVQYXRoID0gZnVuY3Rpb24gKGZpYmVyLCBpZCwgb2xkUGF0aCwgbmV3UGF0aCkge1xuICAgICAgaWQgPSBmaW5kSG9vayhmaWJlciwgaWQpO1xuICAgICAgbnVsbCAhPT0gaWQgJiZcbiAgICAgICAgKChvbGRQYXRoID0gY29weVdpdGhSZW5hbWUoaWQubWVtb2l6ZWRTdGF0ZSwgb2xkUGF0aCwgbmV3UGF0aCkpLFxuICAgICAgICAoaWQubWVtb2l6ZWRTdGF0ZSA9IG9sZFBhdGgpLFxuICAgICAgICAoaWQuYmFzZVN0YXRlID0gb2xkUGF0aCksXG4gICAgICAgIChmaWJlci5tZW1vaXplZFByb3BzID0gYXNzaWduKHt9LCBmaWJlci5tZW1vaXplZFByb3BzKSksXG4gICAgICAgIChvbGRQYXRoID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCAyKSksXG4gICAgICAgIG51bGwgIT09IG9sZFBhdGggJiYgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKG9sZFBhdGgsIGZpYmVyLCAyKSk7XG4gICAgfTtcbiAgICBvdmVycmlkZVByb3BzID0gZnVuY3Rpb24gKGZpYmVyLCBwYXRoLCB2YWx1ZSkge1xuICAgICAgZmliZXIucGVuZGluZ1Byb3BzID0gY29weVdpdGhTZXRJbXBsKGZpYmVyLm1lbW9pemVkUHJvcHMsIHBhdGgsIDAsIHZhbHVlKTtcbiAgICAgIGZpYmVyLmFsdGVybmF0ZSAmJiAoZmliZXIuYWx0ZXJuYXRlLnBlbmRpbmdQcm9wcyA9IGZpYmVyLnBlbmRpbmdQcm9wcyk7XG4gICAgICBwYXRoID0gZW5xdWV1ZUNvbmN1cnJlbnRSZW5kZXJGb3JMYW5lKGZpYmVyLCAyKTtcbiAgICAgIG51bGwgIT09IHBhdGggJiYgc2NoZWR1bGVVcGRhdGVPbkZpYmVyKHBhdGgsIGZpYmVyLCAyKTtcbiAgICB9O1xuICAgIG92ZXJyaWRlUHJvcHNEZWxldGVQYXRoID0gZnVuY3Rpb24gKGZpYmVyLCBwYXRoKSB7XG4gICAgICBmaWJlci5wZW5kaW5nUHJvcHMgPSBjb3B5V2l0aERlbGV0ZUltcGwoZmliZXIubWVtb2l6ZWRQcm9wcywgcGF0aCwgMCk7XG4gICAgICBmaWJlci5hbHRlcm5hdGUgJiYgKGZpYmVyLmFsdGVybmF0ZS5wZW5kaW5nUHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHMpO1xuICAgICAgcGF0aCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgMik7XG4gICAgICBudWxsICE9PSBwYXRoICYmIHNjaGVkdWxlVXBkYXRlT25GaWJlcihwYXRoLCBmaWJlciwgMik7XG4gICAgfTtcbiAgICBvdmVycmlkZVByb3BzUmVuYW1lUGF0aCA9IGZ1bmN0aW9uIChmaWJlciwgb2xkUGF0aCwgbmV3UGF0aCkge1xuICAgICAgZmliZXIucGVuZGluZ1Byb3BzID0gY29weVdpdGhSZW5hbWUoXG4gICAgICAgIGZpYmVyLm1lbW9pemVkUHJvcHMsXG4gICAgICAgIG9sZFBhdGgsXG4gICAgICAgIG5ld1BhdGhcbiAgICAgICk7XG4gICAgICBmaWJlci5hbHRlcm5hdGUgJiYgKGZpYmVyLmFsdGVybmF0ZS5wZW5kaW5nUHJvcHMgPSBmaWJlci5wZW5kaW5nUHJvcHMpO1xuICAgICAgb2xkUGF0aCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgMik7XG4gICAgICBudWxsICE9PSBvbGRQYXRoICYmIHNjaGVkdWxlVXBkYXRlT25GaWJlcihvbGRQYXRoLCBmaWJlciwgMik7XG4gICAgfTtcbiAgICBzY2hlZHVsZVVwZGF0ZSA9IGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgdmFyIHJvb3QgPSBlbnF1ZXVlQ29uY3VycmVudFJlbmRlckZvckxhbmUoZmliZXIsIDIpO1xuICAgICAgbnVsbCAhPT0gcm9vdCAmJiBzY2hlZHVsZVVwZGF0ZU9uRmliZXIocm9vdCwgZmliZXIsIDIpO1xuICAgIH07XG4gICAgc2NoZWR1bGVSZXRyeSA9IGZ1bmN0aW9uIChmaWJlcikge1xuICAgICAgdmFyIGxhbmUgPSBjbGFpbU5leHRSZXRyeUxhbmUoKSxcbiAgICAgICAgcm9vdCA9IGVucXVldWVDb25jdXJyZW50UmVuZGVyRm9yTGFuZShmaWJlciwgbGFuZSk7XG4gICAgICBudWxsICE9PSByb290ICYmIHNjaGVkdWxlVXBkYXRlT25GaWJlcihyb290LCBmaWJlciwgbGFuZSk7XG4gICAgfTtcbiAgICBzZXRFcnJvckhhbmRsZXIgPSBmdW5jdGlvbiAobmV3U2hvdWxkRXJyb3JJbXBsKSB7XG4gICAgICBzaG91bGRFcnJvckltcGwgPSBuZXdTaG91bGRFcnJvckltcGw7XG4gICAgfTtcbiAgICBzZXRTdXNwZW5zZUhhbmRsZXIgPSBmdW5jdGlvbiAobmV3U2hvdWxkU3VzcGVuZEltcGwpIHtcbiAgICAgIHNob3VsZFN1c3BlbmRJbXBsID0gbmV3U2hvdWxkU3VzcGVuZEltcGw7XG4gICAgfTtcbiAgICB2YXIgX2VuYWJsZWQgPSAhMCxcbiAgICAgIHJldHVybl90YXJnZXRJbnN0ID0gbnVsbCxcbiAgICAgIGhhc1NjaGVkdWxlZFJlcGxheUF0dGVtcHQgPSAhMSxcbiAgICAgIHF1ZXVlZEZvY3VzID0gbnVsbCxcbiAgICAgIHF1ZXVlZERyYWcgPSBudWxsLFxuICAgICAgcXVldWVkTW91c2UgPSBudWxsLFxuICAgICAgcXVldWVkUG9pbnRlcnMgPSBuZXcgTWFwKCksXG4gICAgICBxdWV1ZWRQb2ludGVyQ2FwdHVyZXMgPSBuZXcgTWFwKCksXG4gICAgICBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMgPSBbXSxcbiAgICAgIGRpc2NyZXRlUmVwbGF5YWJsZUV2ZW50cyA9XG4gICAgICAgIFwibW91c2Vkb3duIG1vdXNldXAgdG91Y2hjYW5jZWwgdG91Y2hlbmQgdG91Y2hzdGFydCBhdXhjbGljayBkYmxjbGljayBwb2ludGVyY2FuY2VsIHBvaW50ZXJkb3duIHBvaW50ZXJ1cCBkcmFnZW5kIGRyYWdzdGFydCBkcm9wIGNvbXBvc2l0aW9uZW5kIGNvbXBvc2l0aW9uc3RhcnQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBpbnB1dCB0ZXh0SW5wdXQgY29weSBjdXQgcGFzdGUgY2xpY2sgY2hhbmdlIGNvbnRleHRtZW51IHJlc2V0XCIuc3BsaXQoXG4gICAgICAgICAgXCIgXCJcbiAgICAgICAgKSxcbiAgICAgIGxhc3RTY2hlZHVsZWRSZXBsYXlRdWV1ZSA9IG51bGw7XG4gICAgUmVhY3RET01IeWRyYXRpb25Sb290LnByb3RvdHlwZS5yZW5kZXIgPSBSZWFjdERPTVJvb3QucHJvdG90eXBlLnJlbmRlciA9XG4gICAgICBmdW5jdGlvbiAoY2hpbGRyZW4pIHtcbiAgICAgICAgdmFyIHJvb3QgPSB0aGlzLl9pbnRlcm5hbFJvb3Q7XG4gICAgICAgIGlmIChudWxsID09PSByb290KSB0aHJvdyBFcnJvcihcIkNhbm5vdCB1cGRhdGUgYW4gdW5tb3VudGVkIHJvb3QuXCIpO1xuICAgICAgICB2Y
15852XIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgYXJnc1sxXVxuICAgICAgICAgID8gY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCJkb2VzIG5vdCBzdXBwb3J0IHRoZSBzZWNvbmQgY2FsbGJhY2sgYXJndW1lbnQuIFRvIGV4ZWN1dGUgYSBzaWRlIGVmZmVjdCBhZnRlciByZW5kZXJpbmcsIGRlY2xhcmUgaXQgaW4gYSBjb21wb25lbnQgYm9keSB3aXRoIHVzZUVmZmVjdCgpLlwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBpc1ZhbGlkQ29udGFpbmVyKGFyZ3NbMV0pXG4gICAgICAgICAgICA/IGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgXCJZb3UgcGFzc2VkIGEgY29udGFpbmVyIHRvIHRoZSBzZWNvbmQgYXJndW1lbnQgb2Ygcm9vdC5yZW5kZXIoLi4uKS4gWW91IGRvbid0IG5lZWQgdG8gcGFzcyBpdCBhZ2FpbiBzaW5jZSB5b3UgYWxyZWFkeSBwYXNzZWQgaXQgdG8gY3JlYXRlIHRoZSByb290LlwiXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogXCJ1bmRlZmluZWRcIiAhPT0gdHlwZW9mIGFyZ3NbMV0gJiZcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICBcIllvdSBwYXNzZWQgYSBzZWNvbmQgYXJndW1lbnQgdG8gcm9vdC5yZW5kZXIoLi4uKSBidXQgaXQgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC5cIlxuICAgICAgICAgICAgICApO1xuICAgICAgICBhcmdzID0gY2hpbGRyZW47XG4gICAgICAgIHZhciBjdXJyZW50ID0gcm9vdC5jdXJyZW50LFxuICAgICAgICAgIGxhbmUgPSByZXF1ZXN0VXBkYXRlTGFuZShjdXJyZW50KTtcbiAgICAgICAgdXBkYXRlQ29udGFpbmVySW1wbChjdXJyZW50LCBsYW5lLCBhcmdzLCByb290LCBudWxsLCBudWxsKTtcbiAgICAgIH07XG4gICAgUmVhY3RET01IeWRyYXRpb25Sb290LnByb3RvdHlwZS51bm1vdW50ID0gUmVhY3RET01Sb290LnByb3RvdHlwZS51bm1vdW50ID1cbiAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGFyZ3NbMF0gJiZcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJkb2VzIG5vdCBzdXBwb3J0IGEgY2FsbGJhY2sgYXJndW1lbnQuIFRvIGV4ZWN1dGUgYSBzaWRlIGVmZmVjdCBhZnRlciByZW5kZXJpbmcsIGRlY2xhcmUgaXQgaW4gYSBjb21wb25lbnQgYm9keSB3aXRoIHVzZUVmZmVjdCgpLlwiXG4gICAgICAgICAgKTtcbiAgICAgICAgYXJncyA9IHRoaXMuX2ludGVybmFsUm9vdDtcbiAgICAgICAgaWYgKG51bGwgIT09IGFyZ3MpIHtcbiAgICAgICAgICB0aGlzLl9pbnRlcm5hbFJvb3QgPSBudWxsO1xuICAgICAgICAgIHZhciBjb250YWluZXIgPSBhcmdzLmNvbnRhaW5lckluZm87XG4gICAgICAgICAgKGV4ZWN1dGlvbkNvbnRleHQgJiAoUmVuZGVyQ29udGV4dCB8IENvbW1pdENvbnRleHQpKSAhPT0gTm9Db250ZXh0ICYmXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIkF0dGVtcHRlZCB0byBzeW5jaHJvbm91c2x5IHVubW91bnQgYSByb290IHdoaWxlIFJlYWN0IHdhcyBhbHJlYWR5IHJlbmRlcmluZy4gUmVhY3QgY2Fubm90IGZpbmlzaCB1bm1vdW50aW5nIHRoZSByb290IHVudGlsIHRoZSBjdXJyZW50IHJlbmRlciBoYXMgY29tcGxldGVkLCB3aGljaCBtYXkgbGVhZCB0byBhIHJhY2UgY29uZGl0aW9uLlwiXG4gICAgICAgICAgICApO1xuICAgICAgICAgIHVwZGF0ZUNvbnRhaW5lckltcGwoYXJncy5jdXJyZW50LCAyLCBudWxsLCBhcmdzLCBudWxsLCBudWxsKTtcbiAgICAgICAgICBmbHVzaFN5bmNXb3JrJDEoKTtcbiAgICAgICAgICBjb250YWluZXJbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV0gPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIFJlYWN0RE9NSHlkcmF0aW9uUm9vdC5wcm90b3R5cGUudW5zdGFibGVfc2NoZWR1bGVIeWRyYXRpb24gPSBmdW5jdGlvbiAoXG4gICAgICB0YXJnZXRcbiAgICApIHtcbiAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgdmFyIHVwZGF0ZVByaW9yaXR5ID0gcmVzb2x2ZVVwZGF0ZVByaW9yaXR5KCk7XG4gICAgICAgIHRhcmdldCA9IHsgYmxvY2tlZE9uOiBudWxsLCB0YXJnZXQ6IHRhcmdldCwgcHJpb3JpdHk6IHVwZGF0ZVByaW9yaXR5IH07XG4gICAgICAgIGZvciAoXG4gICAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAgIGkgPCBxdWV1ZWRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldHMubGVuZ3RoICYmXG4gICAgICAgICAgMCAhPT0gdXBkYXRlUHJpb3JpdHkgJiZcbiAgICAgICAgICB1cGRhdGVQcmlvcml0eSA8IHF1ZXVlZEV4cGxpY2l0SHlkcmF0aW9uVGFyZ2V0c1tpXS5wcmlvcml0eTtcbiAgICAgICAgICBpKytcbiAgICAgICAgKTtcbiAgICAgICAgcXVldWVkRXhwbGljaXRIeWRyYXRpb25UYXJnZXRzLnNwbGljZShpLCAwLCB0YXJnZXQpO1xuICAgICAgICAwID09PSBpICYmIGF0dGVtcHRFeHBsaWNpdEh5ZHJhdGlvblRhcmdldCh0YXJnZXQpO1xuICAgICAgfVxuICAgIH07XG4gICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBpc29tb3JwaGljUmVhY3RQYWNrYWdlVmVyc2lvbiA9I
15852FJlYWN0LnZlcnNpb247XG4gICAgICBpZiAoXCIxOS4zLjBcIiAhPT0gaXNvbW9ycGhpY1JlYWN0UGFja2FnZVZlcnNpb24pXG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICdJbmNvbXBhdGlibGUgUmVhY3QgdmVyc2lvbnM6IFRoZSBcInJlYWN0XCIgYW5kIFwicmVhY3QtZG9tXCIgcGFja2FnZXMgbXVzdCBoYXZlIHRoZSBleGFjdCBzYW1lIHZlcnNpb24uIEluc3RlYWQgZ290OlxcbiAgLSByZWFjdDogICAgICAnICtcbiAgICAgICAgICAgIChpc29tb3JwaGljUmVhY3RQYWNrYWdlVmVyc2lvbiArXG4gICAgICAgICAgICAgIFwiXFxuICAtIHJlYWN0LWRvbTogIDE5LjMuMFxcbkxlYXJuIG1vcmU6IGh0dHBzOi8vcmVhY3QuZGV2L3dhcm5pbmdzL3ZlcnNpb24tbWlzbWF0Y2hcIilcbiAgICAgICAgKTtcbiAgICB9KSgpO1xuICAgIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBNYXAgJiZcbiAgICAgIG51bGwgIT0gTWFwLnByb3RvdHlwZSAmJlxuICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgTWFwLnByb3RvdHlwZS5mb3JFYWNoICYmXG4gICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBTZXQgJiZcbiAgICAgIG51bGwgIT0gU2V0LnByb3RvdHlwZSAmJlxuICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgU2V0LnByb3RvdHlwZS5jbGVhciAmJlxuICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgU2V0LnByb3RvdHlwZS5mb3JFYWNoKSB8fFxuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgXCJSZWFjdCBkZXBlbmRzIG9uIE1hcCBhbmQgU2V0IGJ1aWx0LWluIHR5cGVzLiBNYWtlIHN1cmUgdGhhdCB5b3UgbG9hZCBhIHBvbHlmaWxsIGluIG9sZGVyIGJyb3dzZXJzLiBodHRwczovL3JlYWN0LmRldi9saW5rL3JlYWN0LXBvbHlmaWxsc1wiXG4gICAgICApO1xuICAgIFJlYWN0RE9NU2hhcmVkSW50ZXJuYWxzLmZpbmRET01Ob2RlID0gZnVuY3Rpb24gKGNvbXBvbmVudE9yRWxlbWVudCkge1xuICAgICAgdmFyIGZpYmVyID0gY29tcG9uZW50T3JFbGVtZW50Ll9yZWFjdEludGVybmFscztcbiAgICAgIGlmICh2b2lkIDAgPT09IGZpYmVyKSB7XG4gICAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBjb21wb25lbnRPckVsZW1lbnQucmVuZGVyKVxuICAgICAgICAgIHRocm93IEVycm9yKFwiVW5hYmxlIHRvIGZpbmQgbm9kZSBvbiBhbiB1bm1vdW50ZWQgY29tcG9uZW50LlwiKTtcbiAgICAgICAgY29tcG9uZW50T3JFbGVtZW50ID0gT2JqZWN0LmtleXMoY29tcG9uZW50T3JFbGVtZW50KS5qb2luKFwiLFwiKTtcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgXCJBcmd1bWVudCBhcHBlYXJzIHRvIG5vdCBiZSBhIFJlYWN0Q29tcG9uZW50LiBLZXlzOiBcIiArXG4gICAgICAgICAgICBjb21wb25lbnRPckVsZW1lbnRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbXBvbmVudE9yRWxlbWVudCA9IGZpbmRDdXJyZW50RmliZXJVc2luZ1Nsb3dQYXRoKGZpYmVyKTtcbiAgICAgIGNvbXBvbmVudE9yRWxlbWVudCA9XG4gICAgICAgIG51bGwgIT09IGNvbXBvbmVudE9yRWxlbWVudFxuICAgICAgICAgID8gZmluZEN1cnJlbnRIb3N0RmliZXJJbXBsKGNvbXBvbmVudE9yRWxlbWVudClcbiAgICAgICAgICA6IG51bGw7XG4gICAgICBjb21wb25lbnRPckVsZW1lbnQgPVxuICAgICAgICBudWxsID09PSBjb21wb25lbnRPckVsZW1lbnQgPyBudWxsIDogY29tcG9uZW50T3JFbGVtZW50LnN0YXRlTm9kZTtcbiAgICAgIHJldHVybiBjb21wb25lbnRPckVsZW1lbnQ7XG4gICAgfTtcbiAgICBpZiAoXG4gICAgICAhKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGludGVybmFscyA9IHtcbiAgICAgICAgICBidW5kbGVUeXBlOiAxLFxuICAgICAgICAgIHZlcnNpb246IFwiMTkuMy4wXCIsXG4gICAgICAgICAgcmVuZGVyZXJQYWNrYWdlTmFtZTogXCJyZWFjdC1kb21cIixcbiAgICAgICAgICBjdXJyZW50RGlzcGF0Y2hlclJlZjogUmVhY3RTaGFyZWRJbnRlcm5hbHMsXG4gICAgICAgICAgcmVjb25jaWxlclZlcnNpb246IFwiMTkuMy4wXCJcbiAgICAgICAgfTtcbiAgICAgICAgaW50ZXJuYWxzLm92ZXJyaWRlSG9va1N0YXRlID0gb3ZlcnJpZGVIb29rU3RhdGU7XG4gICAgICAgIGludGVybmFscy5vdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGggPSBvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGg7XG4gICAgICAgIGludGVybmFscy5vdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGggPSBvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGg7XG4gICAgICAgIGludGVybmFscy5vdmVycmlkZVByb3BzID0gb3ZlcnJpZGVQcm9wcztcbiAgICAgICAgaW50ZXJuYWxzLm92ZXJyaWRlUHJvcHNEZWxldGVQYXRoID0gb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGg7XG4gICAgICAgIGludGVybmFscy5vdmVycmlkZVByb3BzUmVuYW1lUGF0aCA9IG92ZXJyaWRlUHJvcHNSZW5hbWVQYXRoO1xuICAgICAgICBpbnRlcm5hbHMuc2NoZWR1bGVVcGRhdGUgPSBzY2hlZHVsZVVwZGF0ZTtcbiAgICAgICAgaW50ZXJuYWxzLnNjaGVkdWxlUmV0cnkgPSBzY2hlZHVsZVJldHJ5O1xuICAgICAgICBpbnRlcm5hbHMuc2V0RXJyb3JIYW5kbGVyID0gc2V0RXJyb3JIYW5kbGVyO1xuICAgICAgICBpbnRlcm5hbHMuc2V0U3VzcGVuc2VIYW5kbGVyID0gc2V0U3VzcGVuc2VIYW5kbGVyO1xuICAgICAgICBpbnRlcm5hbHMuc2NoZWR1bGVSZWZyZXNoID0gc2NoZWR1bGVSZWZyZXNoO1xuICAgICAgICBpbnRlcm5hbHMuc2NoZWR1bGVSb290ID0gc2NoZWR1bGVSb290O1xuICAgICAgICBpbnRlcm5hbHMuc2V0UmVmcmVzaEhhbmRsZXIgPSBzZXRSZWZyZXNoSGFuZGxlcjtcbiAgICAgICAgaW50ZXJuYWxzLmdldEN1cnJlbnRGaWJlciA9IGdldEN1cnJlbnRGaWJlckZvckRldlRvb2xzO1xuICAgICAgICByZXR1cm4gaW5qZWN0SW50ZXJuYWxzKGludGVybmFscyk7XG4gICAgICB9KSgpICYmXG4gICAgICBjYW5Vc2VET00gJiZcbiAgICAgIHdpbmRvdy50b3AgPT09IHdpbmRvdy5zZWxmICYmXG4gICAgICAoKC0xIDwgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKFwiQ2hyb21lXCIpICYmXG4gICAgICAgIC0xID09PSBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoXCJFZGdlXCIpKSB8fFxuICAgICAgICAtMSA8IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZihcIkZpcmVmb3hcIikpXG4gICAgKSB7XG4gICAgICB2Y
15852XIgcHJvdG9jb2wgPSB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2w7XG4gICAgICAvXihodHRwcz98ZmlsZSk6JC8udGVzdChwcm90b2NvbCkgJiZcbiAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgIFwiJWNEb3dubG9hZCB0aGUgUmVhY3QgRGV2VG9vbHMgZm9yIGEgYmV0dGVyIGRldmVsb3BtZW50IGV4cGVyaWVuY2U6IGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvcmVhY3QtZGV2dG9vbHNcIiArXG4gICAgICAgICAgICAoXCJmaWxlOlwiID09PSBwcm90b2NvbFxuICAgICAgICAgICAgICA/IFwiXFxuWW91IG1pZ2h0IG5lZWQgdG8gdXNlIGEgbG9jYWwgSFRUUCBzZXJ2ZXIgKGluc3RlYWQgb2YgZmlsZTovLyk6IGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvcmVhY3QtZGV2dG9vbHMtZmFxXCJcbiAgICAgICAgICAgICAgOiBcIlwiKSxcbiAgICAgICAgICBcImZvbnQtd2VpZ2h0OmJvbGRcIlxuICAgICAgICApO1xuICAgIH1cbiAgICBleHBvcnRzLmNyZWF0ZVJvb3QgPSBmdW5jdGlvbiAoY29udGFpbmVyLCBvcHRpb25zKSB7XG4gICAgICBpZiAoIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKSlcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJUYXJnZXQgY29udGFpbmVyIGlzIG5vdCBhIERPTSBlbGVtZW50LlwiKTtcbiAgICAgIHdhcm5JZlJlYWN0RE9NQ29udGFpbmVySW5ERVYoY29udGFpbmVyKTtcbiAgICAgIHZhciBpc1N0cmljdE1vZGUgPSAhMSxcbiAgICAgICAgaWRlbnRpZmllclByZWZpeCA9IFwiXCIsXG4gICAgICAgIG9uVW5jYXVnaHRFcnJvciA9IGRlZmF1bHRPblVuY2F1Z2h0RXJyb3IsXG4gICAgICAgIG9uQ2F1Z2h0RXJyb3IgPSBkZWZhdWx0T25DYXVnaHRFcnJvcixcbiAgICAgICAgb25SZWNvdmVyYWJsZUVycm9yID0gZGVmYXVsdE9uUmVjb3ZlcmFibGVFcnJvcjtcbiAgICAgIG51bGwgIT09IG9wdGlvbnMgJiZcbiAgICAgICAgdm9pZCAwICE9PSBvcHRpb25zICYmXG4gICAgICAgIChvcHRpb25zLmh5ZHJhdGVcbiAgICAgICAgICA/IGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgXCJoeWRyYXRlIHRocm91Z2ggY3JlYXRlUm9vdCBpcyBkZXByZWNhdGVkLiBVc2UgUmVhY3RET01DbGllbnQuaHlkcmF0ZVJvb3QoY29udGFpbmVyLCA8QXBwIC8+KSBpbnN0ZWFkLlwiXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBcIm9iamVjdFwiID09PSB0eXBlb2Ygb3B0aW9ucyAmJlxuICAgICAgICAgICAgbnVsbCAhPT0gb3B0aW9ucyAmJlxuICAgICAgICAgICAgb3B0aW9ucy4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFICYmXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBcIllvdSBwYXNzZWQgYSBKU1ggZWxlbWVudCB0byBjcmVhdGVSb290LiBZb3UgcHJvYmFibHkgbWVhbnQgdG8gY2FsbCByb290LnJlbmRlciBpbnN0ZWFkLiBFeGFtcGxlIHVzYWdlOlxcblxcbiAgbGV0IHJvb3QgPSBjcmVhdGVSb290KGRvbUNvbnRhaW5lcik7XFxuICByb290LnJlbmRlcig8QXBwIC8+KTtcIlxuICAgICAgICAgICAgKSxcbiAgICAgICAgITAgPT09IG9wdGlvbnMudW5zdGFibGVfc3RyaWN0TW9kZSAmJiAoaXNTdHJpY3RNb2RlID0gITApLFxuICAgICAgICB2b2lkIDAgIT09IG9wdGlvbnMuaWRlbnRpZmllclByZWZpeCAmJlxuICAgICAgICAgIChpZGVudGlmaWVyUHJlZml4ID0gb3B0aW9ucy5pZGVudGlmaWVyUHJlZml4KSxcbiAgICAgICAgdm9pZCAwICE9PSBvcHRpb25zLm9uVW5jYXVnaHRFcnJvciAmJlxuICAgICAgICAgIChvblVuY2F1Z2h0RXJyb3IgPSBvcHRpb25zLm9uVW5jYXVnaHRFcnJvciksXG4gICAgICAgIHZvaWQgMCAhPT0gb3B0aW9ucy5vbkNhdWdodEVycm9yICYmXG4gICAgICAgICAgKG9uQ2F1Z2h0RXJyb3IgPSBvcHRpb25zLm9uQ2F1Z2h0RXJyb3IpLFxuICAgICAgICB2b2lkIDAgIT09IG9wdGlvbnMub25SZWNvdmVyYWJsZUVycm9yICYmXG4gICAgICAgICAgKG9uUmVjb3ZlcmFibGVFcnJvciA9IG9wdGlvbnMub25SZWNvdmVyYWJsZUVycm9yKSk7XG4gICAgICBvcHRpb25zID0gY3JlYXRlRmliZXJSb290KFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIDEsXG4gICAgICAgICExLFxuICAgICAgICBudWxsLFxuICAgICAgICBudWxsLFxuICAgICAgICBpc1N0cmljdE1vZGUsXG4gICAgICAgIGlkZW50aWZpZXJQcmVmaXgsXG4gICAgICAgIG51bGwsXG4gICAgICAgIG9uVW5jYXVnaHRFcnJvcixcbiAgICAgICAgb25DYXVnaHRFcnJvcixcbiAgICAgICAgb25SZWNvdmVyYWJsZUVycm9yLFxuICAgICAgICBkZWZhdWx0T25EZWZhdWx0VHJhbnNpdGlvbkluZGljYXRvclxuICAgICAgKTtcbiAgICAgIGNvbnRhaW5lcltpbnRlcm5hbENvbnRhaW5lckluc3RhbmNlS2V5XSA9IG9wdGlvbnMuY3VycmVudDtcbiAgICAgIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKGNvbnRhaW5lcik7XG4gICAgICByZXR1cm4gbmV3IFJlYWN0RE9NUm9vdChvcHRpb25zKTtcbiAgICB9O1xuICAgIGV4cG9ydHMuaHlkcmF0ZVJvb3QgPSBmdW5jdGlvbiAoY29udGFpbmVyLCBpbml0aWFsQ2hpbGRyZW4sIG9wdGlvbnMpIHtcbiAgICAgIGlmICghaXNWYWxpZENvbnRhaW5lcihjb250YWluZXIpKVxuICAgICAgICB0aHJvdyBFcnJvcihcIlRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuXCIpO1xuICAgICAgd2FybklmUmVhY3RET01Db250YWluZXJJbkRFVihjb250YWluZXIpO1xuICAgICAgdm9pZCAwID09PSBpbml0aWFsQ2hpbGRyZW4gJiZcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBcIk11c3QgcHJvdmlkZSBpbml0aWFsIGNoaWxkcmVuIGFzIHNlY29uZCBhcmd1bWVudCB0byBoeWRyYXRlUm9vdC4gRXhhbXBsZSB1c2FnZTogaHlkcmF0ZVJvb3QoZG9tQ29udGFpbmVyLCA8QXBwIC8+KVwiXG4gICAgICAgICk7XG4gICAgICB2Y
15852XIgaXNTdHJpY3RNb2RlID0gITEsXG4gICAgICAgIGlkZW50aWZpZXJQcmVmaXggPSBcIlwiLFxuICAgICAgICBvblVuY2F1Z2h0RXJyb3IgPSBkZWZhdWx0T25VbmNhdWdodEVycm9yLFxuICAgICAgICBvbkNhdWdodEVycm9yID0gZGVmYXVsdE9uQ2F1Z2h0RXJyb3IsXG4gICAgICAgIG9uUmVjb3ZlcmFibGVFcnJvciA9IGRlZmF1bHRPblJlY292ZXJhYmxlRXJyb3IsXG4gICAgICAgIGZvcm1TdGF0ZSA9IG51bGw7XG4gICAgICBudWxsICE9PSBvcHRpb25zICYmXG4gICAgICAgIHZvaWQgMCAhPT0gb3B0aW9ucyAmJlxuICAgICAgICAoITAgPT09IG9wdGlvbnMudW5zdGFibGVfc3RyaWN0TW9kZSAmJiAoaXNTdHJpY3RNb2RlID0gITApLFxuICAgICAgICB2b2lkIDAgIT09IG9wdGlvbnMuaWRlbnRpZmllclByZWZpeCAmJlxuICAgICAgICAgIChpZGVudGlmaWVyUHJlZml4ID0gb3B0aW9ucy5pZGVudGlmaWVyUHJlZml4KSxcbiAgICAgICAgdm9pZCAwICE9PSBvcHRpb25zLm9uVW5jYXVnaHRFcnJvciAmJlxuICAgICAgICAgIChvblVuY2F1Z2h0RXJyb3IgPSBvcHRpb25zLm9uVW5jYXVnaHRFcnJvciksXG4gICAgICAgIHZvaWQgMCAhPT0gb3B0aW9ucy5vbkNhdWdodEVycm9yICYmXG4gICAgICAgICAgKG9uQ2F1Z2h0RXJyb3IgPSBvcHRpb25zLm9uQ2F1Z2h0RXJyb3IpLFxuICAgICAgICB2b2lkIDAgIT09IG9wdGlvbnMub25SZWNvdmVyYWJsZUVycm9yICYmXG4gICAgICAgICAgKG9uUmVjb3ZlcmFibGVFcnJvciA9IG9wdGlvbnMub25SZWNvdmVyYWJsZUVycm9yKSxcbiAgICAgICAgdm9pZCAwICE9PSBvcHRpb25zLmZvcm1TdGF0ZSAmJiAoZm9ybVN0YXRlID0gb3B0aW9ucy5mb3JtU3RhdGUpKTtcbiAgICAgIGluaXRpYWxDaGlsZHJlbiA9IGNyZWF0ZUZpYmVyUm9vdChcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICAxLFxuICAgICAgICAhMCxcbiAgICAgICAgaW5pdGlhbENoaWxkcmVuLFxuICAgICAgICBudWxsICE9IG9wdGlvbnMgPyBvcHRpb25zIDogbnVsbCxcbiAgICAgICAgaXNTdHJpY3RNb2RlLFxuICAgICAgICBpZGVudGlmaWVyUHJlZml4LFxuICAgICAgICBmb3JtU3RhdGUsXG4gICAgICAgIG9uVW5jYXVnaHRFcnJvcixcbiAgICAgICAgb25DYXVnaHRFcnJvcixcbiAgICAgICAgb25SZWNvdmVyYWJsZUVycm9yLFxuICAgICAgICBkZWZhdWx0T25EZWZhdWx0VHJhbnNpdGlvbkluZGljYXRvclxuICAgICAgKTtcbiAgICAgIGluaXRpYWxDaGlsZHJlbi5jb250ZXh0ID0gZ2V0Q29udGV4dEZvclN1YnRyZWUobnVsbCk7XG4gICAgICBvcHRpb25zID0gaW5pdGlhbENoaWxkcmVuLmN1cnJlbnQ7XG4gICAgICBpc1N0cmljdE1vZGUgPSByZXF1ZXN0VXBkYXRlTGFuZShvcHRpb25zKTtcbiAgICAgIGlzU3RyaWN0TW9kZSA9IGdldEJ1bXBlZExhbmVGb3JIeWRyYXRpb25CeUxhbmUoaXNTdHJpY3RNb2RlKTtcbiAgICAgIGlkZW50aWZpZXJQcmVmaXggPSBjcmVhdGVVcGRhdGUoaXNTdHJpY3RNb2RlKTtcbiAgICAgIGlkZW50aWZpZXJQcmVmaXguY2FsbGJhY2sgPSBudWxsO1xuICAgICAgZW5xdWV1ZVVwZGF0ZShvcHRpb25zLCBpZGVudGlmaWVyUHJlZml4LCBpc1N0cmljdE1vZGUpO1xuICAgICAgc3RhcnRVcGRhdGVUaW1lckJ5TGFuZShpc1N0cmljdE1vZGUsIFwiaHlkcmF0ZVJvb3QoKVwiLCBudWxsKTtcbiAgICAgIG9wdGlvbnMgPSBpc1N0cmljdE1vZGU7XG4gICAgICBpbml0aWFsQ2hpbGRyZW4uY3VycmVudC5sYW5lcyA9IG9wdGlvbnM7XG4gICAgICBtYXJrUm9vdFVwZGF0ZWQkMShpbml0aWFsQ2hpbGRyZW4sIG9wdGlvbnMpO1xuICAgICAgZW5zdXJlUm9vdElzU2NoZWR1bGVkKGluaXRpYWxDaGlsZHJlbik7XG4gICAgICBjb250YWluZXJbaW50ZXJuYWxDb250YWluZXJJbnN0YW5jZUtleV0gPSBpbml0aWFsQ2hpbGRyZW4uY3VycmVudDtcbiAgICAgIGxpc3RlblRvQWxsU3VwcG9ydGVkRXZlbnRzKGNvbnRhaW5lcik7XG4gICAgICByZXR1cm4gbmV3IFJlYWN0RE9NSHlkcmF0aW9uUm9vdChpbml0aWFsQ2hpbGRyZW4pO1xuICAgIH07XG4gICAgZXhwb3J0cy52ZXJzaW9uID0gXCIxOS4zLjBcIjtcbiAgICBcInVuZGVmaW5lZFwiICE9PSB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICYmXG4gICAgICBcImZ1bmN0aW9uXCIgPT09XG4gICAgICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AgJiZcbiAgICAgIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcChFcnJvcigpKTtcbiAgfSkoKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gY2hlY2tEQ0UoKSB7XG4gIC8qIGdsb2JhbCBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gKi9cbiAgaWYgKFxuICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gPT09ICd1bmRlZmluZWQnIHx8XG4gICAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRSAhPT0gJ2Z1bmN0aW9uJ1xuICApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAvLyBUaGlzIGJyYW5jaCBpcyB1bnJlYWNoYWJsZSBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWRcbiAgICAvLyBpbiBwcm9kdWN0aW9uLCBidXQgdGhlIGNvbmRpdGlvbiBpcyB0cnVlIG9ubHkgaW4gZGV2ZWxvcG1lbnQuXG4gICAgLy8gVGhlcmVmb3JlIGlmIHRoZSBicmFuY2ggaXMgc3RpbGwgaGVyZSwgZGVhZCBjb2RlIGVsaW1pbmF0aW9uIHdhc24ndFxuICAgIC8vIHByb3Blcmx5IGFwcGxpZWQuXG4gICAgLy8gRG9uJ3QgY2hhbmdlIHRoZSBtZXNzYWdlLiBSZWFjdCBEZXZUb29scyByZWxpZXMgb24gaXQuIEFsc28gbWFrZSBzdXJlXG4gICAgLy8gdGhpcyBtZXNzYWdlIGRvZXNuJ3Qgb2NjdXIgZWxzZXdoZXJlIGluIHRoaXMgZnVuY3Rpb24sIG9yIGl0IHdpbGwgY2F1c2VcbiAgICAvLyBhIGZhbHNlIHBvc2l0aXZlLlxuICAgIHRocm93IG5ldyBFcnJvcignXl9eJyk7XG4gIH1cbiAgdHJ5IHtcbiAgICAvLyBWZXJpZnkgdGhhdCB0aGUgY29kZSBhYm92ZSBoYXMgYmVlbiBkZWFkIGNvZGUgZWxpbWluYXRlZCAoRENFJ2QpLlxuICAgIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRShjaGVja0RDRSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIERldlRvb2xzIHNob3VsZG4ndCBjcmFzaCBSZWFjdCwgbm8gbWF0dGVyIHdoYXQuXG4gICAgLy8gV2Ugc2hvdWxkIHN0aWxsIHJlcG9ydCBpbiBjYXNlIHdlIGJyZWFrIHRoaXMgY29kZS5cbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH1cbn1cblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgLy8gRENFIGNoZWNrIHNob3VsZCBoYXBwZW4gYmVmb3JlIFJlYWN0RE9NIGJ1bmRsZSBleGVjdXRlcyBzbyB0aGF0XG4gIC8vIERldlRvb2xzIGNhbiByZXBvcnQgYmFkIG1pbmlmaWNhdGlvbiBkdXJpbmcgaW5qZWN0aW9uLlxuICBjaGVja0RDRSgpO1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LWRvbS1jbGllbnQucHJvZHVjdGlvbi5qcycpO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Nqcy9yZWFjdC1kb20tY2xpZW50LmRldmVsb3BtZW50LmpzJyk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0NBV0EsQ0FDRyxXQUFZO0VBQ1gsU0FBUywyQkFBMkI7R0FDbEMsYUFBYSxDQUFDO0dBQ2QsSUFBSSxzQkFBc0I7SUFDeEIsSUFBSSxjQUFjLFFBQVEsYUFBYTtJQUN2QyxZQUFZO0lBQ1osSUFBSSxjQUFjLENBQUM7SUFDbkIsSUFBSTtLQUNGLEdBQUc7TUFDRCwwQkFBMEIsQ0FBQztNQUMzQiwyQkFDSSx5QkFBeUIsQ0FBQyxHQUM1QixrQkFBa0IsYUFBYSxHQUM5QixnQkFBZ0I7TUFDbkIsbUJBQW1CLENBQUM7T
15852UFDcEIsSUFBSSx3QkFBd0I7TUFDNUIsSUFBSTtPQUNGLEdBQUc7UUFDRCxjQUFjLFdBQVc7UUFDekIsS0FDRSxjQUFjLEtBQUssU0FBUyxHQUM1QixTQUFTLGVBQ1QsRUFDRSxZQUFZLGlCQUFpQixlQUM3QixrQkFBa0IsS0FHcEI7U0FDQSxJQUFJLFdBQVcsWUFBWTtTQUMzQixJQUFJLGVBQWUsT0FBTyxVQUFVO1VBQ2xDLFlBQVksV0FBVztVQUN2Qix1QkFBdUIsWUFBWTtVQUNuQyxJQUFJLHVCQUF1QixTQUN6QixZQUFZLGtCQUFrQixXQUNoQztVQUNBLGNBQWMsUUFBUSxhQUFhO1VBQ25DLElBQUksZUFBZSxPQUFPLHNCQUFzQjtXQUM5QyxZQUFZLFdBQVc7V0FDdkIsY0FBYyxXQUFXO1dBQ3pCLGNBQWMsQ0FBQztXQUNmLE1BQU07VUFDUjtVQUNBLGdCQUFnQixLQUFLLFNBQVMsS0FBSyxJQUFJLFNBQVM7VUFDaEQsY0FBYyxXQUFXO1NBQzNCLE9BQU8sSUFBSSxTQUFTO1NBQ3BCLGNBQWMsS0FBSyxTQUFTO1FBQzlCO1FBQ0EsSUFBSSxTQUFTLGFBQWEsY0FBYyxDQUFDO2FBQ3BDO1NBQ0gsSUFBSSxhQUFhLEtBQUssVUFBVTtTQUNoQyxTQUFTLGNBQ1AsbUJBQ0UsZUFDQSxXQUFXLFlBQVksV0FDekI7U0FDRixjQUFjLENBQUM7UUFDakI7T0FDRjtPQUNBLE1BQU07TUFDUixVQUFVO09BQ1IsY0FBZSxNQUNaLHVCQUF1Qix1QkFDdkIsbUJBQW1CLENBQUM7TUFDekI7TUFDQSxjQUFjLEtBQUs7S0FDckI7SUFDRixVQUFVO0tBQ1IsY0FDSSxpQ0FBaUMsSUFDaEMsdUJBQXVCLENBQUM7SUFDL0I7R0FDRjtFQUNGO0VBQ0EsU0FBUyxLQUFLLE1BQU0sTUFBTTtHQUN4QixJQUFJLFFBQVEsS0FBSztHQUNqQixLQUFLLEtBQUssSUFBSTtHQUNkLEdBQUcsT0FBTyxJQUFJLFFBQVM7SUFDckIsSUFBSSxjQUFlLFFBQVEsTUFBTyxHQUNoQyxTQUFTLEtBQUs7SUFDaEIsSUFBSSxJQUFJLFFBQVEsUUFBUSxJQUFJLEdBQzFCLEtBQU0sZUFBZSxNQUNsQixLQUFLLFNBQVMsUUFDZCxRQUFRO1NBQ1IsTUFBTTtHQUNiO0VBQ0Y7RUFDQSxTQUFTLEtBQUssTUFBTTtHQUNsQixPQUFPLE1BQU0sS0FBSyxTQUFTLE9BQU8sS0FBSztFQUN6QztFQUNBLFNBQVMsSUFBSSxNQUFNO0dBQ2pCLElBQUksTUFBTSxLQUFLLFFBQVEsT0FBTztHQUM5QixJQUFJLFFBQVEsS0FBSyxJQUNmLE9BQU8sS0FBSyxJQUFJO0dBQ2xCLElBQUksU0FBUyxPQUFPO0lBQ2xCLEtBQUssS0FBSztJQUNWLEdBQUcsS0FDRCxJQUFJLFFBQVEsR0FBRyxTQUFTLEtBQUssUUFBUSxhQUFhLFdBQVcsR0FDN0QsUUFBUSxhQUVSO0tBQ0EsSUFBSSxZQUFZLEtBQUssUUFBUSxLQUFLLEdBQ2hDLE9BQU8sS0FBSyxZQUNaLGFBQWEsWUFBWSxHQUN6QixRQUFRLEtBQUs7S0FDZixJQUFJLElBQUksUUFBUSxNQUFNLElBQUksR0FDeEIsYUFBYSxVQUFVLElBQUksUUFBUSxPQUFPLElBQUksS0FDeEMsS0FBSyxTQUFTLE9BQ2YsS0FBSyxjQUFjLE1BQ25CLFFBQVEsZUFDUCxLQUFLLFNBQVMsTUFDZixLQUFLLGFBQWEsTUFDbEIsUUFBUTtVQUNWLElBQUksYUFBYSxVQUFVLElBQUksUUFBUSxPQUFPLElBQUksR0FDckQsS0FBTSxTQUFTLE9BQ1osS0FBSyxjQUFjLE1BQ25CLFFBQVE7VUFDUixNQUFNO0lBQ2I7R0FDRjtHQUNBLE9BQU87RUFDVDtFQUNBLFNBQVMsUUFBUSxHQUFHLEdBQUc7R0FDckIsSUFBSSxPQUFPLEVBQUUsWUFBWSxFQUFFO0dBQzNCLE9BQU8sTUFBTSxPQUFPLE9BQU8sRUFBRSxLQUFLLEVBQUU7RUFDdEM7RUFDQSxTQUFTLGNBQWMsYUFBYTtHQUNsQyxLQUFLLElBQUksUUFBUSxLQUFLLFVBQVUsR0FBRyxTQUFTLFFBQVM7SUFDbkQsSUFBSSxTQUFTLE1BQU0sVUFBVSxJQUFJLFVBQVU7U0FDdEMsSUFBSSxNQUFNLGFBQWEsYUFDMUIsSUFBSSxVQUFVLEdBQ1gsTUFBTSxZQUFZLE1BQU0sZ0JBQ3pCLEtBQUssV0FBVyxLQUFLO1NBQ3BCO0lBQ0wsUUFBUSxLQUFLLFVBQVU7R0FDekI7RUFDRjtFQUNBLFNBQVMsY0FBYyxhQUFhO0dBQ2xDLHlCQUF5QixDQUFDO0dBQzFCLGNBQWMsV0FBVztHQUN6QixJQUFJLENBQUMseUJBQ0gsSUFBSSxTQUFTLEtBQUssU0FBUyxHQUN6QiwwQkFBMkIsQ0FBQyxHQUMxQix5QkFDSSx1QkFBdUIsQ0FBQyxHQUFJLGlDQUFpQztRQUNoRTtJQUNILElBQUksYUFBYSxLQUFLLFVBQVU7SUFDaEMsU0FBUyxjQUNQLG1CQUNFLGVBQ0EsV0FBVyxZQUFZLFdBQ3pCO0dBQ0o7RUFDSjtFQUNBLFNBQVMsb0JBQW9CO0dBQzNCLE9BQU8sYUFDSCxDQUFDLElBQ0QsUUFBUSxhQUFhLElBQUksWUFBWSxnQkFDbkMsQ0FBQyxJQUNELENBQUM7RUFDVDtFQUNBLFNBQVMsbUJBQW1CLFVBQVUsSUFBSTtHQUN4QyxnQkFBZ0IsZ0JBQWdCLFdBQVk7SUFDMUMsU0FBUyxRQUFRLGFBQWEsQ0FBQztHQUNqQyxHQUFHLEVBQUU7RUFDUDtFQUNBLGdCQUFnQixPQUFPLGtDQUNyQixlQUNFLE9BQU8sK0JBQStCLCtCQUN4QywrQkFBK0IsNEJBQTRCLE1BQU0sQ0FBQztFQUNwRSxRQUFRLGVBQWUsS0FBSztFQUM1QixJQUNFLGFBQWEsT0FBTyxlQUNwQixlQUFlLE9BQU8sWUFBWSxLQUNsQztHQUNBLElBQUksbUJBQW1CO0dBQ3ZCLFFBQVEsZUFBZSxXQUFZO0lBQ2pDLE9BQU8saUJBQWlCLElBQUk7R0FDOUI7RUFDRixPQUFPO0dBQ0wsSUFBSSxZQUFZLE1BQ2QsY0FBYyxVQUFVLElBQUk7R0FDOUIsUUFBUSxlQUFlLFdBQVk7SUFDakMsT0FBTyxVQUFVLElBQUksSUFBSTtHQUMzQjtFQUNGO0VBQ0EsSUFBSSxZQUFZLENBQUMsR0FDZixhQUFhLENBQUMsR0FDZCxnQkFBZ0IsR0FDaEIsY0FBYyxNQUNkLHVCQUF1QixHQUN2QixtQkFBbUIsQ0FBQyxHQUNwQiwwQkFBMEIsQ0FBQyxHQUMzQix5QkFBeUIsQ0FBQyxHQUMxQixhQUFhLENBQUMsR0FDZCxrQkFBa0IsZUFBZSxPQUFPLGFBQWEsYUFBYSxNQUNsRSxvQkFDRSxlQUFlLE9BQU8sZUFBZSxlQUFlLE1BQ3RELG9CQUNFLGdCQUFnQixPQUFPLGVBQWUsZUFBZSxNQUN2RCx1QkFBdUIsQ0FBQyxHQUN4QixnQkFBZ0IsSUFDaEIsZ0JBQWdCLEdBQ2hCLFlBQVk7RUFDZCxJQUFJLGVBQWUsT0FBTyxtQkFDeEIsSUFBSSxtQ0FBbUMsV0FBWTtHQUNqRCxrQkFBa0Isd0JBQXdCO0VBQzVDO09BQ0csSUFBSSxnQkFBZ0IsT0FBTyxnQkFBZ0I7R0FDOUMsSUFBSSxVQUFVLElBQUksZUFBZSxHQUMvQixPQUFPLFFBQVE7R0FDakIsUUFBUSxNQUFNLFlBQVk7R0FDMUIsbUNBQW1DLFdBQVk7SUFDN0MsS0FBSyxZQUFZLElBQUk7R0FDdkI7RUFDRixPQUNFLG1DQUFtQyxXQUFZO0dBQzdDLGdCQUFnQiwwQkFBMEIsQ0FBQztFQUM3QztFQUNGLFFBQVEsd0JBQXdCO0VBQ2hDLFFBQVEsNkJBQTZCO0VBQ3JDLFFBQVEsdUJBQXVCO0VBQy9CLFFBQVEsMEJBQTBCO0VBQ2xDLFFBQVEscUJBQXFCO0VBQzdCLFFBQVEsZ0NBQWdDO0VBQ3hDLFFBQVEsMEJBQTBCLFNBQVUsTUFBTTtHQUNoRCxLQUFLLFdBQVc7RUFDbEI7RUFDQSxRQUFRLDBCQUEwQixTQUFVLEtBQUs7R0FDL0MsSUFBSSxPQUFPLE1BQU0sTUFDYixRQUFRLE1BQ04saUhBQ0YsSUFDQyxnQkFBZ0IsSUFBSSxNQUFNLEtBQUssTUFBTSxNQUFNLEdBQUcsSUFBSTtFQUN6RDtFQUNBLFFBQVEsbUNBQW1DLFdBQVk7R0FDckQsT0FBTztFQUNUO0VBQ0EsUUFBUSxnQkFBZ0IsU0FBVSxjQUFjO0dBQzlDLFFBQVEsc0JBQVI7SUFDRSxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7S0FDSCxJQUFJLGdCQUFnQjtLQUNwQjtJQUNGLFNBQ0UsZ0JBQWdCO0dBQ3BCO0dBQ0EsSUFBSSx3QkFBd0I7R0FDNUIsdUJBQXVCO0dBQ3ZCLElBQUk7SUFDRixPQUFPLGFBQWE7R0FDdEIsVUFBVTtJQUNSLHVCQUF1QjtHQUN6QjtFQUNGO0VBQ0EsUUFBUSx3QkFBd0IsV0FBWTtHQUMxQyxhQUFhLENBQUM7RUFDaEI7RUFDQSxRQUFRLDJCQUEyQixTQUFVLGVBQWUsY0FBYztHQUN4RSxRQUFRLGVBQVI7SUFDRSxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSyxHQUNIO0lBQ0YsU0FDRSxnQkFBZ0I7R0FDcEI7R0FDQSxJQUFJLHdCQUF3QjtHQUM1Qix1QkFBdUI7R0FDdkIsSUFBSTtJQUNGLE9BQU8sYUFBYTtHQUN0QixVQUFVO0lBQ1IsdUJBQXVCO0dBQ3pCO0VBQ0Y7RUFDQSxRQUFRLDRCQUE0QixTQUNsQyxlQUNBLFVBQ0EsU0FDQTtHQUNBLElBQUksY0FBYyxRQUFRLGFBQWE7R0FDdkMsYUFBYSxPQUFPLFdBQVcsU0FBUyxXQUNsQyxVQUFVLFFBQVEsT0FDbkIsVUFDQyxhQUFhLE9BQU8sV0FBVyxJQUFJLFVBQy9CLGNBQWMsVUFDZCxlQUNMLFVBQVU7
15852R0FDZixRQUFRLGVBQVI7SUFDRSxLQUFLO0tBQ0gsSUFBSSxVQUFVO0tBQ2Q7SUFDRixLQUFLO0tBQ0gsVUFBVTtLQUNWO0lBQ0YsS0FBSztLQUNILFVBQVU7S0FDVjtJQUNGLEtBQUs7S0FDSCxVQUFVO0tBQ1Y7SUFDRixTQUNFLFVBQVU7R0FDZDtHQUNBLFVBQVUsVUFBVTtHQUNwQixnQkFBZ0I7SUFDZCxJQUFJO0lBQ007SUFDSztJQUNmLFdBQVc7SUFDWCxnQkFBZ0I7SUFDaEIsV0FBVztHQUNiO0dBQ0EsVUFBVSxlQUNKLGNBQWMsWUFBWSxTQUM1QixLQUFLLFlBQVksYUFBYSxHQUM5QixTQUFTLEtBQUssU0FBUyxLQUNyQixrQkFBa0IsS0FBSyxVQUFVLE1BQ2hDLDBCQUNJLGtCQUFrQixhQUFhLEdBQUksZ0JBQWdCLE1BQ25ELHlCQUF5QixDQUFDLEdBQy9CLG1CQUFtQixlQUFlLFVBQVUsV0FBVyxPQUN2RCxjQUFjLFlBQVksU0FDNUIsS0FBSyxXQUFXLGFBQWEsR0FDN0IsMkJBQ0UscUJBQ0UsMEJBQTBCLENBQUMsR0FDN0IseUJBQ0ksdUJBQXVCLENBQUMsR0FDMUIsaUNBQWlDO0dBQ3pDLE9BQU87RUFDVDtFQUNBLFFBQVEsdUJBQXVCO0VBQy9CLFFBQVEsd0JBQXdCLFNBQVUsVUFBVTtHQUNsRCxJQUFJLHNCQUFzQjtHQUMxQixPQUFPLFdBQVk7SUFDakIsSUFBSSx3QkFBd0I7SUFDNUIsdUJBQXVCO0lBQ3ZCLElBQUk7S0FDRixPQUFPLFNBQVMsTUFBTSxNQUFNLFNBQVM7SUFDdkMsVUFBVTtLQUNSLHVCQUF1QjtJQUN6QjtHQUNGO0VBQ0Y7RUFDQSxnQkFBZ0IsT0FBTyxrQ0FDckIsZUFDRSxPQUFPLCtCQUErQiw4QkFDeEMsK0JBQStCLDJCQUEyQixNQUFNLENBQUM7Q0FDckUsRUFBQSxDQUFHOzs7OztDQ3RXSCxPQUFPLFVBQUEsOEJBQUE7Ozs7Ozs7Ozs7Ozs7O0NDU1QsQ0FDRyxXQUFZO0VBQ1gsU0FBUyxTQUFTLE9BQU8sSUFBSTtHQUMzQixLQUFLLFFBQVEsTUFBTSxlQUFlLFNBQVMsU0FBUyxJQUFJLEtBQ3RELFFBQVMsTUFBTSxNQUFPO0dBQ3hCLE9BQU87RUFDVDtFQUNBLFNBQVMsZ0JBQWdCLEtBQUssTUFBTSxPQUFPLE9BQU87R0FDaEQsSUFBSSxTQUFTLEtBQUssUUFBUSxPQUFPO0dBQ2pDLElBQUksTUFBTSxLQUFLLFFBQ2IsVUFBVSxZQUFZLEdBQUcsSUFBSSxJQUFJLE1BQU0sSUFBSSxPQUFPLENBQUMsR0FBRyxHQUFHO0dBQzNELFFBQVEsT0FBTyxnQkFBZ0IsSUFBSSxNQUFNLE1BQU0sUUFBUSxHQUFHLEtBQUs7R0FDL0QsT0FBTztFQUNUO0VBQ0EsU0FBUyxlQUFlLEtBQUssU0FBUyxTQUFTO0dBQzdDLElBQUksUUFBUSxXQUFXLFFBQVEsUUFDN0IsUUFBUSxLQUFLLG1EQUFtRDtRQUM3RDtJQUNILEtBQUssSUFBSSxJQUFJLEdBQUcsSUFBSSxRQUFRLFNBQVMsR0FBRyxLQUN0QyxJQUFJLFFBQVEsT0FBTyxRQUFRLElBQUk7S0FDN0IsUUFBUSxLQUNOLDBFQUNGO0tBQ0E7SUFDRjtJQUNGLE9BQU8sbUJBQW1CLEtBQUssU0FBUyxTQUFTLENBQUM7R0FDcEQ7RUFDRjtFQUNBLFNBQVMsbUJBQW1CLEtBQUssU0FBUyxTQUFTLE9BQU87R0FDeEQsSUFBSSxTQUFTLFFBQVEsUUFDbkIsVUFBVSxZQU
15852FZLEdBQUcsSUFBSSxJQUFJLE1BQU0sSUFBSSxPQUFPLENBQUMsR0FBRyxHQUFHO0dBQzNELFFBQVEsTUFBTSxRQUFRLFVBQ2hCLFFBQVEsUUFBUSxVQUFVLFFBQVEsU0FDcEMsWUFBWSxPQUFPLElBQ2YsUUFBUSxPQUFPLFFBQVEsQ0FBQyxJQUN4QixPQUFPLFFBQVEsV0FDbEIsUUFBUSxVQUFVLG1CQUNqQixJQUFJLFNBQ0osU0FDQSxTQUNBLFFBQVEsQ0FDVjtHQUNKLE9BQU87RUFDVDtFQUNBLFNBQVMsbUJBQW1CLEtBQUssTUFBTSxPQUFPO0dBQzVDLElBQUksTUFBTSxLQUFLLFFBQ2IsVUFBVSxZQUFZLEdBQUcsSUFBSSxJQUFJLE1BQU0sSUFBSSxPQUFPLENBQUMsR0FBRyxHQUFHO0dBQzNELElBQUksUUFBUSxNQUFNLEtBQUssUUFDckIsT0FDRSxZQUFZLE9BQU8sSUFBSSxRQUFRLE9BQU8sS0FBSyxDQUFDLElBQUksT0FBTyxRQUFRLE1BQy9EO0dBRUosUUFBUSxPQUFPLG1CQUFtQixJQUFJLE1BQU0sTUFBTSxRQUFRLENBQUM7R0FDM0QsT0FBTztFQUNUO0VBQ0EsU0FBUyxvQkFBb0I7R0FDM0IsT0FBTyxDQUFDO0VBQ1Y7RUFDQSxTQUFTLGtCQUFrQjtHQUN6QixPQUFPO0VBQ1Q7RUFDQSxTQUFTLHdCQUF3QjtHQUMvQixRQUFRLE1BQ04sa05BQ0Y7RUFDRjtFQUNBLFNBQVMsMkJBQTJCO0dBQ2xDLFFBQVEsTUFDTiw4UEFDRjtFQUNGO0VBQ0EsU0FBUyxPQUFPLENBQUM7RUFDakIsU0FBUyxvQkFBb0IsQ0FBQztFQUM5QixTQUFTLGtCQUFrQixLQUFLO0dBQzlCLElBQUksUUFBUSxDQUFDO0dBQ2IsSUFBSSxRQUFRLFNBQVUsT0FBTztJQUMzQixNQUFNLEtBQUssS0FBSztHQUNsQixDQUFDO0dBQ0QsT0FBTyxNQUFNLEtBQUssQ0FBQyxDQUFDLEtBQUssSUFBSTtFQUMvQjtFQUNBLFNBQVMsWUFBWSxLQUFLLGNBQWMsS0FBSyxNQUFNO0dBQ2pELE9BQU8sSUFBSSxVQUFVLEtBQUssY0FBYyxLQUFLLElBQUk7RUFDbkQ7RUFDQSxTQUFTLGFBQWEsTUFBTSxTQUFTO0dBQ25DLEtBQUssWUFBWSx1QkFDZCxvQkFBb0IsS0FBSyxTQUFTLEdBQUcsU0FBUyxNQUFNLE1BQU0sSUFBSSxHQUMvRCxnQkFBZ0I7RUFDcEI7RUFDQSxTQUFTLGdCQUFnQixNQUFNLFFBQVE7R0FDckMsSUFBSSxTQUFTLGVBQWU7SUFDMUIsSUFBSSxnQkFBZ0IsT0FBTztJQUMzQixTQUFTLE9BQU87SUFDaEIsb0JBQW9CO0lBQ3BCLHNDQUNFLEtBQUssU0FDTCxRQUNBLGFBQ0Y7SUFDQSxnQkFBZ0I7R0FDbEI7RUFDRjtFQUNBLFNBQVMsa0JBQWtCLFNBQVM7R0FDbEMsZ0JBQWdCO0VBQ2xCO0VBQ0EsU0FBUyxpQkFBaUIsTUFBTTtHQUM5QixPQUFPLEVBQ0wsQ0FBQyxRQUNBLE1BQU0sS0FBSyxZQUFZLE1BQU0sS0FBSyxZQUFZLE9BQU8sS0FBSztFQUUvRDtFQUNBLFNBQVMsdUJBQXVCLE9BQU87R0FDckMsS0FBSyxJQUFJLE9BQU8sT0FBTyxXQUFXLE1BQU0sWUFBWSxDQUFDLFNBQVMsWUFDNUQsT0FBUSxVQUNOLE9BQU8sS0FBSyxRQUFRLFVBQVUsUUFBUSxLQUFLLFNBQzFDLFdBQVcsS0FBSztHQUNyQixPQUFPLEtBQUssU0FBVSxPQUFPLEtBQUs7R0FDbEMsT0FBTyxNQUFNLEtBQUssTUFBTSxRQUFRO0VBQ2xDO0VBQ0EsU0FBUyw2QkFBNkIsT0FBTztHQUMzQyxJQUFJLE9BQU8sTUFBTSxLQUFLO0lBQ3BCLElBQUksZ0JBQWdCLE1BQU07SUFDMUIsU0FBUyxrQkFDTCxRQUFRLE1BQU0sV0FDaEIsU0FBUyxVQUFVLGdCQUFnQixNQUFNO0lBQzNDLElBQUksU0FBUyxlQUFlLE9BQU8sY0FBYztHQUNuRDtHQUNBLE9BQU87RUFDVDtFQUNBLFNBQVMsNkJBQTZCLE9BQU87R0FDM0MsSUFBSSxPQUFPLE1BQU0sS0FBSztJQUNwQixJQUFJLGdCQUFnQixNQUFNO0lBQzFCLFNBQVMsa0JBQ0wsUUFBUSxNQUFNLFdBQ2hCLFNBQVMsVUFBVSxnQkFBZ0IsTUFBTTtJQUMzQyxJQUFJLFNBQVMsZUFBZSxPQUFPLGNBQWM7R0FDbkQ7R0FDQSxPQUFPO0VBQ1Q7RUFDQSxTQUFTLGdCQUFnQixPQUFPO0dBQzlCLElBQUksdUJBQXVCLEtBQUssTUFBTSxPQUNwQyxNQUFNLE1BQU0sZ0RBQWdEO0VBQ2hFO0VBQ0EsU0FBUyw4QkFBOEIsT0FBTztHQUM1QyxJQUFJLFlBQVksTUFBTTtHQUN0QixJQUFJLENBQUMsV0FBVztJQUNkLFlBQVksdUJBQXVCLEtBQUs7SUFDeEMsSUFBSSxTQUFTLFdBQ1gsTUFBTSxNQUFNLGdEQUFnRDtJQUM5RCxPQUFPLGNBQWMsUUFBUSxPQUFPO0dBQ3RDO0dBQ0EsS0FBSyxJQUFJLElBQUksT0FBTyxJQUFJLGFBQWU7SUFDckMsSUFBSSxVQUFVLEVBQUU7SUFDaEIsSUFBSSxTQUFTLFNBQVM7SUFDdEIsSUFBSSxVQUFVLFFBQVE7SUFDdEIsSUFBSSxTQUFTLFNBQVM7S0FDcEIsSUFBSSxRQUFRO0tBQ1osSUFBSSxTQUFTLEdBQUc7TUFDZCxJQUFJO01BQ0o7S0FDRjtLQUNBO0lBQ0Y7SUFDQSxJQUFJLFFBQVEsVUFBVSxRQUFRLE9BQU87S0FDbkMsS0FBSyxVQUFVLFFBQVEsT0FBTyxVQUFXO01BQ3ZDLElBQUksWUFBWSxHQUFHLE9BQU8sZ0JBQWdCLE9BQU8sR0FBRztNQUNwRCxJQUFJLFlBQVksR0FBRyxPQUFPLGdCQUFnQixPQUFPLEdBQUc7TUFDcEQsVUFBVSxRQUFRO0tBQ3BCO0tBQ0EsTUFBTSxNQUFNLGdEQUFnRDtJQUM5RDtJQUNBLElBQUksRUFBRSxXQUFXLEVBQUUsUUFBUSxJQUFLLFNBQVcsSUFBSTtTQUMxQztLQUNILEtBQUssSUFBSSxlQUFlLENBQUMsR0FBRyxTQUFTLFFBQVEsT0FBTyxTQUFVO01BQzVELElBQUksV0FBVyxHQUFHO09BQ2hCLGVBQWUsQ0FBQztPQUNoQixJQUFJO09BQ0osSUFBSTtPQUNKO01BQ0Y7TUFDQSxJQUFJLFdBQVcsR0FBRztPQUNoQixlQUFlLENBQUM7T0FDaEIsSUFBSTtPQUNKLElBQUk7T0FDSjtNQUNGO01BQ0EsU0FBUyxPQUFPO0tBQ2xCO0tBQ0EsSUFBSSxDQUFDLGNBQWM7TUFDakIsS0FBSyxTQUFTLFFBQVEsT0FBTyxTQUFVO09BQ3JDLElBQUksV0FBVyxHQUFHO1FBQ2hCLGVBQWUsQ0FBQztRQUNoQixJQUFJO1FBQ0osSUFBSTtRQUNKO09BQ0Y7T0FDQSxJQUFJLFdBQVcsR0FBRztRQUNoQixlQUFlLENBQUM7UUFDaEIsSUFBSTtRQUNKLElBQUk7UUFDSjtPQUNGO09BQ0EsU0FBUyxPQUFPO01BQ2xCO01BQ0EsSUFBSSxDQUFDLGNBQ0gsTUFBTSxNQUNKLDhIQUNGO0tBQ0o7SUFDRjtJQUNBLElBQUksRUFBRSxjQUFjLEdBQ2xCLE1BQU0sTUFDSiw4SEFDRjtHQUNKO0dBQ0EsSUFBSSxNQUFNLEVBQUUsS0FDVixNQUFNLE1BQU0sZ0RBQWdEO0dBQzlELE9BQU8sRUFBRSxVQUFVLFlBQVksSUFBSSxRQUFRO0VBQzdDO0VBQ0EsU0FBUyx5QkFBeUIsTUF
15852BTTtHQUN0QyxJQUFJLE1BQU0sS0FBSztHQUNmLElBQUksTUFBTSxPQUFPLE9BQU8sT0FBTyxPQUFPLE9BQU8sTUFBTSxLQUFLLE9BQU87R0FDL0QsS0FBSyxPQUFPLEtBQUssT0FBTyxTQUFTLE9BQVE7SUFDdkMsTUFBTSx5QkFBeUIsSUFBSTtJQUNuQyxJQUFJLFNBQVMsS0FBSyxPQUFPO0lBQ3pCLE9BQU8sS0FBSztHQUNkO0dBQ0EsT0FBTztFQUNUO0VBQ0EsU0FBUywwQ0FDUCxlQUNBLElBQ0EsR0FDQSxHQUNBLEdBQ0E7R0FDQSx5Q0FDRSxjQUFjLE9BQ2QsQ0FBQyxHQUNELElBQ0EsR0FDQSxHQUNBLENBQ0Y7RUFDRjtFQUNBLFNBQVMseUNBQ1AsT0FDQSxtQkFDQSxJQUNBLEdBQ0EsR0FDQSxHQUNBO0dBQ0EsT0FBTyxTQUFTLFFBQVM7SUFDdkIsS0FDSSxNQUFNLE1BQU0sT0FBTyxPQUFPLE1BQU0sT0FBTyxNQUFNLE1BQU0sUUFDbkQsR0FBRyxPQUFPLEdBQUcsR0FBRyxDQUFDLE1BQ2pCLE9BQU8sTUFBTSxPQUFPLFNBQVMsTUFBTSxtQkFDbEMscUJBQXNCLE1BQU0sTUFBTSxPQUFPLE9BQU8sTUFBTSxRQUN2RCx5Q0FDRSxNQUFNLE9BQ04sbUJBQ0EsSUFDQSxHQUNBLEdBQ0EsQ0FDRixHQUVGLE9BQU8sQ0FBQztJQUNWLFFBQVEsTUFBTTtHQUNoQjtHQUNBLE9BQU8sQ0FBQztFQUNWO0VBQ0EsU0FBUywwQ0FBMEMsT0FBTztHQUN4RCxLQUFLLFFBQVEsTUFBTSxRQUFRLFNBQVMsUUFBUztJQUMzQyxJQUFJLE1BQU0sTUFBTSxPQUFPLE1BQU0sTUFBTSxPQUFPLE9BQU8sTUFBTSxLQUNyRCxPQUFPO0lBQ1QsUUFBUSxNQUFNO0dBQ2hCO0dBQ0EsT0FBTztFQUNUO0VBQ0EsU0FBUyx3QkFBd0IsT0FBTztHQUN0QyxJQUFJLG9CQUFvQixDQUFDO0dBQ3pCLEtBQUssUUFBUSxNQUFNLFFBQVEsU0FBUyxRQUFTO0lBQzNDLE1BQU0sTUFBTSxRQUFRLG9CQUFvQixDQUFDO0lBQ3pDLElBQUksTUFBTSxNQUFNLE9BQU8sTUFBTSxNQUFNLE9BQU8sT0FBTyxNQUFNLEtBQUs7SUFDNUQsUUFBUSxNQUFNO0dBQ2hCO0dBQ0EsT0FBTztFQUNUO0VBQ0EsU0FBUywwQ0FBMEMsT0FBTztHQUN4RCxJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksR0FDdEIsa0JBQWtCLDBDQUEwQyxLQUFLO0dBQ25FLElBQUksU0FBUyxpQkFBaUIsT0FBTztHQUNyQywyQ0FDRSxRQUNBLE9BQ0EsZ0JBQWdCLE9BQ2hCLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FDbEI7R0FDQSxPQUFPO0VBQ1Q7RUFDQSxTQUFTLDJDQUNQLFFBQ0EsTUFDQSxPQUNBLE9BQ0E7R0FDQSxPQUFPLFNBQVMsUUFBUztJQUN2QixJQUFJLFVBQVUsTUFBTSxNQUFNLFlBQVksQ0FBQztTQUNsQyxJQUFJLE1BQU0sTUFBTSxPQUFPLE9BQU8sTUFBTSxPQUFPLE1BQU0sTUFBTSxLQUFLO0tBQy9ELElBQUksTUFBTSxXQUFXLE9BQVEsT0FBTyxLQUFLLE9BQVEsQ0FBQztLQUNsRCxPQUFPLEtBQUs7SUFDZCxPQUFPLEtBQ0osT0FBTyxNQUFNLE9BQU8sU0FBUyxNQUFNLGtCQUNwQywyQ0FDRSxRQUNBLE1BQ0EsTUFBTSxPQUNOLEtBQ0YsR0FFQSxPQUFPLENBQUM7SUFDVixRQUFRLE1BQU07R0FDaEI7R0FDQSxPQUFPLENBQUM7RUFDVjtFQUNBLFNBQVMseUJBQXlCLE9BQU87R0FDdkMsUUFBUSxNQUFNLEtBQWQ7SUFDRSxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUssR0FDSCxPQUFPLE1BQU07SUFDZixLQUFLLEdBQ0gsT0FBTyxNQUFNLFVBQVU7SUFDekIsU0FDRSxNQUFNLE1BQU0sdURBQXVEO0dBQ3ZFO0VBQ0Y7RUFDQSxTQUFTLHNCQUFzQixPQUFPLFFBQVEsVUFBVTtHQUN0RCxPQUFPLFVBQVUsV0FDYixDQUFDLElBQ0QsVUFBVSxVQUNOLGVBQWUsT0FBUSxDQUFDLEtBQzFCLENBQUM7RUFDVDtFQUNBLFNBQVMsc0JBQXNCLE9BQU8sUUFBUSxVQUFVO0dBQ3RELE9BQU8sVUFBVSxZQUNYLGlCQUFpQixPQUFRLENBQUMsS0FDNUIsVUFBVSxVQUNQLFNBQVMsbUJBQW1CLGVBQWUsUUFBUSxDQUFDLEtBQ3JELENBQUM7RUFDVDtFQUNBLFNBQVMsOEJBQThCLE1BQU07R0FDM0MsSUFBSSxTQUFTLE1BQU0sT0FBTztHQUMxQjtJQUFHLE9BQU8sU0FBUyxPQUFPLE9BQU8sS0FBSztVQUMvQixRQUFRLE1BQU0sS0FBSyxPQUFPLE9BQU8sS0FBSyxPQUFPLE1BQU0sS0FBSztHQUMvRCxPQUFPLE9BQU8sT0FBTztFQUN2QjtFQUNBLFNBQVMsd0JBQXdCLE9BQU8sT0FBTyxXQUFXO0dBQ3hELEtBQUssSUFBSSxTQUFTLEdBQUcsUUFBUSxPQUFPLE9BQU8sUUFBUSxVQUFVLEtBQUssR0FDaEU7R0FDRixRQUFRO0dBQ1IsS0FBSyxJQUFJLFFBQVEsT0FBTyxPQUFPLFFBQVEsVUFBVSxLQUFLLEdBQUc7R0FDekQsT0FBTyxJQUFJLFNBQVMsUUFBUyxRQUFTLFVBQVUsS0FBSyxHQUFJO0dBQ3pELE9BQU8sSUFBSSxRQUFRLFNBQVUsUUFBUyxVQUFVLEtBQUssR0FBSTtHQUN6RCxPQUFPLFdBQVk7SUFDakIsSUFBSSxVQUFVLFNBQVUsU0FBUyxTQUFTLFVBQVUsTUFBTSxXQUN4RCxPQUFPO0lBQ1QsUUFBUSxVQUFVLEtBQUs7SUFDdkIsUUFBUSxVQUFVLEtBQUs7R0FDekI7R0FDQSxPQUFPO0VBQ1Q7RUFDQSxTQUFTLGNBQWMsZUFBZTtHQUNwQyxJQUFJLFNBQVMsaUJBQWlCLGFBQWEsT0FBTyxlQUNoRCxPQUFPO0dBQ1QsZ0JBQ0cseUJBQXlCLGNBQWMsMEJBQ3hDLGNBQWM7R0FDaEIsT0FBTyxlQUFlLE9BQU8sZ0JBQWdCLGdCQUFnQjtFQUMvRDtFQUNBLFNBQVMseUJBQXlCLE1BQU07R0FDdEMsSUFBSSxRQUFRLE1BQU0sT0FBTztHQUN6QixJQUFJLGVBQWUsT0FBTyxNQUN4QixPQUFPLEtBQUssYUFBYSx5QkFDckIsT0FDQSxLQUFLLGVBQWUsS0FBSyxRQUFRO0dBQ3ZDLElBQUksYUFBYSxPQUFPLE1BQU0sT0FBTztHQUNyQyxRQUFRLE1BQVI7SUFDRSxLQUFLLHFCQUNILE9BQU87SUFDVCxLQUFLLHFCQUNILE9BQU87SUFDVCxLQUFLLHdCQUNILE9BQU87SUFDVCxLQUFLLHFCQUNILE9BQU87SUFDVCxLQUFLLDBCQUNILE9BQU87SUFDVCxLQUFLLHFCQUNILE9BQU87SUFDVCxLQUFLLDRCQUNILE9BQU87R0FDWDtHQUNBLElBQUksYUFBYSxPQUFPLE1BQ3RCLFFBQ0csYUFBYSxPQUFPLEtBQUssT0FDeEIsUUFBUSxNQUNOLG1IQUNGLEdBQ0YsS0FBSyxVQUxQO0lBT0UsS0FBSyxtQkFDSCxPQUFPO0lBQ1QsS0FBSyxvQkFDSCxPQUFPLEtBQUssZUFBZTtJQUM3QixLQUFLLHFCQUNILFFBQVEsS0FBSyxTQUFTLGVBQWUsYUFBYTtJQUNwRCxLQUFLO0tBQ0gsSUFBSSxZQUFZLEtB
15852QUs7S0FDckIsT0FBTyxLQUFLO0tBQ1osU0FDSSxPQUFPLFVBQVUsZUFBZSxVQUFVLFFBQVEsSUFDbkQsT0FBTyxPQUFPLE9BQU8sZ0JBQWdCLE9BQU8sTUFBTTtLQUNyRCxPQUFPO0lBQ1QsS0FBSyxpQkFDSCxPQUNHLFlBQVksS0FBSyxlQUFlLE1BQ2pDLFNBQVMsWUFDTCxZQUNBLHlCQUF5QixLQUFLLElBQUksS0FBSztJQUUvQyxLQUFLO0tBQ0gsWUFBWSxLQUFLO0tBQ2pCLE9BQU8sS0FBSztLQUNaLElBQUk7TUFDRixPQUFPLHlCQUF5QixLQUFLLFNBQVMsQ0FBQztLQUNqRCxTQUFTLEdBQUcsQ0FBQztHQUNqQjtHQUNGLE9BQU87RUFDVDtFQUNBLFNBQVMsMEJBQTBCLE9BQU87R0FDeEMsT0FBTyxhQUFhLE9BQU8sTUFBTSxNQUM3QiwwQkFBMEIsS0FBSyxJQUMvQixhQUFhLE9BQU8sTUFBTSxPQUN4QixNQUFNLE9BQ047RUFDUjtFQUNBLFNBQVMsMEJBQTBCLE9BQU87R0FDeEMsSUFBSSxPQUFPLE1BQU07R0FDakIsUUFBUSxNQUFNLEtBQWQ7SUFDRSxLQUFLLElBQ0gsT0FBTztJQUNULEtBQUssSUFDSCxPQUFPO0lBQ1QsS0FBSyxHQUNILFFBQVEsS0FBSyxTQUFTLGVBQWUsYUFBYTtJQUNwRCxLQUFLLElBQ0gsT0FBTyxLQUFLLGVBQWU7SUFDN0IsS0FBSyxJQUNILE9BQU87SUFDVCxLQUFLLElBQ0gsT0FDRyxRQUFRLEtBQUssUUFDYixRQUFRLE1BQU0sZUFBZSxNQUFNLFFBQVEsSUFDNUMsS0FBSyxnQkFDRixPQUFPLFFBQVEsZ0JBQWdCLFFBQVEsTUFBTTtJQUVwRCxLQUFLLEdBQ0gsT0FBTztJQUNULEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSyxHQUNILE9BQU87SUFDVCxLQUFLLEdBQ0gsT0FBTztJQUNULEtBQUssR0FDSCxPQUFPO0lBQ1QsS0FBSyxHQUNILE9BQU87SUFDVCxLQUFLLElBQ0gsT0FBTyx5QkFBeUIsSUFBSTtJQUN0QyxLQUFLLEdBQ0gsT0FBTyxTQUFTLHlCQUF5QixlQUFlO0lBQzFELEtBQUs7S0FDSCxJQUFJLFNBQVMsTUFBTSxRQUNqQixPQUFPL
15852DBCQUEwQixNQUFNLE1BQU07S0FDL0M7SUFDRixLQUFLLElBQ0gsT0FBTztJQUNULEtBQUssSUFDSCxPQUFPO0lBQ1QsS0FBSyxJQUNILE9BQU87SUFDVCxLQUFLLElBQ0gsT0FBTztJQUNULEtBQUssSUFDSCxPQUFPO0lBQ1QsS0FBSyxJQUNILE9BQU87SUFDVCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0tBQ0gsSUFBSSxlQUFlLE9BQU8sTUFDeEIsT0FBTyxLQUFLLGVBQWUsS0FBSyxRQUFRO0tBQzFDLElBQUksYUFBYSxPQUFPLE1BQU0sT0FBTztLQUNyQztJQUNGLEtBQUs7S0FDSCxPQUFPLE1BQU07S0FDYixJQUFJLFFBQVEsTUFDTDtXQUFBLElBQUksSUFBSSxLQUFLLFNBQVMsR0FBRyxLQUFLLEdBQUcsS0FDcEMsSUFBSSxhQUFhLE9BQU8sS0FBSyxFQUFFLENBQUMsTUFBTSxPQUFPLEtBQUssRUFBRSxDQUFDO0tBQUE7S0FDekQsSUFBSSxTQUFTLE1BQU0sUUFDakIsT0FBTywwQkFBMEIsTUFBTSxNQUFNO0dBQ25EO0dBQ0EsT0FBTztFQUNUO0VBQ0EsU0FBUyxhQUFhLGNBQWM7R0FDbEMsT0FBTyxFQUFFLFNBQVMsYUFBYTtFQUNqQztFQUNBLFNBQVMsSUFBSSxRQUFRLE9BQU87R0FDMUIsSUFBSSxpQkFDQSxRQUFRLE1BQU0saUJBQWlCLEtBQzlCLFVBQVUsV0FBVyxtQkFDcEIsUUFBUSxNQUFNLDBCQUEwQixHQUN6QyxPQUFPLFVBQVUsV0FBVyxpQkFDNUIsV0FBVyxrQkFBa0IsTUFDN0IsV0FBVyxrQkFBa0IsTUFDOUI7RUFDTjtFQUNBLFNBQVMsS0FBSyxRQUFRLE9BQU8sT0FBTztHQUNsQztHQUNBLFdBQVcsa0JBQWtCLE9BQU87R0FDcEMsV0FBVyxrQkFBa0I7R0FDN0IsT0FBTyxVQUFVO0VBQ25CO0VBQ0EsU0FBUyxnQkFBZ0IsR0FBRztHQUMxQixTQUFTLEtBQ1AsUUFBUSxNQUNOLHNHQUNGO0dBQ0YsT0FBTztFQUNUO0VBQ0EsU0FBUyxrQkFBa0IsT0FBTyxrQkFBa0I7R0FDbEQsS0FBSyx5QkFBeUIsa0JBQWtCLEtBQUs7R0FDckQsS0FBSyx5QkFBeUIsT0FBTyxLQUFLO0dBQzFDLEtBQUssb0JBQW9CLE1BQU0sS0FBSztHQUNwQyxJQUFJLGtCQUFrQixpQkFBaUI7R0FDdkMsUUFBUSxpQkFBUjtJQUNFLEtBQUs7SUFDTCxLQUFLO0tBQ0gsa0JBQWtCLE1BQU0sa0JBQWtCLGNBQWM7S0FDeEQsb0JBQW9CLG1CQUNsQixpQkFBaUIsb0JBQ2QsbUJBQW1CLGlCQUFpQixnQkFDbkMsa0JBQWtCLGdCQUFnQixJQUNsQywyQkFDRjtLQUNKO0lBQ0YsU0FDRSxJQUNJLGtCQUFrQixpQkFBaUIsU0FDcEMsbUJBQW1CLGlCQUFpQixjQUVyQyxtQkFBb0Isa0JBQWtCLGdCQUFnQixHQUNuRCxtQkFBbUIsd0JBQ2xCLGtCQUNBLGVBQ0Y7U0FFRixRQUFRLGlCQUFSO0tBQ0UsS0FBSztNQUNILG1CQUFtQjtNQUNuQjtLQUNGLEtBQUs7TUFDSCxtQkFBbUI7TUFDbkI7S0FDRixTQUNFLG1CQUFtQjtJQUN2QjtHQUNOO0dBQ0Esa0JBQWtCLGdCQUFnQixZQUFZO0dBQzlDLGtCQUFrQix1QkFBdUIsTUFBTSxlQUFlO0dBQzlELGtCQUFrQjtJQUNoQixTQUFTO0lBQ1QsY0FBYztHQUNoQjtHQUNBLElBQUksb0JBQW9CLEtBQUs7R0FDN0IsS0FBSyxvQkFBb0IsaUJBQWlCLEtBQUs7RUFDakQ7RUFDQSxTQUFTLGlCQUFpQixPQUFPO0dBQy9CLElBQUksb0JBQW9CLEtBQUs7R0FDN0IsSUFBSSx5QkFBeUIsS0FBSztHQUNsQyxJQUFJLHlCQUF5QixLQUFLO0VBQ3BDO0VBQ0EsU0FBUyxpQkFBaUI7R0FDeEIsT0FBTyxnQkFBZ0IsbUJBQW1CLE9BQU87RUFDbkQ7RUFDQSxTQUFTLGdCQUFnQixPQUFPO0dBQzlCLElBQUksWUFBWSxNQUFNO0dBQ3RCLFNBQVMsY0FDTCxzQkFBc0IsZ0JBQWdCLFVBQVUsZUFDbEQsS0FBSyw4QkFBOEIsT0FBTyxLQUFLO0dBQ2pELFlBQVksZ0JBQWdCLG1CQUFtQixPQUFPO0dBQ3RELElBQUksT0FBTyxNQUFNO0dBQ2pCLElBQUksY0FBYyx3QkFBd0IsVUFBVSxTQUFTLElBQUk7R0FDakUsT0FBTyx1QkFBdUIsVUFBVSxjQUFjLElBQUk7R0FDMUQsY0FBYztJQUFFLFNBQVM7SUFBYSxjQUFjO0dBQUs7R0FDekQsY0FBYyxnQkFDWCxLQUFLLHlCQUF5QixPQUFPLEtBQUssR0FDM0MsS0FBSyxvQkFBb0IsYUFBYSxLQUFLO0VBQy9DO0VBQ0EsU0FBUyxlQUFlLE9BQU87R0FDN0Isd0JBQXdCLFlBQVksVUFDakMsSUFBSSxvQkFBb0IsS0FBSyxHQUFHLElBQUkseUJBQXlCLEtBQUs7R0FDckUsNkJBQTZCLFlBQVksVUFDdEMsSUFBSSw4QkFBOEIsS0FBSyxHQUN2QyxzQkFBc0IsZ0JBQWdCO0VBQzNDO0VBQ0EsU0FBUyxjQUFjLENBQUM7RUFDeEIsU0FBUyxjQUFjO0dBQ3JCLElBQUksTUFBTSxlQUFlO0lBQ3ZCLFVBQVUsUUFBUTtJQUNsQixXQUFXLFFBQVE7SUFDbkIsV0FBVyxRQUFRO0lBQ25CLFlBQVksUUFBUTtJQUNwQixZQUFZLFFBQVE7SUFDcEIscUJBQXFCLFF
15852BQVE7SUFDN0IsZUFBZSxRQUFRO0lBQ3ZCLElBQUksUUFBUTtLQUNWLGNBQWMsQ0FBQztLQUNmLFlBQVksQ0FBQztLQUNiLE9BQU87S0FDUCxVQUFVLENBQUM7SUFDYjtJQUNBLE9BQU8saUJBQWlCLFNBQVM7S0FDL0IsTUFBTTtLQUNOLEtBQUs7S0FDTCxNQUFNO0tBQ04sT0FBTztLQUNQLE9BQU87S0FDUCxnQkFBZ0I7S0FDaEIsVUFBVTtJQUNaLENBQUM7R0FDSDtHQUNBO0VBQ0Y7RUFDQSxTQUFTLGVBQWU7R0FDdEI7R0FDQSxJQUFJLE1BQU0sZUFBZTtJQUN2QixJQUFJLFFBQVE7S0FBRSxjQUFjLENBQUM7S0FBRyxZQUFZLENBQUM7S0FBRyxVQUFVLENBQUM7SUFBRTtJQUM3RCxPQUFPLGlCQUFpQixTQUFTO0tBQy9CLEtBQUssT0FBTyxDQUFDLEdBQUcsT0FBTyxFQUFFLE9BQU8sUUFBUSxDQUFDO0tBQ3pDLE1BQU0sT0FBTyxDQUFDLEdBQUcsT0FBTyxFQUFFLE9BQU8sU0FBUyxDQUFDO0tBQzNDLE1BQU0sT0FBTyxDQUFDLEdBQUcsT0FBTyxFQUFFLE9BQU8sU0FBUyxDQUFDO0tBQzNDLE9BQU8sT0FBTyxDQUFDLEdBQUcsT0FBTyxFQUFFLE9BQU8sVUFBVSxDQUFDO0tBQzdDLE9BQU8sT0FBTyxDQUFDLEdBQUcsT0FBTyxFQUFFLE9BQU8sVUFBVSxDQUFDO0tBQzdDLGdCQUFnQixPQUFPLENBQUMsR0FBRyxPQUFPLEVBQUUsT0FBTyxtQkFBbUIsQ0FBQztLQUMvRCxVQUFVLE9BQU8sQ0FBQyxHQUFHLE9BQU8sRUFBRSxPQUFPLGFBQWEsQ0FBQztJQUNyRCxDQUFDO0dBQ0g7R0FDQSxJQUFJLGlCQUNGLFFBQVEsTUFDTiw4RUFDRjtFQUNKO0VBQ0EsU0FBUyxpQkFBaUIsT0FBTztHQUMvQixJQUFJLHdCQUF3QixNQUFNO0dBQ2xDLE1BQU0sb0JBQW9CLEtBQUs7R0FDL0IsUUFBUSxNQUFNO0dBQ2QsTUFBTSxvQkFBb0I7R0FDMUIsTUFBTSxXQUFXLGdDQUFnQyxNQUM5QyxRQUFRLE1BQU0sTUFBTSxFQUFFO0dBQ3pCLHdCQUF3QixNQUFNLFFBQVEsSUFBSTtHQUMxQyxPQUFPLDBCQUNKLFFBQVEsTUFBTSxNQUFNLHdCQUF3QixDQUFDO0dBQ2hELHdCQUF3QixNQUFNLFFBQVEsMEJBQTBCO0dBQ2hFLE9BQU8sMEJBQ0osd0JBQXdCLE1BQU0sWUFDN0IsTUFDQSxxQkFDRjtHQUNGLElBQUksT0FBTyx1QkFDVCxRQUFRLE1BQU0sTUFBTSxHQUFHLHFCQUFxQjtRQUN6QyxPQUFPO0dBQ1osT0FBTztFQUNUO0VBQ0EsU0FBUyw4QkFBOEIsTUFBTTtHQUMzQyxJQUFJLEtBQUssTUFBTSxRQUNiLElBQUk7SUFDRixNQUFNLE1BQU07R0FDZCxTQUFTLEdBQUc7SUFDVixJQUFJLFFBQVEsRUFBRSxNQUFNLEtBQUssQ0FBQyxDQUFDLE1BQU0sY0FBYztJQUMvQyxTQUFVLFNBQVMsTUFBTSxNQUFPO0lBQ2hDLFNBQ0UsS0FBSyxFQUFFLE1BQU0sUUFBUSxVQUFVLElBQzNCLG1CQUNBLEtBQUssRUFBRSxNQUFNLFFBQVEsR0FBRyxJQUN0QixpQkFDQTtHQUNWO0dBQ0YsT0FBTyxPQUFPLFNBQVMsT0FBTztFQUNoQztFQUNBLFNBQVMsNkJBQTZCLElBQUksV0FBVztHQUNuRCxJQUFJLENBQUMsTUFBTSxTQUFTLE9BQU87R0FDM0IsSUFBSSxRQUFRLG9CQUFvQixJQUFJLEVBQUU7R0FDdEMsSUFBSSxLQUFLLE1BQU0sT0FBTyxPQUFPO0dBQzdCLFVBQVUsQ0FBQztHQUNYLFFBQVEsTUFBTTtHQUNkLE1BQU0sb0JBQW9CLEtBQUs7R0FDL0IsSUFBSSxxQkFBcUI7R0FDekIscUJBQXFCLHFCQUFxQjtHQUMxQyxxQkFBcUIsSUFBSTtHQUN6QixZQUFZO0dBQ1osSUFBSTtJQUNGLElBQUksaUJBQWlCLEVBQ25CLDZCQUE2QixXQUFZO0tBQ3ZDLElBQUk7TUFDRixJQUFJLFdBQVc7T0FDYixJQUFJLE9BQU8sV0FBWTtRQUNyQixNQUFNLE1BQU07T0FDZDtPQUNBLE9BQU8sZUFBZSxLQUFLLFdBQVcsU0FBUyxFQUM3QyxLQUFLLFdBQVk7UUFDZixNQUFNLE1BQU07T0FDZCxFQUNGLENBQUM7T0FDRCxJQUFJLGFBQWEsT0FBTyxXQUFXLFFBQVEsV0FBVztRQUNwRCxJQUFJO1NBQ0YsUUFBUSxVQUFVLE1BQU0sQ0FBQyxDQUFDO1FBQzVCLFNBQVMsR0FBRztTQUNWLElBQUksVUFBVTtRQUNoQjtRQUNBLFFBQVEsVUFBVSxJQUFJLENBQUMsR0FBRyxJQUFJO09BQ2hDLE9BQU87UUFDTCxJQUFJO1NBQ0YsS0FBSyxLQUFLO1FBQ1osU0FBUyxLQUFLO1NBQ1osVUFBVTtRQUNaO1FBQ0EsT0FBTyxDQUFDO1FBQ1IsSUFBSTtTQUNGLElBQUksWUFBWSxPQUFPLHlCQUNyQixHQUFHLFdBQ0gsT0FDRjtTQUNBLE9BQU8sZUFBZSxHQUFHLFdBQVcsU0FBUztVQUMzQyxjQUFjLENBQUM7VUFDZixLQUFLLFdBQVk7V0FDZixNQUFNLE1BQU07VUFDZDtTQUNGLENBQUM7U0FDRCxPQUFPLENBQUM7U0FDUixJQUFJLEdBQUc7UUFDVCxVQUFVO1NBQ1IsU0FDRyxLQUFLLE1BQU0sWUFDUixPQUFPLGVBQ0wsR0FBRyxXQUNILFNBQ0EsU0FDRixJQUNBLE9BQU8sR0FBRyxVQUFVO1FBQzVCO09BQ0Y7TUFDRixPQUFPO09BQ0wsSUFBSTtRQUNGLE1BQU0sTUFBTTtPQUNkLFNBQVMsS0FBSztRQUNaLFVBQVU7T0FDWjtPQUNBLENBQUMsT0FBTyxHQUFHLE1BQ1QsZUFBZSxPQUFPLEtBQUssU0FDM0IsS0FBSyxNQUFNLFdBQVksQ0FBQyxDQUFDO01BQzdCO0tBQ0YsU0FBUyxRQUFRO01BQ2YsSUFBSSxVQUFVLFdBQVcsYUFBYSxPQUFPLE9BQU8sT0FDbEQsT0FBTyxDQUFDLE9BQU8sT0FBTyxRQUFRLEtBQUs7S0FDdkM7S0FDQSxPQUFPLENBQUMsTUFBTSxJQUFJO0lBQ3BCLEVBQ0Y7SUFDQSxlQUFlLDRCQUE0QixjQUN6QztJQUNGLElBQUkscUJBQXFCLE9BQU8seUJBQzlCLGVBQWUsNkJBQ2YsTUFDRjtJQUNBLHNCQUNFLG1CQUFtQixnQkFDbkIsT0FBTyxlQUNMLGVBQWUsNkJBQ2YsUUFDQSxFQUFFLE9BQU8sOEJBQThCLENBQ3pDO0lBQ0YsSUFBSSx3QkFDQSxlQUFlLDRCQUE0QixHQUM3QyxjQUFjLHNCQUFzQixJQUNwQyxlQUFlLHNCQUFzQjtJQUN2QyxJQUFJLGVBQWUsY0FBYztLQUMvQixJQUFJLGNBQWMsWUFBWSxNQUFNLElBQUksR0FDdEMsZUFBZSxhQUFhLE1BQU0sSUFBSTtLQUN4QyxLQUNFLHdCQUF3QixxQkFBcUIsR0FDN0MscUJBQXFCLFlBQVksVUFDakMsQ0FBQyxZQUFZLG1CQUFtQixDQUFDLFNBQy9CLDZCQUNGLElBR0E7S0FDRixPQUVFLHdCQUF3QixhQUFhLFVBQ3JDLENBQUMsYUFBYSxzQkFBc0IsQ0FBQyxTQUNuQyw2QkFDRixJQUdBO0tBQ0YsSUFDRSx1QkFBdUIsWUFBWSxVQUNuQywwQkFBMEIsYUFBYSxRQUV2QyxLQUNFLHFCQUFxQixZQUFZLFNBQVMsR0FDeEMsd0JBQXdCLGFBQWEsU0FBUyxHQUNoRCxLQUFLLHNCQUNMLEtB
15852QUsseUJBQ0wsWUFBWSx3QkFDVixhQUFhLHlCQUdmO0tBQ0osT0FFRSxLQUFLLHNCQUFzQixLQUFLLHVCQUNoQyxzQkFBc0IseUJBRXRCLElBQ0UsWUFBWSx3QkFDWixhQUFhLHdCQUNiO01BQ0EsSUFBSSxNQUFNLHNCQUFzQixNQUFNLHVCQUNwQztPQUNFLElBQ0csc0JBQ0QseUJBQ0EsSUFBSSx5QkFDRixZQUFZLHdCQUNWLGFBQWEsd0JBQ2pCO1FBQ0EsSUFBSSxTQUNGLE9BQ0EsWUFBWSxtQkFBbUIsQ0FBQyxRQUM5QixZQUNBLE1BQ0Y7UUFDRixHQUFHLGVBQ0QsT0FBTyxTQUFTLGFBQWEsTUFDNUIsU0FBUyxPQUFPLFFBQVEsZUFBZSxHQUFHLFdBQVc7UUFDeEQsZUFBZSxPQUFPLE1BQ3BCLG9CQUFvQixJQUFJLElBQUksTUFBTTtRQUNwQyxPQUFPO09BQ1Q7YUFDSyxLQUFLLHNCQUFzQixLQUFLO01BRXpDO0tBQ0Y7SUFDSjtHQUNGLFVBQVU7SUFDUixVQUFXLENBQUMsR0FDVCxxQkFBcUIsSUFBSSxvQkFDMUIsYUFBYSxHQUNaLE1BQU0sb0JBQW9CO0dBQy9CO0dBQ0EsZUFBZSxjQUFjLEtBQUssR0FBRyxlQUFlLEdBQUcsT0FBTyxNQUMxRCw4QkFBOEIsV0FBVyxJQUN6QztHQUNKLGVBQWUsT0FBTyxNQUFNLG9CQUFvQixJQUFJLElBQUksV0FBVztHQUNuRSxPQUFPO0VBQ1Q7RUFDQSxTQUFTLGNBQWMsT0FBTyxZQUFZO0dBQ3hDLFFBQVEsTUFBTSxLQUFkO0lBQ0UsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLLEdBQ0gsT0FBTyw4QkFBOEIsTUFBTSxJQUFJO0lBQ2pELEtBQUssSUFDSCxPQUFPLDhCQUE4QixNQUFNO0lBQzdDLEtBQUssSUFDSCxPQUFPLE1BQU0sVUFBVSxjQUFjLFNBQVMsYUFDMUMsOEJBQThCLG1CQUFtQixJQUNqRCw4QkFBOEIsVUFBVTtJQUM5QyxLQUFLLElBQ0gsT0FBTyw4QkFBOEIsY0FBYztJQUNyRCxLQUFLO0lBQ0wsS0FBSyxJQUNILE9BQU8sNkJBQTZCLE1BQU0sTUFBTSxDQUFDLENBQUM7SUFDcEQsS0FBSyxJQUNILE9BQU8sNkJBQTZCLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQztJQUMzRCxLQUFLLEdBQ0gsT0FBTyw2QkFBNkIsTUFBTSxNQUFNLENBQUMsQ0FBQztJQUNwRCxLQUFLLElBQ0gsT0FBTyw4QkFBOEIsVUFBVTtJQUNqRCxLQUFLLElBQ0gsT0FBTyw4QkFBOEIsZ0JBQWdCO0lBQ3ZELFNBQ0UsT0FBTztHQUNYO0VBQ0Y7RUFDQSxTQUFTLDRCQUE0QixnQkFBZ0I7R0FDbkQsSUFBSTtJQUNGLElBQUksT0FBTyxJQUNULFdBQVc7SUFDYixHQUFHO0tBQ0QsUUFBUSxjQUFjLGdCQUFnQixRQUFRO0tBQzlDLElBQUksWUFBWSxlQUFlO0tBQy9CLElBQUksV0FDRixLQUFLLElBQUksSUFBSSxVQUFVLFNBQVMsR0FBRyxLQUFLLEdBQUcsS0FBSztNQUM5QyxJQUFJLFFBQVEsVUFBVTtNQUN0QixJQUFJLGFBQWEsT0FBTyxNQUFNLE1BQU07T0FDbEMsSUFBSSx3QkFBd0I7T0FDNUIsR0FBRztRQUNELElBQUksT0FBTyxNQUFNLE1BQ2YsTUFBTSxNQUFNLEtBQ1osV0FBVyxNQUFNO1FBQ25CLElBQUksUUFBUSxVQUFVO1NBQ3BCLElBQUksYUFBYSxpQkFBaUIsUUFBUSxHQUN4QyxNQUFNLFdBQVcsWUFBWSxJQUFJLEdBQ2pDLFdBQ0UsT0FBTyxNQUFNLGFBQWEsV0FBVyxNQUFNLE1BQU0sQ0FBQztTQUN0RCxJQUFJLE9BQU8sU0FBUyxRQUFRLElBQUksR0FBRztVQUNqQyxJQUFJLDJCQUEyQixPQUFPO1VBQ3RDLE1BQU07U0FDUjtRQUNGO1FBQ0EsMkJBQTJCLDhCQUN6QixRQUFRLE1BQU0sT0FBTyxNQUFNLE1BQU0sR0FDbkM7T0FDRjtPQUNBLE9BQU8sd0JBQXdCO01BQ2pDO0tBQ0Y7S0FDRixXQUFXO0tBQ1gsaUJBQWlCLGVBQWU7SUFDbEMsU0FBUztJQUNULE9BQU87R0FDVCxTQUFTLEdBQUc7SUFDVixPQUFPLCtCQUErQixFQUFFLFVBQVUsT0FBTyxFQUFFO0dBQzdEO0VBQ0Y7RUFDQSxTQUFTLGdEQUFnRCxJQUFJO0dBQzNELFFBQVEsS0FBSyxLQUFLLEdBQUcsZUFBZSxHQUFHLE9BQU8sTUFDMUMsOEJBQThCLEVBQUUsSUFDaEM7RUFDTjtFQUNBLFNBQVMsc0NBQXNDO0dBQzdDLElBQUksU0FBUyxTQUFTLE9BQU87R0FDN0IsSUFBSSxRQUFRLFFBQVE7R0FDcEIsT0FBTyxRQUFRLFFBQVEsMEJBQTBCLEtBQUssSUFBSTtFQUM1RDtFQUNBLFNBQVMsNEJBQTRCO0dBQ25DLElBQUksU0FBUyxTQUFTLE9BQU87R0FDN0IsSUFBSSxpQkFBaUI7R0FDckIsSUFBSTtJQUNGLElBQUksT0FBTztJQUNYLE1BQU0sZUFBZSxRQUFRLGlCQUFpQixlQUFlO0lBQzdELFFBQVEsZUFBZSxLQUF2QjtLQUNFLEtBQUs7S0FDTCxLQUFLO0tBQ0wsS0FBSztNQUNILFFBQVEsOEJBQThCLGVBQWUsSUFBSTtNQUN6RDtLQUNGLEtBQUs7TUFDSCxRQUFRLDhCQUE4QixVQUFVO01BQ2hEO0tBQ0YsS0FBSztNQUNILFFBQVEsOEJBQThCLGNBQWM7TUFDcEQ7S0FDRixLQUFLO01BQ0gsUUFBUSw4QkFBOEIsVUFBVTtNQUNoRDtLQUNGLEtBQUs7TUFDSCxRQUFRLDhCQUE4QixnQkFBZ0I7TUFDdEQ7S0FDRixLQUFLO0tBQ0wsS0FBSztLQUNMLEtBQUs7TUFDSCxlQUFlLGVBQ2IsT0FBTyxTQUNOLFFBQVEsZ0RBQ1AsZUFBZSxJQUNqQjtNQUNGO0tBQ0YsS0FBSyxJQUNILGVBQWUsZUFDYixPQUFPLFNBQ04sUUFBUSxnREFDUCxlQUFlLEtBQUssTUFDdEI7SUFDTjtJQUNBLE9BQU8saUJBQ0wsSUFBSSxhQUFhLE9BQU8sZUFBZSxLQUFLO0tBQzFDLElBQUksUUFBUTtLQUNaLGlCQUFpQixNQUFNO0tBQ3ZCLElBQUksYUFBYSxNQUFNO0tBQ3ZCLElBQUksa0JBQWtCLFlBQVk7TUFDaEMsSUFBSSxpQkFBaUIsaUJBQWlCLFVBQVU7TUFDaEQsT0FBTyxtQkFBbUIsUUFBUSxPQUFPO0tBQzNDO0lBQ0YsT0FBTyxJQUFJLFFBQVEsZUFBZSxZQUFZO0tBQzVDLElBQUksYUFBYSxlQUFlO0tBQ2hDLENBQUMsaUJBQWlCLGVBQWUsVUFDL0IsZUFDQyxRQUFRLE9BQU8saUJBQWlCLFVBQVU7SUFDL0MsT0FBTztJQUNULElBQUksMkJBQTJCO0dBQ2pDLFNBQVMsR0FBRztJQUNWLDJCQUNFLCtCQUErQixFQUFFLFVBQVUsT0FBTyxFQUFFO0dBQ3hEO0dBQ0EsT0FBTztFQUNUO0VBQ0EsU0FBUyxrQkFBa0IsT0FBTyxVQUFVLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTTtHQUN4RSxJQUFJLGdCQUFnQjtHQUNwQixnQkFBZ0IsS0FBSztHQUNyQixJQUFJO0lBQ0YsT0FBTyxTQUFTLFNBQVMsTUFBTSxhQUMzQixNQUFNLFdBQVcsSUFDZixTQUFTLEtBQUssTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLElBQUksQ0FDbEQsSUFDQSxTQUFTLE1BQU0sTUFBTSxNQUFNLE1BQU0sSUFBSTtHQUMzQyxVQUFVO0lBQ1IsZ0JBQWdCLGFBQWE7R0FDL0I7R0FDQSxNQUFNLE1BQ0osaUZBQ0Y7RUFDRjtFQUNBLFNBQVMsZ0JBQWdCLE9BQU87R0FDOUIscUJBQXFCLGtCQUNuQixTQUFTLFFBQVEsT0FBTztHQUMxQixjQUFjLENBQUM7R0FDZixVQUFVO0VBQ1o7RUFDQSxTQUFTLFNBQVMsT0FBTztHQUN2QixPQUNHLGVBQWUsT0FBTyxVQUNyQixPQUFPLGVBQ1AsTUFBTSxPQUFPLGdCQUNmLE1BQU0sWUFBWSxRQUNsQjtFQUVKO0VBQ0EsU0FBUyxrQkFBa0IsT0FBTztHQUNoQyxJQUFJO0lBQ0YsT0FBTyxtQkFBbUIsS0FBSyxHQUFHLENBQUM7R0FDckMsU0FBUyxHQUFHO0lBQ1YsT0FBTyxDQUFDO0dBQ1Y7RUFDRjtFQUNBLFNBQVMsbUJBQW1CLE9BQU87R0FD
15852akMsT0FBTyxLQUFLO0VBQ2Q7RUFDQSxTQUFTLDZCQUE2QixPQUFPLGVBQWU7R0FDMUQsSUFBSSxrQkFBa0IsS0FBSyxHQUN6QixPQUNFLFFBQVEsTUFDTix1SEFDQSxlQUNBLFNBQVMsS0FBSyxDQUNoQixHQUNBLG1CQUFtQixLQUFLO0VBRTlCO0VBQ0EsU0FBUywrQkFBK0IsT0FBTyxVQUFVO0dBQ3ZELElBQUksa0JBQWtCLEtBQUssR0FDekIsT0FDRSxRQUFRLE1BQ04sMEhBQ0EsVUFDQSxTQUFTLEtBQUssQ0FDaEIsR0FDQSxtQkFBbUIsS0FBSztFQUU5QjtFQUNBLFNBQVMsa0NBQWtDLE9BQU87R0FDaEQsSUFBSSxrQkFBa0IsS0FBSyxHQUN6QixPQUNFLFFBQVEsTUFDTixtS0FDQSxTQUFTLEtBQUssQ0FDaEIsR0FDQSxtQkFBbUIsS0FBSztFQUU5QjtFQUNBLFNBQVMsZ0JBQWdCLFdBQVc7R0FDbEMsSUFBSSxnQkFBZ0IsT0FBTyxnQ0FBZ0MsT0FBTyxDQUFDO0dBQ25FLElBQUksT0FBTztHQUNYLElBQUksS0FBSyxZQUFZLE9BQU8sQ0FBQztHQUM3QixJQUFJLENBQUMsS0FBSyxlQUNSLE9BQ0UsUUFBUSxNQUNOLDZLQUNGLEdBQ0EsQ0FBQztHQUVMLElBQUk7SUFDRixhQUFjLEtBQUssT0FBTyxTQUFTLEdBQUssZUFBZTtHQUN6RCxTQUFTLEtBQUs7SUFDWixRQUFRLE1BQU0sbURBQW1ELEdBQUc7R0FDdEU7R0FDQSxPQUFPLEtBQUssV0FBVyxDQUFDLElBQUksQ0FBQztFQUMvQjtFQUNBLFNBQVMsMkJBQTJCLGlCQUFpQjtHQUNuRCxlQUFlLE9BQU8sU0FDcEIsOEJBQThCLGVBQWU7R0FDL0MsSUFBSSxnQkFBZ0IsZUFBZSxPQUFPLGFBQWEsZUFDckQsSUFBSTtJQUNGLGFBQWEsY0FBYyxZQUFZLGVBQWU7R0FDeEQsU0FBUyxLQUFLO0lBQ1osbUJBQ0ksaUJBQWlCLENBQUMsR0FDcEIsUUFBUSxNQUNOLGtEQUNBLEdBQ0Y7R0FDSjtFQUNKO0VBQ0EsU0FBUyxjQUFjLEdBQUc7R0FDeEIsT0FBTztHQUNQLE9BQU8sTUFBTSxJQUFJLEtBQU0sTUFBTyxJQUFJLENBQUMsSUFBSSxNQUFPLEtBQU07RUFDdEQ7RUFDQSxTQUFTLHdCQUF3QixPQUFPO0dBQ3RDLElBQUksbUJBQW1CLFFBQVE7R0FDL0IsSUFBSSxNQUFNLGtCQUFrQixPQUFPO0dBQ25DLFFBQVEsUUFBUSxDQUFDLE9BQWpCO0lBQ0UsS0FBSyxHQUNILE9BQU87SUFDVCxLQUFLLEdBQ0gsT0FBTztJQUNULEtBQUssR0FDSCxPQUFPO0lBQ1QsS0FBSyxHQUNILE9BQU87SUFDVCxLQUFLLElBQ0gsT0FBTztJQUNULEtBQUssSUFDSCxPQUFPO0lBQ1QsS0FBSyxJQUNILE9BQU87SUFDVCxLQUFLLEtBQ0gsT0FBTztJQUNULEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUssUUFDSCxPQUFPLFFBQVEsQ0FBQztJQUNsQixLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLLFNBQ0gsT0FBTyxRQUFRO0lBQ2pCLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUssVUFDSCxPQUFPLFFBQVE7SUFDakIsS0FBSyxVQUNILE9BQU87SUFDVCxLQUFLLFdBQ0gsT0FBTztJQUNULEtBQUssV0FDSCxPQUFPO0lBQ1QsS0FBSyxXQUNILE9BQU87SUFDVCxLQUFLLFlBQ0gsT0FBTztJQUNULFNBQ0UsT0FDRSxRQUFRLE1BQ04sMkRBQ0YsR0FDQTtHQUVOO0VBQ0Y7RUFDQSxTQUFTLGFBQWEsTUFBTSxVQUFVLHNCQUFzQjtHQUMxRCxJQUFJLGVBQWUsS0FBSztHQUN4QixJQUFJLE1BQU0sY0FBYyxPQUFPO0dBQy9CLElBQUksWUFBWSxHQUNkLGlCQUFpQixLQUFLLGdCQUN0QixjQUFjLEtBQUs7R0FDckIsT0FBTyxLQUFLO0dBQ1osSUFBSSxzQkFBc0IsZUFBZTtHQUN6QyxNQUFNLHVCQUNBLGVBQWUsc0JBQXNCLENBQUMsZ0JBQ3hDLE1BQU0sZUFDRCxZQUFZLHdCQUF3QixZQUFZLEtBQy9DLGVBQWUscUJBQ2pCLE1BQU0sY0FDRCxZQUFZLHdCQUF3QixXQUFXLElBQ2hELHlCQUNFLHVCQUF1QixzQkFBc0IsQ0FBQyxNQUNoRCxNQUFNLHlCQUNILFlBQ0Msd0JBQXdCLG9CQUFvQixTQUN0RCxzQkFBc0IsZUFBZSxDQUFDLGdCQUN4QyxNQUFNLHNCQUNELFlBQVksd0JBQXdCLG1CQUFtQixJQUN4RCxNQUFNLGNBQ0gsWUFBWSx3QkFBd0IsV0FBVyxJQUNoRCx5QkFDRSx1QkFBdUIsZUFBZSxDQUFDLE1BQ3pDLE1BQU0seUJBQ0gsWUFBWSx3QkFBd0Isb0JBQW9CO0dBQ3JFLE9BQU8sTUFBTSxZQUNULElBQ0EsTUFBTSxZQUNKLGFBQWEsYUFDYixPQUFPLFdBQVcsb0JBQ2hCLGlCQUFpQixZQUFZLENBQUMsV0FDL0IsdUJBQXVCLFdBQVcsQ0FBQyxVQUNwQyxrQkFBa0Isd0JBQ2YsT0FBTyxrQkFBa0IsT0FBTyx1QkFBdUIsWUFDMUQsV0FDQTtFQUNSO0VBQ0EsU0FBUywwQkFBMEIsTUFBTSxhQUFhO0dBQ3BELE9BQ0UsT0FDQyxLQUFLLGVBQ0osRUFBRSxLQUFLLGlCQUFpQixDQUFDLEtBQUssZUFDOUI7RUFFTjtFQUNBLFNBQVMsa0JBQWtCLE1BQU0sYUFBYTtHQUM1QyxPQUFPLGNBQWMsT0FBTyxlQUFlLGNBQWM7R0FDekQsSUFBSSxvQkFBb0IsS0FBSztHQUM3QixJQUFJLE1BQU0sbUJBQ1IsS0FDRSxPQUFPLEtBQUssZUFBZSxxQkFBcUIsYUFDaEQsSUFBSSxvQkFFSjtJQUNBLElBQUksUUFBUSxLQUFLLE1BQU0saUJBQWlCLEdBQ3RDLE9BQU8sS0FBSztJQUNkLGVBQWUsS0FBSztJQUNwQixxQkFBcUIsQ0FBQztHQUN4QjtHQUNGLE9BQU87RUFDVDtFQUNBLFNBQVMsc0JBQXNCLE1BQU0sYUFBYTtHQUNoRCxRQUFRLE1BQVI7SUFDRSxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSyxJQUNILE9BQU8sY0FBYztJQUN2QixLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSyxTQUNILE9BQU8sY0FBYztJQUN2QixLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLLFVBQ0gsT0FBTztJQUNULEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLLFlBQ0gsT0FBTztJQUNULFNBQ0UsT0FDRSxRQUFRLE1BQ04sMkRBQ0YsR0FDQTtHQUVOO0VBQ0Y7RUFDQSxTQUFTLHFCQUFxQjtHQUM1QixJQUFJLE9BQU87R0FDWCxrQkFBa0I7R0FDbEIsT0FBTyxnQkFBZ0IsY0FBYyxnQkFBZ0I7R0FDckQsT0FBTztFQUNUO0VBQ0EsU0FBUyxjQUFjLFNBQVM7R0FDOUIsS0FBSyxJQUFJLFVBQVUsQ0FBQyxHQUFHLElBQUksR0FBRyxLQUFLLEdBQUcsS0FBSyxRQUFRLEtBQUssT0FBTztHQUMvRCxPQUFPO0VBQ1Q7RUFDQSxTQUFTLGtCQUFrQixNQUFNLFlBQVk7R0FDM0MsS0FBSyxnQkFBZ0I7R0FDckIsY0FBYyxlQUNWLEtBQUssaUJBQWlCLEdBQ3ZCLEtBQUssY0FBYyxHQUNuQixLQUFLLFlBQVk7RUFDdEI7RUFDQSxTQUFTLGlCQUNQLE1BQ0EsZUFDQSxnQkFDQSxhQUNBLGNBQ0EscUJBQ0E7R0FDQSxJQUFJLHlCQUF5QixLQUFLO0dBQ2xDLEtBQUssZUFBZTtHQUNwQixLQUFLLGlCQUFpQjtHQUN0QixLQUFLLGNBQWM7R0FDbkIsS0FBSyxZQUFZO0dBQ2pCLEtBQUssZ0JBQWdCO0dBQ3JCLEtBQUssa0JBQWtCO0dBQ3ZCLEtBQUssOEJBQThCO0dBQ25DLEtBQUssc0JBQXNCO0dBQzNCLElBQUksZ0JBQWdCLEtBQUssZUFDdkIsa0JBQWtCLEtBQUssaUJBQ3ZCLGdCQUFnQixLQUFLO0dBQ3ZCLEtBQ0UsaUJBQWlCLHlCQUF5QixDQUFDLGdCQUMzQyxJQUFJLGl
15852CQUVKO0lBQ0EsSUFBSSxRQUFRLEtBQUssTUFBTSxjQUFjLEdBQ25DLE9BQU8sS0FBSztJQUNkLGNBQWMsU0FBUztJQUN2QixnQkFBZ0IsU0FBUztJQUN6QixJQUFJLHVCQUF1QixjQUFjO0lBQ3pDLElBQUksU0FBUyxzQkFDWCxLQUNFLGNBQWMsU0FBUyxNQUFNLFFBQVEsR0FDckMsUUFBUSxxQkFBcUIsUUFDN0IsU0FDQTtLQUNBLElBQUksU0FBUyxxQkFBcUI7S0FDbEMsU0FBUyxXQUFXLE9BQU8sUUFBUTtJQUNyQztJQUNGLGtCQUFrQixDQUFDO0dBQ3JCO0dBQ0EsTUFBTSxlQUFlLHdCQUF3QixNQUFNLGFBQWEsQ0FBQztHQUNqRSxNQUFNLHVCQUNKLE1BQU0sZ0JBQ04sTUFBTSxLQUFLLFFBQ1YsS0FBSyxrQkFDSixzQkFBc0IsRUFBRSx5QkFBeUIsQ0FBQztFQUN4RDtFQUNBLFNBQVMsd0JBQXdCLE1BQU0sYUFBYSxnQkFBZ0I7R0FDbEUsS0FBSyxnQkFBZ0I7R0FDckIsS0FBSyxrQkFBa0IsQ0FBQztHQUN4QixJQUFJLG1CQUFtQixLQUFLLE1BQU0sV0FBVztHQUM3QyxLQUFLLGtCQUFrQjtHQUN2QixLQUFLLGNBQWMsb0JBQ2pCLEtBQUssY0FBYyxvQkFDbkIsYUFDQyxpQkFBaUI7RUFDdEI7RUFDQSxTQUFTLGtCQUFrQixNQUFNLGdCQUFnQjtHQUMvQyxJQUFJLHFCQUFzQixLQUFLLGtCQUFrQjtHQUNqRCxLQUFLLE9BQU8sS0FBSyxlQUFlLHFCQUFzQjtJQUNwRCxJQUFJLFFBQVEsS0FBSyxNQUFNLGtCQUFrQixHQUN2QyxPQUFPLEtBQUs7SUFDZCxPQUFRLGlCQUFtQixLQUFLLFNBQVMsbUJBQ3RDLEtBQUssVUFBVTtJQUNsQixzQkFBc0IsQ0FBQztHQUN6QjtFQUNGO0VBQ0EsU0FBUywwQkFBMEIsTUFBTSxhQUFhO0dBQ3BELElBQUksYUFBYSxjQUFjLENBQUM7R0FDaEMsYUFDRSxPQUFPLGFBQWEsTUFDaEIsSUFDQSxnQ0FBZ0MsVUFBVTtHQUNoRCxPQUFPLE9BQU8sY0FBYyxLQUFLLGlCQUFpQixnQkFDOUMsSUFDQTtFQUNOO0VBQ0EsU0FBUyxnQ0FBZ0MsTUFBTTtHQUM3QyxRQUFRLE1BQVI7SUFDRSxLQUFLO0tBQ0gsT0FBTztLQUNQO0lBQ0YsS0FBSztLQUNILE9BQU87S0FDUDtJQUNGLEtBQUs7S0FDSCxPQUFPO0tBQ1A7SUFDRixLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7S0FDSCxPQUFPO0tBQ1A7SUFDRixLQUFLO0tBQ0gsT0FBTztLQUNQO0lBQ0YsU0FDRSxPQUFPO0dBQ1g7R0FDQSxPQUFPO0VBQ1Q7RUFDQSxTQUFTLG1CQUFtQixNQUFNLE9BQU8sT0FBTztHQUM5QyxJQUFJLG1CQUNGLEtBQUssT0FBTyxLQUFLLHdCQUF3QixJQUFJLFFBQVM7SUFDcEQsSUFBSSxRQUFRLEtBQUssTUFBTSxLQUFLLEdBQzFCLE9BQU8sS0FBSztJQUNkLEtBQUssTUFBTSxDQUFDLElBQUksS0FBSztJQUNyQixTQUFTLENBQUM7R0FDWjtFQUNKO0VBQ0EsU0FBUyw0QkFBNEIsTUFBTSxPQUFPO0dBQ2hELElBQUksbUJBQ0YsS0FDRSxJQUFJLHlCQUF5QixLQUFLLHdCQUNoQyxtQkFBbUIsS0FBSyxrQkFDMUIsSUFBSSxRQUVKO0lBQ0EsSUFBSSxRQUFRLEtBQUssTUFBTSxLQUFLO0lBQzVCLE9BQU8sS0FBSztJQUNaLFFBQVEsdUJBQXVCO0lBQy9CLElBQUksTUFBTSxTQUNQLE1BQU0sUUFBUSxTQUFVLE9BQU87S0FDOUIsSUFBSSxZQUFZLE1BQU07S0FDdEIsU0FBVSxhQU
15852FhLGlCQUFpQixJQUFJLFNBQVMsS0FDbkQsaUJBQWlCLElBQUksS0FBSztJQUM5QixDQUFDLEdBQ0QsTUFBTSxNQUFNO0lBQ2QsU0FBUyxDQUFDO0dBQ1o7RUFDSjtFQUNBLFNBQVMscUJBQXFCLE9BQU87R0FDbkMsU0FBUyxDQUFDO0dBQ1YsT0FBTyxNQUFNLHlCQUF5Qix3QkFBd0IsUUFDMUQsTUFBTSwyQkFBMkIsMEJBQTBCLFFBQ3pELE9BQU8sUUFBUSxhQUNiLHVCQUNBLG9CQUNGLDBCQUNGO0VBQ047RUFDQSxTQUFTLHdCQUF3QjtHQUMvQixJQUFJLGlCQUFpQix3QkFBd0I7R0FDN0MsSUFBSSxNQUFNLGdCQUFnQixPQUFPO0dBQ2pDLGlCQUFpQixPQUFPO0dBQ3hCLE9BQU8sS0FBSyxNQUFNLGlCQUNkLHVCQUNBLGlCQUFpQixlQUFlLElBQUk7RUFDMUM7RUFDQSxTQUFTLGdCQUFnQixVQUFVLElBQUk7R0FDckMsSUFBSSxtQkFBbUIsd0JBQXdCO0dBQy9DLElBQUk7SUFDRixPQUFRLHdCQUF3QixJQUFJLFVBQVcsR0FBRztHQUNwRCxVQUFVO0lBQ1Isd0JBQXdCLElBQUk7R0FDOUI7RUFDRjtFQUNBLFNBQVMsc0JBQXNCLE1BQU07R0FDbkMsT0FBTyxLQUFLO0dBQ1osT0FBTyxLQUFLO0dBQ1osT0FBTyxLQUFLO0dBQ1osT0FBTyxLQUFLO0VBQ2Q7RUFDQSxTQUFTLDJCQUEyQixZQUFZO0dBQzlDLElBQUk7R0FDSixJQUFLLGFBQWEsV0FBVyxzQkFBdUIsT0FBTztHQUMzRCxLQUFLLElBQUksYUFBYSxXQUFXLFlBQVksYUFBYztJQUN6RCxJQUNHLGFBQ0MsV0FBVyxpQ0FDWCxXQUFXLHNCQUNiO0tBQ0EsYUFBYSxXQUFXO0tBQ3hCLElBQ0UsU0FBUyxXQUFXLFNBQ25CLFNBQVMsY0FBYyxTQUFTLFdBQVcsT0FFNUMsS0FDRSxhQUFhLDJCQUEyQixVQUFVLEdBQ2xELFNBQVMsYUFFVDtNQUNBLElBQUssYUFBYSxXQUFXLHNCQUMzQixPQUFPO01BQ1QsYUFBYSwyQkFBMkIsVUFBVTtLQUNwRDtLQUNGLE9BQU87SUFDVDtJQUNBLGFBQWE7SUFDYixhQUFhLFdBQVc7R0FDMUI7R0FDQSxPQUFPO0VBQ1Q7RUFDQSxTQUFTLG9CQUFvQixNQUFNO0dBQ2pDLElBQ0csT0FBTyxLQUFLLHdCQUF3QixLQUFLLCtCQUMxQztJQUNBLElBQUksTUFBTSxLQUFLO0lBQ2YsSUFDRSxNQUFNLE9BQ04sTUFBTSxPQUNOLE9BQU8sT0FDUCxPQUFPLE9BQ1AsT0FBTyxPQUNQLE9BQU8sT0FDUCxNQUFNLEtBRU4sT0FBTztHQUNYO0dBQ0EsT0FBTztFQUNUO0VBQ0EsU0FBUyxvQkFBb0IsTUFBTTtHQUNqQyxJQUFJLE1BQU0sS0FBSztHQUNmLElBQUksTUFBTSxPQUFPLE9BQU8sT0FBTyxPQUFPLE9BQU8sTUFBTSxLQUNqRCxPQUFPLEtBQUs7R0FDZCxNQUFNLE1BQU0sd0NBQXdDO0VBQ3REO0VBQ0EsU0FBUyxxQkFBcUIsTUFBTTtHQUNsQyxJQUFJLFlBQVksS0FBSztHQUNyQixjQUNHLFlBQVksS0FBSyxnQ0FDaEI7SUFBRSxpQ0FBaUIsSUFBSSxJQUFJO0lBQUcsa0NBQWtCLElBQUksSUFBSTtHQUFFO0dBQzlELE9BQU87RUFDVDtFQUNBLFNBQVMsb0JBQW9CLE1BQU07R0FDakMsS0FBSywyQkFBMkIsQ0FBQztFQUNuQztFQUNBLFNBQVMsdUJBQXVCLE1BQU07R0FDcEMsS0FBSywwQkFBMEIsS0FBSztFQUN0QztFQUNBLFNBQVMsc0JBQXNCLGtCQUFrQixjQUFjO0dBQzdELG9CQUFvQixrQkFBa0IsWUFBWTtHQUNsRCxvQkFBb0IsbUJBQW1CLFdBQVcsWUFBWTtFQUNoRTtFQUNBLFNBQVMsb0JBQW9CLGtCQUFrQixjQUFjO0dBQzNELDZCQUE2QixxQkFDM0IsUUFBUSxNQUNOLDhGQUNBLGdCQUNGO0dBQ0YsNkJBQTZCLG9CQUFvQjtHQUNqRCxJQUFJLGlCQUFpQixpQkFBaUIsWUFBWTtHQUNsRCwwQkFBMEIsa0JBQWtCO0dBQzVDLG9CQUFvQixxQkFDakIsMEJBQTBCLGFBQWE7R0FDMUMsS0FDRSxtQkFBbUIsR0FDbkIsbUJBQW1CLGFBQWEsUUFDaEMsb0JBRUEsZ0JBQWdCLElBQUksYUFBYSxpQkFBaUI7RUFDdEQ7RUFDQSxTQUFTLDBCQUEwQixTQUFTLE9BQU87R0FDakQsaUJBQWlCLE1BQU0sU0FDckIsTUFBTSxZQUNOLE1BQU0sV0FDTixNQUFNLFlBQ04sTUFBTSxZQUNOLFFBQVEsTUFBTSxVQUNiLGFBQWEsVUFDVixRQUFRLE1BQ04sOExBQ0YsSUFDQSxRQUFRLE1BQ04sbU5BQ0Y7R0FDTixNQUFNLFlBQ0osTUFBTSxZQUNOLE1BQU0sWUFDTixRQUFRLE1BQU0sV0FDZCxRQUFRLE1BQ04sdU5BQ0Y7RUFDSjtFQUNBLFNBQVMsb0JBQW9CLGVBQWU7R0FDMUMsSUFBSSxlQUFlLEtBQUssNkJBQTZCLGFBQWEsR0FDaEUsT0FBTyxDQUFDO0dBQ1YsSUFBSSxlQUFlLEtBQUssMkJBQTJCLGFBQWEsR0FDOUQsT0FBTyxDQUFDO0dBQ1YsSUFBSSwyQkFBMkIsS0FBSyxhQUFhLEdBQy9DLE9BQVEsNEJBQTRCLGlCQUFpQixDQUFDO0dBQ3hELDBCQUEwQixpQkFBaUIsQ0FBQztHQUM1QyxRQUFRLE1BQU0sZ0NBQWdDLGFBQWE7R0FDM0QsT0FBTyxDQUFDO0VBQ1Y7RUFDQSxTQUFTLHNCQUFzQjtHQUM3QixJQUFJLE9BQU87R0FDWCxnQ0FBZ0MsQ0FBQztHQUNqQyxPQUFPO0VBQ1Q7RUFDQSxTQUFTLHNDQUFzQyxNQUFNLE1BQU0sVUFBVTtHQUNuRSxJQUFJLG9CQUFvQixJQUFJLEdBQUc7SUFDN0IsSUFBSSxDQUFDLEtBQUssYUFBYSxJQUFJLEdBQUc7S0FDNUIsUUFBUSxPQUFPLFVBQWY7TUFDRSxLQUFLO01BQ0wsS0FBSyxVQUNILE9BQU87TUFDVCxLQUFLLFlBQ0gsT0FBTztNQUNULEtBQUssV0FDSCxJQUFJLENBQUMsTUFBTSxVQUFVLE9BQU87S0FDaEM7S0FDQSxPQUFPLEtBQUssTUFBTSxXQUFXLEtBQUssSUFBSTtJQUN4QztJQUNBLE9BQ0UsWUFBWSxLQUFLLFlBQVksSUFBSSxLQUFLLFFBQVEsS0FBSyxhQUFhLElBQUk7SUFDdEUsSUFBSSxPQUFPLFFBQVEsQ0FBQyxNQUFNLFVBQVUsT0FBTyxDQUFDO0lBQzVDLDZCQUE2QixVQUFVLElBQUk7SUFDM0MsT0FBTyxTQUFTLEtBQUssV0FBVyxXQUFXO0dBQzdDO0VBQ0Y7RUFDQSxTQUFTLHFCQUFxQixNQUFNLE1BQU0sT0FBTztHQUMvQyxJQUFJLG9CQUFvQixJQUFJLEdBQzFCLElBQUksU0FBUyxPQUFPLEtBQUssZ0JBQWdCLElBQUk7UUFDeEM7SUFDSCxRQUFRLE9BQU8sT0FBZjtLQUNFLEtBQUs7S0FDTCxLQUFLO0tBQ0wsS0FBSztNQUNILEtBQUssZ0JBQWdCLElBQUk7TUFDekI7S0FDRixLQUFLO01BQ0gsSUFBSSxTQUFTLEtBQUssWUFBWSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUM7TUFDMUMsSUFBSSxZQUFZLFVBQVUsWUFBWSxRQUFRO09BQzVDLEtBQUssZ0JBQWdCLElBQUk7T0FDekI7TUFDRjtJQUNKO0lBQ0EsNkJBQTZCLE9BQU8sSUFBSTtJQUN4QyxLQUFLLGFBQWEsTUFBTSxLQUFLO0dBQy9CO0VBQ0o7RUFDQSxTQUFTLDBCQUEwQixNQUFNLE1BQU0sT0FBTztHQUNwRCxJQUFJLFNBQVMsT0FBTyxLQUFLLGdCQUFnQixJQUFJO1FBQ3hDO0lBQ0gsUUFBUSxPQUFPLE9BQWY7S0FDRSxLQUFLO0tBQ0wsS0FBSztLQUNMLEtB
15852QUs7S0FDTCxLQUFLO01BQ0gsS0FBSyxnQkFBZ0IsSUFBSTtNQUN6QjtJQUNKO0lBQ0EsNkJBQTZCLE9BQU8sSUFBSTtJQUN4QyxLQUFLLGFBQWEsTUFBTSxLQUFLO0dBQy9CO0VBQ0Y7RUFDQSxTQUFTLCtCQUErQixNQUFNLFdBQVcsTUFBTSxPQUFPO0dBQ3BFLElBQUksU0FBUyxPQUFPLEtBQUssZ0JBQWdCLElBQUk7UUFDeEM7SUFDSCxRQUFRLE9BQU8sT0FBZjtLQUNFLEtBQUs7S0FDTCxLQUFLO0tBQ0wsS0FBSztLQUNMLEtBQUs7TUFDSCxLQUFLLGdCQUFnQixJQUFJO01BQ3pCO0lBQ0o7SUFDQSw2QkFBNkIsT0FBTyxJQUFJO0lBQ3hDLEtBQUssZUFBZSxXQUFXLE1BQU0sS0FBSztHQUM1QztFQUNGO0VBQ0EsU0FBUyxpQkFBaUIsT0FBTztHQUMvQixRQUFRLE9BQU8sT0FBZjtJQUNFLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLLGFBQ0gsT0FBTztJQUNULEtBQUssVUFDSCxPQUFPLGtDQUFrQyxLQUFLLEdBQUc7SUFDbkQsU0FDRSxPQUFPO0dBQ1g7RUFDRjtFQUNBLFNBQVMsWUFBWSxNQUFNO0dBQ3pCLElBQUksT0FBTyxLQUFLO0dBQ2hCLFFBQ0csT0FBTyxLQUFLLGFBQ2IsWUFBWSxLQUFLLFlBQVksTUFDNUIsZUFBZSxRQUFRLFlBQVk7RUFFeEM7RUFDQSxTQUFTLGlCQUFpQixNQUFNLFlBQVksY0FBYztHQUN4RCxJQUFJLGFBQWEsT0FBTyx5QkFDdEIsS0FBSyxZQUFZLFdBQ2pCLFVBQ0Y7R0FDQSxJQUNFLENBQUMsS0FBSyxlQUFlLFVBQVUsS0FDL0IsZ0JBQWdCLE9BQU8sY0FDdkIsZUFBZSxPQUFPLFdBQVcsT0FDakMsZUFBZSxPQUFPLFdBQVcsS0FDakM7SUFDQSxJQUFJLE1BQU0sV0FBVyxLQUNuQixNQUFNLFdBQVc7SUFDbkIsT0FBTyxlQUFlLE1BQU0sWUFBWTtLQUN0QyxjQUFjLENBQUM7S0FDZixLQUFLLFdBQVk7TUFDZixPQUFPLElBQUksS0FBSyxJQUFJO0tBQ3RCO0tBQ0EsS0FBSyxTQUFVLE9BQU87TUFDcEIsa0NBQWtDLEtBQUs7TUFDdkMsZUFBZSxLQUFLO01BQ3BCLElBQUksS0FBSyxNQUFNLEtBQUs7S0FDdEI7SUFDRixDQUFDO0lBQ0QsT0FBTyxlQUFlLE1BQU0sWUFBWSxFQUN0QyxZQUFZLFdBQVcsV0FDekIsQ0FBQztJQUNELE9BQU87S0FDTCxVQUFVLFdBQVk7TUFDcEIsT0FBTztLQUNUO0tBQ0EsVUFBVSxTQUFVLE9BQU87TUFDekIsa0NBQWtDLEtBQUs7TUFDdkMsZUFBZSxLQUFLO0tBQ3RCO0tBQ0EsY0FBYyxXQUFZO01BQ3hCLEtBQUssZ0JBQWdCO01BQ3JCLE9BQU8sS0FBSztLQUNkO0lBQ0Y7R0FDRjtFQUNGO0VBQ0EsU0FBUyxNQUFNLE1BQU07R0FDbkIsSUFBSSxDQUFDLEtBQUssZUFBZTtJQUN2QixJQUFJLGFBQWEsWUFBWSxJQUFJLElBQUksWUFBWTtJQUNqRCxLQUFLLGdCQUFnQixpQkFDbkIsTUFDQSxZQUNBLEtBQUssS0FBSyxXQUNaO0dBQ0Y7RUFDRjtFQUNBLFNBQVMscUJBQXFCLE1BQU07R0FDbEMsSUFBSSxDQUFDLE1BQU0sT0FBTyxDQUFDO0dBQ25CLElBQUksVUFBVSxLQUFLO0dBQ25CLElBQUksQ0FBQyxTQUFTLE9BQU8sQ0FBQztHQUN0QixJQUFJLFlBQVksUUFBUSxTQUFTO0dBQ2pDLElBQUksUUFBUTtHQUNaLFNBQ0csUUFBUSxZQUFZLElBQUksSUFDckIsS0FBSyxVQUNILFNBQ0EsVUFDRixLQUFLO0dBQ1gsT0FBTztHQUNQLE9BQU8sU0FBUyxhQUFhLFFBQVEsU0FBUyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUM7RUFDOUQ7RUFDQSxTQUFTLCtDQUErQyxPQUFPO0dBQzdELE9BQU8sTUFBTSxRQUNYLHFEQUNBLFNBQVUsSUFBSTtJQUNaLE9BQU8sT0FBTyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLElBQUk7R0FDaEQsQ0FDRjtFQUNGO0VBQ0EsU0FBUyxtQkFBbUIsU0FBUyxPQUFPO0dBQzFDLEtBQUssTUFBTSxNQUFNLFdBQ2YsS0FBSyxNQUFNLE1BQU0sa0JBQ2pCLGlDQUNDLFFBQVEsTUFDUCw0V0FDQSxvQ0FBb0MsS0FBSyxlQUN6QyxNQUFNLElBQ1IsR0FDQywrQkFBK0IsQ0FBQztHQUNuQyxLQUFLLE1BQU0sTUFBTSxTQUNmLEtBQUssTUFBTSxNQUFNLGdCQUNqQiwrQkFDQyxRQUFRLE1BQ1Asb1dBQ0Esb0NBQW9DLEtBQUssZUFDekMsTUFBTSxJQUNSLEdBQ0MsNkJBQTZCLENBQUM7RUFDbkM7RUFDQSxTQUFTLFlBQ1AsU0FDQSxPQUNBLGNBQ0Esa0JBQ0EsU0FDQSxnQkFDQSxNQUNBLE1BQ0E7R0FDQSxRQUFRLE9BQU87R0FDZixRQUFRLFFBQ1IsZUFBZSxPQUFPLFFBQ3RCLGFBQWEsT0FBTyxRQUNwQixjQUFjLE9BQU8sUUFDaEIsNkJBQTZCLE1BQU0sTUFBTSxHQUFJLFFBQVEsT0FBTyxRQUM3RCxRQUFRLGdCQUFnQixNQUFNO0dBQ2xDLElBQUksUUFBUSxPQUNWLElBQUksYUFBYSxNQUNWO1FBQUEsTUFBTSxTQUFTLE9BQU8sUUFBUSxTQUFVLFFBQVEsU0FBUyxPQUM1RCxRQUFRLFFBQVEsS0FBSyxpQkFBaUIsS0FBSztHQUFBLE9BRTdDLFFBQVEsVUFBVSxLQUFLLGlCQUFpQixLQUFLLE1BQzFDLFFBQVEsUUFBUSxLQUFLLGlCQUFpQixLQUFLO1FBRWhELGFBQWMsUUFBUSxZQUFZLFFBQ2hDLFFBQVEsZ0JBQWdCLE9BQU87R0FDbkMsUUFBUSxRQUNKLGFBQWEsUUFBUSxRQUFRLFNBQVMsUUFDcEMsZ0JBQWdCLFNBQVMsaUJBQWlCLFFBQVEsS0FBSyxDQUFDLElBQ3hELGdCQUFnQixTQUFTLGlCQUFpQixLQUFLLENBQUMsSUFDbEQsUUFBUSxlQUNOLGdCQUFnQixTQUFTLGlCQUFpQixZQUFZLENBQUMsSUFDdkQsUUFBUSxvQkFBb0IsUUFBUSxnQkFBZ0IsT0FBTztHQUNqRSxRQUFRLFdBQ04sUUFBUSxtQkFDUCxRQUFRLGlCQUFpQixDQUFDLENBQUM7R0FDOUIsUUFBUSxZQUNMLFFBQVEsVUFDUCxXQUNBLGVBQWUsT0FBTyxXQUN0QixhQUFhLE9BQU87R0FDeEIsUUFBUSxRQUNSLGVBQWUsT0FBTyxRQUN0QixhQUFhLE9BQU8sUUFDcEIsY0FBYyxPQUFPLFFBQ2hCLDZCQUE2QixNQUFNLE1BQU0sR0FDekMsUUFBUSxPQUFPLEtBQUssaUJBQWlCLElBQUksS0FDMUMsUUFBUSxnQkFBZ0IsTUFBTTtFQUNwQztFQUNBLFNBQVMsVUFDUCxTQUNBLE9BQ0EsY0FDQSxTQUNBLGdCQUNBLE1BQ0EsTUFDQSxhQUNBO0dBQ0EsUUFBUSxRQUNOLGVBQWUsT0FBTyxRQUN0QixhQUFhLE9BQU8sUUFDcEIsY0FBYyxPQUFPLFNBQ3BCLDZCQUE2QixNQUFNLE1BQU0sR0FBSSxRQUFRLE9BQU87R0FDL0QsSUFBSSxRQUFRLFNBQVMsUUFBUSxjQUFjO0lBQ3pDLElBQ0UsRUFDRyxhQUFhLFFBQVEsWUFBWSxRQUNqQyxLQUFLLE1BQU0sU0FBUyxTQUFTLFFBRWhDO0tBQ0EsTUFBTSxPQUFPO0tBQ2I7SUFDRjtJQUNBLGVBQ0UsUUFBUSxlQUFlLEtBQUssaUJBQWlCLFlBQVksSUFBSTtJQUMvRCxRQUFRLFFBQVEsUUFBUSxLQUFLLGlCQUFpQixLQUFLLElBQUk7SUFDdkQsZUFBZSxVQUFVLFFBQVEsVUFBVSxRQUFRLFFBQVE7SUFDM0QsUUFBUSxlQUFlO0dBQ3pCO0dBQ0EsVUFBVSxRQUFRLFVBQVUsVUFBVTtHQUN0QyxVQUNFLGVBQWUsT0FBTyxXQUN0QixhQUFhLE9BQU8sV0FDcEIsQ0FBQyxDQUFDO0dBQ0osUUFBUSxVQUFVLGNBQWMsUUFBUSxVQUFVLENBQUMsQ0FBQztHQUNwRCxRQUFRLGlCQUFpQixDQUFDLENBQUM7R0FDM0IsUUFBUSxRQUNOLGVBQWUsT0FBTyxRQUN0QixhQUFhLE9BQU8sUUFDcEIsY0FBYyxPQUFPLFNBQ3BCLDZCQUE2QixNQUFNLE1BQU0sR0FBSSxRQUFRLE9BQU87R0FDL0QsTUFBTSxPQUFPO0VBQ2Y7RUFDQSxTQUFTLGdCQUFnQixNQUFNLE9BQU87R0FDcEMsS0FBSyxpQkFBaUIsS0FBSyxVQUFVLEtBQUssZUFBZSxLQUFLO0VBQ2hFO0VBQ0EsU0FBUyxvQkFBb0IsU0FBUyxPQUFPO0dBQzNDLE1BQWMsVUFDWCxhQUFhLE9BQU8sTUFBTSxZQUFZLFNBQVMsTUFBTSxXQUNsRCxNQUFNLFNBQVMsUUFBUSxNQUFNLFVBQVUsU0FBVSxPQUFPO0lBQ3RELFFBQVEsU0FDTixhQUFhLE9BQU8sU0FDcEIsYUFBYSxPQUFPLFNBQ3BCLGFBQWEsT0FBTyxTQUNwQix3QkFDRSxzQkFBc0IsQ0FBQyxHQUN6QixRQUFRLE1BQ04sdUhBQ0Y7R0FDSixDQUFDLElBQ0QsUUFBUSxNQUFNLDJCQUNkLDRCQUNFLDBCQUEwQixDQUFDLEdBQzdCLFFBQVEsTUFDTixvR0FDRjtHQUNOLFFBQVEsTUFBTSxZQUNaLCtCQUNDLFFBQVEsTUFDUCxnR0FDRixHQUNDLDZCQUE2QixDQUFDO0VBQ25DO0VBQ0EsU0FBUyw4QkFBOEI7R0FDckMsSUFBSSxZQUFZLG9DQUFvQztHQUNwRCxPQUFPLFlBQ0gscUNBQXFDLFlBQVksT0FDakQ7RUFDTjtFQUNBLFNBQVMsY0FBYyxNQUFNLFVBQVUsV0FBVyxvQkFBb0I7R0FDcEUsT0FBTyxLQUFLO0dBQ1osSUFBSSxVQUFVO0lBQ1osV0FBVyxDQUFDO0lBQ1osS0FBSyxJQUFJLElBQUksR0FBRyxJQUFJLFVBQVUsUUFBUSxLQUNwQyxTQUFTLE1BQU0sVUFBVSxNQUFNLENBQUM7SUFDbEMsS0FBSyxZQUFZLEd
15852BQUcsWUFBWSxLQUFLLFFBQVEsYUFDM0MsSUFBSyxTQUFTLGVBQWUsTUFBTSxLQUFLLFVBQVUsQ0FBQyxLQUFLLEdBQ3RELEtBQUssVUFBVSxDQUFDLGFBQWEsTUFBTSxLQUFLLFVBQVUsQ0FBQyxXQUFXLElBQzlELEtBQUssdUJBQXVCLEtBQUssVUFBVSxDQUFDLGtCQUFrQixDQUFDO0dBQ3JFLE9BQU87SUFDTCxZQUFZLEtBQUssaUJBQWlCLFNBQVM7SUFDM0MsV0FBVztJQUNYLEtBQUssSUFBSSxHQUFHLElBQUksS0FBSyxRQUFRLEtBQUs7S0FDaEMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxVQUFVLFdBQVc7TUFDL0IsS0FBSyxFQUFFLENBQUMsV0FBVyxDQUFDO01BQ3BCLHVCQUF1QixLQUFLLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQztNQUNsRDtLQUNGO0tBQ0EsU0FBUyxZQUFZLEtBQUssRUFBRSxDQUFDLGFBQWEsV0FBVyxLQUFLO0lBQzVEO0lBQ0EsU0FBUyxhQUFhLFNBQVMsV0FBVyxDQUFDO0dBQzdDO0VBQ0Y7RUFDQSxTQUFTLG9CQUFvQixTQUFTLE9BQU87R0FDM0MsS0FBSyxVQUFVLEdBQUcsVUFBVSxlQUFlLFFBQVEsV0FBVztJQUM1RCxJQUFJLFdBQVcsZUFBZTtJQUM5QixJQUFJLFFBQVEsTUFBTSxXQUFXO0tBQzNCLElBQUksa0JBQWtCLFlBQVksTUFBTSxTQUFTO0tBQ2pELE1BQU0sWUFBWSxDQUFDLGtCQUNmLFFBQVEsTUFDTixnRkFDQSxVQUNBLDRCQUE0QixDQUM5QixJQUNBLENBQUMsTUFBTSxZQUNQLG1CQUNBLFFBQVEsTUFDTix1RkFDQSxVQUNBLDRCQUE0QixDQUM5QjtJQUNOO0dBQ0Y7R0FDQSxLQUFLLE1BQU0sTUFBTSxTQUNmLEtBQUssTUFBTSxNQUFNLGdCQUNqQiw2QkFDQyxRQUFRLE1BQ1AsNFJBQ0YsR0FDQywyQkFBMkIsQ0FBQztFQUNqQztFQUNBLFNBQVMsc0JBQXNCLFNBQVMsT0FBTztHQUM3QyxLQUFLLE1BQU0sTUFBTSxTQUNmLEtBQUssTUFBTSxNQUFNLGdCQUNqQix5QkFDQyxRQUFRLE1BQ1AseVZBQ0Esb0NBQW9DLEtBQUssYUFDM0MsR0FDQyx1QkFBdUIsQ0FBQztHQUMzQixRQUFRLE1BQU0sWUFDWixRQUFRLE1BQU0sU0FDZCxRQUFRLE1BQ04sb0ZBQ0Y7RUFDSjtFQUNBLFNBQVMsZUFBZSxTQUFTLE9BQU8sY0FBYztHQUNwRCxJQUNFLFFBQVEsVUFDTixRQUFRLEtBQUssaUJBQWlCLEtBQUssR0FDckMsVUFBVSxRQUFRLFVBQVUsUUFBUSxRQUFRLFFBQzVDLFFBQVEsZUFDUjtJQUNBLFFBQVEsaUJBQWlCLFVBQVUsUUFBUSxlQUFlO0lBQzFEO0dBQ0Y7R0FDQSxRQUFRLGVBQ04sUUFBUSxlQUFlLEtBQUssaUJBQWlCLFlBQVksSUFBSTtFQUNqRTtFQUNBLFNBQVMsYUFBYSxTQUFTLE9BQU8sY0FBYyxVQUFVO0dBQzVELElBQUksUUFBUSxPQUFPO0lBQ2pCLElBQUksUUFBUSxVQUFVO0tBQ3BCLElBQUksUUFBUSxjQUNWLE1BQU0sTUFDSixxRUFDRjtLQUNGLElBQUksWUFBWSxRQUFRLEdBQUc7TUFDekIsSUFBSSxJQUFJLFNBQVMsUUFDZixNQUFNLE1BQU0sNkNBQTZDO01BQzNELFdBQVcsU0FBUztLQUN0QjtLQUNBLGVBQWU7SUFDakI7SUFDQSxpQkFBd0M7SUFDeEMsUUFBUTtHQUNWO0dBQ0EsZUFBZSxpQkFBaUIsS0FBSztHQUNyQyxRQUFRLGVBQWU7R0FDdkIsV0FBVyxRQUFRO0dBQ25CLGFBQWEsZ0JBQ1gsT0FBTyxZQUNQLFNBQVMsYUFDUixRQUFRLFFBQVE7R0FDbkIsTUFBTSxPQUFPO0VBQ2Y7RUFDQSxTQUFTLGdCQUFnQixNQUFNLFFBQVE7R0FDckMsT0FBTyxLQUFLLE1BQU0sS0FBSyxlQUNyQixNQUFNLEtBQUssV0FBVyxVQUN0QixNQUFNLEtBQUssU0FBUyxVQUNwQixJQUFJLEtBQUssb0JBQ1QsS0FBSyxtQkFBbUIsS0FBSyxTQUMzQixnQkFBZ0IsS0FBSyxTQUFTLElBQUksTUFBTSxJQUN4QztFQUNOO0VBQ0EsU0FBUyxZQUFZLFFBQVE7R0FDM0IsT0FBTyxPQUFPLEtBQUssT0FBTyxNQUFNO0VBQ2xDO0VBQ0EsU0FBUyxNQUFNLFFBQVE7R0FDckIsT0FBTyxPQUFPLEtBQUssT0FBTyxNQUFNO0VBQ2xDO0VBQ0EsU0FBUyxRQUFRLFFBQVE7R0FDdkIsT0FBTyxPQUFPLEtBQUssT0FBTyxNQUFNO0VBQ2xDO0VBQ0EsU0FBUyxrQkFBa0IsT0FBTztHQUNoQyxRQUFRLE1BQU0sS0FBZDtJQUNFLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSyxHQUNILE9BQU8sTUFBTTtJQUNmLEtBQUssSUFDSCxPQUFPO0lBQ1QsS0FBSyxJQUNILE9BQU87SUFDVCxLQUFLLElBQ0gsT0FBTztJQUNULEtBQUssSUFDSCxPQUFPO0lBQ1QsS0FBSztJQUNMLEtBQUssSUFDSCxPQUFRLFFBQVEsTUFBTSxNQUFPLE1BQU0sZUFBZSxNQUFNLFFBQVE7SUFDbEUsS0FBSyxJQUNILE9BQ0csUUFBUSxNQUFNLEtBQUssUUFBUyxNQUFNLGVBQWUsTUFBTSxRQUFRO0lBRXBFLEtBQUssR0FDSCxPQUFRLFFBQVEsTUFBTSxNQUFPLE1BQU0sZUFBZSxNQUFNLFFBQVE7SUFDbEUsU0FDRSxPQUFPO0dBQ1g7RUFDRjtFQUNBLFNBQVMsaUJBQWlCLFNBQVMsV0FBVztHQUM1QyxPQUFPLGNBQWMsS0FBSyxPQUFPLEtBQzNCLFVBQVUsS0FBSyxVQUFVLE9BQU8sR0FDbEMsUUFBUSxTQUFTLFlBQVksSUFDekIsSUFBSSxZQUNGLGNBQ0EsTUFBTSxRQUFRLE1BQU0sR0FBRyxZQUFZLENBQUMsSUFBSSxXQUMxQyxNQUFNLFVBQVUsT0FDcEIsUUFBUSxTQUFTLFlBQ2YsSUFBSSxZQUNGLGNBQ0EsUUFBUSxNQUFNLEdBQUcsWUFBWSxDQUFDLElBQUksUUFDcEM7RUFDUjtFQUNBLFNBQVMsaUJBQWlCLFlBQVksYUFBYSxRQUFRO0dBQ3pELElBQUksWUFBWSxNQUFNLElBQUk7R0FDMUIsSUFBSSxTQUFTLGFBQ1gsT0FBTyxNQUFNLE1BQU0sSUFBSSxpQkFBaUIsWUFBWSxTQUFTLElBQUk7R0FDbkUsSUFBSSxhQUFhLE9BQU8sYUFBYTtJQUNuQyxLQUNFLElBQUksWUFBWSxHQUNoQixZQUFZLFlBQVksVUFDeEIsWUFBWSxXQUFXLFVBQ3ZCLFlBQVksV0FBVyxTQUFTLE1BQzlCLFdBQVcsV0FBVyxTQUFTLEdBQ2pDO0lBRUYsWUFBWSxZQUFZLEtBQ3RCLEtBQUssY0FDSCxhQUFhLFFBQVEsV0FBVyxNQUFNLFlBQVksQ0FBQyxHQUNwRCxjQUFjLFFBQVEsWUFBWSxNQUFNLFlBQVksQ0FBQztJQUN4RCxPQUNFLE1BQU0sTUFBTSxJQUNaLGlCQUFpQixZQUFZLFNBQVMsSUFDdEMsT0FDQSxRQUFRLE1BQU0sSUFDZCxpQkFBaUIsYUFBYSxTQUFTLElBQ3ZDO0dBRUo7R0FDQSxPQUNFLFlBQVksTUFBTSxJQUFJLGlCQUFpQixZQUFZLFNBQVMsSUFBSTtFQUVwRTtFQUNBLFNBQVMsV0FBVyxRQUFRO0dBQzFCLE9BQU8sT0FBTyxVQUFVLFNBQ3JCLEtBQUssTUFBTSxDQUFDLENBQ1osUUFBUSxxQkFBcUIsU0FBVSxHQUFHLElBQUk7SUFDN0MsT0FBTztHQUNULENBQUM7RUFDTDtFQUNBLFNBQVMsY0FBYyxPQUFPLFdBQVc7R0FDdkMsUUFBUSxPQUFPLE9BQWY7SUFDRSxLQUFLLFVBQ0gsT0FDRyxRQUFRLEtBQUssVUFBVSxLQUFLLEdBQzdCLE1BQU0sU0FBUyxZQUNYLElBQUksWUFDRixZQUNBLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxJQUFJLFVBQ2xDO0lBRVIsS0FBSztLQUNILElBQUksU0FBUyxPQUFPLE9BQU87S0FDM0IsSUFBSSxZQUFZLEtB
15852QUssR0FBRyxPQUFPO0tBQy9CLElBQUksTUFBTSxhQUFhLG9CQUNyQixRQUFRLFlBQVkseUJBQXlCLE1BQU0sSUFBSSxLQUNuRCxNQUFNLFlBQVksTUFDbEI7S0FDTixJQUFJLE9BQU8sV0FBVyxLQUFLO0tBQzNCLElBQUksYUFBYSxNQUFNO01BQ3JCLE9BQU87TUFDUCxhQUFhO01BQ2IsS0FBSyxJQUFJLFlBQVksT0FDbkIsSUFBSSxNQUFNLGVBQWUsUUFBUSxHQUFHO09BQ2xDLElBQUksZUFBZSxLQUFLLFVBQVUsUUFBUTtPQUMxQyxpQkFBaUIsT0FBTSxXQUFXLFNBQy9CLFdBQVc7T0FDZCxhQUFhLFNBQVMsU0FBUztPQUMvQixlQUFlLGNBQ2IsTUFBTSxXQUNOLEtBQUssWUFBWSxZQUFZLEVBQy9CO09BQ0EsYUFBYSxhQUFhO09BQzFCLElBQUksSUFBSSxXQUFXO1FBQ2pCLFFBQVEsT0FBTyxPQUFPLFFBQVE7UUFDOUI7T0FDRjtPQUNBLFNBQ0csT0FBTyxPQUFPLEtBQUssT0FBTyxXQUFXLE1BQU07TUFDaEQ7TUFDRixPQUFPLE1BQU0sT0FBTztLQUN0QjtLQUNBLE9BQU87SUFDVCxLQUFLLFlBQ0gsUUFBUSxZQUFZLE1BQU0sZUFBZSxNQUFNLFFBQzNDLGNBQWMsWUFDZDtJQUNOLFNBQ0UsT0FBTyxPQUFPLEtBQUs7R0FDdkI7RUFDRjtFQUNBLFNBQVMsa0JBQWtCLE9BQU8sV0FBVztHQUMzQyxPQUFPLGFBQWEsT0FBTyxTQUFTLGNBQWMsS0FBSyxLQUFLLElBQ3hELE1BQU0sY0FBYyxPQUFPLFlBQVksQ0FBQyxJQUFJLE1BQzVDLE1BQU0sU0FBUyxZQUFZLElBQ3pCLElBQUksWUFDRixZQUNBLE9BQU0sTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLElBQUksVUFDeEMsT0FBTSxRQUFRO0VBQ3RCO0VBQ0EsU0FBUyx3QkFBd0IsTUFBTSxPQUFPLFdBQVc7R0FDdkQsSUFBSSxxQkFBcUIsTUFBTSxVQUFVLFNBQVMsS0FBSyxRQUNyRCxhQUFhLENBQUMsR0FDZDtHQUNGLEtBQUssWUFBWSxPQUNmLElBQUksTUFBTSxlQUFlLFFBQVEsS0FBSyxlQUFlLFVBQVU7SUFDN0QsSUFBSSxZQUFZLGtCQUNkLE1BQU0sV0FDTixNQUFNLFVBQVUsU0FBUyxTQUFTLFNBQVMsQ0FDN0M7SUFDQSxzQkFBc0IsU0FBUyxTQUFTLFVBQVUsU0FBUztJQUMzRCxXQUFXLEtBQUssV0FBVyxNQUFNLFNBQVM7R0FDNUM7R0FDRixPQUFPLE1BQU0sV0FBVyxTQUNwQixZQUFZLE1BQU0sT0FBTyxRQUN6QixJQUFJLHFCQUNGLFlBQVksTUFBTSxPQUFPLE1BQU0sV0FBVyxLQUFLLEdBQUcsSUFBSSxRQUN0RCxZQUNBLE1BQ0EsT0FDQSxPQUNBLFlBQ0EsT0FDQSxXQUFXLEtBQUssT0FBTyxZQUFZLElBQUksSUFDdkMsT0FDQSxZQUNBO0VBQ1I7RUFDQSxTQUFTLHVCQUF1QixjQUFjLGNBQWMsUUFBUTtHQUNsRSxJQUFJLGFBQWEsSUFDZiw0QkFBNEIsT0FBTyxDQUFDLEdBQUcsWUFBWSxHQUNuRDtHQUNGLEtBQUssWUFBWSxjQUNmLElBQUksYUFBYSxlQUFlLFFBQVEsR0FBRztJQUN6QyxPQUFPLDBCQUEwQjtJQUNqQyxJQUFJLFlBQVksTUFBTSxJQUFJLFNBQVMsU0FBUyxTQUFTLEdBQ25ELGtCQUFrQixjQUFjLGFBQWEsV0FBVyxTQUFTO0lBQ25FLGFBQWEsZUFBZSxRQUFRLEtBQzlCLFlBQVksY0FBYyxhQUFhLFdBQVcsU0FBUyxHQUM1RCxjQUNDLE1BQU0sTUFBTSxJQUFJLFdBQVcsT0FBTyxrQkFBa0IsTUFDckQsY0FDQyxRQUFRLE1BQU0sSUFBSSxXQUFXLE9BQU8sWUFBWSxRQUNqRCxjQUNDLE1BQU0sTUFBTSxJQUFJLFdBQVcsT0FBTyxrQkFBa0I7R0FDNUQ7R0FDRixLQUFLLElBQUksYUFBYSwyQkFDcEIsMEJBQTBCLGVBQWUsU0FBUyxNQUM5QyxlQUFlLGNBQ2YsMEJBQTBCLFlBQzFCLE1BQU0sSUFBSSxTQUFTLFVBQVUsU0FBUyxDQUN4QyxHQUNDLGNBQ0MsUUFBUSxNQUFNLElBQUksWUFBWSxPQUFPLGVBQWU7R0FDMUQsT0FBTztFQUNUO0VBQ0EsU0FBUyxvQkFBb0IsTUFBTSxhQUFhLGFBQWEsUUFBUTtHQUNuRSxJQUFJLFVBQVUsSUFDWixrQ0FBa0IsSUFBSSxJQUFJO0dBQzVCLEtBQUsscUJBQXFCLGFBQ3hCLFlBQVksZUFBZSxpQkFBaUIsS0FDMUMsZ0JBQWdCLElBQ2Qsa0JBQWtCLFlBQVksR0FDOUIsaUJBQ0Y7R0FDSixJQUFJLE1BQU0sZ0JBQWdCLFFBQVEsZ0JBQWdCLElBQUksVUFBVSxHQUM5RCxXQUFXLHdCQUNULE1BQ0EsYUFDQSxZQUFZLE1BQU0sQ0FDcEI7UUFDRztJQUNILEtBQUssSUFBSSxjQUFjLGFBQ3JCLElBQ0UsWUFBWSxlQUFlLFVBQVUsS0FDckMsZUFBZSxZQUNmO0tBQ0EsSUFBSSxxQkFDQSxNQUFNLEtBQUssU0FBUyxLQUFLLFdBQVcsU0FBUyxHQUMvQyxpQkFBaUIsZ0JBQWdCLElBQUksV0FBVyxZQUFZLENBQUM7S0FDL0QsSUFBSSxLQUFLLE1BQU0sZ0JBQWdCO01BQzdCLGdCQUFnQixPQUFPLFdBQVcsWUFBWSxDQUFDO01BQy9DLElBQUksb0JBQW9CLFlBQVk7TUFDcEMsaUJBQWlCLFlBQVk7TUFDN0IsSUFBSSxrQkFBa0Isa0JBQ3BCLG1CQUNBLGtCQUNGO01BQ0EscUJBQXFCLGtCQUNuQixnQkFDQSxrQkFDRjtNQUNBLGFBQWEsT0FBTyxxQkFDcEIsU0FBUyxxQkFDVCxhQUFhLE9BQU8sa0JBQ3BCLFNBQVMsa0JBQ1QsYUFBYSxXQUFXLGlCQUFpQixLQUN6QyxhQUFhLFdBQVcsY0FBYyxNQUNyQyxJQUFJLE9BQU8sS0FBSyxpQkFBaUIsQ0FBQyxDQUFDLFVBQ2xDLElBQUksT0FBTyxLQUFLLGNBQWMsQ0FBQyxDQUFDLFVBQ2hDLEtBQUssZ0JBQWdCLFFBQVEsS0FBSyxLQUNsQyxLQUFLLG1CQUFtQixRQUFRLEtBQUssS0FDbEMsV0FDQyxZQUFZLFNBQVMsQ0FBQyxJQUN0QixhQUNBLFVBQ0EsdUJBQ0UsbUJBQ0EsZ0JBQ0EsU0FBUyxDQUNYLElBQ0EsWUFBWSxTQUFTLENBQUMsSUFDdEIsVUFDQSxXQUNBLE1BQU0sU0FBUyxDQUFDLElBQ2hCLGFBQ0EsTUFDQSxrQkFDQSxNQUNELFdBQ0MsUUFBUSxTQUFTLENBQUMsSUFDbEIsYUFDQSxNQUNBLHFCQUNBO0tBQ1IsT0FDRSxXQUNFLFlBQVksU0FBUyxDQUFDLElBQ3RCLGFBQ0EsTUFDQSxrQkFBa0IsWUFBWSxhQUFhLGtCQUFrQixJQUM3RDtJQUNOO0lBQ0YsZ0JBQWdCLFFBQVEsU0FBVSxVQUFVO0tBQzFDLElBQUksZUFBZSxVQUFVO01BQzNCLElBQUksWUFBWSxNQUFNLEtBQUssU0FBUyxLQUFLLFNBQVMsU0FBUztNQUMzRCxXQUNFLFFBQVEsU0FBUyxDQUFDLElBQ2xCLFdBQ0EsTUFDQSxrQkFBa0IsWUFBWSxXQUFXLFNBQVMsSUFDbEQ7S0FDSjtJQUNGLENBQUM7SUFDRCxVQUNFLE9BQU8sVUFDSCxZQUFZLE1BQU0sSUFBSSxNQUFNLE9BQU8sUUFDbkMsWUFBWSxNQUFNLElBQ2xCLE1BQ0EsT0FDQSxPQUNBLFVBQ0EsWUFBWSxNQUFNLElBQ2xCO
158520dBQ1I7R0FDQSxPQUFPLFlBQVk7R0FDbkIsY0FBYyxZQUFZO0dBQzFCLElBQ0UsYUFBYSxPQUFPLFFBQ3BCLGFBQWEsT0FBTyxRQUNwQixhQUFhLE9BQU8sTUFDcEI7SUFDQSxrQkFBa0I7SUFDbEIsSUFDRSxhQUFhLE9BQU8sZUFDcEIsYUFBYSxPQUFPLGVBQ3BCLGFBQWEsT0FBTyxhQUVwQixrQkFBa0IsS0FBSztJQUN6QixXQUFXLGlCQUFpQixpQkFBaUIsS0FBSyxNQUFNLFNBQVMsQ0FBQztHQUNwRSxPQUFPLElBQ0wsYUFBYSxPQUFPLGVBQ3BCLGFBQWEsT0FBTyxlQUNwQixhQUFhLE9BQU8sYUFFcEIsVUFDRSxRQUFRLE9BQ0osVUFBVSxpQkFBaUIsS0FBSyxhQUFhLE1BQU0sU0FBUyxDQUFDLElBQzdELFVBQVUsaUJBQWlCLEtBQUssYUFBYSxLQUFLLEdBQUcsU0FBUyxDQUFDO0dBQ3ZFLE9BQU87RUFDVDtFQUNBLFNBQVMscUJBQXFCLE9BQU8sUUFBUTtHQUMzQyxJQUFJLE9BQU8sa0JBQWtCLEtBQUs7R0FDbEMsSUFBSSxTQUFTLE1BQU07SUFDakIsT0FBTztJQUNQLEtBQUssUUFBUSxNQUFNLE9BQU8sUUFDeEIsUUFBUyxxQkFBcUIsT0FBTyxNQUFNLEdBQ3hDLFFBQVEsTUFBTTtJQUNuQixPQUFPO0dBQ1Q7R0FDQSxPQUFPLFlBQVksTUFBTSxJQUFJLE1BQU0sT0FBTztFQUM1QztFQUNBLFNBQVMsYUFBYSxNQUFNLFFBQVE7R0FDbEMsSUFBSSxhQUFhLGdCQUFnQixNQUFNLE1BQU07R0FDN0MsSUFDRSxlQUFlLFNBQ2QsTUFBTSxLQUFLLFNBQVMsVUFBVSxLQUFLLFNBQVMsT0FBTyxhQUVwRCxPQUNFLFlBQVksTUFBTSxJQUFJLFVBQVUsYUFBYSxZQUFZLFNBQVMsQ0FBQztHQUV2RSxhQUFhO0dBQ2IsSUFBSSxZQUFZLEtBQUssTUFBTTtHQUMzQixJQUFJLFdBQ0YsS0FBSyxJQUFJLElBQUksR0FBRyxJQUFJLFVBQVUsUUFBUSxLQUFLO0lBQ3pDLElBQUksc0JBQXNCLFVBQVUsRUFBRSxDQUFDO0lBQ3ZDLGFBQWEsT0FBTyx3QkFDaEIsY0FDQSxZQUFZLE1BQU0sSUFBSSxNQUFNLHNCQUFzQixPQUNwRDtHQUNKO0dBQ0YsWUFBWTtHQUNaLElBQUksS0FBSyxNQUFNO0dBQ2YsSUFBSSxNQUFNLEtBQUssTUFBTSxLQUNuQixZQUFhLGlCQUFpQixHQUFHLEtBQUssYUFBYSxNQUFNLEdBQUk7UUFDMUQsSUFDRCxzQkFBc0Isa0JBQWtCLEtBQUssS0FBSyxHQUNwRCxTQUFTLHFCQUVULElBQUksS0FBSyxNQUFNLEtBQUssYUFBYTtJQUMvQixZQUFZO0lBQ1osSUFBSSxZQUFZLE1BQU0sSUFBSSxZQUFZLG9CQUFvQixTQUFTLEdBQ2pFLFVBQVU7SUFDWixLQUFLLFlBQVksR0FDZixJQUFJLEVBQUUsZUFBZSxRQUFRLEtBQUssZUFBZSxVQUFVO0tBQ3pELElBQUksWUFBWSxrQkFBa0IsRUFBRSxXQUFXLEVBQUU7S0FDakQsYUFBYSxTQUFTLFNBQVMsVUFBVSxTQUFTO0tBQ2xELElBQUksSUFBSSxXQUFXO01BQ2pCLFdBQVc7TUFDWDtLQUNGO0tBQ0EsV0FBVyxNQUFNLFdBQVcsTUFBTTtJQUNwQztJQUNGLFlBQ0UsWUFBWSxTQUFTLElBQ3JCLE1BQ0Esc0JBQ0EsVUFDQTtJQUNGO0dBQ0YsT0FDRSxTQUFTLEtBQUssZUFDUixZQUFZLHdCQUNaLHFCQUNBLEdBQ0EsTUFBTSxNQUFNLENBQ2QsR0FDQSxZQUNBLGFBQWEsT0FBTyxLQUFLLGNBQ3ZCLFFBQVEsTUFDTixzRkFDRixLQUNFLFlBQVksb0JBQ1oscUJBQ0EsR0FDQSxLQUFLLGFBQ0wsTUFDRixHQUNBO0dBQ1YsSUFBSSxXQUFXO0dBQ2YsSUFBSSxLQUFLLE1BQU07R0FDZixLQUNFLHNCQUFzQixHQUN0QixLQUFLLHNCQUFzQixLQUFLLFNBQVMsU0FHekMsWUFBYSxLQUFLLFNBQVMsc0JBQ3pCLFVBQVUsVUFBVSxLQUNkLFlBQVksYUFBYSxXQUFXLE1BQU0sR0FDNUMseUJBQ0MsWUFBWSxxQkFBcUIsR0FBRyxNQUFNLEdBQzlDLElBQUksRUFBRTtHQUNYLEtBQ0UsSUFBSSxLQUFLLFNBQVMsV0FDakIsWUFBWSxZQUFZLE1BQU0sSUFBSTtHQUNyQyxJQUFJLEtBQUs7R0FDVCxTQUFTLEtBQUssZUFBZTtHQUM3QixLQUFLLE9BQU8sR0FBRyxPQUFPLEVBQUUsUUFBUSxRQUM5QixzQkFBdUIsRUFBRSxPQUN0QixXQUNDLGFBQWEsT0FBTyxzQkFDaEIsWUFDQyxRQUFRLE1BQU0sSUFDYixpQkFBaUIscUJBQXFCLE1BQU0sSUFBSSxNQUFNLElBQ3RELFFBQ0YsV0FDQSx3QkFDRSxvQkFBb0IsTUFDcEIsb0JBQW9CLE9BQ3BCLFFBQVEsTUFBTSxDQUNoQjtHQUNWLE9BQU8sYUFBYSxZQUFZO0VBQ2xDO0VBQ0EsU0FBUyxhQUFhLFVBQVU7R0FDOUIsSUFBSTtJQUNGLE9BQU8sU0FBUyxhQUFhLFVBQVUsQ0FBQztHQUMxQyxTQUFTLEdBQUc7SUFDVixPQUFPO0dBQ1Q7RUFDRjtFQUNBLFNBQVMsa0JBQWtCLFVBQVUsT0FBTyxPQUFPO0dBQ2pELEtBQUssSUFBSSxRQUFRLE9BQU8sT0FBTyxNQUFNLG1CQUFtQixHQUFHLFFBQ3pELFVBQVUsYUFBYSxtQkFBbUIsSUFDdkMsT0FBTztJQUNDO0lBQ1AsVUFBVSxTQUFTLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQztJQUNwQyxhQUNFLFVBQVUsUUFBUSxRQUFRLFVBQVUsV0FBVyxPQUFPLEtBQUs7SUFDN0QsWUFBWSxDQUFDO0lBQ0s7R0FDcEIsR0FDQSxvQkFDQyxRQUFRLE1BQU07R0FDbkIsT0FBTyxTQUFTLE9BQU8sYUFBYSxJQUFJLENBQUMsQ0FBQyxXQUFXLFdBQVcsR0FBRyxJQUFJO0VBQ3pFO0VBQ0EsU0FBUyx1QkFBdUIsU0FBUyxLQUFLO0dBQzVDLElBQUksZUFBZSxPQUFPLENBQUMsR0FBRyxXQUFXLG9CQUFvQixHQUMzRCxPQUFPLEVBQU8sSUFBSTtHQUNwQixPQUFPLFlBQVksUUFBUSxHQUFHLE1BQzFCLGFBQWEsY0FBYyxNQUM1QixhQUFhLG1CQUFtQixNQUNoQyxhQUFhLGlCQUFpQjtHQUNqQyxPQUFPLGdCQUFnQixRQUFRLEdBQUcsTUFDL0IsYUFBYSxvQkFBb0I7R0FDcEMsT0FBTyxZQUFZLFFBQVEsR0FBRyxLQUM1QixjQUFjLE9BQ2QsVUFBVSxPQUNWLFFBQVEsUUFDTixhQUFhLHlCQUF5QixNQUN2QyxhQUFhLHVCQUF1QjtHQUN2QyxhQUFhLFVBQVU7R0FDdkIsV0FBVyxRQUFRLGFBQWEsVUFBVTtHQUMxQyxRQUFRLFFBQVEsYUFBYSxjQUFjO0dBQzNDLGFBQWEsUUFBUSxhQUFhLG1CQUFtQjtHQUNyRCxXQUFXLFFBQVEsYUFBYSxpQkFBaUI7R0FDakQsUUFBUSxRQUFRLGFBQWEsb0JBQW9CO0dBQ2pELFNBQVMsUUFBUSxhQUFhLHlCQUF5QjtHQUN2RCxJQUFJLFNBQVMsT0FBTyxTQUFTLEtBQzNCLGFBQWEsdUJBQXVCO0dBQ3RDLGdCQUFnQixPQUFPLFdBQVcsTUFDN0IsYUFBYSxzQkFBc0IsT0F
15852DcEMsYUFBYSx3QkFDWixhQUFhLHNCQUFzQjtHQUN4QyxTQUFTLFdBQ1IsZ0JBQWdCLE9BQU8sV0FBVyxPQUFPLFdBQVcsTUFDakQsQ0FBQyxNQUFNLGFBQWEsc0JBQ25CLGFBQWEsb0JBQW9CLENBQUMsS0FDbEMsYUFBYSxvQkFBb0IsQ0FBQztHQUN2QyxPQUFPO0VBQ1Q7RUFDQSxTQUFTLHFCQUFxQixLQUFLLFdBQVcsbUJBQW1CO0dBQy9ELFFBQVEsV0FBUjtJQUNFLEtBQUssTUFDSCxPQUNFLFNBQVMsT0FDVCxTQUFTLE9BQ1QsWUFBWSxPQUNaLGFBQWEsT0FDYixlQUFlO0lBRW5CLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSyxTQUNILE9BQ0UsU0FBUyxPQUNULFlBQVksT0FDWixhQUFhLE9BQ2IsZUFBZTtJQUVuQixLQUFLLFlBQ0gsT0FBTyxVQUFVLE9BQU8sZUFBZTtJQUN6QyxLQUFLLFNBQ0gsT0FDRSxjQUFjLE9BQ2QsZUFBZSxPQUNmLFlBQVksT0FDWixZQUFZLE9BQ1osWUFBWSxPQUNaLFlBQVksT0FDWixhQUFhLE9BQ2IsZUFBZTtJQUVuQixLQUFLLFFBQ0gsT0FDRSxXQUFXLE9BQ1gsZUFBZSxPQUNmLGNBQWMsT0FDZCxXQUFXLE9BQ1gsV0FBVyxPQUNYLFlBQVksT0FDWixlQUFlLE9BQ2YsZUFBZSxPQUNmLFlBQVksT0FDWixhQUFhLE9BQ2IsZUFBZTtJQUVuQixLQUFLO0tBQ0gsSUFBSSxtQkFBbUI7S0FDdkIsT0FBTyxXQUFXLE9BQU8sV0FBVyxPQUFPLGVBQWU7SUFDNUQsS0FBSyxZQUNILE9BQU8sWUFBWTtJQUNyQixLQUFLLGFBQ0gsSUFBSSxDQUFDLG1CQUFtQixPQUFPLFdBQVc7R0FDOUM7R0FDQSxRQUFRLEtBQVI7SUFDRSxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUssTUFDSCxPQUNFLFNBQVMsYUFDVCxTQUFTLGFBQ1QsU0FBUyxhQUNULFNBQVMsYUFDVCxTQUFTLGFBQ1QsU0FBUztJQUViLEtBQUs7SUFDTCxLQUFLLE1BQ0gsT0FBTyxPQUFPLGVBQWUsUUFBUSxTQUFTO0lBQ2hELEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUssU0FDSCxPQUFPLGFBQWE7SUFDdEIsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUssTUFDSCxPQUFPLFFBQVE7SUFDakIsS0FBSyxRQUNILE9BQU8scUJBQXFCLFNBQVM7SUFDdkMsS0FBSyxRQUNILE9BQ0cscUJBQXFCLGdCQUFnQixhQUN0QyxTQUFTO0lBRWIsS0FBSyxRQUNILE9BQ0csc0JBQ0UsZ0JBQWdCLGFBQWEsV0FBVyxjQUMzQyxTQUFTO0dBRWY7R0FDQSxPQUFPLENBQUM7RUFDVjtFQUNBLFNBQVMsMEJBQTBCLEtBQUssY0FBYztHQUNwRCxRQUFRLEtBQVI7SUFDRSxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSyxNQUNILE9BQU8sYUFBYTtJQUN0QixLQUFLLFFBQ0gsT0FBTyxhQUFhLFdBQVcsYUFBYTtJQUM5QyxLQUFLLE1BQ0gsT0FBTyxhQUFhO0lBQ3RCLEtBQUs7SUFDTCxLQUFLLE1BQ0gsT0FBTyxhQUFhO0lBQ3RCLEtBQUssVUFDSCxPQUFPLGFBQWE7SUFDdEIsS0FBSyxLQUNILE9BQU8sYUFBYTtJQUN0QixLQUFLLFFBQ0gsT0FBTyxhQUFhO0dBQ3hCO0dBQ0EsT0FBTztFQUNUO0VBQ0EsU0FBUyxhQUFhLFFBQVEsU0FBUztHQUNyQyxPQUFPLFNBQVU7SUFDZixRQUFRLE9BQU8sS0FBZjtLQUNFLEtBQUs7S0FDTCxLQUFLO0tBQ0wsS0FBSyxJQUNILElBQUksT0FBTyxTQUFTLFNBQVMsT0FBTztJQUN4QztJQUNBLFNBQVMsT0FBTztHQUNsQjtHQUNBLE9BQU87RUFDVDtFQUNBLFNBQVMsbUJBQW1CLFVBQVUsY0FBYztHQUNsRCxlQUFlLGdCQUFnQjtHQUMvQixJQUFJLGFBQWEsYUFBYTtHQUM5QixnQkFBZ0IsYUFBYSxxQkFDM0IsVUFDQSxjQUFjLFdBQVcsS0FDekIsYUFBYSxpQkFDZixJQUNJLE9BQ0EsY0FDQSxPQUNBLDBCQUEwQixVQUFVLFlBQVk7R0FDcEQsZUFBZSxjQUFjO0dBQzdCLElBQUksQ0FBQyxjQUFjLE9BQU8sQ0FBQztHQUMzQixJQUFJLGNBQWMsYUFBYTtHQUMvQixlQUFlLE9BQU8sQ0FBQyxDQUFDLFVBQVUsSUFBSSxNQUFNLFdBQVcsTUFBTTtHQUM3RCxJQUFJLFFBQVEsZUFBZSxPQUFPLENBQUM7R0FDbkMsUUFBUSxnQkFBZ0IsQ0FBQztHQUN6QixJQUFJLFlBQVksZUFBZSxXQUN6QixhQUFhLGFBQWEsUUFBUSxXQUFXLElBQzdDLE1BQ0osc0JBQ0UsU0FBUyxnQkFBZ0IsU0FBUyxXQUM5QixrQkFBa0IsVUFBVSxjQUFjLElBQUksSUFDOUMsSUFDTixpQkFBaUIsTUFBTSxXQUFXO0dBQ3BDLGNBQ00sYUFBYSxJQUNmLFlBQVksZUFDVixTQUFTLGFBQ1IsY0FDQyxvR0FDSixRQUFRLE1BQ04sa0ZBQ0EsZ0JBQ0EsYUFDQSxZQUNBLG1CQUNGLEtBQ0EsUUFBUSxNQUNOLHFGQUNBLGdCQUNBLGFBQ0EsbUJBQ0Y7R0FDSixpQkFDSSxXQUFXLGFBQWEsUUFDMUIsU0FBUyxZQUNQLFNBQVMsWUFDUixhQUFhLFlBQ1osU0FBUyxnQkFBZ0IsYUFBYSxlQUN4QyxrQkFBa0IsVUFBVSxXQUFZO0lBQ3RDLFFBQVEsTUFDTixnRkFDQSxhQUNBLGNBQ0Y7R0FDRixDQUFDO0dBQ0wsT0FBTyxDQUFDO0VBQ1Y7RUFDQSxTQUFTLG9CQUFvQixXQUFXLFdBQVcsbUJBQW1CO0dBQ3BFLElBQUkscUJBQXFCLHFCQUFxQixTQUFTLFdBQVcsQ0FBQyxDQUFDLEdBQ2xFLE9BQU8sQ0FBQztHQUNWLG9CQUFvQixXQUFXO0dBQy9CLElBQUksUUFBUSxvQkFBb0IsT0FBTyxDQUFDO0dBQ3hDLFFBQVEscUJBQXFCLENBQUM7R0FDOUIsSUFBSSxZQUFZLG9CQUFvQixXQUNoQyxhQUFhLG1CQUFtQixTQUFTLElBQ3pDO0dBQ0osb0JBQ0UsU0FBUyxxQkFBcUIsU0FBUyxXQUNuQyxrQkFDRSxVQUNBLG1CQUNBLE1BQU0sa0JBQWtCLE1BQU0sRUFBRSxVQUFVLEtBQUssSUFBSSxJQUNyRCxJQUNBO0dBQ04sS0FBSyxLQUFLLFNBQVMsSUFDZixRQUFRLE1BQ04sd0ZBQ0EsV0FDQSxpQkFDRixJQUNBLFFBQVEsTUFDTixnTUFDQSxXQUNBLGlCQUNGO0dBQ0osT0FBTyxDQUFDO0VBQ1Y7RUFDQSxTQUFTLGVBQWUsTUFBTSxNQUFNO0dBQ2xDLElBQUksTUFBTTtJQUNSLElBQUksYUFBYSxLQUFLO0lBQ3RCLElBQ0UsY0FDQSxlQUFlLEtBQUssYUFDcEIsTUFBTSxXQUFXLFVBQ2pCO0tBQ0EsV0FBVyxZQU
15852FZO0tBQ3ZCO0lBQ0Y7R0FDRjtHQUNBLEtBQUssY0FBYztFQUNyQjtFQUNBLFNBQVMsU0FBUyxRQUFRO0dBQ3hCLE9BQU8sT0FBTyxRQUFRLGVBQWUsU0FBVSxHQUFHLFdBQVc7SUFDM0QsT0FBTyxVQUFVLFlBQVk7R0FDL0IsQ0FBQztFQUNIO0VBQ0EsU0FBUyxpQkFBaUIsT0FBTyxXQUFXLE9BQU87R0FDakQsSUFBSSxtQkFBbUIsTUFBTSxVQUFVLFFBQVEsSUFBSTtHQUNuRCxxQkFDRyxLQUFLLFVBQVUsUUFBUSxHQUFHLElBQ3RCLGlCQUFpQixlQUFlLFNBQVMsS0FDeEMsaUJBQWlCLGVBQ2pCLGlCQUFpQixhQUFhLENBQUMsR0FDakMsUUFBUSxNQUNOLG1EQUNBLFdBQ0EsU0FBUyxVQUFVLFFBQVEsV0FBVyxLQUFLLENBQUMsQ0FDOUMsS0FDQSw0QkFBNEIsS0FBSyxTQUFTLElBQ3ZDLGlCQUFpQixlQUFlLFNBQVMsS0FDeEMsaUJBQWlCLGVBQ2pCLGlCQUFpQixhQUFhLENBQUMsR0FDakMsUUFBUSxNQUNOLG1FQUNBLFdBQ0EsVUFBVSxPQUFPLENBQUMsQ0FBQyxDQUFDLFlBQVksSUFBSSxVQUFVLE1BQU0sQ0FBQyxDQUN2RCxLQUNBLENBQUMsa0NBQWtDLEtBQUssS0FBSyxLQUM1QyxrQkFBa0IsZUFBZSxLQUFLLEtBQ3JDLGtCQUFrQixXQUNsQixrQkFBa0IsU0FBUyxDQUFDLEdBQzlCLFFBQVEsTUFDTixnRkFDQSxXQUNBLE1BQU0sUUFBUSxtQ0FBbUMsRUFBRSxDQUNyRCxJQUNOLGFBQWEsT0FBTyxVQUNqQixNQUFNLEtBQUssSUFDUixzQkFDRSxvQkFBb0IsQ0FBQyxHQUN2QixRQUFRLE1BQ04sOERBQ0EsU0FDRixLQUNBLFNBQVMsS0FBSyxLQUNkLDJCQUNFLHlCQUF5QixDQUFDLEdBQzVCLFFBQVEsTUFDTixtRUFDQSxTQUNGO0dBQ1IsUUFBUSxTQUFTLGNBQWMsT0FBTyxTQUFTLE9BQU8sUUFDbEQsbUJBQ0UsTUFBTSxZQUFZLFdBQVcsRUFBRSxJQUMvQixZQUFZLFlBQ1QsTUFBTSxXQUFXLEtBQ2pCLE1BQU0sYUFBYSxLQUN4QixtQkFDRSxNQUFNLFlBQVksV0FBVyxLQUFLLElBQ2xDLGFBQWEsT0FBTyxTQUNsQixNQUFNLFNBQ04sZ0JBQWdCLElBQUksU0FBUyxJQUM3QixZQUFZLFlBQ1QsTUFBTSxXQUFXLFNBQ2pCLCtCQUErQixPQUFPLFNBQVMsR0FDL0MsTUFBTSxjQUFjLEtBQUssTUFBQSxDQUFPLEtBQUssS0FDdkMsTUFBTSxhQUFhLFFBQVE7RUFDdEM7RUFDQSxTQUFTLGtCQUFrQixNQUFNLFFBQVEsWUFBWTtHQUNuRCxJQUFJLFFBQVEsVUFBVSxhQUFhLE9BQU8sUUFDeEMsTUFBTSxNQUNKLHNKQUNGO0dBQ0YsVUFBVSxPQUFPLE9BQU8sTUFBTTtHQUM5QixPQUFPLEtBQUs7R0FDWixJQUFJLFFBQVEsWUFBWTtJQUN0QixJQUFJLFFBQVE7S0FDVixJQUFJLGtCQUFrQixDQUFDO0tBQ3ZCLElBQUksWUFDRztXQUFBLElBQUksT0FBTyxZQUNkLElBQUksV0FBVyxlQUFlLEdBQUcsS0FBSyxDQUFDLE9BQU8sZUFBZSxHQUFHLEdBQzlELEtBQ0UsSUFBSSxZQUFZLG9CQUFvQixRQUFRLENBQUMsR0FBRyxHQUFHLElBQUksR0FDdkQsSUFBSSxVQUFVLFFBQ2QsS0FFQSxnQkFBZ0IsVUFBVSxNQUFNO0tBQUE7S0FDeEMsS0FBSyxJQUFJLFFBQVEsUUFDZixJQUNFLE9BQU8sZUFBZSxJQUFJLE1BQ3pCLENBQUMsY0FBYyxXQUFXLFVBQVUsT0FBTyxRQUU1QyxLQUNFLE1BQU0sb0JBQW9CLFNBQVMsQ0FBQyxJQUFJLEdBQUcsWUFBWSxHQUN2RCxZQUFZLElBQUksUUFDaEIsYUFFQSxnQkFBZ0IsSUFBSSxjQUFjO0tBQ3hDLE9BQU8sQ0FBQztLQUNSLEtBQUssSUFBSSxnQkFBZ0IsUUFDdkIsS0FDRSxNQUFNLG9CQUFvQixpQkFBaUIsQ0FBQyxZQUFZLEdBQ3RELFlBQVksR0FDZCxZQUFZLElBQUksUUFDaEIsYUFFQSxLQUFLLElBQUksY0FBYztLQUMzQixlQUFlLENBQUM7S0FDaEIsS0FBSyxJQUFJLFNBQVMsaUJBQ2hCLElBQ0ksTUFBTSxnQkFBZ0IsU0FDdkIsWUFBWSxLQUFLLFdBQ2hCLFFBQVEsY0FDTixJQUFJLE1BQU0sTUFBTSxXQUFZLENBQUMsYUFBYSxLQUM5QztNQUNBLGFBQWEsS0FBSyxDQUFDO01BQ25CLElBQUk7TUFDSixJQUFJLFFBQVEsT0FBTztNQUNuQixFQUFFLE1BQU0sS0FDTixHQUNBLHVQQUNBLFFBQVEsU0FBUyxjQUFjLE9BQU8sU0FBUyxPQUFPLFFBQ2xELGFBQ0EsWUFDSixLQUNBLFNBQ0Y7S0FDRjtJQUNKO0lBQ0EsS0FBSyxJQUFJLGFBQWEsWUFDcEIsQ0FBQyxXQUFXLGVBQWUsU0FBUyxLQUNqQyxRQUFRLFVBQVUsT0FBTyxlQUFlLFNBQVMsTUFDakQsTUFBTSxVQUFVLFFBQVEsSUFBSSxJQUN6QixLQUFLLFlBQVksV0FBVyxFQUFFLElBQzlCLFlBQVksWUFDVCxLQUFLLFdBQVcsS0FDaEIsS0FBSyxhQUFhLElBQ3hCLGdDQU
15852FnQyxDQUFDO0lBQ3RDLEtBQUssSUFBSSxjQUFjLFFBQ3JCLFFBQVMsT0FBTyxhQUNkLE9BQU8sZUFBZSxVQUFVLEtBQzlCLFdBQVcsZ0JBQWdCLFVBQzFCLGlCQUFpQixNQUFNLFlBQVksS0FBSyxHQUN4QyxnQ0FBZ0MsQ0FBQztHQUMxQyxPQUNFLEtBQUssbUJBQW1CLFFBQ3RCLE9BQU8sZUFBZSxlQUFlLEtBQ25DLGlCQUFpQixNQUFNLGlCQUFpQixPQUFPLGdCQUFnQjtFQUN2RTtFQUNBLFNBQVMsZ0JBQWdCLFNBQVM7R0FDaEMsSUFBSSxPQUFPLFFBQVEsUUFBUSxHQUFHLEdBQUcsT0FBTyxDQUFDO0dBQ3pDLFFBQVEsU0FBUjtJQUNFLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLLGlCQUNILE9BQU8sQ0FBQztJQUNWLFNBQ0UsT0FBTyxDQUFDO0dBQ1o7RUFDRjtFQUNBLFNBQVMsa0JBQWtCLE1BQU07R0FDL0IsT0FBTyxRQUFRLElBQUksSUFBSSxLQUFLO0VBQzlCO0VBQ0EsU0FBUyxtQkFBbUIsU0FBUyxNQUFNO0dBQ3pDLElBQ0UsZUFBZSxLQUFLLG9CQUFvQixJQUFJLEtBQzVDLG1CQUFtQixPQUVuQixPQUFPLENBQUM7R0FDVixJQUFJLGFBQWEsS0FBSyxJQUFJLEdBQUc7SUFDM0IsVUFBVSxVQUFVLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZO0lBQzlDLFVBQVUsZUFBZSxlQUFlLE9BQU8sSUFBSSxVQUFVO0lBQzdELElBQUksUUFBUSxTQUNWLE9BQ0UsUUFBUSxNQUNOLGlHQUNBLElBQ0YsR0FDQyxtQkFBbUIsUUFBUSxDQUFDO0lBRWpDLElBQUksU0FBUyxTQUNYLE9BQ0UsUUFBUSxNQUNOLG1EQUNBLE1BQ0EsT0FDRixHQUNDLG1CQUFtQixRQUFRLENBQUM7R0FFbkM7R0FDQSxJQUFJLFFBQVEsS0FBSyxJQUFJLEdBQUc7SUFDdEIsVUFBVSxLQUFLLFlBQVk7SUFDM0IsVUFBVSxlQUFlLGVBQWUsT0FBTyxJQUFJLFVBQVU7SUFDN0QsSUFBSSxRQUFRLFNBQVMsT0FBUSxtQkFBbUIsUUFBUSxDQUFDLEdBQUksQ0FBQztJQUM5RCxTQUFTLFlBQ04sUUFBUSxNQUNQLG1EQUNBLE1BQ0EsT0FDRixHQUNDLG1CQUFtQixRQUFRLENBQUM7R0FDakM7R0FDQSxPQUFPLENBQUM7RUFDVjtFQUNBLFNBQVMscUJBQXFCLE1BQU0sT0FBTztHQUN6QyxJQUFJLGVBQWUsQ0FBQyxHQUNsQjtHQUNGLEtBQUssT0FBTyxPQUNWLG1CQUFtQixNQUFNLEdBQUcsS0FBSyxhQUFhLEtBQUssR0FBRztHQUN4RCxRQUFRLGFBQ0wsSUFBSSxTQUFVLE1BQU07SUFDbkIsT0FBTyxNQUFNLE9BQU87R0FDdEIsQ0FBQyxDQUFDLENBQ0QsS0FBSyxJQUFJO0dBQ1osTUFBTSxhQUFhLFNBQ2YsUUFBUSxNQUNOLGdHQUNBLE9BQ0EsSUFDRixJQUNBLElBQUksYUFBYSxVQUNqQixRQUFRLE1BQ04saUdBQ0EsT0FDQSxJQUNGO0VBQ047RUFDQSxTQUFTLGlCQUFpQixTQUFTLE1BQU0sT0FBTyxlQUFlO0dBQzdELElBQUksZUFBZSxLQUFLLGtCQUFrQixJQUFJLEtBQUssaUJBQWlCLE9BQ2xFLE9BQU8sQ0FBQztHQUNWLElBQUksaUJBQWlCLEtBQUssWUFBWTtHQUN0QyxJQUFJLGdCQUFnQixrQkFBa0IsaUJBQWlCLGdCQUNyRCxPQUNFLFFBQVEsTUFDTiw4S0FDRixHQUNDLGlCQUFpQixRQUFRLENBQUM7R0FFL0IsSUFDRSxlQUFlLE9BQU8sVUFDcEIsV0FBVyxXQUFXLGFBQWEsUUFDbEMsWUFBWSxXQUFXLGlCQUFpQixRQUN4QyxhQU
15852FhLFdBQVcsaUJBQWlCLE9BRTVDLE9BQU8sQ0FBQztHQUNWLElBQUksUUFBUSxlQUFlO0lBQ3pCLFVBQVUsY0FBYztJQUN4QixJQUFJLGNBQWMsNkJBQTZCLGVBQWUsSUFBSSxHQUNoRSxPQUFPLENBQUM7SUFDVixnQkFBZ0IsUUFBUSxlQUFlLGNBQWMsSUFDakQsUUFBUSxrQkFDUjtJQUNKLElBQUksUUFBUSxlQUNWLE9BQ0UsUUFBUSxNQUNOLDJEQUNBLE1BQ0EsYUFDRixHQUNDLGlCQUFpQixRQUFRLENBQUM7SUFFL0IsSUFBSSxpQkFBaUIsS0FBSyxJQUFJLEdBQzVCLE9BQ0UsUUFBUSxNQUNOLDREQUNBLElBQ0YsR0FDQyxpQkFBaUIsUUFBUSxDQUFDO0dBRWpDLE9BQU8sSUFBSSxpQkFBaUIsS0FBSyxJQUFJLEdBQ25DLE9BQ0UseUJBQXlCLEtBQUssSUFBSSxLQUNoQyxRQUFRLE1BQ04saUhBQ0EsSUFDRixHQUNELGlCQUFpQixRQUFRLENBQUM7R0FFL0IsSUFBSSxNQUFNLEtBQUssSUFBSSxLQUFLLFdBQVcsS0FBSyxJQUFJLEdBQUcsT0FBTyxDQUFDO0dBQ3ZELElBQUksZ0JBQWdCLGdCQUNsQixPQUNFLFFBQVEsTUFDTixrSUFDRixHQUNDLGlCQUFpQixRQUFRLENBQUM7R0FFL0IsSUFBSSxXQUFXLGdCQUNiLE9BQ0UsUUFBUSxNQUNOLHVHQUNGLEdBQ0MsaUJBQWlCLFFBQVEsQ0FBQztHQUUvQixJQUNFLFNBQVMsa0JBQ1QsU0FBUyxTQUNULEtBQUssTUFBTSxTQUNYLGFBQWEsT0FBTyxPQUVwQixPQUNFLFFBQVEsTUFDTixpR0FDQSxPQUFPLEtBQ1QsR0FDQyxpQkFBaUIsUUFBUSxDQUFDO0dBRS9CLElBQUksYUFBYSxPQUFPLFNBQVMsTUFBTSxLQUFLLEdBQzFDLE9BQ0UsUUFBUSxNQUNOLHlGQUNBLElBQ0YsR0FDQyxpQkFBaUIsUUFBUSxDQUFDO0dBRS9CLElBQUksc0JBQXNCLGVBQWUsY0FBYyxHQUVqRDtRQUFBLGlCQUFpQixzQkFBc0IsaUJBQ3pDLG1CQUFtQixNQUVuQixPQUNFLFFBQVEsTUFDTixpREFDQSxNQUNBLGNBQ0YsR0FDQyxpQkFBaUIsUUFBUSxDQUFDO0dBQUEsT0FFMUIsSUFBSSxTQUFTLGdCQUNsQixPQUNFLFFBQVEsTUFDTixnUUFDQSxNQUNBLGNBQ0YsR0FDQyxpQkFBaUIsUUFBUSxDQUFDO0dBRS9CLFFBQVEsTUFBUjtJQUNFLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSyxPQUNILE9BQU8sQ0FBQztJQUNWLEtBQUs7SUFDTCxLQUFLLGVBQ0gsT0FBTyxDQUFDO0dBQ1o7R0FDQSxRQUFRLE9BQU8sT0FBZjtJQUNFLEtBQUssV0FDSCxRQUFRLE1BQVI7S0FDRSxLQUFLO0tBQ0wsS0FBSztLQUNMLEtBQUs7S0FDTCxLQUFLO0tBQ0wsS0FBSztLQUNMLEtBQUs7S0FDTCxLQUFLO0tBQ0wsS0FBSztLQUNMLEtBQUs7S0FDTCxLQUFLO0tBQ0wsS0FBSztLQUNMLEtBQUs7S0FDTCxLQUFLO0tBQ0wsS0FBSztLQUNMLEtBQUs7S0FDTCxLQUFLO0tBQ0wsS0FBSztLQUNMLEtBQUs7S0FDTCxLQUFLO0tBQ0wsS0FBSztLQUNMLEtBQUs7S0FDTCxLQUFLO0tBQ0wsS0FBSztLQUNMLEtBQUs7S0FDTCxLQUFLO0tBQ0wsS0FBSztLQUNMLEtBQUs7S0FDTCxLQUFLO0tBQ0wsS0FBSztLQUNMLEtBQUs7S0FDTCxLQUFLO0tBQ0wsS0FBSztLQUNMLEtBQUs7S0FDTCxLQUFLO0tBQ0wsS0FBSztLQUNMLEtBQUs7S0FDTCxLQUFLO0tBQ0wsS0FBSztLQUNMLEtBQUssU0FDSCxPQUFPLENBQUM7S0FDVjtNQUNFLGlCQUFpQixLQUFLLFlBQVksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDO01BQzlDLElBQUksWUFBWSxrQkFBa0IsWUFBWSxnQkFDNUMsT0FBTyxDQUFDO01BQ1YsUUFDSSxRQUFRLE1BQ04scUpBQ0EsT0FDQSxNQUNBLE1BQ0EsT0FDQSxJQUNGLElBQ0EsUUFBUSxNQUNOLDRRQUNBLE9BQ0EsTUFDQSxNQUNBLE9BQ0EsTUFDQSxNQUNBLElBQ0Y7TUFDSixPQUFRLGlCQUFpQixRQUFRLENBQUM7SUFDdEM7SUFDRixLQUFLO0lBQ0wsS0FBSyxVQUNILE9BQVEsaUJBQWlCLFFBQVEsQ0FBQyxHQUFJLENBQUM7SUFDekMsS0FBSyxVQUNILElBQUksWUFBWSxTQUFTLFdBQVcsT0FBTztLQUN6QyxRQUFRLE1BQVI7TUFDRSxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLLFNBQ0g7TUFDRixTQUNFLE9BQU8sQ0FBQztLQUNaO0tBQ0EsUUFBUSxNQUNOLHFGQUNBLE9BQ0EsTUFDQSxZQUFZLFFBQ1IscURBQ0EsdUZBQ0osTUFDQSxLQUNGO0tBQ0EsaUJBQWlCLFFBQVEsQ0FBQztJQUM1QjtHQUNKO0dBQ0EsT0FBTyxDQUFDO0VBQ1Y7RUFDQSxTQUFTLHNCQUFzQixNQUFNLE9BQU8sZUFBZTtHQUN6RCxJQUFJLGVBQWUsQ0FBQyxHQUNsQjtHQUNGLEtBQUssT0FBTyxPQUNWLGlCQUFpQixNQUFNLEtBQUssTUFBTSxNQUFNLGFBQWEsS0FDbkQsYUFBYSxLQUFLLEdBQUc7R0FDekIsUUFBUSxhQUNMLElBQUksU0FBVSxNQUFNO0lBQ25CLE9BQU8sTUFBTSxPQUFPO0dBQ3RCLENBQUMsQ0FBQyxDQUNELEtBQUssSUFBSTtHQUNaLE1BQU0sYUFBYSxTQUNmLFFBQVEsTUFDTixpTUFDQSxPQUNBLElBQ0YsSUFDQSxJQUFJLGFBQWEsVUFDakIsUUFBUSxNQUNOLHVNQUNBLE9BQ0EsSUFDRjtFQUNOO0VBQ0EsU0FBUyxZQUFZLEtBQUs7R0FDeEIsT0FBTyxxQkFBcUIsS0FBSyxLQUFLLEdBQUcsSUFDckMsZ0dBQ0E7RUFDTjtFQUNBLFNBQVMsU0FBUyxDQUFDO0VBQ25CLFNBQVMsZUFBZSxhQUFhO0dBQ25DLGNBQWMsWUFBWSxVQUFVLFlBQVksY0FBYztHQUM5RCxZQUFZLDRCQUNULGNBQWMsWUFBWTtHQUM3QixPQUFPLE1BQU0sWUFBWSxXQUFXLFlBQVksYUFBYTtFQUMvRDtFQUNBLFNBQVMscUJBQXFCLFF
15852BQVE7R0FDcEMsSUFBSSxtQkFBbUIsb0JBQW9CLE1BQU07R0FDakQsSUFBSSxxQkFBcUIsU0FBUyxpQkFBaUIsWUFBWTtJQUM3RCxJQUFJLFFBQVEsT0FBTyxxQkFBcUI7SUFDeEMsR0FBRyxRQUNDLFNBQVMsaUJBQWlCLFdBQVksaUJBQWlCLE1BRHhEO0tBR0QsS0FBSztNQUNILFlBQ0UsUUFDQSxNQUFNLE9BQ04sTUFBTSxjQUNOLE1BQU0sY0FDTixNQUFNLFNBQ04sTUFBTSxnQkFDTixNQUFNLE1BQ04sTUFBTSxJQUNSO01BQ0EsbUJBQW1CLE1BQU07TUFDekIsSUFBSSxZQUFZLE1BQU0sUUFBUSxRQUFRLGtCQUFrQjtPQUN0RCxLQUFLLFFBQVEsUUFBUSxNQUFNLGFBQWMsUUFBUSxNQUFNO09BQ3ZELDZCQUE2QixrQkFBa0IsTUFBTTtPQUNyRCxRQUFRLE1BQU0saUJBQ1osa0JBQ0UsK0NBQ0UsS0FBSyxnQkFDUCxJQUNBLHFCQUNKO09BQ0EsS0FDRSxtQkFBbUIsR0FDbkIsbUJBQW1CLE1BQU0sUUFDekIsb0JBQ0E7UUFDQSxJQUFJLFlBQVksTUFBTTtRQUN0QixJQUFJLGNBQWMsVUFBVSxVQUFVLFNBQVMsT0FBTyxNQUFNO1NBQzFELElBQUksYUFBYSxVQUFVLHFCQUFxQjtTQUNoRCxJQUFJLENBQUMsWUFDSCxNQUFNLE1BQ0osK0ZBQ0Y7U0FDRixZQUNFLFdBQ0EsV0FBVyxPQUNYLFdBQVcsY0FDWCxXQUFXLGNBQ1gsV0FBVyxTQUNYLFdBQVcsZ0JBQ1gsV0FBVyxNQUNYLFdBQVcsSUFDYjtRQUNGO09BQ0Y7T0FDQSxLQUNFLG1CQUFtQixHQUNuQixtQkFBbUIsTUFBTSxRQUN6QixvQkFFQSxZQUFhLE1BQU0sbUJBQ2pCLFVBQVUsU0FBUyxPQUFPLFFBQ3hCLHFCQUFxQixTQUFTO01BQ3RDO01BQ0EsTUFBTTtLQUNSLEtBQUs7TUFDSCxlQUFlLFFBQVEsTUFBTSxPQUFPLE1BQU0sWUFBWTtNQUN0RCxNQUFNO0tBQ1IsS0FBSyxVQUNILG1CQUFvQixNQUFNLE9BQ3hCLFFBQVEsb0JBQ04sY0FBYyxRQUFRLENBQUMsQ0FBQyxNQUFNLFVBQVUsa0JBQWtCLENBQUMsQ0FBQztJQUNwRTtHQUNGO0VBQ0Y7RUFDQSxTQUFTLGlCQUFpQixJQUFJLEdBQUcsR0FBRztHQUNsQyxJQUFJLHNCQUFzQixPQUFPLEdBQUcsR0FBRyxDQUFDO0dBQ3hDLHVCQUF1QixDQUFDO0dBQ3hCLElBQUk7SUFFRixPQUQrQixHQUFHLENBQ0o7R0FDaEMsVUFBVTtJQUNSLElBQ0ksdUJBQXVCLENBQUMsR0FDMUIsU0FBUyxpQkFBaUIsU0FBUyxjQUdoQztTQUFBLGdCQUFnQixHQUNqQixrQkFDSSxJQUFJLGVBQ0wsS0FBSyxjQUNMLGVBQWUsZ0JBQWdCLE1BQ2hDLHFCQUFxQixDQUFDLEdBQ3RCLEtBRUYsS0FBSyxJQUFJLEdBQUcsSUFBSSxHQUFHLFFBQVEsS0FBSyxxQkFBcUIsR0FBRyxFQUFFO0lBQUE7R0FDaEU7RUFDRjtFQUNBLFNBQVMsWUFBWSxNQUFNLGtCQUFrQjtHQUMzQyxJQUFJLFlBQVksS0FBSztHQUNyQixJQUFJLFNBQVMsV0FBVyxPQUFPO0dBQy9CLElBQUksUUFBUSxVQUFVLHFCQUFxQjtHQUMzQyxJQUFJLFNBQVMsT0FBTyxPQUFPO0dBQzNCLFlBQVksTUFBTTtHQUNsQixHQUFHLFFBQVEsa0JBQVI7SUFDRCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztLQUNILENBQUMsUUFBUSxDQUFDLE1BQU0sY0FDWixPQUFPLEtBQUssTUFDYixRQUFRLEVBQ1AsYUFBYSxRQUNiLFlBQVksUUFDWixhQUFhLFFBQ2IsZUFBZTtLQUVuQixPQUFPLENBQUM7S0FDUixNQUFNO0lBQ1IsU0FDRSxPQUFPLENBQUM7R0FDWjtHQUNBLElBQUksTUFBTSxPQUFPO0dBQ2pCLElBQUksYUFBYSxlQUFlLE9BQU8sV0FDckMsTUFBTSxNQUNKLGVBQ0UsbUJBQ0EsMERBQ0EsT0FBTyxZQUNQLFNBQ0o7R0FDRixPQUFPO0VBQ1Q7RUFDQSxTQUFTLFVBQVU7R0FDakIsSUFBSSxjQUFjLE9BQU87R0FDekIsSUFBSSxPQUNGLGFBQWEsV0FDYixjQUFjLFdBQVcsUUFDekIsS0FDQSxXQUFXLFdBQVcsT0FBTyxLQUFLLFFBQVEsS0FBSyxhQUMvQyxZQUFZLFNBQVM7R0FDdkIsS0FDRSxRQUFRLEdBQ1IsUUFBUSxlQUFlLFdBQVcsV0FBVyxTQUFTLFFBQ3REO0dBRUYsSUFBSSxTQUFTLGNBQWM7R0FDM0IsS0FDRSxNQUFNLEdBQ04sT0FBTyxVQUNQLFdBQVcsY0FBYyxTQUFTLFNBQVMsWUFBWSxNQUN2RDtHQUVGLE9BQVEsZUFBZSxTQUFTLE1BQU0sT0FBTyxJQUFJLE1BQU0sSUFBSSxNQUFNLEtBQUssQ0FBQztFQUN6RTtFQUNBLFNBQVMsaUJBQWlCLGFBQWE7R0FDckMsSUFBSSxVQUFVLFlBQVk7R0FDMUIsY0FBYyxlQUNSLGNBQWMsWUFBWSxVQUM1QixNQUFNLGVBQWUsT0FBTyxZQUFZLGNBQWMsT0FDckQsY0FBYztHQUNuQixPQUFPLGdCQUFnQixjQUFjO0dBQ3JDLE9BQU8sTUFBTSxlQUFlLE9BQU8sY0FBYyxjQUFjO0VBQ2pFO0VBQ0EsU0FBUywwQkFBMEI7R0FDakMsT0FBTyxDQUFDO0VBQ1Y7RUFDQSxTQUFTLDJCQUEyQjtHQUNsQyxPQUFPLENBQUM7RUFDVjtFQUNBLFNBQVMscUJBQXFCLFdBQVc7R0FDdkMsU0FBUyxtQkFDUCxXQUNBLGdCQUNBLFlBQ0EsYUFDQSxtQkFDQTtJQUNBLEtBQUssYUFBYTtJQUNsQixLQUFLLGNBQWM7SUFDbkIsS0FBSyxPQUFPO0lBQ1osS0FBSyxjQUFjO0lBQ25CLEtBQUssU0FBUztJQUNkLEtBQUssZ0JBQWdCO0lBQ3JCLEtBQUssSUFBSSxZQUFZLFdBQ25CLFVBQVUsZUFBZSxRQUFRLE1BQzdCLFlBQVksVUFBVSxXQUN2QixLQUFLLFlBQVksWUFDZCxVQUFVLFdBQVcsSUFDckIsWUFBWTtJQUNwQixLQUFLLHNCQUNILFFBQVEsWUFBWSxtQkFDaEIsWUFBWSxtQkFDWixDQUFDLE1BQU0sWUFBWSxlQUVyQiwwQkFDQTtJQUNKLEtBQUssdUJBQXVCO0lBQzVCLE9BQU87R0FDVDtHQUNBLE9BQU8sbUJBQW1CLFdBQVc7SUFDbkMsZ0JBQWdCLFdBQVk7S0FDMUIsS0FBSyxtQkFBbUIsQ0FBQztLQUN6QixJQUFJLFFBQVEsS0FBSztLQUNqQixVQUNHLE1BQU0saUJBQ0gsTUFBTSxlQUFlLElBQ3JCLGNBQWMsT0FBTyxNQUFNLGdCQUMxQixNQUFNLGNBQWMsQ0FBQyxJQUN6QixLQUFLLHFCQUFxQjtJQUMvQjtJQUNBLGlCQUFpQixXQUFZO0tBQzNCLElBQUksUUFBUSxLQUFLO0tBQ2pCLFVBQ0csTUFBTSxrQkFDSCxNQUFNLGdCQUFnQixJQUN0QixjQUFjLE9BQU8sTUFBTSxpQkFDMUIsTUFBTSxlQUFlLENBQUMsSUFDMUIsS0FBSyx1QkFBdUI7SUFDakM7SUFDQSxTQUFTLFdBQVksQ0FBQztJQUN0QixjQUFjO0dBQ2hCLENBQUM7R0FDRCxPQUFPO0VBQ1Q7RUFDQSxTQUFTLG9CQUFvQixRQUFRO0dBQ25DLElBQUksY0FBYyxLQUFLO0dBQ3ZCLE9BQU8sWUFBWSxtQkFDZixZQUFZLGlCQUFpQixN
15852QUFNLEtBQ2xDLFNBQVMsa0JBQWtCLFdBQzFCLENBQUMsQ0FBQyxZQUFZLFVBQ2QsQ0FBQztFQUNUO0VBQ0EsU0FBUyx3QkFBd0I7R0FDL0IsT0FBTztFQUNUO0VBQ0EsU0FBUyx5QkFBeUIsY0FBYyxhQUFhO0dBQzNELFFBQVEsY0FBUjtJQUNFLEtBQUssU0FDSCxPQUFPLE9BQU8sYUFBYSxRQUFRLFlBQVksT0FBTztJQUN4RCxLQUFLLFdBQ0gsT0FBTyxZQUFZLFlBQVk7SUFDakMsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLLFlBQ0gsT0FBTyxDQUFDO0lBQ1YsU0FDRSxPQUFPLENBQUM7R0FDWjtFQUNGO0VBQ0EsU0FBUyx1QkFBdUIsYUFBYTtHQUMzQyxjQUFjLFlBQVk7R0FDMUIsT0FBTyxhQUFhLE9BQU8sZUFBZSxVQUFVLGNBQ2hELFlBQVksT0FDWjtFQUNOO0VBQ0EsU0FBUywwQkFBMEIsY0FBYyxhQUFhO0dBQzVELFFBQVEsY0FBUjtJQUNFLEtBQUssa0JBQ0gsT0FBTyx1QkFBdUIsV0FBVztJQUMzQyxLQUFLO0tBQ0gsSUFBSSxZQUFZLFVBQVUsZUFBZSxPQUFPO0tBQ2hELG1CQUFtQixDQUFDO0tBQ3BCLE9BQU87SUFDVCxLQUFLLGFBQ0gsT0FDRyxlQUFlLFlBQVksTUFDNUIsaUJBQWlCLGlCQUFpQixtQkFDOUIsT0FDQTtJQUVSLFNBQ0UsT0FBTztHQUNYO0VBQ0Y7RUFDQSxTQUFTLDRCQUE0QixjQUFjLGFBQWE7R0FDOUQsSUFBSSxhQUNGLE9BQU8scUJBQXFCLGdCQUN6QixDQUFDLDBCQUNBLHlCQUF5QixjQUFjLFdBQVcsS0FDaEQsZUFBZSxRQUFRLEdBQ3hCLGVBQWUsWUFBWSxPQUFPLE1BQ2xDLGNBQWMsQ0FBQyxHQUNoQixnQkFDQTtHQUNOLFFBQVEsY0FBUjtJQUNFLEtBQUssU0FDSCxPQUFPO0lBQ1QsS0FBSztLQUNILElBQ0UsRUFDRSxZQUFZLFdBQ1osWUFBWSxVQUNaLFlBQVksWUFFYixZQUFZLFdBQVcsWUFBWSxRQUNwQztNQUNBLElBQUksWUFBWSxRQUFRLElBQUksWUFBWSxLQUFLLFFBQzNDLE9BQU8sWUFBWTtNQUNyQixJQUFJLFlBQVksT0FDZCxPQUFPLE9BQU8sYUFBYSxZQUFZLEtBQUs7S0FDaEQ7S0FDQSxPQUFPO0lBQ1QsS0FBSyxrQkFDSCxPQUFPLDhCQUE4QixTQUFTLFlBQVksU0FDdEQsT0FDQSxZQUFZO0lBQ2xCLFNBQ0UsT0FBTztHQUNYO0VBQ0Y7RUFDQSxTQUFTLG1CQUFtQixNQUFNO0dBQ2hDLElBQUksV0FBVyxRQUFRLEtBQUssWUFBWSxLQUFLLFNBQVMsWUFBWTtHQUNsRSxPQUFPLFlBQVksV0FDZixDQUFDLENBQUMsb0JBQW9CLEtBQUssUUFDM0IsZUFBZSxXQUNiLENBQUMsSUFDRCxDQUFDO0VBQ1Q7RUFDQSxTQUFTLGlCQUFpQixpQkFBaUI7R0FDekMsSUFBSSxDQUFDLFdBQVcsT0FBTyxDQUFDO0dBQ3hCLGtCQUFrQixPQUFPO0dBQ3pCLElBQUksY0FBYyxtQkFBbUI7R0FDckMsZ0JBQ0ksY0FBYyxTQUFTLGNBQWMsS0FBSyxHQUM1QyxZQUFZLGFBQWEsaUJBQWlCLFNBQVMsR0FDbEQsY0FBYyxlQUFlLE9BQU8sWUFBWTtHQUNuRCxPQUFPO0VBQ1Q7RUFDQSxTQUFTLCtCQUNQLGVBQ0EsTUFDQSxhQUNBLFFBQ0E7R0FDQSxnQkFDSSxlQUNFLGFBQWEsS0FBSyxNQUFNLElBQ3ZCLGVBQWUsQ0FBQyxNQUFNLElBQ3hCLGdCQUFnQjtHQUNyQixPQUFPLDRCQUE0QixNQUFNLFVBQVU7R0FDbkQsSUFBSSxLQUFLLFdBQ0wsY0FBYyxJQUFJLGVBQ2xCLFlBQ0EsVUFDQSxNQUNBLGFBQ0EsTUFDRixHQUNBLGNBQWMsS0FBSztJQUFFLE9BQU87SUFBYSxXQUFXO0dBQUssQ0FBQztFQUM5RDtFQUNBLFNBQVMsZ0JBQWdCLGVBQWU7R0FDdEMscUJBQXFCLGVBQWUsQ0FBQztFQUN2QztFQUNBLFNBQVMsc0JBQXNCLFlBQVk7R0FFekMsSUFBSSxxQkFEYSxvQkFBb0IsVUFDSCxDQUFDLEdBQUcsT0FBTztFQUMvQztFQUNBLFNBQVMsNEJBQTRCLGNBQWMsWUFBWTtHQUM3RCxJQUFJLGFBQWEsY0FBYyxPQUFPO0VBQ3hDO0VBQ0EsU0FBUyw2QkFBNkI7R0FDcEMsb0JBQ0csZ0JBQWdCLFlBQVksb0JBQW9CLG9CQUFvQixHQUNwRSxzQkFBc0Isa0JBQWtCO0VBQzdDO0VBQ0EsU0FBUyxxQkFBcUIsYUFBYTtHQUN6QyxJQUNFLFlBQVksWUFBWSxnQkFDeEIsc0JBQXNCLG1CQUFtQixHQUN6QztJQUNBLElBQUksZ0JBQWdCLENBQUM7SUFDckIsK0JBQ0UsZUFDQSxxQkFDQSxhQUNBLGVBQWUsV0FBVyxDQUM1QjtJQUNBLGlCQUFpQixpQkFBaUIsYUFBYTtHQUNqRDtFQUNGO0VBQ0EsU0FBUyxrQ0FDUCxjQUNBLFFBQ0EsWUFDQTtHQUNBLGNBQWMsZ0JBQ1QsMkJBQTJCLEdBQzNCLGtCQUFrQixRQUNsQixzQkFBc0IsWUFDdkIsZ0JBQWdCLFlBQVksb0JBQW9CLG9CQUFvQixLQUNwRSxlQUFlLGdCQUFnQiwyQkFBMkI7RUFDaEU7RUFDQSxTQUFTLG1DQUFtQyxjQUFjO0dBQ3hELElBQ0Usc0JBQXNCLGdCQUN0QixZQUFZLGdCQUNaLGNBQWMsY0FFZCxPQUFPLHNCQUFzQixtQkFBbUI7RUFDcEQ7RUFDQSxTQUFTLDJCQUEyQixjQUFjLFlBQVk7R0FDNUQsSUFBSSxZQUFZLGNBQWMsT0FBTyxzQkFBc0IsVUFBVTtFQUN2RTtFQUNBLFNBQVMsbUNBQW1DLGNBQWMsWUFBWTtHQUNwRSxJQUFJLFlBQVksZ0JBQWdCLGFBQWEsY0FDM0MsT0FBTyxzQkFBc0IsVUFBVTtFQUMzQztFQUNBLFNBQVMsR0FBRyxHQUFHLEdBQUc7R0FDaEIsT0FBUSxNQUFNLE1BQU0sTUFBTSxLQUFLLElBQUksTUFBTSxJQUFJLE1BQVEsTUFBTSxLQUFLLE1BQU07RUFDeEU7RUFDQSxTQUFTLGFBQWEsTUFBTSxNQUFNO0dBQ2hDLElBQUksU0FBUyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUM7R0FDbEMsSUFDRSxhQUFhLE9BQU8sUUFDcEIsU0FBUyxRQUNULGFBQWEsT0FBTyxRQUNwQixTQUFTLE1BRVQsT0FBTyxDQUFDO0dBQ1YsSUFBSSxRQUFRLE9BQU8sS0FBSyxJQUFJLEdBQzFCLFFBQVEsT0FBTyxLQUFLLElBQUk7R0FDMUIsSUFBSSxNQUFNLFdBQVcsTUFBTSxRQUFRLE9BQU8sQ0FBQztHQUMzQyxLQUFLLFFBQVEsR0FBRyxRQUFRLE1BQU0sUUFBUSxTQUFTO0lBQzdDLElBQUksYUFBYSxNQUFNO0lBQ3ZCLElBQ0UsQ0FBQyxlQUFlLEtBQUssTUFBTSxVQUFVLEtBQ3JDLENBQUMsU0FBUyxLQUFLLGFBQWEsS0FBSyxXQUFXLEdBRTVDLE9BQU8sQ0FBQztHQUNaO0dBQ0EsT0FBTyxDQUFDO0VBQ1Y7RUFDQSxTQUFTLGlCQUFpQixLQUFLO0dBQzdCLE1BQU0sUUFBUSxnQkFBZ0IsT0FBTyxXQUFXLFdBQVcsS0FBSztHQUNoRSxJQUFJLGdCQUFnQixPQUFPLEtBQUssT0FBTztHQUN2QyxJQUFJO0lBQ0YsT0FBTyxJQUFJLGl
15852CQUFpQixJQUFJO0dBQ2xDLFNBQVMsS0FBSztJQUNaLE9BQU8sSUFBSTtHQUNiO0VBQ0Y7RUFDQSxTQUFTLFlBQVksTUFBTTtHQUN6QixPQUFPLFFBQVEsS0FBSyxhQUFjLE9BQU8sS0FBSztHQUM5QyxPQUFPO0VBQ1Q7RUFDQSxTQUFTLDBCQUEwQixNQUFNLFFBQVE7R0FDL0MsSUFBSSxPQUFPLFlBQVksSUFBSTtHQUMzQixPQUFPO0dBQ1AsS0FBSyxJQUFJLFNBQVMsT0FBUTtJQUN4QixJQUFJLE1BQU0sS0FBSyxVQUFVO0tBQ3ZCLFVBQVUsT0FBTyxLQUFLLFlBQVk7S0FDbEMsSUFBSSxRQUFRLFVBQVUsV0FBVyxRQUMvQixPQUFPO01BQVE7TUFBTSxRQUFRLFNBQVM7S0FBSztLQUM3QyxPQUFPO0lBQ1Q7SUFDQSxHQUFHO0tBQ0QsT0FBTyxPQUFRO01BQ2IsSUFBSSxLQUFLLGFBQWE7T0FDcEIsT0FBTyxLQUFLO09BQ1osTUFBTTtNQUNSO01BQ0EsT0FBTyxLQUFLO0tBQ2Q7S0FDQSxPQUFPLEtBQUs7SUFDZDtJQUNBLE9BQU8sWUFBWSxJQUFJO0dBQ3pCO0VBQ0Y7RUFDQSxTQUFTLGFBQWEsV0FBVyxXQUFXO0dBQzFDLE9BQU8sYUFBYSxZQUNoQixjQUFjLFlBQ1osQ0FBQyxJQUNELGFBQWEsTUFBTSxVQUFVLFdBQzNCLENBQUMsSUFDRCxhQUFhLE1BQU0sVUFBVSxXQUMzQixhQUFhLFdBQVcsVUFBVSxVQUFVLElBQzVDLGNBQWMsWUFDWixVQUFVLFNBQVMsU0FBUyxJQUM1QixVQUFVLDBCQUNSLENBQUMsRUFBRSxVQUFVLHdCQUF3QixTQUFTLElBQUksTUFDbEQsQ0FBQyxJQUNYLENBQUM7RUFDUDtFQUNBLFNBQVMscUJBQXFCLGVBQWU7R0FDM0MsZ0JBQ0UsUUFBUSxpQkFDUixRQUFRLGNBQWMsaUJBQ3RCLFFBQVEsY0FBYyxjQUFjLGNBQ2hDLGNBQWMsY0FBYyxjQUM1QjtHQUNOLEtBQ0UsSUFBSSxVQUFVLGlCQUFpQixjQUFjLFFBQVEsR0FDckQsbUJBQW1CLGNBQWMsb0JBRWpDO0lBQ0EsSUFBSTtLQUNGLElBQUksMkJBQ0YsYUFBYSxPQUFPLFFBQVEsY0FBYyxTQUFTO0lBQ3ZELFNBQVMsS0FBSztLQUNaLDJCQUEyQixDQUFDO0lBQzlCO0lBQ0EsSUFBSSwwQkFBMEIsZ0JBQWdCLFFBQVE7U0FDakQ7SUFDTCxVQUFVLGlCQUFpQixjQUFjLFFBQVE7R0FDbkQ7R0FDQSxPQUFPO0VBQ1Q7RUFDQSxTQUFTLHlCQUF5QixNQUFNO0dBQ3RDLElBQUksV0FBVyxRQUFRLEtBQUssWUFBWSxLQUFLLFNBQVMsWUFBWTtHQUNsRSxPQUNFLGFBQ0UsWUFBWSxhQUNYLFdBQVcsS0FBSyxRQUNmLGFBQWEsS0FBSyxRQUNsQixVQUFVLEtBQUssUUFDZixVQUFVLEtBQUssUUFDZixlQUFlLEtBQUssU0FDdEIsZUFBZSxZQUNmLFdBQVcsS0FBSztFQUV0QjtFQUNBLFNBQVMscUJBQ1AsZUFDQSxhQUNBLG1CQUNBO0dBQ0EsSUFBSSxNQUNGLGtCQUFrQixXQUFXLG9CQUN6QixrQkFBa0IsV0FDbEIsTUFBTSxrQkFBa0IsV0FDdEIsb0JBQ0Esa0JBQWtCO0dBQzFCLGFBQ0UsUUFBUSxpQkFDUixrQkFBa0IsaUJBQWlCLEdBQUcsTUFDcEMsTUFBTSxlQUNSLG9CQUFvQixPQUFPLHlCQUF5QixHQUFHLElBQ2xELE1BQU07SUFBRSxPQUFPLElBQUk7SUFBZ0IsS0FBSyxJQUFJO0dBQWEsS0FDeEQsT0FDQyxJQUFJLGlCQUFpQixJQUFJLGNBQWMsZUFDeEMsT0FBQSxDQUNBLGFBQWEsR0FDZCxNQUFNO0lBQ0wsWUFBWSxJQUFJO0lBQ2hCLGNBQWMsSUFBSTtJQUNsQixXQUFXLElBQUk7SUFDZixhQUFhLElBQUk7R0FDbkIsSUFDSCxpQkFBaUIsYUFBYSxlQUFlLEdBQUcsTUFDN0MsZ0JBQWdCLEtBQ2pCLE1BQU0sNEJBQTRCLG1CQUFtQixVQUFVLEdBQ2hFLElBQUksSUFBSSxXQUNKLGNBQWMsSUFBSSxlQUNsQixZQUNBLFVBQ0EsTUFDQSxhQUNBLGlCQUNGLEdBQ0EsY0FBYyxLQUFLO0lBQUUsT0FBTztJQUFhLFdBQVc7R0FBSSxDQUFDLEdBQ3hELFlBQVksU0FBUztFQUM5QjtFQUNBLFNBQVMsY0FBYyxXQUFXLFdBQVc7R0FDM0MsSUFBSSxXQUFXLENBQUM7R0FDaEIsU0FBUyxVQUFVLFlBQVksS0FBSyxVQUFVLFlBQVk7R0FDMUQsU0FBUyxXQUFXLGFBQWEsV0FBVztHQUM1QyxTQUFTLFFBQVEsYUFBYSxRQUFRO0dBQ3RDLE9BQU87RUFDVDtFQUNBLFNBQVMsMkJBQTJCLFdBQVc7R0FDN0MsSUFBSSxtQkFBbUIsWUFBWSxPQUFPLG1CQUFtQjtHQUM3RCxJQUFJLENBQUMsZUFBZSxZQUFZLE9BQU87R0FDdkMsSUFBSSxZQUFZLGVBQWUsWUFDN0I7R0FDRixLQUFLLGFBQWEsV0FDaEIsSUFBSSxVQUFVLGVBQWUsU0FBUyxLQUFLLGFBQWEsT0FDdEQsT0FBUSxtQkFBbUIsYUFBYSxVQUFVO0dBQ3RELE9BQU87RUFDVDtFQUNBLFNBQVMsb0JBQW9CLGNBQWMsV0FBVztHQUNwRCwyQkFBMkIsSUFBSSxjQUFjLFNBQVM7R0FDdEQsc0JBQXNCLFdBQVcsQ0FBQyxZQUFZLENBQUM7RUFDakQ7RUFDQSxTQUFTLHNCQUFzQixPQUFPLFVBQVU7R0FDOUMsSUFBSSxRQUFRLE1BQU0sUUFBUSxXQUFXLE1BQU0sTUFBTSxPQUFPLE1BQU07R0FDOUQsSUFBSSxTQUFTLFNBQVMsVUFBVSxPQUFPLFNBQVM7R0FDaEQsUUFBUSxtQkFBbUI7R0FDM0IsSUFBSSxpQkFBaUI7R0FDckIsUUFBUSxNQUFNLFFBQVEsT0FBTyxlQUFlLFNBQVMsRUFBRSxJQUFJO0dBQzNELE9BQVEsU0FBUyxXQUFXO0VBQzlCO0VBQ0EsU0FBUyxtQkFBbUIsYUFBYTtHQUN2QyxJQUFJLFFBQVEsZUFBZSxhQUFhLE9BQU8sYUFDN0MsT0FBTztHQUNULElBQUksWUFBWSxNQUNkLGNBQWM7R0FDaEIsSUFBSSxTQUFTLGFBQ1gsS0FBSyxJQUFJLElBQUksR0FBRyxJQUFJLFlBQVksUUFBUSxLQUFLO0lBQzNDLElBQUksUUFBUSxZQUFZLFlBQVk7SUFDcEMsSUFBSSxRQUFRLE9BQU87S0FDakIsSUFBSSxXQUFXLE9BQU8sT0FBTztLQUM3QixZQUFZLFFBQVEsWUFBWSxRQUFRLGFBQWEsTUFBTTtJQUM3RDtHQUNGO0dBQ0YsT0FBTyxRQUFRLFlBQVksWUFBWSxVQUFVO0VBQ25EO0VBQ0EsU0FBUywyQkFBMkIsY0FBYyxZQUFZO0dBQzVELGVBQWUsbUJBQW1CLFlBQVk7R0FDOUMsYUFBYSxtQkFBbUIsVUFBVTtHQUMxQyxPQUFPLFFBQVEsYUFDWCxXQUFXLGVBQ1QsT0FDQSxlQUNGLFdBQVcsYUFDVCxPQUNBO0VBQ1I7RUFDQSxTQUFTLGFBQWEsT0FBTztHQUMzQixLQUNFLElBQUksT0FBTyxhQUFhLElBQUksR0FDNUIsSUFBSSxNQUFNLFVBQVUsSUFBSSxvQkFDeEIsS0FDQTtJQUNBLElBQUksUUFBUSxNQUFNO0lBQ2xCLElBQUksYUFBYSxPQUFPLFNBQVMsU0FBUyxPQUN4QyxJQUNFLFlBQVksS0FBSyxLQUNqQixNQUFNLE1BQU0sVUFDWixhQUFhLE9BQU8sTUFBTSxJQUMxQjtLQUNBLElBQUksU0FBUyxlQUFlLFNBQVMsZUFDbkMsT0FBTztLQUNULE9BQU87SUFDVCxPQUFPLE9BQU87U0FDWDtLQUNILElBQ0UsZUFBZSxPQUFPLFNBQ3JCLGFBQWEsT0FBTyxTQUFTLEtBQUssTUFBTSxVQUN4QyxTQUFTLGVBQWUsU0FBUyxtQkFDbEMsYUFBYSxPQUFPLE9BRXBCLE9BQU87S0FDVCxPQUFPO0lBQ1Q7R0FDRjtHQUNBLE9BQU87RUFDVDtFQUNBLFNBQVMsc0JBQXNCLFFBQVEsWUFBWSxRQUFRLFFBQVE7R0FDakUsSUFBSSxDQUFDLFlBQVksT0FBTyxNQUFNLEdBQUc7SUFDL0IsSUFBSSxrQkFBa0IsR0FDcEI7SUFDRixLQUFLLE9BQU8sUUFDVixJQUNFLGVBQWUsS0FBSyxRQUFRLEdBQUcsS0FDL0IsUUFBUSxJQUFJLE9BQ1gsbUJBQ0QscUJBQXFCLEtBQUssT0FBTyxNQUFNLFlBQVksUUFBUSxNQUFNLEdBQ2pFLG1CQUFtQixxQkFDbkI7S0FDQSxXQUFXLEtBQUssQ0FDZCxTQUNFLFdBQWUsT0FBTyxNQUFNLElBQzVCLFVBQ0EscUJBQ0EsNkVBQ0YsRUFDRixDQUFDO0tBQ0Q7SUFDRjtHQUNKO0VBQ0Y7RUFDQSxTQUFTLHVCQUF1QixPQUFPO0dBQ3JDLE9BQU8sY0FBYyxTQUFTLGVBQWUsS0FBSyxPQUFPLFVBQVUsSUFDL0QsTUFBTSxXQUNOLEtBQUs7RUFDWDtFQUNBLFNBQVMscUJBQ1AsY0FDQSxPQUNBLFlBQ0EsUUFDQSxRQUNBO0dBQ0EsUUFBUSxPQUFPLE9BQWY7SUFDRSxLQUFLLFVBQ0gsSUFBSSxTQUFTLE9BQU87S0FDbEIsUUFBUTtLQUNSO0lBQ0YsT0FBTztLQUNMLElBQUksdUJBQXVCLEtBQUssTUFBTSxvQkFBb0I7TUFDeEQsSUFBSSxXQUFXLHlCQUF5QixNQUFNLElBQUksS0FBSyxLQUNyRCxNQUFNLE1BQU07TUFDZCxRQUFRLE1BQU07TUFDZCxJQUFJLFlBQVksT0FBTyxLQUFLLEtBQUssR0FDL0IsY0FBYyxVQUFVO01BQzFCLElBQUksUUFBUSxPQUFPLE1BQU0sYUFBYTtPQUNwQyxRQUFRLE1BQU0sV0FBVztPQUN6QjtNQUNGO01BQ0EsSUFDRSxJQUFJLFVBQ0gsTUFBTSxlQUNMLGVBQWUsVUFBVSxNQUN6QixRQUFRLEtBQ1Y7T0FDQSxRQUFRLE1BQU0sV0FBVztPQUN6QjtNQUNGO01BQ0EsV0FBVyxLQUFLLENBQ2QsU0FBUyxXQUFlLE9BQU8sTUFBTSxJQUFJLGNBQ3pDLE1BQU0sUUFDUixDQUFDO01BQ0QsU0FBUyxPQUNQLHFCQUNFLE9BQ0EsS0FDQSxZQUNBLFNBQVMsR0FDVCxNQUNGO01BQ0YsZUFBZSxDQUFDO01BQ2hCLE1BQU07TUFDTixLQUFLLElBQUksV0
15852FBVyxPQUNsQixJQUNHLE9BQ0QsZUFBZSxVQUNYLFFBQVEsTUFBTSxhQUNiLENBQUMsWUFBWSxNQUFNLFFBQVEsS0FDMUIsSUFBSSxNQUFNLFNBQVMsWUFDcEIsZUFBZSxDQUFDLEtBQ2pCLGVBQWUsS0FBSyxPQUFPLE9BQU8sS0FDbEMsUUFBUSxRQUFRLE1BQ2hCLHFCQUNFLFNBQ0EsTUFBTSxVQUNOLFlBQ0EsU0FBUyxHQUNULE1BQ0YsR0FDSixPQUFPLG9CQUVQO01BQ0osV0FBVyxLQUFLLENBQ2QsSUFDQSxlQUFlLFNBQWMsV0FBVyxNQUFNLElBQ2hELENBQUM7TUFDRDtLQUNGO0tBQ0EsV0FBVyxPQUFPLFVBQVUsU0FBUyxLQUFLLEtBQUs7S0FDL0MsV0FBVyxTQUFTLE1BQU0sR0FBRyxTQUFTLFNBQVMsQ0FBQztLQUNoRCxJQUFJLFlBQVksT0FBTyxLQUFLLEdBQUc7TUFDN0IsUUFBUSxNQUFNO01BQ2QsUUFDRSxhQUFhLE9BQU8sUUFDaEIsV0FBVyxNQUFNLFFBQVEsTUFDekI7TUFDTjtLQUNGO0tBQ0EsSUFBSSxZQUFZLFVBQ2Q7TUFDSSxJQUFBLFVBQVUsTUFBTSxTQUFTLG9CQUMxQixNQUFNLGFBQWEsS0FBSyxHQUN6QixRQUFRLG1CQUFtQixRQUFRLGFBQ25DO09BQ0EsUUFBUSxLQUFLLFVBQ1gsVUFDSSxNQUFNLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLE9BQU8sR0FBUSxJQUNsRCxLQUNOO09BQ0E7TUFDRixPQUFPLElBQUksUUFBUSxlQUFlO09BQ2hDLFdBQVcsS0FBSyxDQUNkLFNBQVMsV0FBZSxPQUFPLE1BQU0sSUFBSSxjQUN6QyxFQUNGLENBQUM7T0FDRCxLQUNFLGVBQWUsR0FDZixlQUFlLE1BQU0sVUFDckIsZUFBZSxvQkFDZixnQkFFQSxXQUFZLE1BQU0sZUFDaEIscUJBQ0UsU0FBUyxJQUNULFNBQVMsSUFDVCxZQUNBLFNBQVMsR0FDVCxNQUNGO09BQ0osV0FDRSxxQkFDRSxtQkFBbUIsU0FBUyxHQUM1QixLQUNBLFlBQ0EsU0FBUyxHQUNULE1BQ0Y7T0FDRjtNQUNGOztLQUNGLElBQUksY0FBYyxVQUFVO01BQzFCLElBQUksZ0JBQWdCLE1BQU0sUUFFcEI7V0FBQSxXQUFXLFdBQVcsUUFDeEIscUJBQ0UsY0FDQSxNQUFNLE9BQ04sWUFDQSxRQUNBLE1BQ0YsR0FDQSxXQUFXLFNBQVMsVUFDcEI7UUFDQSxhQUFhLFdBQVc7UUFDeEIsV0FBVyxLQUNULGNBQWMsV0FBVyxNQUFNLFlBQVk7UUFDN0M7T0FDRjthQUNLLElBQ0wsZUFBZSxNQUFNLFdBQ25CLFdBQVcsV0FBVyxRQUN4QixxQkFDRSxjQUNBLE1BQU0sUUFDTixZQUNBLFFBQ0EsTUFDRixHQUNBLFdBQVcsU0FBUyxXQUNwQjtPQUNBLGFBQWEsV0FBVztPQUN4QixXQUFXLEtBQUssc0JBQXNCLFdBQVcsS0FBSztPQUN0RDtNQUNGO01BQ0EsV0FBVyxLQUFLLENBQ2QsV0FBZSxPQUFPLE1BQU0sSUFBSSxjQUNoQyxTQUNGLENBQUM7TUFDRDtLQUNGO0tBQ0EsYUFBYSxhQUNWLFVBQVUsT0FBTyxlQUFlLEtBQUssTUFDdEMsZUFBZSxPQUFPLFFBQVEsZ0JBQzdCLFdBQVcsUUFBUSxZQUFZO0tBQ2xDLFdBQVcsS0FBSyxDQUNkLFNBQVMsV0FBZSxPQUFPLE1BQU0sSUFBSSxjQUN6QyxhQUFhLFdBQVksSUFBSSxTQUFTLEtBQUssTUFBWSxRQUN6RCxDQUFDO0tBQ0QsSUFBSSxVQUNGLHNCQUFzQixPQUFPLFlBQVksU0FBUyxHQUFHLE1BQU07S0FDN0Q7SUFDRjtJQUNGLEtBQUs7S0FDSCxRQUFRLE1BQU07S0FDZCxRQUNFLE9BQU8sU0FBUyxhQUFhLE9BQU8sUUFDaEMsYUFDQSxRQUFRO0tBQ2Q7SUFDRixLQUFLO0tBQ0gsUUFDRSxVQUFVLHFCQUNOLE1BQ0EsS0FBSyxVQUNILFFBQVEsTUFBTSxTQUFTLE1BQU0sTUFBTSxHQUFHLElBQUksSUFBSSxNQUFXLEtBQzNEO0tBQ047SUFDRixLQUFLO0tBQ0gsUUFBUTtLQUNSO0lBQ0YsS0FBSztLQUNILFFBQVEsUUFBUSxTQUFTO0tBQ3pCO0lBQ0YsU0FDRSxRQUFRLE9BQU8sS0FBSztHQUN4QjtHQUNBLFdBQVcsS0FBSyxDQUNkLFNBQVMsV0FBZSxPQUFPLE1BQU0sSUFBSSxjQUN6QyxLQUNGLENBQUM7RUFDSDtFQUNBLFNBQVMsMEJBQTBCLE1BQU0sTUFBTSxZQUFZLFFBQVE7R0FDakUsSUFBSSxnQkFBZ0IsQ0FBQyxHQUNuQix3QkFBd0I7R0FDMUIsS0FBSyxPQUFPLE1BQU07SUFDaEIsSUFBSSx3QkFBd0Isb0JBQW9CO0tBQzlDLFdBQVcsS0FBSyxDQUNkLG1DQUNFLHFCQUNBLGlGQUNGLEVBQ0YsQ0FBQztLQUNELGdCQUFnQixDQUFDO0tBQ2pCO0lBQ0Y7SUFDQSxPQUFPLFNBQ0osV0FBVyxLQUFLLENBQ2YsVUFBVSxXQUFlLE9BQU8sTUFBTSxJQUFJLEtBQzFDLEdBQ0YsQ0FBQyxHQUNBLGdCQUFnQixDQUFDO0lBQ3BCO0dBQ0Y7R0FDQSx3QkFBd0I7R0FDeEIsS0FBSyxJQUFJLFFBQVEsTUFBTTtJQUNyQixJQUFJLHdCQUF3QixvQkFBb0I7S0FDOUMsV0FBVyxLQUFLLENBQ2QsK0JBQ0UscUJBQ0EsaUZBQ0YsRUFDRixDQUFDO0tBQ0QsZ0JBQWdCLENBQUM7S0FDakI7SUFDRjtJQUNBLElBQUksUUFBUSxNQUFNO0tBQ2hCLElBQUksTUFBTSxLQUFLO0tBQ2YsSUFBSSxZQUFZLEtBQUs7S0FDckIsSUFBSSxRQUFRLFdBQVc7TUFDckIsSUFBSSxNQUFNLFVBQVUsZUFBZSxNQUFNO09BQ3ZDLGdCQUFnQixXQUFlLE9BQU8sTUFBTSxJQUFJO09BQ2hELFdBQVcsS0FDVCxDQUFDLFVBQVUsZUFBZSxHQUFRLEdBQ2xDLENBQUMsUUFBUSxlQUFlLEdBQVEsQ0FDbEM7T0FDQSxnQkFBZ0IsQ0FBQztPQUNqQjtNQUNGO01BQ0EsSUFBSSxFQUFFLEtBQUssU0FDVDtPQUNFLElBQUEsYUFBYSxPQUFPLE9BQ3BCLGFBQWEsT0FBTyxhQUNwQixTQUFTLE9BQ1QsU0FBUyxhQUNULHVCQUF1QixHQUFHLE1BQ3hCLHVCQUF1QixTQUFTLEdBRWxDLElBQUksdUJBQXVCLFNBQVMsTUFBTSxvQkFFdEM7WUFBQSxJQUFJLFNBQVMsVUFBVSxRQUN2QixJQUFJLFFBQVEsVUFBVSxLQUN0QjtTQUNBLE1BQU0seUJBQXlCLFVBQVUsSUFBSSxLQUFLO1NBQ2xELGdCQUFnQixXQUFlLE9BQU8sTUFBTSxJQUFJO1NBQ2hELE1BQU0sTUFBTSxNQUFNO1NBQ2xCLFdBQVcsS0FDVCxDQUFDLFVBQVUsZUFBZSxHQUFHLEdBQzdCLENBQUMsUUFBUSxlQUFlLEdBQUcsQ0FDN0I7U0FDQSxnQkFBZ0IsQ0FBQztTQUNqQjtRQUNGO2NBQ0s7UUFDTCxJQUFJLFdBQVcsT0FBTyxVQUFVLFNBQVMsS0FBSyxHQUFHLEdBQy9DLFdBQVcsT0FBTyxVQUFVLFNBQVMsS0FBSyxTQUFTO1FBQ3JELElBQ0UsYUFBYSxhQUNaLHNCQUFzQixZQUNyQixxQkFBcUIsV0FDdkI7U0FDQSxXQUFXLENBQ1QsWUFBWSxXQUFlLE9BQU8sTUFBTSxJQUFJLE1BQzVDLHFCQUFxQixXQUFXLFVBQVUsRUFDNUM7U0FDQSxXQUFXLEtBQUssUUFBUTtTQUN4QixXQUFXLFdBQVc7U0
15852FDdEIsMEJBQ0UsS0FDQSxXQUNBLFlBQ0EsU0FBUyxDQUNYLElBQ0ksYUFBYSxXQUFXLFdBQ3ZCLFNBQVMsS0FDUiwyRUFDRCxnQkFBZ0IsQ0FBQztTQUN0QjtRQUNGO09BQ0Y7WUFDRyxJQUNILGVBQWUsT0FBTyxPQUN0QixlQUFlLE9BQU8sYUFDdEIsSUFBSSxTQUFTLFVBQVUsUUFDdkIsSUFBSSxXQUFXLFVBQVUsV0FDdkIsV0FBVyxTQUFTLFVBQVUsU0FBUyxLQUFLLEdBQUcsR0FDaEQsV0FBVyxTQUFTLFVBQVUsU0FBUyxLQUFLLFNBQVMsR0FDdEQsYUFBYSxXQUNiO1FBQ0EsTUFDRSxPQUFPLFVBQVUsT0FBTyxhQUFhLFVBQVUsT0FBTztRQUN4RCxXQUFXLEtBQUssQ0FDZCxZQUFZLFdBQWUsT0FBTyxNQUFNLElBQUksTUFDNUMsTUFDRSxnRUFDSixDQUFDO1FBQ0Q7T0FDRjs7TUFDRixxQkFBcUIsTUFBTSxLQUFLLFlBQVksUUFBUSxPQUFPO01BQzNELHFCQUFxQixNQUFNLFdBQVcsWUFBWSxRQUFRLEtBQUs7TUFDL0QsZ0JBQWdCLENBQUM7S0FDbkI7SUFDRixPQUNFLFdBQVcsS0FBSyxDQUNkLFFBQVEsV0FBZSxPQUFPLE1BQU0sSUFBSSxNQUN4QyxHQUNGLENBQUMsR0FDRSxnQkFBZ0IsQ0FBQztJQUN0QjtHQUNGO0dBQ0EsT0FBTztFQUNUO0VBQ0EsU0FBUyx5QkFBeUIsT0FBTztHQUN2QyxlQUNFLFFBQVEsS0FDSixhQUNBLFFBQVEsS0FDTixZQUNBLFFBQVEsVUFDTixlQUNBLFFBQVEsV0FDTixhQUNBLFFBQVEsYUFDTixTQUNBO0VBQ2hCO0VBQ0EsU0FBUyxvQkFBb0IsT0FBTyxXQUFXLFNBQVMsU0FBUztHQUMvRCx1QkFDSSx5QkFBeUIsUUFBUSxXQUNsQyx5QkFBeUIsTUFBTSxTQUMvQixnQ0FBZ0MsUUFBUSxXQUN4QyxnQ0FBZ0MsY0FBYyxTQUM5QyxnQ0FBZ0MsYUFBYSxPQUM3QyxRQUFRLE1BQU0sY0FDWCxNQUFNLElBQ0osWUFBWSxRQUFRLEtBQ2xCLGFBQ0EsU0FDQSx3QkFDRixDQUNGLElBQ0EsWUFBWSxRQUFRLFNBQVMsd0JBQXdCLEdBQ3pELFlBQVksY0FBYyxPQUFPO0VBQ3JDO0VBQ0EsU0FBUyx1QkFBdUIsT0FBTyxXQUFXLFNBQVM7R0FDekQsb0JBQW9CLE9BQU8sV0FBVyxTQUFTLFdBQVc7RUFDNUQ7RUFDQSxTQUFTLG1CQUNQLE9BQ0EsV0FDQSxTQUNBLGFBQ0EsZ0JBQ0E7R0FDQSxJQUFJLE9BQU8sMEJBQTBCLEtBQUs7R0FDMUMsSUFBSSxTQUFTLFFBQVEsb0JBQW9CO0lBQ3ZDLElBQUksWUFBWSxNQUFNLFdBQ3BCLFdBQVcsTUFBTTtJQUNuQixJQUFJLFNBQVMsYUFBYSxVQUFVLFVBQVUsTUFBTSxPQUNsRCxLQUFLLElBQUksUUFBUSxNQUFNLE9BQU8sU0FBUyxPQUFPLFFBQVEsTUFBTSxTQUMxRCxZQUFZLE1BQU07SUFDdEIsV0FDRSxLQUFNLFdBQ0YsY0FDRSxtQkFDQSxrQkFDRixLQUFLLFdBQ0gsY0FDRSxhQUNBLFlBQ0YsTUFBTSxXQUNKLGNBQ0Usa0JBQ0EsaUJBQ0Y7SUFDVixJQUFJLFFBQVEsTUFBTTtJQUNsQixjQUFjLE1BQU07SUFDcEIsU0FBUyxTQUNULFNBQVMsYUFDVCxVQUFVLGtCQUFrQixTQUN0QixRQUFRLENBQUMseUJBQXlCLEdBQ25DLFFBQVEsMEJBQ1AsVUFBVSxlQUNWLE9BQ0EsT0FDQSxDQUNGLEdBQ0EsSUFBSSxNQUFNLFVBQ0wsU0FDRCxDQUFDLGdDQUNELE9BQU8sVUFBVSxRQUFRLG1CQUN6QixNQUFNLE1BQU0sa0JBQ04sK0JBQStCLENBQUMsR0FDakMsTUFBTSxLQUFLLCtCQUNYLGdDQUFnQyxRQUFRLFdBQ3hDLGdDQUFnQyxjQUMvQiwwQkFDQSxnQ0FBZ0MsUUFBUSxVQUN6QyxnQ0FBZ0MsY0FBYyxPQUNsRCxnQ0FBZ0MsYUFBYSxPQUM3Qyx5QkFBeUIsUUFBUSxXQUNqQyx5QkFBeUIsTUFBTSxTQUMvQixRQUFRLE1BQVcsTUFDcEIsUUFBUSxjQUNKLFlBQVksSUFDVixZQUFZLFFBQVEsS0FDbEIsYUFDQSxPQUNBLHdCQUNGLENBQ0YsSUFDQSxZQUFZLFFBQVEsT0FBTyx3QkFBd0IsR0FDdkQsWUFBWSxjQUFjLEtBQUssS0FDL0IsUUFBUSxjQUNOLFlBQVksSUFDVixRQUFRLFVBQVUsS0FDaEIsU0FDQSxNQUNBLFdBQ0EsU0FDQSxrQkFDQSxLQUFLLEdBQ0wsUUFDRixDQUNGLElBQ0EsUUFBUSxVQUNOLE1BQ0EsV0FDQSxTQUNBLGtCQUNBLEtBQUssR0FDTCxRQUNGLEtBQ04sUUFBUSxjQUNOLFlBQVksSUFDVixRQUFRLFVBQVUsS0FDaEIsU0FDQSxNQUNBLFdBQ0EsU0FDQSxrQkFDQSxLQUFLLEdBQ0wsUUFDRixDQUNGLElBQ0EsUUFBUSxVQUNOLE1BQ0EsV0FDQSxTQUNBLGtCQUNBLEtBQUssR0FDTCxRQUNGO0dBQ1I7RUFDRjtFQUNBLFNBQVMsb0JBQW9CLE9BQU8sV0FBVyxTQUFTLFFBQVE7R0FDOUQsSUFBSSxvQkFBb0I7SUFDdEIsSUFBSSxPQUFPLDBCQUEwQixLQUFLO0lBQzFDLElBQUksU0FBUyxNQUFNO0tBQ2pCLEtBQ0UsSUFBSSxZQUFZLE1BQU0sYUFBYSxDQUFDLEdBQUcsSUFBSSxHQUMzQyxJQUFJLE9BQU8sUUFDWCxLQUNBO01BQ0EsSUFBSSxnQkFBZ0IsT0FBTztNQUMzQixRQUFRLGFBQ04sU0FBUyxjQUFjLFdBQ3RCLFlBQVksY0FBYyxPQUFPO01BQ3BDLGdCQUFnQixjQUFjO01BQzlCLFdBQVcsS0FBSyxDQUNkLFNBQ0EsYUFBYSxPQUFPLGlCQUNwQixTQUFTLGlCQUNULGFBQWEsT0FBTyxjQUFjLFVBQzlCLE9BQU8sY0FBYyxPQUFPLElBQzVCLE9BQU8sYUFBYSxDQUMxQixDQUFDO0tBQ0g7S0FDQSxTQUFTLE1BQU0sT0FDYixxQkFBcUIsT0FBTyxNQUFNLEtBQUssWUFBWSxHQUFHLEVBQUU7S0FDMUQsU0FBUyxNQUFNLGlCQUNiLHNCQUFzQixNQUFNLGVBQWUsWUFBWSxHQUFHLEVBQUU7S0FDOUQsY0FBa0MsTUFBTTtLQUN4QyxRQUFRO01BQ04sT0FBTztNQUNQLEtBQUs7TUFDTCxRQUFRLEVBQ04sVUFBVTtPQUNSLE9BQU87T0FDUCxPQUFPO09BQ1AsYUFDRSxPQUFPLE1BQU0sTUFDVCxxQkFDQTtPQUNNO01BQ2QsRUFDRjtLQUNGO0tBQ0EsT0FBTyxNQUFXO0tBQ2xCLFlBQ0ksVUFBVSxJQUFJLFlBQVksUUFBUSxLQUFLLGFBQWEsTUFBTSxLQUFLLENBQUMsSUFDaEUsWUFBWSxRQUFRLE1BQU0sS0FBSztLQUNuQyxZQUFZLGNBQWMsSUFBSTtJQUNoQztHQUNGO0VBQ0Y7RUFDQSxTQUFTLG1CQUFtQixPQUFPLFdBQVcsU0FBUyxVQUFVLFFBQVE7R0FDdkUsSUFBSSxTQUFTLFFBQ1A7UUFBQSxvQkFBb0I7S0FDdEIsSUFBSSxPQUFPLDBCQUEwQixLQUFLO0tBQzFDLElBQUksU0FBUyxNQUFNO01BQ2pCLFdBQVcsQ0FBQztNQUNaLEtBQUssSUFBSSxJQUFJLEdBQUcsSUFBSSxPQUFPLFFBQVEsS0FBSztPQUN0QyxJQUFJLFFBQVEsT0FBTyxFQUFFLENBQUM7T0FDdEIsU0FBUyxLQUFLLENBQ1osU0FDQSxhQUFhLE9BQU8sU0FDcEIsU0FBUyxTQUNULGFBQWEsT0FBTyxNQUFNLFVBQ3RCLE9BQU8sTUFBTSxPQUFPLElBQ3BCLE9BQU8sS0FBSyxDQUNsQixDQUFDO01BQ0g7TUFDQSxTQUFTLE1BQU0sT0FDYixxQkFBcUIsT0FBTyxNQUFNLEtBQUssVUFBVSxHQUFHLEVBQUU7TUFDeEQsU0FBUyxNQUFNLGlCQUNiLHNCQUFzQixNQUFNLGVBQWUsVUFBVSxHQUFHLEVBQUU7TUFDNUQsWUFBWTtPQUNWLE9BQU87T0FDUCxLQUFLO09BQ0wsUUFBUSxFQUNOLFVBQVU7UUFDUixPQUFPO1FBQ1AsT0FBTztRQUNQLGFBQWE7UUFDYixZQUFZO09BQ2QsRUFDRjtNQUNGO01BQ0EsUUFBUSxNQUFNO01BQ2QsVUFBVSxNQUFXO01BQ3JCLFFBQ0ksTUFBTSxJQUNKLFlBQVksUUFBUSxLQUFLLGFBQWEsU0FBUyxTQUFTLENBQzFELElBQ0EsWUFBWSxRQUFRLFNBQVMsU0FBUztNQUMxQyxZQUFZLGNBQWMsT0FBTztLQUNuQztJQUNGO1VBRUEsT0FBUSwwQkFBMEIsS0FBSyxHQUNyQyxTQUFTLFFBQ1AsdUJBQ0UsU0FDQSxJQUFJLFdBQ0Esb0JBQ0EsTUFBTSxXQUNKLGNBQ0EsTUFBTSxXQUNKLG1CQUNBLFVBQ1QsUUFBUSxNQUFNLGNBQ1gsTUFBTSxJQUNKLFF
15852BQVEsVUFBVSxLQUNoQixTQUNBLE1BQ0EsV0FDQSxTQUNBLGtCQUNBLEtBQUssR0FDTCxNQUNGLENBQ0YsSUFDQSxRQUFRLFVBQ04sTUFDQSxXQUNBLFNBQ0Esa0JBQ0EsS0FBSyxHQUNMLE1BQ0Y7RUFDWjtFQUNBLFNBQVMsd0JBQXdCLFdBQVcsU0FBUyxPQUFPLFdBQVc7R0FDckUsQ0FBQyxzQkFDQyxXQUFXLGNBQ1QsU0FDQyxRQUFRLGVBQWUsUUFBUSxrQkFBa0IsZ0JBQ3BELFlBQ0ksVUFBVSxJQUNSLFFBQVEsVUFBVSxLQUNoQixTQUNBLFdBQ0EsV0FDQSxTQUNBLGNBQ0EsbUJBQ0EsS0FDRixDQUNGLElBQ0EsUUFBUSxVQUNOLFdBQ0EsV0FDQSxTQUNBLGNBQ0EsbUJBQ0EsS0FDRjtFQUNSO0VBQ0EsU0FBUywyQkFBMkIsV0FBVyxTQUFTLE9BQU8sV0FBVztHQUN4RSxDQUFDLHNCQUNDLFdBQVcsY0FDVCxTQUNDLFFBQVEsZUFBZSxRQUFRLGtCQUFrQixnQkFDcEQsWUFDSSxVQUFVLElBQ1IsUUFBUSxVQUFVLEtBQ2hCLFNBQ0EsYUFDQSxXQUNBLFNBQ0EsY0FDQSxtQkFDQSxLQUNGLENBQ0YsSUFDQSxRQUFRLFVBQ04sYUFDQSxXQUNBLFNBQ0EsY0FDQSxtQkFDQSxLQUNGO0VBQ1I7RUFDQSxTQUFTLHNCQUFzQixXQUFXLFNBQVMsT0FBTyxXQUFXO0dBQ25FLENBQUMsc0JBQ0MsV0FBVyxjQUNWLFlBQ0csVUFBVSxJQUNSLFFBQVEsVUFBVSxLQUNoQixTQUNBLFdBQ0EsV0FDQSxTQUNBLGNBQ0EsbUJBQ0EsT0FDRixDQUNGLElBQ0EsUUFBUSxVQUNOLFdBQ0EsV0FDQSxTQUNBLGNBQ0EsbUJBQ0EsT0FDRjtFQUNSO0VBQ0EsU0FBUyx3QkFBd0IsV0FBVyxTQUFTLFFBQVEsV0FBVztHQUN0RSxDQUFDLHNCQUNDLFdBQVcsY0FDVixZQUNHLFVBQVUsSUFDUixRQUFRLFVBQVUsS0FDaEIsU0FDQSxRQUNBLFdBQ0EsU0FDQSxjQUNBLG1CQUNBLGlCQUNGLENBQ0YsSUFDQSxRQUFRLFVBQ04sUUFDQSxXQUNBLFNBQ0EsY0FDQSxtQkFDQSxpQkFDRjtFQUNSO0VBQ0EsU0FBUyxpQkFBaUIsV0FBVyxTQUFTLFFBQVEsU0FBUyxXQUFXO0dBQ3hFLElBQUksc0JBQXNCLEVBQUUsV0FBVyxZQUFZO0lBQ2pELEtBQUssSUFBSSxhQUFhLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxPQUFPLFFBQVEsS0FBSztLQUN2RCxJQUFJLFFBQVEsT0FBTyxFQUFFLENBQUM7S0FDdEIsV0FBVyxLQUFLLENBQ2QsU0FDQSxhQUFhLE9BQU8sU0FDcEIsU0FBUyxTQUNULGFBQWEsT0FBTyxNQUFNLFVBQ3RCLE9BQU8sTUFBTSxPQUFPLElBQ3BCLE9BQU8sS0FBSyxDQUNsQixDQUFDO0lBQ0g7SUFDQSxZQUFZO0tBQ1YsT0FBTztLQUNQLEtBQUs7S0FDTCxRQUFRLEVBQ04sVUFBVTtNQUNSLE9BQU87TUFDUCxPQUFPO01BQ1AsWUFBWTtNQUNaLGFBQWEsVUFDVCw4QkFDQTtNQUNRO0tBQ2QsRUFDRjtJQUNGO0lBQ0EsWUFDSSxVQUFVLElBQ1IsWUFBWSxRQUFRLEtBQUssYUFBYSxXQUFXLFNBQVMsQ0FDNUQsSUFDQSxZQUFZLFFBQVEsV0FBVyxTQUFTO0lBQzVDLFlBQVksY0FBYyxTQUFTO0dBQ3JDO0VBQ0Y7RUFDQSxTQUFTLGVBQ1AsV0FDQSxTQUNBLFFBQ0EsdUJBQ0EsV0FDQTtHQUNBLFNBQVMsU0FDTCxpQkFBaUIsV0FBVyxTQUFTLFFBQVEsQ0FBQyxHQUFHLFNBQVMsSUFDMUQsQ0FBQyxzQkFDRCxXQUFXLGNBQ1YsWUFDRyxVQUFVLElBQ1IsUUFBUSxVQUFVLEtBQ2hCLFNBQ0Esd0JBQ0ksdUNBQ0EsVUFDSixXQUNBLFNBQ0EsY0FDQSxtQkFDQSx3QkFBd0IsVUFBVSxnQkFDcEMsQ0FDRixJQUNBLFFBQVEsVUFDTix3QkFDSSx1Q0FDQSxVQUNKLFdBQ0EsU0FDQSxjQUNBLG1CQUNBLHdCQUF3QixVQUFVLGdCQUNwQztFQUNWO0VBQ0EsU0FBUyxrQkFBa0IsV0FBVyxTQUFTLFdBQVc7R0FDeEQsQ0FBQyxzQkFDQyxXQUFXLGNBQ1YsWUFDRyxVQUFVLElBQ1IsUUFBUSxVQUFVLEtBQ2hCLFNBQ0EsYUFDQSxXQUNBLFNBQ0EsY0FDQSxtQkFDQSxnQkFDRixDQUNGLElBQ0EsUUFBUSxVQUNOLGFBQ0EsV0FDQSxTQUNBLGNBQ0EsbUJBQ0EsZ0JBQ0Y7RUFDUjtFQUNBLFNBQVMsa0NBQWtDO0dBQ3pDLEtBQ0UsSUFBSSxXQUFXLHVCQUNiLElBQUssMkJBQTJCLHdCQUF3QixHQUMxRCxJQUFJLFdBRUo7SUFDQSxJQUFJLFFBQVEsaUJBQWlCO0lBQzdCLGlCQUFpQixPQUFPO0lBQ3hCLElBQUksUUFBUSxpQkFBaUI7SUFDN0IsaUJBQWlCLE9BQU87SUFDeEIsSUFBSSxTQUFTLGlCQUFpQjtJQUM5QixpQkFBaUIsT0FBTztJQUN4QixJQUFJLE9BQU8saUJBQWlCO0lBQzVCLGlCQUFpQixPQUFPO0lBQ3hCLElBQUksU0FBUyxTQUFTLFNBQVMsUUFBUTtLQUNyQyxJQUFJLFVBQVUsTUFBTTtLQUNwQixTQUFTLFVBQ0osT0FBTyxPQUFPLFVBQ2IsT0FBTyxPQUFPLFFBQVEsTUFBUSxRQUFRLE9BQU87S0FDbkQsTUFBTSxVQUFVO0lBQ2xCO0lBQ0EsTUFBTSxRQUFRLDhCQUE4QixPQUFPLFFBQVEsSUFBSTtHQUNqRTtFQUNGO0VBQ0EsU0FBUyxnQkFBZ0IsT0FBTyxPQUFPLFFBQVEsTUFBTTtHQUNuRCxpQkFBaUIsMkJBQTJCO0dBQzVDLGlCQUFpQiwyQkFBMkI7R0FDNUMsaUJBQWlCLDJCQUEyQjtHQUM1QyxpQkFBaUIsMkJBQTJCO0dBQzVDLDRCQUE0QjtHQUM1QixNQUFNLFNBQVM7R0FDZixRQUFRLE1BQU07R0FDZCxTQUFTLFVBQVUsTUFBTSxTQUFTO0VBQ3BDO0VBQ0EsU0FBUyw0QkFBNEIsT0FBTyxPQUFPLFFBQVEsTUFBTTtHQUMvRCxnQkFBZ0IsT0FBTyxPQUFPLFFBQVEsSUFBSTtHQUMxQyxPQUFPLHVCQUF1QixLQUFLO0VBQ3JDO0VBQ0EsU0FBUywrQkFBK0IsT0FBTyxNQUFNO0dBQ25ELGdCQUFnQixPQUFPLE1BQU0sTUFBTSxJQUFJO0dBQ3ZDLE9BQU8sdUJBQXVCLEtBQUs7RUFDckM7RUFDQSxTQUFTLDhCQUE4QixhQUFhLFFBQVEsTUFBTTtHQUNoRSxZQUFZLFNBQVM7R0FDckIsSUFBSSxZQUFZLFlBQVk7R0FDNUIsU0FBUyxjQUFjLFVBQVUsU0FBUztHQUMxQyxLQUFLLElBQUksV0FBVyxDQUFDLEdBQUcsU0FBUyxZQUFZLFFBQVEsU0FBUyxTQUM1RCxPQUFRLGNBQWMsTUFDbkIsWUFBWSxPQUFPLFdBQ3BCLFNBQVMsY0FBYyxVQUFVLGNBQWMsT0FDL0MsT0FBTyxPQUFPLFFBQ1YsY0FBYyxPQUFPLFdBQ3ZCLFNBQVMsZUFDUCxZQUFZLGNBQWMscUJBQ3pCLFdBQVcsQ0FBQyxLQUNoQixjQUFjLFFBQ2QsU0FBUyxPQUFPO0dBQ3JCLE9BQU8sTUFBTSxZQUFZLE9BQ25CLFNBQVMsWUFBWSxXQUN2QixZQUNFLFNBQVMsV0FDUCxXQUFXLEtBQUssTUFBTSxJQUFJLEdBQzNCLGNBQWMsT0FBTyxlQUNyQixZQUFZLFlBQVksV0FDekIsU0FBUyxZQUNKLFlBQVksWUFBWSxDQUFDLE1BQU0sSUFDaEMsVUFBVSxLQUFLLE1BQU0sR0FDeEIsT0FBTyxPQUFPLE9BQU8sWUFDeEIsVUFDQTtFQUNOO0VBQ0EsU0FBUyx1QkFBdUIsYUFBYTtHQUMzQyxJQUFJLG9CQUFvQixxQkFDdEIsTUFDSSwyQkFBMkIsb0JBQW9CLEdBQ2hELCtCQUErQix3QkFBd0IsTUFDeEQsTUFDRSxrTkFDRjtHQUVKLDJCQUEyQixnQ0FDdkIsMkJBQTJCLEdBQzVCLCtCQUErQixNQUNoQyxRQUFRLE1BQ04sNE1BQ0Y7R0FDRixTQUFTLFlBQVksYUFDbkIsT0FBTyxZQUFZLFFBQVEsU0FDM0IseUNBQXlDLFdBQVc7R0FDdEQsS0FBSyxJQUFJLE9BQU8sYUFBYSxTQUFTLEtBQUssUUFBUSxTQUFTLFNBQzFELFNBQVMsS0FBSyxhQUNaLE9BQU8sS0FBSyxRQUFRLFNBQ3BCLHlDQUF5QyxXQUFXLEdBQ25ELE9BQU8sUUFDUCxTQUFTLEtBQUs7R0FDbkIsT0FBTyxNQUFNLEtBQUssTUFBTSxLQUFLLFlBQVk7RUFDM0M7RUFDQSxTQUFTLDJCQUEyQixNQUFNO0dBQ3hDLElBQUksU0FBUyxlQUFlLE9BQU87R0FDbkMsSUFBSSxTQUFTLGNBQWMsSUFBSTtHQUMvQixPQUFPLEtBQUssTUFBTSxTQUFTLE9BQU8sT0FBTztFQUMzQztFQUNBLFNBQVMsa0NBQWtDLE9BQU8sU0FBUztHQUN6RCxJQUFJLFNBQVMsZUFBZSxPQUFPLENBQUM7R0FDcEMsSUFBSSxVQUFVLGVBQ1osV0FBVyxNQUFNO0dBQ25CLFVBQVUsUUFBUTtHQUNsQixJQUFJLHVCQUF1QixDQUFDLEdBQzFCLG1CQUNFLGFBQWEsT0FBTyxXQUFXLFNBQVMsVUFDcEMsUUFBUSxXQUNSO0dBQ1IsUUFBUSxNQUFNLEtBQWQ7SUFDRSxLQUFLO0tBQ0gsZUFBZSxPQUFPLFlBQVksdUJBQXVCLENBQUM7S0FDMUQ7SUFDRixLQUFLO0tBQ0gsZUFBZSxPQUFPLFVBQ2pCLHVC
15852QUF1QixDQUFDLElBQ3pCLHFCQUFxQixvQkFDcEIsdUJBQXVCLENBQUM7S0FDN0I7SUFDRixLQUFLO0tBQ0gscUJBQXFCLHlCQUNoQix1QkFBdUIsQ0FBQyxJQUN6QixxQkFBcUIsb0JBQ3BCLHVCQUF1QixDQUFDO0tBQzdCO0lBQ0YsS0FBSztJQUNMLEtBQUs7S0FDSCxxQkFBcUIsa0JBQ2hCLHVCQUF1QixDQUFDLElBQ3pCLHFCQUFxQixvQkFDcEIsdUJBQXVCLENBQUM7S0FDN0I7SUFDRixTQUNFLE9BQU8sQ0FBQztHQUNaO0dBQ0EsT0FBTyx5QkFDSCxRQUFRLFFBQVEsUUFBUSxHQUMxQixLQUFLLE1BQU0sU0FBUyxVQUFVLFFBQVEsT0FBTyxLQUMzQyxDQUFDLElBQ0QsQ0FBQztFQUNQO0VBQ0EsU0FBUyx1Q0FBdUMsT0FBTztHQUNyRCxTQUFTLGlCQUNQLGVBQWUsT0FBTyxZQUNyQixTQUFTLHFCQUFxQixtQ0FBbUIsSUFBSSxRQUFRLElBQzlELGlCQUFpQixJQUFJLEtBQUs7RUFDOUI7RUFDQSxTQUFTLHNDQUNQLE9BQ0EsaUJBQ0EsZUFDQTtHQUNBLEdBQUc7SUFDRCxJQUFJLFNBQVMsT0FDWCxZQUFZLE9BQU8sV0FDbkIsUUFBUSxPQUFPLE9BQ2YsVUFBVSxPQUFPLFNBQ2pCLE1BQU0sT0FBTyxLQUNiLE9BQU8sT0FBTyxNQUNkLGNBQWMsT0FBTyxhQUNyQixnQkFBZ0I7SUFDbEIsU0FBUztJQUNULFFBQVEsS0FBUjtLQUNFLEtBQUs7S0FDTCxLQUFLO01BQ0gsZ0JBQWdCO01BQ2hCO0tBQ0YsS0FBSztNQUNILGdCQUFnQjtNQUNoQixTQUFTO01BQ1Q7S0FDRixLQUFLO01BQ0gsU0FBUztNQUNUO0tBQ0YsS0FBSyxJQUNILGdCQUFpQixLQUFLLFFBQVUsU0FBUztJQUM3QztJQUNBLElBQUksU0FBUyxlQUNYLE1BQU0sTUFBTSxxREFBcUQ7SUFDbkUsSUFBSSxVQUFVO0lBQ2QsT0FBTyxjQUFjLENBQUM7SUFDdEIsU0FBUyxrQkFDTCxnQkFBZ0IsUUFBUSxhQUFhLEdBQ3ZDLEtBQUssTUFBTSxrQkFDUixjQUFjLElBQUksYUFBYSxJQUMzQixPQUFPLENBQUMsSUFDVCxnQkFBZ0IsSUFBSSxhQUFhLE1BQ2hDLE1BQU0sTUFBTyxPQUFPLENBQUMsSUFBTSxjQUFjLENBQUM7SUFDbkQsUUFDRSxTQUFTLFdBQ1AsTUFBTSxRQUFRLE1BQU0sR0FDdEIsS0FBSyxNQUFNLE9BQU8sY0FBYyxJQUFJLEdBQUcsSUFDbEMsT0FBTyxDQUFDLElBQ1QsYUFBYSxPQUFPLFVBQ3BCLE9BQU8sYUFBYSxvQkFDbEIsTUFBTSxPQUFPLFVBQ2YsTUFBTSxJQUFJLFlBQ04sTUFBTSxRQUFRLElBQUksUUFBUSxPQUFPLEdBQ25DLEtBQUssTUFBTSxPQUFPLGNBQWMsSUFBSSxHQUFHLE1BQU0sT0FBTyxDQUFDO0lBQzdELFNBQVMscUJBQ04saUJBQWlCLElBQUksS0FBSyxLQUN4QixTQUFTLGFBQWEsaUJBQWlCLElBQUksU0FBUyxPQUN0RCxPQUFPLENBQUM7SUFDWCxTQUFTLE1BQU0scUJBQXFCLENBQUM7SUFDckMsSUFBSSxRQUFRLGFBQ1YsWUFBYSwrQkFBK0IsT0FBTyxDQUFDLEdBQ2xELFNBQVMsYUFBYSxzQkFBc0IsV0FBVyxPQUFPLENBQUM7SUFDbkUsU0FBUyxTQUNQLFFBQ0Esc0NBQ0UsT0FDQSxpQkFDQSxhQUNGO0lBQ0YsSUFBSSxTQUFTLFNBQVM7SUFDdEIsUUFBUTtHQUNWLFNBQVM7RUFDWDtFQUNBLFNBQVMsVUFBVSxLQUFLLGNBQWMsS0FBSyxNQUFNO0dBQy9DLEtBQUssTUFBTTtHQUNYLEtBQUssTUFBTTtHQUNYLEtBQUssVUFDSCxLQUFLLFFBQ0wsS0FBSyxTQUNMLEtBQUssWUFDTCxLQUFLLE9BQ0wsS0FBSyxjQUNIO0dBQ0osS0FBSyxRQUFRO0dBQ2IsS0FBSyxhQUFhLEtBQUssTUFBTTtHQUM3QixLQUFLLGVBQWU7R0FDcEIsS0FBSyxlQUNILEtBQUssZ0JBQ0wsS0FBSyxjQUNMLEtBQUssZ0JBQ0g7R0FDSixLQUFLLE9BQU87R0FDWixLQUFLLGVBQWUsS0FBSyxRQUFRO0dBQ2pDLEtBQUssWUFBWTtHQUNqQixLQUFLLGFBQWEsS0FBSyxRQUFRO0dBQy9CLEtBQUssWUFBWTtHQUNqQixLQUFLLGlCQUFpQjtHQUN0QixLQUFLLGtCQUFrQjtHQUN2QixLQUFLLG1CQUFtQixLQUFLLG1CQUFtQjtHQUNoRCxLQUFLLGFBQ0gsS0FBSyxjQUNMLEtBQUssY0FDTCxLQUFLLGFBQ0g7R0FDSixLQUFLLHFCQUFxQixDQUFDO0dBQzNCLEtBQUssa0JBQWtCO0dBQ3ZCLHFCQUNFLGVBQWUsT0FBTyxPQUFPLHFCQUM3QixPQUFPLGtCQUFrQixJQUFJO0VBQ2pDO0VBQ0EsU0FBUyxnQkFBZ0IsV0FBVztHQUNsQyxZQUFZLFVBQVU7R0FDdEIsT0FBTyxFQUFFLENBQUMsYUFBYSxDQUFDLFVBQVU7
15852RUFDcEM7RUFDQSxTQUFTLHFCQUFxQixTQUFTLGNBQWM7R0FDbkQsSUFBSSxpQkFBaUIsUUFBUTtHQUM3QixTQUFTLGtCQUNILGlCQUFpQixZQUNqQixRQUFRLEtBQ1IsY0FDQSxRQUFRLEtBQ1IsUUFBUSxJQUNWLEdBQ0MsZUFBZSxjQUFjLFFBQVEsYUFDckMsZUFBZSxPQUFPLFFBQVEsTUFDOUIsZUFBZSxZQUFZLFFBQVEsV0FDbkMsZUFBZSxjQUFjLFFBQVEsYUFDckMsZUFBZSxjQUFjLFFBQVEsYUFDckMsZUFBZSxhQUFhLFFBQVEsWUFDcEMsZUFBZSxrQkFBa0IsUUFBUSxpQkFDekMsZUFBZSxZQUFZLFNBQzNCLFFBQVEsWUFBWSxtQkFDbkIsZUFBZSxlQUFlLGNBQy9CLGVBQWUsT0FBTyxRQUFRLE1BQzlCLGVBQWUsUUFBUSxHQUN2QixlQUFlLGVBQWUsR0FDOUIsZUFBZSxZQUFZLE1BQzNCLGVBQWUsaUJBQWlCLElBQ2hDLGVBQWUsa0JBQWtCO0dBQ3RDLGVBQWUsUUFBUSxRQUFRLFFBQVE7R0FDdkMsZUFBZSxhQUFhLFFBQVE7R0FDcEMsZUFBZSxRQUFRLFFBQVE7R0FDL0IsZUFBZSxRQUFRLFFBQVE7R0FDL0IsZUFBZSxnQkFBZ0IsUUFBUTtHQUN2QyxlQUFlLGdCQUFnQixRQUFRO0dBQ3ZDLGVBQWUsY0FBYyxRQUFRO0dBQ3JDLGVBQWUsUUFBUTtHQUN2QixlQUFlLGVBQ2IsU0FBUyxlQUNMLE9BQ0E7SUFDRSxPQUFPLGFBQWE7SUFDcEIsY0FBYyxhQUFhO0lBQzNCLHFCQUFxQixhQUFhO0dBQ3BDO0dBQ04sZUFBZSxVQUFVLFFBQVE7R0FDakMsZUFBZSxRQUFRLFFBQVE7R0FDL0IsZUFBZSxNQUFNLFFBQVE7R0FDN0IsZUFBZSxhQUFhLFFBQVE7R0FDcEMsZUFBZSxtQkFBbUIsUUFBUTtHQUMxQyxlQUFlLG1CQUFtQixRQUFRO0dBQzFDLGVBQWUsYUFBYSxRQUFRO0dBQ3BDLGVBQWUscUJBQXFCLFF
15852BQVE7R0FDNUMsUUFBUSxlQUFlLEtBQXZCO0lBQ0UsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUssSUFDSCxlQUFlLE9BQU8sMkJBQTJCLFFBQVEsSUFBSTtHQUNqRTtHQUNBLE9BQU87RUFDVDtFQUNBLFNBQVMsb0JBQW9CLGdCQUFnQixhQUFhO0dBQ3hELGVBQWUsU0FBUztHQUN4QixJQUFJLFVBQVUsZUFBZTtHQUM3QixTQUFTLFdBQ0gsZUFBZSxhQUFhLEdBQzdCLGVBQWUsUUFBUSxhQUN2QixlQUFlLFFBQVEsTUFDdkIsZUFBZSxlQUFlLEdBQzlCLGVBQWUsZ0JBQWdCLE1BQy9CLGVBQWUsZ0JBQWdCLE1BQy9CLGVBQWUsY0FBYyxNQUM3QixlQUFlLGVBQWUsTUFDOUIsZUFBZSxZQUFZLE1BQzNCLGVBQWUsbUJBQW1CLEdBQ2xDLGVBQWUsbUJBQW1CLE1BQ2pDLGVBQWUsYUFBYSxRQUFRLFlBQ3JDLGVBQWUsUUFBUSxRQUFRLE9BQy9CLGVBQWUsUUFBUSxRQUFRLE9BQy9CLGVBQWUsZUFBZSxHQUM5QixlQUFlLFlBQVksTUFDM0IsZUFBZSxnQkFBZ0IsUUFBUSxlQUN2QyxlQUFlLGdCQUFnQixRQUFRLGVBQ3ZDLGVBQWUsY0FBYyxRQUFRLGFBQ3JDLGVBQWUsT0FBTyxRQUFRLE1BQzlCLGNBQWMsUUFBUSxjQUN0QixlQUFlLGVBQ2QsU0FBUyxjQUNMLE9BQ0E7SUFDRSxPQUFPLFlBQVk7SUFDbkIsY0FBYyxZQUFZO0lBQzFCLHFCQUFxQixZQUFZO0dBQ25DLEdBQ0wsZUFBZSxtQkFBbUIsUUFBUSxrQkFDMUMsZUFBZSxtQkFBbUIsUUFBUTtHQUMvQyxPQUFPO0VBQ1Q7RUFDQSxTQUFTLDRCQUNQLE1BQ0EsS0FDQSxjQUNBLE9BQ0EsTUFDQSxPQUNBO0dBQ0EsSUFBSSxXQUFXO0dBQ2YsSUFBSSxlQUFlLDJCQUEyQixJQUFJO0dBQ2xELElBQUksZUFBZSxPQUFPLGNBQ3hCLGdCQUFnQixZQUFZLE1BQU0sV0FBVztRQUMxQyxJQUFJLGFBQWEsT0FBTyxjQUMzQixXQUFZLGVBQWUsR0FDeEIsV0FBVyxvQkFBb0IsTUFBTSxjQUFjLFFBQVEsSUFDeEQsS0FDQSxXQUFXLFFBQVEsV0FBVyxRQUFRLFdBQVcsT0FDL0MsS0FDQTtRQUVSLEdBQUcsUUFBUSxjQUFSO0lBQ0QsS0FBSyxxQkFDSCxPQUNHLE1BQU0sWUFBWSxJQUFJLGNBQWMsS0FBSyxJQUFJLEdBQzdDLElBQUksY0FBYyxxQkFDbEIsSUFBSSxRQUFRLE9BQ2I7SUFFSixLQUFLLHFCQUNILE9BQU8sd0JBQ0wsYUFBYSxVQUNiLE1BQ0EsT0FDQSxHQUNGO0lBQ0YsS0FBSztLQUNILFdBQVc7S0FDWCxRQUFRO0tBQ1IsUUFBUTtLQUNSO0lBQ0YsS0FBSyxxQkFDSCxPQUNHLE9BQU8sY0FDUCxRQUFRLE1BQ1QsYUFBYSxPQUFPLEtBQUssTUFDdkIsUUFBUSxNQUNOLCtGQUNBLE9BQU8sS0FBSyxFQUNkLEdBQ0QsTUFBTSxZQUFZLElBQUksTUFBTSxLQUFLLFFBQVEsV0FBVyxHQUNwRCxJQUFJLGNBQWMscUJBQ2xCLElBQUksUUFBUSxPQUNaLElBQUksWUFBWTtLQUFFLGdCQUFnQjtLQUFHLHVCQUF1QjtJQUFFLEdBQy9EO0lBRUosS0FBSyxxQkFDSCxPQUNHLE1BQU0sWUFBWSxJQUFJLGNBQWMsS0FBSyxJQUFJLEdBQzdDLElBQUksY0FBYyxxQkFDbEIsSUFBSSxRQUFRLE9BQ2I7SUFFSixLQUFLLDBCQUNILE9BQ0csTUFBTSxZQUFZLElBQUksY0FBYyxLQUFLLElBQUksR0FDN0MsSUFBSSxjQUFjLDBCQUNsQixJQUFJLFFBQVEsT0FDYjtJQUVKLEtBQUs7SUFDTCxLQUFLLDRCQUNILE9BQ0csT0FBTyxPQUFPLHFCQUNkLE1BQU0sWUFBWSxJQUFJLGNBQWMsS0FBSyxJQUFJLEdBQzdDLElBQUksY0FBYyw0QkFDbEIsSUFBSSxRQUFRLE9BQ1osSUFBSSxZQUFZO0tBQ2YsVUFBVTtLQUNWLFFBQVE7S0FDUixRQUFRO0tBQ1IsS0FBSztJQUNQLEdBQ0E7SUFFSjtLQUNFLElBQUksYUFBYSxPQUFPLGdCQUFnQixTQUFTLGNBQy9DLFFBQVEsYUFBYSxVQUFyQjtNQUNFLEtBQUs7T0FDSCxXQUFXO09BQ1gsTUFBTTtNQUNSLEtBQUs7T0FDSCxXQUFXO09BQ1gsTUFBTTtNQUNSLEtBQUs7T0FDSCxXQUFXO09BQ1gsTUFBTTtNQUNSLEtBQUs7T0FDSCxXQUFXO09BQ1gsTUFBTTtNQUNSLEtBQUs7T0FDSCxXQUFXO09BQ1gsZUFBZTtPQUNmLE1BQU07S0FDVjtLQUNGLGVBQWU7S0FDZixJQUNFLEtBQUssTUFBTSxRQUNWLGFBQWEsT0FBTyxRQUNuQixTQUFTLFFBQ1QsTUFBTSxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsUUFFMUIsZ0JBQ0U7S0FDSixTQUFTLE9BQ0osZUFBZSxTQUNoQixZQUFZLElBQUksSUFDYixlQUFlLFVBQ2hCLEtBQUssTUFBTSxRQUFRLEtBQUssYUFBYSxzQkFDakMsZUFDQSxPQUNDLHlCQUF5QixLQUFLLElBQUksS0FBSyxhQUN4QyxPQUNELGVBQ0Msd0VBQ0QsZUFBZSxPQUFPO0tBQy9CLENBQUMsV0FBVyxRQUFRLDBCQUEwQixLQUFLLElBQUksVUFDcEQsZ0JBQ0MscUNBQXFDLFdBQVc7S0FDcEQsV0FBVztLQUNYLGVBQWUsTUFDYixtSUFDRyxlQUFlLE1BQU0sYUFDMUI7S0FDQSxlQUFlO0dBQ25CO0dBQ0YsTUFBTSxZQUFZLFVBQVUsY0FBYyxLQUFLLElBQUk7R0FDbkQsSUFBSSxjQUFjO0dBQ2xCLElBQUksT0FBTztHQUNYLElBQUksUUFBUTtHQUNaLElBQUksY0FBYztHQUNsQixPQUFPO0VBQ1Q7RUFDQSxTQUFTLHVCQUF1QixTQUFTLE1BQU0sT0FBTztHQUNwRCxPQUFPLDRCQUNMLFFBQVEsTUFDUixRQUFRLEtBQ1IsUUFBUSxPQUNSLFFBQVEsUUFDUixNQUNBLEtBQ0Y7R0FDQSxLQUFLLGNBQWMsUUFBUTtHQUMzQixLQUFLLGNBQWMsUUFBUTtHQUMzQixLQUFLLGFBQWEsUUFBUTtHQUMxQixPQUFPO0VBQ1Q7RUFDQSxTQUFTLHdCQUF3QixVQUFVLE1BQU0sT0FBTyxLQUFLO0dBQzNELFdBQVcsWUFBWSxHQUFHLFVBQVUsS0FBSyxJQUFJO0dBQzdDLFNBQVMsUUFBUTtHQUNqQixPQUFPO0VBQ1Q7RUFDQSxTQUFTLG9CQUFvQixTQUFTLE1BQU0sT0FBTztHQUNqRCxVQUFVLFlBQVksR0FBRyxTQUFTLE1BQU0sSUFBSTtHQUM1QyxRQUFRLFFBQVE7R0FDaEIsT0FBTztFQUNUO0VBQ0EsU0FBUyxrQ0FBa0MsZ0JBQWdCO0dBQ3pELElBQUksUUFBUSxZQUFZLElBQUksTUFBTSxNQUFNLE1BQU07R0FDOUMsTUFBTSxZQUFZO0dBQ2xCLE9BQU87RUFDVDtFQUNBLFNBQVMsc0JBQXNCLFFBQVEsTUFBTSxPQUFPO0dBQ2xELE9BQU8sWUFDTCxHQUNBLFNBQVMsT0FBTyxXQUFXLE9BQU8sV0FBVyxDQUFDLEdBQzlDLE9BQU8sS0FDUCxJQUNGO0dBQ0EsS0FBSyxRQUFRO0dBQ2IsS0FBSyxZQUFZO0lBQ2YsZUFBZSxPQUFPO0lBQ3RCLGlCQUFpQjtJQUNqQixnQkFBZ0IsT0FBTztHQUN6QjtHQUNBLE9BQU87RUFDVDtFQUNBLFNBQVMsMkJBQTJCLE9BQU8sUUFBUTtHQUNqRCxJQUFJLGFBQWEsT0FBTyxTQUFTLFNBQVMsT0FBTztJQUMvQyxJQUFJLFdBQVcsZUFBZSxJQUFJLEtBQUs7SUFDdkMsSUFBSSxLQUFLLE1BQU0sVUFBVSxPQUFPO0lBQ2hDLFNBQVM7S0FDQTtLQUNDO0tBQ1IsT0FBTyw0QkFBNEIsTUFBTTtJQUMzQztJQUNBLGVBQWUsSUFBSSxPQUFPLE1BQU07SUFDaEMsT0FBTztHQUNUO0dBQ0EsT0FBTztJQUNFO0lBQ0M7SUFDUixPQUFPL
15852DRCQUE0QixNQUFNO0dBQzNDO0VBQ0Y7RUFDQSxTQUFTLGFBQWEsZ0JBQWdCLGVBQWU7R0FDbkQsbUJBQW1CO0dBQ25CLFVBQVUsb0JBQW9CO0dBQzlCLFVBQVUsb0JBQW9CO0dBQzlCLG1CQUFtQjtHQUNuQixnQkFBZ0I7RUFDbEI7RUFDQSxTQUFTLFdBQVcsZ0JBQWdCLGVBQWUsT0FBTztHQUN4RCxtQkFBbUI7R0FDbkIsUUFBUSxrQkFBa0I7R0FDMUIsUUFBUSxrQkFBa0I7R0FDMUIsUUFBUSxrQkFBa0I7R0FDMUIsc0JBQXNCO0dBQ3RCLElBQUksdUJBQXVCO0dBQzNCLGlCQUFpQjtHQUNqQixJQUFJLGFBQWEsS0FBSyxNQUFNLG9CQUFvQixJQUFJO0dBQ3BELHdCQUF3QixFQUFFLEtBQUs7R0FDL0IsU0FBUztHQUNULElBQUksU0FBUyxLQUFLLE1BQU0sYUFBYSxJQUFJO0dBQ3pDLElBQUksS0FBSyxRQUFRO0lBQ2YsSUFBSSx1QkFBdUIsYUFBYyxhQUFhO0lBQ3RELFVBQ0Usd0JBQ0UsS0FBSyx3QkFBd0IsRUFBQSxDQUMvQixTQUFTLEVBQUU7SUFDYix5QkFBeUI7SUFDekIsY0FBYztJQUNkLGdCQUNHLEtBQU0sS0FBSyxNQUFNLGFBQWEsSUFBSSxhQUNsQyxTQUFTLGFBQ1Y7SUFDRixzQkFBc0IsU0FBUztHQUNqQyxPQUNFLGdCQUNHLEtBQUssU0FBVyxTQUFTLGFBQWMsc0JBQ3ZDLHNCQUFzQjtFQUM3QjtFQUNBLFNBQVMsdUJBQXVCLGdCQUFnQjtHQUM5QyxtQkFBbUI7R0FDbkIsU0FBUyxlQUFlLFdBQ3JCLGFBQWEsZ0JBQWdCLENBQUMsR0FBRyxXQUFXLGdCQUFnQixHQUFHLENBQUM7RUFDckU7RUFDQSxTQUFTLGVBQWUsZ0JBQWdCO0dBQ3RDLE9BQU8sbUJBQW1CLG1CQUN4QixtQkFBb0IsVUFBVSxFQUFFLGlCQUM3QixVQUFVLGtCQUFrQixNQUM1QixnQkFBZ0IsVUFBVSxFQUFFLGlCQUM1QixVQUFVLGtCQUFrQjtHQUNqQyxPQUFPLG1CQUFtQixzQkFDeEIsc0JBQXVCLFFBQVEsRUFBRSxlQUM5QixRQUFRLGdCQUFnQixNQUN4QixzQkFBc0IsUUFBUSxFQUFFLGVBQ2hDLFFBQVEsZ0JBQWdCLE1BQ3hCLGdCQUFnQixRQUFRLEVBQUUsZUFDMUIsUUFBUSxnQkFBZ0I7RUFDL0I7RUFDQSxTQUFTLDBCQUEwQjtHQUNqQyxtQkFBbUI7R0FDbkIsT0FBTyxTQUFTLHNCQUNaO0lBQUUsSUFBSTtJQUFlLFVBQVU7R0FBb0IsSUFDbkQ7RUFDTjtFQUNBLFNBQVMsNEJBQTRCLGdCQUFnQixrQkFBa0I7R0FDckUsbUJBQW1CO0dBQ25CLFFBQVEsa0JBQWtCO0dBQzFCLFFBQVEsa0JBQWtCO0dBQzFCLFFBQVEsa0JBQWtCO0dBQzFCLGdCQUFnQixpQkFBaUI7R0FDakMsc0JBQXNCLGlCQUFpQjtHQUN2QyxzQkFBc0I7RUFDeEI7RUFDQSxTQUFTLHFCQUFxQjtHQUM1QixlQUNFLFFBQVEsTUFDTix5RUFDRjtFQUNKO0VBQ0EsU0FBUyx1QkFBdUIsT0FBTyxrQkFBa0I7R0FDdkQsSUFBSSxTQUFTLE1BQU0sUUFBUTtJQUN6QixJQUFJLFNBQVMsc0JBQ1gsdUJBQXVCO0tBQ2Q7S0FDUCxVQUFVLENBQUM7S0FDWCxhQUFhLEtBQUs7S0FDbEIsWUFBWSxDQUFDO0tBQ0s7SUFDcEI7U0FDRztLQUNILElBQUkscUJBQXFCLFVBQVUsT0FDakMsTUFBTSxNQUNKLHNFQUNGO0tBQ0YscUJBQXFCLG1CQUFtQixxQkFDckMscUJBQXFCLG1CQUFtQjtJQUM3QztJQUNBLE9BQU87R0FDVDtHQUNBLElBQUksV0FBVyx1QkFDYixNQUFNLFFBQ04sbUJBQW1CLENBQ3JCLENBQUMsQ0FBQztHQUNGLElBQUksSUFBSSxTQUFTLFVBQVUsU0FBUyxTQUFTLFNBQVMsRUFBRSxDQUFDLFVBQVUsT0FDakUsT0FDRyxXQUFXLFNBQVMsU0FBUyxTQUFTLElBQ3ZDLFNBQVMsbUJBQW1CLHFCQUN6QixTQUFTLG1CQUFtQixtQkFDL0I7R0FFSixtQkFBbUI7SUFDVjtJQUNQLFVBQVUsQ0FBQztJQUNYLGFBQWEsS0FBSztJQUNsQixZQUFZLENBQUM7SUFDSztHQUNwQjtHQUNBLFNBQVMsS0FBSyxnQkFBZ0I7R0FDOUIsT0FBTztFQUNUO0VBQ0EsU0FBUyxrQkFBa0I7R0FDekIsZUFDRSxRQUFRLE1BQ04sNkVBQ0Y7RUFDSjtFQUNBLFNBQVMsd0JBQXdCLE9BQU8sbUJBQW1CO0dBQ3pELHlCQUNJLFFBQVEsdUJBQXVCLE9BQU8sQ0FBQyxHQUN4QyxNQUFNLGNBQWMsTUFDckIsU0FBUyxzQkFDTCxvQkFDQSx5Q0FBeUMsaUJBQWlCLEdBQzVELE1BQU0sV0FBVyxLQUFLLGlCQUFpQjtFQUM3QztFQUNBLFNBQVMseUJBQXlCLE9BQU87R0FDdkMsSUFBSSxXQUNBLElBQUksVUFBVSxVQUFVLEtBQUssTUFBTSxVQUFVLEtBQUssVUFBVSxLQUFLLENBQUMsR0FDcEUsT0FBTyxJQUNQLFdBQVc7R0FDYixTQUFTLGFBQ0wsdUJBQXVCLE1BQVEsT0FBTyxhQUFhLFFBQVE7R0FDL0Qsb0JBQ0UsMkJBQ0UsTUFDRSxtREFDRyxXQUFXLFNBQVMsVUFDckIsaW9CQUNBLElBQ0osR0FDQSxLQUNGLENBQ0Y7R0FDQSxNQUFNO0VBQ1I7RUFDQSxTQUFTLDZCQUE2QixPQUFPO0dBQzNDLElBQUksYUFBYSxNQUFNO0dBQ3ZCLElBQUksT0FBTyxNQUFNLE1BQ2YsUUFBUSxNQUFNO0dBQ2hCLFdBQVcsdUJBQXVCO0dBQ2xDLFdBQVcsb0JBQW9CO0dBQy9CLGdDQUFnQyxNQUFNLEtBQUs7R0FDM0MsUUFBUSxNQUFSO0lBQ0UsS0FBSztLQUNILDBCQUEwQixVQUFVLFVBQVU7S0FDOUMsMEJBQTBCLFNBQVMsVUFBVTtLQUM3QztJQUNGLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztLQUNILDBCQUEwQixRQUFRLFVBQVU7S0FDNUM7SUFDRixLQUFLO0lBQ0wsS0FBSztLQUNILEtBQUssT0FBTyxHQUFHLE9BQU8sZ0JBQWdCLFFBQVEsUUFDNUMsMEJBQTBCLGdCQUFnQixPQUFPLFVBQVU7S0FDN0Q7SUFDRixLQUFLO0tBQ0gsMEJBQTBCLFNBQVMsVUFBVTtLQUM3QztJQUNGLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztLQUNILDBCQUEwQixTQUFTLFVBQVU7S0FDN0MsMEJBQTBCLFFBQVEsVUFBVTtLQUM1QztJQUNGLEtBQUs7S0FDSCwwQkFBMEIsVUFBVSxVQUFVO0tBQzlDO0lBQ0YsS0FBSztLQUNILDBCQUEwQixTQUFTLEtBQUs7S0FDeEMsMEJBQTBCLFdBQVcsVUFBVTtLQUMvQyxtQkFBbUIsWUFBWSxLQUFLO0tBQ3BDLFVBQ0UsWUFDQSxNQUFNLE9BQ04sTUFBTSxjQUNOLE1BQU0sU0FDTixNQUFNLGdCQUNOLE1BQU0sTUFDTixNQUFNLE1BQ04sQ0FBQyxDQUNIO0tBQ0E7SUFDRixLQUFLO0tBQ0gsb0JBQW9CLFlBQVksS0FBSztLQUNyQztJQUNGLEtBQUs7S0FDSCwwQkFBMEIsVUFBVSxLQUFLO0tBQ3pDLDBCQUEwQixXQUFXLFVBQVU7S0FDL0Msb0JBQW9CLFlBQVksS0FBSztLQUNyQztJQUNGLEtBQUssWUFDSCwwQkFBMEIsWUFBWSxLQUFLLEdBQ3pDLDBCQUEwQixXQUFXLFVBQVUsR0FDL0Msc0JBQXNCLFlBQVksS0FBSyxHQUN2QyxhQUNFLFlBQ0EsTUFBTSxPQUNOLE1BQU0sY0FDTixNQUFNLFFBQ1I7R0FDTjtHQUNBLE9BQU8sTUFBTTtHQUNiLGFBQWMsT0FBTyxRQUNuQixhQU
15852FhLE9BQU8sUUFDcEIsYUFBYSxPQUFPLFFBQ3RCLFdBQVcsZ0JBQWdCLEtBQUssUUFDaEMsQ0FBQyxNQUFNLE1BQU0sNEJBQ2Isc0JBQXNCLFdBQVcsYUFBYSxJQUFJLEtBQzdDLFFBQVEsTUFBTSxZQUNaLDBCQUEwQixnQkFBZ0IsVUFBVSxHQUNyRCwwQkFBMEIsVUFBVSxVQUFVLElBQ2hELFFBQVEsTUFBTSxZQUNaLDBCQUEwQixVQUFVLFVBQVUsR0FDaEQsUUFBUSxNQUFNLGVBQ1osMEJBQTBCLGFBQWEsVUFBVSxHQUNuRCxRQUFRLE1BQU0sWUFBWSxXQUFXLFVBQVUsU0FDOUMsYUFBYSxDQUFDLEtBQ2QsYUFBYSxDQUFDO0dBQ25CLGNBQWMseUJBQXlCLE9BQU8sQ0FBQyxDQUFDO0VBQ2xEO0VBQ0EsU0FBUyxvQkFBb0IsT0FBTztHQUNsQyxLQUFLLHVCQUF1QixNQUFNLFFBQVEsdUJBQ3hDLFFBQVEscUJBQXFCLEtBQTdCO0lBQ0UsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0tBQ0gseUJBQXlCLENBQUM7S0FDMUI7SUFDRixLQUFLO0lBQ0wsS0FBSztLQUNILHlCQUF5QixDQUFDO0tBQzFCO0lBQ0YsU0FDRSx1QkFBdUIscUJBQXFCO0dBQ2hEO0VBQ0o7RUFDQSxTQUFTLGtCQUFrQixPQUFPO0dBQ2hDLElBQUksVUFBVSxzQkFBc0IsT0FBTyxDQUFDO0dBQzVDLElBQUksQ0FBQyxhQUNILE9BQU8sb0JBQW9CLEtBQUssR0FBSSxjQUFjLENBQUMsR0FBSSxDQUFDO0dBQzFELElBQUksTUFBTSxNQUFNLEtBQ2Q7R0FDRixJQUFLLGtCQUFrQixNQUFNLE9BQU8sT0FBTyxLQUFNO0lBQy9DLElBQUssa0JBQWtCLE1BQU0sS0FDM0Isa0JBQW1CLE1BQU0sTUFDdEIsa0JBQ0MsRUFBRSxXQUFXLG1CQUFtQixhQUFhLG9CQUM3QyxxQkFBcUIsTUFBTSxNQUFNLE1BQU0sYUFBYTtJQUMxRCxrQkFBa0IsQ0FBQztHQUNyQjtHQUNBLElBQUksbUJBQW1CLHdCQUF3QjtJQUM3QyxLQUFLLGtCQUFrQix3QkFBd0Isa0JBQW1CO0tBQ2hFLElBQUksV0FBVyx1QkFBdUIsT0FBTyxDQUFDLEdBQzVDLGNBQ0UseUNBQXlDLGVBQWU7S0FDNUQsU0FBUyxXQUFXLEtBQUssV0FBVztLQUNwQyxrQkFDRSxlQUFlLFlBQVksT0FDdkIsZ0RBQWdELGVBQWUsSUFDL0Qsa0JBQWtCLGdCQUFnQixXQUFXO0lBQ3JEO0lBQ0EseUJBQXlCLEtBQUs7R0FDaEM7R0FDQSxvQkFBb0IsS0FBSztHQUN6QixJQUFJLE9BQU8sS0FBSztJQUNkLFFBQVEsTUFBTTtJQUNkLFFBQVEsU0FBUyxRQUFRLE1BQU0sYUFBYTtJQUM1QyxJQUFJLENBQUMsT0FDSCxNQUFNLE1BQ0oscUhBQ0Y7SUFDRix5QkFDRSxnREFBZ0QsS0FBSztHQUN6RCxPQUFPLElBQUksT0FBTyxLQUFLO0lBQ3JCLFFBQVEsTUFBTTtJQUNkLFFBQVEsU0FBUyxRQUFRLE1BQU0sYUFBYTtJQUM1QyxJQUFJLENBQUMsT0FDSCxNQUFNLE1BQ0oscUhBQ0Y7SUFDRix5QkFDRSxnREFBZ0QsS0FBSztHQUN6RCxPQUNFLE9BQU8sT0FDRCxNQUFNLHdCQUNSLGlCQUFpQixNQUFNLElBQUksS0FDckIsUUFBUSw2Q0FDVCw4Q0FBOEMsTUFDOUMseUJBQXlCLFNBQ3pCLHlCQUF5QixPQUM3Qix5QkFBeUIsdUJBQ3RCLGtCQUFrQixNQUFNLFVBQVUsV0FBVyxJQUM3QztHQUNWLE9BQU8sQ0FBQztFQUNWO0VBQ0EsU0FBUyxzQkFBc0I7R0FDN0IseUJBQXlCLHVCQUF1QjtHQUNoRCx1QkFBdUIsY0FBYyxDQUFDO0VBQ3hDO0VBQ0EsU0FBUyxzQ0FBc0M7R0FDN0MsSUFBSSxlQUFlO0dBQ25CLFNBQVMsaUJBQ04sU0FBUyxzQ0FDTCxzQ0FBc0MsZUFDdkMsb0NBQW9DLEtBQUssTUFDdkMscUNBQ0EsWUFDRixHQUNILGtCQUFrQjtHQUNyQixPQUFPO0VBQ1Q7RUFDQSxTQUFTLG9CQUFvQixPQUFPO0dBQ2xDLFNBQVMsa0JBQ0osa0JBQWtCLENBQUMsS0FBSyxJQUN6QixnQkFBZ0IsS0FBSyxLQUFLO0VBQ2hDO0VBQ0EsU0FBUywrQkFBK0I7R0FDdEMsSUFBSSxXQUFXO0dBQ2YsSUFBSSxTQUFTLFVBQVU7SUFDckIsdUJBQXVCO0lBQ3ZCLEtBQUssSUFBSSxPQUFPLGFBQWEsUUFBUSxHQUFHLElBQUksU0FBUyxTQUFTLFNBQzVELFdBQVcsU0FBUyxTQUFTO0lBQy9CLGtCQUFrQixTQUFTLE9BQU8sV0FBWTtLQUM1QyxRQUFRLE1BQ04sc29CQUNBLDZDQUNBLElBQ0Y7SUFDRixDQUFDO0dBQ0g7RUFDRjtFQUNBLFNBQVMsMkJBQTJCO0dBQ2xDLHdCQUF3Qiw0QkFBNEI7R0FDcEQsK0JBQStCLENBQUM7RUFDbEM7RUFDQSxTQUFTLGFBQWEsZUFBZSxTQUFTLFdBQVc7R0FDdkQsS0FBSyxhQUFhLFFBQVEsZUFBZSxhQUFhO0dBQ3RELFFBQVEsZ0JBQWdCO0dBQ3hCLEtBQUssbUJBQW1CLFFBQVEsa0JBQWtCLGFBQWE7R0FDL0QsS0FBSyxNQUFNLFFBQVEsb0JBQ2pCLFNBQVMsUUFBUSxvQkFDakIsUUFBUSxxQkFBcUIsaUJBQzdCLFFBQVEsTUFDTiw4R0FDRjtHQUNGLFFBQVEsbUJBQW1CO0VBQzdCO0VBQ0EsU0FBUyxZQUFZLFNBQVMsZUFBZTtHQUMzQyxRQUFRLGdCQUFnQixZQUFZO0dBQ3BDLElBQUksa0JBQWtCLGtCQUFrQjtHQUN4QyxJQUFJLG1CQUFtQixhQUFhO0dBQ3BDLFFBQVEsbUJBQW1CO0dBQzNCLElBQUksYUFBYSxhQUFhO0VBQ2hDO0VBQ0EsU0FBUyxnQ0FDUCxRQUNBLGFBQ0EsaUJBQ0E7R0FDQSxPQUFPLFNBQVMsU0FBVTtJQUN4QixJQUFJLFlBQVksT0FBTztJQUN2QixDQUFDLE9BQU8sYUFBYSxpQkFBaUIsZUFDaEMsT0FBTyxjQUFjLGFBQ3ZCLFNBQVMsY0FBYyxVQUFVLGNBQWMsZ0JBQy9DLFNBQVMsY0FDUixVQUFVLGFBQWEsaUJBQWlCLGdCQUN4QyxVQUFVLGNBQWM7SUFDN0IsSUFBSSxXQUFXLGlCQUFpQjtJQUNoQyxTQUFTLE9BQU87R0FDbEI7R0FDQSxXQUFXLG1CQUNULFFBQVEsTUFDTiwwSUFDRjtFQUNKO0VBQ0EsU0FBUyx3QkFDUCxnQkFDQSxVQUNBLGFBQ0EsMEJBQ0E7R0FDQSxJQUFJLFFBQVEsZUFBZTtHQUMzQixTQUFTLFVBQVUsTUFBTSxTQUFTO0dBQ2xDLE9BQU8sU0FBUyxRQUFTO0lBQ3ZCLElBQUksT0FBTyxNQUFNO0lBQ2pCLElBQUksU0FBUyxNQUFNO0tBQ2pCLElBQUksWUFBWSxNQUFNO0tBQ3RCLE9BQU8sS0FBSztLQUNaLEdBQUcsT0FBTyxTQUFTLE9BQVE7TUFDekIsSUFBSSxhQUFhO01BQ2pCLE9BQU87TUFDUCxLQUFLLElBQUksSUFBSSxHQUFHLElBQUksU0FBUyxRQUFRLEtBQ25DLElBQUksV0FBVyxZQUFZLFNBQVMsSUFBSTtPQUN0QyxLQUFLLFNBQVM7T0FDZCxhQUFhLEtBQUs7T0FDbEIsU0FBUyxlQUFlLFdBQVcsU0FBUztPQUM1QyxnQ0FDRSxLQUFLLFFBQ0wsYUFDQSxjQUNGO09BQ0EsNkJBQTZCLFlBQVk7T0FDekMsTUFBTTtNQUNSO01BQ0YsT0FBTyxXQUFXO0tBQ3BCO0lBQ0YsT0FBTyxJQUFJLE9BQU8sTUFBTSxLQUFLO0tBQzNCLFlBQVksTUFBTTtLQUNsQixJQUFJLFNBQVMsV0FDWCxNQUFNLE1BQ0osa0ZBQ0Y7S0FDRixVQUFVLFNBQVM7S0FDbkIsT0FBTyxVQUFVO0tBQ2pCLFNBQVMsU0FBUyxLQUFLLFNBQVM7S0FDaEMsZ0NBQ0UsV0FDQSxhQUNBLGNBQ0Y7S0FDQSxZQUFZO0lBQ2QsT0FDRSxPQUFPLE1BQU0sT0FDYixTQUFTLE1BQU0saUJBQ2YsU0FBUyxNQUFNLGNBQWMsY0FDdkIsTUFBTSxTQUFTLGFBQ2hCLFlBQVksTUFBTSxXQUNuQixTQUFTLGNBQWMsVUFBVSxTQUFTLGNBQzFDLGdDQUNFLE1BQU0sUUFDTixhQUNBLGNBQ0YsR0FDQyxZQUFZLE1BQU0sT0FDbEIsWUFBWSxTQUFTLFlBQVksVUFBVSxVQUFVLFFBQ3JELFlBQVksTUFBTTtJQUN6QixJQUFJLFNBQVMsV0FBVyxVQUFVLFNBQVM7U0FFekMsS0FBSyxZQUFZLE9BQU8sU0FBUyxZQUFhO0tBQzVDLElBQUksY0FBYyxnQkFBZ0I7TUFDaEMsWUFBWTtNQUNaO0tBQ0Y7S0FDQSxRQUFRLFVBQVU7S0FDbEIsSUFBSSxTQUFTLE9BQU87TUFDbEIsTUFBTSxTQUFTLFVBQVU7TUFDekIsWUFBWTtNQUNaO0tBQ0Y7S0FDQSxZQUFZLFVBQVU7SUFDeEI7SUFDRixRQUFRO0dBQ1Y7RUFDRjtFQUNBLFNBQVMsOEJBQ1AsU0FDQSxnQkFDQSxhQUNBLDBCQUNBO0dBQ0EsVUFBVTtHQUNWLEtBQ0UsSUFBSSxTQUFTLGdCQUFnQiw2QkFBNkIsQ0FBQyxHQUMzRCxTQUFTLFNBRVQ7SUFDQSxJQUFJLENBQUMsNEJBQ0g7S0FBSSxJQUFBLE9BQU8sT0FBTyxRQUFRLFNBQVMsNkJBQTZCLENBQUM7VUFDNUQsSUFBSSxPQUFPLE9BQU8sUUFBUSxTQUFTO0lBQUs7SUFDL0MsSUFBSSxPQUFPLE9BQU8sS0FBSztLQUNyQixJQUFJLGdCQUFnQixPQUFPO0tBQzNCLElBQUksU0FBUyxlQUNYLE1BQU0sTUFBTSxzREFBc0Q7S0FDcEUsZ0JBQWdCLGNBQWM7S0FDOUIsSUFBSSxTQUFTLGVBQWU7TUFDMUIsSUFBSSxVQUFVLE9BQU87TUFDckIsU0FBUyxPQUFPLGFBQWEsT0FBTyxjQUFjLEtBQUssTUFDcEQsU0FBUyxVQUNOLFFBQVEsS0FBSyxPQUFPLElBQ25CLFVBQVUsQ0FBQyxPQUFPO0tBQzNCO0lBQ0YsT0FBTyxJQUFJLFdBQVcsNkJBQTZCLFNBQVM7S0FDMUQsZ0JBQWdCLE9BQU87S0FDdkIsSUFBSSxTQUFTLGVBQ1gsTUFBTSxNQUFNLHNEQUFzRDtLQUNwRSxjQUFjLGNBQWMsa0JBQzFCLE9BQU8sY0FBYyxrQkFDcEIsU0FBUyxVQUNOLFFBQVEsS0FBSyxxQkFBcUIsSUFDakMsVUFBVSxDQUFDLHFCQUFxQjtJQUN6QztJQUNBLFNBQVMsT0FBTztHQUNsQjtHQUNBLFNBQVMsV0FDUCx3QkFDRSxnQkFDQSxTQUNBLGFBQ0Esd0JBQ0Y7R0FDRixlQUFlLFNBQVM7R0FDeEIsT0FBTyxTQUFTO0VBQ2xCO0VBQ0EsU0FBUyxzQkFBc0IscUJBQXFCO0dBQ2xELEtBQ0Usc0JBQXNCLG9CQUFvQixjQUMxQyxTQUFTLHNCQUVUO0lBQ0EsSUFDRSxDQUFDLFNBQ0Msb0JBQW9CLFFBQVEsZUFDNUIsb0JBQW9CLGFBQ3RCLEdBRUEsT0FBTyxDQUFDO0lBQ1Ysc0JBQXNCLG9CQUFvQjtHQUM1QztHQUNBLE9BQU8sQ0FBQztFQUNWO0VBQ0EsU0FBUyxxQkFBcUIsZ0JBQWdCO0dBQzVDLDRCQUE0QjtHQUM1Qix3QkFBd0I7R0FDeEIsaUJBQWlCLGVBQWU7R0FDaEMsU0FBUyxtQkFBbUIsZUFBZSxlQUFlO0VBQzVEO0VBQ0EsU0FBUyxZQUFZLFNBQVM7R0FDNUIsZ0NBQ0UsUUFBUSxNQUNOLDhQQUNGO0dBQ0YsT0FBTyx1QkFBdUIsMkJBQTJCLE9BQU87RUFDbEU7RUFDQSxTQUFTLGdDQUFnQyxVQUFVLFNBQVM7R0FDMUQsU0FBUyw2QkFBNkIscUJBQXFCLFF
15852BQVE7R0FDbkUsT0FBTyx1QkFBdUIsVUFBVSxPQUFPO0VBQ2pEO0VBQ0EsU0FBUyx1QkFBdUIsVUFBVSxTQUFTO0dBQ2pELElBQUksUUFBUSxRQUFRO0dBQ3BCLFVBQVU7SUFBVztJQUFTLGVBQWU7SUFBTyxNQUFNO0dBQUs7R0FDL0QsSUFBSSxTQUFTLHVCQUF1QjtJQUNsQyxJQUFJLFNBQVMsVUFDWCxNQUFNLE1BQ0osOFBBQ0Y7SUFDRix3QkFBd0I7SUFDeEIsU0FBUyxlQUFlO0tBQ3RCLE9BQU87S0FDUCxjQUFjO0tBQ2QscUJBQXFCO0lBQ3ZCO0lBQ0EsU0FBUyxTQUFTO0dBQ3BCLE9BQU8sd0JBQXdCLHNCQUFzQixPQUFPO0dBQzVELE9BQU87RUFDVDtFQUNBLFNBQVMsY0FBYztHQUNyQixPQUFPO0lBQ0wsWUFBWSxJQUFJLHFCQUFxQjtJQUNyQyxzQkFBTSxJQUFJLElBQUk7SUFDZCxVQUFVO0dBQ1o7RUFDRjtFQUNBLFNBQVMsWUFBWSxPQUFPO0dBQzFCLE1BQU0sV0FBVyxPQUFPLFdBQ3RCLFFBQVEsS0FDTixpR0FDRjtHQUNGLE1BQU07RUFDUjtFQUNBLFNBQVMsYUFBYSxPQUFPO0dBQzNCLE1BQU07R0FDTixJQUFJLE1BQU0sWUFDUixRQUFRLEtBQ04saUdBQ0Y7R0FDRixNQUFNLE1BQU0sWUFDVixtQkFBbUIsZ0JBQWdCLFdBQVk7SUFDN0MsTUFBTSxXQUFXLE1BQU07R0FDekIsQ0FBQztFQUNMO0VBQ0EsU0FBUyxxQkFBcUIsTUFBTSxpQkFBaUI7R0FDbkQsSUFBSSxPQUFPLEtBQUssZUFBZSxVQUFVO0lBQ3ZDLElBQUksU0FBUyxLQUFLO0lBQ2xCLFNBQVMsV0FBVyxTQUFTLEtBQUssa0JBQWtCLENBQUM7SUFDckQsS0FBSyxPQUFPLEdBQUcsT0FBTyxnQkFBZ0IsUUFBUSxRQUFRO0tBQ3BELElBQUksaUJBQWlCLGdCQUFnQjtLQUNyQyxPQUFPLE9BQU8sUUFBUSxjQUFjLEtBQUssT0FBTyxLQUFLLGNBQWM7SUFDckU7R0FDRjtFQUNGO0VBQ0EsU0FBUywyQkFBMkIsTUFBTTtHQUN4QyxJQUFJLFVBQVUsS0FBSztHQUNuQixLQUFLLGtCQUFrQjtHQUN2QixPQUFPO0VBQ1Q7RUFDQSxTQUFTLHVCQUF1QixNQUFNLFFBQVEsT0FBTztHQUNuRCxJQUFJLE9BQU8sT0FBTyxNQUNoQixJQUFJLHVCQUNBLHFCQUFxQixJQUFJLEdBQzFCLHFCQUFxQixXQUFXLE1BQU0sR0FDdEMsMkJBQTJCLFFBQzVCLFFBQVEsVUFDTCw4QkFBOEIsMEJBQTBCLEtBQUssS0FDL0Qsb0JBQW9CLGdCQUFnQixvQkFBb0IsY0FDckQsK0JBQStCLENBQUMsR0FDakMscUJBQXFCLGlCQUN2QixPQUFPLHNCQUFzQixHQUM3QixTQUFTLGlCQUFpQixHQUMzQixTQUFTLDJCQUEyQixXQUFXLG9CQUMxQywwQkFBMEIsT0FDM0IsU0FBUyxXQUFXLHFCQUFxQixpQkFDNUMsb0JBQW9CLE1BQ3BCLG9CQUFvQjtRQUNwQixJQUNILE9BQU8sT0FBTyxZQUNkLElBQUkseUJBQ0YsdUJBQXVCLElBQUksR0FDNUIsdUJBQXVCLFdBQVcsTUFBTSxHQUN4Qyw2QkFBNkIsUUFDOUIsUUFBUSxVQUNMLGdDQUFnQywwQkFBMEIsS0FBSyxJQUNsRSxJQUFJLHNCQUNKO0lBQ0EsT0FBTyxzQkFBc0I7SUFDN0IsU0FBUyxpQkFBaUI7SUFDMUIsSUFDRSxTQUFTLDZCQUNULFdBQVcscUJBRVgsNEJBQTRCO0lBQzlCLHNCQUFzQjtJQUN0QixzQkFBc0I7R0FDeEI7RUFDRjtFQUNBLFNBQVMscUJBQXFCLE9BQU87R0FDbkMsSUFBSSxJQUFJLG9CQUFvQjtJQUMxQixxQkFBcUIsSUFBSTtJQUN6QixxQkFBcUIsUUFBUSxNQUFNLGFBQWEsTUFBTSxhQUFhO0lBQ25FLENBQUMsb0JBQW9CLGdCQUFnQixvQkFBb0IsY0FDdEQscUJBQXFCO0lBQ3hCLElBQUksZUFBZSxzQkFBc0IsR0FDdkMsZUFBZSxpQkFBaUI7SUFDbEMsaUJBQWlCLDJCQUNqQixpQkFBaUIsb0JBQ1osMEJBQTBCLE9BQzNCLFNBQVMsaUJBQWlCLHFCQUFxQjtJQUNuRCxvQkFBb0I7SUFDcEIsb0JBQW9CO0dBQ3RCO0dBQ0EsSUFDRSxJQUFJLHlCQUNGLHVCQUF1QixJQUFJLEdBQzVCLHVCQUNDLFFBQVEsTUFBTSxhQUFhLE1BQU0sYUFBYSxNQUNoRCxJQUFJLHNCQUNKO0lBQ0EsUUFBUSxzQkFBc0I7SUFDOUIsZUFBZSxpQkFBaUI7SUFDaEMsSUFDRSxVQUFVLDZCQUNWLGlCQUFpQixxQkFFakIsNEJBQTRCO0lBQzlCLHNCQUFzQjtJQUN0QixzQkFBc0I7R0FDeEI7RUFDRjtFQUNBLFNBQVMsNEJBQTRCO0dBQ25DLElBQUkscUJBQXFCO0dBQ3pCLHlCQUF5QjtHQUN6QixPQUFPO0VBQ1Q7RUFDQSxTQUFTLHlCQUF5QixvQkFBb0I7R0FDcEQsSUFBSSxjQUFjO0dBQ2xCLHlCQUF5QjtHQUN6QixPQUFPO0VBQ1Q7RUFDQSxTQUFTLDRCQUE0QixvQkFBb0I7R0FDdkQsSUFBSSxjQUFjO0dBQ2xCLDBCQUEwQjtHQUMxQixPQUFPO0VBQ1Q7RUFDQSxTQUFTLDZCQUE2QjtHQUNwQyx5QkFBeUIsMkJBQTJCO0VBQ3REO0VBQ0EsU0FBUywyQkFBMkI7R0FDbEMsSUFBSSxrQkFBa0I7R0FDdEIsMkJBQTJCO0dBQzNCLE9BQU87RUFDVDtFQUNBLFNBQVMsd0JBQXdCLGlCQUFpQjtHQUNoRCxLQUFLLG9CQUFvQiwyQkFBMkI7RUFDdEQ7RUFDQSxTQUFTLDhCQUE4QjtHQUNyQyxJQUFJLHFCQUFxQjtHQUN6QiwwQkFBMEI7R0FDMUIsT0FBTztFQUNUO0VBQ0EsU0FBUywyQkFBMkIsb0JBQW9CO0dBQ3RELEtBQUssdUJBQXVCLDBCQUEwQjtFQUN4RDtFQUNBLFNBQVMsNEJBQTRCO0dBQ25DLElBQUksYUFBYTtHQUNqQix3QkFBd0I7R0FDeEIsT0FBTztFQUNUO0VBQ0EsU0FBUyxvQ0FBb0M7R0FDM0MsSUFBSSxPQUFPO0dBQ1gsK0JBQStCLENBQUM7R0FDaEMsT0FBTztFQUNUO0VBQ0EsU0FBUyxtQkFBbUIsT0FBTztHQUNqQyxvQkFBb0IsSUFBSTtHQUN4QixJQUFJLE1BQU0sb0JBQW9CLE1BQU0sa0JBQWtCO0VBQ3hEO0VBQ0EsU0FBUyw0Q0FBNEMsT0FBTztHQUMxRCxJQUFJLEtBQUssbUJBQW1CO0lBQzFCLElBQUksY0FBYyxJQUFJLElBQUk7SUFDMUIsTUFBTSxrQkFBa0I7SUFDeEIsTUFBTSxtQkFBbUI7SUFDekIsb0JBQW9CO0dBQ3RCO0VBQ0Y7RUFDQSxTQUFTLHNEQUFzRCxPQUFPO0dBQ3BFLElBQUksS0FBSyxtQkFBbUI7SUFDMUIsSUFBSSxjQUFjLElBQUksSUFBSTtJQUMxQixNQUFNLGtCQUFrQjtJQUN4QixvQkFBb0I7R0FDdEI7RUFDRjtFQUNBLFNBQVMsdUJBQXVCO0dBQzlCLElBQUksS0FBSyxtQkFBbUI7SUFDMUIsSUFBSSxVQUFVLElBQUksR0FDaEIsY0FBYyxVQUFVO0lBQzFCLG9CQUFvQjtJQUNwQiwwQkFBMEI7SUFDMUIsMkJBQTJCO0lBQzNCLHlCQUF5QjtHQUMzQjtFQUNGO0VBQ0EsU0FBUyxrQkFBa0IsV0FBVztHQUNwQyxTQUFTLDBCQUEwQix3QkFBd0IsQ0FBQztHQUM1RCxzQkFBc0IsS0FBSyxTQUFTO0dBQ3BDLFNBQVMsaUJBQWlCLGVBQWUsQ0FBQztHQUMxQyxhQUFhLEtB
15852QUssU0FBUztFQUM3QjtFQUNBLFNBQVMsbUJBQW1CO0dBQzFCLG9CQUFvQixJQUFJO0dBQ3hCLElBQUksNkJBQ0QsMkJBQTJCO0VBQ2hDO0VBQ0EsU0FBUyx1QkFBdUIsT0FBTztHQUNyQyxLQUFLLElBQUksUUFBUSxNQUFNLE9BQU8sUUFDNUIsTUFBTyxrQkFBa0IsTUFBTSxnQkFBa0IsUUFBUSxNQUFNO0VBQ25FO0VBQ0EsU0FBUyxvQkFBb0IsWUFBWSxVQUFVO0dBQ2pELElBQUksU0FBUywyQkFBMkI7SUFDdEMsSUFBSSxxQkFBc0IsNEJBQTRCLENBQUM7SUFDdkQsK0JBQStCO0lBQy9CLHVCQUF1QixzQkFBc0I7SUFDN0MsaUNBQWlDO0tBQy9CLFFBQVE7S0FDUixPQUFPLEtBQUs7S0FDWixNQUFNLFNBQVUsU0FBUztNQUN2QixtQkFBbUIsS0FBSyxPQUFPO0tBQ2pDO0lBQ0Y7R0FDRjtHQUNBO0dBQ0EsU0FBUyxLQUFLLDJCQUEyQix5QkFBeUI7R0FDbEUsT0FBTztFQUNUO0VBQ0EsU0FBUyw0QkFBNEI7R0FDbkMsSUFDRSxNQUFNLEVBQUUsaUNBQ1AsS0FBSyx5QkFBeUIsc0JBQXNCLE9BQ3BELDJCQUEyQixNQUM1QixTQUFTLDRCQUNUO0lBQ0EsU0FBUyxtQ0FDTiwrQkFBK0IsU0FBUztJQUMzQyxJQUFJLFlBQVk7SUFDaEIsNEJBQTRCO0lBQzVCLHVCQUF1QjtJQUN2QixpQ0FBaUM7SUFDakMsS0FBSyxJQUFJLElBQUksR0FBRyxJQUFJLFVBQVUsUUFBUSxLQUFLLENBQUMsR0FBRyxVQUFVLEdBQUEsQ0FBSTtHQUMvRDtFQUNGO0VBQ0EsU0FBUyxtQkFBbUIsVUFBVSxRQUFRO0dBQzVDLElBQUksWUFBWSxDQUFDLEdBQ2YsdUJBQXVCO0lBQ3JCLFFBQVE7SUFDUixPQUFPO0lBQ1AsUUFBUTtJQUNSLE1BQU0sU0FBVSxTQUFTO0tBQ3ZCLFVBQVUsS0FBSyxPQUFPO0lBQ3hCO0dBQ0Y7R0FDRixTQUFTLEtBQ1AsV0FBWTtJQUNWLHFCQUFxQixTQUFTO0lBQzlCLHFCQUFxQixRQUFRO0lBQzdCLEtBQUssSUFBSSxJQUFJLEdBQUcsSUFBSSxVQUFVLFFBQVEsS0FBSyxDQUFDLEdBQUcsVUFBVSxHQUFBLENBQUksTUFBTTtHQUNyRSxHQUNBLFNBQVUsT0FBTztJQUNmLHFCQUFxQixTQUFTO0lBQzlCLHFCQUFxQixTQUFTO0lBQzlCLEtBQUssUUFBUSxHQUFHLFFBQVEsVUFBVSxRQUFRLFNBQ3hDLENBQUMsR0FBRyxVQUFVLE9BQUEsQ0FBUSxLQUFLLENBQUM7R0FDaEMsQ0FDRjtHQUNBLE9BQU87RUFDVDtFQUNBLFNBQVMsb0JBQW9CO0dBQzNCLElBQUksaUNBQWlDLGFBQWE7R0FDbEQsT0FBTyxTQUFTLGlDQUNaLGlDQUNBLG1CQUFtQjtFQUN6QjtFQUNBLFNBQVMsZUFBZSx5QkFBeUIsZUFBZTtHQUM5RCxTQUFTLGdCQUNMLEtBQUssY0FBYyxhQUFhLFNBQVMsdUJBQXVCLElBQ2hFLEtBQUssY0FBYyxjQUFjLE1BQU0sdUJBQXVCO0VBQ3BFO0VBQ0EsU0FBUyxvQkFBb0I7R0FDM0IsSUFBSSxnQkFBZ0Isa0JBQWtCO0dBQ3RDLE9BQU8sU0FBUyxnQkFDWixPQUNBO0lBQUUsUUFBUSxhQUFhO0lBQWUsTUFBTTtHQUFjO0VBQ2hFO0VBQ0EsU0FBUyxzQkFBc0I7R0FDN0IsT0FBTztJQUFFLDZCQUE2QixDQUFDO0lBQUcsV0FBVyxDQUFDO0dBQUU7RUFDMUQ7RUFDQSxTQUFTLG1CQUFtQixVQUFVO0dBQ3BDLFdBQVcsU0FBUztHQUNwQixPQUFPLGdCQUFnQixZQUFZLGVBQWU7RUFDcEQ7RUFDQSxTQUFTLGtCQUFrQixlQUFlLFVBQVUsT0FBTyxPQUFPO0dBQ2hFLFNBQVMscUJBQXFCLGFBQzNCLHFCQUFxQixnQkFBZ0IsQ0FBQztHQUN6QyxJQUFJLG1CQUFtQixjQUFjO0dBQ3JDLFFBQVEsaUJBQWlCO0dBQ3pCLEtBQUssTUFBTSxRQUNQLGlCQUFpQixLQUFLLFFBQVEsSUFDOUIsVUFBVSxhQUNULGNBQWMsZ0NBQ1gsY0FBYyw4QkFBOEIsQ0FBQyxHQUMvQyxRQUFRLE1BQ04sb0xBQ0YsSUFDRixTQUFTLEtBQUssUUFBUSxNQUFNLEdBQzNCLFdBQVc7R0FDaEIsSUFBSSxLQUFLLE1BQU0sU0FBUyxZQUFZO0lBQ2xDLGdCQUFnQixZQUFZLElBQUk7SUFDaEMsbUJBQW1CLFNBQVM7SUFDNUIsSUFBSSxTQUFTO0tBQ1gsTUFDRSxhQUFhLE9BQU8sbUJBQW1CLG1CQUFtQjtLQUM1RCxPQUFPO0tBQ1AsS0FBSztLQUNMLE9BQU87SUFDVDtJQUNBLFNBQVMsYUFBYSxDQUFDLEVBQUUsU0FBUyxPQUFPLENBQUM7SUFDMUMsZ0JBQWdCLFNBQVMsVUFDdkIsZUFBZSxTQUFTLFdBQ3RCLGdCQUFnQixXQUFZO0tBQzVCLE9BQU8sTUFBTSxZQUFZLElBQUk7SUFDL0IsR0FDQSxTQUFTLEtBQUssZUFBZSxhQUFhO0dBQzlDO0dBQ0EsUUFBUSxTQUFTLFFBQWpCO0lBQ0UsS0FBSyxhQUNILE9BQU8sU0FBUztJQUNsQixLQUFLO0tBQ0gsUUFBUSxTQUFTO0tBQ2pCLDhCQUE4QixLQUFLO0tBQ25DLElBQUksS0FBSyxNQUFNLFNBQVMsRUFBRSxZQUFZLFdBQ3BDLE1BQU0sTUFDSixtU0FDRjtLQUNGLE1BQU07SUFDUjtLQUNFLElBQUksYUFBYSxPQUFPLFNBQVMsUUFDL0IsU0FBUyxLQUFLLFFBQVEsTUFBTTtVQUN6QjtNQUNILGdCQUFnQjtNQUNoQixJQUNFLFNBQVMsaUJBQ1QsTUFBTSxjQUFjLHFCQUVwQixNQUFNLE1BQ0osZ09BQ0Y7TUFDRixnQkFBZ0I7TUFDaEIsY0FBYyxTQUFTO01BQ3ZCLGNBQWMsS0FDWixTQUFVLGdCQUFnQjtPQUN4QixJQUFJLGNBQWMsU0FBUyxRQUFRO1FBQ2pDLElBQUksb0JBQW9CO1FBQ3hCLGtCQUFrQixTQUFTO1FBQzNCLGtCQUFrQixRQUFRO09BQzVCO01BQ0YsR0FDQSxTQUFVLE9BQU87T0FDZixJQUFJLGNBQWMsU0FBUyxRQUFRO1FBQ2pDLElBQUksbUJBQW1CO1FBQ3ZCLGlCQUFpQixTQUFTO1FBQzFCLGlCQUFpQixTQUFTO09BQzVCO01BQ0YsQ0FDRjtLQUNGO0tBQ0EsUUFBUSxTQUFTLFFBQWpCO01BQ0UsS0FBSyxhQUNILE9BQU8sU0FBUztNQUNsQixLQUFLLFlBQ0gsTUFDSSxRQUFRLFNBQVMsUUFDbkIsOEJBQThCLEtBQUssR0FDbkM7S0FFTjtLQUNBLG9CQUFvQjtLQUNwQixtQ0FBbUMsQ0FBQztLQUNwQyxzQkFDRSxTQUFTLFNBQ1QsU0FBUyxNQUFNLGNBQ2IscUJBQXFCLE9BQ3RCLHFCQUFxQixNQUNwQiw0TUFDRjtLQUNGLE1BQU07R0FDVjtFQUNGO0VBQ0EsU0FBUyxZQUFZLFVBQVU7R0FDN0IsSUFBSTtJQUNGLE9BQU8sa0JBQWtCLFFBQVE7R0FDbkMsU0FBUyxHQUFHO0lBQ1YsSUFBSSxTQUFTLEtBQUssYUFBYSxPQUFPLEtBQUssZUFBZSxPQUFPLEVBQUUsTUFDakUsTUFDSSxvQkFBb0IsR0FDckIsbUNBQW1DLENBQUMsR0FDckM7SUFFSixNQUFNO0dBQ1I7RUFDRjtFQUNBLFNBQVMsdUJBQXVCO0dBQzlCLElBQUksU0FBUyxtQkFDWCxNQUFNLE1BQ0osOEVBQ0Y7R0FDRixJQUFJLFdBQVc7R0FDZixvQkFBb0I7R0FDcEIsbUNBQW1DLENBQUM7R0FDcEMsT0FBTztFQUNUO0VBQ0EsU0FBUyw4QkFBOEIsZ0JBQWdCO0dBQ3JELElBQ0UsbUJBQW1CLHFCQUNuQixtQkFBbUIseUJBRW5CLE1BQU0sTUFDSiw2S0FDRjtFQUNKO0VBQ0EsU0FBUyxlQUFlLEdBQUcsR0FBRztHQUM1QixPQUFPLE1BQU0sSUFDVCxDQUFDLElBQ0QsRUFBRSxRQUFRLEVBQUUsT0FDVixFQUFFLFNBQVMsRUFBRSxRQUNiLEVBQUUsUUFBUSxFQUFFLE9BQ1osRUFBRSxVQUFVLEVBQUUsU0FDYixNQUFNLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUNsQyxTQUFTLEVBQUUsVUFDWCxTQUFTLEVBQUUsU0FDWCxDQUFDLElBQ0QsZUFBZSxFQUFFLFFBQVEsRUFBRSxNQUFNO0VBQ3pDO0VBQ0EsU0FBUyxjQUFjLFdBQVc7R0FDaEMsSUFBSSxvQkFBb0I7R0FDeEIsUUFBUSxjQUNMLG1CQUNDLFNBQVMsb0JBQ0wsWUFDQSxrQkFBa0IsT0FBTyxTQUFTO0dBQzFDLE9BQU87RUFDVDtFQUNBLFNBQVMsc0JBQXNCO0dBQzdCLElBQUksWUFBWTtHQUNoQixJQUFJLFFBQVEsV0FDTDtTQUFBLElBQUksSUFBSSxVQUFVLFNBQVMsR0FBRyxLQUFLLEdBQUcsS0FDek
15852MsSUFBSSxRQUFRLFVBQVUsRUFBRSxDQUFDLE1BQU07S0FDN0IsSUFBSSxZQUFZLFVBQVUsRUFBRSxDQUFDO0tBQzdCLElBQUksUUFBUSxXQUFXLE9BQU87SUFDaEM7O0dBQ0osT0FBTztFQUNUO0VBQ0EsU0FBUyxzQkFBc0IsU0FBUyxPQUFPLGFBQWE7R0FDMUQsS0FBSyxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsS0FBSyxHQUFHLElBQUksR0FBRyxJQUFJLEtBQUssUUFBUSxLQUFLO0lBQ3ZFLElBQUksTUFBTSxLQUFLO0lBQ2YsSUFBSSxlQUFlLE9BQU8sVUFBVSxPQUFPLFVBQVUsS0FBSztLQUN4RCxTQUFTLFVBQ0wsUUFBUSx1QkFBdUIsU0FBUyxZQUFZLE1BQU0sQ0FBQyxHQUM1RCxNQUFNLGFBQWEsa0JBQ25CLE1BQU0sU0FBUztLQUNsQixrQkFDRSxPQUNBLFNBQVUsWUFBWTtNQUNwQixRQUFRLE1BQ04sb0hBQ0EsVUFDRjtLQUNGLEdBQ0EsR0FDRjtLQUNBO0lBQ0Y7R0FDRjtFQUNGO0VBQ0EsU0FBUyxlQUFlLFVBQVU7R0FDaEMsSUFBSSxRQUFRO0dBQ1osMEJBQTBCO0dBQzFCLFNBQVMsb0JBQW9CLGtCQUFrQixvQkFBb0I7R0FDbkUsT0FBTyxrQkFBa0IsaUJBQWlCLFVBQVUsT0FBTyxJQUFJO0VBQ2pFO0VBQ0EsU0FBUyxVQUFVLGdCQUFnQixTQUFTO0dBQzFDLFVBQVUsUUFBUSxNQUFNO0dBQ3hCLGVBQWUsTUFBTSxLQUFLLE1BQU0sVUFBVSxVQUFVO0VBQ3REO0VBQ0EsU0FBUyw2QkFBNkIsYUFBYSxVQUFVO0dBQzNELElBQUksU0FBUyxhQUFhLDJCQUN4QixNQUFNLE1BQ0osNFNBQ0Y7R0FDRixjQUFjLE9BQU8sVUFBVSxTQUFTLEtBQUssUUFBUTtHQUNyRCxNQUFNLE1BQ0oscURBQ0csc0JBQXNCLGNBQ25CLHVCQUF1QixPQUFPLEtBQUssUUFBUSxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksTUFDMUQsZUFDSiwyRUFDSjtFQUNGO0VBQ0EsU0FBUyx5QkFBeUIsYUFBYSxVQUFVO0dBQ3ZELElBQUksWUFBWSxvQkFBb0I7R0FDcEMsU0FBUyxZQUNMLFVBQVUsSUFDUiw2QkFBNkIsS0FBSyxNQUFNLGFBQWEsUUFBUSxDQUMvRCxJQUNBLDZCQUE2QixhQUFhLFFBQVE7RUFDeEQ7RUFDQSxTQUFTLHVCQUF1QixhQUFhLGNBQWM7R0FDekQsSUFBSSxhQUFhLDBCQUEwQixXQUFXLEtBQUs7R0FDM0QsNEJBQTRCLGdCQUN4Qiw0QkFBNEIsY0FBYyxDQUFDLEdBQzVDLGVBQ0MsYUFBYSxlQUFlLGFBQWEsUUFBUSxhQUNuRCxNQUFNLFlBQVksTUFDZCxRQUFRLE1BQ04sZ01BQ0EsY0FDQSxjQUNBLFlBQ0YsSUFDQSxRQUFRLE1BQ04sOExBQ0EsY0FDQSxjQUNBLFlBQ0EsY0FDQSxVQUNGO0VBQ1I7RUFDQSxTQUFTLG1CQUFtQixhQUFhLGNBQWM7R0FDckQsSUFBSSxZQUFZLG9CQUFvQjtHQUNwQyxTQUFTLFlBQ0wsVUFBVSxJQUNSLHVCQUF1QixLQUFLLE1BQU0sYUFBYSxZQUFZLENBQzdELElBQ0EsdUJBQXVCLGFBQWEsWUFBWTtFQUN0RDtFQUNBLFNBQVMscUJBQXFCLGFBQWEsY0FBYztHQUN2RCxJQUFJLGFBQWEsMEJBQTBCLFdBQVcsS0FBSztHQUMzRCwwQkFBMEIsZ0JBQ3RCLDBCQUEwQixjQUFjLENBQUMsR0FDMUMsZUFBZSxPQUFPLFlBQVksR0FDbkMsTUFBTSxZQUFZLE1BQ2QsUUFBUSxNQUNOLDhEQUNBLFlBQ0YsSUFDQSxRQUFRLE1BQ04sMERBQ0EsWUFDQSxjQUNBLFVBQ0Y7RUFDUjtFQUNBLFNBQVMsaUJBQWlCLGFBQWEsY0FBYztHQUNuRCxJQUFJLFlBQVksb0JBQW9CO0dBQ3BDLFNBQVMsWUFDTCxVQUFVLElBQ1IscUJBQXFCLEtBQUssTUFBTSxhQUFhLFlBQVksQ0FDM0QsSUFDQSxxQkFBcUIsYUFBYSxZQUFZO0VBQ3BEO0VBQ0EsU0FBUyxzQkFBc0Isd0JBQXdCO0dBQ3JELFNBQVMsWUFBWSxhQUFhLGVBQWU7SUFDL0MsSUFBSSx3QkFBd0I7S0FDMUIsSUFBSSxZQUFZLFlBQVk7S0FDNUIsU0FBUyxhQUNILFlBQVksWUFBWSxDQUFDLGFBQWEsR0FDdkMsWUFBWSxTQUFTLE1BQ3RCLFVBQVUsS0FBSyxhQUFhO0lBQ2xDO0dBQ0Y7R0FDQSxTQUFTLHdCQUF3QixhQUFhLG1CQUFtQjtJQUMvRCxJQUFJLENBQUMsd0JBQXdCLE9BQU87SUFDcEMsT0FBTyxTQUFTLG9CQUNkLFlBQVksYUFBYSxpQkFBaUIsR0FDdkMsb0JBQW9CLGtCQUFrQjtJQUMzQyxPQUFPO0dBQ1Q7R0FDQSxTQUFTLHFCQUFxQixtQkFBbUI7SUFDL0MsS0FBSyxJQUFJLG1DQUFtQixJQUFJLElBQUksR0FBRyxTQUFTLG9CQUM5QyxTQUFTLGtCQUFrQixNQUN2QixpQkFBaUIsSUFBSSxrQkFBa0IsT0FBTyxpQkFBaUIsSUFDL0QsaUJBQWlCLElBQUksa0JBQWtCLEtBQUssaUJBQWlCLEdBQzlELG9CQUFvQixrQkFBa0I7SUFDM0MsT0FBTztHQUNUO0dBQ0EsU0FBUyxTQUFTLE9BQU8sY0FBYztJQUNyQyxRQUFRLHFCQUFxQixPQUFPLFlBQVk7SUFDaEQsTUFBTSxRQUFRO0lBQ2QsTUFBTSxVQUFVO0lBQ2hCLE9BQU87R0FDVDtHQUNBLFNBQVMsV0FBVyxVQUFVLGlCQUFpQixVQUFVO0lBQ3ZELFNBQVMsUUFBUTtJQUNqQixJQUFJLENBQUMsd0JBQ0gsT0FBUSxTQUFTLFNBQVMsU0FBVTtJQUN0QyxXQUFXLFNBQVM7SUFDcEIsSUFBSSxTQUFTLFVBQ1gsT0FDRyxXQUFXLFNBQVMsT0FDckIsV0FBVyxtQkFDTCxTQUFTLFNBQVMsR0FBSSxtQkFDeEI7SUFFUixTQUFTLFNBQVM7SUFDbEIsT0FBTztHQUNUO0dBQ0EsU0FBUyxpQkFBaUIsVUFBVTtJQUNsQywwQkFDRSxTQUFTLFNBQVMsY0FDakIsU0FBUyxTQUFTO0lBQ3JCLE9BQU87R0FDVDtHQUNBLFNBQVMsZUFBZSxhQUFhLFNBQVMsYUFBYSxPQUFPO0lBQ2hFLElBQUksU0FBUyxXQUFXLE1BQU0sUUFBUSxLQUNwQyxPQUNHLFVBQVUsb0JBQ1QsYUFDQSxZQUFZLE1BQ1osS0FDRixHQUNDLFFBQVEsU0FBUyxhQUNqQixRQUFRLGNBQWMsYUFDdEIsUUFBUSxhQUFhLFlBQVksWUFDakMsUUFBUSxhQUFhLGtCQUN0QjtJQUVKLFVBQVUsU0FBUyxTQUFTLFdBQVc7SUFDdkMsUUFBUSxTQUFTO0lBQ2pCLFFBQVEsYUFBYTtJQUNyQixPQUFPO0dBQ1Q7R0FDQSxTQUFTLGNBQWMsYUFBYSxTQUFTLFNBQVMsT0FBTztJQUMzRCxJQUFJLGNBQWMsUUFBUTtJQUMxQixJQUFJLGdCQUFnQixxQkFDbEIsT0FDRyxVQUFVLGVBQ1QsYUFDQSxTQUNBLFFBQVEsTUFBTSxVQUNkLE9BQ0EsUUFBUSxHQUNWLEdBQ0EsVUFBVSxTQUFTLE9BQU8sR0FDMUIsc0JBQXNCLFNBQVMsU0FBUyxXQUFXLEdBQ25EO0lBRUosSUFDRSxTQUFTLFlBQ1IsUUFBUSxnQkFBZ0IsZUFDdkIsa0NBQWtDLFNBQVMsT0FBTyxLQUNqRCxhQUFhLE9BQU8sZUFDbkIsU0FBUyxlQUNULFlBQVksYUFBYSxtQkFDekIsWUFBWSxXQUFXLE1BQU0sUUFBUSxPQUV6QyxPQUNHLFVBQVUsU0FBUyxTQUFTLFFBQVEsS0FBSyxHQUMxQyxVQUFVLFNBQVMsT0FBTyxHQUN6QixRQUFRLFNBQVMsYUFDakIsUUFBUSxjQUFjLFFBQVEsUUFDOUIsUUFBUSxhQUFhLGtCQUN0QjtJQUVKLFVBQVUsdUJBQXVCLFNBQVMsWUFBWSxNQUFNLEtBQUs7SUFDakUsVUFBVSxTQUFTLE9BQU87SUFDMUIsUUFBUSxTQUFTO0lBQ2pCLFFBQVEsYUFBYTtJQUNyQixPQUFPO0dBQ1Q7R0FDQSxTQUFTLGFBQWEsYUFBYSxTQUFTLFFBQVEsT0FBTztJQUN6RCxJQUNFLFNBQVMsV0FDVCxNQUFNLFFBQVEsT0FDZCxRQUFRLFVBQVUsa0JBQWtCLE9BQU8saUJBQzNDLFFBQVEsVUFBVSxtQkFBbUIsT0FBTyxnQkFFNUMsT0FDRyxVQUFVLHNCQUFzQixRQUFRLFlBQVksTUFBTSxLQUFLLEdBQy9ELFFBQVEsU0FBUyxhQUNqQixRQUFRLGFBQWEsa0JBQ3RCO0lBRUosVUFBVSxTQUFTLFNBQVMsT0FBTyxZQUFZLENBQUMsQ0FBQztJQUNqRCxRQUFRLFNBQVM7SUFDakIsUUFBUSxhQUFhO0lBQ3JCLE9BQU87R0FDVDtHQUNBLFNBQVMsZUFBZSxhQUFhLFNBQVMsVUFBVSxPQUFPLEtBQUs7SUFDbEUsSUFBSSxTQUFTLFdBQVcsTUFBTSxRQUFRLEtBQ3BDLE9BQ0csVUFBVSx3QkFDVCxVQUNBLFlBQVksTUFDWixPQUNBLEdBQ0YsR0FDQyxRQUFRLFNBQVMsYUFDakIsUUFBUSxjQUFjLGFBQ3RCLFFBQVEsYUFBYSxZQUFZLFlBQ2pDLFFBQVEsYUFBYSxrQkFDdEI7SUFFSixVQUFVLFNBQVMsU0FBUyxRQUFRO0lBQ3BDLFFBQVEsU0FBUztJQUNqQixRQUFRLGFBQWE7SUFDckIsT0FBTztHQUNUO0dBQ0EsU0FBUyxZQUFZLGFBQWEsVUFBVSxPQUFPO0lBQ2pELElBQ0csY
15852UFBYSxPQUFPLFlBQVksT0FBTyxZQUN4QyxhQUFhLE9BQU8sWUFDcEIsYUFBYSxPQUFPLFVBRXBCLE9BQ0csV0FBVyxvQkFDVixLQUFLLFVBQ0wsWUFBWSxNQUNaLEtBQ0YsR0FDQyxTQUFTLFNBQVMsYUFDbEIsU0FBUyxjQUFjLGFBQ3ZCLFNBQVMsYUFBYSxZQUFZLFlBQ2xDLFNBQVMsYUFBYSxrQkFDdkI7SUFFSixJQUFJLGFBQWEsT0FBTyxZQUFZLFNBQVMsVUFBVTtLQUNyRCxRQUFRLFNBQVMsVUFBakI7TUFDRSxLQUFLLG9CQUNILE9BQ0csUUFBUSx1QkFDUCxVQUNBLFlBQVksTUFDWixLQUNGLEdBQ0EsVUFBVSxPQUFPLFFBQVEsR0FDeEIsTUFBTSxTQUFTLGFBQ2YsY0FBYyxjQUFjLFNBQVMsVUFBVSxHQUMvQyxNQUFNLGFBQWEsa0JBQ25CLG1CQUFtQixhQUNwQjtNQUVKLEtBQUssbUJBQ0gsT0FDRyxXQUFXLHNCQUNWLFVBQ0EsWUFBWSxNQUNaLEtBQ0YsR0FDQyxTQUFTLFNBQVMsYUFDbEIsU0FBUyxhQUFhLGtCQUN2QjtNQUVKLEtBQUs7T0FDSCxJQUFJLGlCQUFpQixjQUFjLFNBQVMsVUFBVTtPQUN0RCxXQUFXLFlBQVksUUFBUTtPQUMvQixjQUFjLFlBQVksYUFBYSxVQUFVLEtBQUs7T0FDdEQsbUJBQW1CO09BQ25CLE9BQU87S0FDWDtLQUNBLElBQUksWUFBWSxRQUFRLEtBQUssY0FBYyxRQUFRLEdBQ2pELE9BQ0csUUFBUSx3QkFDUCxVQUNBLFlBQVksTUFDWixPQUNBLElBQ0YsR0FDQyxNQUFNLFNBQVMsYUFDZixNQUFNLGNBQWMsYUFDcEIsTUFBTSxhQUFhLFlBQVksWUFDL0IsY0FBYyxjQUFjLFNBQVMsVUFBVSxHQUMvQyxNQUFNLGFBQWEsa0JBQ25CLG1CQUFtQixhQUNwQjtLQUVKLElBQUksZUFBZSxPQUFPLFNBQVMsTUFDakMsT0FDRyxpQkFBaUIsY0FBYyxTQUFTLFVBQVUsR0FDbEQsY0FBYyxZQUNiLGFBQ0EsZUFBZSxRQUFRLEdBQ3ZCLEtBQ0YsR0FDQyxtQkFBbUIsZ0JBQ3BCO0tBRUosSUFBSSxTQUFTLGFBQWEsb0JBQ3hCLE9BQU8sWUFDTCxhQUNBLGdDQUFnQyxhQUFhLFFBQVEsR0FDckQsS0FDRjtLQUNGLHlCQUF5QixhQUFhLFFBQVE7SUFDaEQ7SUFDQSxlQUFlLE9BQU8sWUFDcEIsbUJBQW1CLGFBQWEsUUFBUTtJQUMxQyxhQUFhLE9BQU8sWUFBWSxpQkFBaUIsYUFBYSxRQUFRO0lBQ3RFLE9BQU87R0FDVDtHQUNBLFNBQVMsV0FBVyxhQUFhLFVBQVUsVUFBVSxPQUFPO0lBQzFELElBQUksTUFBTSxTQUFTLFdBQVcsU0FBUyxNQUFNO0lBQzdDLElBQ0csYUFBYSxPQUFPLFlBQVksT0FBTyxZQUN4QyxhQUFhLE9BQU8sWUFDcEIsYUFBYSxPQUFPLFVBRXBCLE9BQU8sU0FBUyxNQUNaLE9BQ0EsZUFBZSxhQUFhLFVBQVUsS0FBSyxVQUFVLEtBQUs7SUFDaEUsSUFBSSxhQUFhLE9BQU8sWUFBWSxTQUFTLFVBQVU7S0FDckQsUUFBUSxTQUFTLFVBQWpCO01BQ0UsS0FBSyxvQkFDSCxPQUFPLFNBQVMsUUFBUSxPQUNsQixNQUFNLGNBQWMsU0FBUyxVQUFVLEdBQ3hDLGNBQWMsY0FDYixhQUNBLFVBQ0EsVUFDQSxLQUNGLEdBQ0MsbUJBQW1CLEtBQ3BCLGVBQ0E7TUFDTixLQUFLLG1CQUNILE9BQU8sU0FBUyxRQUFRLE1BQ3BCLGFBQWEsYUFBYSxVQUFVLFVBQVUsS0FBSyxJQUNuRDtNQUNOLEtBQUssaUJBQ0gsT0FDRyxNQUFNLGNBQWMsU0FBUyxVQUFVLEdBQ3ZDLFdBQVcsWUFBWSxRQUFRLEdBQy9CLGNBQWMsV0FDYixhQUNBLFVBQ0EsVUFDQSxLQUNGLEdBQ0MsbUJBQW1CLEtBQ3BCO0tBRU47S0FDQSxJQUFJLFlBQVksUUFBUSxLQUFLLGNBQWMsUUFBUSxHQUFHO01BQ3BELElBQUksU0FBUyxLQUFLLE9BQU87TUFDekIsTUFBTSxjQUFjLFNBQVMsVUFBVTtNQUN2QyxjQUFjLGVBQ1osYUFDQSxVQUNBLFVBQ0EsT0FDQSxJQUNGO01BQ0EsbUJBQW1CO01BQ25CLE9BQU87S0FDVDtLQUNBLElBQUksZUFBZSxPQUFPLFNBQVMsTUFDakMsT0FDRyxNQUFNLGNBQWMsU0FBUyxVQUFVLEdBQ3ZDLGNBQWMsV0FDYixhQUNBLFVBQ0EsZUFBZSxRQUFRLEdBQ3ZCLEtBQ0YsR0FDQyxtQkFBbUIsS0FDcEI7S0FFSixJQUFJLFNBQVMsYUFBYSxvQkFDeEIsT0FBTyxXQUNMLGFBQ0EsVUFDQSxnQ0FBZ0MsYUFBYSxRQUFRLEdBQ3JELEtBQ0Y7S0FDRix5QkFBeUIsYUFBYSxRQUFRO0lBQ2hEO0lBQ0EsZUFBZSxPQUFPLFlBQ3BCLG1CQUFtQixhQUFhLFFBQVE7SUFDMUMsYUFBYSxPQUFPLFlBQVksaUJBQWlCLGFBQWEsUUFBUTtJQUN0RSxPQUFPO0dBQ1Q7R0FDQSxTQUFTLGNBQ1Asa0JBQ0EsYUFDQSxRQUNBLFVBQ0EsT0FDQTtJQUNBLElBQ0csYUFBYSxPQUFPLFlBQVksT0FBTyxZQUN4QyxhQUFhLE9BQU8sWUFDcEIsYUFBYSxPQUFPLFVBRXBCLE9BQ0csbUJBQW1CLGlCQUFpQixJQUFJLE1BQU0sS0FBSyxNQUNwRCxlQUFlLGFBQWEsa0JBQWtCLEtBQUssVUFBVSxLQUFLO0lBRXRFLElBQUksYUFBYSxPQUFPLFlBQVksU0FBUyxVQUFVO0tBQ3JELFFBQVEsU0FBUyxVQUFqQjtNQUNFLEtBQUssb0JBQ0gsT0FDRyxTQUNDLGlCQUFpQixJQUNmLFNBQVMsU0FBUyxNQUFNLFNBQVMsU0FBUyxHQUM1QyxLQUFLLE1BQ04sbUJBQW1CLGNBQWMsU0FBUyxVQUFVLEdBQ3BELGNBQWMsY0FDYixhQUNBLFFBQ0EsVUFDQSxLQUNGLEdBQ0MsbUJBQW1CLGtCQUNwQjtNQUVKLEtBQUssbUJBQ0gsT0FDRyxtQkFDQyxpQkFBaUIsSUFDZixTQUFTLFNBQVMsTUFBTSxTQUFTLFNBQVMsR0FDNUMsS0FBSyxNQUNQLGFBQWEsYUFBYSxrQkFBa0IsVUFBVSxLQUFLO01BRS9ELEtBQUs7T0FDSCxJQUFJLGtCQUFrQixjQUFjLFNBQVMsVUFBVTtPQUN2RCxXQUFXLFlBQVksUUFBUTtPQUMvQixjQUFjLGNBQ1osa0JBQ0EsYUFDQSxRQUNBLFVBQ0EsS0FDRjtPQUNBLG1CQUFtQjtPQUNuQixPQUFPO0tBQ1g7S0FDQSxJQUFJLFlBQVksUUFBUSxLQUFLLGNBQWMsUUFBUSxHQUNqRCxPQUNHLFNBQVMsaUJBQWlCLElBQUksTUFBTSxLQUFLLE1BQ3pDLG1CQUFtQixjQUFjLFNBQVMsVUFBVSxHQUNwRCxjQUFjLGVBQ2IsYUFDQSxRQUNBLFVBQ0EsT0FDQSxJQUNGLEdBQ0MsbUJBQW1CLGtCQUNwQjtLQUVKLElBQUksZUFBZSxPQUFPLFNBQVMsTUFDakMsT0FDRyxrQkFBa0IsY0FBYyxTQUFTLFVBQVUsR0FDbkQsY0FBYyxjQUNiLGtCQUNBLGFBQ0EsUUFDQSxlQUFlLFFBQVEsR0FDdkIsS0FDRixHQUNDLG1CQUFtQixpQkFDcEI7S0FFSixJQUFJLFNBQVMsYUFBYSxvQkFDeEIsT0FBTyxjQUNMLGtCQUNBLGFBQ0EsUUFDQSxnQ0FBZ0MsYUFBYSxRQUFRLEdBQ3JELEtBQ0Y7S0FDRix5QkFBeUIsYUFBYSxRQUFRO0lBQ2hEO0lBQ0EsZUFBZSxPQUFPLFlBQ3BCLG1CQUFtQixhQUFhLFFBQVE7SUFDMUMsYUFBYSxPQUFPLFlBQVksaUJBQWlCLGFBQWEsUUFBUTtJQUN0RSxPQUFPO0dBQ1Q7R0FDQSxTQUFTLGlCQUFpQixhQUFhLGdCQUFnQixPQUFPLFdBQVc7SUFDdkUsSUFBSSxhQUFhLE9BQU8sU0FBUyxTQUFTLE9BQU8sT0FBTztJQUN4RCxRQUFRLE1BQU0sVUFBZDtLQUNFLEtBQUs7S0FDTCxLQUFLO01BQ0gsa0JBQWtCLGFBQWEsZ0JBQWdCLEtBQUs7TUFDcEQsSUFBSSxNQUFNLE1BQU07TUFDaEIsSUFBSSxhQUFhLE9BQU8sS0FBSztNQUM3QixJQUFJLFNBQVMsV0FBVztPQUN0Qiw0QkFBWSxJQUFJLElBQUk7T0FDcEIsVUFBVSxJQUFJLEdBQUc7T0FDakI7TUFDRjtNQUNBLElBQUksQ0FBQyxVQUFVLElBQUksR0FBRyxHQU
15852FHO09BQ3ZCLFVBQVUsSUFBSSxHQUFHO09BQ2pCO01BQ0Y7TUFDQSxrQkFBa0IsZ0JBQWdCLFdBQVk7T0FDNUMsUUFBUSxNQUNOLDZRQUNBLEdBQ0Y7TUFDRixDQUFDO01BQ0Q7S0FDRixLQUFLLGlCQUNILFFBQVMsWUFBWSxLQUFLLEdBQ3hCLGlCQUFpQixhQUFhLGdCQUFnQixPQUFPLFNBQVM7SUFDcEU7SUFDQSxPQUFPO0dBQ1Q7R0FDQSxTQUFTLHVCQUNQLGFBQ0EsbUJBQ0EsYUFDQSxPQUNBO0lBQ0EsS0FDRSxJQUFJLFlBQVksTUFDZCxzQkFBc0IsTUFDdEIsbUJBQW1CLE1BQ25CLFdBQVcsbUJBQ1gsU0FBVSxvQkFBb0IsR0FDOUIsZUFBZSxNQUNqQixTQUFTLFlBQVksU0FBUyxZQUFZLFFBQzFDLFVBQ0E7S0FDQSxTQUFTLFFBQVEsVUFDWCxlQUFlLFVBQVksV0FBVyxRQUN2QyxlQUFlLFNBQVM7S0FDN0IsSUFBSSxXQUFXLFdBQ2IsYUFDQSxVQUNBLFlBQVksU0FDWixLQUNGO0tBQ0EsSUFBSSxTQUFTLFVBQVU7TUFDckIsU0FBUyxhQUFhLFdBQVc7TUFDakM7S0FDRjtLQUNBLFlBQVksaUJBQ1YsYUFDQSxVQUNBLFlBQVksU0FDWixTQUNGO0tBQ0EsMEJBQ0UsWUFDQSxTQUFTLFNBQVMsYUFDbEIsWUFBWSxhQUFhLFFBQVE7S0FDbkMsb0JBQW9CLFdBQVcsVUFBVSxtQkFBbUIsTUFBTTtLQUNsRSxTQUFTLG1CQUNKLHNCQUFzQixXQUN0QixpQkFBaUIsVUFBVTtLQUNoQyxtQkFBbUI7S0FDbkIsV0FBVztJQUNiO0lBQ0EsSUFBSSxXQUFXLFlBQVksUUFDekIsT0FDRSx3QkFBd0IsYUFBYSxRQUFRLEdBQzdDLGVBQWUsYUFBYSxhQUFhLE1BQU0sR0FDL0M7SUFFSixJQUFJLFNBQVMsVUFBVTtLQUNyQixPQUFPLFNBQVMsWUFBWSxRQUFRLFVBQ2xDLFdBQVksWUFBWSxhQUFhLFlBQVksU0FBUyxLQUFLLEdBQzdELFNBQVMsYUFDTCxZQUFZLGlCQUNaLGFBQ0EsVUFDQSxZQUFZLFNBQ1osU0FDRixHQUNDLG9CQUFvQixXQUNuQixVQUNBLG1CQUNBLE1BQ0YsR0FDQSxTQUFTLG1CQUNKLHNCQUFzQixXQUN0QixpQkFBaUIsVUFBVSxVQUMvQixtQkFBbUI7S0FDMUIsZUFBZSxhQUFhLGFBQWEsTUFBTTtLQUMvQyxPQUFPO0lBQ1Q7SUFDQSxLQUNFLFdBQVcscUJBQXFCLFF
15852BQVEsR0FDeEMsU0FBUyxZQUFZLFFBQ3JCLFVBRUEsZUFBZ0IsY0FDZCxVQUNBLGFBQ0EsUUFDQSxZQUFZLFNBQ1osS0FDRixHQUNFLFNBQVMsaUJBQ0wsWUFBWSxpQkFDWixhQUNBLGNBQ0EsWUFBWSxTQUNaLFNBQ0YsR0FDQSwyQkFDSSxXQUFXLGFBQWEsV0FDMUIsU0FBUyxZQUNQLFNBQVMsT0FDUCxTQUFTLFNBQVMsTUFBTSxTQUFTLFNBQVMsR0FDNUMsSUFDSCxvQkFBb0IsV0FDbkIsY0FDQSxtQkFDQSxNQUNGLEdBQ0EsU0FBUyxtQkFDSixzQkFBc0IsZUFDdEIsaUJBQWlCLFVBQVUsY0FDL0IsbUJBQW1CO0lBQzFCLDBCQUNFLFNBQVMsUUFBUSxTQUFVLE9BQU87S0FDaEMsT0FBTyxZQUFZLGFBQWEsS0FBSztJQUN2QyxDQUFDO0lBQ0gsZUFBZSxhQUFhLGFBQWEsTUFBTTtJQUMvQyxPQUFPO0dBQ1Q7R0FDQSxTQUFTLDBCQUNQLGFBQ0EsbUJBQ0EsYUFDQSxPQUNBO0lBQ0EsSUFBSSxRQUFRLGFBQ1YsTUFBTSxNQUFNLDBDQUEwQztJQUN4RCxLQUNFLElBQUksc0JBQXNCLE1BQ3hCLG1CQUFtQixNQUNuQixXQUFXLG1CQUNYLFNBQVUsb0JBQW9CLEdBQzlCLGVBQWUsTUFDZixZQUFZLE1BQ1osT0FBTyxZQUFZLEtBQUssR0FDMUIsU0FBUyxZQUFZLENBQUMsS0FBSyxNQUMzQixVQUFVLE9BQU8sWUFBWSxLQUFLLEdBQ2xDO0tBQ0EsU0FBUyxRQUFRLFVBQ1gsZUFBZSxVQUFZLFdBQVcsUUFDdkMsZUFBZSxTQUFTO0tBQzdCLElBQUksV0FBVyxXQUFXLGFBQWEsVUFBVSxLQUFLLE9BQU8sS0FBSztLQUNsRSxJQUFJLFNBQVMsVUFBVTtNQUNyQixTQUFTLGFBQWEsV0FBVztNQUNqQztLQUNGO0tBQ0EsWUFBWSxpQkFDVixhQUNBLFVBQ0EsS0FBSyxPQUNMLFNBQ0Y7S0FDQSwwQkFDRSxZQUNBLFNBQVMsU0FBUyxhQUNsQixZQUFZLGFBQWEsUUFBUTtLQUNuQyxvQkFBb0IsV0FBVyxVQUFVLG1CQUFtQixNQUFNO0tBQ2xFLFNBQVMsbUJBQ0osc0JBQXNCLFdBQ3RCLGlCQUFpQixVQUFVO0tBQ2hDLG1CQUFtQjtLQUNuQixXQUFXO0lBQ2I7SUFDQSxJQUFJLEtBQUssTUFDUCxPQUNFLHdCQUF3QixhQUFhLFFBQVEsR0FDN0MsZUFBZSxhQUFhLGFBQWEsTUFBTSxHQUMvQztJQUVKLElBQUksU0FBUyxVQUFVO0tBQ3JCLE9BQU8sQ0FBQyxLQUFLLE1BQU0sVUFBVSxPQUFPLFlBQVksS0FBSyxHQUNuRCxXQUFZLFlBQVksYUFBYSxLQUFLLE9BQU8sS0FBSyxHQUNwRCxTQUFTLGFBQ0wsWUFBWSxpQkFDWixhQUNBLFVBQ0EsS0FBSyxPQUNMLFNBQ0YsR0FDQyxvQkFBb0IsV0FDbkIsVUFDQSxtQkFDQSxNQUNGLEdBQ0EsU0FBUyxtQkFDSixzQkFBc0IsV0FDdEIsaUJBQWlCLFVBQVUsVUFDL0IsbUJBQW1CO0tBQzFCLGVBQWUsYUFBYSxhQUFhLE1BQU07S0FDL0MsT0FBTztJQUNUO0lBQ0EsS0FDRSxXQUFXLHFCQUFxQixRQUFRLEdBQ3hDLENBQUMsS0FBSyxNQUNOLFVBQVUsT0FBTyxZQUFZLEtBQUssR0FFbEMsZUFBZ0IsY0FDZCxVQUNBLGFBQ0EsUUFDQSxLQUFLLE9BQ0wsS0FDRixHQUNFLFNBQVMsaUJBQ0wsWUFBWSxpQkFDWixhQUNBLGNBQ0EsS0FBSyxPQUNMLFNBQ0YsR0FDQSwyQkFDSSxPQUFPLGFBQWEsV0FDdEIsU0FBUyxRQUNQLFNBQVMsT0FBTyxTQUFTLEtBQUssTUFBTSxTQUFTLEtBQUssR0FBRyxJQUN4RCxvQkFBb0IsV0FDbkIsY0FDQSxtQkFDQSxNQUNGLEdBQ0EsU0FBUyxtQkFDSixzQkFBc0IsZUFDdEIsaUJBQWlCLFVBQVUsY0FDL0IsbUJBQW1CO0lBQzFCLDBCQUNFLFNBQVMsUUFBUSxTQUFVLE9BQU87S0FDaEMsT0FBTyxZQUFZLGFBQWEsS0FBSztJQUN2QyxDQUFDO0lBQ0gsZUFBZSxhQUFhLGFBQWEsTUFBTTtJQUMvQyxPQUFPO0dBQ1Q7R0FDQSxTQUFTLHlCQUNQLGFBQ0EsbUJBQ0EsVUFDQSxPQUNBO0lBQ0EsYUFBYSxPQUFPLFlBQ2xCLFNBQVMsWUFDVCxTQUFTLFNBQVMsdUJBQ2xCLFNBQVMsU0FBUyxPQUNsQixLQUFLLE1BQU0sU0FBUyxNQUFNLFFBQ3pCLHNCQUFzQixVQUFVLE1BQU0sV0FBVyxHQUNqRCxXQUFXLFNBQVMsTUFBTTtJQUM3QixJQUFJLGFBQWEsT0FBTyxZQUFZLFNBQVMsVUFBVTtLQUNyRCxRQUFRLFNBQVMsVUFBakI7TUFDRSxLQUFLO09BQ0gsSUFBSSxnQkFBZ0IsY0FBYyxTQUFTLFVBQVU7T0FDckQsR0FBRztRQUNELEtBQUssSUFBSSxNQUFNLFNBQVMsS0FBSyxTQUFTLG9CQUFxQjtTQUN6RCxJQUFJLGtCQUFrQixRQUFRLEtBQUs7VUFDakMsTUFBTSxTQUFTO1VBQ2YsSUFBSSxRQUFRLHFCQUNOO2VBQUEsTUFBTSxrQkFBa0IsS0FBSztZQUMvQix3QkFDRSxhQUNBLGtCQUFrQixPQUNwQjtZQUNBLFFBQVEsU0FDTixtQkFDQSxTQUFTLE1BQU0sUUFDakI7WUFDQSxVQUFVLE9BQU8sUUFBUTtZQUN6QixNQUFNLFNBQVM7WUFDZixNQUFNLGNBQWMsU0FBUztZQUM3QixNQUFNLGFBQWE7WUFDbkIsc0JBQXNCLFVBQVUsT0FBTyxXQUFXO1lBQ2xELGNBQWM7WUFDZCxNQUFNO1dBQ1I7aUJBQ0ssSUFDTCxrQkFBa0IsZ0JBQWdCLE9BQ2xDLGtDQUNFLG1CQUNBLFFBQ0YsS0FDQyxhQUFhLE9BQU8sT0FDbkIsU0FBUyxPQUNULElBQUksYUFBYSxtQkFDakIsWUFBWSxHQUFHLE1BQU0sa0JBQWtCLE1BQ3pDO1dBQ0Esd0JBQ0UsYUFDQSxrQkFBa0IsT0FDcEI7V0FDQSxRQUFRLFNBQVMsbUJBQW1CLFNBQVMsS0FBSztXQUNsRCxVQUFVLE9BQU8sUUFBUTtXQUN6QixNQUFNLFNBQVM7V0FDZixNQUFNLGNBQWMsU0FBUztXQUM3QixNQUFNLGFBQWE7V0FDbkIsY0FBYztXQUNkLE1BQU07VUFDUjtVQUNBLHdCQUF3QixhQUFhLGlCQUFpQjtVQUN0RDtTQUNGLE9BQU8sWUFBWSxhQUFhLGlCQUFpQjtTQUNqRCxvQkFBb0Isa0JBQWtCO1FBQ3hDO1FBQ0EsU0FBUyxTQUFTLHVCQUNaLFFBQVEsd0JBQ1IsU0FBUyxNQUFNLFVBQ2YsWUFBWSxNQUNaLE9BQ0EsU0FBUyxHQUNYLEdBQ0EsVUFBVSxPQUFPLFFBQVEsR0FDeEIsTUFBTSxTQUFTLGFBQ2YsTUFBTSxjQUFjLGFBQ3BCLE1BQU0sYUFBYSxZQUFZLFlBQy9CLE1BQU0sYUFBYSxrQkFDcEIsc0JBQXNCLFVBQVUsT0FBTyxXQUFXLEdBQ2pELGNBQWMsVUFDYixRQUFRLHVCQUNSLFVBQ0EsWUFBWSxNQUNaLEtBQ0YsR0FDQSxVQUFVLE9BQU8sUUFBUSxHQUN4QixNQUFNLFNBQVMsYUFDZixNQUFNLGFBQWEsa0JBQ25CLGNBQWM7T0FDckI7T0FDQSxjQUFjLGlCQUFpQixXQUFXO09BQzFDLG1CQUFtQjtPQUNuQixPQUFPO01BQ1QsS0FBSztPQUNILEdBQUc7UUFDRCxnQkFBZ0I7UUFDaEIsS0FDRSxXQUFXLGNBQWMsS0FDekIsU0FBUyxvQkFFVDtTQUNBLElBQUksa0JBQWtCLFFBQVEsVUFDNUIsSUFDRSxNQUFNLGtCQUFrQixPQUN4QixrQkFBa0IsVUFBVSxrQkFDMUIsY0FBYyxpQkFDaEIsa0JBQWtCLFVBQVUsbUJBQzFCLGNBQWMsZ0JBQ2hCO1VBQ0Esd0JBQ0UsYUFDQSxrQkFBa0IsT0FDcEI7VUFDQSxRQUFRLFNBQ04sbUJBQ0EsY0FBYyxZQUFZLENBQUMsQ0FDN0I7VUFDQSxNQUFNLFNBQVM7VUFDZixjQUFjO1VBQ2QsTUFBTTtTQUNSLE9BQU87VUFDTCx3QkFBd0IsYUFBYSxpQkFBaUI7VUFDdEQ7U0FDRjtjQUNHLFlBQVksYUFBYSxpQkFBaUI7U0FDL0Msb0JBQW9CLGtCQUFrQjtRQUN4QztRQUNBLFFBQVEsc0JBQ04sZUFDQSxZQUFZLE1BQ1osS0FDRjtRQUNBLE1BQU0sU0FBUztRQUNmLGNBQWM7T0FDaEI7T0FDQSxPQUFPLGlCQUFpQixXQUFXO01BQ3JDLEtBQUssaUJBQ0gsT0FDRyxnQkFBZ0IsY0FBYyxTQUFTLFVBQVUsR0FDakQsV0FBVyxZQU
15852FZLFFBQVEsR0FDL0IsY0FBYyx5QkFDYixhQUNBLG1CQUNBLFVBQ0EsS0FDRixHQUNDLG1CQUFtQixlQUNwQjtLQUVOO0tBQ0EsSUFBSSxZQUFZLFFBQVEsR0FDdEIsT0FBTyx1QkFDTCxhQUNBLG1CQUNBLFVBQ0EsS0FDRjtLQUNGLElBQUksY0FBYyxRQUFRLEdBQUc7TUFDM0IsZ0JBQWdCO01BQ2hCLFdBQVcsY0FBYyxhQUFhO01BQ3RDLElBQUksZUFBZSxPQUFPLFVBQ3hCLE1BQU0sTUFDSixvR0FDRjtNQUNGLE1BQU0sU0FBUyxLQUFLLGFBQWE7TUFDakMsSUFBSSxRQUFRLGVBRVI7V0FBQSxNQUFNLFlBQVksT0FDbEIsaUNBQ0UsT0FBTyxVQUFVLFNBQVMsS0FBSyxZQUFZLElBQUksS0FDakQseUJBQXlCLE9BQU8sVUFBVSxTQUFTLEtBQUssR0FBRyxHQUUzRCwwQkFDRSxRQUFRLE1BQ04sc1RBQ0YsR0FDQyx5QkFBeUIsQ0FBQztNQUFBLE9BRS9CLGNBQWMsWUFBWSxZQUN4QixxQkFDQyxRQUFRLE1BQ1AsdUZBQ0YsR0FDQyxtQkFBbUIsQ0FBQztNQUN6QixPQUFPLDBCQUNMLGFBQ0EsbUJBQ0EsS0FDQSxLQUNGO0tBQ0Y7S0FDQSxJQUFJLGVBQWUsT0FBTyxTQUFTLE1BQ2pDLE9BQ0csZ0JBQWdCLGNBQWMsU0FBUyxVQUFVLEdBQ2pELGNBQWMseUJBQ2IsYUFDQSxtQkFDQSxlQUFlLFFBQVEsR0FDdkIsS0FDRixHQUNDLG1CQUFtQixlQUNwQjtLQUVKLElBQUksU0FBUyxhQUFhLG9CQUN4QixPQUFPLHlCQUNMLGFBQ0EsbUJBQ0EsZ0NBQWdDLGFBQWEsUUFBUSxHQUNyRCxLQUNGO0tBQ0YseUJBQXlCLGFBQWEsUUFBUTtJQUNoRDtJQUNBLElBQ0csYUFBYSxPQUFPLFlBQVksT0FBTyxZQUN4QyxhQUFhLE9BQU8sWUFDcEIsYUFBYSxPQUFPLFVBRXBCLE9BQ0csZ0JBQWdCLEtBQUssVUFDdEIsU0FBUyxxQkFBcUIsTUFBTSxrQkFBa0IsT0FDakQsd0JBQ0MsYUFDQSxrQkFBa0IsT0FDcEIsR0FDQyxRQUFRLFNBQVMsbUJBQW1CLGFBQWEsR0FDakQsTUFBTSxTQUFTLGFBQ2YsY0FBYyxVQUNkLHdCQUF3QixhQUFhLGlCQUFpQixHQUN0RCxRQUFRLG9CQUNQLGVBQ0EsWUFBWSxNQUNaLEtBQ0YsR0FDQyxNQUFNLFNBQVMsYUFDZixNQUFNLGNBQWMsYUFDcEIsTUFBTSxhQUFhLFlBQVksWUFDL0IsTUFBTSxhQUFhLGtCQUNuQixjQUFjLFFBQ25CLGlCQUFpQixXQUFXO0lBRWhDLGVBQWUsT0FBTyxZQUNwQixtQkFBbUIsYUFBYSxRQUFRO0lBQzFDLGFBQWEsT0FBTyxZQUFZLGlCQUFpQixhQUFhLFFBQVE7SUFDdEUsT0FBTyx3QkFBd0IsYUFBYSxpQkFBaUI7R0FDL0Q7R0FDQSxPQUFPLFNBQVUsYUFBYSxtQkFBbUIsVUFBVSxPQUFPO0lBQ2hFLElBQUksZ0JBQWdCO0lBQ3BCLG1CQUFtQjtJQUNuQixJQUFJO0tBQ0YseUJBQXlCO0tBQ3pCLElBQUksa0JBQWtCLHlCQUNwQixhQUNBLG1CQUNBLFVBQ0EsS0FDRjtLQUNBLGtCQUFrQjtLQUNsQixPQUFPO0lBQ1QsU0FBUyxHQUFHO0tBQ1YsSUFBSSxNQUFNLHFCQUFxQixNQUFNLHlCQUF5QixNQUFNO0tBQ3BFLElBQUksUUFBUSxZQUFZLElBQUksR0FBRyxNQUFNLFlBQVksSUFBSTtLQUNyRCxNQUFNLFFBQVE7S0FDZCxNQUFNLFNBQVM7S0FDZixJQUFJLFlBQWEsTUFBTSxhQUFhO0tBQ3BDLE1BQU0sY0FBYyxZQUFZO0tBQ2hDLE1BQU0sYUFBYSxZQUFZO0tBQy9CLElBQUksUUFBUSxXQUNMO1dBQUEsSUFBSSxJQUFJLFVBQVUsU0FBUyxHQUFHLEtBQUssR0FBRyxLQUN6QyxJQUFJLGFBQWEsT0FBTyxVQUFVLEVBQUUsQ0FBQyxPQUFPO09BQzFDLE1BQU0sY0FBYyxVQUFVO09BQzlCLE1BQU0sYUFBYSxVQUFVLEVBQUUsQ0FBQztPQUNoQztNQUNGOztLQUNKLE9BQU87SUFDVCxVQUFVO0tBQ1IsbUJBQW1CO0lBQ3JCO0dBQ0Y7RUFDRjtFQUNBLFNBQVMsZ0NBQWdDLFdBQVcsT0FBTztHQUN6RCxJQUFJLFlBQVksWUFBWSxTQUFTO0dBQ3JDLFlBQVksQ0FBQyxhQUFhLGVBQWUsT0FBTyxjQUFjLFNBQVM7R0FDdkUsT0FBTyxhQUFhLGFBQ2QsWUFBWSxZQUFZLFVBQVUsWUFDcEMsUUFBUSxNQUNOLHVPQUNBLFdBQ0EsT0FDQSxTQUNGLEdBQ0EsQ0FBQyxLQUNELENBQUM7RUFDUDtFQUNBLFNBQVMsc0JBQXNCLE9BQU87R0FDcEMsTUFBTSxjQUFjO0lBQ2xCLFdBQVcsTUFBTTtJQUNqQixpQkFBaUI7SUFDakIsZ0JBQWdCO0lBQ2hCLFFBQVE7S0FBRSxTQUFTO0tBQU0sT0FBTztLQUFHLGlCQUFpQjtJQUFLO0lBQ3pELFdBQVc7R0FDYjtFQUNGO0VBQ0EsU0FBUyxpQkFBaUIsU0FBUyxnQkFBZ0I7R0FDakQsVUFBVSxRQUFRO0dBQ2xCLGVBQWUsZ0JBQWdCLFlBQzVCLGVBQWUsY0FBYztJQUM1QixXQUFXLFFBQVE7SUFDbkIsaUJBQWlCLFFBQVE7SUFDekIsZ0JBQWdCLFFBQVE7SUFDeEIsUUFBUSxRQUFRO0lBQ2hCLFdBQVc7R0FDYjtFQUNKO0VBQ0EsU0FBUyxhQUFhLE1BQU07R0FDMUIsT0FBTztJQUNDO0lBQ04sS0FBSztJQUNMLFNBQVM7SUFDVCxVQUFVO0lBQ1YsTUFBTTtHQUNSO0VBQ0Y7RUFDQSxTQUFTLGNBQWMsT0FBTyxRQUFRLE1BQU07R0FDMUMsSUFBSSxjQUFjLE1BQU07R0FDeEIsSUFBSSxTQUFTLGFBQWEsT0FBTztHQUNqQyxjQUFjLFlBQVk7R0FDMUIsSUFDRSw2QkFBNkIsZUFDN0IsQ0FBQywyQkFDRDtJQUNBLElBQUksZ0JBQWdCLDBCQUEwQixLQUFLO0lBQ25ELFFBQVEsTUFDTiwyUEFDQSxhQUNGO0lBQ0EsNEJBQTRCLENBQUM7R0FDL0I7R0FDQSxLQUFLLG1CQUFtQixtQkFBbUIsV0FDekMsT0FDRyxnQkFBZ0IsWUFBWSxTQUM3QixTQUFTLGdCQUNKLE9BQU8sT0FBTyxVQUNiLE9BQU8sT0FBTyxjQUFjLE1BQzdCLGNBQWMsT0FBTyxTQUN6QixZQUFZLFVBQVUsUUFDdEIsU0FBUyx1QkFBdUIsS0FBSyxHQUN0Qyw4QkFBOEIsT0FBTyxNQUFNLElBQUksR0FDL0M7R0FFSixnQkFBZ0IsT0FBTyxhQUFhLFFBQVEsSUFBSTtHQUNoRCxPQUFPLHVCQUF1QixLQUFLO0VBQ3JDO0VBQ0EsU0FBUyxvQkFBb0IsTUFBTSxPQUFPLE1BQU07R0FDOUMsUUFBUSxNQUFNO0dBQ2QsSUFBSSxTQUFTLFVBQVcsUUFBUSxNQUFNLFFBQVMsT0FBTyxPQUFPLFdBQVc7SUFDdEUsSUFBSSxhQUFhLE1BQU07SUFDdkIsY0FBYyxLQUFLO0lBQ25CLFFBQVE7SUFDUixNQUFNLFFBQVE7SUFDZCxrQkFBa0IsTUFBTSxJQUFJO0dBQzlCO0VBQ0Y7RUFDQSxTQUFTLHNCQUFzQixnQkFBZ0IsZ0JBQWdCO0dBQzdELElBQUksUUFBUSxlQUFlLGFBQ3pCLFVBQVUsZUFBZTtHQUMzQixJQUNFLFNBQVMsWUFDUCxVQUFVLFFBQVEsYUFBYyxVQUFVLFVBQzVDO0lBQ0EsSUFBSSxXQUFXLE1BQ2IsVUFBVTtJQUNaLFFBQVEsTUFBTTtJQUNkLElBQUksU0FBUyxPQUFPO0tBQ2xCLEdBQUc7TUFDRCxJQUFJLFFBQVE7T0FDVixNQUFNLE1BQU07T0FDWixLQUFLLE1BQU07T0FDWCxTQUFTLE1BQU07T0FDZixVQUFVO09BQ1YsTUFBTTtNQUNSO01BQ0EsU0FBUyxVQUNKLFdBQVcsVUFBVSxRQUNyQixVQUFVLFFBQVEsT0FBTztNQUM5QixRQUFRLE1BQU07S0FDaEIsU0FBUyxTQUFTO0tBQ2xCLFNBQVMsVUFDSixXQUFXLFVBQVUsaUJBQ3JCLFVBQVUsUUFBUSxPQUFPO0lBQ2hDLE9BQU8sV0FBVyxVQUFVO0lBQzVCLFFBQVE7S0FDTixXQUFXLFFBQVE7S0FDbkIsaUJBQWlCO0tBQ2pCLGdCQUFnQjtLQUNoQixRQUFRLFFBQVE7S0FDaEIsV0FBVyxRQUFRO0lBQ3JCO0lBQ0EsZUFBZSxjQUFjO0lBQzdCO0dBQ0Y7R0FDQSxpQkFBaUIsTUFBTTtHQUN2QixTQUFTLGlCQUNKLE1BQU0sa0JBQWtCLGlCQUN4QixlQUFlLE9BQU87R0FDM0IsTUFBTSxpQkFBaUI7RUFDekI7RUFDQSxTQUFTLDh
15852DQUE4QztHQUNyRCxJQUFJLGlDQUFpQztJQUNuQyxJQUFJLDBCQUEwQjtJQUM5QixJQUFJLFNBQVMseUJBQXlCLE1BQU07R0FDOUM7RUFDRjtFQUNBLFNBQVMsbUJBQ1AsZ0JBQ0EsT0FDQSxtQkFDQSxhQUNBO0dBQ0Esa0NBQWtDLENBQUM7R0FDbkMsSUFBSSxRQUFRLGVBQWU7R0FDM0IsaUJBQWlCLENBQUM7R0FDbEIsMkJBQTJCLE1BQU07R0FDakMsSUFBSSxrQkFBa0IsTUFBTSxpQkFDMUIsaUJBQWlCLE1BQU0sZ0JBQ3ZCLGVBQWUsTUFBTSxPQUFPO0dBQzlCLElBQUksU0FBUyxjQUFjO0lBQ3pCLE1BQU0sT0FBTyxVQUFVO0lBQ3ZCLElBQUksb0JBQW9CLGNBQ3RCLHFCQUFxQixrQkFBa0I7SUFDekMsa0JBQWtCLE9BQU87SUFDekIsU0FBUyxpQkFDSixrQkFBa0IscUJBQ2xCLGVBQWUsT0FBTztJQUMzQixpQkFBaUI7SUFDakIsSUFBSSxVQUFVLGVBQWU7SUFDN0IsU0FBUyxZQUNMLFVBQVUsUUFBUSxhQUNuQixlQUFlLFFBQVEsZ0JBQ3hCLGlCQUFpQixtQkFDZCxTQUFTLGVBQ0wsUUFBUSxrQkFBa0IscUJBQzFCLGFBQWEsT0FBTyxvQkFDeEIsUUFBUSxpQkFBaUI7R0FDaEM7R0FDQSxJQUFJLFNBQVMsaUJBQWlCO0lBQzVCLElBQUksV0FBVyxNQUFNO0lBQ3JCLGlCQUFpQjtJQUNqQixVQUFVLHFCQUFxQixvQkFBb0I7SUFDbkQsZUFBZTtJQUNmLEdBQUc7S0FDRCxJQUFJLGFBQWEsYUFBYSxPQUFPLFlBQ25DLGlCQUFpQixlQUFlLGFBQWE7S0FDL0MsSUFDRSxrQkFDSyxnQ0FBZ0MsZ0JBQWdCLGNBQ2hELGNBQWMsZ0JBQWdCLFlBQ25DO01BQ0EsTUFBTSxjQUNKLGVBQWUseUJBQ2Qsa0NBQWtDLENBQUM7TUFDdEMsU0FBUyxZQUNOLFVBQVUsUUFBUSxPQUNqQjtPQUNFLE1BQU07T0FDTixLQUFLLGFBQWE7T0FDbEIsU0FBUyxhQUFhO09BQ3RCLFVBQVU7T0FDVixNQUFNO01BQ1I7TUFDSixHQUFHO09BQ0QsYUFBYTtPQUNiLElBQUksZUFBZTtPQUNuQixJQUFJLFlBQVksT0FDZCxXQUFXO09BQ2IsUUFBUSxhQUFhLEtBQXJCO1FBQ0UsS0FBSztTQUNILGVBQWUsYUFBYTtTQUM1QixJQUFJLGVBQWUsT0FBTyxjQUFjO1VBQ3RDLCtCQUErQixDQUFDO1VBQ2hDLElBQUksWUFBWSxhQUFhLEtBQzNCLFVBQ0EsVUFDQSxTQUNGO1VBQ0EsSUFBSSxXQUFXLE9BQU8sa0JBQWtCO1dBQ3RDLDJCQUEyQixDQUFDLENBQUM7V0FDN0IsSUFBSTtZQUNGLGFBQWEsS0FBSyxVQUFVLFVBQVUsU0FBUztXQUNqRCxVQUFVO1lBQ1IsMkJBQTJCLENBQUMsQ0FBQztXQUMvQjtVQUNGO1VBQ0EsK0JBQStCLENBQUM7VUFDaEMsV0FBVztVQUNYLE1BQU07U0FDUjtTQUNBLFdBQVc7U0FDWCxNQUFNO1FBQ1IsS0FBSyxlQUNILFdBQVcsUUFBUyxXQUFXLFFBQVEsU0FBVTtRQUNuRCxLQUFLO1NBQ0gsWUFBWSxhQUFhO1NBQ3pCLElBQUksZUFBZSxPQUFPLFdBQVc7VUFDbkMsK0JBQStCLENBQUM7VUFDaEMsZUFBZSxVQUFVLEtBQ3ZCLFVBQ0EsVUFDQSxTQUNGO1VBQ0EsSUFBSSxXQUFXLE9BQU8sa0JBQWtCO1dBQ3RDLDJCQUEyQixDQUFDLENBQUM7V0FDN0IsSUFBSTtZQUNGLFVBQVUsS0FBSyxVQUFVLFVBQVUsU0FBUztXQUM5QyxVQUFVO1lBQ1IsMkJBQTJCLENBQUMsQ0FBQztXQUMvQjtVQUNGO1VBQ0EsK0JBQStCLENBQUM7U0FDbEMsT0FBTyxlQUFlO1NBQ3RCLElBQUksU0FBUyxnQkFBZ0IsS0FBSyxNQUFNLGNBQWMsTUFBTTtTQUM1RCxXQUFXLE9BQU8sQ0FBQyxHQUFHLFVBQVUsWUFBWTtTQUM1QyxNQUFNO1FBQ1IsS0FBSyxhQUNILGlCQUFpQixDQUFDO09BQ3RCO01BQ0Y7TUFDQSxhQUFhLGFBQWE7TUFDMUIsU0FBUyxlQUNMLGVBQWUsU0FBUyxJQUMxQixtQkFBbUIsZUFBZSxTQUFTLE9BQzFDLGlCQUFpQixNQUFNLFdBQ3hCLFNBQVMsaUJBQ0osTUFBTSxZQUFZLENBQUMsVUFBVSxJQUM5QixlQUFlLEtBQUssVUFBVTtLQUN0QyxPQUNFLGlCQUFrQjtNQUNoQixNQUFNO01BQ04sS0FBSyxhQUFhO01BQ2xCLFNBQVMsYUFBYTtNQUN0QixVQUFVLGFBQWE7TUFDdkIsTUFBTTtLQUNSLEdBQ0UsU0FBUyxXQUNILHFCQUFxQixVQUFVLGdCQUNoQyxvQkFBb0IsWUFDcEIsVUFBVSxRQUFRLE9BQU8sZ0JBQzdCLGtCQUFrQjtLQUN2QixlQUFlLGFBQWE7S0FDNUIsSUFBSSxTQUFTLGNBQ1gsSUFBTSxlQUFlLE1BQU0sT0FBTyxTQUFVLFNBQVMsY0FDbkQ7VUFFQSxpQkFBa0IsY0FDZixlQUFlLGVBQWUsTUFDOUIsZUFBZSxPQUFPLE1BQ3RCLE1BQU0saUJBQWlCLGdCQUN2QixNQUFNLE9BQU8sVUFBVTtJQUNoQyxTQUFTO0lBQ1QsU0FBUyxZQUFZLG9CQUFvQjtJQUN6QyxNQUFNLFlBQVk7SUFDbEIsTUFBTSxrQkFBa0I7SUFDeEIsTUFBTSxpQkFBaUI7SUFDdkIsU0FBUyxvQkFBb0IsTUFBTSxPQUFPLFFBQVE7SUFDbEQsa0NBQWtDO0lBQ2xDLGVBQWUsUUFBUTtJQUN2QixlQUFlLGdCQUFnQjtHQUNqQztHQUNBLDJCQUEyQjtFQUM3QjtFQUNBLFNBQVMsYUFBYSxVQUFVLFNBQVM7R0FDdkMsSUFBSSxlQUFlLE9BQU8sVUFDeEIsTUFBTSxNQUNKLGlGQUNFLFFBQ0o7R0FDRixTQUFTLEtBQUssT0FBTztFQUN2QjtFQUNBLFNBQVMsc0JBQXNCLGFBQWEsU0FBUztHQUNuRCxJQUFJLGtCQUFrQixZQUFZLE9BQU87R0FDekMsSUFBSSxTQUFTLGlCQUNYLEtBQ0UsWUFBWSxPQUFPLGtCQUFrQixNQUFNLGNBQWMsR0FDekQsY0FBYyxnQkFBZ0IsUUFDOUIsZUFFQSxhQUFhLGdCQUFnQixjQUFjLE9BQU87RUFDeEQ7RUFDQSxTQUFTLGdCQUFnQixhQUFhLFNBQVM7R0FDN0MsSUFBSSxZQUFZLFlBQVk7R0FDNUIsSUFBSSxTQUFTLFdBQ1gsS0FDRSxZQUFZLFlBQVksTUFBTSxjQUFjLEdBQzVDLGNBQWMsVUFBVSxRQUN4QixlQUVBLGFBQWEsVUFBVSxjQUFjLE9BQU87RUFDbEQ7RUFDQSxTQUFTLGtCQUFrQixPQUFPLFNBQVM7R0FDekMsSUFBSSwyQkFBMkI7R0FDL0IsS0FBSyxnQ0FBZ0MsMEJBQTBCLEtBQUs7R0FDcEUsS0FBSyw4QkFBOEIsU0FBUyxLQUFLO0dBQ2pELHVCQUF1QiwyQkFBMkIsUUFBUTtFQUM1RDtFQUNBLFNBQVMsMEJBQTBCLE9BQU87R0FDeEMsS0FBSyxnQ0FBZ0Msc0JBQXNCLEtBQUs7R0FDaEUsS0FDRSw4QkFDQSw2QkFBNkIsU0FDN0IsS0FDRjtFQUNGO0VBQ0EsU0FBUyxpQkFBaUIsT0FBTztHQUMvQix1QkFBdUIsK0JBQStCO0dBQ3RELElBQUksOEJBQThCLEtBQUs7R0FDdkMsSUFBSSxnQ0FBZ0MsS0FBSztFQUMzQztFQUNBLFNBQVMsK0JBQStCL
15852FNBQVM7R0FDL0MsSUFBSSxVQUFVLFFBQVE7R0FDdEIsS0FDRSxxQkFDQSxvQkFBb0IsVUFBVSw0QkFDOUIsT0FDRjtHQUNBLEtBQUssNEJBQTRCLFNBQVMsT0FBTztHQUNqRCxTQUFTLGtCQUNOLFNBQVMsV0FBVyxTQUFTLDZCQUE2QixVQUN0RCxnQkFBZ0IsVUFDakIsU0FBUyxRQUFRLGtCQUFrQixnQkFBZ0I7RUFDM0Q7RUFDQSxTQUFTLHNDQUFzQyxPQUFPO0dBQ3BELEtBQUsscUJBQXFCLG9CQUFvQixTQUFTLEtBQUs7R0FDNUQsS0FBSyw0QkFBNEIsT0FBTyxLQUFLO0dBQzdDLFNBQVMsa0JBQWtCLGdCQUFnQjtFQUM3QztFQUNBLFNBQVMsNkJBQTZCLE9BQU87R0FDM0MsT0FBTyxNQUFNLE9BQ1IsS0FBSyxxQkFBcUIsb0JBQW9CLFNBQVMsS0FBSyxHQUM3RCxLQUFLLDRCQUE0QixPQUFPLEtBQUssR0FDN0MsU0FBUyxrQkFBa0IsZ0JBQWdCLFVBQzNDLDRCQUE0QixLQUFLO0VBQ3ZDO0VBQ0EsU0FBUyw0QkFBNEIsT0FBTztHQUMxQyxLQUFLLHFCQUFxQixvQkFBb0IsU0FBUyxLQUFLO0dBQzVELEtBQ0UsNEJBQ0EsMkJBQTJCLFNBQzNCLEtBQ0Y7RUFDRjtFQUNBLFNBQVMsbUJBQW1CLE9BQU87R0FDakMsSUFBSSw0QkFBNEIsS0FBSztHQUNyQyxrQkFBa0IsVUFBVSxnQkFBZ0I7R0FDNUMsSUFBSSxxQkFBcUIsS0FBSztFQUNoQztFQUNBLFNBQVMsd0JBQXdCLE9BQU8sWUFBWTtHQUNsRCxLQUNFLDRCQUNBLDJCQUEyQixTQUMzQixLQUNGO0dBQ0EsS0FBSyxxQkFBcUIsWUFBWSxLQUFLO0VBQzdDO0VBQ0EsU0FBUyx1QkFBdUIsT0FBTztHQUNyQyxJQUFJLHFCQUFxQixLQUFLO0dBQzlCLElBQUksNEJBQTRCLEtBQUs7R0FDckMsa0JBQWtCLFVBQVUsZ0JBQWdCO0VBQzlDO0VBQ0EsU0FBUyxtQkFBbUIsS0FBSztHQUMvQixLQUFLLElBQUksT0FBTyxLQUFLLFNBQVMsT0FBUTtJQUNwQyxJQUFJLE9BQU8sS0FBSyxLQUFLO0tBQ25CLElBQUksUUFBUSxLQUFLO0tBQ2pCLElBQ0UsU0FBUyxVQUNQLFFBQVEsTUFBTSxZQUNoQixTQUFTLFNBQ1AsMEJBQTBCLEtBQUssS0FDL0IsMkJBQTJCLEtBQUssSUFFbEMsT0FBTztJQUNYLE9BQU8sSUFDTCxPQUFPLEtBQUssT0FDWixrQkFBa0IsS0FBSyxjQUFjLGFBRWpDO1NBQUEsT0FBTyxLQUFLLFFBQVEsTUFBTSxPQUFPO0lBQUEsT0FDaEMsSUFBSSxTQUFTLEtBQUssT0FBTztLQUM5QixLQUFLLE1BQU0sU0FBUztLQUNwQixPQUFPLEtBQUs7S0FDWjtJQUNGO0lBQ0EsSUFBSSxTQUFTLEtBQUs7SUFDbEIsT0FBTyxTQUFTLEtBQUssVUFBVztLQUM5QixJQUFJLFNBQVMsS0FBSyxVQUFVLEtBQUssV0FBVyxLQUFLLE9BQU87S0FDeEQsT0FBTyxLQUFLO0lBQ2Q7SUFDQSxLQUFLLFFBQVEsU0FBUyxLQUFLO0lBQzNCLE9BQU8sS0FBSztHQUNkO0dBQ0EsT0FBTztFQUNUO0VBQ0EsU0FBUyxvQkFBb0I7R0FDM0IsSUFBSSxXQUFXO0dBQ2YsU0FBUyxlQUNKLGVBQWUsQ0FBQyxRQUFRLElBQ3pCLGFBQWEsS0FBSyxRQUFRO0VBQ2hDO0VBQ0EsU0FBUyxxQkFBcUI7R0FDNUIsSUFBSSxXQUFXO0dBQ2YsSUFDRSxTQUFTLGlCQUNSLDJCQUNELGFBQWEsNkJBQTZCLFdBQzFDO0lBQ0EsSUFBSSxnQkFBZ0IsMEJBQTBCLHVCQUF1QjtJQUNyRSxJQUNFLENBQUMsd0NBQXdDLElBQUksYUFBYSxNQUN6RCx3Q0FBd0MsSUFBSSxhQUFhLEdBQzFELFNBQVMsZUFDVDtLQUNBLEtBQUssSUFBSSxRQUFRLElBQUksSUFBSSxHQUFHLEtBQUsseUJBQXlCLEtBQUs7TUFDN0QsSUFBSSxjQUFjLGFBQWEsSUFDN0IsY0FDRSxNQUFNLDBCQUEwQixXQUFXO01BQy9DLEtBQ0UsY0FBYyxJQUFJLElBQUksT0FBTyxhQUM3QixLQUFLLFlBQVksU0FHakIsZUFBZTtNQUNqQixlQUFlLGNBQWM7TUFDN0IsU0FBUztLQUNYO0tBQ0EsUUFBUSxNQUNOLCtXQUNBLGVBQ0EsS0FDRjtJQUNGO0dBQ0Y7RUFDRjtFQUNBLFNBQVMscUJBQXFCLE1BQU07R0FDbEMsS0FBSyxNQUFNLFFBQ1QsU0FBUyxRQUNULFlBQVksSUFBSSxLQUNoQixRQUFRLE1BQ04sb0lBQ0Esc0JBQ0EsT0FBTyxJQUNUO0VBQ0o7RUFDQSxTQUFTLDBCQUEwQjtHQUNqQyxJQUFJLGdCQUFnQiwwQkFBMEIsdUJBQXVCO0dBQ3JFLHlCQUF5QixJQUFJLGFBQWEsTUFDdkMseUJBQXlCLElBQUksYUFBYSxHQUMzQyxRQUFRLE1BQ04saUhBQ0EsYUFDRjtFQUNKO0VBQ0EsU0FBUyx3QkFBd0I7R0FDL0IsTUFBTSxNQUNKLCthQUNGO0VBQ0Y7RUFDQSxTQUFTLG1CQUFtQixVQUFVLFVBQVU7R0FDOUMsSUFBSSw0QkFBNEIsT0FBTyxDQUFDO0dBQ3hDLElBQUksU0FBUyxVQUNYLE9BQ0UsUUFBUSxNQUNOLDRLQUNBLG9CQUNGLEdBQ0EsQ0FBQztHQUVMLFNBQVMsV0FBVyxTQUFTLFVBQzNCLFFBQVEsTUFDTixzSkFDQSxzQkFDQSxNQUFNLFNBQVMsS0FBSyxJQUFJLElBQUksS0FDNUIsTUFBTSxTQUFTLEtBQUssSUFBSSxJQUFJLEdBQzlCO0dBQ0YsS0FBSyxJQUFJLElBQUksR0FBRyxJQUFJLFNBQVMsVUFBVSxJQUFJLFNBQVMsUUFBUSxLQUMxRCxJQUFJLENBQUMsU0FBUyxTQUFTLElBQUksU0FBUyxFQUFFLEdBQUcsT0FBTyxDQUFDO0dBQ25ELE9BQU8sQ0FBQztFQUNWO0VBQ0EsU0FBUyxnQkFDUCxTQUNBLGdCQUNBLFdBQ0EsT0FDQSxXQUNBLGlCQUNBO0dBQ0EsY0FBYztHQUNkLDBCQUEwQjtHQUMxQixlQUFlLFNBQVMsVUFBVSxRQUFRLGtCQUFrQjtHQUM1RCwwQkFBMEI7R0FDMUIsNkJBQ0UsU0FBUyxXQUFXLFFBQVEsU0FBUyxlQUFlO0dBQ3RELElBQ0UsNkJBQ0UsT0FBTyxVQUFVLFNBQVMsS0FBSyxTQUFTLEtBQzFDLHNDQUNFLE9BQU8sVUFBVSxTQUFTLEtBQUssU0FBUyxHQUUxQyxrQkFBbUIsMEJBQTBCLHVCQUF1QixHQUNsRSxpQ0FBaUMsSUFBSSxlQUFlLE1BQ2pELGlDQUFpQyxJQUFJLGVBQWUsR0FDckQsUUFBUSxNQUNOLGdOQUNBLFNBQVMsa0JBQ0wseUJBQ0EsTUFBTSxrQkFBa0IsR0FDOUI7R0FDTixlQUFlLGdCQUFnQjtHQUMvQixlQUFlLGNBQWM7R0FDN0IsZUFBZSxRQUFRO0dBQ3ZCLHFCQUFxQixJQUNuQixTQUFTLFdBQVcsU0FBUyxRQUFRLGdCQUNqQywrQkFDQSxTQUFTLGVBQ1AsMkNBQ0E7R0FDUixzQ0FBc0MsbUJBQ25DLGVBQWUsT0FBTyxzQkFBc0I7R0FDL0MsSUFBSSxXQUFXLG1CQUFtQixXQUFXLE9BQU8sU0FBUztHQUM3RCxzQ0FBc0MsQ0FBQztHQUN2QywrQ0FDRyxXQUFXLHFCQUNWLGdCQUNBLFdBQ0EsT0FDQSxTQUNGO0dBQ0YsSUFBSSxpQkFBaUI7SUFDbkIsMkJBQTJCLENBQUMsQ0FBQztJQUM3QixJQUFJO0tBQ0YsV0FBVyxxQkFDVCxnQkFDQSxXQUNBLE9BQ0EsU0FDRjtJQUNGLFVBQVU7S0FDUiwyQkFBMkIsQ0FBQyxDQUFDO0lBQy9CO0dBQ0Y7R0FDQSxxQkFBcUIsU0FBUyxjQUFjO0dBQzVDLE9BQU87RUFDVDtFQUNBLFNBQVMscUJBQXFCLFNBQVMsZ0JBQWdCO0dBQ3JELGVBQWUsa0JBQWtCO0dBQ2pDLFNBQVMsZUFBZSxlQUNwQixTQUFTLGtCQUNSLGVBQWUsZUFBZTtJQUM3QixPQUFPO0lBQ1AsY0FBYztJQUNkLHFCQUFxQjtHQUN2QixLQUNDLGVBQWUsYUFBYSxzQkFBc0I7R0FDdkQsSUFBSSx5QkFBeUI7R0FDN0IsU0FBUyxzQkFDUCxlQUFlLG9CQUFvQixjQUFjLE1BQ2hELFNBQVMsMEJBQ1IsU0FBUyxzQkFDVCx1QkFDRSxxQkFBcUIsQ0FBQyxHQUFJLFFBQVEsTUFBTSxrQkFBa0IsSUFDN0QscUJBQXFCLHFCQUFxQjtHQUM3QyxxQkFBcUIsSUFBSTtHQUN6Qix5QkFDRSxTQUFTLGVBQWUsU0FBUyxZQUFZO0dBQy9DLGNBQWM7R0FDZCxlQUNFLHVCQUNBLHFCQUNBLGNBQ0EsMEJBQ0U7R0FDSiwwQkFBMEI7R0FDMUIsU0FBUyxZQUNOLFFBQVEsUUFBUSxpQkFBaUIsZUFBZSxRQUFRLGVBQ3pELFFBQVEsTUFDTix1RkFDRjtHQUNGLCtCQUErQixDQUFDO0dBQ2hDLHVCQUF1QjtHQUN2QixnQkFBZ0I7R0FDaEIsSUFBSSx3QkFDRixNQUFNLE1BQ0osaUdBQ0Y7R0FDRixTQUFTLFdBQ1AscUJBQ0UsVUFBVSxRQUFRLGNBQ3BCLFNBQVMsV0FDUCxzQkFBc0IsT0FBTyxNQUM1QixtQk
15852FBbUIsQ0FBQztHQUN6QixvQ0FDTSxtQ0FBbUMsQ0FBQyxHQUFLLFVBQVUsQ0FBQyxLQUNyRCxVQUFVLENBQUM7R0FDaEIsWUFDSSxpQkFDQSwwQkFBMEIsY0FBYyxLQUFLLFdBQy9DLGlDQUFpQyxJQUFJLGNBQWMsS0FDakQsaUNBQWlDLElBQUksY0FBYyxNQUNsRCxpQ0FBaUMsSUFBSSxjQUFjLEdBQ3BELFFBQVEsTUFDTix3TEFDRjtFQUNOO0VBQ0EsU0FBUyxxQkFBcUIsZ0JBQWdCLFdBQVcsT0FBTyxXQUFXO0dBQ3pFLDBCQUEwQjtHQUMxQixJQUFJLG9CQUFvQjtHQUN4QixHQUFHO0lBQ0QsK0NBQStDLGdCQUFnQjtJQUMvRCx1QkFBdUI7SUFDdkIsNkNBQTZDLENBQUM7SUFDOUMsSUFBSSxxQkFBcUIsaUJBQ3ZCLE1BQU0sTUFDSixzRkFDRjtJQUNGLHFCQUFxQjtJQUNyQiw2QkFBNkIsQ0FBQztJQUM5QixxQkFBcUIsY0FBYztJQUNuQyxJQUFJLFFBQVEsZUFBZSxhQUFhO0tBQ3RDLElBQUksV0FBVyxlQUFlO0tBQzlCLFNBQVMsYUFBYTtLQUN0QixTQUFTLFNBQVM7S0FDbEIsU0FBUyxTQUFTO0tBQ2xCLFFBQVEsU0FBUyxjQUFjLFNBQVMsVUFBVSxRQUFRO0lBQzVEO0lBQ0EsMEJBQTBCO0lBQzFCLHFCQUFxQixJQUFJO0lBQ3pCLFdBQVcsbUJBQW1CLFdBQVcsT0FBTyxTQUFTO0dBQzNELFNBQVM7R0FDVCxPQUFPO0VBQ1Q7RUFDQSxTQUFTLCtCQUErQjtHQUN0QyxJQUFJLGFBQWEscUJBQXFCLEdBQ3BDLGdCQUFnQixXQUFXLFNBQVMsQ0FBQyxDQUFDO0dBQ3hDLGdCQUNFLGVBQWUsT0FBTyxjQUFjLE9BQ2hDLFlBQVksYUFBYSxJQUN6QjtHQUNOLGFBQWEsV0FBVyxTQUFTLENBQUMsQ0FBQztHQUNuQyxDQUFDLFNBQVMsY0FBYyxZQUFZLGdCQUFnQixVQUNsRCxlQUFlLHdCQUF3QixTQUFTO0dBQ2xELE9BQU87RUFDVDtFQUNBLFNBQVMsdUJBQXVCO0dBQzlCLElBQUksa0JBQWtCLE1BQU07R0FDNUIsaUJBQWlCO0dBQ2pCLE9BQU87RUFDVDtFQUNBLFNBQVMsYUFBYSxTQUFTLGdCQUFnQixPQUFPO0dBQ3BELGVBQWUsY0FBYyxRQUFRO0dBQ3JDLGVBQWUsU0FDWixlQUFlLE9BQU8sdUJBQXVCLFNBQzFDLGVBQWUsUUFBUSxhQUN2QixlQUFlLFFBQVE7R0FDN0IsUUFBUSxTQUFTLENBQUM7RUFDcEI7RUFDQSxTQUFTLG1CQUFtQixnQkFBZ0I7R0FDMUMsSUFBSSw4QkFBOEI7SUFDaEMsS0FDRSxpQkFBaUIsZUFBZSxlQUNoQyxTQUFTLGlCQUVUO0tBQ0EsSUFBSSxRQUFRLGVBQWU7S0FDM0IsU0FBUyxVQUFVLE1BQU0sVUFBVTtLQUNuQyxpQkFBaUIsZUFBZTtJQUNsQztJQUNBLCtCQUErQixDQUFDO0dBQ2xDO0dBQ0EsY0FBYztHQUNkLGVBQ0UscUJBQ0EsY0FDQSwwQkFDRTtHQUNKLDBCQUEwQjtHQUMxQix1QkFBdUI7R0FDdkIsNkNBQTZDLENBQUM7R0FDOUMsdUJBQXVCLGlCQUFpQjtHQUN4QyxnQkFBZ0I7RUFDbEI7RUFDQSxTQUFTLDBCQUEwQjtHQUNqQyxJQUFJLE9BQU87SUFDVCxlQUFlO0lBQ2YsV0FBVztJQUNYLFdBQVc7SUFDWCxPQUFPO0lBQ1AsTUFBTTtHQUNSO0dBQ0EsU0FBUyxxQkFDSix3QkFBd0IsZ0JBQWdCLHFCQUFxQixPQUM3RCxxQkFBcUIsbUJBQW1CLE9BQU87R0FDcEQsT0FBTztFQUNUO0VBQ0EsU0FBUywyQkFBMkI7R0FDbEMsSUFBSSxTQUFTLGFBQWE7SUFDeEIsSUFBSSxrQkFBa0Isd0JBQXdCO0lBQzlDLGtCQUNFLFNBQVMsa0JBQWtCLGdCQUFnQixnQkFBZ0I7R0FDL0QsT0FBTyxrQkFBa0IsWUFBWTtHQUNyQyxJQUFJLHlCQUNGLFNBQVMscUJBQ0wsd0JBQXdCLGdCQUN4QixtQkFBbUI7R0FDekIsSUFBSSxTQUFTLHdCQUNYLHFCQUFzQix3QkFDbkIsY0FBYztRQUNkO0lBQ0gsSUFBSSxTQUFTLGlCQUFpQjtLQUM1QixJQUFJLFNBQVMsd0JBQXdCLFdBQ25DLE1BQU0sTUFDSiw0RkFDRjtLQUNGLE1BQU0sTUFBTSxzREFBc0Q7SUFDcEU7SUFDQSxjQUFjO0lBQ2Qsa0JBQWtCO0tBQ2hCLGVBQWUsWUFBWTtLQUMzQixXQUFXLFlBQVk7S0FDdkIsV0FBVyxZQUFZO0tBQ3ZCLE9BQU8sWUFBWTtLQUNuQixNQUFNO0lBQ1I7SUFDQSxTQUFTLHFCQUNKLHdCQUF3QixnQkFBZ0IscUJBQ3ZDLGtCQUNELHFCQUFxQixtQkFBbUIsT0FBTztHQUN0RDtHQUNBLE9BQU87RUFDVDtFQUNBLFNBQVMscUNBQXFDO0dBQzVDLE9BQU87SUFBRSxZQUFZO0lBQU0sUUFBUTtJQUFNLFFBQVE7SUFBTSxXQUFXO0dBQUs7RUFDekU7RUFDQSxTQUFTLFlBQVksVUFBVTtHQUM3QixJQUFJLFFBQVE7R0FDWix3QkFBd0I7R0FDeEIsU0FBUyxrQkFBa0IsZ0JBQWdCLG9CQUFvQjtHQUMvRCxXQUFXLGtCQUNULGVBQ0EsVUFDQSxPQUNBLHVCQUNGO0dBQ0EsUUFBUTtHQUNSLFVBQ0csU0FBUyxxQkFDTixNQUFNLGdCQUNOLG1CQUFtQixVQUNyQixRQUFRLE1BQU0sV0FDZixxQkFBcUIsSUFDcEIsU0FBUyxTQUFTLFNBQVMsTUFBTSxnQkFDN0IsK0JBQ0E7R0FDUixPQUFPO0VBQ1Q7RUFDQSxTQUFTLElBQUksUUFBUTtHQUNuQixJQUFJLFNBQVMsVUFBVSxhQUFhLE9BQU8sUUFBUTtJQUNqRCxJQUFJLGVBQWUsT0FBTyxPQUFPLE1BQU0sT0FBTyxZQUFZLE1BQU07SUFDaEUsSUFBSSxPQUFPLGFBQWEsd0JBQXdCO0lBQ2hELElBQUksT0FBTyxhQUFhLG9CQUFvQixPQUFPLFlBQVksTUFBTTtHQUN2RTtHQUNBLE1BQU0sTUFBTSw4Q0FBOEMsT0FBTyxNQUFNLENBQUM7RUFDMUU7RUFDQSxTQUFTLGFBQWEsTUFBTTtHQUMxQixJQUFJLFlBQVksTUFDZCxjQUFjLHdCQUF3QjtHQUN4QyxTQUFTLGdCQUFnQixZQUFZLFlBQVk7R0FDakQsSUFBSSxRQUFRLFdBQVc7SUFDckIsSUFBSSxVQUFVLHdCQUF3QjtJQUN0QyxTQUFTLFlBQ0wsVUFBVSxRQUFRLGFBQ3BCLFNBQVMsWUFDTCxVQUFVLFFBQVEsV0FDcEIsUUFBUSxZQUNMLFlBQVk7S0FDWCxNQUFNLFFBQVEsS0FBSyxJQUFJLFNBQVUsT0FBTztNQUN0QyxPQUFPLE1BQU0sTUFBTTtLQUNyQixDQUFDO0tBQ0QsT0FBTztJQUNUO0dBQ1I7R0FDQSxjQUFrQztJQUFFLE1BQU0sQ0FBQztJQUFHLE9BQU87R0FBRTtHQUN2RCxTQUFTLGdCQUNMLGNBQWMsbUNBQW1DLEdBQ2xELHdCQUF3QixjQUFjO0dBQ3pDLFlBQVksWUFBWTtHQUN4QixjQUFjLFVBQVUsS0FBSyxVQUFVO0dBQ3ZDLElBQUksS0FBSyxNQUFNLGVBQWUsNEJBQzVCLEtBQ0UsY0FBYyxVQUFVLEtBQUssVUFBVSxTQUFTLE1BQU0sSUFBSSxHQUN4RCxVQUFVLEdBQ1osVUFBVSxNQUNWLFdBRUEsWUFBWSxXQUFXO1FBRXpCLFlBQVksV0FBVyxRQUNyQixRQUFRLE1BQ04sbUpBQ0EsWUFBWSxRQUNaLElBQ0Y7R0FDSixVQUFVO0dBQ1YsT0FBTztFQUNUO0VBQ0EsU0FBUyxrQkFBa0IsT0FBTyxRQUFRO0dBQ3hDLE9BQU8sZUFBZSxPQUFPLFNBQVMsT0FBTyxLQUFLLElBQUk7RUFDeEQ7RUFDQSxTQUFTLGFBQWEsU0FBUyxZQUFZLE1BQU07R0FDL0MsSUFBSSxPQUFPLHdCQUF3QjtHQUNuQyxJQUFJLEtBQUssTUFBTSxNQUFNO0lBQ25CLElBQUksZUFBZSxLQUFLLFVBQVU7SUFDbEMsSUFBSSxxQ0FBcUM7S0FDdkMsMkJBQTJCLENBQUMsQ0FBQztLQUM3QixJQUFJO01BQ0YsS0FBSyxVQUFVO0tBQ2pCLFVBQVU7TUFDUiwyQkFBMkIsQ0FBQyxDQUFDO0tBQy9CO0lBQ0Y7R0FDRixPQUFPLGVBQWU7R0FDdEIsS0FBSyxnQkFBZ0IsS0FBSyxZQUFZO0dBQ3RDLFVBQVU7SUFDUixTQUFTO0lBQ1QsT0FBTztJQUNQLFVBQVU7SUFDVixxQkFBcUI7SUFDckIsbUJBQW1CO0dBQ3JCO0dBQ0EsS0FBSyxRQUFRO0dBQ2IsVUFBVSxRQUFRLFdBQVcsc0JBQXNCLEtBQ2pELE1BQ0EseUJBQ0EsT0FDRjtHQUNBLE9BQU8sQ0FBQyxLQUFLLGVBQWUsT0FBTztFQUNyQztFQUNBLFNBQVMsY0FBYyxTQUFTO0dBRTlCLE9BQU8sa0JBREkseUJBQ2lCLEdBQUcsYUFBYSxPQUFPO0VBQ3JEO0VBQ0EsU0FBUyxrQkFBa0IsTUFBTSxTQUFTLFNBQVM7R0FDakQsSUFBSSxRQUFRLEtBQUs7R0FDakIsSUFBSSxTQUFTLE9BQ1gsTUFBTSxNQUNKLG1JQUNGO0dBQ0YsTUFBTSxzQkFBc0I7R0FDNUIsSUFBSSxZQUFZLEtB
15852QUssV0FDbkIsZUFBZSxNQUFNO0dBQ3ZCLElBQUksU0FBUyxjQUFjO0lBQ3pCLElBQUksU0FBUyxXQUFXO0tBQ3RCLElBQUksWUFBWSxVQUFVO0tBQzFCLFVBQVUsT0FBTyxhQUFhO0tBQzlCLGFBQWEsT0FBTztJQUN0QjtJQUNBLFFBQVEsY0FBYyxhQUNwQixRQUFRLE1BQ04sd0ZBQ0Y7SUFDRixRQUFRLFlBQVksWUFBWTtJQUNoQyxNQUFNLFVBQVU7R0FDbEI7R0FDQSxlQUFlLEtBQUs7R0FDcEIsSUFBSSxTQUFTLFdBQVcsS0FBSyxnQkFBZ0I7UUFDeEM7SUFDSCxVQUFVLFVBQVU7SUFDcEIsSUFBSSxvQkFBcUIsWUFBWSxNQUNuQyxtQkFBbUIsTUFDbkIsU0FBUyxTQUNULGtDQUFrQyxDQUFDO0lBQ3JDLEdBQUc7S0FDRCxJQUFJLGFBQWEsT0FBTyxPQUFPO0tBQy9CLElBQ0UsZUFBZSxPQUFPLFFBQ2pCLGdDQUFnQyxnQkFBZ0IsY0FDaEQsY0FBYyxnQkFBZ0IsWUFDbkM7TUFDQSxJQUFJLGFBQWEsT0FBTztNQUN4QixJQUFJLE1BQU0sWUFDUixTQUFTLHFCQUNOLG1CQUFtQixpQkFBaUIsT0FDbkM7T0FDRSxNQUFNO09BQ04sWUFBWTtPQUNaLFNBQVM7T0FDVCxRQUFRLE9BQU87T0FDZixlQUFlLE9BQU87T0FDdEIsWUFBWSxPQUFPO09BQ25CLE1BQU07TUFDUixJQUNGLGVBQWUseUJBQ1osa0NBQWtDLENBQUM7V0FDckMsS0FBSyxjQUFjLGdCQUFnQixZQUFZO09BQ2xELFNBQVMsT0FBTztPQUNoQixlQUFlLHlCQUNaLGtDQUFrQyxDQUFDO09BQ3RDO01BQ0YsT0FDRSxhQUFjO09BQ1osTUFBTTtPQUNOLFlBQVksT0FBTztPQUNuQixTQUFTO09BQ1QsUUFBUSxPQUFPO09BQ2YsZUFBZSxPQUFPO09BQ3RCLFlBQVksT0FBTztPQUNuQixNQUFNO01BQ1IsR0FDRSxTQUFTLG9CQUNILG9CQUFvQixtQkFBbUIsWUFDeEMsWUFBWSxnQkFDWixtQkFBbUIsaUJBQWlCLE9BQU8sWUFDL0Msd0JBQXdCLFNBQVMsWUFDakMsa0NBQWtDO01BQ3ZDLGFBQWEsT0FBTztNQUNwQix1Q0FDRSxRQUFRLGNBQWMsVUFBVTtNQUNsQyxlQUFlLE9BQU8sZ0JBQ2xCLE9BQU8sYUFDUCxRQUFRLGNBQWMsVUFBVTtLQUN0QyxPQUNFLGFBQWM7TUFDWixNQUFNO01BQ04sWUFBWSxPQUFPO01BQ25CLFNBQVMsT0FBTztNQUNoQixRQUFRLE9BQU87TUFDZixlQUFlLE9BQU87TUFDdEIsWUFBWSxPQUFPO01BQ25CLE1BQU07S0FDUixHQUNFLFNBQVMsb0JBQ0gsb0JBQW9CLG1CQUFtQixZQUN4QyxZQUFZLGdCQUNaLG1CQUFtQixpQkFBaUIsT0FBTyxZQUMvQyx3QkFBd0IsU0FBUyxZQUNqQyxrQ0FBa0M7S0FDdkMsU0FBUyxPQUFPO0lBQ2xCLFNBQVMsU0FBUyxVQUFVLFdBQVc7SUFDdkMsU0FBUyxtQkFDSixZQUFZLGVBQ1osaUJBQWlCLE9BQU87SUFDN0IsSUFDRSxDQUFDLFNBQVMsY0FBYyxLQUFLLGFBQWEsTUFDeEMsbUJBQW1CLENBQUMsR0FDdEIsb0NBQ0ksVUFBVSxnQ0FBaUMsU0FBUyxXQUV4RCxN
15852QUFNO0lBQ1IsS0FBSyxnQkFBZ0I7SUFDckIsS0FBSyxZQUFZO0lBQ2pCLEtBQUssWUFBWTtJQUNqQixNQUFNLG9CQUFvQjtHQUM1QjtHQUNBLFNBQVMsY0FBYyxNQUFNLFFBQVE7R0FDckMsT0FBTyxDQUFDLEtBQUssZUFBZSxNQUFNLFFBQVE7RUFDNUM7RUFDQSxTQUFTLGdCQUFnQixTQUFTO0dBQ2hDLElBQUksT0FBTyx5QkFBeUIsR0FDbEMsUUFBUSxLQUFLO0dBQ2YsSUFBSSxTQUFTLE9BQ1gsTUFBTSxNQUNKLG1JQUNGO0dBQ0YsTUFBTSxzQkFBc0I7R0FDNUIsSUFBSSxXQUFXLE1BQU0sVUFDbkIsd0JBQXdCLE1BQU0sU0FDOUIsV0FBVyxLQUFLO0dBQ2xCLElBQUksU0FBUyx1QkFBdUI7SUFDbEMsTUFBTSxVQUFVO0lBQ2hCLElBQUksU0FBVSx3QkFBd0Isc0JBQXNCO0lBQzVEO0tBQ0UsV0FBWSxRQUFRLFVBQVUsT0FBTyxNQUFNLEdBQUssU0FBUyxPQUFPO1dBQzNELFdBQVc7SUFDbEIsU0FBUyxVQUFVLEtBQUssYUFBYSxNQUFNLG1CQUFtQixDQUFDO0lBQy9ELEtBQUssZ0JBQWdCO0lBQ3JCLFNBQVMsS0FBSyxjQUFjLEtBQUssWUFBWTtJQUM3QyxNQUFNLG9CQUFvQjtHQUM1QjtHQUNBLE9BQU8sQ0FBQyxVQUFVLFFBQVE7RUFDNUI7RUFDQSxTQUFTLHVCQUF1QixXQUFXLGFBQWEsbUJBQW1CO0dBQ3pFLElBQUksUUFBUSx5QkFDVixPQUFPLHdCQUF3QjtHQUNqQyxJQUFJLGFBQWE7SUFDZixJQUFJLEtBQUssTUFBTSxtQkFDYixNQUFNLE1BQ0osNEdBQ0Y7SUFDRixJQUFJLGVBQWUsa0JBQWtCO0lBQ3JDLDhCQUNFLGlCQUFpQixrQkFBa0IsTUFDbEMsUUFBUSxNQUNQLDRFQUNGLEdBQ0MsNkJBQTZCLENBQUM7R0FDbkMsT0FBTztJQUNMLGVBQWUsWUFBWTtJQUMzQiwrQkFDSSxvQkFBb0IsWUFBWSxHQUNsQyxTQUFTLGNBQWMsaUJBQWlCLE1BQ3JDLFFBQVEsTUFDUCxzRUFDRixHQUNDLDZCQUE2QixDQUFDO0lBQ25DLElBQUksU0FBUyxvQkFDWCxNQUFNLE1BQ0osaUZBQ0Y7SUFDRixPQUFPLGdDQUFnQyxRQUNyQywwQkFBMEIsT0FBTyxhQUFhLFlBQVk7R0FDOUQ7R0FDQSxLQUFLLGdCQUFnQjtHQUNyQixvQkFBb0I7SUFBRSxPQUFPO0lBQTJCO0dBQVk7R0FDcEUsS0FBSyxRQUFRO0dBQ2IsWUFDRSxpQkFBaUIsS0FBSyxNQUFNLE9BQU8sbUJBQW1CLFNBQVMsR0FDL0QsQ0FBQyxTQUFTLENBQ1o7R0FDQSxNQUFNLFNBQVM7R0FDZixpQkFDRSxZQUFZLFNBQ1osRUFBRSxTQUFTLEtBQUssRUFBRSxHQUNsQixvQkFBb0IsS0FDbEIsTUFDQSxPQUNBLG1CQUNBLGNBQ0EsV0FDRixHQUNBLElBQ0Y7R0FDQSxPQUFPO0VBQ1Q7RUFDQSxTQUFTLHdCQUNQLFdBQ0EsYUFDQSxtQkFDQTtHQUNBLElBQUksUUFBUSx5QkFDVixPQUFPLHlCQUF5QixHQUNoQyx1QkFBdUI7R0FDekIsSUFBSSxzQkFBc0I7SUFDeEIsSUFBSSxLQUFLLE1BQU0sbUJBQ2IsTUFBTSxNQUNKLDRHQUNGO0lBQ0Ysb0JBQW9CLGtCQUFrQjtHQUN4QyxPQUFPLElBQ0gsb0JBQW9CLFlBQVksR0FBSSxDQUFDLDRCQUN2QztJQUNBLElBQUksaUJBQWlCLFlBQVk7SUFDakMsU0FBUyxtQkFBbUIsY0FBYyxNQUN2QyxRQUFRLE1BQ1Asc0VBQ0YsR0FDQyw2QkFBNkIsQ0FBQztHQUNuQztHQUNBLElBQ0csaUJBQWlCLENBQUMsVUFDaEIsZUFBZSxLQUFBLENBQU0sZUFDdEIsaUJBQ0YsR0FFQSxLQUFNLGdCQUFnQixtQkFBcUIsbUJBQW1CLENBQUM7R0FDakUsT0FBTyxLQUFLO0dBRVosaUJBQWlCLE1BQU0sU0FEVixpQkFBaUIsS0FBSyxNQUFNLE9BQU8sTUFBTSxTQUNqQixHQUFHLENBQUMsU0FBUyxDQUFDO0dBQ25ELFlBQ0UsS0FBSyxnQkFBZ0IsZUFDckIsa0JBQ0MsU0FBUyx1QkFDUCxtQkFBbUIsY0FBYyxNQUFNLGVBQWU7R0FDM0QsaUJBQ0UsWUFBWSxZQUFZLFVBQVUsU0FDbEMsRUFBRSxTQUFTLEtBQUssRUFBRSxHQUNsQixvQkFBb0IsS0FDbEIsTUFDQSxPQUNBLE1BQ0EsbUJBQ0EsV0FDRixHQUNBLElBQ0Y7R0FDQSxJQUFJLFdBQVc7SUFDYixNQUFNLFNBQVM7SUFDZixJQUFJLFNBQVMsb0JBQ1gsTUFBTSxNQUNKLGlGQUNGO0lBQ0Ysd0JBQ0UsT0FBTyxjQUFjLFFBQ3JCLDBCQUEwQixPQUFPLGFBQWEsaUJBQWlCO0dBQ25FO0dBQ0EsT0FBTztFQUNUO0VBQ0EsU0FBUywwQkFBMEIsT0FBTyxhQUFhLGtCQUFrQjtHQUN2RSxNQUFNLFNBQVM7R0FDZixRQUFRO0lBQWU7SUFBYSxPQUFPO0dBQWlCO0dBQzVELGNBQWMsd0JBQXdCO0dBQ3RDLFNBQVMsZUFDSCxjQUFjLG1DQUFtQyxHQUNsRCx3QkFBd0IsY0FBYyxhQUN0QyxZQUFZLFNBQVMsQ0FBQyxLQUFLLE1BQzFCLG1CQUFtQixZQUFZLFFBQ2pDLFNBQVMsbUJBQ0osWUFBWSxTQUFTLENBQUMsS0FBSyxJQUM1QixpQkFBaUIsS0FBSyxLQUFLO0VBQ3JDO0VBQ0EsU0FBUyxvQkFBb0IsT0FBTyxNQUFNLGNBQWMsYUFBYTtHQUNuRSxLQUFLLFFBQVE7R0FDYixLQUFLLGNBQWM7R0FDbkIsdUJBQXVCLElBQUksS0FBSyxtQkFBbUIsS0FBSztFQUMxRDtFQUNBLFNBQVMsaUJBQWlCLE9BQU8sTUFBTSxXQUFXO0dBQ2hELE9BQU8sVUFBVSxXQUFZO0lBQzNCLHVCQUF1QixJQUFJLE1BQ3hCLHVCQUF1QixHQUFHLDZCQUE2QixLQUFLLEdBQzdELG1CQUFtQixLQUFLO0dBQzVCLENBQUM7RUFDSDtFQUNBLFNBQVMsdUJBQXVCLE1BQU07R0FDcEMsSUFBSSxvQkFBb0IsS0FBSztHQUM3QixPQUFPLEtBQUs7R0FDWixJQUFJO0lBQ0YsSUFBSSxZQUFZLGtCQUFrQjtJQUNsQyxPQUFPLENBQUMsU0FBUyxNQUFNLFNBQVM7R0FDbEMsU0FBUyxPQUFPO0lBQ2QsT0FBTyxDQUFDO0dBQ1Y7RUFDRjtFQUNBLFNBQVMsbUJBQW1CLE9BQU87R0FDakMsSUFBSSxPQUFPLCtCQUErQixPQUFPLENBQUM7R0FDbEQsU0FBUyxRQUFRLHNCQUFzQixNQUFNLE9BQU8sQ0FBQztFQUN2RDtFQUNBLFNBQVMsZUFBZSxjQUFjO0dBQ3BDLElBQUksT0FBTyx3QkFBd0I7R0FDbkMsSUFBSSxlQUFlLE9BQU8sY0FBYztJQUN0QyxJQUFJLDBCQUEwQjtJQUM5QixlQUFlLHdCQUF3QjtJQUN2QyxJQUFJLHFDQUFxQztLQUN2QywyQkFBMkIsQ0FBQyxDQUFDO0tBQzdCLElBQUk7TUFDRix3QkFBd0I7S0FDMUIsVUFBVTtNQUNSLDJCQUEyQixDQUFDLENBQUM7S0FDL0I7SUFDRjtHQUNGO0dBQ0EsS0FBSyxnQkFBZ0IsS0FBSyxZQUFZO0dBQ3RDLEtBQUssUUFBUTtJQUNYLFNBQVM7SUFDVCxPQUFPO0lBQ1AsVUFBVTtJQUNWLHFCQUFxQjtJQUNyQixtQk
15852FBbUI7R0FDckI7R0FDQSxPQUFPO0VBQ1Q7RUFDQSxTQUFTLFdBQVcsY0FBYztHQUNoQyxlQUFlLGVBQWUsWUFBWTtHQUMxQyxJQUFJLFFBQVEsYUFBYSxPQUN2QixXQUFXLGlCQUFpQixLQUFLLE1BQU0seUJBQXlCLEtBQUs7R0FDdkUsTUFBTSxXQUFXO0dBQ2pCLE9BQU8sQ0FBQyxhQUFhLGVBQWUsUUFBUTtFQUM5QztFQUNBLFNBQVMsZ0JBQWdCLGFBQWE7R0FDcEMsSUFBSSxPQUFPLHdCQUF3QjtHQUNuQyxLQUFLLGdCQUFnQixLQUFLLFlBQVk7R0FDdEMsSUFBSSxRQUFRO0lBQ1YsU0FBUztJQUNULE9BQU87SUFDUCxVQUFVO0lBQ1YscUJBQXFCO0lBQ3JCLG1CQUFtQjtHQUNyQjtHQUNBLEtBQUssUUFBUTtHQUNiLE9BQU8sMkJBQTJCLEtBQ2hDLE1BQ0EseUJBQ0EsQ0FBQyxHQUNELEtBQ0Y7R0FDQSxNQUFNLFdBQVc7R0FDakIsT0FBTyxDQUFDLGFBQWEsSUFBSTtFQUMzQjtFQUNBLFNBQVMsaUJBQWlCLGFBQWEsU0FBUztHQUU5QyxPQUFPLHFCQURJLHlCQUNvQixHQUFHLGFBQWEsYUFBYSxPQUFPO0VBQ3JFO0VBQ0EsU0FBUyxxQkFBcUIsTUFBTSxTQUFTLGFBQWEsU0FBUztHQUNqRSxLQUFLLFlBQVk7R0FDakIsT0FBTyxrQkFDTCxNQUNBLGFBQ0EsZUFBZSxPQUFPLFVBQVUsVUFBVSxpQkFDNUM7RUFDRjtFQUNBLFNBQVMsbUJBQW1CLGFBQWEsU0FBUztHQUNoRCxJQUFJLE9BQU8seUJBQXlCO0dBQ3BDLElBQUksU0FBUyxhQUNYLE9BQU8scUJBQXFCLE1BQU0sYUFBYSxhQUFhLE9BQU87R0FDckUsS0FBSyxZQUFZO0dBQ2pCLE9BQU8sQ0FBQyxhQUFhLEtBQUssTUFBTSxRQUFRO0VBQzFDO0VBQ0EsU0FBUyxvQkFDUCxPQUNBLGFBQ0EsaUJBQ0EsVUFDQSxTQUNBO0dBQ0EsSUFBSSxvQkFBb0IsS0FBSyxHQUMzQixNQUFNLE1BQU0sNkNBQTZDO0dBQzNELFFBQVEsWUFBWTtHQUNwQixJQUFJLFNBQVMsT0FBTztJQUNsQixJQUFJLGFBQWE7S0FDTjtLQUNULFFBQVE7S0FDUixNQUFNO0tBQ04sY0FBYyxDQUFDO0tBQ2YsUUFBUTtLQUNSLE9BQU87S0FDUCxRQUFRO0tBQ1IsV0FBVyxDQUFDO0tBQ1osTUFBTSxTQUFVLFVBQVU7TUFDeEIsV0FBVyxVQUFVLEtBQUssUUFBUTtLQUNwQztJQUNGO0lBQ0EsU0FBUyxxQkFBcUIsSUFDMUIsZ0JBQWdCLENBQUMsQ0FBQyxJQUNqQixXQUFXLGVBQWUsQ0FBQztJQUNoQyxTQUFTLFVBQVU7SUFDbkIsa0JBQWtCLFlBQVk7SUFDOUIsU0FBUyxtQkFDSCxXQUFXLE9BQU8sWUFBWSxVQUFVLFlBQzFDLHFCQUFxQixhQUFhLFVBQVUsTUFDMUMsV0FBVyxPQUFPLGdCQUFnQixNQUNuQyxZQUFZLFVBQVUsZ0JBQWdCLE9BQU87R0FDcEQ7RUFDRjtFQUNBLFNBQVMscUJBQXFCLGFBQWEsTUFBTTtHQUMvQyxJQUFJLFNBQVMsS0FBSyxRQUNoQixVQUFVLEtBQUssU0FDZixZQUFZLFlBQVk7R0FDMUIsSUFBSSxLQUFLLGNBQWM7SUFDckIsSUFBSSxpQkFBaUIscUJBQXFCLEdBQ3hDLG9CQUFvQixDQUFDO0lBQ3ZCLGtCQUFrQixRQUNoQixTQUFTLGlCQUFpQixlQUFlLFFBQVE7SUFDbkQsa0JBQWtCLGlDQUFpQixJQUFJLElBQUk7SUFDM0MscUJBQXFCLElBQUk7SUFDekIsSUFBSTtLQUNGLElBQUksY0FBYyxPQUFPLFdBQVcsT0FBTyxHQUN6QywwQkFBMEIscUJBQXFCO0tBQ2pELFNBQVMsMkJBQ1Asd0JBQXdCLG1CQUFtQixXQUFXO0tBQ3hELHdCQUF3QixhQUFhLE1BQU0sV0FBVztJQUN4RCxTQUFTLE9BQU87S0FDZCxjQUFjLGFBQWEsTUFBTSxLQUFLO0lBQ3hDLFVBQVU7S0FDUixTQUFTLGtCQUNQLFNBQVMsa0JBQWtCLFVBQzFCLFNBQVMsZUFBZSxTQUN2QixlQUFlLFVBQVUsa0JBQWtCLFNBQzNDLFFBQVEsTUFDTixzS0FDRixHQUNELGVBQWUsUUFBUSxrQkFBa0IsUUFDekMscUJBQXFCLElBQUksZ0JBQzFCLFNBQVMsa0JBQ1Asa0JBQWtCLG1CQUNoQixjQUFjLGtCQUFrQixlQUFlLE1BQ2pELGtCQUFrQixlQUFlLE1BQU0sR0FDdkMsS0FBSyxlQUNILFFBQVEsS0FDTixxTUFDRjtJQUNSO0dBQ0YsT0FDRSxJQUFJO0lBQ0Ysb0JBQXFCLE9BQU8sV0FBVyxPQUFPLEdBQzVDLHdCQUF3QixhQUFhLE1BQU0saUJBQWlCO0dBQ2hFLFNBQVMsU0FBUztJQUNoQixjQUFjLGFBQWEsTUFBTSxPQUFPO0dBQzFDO0VBQ0o7RUFDQSxTQUFTLHdCQUF3QixhQUFhLE1BQU0sYUFBYTtHQUMvRCxTQUFTLGVBQ1QsYUFBYSxPQUFPLGVBQ3BCLGVBQWUsT0FBTyxZQUFZLFFBQzdCLHFCQUFxQixvQkFDdEIsWUFBWSxLQUFLLHdCQUF3QixzQkFBc0IsR0FDL0QsWUFBWSxLQUNWLFNBQVUsV0FBVztJQUNuQixnQkFBZ0IsYUFBYSxNQUFNLFNBQVM7R0FDOUMsR0FDQSxTQUFVLE9BQU87SUFDZixPQUFPLGNBQWMsYUFBYSxNQUFNLEtBQUs7R0FDL0MsQ0FDRixHQUNBLEtBQUssZ0JBQ0gsUUFBUSxNQUNOLDhRQUNGLEtBQ0YsZ0JBQWdCLGFBQWEsTUFBTSxXQUFXO0VBQ3BEO0VBQ0EsU0FBUyxnQkFBZ0IsYUFBYSxZQUFZLFdBQVc7R0FDM0QsV0FBVyxTQUFTO0dBQ3BCLFdBQVcsUUFBUTtHQUNuQixzQkFBc0IsVUFBVTtHQUNoQyxZQUFZLFFBQVE7R0FDcEIsYUFBYSxZQUFZO0dBQ3pCLFNBQVMsZUFDTCxZQUFZLFdBQVcsTUFDekIsY0FBYyxhQUNULFlBQVksVUFBVSxRQUNyQixZQUFZLFVBQVUsTUFDdkIsV0FBVyxPQUFPLFdBQ25CLHFCQUFxQixhQUFhLFNBQVM7RUFDbkQ7RUFDQSxTQUFTLGNBQWMsYUFBYSxZQUFZLE9BQU87R0FDckQsSUFBSSxPQUFPLFlBQVk7R0FDdkIsWUFBWSxVQUFVO0dBQ3RCLElBQUksU0FBUyxNQUFNO0lBQ2pCLE9BQU8sS0FBSztJQUNaO0tBQ0UsV0FBWSxTQUFTLFlBQ2xCLFdBQVcsU0FBUyxPQUNyQixzQkFBc0IsVUFBVSxHQUMvQixhQUFhLFdBQVc7V0FDdEIsZUFBZTtHQUN4QjtHQUNBLFlBQVksU0FBUztFQUN2QjtFQUNBLFNBQVMsc0JBQXNCLFlBQVk7R0FDekMsYUFBYSxXQUFXO0dBQ3hCLEtBQUssSUFBSSxJQUFJLEdBQUcsSUFBSSxXQUFXLFFBQVEsS0FBSyxDQUFDLEdBQUcsV0FBVyxHQUFBLENBQUk7RUFDakU7RUFDQSxTQUFTLG1CQUFtQixVQUFVLFVBQVU7R0FDOUMsT0FBTztFQUNUO0VBQ0EsU0FBUyxpQkFBaUIsUUFBUSxrQkFBa0I7R0FDbEQsSUFBSSxhQUFhO0lBQ2YsSUFBSSxlQUFlLG1CQUFtQjtJQUN0QyxJQUFJLFNBQVMsY0FBYztLQUN6QixHQUFHO01BQ0QsSUFBSSxhQUFhO01BQ2pCLElBQUksYUFBYTtPQUNmLElBQUksd0JBQXdCO1FBQzFCLEdBQUc7U0FDRCxJQUFJLGl
15852CQUFpQjtTQUNyQixLQUNFLElBQUksb0JBQW9CLHdCQUN4QixNQUFNLGVBQWUsV0FFckI7VUFDQSxJQUFJLENBQUMsbUJBQW1CO1dBQ3RCLGlCQUFpQjtXQUNqQixNQUFNO1VBQ1I7VUFDQSxpQkFBaUIsa0JBQ2YsZUFBZSxXQUNqQjtVQUNBLElBQUksU0FBUyxnQkFBZ0I7V0FDM0IsaUJBQWlCO1dBQ2pCLE1BQU07VUFDUjtTQUNGO1NBQ0Esb0JBQW9CLGVBQWU7U0FDbkMsaUJBQ0Usc0JBQXNCLDBCQUN0QixzQkFBc0IsNkJBQ2xCLGlCQUNBO1FBQ1I7UUFDQSxJQUFJLGdCQUFnQjtTQUNsQix5QkFBeUIsa0JBQ3ZCLGVBQWUsV0FDakI7U0FDQSxhQUFhLGVBQWUsU0FBUztTQUNyQyxNQUFNO1FBQ1I7T0FDRjtPQUNBLHlCQUF5QixVQUFVO01BQ3JDO01BQ0EsYUFBYSxDQUFDO0tBQ2hCO0tBQ0EsZUFBZSxtQkFBbUIsYUFBYTtJQUNqRDtHQUNGO0dBQ0EsZUFBZSx3QkFBd0I7R0FDdkMsYUFBYSxnQkFBZ0IsYUFBYSxZQUFZO0dBQ3RELGFBQWE7SUFDWCxTQUFTO0lBQ1QsT0FBTztJQUNQLFVBQVU7SUFDVixxQkFBcUI7SUFDckIsbUJBQW1CO0dBQ3JCO0dBQ0EsYUFBYSxRQUFRO0dBQ3JCLGVBQWUsaUJBQWlCLEtBQzlCLE1BQ0EseUJBQ0EsVUFDRjtHQUNBLFdBQVcsV0FBVztHQUN0QixhQUFhLGVBQWUsQ0FBQyxDQUFDO0dBQzlCLG9CQUFvQiwyQkFBMkIsS0FDN0MsTUFDQSx5QkFDQSxDQUFDLEdBQ0QsV0FBVyxLQUNiO0dBQ0EsYUFBYSx3QkFBd0I7R0FDckMsaUJBQWlCO0lBQ2YsT0FBTztJQUNQLFVBQVU7SUFDRjtJQUNSLFNBQVM7R0FDWDtHQUNBLFdBQVcsUUFBUTtHQUNuQixlQUFlLG9CQUFvQixLQUNqQyxNQUNBLHlCQUNBLGdCQUNBLG1CQUNBLFlBQ0Y7R0FDQSxlQUFlLFdBQVc7R0FDMUIsV0FBVyxnQkFBZ0I7R0FDM0IsT0FBTztJQUFDO0lBQWtCO0lBQWMsQ0FBQztHQUFDO0VBQzVDO0VBQ0EsU0FBUyxrQkFBa0IsUUFBUTtHQUVqQyxPQUFPLHNCQURTLHlCQUNxQixHQUFHLGFBQWEsTUFBTTtFQUM3RDtFQUNBLFNBQVMsc0JBQXNCLFdBQVcsa0JBQWtCLFFBQVE7R0FDbEUsbUJBQW1CLGtCQUNqQixXQUNBLGtCQUNBLGtCQUNGLENBQUMsQ0FBQztHQUNGLFlBQVksY0FBYyxpQkFBaUIsQ0FBQyxDQUFDO0dBQzdDLElBQ0UsYUFBYSxPQUFPLG9CQUNwQixTQUFTLG9CQUNULGVBQWUsT0FBTyxpQkFBaUIsTUFFdkMsSUFBSTtJQUNGLElBQUksUUFBUSxZQUFZLGdCQUFnQjtHQUMxQyxTQUFTLEdBQUc7SUFDVixJQUFJLE1BQU0sbUJBQW1CLE1BQU07SUFDbkMsTUFBTTtHQUNSO1FBQ0csUUFBUTtHQUNiLG1CQUFtQix5QkFBeUI7R0FDNUMsSUFBSSxjQUFjLGlCQUFpQixPQUNqQyxXQUFXLFlBQVk7R0FDekIsV0FBVyxpQkFBaUIsa0JBQ3hCLHdCQUF3QixTQUFTLE1BQ25DLGlCQUNFLFlBQVksU0FDWixFQUFFLFNBQVMsS0FBSyxFQUFFLEdBQ2xCLHdCQUF3QixLQUFLLE1BQU0sYUFBYSxNQUFNLEdBQ3RELElBQ0Y7R0FDRixPQUFPO0lBQUM7SUFBTztJQUFVO0dBQVM7RUFDcEM7RUFDQSxTQUFTLHdCQUF3QixhQUFhLFFBQVE7R0FDcEQsWUFBWSxTQUFTO0VBQ3ZCO0VBQ0EsU0FBUyxvQkFBb0IsUUFBUTtHQUNuQyxJQUFJLFlBQVkseUJBQXlCLEdBQ3ZDLG1CQUFtQjtHQUNyQixJQUFJLFNBQVMsa0JBQ1gsT0FBTyxzQkFBc0IsV0FBVyxrQkFBa0IsTUFBTTtHQUNsRSx5QkFBeUI7R0FDekIsWUFBWSxVQUFVO0dBQ3RCLG1CQUFtQix5QkFBeUI7R0FDNUMsSUFBSSxXQUFXLGlCQUFpQixNQUFNO0dBQ3RDLGlCQUFpQixnQkFBZ0I7R0FDakMsT0FBTztJQUFDO0lBQVc7SUFBVSxDQUFDO0dBQUM7RUFDakM7RUFDQSxTQUFTLGlCQUFpQixLQUFLLE1BQU0sUUFBUSxNQUFNO0dBQ2pELE1BQU07SUFBTztJQUFhO0lBQWM7SUFBWTtJQUFNLE1BQU07R0FBSztHQUNyRSxPQUFPLHdCQUF3QjtHQUMvQixTQUFTLFNBQ0wsT0FBTyxtQ0FBbUMsR0FDM0Msd0JBQXdCLGNBQWM7R0FDekMsU0FBUyxLQUFLO0dBQ2QsU0FBUyxTQUNKLEtBQUssYUFBYSxJQUFJLE9BQU8sT0FDNUIsT0FBTyxPQUFPLE1BQ2YsT0FBTyxPQUFPLEtBQ2QsSUFBSSxPQUFPLE1BQ1gsS0FBSyxhQUFhO0dBQ3ZCLE9BQU87RUFDVDtFQUNBLFNBQVMsU0FBUyxjQUFjO0dBQzlCLElBQUksT0FBTyx3QkFBd0I7R0FDbkMsZUFBZSxFQUFFLFNBQVMsYUFBYTtHQUN2QyxPQUFRLEtBQUssZ0JBQWdCO0VBQy9CO0VBQ0EsU0FBUyxnQkFBZ0IsWUFBWSxXQUFXLFFBQVEsTUFBTTtHQUM1RCxJQUFJLE9BQU8sd0JBQXdCO0dBQ25DLHdCQUF3QixTQUFTO0dBQ2pDLEtBQUssZ0JBQWdCLGlCQUNuQixZQUFZLFdBQ1osRUFBRSxTQUFTLEtBQUssRUFBRSxHQUNsQixRQUNBLEtBQUssTUFBTSxPQUFPLE9BQU8sSUFDM0I7RUFDRjtFQUNBLFNBQVMsaUJBQWlCLFlBQVksV0FBVyxRQUFRLE1BQU07R0FDN0QsSUFBSSxPQUFPLHlCQUF5QjtHQUNwQyxPQUFPLEtBQUssTUFBTSxPQUFPLE9BQU87R0FDaEMsSUFBSSxPQUFPLEtBQUssY0FBYztHQUM5QixTQUFTLGVBQ1QsU0FBUyxRQUNULG1CQUFtQixNQUFNLFlBQVksY0FBYyxJQUFJLElBQ2xELEtBQUssZ0JBQWdCLGlCQUFpQixXQUFXLE1BQU0sUUFBUSxJQUFJLEtBQ2xFLHdCQUF3QixTQUFTLFlBQ2xDLEtBQUssZ0JBQWdCLGlCQUNwQixZQUFZLFdBQ1osTUFDQSxRQUNBLElBQ0Y7RUFDTjtFQUNBLFNBQVMsWUFBWSxRQUFRLE1BQU07R0FDakMsQ0FBQyx3QkFBd0IsT0FBTyx1QkFBdUIsU0FDbkQsZ0JBQWdCLFdBQVcsU0FBUyxRQUFRLElBQUksSUFDaEQsZ0JBQWdCLFNBQVMsU0FBUyxRQUFRLElBQUk7RUFDcEQ7RUFDQSxTQUFTLG1CQUFtQixTQUFTO0dBQ25DLHdCQUF3QixTQUFTO0dBQ2pDLElBQUksdUJBQXVCLHdCQUF3QjtHQUNuRCxJQUFJLFNBQVMsc0JBQ1gsdUJBQXdCLG1DQUFtQyxHQUN4RCx3QkFBd0IsY0FBYyxzQkFDdEMscUJBQXFCLFNBQVMsQ0FBQyxPQUFPO1FBQ3RDO0lBQ0gsSUFBSSxTQUFTLHFCQUFxQjtJQUNsQyxTQUFTLFNBQ0oscUJBQXFCLFNBQVMsQ0FBQyxPQUFPLElBQ3ZDLE9BQU8sS0FBSyxPQUFPO0dBQ3pCO0VBQ0Y7RUFDQSxTQUFTLFdBQVcsVUFBVTtHQUM1QixJQUFJLE9BQU8sd0JBQXdCLEdBQ2pDLE1BQU0sRUFBRSxNQUFNLFNBQVM7R0FDekIsS0FBSyxnQkFBZ0I7R0FDckIsT0FBTyxXQUFZO0lBQ2pCLEtBQUssbUJBQW1CLG1CQUFtQixXQUN6QyxNQUFNLE1BQ0osd0VBQ0Y7SUFDRixPQUFPLElBQUksS0FBSyxNQUFNLEtBQUssR0FBRyxTQUFTO0dBQ3pDO0VBQ0Y7RUFDQSxTQUFTLFlBQVksVUFBVTtHQUM3QixJQUFJLE1BQU0seUJBQXlCLENBQUMsQ0FBQztHQUNyQyxtQkFBbUI7SUFBTztJQUFLLFVBQVU7
15852R0FBUyxDQUFDO0dBQ25ELE9BQU8sV0FBWTtJQUNqQixLQUFLLG1CQUFtQixtQkFBbUIsV0FDekMsTUFBTSxNQUNKLHdFQUNGO0lBQ0YsT0FBTyxJQUFJLEtBQUssTUFBTSxLQUFLLEdBQUcsU0FBUztHQUN6QztFQUNGO0VBQ0EsU0FBUyxrQkFBa0IsUUFBUSxNQUFNO0dBQ3ZDLElBQUksYUFBYTtHQUNqQixDQUFDLHdCQUF3QixPQUFPLHVCQUF1QixXQUNwRCxjQUFjO0dBQ2pCLE9BQU8sZ0JBQWdCLFlBQVksUUFBUSxRQUFRLElBQUk7RUFDekQ7RUFDQSxTQUFTLHVCQUF1QixRQUFRLEtBQUs7R0FDM0MsSUFBSSxlQUFlLE9BQU8sS0FBSztJQUM3QixTQUFTLE9BQU87SUFDaEIsSUFBSSxhQUFhLElBQUksTUFBTTtJQUMzQixPQUFPLFdBQVk7S0FDakIsZUFBZSxPQUFPLGFBQWEsV0FBVyxJQUFJLElBQUksSUFBSTtJQUM1RDtHQUNGO0dBQ0EsSUFBSSxTQUFTLE9BQU8sS0FBSyxNQUFNLEtBQzdCLE9BQ0UsSUFBSSxlQUFlLFNBQVMsS0FDMUIsUUFBUSxNQUNOLGdJQUNBLDBCQUEwQixPQUFPLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksR0FDMUQsR0FDRCxTQUFTLE9BQU8sR0FDaEIsSUFBSSxVQUFVLFFBQ2YsV0FBWTtJQUNWLElBQUksVUFBVTtHQUNoQjtFQUVOO0VBQ0EsU0FBUyxzQkFBc0IsS0FBSyxRQUFRLE1BQU07R0FDaEQsZUFBZSxPQUFPLFVBQ3BCLFFBQVEsTUFDTixnSEFDQSxTQUFTLFNBQVMsT0FBTyxTQUFTLE1BQ3BDO0dBQ0YsT0FBTyxTQUFTLFFBQVEsS0FBSyxNQUFNLE9BQU8sS0FBSyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUk7R0FDL0QsSUFBSSxhQUFhO0dBQ2pCLENBQUMsd0JBQXdCLE9BQU8sdUJBQXVCLFdBQ3BELGNBQWM7R0FDakIsZ0JBQ0UsWUFDQSxRQUNBLHVCQUF1QixLQUFLLE1BQU0sUUFBUSxHQUFHLEdBQzdDLElBQ0Y7RUFDRjtFQUNBLFNBQVMsdUJBQXVCLEtBQUssUUFBUSxNQUFNO0dBQ2pELGVBQWUsT0FBTyxVQUNwQixRQUFRLE1BQ04sZ0hBQ0EsU0FBUyxTQUFTLE9BQU8sU0FBUyxNQUNwQztHQUNGLE9BQU8sU0FBUyxRQUFRLEtBQUssTUFBTSxPQUFPLEtBQUssT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJO0dBQy9ELGlCQUNFLEdBQ0EsUUFDQSx1QkFBdUIsS0FBSyxNQUFNLFFBQVEsR0FBRyxHQUM3QyxJQUNGO0VBQ0Y7RUFDQSxTQUFTLGNBQWMsVUFBVSxNQUFNO0dBQ3JDLHdCQUF3QixDQUFDLENBQUMsZ0JBQWdCLENBQ3hDLFVBQ0EsS0FBSyxNQUFNLE9BQU8sT0FBTyxJQUMzQjtHQUNBLE9BQU87RUFDVDtFQUNBLFNBQVMsZUFBZSxVQUFVLE1BQU07R0FDdEMsSUFBSSxPQUFPLHlCQUF5QjtHQUNwQyxPQUFPLEtBQUssTUFBTSxPQUFPLE9BQU87R0FDaEMsSUFBSSxZQUFZLEtBQUs7R0FDckIsSUFBSSxTQUFTLFFBQVEsbUJBQW1CLE1BQU0sVUFBVSxFQUFFLEdBQ3hELE9BQU8sVUFBVTtHQUNuQixLQUFLLGdCQUFnQixDQUFDLFVBQVUsSUFBSTtHQUNwQyxPQUFPO0VBQ1Q7RUFDQSxTQUFTLFVBQVUsWUFBWSxNQUFNO0dBQ25DLElBQUksT0FBTyx3QkFBd0I7R0FDbkMsT0FBTyxLQUFLLE1BQU0sT0FBTyxPQUFPO0dBQ2hDLElBQUksWUFBWSxXQUFXO0dBQzNCLElBQUkscUNBQXFDO0lBQ3ZDLDJCQUEyQixDQUFDLENBQUM7SUFDN0IsSUFBSTtLQUNGLFdBQVc7SUFDYixVQUFVO0tBQ1IsMkJBQTJCLENBQUMsQ0FBQztJQUMvQjtHQUNGO0dBQ0EsS0FBSyxnQkFBZ0IsQ0FBQyxXQUFXLElBQUk7R0FDckMsT0FBTztFQUNUO0VBQ0EsU0FBUyxXQUFXLFlBQVksTUFBTTtHQUNwQyxJQUFJLE9BQU8seUJBQXlCO0dBQ3BDLE9BQU8sS0FBSyxNQUFNLE9BQU8sT0FBTztHQUNoQyxJQUFJLFlBQVksS0FBSztHQUNyQixJQUFJLFNBQVMsUUFBUSxtQkFBbUIsTUFBTSxVQUFVLEVBQUUsR0FDeEQsT0FBTyxVQUFVO0dBQ25CLFlBQVksV0FBVztHQUN2QixJQUFJLHFDQUFxQztJQUN2QywyQkFBMkIsQ0FBQyxDQUFDO0lBQzdCLElBQUk7S0FDRixXQUFXO0lBQ2IsVUFBVTtLQUNSLDJCQUEyQixDQUFDLENBQUM7SUFDL0I7R0FDRjtHQUNBLEtBQUssZ0JBQWdCLENBQUMsV0FBVyxJQUFJO0dBQ3JDLE9BQU87RUFDVDtFQUNBLFNBQVMsbUJBQW1CLE9BQU8sY0FBYztHQUUvQyxPQUFPLHVCQURJLHdCQUNzQixHQUFHLE9BQU8sWUFBWTtFQUN6RDtFQUNBLFNBQVMsb0JBQW9CLE9BQU8sY0FBYztHQUVoRCxPQUFPLHdCQURJLHlCQUVOLEdBQ0gsWUFBWSxlQUNaLE9BQ0EsWUFDRjtFQUNGO0VBQ0EsU0FBUyxzQkFBc0IsT0FBTyxjQUFjO0dBQ2xELElBQUksT0FBTyx5QkFBeUI7R0FDcEMsT0FBTyxTQUFTLGNBQ1osdUJBQXVCLE1BQU0sT0FBTyxZQUFZLElBQ2hELHdCQUNFLE1BQ0EsWUFBWSxlQUNaLE9BQ0EsWUFDRjtFQUNOO0VBQ0EsU0FBUyx1QkFBdUIsTUFBTSxPQUFPLGNBQWM7R0FDekQsSUFDRSxLQUFLLE1BQU0sZ0JBQ1YsT0FBTyxjQUFjLGVBQ3BCLE9BQU8sZ0NBQWdDLFNBRXpDLE9BQVEsS0FBSyxnQkFBZ0I7R0FDL0IsS0FBSyxnQkFBZ0I7R0FDckIsT0FBTyxvQkFBb0I7R0FDM0Isd0JBQXdCLFNBQVM7R0FDakMsa0NBQWtDO0dBQ2xDLE9BQU87RUFDVDtFQUNBLFNBQVMsd0JBQXdCLE1BQU0sV0FBVyxPQUFPLGNBQWM7R0FDckUsSUFBSSxTQUFTLE9BQU8sU0FBUyxHQUFHLE9BQU87R0FDdkMsSUFBSSxTQUFTLDZCQUE2QixTQUN4QyxPQUNHLE9BQU8sdUJBQXVCLE1BQU0sT0FBTyxZQUFZLEdBQ3hELFNBQVMsTUFBTSxTQUFTLE1BQU0sbUJBQW1CLENBQUMsSUFDbEQ7R0FFSixJQUNFLE9BQU8sY0FBYyxRQUNwQixPQUFPLGNBQWMsZUFDcEIsT0FBTyxnQ0FBZ0MsU0FFekMsT0FBUSxtQkFBbUIsQ0FBQyxHQUFLLEtBQUssZ0JBQWdCO0dBQ3hELE9BQU8sb0JBQW9CO0dBQzNCLHdCQUF3QixTQUFTO0dBQ2pDLGtDQUFrQztHQUNsQyxPQUFPO0VBQ1Q7RUFDQSxTQUFTLHlCQUF5QjtHQUNoQyxxQkFBcUI7RUFDdkI7RUFDQSxTQUFTLGdCQUNQLE9BQ0EsT0FDQSxjQUNBLGVBQ0EsVUFDQTtHQUNBLElBQUksbUJBQW1CLHdCQUF3QjtHQUMvQyx3QkFBd0IsSUFDdEIsTUFBTSxvQkFBb0IsbUJBQW1CLDBCQUN6QyxtQkFDQTtHQUNOLElBQUksaUJBQWlCLHFCQUFxQixHQUN4QyxvQkFBb0IsQ0FBQztHQUN2QixrQkFBa0IsUUFDaEIsU0FBUyxpQkFBaUIsZUFBZSxRQUFRO0dBQ25ELGtCQUFrQixpQ0FBaUIsSUFBSSxJQUFJO0dBQzNDLHFCQUFxQixJQUFJO0dBQ3pCLDJCQUEyQixPQUFPLENBQUMsR0FBRyxPQUFPLFlBQVk7R0FDekQsSUFBSTtJQUNGLElBQUksY0FBYyxTQUFTLEdBQ3pCLDBCQUEwQixxQkFBcUI7SUFDakQsU0FBUywyQkFDUCx3QkFBd0IsbUJBQW1CLFdBQVc7SUFDeEQsSUFDRSxTQUFTLGVBQ1QsYUFBYSxPQUFPLGVBQ3BCLGVBQWUsT0FBTyxZQUFZLE1BQ2xDO0tBQ0EscUJBQXFCO0tBQ3JCLFlBQVksS0FBSyx3QkFBd0Isc0JBQXNCO0tBQy9ELElBQUksMkJBQTJCLG1CQUM3QixhQUNBLGFBQ0Y7S0FDQSx5QkFDRSxPQUNBLE9BQ0EsMEJBQ0Esa0JBQWtCLEtBQUssQ0FDekI7SUFDRixPQUNFLHlCQUNFLE9BQ0EsT0FDQSxlQUNBLGtCQUFrQixLQUFLLENBQ3pCO0dBQ0osU0FBUyxPQUFPO0lBQ2QseUJBQ0UsT0FDQSxPQUNBO0tBQUUsTUFBTSxXQUFZLENBQUM7S0FBRyxRQUFRO0tBQVksUUFBUTtJQUFNLEdBQzFELGtCQUFrQixLQUFLLENBQ3pCO0dBQ0YsVUFBVTtJQUNSLHdCQUF5QixJQUFJLGtCQUMzQixTQUFTLGtCQUNQLFNBQVMsa0JBQWtCLFVBQzFCLFNBQVMsZUFBZSxTQUN2QixlQUFlLFVBQVUsa0JBQWtCLFNBQzNDLFFBQVEsTUFDTixzS0FDRixHQUNELGVBQWUsUUFBUSxrQkFBa0IsUUFDM0MscUJBQXFCLElBQUksZ0JBQzFCLFNBQVMsa0JBQ1Asa0JBQWtCLG1CQUNoQixRQUFRLGtCQUFrQixlQUFlLE1BQzNDLGtCQUFrQixlQUFlLE1BQU0sR0FDdkMsS0FBSyxTQUNILFFBQVEsS0FDTixxTUFDRjtHQUNSO0VBQ0Y7RUFDQSxTQUFTLG9CQUFvQixXQUFXLGNBQWMsUUFBUSxVQUFVO0dBQ3RFLElBQUksTUFBTSxVQUFVLEtBQ2xCLE1BQU0sTUFDSiwyRUFDRjtHQUNGLElBQUksUUFBUSw4QkFBOEIsU0FBUyxDQUFDLENBQUM7R0FDckQscUJBQXFCLFNBQVM7R0FDOUIsZ0JBQ0UsV0FDQSxPQUNBLGNBQ0Esc0JBQ0EsU0FBUyxTQUNMLE9BQ0EsV0FBWTtJQUNWLG1CQUFtQixTQUFTO0lBQzVCLE9BQU8sT0FBTyxRQUFRO0dBQ3hCLENBQ047RUFDRjtFQUNBLFNBQVMsOEJBQThCLFdBQVc7R0FDaEQsSUFBSSxvQkFBb0IsVUFBVTtHQUNsQyxJQUFJLFNBQVMsbUJBQW1CLE9BQU87R0FDdkMsb0JBQW9CO0lBQ2xCLGVBQWU7SUFDZixXQUFXO0lBQ1gsV0FBVztJQUNYLE9BQU87S0FDTCxTQUFTO0tBQ1QsT0FBTztLQUNQLFVBQVU7S0FDVixxQkFBcUI7S0FDckIsbUJBQW1CO0lBQ3JCO0lBQ0EsTUFBTTtHQUNSO0dBQ0EsSUFBSSxvQkFBb0IsQ0FBQztHQUN6QixrQkFBa0IsT0FBTztJQUN2QixlQUFlO0lBQ2YsV0FBVztJQUNYLFdBQVc7SUFDWCxPQUFPO0tBQ0wsU0FBUztLQUNULE9BQU87S0FDUCxVQUFVO0tBQ1YscUJBQXFCO0tBQ3JCLG1CQUFtQjtJQUNyQjtJQUNBLE1BQU07R0FDUjtHQUNBLFVBQVUsZ0JBQWdCO0dBQzFCLFlBQVksVUFBVTtHQUN0QixTQUFTLGNBQWMsVUFBVSxnQkFBZ0I7R0FDakQsT0FBTztFQUNUO0VBQ0EsU0FBUyxtQkFBbUIsV0FBVztHQUNyQyxTQUFTLHFCQUFxQixLQUM1QixRQUFRLE1BQ04sc0hBQ0Y7R0FDRixJQUFJLFlBQVksOEJBQThCLFNBQVM7R0FDdkQsU0FBUyxVQUFVLFNBQ2hCLFlBQVksVUFBVSxVQUFVO0dBQ25DLHlCQUNFLFdBQ0EsVUFBVSxLQUFLLE9BQ2YsQ0FBQyxHQUNELGtCQUFrQixTQUFTLENBQzdCO0VBQ0Y7RUFDQSxTQUFTLGtCQUFrQjtHQUN6QixJQUFJLFlBQVksZUFBZSxDQUFDLENBQUM7R0FDakMsWUFBWSxnQkFBZ0IsS0FDMUIsTUFDQSx5QkFDQSxVQUFVLE9BQ1YsQ0FBQyxHQUNELENBQUMsQ0FDSDtHQUNBLHdCQUF3QixDQUFDLENBQUMsZ0JBQWdCO0dBQzFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsU0FBUztFQUN2QjtFQUNBLFNBQVMsbUJBQW1CO0dBQzFCLElBQUksb0JBQW9CLGNBQWMsaUJBQWlCLENBQUMsQ0FBQyxJQUN2RCxRQUFRLHlCQUF5QixDQUFDLENBQUM7R0FDckMsT0FBTyxDQUNMLGNBQWMsT0FBTyxvQkFDakIsb0JBQ0EsWUFBWSxpQkFBaUIsR0FDakMsS0FDRjtFQUNGO0VBQ0EsU0FBUyxxQkFBcUI7R0FDNUIsSUFBSSxvQkFBb0IsZ0JBQWdCLGlCQUFpQixDQUFDLENBQUMsSUFDekQsUUFBUSx5QkFBeUIsQ0FBQyxDQUFDO0dBQ3JDLE9BQU8sQ0FDTCxjQUFjLE9BQU8sb0JBQ2pCLG9CQUNBLFlBQVksaUJBQWlCLEdBQ2pDLEtB
15852Q0Y7RUFDRjtFQUNBLFNBQVMsMEJBQTBCO0dBQ2pDLE9BQU8sWUFBWSxxQkFBcUI7RUFDMUM7RUFDQSxTQUFTLFVBQVU7R0FDakIsSUFBSSxPQUFPLHdCQUF3QixHQUNqQyxtQkFBbUIsbUJBQW1CO0dBQ3hDLElBQUksYUFBYTtJQUNmLElBQUksU0FBUztJQUNiLElBQUksbUJBQW1CO0lBQ3ZCLFVBRUksbUJBQW1CLEVBQUUsS0FBTSxLQUFLLE1BQU0sZ0JBQWdCLElBQUksR0FBQSxDQUMxRCxTQUFTLEVBQUUsSUFBSTtJQUNuQixtQkFBbUIsTUFBTSxtQkFBbUIsT0FBTztJQUNuRCxTQUFTO0lBQ1QsSUFBSSxXQUFXLG9CQUFvQixNQUFNLE9BQU8sU0FBUyxFQUFFO0lBQzNELG9CQUFvQjtHQUN0QixPQUNFLFNBQVUseUJBQ1AsbUJBQ0MsTUFBTSxtQkFBbUIsT0FBTyxPQUFPLFNBQVMsRUFBRSxJQUFJO0dBQzVELE9BQVEsS0FBSyxnQkFBZ0I7RUFDL0I7RUFDQSxTQUFTLGVBQWU7R0FDdEIsT0FBUSx3QkFBd0IsQ0FBQyxDQUFDLGdCQUFnQixhQUFhLEtBQzdELE1BQ0EsdUJBQ0Y7RUFDRjtFQUNBLFNBQVMsYUFBYSxPQUFPLFNBQVM7R0FDcEMsS0FBSyxJQUFJLFdBQVcsTUFBTSxRQUFRLFNBQVMsV0FBWTtJQUNyRCxRQUFRLFNBQVMsS0FBakI7S0FDRSxLQUFLO0tBQ0wsS0FBSztNQUNILElBQUksT0FBTyxrQkFBa0IsUUFBUSxHQUNuQyxnQkFBZ0IsYUFBYSxJQUFJLEdBQ2pDLE9BQU8sY0FBYyxVQUFVLGVBQWUsSUFBSTtNQUNwRCxTQUFTLFNBQ04sdUJBQXVCLE1BQU0sYUFBYSxLQUFLLEdBQ2hELHNCQUFzQixNQUFNLFVBQVUsSUFBSSxHQUMxQyxvQkFBb0IsTUFBTSxVQUFVLElBQUk7TUFDMUMsUUFBUSxZQUFZO01BQ3BCLFNBQVMsV0FDUCxLQUFLLE1BQU0sV0FDWCxTQUFTLFFBQ1QsUUFBUSxNQUNOLGlFQUNGO01BQ0YsY0FBYyxVQUFVLEVBQUUsT0FBTyxNQUFNO01BQ3ZDO0lBQ0o7SUFDQSxXQUFXLFNBQVM7R0FDdEI7RUFDRjtFQUNBLFNBQVMsc0JBQXNCLE9BQU8sT0FBTyxRQUFRO0dBQ25ELElBQUksT0FBTztHQUNYLGVBQWUsT0FBTyxLQUFLLE1BQ3pCLFFBQVEsTUFDTixtTUFDRjtHQUNGLE9BQU8sa0JBQWtCLEtBQUs7R0FDOUIsSUFBSSxTQUFTO0lBQ1gsTUFBTTtJQUNOLFlBQVk7SUFDWixTQUFTO0lBQ0Q7SUFDUixlQUFlLENBQUM7SUFDaEIsWUFBWTtJQUNaLE1BQU07R0FDUjtHQUNBLG9CQUFvQixLQUFLLElBQ3JCLHlCQUF5QixPQUFPLE1BQU0sS0FDcEMsU0FBUyw0QkFBNEIsT0FBTyxPQUFPLFFBQVEsSUFBSSxHQUNqRSxTQUFTLFdBQ04sdUJBQXVCLE1BQU0sY0FBYyxLQUFLLEdBQ2pELHNCQUFzQixRQUFRLE9BQU8sSUFBSSxHQUN6Qyx5QkFBeUIsUUFBUSxPQUFPLElBQUk7RUFDcEQ7RUFDQSxTQUFTLGlCQUFpQixPQUFPLE9BQU8sUUFBUTtHQUM5QyxJQUFJLE9BQU87R0FDWCxlQUFlLE9BQU8sS0FBSyxNQUN6QixRQUFRLE1BQ04sbU1BQ0Y7R0FDRixPQUFPLGtCQUFrQixLQUFLO0dBQzlCLHlCQUF5QixPQUFPLE9BQU8sUUFBUSxJQUFJLEtBQ2pELHVCQUF1QixNQUFNLGNBQWMsS0FBSztFQUNwRDtFQUNBLFNBQVMseUJBQXlCLE9BQU8sT0FBTyxRQUFRLE1BQU07R0FDNUQsSUFBSSxTQUFTO0lBQ0w7SUFDTixZQUFZO0lBQ1osU0FBUztJQUNEO0lBQ1IsZUFBZSxDQUFDO0lBQ2hCLFlBQVk7SUFDWixNQUFNO0dBQ1I7R0FDQSxJQUFJLG9CQUFvQixLQUFLLEdBQUcseUJBQXlCLE9BQU8sTUFBTTtRQUNqRTtJQUNILElBQUksWUFBWSxNQUFNO0lBQ3RCLElBQ0UsTUFBTSxNQUFNLFVBQ1gsU0FBUyxhQUFhLE1BQU0sVUFBVSxXQUNyQyxZQUFZLE1BQU0scUJBQXNCLFNBQVMsWUFDbkQ7S0FDQSxJQUFJLGlCQUFpQixxQkFBcUI7S0FDMUMscUJBQXFCLElBQUk7S0FDekIsSUFBSTtNQUNGLElBQUksZUFBZSxNQUFNLG1CQUN2QixhQUFhLFVBQVUsY0FBYyxNQUFNO01BQzdDLE9BQU8sZ0JBQWdCLENBQUM7TUFDeEIsT0FBTyxhQUFhO01BQ3BCLElBQUksU0FBUyxZQUFZLFlBQVksR0FDbkMsT0FDRSxnQkFBZ0IsT0FBTyxPQUFPLFFBQVEsQ0FBQyxHQUN2QyxTQUFTLHNCQUNQLGdDQUFnQyxHQUNsQyxDQUFDO0tBRVAsU0FBUyxPQUFPLENBQ2hCLFVBQVU7TUFDUixxQkFBcUIsSUFBSTtLQUMzQjtJQUNGO0lBQ0EsU0FBUyw0QkFBNEIsT0FBTyxPQUFPLFFBQVEsSUFBSTtJQUMvRCxJQUFJLFNBQVMsUUFDWCxPQUNFLHNCQUFzQixRQUFRLE9BQU8sSUFBSSxHQUN6Qyx5QkFBeUIsUUFBUSxPQUFPLElBQUksR0FDNUMsQ0FBQztHQUVQO0dBQ0EsT0FBTyxDQUFDO0VBQ1Y7RUFDQSxTQUFTLDJCQUNQLE9BQ0EscUJBQ0EsT0FDQSxRQUNBO0dBQ0EsU0FBUyxxQkFBcUIsS0FDNUIsTUFBTSx3QkFDTixRQUFRLE1BQ04seUlBQ0Y7R0FDRixTQUFTO0lBQ1AsTUFBTTtJQUNOLFlBQVksc0JBQXNCO0lBQ2xDLFNBQVM7SUFDRDtJQUNSLGVBQWUsQ0FBQztJQUNoQixZQUFZO0lBQ1osTUFBTTtHQUNSO0dBQ0EsSUFBSSxvQkFBb0IsS0FBSyxHQUFHO0lBQzlCLElBQUkscUJBQ0YsTUFBTSxNQUFNLGlEQUFpRDtJQUMvRCxRQUFRLE1BQU0sOENBQThDO0dBQzlELE9BQ0Usc0JBQXVCLDRCQUNyQixPQUNBLE9BQ0EsUUFDQSxDQUNGLEdBQ0UsU0FBUyx3QkFDTix1QkFBdUIsR0FBRyxtQkFBbUIsS0FBSyxHQUNuRCxzQkFBc0IscUJBQXFCLE9BQU8sQ0FBQztFQUMzRDtFQUNBLFNBQVMsb0JBQW9CLE9BQU87R0FDbEMsSUFBSSxZQUFZLE1BQU07R0FDdEIsT0FDRSxVQUFVLDJCQUNULFNBQVMsYUFBYSxjQUFjO0VBRXpDO0VBQ0EsU0FBUyx5QkFBeUIsT0FBTyxRQUFRO0dBQy9DLDZDQUNFLCtCQUErQixDQUFDO0dBQ2xDLElBQUksVUFBVSxNQUFNO0dBQ3BCLFNBQVMsVUFDSixPQUFPLE9BQU8sVUFDYixPQUFPLE9BQU8sUUFBUSxNQUFRLFFBQVEsT0FBTztHQUNuRCxNQUFNLFVBQVU7RUFDbEI7RUFDQSxTQUFTLHlCQUF5QixNQUFNLE9BQU8sTUFBTTtHQUNuRCxJQUFJLE9BQU8sT0FBTyxVQUFVO0lBQzFCLElBQUksYUFBYSxNQUFNO0lBQ3ZCLGNBQWMsS0FBSztJQUNuQixRQUFRO0lBQ1IsTUFBTSxRQUFRO0lBQ2Qsa0JBQWtCLE1BQU0sSUFBSTtHQUM5QjtFQUNGO0VBQ0EsU0FBUyxzQkFBc0IsVUFBVTtHQUN2QyxJQUFJLFNBQVMsWUFBWSxlQUFlLE9BQU8sVUFBVTtJQUN2RCxJQUFJLE1BQU0sT0FBTyxRQUFRO0lBQ3pCLHlCQUF5QixJQUFJLEdBQUcsTUFDN0IseUJBQXlCLElBQUksR0FBRyxHQUNqQyxRQUFRLE1BQ04sMEZBQ0EsUUFDRjtHQUNKO0VBQ0Y7RUFDQSxTQUFTLDJCQUNQLGdCQUNBLE1BQ0EsMEJBQ0EsV0FDQTtHQUNBLElBQUksWUFBWSxlQUFlLGVBQzdCLGVBQWUseUJBQXlCLFdBQVcsU0FBUztHQUM5RCxJQUFJLGVBQWUsT0FBTyxrQkFBa0I7SUFDMUMsMkJBQTJCLENBQUMsQ0FBQztJQUM3QixJQUFJO0tBQ0YsZUFBZSx5QkFBeUIsV0FBVyxTQUFTO0lBQzlELFVBQVU7S0FDUiwyQkFBMkIsQ0FBQyxDQUFDO0lBQy9CO0dBQ0Y7R0FDQSxLQUFLLE1BQU0saUJBQ1AsT0FBTyx5QkFBeUIsSUFBSSxLQUFLLGFBQzNDLGtDQUFrQyxJQUFJLElBQUksTUFDdkMsa0NBQWtDLElBQUksSUFBSSxHQUMzQyxRQUFRLE1BQ04sZ0hBQ0EsSUFDRjtHQUNKLFlBQ0UsU0FBUyxnQkFBZ0IsS0FBSyxNQUFNLGVBQ2hDLFlBQ0EsT0FBTyxDQUFDLEdBQUcsV0FBVyxZQU
15852FZO0dBQ3hDLGVBQWUsZ0JBQWdCO0dBQy9CLE1BQU0sZUFBZSxVQUNsQixlQUFlLFlBQVksWUFBWTtFQUM1QztFQUNBLFNBQVMsMkJBQ1AsZ0JBQ0EsTUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLGFBQ0E7R0FDQSxJQUFJLFdBQVcsZUFBZTtHQUM5QixJQUFJLGVBQWUsT0FBTyxTQUFTLHVCQUF1QjtJQUN4RCxXQUFXLFNBQVMsc0JBQ2xCLFVBQ0EsVUFDQSxXQUNGO0lBQ0EsSUFBSSxlQUFlLE9BQU8sa0JBQWtCO0tBQzFDLDJCQUEyQixDQUFDLENBQUM7S0FDN0IsSUFBSTtNQUNGLFdBQVcsU0FBUyxzQkFDbEIsVUFDQSxVQUNBLFdBQ0Y7S0FDRixVQUFVO01BQ1IsMkJBQTJCLENBQUMsQ0FBQztLQUMvQjtJQUNGO0lBQ0EsS0FBSyxNQUFNLFlBQ1QsUUFBUSxNQUNOLGlIQUNBLHlCQUF5QixJQUFJLEtBQUssV0FDcEM7SUFDRixPQUFPO0dBQ1Q7R0FDQSxPQUFPLEtBQUssYUFBYSxLQUFLLFVBQVUsdUJBQ3BDLENBQUMsYUFBYSxVQUFVLFFBQVEsS0FBSyxDQUFDLGFBQWEsVUFBVSxRQUFRLElBQ3JFLENBQUM7RUFDUDtFQUNBLFNBQVMsOEJBQ1AsZ0JBQ0EsVUFDQSxVQUNBLGFBQ0E7R0FDQSxJQUFJLFdBQVcsU0FBUztHQUN4QixlQUFlLE9BQU8sU0FBUyw2QkFDN0IsU0FBUywwQkFBMEIsVUFBVSxXQUFXO0dBQzFELGVBQWUsT0FBTyxTQUFTLG9DQUM3QixTQUFTLGlDQUFpQyxVQUFVLFdBQVc7R0FDakUsU0FBUyxVQUFVLGFBQ2YsaUJBQ0EsMEJBQTBCLGNBQWMsS0FBSyxhQUMvQyx3Q0FBd0MsSUFBSSxjQUFjLE1BQ3ZELHdDQUF3QyxJQUFJLGNBQWMsR0FDM0QsUUFBUSxNQUNOLG1KQUNBLGNBQ0YsSUFDRixzQkFBc0Isb0JBQ3BCLFVBQ0EsU0FBUyxPQUNULElBQ0Y7RUFDSjtFQUNBLFNBQVMsMkJBQTJCLFdBQVcsV0FBVztHQUN4RCxJQUFJLFdBQVc7R0FDZixJQUFJLFNBQVMsV0FBVztJQUN0QixXQUFXLENBQUM7SUFDWixLQUFLLElBQUksWUFBWSxXQUNuQixVQUFVLGFBQWEsU0FBUyxZQUFZLFVBQVU7R0FDMUQ7R0FDQSxJQUFLLFlBQVksVUFBVSxjQUFlO0lBQ3hDLGFBQWEsY0FBYyxXQUFXLE9BQU8sQ0FBQyxHQUFHLFFBQVE7SUFDekQsS0FBSyxJQUFJLGFBQWEsV0FDcEIsS0FBSyxNQUFNLFNBQVMsZUFDakIsU0FBUyxhQUFhLFVBQVU7R0FDdkM7R0FDQSxPQUFPO0VBQ1Q7RUFDQSxTQUFTLHVCQUF1QixPQUFPO0dBQ3JDLGtCQUFrQixLQUFLO0dBQ3ZCLFFBQVEsS0FDTixjQUNBLGdCQUNJLCtCQUErQixnQkFBZ0IsaUJBQy9DLHNEQUNKLDJLQUNGO0VBQ0Y7RUFDQSxTQUFTLHFCQUFxQixPQUFPO0dBQ25DLElBQUksdUJBQXVCLGdCQUNyQixzQ0FBc0MsZ0JBQWdCLGlCQUN0RCw2REFDSixrQkFDRSwwR0FDRSxxQkFBcUIsZUFBZTtHQUMxQyxJQUNFLGFBQWEsT0FBTyxTQUNwQixTQUFTLFNBQ1QsYUFBYSxPQUFPLE1BQU0saUJBQzFCO0lBQ0EsSUFBSSwyQkFBMkIsTUFBTTtJQUNyQyxRQUFRO0tBQ047S0FDQTtLQUNBO0tBQ0E7SUFDRixDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ1QsYUFBYSxPQUFPLE1BQU0sS0FDdEIsTUFBTSxPQUNKLEdBQ0EsR0FDQSxjQUFjLE1BQU0sTUFBTSxJQUMxQixZQUNBLE1BQU0sMkJBQTJCLEtBQ2pDLFVBQ0YsSUFDQSxNQUFNLE9BQ0osR0FDQSxHQUNBLGFBQ0EsWUFDQSxNQUFNLDJCQUEyQixLQUNqQyxVQUNGO0lBQ0osTUFBTSxRQUFRLE9BQU87SUFDckIsMkJBQTJCLEtBQUssTUFBTSxRQUFRLE9BQU8sS0FBSztJQUMxRCx5QkFBeUI7R0FDM0IsT0FDRSxRQUFRLE1BQ04sb0JBQ0EsT0FDQSxzQkFDQSxlQUNGO0VBQ0o7RUFDQSxTQUFTLDBCQUEwQixPQUFPO0dBQ3hDLGtCQUFrQixLQUFLO0VBQ3pCO0VBQ0EsU0FBUyxpQkFBaUIsTUFBTSxXQUFXO0dBQ3pDLElBQUk7SUFDRixnQkFBZ0IsVUFBVSxTQUN0QiwwQkFBMEIsVUFBVSxNQUFNLElBQzFDO0lBQ0osb0JBQW9CO0lBQ3BCLElBQUksUUFBUSxVQUFVO0lBQ3RCLElBQUksU0FBUyxxQkFBcUIsVUFDaEMscUJBQXFCLGFBQWEsS0FBSyxLQUFLO1NBQ3pDO0tBQ0gsSUFBSSxrQkFBa0IsS0FBSztLQUMzQixnQkFBZ0IsT0FBTyxFQUFFLGdCQUFnQixVQUFVLE1BQU0sQ0FBQztJQUM1RDtHQUNGLFNBQVMsS0FBSztJQUNaLFdBQVcsV0FBWTtLQUNyQixNQUFNO0lBQ1IsQ0FBQztHQUNIO0VBQ0Y7RUFDQSxTQUFTLGVBQWUsTUFBTSxVQUFVLFdBQVc7R0FDakQsSUFBSTtJQUNGLGdCQUFnQixVQUFVLFNBQ3RCLDBCQUEwQixVQUFVLE1BQU0sSUFDMUM7SUFDSixvQkFBb0IsMEJBQTBCLFFBQVE7SUFDdEQsSUFBSSxnQkFBZ0IsS0FBSztJQUN6QixjQUFjLFVBQVUsT0FBTztLQUM3QixnQkFBZ0IsVUFBVTtLQUMxQixlQUFlLE1BQU0sU0FBUyxNQUFNLFNBQVMsWUFBWTtJQUMzRCxDQUFDO0dBQ0gsU0FBUyxLQUFLO0lBQ1osV0FBVyxXQUFZO0tBQ3JCLE1BQU07SUFDUixDQUFDO0dBQ0g7RUFDRjtFQUNBLFNBQVMsc0JBQXNCLE1BQU0sV0FBVyxNQUFNO0dBQ3BELE9BQU8sYUFBYSxJQUFJO0dBQ3hCLEtBQUssTUFBTTtHQUNYLEtBQUssVUFBVSxFQUFFLFNBQVMsS0FBSztHQUMvQixLQUFLLFdBQVcsV0FBWTtJQUMxQixrQkFBa0IsVUFBVSxRQUFRLGtCQUFrQixNQUFNLFNBQVM7R0FDdkU7R0FDQSxPQUFPO0VBQ1Q7RUFDQSxTQUFTLHVCQUF1QixNQUFNO0dBQ3BDLE9BQU8sYUFBYSxJQUFJO0dBQ3hCLEtBQUssTUFBTTtHQUNYLE9BQU87RUFDVDtFQUNBLFNBQVMsMkJBQTJCLFFBQVEsTUFBTSxPQUFPLFdBQVc7R0FDbEUsSUFBSSwyQkFBMkIsTUFBTSxLQUFLO0dBQzFDLElBQUksZUFBZSxPQUFPLDBCQUEwQjtJQUNsRCxJQUFJLFFBQVEsVUFBVTtJQUN0QixPQUFPLFVBQVUsV0FBWTtLQUMzQixPQUFPLHlCQUF5QixLQUFLO0lBQ3ZDO0lBQ0EsT0FBTyxXQUFXLFdBQVk7S0FDNUIsdUNBQXVDLEtBQUs7S0FDNUMsa0JBQ0UsVUFBVSxRQUNWLGdCQUNBLE1BQ0EsT0FDQSxTQUNGO0lBQ0Y7R0FDRjtHQUNBLElBQUksT0FBTyxNQUFNO0dBQ2pCLFNBQVMsUUFDUCxlQUFlLE9BQU8sS0FBSyxzQkFDMUIsT0FBTyxXQUFXLFdBQVk7SUFDN0IsdUNBQXVDLEtBQUs7SUFDNUMsa0JBQ0UsVUFBVSxRQUNWLGdCQUNBLE1BQ0EsT0FDQSxTQUNGO0lBQ0EsZUFBZSxPQUFPLDZCQUNuQixTQUFTLHlDQUNMLHlEQUF5QyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsSUFDeEQsdUNBQXVDLElBQUksSUFBSTtJQUNyRCwyQkFBMkIsTUFBTSxTQUFTO0lBQzFDLGVBQWUsT0FBTyw0QkFDbkIsT0FBTyxNQUFNLFFBQVEsTUFDcEIsUUFBUSxNQUNOLHVKQUNBLD
15852BCQUEwQixLQUFLLEtBQUssU0FDdEM7R0FDTjtFQUNKO0VBQ0EsU0FBUyxlQUNQLE1BQ0EsYUFDQSxhQUNBLE9BQ0EsaUJBQ0E7R0FDQSxZQUFZLFNBQVM7R0FDckIscUJBQXFCLHVCQUF1QixNQUFNLGVBQWU7R0FDakUsSUFDRSxTQUFTLFNBQ1QsYUFBYSxPQUFPLFNBQ3BCLGVBQWUsT0FBTyxNQUFNLE1BQzVCO0lBQ0EsY0FBYyxZQUFZO0lBQzFCLFNBQVMsZUFDUCw4QkFDRSxhQUNBLGFBQ0EsaUJBQ0EsQ0FBQyxDQUNIO0lBQ0YsZ0JBQWdCLHVCQUF1QixDQUFDO0lBQ3hDLGNBQWMsMkJBQTJCO0lBQ3pDLElBQUksU0FBUyxhQUFhO0tBQ3hCLFFBQVEsWUFBWSxLQUFwQjtNQUNFLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSyxJQUNILE9BQ0UsU0FBUyxnQkFDTCxnQ0FBZ0MsSUFDaEMsU0FBUyxZQUFZLGFBQ3JCLGlDQUFpQyxtQkFDaEMsK0JBQStCLGdCQUNuQyxZQUFZLFNBQVMsTUFDckIsWUFBWSxTQUFTLE9BQ3JCLFlBQVksUUFBUSxpQkFDckIsVUFBVSw4QkFDTCxZQUFZLFNBQVMsU0FDcEIsY0FBYyxZQUFZLGFBQzVCLFNBQVMsY0FDSixZQUFZLDhCQUFjLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUMxQyxZQUFZLElBQUksS0FBSyxHQUN6QixtQkFBbUIsTUFBTSxPQUFPLGVBQWUsSUFDbkQsQ0FBQztNQUVMLEtBQUssSUFDSCxPQUNHLFlBQVksU0FBUyxPQUN0QixVQUFVLDhCQUNMLFlBQVksU0FBUyxTQUNwQixjQUFjLFlBQVksYUFDNUIsU0FBUyxlQUNILGNBQWM7T0FDZCxhQUFhO09BQ2IsaUJBQWlCO09BQ2pCLDRCQUFZLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQztNQUM3QixHQUNDLFlBQVksY0FBYyxnQkFDekIsY0FBYyxZQUFZLFlBQzVCLFNBQVMsY0FDSixZQUFZLDZCQUFhLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUN6QyxZQUFZLElBQUksS0FBSyxJQUM3QixtQkFBbUIsTUFBTSxPQUFPLGVBQWUsSUFDbkQsQ0FBQztLQUVQO0tBQ0EsTUFBTSxNQUNKLHNDQUNFLFlBQVksTUFDWiw0QkFDSjtJQUNGO0lBQ0EsbUJBQW1CLE1BQU0sT0FBTyxlQUFlO0lBQy9DLGdDQUFnQztJQUNoQyxPQUFPLENBQUM7R0FDVjtHQUNBLElBQUksYUFDRixPQUNHLHVCQUF1QixDQUFDLEdBQ3hCLGNBQWMsMkJBQTJCLFNBQzFDLFNBQVMsZUFDSixPQUFPLFlBQVksT0FDbEIsUUFBUSxNQUNOLDBFQUNGLEdBQ0YsT0FBTyxZQUFZLFFBQVEsV0FBVyxZQUFZLFNBQVMsTUFDMUQsWUFBWSxTQUFTLE9BQ3JCLFlBQVksUUFBUSxpQkFDckIsVUFBVSw4QkFDUixvQkFDRSwyQkFDRSxNQUNFLG9JQUNBLEVBQUUsT0FBTyxNQUFNLENBQ2pCLEdBQ0EsV0FDRixDQUNGLE1BQ0QsVUFBVSw4QkFDVCxvQkFDRSwyQkFDRSxNQUNFLGlIQUNBLEVBQUUsT0FBTyxNQUFNLENBQ2pCLEdBQ0EsV0FDRixDQUNGLEdBQ0QsT0FBTyxLQUFLLFFBQVEsV0FDcEIsS0FBSyxTQUFTLE9BQ2QsbUJBQW1CLENBQUMsaUJBQ3BCLEtBQUssU0FBUyxpQkFDZCxRQUFRLDJCQUEyQixPQUFPLFdBQVcsR0FDckQsa0JBQWtCLHNCQUNqQixLQUFLLFdBQ0wsT0FDQSxlQUNGLEdBQ0Esc0JBQXNCLE1BQU0sZUFBZSxHQUMzQyxpQ0FBaUMsMkJBQzlCLCtCQUErQixlQUN0QyxDQUFDO0dBRUwsSUFBSSxRQUFRLDJCQUNWLE1BQ0Usb0lBQ0EsRUFBRSxPQUFPLE1BQU0sQ0FDakIsR0FDQSxXQUNGO0dBQ0EsU0FBUyxxQ0FDSixxQ0FBcUMsQ0FBQyxLQUFLLElBQzVDLG1DQUFtQyxLQUFLLEtBQUs7R0FDakQsaUNBQWlDLDJCQUM5QiwrQkFBK0I7R0FDbEMsSUFBSSxTQUFTLGFBQWEsT0FBTyxDQUFDO0dBQ2xDLFFBQVEsMkJBQTJCLE9BQU8sV0FBVztHQUNyRCxjQUFjO0dBQ2QsR0FBRztJQUNELFFBQVEsWUFBWSxLQUFwQjtLQUNFLEtBQUssR0FDSCxPQUNHLFlBQVksU0FBUyxPQUNyQixPQUFPLGtCQUFrQixDQUFDLGlCQUMxQixZQUFZLFNBQVMsTUFDckIsT0FBTyxzQkFDTixZQUFZLFdBQ1osT0FDQSxJQUNGLEdBQ0Esc0JBQXNCLGFBQWEsSUFBSSxHQUN2QyxDQUFDO0tBRUwsS0FBSztNQUNILGNBQWMsWUFBWTtNQUMxQixRQUFRLFlBQVk7TUFDcEIsSUFDRSxPQUFPLFlBQVksUUFBUSxTQUMxQixlQUFlLE9BQU8sWUFBWSw0QkFDaEMsU0FBUyxTQUNSLGVBQWUsT0FBTyxNQUFNLHNCQUMzQixTQUFTLDBDQUNSLENBQUMsdUNBQXVDLElBQUksS0FBSyxLQUV2RCxPQUNHLFlBQVksU0FBUyxPQUNyQixtQkFBbUIsQ0FBQyxpQkFDcEIsWUFBWSxTQUFTLGlCQUNyQixrQkFBa0IsdUJBQXVCLGVBQWUsR0FDekQsMkJBQ0UsaUJBQ0EsTUFDQSxhQUNBLEtBQ0YsR0FDQSxzQkFBc0IsYUFBYSxlQUFlLEdBQ2xELENBQUM7TUFFTDtLQUNGLEtBQUssSUFDSCxJQUFJLFNBQVMsWUFBWSxlQUN2QixPQUFRLFlBQVksU0FBUyxPQUFRLENBQUM7SUFDNUM7SUFDQSxjQUFjLFlBQVk7R0FDNUIsU0FBUyxTQUFTO0dBQ2xCLE9BQU8sQ0FBQztFQUNWO0VBQ0EsU0FBUyxrQkFDUCxTQUNBLGdCQUNBLGNBQ0EsYUFDQTtHQUNBLGVBQWUsUUFDYixTQUFTLFVBQ0wsaUJBQWlCLGdCQUFnQixNQUFNLGNBQWMsV0FBVyxJQUNoRSxxQkFDRSxnQkFDQSxRQUFRLE9BQ1IsY0FDQSxXQUNGO0VBQ1I7RUFDQSxTQUFTLGlCQUNQLFNBQ0EsZ0JBQ0EsV0FDQSxXQUNBLGFBQ0E7R0FDQSxZQUFZLFVBQVU7R0FDdEIsSUFBSSxpQkFBaUIsMkJBQTJCLFNBQVM7R0FDekQsbUJBQW1CLGNBQ2YsWUFBWSxnQkFDZCxTQUFTLFlBQVksbUJBQW1CLENBQUM7R0FDM0MsaUJBQWlCLGVBQWU7R0FDaEMsSUFBSSxTQUFTLFdBQVc7SUFDdEIsSUFBSSxrQkFBa0IsQ0FBQztJQUN2QixLQUFLLElBQUksT0FBTyxXQUNkLFVBQVUsUUFBUSxnQkFBZ0IsT0FBTyxVQUFVO0dBQ3ZELE9BQU8sa0JBQWtCO0dBQ3pCLHFCQUFxQixjQUFjO0dBQ25DLFlBQVksZ0JBQ1YsU0FDQSxnQkFDQSxXQUNBLGlCQUNBLGdCQUNBLFdBQ0Y7R0FDQSxNQUFNLHFCQUFxQjtHQUMzQixJQUFJLFNBQVMsV0FBVyxDQUFDLGtCQUN2QixPQUNFLGFBQWEsU0FBUyxnQkFBZ0IsV0FBVyxHQUNqRCw2QkFBNkIsU0FBUyxnQkFBZ0IsV0FBVztHQUVyRSxlQUFlLE9BQU8sdUJBQXVCLGNBQWM7R0FDM0QsZUFBZSxTQUFTO0dBQ3hCLGtCQUFrQixTQUFTLGdCQUFnQixXQUFXLFdBQVc7R0FDakUsT0FBTyxlQUFlO0VBQ3hCO0VBQ0EsU0FBUyxvQkFDUCxTQUNBLGdCQUNBLFdBQ0EsV0FDQSxhQUNBO0dBQ0EsSUFBSSxTQUFTLFNBQVM7SUFDcEIsSUFBSSxPQUFPLFVBQVU7SUFDckIsSUFDRSxlQUFlLE9BQU8sUUFDdEIsQ0FBQyxnQkFBZ0IsSUFBSSxLQUNyQixLQUFLLE1BQU0sS0FBSyxnQkFDaEIsU0FBUyxVQUFVLFNBRW5CLE9BQ0csWUFBWSwyQkFBMkIsSUFBSSxHQUMzQyxlQUFlLE1BQU0sSUFDckIsZUFBZSxPQUFPLFdBQ3ZCLCtCQUErQixnQkFBZ0IsSUFBSSxHQUNuRCwwQkFDRSxTQUNBLGdCQUNBLFdBQ0EsV0FDQSxXQUNGO0lBRUosVUFBVSw0QkFDUixVQUFVLE1BQ1YsTUFDQSxXQUNBLGdCQUNBLGVBQWUsTUFDZixXQUNGO0lBQ0EsUUFBUSxNQUFNLGVBQWU7SUFDN0IsUUFBUSxTQUFTO0lBQ2pCLE9BQVEsZUFBZSxRQUFRO0dBQ2pDO0dBQ0EsT0FBTyxRQUFRO0dBQ2YsSUFBSSxDQUFDLDhCQUE4QixTQUFTLFdBQVcsR0FBRztJQUN4RCxJQUFJLFlBQVksS0FBSztJQUNyQixZQUFZLFVBQVU7SUFDdEIsWUFBWSxTQUFTLFlBQVksWUFBWTtJQUM3QyxJQUNFLFVBQVUsV0FBVyxTQUFTLEtBQzlCLFFBQVEsUUFBUSxlQUFlLEtBRS9CLE9BQU8sNkJBQ0wsU0FDQSxnQkFDQSxXQUNGO0dBQ0o7R0FDQSxlQUFlLFNBQVM7R0FDeEIsVUFBVSxxQkFBcUIsTUFBTSxTQUFTO0dBQzlDLFFBQVEsTUFBTSxlQUFlO0dBQzdCLFFBQVEsU0FBUztHQUNqQixPQUFRLGVBQWUsUUFBUTtFQUNqQztFQUNBLFNBQVMsMEJBQ1AsU0FDQSxnQkFDQSxXQUNBLF
15852dBQ0EsYUFDQTtHQUNBLElBQUksU0FBUyxTQUFTO0lBQ3BCLElBQUksWUFBWSxRQUFRO0lBQ3hCLElBQ0UsYUFBYSxXQUFXLFNBQVMsS0FDakMsUUFBUSxRQUFRLGVBQWUsT0FDL0IsZUFBZSxTQUFTLFFBQVEsTUFFaEMsSUFDSSxtQkFBbUIsQ0FBQyxHQUNyQixlQUFlLGVBQWUsWUFBWSxXQUMzQyw4QkFBOEIsU0FBUyxXQUFXLEdBRWxELE9BQU8sUUFBUSxRQUFRLFlBQVksbUJBQW1CLENBQUM7U0FFdkQsT0FDRyxlQUFlLFFBQVEsUUFBUSxPQUNoQyw2QkFBNkIsU0FBUyxnQkFBZ0IsV0FBVztHQUV6RTtHQUNBLE9BQU8sd0JBQ0wsU0FDQSxnQkFDQSxXQUNBLFdBQ0EsV0FDRjtFQUNGO0VBQ0EsU0FBUyx5QkFDUCxTQUNBLGdCQUNBLGFBQ0EsV0FDQTtHQUNBLElBQUksZUFBZSxVQUFVLFVBQzNCLFlBQVksU0FBUyxVQUFVLFFBQVEsZ0JBQWdCO0dBQ3pELFNBQVMsV0FDUCxTQUFTLGVBQWUsY0FDdkIsZUFBZSxZQUFZO0lBQzFCLGFBQWE7SUFDYixpQkFBaUI7SUFDakIsYUFBYTtJQUNiLGNBQWM7R0FDaEI7R0FDRixJQUFJLGFBQWEsVUFBVSxNQUFNO0lBQy9CLElBQUksT0FBTyxlQUFlLFFBQVEsTUFBTTtLQUN0QyxZQUNFLFNBQVMsWUFDTCxVQUFVLFlBQVksY0FDdEI7S0FDTixJQUFJLFNBQVMsU0FBUztNQUNwQixZQUFZLGVBQWUsUUFBUSxRQUFRO01BQzNDLEtBQUssZUFBZSxHQUFHLFNBQVMsWUFDOUIsZUFDRSxlQUFlLFVBQVUsUUFBUSxVQUFVLFlBQzFDLFlBQVksVUFBVTtNQUMzQixZQUFZLGVBQWUsQ0FBQztLQUM5QixPQUFPLFlBQWEsR0FBSyxlQUFlLFFBQVE7S0FDaEQsT0FBTyw4QkFDTCxTQUNBLGdCQUNBLFdBQ0EsYUFDQSxTQUNGO0lBQ0Y7SUFDQSxJQUFJLE9BQU8sY0FBYyxZQUN2QixlQUFnQixnQkFBZ0I7S0FBRSxXQUFXO0tBQUcsV0FBVztJQUFLLEdBQzlELFNBQVMsV0FDUCxlQUNFLGdCQUNBLFNBQVMsWUFBWSxVQUFVLFlBQVksSUFDN0MsR0FDRixTQUFTLFlBQ0wsa0JBQWtCLGdCQUFnQixTQUFTLElBQzNDLDBCQUEwQixjQUFjLEdBQzVDLDZCQUE2QixjQUFjO1NBRTdDLE9BQ0csWUFBWSxlQUFlLFFBQVEsV0FDcEMsOEJBQ0UsU0FDQSxnQkFDQSxTQUFTLFlBQ0wsVUFBVSxZQUFZLGNBQ3RCLGFBQ0osYUFDQSxTQUNGO0dBRU4sT0FDRSxTQUFTLGFBQ0osZUFBZSxnQkFBZ0IsVUFBVSxTQUFTLEdBQ25ELGtCQUFrQixnQkFBZ0IsU0FBUyxHQUMzQyw0QkFBNEIsY0FBYyxHQUN6QyxlQUFlLGdCQUFnQixTQUMvQixTQUFTLFdBQVcsZUFBZSxnQkFBZ0IsSUFBSSxHQUN4RCwwQkFBMEIsY0FBYyxHQUN4Qyw0QkFBNEIsY0FBYztHQUNoRCxrQkFBa0IsU0FBUyxnQkFBZ0IsY0FBYyxXQUFXO0dBQ3BFLE9BQU8sZUFBZTtFQUN4QjtFQUNBLFNBQVMsMEJBQTBCLFNBQVMsZ0JBQWdCO0dBQzFELFNBQVUsV0FBVyxPQUFPLFFBQVEsT0FDbEMsU0FBUyxlQUFlLGNBQ3ZCLGVBQWUsWUFBWTtJQUMxQixhQUFhO0lBQ2IsaUJBQWlCO0lBQ2pCLGFBQWE7SUFDYixjQUFjO0dBQ2hCO0dBQ0YsT0FBTyxlQUFlO0VBQ3hCO0VBQ0EsU0FBUyw4QkFDUCxTQUNBLGdCQUNBLGVBQ0EsYUFDQSxxQkFDQTtHQUNBLElBQUksMkJBQTJCLGtCQUFrQjtHQUNqRCwyQkFDRSxTQUFTLDJCQUNMLE9BQ0E7SUFDRSxRQUFRLGFBQWE7SUFDckIsTUFBTTtHQUNSO0dBQ04sZUFBZSxnQkFBZ0I7SUFDN0IsV0FBVztJQUNYLFdBQVc7R0FDYjtHQUNBLFNBQVMsV0FBVyxlQUFlLGdCQUFnQixJQUFJO0dBQ3ZELDBCQUEwQixjQUFjO0dBQ3hDLDZCQUE2QixjQUFjO0dBQzNDLFNBQVMsV0FDUCw4QkFBOEIsU0FBUyxnQkFBZ0IsYUFBYSxDQUFDLENBQUM7R0FDeEUsZUFBZSxhQUFhO0dBQzVCLE9BQU87RUFDVDtFQUNBLFNBQVMsc0JBQXNCLGdCQUFnQixXQUFXO0dBQ3hELElBQUksYUFBYSxVQUFVO0dBQzNCLEtBQUssTUFBTSxjQUNULFFBQVEsTUFDTiwyR0FDQSxDQUFDLE1BQU0sYUFDSCxXQUNBLENBQUMsTUFBTSxhQUNMLG1CQUNBLGdCQUNOLGFBQWEsb0JBQWtCLGtCQUNqQztHQUNGLFlBQVksa0NBQ1Y7SUFBRSxNQUFNLFVBQVU7SUFBTSxVQUFVLFVBQVU7R0FBUyxHQUNyRCxlQUFlLElBQ2pCO0dBQ0EsVUFBVSxNQUFNLGVBQWU7R0FDL0IsZUFBZSxRQUFRO0dBQ3ZCLFVBQVUsU0FBUztHQUNuQixPQUFPO0VBQ1Q7RUFDQSxTQUFTLHVDQUNQLFNBQ0EsZ0JBQ0EsYUFDQTtHQUNBLHFCQUFxQixnQkFBZ0IsUUFBUSxPQUFPLE1BQU0sV0FBVztHQUNyRSxVQUFVLHNCQUNSLGdCQUNBLGVBQWUsWUFDakI7R0FDQSxRQUFRLFNBQVM7R0FDakIsbUJBQW1CLGNBQWM7R0FDakMsZUFBZSxnQkFBZ0I7R0FDL0IsT0FBTztFQUNUO0VBQ0EsU0FBUyx3QkFBd0IsU0FBUyxnQkFBZ0IsYUFBYTtHQUNyRSxJQUFJLFlBQVksZUFBZSxjQUM3QixhQUFhLE9BQU8sZUFBZSxRQUFRO0dBQzdDLGVBQWUsU0FBUztHQUN4QixJQUFJLFNBQVMsU0FBUztJQUNwQixJQUFJLGFBQWE7S0FDZixJQUFJLGFBQWEsVUFBVSxNQUN6QixPQUNHLFVBQVUsc0JBQXNCLGdCQUFnQixTQUFTLEdBQ3pELGVBQWUsUUFBUSxXQUN2QixRQUFRLGdCQUFnQjtNQUFFLFdBQVc7TUFBRyxXQUFXO0tBQUssR0FDekQsMEJBQTBCLE1BQU0sT0FBTztLQUUzQyxzQ0FBc0MsY0FBYztLQUNwRCxDQUFDLFVBQVUsMkJBQ0wsY0FBYyw0QkFDZCxTQUNBLHNCQUNGLEdBQ0MsY0FDQyxTQUFTLGVBQWUsWUFBWSxTQUFTLHNCQUN6QyxjQUNBLE1BQ04sU0FBUyxnQkFDTCxZQUFZO01BQ1osWUFBWTtNQUNaLGFBQWEsd0JBQXdCO01BQ3JDLFdBQVc7TUFDWCxpQkFBaUI7S0FDbkIsR0FDQyxlQUFlLGdCQUFnQixXQUMvQixZQUFZLGtDQUFrQyxXQUFXLEdBQ3pELFVBQVUsU0FBUyxnQkFDbkIsZUFBZSxRQUFRLFdBQ3ZCLHVCQUF1QixnQkFDdkIseUJBQXlCLFNBQzNCLGNBQWM7S0FDbkIsSUFBSSxTQUFTLGFBQ1gsTUFDRyx3QkFBd0IsZ0JBQWdCLE9BQU8sR0FDaEQseUJBQXlCLGNBQWM7S0FFM0MsZUFBZSxRQUFRO0tBQ3ZCLE9BQU87SUFDVDtJQUNBLE9BQU8sc0JBQXNCLGdCQUFnQixTQUFTO0dBQ3hEO0dBQ0EsSUFBSSxZQUFZLFFBQVE7R0FDeEIsSUFBSSxTQUFTLFdBQVc7SUFDdEIsSUFBSSxtQkFBbUIsVUFBVTtJQUNqQyxzQ0FBc0MsY0FBYztJQUNwRCxJQUFJLFlBQ0YsSUFBSSxlQUFlLFFBQVEsS0FDekIsZUFBZ0IsU0FBUyxNQUN0QixpQkFBaUIsdUNBQ2hCLFNBQ0EsZ0JBQ0EsV0FDRjtTQUNDLElBQUksU0FBUyxlQUFlLGVBQy9CLGVBQWdCLFFBQVEsUUFBUSxPQUM3QixlQUFlLFNBQVMsS0FDeEIsaUJBQWlCO1NBRXBCLE1BQU0sTUFDSiwwRUFDRjtTQUNDLElBQ0YsZ0JBQWdCLEdBQ2pCLE9BQU8sY0FBYyxjQUNuQix1QkFBdUIsY0FBYyxHQUN2QyxvQkFDRSw4QkFDRSxTQUNBLGdCQUNBLGFBQ0EsQ0FBQyxDQUNILEdBQ0QsYUFBYSxPQUFPLGNBQWMsUUFBUSxhQUMzQyxvQkFBb0IsWUFDcEI7S0FDQSxJQUFJLFNBQVMsNkJBQTZCLFNBQVM7TUFDakQsWUFBWTtNQUNaLElBQ0UsU0FBUyxjQUNQLG1CQUFtQiwwQkFDbkIsV0FDQSxXQUNGLEdBQ0EsTUFBTSxvQkFDSixxQkFBcUIsVUFBVSxZQUVqQyxNQUNJLFVBQVUsWUFBWSxrQkFDeEIsK0JBQStCL
15852FNBQVMsZ0JBQWdCLEdBQ3hELHNCQUFzQixXQUFXLFNBQVMsZ0JBQWdCLEdBQzFEO01BRUosZ0NBQWdDO0tBQ2xDO0tBQ0EsaUJBQWlCLHVDQUNmLFNBQ0EsZ0JBQ0EsV0FDRjtJQUNGLE9BQ0UsVUFBVyxVQUFVLGFBQ2xCLHlCQUF5QixrQkFDeEIsaUJBQWlCLFdBQ25CLEdBQ0MsdUJBQXVCLGdCQUN2QixjQUFjLENBQUMsR0FDZixrQkFBa0IsTUFDbEIsdUJBQXVCLENBQUMsR0FDeEIsdUJBQXVCLE1BQ3ZCLHlCQUF5QixDQUFDLEdBQzNCLFNBQVMsV0FDUCw0QkFBNEIsZ0JBQWdCLE9BQU8sR0FDcEQsaUJBQWlCLHNCQUFzQixnQkFBZ0IsU0FBUyxHQUNoRSxlQUFlLFNBQVM7SUFDN0IsT0FBTztHQUNUO0dBQ0EsWUFBWSxRQUFRO0dBQ3BCLFlBQVk7SUFBRSxNQUFNLFVBQVU7SUFBTSxVQUFVLFVBQVU7R0FBUztHQUNqRSxPQUFPLGNBQWMsY0FDbkIsT0FBTyxjQUFjLFFBQVEsVUFDN0IsdUJBQXVCLGNBQWM7R0FDdkMsVUFBVSxxQkFBcUIsV0FBVyxTQUFTO0dBQ25ELFFBQVEsTUFBTSxlQUFlO0dBQzdCLGVBQWUsUUFBUTtHQUN2QixRQUFRLFNBQVM7R0FDakIsT0FBTztFQUNUO0VBQ0EsU0FBUyxRQUFRLFNBQVMsZ0JBQWdCO0dBQ3hDLElBQUksTUFBTSxlQUFlO0dBQ3pCLElBQUksU0FBUyxLQUNYLFNBQVMsV0FDUCxTQUFTLFFBQVEsUUFDaEIsZUFBZSxTQUFTO1FBQ3hCO0lBQ0gsSUFBSSxlQUFlLE9BQU8sT0FBTyxhQUFhLE9BQU8sS0FDbkQsTUFBTSxNQUNKLDRGQUNGO0lBQ0YsSUFBSSxTQUFTLFdBQVcsUUFBUSxRQUFRLEtBQ3RDLGVBQWUsU0FBUztHQUM1QjtFQUNGO0VBQ0EsU0FBUyx3QkFDUCxTQUNBLGdCQUNBLFdBQ0EsV0FDQSxhQUNBO0dBQ0EsSUFDRSxVQUFVLGFBQ1YsZUFBZSxPQUFPLFVBQVUsVUFBVSxRQUMxQztJQUNBLElBQUksZ0JBQWdCLHlCQUF5QixTQUFTLEtBQUs7SUFDM0QscUJBQXFCLG1CQUNsQixRQUFRLE1BQ1AsMEtBQ0EsZUFDQSxhQUNGLEdBQ0MscUJBQXFCLGlCQUFpQixDQUFDO0dBQzVDO0dBQ0EsZUFBZSxPQUFPLG9CQUNwQix3QkFBd0IsMkJBQ3RCLGdCQUNBLElBQ0Y7R0FDRixTQUFTLFlBQ04sK0JBQStCLGdCQUFnQixlQUFlLElBQUksR0FDbkUsVUFBVSxpQkFDTixnQkFBZ0IseUJBQXlCLFNBQVMsS0FBSyxXQUN6RCx5QkFBeUIsbUJBQ3JCLHlCQUF5QixpQkFBaUIsQ0FBQyxHQUM3QyxRQUFRLE1BQ04seUtBQ0EsYUFDRjtHQUNOLHFCQUFxQixjQUFjO0dBQ25DLFlBQVksZ0JBQ1YsU0FDQSxnQkFDQSxXQUNBLFdBQ0EsS0FBSyxHQUNMLFdBQ0Y7R0FDQSxZQUFZLHFCQUFxQjtHQUNqQyxJQUFJLFNBQVMsV0FBVyxDQUFDLGtCQUN2QixPQUNFLGFBQWEsU0FBUyxnQkFBZ0IsV0FBVyxHQUNqRCw2QkFBNkIsU0FBUyxnQkFBZ0IsV0FBVztHQUVyRSxlQUFlLGFBQWEsdUJBQXVCLGNBQWM7R0FDakUsZUFBZSxTQUFTO0dBQ3hCLGtCQUFrQixTQUFTLGdCQUFnQixXQUFXLFdBQVc7R0FDakUsT0FBTyxlQUFlO0VBQ3hCO0VBQ0EsU0FBUyx3QkFDUCxTQUNBLGdCQUNBLFdBQ0EsV0FDQSxXQUNBLGFBQ0E7R0FDQSxxQkFBcUIsY0FBYztHQUNuQywwQkFBMEI7R0FDMUIsNkJBQ0UsU0FBUyxXQUFXLFFBQVEsU0FBUyxlQUFlO0dBQ3RELGVBQWUsY0FBYztHQUM3QixZQUFZLHFCQUNWLGdCQUNBLFdBQ0EsV0FDQSxTQUNGO0dBQ0EscUJBQXFCLFNBQVMsY0FBYztHQUM1QyxZQUFZLHFCQUFxQjtHQUNqQyxJQUFJLFNBQVMsV0FBVyxDQUFDLGtCQUN2QixPQUNFLGFBQWEsU0FBUyxnQkFBZ0IsV0FBVyxHQUNqRCw2QkFBNkIsU0FBUyxnQkFBZ0IsV0FBVztHQUVyRSxlQUFlLGFBQWEsdUJBQXVCLGNBQWM7R0FDakUsZUFBZSxTQUFTO0dBQ3hCLGtCQUFrQixTQUFTLGdCQUFnQixXQUFXLFdBQVc7R0FDakUsT0FBTyxlQUFlO0VBQ3hCO0VBQ0EsU0FBUyxxQkFDUCxTQUNBLGdCQUNBLFdBQ0EsV0FDQSxhQUNBO0dBQ0EsUUFBUSxnQkFBZ0IsY0FBYyxHQUF0QztJQUNFLEtBQUssQ0FBQztLQUNKLElBQUksWUFBWSxlQUFlLFdBQzdCLFFBQVEsSUFBSSxlQUFlLEtBQ3pCLGVBQWUsZUFDZixVQUFVLE9BQ1osQ0FBQyxDQUFDO0tBQ0osVUFBVSxRQUFRLGdCQUFnQixXQUFXLE9BQU8sSUFBSTtLQUN4RDtJQUNGLEtBQUssQ0FBQztLQUNKLGVBQWUsU0FBUztLQUN4QixlQUFlLFNBQVM7S0FDeEIsWUFBWSxNQUFNLHNDQUFzQztLQUN4RCxJQUFJLE9BQU8sY0FBYyxDQUFDO0tBQzFCLGVBQWUsU0FBUztLQUN4QixRQUFRO0tBQ1IsSUFBSSxTQUFTLE9BQ1gsTUFBTSxNQUNKLGlGQUNGO0tBQ0YsT0FBTyx1QkFBdUIsSUFBSTtLQUNsQywyQkFDRSxNQUNBLE9BQ0EsZ0JBQ0EsMkJBQTJCLFdBQVcsY0FBYyxDQUN0RDtLQUNBLHNCQUFzQixnQkFBZ0IsSUFBSTtHQUM5QztHQUNBLHFCQUFxQixjQUFjO0dBQ25DLElBQUksU0FBUyxlQUFlLFdBQVc7SUFDckMsUUFBUTtJQUNSLFlBQVksVUFBVTtJQUN0QixpQkFBaUIsYUFDZixTQUFTLGNBQ1IsS0FBSyxNQUFNLGFBQWEsVUFBVSxhQUFhLHVCQUNoRCxDQUFDLGtDQUFrQyxJQUFJLFNBQVMsTUFDL0Msa0NBQWtDLElBQUksU0FBUyxHQUMvQyxPQUNDLEtB
15852QUssTUFBTSxZQUNQLDROQUNBLGFBQWEsT0FBTyxZQUNsQiw4QkFBOEIsT0FBTyxZQUFZLE1BQ2pELFVBQVUsYUFBYSxzQkFDckIsNkRBQ0EsaURBQ0EsT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUNoQyxNQUNWLFFBQVEsTUFDTiwwSEFDQSx5QkFBeUIsU0FBUyxLQUFLLGFBQ3ZDLElBQ0Y7SUFDRixhQUFhLE9BQU8sYUFDbEIsU0FBUyxjQUNSLFFBQVEsWUFBWSxTQUFTO0lBQ2hDLFlBQVksSUFBSSxVQUFVLFdBQVcsS0FBSztJQUMxQyxJQUFJLGVBQWUsT0FBTyxrQkFBa0I7S0FDMUMsMkJBQTJCLENBQUMsQ0FBQztLQUM3QixJQUFJO01BQ0YsWUFBWSxJQUFJLFVBQVUsV0FBVyxLQUFLO0tBQzVDLFVBQVU7TUFDUiwyQkFBMkIsQ0FBQyxDQUFDO0tBQy9CO0lBQ0Y7SUFDQSxRQUFRLGVBQWUsZ0JBQ3JCLFNBQVMsVUFBVSxTQUFTLEtBQUssTUFBTSxVQUFVLFFBQzdDLFVBQVUsUUFDVjtJQUNOLFVBQVUsVUFBVTtJQUNwQixlQUFlLFlBQVk7SUFDM0IsVUFBVSxrQkFBa0I7SUFDNUIsVUFBVSx5QkFBeUI7SUFDbkMsZUFBZSxPQUFPLFVBQVUsNEJBQzlCLFNBQVMsVUFDUCxRQUFRLHlCQUF5QixTQUFTLEtBQUssYUFDakQsK0JBQStCLElBQUksS0FBSyxNQUNyQywrQkFBK0IsSUFBSSxLQUFLLEdBQ3pDLFFBQVEsTUFDTixtUkFDQSxPQUNBLFNBQVMsVUFBVSxRQUFRLFNBQVMsYUFDcEMsS0FDRjtJQUNKLElBQ0UsZUFBZSxPQUFPLFVBQVUsNEJBQ2hDLGVBQWUsT0FBTyxVQUFVLHlCQUNoQztLQUNBLElBQUksc0JBQXVCLE9BQU8sUUFBUTtLQUMxQyxlQUFlLE9BQU8sVUFBVSxzQkFDaEMsQ0FBQyxNQUFNLFVBQVUsbUJBQW1CLCtCQUMvQixRQUFRLHVCQUNULGVBQWUsT0FBTyxVQUFVLDhCQUMvQixRQUFRO0tBQ2IsZUFBZSxPQUFPLFVBQVUsNkJBQ2hDLENBQUMsTUFDQyxVQUFVLDBCQUEwQiwrQkFDakMsT0FBTyw4QkFDUixlQUNFLE9BQU8sVUFBVSxxQ0FDbEIsT0FBTztLQUNaLGVBQWUsT0FBTyxVQUFVLHVCQUNoQyxDQUFDLE1BQU0sVUFBVSxvQkFBb0IsK0JBQ2hDLHNCQUFzQix3QkFDdkIsZUFBZSxPQUFPLFVBQVUsK0JBQy9CLHNCQUFzQjtLQUMzQixJQUFJLFNBQVMsU0FBUyxTQUFTLFFBQVEsU0FBUyxxQkFBcUI7TUFDbkUsWUFBWSx5QkFBeUIsU0FBUyxLQUFLO01BQ25ELElBQUksYUFDRixlQUFlLE9BQU8sVUFBVSwyQkFDNUIsK0JBQ0E7TUFDTiw0Q0FBNEMsSUFBSSxTQUFTLE1BQ3RELDRDQUE0QyxJQUFJLFNBQVMsR0FDMUQsUUFBUSxNQUNOLGtTQUNBLFdBQ0EsWUFDQSxTQUFTLFFBQVEsU0FBUyxRQUFRLElBQ2xDLFNBQVMsT0FBTyxTQUFTLE9BQU8sSUFDaEMsU0FBUyxzQkFBc0IsU0FBUyxzQkFBc0IsRUFDaEU7S0FDSjtJQUNGO0lBQ0EsWUFBWSxlQUFlO0lBQzNCLFFBQVEseUJBQXlCLFNBQVMsS0FBSztJQUMvQyxVQUFVLFdBQ1AsVUFBVSxhQUNYLGVBQWUsT0FBTyxVQUFVLFVBQVUsU0FDdEMsUUFBUSxNQUNOLDRHQUNBLEtB
15852Q0YsSUFDQSxRQUFRLE1BQ04sMkZBQ0EsS0FDRjtJQUNOLENBQUMsVUFBVSxtQkFDVCxVQUFVLGdCQUFnQix3QkFDMUIsVUFBVSxTQUNWLFFBQVEsTUFDTixxTEFDQSxLQUNGO0lBQ0YsVUFBVSxtQkFDUixDQUFDLFVBQVUsZ0JBQWdCLHdCQUMzQixRQUFRLE1BQ04sMExBQ0EsS0FDRjtJQUNGLFVBQVUsZUFDUixRQUFRLE1BQ04sK0dBQ0EsS0FDRjtJQUNGLFVBQVUscUJBQ1IsQ0FBQyw4QkFBOEIsSUFBSSxTQUFTLE1BQzNDLDhCQUE4QixJQUFJLFNBQVMsR0FDNUMsUUFBUSxNQUNOLHNKQUNBLEtBQ0Y7SUFDRixVQUFVLGdCQUNSLENBQUMsMkJBQTJCLElBQUksU0FBUyxNQUN4QywyQkFBMkIsSUFBSSxTQUFTLEdBQ3pDLFFBQVEsTUFDTix5S0FDQSxLQUNGO0lBQ0YsZUFBZSxPQUFPLFVBQVUseUJBQzlCLFFBQVEsTUFDTiwrS0FDQSxLQUNGO0lBQ0YsVUFBVSxhQUNSLFVBQVUsVUFBVSx3QkFDcEIsZ0JBQWdCLE9BQU8sVUFBVSx5QkFDakMsUUFBUSxNQUNOLGdNQUNBLHlCQUF5QixTQUFTLEtBQUssa0JBQ3pDO0lBQ0YsZUFBZSxPQUFPLFVBQVUsdUJBQzlCLFFBQVEsTUFDTiw2SEFDQSxLQUNGO0lBQ0YsZUFBZSxPQUFPLFVBQVUsNEJBQzlCLFFBQVEsTUFDTixvVEFDQSxLQUNGO0lBQ0YsZUFBZSxPQUFPLFVBQVUsNkJBQzlCLFFBQVEsTUFDTixpR0FDQSxLQUNGO0lBQ0YsZUFBZSxPQUFPLFVBQVUsb0NBQzlCLFFBQVEsTUFDTiwrR0FDQSxLQUNGO0lBQ0YsT0FBTyxVQUFVLFVBQVU7SUFDM0IsS0FBSyxNQUFNLFVBQVUsU0FDbkIsUUFDQSxRQUFRLE1BQ04sbUhBQ0EsS0FDRjtJQUNGLFVBQVUsZ0JBQ1IsUUFBUSxNQUNOLHFKQUNBLE9BQ0EsS0FDRjtJQUNGLGVBQWUsT0FBTyxVQUFVLDJCQUM5QixlQUFlLE9BQU8sVUFBVSxzQkFDaEMsb0RBQW9ELElBQUksU0FBUyxNQUNoRSxvREFBb0QsSUFBSSxTQUFTLEdBQ2xFLFFBQVEsTUFDTixrSUFDQSx5QkFBeUIsU0FBUyxDQUNwQztJQUNGLGVBQWUsT0FBTyxVQUFVLDRCQUM5QixRQUFRLE1BQ04sZ0lBQ0EsS0FDRjtJQUNGLGVBQWUsT0FBTyxVQUFVLDRCQUM5QixRQUFRLE1BQ04sZ0lBQ0EsS0FDRjtJQUNGLGVBQWUsT0FBTyxVQUFVLDJCQUM5QixRQUFRLE1BQ04sK0hBQ0EsS0FDRjtJQUNGLENBQUMsT0FBTyxVQUFVLFdBQ2YsYUFBYSxPQUFPLFFBQVEsWUFBWSxJQUFJLE1BQzdDLFFBQVEsTUFBTSw4Q0FBOEMsS0FBSztJQUNuRSxlQUFlLE9BQU8sVUFBVSxtQkFDOUIsYUFBYSxPQUFPLFVBQVUscUJBQzlCLFFBQVEsTUFDTiw4RkFDQSxLQUNGO0lBQ0YsWUFBWSxlQUFlO0lBQzNCLFVBQVUsUUFBUTtJQUNsQixVQUFVLFFBQVEsZUFBZTtJQUNqQyxVQUFVLE9BQU8sQ0FBQztJQUNsQixzQkFBc0IsY0FBYztJQUNwQyxRQUFRLFVBQVU7SUFDbEIsVUFBVSxVQUNSLGFBQWEsT0FBTyxTQUFTLFNBQVMsUUFDbEMsWUFBWSxLQUFLLElBQ2pCO0lBQ04sVUFBVSxVQUFVLGNBQ2hCLFFBQVEseUJBQXlCLFNBQVMsS0FBSyxhQUNqRCwwQ0FBMEMsSUFBSSxLQUFLLE1BQ2hELDBDQUEwQyxJQUFJLEtBQUssR0FDcEQsUUFBUSxNQUNOLHdLQUNBLEtBQ0Y7SUFDSixlQUFlLE9BQU8sb0JBQ3BCLHdCQUF3QiwyQkFDdEIsZ0JBQ0EsU0FDRjtJQUNGLHdCQUF3Qiw4QkFDdEIsZ0JBQ0EsU0FDRjtJQUNBLFVBQVUsUUFBUSxlQUFlO0lBQ2pDLFFBQVEsVUFBVTtJQUNsQixlQUFlLE9BQU8sVUFDbkIsMkJBQ0MsZ0JBQ0EsV0FDQSxPQUNBLFNBQ0YsR0FDQyxVQUFVLFFBQVEsZUFBZTtJQUNwQyxlQUFlLE9BQU8sVUFBVSw0QkFDOUIsZUFBZSxPQUFPLFVBQVUsMkJBQy9CLGVBQWUsT0FBTyxVQUFVLDZCQUMvQixlQUFlLE9BQU8sVUFBVSx1QkFDaEMsUUFBUSxVQUFVLE9BQ3BCLGVBQWUsT0FBTyxVQUFVLHNCQUM5QixVQUFVLG1CQUFtQixHQUMvQixlQUFlLE9BQU8sVUFBVSw2QkFDOUIsVUFBVSwwQkFBMEIsR0FDdEMsVUFBVSxVQUFVLFVBQ2pCLFFBQVEsTUFDUCw0SUFDQSwwQkFBMEIsY0FBYyxLQUFLLFdBQy9DLEdBQ0Esc0JBQXNCLG9CQUNwQixXQUNBLFVBQVUsT0FDVixJQUNGLElBQ0YsbUJBQW1CLGdCQUFnQixXQUFXLFdBQVcsV0FBVyxHQUNwRSw0Q0FBNEMsR0FDM0MsVUFBVSxRQUFRLGVBQWU7SUFDcEMsZUFBZSxPQUFPLFVBQVUsc0JBQzdCLGVBQWUsU0FBUztJQUMzQixDQUFDLGVBQWUsT0FBTyx1QkFBdUIsV0FDM0MsZUFBZSxTQUFTO0lBQzNCLFlBQVksQ0FBQztHQUNmLE9BQU8sSUFBSSxTQUFTLFNBQVM7SUFDM0IsWUFBWSxlQUFlO0lBQzNCLElBQUkscUJBQXFCLGVBQWU7SUFDeEMsT0FBTywyQkFBMkIsV0FBVyxrQkFBa0I7SUFDL0QsVUFBVSxRQUFRO0lBQ2xCLElBQUksYUFBYSxVQUFVO0lBQzNCLHNCQUFzQixVQUFVO0lBQ2hDLFFBQVE7SUFDUixhQUFhLE9BQU8sdUJBQ2xCLFNBQVMsd0JBQ1IsUUFBUSxZQUFZLG1CQUFtQjtJQUMxQyxhQUFhLFVBQVU7SUFDdkIsc0JBQ0UsZUFBZSxPQUFPLGNBQ3RCLGVBQWUsT0FBTyxVQUFVO0lBQ2xDLHFCQUFxQixlQUFlLGlCQUFpQjtJQUNyRCx1QkFDRyxlQUFlLE9BQU8sVUFBVSxvQ0FDL0IsZUFBZSxPQUFPLFVBQVUsOEJBQ2hDLHNCQUFzQixlQUFlLFVBQ3JDLDhCQUNFLGdCQUNBLFdBQ0EsV0FDQSxLQUNGO0lBQ0osaUJBQWlCLENBQUM7SUFDbEIsSUFBSSxXQUFXLGVBQWU7SUFDOUIsVUFBVSxRQUFRO0lBQ2xCLG1CQUFtQixnQkFBZ0IsV0FBVyxXQUFXLFdBQVc7SUFDcEUsNENBQTRDO0lBQzVDLGFBQWEsZUFBZTtJQUM1QixzQkFBc0IsYUFBYSxjQUFjLGtCQUM1QyxlQUFlLE9BQU8sZUFDcEIsMkJBQ0MsZ0JBQ0EsV0FDQSxZQUNBLFNBQ0YsR0FDQyxhQUFhLGVBQWUsaUJBQzlCLE9BQ0Msa0JBQ0EsMkJBQ0UsZ0JBQ0EsV0FDQSxNQUNBLFdBQ0EsVUFDQSxZQUNBLEtBQ0YsTUFDRyx1QkFDRSxlQUFlLE9BQU8sVUFBVSw2QkFDL0IsZUFBZSxPQUFPLFVBQVUsdUJBQ2pDLGVBQWUsT0FBTyxVQUFVLHNCQUMvQixVQUFVLG1CQUFtQixHQUMvQixlQUFlLE9BQU8sVUFBVSw2QkFDOUIsVUFBVSwwQkFBMEIsSUFDeEMsZUFBZSxPQUFPLFVBQVUsc0JBQzdCLGVBQWUsU0FBUyxXQUMxQixlQUFlLE9BQU8sdUJBQXVCLFdBQzNDLGVBQWUsU0FBUyxlQUMxQixlQUFlLE9BQU8sVUFBVSxzQkFDOUIsZUFBZSxTQUFTLFdBQzFCLGVBQWUsT0FBTyx1QkFBdUIsV0FDM0MsZUFBZSxTQUFTLFlBQzFCLGVBQWUsZ0JBQWdCLFdBQy9CLGVBQWUsZ0JBQWdCLGFBQ25DLFVBQVUsUUFBUSxXQUNsQixVQUFVLFFBQVEsWUFDbEIsVUFBVSxVQUFVLE9BQ3BCLFlBQVksU0FDWixlQUFlLE9BQU8sVUFBVSxzQkFDOUIsZUFBZSxTQUFTLFdBQzFCLGVBQWUsT0FBTyx1QkFBdUIsV0FDM0MsZUFBZSxTQUFTLFlBQzFCLFlBQVksQ0FBQztHQUNwQixPQUFPO0lBQ0wsWUFBWSxlQUFlO0lBQzNCLGlCQUFpQixTQUFTLGNBQWM7SUFDeEMsUUFBUSxlQUFlO0lBQ3ZCLHNCQUFzQiwyQkFBMkIsV0FBVyxLQUFLO0lBQ2pFLFVBQVUsUUFBUTtJQUNsQixhQUFhLGVBQWU7SUFDNUIsV0FBVyxVQUFVO0lBQ3JCLGFBQWEsVUFBVTtJQUN2QixPQUFPO0lBQ1AsYUFBYSxPQUFPLGNBQ2xCLFNBQVMsZUFDUixPQUFPLFlBQVksVUFBVTtJQUNoQyxxQkFBcUIsVUFBVTtJQUMvQixDQUFDLGFBQ0MsZUFBZSxPQUFPLHNCQUN0QixlQUFlLE9BQU8sVUFBVSw0QkFDL0IsZUFBZSxPQUFPLFVBQVUsb0NBQy9CLGVBQWUsT0FBTyxVQUFVLDhCQUNoQyxVQUFVLGNBQWMsYUFBYSxTQUNyQyw4QkFDRSxnQkFDQSxXQUNBLF
15852dBQ0EsSUFDRjtJQUNKLGlCQUFpQixDQUFDO0lBQ2xCLFdBQVcsZUFBZTtJQUMxQixVQUFVLFFBQVE7SUFDbEIsbUJBQW1CLGdCQUFnQixXQUFXLFdBQVcsV0FBVztJQUNwRSw0Q0FBNEM7SUFDNUMsSUFBSSxXQUFXLGVBQWU7SUFDOUIsVUFBVSxjQUNWLGFBQWEsWUFDYixrQkFDQyxTQUFTLFdBQ1IsU0FBUyxRQUFRLGdCQUNqQixzQkFBc0IsUUFBUSxZQUFZLEtBQ3ZDLGVBQWUsT0FBTyx1QkFDcEIsMkJBQ0MsZ0JBQ0EsV0FDQSxvQkFDQSxTQUNGLEdBQ0MsV0FBVyxlQUFlLGlCQUM1QixzQkFDQyxrQkFDQSwyQkFDRSxnQkFDQSxXQUNBLHFCQUNBLFdBQ0EsVUFDQSxVQUNBLElBQ0YsS0FDQyxTQUFTLFdBQ1IsU0FBUyxRQUFRLGdCQUNqQixzQkFBc0IsUUFBUSxZQUFZLE1BQ3pDLGNBQ0UsZUFBZSxPQUFPLFVBQVUsOEJBQy9CLGVBQWUsT0FBTyxVQUFVLHdCQUNqQyxlQUFlLE9BQU8sVUFBVSx1QkFDL0IsVUFBVSxvQkFBb0IsV0FBVyxVQUFVLElBQUksR0FDekQsZUFBZSxPQUFPLFVBQVUsOEJBQzlCLFVBQVUsMkJBQ1IsV0FDQSxVQUNBLElBQ0YsSUFDSixlQUFlLE9BQU8sVUFBVSx1QkFDN0IsZUFBZSxTQUFTLElBQzNCLGVBQWUsT0FBTyxVQUFVLDRCQUM3QixlQUFlLFNBQVMsVUFDMUIsZUFBZSxPQUFPLFVBQVUsc0JBQzlCLFVBQVUsUUFBUSxpQkFDakIsYUFBYSxRQUFRLGtCQUN0QixlQUFlLFNBQVMsSUFDM0IsZUFBZSxPQUFPLFVBQVUsMkJBQzdCLFVBQVUsUUFBUSxpQkFDakIsYUFBYSxRQUFRLGtCQUN0QixlQUFlLFNBQVMsT0FDMUIsZUFBZSxnQkFBZ0IsV0FDL0IsZUFBZSxnQkFBZ0IsV0FDbkMsVUFBVSxRQUFRLFdBQ2xCLFVBQVUsUUFBUSxVQUNsQixVQUFVLFVBQVUsTUFDcEIsWUFBWSx3QkFDWixlQUFlLE9BQU8sVUFBVSxzQkFDOUIsVUFBVSxRQUFRLGlCQUNqQixhQUFhLFFBQVEsa0JBQ3RCLGVBQWUsU0FBUyxJQUMzQixlQUFlLE9BQU8sVUFBVSwyQkFDN0IsVUFBVSxRQUFRLGlCQUNqQixhQUFhLFFBQVEsa0JBQ3RCLGVBQWUsU0FBUyxPQUMxQixZQUFZLENBQUM7R0FDcEI7R0FDQSxPQUFPO0dBQ1AsUUFBUSxTQUFTLGNBQWM7R0FDL0IsUUFBUSxPQUFPLGVBQWUsUUFBUTtHQUN0QyxJQUFJLFFBQVEsT0FBTztJQUNqQixPQUFPLGVBQWU7SUFDdEIsZ0JBQWdCLGNBQWM7SUFDOUIsSUFBSSxTQUFTLGVBQWUsT0FBTyxVQUFVLDBCQUMzQyxZQUFhLE1BQVEsb0JBQW9CO1NBQ3RDLElBQ0QsWUFBWSxnQkFBZ0IsSUFBSSxHQUNsQyxlQUFlLE9BQU8sa0JBQ3RCO0tBQ0EsMkJBQTJCLENBQUMsQ0FBQztLQUM3QixJQUFJO01BQ0YsZ0JBQWdCLElBQUk7S0FDdEIsVUFBVTtNQUNSLDJCQUEyQixDQUFDLENBQUM7S0FDL0I7SUFDRjtJQUNBLGVBQWUsU0FBUztJQUN4QixTQUFTLFdBQVcsU0FDZCxlQUFlLFFBQVEscUJBQ3ZCLGdCQUNBLFFBQVEsT0FDUixNQUNBLFdBQ0YsR0FDQyxlQUFlLFFBQVEscUJBQ3RCLGdCQUNBLE1BQ0EsV0FDQSxXQUNGLEtBQ0Esa0JBQWtCLFNBQVMsZ0JBQWdCLFdBQVcsV0FBVztJQUNyRSxlQUFlLGdCQUFnQixLQUFLO0lBQ3BDLFVBQVUsZUFBZTtHQUMzQixPQUNFLFVBQVUsNkJBQ1IsU0FDQSxnQkFDQSxXQUNGO0dBQ0YsY0FBYyxlQUFlO0dBQzdCLGFBQ0UsWUFBWSxVQUFVLGNBQ3JCLGdDQUNDLFFBQVEsTUFDTiwrSEFDQSwwQkFBMEIsY0FBYyxLQUFLLGFBQy9DLEdBQ0QsK0JBQStCLENBQUM7R0FDbkMsT0FBTztFQUNUO0VBQ0EsU0FBUyw4QkFDUCxTQUNBLGdCQUNBLGNBQ0EsYUFDQTtHQUNBLG9CQUFvQjtHQUNwQixlQUFlLFNBQVM7R0FDeEIsa0JBQWtCLFNBQVMsZ0JBQWdCLGNBQWMsV0FBVztHQUNwRSxPQUFPLGVBQWU7RUFDeEI7RUFDQSxTQUFTLCtCQUErQixnQkFBZ0IsV0FBVztHQUNqRSxhQUNFLFVBQVUscUJBQ1YsUUFBUSxNQUNOLDhGQUNBLFVBQVUsZUFBZSxVQUFVLFFBQVEsV0FDN0M7R0FDRixlQUFlLE9BQU8sVUFBVSw2QkFDNUIsaUJBQWlCLHlCQUF5QixTQUFTLEtBQUssV0FDMUQsK0NBQStDLG9CQUM1QyxRQUFRLE1BQ1Asb0VBQ0EsY0FDRixHQUNDLCtDQUErQyxrQkFDOUMsQ0FBQztHQUNQLGFBQWEsT0FBTyxVQUFVLGVBQzVCLFNBQVMsVUFBVSxnQkFDakIsWUFBWSx5QkFBeUIsU0FBUyxLQUFLLFdBQ3JELDJDQUEyQyxlQUN4QyxRQUFRLE1BQ1AsdURBQ0EsU0FDRixHQUNDLDJDQUEyQyxhQUFhLENBQUM7RUFDaEU7RUFDQSxTQUFTLDRCQUE0QixhQUFhO0dBQ2hELE9BQU87SUFBRSxXQUFXO0lBQWEsV0FBVyxrQkFBa0I7R0FBRTtFQUNsRTtFQUNBLFNBQVMsOEJBQ1AsU0FDQSxxQkFDQSxhQUNBO0dBQ0EsVUFBVSxTQUFTLFVBQVUsUUFBUSxhQUFhLENBQUMsY0FBYztHQUNqRSx3QkFBd0IsV0FBVztHQUNuQyxPQUFPO0VBQ1Q7RUFDQSxTQUFTLHdCQUF3QixTQUFTLGdCQUFnQixhQUFhO0dBQ3JFLElBQUksWUFBWSxlQUFlO0dBQy9CLGtCQUFrQixjQUFjLE1BQU0sZUFBZSxTQUFTO0dBQzlELElBQUksZUFBZSxDQUFDLEdBQ2xCLGFBQWEsT0FBTyxlQUFlLFFBQVEsTUFDM0M7R0FDRixDQUFDLGtCQUFrQixnQkFDaEIsa0JBQ0MsU0FBUyxXQUFXLFNBQVMsUUFBUSxnQkFDakMsQ0FBQyxJQUNELE9BQU8sb0JBQW9CLFVBQVU7R0FDN0Msb0JBQXFCLGVBQWUsQ0FBQyxHQUFLLGVBQWUsU0FBUztHQUNsRSxrQkFBa0IsT0FBTyxlQUFlLFFBQVE7R0FDaEQsZUFBZSxTQUFTO0dBQ3hCLElBQUksU0FBUyxTQUFTO0lBQ3BCLElBQUksYUFBYTtLQUNmLGVBQ0ksK0JBQStCLGNBQWMsSUFDN0MsNEJBQTRCLGNBQWM7S0FDOUMsQ0FBQyxVQUFVLDJCQUNMLGNBQWMsNEJBQ2QsU0FDQSxzQkFDRixHQUNDLGNBQ0MsU0FBUyxlQUFlLFlBQVksU0FBUyxzQkFDekMsY0FDQSxNQUNOLFNBQVMsZ0JBQ0wsa0JBQWtCO01BQ2xCLFlBQVk7TUFDWixhQUFhLHdCQUF3QjtNQUNyQyxXQUFXO01BQ1gsaUJBQWlCO0tBQ25CLEdBQ0MsZUFBZSxnQkFBZ0IsaUJBQy9CLGtCQUNDLGtDQUFrQyxXQUFXLEdBQzlDLGdCQUFnQixTQUFTLGdCQUN6QixlQUFlLFFBQVEsaUJBQ3ZCLHVCQUF1QixnQkFDdkIseUJBQXlCLFNBQzNCLGNBQWM7S0FDbkIsSUFBSSxTQUFTLGFBQ1gsTUFDRyx3QkFBd0IsZ0JBQWdCLE9BQU8sR0FDaEQseUJBQXlCLGNBQWM7S0FFM0MsMkJBQTJCLFdBQVcsSUFDakMsZUFBZSxRQUFRLEtBQ3ZCLGVBQWUsUUFBUTtLQUM1QixPQUFPO0lBQ1Q7SUFDQSxhQUFhLFVBQVU7SUFDdkIsWUFBWSxVQUFVO0lBQ3RCLElBQUksY0FDRixPQUNFLDRCQUE0QixjQUFjLEdBQ3pDLGVBQWUsZUFBZSxNQUM5QixhQUFhLGtDQUNaO0tBQUUsTUFBTTtLQUFVLFVBQVU7SUFBVyxHQUN2QyxZQUNGLEdBQ0MsWUFBWSx3QkFDWCxXQUNBLGNBQ0EsYUFDQSxJQUNGLEdBQ0MsV0FBVyxTQUFTLGdCQUNwQixVQUFVLFNBQVMsZ0JBQ25CLFdBQVcsVUFBVSxXQUNyQixlQUFlLFFBQVEsWUFDdkIsWUFBWSxlQUFlLE9BQzNCLFVBQVUsZ0JBQ1QsNEJBQTRCLFdBQVcsR0FDeEMsVUFBVSxhQU
15852FhLDhCQUN0QixTQUNBLGlCQUNBLFdBQ0YsR0FDQyxlQUFlLGdCQUFnQixrQkFDaEMsMEJBQTBCLE1BQU0sU0FBUztJQUU3QywrQkFBK0IsY0FBYztJQUM3QyxPQUFPLDZCQUE2QixnQkFBZ0IsVUFBVTtHQUNoRTtHQUNBLElBQUksWUFBWSxRQUFRO0dBQ3hCLElBQUksU0FBUyxXQUFXO0lBQ3RCLElBQUksZUFBZSxVQUFVO0lBQzdCLElBQUksU0FBUyxjQUNYLE9BQU8sa0NBQ0wsU0FDQSxnQkFDQSxZQUNBLGlCQUNBLFdBQ0EsY0FDQSxXQUNBLFdBQ0Y7R0FDSjtHQUNBLElBQUksY0FDRixPQUNFLDRCQUE0QixjQUFjLEdBQ3pDLGVBQWUsVUFBVSxVQUN6QixhQUFhLGVBQWUsTUFDNUIsWUFBWSxRQUFRLE9BQ3BCLGVBQWUsVUFBVSxTQUN6QixZQUFZLHFCQUFxQixXQUFXO0lBQzNDLE1BQU07SUFDTixVQUFVLFVBQVU7R0FDdEIsQ0FBQyxHQUNBLFVBQVUsZUFBZSxVQUFVLGVBQWUsWUFDbkQsU0FBUyxlQUNKLGVBQWUscUJBQXFCLGNBQWMsWUFBWSxLQUM3RCxlQUFlLHdCQUNmLGNBQ0EsWUFDQSxhQUNBLElBQ0YsR0FDQyxhQUFhLFNBQVMsSUFDMUIsYUFBYSxTQUFTLGdCQUN0QixVQUFVLFNBQVMsZ0JBQ25CLFVBQVUsVUFBVSxjQUNwQixlQUFlLFFBQVEsV0FDeEIsMEJBQTBCLE1BQU0sU0FBUyxHQUN4QyxZQUFZLGVBQWUsT0FDM0IsZUFBZSxRQUFRLE1BQU0sZUFDOUIsU0FBUyxlQUNKLGVBQWUsNEJBQTRCLFdBQVcsS0FDckQsYUFBYSxhQUFhLFdBQzVCLFNBQVMsY0FDSCxZQUFZLGFBQWEsZUFDMUIsYUFDQyxXQUFXLFdBQVcsWUFDbEI7SUFBRSxRQUFRO0lBQVcsTUFBTTtHQUFVLElBQ3JDLGNBQ0wsYUFBYSxrQkFBa0IsR0FDbkMsZUFBZTtJQUNkLFdBQVcsYUFBYSxZQUFZO0lBQ3BDLFdBQVc7R0FDYixJQUNILFVBQVUsZ0JBQWdCLGNBQzFCLFVBQVUsYUFBYSw4QkFDdEIsU0FDQSxpQkFDQSxXQUNGLEdBQ0MsZUFBZSxnQkFBZ0Isa0JBQ2hDLDBCQUEwQixRQUFRLE9BQU8sU0FBUztHQUV0RCxTQUFTLGNBQ04sY0FBYyxjQUFjLGVBQzdCLE9BQU8sY0FBYyxRQUFRLFVBQzdCLHVCQUF1QixjQUFjO0dBQ3ZDLCtCQUErQixjQUFjO0dBQzdDLGNBQWMsUUFBUTtHQUN0QixVQUFVLFlBQVk7R0FDdEIsY0FBYyxxQkFBcUIsYUFBYTtJQUM5QyxNQUFNO0lBQ04sVUFBVSxVQUFVO0dBQ3RCLENBQUM7R0FDRCxZQUFZLFNBQVM7R0FDckIsWUFBWSxVQUFVO0dBQ3RCLFNBQVMsWUFDTCxrQkFBa0IsZUFBZSxXQUNuQyxTQUFTLG1CQUNILGVBQWUsWUFBWSxDQUFDLE9BQU8sR0FDcEMsZUFBZSxTQUFTLE1BQ3pCLGdCQUFnQixLQUFLLE9BQU87R0FDbEMsZUFBZSxRQUFRO0dBQ3ZCLGVBQWUsZ0JBQWdCO0dBQy9CLE9BQU87RUFDVDtFQUNBLFNBQVMsNkJBQTZCLGdCQUFnQixpQkFBaUI7R0FDckUsa0JBQWtCLGtDQUNoQjtJQUFFLE1BQU07SUFBVyxVQUFVO0dBQWdCLEdBQzdDLGVBQWUsSUFDakI7R0FDQSxnQkFBZ0IsU0FBUztHQUN6QixPQUFRLGVBQWUsUUFBUTtFQUNqQztFQUNBLFNBQVMsa0NBQWtDLGdCQUFnQixNQUFNO0dBQy9ELGlCQUFpQixZQUFZLElBQUksZ0JBQWdCLE1BQU0sSUFBSTtHQUMzRCxlQUFlLFFBQVE7R0FDdkIsT0FBTztFQUNUO0VBQ0EsU0FBUyx1Q0FDUCxTQUNBLGdCQUNBLGFBQ0E7R0FDQSxxQkFBcUIsZ0JBQWdCLFFBQVEsT0FBTyxNQUFNLFdBQVc7R0FDckUsVUFBVSw2QkFDUixnQkFDQSxlQUFlLGFBQWEsUUFDOUI7R0FDQSxRQUFRLFNBQVM7R0FDakIsZUFBZSxnQkFBZ0I7R0FDL0IsT0FBTztFQUNUO0VBQ0EsU0FBUyxrQ0FDUCxTQUNBLGdCQUNBLFlBQ0EseUJBQ0EsV0FDQSxrQkFDQSxlQUNBLGFBQ0E7R0FDQSxJQUFJLFlBQVk7SUFDZCxJQUFJLGVBQWUsUUFBUSxLQUN6QixPQUNFLCtCQUErQixjQUFjLEdBQzVDLGVBQWUsU0FBUyxNQUN6Qix1Q0FDRSxTQUNBLGdCQUNBLFdBQ0Y7SUFFSixJQUFJLFNBQVMsZUFBZSxlQUMxQixPQUNFLDRCQUE0QixjQUFjLEdBQ3pDLGVBQWUsUUFBUSxRQUFRLE9BQy9CLGVBQWUsU0FBUyxLQUN6QjtJQUVKLDRCQUE0QixjQUFjO0lBQzFDLElBQUksbUJBQW1CLFVBQVUsVUFDL0IsWUFBWSxlQUFlLE1BQzNCLHVCQUF1QixrQ0FDckI7S0FBRSxNQUFNO0tBQVcsVUFBVSxVQUFVO0lBQVMsR0FDaEQsU0FDRjtJQUNGLG1CQUFtQix3QkFDakIsa0JBQ0EsV0FDQSxhQUNBLElBQ0Y7SUFDQSxpQkFBaUIsU0FBUztJQUMxQixxQkFBcUIsU0FBUztJQUM5QixpQkFBaUIsU0FBUztJQUMxQixxQkFBcUIsVUFBVTtJQUMvQixlQUFlLFFBQVE7SUFDdkIscUJBQXFCLGdCQUFnQixRQUFRLE9BQU8sTUFBTSxXQUFXO0lBQ3JFLG1CQUFtQixlQUFlO0lBQ2xDLGlCQUFpQixnQkFDZiw0QkFBNEIsV0FBVztJQUN6QyxpQkFBaUIsYUFBYSw4QkFDNUIsU0FDQSx5QkFDQSxXQUNGO0lBQ0EsZUFBZSxnQkFBZ0I7SUFDL0IsT0FBTywwQkFBMEIsTUFBTSxnQkFBZ0I7R0FDekQ7R0FDQSwrQkFBK0IsY0FBYztHQUM3QyxnQkFBZ0I7R0FDaEIsT0FBTyxjQUFjLGNBQWMsdUJBQXVCLGNBQWM7R0FDeEUsSUFBSSwyQkFBMkIsZ0JBQWdCLEdBQUc7SUFDaEQsMEJBQ0UsaUJBQWlCLGVBQWUsaUJBQWlCLFlBQVk7SUFDL0QsSUFBSSx5QkFBeUI7S0FDM0IsbUJBQW1CLHdCQUF3QjtLQUMzQyxJQUFJLFVBQVUsd0JBQXdCO0tBQ3RDLFlBQVksd0JBQXdCO0tBQ3BDLHVCQUF1Qix3QkFBd0I7SUFDakQ7SUFDQSxtQkFBbUI7SUFDbkIsZ0JBQWdCO0lBQ2hCLFlBQVk7SUFDWiwwQkFBMEI7SUFDMUIsbUJBQW1CO0lBQ25CLFlBQVk7SUFDWix1QkFBdUI7SUFDdkIsWUFBWTtJQUNaLHFCQUFxQiw2QkFDakIsMEJBQTBCLFlBQ3hCLE1BQU0sU0FBUyxJQUNmLE1BQ0UsbUlBQ0YsR0FDSCx3QkFBd0IsUUFBUSx3QkFBd0IsSUFDeEQsd0JBQXdCLFNBQVMsa0JBQ2pDLG1CQUFtQixLQUFLLE1BQU0sWUFBWSxPQUFPLFdBQ2pELFlBQVk7S0FDWCxPQUFPO0tBQ1AsUUFBUTtLQUNSLE9BQU87SUFDVCxHQUNBLGFBQWEsT0FBTyxvQkFDbEIsZUFBZSxJQUFJLHlCQUF5QixTQUFTLEdBQ3ZELG9CQUFvQixTQUFTO0lBQy9CLE9BQU8sdUNBQ0wsU0FDQSxnQkFDQSxXQUNGO0dBQ0Y7R0FDQSxvQkFDRSw4QkFBOEIsU0FBUyxnQkFBZ0IsYUFBYSxDQUFDLENBQUM7R0FDeEUsMEJBQTBCLE9BQU8sY0FBYyxRQUFRO0dBQ3ZELElBQUksb0JBQW9CLHlCQUF5QjtJQUMvQyxJQUFJLFNBQVMsNkJBQTZCLFNBQ3hDLE9BQU8sdUNBQ0wsU0FDQSxnQkFDQSxXQUNGO0lBQ0YsMEJBQTBCO0lBQzFCLElBQ0UsU0FBUyw0QkFDUCxtQkFBbUIsMEJBQ25CLHlCQUNBLFdBQ0YsR0FDQSxNQUFNLG9CQUNKLHFCQUFxQixjQUFjLFlBRXJDLE1BQ0ksY0FBYyxZQUFZLGtCQUM1QiwrQkFBK0IsU0FBUyxnQkFBZ0IsR0FDeEQsc0JBQ0UseUJBQ0EsU0FDQSxnQkFDRixHQUNBO0lBRUosMEJBQTBCLGdCQUFnQixLQUN4QyxnQ0FBZ0M7SUFDbEMsT0FBTyx1Q0FDTCxTQUNBLGdCQUNBLFdBQ0Y7R0FDRjtHQUNBLElBQUksMEJBQTBCLGdCQUFnQixHQUM1QyxPQUNHLGVBQWUsU0FBUyxLQUN4QixlQUFlLFFBQVEsUUFBUSxPQUNoQztHQUVKLFVBQVUsY0FBYztHQUN4Qix5QkFBeUIsa0JBQWtCLGlCQUFpQixXQUFXO0dBQ3ZFLHVCQUF1QjtHQUN2QixjQUFjLENBQUM7R0FDZixrQkFBa0I7R0FDbEIsdUJBQXVCLENBQUM7R0FDeEIsdUJBQXVCO0dBQ3ZCLHlCQUF5QixDQUFDO0dBQzFCLFNBQVMsV0FBVyw0QkFBNEIsZ0JBQWdCLE9BQU87R0FDdkUsaUJBQWlCLDZCQUNmLGdCQUNBLFVBQVUsUUFDWjtHQUNBLGVBQWUsU0FBUztHQUN4QixPQUFPO0VBQ1Q7RUFDQSxTQUFTLDRCQUE0QixPQUFPLGFBQWEsaUJBQWlCO0dBQ3hFLE1BQU0sU0FBUztHQUNmLElBQUksWUFBWSxNQUFNO0dBQ3RCLFNBQVMsY0FBYyxVQUFVLFNBQVM7R0FDMUMsZ0NBQ0UsTUFBTSxRQUNOLGFBQ0EsZUFDRjtFQUNGO0VBQ0EsU0FBUyxtQkFBbUIsWUFBWTtHQUN0QyxLQUFLLElBQUksaUJBQWlCLE1BQU0sU0FBUyxhQUFjO0lBQ3JELElBQUksYUFBYSxXQUFXO0lBQzVCLFNBQVMsY0FDUCxTQUFTLG1CQUFtQixVQUFVLE1BQ3JDLGlCQUFpQjtJQUNwQixhQUFhLFdBQVc7R0FDMUI7R0FDQSxPQUFPO0VBQ1Q7RUFDQSxTQUFTLDRCQUNQLGdCQUNBLGFBQ0EsTUFDQSxnQkFDQSxVQUNBLGVBQ0E7R0FDQSxJQUFJLGNBQWMsZUFBZTtHQUNqQyxTQUFTLGNBQ0osZUFBZSxnQkFBZ0I7SUFDakI7SUFDYixXQUFXO0lBQ1gsb0JBQW9CO0lBQ3BCLE1BQU07SUFDQTtJQUNJO0lBQ0s7R0FDakIsS0FDRSxZQUFZLGNBQWMsYUFDM0IsWUFBWSxZQUFZLE1BQ3hCLFlBQVkscUJBQXFCLEdBQ2pDLFlBQVksT0FBTyxnQkFDbkIsWUFBWSxPQUFPLE1BQ25CLFlBQVksV0FBVyxVQUN2QixZQUFZLGdCQUFnQjtFQUNuQztFQUNBLFNBQVMsZ0JBQWdCLE9BQU87R0FDOUIsSUFBSSxNQUFNLE1BQU07R0FDaEIsS0FBSyxNQUFNLFFBQVEsTUFBTSxTQUFTLE1BQU87SUFDdkMsSUFBSSxVQUFVLElBQUk7SUFDbEIsSUFBSSxVQUFVLE1BQU07SUFDcEIsTUFBTSxRQUFRO0lBQ2QsTUFBTTtHQUNSO0VBQ0Y7RUFDQSxTQUFTLDRCQUE0QixTQUFTLGdCQUFnQixhQUFhO0dBQ3pFLElBQUksWUFBWSxlQUFlLGNBQzdCLGNBQWMsVUFBVSxhQUN4QixXQUFXLFVBQVUsTUFDckIsY0FBYyxVQUFVLFVBQ3hCLGtCQUFrQixvQkFBb0I7R0FDeEMsSUFBSSxlQUFlLFFBQVEsS0FDekIsT0FBTyx3QkFBd0IsZ0JBQWdCLGVBQWUsR0FBRztHQUNuRSxDQUFDLFlBQVksT0FBTyxrQkFBa0IsMkJBQ2hDLGtCQUNDLGtCQUFrQiw2QkFDbkIsdUJBQ0QsZUFBZSxTQUFTLE9BQ3hCLG1CQUFtQjtHQUN4Qix3QkFBd0IsZ0JBQWdCLGVBQWU7R0FDdkQsa0JBQWtCLFFBQVEsY0FBYyxTQUFTO0dBQ2pELElBQ0UsUUFBUSxlQUNSLGVBQWUsZUFDZixnQkFBZ0IsZUFDaEIsZ0NBQWdDLGVBQ2hDLGVBQWUsZUFDZixrQkFBa0IsZUFDbEIsQ0FBQyx3QkFBd0Isa0JBRXpCLElBQ0ksd0JBQXdCLG1CQUFtQixDQUFDLEdBQzlDLGFBQWEsT0FBTyxhQUVwQixRQUFRLFlBQVksWUFBWSxHQUFoQztJQUNFLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7S0FDSCxRQUFRLE1BQ04sa0dBQ0EsYUFDQSxZQUFZLFlBQVksQ0FDMUI7S0FDQTtJQUNGLEtBQUs7SUFDTCxLQUFLO0tBQ0gsUUFBUSxNQUNOLG1JQUNBLGFBQ0EsWUFBWSxZQUFZLENBQzFCO0tBQ0E7SUFDRixTQUNFLFFBQVEsTUFDTix5SUFDQSxXQUNGO0dBQ0o7UUFFQSxRQUFRLE1BQ04sK0lBQ0EsV0FDRjtHQUNKLGtCQUFrQixRQUFRLFdBQVcsU0FBUztHQUM5Qyx3QkFBd0Isb0JBQ3RCLFFBQVEsYUFDUCxjQUFjLFlBQ2YsZ0JBQWdCLFlBQ2hCLGFBQWEsWUFDUCx3QkFBd0IsbUJBQW1CLENBQUMsR0FDOUMsUUFBUSxNQUNOLHdIQUNBLFFBQ0YsS0FDQSxRQUFRLGVBQ1IsZUFBZSxlQUNmLGdCQUFnQixlQUNoQixnQ0FBZ0MsZ0JBQzlCLHdCQUF3QixtQkFBbUIsQ0FBQyxHQUM5QyxRQUFRLE1BQ04sMkpBQ0EsUUFDRjtHQUNOLEdBQUcsS0FDQSxRQUFRLGVBQ1AsZUFBZSxlQUNmLGdCQUFnQixlQUNoQixnQ0FBZ0MsZ0JBQ2xDLEtBQUssTUFBTSxlQUNYLFNBQVMsZUFDVCxDQUFDLE1BQU0sYUFFUCxJQUFJLFlBQVksV0FBVyxHQUV2QjtTQUFBLGtCQUFrQixHQUNsQixrQkFBa0IsWUFBWSxRQUM5QixtQkFFQSxJQUNFLENBQUMsZ0NBQ0MsWUFBWSxrQkFDWixlQUNGLEdB
15852RUEsTUFBTTtHQUFBLE9BRVAsSUFDRCxrQkFBa0IsY0FBYyxXQUFXLEdBQzdDLGVBQWUsT0FBTyxpQkFFakI7UUFBQSxrQkFBa0IsZ0JBQWdCLEtBQUssV0FBVyxHQUNyRCxLQUNFLElBQUksT0FBTyxnQkFBZ0IsS0FBSyxHQUFHLEtBQUssR0FDeEMsQ0FBQyxLQUFLLE1BQ04sT0FBTyxnQkFBZ0IsS0FBSyxHQUM1QjtLQUNBLElBQUksQ0FBQyxnQ0FBZ0MsS0FBSyxPQUFPLEVBQUUsR0FBRyxNQUFNO0tBQzVEO0lBQ0Y7VUFFRixRQUFRLE1BQ04sMEtBQ0EsV0FDRjtHQUNKLGdCQUFnQixlQUFlLFNBQVMsV0FDbkMsZ0JBQWdCLE9BQU8sR0FDeEIsa0JBQWtCLFNBQVMsZ0JBQWdCLGFBQWEsV0FBVyxHQUNuRSxnQkFBZ0IsT0FBTyxLQUN2QixrQkFBa0IsU0FBUyxnQkFBZ0IsYUFBYSxXQUFXO0dBQ3ZFLGVBQ0ssbUJBQW1CLEdBQUksY0FBYyxpQkFDckMsY0FBYztHQUNuQixJQUFJLENBQUMsYUFBYSxTQUFTLFdBQVcsT0FBTyxRQUFRLFFBQVEsTUFDM0QsR0FBRyxLQUFLLFVBQVUsZUFBZSxPQUFPLFNBQVMsVUFBVztJQUMxRCxJQUFJLE9BQU8sUUFBUSxLQUNqQixTQUFTLFFBQVEsaUJBQ2YsNEJBQTRCLFNBQVMsYUFBYSxjQUFjO1NBQy9ELElBQUksT0FBTyxRQUFRLEtBQ3RCLDRCQUE0QixTQUFTLGFBQWEsY0FBYztTQUM3RCxJQUFJLFNBQVMsUUFBUSxPQUFPO0tBQy9CLFFBQVEsTUFBTSxTQUFTO0tBQ3ZCLFVBQVUsUUFBUTtLQUNsQjtJQUNGO0lBQ0EsSUFBSSxZQUFZLGdCQUFnQixNQUFNO0lBQ3RDLE9BQU8sU0FBUyxRQUFRLFVBQVc7S0FDakMsSUFBSSxTQUFTLFFBQVEsVUFBVSxRQUFRLFdBQVcsZ0JBQ2hELE1BQU07S0FDUixVQUFVLFFBQVE7SUFDcEI7SUFDQSxRQUFRLFFBQVEsU0FBUyxRQUFRO0lBQ2pDLFVBQVUsUUFBUTtHQUNwQjtHQUNGLFFBQVEsYUFBUjtJQUNFLEtBQUs7S0FDSCxjQUFjLG1CQUFtQixlQUFlLEtBQUs7S0FDckQsU0FBUyxlQUNILGNBQWMsZUFBZSxPQUM5QixlQUFlLFFBQVEsU0FDdEIsY0FBYyxZQUFZLFNBQzNCLFlBQVksVUFBVSxNQUN2QixnQkFBZ0IsY0FBYztLQUNsQyw0QkFDRSxnQkFDQSxDQUFDLEdBQ0QsYUFDQSxNQUNBLFVBQ0EsV0FDRjtLQUNBO0lBQ0YsS0FBSztLQUNILGNBQWM7S0FDZCxjQUFjLGVBQWU7S0FDN0IsS0FBSyxlQUFlLFFBQVEsTUFBTSxTQUFTLGNBQWU7TUFDeEQsVUFBVSxZQU
15852FZO01BQ3RCLElBQUksU0FBUyxXQUFXLFNBQVMsbUJBQW1CLE9BQU8sR0FBRztPQUM1RCxlQUFlLFFBQVE7T0FDdkI7TUFDRjtNQUNBLFVBQVUsWUFBWTtNQUN0QixZQUFZLFVBQVU7TUFDdEIsY0FBYztNQUNkLGNBQWM7S0FDaEI7S0FDQSw0QkFDRSxnQkFDQSxDQUFDLEdBQ0QsYUFDQSxNQUNBLFVBQ0EsV0FDRjtLQUNBO0lBQ0YsS0FBSztLQUNILDRCQUNFLGdCQUNBLENBQUMsR0FDRCxNQUNBLE1BQ0EsS0FBSyxHQUNMLFdBQ0Y7S0FDQTtJQUNGLEtBQUs7S0FDSCxlQUFlLGdCQUFnQjtLQUMvQjtJQUNGLFNBQ0UsY0FBZSxtQkFBbUIsZUFBZSxLQUFLLEdBQ3BELFNBQVMsZUFDSCxjQUFjLGVBQWUsT0FDOUIsZUFBZSxRQUFRLFNBQ3RCLGNBQWMsWUFBWSxTQUMzQixZQUFZLFVBQVUsT0FDM0IsNEJBQ0UsZ0JBQ0EsQ0FBQyxHQUNELGFBQ0EsYUFDQSxVQUNBLFdBQ0Y7R0FDTjtHQUNBLE9BQU8sZUFBZTtFQUN4QjtFQUNBLFNBQVMsc0JBQXNCLFNBQVMsZ0JBQWdCLGFBQWE7R0FDbkUsSUFBSSxVQUFVLGVBQWUsTUFDM0IsV0FBVyxlQUFlLGNBQzFCLFdBQVcsU0FBUztHQUN0QixXQUFXLFlBQ1Qsb0RBQ0Usa0RBQWtELENBQUMsR0FDckQsUUFBUSxNQUNOLHNHQUNGO0dBQ0YsYUFBYSxnQkFBZ0IsU0FBUyxRQUFRO0dBQzlDLGtCQUNFLFNBQ0EsZ0JBQ0EsU0FBUyxVQUNULFdBQ0Y7R0FDQSxPQUFPLGVBQWU7RUFDeEI7RUFDQSxTQUFTLDZCQUNQLFNBQ0EsZ0JBQ0EsYUFDQTtHQUNBLFNBQVMsWUFBWSxlQUFlLGVBQWUsUUFBUTtHQUMzRCxvQkFBb0I7R0FDcEIsa0NBQWtDLGVBQWU7R0FDakQsSUFBSSxPQUFPLGNBQWMsZUFBZSxhQUN0QyxJQUFJLFNBQVMsU0FFUjtRQUFBLDhCQUNDLFNBQ0EsZ0JBQ0EsYUFDQSxDQUFDLENBQ0gsR0FDQSxPQUFPLGNBQWMsZUFBZSxhQUVwQyxPQUFPO0dBQUEsT0FDSixPQUFPO0dBQ2hCLElBQUksU0FBUyxXQUFXLGVBQWUsVUFBVSxRQUFRLE9BQ3ZELE1BQU0sTUFBTSxvQ0FBb0M7R0FDbEQsSUFBSSxTQUFTLGVBQWUsT0FBTztJQUNqQyxVQUFVLGVBQWU7SUFDekIsY0FBYyxxQkFBcUIsU0FBUyxRQUFRLFlBQVk7SUFDaEUsZUFBZSxRQUFRO0lBQ3ZCLEtBQUssWUFBWSxTQUFTLGdCQUFnQixTQUFTLFFBQVEsVUFDekQsVUFBVyxRQUFRLFNBQ2hCLGNBQWMsWUFBWSxVQUN6QixxQkFBcUIsU0FBUyxRQUFRLFlBQVksR0FDbkQsWUFBWSxTQUFTO0lBQzFCLFlBQVksVUFBVTtHQUN4QjtHQUNBLE9BQU8sZUFBZTtFQUN4QjtFQUNBLFNBQVMsOEJBQThCLFNBQVMsYUFBYTtHQUMzRCxJQUFJLE9BQU8sUUFBUSxRQUFRLGNBQWMsT0FBTyxDQUFDO0dBQ2pELFVBQVUsUUFBUTtHQUNsQixPQUFPLFNBQVMsV0FBVyxzQkFBc0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0VBQ3BFO0VBQ0EsU0FBUyx1Q0FDUCxTQUNBLGdCQUNBLGFBQ0E7R0FDQSxRQUFRLGVBQWUsS0FBdkI7SUFDRSxLQUFLO0tBQ0gsa0JBQ0UsZ0JBQ0EsZUFBZSxVQUFVLGFBQzNCO0tBQ0EsYUFDRSxnQkFDQSxjQUNBLFFBQVEsY0FBYyxLQUN4QjtLQUNBLG9CQUFvQjtLQUNwQjtJQUNGLEtBQUs7SUFDTCxLQUFLO0tBQ0gsZ0JBQWdCLGNBQWM7S0FDOUI7SUFDRixLQUFLO0tBQ0gsa0JBQ0UsZ0JBQ0EsZUFBZSxVQUFVLGFBQzNCO0tBQ0E7SUFDRixLQUFLO0tBQ0gsYUFDRSxnQkFDQSxlQUFlLE1BQ2YsZUFBZSxjQUFjLEtBQy9CO0tBQ0E7SUFDRixLQUFLO0tBQ0gsT0FBTyxjQUFjLGVBQWUsZ0JBQ2pDLGVBQWUsU0FBUztLQUMzQixlQUFlLFNBQVM7S0FDeEIsSUFBSSxZQUFZLGVBQWU7S0FDL0IsVUFBVSxpQkFBaUI7S0FDM0IsVUFBVSx3QkFBd0I7S0FDbEM7SUFDRixLQUFLO0tBQ0gsSUFBSSxTQUFTLGVBQWUsZUFDMUIsT0FDRyxlQUFlLFNBQVMsS0FDekIsc0NBQXNDLGNBQWMsR0FDcEQ7S0FFSjtJQUNGLEtBQUs7S0FDSCxZQUFZLGVBQWU7S0FDM0IsSUFBSSxTQUFTLFdBQVc7TUFDdEIsSUFBSSxTQUFTLFVBQVUsWUFDckIsT0FDRSwrQkFBK0IsY0FBYyxHQUM1QyxlQUFlLFNBQVMsS0FDekI7TUFFSixZQUFZLDhCQUNWLFNBQ0EsZ0JBQ0EsYUFDQSxDQUFDLENBQ0g7TUFDQSxJQUFJLG9CQUFvQixlQUFlLE1BQU07TUFDN0MsSUFBSSxhQUFhLE9BQU8sY0FBYyxvQkFDcEMsT0FBTyx3QkFDTCxTQUNBLGdCQUNBLFdBQ0Y7TUFDRiwrQkFBK0IsY0FBYztNQUM3QyxVQUFVLDZCQUNSLFNBQ0EsZ0JBQ0EsV0FDRjtNQUNBLE9BQU8sU0FBUyxVQUFVLFFBQVEsVUFBVTtLQUM5QztLQUNBLCtCQUErQixjQUFjO0tBQzdDO0lBQ0YsS0FBSztLQUNILElBQUksZUFBZSxRQUFRLEtBQ3pCLE9BQU8sNEJBQ0wsU0FDQSxnQkFDQSxXQUNGO0tBQ0Ysb0JBQW9CLE9BQU8sUUFBUSxRQUFRO0tBQzNDLFlBQVksT0FBTyxjQUFjLGVBQWU7S0FDaEQsY0FDRyw4QkFDQyxTQUNBLGdCQUNBLGFBQ0EsQ0FBQyxDQUNILEdBQ0MsWUFBWSxPQUFPLGNBQWMsZUFBZTtLQUNuRCxJQUFJLG1CQUFtQjtNQUNyQixJQUFJLFdBQ0YsT0FBTyw0QkFDTCxTQUNBLGdCQUNBLFdBQ0Y7TUFDRixlQUFlLFNBQVM7S0FDMUI7S0FDQSxvQkFBb0IsZUFBZTtLQUNuQyxTQUFTLHNCQUNMLGtCQUFrQixZQUFZLE1BQy9CLGtCQUFrQixPQUFPLE1BQ3pCLGtCQUFrQixhQUFhO0tBQ2xDLHdCQUF3QixnQkFBZ0Isb0JBQW9CLE9BQU87S0FDbkUsSUFBSSxXQUFXO1VBQ1YsT0FBTztJQUNkLEtBQUssSUFDSCxPQUNHLGVBQWUsUUFBUSxHQUN4Qix5QkFDRSxTQUNBLGdCQUNBLGFBQ0EsZUFBZSxZQUNqQjtJQUVKLEtBQUssSUFDSCxhQUNFLGdCQUNBLGNBQ0EsUUFBUSxjQUFjLEtBQ3hCO0dBQ0o7R0FDQSxPQUFPLDZCQUE2QixTQUFTLGdCQUFnQixXQUFXO0VBQzFFO0VBQ0EsU0FBUyxVQUFVLFNBQVMsZ0JBQWdCLGFBQWE7R0FDdkQsSUFBSSxlQUFlLHNCQUFzQixTQUFTLFNBQVM7SUFDekQsY0FBYyw0QkFDWiwyQkFBMkIsZUFBZSxXQUFXLEdBQ3JELGVBQWUsS0FDZixlQUFlLGNBQ2YsZUFBZSxlQUFlLE1BQzlCLGVBQWUsTUFDZixlQUFlLEtBQ2pCO0lBQ0EsWUFBWSxjQUFjLGVBQWU7SUFDekMsWUFBWSxhQUFhLGVBQWU7SUFDeEMsSUFBSSxjQUFjLGVBQWU7SUFDakMsSUFBSSxTQUFTLGFBQWEsTUFBTSxNQUFNLDZCQUE2QjtJQUNuRSxRQUFRLFlBQVk7SUFDcEIsZUFBZSxZQUFZO0lBQzNCLFlBQVksUUFBUSxlQUFlO0lBQ25DLFlBQVksVUFBVSxlQUFlO0lBQ3JDLFlBQVksU0FBUyxlQUFlO0lBQ3BDLFlBQVksTUFBTSxlQUFlO0lBQ2pDLFlBQVksYUFBYSxlQUFlO0lBQ3hDLElBQUksbUJBQW1CLFlBQVksT0FDakMsWUFBWSxRQUFRO1NBQ2pCO0tBQ0gsSUFBSSxjQUFjLFlBQVk7S0FDOUIsSUFBSSxTQUFTLGFBQ1gsT
15852UFBTSxNQUFNLGtDQUFrQztLQUNoRCxPQUFPLFlBQVksWUFBWSxpQkFDN0IsSUFBTSxjQUFjLFlBQVksU0FBVSxTQUFTLGFBQ2pELE1BQU0sTUFBTSx3Q0FBd0M7S0FDeEQsWUFBWSxVQUFVO0lBQ3hCO0lBQ0EsaUJBQWlCLFlBQVk7SUFDN0IsU0FBUyxrQkFDSCxZQUFZLFlBQVksQ0FBQyxPQUFPLEdBQUssWUFBWSxTQUFTLE1BQzVELGVBQWUsS0FBSyxPQUFPO0lBQy9CLFlBQVksU0FBUztJQUNyQixPQUFPO0dBQ1Q7R0FDQSxJQUFJLFNBQVMsU0FDWCxJQUNFLFFBQVEsa0JBQWtCLGVBQWUsZ0JBQ3pDLGVBQWUsU0FBUyxRQUFRLE1BRWhDLG1CQUFtQixDQUFDO1FBQ2pCO0lBQ0gsSUFDRSxDQUFDLDhCQUE4QixTQUFTLFdBQVcsS0FDbkQsT0FBTyxlQUFlLFFBQVEsTUFFOUIsT0FDRyxtQkFBbUIsQ0FBQyxHQUNyQix1Q0FDRSxTQUNBLGdCQUNBLFdBQ0Y7SUFFSixtQkFBbUIsT0FBTyxRQUFRLFFBQVEsVUFBVSxDQUFDLElBQUksQ0FBQztHQUM1RDtRQUNHO0lBQ0gsbUJBQW1CLENBQUM7SUFDcEIsSUFBSyxjQUFjLGFBQ2pCLG1CQUFtQixHQUNoQixjQUFjLE9BQU8sZUFBZSxRQUFRO0lBQ2pELGdCQUNJLGNBQWMsZUFBZSxPQUMvQixtQkFBbUIsR0FDbkIsV0FBVyxnQkFBZ0IsZUFBZSxXQUFXO0dBQ3pEO0dBQ0EsZUFBZSxRQUFRO0dBQ3ZCLFFBQVEsZUFBZSxLQUF2QjtJQUNFLEtBQUs7S0FDSCxHQUFHLElBQ0MsY0FBYyxlQUFlLGNBQzlCLFVBQVUsWUFBWSxlQUFlLFdBQVcsR0FDaEQsVUFBVSwyQkFBMkIsT0FBTyxHQUM1QyxlQUFlLE9BQU8sU0FDdkIsZUFBZSxPQUFPLFNBRXRCLGdCQUFnQixPQUFPLEtBQ2pCLGNBQWMsMkJBQ2QsU0FDQSxXQUNGLEdBQ0MsZUFBZSxNQUFNLEdBQ3JCLGlCQUFpQixxQkFDaEIsTUFDQSxnQkFDQSxTQUNBLGFBQ0EsV0FDRixNQUNFLGVBQWUsTUFBTSxHQUN2QiwrQkFBK0IsZ0JBQWdCLE9BQU8sR0FDckQsaUJBQWlCLHdCQUNoQixNQUNBLGdCQUNBLFNBQ0EsYUFDQSxXQUNGO1VBQ0Q7TUFDSCxJQUFJLEtBQUssTUFBTSxXQUFXLFNBQVMsU0FDakM7T0FDSSxJQUFBLGNBQWMsUUFBUSxVQUN4QixnQkFBZ0Isd0JBQ2hCO1FBQ0EsZUFBZSxNQUFNO1FBQ3JCLGlCQUFpQixpQkFDZixNQUNBLGdCQUNBLFNBQ0EsYUFDQSxXQUNGO1FBQ0EsTUFBTTtPQUNSLE9BQU8sSUFBSSxnQkFBZ0IsaUJBQWlCO1FBQzFDLGVBQWUsTUFBTTtRQUNyQixpQkFBaUIsb0JBQ2YsTUFDQSxnQkFDQSxTQUNBLGFBQ0EsV0FDRjtRQUNBLE1BQU07T0FDUixPQUFPLElBQUksZ0JBQWdCLG9CQUFvQjtRQUM3QyxlQUFlLE1BQU07UUFDckIsZUFBZSxPQUFPO1FBQ3RCLGlCQUFpQixzQkFDZixNQUNBLGdCQUNBLFdBQ0Y7UUFDQSxNQUFNO09BQ1I7O01BQ0YsaUJBQWlCO01BQ2pCLFNBQVMsV0FDUCxhQUFhLE9BQU8sV0FDcEIsUUFBUSxhQUFhLG9CQUNwQixpQkFDQztNQUNKLGNBQWMseUJBQXlCLE9BQU8sS0FBSztNQUNuRCxNQUFNLE1BQ0osbUVBQ0UsY0FDQSw2REFDQSxjQUNKO0tBQ0Y7S0FDQSxPQUFPO0lBQ1QsS0FBSyxHQUNILE9BQU8sd0JBQ0wsU0FDQSxnQkFDQSxlQUFlLE1BQ2YsZUFBZSxjQUNmLFdBQ0Y7SUFDRixLQUFLLEdBQ0gsT0FDRyxjQUFjLGVBQWUsTUFDN0IsY0FBYywyQkFDYixhQUNBLGVBQWUsWUFDakIsR0FDQSxxQkFDRSxTQUNBLGdCQUNBLGFBQ0EsYUFDQSxXQUNGO0lBRUosS0FBSztLQUNILEdBQUc7TUFDRCxrQkFDRSxnQkFDQSxlQUFlLFVBQVUsYUFDM0I7TUFDQSxJQUFJLFNBQVMsU0FDWCxNQUFNLE1BQ0osc0RBQ0Y7TUFDRixjQUFjLGVBQWU7TUFDN0IsSUFBSSxZQUFZLGVBQWU7TUFDL0IsY0FBYyxVQUFVO01BQ3hCLGlCQUFpQixTQUFTLGNBQWM7TUFDeEMsbUJBQW1CLGdCQUFnQixhQUFhLE1BQU0sV0FBVztNQUNqRSxJQUFJLFlBQVksZUFBZTtNQUMvQixjQUFjLFVBQVU7TUFDeEIsYUFBYSxnQkFBZ0IsY0FBYyxXQUFXO01BQ3RELGdCQUFnQixVQUFVLFNBQ3hCLHdCQUNFLGdCQUNBLENBQUMsWUFBWSxHQUNiLGFBQ0EsQ0FBQyxDQUNIO01BQ0YsNENBQTRDO01BQzVDLGNBQWMsVUFBVTtNQUN4QixJQUFJLFVBQVUsY0FDWixJQUNJLFlBQVk7T0FDWixTQUFTO09BQ1QsY0FBYyxDQUFDO09BQ2YsT0FBTyxVQUFVO01BQ25CLEdBQ0MsZUFBZSxZQUFZLFlBQVksV0FDdkMsZUFBZSxnQkFBZ0IsV0FDaEMsZUFBZSxRQUFRLEtBQ3ZCO09BQ0EsaUJBQWlCLDhCQUNmLFNBQ0EsZ0JBQ0EsYUFDQSxXQUNGO09BQ0EsTUFBTTtNQUNSLE9BQU8sSUFBSSxnQkFBZ0IsYUFBYTtPQUN0QyxjQUFjLDJCQUNaLE1BQ0UscUhBQ0YsR0FDQSxjQUNGO09BQ0Esb0JBQW9CLFdBQVc7T0FDL0IsaUJBQWlCLDhCQUNmLFNBQ0EsZ0JBQ0EsYUFDQSxXQUNGO09BQ0EsTUFBTTtNQUNSLE9BQU87T0FDTCxVQUFVLGVBQWUsVUFBVTtPQUNuQyxRQUFRLFFBQVEsVUFBaEI7UUFDRSxLQUFLO1NBQ0gsVUFBVSxRQUFRO1NBQ2xCO1FBQ0YsU0FDRSxVQUNFLFdBQVcsUUFBUSxXQUNmLFFBQVEsY0FBYyxPQUN0QjtPQUNWO09BQ0EseUJBQXlCLGtCQUFrQixRQUFRLFVBQVU7T0FDN0QsdUJBQXVCO09BQ3ZCLGNBQWMsQ0FBQztPQUNmLGtCQUFrQjtPQUNsQix1QkFBdUIsQ0FBQztPQUN4Qix1QkFBdUI7T0FDdkIseUJBQXlCLENBQUM7T0FDMUIsY0FBYyxpQkFDWixnQkFDQSxNQUNBLGFBQ0EsV0FDRjtPQUNBLEtBQUssZUFBZSxRQUFRLGFBQWEsY0FDdkMsWUFBYSxRQUFTLFlBQVksUUFBUSxLQUFNLFdBQzdDLGNBQWMsWUFBWTtNQUNqQztXQUNHO09BQ0gsb0JBQW9CO09BQ3BCLElBQUksZ0JBQWdCLGFBQWE7UUFDL0IsaUJBQWlCLDZCQUNmLFNBQ0EsZ0JBQ0EsV0FDRjtRQUNBLE1BQU07T0FDUjtPQUNBLGtCQUNFLFNBQ0EsZ0JBQ0EsYUFDQSxXQUNGO01BQ0Y7TUFDQSxpQkFBaUIsZUFBZTtLQUNsQztLQUNBLE9BQU87SUFDVCxLQUFLLElBQ0gsT0FDRSxRQUFRLFNBQVMsY0FBYyxHQUMvQixTQUFTLFdBQ0osY0FBYyxZQUNiLGVBQWUsTUFDZixN
15852QUNBLGVBQWUsY0FDZixJQUNGLEtBQ0csZUFBZSxnQkFBZ0IsY0FDaEMsZ0JBQ0MsZUFBZSxZQUFZLHdCQUMxQixlQUFlLE1BQ2YsZUFBZSxjQUNmLGdCQUFnQix3QkFBd0IsT0FBTyxHQUMvQyxjQUNGLEtBQ0QsZUFBZSxnQkFBZ0IsWUFDOUIsZUFBZSxNQUNmLFFBQVEsZUFDUixlQUFlLGNBQ2YsUUFBUSxhQUNWLEdBQ0o7SUFFSixLQUFLLElBQ0gsT0FDRSxnQkFBZ0IsY0FBYyxHQUM5QixTQUFTLFdBQ1AsZ0JBQ0UsY0FBYyxnQkFBZ0Isd0JBQXdCLE9BQU8sR0FDOUQsY0FBYyxlQUFlLEdBQzdCLGNBQWMsZUFBZSxZQUM1Qix5QkFDRSxlQUFlLE1BQ2YsZUFBZSxjQUNmLGFBQ0EsYUFDQSxDQUFDLENBQ0gsR0FDRix5QkFDSSxjQUFjLHVCQUNkLGFBQ0EsZUFBZSxNQUNmLGVBQWUsY0FDZixXQUNGLEdBQ0EsU0FBUyxnQkFDTix1QkFBdUIsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLGNBQ3pDLGVBQ0wsdUJBQXVCLGdCQUN2Qix5QkFBeUIsQ0FBQyxHQUMxQixjQUFjLHdCQUNmLGlCQUFpQixlQUFlLElBQUksS0FDOUIsOENBQThDLGFBQy9DLHlCQUF5QixrQkFDeEIsWUFBWSxVQUNkLEtBQ0MseUJBQXlCLGNBQ2hDLGtCQUNFLFNBQ0EsZ0JBQ0EsZUFBZSxhQUFhLFVBQzVCLFdBQ0YsR0FDQSxRQUFRLFNBQVMsY0FBYyxHQUMvQixTQUFTLFlBQVksZUFBZSxTQUFTLFVBQzdDLGVBQWU7SUFFbkIsS0FBSyxHQUNILE9BQ0UsU0FBUyxXQUNQLGdCQUNFLFlBQVksZUFBZSxHQUM1QixjQUFjLG1CQUNiLGVBQWUsTUFDZixVQUFVLFlBQ1osR0FDQyxjQUFjLHlCQUNkLFlBQVksQ0FBQyxpQkFDVixZQUFZLG1CQUNaLGFBQ0EsZUFBZSxNQUNmLGVBQWUsY0FDZixzQkFDRixHQUNBLFNBQVMsYUFDSCxlQUFlLFlBQVksV0FDN0IseUJBQ0ksWUFBWSx1QkFDWixXQUNBLGVBQWUsTUFDZixlQUFlLGNBQ2YsU0FDRixHQUNBLFNBQVMsY0FDTix1QkFBdUIsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLGNBQ3pDLGFBQ0wsdUJBQXVCLGdCQUN2Qix5QkFBeUIsa0JBQ3hCLFVBQVUsVUFDWixHQUNDLHlCQUF5QixDQUFDLEdBQzFCLFlBQVksQ0FBQyxLQUNiLFlBQVksQ0FBQyxHQUNqQixZQUFZLENBQUMsWUFDaEIsY0FDRyxlQUNDLHdCQUF3QixnQkFBZ0IsV0FBVyxHQUNyRCx5QkFBeUIsY0FBYyxLQUMzQyxnQkFBZ0IsY0FBYyxHQUM3QixjQUFjLGVBQWUsTUFDN0IsWUFBWSxlQUFlLGNBQzNCLFlBQVksU0FBUyxVQUFVLFFBQVEsZ0JBQWdCLE1BQ3ZELGNBQWMsVUFBVSxVQUN6QixxQkFBcUIsYUFBYSxTQUFTLElBQ3RDLGNBQWMsT0FDZixTQUFTLGFBQ1QscUJBQXFCLGFBQWEsU0FBUyxNQUMxQyxlQUFlLFNBQVMsS0FDN0IsU0FBUyxlQUFlLGtCQUNwQixjQUFjLGdCQUNkLFNBQ0EsZ0JBQ0EsOEJBQ0EsTUFDQSxNQUNBLFdBQ0YsR0FDQyxzQkFBc0IsZ0JBQWdCLGNBQ3pDLFFBQVEsU0FBUyxjQUFjLEdBQy9CLGtCQUNFLFNBQ0EsZ0JBQ0EsYUFDQSxXQUNGLEdBQ0EsZUFBZTtJQUVuQixLQUFLLEdBQ0gsT0FDRSxTQUFTLFdBQ1AsZ0JBQ0UsY0FBYyxlQUFlLGNBQzlCLFVBQVUsZUFBZSxHQUN6QixjQUFjLFFBQVEsYUFBYSxTQUNuQyxjQUNDLFFBQVEsY0FDSixvQkFDRSxhQUNBLFlBQVksS0FDWixRQUFRLGFBQWEsaUJBQ3ZCLElBQ0EsQ0FBQyxHQUNOLFVBQVUseUJBQ1YsY0FBYyxDQUFDLGFBQ1osY0FBYyx1QkFDZCxTQUNBLGVBQWUsY0FDZixzQkFDRixHQUNBLFNBQVMsZUFDSCxlQUFlLFlBQVksYUFDNUIsdUJBQXVCLGdCQUN2Qix5QkFBeUIsTUFDekIsY0FBYyxDQUFDLEtBQ2YsY0FBYyxDQUFDLEdBQ25CLGNBQWMsQ0FBQyxjQUNsQixnQkFDRyxlQUNDLHdCQUF3QixnQkFBZ0IsT0FBTyxHQUNqRCx5QkFBeUIsY0FBYyxLQUMzQztJQUVKLEtBQUssSUFDSCxPQUFPLHdCQUF3QixTQUFTLGdCQUFnQixXQUFXO0lBQ3JFLEtBQUssR0FDSCxPQUNFLGtCQUNFLGdCQUNBLGVBQWUsVUFBVSxhQUMzQixHQUNDLGNBQWMsZUFBZSxjQUM5QixTQUFTLFVBQ0osZUFBZSxRQUFRLHFCQUN0QixnQkFDQSxNQUNBLGFBQ0EsV0FDRixJQUNBLGtCQUNFLFNBQ0EsZ0JBQ0EsYUFDQSxXQUNGLEdBQ0osZUFBZTtJQUVuQixLQUFLLElBQ0gsT0FBTyxpQkFDTCxTQUNBLGdCQUNBLGVBQWUsTUFDZixlQUFlLGNBQ2YsV0FDRjtJQUNGLEtBQUssR0FDSCxPQUNHLGNBQWMsZUFBZSxjQUM5QixRQUFRLFNBQVMsY0FBYyxHQUMvQixrQkFDRSxTQUNBLGdCQUNBLGFBQ0EsV0FDRixHQUNBLGVBQWU7SUFFbkIsS0FBSyxHQUNILE9BQ0Usa0JBQ0UsU0FDQSxnQkFDQSxlQUFlLGFBQWEsVUFDNUIsV0FDRixHQUNBLGVBQWU7SUFFbkIsS0FBSyxJQUNILE9BQ0csZUFBZSxTQUFTLEdBQ3hCLGVBQWUsU0FBUyxNQUN4QixjQUFjLGVBQWUsV0FDN0IsWUFBWSxpQkFBaUIsSUFDN0IsWUFBWSx3QkFBd0IsSUFDckMsa0JBQ0UsU0FDQSxnQkFDQSxlQUFlLGFBQWEsVUFDNUIsV0FDRixHQUNBLGVBQWU7SUFFbkIsS0FBSyxJQUNILE9BQU8sc0JBQXNCLFNBQVMsZ0JBQWdCLFdBQVc7SUFDbkUsS0FBSyxHQUNILE9BQ0csY0FBYyxlQUFlLEtBQUssVUFDbEMsY0FBYyxlQUFlLGFBQWEsVUFDM0MsZUFBZSxPQUFPLGVBQ3BCLFFBQVEsTUFDTixxUEFDRixHQUNGLHFCQUFxQixjQUFjLEdBQ2xDLGNBQWMsWUFBWSxXQUFXLEdBQ3JDLGNBQWMsbUJBQ2IsYUFDQSxhQUNBLEtBQUssQ0FDUCxHQUNDLGVBQWUsU0FBUyxHQUN6QixrQkFDRSxTQUNBLGdCQUNBLGFBQ0EsV0FDRixHQUNBLGVBQWU7SUFFbkIsS0FBSyxJQUNILE9BQU8sb0JBQ0wsU0FDQSxnQkFDQSxlQUFlLE1BQ2YsZUFBZSxjQUNmLFdBQ0Y7SUFDRixLQUFLLElBQ0gsT0FBTywwQkFDTCxTQUNBLGdCQUNBLGVBQWUsTUFDZixlQUFlLGNBQ2YsV0FDRjtJQUNGLEtBQUssSUFDSCxPQUFPLDRCQUNMLFNBQ0EsZ0JBQ0EsV0FDRjtJQUNGLEtBQUssSUFDSCxPQUFPLHdCQUF3QixTQUFTLGdCQUFnQixXQUFXO0lBQ3JFLEtBQUssSUFDSCxPQUFPLHlCQUNMLFNBQ0EsZ0JBQ0EsYUFDQSxlQUFlLFlBQ2pCO0lBQ0YsS0FBSyxJQUNILE9BQ0UscUJBQXFCLGNBQWMsR0FDbEMsY0FBYyxZQUFZLFlBQVksR0FDdkMsU0FBUyxXQUNILGNBQWMsa0JBQWtCLEdBQ2xDLFNBQVMsZ0JBQ0wsY0FBYyxvQkFDZixZQUFZLFlBQVksR0FDeEIsWUFBWSxjQUFjLFdBQzNCLFlBQVksU0FBUyxHQUNyQixTQUFTLGNBQ04sWUFBWSxvQkFBb0IsY0FDbEMsY0FBYyxZQUNoQixlQUFlLGdCQUFnQjtLQUM5QixRQUFRO0tBQ1IsT0FBTztJQUNULEdBQ0Esc0JBQXNCLGNBQWMsR0FDcEMsYUFBYSxnQkFBZ0IsY0FBYyxXQUFXLE1BQ3JELE9BQU8sUUFBUSxRQUFRLGlCQUNyQixpQkFBaUIsU0FBUyxjQUFjLEdBQ3pDLG1CQUFtQixnQkFBZ0IsTUFBTSxNQUFNLFdBQVcsR0FDMUQsNENBQTRDLElBQzdDLGNBQWMsUUFBUSxlQUN0QixZQUFZLGVBQWUsZUFDNUIsWUFBWSxXQUFXLGVBQ2pCLGNBQWM7S0FDZCxRQUFRO0tBQ1IsT0FBTztJQUNULEdBQ0MsZUFBZSxnQkFBZ0IsYUFDaEMsTUFBTSxlQUFlLFVBQ2xCLGVBQWUsZ0JBQ2Qs
15852ZUFBZSxZQUFZLFlBQ3pCLGNBQ04sYUFBYSxnQkFBZ0IsY0FBYyxXQUFXLE1BQ3BELGNBQWMsVUFBVSxPQUMxQixhQUFhLGdCQUFnQixjQUFjLFdBQVcsR0FDdEQsZ0JBQWdCLFlBQVksU0FDMUIsd0JBQ0UsZ0JBQ0EsQ0FBQyxZQUFZLEdBQ2IsYUFDQSxDQUFDLENBQ0gsS0FDVixrQkFDRSxTQUNBLGdCQUNBLGVBQWUsYUFBYSxVQUM1QixXQUNGLEdBQ0EsZUFBZTtJQUVuQixLQUFLLElBQ0gsT0FDRSxTQUFTLGVBQWUsY0FDckIsZUFBZSxZQUFZO0tBQzFCLFVBQVU7S0FDVixRQUFRO0tBQ1IsUUFBUTtLQUNSLEtBQUs7SUFDUCxJQUNELGNBQWMsZUFBZSxjQUM5QixRQUFRLFlBQVksUUFBUSxXQUFXLFlBQVksT0FDOUMsZUFBZSxTQUFTLFNBQVMsVUFBVSxXQUFXLFdBQ3ZELGVBQWUsdUJBQXVCLGNBQWMsR0FDeEQsS0FBSyxNQUFNLFlBQVksY0FDbkIsY0FDQSxhQUFhLE9BQU8sWUFBWSxZQUM1QixLQUFLLFVBQVUsWUFBWSxTQUFTLElBQ3BDLFNBQ04sc0NBQXNDLGlCQUNsQyxzQ0FBc0MsZUFBZSxDQUFDLEdBQ3hELFFBQVEsTUFDTixpS0FDQSxhQUNBLFdBQ0YsS0FDSixTQUFTLFdBQVcsUUFBUSxjQUFjLFNBQVMsWUFBWSxPQUMxRCxlQUFlLFNBQVMsVUFDekIsUUFBUSxTQUFTLGNBQWMsR0FDbkMsa0JBQ0UsU0FDQSxnQkFDQSxZQUFZLFVBQ1osV0FDRixHQUNBLGVBQWU7SUFFbkIsS0FBSyxJQUNILE1BQU0sZUFBZTtHQUN6QjtHQUNBLE1BQU0sTUFDSiwrQkFDRSxlQUFlLE1BQ2YseUVBQ0o7RUFDRjtFQUNBLFNBQVMsV0FBVyxnQkFBZ0I7R0FDbEMsZUFBZSxTQUFTO0VBQzFCO0VBQ0EsU0FBUyxrQ0FDUCxnQkFDQSxNQUNBLFVBQ0EsVUFDQSxhQUNBO0dBQ0EsSUFBSTtHQUNKLElBQ0csbUJBQ0UsZUFBZSxPQUFPLHlCQUF5QixRQUVsRCxrQkFDRSxTQUFTLFdBQ0wsaUJBQWlCLE1BQU0sUUFBUSxJQUMvQixpQkFBaUIsTUFBTSxRQUFRLE1BQzlCLFNBQVMsUUFBUSxTQUFTLE9BQ3pCLFNBQVMsV0FBVyxTQUFTO0dBQ3ZDLElBQUksaUJBRUU7UUFBQSxlQUFlLFNBQVMsV0FDekIsY0FBYyxlQUFlLGFBRTlCLElBQUksZUFBZSxVQUFVLFVBQVUsZUFBZSxTQUFTO1NBQzFELElBQUksNkJBQTZCLEdBQUcsZUFBZSxTQUFTO1NBRS9ELE1BQ0ksb0JBQW9CLDZCQUN0QjtHQUFBLE9BRUQsZUFBZSxTQUFTO0VBQ2pDO0VBQ0EsU0FBUyxrQ0FBa0MsZ0JBQWdCLFVBQVU7R0FDbkUsSUFDRSxpQkFBaUIsU0FBUyxTQUN6QixTQUFTLE1BQU0sVUFBVSxjQUFjLFdBRXhDLGVBQWUsU0FBUztRQUNyQixJQUFNLGVBQWUsU0FBUyxVQUFXLENBQUMsZ0JBQWdCLFFBQVEsR0FDckUsSUFBSSw2QkFBNkIsR0FBRyxlQUFlLFNBQVM7UUFFMUQsTUFDSSxvQkFBb0IsNkJBQ3RCO0VBRVI7RUFDQSxTQUFTLG9CQUFvQixnQkFBZ0IsWUFBWTtHQUN2RCxTQUFTLGVBQWUsZUFBZSxTQUFTO0dBQ2hELGVBQWUsUUFBUSxVQUNuQixhQUNBLE9BQU8sZUFBZSxNQUFNLG1CQUFtQixJQUFJLFdBQ3BELGVBQWUsU0FBUyxZQUN4QixxQ0FBcUM7RUFDMUM7RUFDQSxTQUFTLG1CQUFtQixhQUFhLDBCQUEwQjtHQUNqRSxJQUFJLENBQUMsYUFDSCxRQUFRLFlBQVksVUFBcEI7SUFDRSxLQUFLLFdBQ0g7SUFDRixLQUFLO0tBQ0gsS0FDRSxJQUFJLFdBQVcsWUFBWSxNQUFNLGVBQWUsTUFDaEQsU0FBUyxXQUdULFNBQVMsU0FBUyxjQUFjLGVBQWUsV0FDNUMsV0FBVyxTQUFTO0tBQ3pCLFNBQVMsZUFDTCw0QkFBNEIsU0FBUyxZQUFZLE9BQzlDLFlBQVksT0FBTyxPQUNuQixZQU
15852FZLEtBQUssVUFBVSxPQUM3QixhQUFhLFVBQVU7S0FDNUI7SUFDRjtLQUNFLDJCQUEyQixZQUFZO0tBQ3ZDLEtBQUssV0FBVyxNQUFNLFNBQVMsMkJBQzdCLFNBQVMseUJBQXlCLGNBQy9CLFdBQVcsMkJBQ1gsMkJBQTJCLHlCQUF5QjtLQUN6RCxTQUFTLFdBQ0osWUFBWSxPQUFPLE9BQ25CLFNBQVMsVUFBVTtHQUM1QjtFQUNKO0VBQ0EsU0FBUyxpQkFBaUIsZUFBZTtHQUN2QyxJQUFJLGFBQ0EsU0FBUyxjQUFjLGFBQ3ZCLGNBQWMsVUFBVSxVQUFVLGNBQWMsT0FDbEQsZ0JBQWdCLEdBQ2hCLGVBQWU7R0FDakIsSUFBSSxZQUNGLEtBQUssY0FBYyxPQUFPLGlCQUFpQixRQUFRO0lBQ2pELEtBQ0UsSUFBSSxvQkFBb0IsY0FBYyxrQkFDcEMsVUFBVSxjQUFjLE9BQzFCLFNBQVMsVUFHVCxpQkFBa0IsUUFBUSxRQUFRLFFBQVEsWUFDdkMsZ0JBQWdCLFFBQVEsZUFBZSxZQUN2QyxnQkFBZ0IsUUFBUSxRQUFRLFlBQ2hDLHFCQUFxQixRQUFRLGtCQUM3QixVQUFVLFFBQVE7SUFDdkIsY0FBYyxtQkFBbUI7R0FDbkMsT0FDRSxLQUNFLG9CQUFvQixjQUFjLE9BQ2xDLFNBQVMsb0JBR1QsaUJBQ0Usa0JBQWtCLFFBQVEsa0JBQWtCLFlBQzNDLGdCQUFnQixrQkFBa0IsZUFBZSxZQUNqRCxnQkFBZ0Isa0JBQWtCLFFBQVEsWUFDMUMsa0JBQWtCLFNBQVMsZUFDM0Isb0JBQW9CLGtCQUFrQjtRQUMxQyxLQUFLLGNBQWMsT0FBTyxpQkFBaUIsUUFBUTtJQUN0RCxvQkFBb0IsY0FBYztJQUNsQyxVQUFVLGNBQWM7SUFDeEIsS0FBSyxJQUFJLFFBQVEsY0FBYyxPQUFPLFNBQVMsUUFDN0MsaUJBQWtCLE1BQU0sUUFBUSxNQUFNLFlBQ25DLGdCQUFnQixNQUFNLGNBQ3RCLGdCQUFnQixNQUFNLE9BQ3RCLHFCQUFxQixNQUFNLGdCQUMzQixXQUFXLE1BQU0sa0JBQ2pCLFFBQVEsTUFBTTtJQUNuQixjQUFjLGlCQUFpQjtJQUMvQixjQUFjLG1CQUFtQjtHQUNuQyxPQUNFLEtBQ0Usb0JBQW9CLGNBQWMsT0FDbEMsU0FBUyxvQkFHVCxpQkFDRSxrQkFBa0IsUUFBUSxrQkFBa0IsWUFDM0MsZ0JBQWdCLGtCQUFrQixjQUNsQyxnQkFBZ0Isa0JBQWtCLE9BQ2xDLGtCQUFrQixTQUFTLGVBQzNCLG9CQUFvQixrQkFBa0I7R0FDN0MsY0FBYyxnQkFBZ0I7R0FDOUIsY0FBYyxhQUFhO0dBQzNCLE9BQU87RUFDVDtFQUNBLFNBQVMsYUFBYSxTQUFTLGdCQUFnQixhQUFhO0dBQzFELElBQUksV0FBVyxlQUFlO0dBQzlCLGVBQWUsY0FBYztHQUM3QixRQUFRLGVBQWUsS0FBdkI7SUFDRSxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUssSUFDSCxPQUFPLGlCQUFpQixjQUFjLEdBQUc7SUFDM0MsS0FBSyxHQUNILE9BQU8saUJBQWlCLGNBQWMsR0FBRztJQUMzQyxLQUFLO0tBQ0gsY0FBYyxlQUFlO0tBQzdCLFdBQVc7S0FDWCxTQUFTLFlBQVksV0FBVyxRQUFRLGNBQWM7S0FDdEQsZUFBZSxjQUFjLFVBQVUsYUFDcEMsZUFBZSxTQUFTO0tBQzNCLFlBQVksY0FBYyxjQUFjO0tBQ3hDLGlCQUFpQixjQUFjO0tBQy9CLFlBQVksbUJBQ1IsWUFBWSxVQUFVLFlBQVksZ0JBQ25DLFlBQVksaUJBQWlCO0tBQ2hDLElBQUksU0FBUyxXQUFXLFNBQVMsUUFBUSxPQUN2QyxrQkFBa0IsY0FBYyxLQUMzQiw2QkFBNkIsR0FBRyxXQUFXLGNBQWMsS0FDMUQsU0FBUyxXQUNSLFFBQVEsY0FBYyxnQkFDckIsT0FBTyxlQUFlLFFBQVEsU0FDOUIsZUFBZSxTQUFTLE1BQzFCLG9DQUFvQztLQUMxQyxpQkFBaUIsY0FBYztLQUMvQixPQUFPO0lBQ1QsS0FBSztLQUNILElBQUksT0FBTyxlQUFlLE1BQ3hCLGVBQWUsZUFBZTtLQUNoQyxTQUFTLFdBQ0osV0FBVyxjQUFjLEdBQzFCLFNBQVMsZ0JBQ0osaUJBQWlCLGNBQWMsR0FDaEMsa0NBQ0UsZ0JBQ0EsWUFDRixNQUNDLGlCQUFpQixjQUFjLEdBQ2hDLGtDQUNFLGdCQUNBLE1BQ0EsTUFDQSxVQUNBLFdBQ0YsTUFDSixlQUNFLGlCQUFpQixRQUFRLGlCQUN0QixXQUFXLGNBQWMsR0FDMUIsaUJBQWlCLGNBQWMsR0FDL0Isa0NBQ0UsZ0JBQ0EsWUFDRixNQUNDLGlCQUFpQixjQUFjLEdBQy9CLGVBQWUsU0FBUyxjQUN6QixVQUFVLFFBQVEsZUFDcEIsWUFBWSxZQUFZLFdBQVcsY0FBYyxHQUNqRCxpQkFBaUIsY0FBYyxHQUMvQixrQ0FDRSxnQkFDQSxNQUNBLFNBQ0EsVUFDQSxXQUNGO0tBQ04sT0FBTztJQUNULEtBQUs7S0FDSCxlQUFlLGNBQWM7S0FDN0IsY0FBYyxnQkFBZ0Isd0JBQXdCLE9BQU87S0FDN0QsT0FBTyxlQUFlO0tBQ3RCLElBQUksU0FBUyxXQUFXLFFBQVEsZUFBZSxXQUM3QyxRQUFRLGtCQUFrQixZQUFZLFdBQVcsY0FBYztVQUM1RDtNQUNILElBQUksQ0FBQyxVQUFVO09BQ2IsSUFBSSxTQUFTLGVBQWUsV0FDMUIsTUFBTSxNQUNKLDZHQUNGO09BQ0YsaUJBQWlCLGNBQWM7T0FDL0IsZUFBZSxnQkFBZ0I7T0FDL0IsT0FBTztNQUNUO01BQ0EsVUFBVSxlQUFlO01BQ3pCLGtCQUFrQixjQUFjLElBQzVCLDZCQUE2QixnQkFBZ0IsT0FBTyxLQUNsRCxVQUFVLHlCQUNWLE1BQ0EsVUFDQSxhQUNBLFNBQ0EsQ0FBQyxDQUNILEdBQ0MsZUFBZSxZQUFZLFNBQzVCLFdBQVcsY0FBYztLQUMvQjtLQUNBLGlCQUFpQixjQUFjO0tBQy9CLGVBQWUsZ0JBQWdCO0tBQy9CLE9BQU87SUFDVCxLQUFLO0tBQ0gsZUFBZSxjQUFjO0tBQzdCLE9BQU8sZUFBZTtLQUN0QixJQUFJLFNBQVMsV0FBVyxRQUFRLGVBQWUsV0FDN0MsUUFBUSxrQkFBa0IsWUFBWSxXQUFXLGNBQWM7VUFDNUQ7TUFDSCxJQUFJLENBQUMsVUFBVTtPQUNiLElBQUksU0FBUyxlQUFlLFdBQzFCLE1BQU0sTUFDSiw2R0FDRjtPQUNGLGlCQUFpQixjQUFjO09BQy9CLGVBQWUsZ0JBQWdCO09BQy9CLE9BQU87TUFDVDtNQUNBLElBQUksc0JBQXNCLGVBQWU7TUFDekMsSUFBSSxrQkFBa0IsY0FBYyxHQUNsQyw2QkFBNkIsZ0JBQWdCLG1CQUFtQjtXQUM3RDtPQUNILGVBQWUsZ0JBQWdCLHdCQUF3QixPQUFPO09BQzlELG1CQUFtQixNQUFNLG9CQUFvQixZQUFZO09BQ3pELHNCQUFzQixvQkFBb0I7T0FDMUMsZUFBZSxrQ0FBa0MsWUFBWTtPQUM3RCxRQUFRLHFCQUFSO1FBQ0UsS0FBSztTQUNILGVBQWUsYUFBYSxnQkFDMUIsZUFDQSxJQUNGO1NBQ0E7UUFDRixLQUFLO1NBQ0gsZUFBZSxhQUFhLGdCQUMxQixnQkFDQSxJQUNGO1NBQ0E7UUFDRixTQUNFLFFBQVEsTUFBUjtTQUNFLEtBQUs7VUFDSCxlQUFlLGFBQWEsZ0JBQzFCLGVBQ0EsSUFDRjtVQUNBO1NBQ0YsS0FBSztVQUNILGVBQWUsYUFBYSxnQkFDMUIsZ0JBQ0EsSUFDRjtVQUNBO1NBQ0YsS0FBSztVQUNILGVBQWUsYUFBYSxjQUFjLEtBQUs7VUFDL0MscUJBQ0Usa0JBQWtCLFFBQVEsTUFDekIsUUFBUSxNQUNQLHNQQUNGLEdBQ0Msb0JBQW9CLENBQUM7VUFDeEIsYUFBYSxZQUFZO1VBQ3pCLGVBQWUsYUFBYSxZQUMxQixhQUFhLFVBQ2Y7VUFDQTtTQUNGLEtBQUs7VUFDSCxlQUNFLGFBQWEsT0FBTyxTQUFTLEtBQ3pCLGFBQWEsY0FBYyxVQUFVLEVBQ25DLElBQUksU0FBUyxHQUNmLENBQUMsSUFDRCxhQUFhLGNBQWMsUUFBUTtVQUN6QyxTQUFTLFdBQ0osYUFBYSxXQUFXLENBQUMsSUFDMUIsU0FBUyxTQUFTLGFBQWEsT0FBTyxTQUFTO1VBQ25EO1NBQ0YsU0FDRSxlQUNFLGFBQWEsT0FBTyxTQUFTLEtBQ3pCLGFBQWEsY0FBYyxNQUFNLEVBQy9CLElBQUksU0FBUyxHQUNmLENBQUMsSUFDRCxhQUFhLGNBQWMsSUFBSSxHQUNuQyxPQUFPLEtBQUssUUFBUSxHQUFHLE1BQ3BCLFNBQVMsS0FBSyxZQUFZLEtB
15852Q3pCLFFBQVEsTUFDTiwwR0FDQSxJQUNGLEdBQ0Ysa0NBQ0UsT0FBTyxVQUFVLFNBQVMsS0FBSyxZQUFZLEtBQzNDLGVBQWUsS0FBSyxtQkFBbUIsSUFBSSxNQUN6QyxrQkFBa0IsUUFBUSxDQUFDLEdBQzdCLFFBQVEsTUFDTixvSUFDQSxJQUNGO1FBQ1Y7T0FDSjtPQUNBLGFBQWEsdUJBQXVCO09BQ3BDLGFBQWEsb0JBQW9CO09BQ2pDLEdBQUcsS0FDRCxzQkFBc0IsZUFBZSxPQUNyQyxTQUFTLHNCQUVUO1FBQ0EsSUFDRSxNQUFNLG9CQUFvQixPQUMxQixNQUFNLG9CQUFvQixLQUUxQixhQUFhLFlBQVksb0JBQW9CLFNBQVM7YUFDbkQsSUFDSCxNQUFNLG9CQUFvQixPQUMxQixPQUFPLG9CQUFvQixPQUMzQixTQUFTLG9CQUFvQixPQUM3QjtTQUNBLG9CQUFvQixNQUFNLFNBQVM7U0FDbkMsc0JBQXNCLG9CQUFvQjtTQUMxQztRQUNGO1FBQ0EsSUFBSSx3QkFBd0IsZ0JBQWdCLE1BQU07UUFDbEQsT0FBTyxTQUFTLG9CQUFvQixVQUFXO1NBQzdDLElBQ0UsU0FBUyxvQkFBb0IsVUFDN0Isb0JBQW9CLFdBQVcsZ0JBRS9CLE1BQU07U0FDUixzQkFBc0Isb0JBQW9CO1FBQzVDO1FBQ0Esb0JBQW9CLFFBQVEsU0FBUyxvQkFBb0I7UUFDekQsc0JBQXNCLG9CQUFvQjtPQUM1QztPQUNBLGVBQWUsWUFBWTtPQUMzQixHQUFHLFFBQ0EscUJBQXFCLGNBQWMsTUFBTSxRQUFRLEdBQUcsTUFEcEQ7UUFHRCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7UUFDTCxLQUFLO1NBQ0gsV0FBVyxDQUFDLENBQUMsU0FBUztTQUN0QixNQUFNO1FBQ1IsS0FBSztTQUNILFdBQVcsQ0FBQztTQUNaLE1BQU07UUFDUixTQUNFLFdBQVcsQ0FBQztPQUNoQjtPQUNBLFlBQVksV0FBVyxjQUFjO01BQ3ZDO0tBQ0Y7S0FDQSxpQkFBaUIsY0FBYztLQUMvQixlQUFlLGdCQUFnQjtLQUMvQixrQ0FDRSxnQkFDQSxlQUFlLE1BQ2YsU0FBUyxVQUFVLE9BQU8sUUFBUSxlQUNsQyxlQUFlLGNBQ2YsV0FDRjtLQUNBLE9BQU87SUFDVCxLQUFLO0tBQ0gsSUFBSSxXQUFXLFFBQVEsZUFBZSxXQUNwQyxRQUFRLGtCQUFrQixZQUFZLFdBQVcsY0FBYztVQUM1RDtNQUNILElBQ0UsYUFBYSxPQUFPLFlBQ3BCLFNBQVMsZUFBZSxXQUV4QixNQUFNLE1BQ0osNkdBQ0Y7TUFDRixVQUFVLGdCQUFnQix3QkFBd0IsT0FBTztNQUN6RCxjQUFjLGVBQWU7TUFDN0IsSUFBSSxrQkFBa0IsY0FBYyxHQUFHO09BQ3JDLFVBQVUsZUFBZTtPQUN6QixjQUFjLGVBQWU7T0FDN0IsT0FBTyxDQUFDO09BQ1IsV0FBVztPQUNYLGVBQWU7T0FDZixJQUFJLFNBQVMsY0FDWCxRQUFRLGFBQWEsS0FBckI7UUFDRSxLQUFLO1NBQ0gsU0FDSSxPQUFPLCtCQUNQLFNBQ0EsYUFDQSxRQUNGLEdBQ0EsU0FBUyxTQUNOLHVCQUF1QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsY0FDekM7U0FDTjtRQUNGLEtBQUs7UUFDTCxLQUFLLEdBQ0gsV0FBWSxhQUFhLGVBQ3ZCLFNBQ0ksT0FBTywrQkFDUCxTQUNBLGFBQ0EsUUFDRixHQUNBLFNBQVMsU0FDTix1QkFDQyxnQkFDQSxDQUNGLENBQUMsQ0FBQyxjQUFjO09BQzFCO09BQ0YsUUFBUSx1QkFBdUI7T0FDL0IsVUFDRSxRQUFRLGNBQWMsZUFDckIsU0FBUyxZQUNSLENBQUMsTUFBTSxTQUFTLDRCQUNsQixzQkFBc0IsUUFBUSxXQUFXLFdBQVcsSUFDaEQsQ0FBQyxJQUNELENBQUM7T0FDUCxXQUFXLHlCQUF5QixnQkFBZ0IsQ0FBQyxDQUFDO01BQ3hELE9BQ0UsT0FBUSxZQUFZLGFBQWEsU0FDL0IsUUFBUSxRQUNOLG9CQUNFLFVBQ0EsS0FBSyxLQUNMLFlBQVksYUFBYSxpQkFDM0IsR0FDRCxVQUNDLGtDQUFrQyxPQUFPLENBQUMsQ0FBQyxlQUN6QyxRQUNGLEdBQ0QsUUFBUSx1QkFBdUIsZ0JBQy9CLGVBQWUsWUFBWTtLQUNsQztLQUNBLGlCQUFpQixjQUFjO0tBQy9CLE9BQU87SUFDVCxLQUFLO0tBQ0gsY0FBYyxlQUFlO0tBQzdCLElBQUksU0FBUyxXQUFXLFNBQVMsUUFBUSxlQUFlO01BQ3RELFdBQVcsa0JBQWtCLGNBQWM7TUFDM0MsSUFBSSxTQUFTLGFBQWE7T0FDeEIsSUFBSSxTQUFTLFNBQVM7UUFDcEIsSUFBSSxDQUFDLFVBQ0gsTUFBTSxNQUNKLHlHQUNGO1FBQ0YsVUFBVSxlQUFlO1FBQ3pCLFVBQVUsU0FBUyxVQUFVLFFBQVEsYUFBYTtRQUNsRCxJQUFJLENBQUMsU0FDSCxNQUFNLE1BQ0oscUhBQ0Y7UUFDRixRQUFRLHVCQUF1QjtRQUMvQixpQkFBaUIsY0FBYztRQUMvQixDQUFDLGVBQWUsT0FBTyxpQkFBaUIsVUFDdEMsU0FBUyxnQkFDUCxVQUFVLGVBQWUsT0FDM0IsU0FBUyxZQUNOLGVBQWUsb0JBQ2QsUUFBUTtPQUNoQixPQUNFLDZCQUE2QixHQUMzQixvQkFBb0IsR0FDcEIsT0FBTyxlQUFlLFFBQVEsU0FDM0IsY0FBYyxlQUFlLGdCQUFnQixPQUMvQyxlQUFlLFNBQVMsR0FDekIsaUJBQWlCLGNBQWMsSUFDOUIsZUFBZSxPQUFPLGlCQUFpQixVQUN0QyxTQUFTLGdCQUNQLFVBQVUsZUFBZSxPQUMzQixTQUFTLFlBQ04sZUFBZSxvQkFDZCxRQUFRO09BQ2xCLFVBQVUsQ0FBQztNQUNiLE9BQ0UsY0FBZSxvQ0FBb0MsR0FDakQsU0FBUyxXQUNQLFNBQVMsUUFBUSxrQkFDaEIsUUFBUSxjQUFjLGtCQUFrQixjQUMxQyxVQUFVLENBQUM7TUFDaEIsSUFBSSxDQUFDLFNBQVM7T0FDWixJQUFJLGVBQWUsUUFBUSxLQUN6QixPQUFPLG1CQUFtQixjQUFjLEdBQUc7T0FDN0MsbUJBQW1CLGNBQWM7T0FDakMsT0FBTztNQUNUO01BQ0EsSUFBSSxPQUFPLGVBQWUsUUFBUSxNQUNoQyxNQUFNLE1BQ0osMEVBQ0Y7S0FDSjtLQUNBLGlCQUFpQixjQUFjO0tBQy9CLE9BQU87SUFDVCxLQUFLO0tBQ0gsV0FBVyxlQUFlO0tBQzFCLElBQ0UsU0FBUyxXQUNSLFNBQVMsUUFBUSxpQkFDaEIsU0FBUyxRQUFRLGNBQWMsWUFDakM7TUFDQSxPQUFPO01BQ1AsZUFBZSxrQkFBa0IsY0FBYztNQUMvQyxJQUFJLFNBQVMsUUFBUSxTQUFTLEtBQUssWUFBWTtPQUM3QyxJQUFJLFNBQVMsU0FBUztRQUNwQixJQUFJLENBQUMsY0FDSCxNQUFNLE1BQ0oseUdBQ0Y7UUFDRixlQUFlLGVBQWU7UUFDOUIsZUFDRSxTQUFTLGVBQWUsYUFBYSxhQUFhO1FBQ3BELElBQUksQ0FBQyxjQUNILE1BQU0sTUFDSixxSEFDRjtRQUNGLGFBQWEsdUJBQXVCO1FBQ3BDLGlCQUFpQixjQUFjO1FBQy9CLENBQUMsZUFBZSxPQUFPLGlCQUFpQixVQUN0QyxTQUFTLFNBQ1AsT0FBTyxlQUFlLE9BQ3hCLFNBQVMsU0FDTixlQUFlLG9CQUFvQixLQUFLO09BQy9DLE9BQ0UsNkJBQTZCLEdBQzNCLG9CQUFvQixHQUNwQixPQUFPLGVBQWUsUUFBUSxTQUMzQixPQUFPLGVBQWUsZ0JBQWdCLE9BQ3hDLGVBQWUsU0FBUyxHQUN6QixpQkFBaUIsY0FBYyxJQUM5QixlQUFlLE9BQU8saUJBQWlCLFVBQ3RDLFNBQVMsU0FDUCxPQUFPLGVBQWUsT0FDeEIsU0FBUyxTQUNOLGVBQWUsb0JBQ2QsS0FBSztPQUNmLE9BQU8sQ0FBQztNQUNWLE9BQ0UsT0FBUSxvQ0FBb0MsR0FDMUMsU0FBUyxXQUNQLFNBQVMsUUFBUSxrQkFDaEIsUUFBUSxjQUFjLGtCQUFrQixPQUMxQyxPQUFPLENBQUM7T
15852UFDYixJQUFJLENBQUMsTUFBTTtPQUNULElBQUksZUFBZSxRQUFRLEtBQ3pCLE9BQU8sbUJBQW1CLGNBQWMsR0FBRztPQUM3QyxtQkFBbUIsY0FBYztPQUNqQyxPQUFPO01BQ1Q7S0FDRjtLQUNBLG1CQUFtQixjQUFjO0tBQ2pDLElBQUksT0FBTyxlQUFlLFFBQVEsTUFDaEMsT0FDRyxlQUFlLFFBQVEsY0FDdkIsZUFBZSxPQUFPLGlCQUFpQixVQUN0Qyx1QkFBdUIsY0FBYyxHQUN2QztLQUVKLGNBQWMsU0FBUztLQUN2QixVQUFVLFNBQVMsV0FBVyxTQUFTLFFBQVE7S0FDL0MsZ0JBQ0ksV0FBVyxlQUFlLE9BQzNCLE9BQU8sTUFDUixTQUFTLFNBQVMsYUFDaEIsU0FBUyxTQUFTLFVBQVUsaUJBQzVCLFNBQVMsU0FBUyxVQUFVLGNBQWMsY0FDekMsT0FBTyxTQUFTLFVBQVUsY0FBYyxVQUFVLE9BQ3BELGVBQWUsTUFDaEIsU0FBUyxTQUFTLGlCQUNoQixTQUFTLFNBQVMsY0FBYyxjQUMvQixlQUFlLFNBQVMsY0FBYyxVQUFVLE9BQ25ELGlCQUFpQixTQUFTLFNBQVMsU0FBUztLQUM5QyxnQkFBZ0IsV0FDZCxnQkFDQyxlQUFlLE1BQU0sU0FBUztLQUNqQyxvQkFBb0IsZ0JBQWdCLGVBQWUsV0FBVztLQUM5RCxpQkFBaUIsY0FBYztLQUMvQixDQUFDLGVBQWUsT0FBTyxpQkFBaUIsVUFDdEMsZ0JBQ0UsVUFBVSxlQUFlLE9BQzNCLFNBQVMsWUFDTixlQUFlLG9CQUFvQixRQUFRO0tBQ2hELE9BQU87SUFDVCxLQUFLLEdBQ0gsT0FDRSxpQkFBaUIsY0FBYyxHQUMvQixTQUFTLFdBQ1AsMkJBQ0UsZUFBZSxVQUFVLGFBQzNCLEdBQ0QsZUFBZSxTQUFTLFVBQ3pCLGlCQUFpQixjQUFjLEdBQy9CO0lBRUosS0FBSyxJQUNILE9BQ0UsWUFBWSxlQUFlLE1BQU0sY0FBYyxHQUMvQyxpQkFBaUIsY0FBYyxHQUMvQjtJQUVKLEtBQUs7S0FDSCx1QkFBdUIsY0FBYztLQUNyQyxXQUFXLGVBQWU7S0FDMUIsSUFBSSxTQUFTLFVBQVUsT0FBTyxpQkFBaUIsY0FBYyxHQUFHO0tBQ2hFLE9BQU8sT0FBTyxlQUFlLFFBQVE7S0FDckMsZUFBZSxTQUFTO0tBQ3hCLElBQUksU0FBUyxjQUNYLElBQUksTUFBTSxtQkFBbUIsVUFBVSxDQUFDLENBQUM7VUFDcEM7TUFDSCxJQUNFLGlDQUFpQyxrQkFDaEMsU0FBUyxXQUFXLE9BQU8sUUFBUSxRQUFRLE1BRTVDLEtBQUssVUFBVSxlQUFlLE9BQU8sU0FBUyxVQUFXO09BQ3ZELGVBQWUsbUJBQW1CLE9BQU87T0FDekMsSUFBSSxTQUFTLGNBQWM7UUFDekIsZUFBZSxTQUFTO1FBQ3hCLG1CQUFtQixVQUFVLENBQUMsQ0FBQztRQUMvQixVQUFVLGFBQWE7UUFDdkIsZUFBZSxjQUFjO1FBQzdCLG9CQUFvQixnQkFBZ0IsT0FBTztRQUMzQyxlQUFlLGVBQWU7UUFDOUIsVUFBVTtRQUNWLEtBQ0UsY0FBYyxlQUFlLE9BQzdCLFNBQVMsY0FHVCxvQkFBb0IsYUFBYSxPQUFPLEdBQ3JDLGNBQWMsWUFBWTtRQUMvQix3QkFDRSxnQkFDQyxvQkFBb0IsVUFDbkIsNkJBQ0EscUJBQ0o7UUFDQSxlQUNFLGFBQWEsZ0JBQWdCLFNBQVMsYUFBYTtRQUNyRCxPQUFPLGVBQWU7T0FDeEI7T0FDQSxVQUFVLFFBQVE7TUFDcEI7TUFDRixTQUFTLFNBQVMsUUFDaEIsTUFBTSxJQUFJLHVDQUNSLGVBQWUsU0FBUyxLQUN6QixPQUFPLENBQUMsR0FDVCxtQkFBbUIsVUFBVSxDQUFDLENBQUMsR0FDOUIsZUFBZSxRQUFRO0tBQzVCO1VBQ0c7TUFDSCxJQUFJLENBQUMsTUFDSCxJQUNJLFVBQVUsbUJBQW1CLFlBQVksR0FBSSxTQUFTLFNBR3BEO1dBQUEsZUFBZSxTQUFTLEtBQ3pCLE9BQU8sQ0FBQyxHQUNSLFVBQVUsUUFBUSxhQUNsQixlQUFlLGNBQWMsU0FDOUIsb0JBQW9CLGdCQUFnQixPQUFPLEdBQzNDLG1CQUFtQixVQUFVLENBQUMsQ0FBQyxHQUMvQixTQUFTLFNBQVMsUUFDaEIsZ0JBQWdCLFNBQVMsWUFDekIsY0FBYyxTQUFTLFlBQ3ZCLENBQUMsYUFBYSxhQUNkLENBQUMsYUFFSCxPQUFPLGlCQUFpQixjQUFjLEdBQUc7TUFBQSxPQUUzQyxJQUFJLE1BQU0sSUFBSSxTQUFTLHFCQUNyQixzQ0FDQSxjQUFjLGdCQUNaLGVBQWUsU0FBUyxLQUN6QixPQUFPLENBQUMsR0FDVCxtQkFBbUIsVUFBVSxDQUFDLENBQUMsR0FDOUIsZUFBZSxRQUFRO01BQzlCLFNBQVMsZUFDSCxhQUFhLFVBQVUsZUFBZSxPQUN2QyxlQUFlLFFBQVEsaUJBQ3RCLFVBQVUsU0FBUyxNQUNyQixTQUFTLFVBQ0osUUFBUSxVQUFVLGVBQ2xCLGVBQWUsUUFBUSxjQUMzQixTQUFTLE9BQU87S0FDdkI7S0FDQSxJQUFJLFNBQVMsU0FBUyxNQUFNO01BQzFCLFVBQVUsU0FBUztNQUNuQixHQUFHO09BQ0QsS0FBSyxjQUFjLFNBQVMsU0FBUyxjQUFlO1FBQ2xELElBQUksU0FBUyxZQUFZLFdBQVc7U0FDbEMsY0FBYyxDQUFDO1NBQ2YsTUFBTTtRQUNSO1FBQ0EsY0FBYyxZQUFZO09BQzVCO09BQ0EsY0FBYyxDQUFDO01BQ2pCO01BQ0EsU0FBUyxZQUFZO01BQ3JCLFNBQVMsT0FBTyxRQUFRO01BQ3hCLFNBQVMscUJBQXFCLE1BQU07TUFDcEMsUUFBUSxVQUFVO01BQ2xCLGVBQWUsb0JBQW9CO01BQ25DLGVBQWUsT0FDVixlQUFlLDZCQUNoQix3QkFDQSxlQUFlO01BQ25CLGNBQWMsU0FBUyxZQUN2QixnQkFBZ0IsU0FBUyxZQUN6QixDQUFDLGVBQ0QsY0FDSSx3QkFBd0IsZ0JBQWdCLFlBQVksS0FDbEQsY0FBYyxjQUNoQixLQUNFLDRCQUNBLGdCQUNBLGNBQ0YsR0FDQSxLQUFLLHFCQUFxQixhQUFhLGNBQWMsR0FDckQsU0FBUyxrQkFBa0IsZ0JBQWdCO01BQy9DLGVBQWUsYUFBYSxnQkFBZ0IsU0FBUyxhQUFhO01BQ2xFLE9BQU87S0FDVDtLQUNBLGlCQUFpQixjQUFjO0tBQy9CLE9BQU87SUFDVCxLQUFLO0lBQ0wsS0FBSyxJQUNILE9BQ0UsbUJBQW1CLGNBQWMsR0FDakMsaUJBQWlCLGNBQWMsR0FDOUIsV0FBVyxTQUFTLGVBQWUsZUFDcEMsU0FBUyxVQUNKLFNBQVMsUUFBUSxrQkFBbUIsYUFDcEMsZUFBZSxTQUFTLFFBQ3pCLGFBQWEsZUFBZSxTQUFTLE9BQ3pDLFdBQ0ksT0FBTyxjQUFjLGNBQ3JCLE9BQU8sZUFBZSxRQUFRLFNBQzdCLGlCQUFpQixjQUFjLEdBQ2hDLGVBQWUsZUFBZSxNQUMzQixlQUFlLFNBQVMsU0FDM0IsaUJBQWlCLGNBQWMsR0FDbEMsY0FBYyxlQUFlLGFBQzlCLFNBQVMsZUFDUCxvQkFBb0IsZ0JBQWdCLFlBQVksVUFBVSxHQUMzRCxjQUFjLE1BQ2YsU0FBUyxXQUNQLFNBQVMsUUFBUSxpQkFDakIsU0FBUyxRQUFRLGNBQWMsY0FDOUIsY0FBYyxRQUFRLGNBQWMsVUFBVSxPQUNoRCxXQUFXLE1BQ1osU0FBUyxlQUFlLGlCQUN0QixTQUFTLGVBQWUsY0FBYyxjQUNyQyxXQUFXLGVBQWUsY0FBYyxVQUFVLE9BQ3JELGFBQWEsZ0JBQWdCLGVBQWUsU0FBUyxPQUNyRCxTQUFTLFdBQVcsSUFBSSxjQUFjLGNBQWMsR0FDcEQ7SUFFSixLQUFLLElBQ0gsT0FDRyxjQUFjLE1BQ2YsU0FBUyxZQUFZLGNBQWMsUUFBUSxjQUFjLFFBQ3pELGVBQWUsY0FBYyxVQUFVLGdCQUNwQyxlQUFlLFNBQVMsT0FDM0IsWUFBWSxjQUFjLGNBQWMsR0FDeEMsaUJBQWlCLGNBQWMsR0FDL0I7SUFFSixLQUFLLElBQ0gsT0FBTztJQUNULEtBQUssSUFDSCxPQUNHLGVBQWUsU0FBUyxVQUN6QixpQkFBaUIsY0FBYyxHQUMvQjtHQUVOO0dBQ0EsTUFBTSxNQUNKLCtCQUNFLGVBQWUsTUFDZix5RUFDSjtFQUNGO0VBQ0EsU0FBUyxXQUFXLFNBQVMsZ0JBQWdCO0dBQzNDLGVBQWUsY0FBYztHQUM3QixRQUFRLGVBQWUsS0FBdkI7SUFDRSxLQUFLLEdBQ0gsT0FDRyxVQUFVLGVBQWUsT0FDMUIsVUFBVSxTQUNKLGVBQWUsUUFBUyxVQUFVLFNBQVUsTUFDN0MsZUFBZSxPQUFPLGlCQUFpQixVQUN0Qyx1QkFBdUIsY0FBYyxHQUN2QyxrQkFDQTtJQUVSLEtBQUssR0FDSCxPQUNFLFlBQVksY0FBYyxjQUFjLEdBQ3hDLGlCQUFpQixjQUFjLEdBQzlCLFVBQVUsZUFBZSxPQUMxQixPQUFPLFVBQVUsVUFBVSxPQUFPLFVBQVUsUUFDdEMsZUFBZSxRQUFTLFVBQVUsU0FBVSxLQUM5QyxrQkFDQTtJQUVSLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSyxHQUNILE9BQU8sZUFBZSxjQUFjLEdBQUc7SUFDekMsS0FBSztLQUNILElBQUksU0FBUyxlQUFlLGVBQWU7TUFDekMsbUJBQW1CLGNBQWM7TUFDakMsSUFBSSxTQUFTLGVBQWUsV0FDMUIsTUFBTSxNQUNKLG1HQUNGO01BQ0Ysb0JBQW9CO0tBQ3RCO0tBQ0EsVUFBVSxlQUFlO0tBQ3pCLE9BQU8sVUFBVSxTQUNYLGVBQWUsUUFBUyxVQUFVLFNBQVUsTUFDN0MsZUFBZSxPQUFPLGlCQUFpQixVQUN0Qyx1QkFBdUIsY0FBYyxHQUN2QyxrQkFDQTtJQUNOLEtBQUs7S0FDSCxtQkFBbUIsY0FBYztLQUNqQyxVQUFVLGVBQWU7S0FDekIsSUFBSSxTQUFTLFdBQVcsU0FBUyxRQUFRLFlBQVk7TUFDbkQsSUFBSSxTQUFTLGVBQWUsV0FDMUIsTUFBTSxNQUNKLG1HQUNGO01BQ0Ysb0JBQW9CO0tBQ3RCO0tBQ0EsVUFBVSxlQUFlO0tBQ3pCLE9BQU8sVUFBVSxTQUNYLGVBQWUsUUFBUyxVQUFVLFNBQVUsTUFDN0MsZUFBZSxPQUFPLGlCQUFpQixVQUN0Qyx1QkFBdUIsY0FBYyxHQUN2QyxrQkFDQTtJQUNOLEtBQUssSUFDSCxPQUNFLHVCQUF1QixjQUFjLEdBQ3BDLFVBQVUsZUFBZSxPQUMxQixVQUFVLFNBQ0osZUFBZSxRQUFTLFVBQVUsU0FBVSxLQUM3QyxVQUFVLGVBQWUsZUFDMUIsU0FBUyxZQUNMLFFBQVEsWUFBWSxNQUFRLFFBQVEsT0FBTyxPQUM5QyxlQUFlLFNBQVMsR0FDekIsa0JBQ0E7SUFFUixLQUFLLEdBQ0gsT0FBTyxpQkFBaUIsY0FBYyxHQUFHO0lBQzNDLEtBQUssSUFDSCxPQUFPLFlBQVksZUFBZSxNQUFNLGNBQWMsR0FBRztJQUMzRCxLQUFLO0lBQ0wsS0FBSyxJQUNILE9BQ0UsbUJBQW1CLGNBQWMsR0FDakMsaUJBQWlCLGNBQWMsR0FDL0IsU0FBUyxXQUFXLElBQUksY0FBYyxjQUFjLEdBQ25ELFVBQVUsZUFBZSxPQUMxQixVQUFVLFNBQ0osZUFBZSxRQUFTLFVBQVUsU0FBVSxNQUM3QyxlQUFlLE9BQU8saUJBQWlCLFVBQ3RDLHVCQUF1QixjQUFjLEdBQ3ZDLGtCQUNBO0lBRVIsS0FBSyxJQUNILE9BQU8sWUFBWSxjQUFjLGNBQWMsR0FBRztJQUNwRCxLQUFLLElBQ0gsT0FBTztJQUNULFNBQ0UsT0FBTztHQUNYO0VBQ0Y7RUFDQSxTQUFTLHNCQUFzQixTQUFTLGlCQUFpQjtHQUN2RCxlQUFlLGVBQWU7R0FDOUIsUUFBUSxnQkFBZ0IsS0FBeEI7SUFDRSxLQUFLO0tBQ0gsWUFBWSxjQUFjLGVBQWU7S0FDekMsaUJBQWlCLGVBQWU7S0FDaEM7SUFDRixLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7S0FDSCxlQUFlLGVBQWU7S0FDOUI7SUFDRixLQUFLO0tBQ0gsaUJBQWlCLGVBQWU7S0FDaEM7SUFDRixLQUFLO0tBQ0gsU0FBUyxnQkFBZ0IsaUJBQ3ZCLG1CQUFtQixlQUFlO0tBQ3BDO0lBQ0YsS0FBSztLQUNILG1CQUFtQixlQUFlO0tBQ2xDO0lBQ0YsS0FBSztLQUNILHVCQUF1QixlQUFlO0tBQ3RDO0lBQ0YsS0FBSztLQUNILFlBQVksZ0JBQWdCLE1BQU0sZUFBZTtLQUNqRDtJQUNGLEtBQUs7SUFDTCxLQUFLO0tBQ0gsbUJBQW1CLGVBQWU7S0FDbEMsaUJBQWlCLGVBQWU7S0FDaEMsU0FBUyxXQUFXLElBQUksY0FBYyxlQUFlO0tBQ3JEO0lBQ0YsS0FBSyxJQUNILFlBQVksY0FBYyxlQUFlO0dBQzdDO0VBQ0Y7RUFDQSxTQUFTLGNBQWMsU0FBUztHQUM5QixRQUFRLFFBQVEsT0FBTyxpQkFBaUI7RUFDMUM7RUFDQSxTQUFTLHdCQUF3QixjQUFjLFdBQVc7R0FDeEQsY0FBYyxZQUFZLEtB
15852Q3JCLGlCQUFpQixHQUNsQiwwQkFBMEIsV0FBVyxZQUFZLEdBQ2pELHFCQUFxQixLQUNyQiwwQkFBMEIsV0FBVyxZQUFZO0VBQ3ZEO0VBQ0EsU0FBUywrQkFDUCxjQUNBLHdCQUNBLFdBQ0E7R0FDQSxjQUFjLFlBQVksS0FDckIsaUJBQWlCLEdBQ2xCLDRCQUNFLFdBQ0EsY0FDQSxzQkFDRixHQUNBLHFCQUFxQixLQUNyQiw0QkFDRSxXQUNBLGNBQ0Esc0JBQ0Y7RUFDTjtFQUNBLFNBQVMsMEJBQTBCLE9BQU8sY0FBYztHQUN0RCxJQUFJO0lBQ0YsSUFBSSxjQUFjLGFBQWEsYUFDN0IsYUFBYSxTQUFTLGNBQWMsWUFBWSxhQUFhO0lBQy9ELElBQUksU0FBUyxZQUFZO0tBQ3ZCLElBQUksY0FBYyxXQUFXO0tBQzdCLGNBQWM7S0FDZCxHQUFHO01BQ0QsS0FDRyxZQUFZLE1BQU0sV0FBVyxVQUM1QixhQUFhLEtBQUssSUFDbkIsUUFBUSxlQUFlLFlBQ3JCLDJCQUEyQixDQUFDLElBQzlCLGFBQWEsa0JBQ1osY0FDQSxpQkFDQSxXQUNGLElBQ0MsUUFBUSxlQUFlLFlBQ3JCLDJCQUEyQixDQUFDLElBQy9CLEtBQUssTUFBTSxjQUFjLGVBQWUsT0FBTyxhQUMvQztPQUNBLElBQUksV0FBVyxLQUFLO09BQ3BCLFdBQ0UsT0FBTyxZQUFZLE1BQU0sVUFDckIsb0JBQ0EsT0FBTyxZQUFZLE1BQU0sYUFDdkIsdUJBQ0E7T0FDUixJQUFJLFdBQVcsS0FBSztPQUNwQixXQUNFLFNBQVMsYUFDTCxpR0FDQSxlQUFlLE9BQU8sV0FBVyxPQUMvQixpQ0FDQSxXQUNBLCtIQUNBLFdBQ0EsbVRBQ0Esb0JBQW9CO09BQzVCLGtCQUNFLGNBQ0EsU0FBVSxHQUFHLEdBQUc7UUFDZCxRQUFRLE1BQ04saUZBQ0EsR0FDQSxDQUNGO09BQ0YsR0FDQSxVQUNBLFFBQ0Y7TUFDRjtNQUNBLGNBQWMsWUFBWTtLQUM1QixTQUFTLGdCQUFnQjtJQUMzQjtHQUNGLFNBQVMsT0FBTztJQUNkLHdCQUF3QixjQUFjLGFBQWEsUUFBUSxLQUFLO0dBQ2xFO0VBQ0Y7RUFDQSxTQUFTLDRCQUNQLE9BQ0EsY0FDQSx3QkFDQTtHQUNBLElBQUk7SUFDRixJQUFJLGNBQWMsYUFBYSxhQUM3QixhQUFhLFNBQVMsY0FBYyxZQUFZLGFBQWE7SUFDL0QsSUFBSSxTQUFTLFlBQVk7S0FDdkIsSUFBSSxjQUFjLFdBQVc7S0FDN0IsY0FBYztLQUNkLEdBQUc7TUFDRCxLQUFLLFlBQVksTUFBTSxXQUFXLE9BQU87T0FDdkMsSUFBSSxPQUFPLFlBQVksTUFDckIsVUFBVSxLQUFLO09BQ2pCLEtBQUssTUFBTSxZQUNQLEtBQUssVUFBVSxLQUFLLElBQ3JCLFFBQVEsZUFBZSxZQUNyQiwyQkFBMkIsQ0FBQyxJQUM5QixhQUFhLGNBQ2Qsa0JBQ0UsWUFDQSxrQkFDQSxZQUNBLHdCQUNBLE9BQ0YsSUFDQyxRQUFRLGVBQWUsWUFDckIsMkJBQTJCLENBQUM7TUFDbkM7TUFDQSxjQUFjLFlBQVk7S0FDNUIsU0FBUyxnQkFBZ0I7SUFDM0I7R0FDRixTQUFTLE9BQU87SUFDZCx3QkFBd0IsY0FBYyxhQUFhLFFBQVEsS0FBSztHQUNsRTtFQUNGO0VBQ0EsU0FBUyw4QkFBOEIsY0FBYyxXQUFXO0dBQzlELGNBQWMsWUFBWSxLQUNyQixpQkFBaUIsR0FDbEIsMEJBQTBCLFdBQVcsWUFBWSxHQUNqRCxxQkFBcUIsS0FDckIsMEJBQTBCLFdBQVcsWUFBWTtFQUN2RDtFQUNBLFNBQVMsZ0NBQ1AsY0FDQSx3QkFDQSxXQUNBO0dBQ0EsY0FBYyxZQUFZLEtBQ3JCLGlCQUFpQixHQUNsQiw0QkFDRSxXQUNBLGNBQ0Esc0JBQ0YsR0FDQSxxQkFBcUIsS0FDckIsNEJBQ0UsV0FDQSxjQUNBLHNCQUNGO0VBQ047RUFDQSxTQUFTLHFCQUFxQixjQUFjO0dBQzFDLElBQUksY0FBYyxhQUFhO0dBQy9CLElBQUksU0FBUyxhQUFhO0lBQ3hCLElBQUksV0FBVyxhQUFhO0lBQzVCLGFBQWEsS0FBSyxnQkFDaEIsU0FBUyxhQUFhLGlCQUN0QixpQ0FDQyxTQUFTLFVBQVUsYUFBYSxpQkFDL0IsUUFBUSxNQUNOLDhNQUNBLDBCQUEwQixZQUFZLEtBQUssVUFDN0MsR0FDRixTQUFTLFVBQVUsYUFBYSxpQkFDOUIsUUFBUSxNQUNOLDhNQUNBLDBCQUEwQixZQUFZLEtBQUssVUFDN0M7SUFDSixJQUFJO0tBQ0Ysa0JBQ0UsY0FDQSxpQkFDQSxhQUNBLFFBQ0Y7SUFDRixTQUFTLE9BQU87S0FDZCx3QkFBd0IsY0FBYyxhQUFhLFFBQVEsS0FBSztJQUNsRTtHQUNGO0VBQ0Y7RUFDQSxTQUFTLDZCQUE2QixVQUFVLFdBQVcsV0FBVztHQUNwRSxPQUFPLFNBQVMsd0JBQXdCLFdBQVcsU0FBUztFQUM5RDtFQUNBLFNBQVMsb0JBQW9CLGNBQWMsU0FBUztHQUNsRCxJQUFJLFlBQVksUUFBUSxlQUN0QixZQUFZLFFBQVE7R0FDdEIsVUFBVSxhQUFhO0dBQ3ZCLGFBQWEsS0FBSyxnQkFDaEIsU0FBUyxhQUFhLGlCQUN0QixpQ0FDQyxRQUFRLFVBQVUsYUFBYSxpQkFDOUIsUUFBUSxNQUNOLDBNQUNBLDBCQUEwQixZQUFZLEtBQUssVUFDN0MsR0FDRixRQUFRLFVBQVUsYUFBYSxpQkFDN0IsUUFBUSxNQUNOLDBNQUNBLDBCQUEwQixZQUFZLEtBQUssVUFDN0M7R0FDSixJQUFJO0lBQ0YsSUFBSSxvQkFBb0IsMkJBQ3RCLGFBQWEsTUFDYixTQUNGO0lBQ0EsSUFBSSxXQUFXLGtCQUNiLGNBQ0EsOEJBQ0EsU0FDQSxtQkFDQSxTQUNGO0lBQ0EsWUFBWTtJQUNaLEtBQUssTUFBTSxZQUNULFVBQVUsSUFBSSxhQUFhLElBQUksTUFDOUIsVUFBVSxJQUFJLGFBQWEsSUFBSSxHQUNoQyxrQkFBa0IsY0FBYyxXQUFZO0tBQzFDLFFBQVEsTUFDTiwyR0FDQSwwQkFBMEIsWUFBWSxDQUN4QztJQUNGLENBQUM7SUFDSCxRQUFRLHNDQUFzQztHQUNoRCxTQUFTLE9BQU87SUFDZCx3QkFBd0IsY0FBYyxhQUFhLFFBQVEsS0FBSztHQUNsRTtFQUNGO0VBQ0EsU0FBUywrQkFDUCxTQUNBLHdCQUNBLFVBQ0E7R0FDQSxTQUFTLFFBQVEsMkJBQ2YsUUFBUSxNQUNSLFFBQVEsYUFDVjtHQUNBLFNBQVMsUUFBUSxRQUFRO0dBQ3pCLGNBQWMsT0FBTyxLQUNoQixpQkFBaUIsR0FDbEIsa0JBQ0UsU0FDQSwrQkFDQSxTQUNBLHdCQUNBLFFBQ0YsR0FDQSxxQkFBcUIsS0FDckIsa0JBQ0UsU0FDQSwrQkFDQSxTQUNBLHdCQUNBLFFBQ0Y7RUFDTjtFQUNBLFNBQVMsZ0JBQWdCLGNBQWM7R0FDckMsSUFBSSxNQUFNLGFBQWE7R0FDdkIsSUFBSSxTQUFTLEtBQUs7SUFDaEIsUUFBUSxhQUFhLEtBQXJCO0tBQ0UsS0FBSztLQUNMLEtBQUs7S0FDTCxLQUFLO01BQ0gsSUFBSSxnQkFBZ0IsYUFBYTtNQUNqQztLQUNGLEtBQUs7TUFDSCxnQkFBZ0IsYUFBYTtNQUM3QixJQUFJLE9BQU8sc0JBQ1QsYUFBYSxlQUNiLGFBQ0Y7TUFDQSxJQUFJLFNBQVMsY0FBYyxPQUFPLGNBQWMsSUFBSSxTQUFTLE1BQzNELGNBQWMsTUFBTSw2QkFBNkIsSUFBSTtNQUN2RCxnQkFBZ0IsY0FBYztNQUM5QjtLQUNGLEtBQUs7TUFDSCxTQUFTLGFBQWEsY0FDbEIsZ0JBQWdCLElBQUksaUJBQWlCLFlBQVksR0FDbkQsMENBQ0UsY0FDQSwwQkFDQSxhQUNGLEdBQ0MsYUFBYSxZQUFZO01BQzVCLGdCQUFnQixhQUFhO01BQzdCO0tBQ0YsU0FDRSxnQkFBZ0IsYUFBYTtJQUNqQztJQUNBLElBQUksZUFBZSxPQUFPLEtBQ3hCLElBQUksY0FBYyxZQUFZLEd
15852BQzVCLElBQUk7S0FDRixpQkFBaUIsR0FDZCxhQUFhLGFBQWEsSUFBSSxhQUFhO0lBQ2hELFVBQVU7S0FDUixxQkFBcUI7SUFDdkI7U0FDRyxhQUFhLGFBQWEsSUFBSSxhQUFhO1NBRWhELGFBQWEsT0FBTyxNQUNoQixRQUFRLE1BQU0sc0NBQXNDLElBQ3BELElBQUksZUFBZSxTQUFTLEtBQzVCLFFBQVEsTUFDTixpR0FDQSwwQkFBMEIsWUFBWSxDQUN4QyxHQUNELElBQUksVUFBVTtHQUNyQjtFQUNGO0VBQ0EsU0FBUyxnQkFBZ0IsU0FBUyx3QkFBd0I7R0FDeEQsSUFBSTtJQUNGLGtCQUFrQixTQUFTLGlCQUFpQixPQUFPO0dBQ3JELFNBQVMsT0FBTztJQUNkLHdCQUF3QixTQUFTLHdCQUF3QixLQUFLO0dBQ2hFO0VBQ0Y7RUFDQSxTQUFTLGdCQUFnQixTQUFTLHdCQUF3QjtHQUN4RCxJQUFJLE1BQU0sUUFBUSxLQUNoQixhQUFhLFFBQVE7R0FDdkIsSUFBSSxTQUFTLEtBQ1gsSUFBSSxlQUFlLE9BQU8sWUFDeEIsSUFBSTtJQUNGLElBQUksY0FBYyxPQUFPLEdBQ3ZCLElBQUk7S0FDRixpQkFBaUIsR0FBRyxrQkFBa0IsU0FBUyxVQUFVO0lBQzNELFVBQVU7S0FDUixxQkFBcUIsT0FBTztJQUM5QjtTQUNHLGtCQUFrQixTQUFTLFVBQVU7R0FDNUMsU0FBUyxPQUFPO0lBQ2Qsd0JBQXdCLFNBQVMsd0JBQXdCLEtBQUs7R0FDaEUsVUFBVTtJQUNSLFFBQVMsYUFBYSxNQUNuQixVQUFVLFFBQVEsV0FDbkIsUUFBUSxZQUFZLFFBQVEsYUFBYTtHQUM3QztRQUNHLElBQUksZUFBZSxPQUFPLEtBQzdCLElBQUk7SUFDRixJQUFJLGNBQWMsT0FBTyxHQUN2QixJQUFJO0tBQ0YsaUJBQWlCLEdBQUcsa0JBQWtCLFNBQVMsS0FBSyxJQUFJO0lBQzFELFVBQVU7S0FDUixxQkFBcUIsT0FBTztJQUM5QjtTQUNHLGtCQUFrQixTQUFTLEtBQUssSUFBSTtHQUMzQyxTQUFTLFNBQVM7SUFDaEIsd0JBQXdCLFNBQVMsd0JBQXdCLE9BQU87R0FDbEU7UUFDRyxJQUFJLFVBQVU7RUFDdkI7RUFDQSxTQUFTLGVBQ1AsY0FDQSxTQUNBLGlCQUNBLGdCQUNBO0dBQ0EsSUFBSSx3QkFBd0IsYUFBYSxlQUN2QyxLQUFLLHNCQUFzQixJQUMzQixXQUFXLHNCQUFzQjtHQUNuQyx3QkFBd0Isc0JBQXNCO0dBQzlDLFVBQVUsU0FBUyxVQUFVLFVBQVU7R0FDdkMsMEJBQTBCLFVBQVU7R0FDcEMsZUFBZSxPQUFPLHlCQUNwQixzQkFDRSxJQUNBLFNBQ0EsYUFBYSxnQkFDYixhQUFhLGtCQUNiLGFBQWEsaUJBQ2IsZUFDRjtHQUNGLGVBQWUsT0FBTyxZQUNwQixTQUFTLElBQUksU0FBUyxnQkFBZ0IsZUFBZTtFQUN6RDtFQUNBLFNBQVMsNkJBQ1AsY0FDQSxTQUNBLGlCQUNBLHVCQUNBO0dBQ0EsSUFBSSx5QkFBeUIsYUFBYTtHQUMxQyxlQUFlLHVCQUF1QjtHQUN0Qyx5QkFBeUIsdUJBQXVCO0dBQ2hELFVBQVUsU0FBUyxVQUFVLFVBQVU7R0FDdkMsMEJBQTBCLFVBQVU7R0FDcEMsZUFBZSxPQUFPLDBCQUNwQix1QkFDRSxjQUNBLFNBQ0EsdUJBQ0EsZUFDRjtFQUNKO0VBQ0EsU0FBUyxrQ0FBa0MsT0FBTyx5QkFBeUI7R0FDekUsS0FDRyxNQUFNLE1BQU0sT0FBTyxPQUFPLE1BQU0sT0FBTyxNQUFNLE1BQU0sUUFDcEQsU0FBUyxNQUFNLGFBQ2YsU0FBUyx5QkFFVCxLQUFLLElBQUksSUFBSSxHQUFHLElBQUksd0JBQXdCLFFBQVEsS0FDbEQsaUNBQ0UsTUFBTSxXQUNOLHdCQUF3QixFQUMxQjtFQUNOO0VBQ0EsU0FBUyx1Q0FBdUMsT0FBTztHQUNyRCxLQUFLLElBQUksU0FBUyxNQUFNLFFBQVEsU0FBUyxTQUFVO0lBQ2pELHlCQUF5QixNQUFNLEtBQzdCLGlDQUFpQyxNQUFNLFdBQVcsT0FBTyxTQUFTO0lBQ3BFLElBQUksK0JBQStCLE1BQU0sR0FBRztJQUM1QyxTQUFTLE9BQU87R0FDbEI7RUFDRjtFQUNBLFNBQVMsc0NBQXNDLE9BQU87R0FDcEQsS0FBSyxJQUFJLFNBQVMsTUFBTSxRQUFRLFNBQVMsU0FBVTtJQUNqRCx5QkFBeUIsTUFBTSxLQUM3QixnQ0FBZ0MsTUFBTSxXQUFXLE9BQU8sU0FBUztJQUNuRSxJQUFJLCtCQUErQixNQUFNLEdBQUc7SUFDNUMsU0FBUyxPQUFPO0dBQ2xCO0VBQ0Y7RUFDQSxTQUFTLCtCQUErQixPQUFPO0dBQzdDLE9BQU8sTUFBTSxNQUFNLE9BQU8sTUFBTSxNQUFNLE9BQU8sT0FBTyxNQUFNO0VBQzVEO0VBQ0EsU0FBUyx5QkFBeUIsT0FBTztHQUN2QyxPQUFPLFNBQVMsTUFBTSxNQUFNLE9BQU8sU0FBUyxNQUFNO0VBQ3BEO0VBQ0EsU0FBUyxnQkFBZ0IsY0FBYztHQUNyQyxJQUFJLE9BQU8sYUFBYSxNQUN0QixRQUFRLGFBQWEsZUFDckIsV0FBVyxhQUFhO0dBQzFCLElBQUk7SUFDRixrQkFDRSxjQUNBLGFBQ0EsVUFDQSxNQUNBLE9BQ0EsWUFDRjtHQUNGLFNBQVMsT0FBTztJQUNkLHdCQUF3QixjQUFjLGFBQWEsUUFBUSxLQUFLO0dBQ2xFO0VBQ0Y7RUFDQSxTQUFTLGlCQUFpQixjQUFjLFVBQVUsVUFBVTtHQUMxRCxJQUFJO0lBQ0Ysa0JBQ0UsY0FDQSxjQUNBLGFBQWEsV0FDYixhQUFhLE1BQ2IsVUFDQSxVQUNBLFlBQ0Y7R0FDRixTQUFTLE9BQU87SUFDZCx3QkFBd0IsY0FBYyxhQUFhLFFBQVEsS0FBSztHQUNsRTtFQUNGO0VBQ0EsU0FBUyxhQUFhLE9BQU87R0FDM0IsT0FDRSxNQUFNLE1BQU0sT0FDWixNQUFNLE1BQU0sT0FDWixPQUFPLE1BQU0sT0FDWixPQUFPLE1BQU0sT0FBTyxpQkFBaUIsTUFBTSxJQUFJLEtBQ2hELE1BQU0sTUFBTTtFQUVoQjtFQUNBLFNBQVMsZUFBZSxPQUFPO0dBQzdCLEdBQUcsU0FBUztJQUNWLE9BQU8sU0FBUyxNQUFNLFVBQVc7S0FDL0IsSUFBSSxTQUFTLE1BQU0sVUFBVSxhQUFhLE1BQU0sTUFBTSxHQUFHLE9BQU87S0FDaEUsUUFBUSxNQUFNO0lBQ2hCO0lBQ0EsTUFBTSxRQUFRLFNBQVMsTUFBTTtJQUM3QixLQUNFLFFBQVEsTUFBTSxTQUNkLE1BQU0sTUFBTSxPQUFPLE1BQU0sTUFBTSxPQUFPLE9BQU8sTUFBTSxNQUVuRDtLQUNBLElBQUksT0FBTyxNQUFNLE9BQU8saUJBQWlCLE1BQU0sSUFBSSxHQUFHLFNBQVM7S0FDL0QsSUFBSSxNQUFNLFFBQVEsR0FBRyxTQUFTO0tBQzlCLElBQUksU0FBUyxNQUFNLFNBQVMsTUFBTSxNQUFNLEtBQUssU0FBUztVQUNqRCxNQUFPLE1BQU0sU0FBUyxPQUFTLFFBQVEsTUFBTTtJQUNwRDtJQUNBLElBQUksRUFBRSxNQUFNLFFBQVEsSUFBSSxPQUFPLE1BQU07R0FDdkM7RUFDRjtFQUNBLFNBQVMseUNBQ1AsTUFDQSxRQUNBLFFBQ0EseUJBQ0E7R0FDQSxJQUFJLE1BQU0sS0FBSztHQUNmLElBQUksTUFBTSxPQUFPLE1BQU0sS0FDckIsTUFBTyxLQUFLLFdBQ1YsVUFDSyw2QkFBNkIsTUFBTSxJQUNuQyxNQUFNLE9BQU8sV0FDVixPQUFPLE9BQ1AsV0FBVyxPQUFPLFdBQ2hCLE9BQU8sY0FBYyxPQUNyQixPQUFBLENBQ0osYUFBYSxLQUFLLE1BQU0sTUFDekIsNkJBQTZCLE1BQU0sR0FDbkMsU0FDQyxNQUFNLE9BQU8sV0FDVCxPQUFPLE9BQ1AsV0FBVyxPQUFPLFdBQ2hCLE9BQU8sY0FBYyxPQUNyQixRQUNSLE9BQU8sWUFBWSxHQUFHLEdBQ3JCLE1BQU0sT0FBTyxxQkFDYixTQUFTLE9BQU8sS0FBSyxNQUFNLE9BQzFCLFNBQVMsT0FBTyxZQUNmLE9BQU8sVUFBVSxVQUN4QixrQ0FBa0MsTUFBTSx1QkFBdUIsR0FDOUQsZ0NBQWdDLENBQUM7UUFDakMsSUFDSCxNQUFNLFFBQ0wsT0FBTyxRQUNMLGtDQUFrQyxNQUFNLHVCQUF1QixHQUMvRCwwQkFBMEIsTUFDM0IsaUJBQWlCLEtBQUssSUFBSSxNQUN0QixTQUFTLEtBQUssV0FBYSxTQUFTLFFBQ3pDLE9BQU8sS0FBSyxPQUNiLFNBQVMsT0FFVCxLQUNFLHlDQUNFLE1BQ0EsUUFDQSxRQUNBLHVCQUNGLEdBQ0UsT0FBTyxLQUFLLFNBQ2QsU0FBUyxPQUdULHlDQUNFLE1BQ0EsUUFDQSxRQUNBLHVCQUNGLEdBQ0csT0FBTyxLQUFLO0VBQ3JCO0VBQ0EsU0FBUyw0QkFDUCxNQUNBLFFBQ0EsUUFDQSx5QkFDQTtH
15852QUNBLElBQUksTUFBTSxLQUFLO0dBQ2YsSUFBSSxNQUFNLE9BQU8sTUFBTSxLQUNyQixNQUFPLEtBQUssV0FDVixTQUFTLE9BQU8sYUFBYSxLQUFLLE1BQU0sSUFBSSxPQUFPLFlBQVksR0FBRyxHQUNsRSxrQ0FBa0MsTUFBTSx1QkFBdUIsR0FDOUQsZ0NBQWdDLENBQUM7UUFDakMsSUFDSCxNQUFNLFFBQ0wsT0FBTyxRQUNMLGtDQUFrQyxNQUFNLHVCQUF1QixHQUMvRCwwQkFBMEIsTUFDM0IsaUJBQWlCLEtBQUssSUFBSSxNQUFNLFNBQVMsS0FBSyxhQUMvQyxPQUFPLEtBQUssT0FDYixTQUFTLE9BRVQsS0FDRSw0QkFDRSxNQUNBLFFBQ0EsUUFDQSx1QkFDRixHQUNFLE9BQU8sS0FBSyxTQUNkLFNBQVMsT0FHVCw0QkFDRSxNQUNBLFFBQ0EsUUFDQSx1QkFDRixHQUNHLE9BQU8sS0FBSztFQUNyQjtFQUNBLFNBQVMsZ0JBQWdCLGNBQWM7R0FDckMsS0FDRSxJQUFJLGlCQUFpQixjQUFjLGFBQWEsUUFDaEQsU0FBUyxjQUVUO0lBQ0EsSUFBSSxhQUFhLFdBQVcsR0FBRztLQUM3QixrQkFBa0I7S0FDbEI7SUFDRjtJQUNBLGNBQWMsWUFBWTtHQUM1QjtHQUNBLGNBQWM7R0FDZCxLQUFLLElBQUksU0FBUyxhQUFhLFFBQVEsU0FBUyxTQUFVO0lBQ3hELElBQUkseUJBQXlCLE1BQU0sR0FBRztLQUNwQyxJQUFJLG1CQUFtQixPQUFPO0tBQzlCLFNBQVMsY0FDSixjQUFjLENBQUMsZ0JBQWdCLElBQ2hDLFlBQVksS0FBSyxnQkFBZ0I7SUFDdkM7SUFDQSxJQUFJLCtCQUErQixNQUFNLEdBQUc7SUFDNUMsU0FBUyxPQUFPO0dBQ2xCO0dBQ0EsSUFBSSxRQUFRLGlCQUNWLE1BQU0sTUFDSixzR0FDRjtHQUNGLFFBQVEsZ0JBQWdCLEtBQXhCO0lBQ0UsS0FBSztLQUNILGtCQUFrQixnQkFBZ0I7S0FDbEMsU0FBUyxlQUFlLFlBQVk7S0FDcEMsNEJBQ0UsY0FDQSxRQUNBLGlCQUNBLFdBQ0Y7S0FDQTtJQUNGLEtBQUs7S0FDSCxTQUFTLGdCQUFnQjtLQUN6QixnQkFBZ0IsUUFBUSxPQUNyQixpQkFBaUIsTUFBTSxHQUFJLGdCQUFnQixTQUFTO0tBQ3ZELGtCQUFrQixlQUFlLFlBQVk7S0FDN0MsNEJBQ0UsY0FDQSxpQkFDQSxRQUNBLFdBQ0Y7S0FDQTtJQUNGLEtBQUs7SUFDTCxLQUFLO0tBQ0gsa0JBQWtCLGdCQUFnQixVQUFVO0tBQzVDLFNBQVMsZUFBZSxZQUFZO0tBQ3BDLHlDQUNFLGNBQ0EsUUFDQSxpQkFDQSxXQUNGO0tBQ0E7SUFDRixTQUNFLE1BQU0sTUFDSixpR0FDRjtHQUNKO0VBQ0Y7RUFDQSxTQUFTLCtCQUErQixjQUFjO0dBQ3BELElBQUksWUFBWSxhQUFhLFdBQzNCLFFBQVEsYUFBYTtHQUN2QixJQUFJO0lBQ0Ysa0JBQ0UsY0FDQSwwQkFDQSxhQUFhLE1BQ2IsT0FDQSxXQUNBLFlBQ0Y7R0FDRixTQUFTLE9BQU87SUFDZCx3QkFBd0IsY0FBYyxhQUFhLFFBQVEsS0FBSztHQUNsRTtFQUNGO0VBQ0EsU0FBUywwQkFBMEIsV0FBVztHQUM1QyxJQUFJLE9BQU8sVUFBVSxPQUFPLE9BQU8sVUFBVSxlQUFlLFdBQzFELDRCQUE0QixDQUFDO0VBQ2pDO0VBQ0EsU0FBUyxvQ0FBb0M7R0FDM0MsSUFBSSxlQUFlO0dBQ25CLG1DQUFtQztHQUNuQyxPQUFPO0VBQ1Q7RUFDQSxTQUFTLG1DQUNQLE9BQ0EsTUFDQSxXQUNBLHFCQUNBLDZCQUNBO0dBQ0EsZ0NBQWdDO0dBQ2hDLENBQUMsT0FBTyw0Q0FDTixNQUFNLE9BQ04sTUFDQSxXQUNBLHFCQUNBLDJCQUNGLE1BQ0UsUUFBUSxNQUFNLGNBQ2QsU0FBUyxrQkFDUixnQkFBZ0IsTUFBTTtHQUN6QixPQUFPO0VBQ1Q7RUFDQSxTQUFTLDRDQUNQLE9BQ0EsTUFDQSxXQUNBLHFCQUNBLDZCQUNBO0dBQ0EsS0FBSyxJQUFJLGFBQWEsQ0FBQyxHQUFHLFNBQVMsUUFBUztJQUMxQyxJQUFJLE1BQU0sTUFBTSxLQUFLO0tBQ25CLElBQUksWUFBWSxNQUFNO0tBQ3RCLElBQUksU0FBUyxxQkFBcUI7TUFDaEMsSUFBSSxjQUFjLGdCQUFnQixTQUFTO01BQzNDLG9CQUFvQixLQUFLLFdBQVc7TUFDcEMsWUFBWSxTQUFTLGFBQWEsQ0FBQztLQUNyQyxPQUNFLGNBQ0csZ0JBQWdCLFNBQVMsQ0FBQyxDQUFDLFNBQVMsYUFBYSxDQUFDO0tBQ3ZELDRCQUE0QixDQUFDO0tBQzdCLHdCQUNFLFdBQ0EsTUFBTSxnQ0FDRixPQUNBLE9BQU8sTUFBTSwrQkFDakIsU0FDRjtLQUNBO0lBQ0YsT0FBTyxJQUFJLE9BQU8sTUFBTSxPQUFPLFNBQVMsTUFBTSxlQUM1QyxPQUFRLE1BQU0sT0FBTywrQkFDbEIsNENBQ0MsTUFBTSxPQUNOLE1BQ0EsV0FDQSxxQkFDQSwyQkFDRixNQUNHLGFBQWEsQ0FBQztJQUNyQixRQUFRLE1BQU07R0FDaEI7R0FDQSxPQUFPO0VBQ1Q7RUFDQSxTQUFTLHFDQUNQLE9BQ0EsNkJBQ0E7R0FDQSxPQUFPLFNBQVMsUUFBUztJQUN2QixJQUFJLE1BQU0sTUFBTSxLQUNkLDBCQUEwQixNQUFNLFdBQVcsTUFBTSxhQUFhO1NBQzNELElBQUksT0FBTyxNQUFNLE9BQU8sU0FBUyxNQUFNLGVBQzFDLE9BQVEsTUFBTSxPQUFPLCtCQUNuQixxQ0FDRSxNQUFNLE9BQ04sMkJBQ0Y7SUFDSixRQUFRLE1BQU07R0FDaEI7RUFDRjtFQUNBLFNBQVMsbUNBQW1DLFdBQVc7R0FDckQsSUFBSSxPQUFPLFVBQVUsZUFBZSxXQUNsQyxLQUFLLFlBQVksVUFBVSxPQUFPLFNBQVMsWUFBYTtJQUN0RCxJQUFJLE9BQU8sVUFBVSxPQUFPLFNBQVMsVUFBVSxlQUUxQztTQUFBLG1DQUFtQyxTQUFTLEdBQzdDLE9BQU8sVUFBVSxPQUNmLE9BQU8sVUFBVSxRQUFRLGFBQ3pCLFVBQVUsVUFBVSxRQUN0QjtNQUNBLElBQUksUUFBUSxVQUFVO01BQ3RCLElBQUksUUFBUSxNQUFNLFFBQVEsV0FBVyxNQUFNLE1BQ3pDLE1BQU0sTUFDSix5REFDRjtNQUNGLElBQUksT0FBTyxNQUFNO01BQ2pCLFFBQVEsMkJBQTJCLE1BQU0sU0FBUyxNQUFNLEtBQUs7TUFDN0QsV0FBVyxVQUNSLG1DQUNDLFdBQ0EsTUFDQSxPQUNBLE1BQ0EsQ0FBQyxDQUNILEtBQ0UscUNBQXFDLFVBQVUsT0FBTyxDQUFDLENBQUM7S0FDOUQ7O0lBQ0YsWUFBWSxVQUFVO0dBQ3hCO0VBQ0o7RUFDQSxTQUFTLDJCQUEyQixXQUFXLFNBQVM7R0FDdEQsSUFBSSxPQUFPLFVBQVUsS0FBSztJQUN4QixJQUFJLFFBQVEsVUFBVSxXQUNwQixRQUFRLFVBQVUsZUFDbEIsT0FBTyxzQkFBc0IsT0FBTyxLQUFLLEdBQ3pDLFlBQVksMkJBQ1YsTUFBTSxTQUNOLE1BQU0sU0FBUyxNQUFNLFFBQVEsTUFBTSxLQUNyQztJQUNGLFdBQVcsWUFDUCxtQ0FDRSxXQUNBLE1BQ0EsV0FDQSxNQUNBLENBQUMsQ0FDSCxLQUNHLG1DQUFtQyxTQUFTLEdBQzdDLE1BQU0sVUFDSixXQUNBLDRCQUE0QixXQUFXLE1BQU0sT0FBTyxLQUN0RCxxQ0FBcUMsVUFBVSxPQUFPLENBQUMsQ0FBQyxJQUMxRCxtQ0FBbUMsU0FBUztHQUNsRCxPQUFPLElBQUksT0FBTyxVQUFVLGVBQWUsV0FDekMsS0FBSyxZQUFZLFVBQVUsT0FBTyxTQUFTLFlBQ3pDLDJCQUEyQixXQUFXLE9BQU8sR0FDMUMsWUFBWSxVQUFVO1FBQ3hCLG1DQUFtQyxTQUFTO0VBQ25EO0VBQ0EsU0FBUyxpQ0FBaUMsVUFBVTtHQUNsRCxJQUNFLFNBQVMsNEJBQ1QsTUFBTSx5QkFBeUIsTUFDL0I7SUFDQSxJQUFJLFFBQVE7SUFDWixJQUFJLE9BQU8sU0FBUyxlQUFlLFdBQ2pDLEtB
15852QUssV0FBVyxTQUFTLE9BQU8sU0FBUyxXQUFZO0tBQ25ELElBQUksT0FBTyxTQUFTLE9BQU8sU0FBUyxTQUFTLGVBQWU7TUFDMUQsSUFBSSxPQUFPLFNBQVMsT0FBTyxPQUFPLFNBQVMsUUFBUSxXQUFXO09BQzVELElBQUksUUFBUSxTQUFTLGVBQ25CLE9BQU8sTUFBTTtPQUNmLElBQUksUUFBUSxRQUFRLFdBQVcsTUFBTTtRQUNuQyxJQUFJLE9BQU8sTUFBTSxJQUFJLElBQUk7UUFDekIsSUFBSSxLQUFLLE1BQU0sTUFBTTtTQUNuQixJQUFJLFlBQVksMkJBQ2QsTUFBTSxTQUNOLE1BQU0sS0FDUjtTQUNBLFdBQVcsY0FDUixtQ0FDQyxVQUNBLE1BQ0EsV0FDQSxNQUNBLENBQUMsQ0FDSCxLQUNNLFlBQVksU0FBUyxXQUN0QixLQUFLLFNBQVMsV0FDZCxVQUFVLFNBQVMsTUFDcEIsNEJBQTRCLFVBQVUsTUFBTSxPQUFPLEtBQ25ELHFDQUNFLFNBQVMsT0FDVCxDQUFDLENBQ0g7U0FDTixNQUFNLE9BQU8sSUFBSTtTQUNqQixJQUFJLE1BQU0sTUFBTSxNQUFNO1FBQ3hCO09BQ0Y7TUFDRjtNQUNBLGlDQUFpQyxRQUFRO0tBQzNDO0tBQ0EsV0FBVyxTQUFTO0lBQ3RCO0dBQ0o7RUFDRjtFQUNBLFNBQVMsMEJBQTBCLFVBQVU7R0FDM0MsSUFBSSxPQUFPLFNBQVMsS0FBSztJQUN2QixJQUFJLFFBQVEsU0FBUyxlQUNuQixPQUFPLHNCQUFzQixPQUFPLFNBQVMsU0FBUyxHQUN0RCxPQUNFLFNBQVMsMkJBQ0wseUJBQXlCLElBQUksSUFBSSxJQUNqQyxLQUFLLEdBQ1gsWUFBWSwyQkFDVixNQUFNLFNBQ04sS0FBSyxNQUFNLE9BQU8sTUFBTSxRQUFRLE1BQU0sSUFDeEM7SUFDRixXQUFXLGNBQ1IsbUNBQ0MsVUFDQSxNQUNBLFdBQ0EsTUFDQSxDQUFDLENBQ0gsSUFDSSxLQUFLLE1BQU0sUUFDUCxZQUFZLFNBQVMsV0FDdEIsS0FBSyxTQUFTLFdBQ2QsVUFBVSxTQUFTLE1BQ3BCLHlCQUF5QixPQUFPLElBQUksR0FDcEMsNEJBQTRCLFVBQVUsTUFBTSxPQUFPLEtBQ25ELDRCQUE0QixVQUFVLE1BQU0sTUFBTSxJQUNwRCxxQ0FBcUMsU0FBUyxPQUFPLENBQUMsQ0FBQztJQUM3RCxTQUFTLDRCQUNQLGlDQUFpQyxRQUFRO0dBQzdDLE9BQU8sSUFBSSxPQUFPLFNBQVMsZUFBZSxXQUN4QyxLQUFLLFdBQVcsU0FBUyxPQUFPLFNBQVMsV0FDdkMsMEJBQTBCLFFBQVEsR0FBSSxXQUFXLFNBQVM7UUFFNUQsU0FBUyw0QkFDUCxpQ0FBaUMsUUFBUTtFQUMvQztFQUNBLFNBQVMsNEJBQTRCLGVBQWU7R0FDbEQsS0FBSyxnQkFBZ0IsY0FBYyxPQUFPLFNBQVMsZ0JBQWlCO0lBQ2xFLElBQUksT0FBTyxjQUFjLEtBQUs7S0FDNUIsSUFBSSxRQUFRLGNBQWMsZUFDeEIsT0FBTyxzQkFBc0IsT0FBTyxjQUFjLFNBQVM7S0FDN0QsUUFBUSwyQkFBMkIsTUFBTSxTQUFTLE1BQU0sTUFBTTtLQUM5RCxjQUFjLFNBQVM7S0FDdkIsV0FBVyxTQUNULG1DQUNFLGVBQ0EsTUFDQSxPQUNDLGNBQWMsZ0JBQWdCLENBQUMsR0FDaEMsQ0FBQyxDQUNIO0lBQ0osT0FDRSxPQUFPLGNBQWMsZUFBZSxhQUNsQyw0QkFBNEIsYUFBYTtJQUM3QyxnQkFBZ0IsY0FBYztHQUNoQztFQUNGO0VBQ0EsU0FBUyw2QkFBNkIsUUFBUTtHQUM1QyxJQUFJLE9BQU8sT0FBTyxlQUFlLFdBQy9CLEtBQUssU0FBUyxPQUFPLE9BQU8sU0FBUyxTQUFVO0lBQzdDLElBQUksT0FBTyxPQUFPLE9BQU8sU0FBUyxPQUFPLGVBQWU7S0FDdEQsSUFBSSxPQUFPLE9BQU8sT0FBTyxPQUFPLE9BQU8sUUFBUSxXQUFXO01BQ3hELElBQUksV0FBVyxPQUFPO01BQ3RCLFNBQVMsU0FBUyxXQUNkLFNBQVMsU0FBUyxNQUNwQixxQ0FBcUMsT0FBTyxPQUFPLENBQUMsQ0FBQztLQUN6RDtLQUNBLDZCQUE2QixNQUFNO0lBQ3JDO0lBQ0EsU0FBUyxPQUFPO0dBQ2xCO0VBQ0o7RUFDQSxTQUFTLGtDQUFrQyxPQUFPO0dBQ2hELElBQUksT0FBTyxNQUFNLEtBQ2YsTUFBTyxVQUFVLFNBQVMsTUFDeEIscUNBQXFDLE1BQU0sT0FBTyxDQUFDLENBQUMsR0FDcEQsNkJBQTZCLEtBQUs7UUFDakMsSUFBSSxPQUFPLE1BQU0sZUFBZSxXQUNuQyxLQUFLLFFBQVEsTUFBTSxPQUFPLFNBQVMsUUFDakMsa0NBQWtDLEtBQUssR0FBSSxRQUFRLE1BQU07UUFDeEQsNkJBQTZCLEtBQUs7RUFDekM7RUFDQSxTQUFTLDZCQUE2QixlQUFlO0dBQ25ELEtBQUssZ0JBQWdCLGNBQWMsT0FBTyxTQUFTLGdCQUNqRCxPQUFPLGNBQWMsTUFDakIscUNBQXFDLGNBQWMsT0FBTyxDQUFDLENBQUMsSUFDNUQsT0FBTyxjQUFjLGVBQWUsYUFDcEMsNkJBQTZCLGFBQWEsR0FDM0MsZ0JBQWdCLGNBQWM7RUFDckM7RUFDQSxTQUFTLDRDQUNQLHNCQUNBLE9BQ0EsU0FDQSxTQUNBLFdBQ0Esc0JBQ0EsNkJBQ0E7R0FDQSxLQUFLLElBQUksYUFBYSxDQUFDLEdBQUcsU0FBUyxRQUFTO0lBQzFDLElBQUksTUFBTSxNQUFNLEtBQUs7S0FDbkIsSUFBSSxhQUFhLE1BQU07S0FDdkIsSUFDRSxTQUFTLHdCQUNULGdDQUFnQyxxQkFBcUIsUUFDckQ7TUFDQSxJQUFJLHNCQUNBLHFCQUFxQixnQ0FDdkIsa0JBQWtCLGdCQUFnQixVQUFVO01BQzlDLElBQUksb0JBQW9CLFFBQVEsZ0JBQWdCLE1BQzlDLGFBQWEsQ0FBQztNQUNoQixJQUFJO01BQ0osSUFBSyxrQkFBa0IsT0FBTyxxQkFBcUIsUUFBUSxJQUN6RCxJQUFJLGdCQUFnQixNQUFNLGtCQUFrQixDQUFDO1dBQ3hDO09BQ0gsa0JBQWtCLG9CQUFvQjtPQUN0QyxJQUFJLFVBQVUsZ0JBQWdCO09BQzlCLGtCQUNFLGdCQUFnQixNQUFNLFFBQVEsS0FDOUIsZ0JBQWdCLE1BQU0sUUFBUSxLQUM5QixnQkFBZ0IsV0FBVyxRQUFRLFVBQ25DLGdCQUFnQixVQUFVLFFBQVE7TUFDdEM7TUFDRixvQkFBb0IscUJBQXFCLFNBQVM7TUFDbEQsZ0JBQWdCLE1BQ1gsa0JBQWtCLENBQUMsb0JBQW9CLE9BQ3RDLHNCQUFzQixvQkFBb0IsTUFDM0Msa0JBQWtCLGdCQUFnQixNQUNsQyxrQkFDQyxvQkFBb0IsV0FBVyxnQkFBZ0IsVUFDL0Msb0JBQW9CLFVBQVUsZ0JBQWdCO01BQ3BELG9CQUFvQixxQkFBcUIsU0FBUztLQUNwRCxPQUFPLHFCQUFxQixTQUFTO0tBQ3JDLE9BQU8scUJBQXFCLFFBQVEsTUFDbEMsd0JBQ0UsWUFDQSxNQUFNLGdDQUNGLFVBQ0EsVUFBVSxNQUFNLCtCQUNwQixTQUNGO0tBQ0YsY0FBZSxPQUFPLHFCQUFxQixRQUFRLE9BQ2hELFNBQVMscUNBQ1AsbUNBQW1DLENBQUMsSUFDdkMsaUNBQWlDLEtBQy9CLFlBQ0EsTUFBTSxnQ0FDRixVQUNBLFVBQVUsTUFBTSwrQkFDcEIsTUFBTSxhQUNSO0tBQ0Y7SUFDRixPQUFPLElBQUksT0FBTyxNQUFNLE9BQU8sU0FBUyxNQUFNLGVBQzVDLE9BQU8sTUFBTSxPQUFPLDhCQUNmLHFCQUFxQixTQUFTLE1BQU0sUUFBUSxLQUM3Qyw0Q0FDRSxzQkFDQSxNQUFNLE9BQ04sU0FDQSxTQUNBLFdBQ0Esc0JBQ0EsMkJBQ0YsTUFBTSxhQUFhLENBQUM7SUFDMUIsUUFBUSxNQUFNO0dBQ2hCO0dBQ0EsT0FBTztFQUNUO0VBQ0EsU0FBUyw2QkFBNkIsZUFBZSxTQUFTO0dBQzVELEtBQUssZ0JBQWdCLGNBQWMsT0FBTyxTQUFTLGdCQUFpQjtJQUNsRSxJQUFJLE9BQU8sY0FBYyxLQUFLO0tBQzVCLElBQUksUUFBUSxjQUFjLGVBQ3hCLFFBQVEsY0FBYyxXQUN0QixPQUFPLHNCQUFzQixPQUFPLEtBQUssR0FDekMsWUFBWSwyQkFBMkIsTUFBTSxTQUFTLE1BQU0sTUFBTTtLQUNwRSxJQUFJLFNBQVM7TUFDWCxRQUFRLE1BQU07TUFDZCxJQUFJLHVCQUNGLFNBQVMsUUFBUSxPQUFPLE1BQU0sSUFBSSxxQkFBcUI7S0FDM0QsT0FDRSx1QkFBd0IsY0FBYyxlQUNuQyxjQUFjLGdCQUFnQjtLQUNuQyxRQUFRO0tBQ1IsSUFBSSxRQUFRLGNBQWMsT0FDeEIsVUFBVTtLQUNaLGdDQUFnQztLQUNoQyxZQUFZLDRDQUNWLE9BQ0EsT0FDQSxTQUNBLE1BQ0EsV0FDQSxzQkFDQSxDQUFDLENBQ0g7S0FDQSxPQUFPLGNBQWMsUUFBUSxNQUMzQixjQUNDLFdBQ0MsNEJBQTRCLGVBQWUsTUFBTSxRQUFRO0lBQy9ELE9BQ0UsT0FBTyxjQUFjLGVBQWUsYUFDbEMsNkJBQTZCLGVBQWUsT0FBTztJQUN2RCxnQkFBZ0IsY0FBYztHQUNoQztFQUNGO0VBQ0EsU0FBUyx5QkFBeUIsT0FBTztHQUN2QyxJQUFJLE9BQU8sTUFBTSxjQUFjO0dBQy9CLElBQUksUUFBUSxRQUFRLFdBQVcsTUFBTTtJQUNuQyxJQUFJLFdBQVcsNEJBQTRCLElBQUksSUFBSTtJQUNuRCxJQUFJLEtBQUssTUFBTSxVQUVYO1NBQUEsYUFBYSxTQUNiLGFBQWEsTUFBTSxhQUNuQixDQUFDLGlCQUFpQixPQUNsQjtNQUNBLGlCQUFpQixRQUFRLENBQUM7T
15852UFDMUIsSUFBSSxrQkFBa0IsS0FBSyxVQUFVLElBQUk7TUFDekMsa0JBQWtCLE9BQU8sV0FBWTtPQUNuQyxRQUFRLE1BQ04sMlFBQ0EsZUFDRjtNQUNGLENBQUM7TUFDRCxrQkFBa0IsVUFBVSxXQUFZO09BQ3RDLFFBQVEsTUFDTix5RUFDQSxlQUNGO01BQ0YsQ0FBQztLQUNIO1dBQ0ssNEJBQTRCLElBQUksTUFBTSxLQUFLO0dBQ3BEO0VBQ0Y7RUFDQSxTQUFTLDJCQUEyQixPQUFPO0dBQ3pDLElBQUksT0FBTyxNQUFNLGNBQWM7R0FDL0IsSUFBSSxRQUFRLFFBQVEsV0FBVyxNQUFNO0lBQ25DLElBQUksV0FBVyw0QkFBNEIsSUFBSSxJQUFJO0lBQ25ELEtBQUssTUFBTSxZQUNSLGFBQWEsU0FBUyxhQUFhLE1BQU0sYUFDMUMsNEJBQTRCLE9BQU8sSUFBSTtHQUMzQztFQUNGO0VBQ0EsU0FBUyxrQkFBa0IsU0FBUyxjQUFjO0dBQ2hELE9BQU8sT0FBTyxhQUFhLE9BQ3JCLGVBQWUsYUFBYSxlQUM5QixTQUFTLFFBQVEsaUJBQWlCLFNBQVMsZ0JBQzNDLE9BQU8sYUFBYSxPQUNoQixVQUFVLFFBQVEsZUFDbkIsZUFBZSxhQUFhLGVBQzdCLFNBQVMsV0FDUCxTQUFTLFFBQVEsZUFDaEIsU0FBUyxnQkFBZ0IsU0FBUyxhQUFhLGVBQ2xELE1BQU0sYUFBYSxNQUNqQixRQUFRLGNBQWMsZ0JBQ3RCLE9BQU8sYUFBYSxRQUFRLE9BQzVCLENBQUM7RUFDWDtFQUNBLFNBQVMsNEJBQTRCLE1BQU0sWUFBWSxnQkFBZ0I7R0FDckUsT0FBTyxLQUFLO0dBQ1osZ0JBQWdCO0dBQ2hCLE9BQU8scUJBQXFCLElBQUk7R0FDaEMsSUFBSSx5QkFBeUIsSUFBSSxHQUFHO0lBQ2xDLElBQUksb0JBQW9CLE1BQ3RCLElBQUksa0JBQWtCO0tBQ3BCLE9BQU8sS0FBSztLQUNaLEtBQUssS0FBSztJQUNaO1NBRUEsR0FBRztLQUNELG1CQUNJLGtCQUFrQixLQUFLLGtCQUN2QixnQkFBZ0IsZUFDbEI7S0FDRixJQUFJLFlBQ0YsZ0JBQWdCLGdCQUFnQixnQkFBZ0IsYUFBYTtLQUMvRCxJQUFJLGFBQWEsTUFBTSxVQUFVLFlBQVk7TUFDM0Msa0JBQWtCLFVBQVU7TUFDNUIsSUFBSSxlQUFlLFVBQVUsY0FDM0IsWUFBWSxVQUFVO01BQ3hCLFlBQVksVUFBVTtNQUN0QixJQUFJO09BQ0YsZ0JBQWdCLFVBQVUsVUFBVTtNQUN0QyxTQUFTLEtBQUs7T0FDWixrQkFBa0I7T0FDbEIsTUFBTTtNQUNSO01BQ0EsSUFBSSxTQUFTLEdBQ1gsUUFBUSxJQUNSLE1BQU0sSUFDTixvQkFBb0IsR0FDcEIsbUJBQW1CLEdBQ25CLE9BQU8sTUFDUCxhQUFhO01BQ2YsR0FBRyxTQUFTO09BQ1YsS0FBSyxJQUFJLFFBQVU7UUFDakIsU0FBUyxtQkFDTixNQUFNLGdCQUFnQixNQUFNLEtBQUssYUFDakMsUUFBUSxTQUFTO1FBQ3BCLFNBQVMsYUFDTixNQUFNLGFBQWEsTUFBTSxLQUFLLGFBQzlCLE1BQU0sU0FBUztRQUNsQixNQUFNLEtBQUssYUFBYSxVQUFVLEtBQUssVUFBVTtRQUNqRCxJQUFJLFVBQVUsT0FBTyxLQUFLLGFBQWE7UUFDdkMsYUFBYTtRQUNiLE9BQU87T0FDVDtPQUNBLFNBQVM7UUFDUCxJQUFJLFNBQVMsTUFBTSxNQUFNO1FBQ3pCLGVBQWUsbUJBQ2IsRUFBRSxzQkFBc0IsaUJBQ3ZCLFFBQVE7UUFDWCxlQUFlLGFBQ2IsRUFBRSxxQkFBcUIsY0FDdEIsTUFBTTtRQUNULElBQUksVUFBVSxPQUFPLEtBQUssY0FBYztRQUN4QyxPQUFPO1FBQ1AsYUFBYSxLQUFLO09BQ3BCO09BQ0EsT0FBTztNQUNUO01BQ0Esa0JBQ0UsT0FBTyxTQUFTLE9BQU8sTUFBTSxPQUFPO09BQVM7T0FBWTtNQUFJO0tBQ2pFLE9BQU8sa0JBQWtCO0lBQzNCO0lBQ0Ysa0JBQWtCLG1CQUFtQjtLQUFFLE9BQU87S0FBRyxLQUFLO0lBQUU7R0FDMUQsT0FBTyxrQkFBa0I7R0FDekIsdUJBQXVCO0lBQ3JCLGFBQWE7SUFDYixnQkFBZ0I7R0FDbEI7R0FDQSxXQUFXLENBQUM7R0FDWixrQkFBa0IsaUJBQWlCLGVBQWU7R0FDbEQsYUFBYTtHQUNiLEtBQUssYUFBYSxpQkFBaUIsT0FBTyxNQUFNLFNBQVMsYUFBYztJQUNyRSxPQUFPO0lBQ1AsSUFDRSxtQkFDRSxrQkFBa0IsS0FBSyxXQUFZLFNBQVMsa0JBRTlDLEtBQ0UsZUFBZSxHQUNmLGVBQWUsZ0JBQWdCLFFBQy9CLGdCQUVBLGtCQUNFLDBCQUEwQixnQkFBZ0IsYUFBYTtJQUM3RCxJQUFJLFNBQVMsS0FBSyxhQUFhLE9BQU8sS0FBSyxRQUFRLElBQ2pELGtCQUFrQiwwQkFBMEIsSUFBSSxHQUM5QyxxQ0FBcUMsY0FBYztTQUNsRDtLQUNILElBQUksT0FBTyxLQUFLLEtBQ2Q7TUFDSSxJQUFBLGtCQUFrQixLQUFLLFdBQVksU0FBUyxLQUFLLGVBQ25EO09BQ0EsU0FBUyxtQkFDUCxTQUFTLGdCQUFnQixpQkFDekIsa0JBQ0EsMEJBQTBCLGVBQWU7T0FDM0MscUNBQXFDLGNBQWM7T0FDbkQ7TUFDRixPQUFPLElBQ0wsU0FBUyxtQkFDVCxTQUFTLGdCQUFnQixlQUN6QjtPQUNBLGtCQUFrQiwwQkFBMEIsSUFBSTtPQUNoRCxxQ0FBcUMsY0FBYztPQUNuRDtNQUNGOztLQUNGLGtCQUFrQixLQUFLO0tBQ3ZCLE9BQU8sS0FBSyxlQUFlLGVBQWUsU0FBUyxtQkFDN0MsZ0JBQWdCLFNBQVMsTUFBUSxhQUFhLG9CQUMvQyxrQkFBa0IsNEJBQTRCLElBQUksR0FDbkQscUNBQXFDLGNBQWM7SUFDekQ7R0FDRjtHQUNBLDJCQUEyQjtFQUM3QjtFQUNBLFNBQVMscUNBQ1AsbUNBQ0E7R0FDQSxPQUFPLFNBQVMsYUFBYztJQUM1QixJQUFJLFFBQVEsWUFDVixlQUFlLE9BQ2YsMkJBQTJCLG1DQUMzQixVQUFVLGFBQWEsV0FDdkIsUUFBUSxhQUFhO0lBQ3ZCLFFBQVEsYUFBYSxLQUFyQjtLQUNFLEtBQUs7S0FDTCxLQUFLO0tBQ0wsS0FBSyxJQUNIO0tBQ0YsS0FBSztNQUNILE9BQU8sUUFBUSxTQUNiLFNBQVMsV0FDVCxvQkFBb0IsY0FBYyxPQUFPO01BQzNDO0tBQ0YsS0FBSztNQUNILElBQUksT0FBTyxRQUFRLE9BQ2pCO09BQ0ksSUFBQSwyQkFDQSxhQUFhLFVBQVUsZUFDeEIsZUFBZSx5QkFBeUIsVUFDekMsTUFBTSxjQUVOLHdCQUF3Qix3QkFBd0I7WUFDN0MsSUFBSSxNQUFNLGNBQ2IsUUFBUSx5QkFBeUIsVUFBakM7UUFDRSxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUs7U0FDSCx3QkFBd0Isd0JBQXdCO1NBQ2hEO1FBQ0YsU0FDRSx5QkFBeUIsY0FBYztPQUMzQzs7TUFDSjtLQUNGLEtBQUs7S0FDTCxLQUFLO0tBQ0wsS0FBSztLQUNMLEtBQUs7S0FDTCxLQUFLO0tBQ0wsS0FBSyxJQUNIO0tBQ0YsS0FBSztNQUNILDRCQUNFLFNBQVMsWUFDUCwyQkFBMkIsU0FDNUIsVUFBVSxjQUNWLGVBQWUsc0JBQ2QseUJBQXlCLGVBQ3pCLHlCQUF5QixTQUMzQixHQUNDLFVBQVUsUUFBUSxlQUNsQixVQUFVLDJCQUNULFFBQVEsU0FDUixRQUFRLE1BQ1YsR0FDQSxXQUFXLFdBQ1QsbUNBQ0UsMEJBQ0EsY0FDQSxTQUNDLHlCQUF5QixnQkFBZ0IsQ0FBQyxHQUMzQyxDQUFDLENBQ0g7TUFDSjtLQUNGLFNBQ0UsSUFBSSxPQUFPLFFBQVEsT0FDakIsTUFBTSxNQUNKLDBIQUNGO0lBQ047SUFDQSwyQkFBMkIsTUFBTTtJQUNqQyxJQUFJLFNBQVMsMEJBQTBCO0tBQ3JDLHlCQUF5QixTQUFTLE1BQU07S0FDeEMsYUFBYTtLQUNiO0lBQ0Y7SUFDQSxhQUFhLE1BQU07R0FDckI7RUFDRjtFQUNBLFNBQVMsMEJBQTBCLGNBQWMsU0FBUyxjQUFjO0dBQ3RFLElBQUksa0JBQWtCLHlCQUF5QixHQUM3QyxxQkFBcUIsNEJBQTRCLEdBQ2pELG1CQUFtQiwwQkFBMEIsR0FDN0MsMkJBQTJCLGtDQUFrQyxHQUM3RCxRQUFRLGFBQWE7R0FDdkIsUUFBUSxhQUFhLEtB
15852QXJCO0lBQ0UsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0tBQ0gsaUNBQWlDLGNBQWMsWUFBWTtLQUMzRCxRQUFRLEtBQ04sd0JBQXdCLGNBQWMsU0FBUyxTQUFTO0tBQzFEO0lBQ0YsS0FBSztLQUNILGlDQUFpQyxjQUFjLFlBQVk7S0FDM0QsSUFBSSxRQUFRLEdBQ1YsSUFBTSxlQUFlLGFBQWEsV0FBWSxTQUFTLFNBQ3JELGFBQWEsS0FBSyxnQkFDaEIsU0FBUyxhQUFhLGlCQUN0QixpQ0FDQyxhQUFhLFVBQVUsYUFBYSxpQkFDbkMsUUFBUSxNQUNOLG9NQUNBLDBCQUEwQixZQUFZLEtBQUssVUFDN0MsR0FDRixhQUFhLFVBQVUsYUFBYSxpQkFDbEMsUUFBUSxNQUNOLG9NQUNBLDBCQUEwQixZQUFZLEtBQUssVUFDN0MsSUFDRixjQUFjLFlBQVksS0FDckIsaUJBQWlCLEdBQ2xCLGtCQUNFLGNBQ0EsNEJBQ0EsY0FDQSxZQUNGLEdBQ0EscUJBQXFCLEtBQ3JCLGtCQUNFLGNBQ0EsNEJBQ0EsY0FDQSxZQUNGO1VBQ0g7TUFDSCxJQUFJLFlBQVksMkJBQ2QsYUFBYSxNQUNiLFFBQVEsYUFDVjtNQUNBLFVBQVUsUUFBUTtNQUNsQixhQUFhLEtBQUssZ0JBQ2hCLFNBQVMsYUFBYSxpQkFDdEIsaUNBQ0MsYUFBYSxVQUFVLGFBQWEsaUJBQ25DLFFBQVEsTUFDTixxTUFDQSwwQkFBMEIsWUFBWSxLQUFLLFVBQzdDLEdBQ0YsYUFBYSxVQUFVLGFBQWEsaUJBQ2xDLFFBQVEsTUFDTixxTUFDQSwwQkFBMEIsWUFBWSxLQUFLLFVBQzdDO01BQ0osY0FBYyxZQUFZLEtBQ3JCLGlCQUFpQixHQUNsQixrQkFDRSxjQUNBLDZCQUNBLGNBQ0EsY0FDQSxXQUNBLFNBQ0EsYUFBYSxtQ0FDZixHQUNBLHFCQUFxQixLQUNyQixrQkFDRSxjQUNBLDZCQUNBLGNBQ0EsY0FDQSxXQUNBLFNBQ0EsYUFBYSxtQ0FDZjtLQUNOO0tBQ0YsUUFBUSxNQUFNLHFCQUFxQixZQUFZO0tBQy9DLFFBQVEsT0FBTyxnQkFBZ0IsY0FBYyxhQUFhLE1BQU07S0FDaEU7SUFDRixLQUFLO0tBQ0gsVUFBVSwwQkFBMEI7S0FDcEMsaUNBQWlDLGNBQWMsWUFBWTtLQUMzRCxJQUNFLFFBQVEsT0FDTixRQUFRLGFBQWEsYUFBYyxTQUFTLFFBQzlDO01BQ0EsWUFBWTtNQUNaLElBQUksU0FBUyxhQUFhLE9BQ3hCLFFBQVEsYUFBYSxNQUFNLEtBQTNCO09BQ0UsS0FBSztPQUNMLEtBQUs7UUFDSCxZQUFZLGFBQWEsTUFBTTtRQUMvQjtPQUNGLEtBQUssR0FDSCxZQUFZLGFBQWEsTUFBTTtNQUNuQztNQUNGLElBQUk7T0FDRixrQkFDRSxjQUNBLGlCQUNBLE9BQ0EsU0FDRjtNQUNGLFNBQVMsT0FBTztPQUNkLHdCQUF3QixjQUFjLGFBQWEsUUFBUSxLQUFLO01BQ2xFO0tBQ0Y7S0FDQSxhQUFhLGtCQUFrQix5QkFBeUIsT0FBTztLQUMvRDtJQUNGLEtBQUssSUFDSCxTQUFTLFdBQ1AsUUFBUSxLQUNSLCtCQUErQixZQUFZO0lBQy9DLEtBQUs7SUFDTCxLQUFLO0tBQ0gsaUNBQWlDLGNBQWMsWUFBWTtLQUMzRCxJQUFJLFNBQVMsU0FDWDtNQUFJLElBQUEsUUFBUSxHQUFHLGdCQUFnQixZQUFZO1dBQ3RDLElBQUksUUFBUSxJQUFJO09BQ25CLGVBQWUsYUFBYTtPQUM1QixVQUFVLGFBQWE7T0FDdkIsWUFBWSxhQUFhO09BQ3pCLElBQUk7UUFDRixrQkFDRSxjQUNBLHdCQUNBLFdBQ0EsY0FDQSxTQUNBLFlBQ0Y7T0FDRixTQUFTLE9BQU87UUFDZCx3QkFDRSxjQUNBLGFBQWEsUUFDYixLQUNGO09BQ0Y7TUFDRjs7S0FDRixRQUFRLE9BQU8sZ0JBQWdCLGNBQWMsYUFBYSxNQUFNO0tBQ2hFO0lBQ0YsS0FBSztLQUNILElBQUksUUFBUSxHQUFHO01BQ2IsUUFBUSwwQkFBMEI7TUFDbEMsaUNBQWlDLGNBQWMsWUFBWTtNQUMzRCxlQUFlLGFBQWE7TUFDNUIsYUFBYSxrQkFBa0IsNEJBQTRCLEtBQUs7TUFDaEUsSUFBSTtPQUNGLGtCQUNFLGNBQ0EsZ0JBQ0EsY0FDQSxTQUNBLGlCQUNBLGFBQWEsY0FDZjtNQUNGLFNBQVMsT0FBTztPQUNkLHdCQUF3QixjQUFjLGFBQWEsUUFBUSxLQUFLO01BQ2xFO0tBQ0YsT0FBTyxpQ0FBaUMsY0FBYyxZQUFZO0tBQ2xFO0lBQ0YsS0FBSztLQUNILGlDQUFpQyxjQUFjLFlBQVk7S0FDM0QsUUFBUSxLQUNOLGlDQUFpQyxjQUFjLFlBQVk7S0FDN0Q7SUFDRixLQUFLO0tBQ0gsaUNBQWlDLGNBQWMsWUFBWTtLQUMzRCxRQUFRLEtBQ04saUNBQWlDLGNBQWMsWUFBWTtLQUM3RCxRQUFRLE9BQ0osZUFBZSxhQUFhLGVBQzlCLFNBQVMsaUJBQ0wsZUFBZSxhQUFhLFlBQzlCLFNBQVMsaUJBQ0wsUUFBUSxnQ0FBZ0MsS0FDeEMsTUFDQSxZQUNGLEdBQ0EsOEJBQThCLGNBQWMsS0FBSztLQUN2RDtJQUNGLEtBQUs7S0FDSCxRQUNFLFNBQVMsYUFBYSxpQkFBaUI7S0FDekMsSUFBSSxDQUFDLE9BQU87TUFDVixJQUFJLCtCQUNELFNBQVMsV0FBVyxTQUFTLFFBQVEsaUJBQ3RDO01BQ0YsVUFBVTtNQUNWLFlBQVk7TUFDWiwyQkFBMkI7TUFDM0IsQ0FBQyw0QkFBNEIsaUNBQzdCLENBQUMsYUFDSyxRQUFRLHVCQUNWLE9BQU8sYUFBYSxlQUFlLFVBQ2hDLFNBQVMsK0JBQ1oseUNBQ0UsY0FDQSxjQUNBLEtBQ0YsSUFDQyxhQUFhLE9BQU8saUJBQWlCLFVBQ3BDLEtBQUssNEJBQ0wsS0FBSywwQkFDTCxNQUFPLHlCQUF5Qiw0QkFDaEMsdUJBQ0UsY0FDQSwwQkFDQSxzQkFDRixLQUNGLGlDQUFpQyxjQUFjLFlBQVk7TUFDL0QsMkJBQTJCO01BQzNCLDRCQUE0QjtLQUM5QjtLQUNBO0lBQ0YsS0FBSztLQUNILFFBQVEsWUFBWSx5QkFBeUIsWUFBWTtLQUN6RCxpQ0FBaUMsY0FBYyxZQUFZO0tBQzNELFFBQVEsT0FBTyxnQkFBZ0IsY0FBYyxhQUFhLE1BQU07S0FDaEU7SUFDRixLQUFLLEdBQ0gsUUFBUSxPQUFPLGdCQUFnQixjQUFjLGFBQWEsTUFBTTtJQUNsRSxTQUNFLGlD
15852QUFpQyxjQUFjLFlBQVk7R0FDL0Q7R0FDQSxDQUFDLGFBQWEsT0FBTyxpQkFBaUIsVUFDcEMsS0FBSyw0QkFDTCxLQUFLLDRCQUNILGdDQUFnQyxNQUFPLDRCQUN2QyxtQkFDRSxjQUNBLDBCQUNBLHdCQUNBLHlCQUNBLHFCQUNGLEdBQ0YsU0FBUyxhQUFhLGFBQ3BCLFNBQVMsYUFBYSxVQUN0QixTQUFTLGFBQWEsT0FBTyxhQUM3QixNQUFPLHlCQUF5Qiw2QkFDL0Isa0JBQ0MsYUFBYSxPQUFPLFdBQ3BCLGFBQWEsTUFDZixLQUNFLG9CQUNFLGNBQ0EsMEJBQ0Esd0JBQ0EsT0FDRjtHQUNOLHdCQUF3QixlQUFlO0dBQ3ZDLDJCQUEyQixrQkFBa0I7R0FDN0Msd0JBQXdCO0dBQ3hCLCtCQUErQjtFQUNqQztFQUNBLFNBQVMsd0JBQXdCLGFBQWEsVUFBVTtHQUN0RCxLQUFLLGNBQWMsWUFBWSxPQUFPLFNBQVMsY0FDN0MsK0JBQStCLGFBQWEsUUFBUSxHQUNqRCxjQUFjLFlBQVk7RUFDakM7RUFDQSxTQUFTLCtCQUErQixPQUFPLFVBQVU7R0FDdkQsUUFBUSxNQUFNLEtBQWQ7SUFDRSxLQUFLO0lBQ0wsS0FBSztLQUNILElBQUk7TUFDRixJQUFJLFdBQVcsTUFBTTtNQUNyQixXQUNJLGtCQUFrQixPQUFPLGNBQWMsUUFBUSxJQUMvQyxrQkFDRSxPQUNBLGdCQUNBLE1BQU0sV0FDTixNQUFNLGFBQ1I7S0FDTixTQUFTLE9BQU87TUFDZCx3QkFBd0IsT0FBTyxNQUFNLFFBQVEsS0FBSztLQUNwRDtLQUNBLDJCQUEyQixPQUFPLFFBQVE7S0FDMUM7SUFDRixLQUFLO0tBQ0gsSUFBSTtNQUNGLElBQUksb0JBQW9CLE1BQU07TUFDOUIsV0FDSSxrQkFBa0IsT0FBTyxrQkFBa0IsaUJBQWlCLElBQzVELGtCQUNFLE9BQ0Esb0JBQ0EsbUJBQ0EsTUFBTSxhQUNSO01BQ0osZ0NBQWdDLENBQUM7S0FDbkMsU0FBUyxPQUFPO01BQ2Qsd0JBQXdCLE9BQU8sTUFBTSxRQUFRLEtBQUs7S0FDcEQ7S0FDQTtJQUNGLEtBQUs7S0FDSCxJQUFJO01BQ0YsSUFBSSxvQkFBb0IsTUFBTTtNQUM5QixXQUNJLGtCQUNFLE9BQ0Esd0JBQ0EsaUJBQ0YsSUFDQSxrQkFDRSxPQUNBLDBCQUNBLE1BQU0sU0FDUjtLQUNOLFNBQVMsT0FBTztNQUNkLHdCQUF3QixPQUFPLE1BQU0sUUFBUSxLQUFLO0tBQ3BEO0tBQ0E7SUFDRixLQUFLO0lBQ0wsS0FBSztLQUNILFNBQVMsTUFBTSxpQkFDYix3QkFBd0IsT0FBTyxRQUFRO0tBQ3pDO0lBQ0YsU0FDRSx3QkFBd0IsT0FBTyxRQUFRO0dBQzNDO0VBQ0Y7RUFDQSxTQUFTLDJCQUEyQixhQUFhLG1CQUFtQjtHQUNsRSxJQUFJLFlBQVksZUFBZSxVQUM3QixLQUFLLGNBQWMsWUFBWSxPQUFPLFNBQVMsY0FBZTtJQUM1RCxHQUFHO0tBQ0QsSUFBSSxRQUFRLGFBQ1YsV0FBVztLQUNiLFFBQVEsTUFBTSxLQUFkO01BQ0UsS0FBSztPQUNILCtCQUErQixPQUFPLFFBQVE7T0FDOUMsTUFBTTtNQUNSLEtBQUs7T0FDSCxTQUFTLE1BQU0saUJBQ2IsMkJBQTJCLE9BQU8sUUFBUTtPQUM1QyxNQUFNO01BQ1IsU0FDRSwyQkFBMkIsT0FBTyxRQUFRO0tBQzlDO0lBQ0Y7SUFDQSxjQUFjLFlBQVk7R0FDNUI7RUFDSjtFQUNBLFNBQVMsd0JBQXdCLE9BQU87R0FDdEMsSUFBSSxZQUFZLE1BQU07R0FDdEIsU0FBUyxjQUNMLE1BQU0sWUFBWSxNQUFPLHdCQUF3QixTQUFTO0dBQzlELE1BQU0sUUFBUTtHQUNkLE1BQU0sWUFBWTtHQUNsQixNQUFNLFVBQVU7R0FDaEIsTUFBTSxNQUFNLFFBQ1IsWUFBWSxNQUFNLFdBQ3BCLFNBQVMsYUFBYSxzQkFBc0IsU0FBUztHQUN2RCxNQUFNLFlBQVk7R0FDbEIsTUFBTSxjQUFjO0dBQ3BCLE1BQU0sU0FBUztHQUNmLE1BQU0sZUFBZTtHQUNyQixNQUFNLGdCQUFnQjtHQUN0QixNQUFNLGdCQUFnQjtHQUN0QixNQUFNLGVBQWU7R0FDckIsTUFBTSxZQUFZO0dBQ2xCLE1BQU0sY0FBYztFQUN0QjtFQUNBLFNBQVMsbUNBQ1AsY0FDQSx3QkFDQSxRQUNBO0dBQ0EsS0FBSyxTQUFTLE9BQU8sT0FBTyxTQUFTLFNBQ25DLDZCQUNFLGNBQ0Esd0JBQ0EsTUFDRixHQUNHLFNBQVMsT0FBTztFQUN2QjtFQUNBLFNBQVMsNkJBQ1AsY0FDQSx3QkFDQSxjQUNBO0dBQ0EsSUFDRSxnQkFDQSxlQUFlLE9BQU8sYUFBYSxzQkFFbkMsSUFBSTtJQUNGLGFBQWEscUJBQXFCLFlBQVksWUFBWTtHQUM1RCxTQUFTLEtBQUs7SUFDWixtQkFDSSxpQkFBaUIsQ0FBQyxHQUNwQixRQUFRLE1BQ04sa0RBQ0EsR0FDRjtHQUNKO0dBQ0YsSUFBSSxrQkFBa0IseUJBQXlCLEdBQzdDLHFCQUFxQiw0QkFBNEIsR0FDakQsbUJBQW1CLDBCQUEwQixHQUM3QywyQkFBMkIsa0NBQWtDO0dBQy9ELFFBQVEsYUFBYSxLQUFyQjtJQUNFLEtBQUs7S0FDSCw2QkFDRSxnQkFBZ0IsY0FBYyxzQkFBc0I7S0FDdEQsbUNBQ0UsY0FDQSx3QkFDQSxZQUNGO0tBQ0EsYUFBYSxnQkFDVCxhQUFhLGNBQWMsVUFDM0IsYUFBYSxhQUNiLENBQUMsOEJBQ0MsZUFBZSxhQUFhLFdBQzlCLGFBQWEsV0FBVyxZQUFZLFlBQVk7S0FDcEQ7SUFDRixLQUFLO0tBQ0gsNkJBQ0UsZ0JBQWdCLGNBQWMsc0JBQXNCO0tBQ3RELHNDQUFzQyxZQUFZO0tBQ2xELElBQUksaUJBQWlCLFlBQ25CLDRCQUE0QjtLQUM5QixpQkFBaUIsYUFBYSxJQUFJLE1BQzlCLGFBQWEsYUFBYSxXQUMzQix3QkFBd0IsQ0FBQztLQUM1QixtQ0FDRSxjQUNBLHdCQUNBLFlBQ0Y7S0FDQSxrQkFDRSxjQUNBLDBCQUNBLGFBQWEsV0FDYixhQUFhLE1BQ2IsYUFBYSxhQUNmO0tBQ0EsYUFBYTtLQUNiLHdCQUF3QjtLQUN4QjtJQUNGLEtBQUssR0FDSCw2QkFDRSxnQkFBZ0IsY0FBYyxzQkFBc0IsR0FDcEQsc0NBQXNDLFlBQVk7SUFDdEQsS0FBSztLQUNILE1BQU0sYUFBYSxPQUNqQixzQ0FBc0MsWUFBWTtLQUNwRCxpQkFBaUI7S0FDakIsNEJBQTRCO0tBQzVCLGFBQWE7S0FDYixtQ0FDRSxjQUNBLHdCQUNBLFlBQ0Y7S0FDQSxhQUFhO0tBQ2Isd0JBQXdCO0tBQ3hCLElBQUksU0FBUyxZQUNYLElBQUksdUJBQ0YsSUFBSTtNQUNGLGtCQUNFLGNBQ0EsMEJBQ0EsWUFDQSxhQUFhLFNBQ2YsR0FDRyxnQ0FBZ0MsQ0FBQztLQUN0QyxTQUFTLE9BQU87TUFDZCx3QkFDRSxjQUNBLHdCQUNBLEtBQ0Y7S0FDRjtVQUVBLElBQUk7TUFDRixrQkFDRSxjQUNBLGFBQ0EsWUFDQSxhQUFhLFNBQ2YsR0FDRyxnQ0FBZ0MsQ0FBQztLQUN0QyxTQUFTLE9BQU87TUFDZCx3QkFDRSxjQUNBLHdCQUNBLEtBQ0Y7S0FDRjtLQUNKO0lBQ0YsS0FBSztLQUNILFNBQVMsZUFDTix5QkFDSyxlQUFlLFlBQ2pCLHVC
15852QUNFLE1BQU0sYUFBYSxXQUNmLGFBQWEsT0FDYixXQUFXLGFBQWEsV0FDdEIsYUFBYSxjQUFjLE9BQzNCLGNBQ04sYUFBYSxTQUNmLEdBQ0EsaUJBQWlCLFlBQVksS0FDN0IsdUJBQXVCLFlBQVksYUFBYSxTQUFTO0tBQy9EO0lBQ0YsS0FBSztLQUNILGlCQUFpQjtLQUNqQiw0QkFBNEI7S0FDNUIsYUFBYSxhQUFhLFVBQVU7S0FDcEMsd0JBQXdCLENBQUM7S0FDekIsbUNBQ0UsY0FDQSx3QkFDQSxZQUNGO0tBQ0EsYUFBYTtLQUNiLHdCQUF3QjtLQUN4QjtJQUNGLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7S0FDSCw0QkFDRSxXQUNBLGNBQ0Esc0JBQ0Y7S0FDQSw2QkFDRSwrQkFDRSxjQUNBLHdCQUNBLE1BQ0Y7S0FDRixtQ0FDRSxjQUNBLHdCQUNBLFlBQ0Y7S0FDQTtJQUNGLEtBQUs7S0FDSCw4QkFDRyxnQkFBZ0IsY0FBYyxzQkFBc0IsR0FDcEQsaUJBQWlCLGFBQWEsV0FDL0IsZUFBZSxPQUFPLGVBQWUsd0JBQ25DLCtCQUNFLGNBQ0Esd0JBQ0EsY0FDRjtLQUNKLG1DQUNFLGNBQ0Esd0JBQ0EsWUFDRjtLQUNBO0lBQ0YsS0FBSztLQUNILG1DQUNFLGNBQ0Esd0JBQ0EsWUFDRjtLQUNBO0lBQ0YsS0FBSztLQUNILDZCQUNHLGlCQUFpQiw4QkFDbEIsU0FBUyxhQUFhO0tBQ3hCLG1DQUNFLGNBQ0Esd0JBQ0EsWUFDRjtLQUNBLDRCQUE0QjtLQUM1QjtJQUNGLEtBQUs7S0FDSCxhQUFhLFFBQVEsWUFDbkIsMkJBQTJCLFlBQVk7S0FDekMsZ0JBQWdCLGNBQWMsc0JBQXNCO0tBQ3BELG1DQUNFLGNBQ0Esd0JBQ0EsWUFDRjtLQUNBO0lBQ0YsS0FBSztLQUNILDZCQUNFLGdCQUFnQixjQUFjLHNCQUFzQjtLQUN0RCxtQ0FDRSxjQUNBLHdCQUNBLFlBQ0Y7S0FDQTtJQUNGLFNBQ0UsbUNBQ0UsY0FDQSx3QkFDQSxZQUNGO0dBQ0o7R0FDQSxDQUFDLGFBQWEsT0FBTyxpQkFBaUIsVUFDcEMsS0FBSyw0QkFDTCxLQUFLLDJCQUNKLGdDQUFnQyxNQUFPLDRCQUN4QyxtQkFDRSxjQUNBLDBCQUNBLHdCQUNBLHlCQUNBLHFCQUNGO0dBQ0Ysd0JBQXdCLGVBQWU7R0FDdkMsMkJBQTJCLGtCQUFrQjtHQUM3Qyx3QkFBd0I7R0FDeEIsK0JBQStCO0VBQ2pDO0VBQ0EsU0FBUyxpQ0FBaUMsY0FBYyxjQUFjO0dBQ3BFLElBQ0UsU0FBUyxhQUFhLGtCQUNwQixlQUFlLGFBQWEsV0FDOUIsU0FBUyxpQkFDTCxlQUFlLGFBQWEsZUFBZ0IsU0FBUyxnQkFDekQ7SUFDQSxlQUFlLGFBQWE7SUFDNUIsSUFBSTtLQUNGLGtCQUNFLGNBQ0EsZ0NBQ0EsWUFDRjtJQUNGLFNBQVMsT0FBTztLQUNkLHdCQUF3QixjQUFjLGFBQWEsUUFBUSxLQUFLO0lBQ2xFO0dBQ0Y7RUFDRjtFQUNBLFNBQVMsaUNBQWlDLGNBQWMsY0FBYztHQUNwRSxJQUNFLFNBQVMsYUFBYSxrQkFDcEIsZUFBZSxhQUFhLFdBQzlCLFNBQVMsaUJBQ0wsZUFBZSxhQUFhLGVBQzlCLFNBQVMsaUJBQ0wsZUFBZSxhQUFhLFlBQWEsU0FBUyxpQkFFeEQsSUFBSTtJQUNGLGtCQUNFLGNBQ0EsZ0NBQ0EsWUFDRjtHQUNGLFNBQVMsT0FBTztJQUNkLHdCQUF3QixjQUFjLGFBQWEsUUFBUSxLQUFLO0dBQ2xFO0VBQ0o7RUFDQSxTQUFTLGNBQWMsY0FBYztHQUNuQyxRQUFRLGFBQWEsS0FBckI7SUFDRSxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7S0FDSCxJQUFJLGFBQWEsYUFBYTtLQUM5QixTQUFTLGVBQ04sYUFBYSxhQUFhLFlBQVksSUFBSSxnQkFBZ0I7S0FDN0QsT0FBTztJQUNULEtBQUssSUFDSCxPQUNHLGVBQWUsYUFBYSxXQUM1QixhQUFhLGFBQWEsYUFDM0IsU0FBUyxlQUNOLGFBQWEsYUFBYSxjQUFjLElBQUksZ0JBQWdCLElBQy9EO0lBRUosU0FDRSxNQUFNLE1BQ0osc0NBQ0UsYUFBYSxNQUNiLDRCQUNKO0dBQ0o7RUFDRjtFQUNBLFNBQVMsNkJBQTZCLGNBQWMsV0FBVztHQUM3RCxJQUFJLGFBQWEsY0FBYyxZQUFZO0dBQzNDLFVBQVUsUUFBUSxTQUFVLFVBQVU7SUFDcEMsSUFBSSxDQUFDLFdBQVcsSUFBSSxRQUFRLEdBQUc7S0FDN0IsV0FBVyxJQUFJLFFBQVE7S0FDdkIsSUFBSSxtQkFDRixJQUFJLFNBQVMsbUJBQW1CLFNBQVMsZ0JBQ3ZDLHVCQUF1QixnQkFBZ0IsZUFBZTtVQUV0RCxNQUFNLE1BQ0oscUVBQ0Y7S0FDSixJQUFJLFFBQVEscUJBQXFCLEtBQUssTUFBTSxjQUFjLFFBQVE7S0FDbEUsU0FBUyxLQUFLLE9BQU8sS0FBSztJQUM1QjtHQUNGLENBQUM7RUFDSDtFQUNBLFNBQVMsbUNBQ1AsZUFDQSxhQUNBLE9BQ0E7R0FDQSxJQUFJLFlBQVksWUFBWTtHQUM1QixJQUFJLFNBQVMsV0FDWCxLQUFLLElBQUksSUFBSSxHQUFHLElBQUksVUFBVSxRQUFRLEtBQUs7SUFDekMsSUFBSSxPQUFPLGVBQ1QsY0FBYyxhQUNkLGVBQWUsVUFBVSxJQUN6QixrQkFBa0IseUJBQXlCLEdBQzNDLFNBQVM7SUFDWCxHQUFHLE9BQU8sU0FBUyxTQUFVO0tBQzNCLFFBQVEsT0FBTyxLQUFmO01BQ0UsS0FBSztPQUNILElBQUksaUJBQWlCLE9BQU8sSUFBSSxHQUFHO1FBQ2pDLGFBQWEsT0FBTztRQUNwQix3QkFBd0IsQ0FBQztRQUN6QixNQUFNO09BQ1I7T0FDQTtNQUNGLEtBQUs7T0FDSCxhQUFhLE9BQU87T0FDcEIsd0JBQXdCLENBQUM7T0FDekIsTUFBTTtNQUNSLEtBQUs7TUFDTCxLQUFLO09BQ0gsYUFBYSxPQUFPLFVBQVU7T0FDOUIsd0JBQXdCLENBQUM7T0FDekIsTUFBTTtLQUNWO0tBQ0EsU0FBUyxPQUFPO0lBQ2xCO0lBQ0EsSUFBSSxTQUFTLFlBQ1gsTUFBTSxNQUNKLHNHQUNGO0lBQ0YsNkJBQTZCLE1BQU0sYUFBYSxZQUFZO0lBQzVELGFBQWE7SUFDYix3QkFBd0IsQ0FBQztJQUN6QixDQUFDLGFBQWEsT0FBTyxpQkFBaUIsVUFDcEMsS0FBSyw0QkFDTCxLQUFLLDBCQUNMLE1BQU8seUJBQXlCLDRCQUNoQyxvQkFDRSxjQUNBLDBCQUNBLHdCQUNBLFNBQ0Y7SUFDRix3QkFBd0IsZUFBZTtJQUN2QyxPQUFPO0lBQ1AsY0FBYyxLQUFLO0lBQ25CLFNBQVMsZ0JBQWdCLFlBQVksU0FBUztJQUM5QyxLQUFLLFNBQVM7R0FDaEI7R0FDRixJQUFJLFlBQVksZUFBZSxPQUM3QixLQUFLLGNBQWMsWUFBWSxPQUFPLFNBQVMsY0FDN0MsNkJBQTZCLGFBQWEsZUFBZSxLQUFLLEdBQzNELGNBQWMsWUFBWTtFQUNuQztFQUNBLFNBQVMsNkJBQTZCLGNBQWMsTUFBTSxPQUFPO0dBQy9ELElBQUksa0JBQWtCLHlCQUF5QixHQUM3QyxxQkFBcUIsNEJBQTRCLEdBQ2pELG1CQUFtQiwwQkFBMEIsR0FDN0MsMkJBQTJCLGtDQUFrQyxHQUM3RCxVQUFVLGFBQWEsV0FDdkIsUUFBUSxhQUFhO0dBQ3ZCLFFBQVEsYUFBYSxLQUFyQjtJQUNFLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7S0FDSCxJQUNFLFFBQVEsTUFDTixVQUFVLGFBQWEsYUFDeEIsVUFBVSxTQUFTLFVBQVUsUUFBUSxTQUFTLE1BQy9DLFNBQVMsVUFFVCxLQUFLLElBQUksS0FBSyxHQUFHLEtBQUssUUFBUSxRQUFRLE1BQU07TUFDMUMsSUFBSSxxQkFBcUIsUUFBUTtNQUNqQyxtQkFBbUIsSUFBSSxPQUFPLG1CQUFtQjtLQUNuRDtLQUNGLG1DQUFtQyxNQUFNLGNBQWMsS0FBSztLQUM1RCw0QkFBNEIsWUFBWTtLQUN4QyxRQUFRLE1BQ0wsNEJBQ0MsWUFBWSxXQUNaLGNBQ0EsYUFBYSxNQUNmLEdBQ0EsMEJBQTBCLFlBQVksV0FBVyxZQU
15852FZLEdBQzdELCtCQUNFLGNBQ0EsYUFBYSxRQUNiLFNBQVMsU0FDWDtLQUNGO0lBQ0YsS0FBSztLQUNILG1DQUFtQyxNQUFNLGNBQWMsS0FBSztLQUM1RCw0QkFBNEIsWUFBWTtLQUN4QyxRQUFRLFFBQ0wsNkJBQ0MsU0FBUyxXQUNULGdCQUFnQixTQUFTLFFBQVEsTUFBTTtLQUMzQyxRQUFRLE1BQ04sNkJBQ0UsT0FBTyxhQUFhLGFBQ3RCLFNBQVMsU0FDTCxRQUFRLEtBQUssV0FDZixTQUFTLFVBQ0wsUUFBUSxLQUFLLE9BQU8saUJBQ3JCLEtBQUssT0FBTyxrQkFDWCxTQUFTLFFBQVEsUUFBUSxNQUFNLE9BQU8sS0FBSztLQUNuRDtJQUNGLEtBQUs7S0FDSCxLQUFLO0tBQ0wsbUNBQW1DLE1BQU0sY0FBYyxLQUFLO0tBQzVELDRCQUE0QixZQUFZO0tBQ3hDLFFBQVEsUUFDTCw2QkFDQyxTQUFTLFdBQ1QsZ0JBQWdCLFNBQVMsUUFBUSxNQUFNO0tBQzNDLElBQUksUUFBUSxHQUNWLElBQ0ksUUFBUSxTQUFTLFVBQVUsUUFBUSxnQkFBZ0IsTUFDcEQsUUFBUSxhQUFhLGVBQ3RCLFNBQVMsU0FFVCxJQUFJLFNBQVMsT0FDWCxJQUFJLFNBQVMsYUFBYSxXQUN4QixJQUFJLDBCQUNGLGFBQWEsWUFBWSx3QkFDdkIsYUFBYSxNQUNiLGFBQWEsZUFDYixLQUFLLGVBQ0wsWUFDRjtVQUNHO01BQ0gsR0FBRztPQUNELE9BQU8sYUFBYTtPQUNwQixRQUFRLGFBQWE7T0FDckIsUUFBUSxHQUFHLGlCQUFpQjtPQUM1QixHQUFHLFFBQVEsTUFBUjtRQUNELEtBQUs7U0FDSCxVQUFVLE1BQU0scUJBQXFCLE9BQU8sQ0FBQyxDQUFDO1NBQzlDLElBQ0UsQ0FBQyxXQUNELFFBQVEsNEJBQ1IsUUFBUSx3QkFDUixRQUFRLGlCQUFpQixpQkFDekIsUUFBUSxhQUFhLFVBQVUsR0FFL0IsVUFBVyxNQUFNLGNBQWMsSUFBSSxHQUNqQyxNQUFNLEtBQUssYUFDVCxTQUNBLE1BQU0sY0FBYyxjQUFjLENBQ3BDO1NBQ0oscUJBQXFCLFNBQVMsTUFBTSxLQUFLO1NBQ3pDLFFBQVEsdUJBQXVCO1NBQy9CLG9CQUFvQixPQUFPO1NBQzNCLE9BQU87U0FDUCxNQUFNO1FBQ1IsS0FBSztTQUNILElBQ0csS0FBSyw0QkFDSixRQUNBLFFBQ0EsS0FDRixDQUFDLENBQUMsSUFBSSxRQUFRLE1BQU0sUUFBUSxHQUFHLEdBRzdCO2VBQUEscUJBQXFCLEdBQ3JCLHFCQUFxQixHQUFHLFFBQ3hCLHNCQUVBLElBQ0ksVUFBVSxHQUFHLHFCQUNmLFFBQVEsYUFBYSxNQUFNLE9BQ3hCLFFBQVEsTUFBTSxRQUFRLE9BQU8sTUFBTSxPQUNoQyxPQUNBLE1BQU0sU0FDVixRQUFRLGFBQWEsS0FBSyxPQUN2QixRQUFRLE1BQU0sTUFBTSxPQUFPLE1BQU0sUUFDcEMsUUFBUSxhQUFhLE9BQU8sT0FDekIsUUFBUSxNQUFNLFFBQ1gsT0FDQSxNQUFNLFVBQ1osUUFBUSxhQUFhLGFBQWEsT0FDL0IsUUFBUSxNQUFNLGNBQ1gsT0FDQSxNQUFNLGNBQ2Q7V0FDQSxHQUFHLE9BQU8sb0JBQW9CLENBQUM7V0FDL0IsTUFBTTtVQUNSOztTQUNKLFVBQVUsTUFBTSxjQUFjLElBQUk7U0FDbEMscUJBQXFCLFNBQVMsTUFBTSxLQUFLO1NBQ3pDLE1BQU0sS0FBSyxZQUFZLE9BQU87U0FDOUI7UUFDRixLQUFLO1NBQ0gsSUFDRyxLQUFLLDRCQUNKLFFBQ0EsV0FDQSxLQUNGLENBQUMsQ0FBQyxJQUFJLFFBQVEsTUFBTSxXQUFXLEdBQUcsR0FHaEM7ZUFBQSxxQkFBcUIsR0FDckIscUJBQXFCLEdBQUcsUUFDeEIsc0JBRUEsSUFDSSxVQUFVLEdBQUcscUJBQ2YsNkJBQ0UsTUFBTSxTQUNOLFNBQ0YsR0FDQSxRQUFRLGFBQWEsU0FBUyxPQUMzQixRQUFRLE1BQU0sVUFDWCxPQUNBLEtBQUssTUFBTSxZQUNmLFFBQVEsYUFBYSxNQUFNLE9BQ3hCLFFBQVEsTUFBTSxPQUFPLE9BQU8sTUFBTSxTQUNyQyxRQUFRLGFBQWEsVUFBVSxPQUM1QixRQUFRLE1BQU0sV0FDWCxPQUNBLE1BQU0sYUFDWixRQUFRLGFBQWEsWUFBWSxPQUM5QixRQUFRLE1BQU0sWUFDWCxPQUNBLE1BQU0sY0FDWixRQUFRLGFBQWEsU0FBUyxPQUMzQixRQUFRLE1BQU0sVUFDWCxPQUNBLE1BQU0sVUFDZDtXQUNBLEdBQUcsT0FBTyxvQkFBb0IsQ0FBQztXQUMvQixNQUFNO1VBQ1I7O1NBQ0osVUFBVSxNQUFNLGNBQWMsSUFBSTtTQUNsQyxxQkFBcUIsU0FBUyxNQUFNLEtBQUs7U0FDekMsTUFBTSxLQUFLLFlBQVksT0FBTztTQUM5QjtRQUNGLFNBQ0UsTUFBTSxNQUNKLDZEQUNFLE9BQ0EsNkJBQ0o7T0FDSjtPQUNBLFFBQVEsdUJBQXVCO09BQy9CLG9CQUFvQixPQUFPO09BQzNCLE9BQU87TUFDVDtNQUNBLGFBQWEsWUFBWTtLQUMzQjtVQUVBLDRCQUNFLGVBQ0UsSUFDQSxhQUFhLE1BQ2IsYUFBYSxTQUNmO1VBRUosYUFBYSxZQUFZLGdCQUN2QixJQUNBLE9BQ0EsYUFBYSxhQUNmO1VBRUYsVUFBVSxTQUNMLFNBQVMsU0FDSixPQUFPLFFBQVEsV0FDakIsU0FBUyxRQUNQLDZCQUNBLEtBQUssV0FBVyxZQUFZLElBQUksS0FDbEMsTUFBTSxTQUNWLFNBQVMsUUFDTCw0QkFDQSxlQUNFLElBQ0EsYUFBYSxNQUNiLGFBQWEsU0FDZixJQUNBLGdCQUFnQixJQUFJLE9BQU8sYUFBYSxhQUFhLEtBQ3pELFNBQVMsU0FDVCxTQUFTLGFBQWEsYUFDdEIsaUJBQ0UsY0FDQSxhQUFhLGVBQ2IsUUFBUSxhQUNWO0tBQ1I7SUFDRixLQUFLO0tBQ0gsbUNBQW1DLE1BQU0sY0FBYyxLQUFLO0tBQzVELDRCQUE0QixZQUFZO0tBQ3hDLFFBQVEsUUFDTCw2QkFDQyxTQUFTLFdBQ1QsZ0JBQWdCLFNBQVMsUUFBUSxNQUFNO0tBQzNDLFNBQVMsV0FDUCxRQUFRLEtBQ1IsaUJBQ0UsY0FDQSxhQUFhLGVBQ2IsUUFBUSxhQUNWO0tBQ0Y7SUFDRixLQUFLO0tBQ0gsS0FBSztLQUNMLGdDQUFnQyxDQUFDO0tBQ2pDLG1DQUFtQyxNQUFNLGNBQWMsS0FBSztLQUM1RCxnQ0FBZ0M7S0FDaEMsNEJBQTRCLFlBQVk7S0FDeEMsUUFBUSxRQUNMLDZCQUNDLFNBQVMsV0FDVCxnQkFBZ0IsU0FBUyxRQUFRLE1BQU07S0FDM0MsSUFBSSxhQUFhLFFBQVEsSUFBSTtNQUMzQixPQUFPLGFBQWE7TUFDcEIsSUFBSTtPQUNGLGtCQUFrQixjQUFjLGtCQUFrQixJQUFJLEdBQ25ELGdDQUFnQyxDQUFDO01BQ3RDLFNBQVMsT0FBTztPQUNkLHdCQUF3QixjQUFjLGFBQWEsUUFBUSxLQUFLO01BQ2xFO0tBQ0Y7S0FDQSxRQUFRLEtBQ04sUUFBUSxhQUFhLGNBQ25CLE9BQU8sYUFBYSxlQUN0QixpQkFDRSxjQUNBLE1BQ0EsU0FBUyxVQUFVLFFBQVEsZ0JBQWdCLElBQzdDO0tBQ0YsUUFBUSxTQUNKLGlCQUFpQixDQUFDLEdBQ3BCLFdBQVcsYUFBYSxRQUN0QixRQUFRLE1BQ04sMEVBQ0Y7S0FDSjtJQUNGLEtBQUs7S0FDSCxtQ0FBbUMsTUFBTSxjQUFjLEtBQUs7S0FDNUQsNEJBQTRCLFlBQVk7S0FDeEMsSUFBSSxRQUFRLEdBQUc7TUFDYixJQUFJLFNBQVMsYUFBYSxXQUN4QixNQUFNLE1BQ0osZ0hBQ0Y7TUFDRixPQUFPLGFBQWE7TUFDcEIsUUFBUSxTQUFTLFVBQVUsUUFBUSxnQkFBZ0I7TUFDbkQsUUFBUSxhQUFhO01BQ3JCLElBQUk7T0FDRixrQkFDRSxjQUNBLGtCQUNBLE9BQ0EsT0FDQSxJQUNGLEdBQ0csZ0NBQWdDLENBQUM7T
15852UFDdEMsU0FBUyxPQUFPO09BQ2Qsd0JBQXdCLGNBQWMsYUFBYSxRQUFRLEtBQUs7TUFDbEU7S0FDRjtLQUNBO0lBQ0YsS0FBSztLQUNILEtBQUssMEJBQTBCO0tBQy9CLGdDQUFnQyxDQUFDO0tBQ2pDLFlBQVk7S0FDWixxQkFBcUI7S0FDckIsdUJBQXVCLGlCQUFpQixLQUFLLGFBQWE7S0FDMUQsbUNBQW1DLE1BQU0sY0FBYyxLQUFLO0tBQzVELHVCQUF1QjtLQUN2Qiw0QkFBNEIsWUFBWTtLQUN4QyxJQUNFLFFBQVEsS0FDUixTQUFTLFdBQ1QsUUFBUSxjQUFjLGNBRXRCLElBQUk7TUFDRixrQkFDRSxjQUNBLHlCQUNBLEtBQUssYUFDUDtLQUNGLFNBQVMsT0FBTztNQUNkLHdCQUF3QixjQUFjLGFBQWEsUUFBUSxLQUFLO0tBQ2xFO0tBQ0YsbUJBQ0ksaUJBQWlCLENBQUMsR0FBSSxzQkFBc0IsWUFBWTtLQUM1RCxLQUFLLGtCQUFrQix5QkFBeUIsRUFBRTtLQUNsRCxnQ0FBZ0MsQ0FBQztLQUNqQztJQUNGLEtBQUs7S0FDSCxRQUFRO0tBQ1IsZ0NBQWdDO0tBQ2hDLFVBQVUsb0JBQW9CO0tBQzlCLEtBQUs7S0FDTCx1QkFBdUIsaUJBQ3JCLGFBQWEsVUFBVSxhQUN6QjtLQUNBLG1DQUFtQyxNQUFNLGNBQWMsS0FBSztLQUM1RCw0QkFBNEIsWUFBWTtLQUN4Qyx1QkFBdUI7S0FDdkIsaUNBQ0UsMkJBQ0MsNkJBQTZCLENBQUM7S0FDakMsZ0NBQWdDO0tBQ2hDLGdDQUFnQztLQUNoQztJQUNGLEtBQUs7S0FDSCxRQUFRLDBCQUEwQjtLQUNsQyxtQ0FBbUMsTUFBTSxjQUFjLEtBQUs7S0FDNUQsNEJBQTRCLFlBQVk7S0FDeEMsYUFBYSxVQUFVLGtCQUNyQiw0QkFBNEIsS0FBSztLQUNuQztJQUNGLEtBQUs7S0FDSCxtQ0FBbUMsTUFBTSxjQUFjLEtBQUs7S0FDNUQsNEJBQTRCLFlBQVk7S0FDeEMsUUFBUSxNQUNKLE9BQU8sYUFBYSxhQUN0QixTQUFTLFNBQ0wsYUFBYSxjQUFjLE1BQzdCLDZCQUE2QixjQUFjLElBQUk7S0FDbkQ7SUFDRixLQUFLO0tBQ0gsbUNBQW1DLE1BQU0sY0FBYyxLQUFLO0tBQzVELDRCQUE0QixZQUFZO0tBQ3hDLGFBQWEsTUFBTSxRQUFRLFFBQ3hCLFNBQVMsYUFBYSxtQkFDcEIsU0FBUyxXQUFXLFNBQVMsUUFBUSxtQkFDdkMsK0JBQStCLE1BQU07S0FDeEMsUUFBUSxNQUNKLE9BQU8sYUFBYSxhQUN0QixTQUFTLFNBQ0wsYUFBYSxjQUFjLE1BQzdCLDZCQUE2QixjQUFjLElBQUk7S0FDbkQ7SUFDRixLQUFLO0tBQ0gsS0FBSyxTQUFTLGFBQWE7S0FDM0IscUJBQ0UsU0FBUyxXQUFXLFNBQVMsUUFBUTtLQUN2QyxJQUFJLCtCQUErQiwwQkFDakMsZ0NBQWdDLDJCQUNoQyxzQ0FBc0M7S0FDeEMsMkJBQTJCLGdDQUFnQztLQUMzRCxnQ0FDRSx1Q0FBdUM7S0FDekMsNEJBQ0UsaUNBQWlDO0tBQ25DLG1DQUFtQyxNQUFNLGNBQWMsS0FBSztLQUM1RCw0QkFBNEI7S0FDNUIsZ0NBQWdDO0tBQ2hDLDJCQUEyQjtLQUMzQixzQkFDRSxDQUFDLE1BQ0QsQ0FBQyxnQ0FDRCxDQUFDLGtDQUNBLGFBQWEsT0FBTyxpQkFBaUIsVUFDdEMsS0FBSyw0QkFDTCxLQUFLLDBCQUNMLE1BQU8seUJBQXlCLDRCQUNoQyx1QkFDRSxjQUNBLDBCQUNBLHNCQUNGO0tBQ0YsNEJBQTRCLFlBQVk7S0FDeEMsUUFBUSxTQUNKLE9BQU8sYUFBYSxXQUNyQixLQUFLLGNBQWMsS0FDaEIsS0FBSyxjQUFjLENBQUMsbUJBQ3BCLEtBQUssY0FBYyxrQkFDdkIsQ0FBQyxNQUNDLFNBQVMsV0FDVCxzQkFDQSw0QkFDQSw4QkFDRSxPQUFPLHVCQUNSLFFBQVEsc0JBQXNCLDJCQUM5QixVQUFVLDBCQUNWLHFCQUFxQiwyQkFDckIsMkJBQTJCLE1BQU0sMEJBQ2pDLDRCQUE0QixPQUM3QiwwQ0FBMEMsY0FBYyxJQUFJLElBQzNELGFBQWEsT0FBTyxpQkFBaUIsVUFDcEMsS0FBSyw0QkFDTCxLQUFLLDBCQUNMLE1BQU8seUJBQXlCLDRCQUNoQyxvQkFDRSxjQUNBLDBCQUNBLHdCQUNBLFlBQ0YsR0FDRCwyQkFBMkIsU0FDM0IsNEJBQTRCLHFCQUM5QixDQUFDLE1BQU0saUNBQ04sd0JBQXdCLGNBQWMsRUFBRTtLQUM1QyxRQUFRLE1BQ0osT0FBTyxhQUFhLGFBQ3RCLFNBQVMsU0FDTCxRQUFRLEtBQUssWUFDZixTQUFTLFVBQ0wsS0FBSyxhQUFhLE1BQ3BCLDZCQUE2QixjQUFjLEtBQUs7S0FDdEQ7SUFDRixLQUFLO0tBQ0gsbUNBQW1DLE1BQU0sY0FBYyxLQUFLO0tBQzVELDRCQUE0QixZQUFZO0tBQ3hDLFFBQVEsTUFDSixPQUFPLGFBQWEsYUFDdEIsU0FBUyxTQUNMLGFBQWEsY0FBYyxNQUM3Qiw2QkFBNkIsY0FBYyxJQUFJO0tBQ25EO0lBQ0YsS0FBSztLQUNILFFBQVEsUUFDTCw2QkFDQyxTQUFTLFdBQ1QsZ0JBQWdCLFNBQVMsUUFBUSxNQUFNO0tBQzNDLFFBQVEsb0JBQW9CO0tBQzVCLEtBQUs7S0FDTCxzQkFBc0IsUUFBUSxlQUFlO0tBQzdDLCtCQUErQixhQUFhO0tBQzVDLHlCQUNFLHNCQUNBLFdBQ0UsMkJBQ0UsNkJBQTZCLFNBQzdCLDZCQUE2QixNQUMvQjtLQUNKLG1DQUFtQyxNQUFNLGNBQWMsS0FBSztLQUM1RCw0QkFBNEIsWUFBWTtLQUN4QyxzQkFDRSxTQUFTLFdBQ1Qsa0NBQ0MsYUFBYSxTQUFTO0tBQ3pCLHlCQUF5QjtLQUN6QixnQ0FBZ0M7S0FDaEM7SUFDRixLQUFLLElBQ0g7SUFDRixLQUFLLEdBQ0gsUUFBUSxRQUNMLDZCQUNDLFNBQVMsV0FDVCxnQkFBZ0IsU0FBUyxRQUFRLE1BQU0sSUFDekMsV0FDRSxTQUFTLFFBQVEsY0FDaEIsUUFBUSxVQUFVLGlCQUFpQjtJQUMxQyxTQUNFLG1DQUFtQyxNQUFNLGNBQWMsS0FBSyxHQUMxRCw0QkFBNEIsWUFBWTtHQUM5QztHQUNBLENBQUMsYUFBYSxPQUFPLGlCQUFpQixVQUNwQyxLQUFLLDRCQUNMLEtBQUssNEJBQ0gsZ0NBQWdDLE1BQU8sNEJBQ3ZDLG1CQUNFLGNBQ0EsMEJBQ0Esd0JBQ0EseUJBQ0EscUJBQ0YsR0FDRixTQUFTLGFBQWEsYUFDcEIsU0FBUyxhQUFhLFVBQ3RCLFNBQVMsYUFBYSxPQUFPLGFBQzdCLE1BQU8seUJBQXlCLDZCQUMvQixrQkFDQyxhQUFhLE9BQU8sV0FDcEIsYUFBYSxNQUNmLEtBQ0Usb0JBQ0UsY0FDQSwwQkFDQSx3QkFDQSxPQUNGO0dBQ04sd0JBQXdCLGVBQWU7R0FDdkMsMkJBQTJCLGtCQUFrQjtHQUM3Qyx3QkFBd0I7R0FDeEIsK0JBQStCO0VBQ2pDO0VBQ0EsU0FBUyw0QkFBNEIsY0FBYztHQUNqRCxJQUFJLFFBQVEsYUFBYTtHQUN6QixJQUFJLFFBQVEsR0FBRztJQUNiLElBQUk7S0FDRixrQkFBa0IsY0FBYyxpQkFBaUIsWUFBWTtJQUMvRCxTQUFTLE9BQU87S0FDZCx3QkFBd0IsY0FBYyxhQUFhLFFBQVEsS0FBSztJQUNsRTtJQUNBLGFBQWEsU0FBUztHQUN4QjtHQUNBLFFBQVEsU0FBUyxhQUFhLFNBQVM7RUFDekM7RUFDQSxTQUFTLHNCQUFzQixhQUFhO0dBQzFDLElBQUksWUFBWSxlQUFlLE1BQzdCLEtBQUssY0FBYyxZQUFZLE9BQU8sU0FBUyxjQUFlO0lBQzVELElBQUksUUFBUTtJQUNaLHNCQUFzQixLQUFLO0lBQzNCLE1BQU0sTUFBTSxPQUNWLE1BQU0sUUFBUSxTQUNaLFFBQVEsTUFBTSxXQUNmLFdBQVcsQ0FBQyxHQUNiLE1BQU0sTUFBTSxHQUNYLFdBQVcsQ0FBQztJQUNmLGNBQWMsWUFBWTtHQUM1QjtFQUNKO0VBQ0EsU0FBUyx3Q0FBd0MsTUFBTSxhQUFhO0dBQ2xFLElBQUksWUFBWSxlQUFlLE1BQzdCLEtBQUssY0FBYyxZQUFZLE9BQU8sU0FBUyxjQUM3QyxrQ0FBa0MsYUFBYSxJQUFJLEdBQ2hELGNBQWMsWUFBWTtRQUM1Qiw2QkFBNkIsYUFBYSxDQUFDLENBQUM7RUFDbkQ7RUFDQSxTQUFTLGtDQUFrQyxjQUFjLE1BQU07R0FDN0QsSUFBSSxVQUFVLGFBQWE7R0FDM0IsSUFBSSxTQUFTLFNBQVMsMkJBQTJCLGNBQWMsQ0FBQyxDQUFDO1F
15852BRS9ELFFBQVEsYUFBYSxLQUFyQjtJQUNFLEtBQUs7S0FDSCxpQ0FBaUMsK0JBQStCLENBQUM7S0FDakUsa0NBQWtDO0tBQ2xDLHdDQUF3QyxNQUFNLFlBQVk7S0FDMUQsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLDRCQUE0QjtNQUNoRSxlQUFlO01BQ2YsSUFBSSxTQUFTLGNBQ1gsS0FBSyxJQUFJLElBQUksR0FBRyxJQUFJLGFBQWEsUUFBUSxLQUFLLEdBQUc7T0FDL0MsVUFBVSxhQUFhO09BQ3ZCLElBQUksVUFBVSxhQUFhLElBQUk7T0FDL0IsMEJBQTBCLFNBQVMsYUFBYSxJQUFJLEVBQUU7T0FDdEQsVUFBVSxRQUFRLGNBQWM7T0FDaEMsU0FBUyxXQUNQLFFBQVEsUUFDTjtRQUFFLFNBQVMsQ0FBQyxHQUFHLENBQUM7UUFBRyxlQUFlLENBQUMsUUFBUSxNQUFNO09BQUUsR0FDbkQ7UUFDRSxVQUFVO1FBQ1YsTUFBTTtRQUNOLGVBQ0UsNkJBQTZCLFVBQVU7T0FDM0MsQ0FDRjtNQUNKO01BQ0YsZUFBZSxLQUFLO01BQ3BCLGVBQ0UsTUFBTSxhQUFhLFdBQ2YsYUFBYSxrQkFDYixhQUFhLGNBQWM7TUFDakMsU0FBUyxnQkFDUCxPQUFPLGFBQWEsTUFBTSx1QkFDeEIsYUFBYSxNQUFNLHFCQUFxQixRQUMxQyxhQUFhLFFBQ1g7T0FBRSxTQUFTLENBQUMsR0FBRyxDQUFDO09BQUcsZUFBZSxDQUFDLFFBQVEsTUFBTTtNQUFFLEdBQ25EO09BQ0UsVUFBVTtPQUNWLE1BQU07T0FDTixlQUFlO01BQ2pCLENBQ0YsR0FDQSxhQUFhLFFBQ1g7T0FBRSxPQUFPLENBQUMsR0FBRyxDQUFDO09BQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQztNQUFFLEdBQ2hDO09BQ0UsVUFBVTtPQUNWLE1BQU07T0FDTixlQUFlO01BQ2pCLENBQ0Y7TUFDRixpQ0FBaUMsQ0FBQztLQUNwQztLQUNBLG1DQUFtQztLQUNuQztJQUNGLEtBQUs7S0FDSCx3Q0FBd0MsTUFBTSxZQUFZO0tBQzFEO0lBQ0YsS0FBSztLQUNILElBQUk7S0FDSiwrQkFBK0IsQ0FBQztLQUNoQyx3Q0FBd0MsTUFBTSxZQUFZO0tBQzFELGlDQUFpQyw2QkFBNkIsQ0FBQztLQUMvRCwrQkFBK0I7S0FDL0I7SUFDRixLQUFLO0tBQ0gsU0FBUyxhQUFhLGtCQUNuQixTQUFTLFFBQVEsZ0JBQ2QsMkJBQTJCLGNBQWMsQ0FBQyxDQUFDLElBQzNDLHdDQUF3QyxNQUFNLFlBQVk7S0FDaEU7SUFDRixLQUFLO0tBQ0gsSUFBSTtLQUNKLFVBQVUsa0NBQWtDO0tBQzVDLCtCQUErQixDQUFDO0tBQ2hDLHdDQUF3QyxNQUFNLFlBQVk7S0FDMUQsaUNBQWlDLGFBQWEsU0FBUztLQUN2RCxJQUFJLFFBQVEsYUFBYSxlQUN2QixRQUFRLGFBQWE7S0FDdkIsT0FBTyxzQkFBc0IsT0FBTyxLQUFLO0tBQ3pDLFFBQVEsc0JBQXNCLFFBQVEsZUFBZSxLQUFLO0tBQzFELElBQUksWUFBWSwyQkFDZCxNQUFNLFNBQ04sTUFBTSxNQUNSO0tBQ0EsV0FBVyxZQUNOLE9BQU8sQ0FBQyxLQUNQLFFBQVEsUUFBUSxlQUNqQixRQUFRLGdCQUFnQixNQUN4QixVQUFVLGFBQWEsT0FDdkIsZ0NBQWdDLEdBQ2hDLE9BQU8sNENBQ04sY0FDQSxTQUNBLE1BQ0EsT0FDQSxXQUNBLE9BQ0EsQ0FBQyxDQUNILEdBQ0EsbUNBQ0csU0FBUyxRQUFRLElBQUksTUFBTSxZQUMzQixhQUFhLFNBQVM7S0FDN0IsT0FBTyxhQUFhLFFBQVEsTUFBTSxRQUM3Qiw0QkFDQyxjQUNBLGFBQWEsY0FBYyxRQUM3QixHQUNDLG1DQUFtQyxXQUNwQyxTQUFTLFlBQ1IsUUFBUSxLQUFLLE1BQU0sU0FBUyxnQ0FBZ0MsR0FDNUQsbUNBQW1DO0tBQ3hDLCtCQUNFLE9BQU8sYUFBYSxRQUFRLE1BQU0sQ0FBQyxJQUFJO0tBQ3pDO0lBQ0YsU0FDRSx3Q0FBd0MsTUFBTSxZQUFZO0dBQzlEO0VBQ0o7RUFDQSxTQUFTLGlDQUFpQyxNQUFNLGFBQWE7R0FDM0QsSUFBSSxZQUFZLGVBQWUsTUFDN0IsS0FBSyxjQUFjLFlBQVksT0FBTyxTQUFTLGNBQzdDLDBCQUEwQixNQUFNLFlBQVksV0FBVyxXQUFXLEdBQy9ELGNBQWMsWUFBWTtFQUNuQztFQUNBLFNBQVMsdUJBQXVCLGNBQWMsNEJBQTRCO0dBQ3hFLElBQUksa0JBQWtCLHlCQUF5QixHQUM3QyxxQkFBcUIsNEJBQTRCLEdBQ2pELG1CQUFtQiwwQkFBMEIsR0FDN0MsMkJBQTJCLGtDQUFrQztHQUMvRCxRQUFRLGFBQWEsS0FBckI7SUFDRSxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0tBQ0gsK0JBQ0UsY0FDQSxhQUFhLFFBQ2IsTUFDRjtLQUNBLDBDQUNFLGNBQ0EsMEJBQ0Y7S0FDQTtJQUNGLEtBQUs7S0FDSCxnQkFBZ0IsY0FBYyxhQUFhLE1BQU07S0FDakQsSUFBSSxXQUFXLGFBQWE7S0FDNUIsZUFBZSxPQUFPLFNBQVMsd0JBQzdCLCtCQUNFLGNBQ0EsYUFBYSxRQUNiLFFBQ0Y7S0FDRiwwQ0FDRSxjQUNBLDBCQUNGO0tBQ0E7SUFDRixLQUFLLElBQ0gsQ0FBQyw2QkFBNkIsMkJBQzVCLGdDQUNBLGtCQUNFLGNBQ0EsMEJBQ0EsYUFBYSxXQUNiLGFBQWEsTUFDYixhQUFhLGFBQ2Y7SUFDSixLQUFLO0tBQ0gsZ0JBQWdCLGNBQWMsYUFBYSxNQUFNO0tBQ2pELE1BQU8sYUFBYSxPQUFPLE9BQU8sYUFBYSxPQUM3QyxzQ0FBc0MsWUFBWTtLQUNwRCwwQ0FDRSxjQUNBLDBCQUNGO0tBQ0E7SUFDRixLQUFLO0tBQ0gsc0NBQXNDLFlBQVk7S0FDbEQ7SUFDRixLQUFLO0tBQ0gsZ0JBQWdCLGNBQWMsYUFBYSxNQUFNO0tBQ2pELFdBQVcsYUFBYTtLQUN4QixTQUFTLGFBQWEsaUJBQ3BCLFNBQVMsWUFDVCw2QkFDQSxTQUFTLFdBQVcsWUFBWSxRQUFRO0tBQzFDLDBDQUNFLGNBQ0EsMEJBQ0Y7S0FDQTtJQUNGLEtBQUs7S0FDSCxTQUFTLGFBQWEsaUJBQ3BCLDBDQUNFLGNBQ0EsMEJBQ0Y7S0FDRjtJQUNGLEtBQUs7S0FDSCxhQUFhLFFBQVEsWUFDbkIsMkJBQTJCLFlBQVk7S0FDekMsZ0JBQWdCLGNBQWMsYUFBYSxNQUFNO0tBQ2pELDBDQUNFLGNBQ0EsMEJBQ0Y7S0FDQTtJQUNGLEtBQUssR0FDSCxnQkFBZ0IsY0FBYyxhQUFhLE1BQU07SUFDbkQsU0FDRSwwQ0FDRSxjQUNBLDBCQUNGO0dBQ0o7R0FDQSxDQUFDLGFBQWEsT0FBTyxpQkFBaUIsVUFDcEMsS0FBSyw0QkFDTCxLQUFLLDJCQUNKLGdDQUFnQyxNQUFPLDRCQUN4QyxtQkFDRSxjQUNBLDBCQUNBLHdCQUNBLHlCQUNBLHFCQUNGO0dBQ0Ysd0JBQXdCLGVBQWU7R0FDdkMsMkJBQTJCLGtCQUFrQjtHQUM3Qyx3QkFBd0I7R0FDeEIsK0JBQStCO0VBQ2pDO0VBQ0EsU0FBUywwQ0FDUCxhQUNBLDRCQUNBO0dBQ0EsS0FBSyxjQUFjLFlBQVksT0FBTyxTQUFTLGNBQzdDLHVCQUF1QixhQUFhLDBCQUEwQixHQUMzRCxjQUFjLFlBQVk7RUFDakM7RUFDQSxTQUFTLHNCQUNQLGNBQ0EsU0FDQSxjQUNBLDRCQUNBO0dBQ0EsSUFBSSxrQkFBa0IseUJBQXlCLEdBQzdDLHFCQUFxQiw0QkFBNEIsR0FDakQsbUJBQW1CLDBCQUEwQixHQUM3QywyQkFBMkIsa0NBQWtDLEdBQzdELFFBQVEsYUFBYSxPQUNyQixnQ0FDRyw2QkFBNkIsa0NBQzlCO0dBQ0osUUFBUSxhQUFhLEtB
15852QXJCO0lBQ0UsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0tBQ0gseUNBQ0UsY0FDQSxjQUNBLDBCQUNGO0tBQ0Esd0JBQXdCLGNBQWMsTUFBTTtLQUM1QztJQUNGLEtBQUs7S0FDSCx5Q0FDRSxjQUNBLGNBQ0EsMEJBQ0Y7S0FDQSxVQUFVLGFBQWE7S0FDdkIsZUFBZSxPQUFPLFFBQVEscUJBQzVCLGtCQUNFLGNBQ0EsNEJBQ0EsY0FDQSxPQUNGO0tBQ0YsVUFBVSxhQUFhO0tBQ3ZCLElBQUksU0FBUyxTQUFTO01BQ3BCLGVBQWUsYUFBYTtNQUM1QixJQUFJO09BQ0Ysa0JBQ0UsY0FDQSx1QkFDQSxTQUNBLFlBQ0Y7TUFDRixTQUFTLE9BQU87T0FDZCx3QkFBd0IsY0FBYyxhQUFhLFFBQVEsS0FBSztNQUNsRTtLQUNGO0tBQ0EsZ0NBQ0UsUUFBUSxNQUNSLHFCQUFxQixZQUFZO0tBQ25DLGdCQUFnQixjQUFjLGFBQWEsTUFBTTtLQUNqRDtJQUNGLEtBQUssSUFDSCxDQUFDLDZCQUE2QiwyQkFDNUIsZ0NBQ0EsK0JBQStCLFlBQVk7SUFDL0MsS0FBSztLQUNILE1BQU8sYUFBYSxPQUFPLE9BQU8sYUFBYSxPQUM3Qyx1Q0FBdUMsWUFBWTtLQUNyRCx5Q0FDRSxjQUNBLGNBQ0EsMEJBQ0Y7S0FDQSxnQ0FDRSxTQUFTLFdBQ1QsUUFBUSxLQUNSLGdCQUFnQixZQUFZO0tBQzlCLGdCQUFnQixjQUFjLGFBQWEsTUFBTTtLQUNqRDtJQUNGLEtBQUs7S0FDSCx1Q0FBdUMsWUFBWTtLQUNuRDtJQUNGLEtBQUs7S0FDSCxJQUFJLFdBQVcsYUFBYTtLQUM1QixTQUFTLGFBQWEsaUJBQ3BCLFNBQVMsWUFDVCw0QkFDQSxlQUNFLGlCQUFpQixTQUFTLGFBQWEsR0FDdkMsYUFBYSxNQUNiLFFBQ0Y7S0FDRix5Q0FDRSxjQUNBLGNBQ0EsMEJBQ0Y7S0FDQSxnQ0FDRSxTQUFTLFdBQ1QsUUFBUSxLQUNSLGdCQUFnQixZQUFZO0tBQzlCLGdCQUFnQixjQUFjLGFBQWEsTUFBTTtLQUNqRDtJQUNGLEtBQUs7S0FDSCxJQUFJLGdDQUFnQyxRQUFRLEdBQUc7TUFDN0MsUUFBUSwwQkFBMEI7TUFDbEMseUNBQ0UsY0FDQSxjQUNBLDBCQUNGO01BQ0EsK0JBQStCLGFBQWE7TUFDNUMsNkJBQTZCLGtCQUMzQiw0QkFBNEIsS0FBSztNQUNuQyxJQUFJO09BQ0Ysa0JBQ0UsY0FDQSxnQkFDQSxjQUNBLFNBQ0EsaUJBQ0EsNkJBQTZCLGNBQy9CO01BQ0YsU0FBUyxPQUFPO09BQ2Qsd0JBQXdCLGNBQWMsYUFBYSxRQUFRLEtBQUs7TUFDbEU7S0FDRixPQUNFLHlDQUNFLGNBQ0EsY0FDQSwwQkFDRjtLQUNGO0lBQ0YsS0FBSztLQUNILHlDQUNFLGNBQ0EsY0FDQSwwQkFDRjtLQUNBLGdDQUNFLFFBQVEsS0FDUixpQ0FBaUMsY0FBYyxZQUFZO0tBQzdEO0lBQ0YsS0FBSztLQUNILHlDQUNFLGNBQ0EsY0FDQSwwQkFDRjtLQUNBLGdDQUNFLFFBQVEsS0FDUixpQ0FBaUMsY0FBYyxZQUFZO0tBQzdEO0lBQ0YsS0FBSztLQUNILFNBQVMsYUFBYSxpQkFDcEIseUNBQ0UsY0FDQSxjQUNBLDBCQUNGO0tBQ0YsZ0JBQWdCLGNBQWMsYUFBYSxNQUFNO0tBQ2pEO0lBQ0YsS0FBSztLQUNILHlDQUNFLGNBQ0EsY0FDQSwwQkFDRjtLQUNBLFFBQVEsWUFBWSx5QkFBeUIsWUFBWTtLQUN6RCxnQkFBZ0IsY0FBYyxhQUFhLE1BQU07S0FDakQ7SUFDRixLQUFLLEdBQ0gsZ0JBQWdCLGNBQWMsYUFBYSxNQUFNO0lBQ25ELFNBQ0UseUNBQ0UsY0FDQSxjQUNBLDBCQUNGO0dBQ0o7R0FDQSxDQUFDLGFBQWEsT0FBTyxpQkFBaUIsVUFDcEMsS0FBSyw0QkFDTCxLQUFLLDJCQUNKLGdDQUFnQyxNQUFPLDRCQUN4QyxtQkFDRSxjQUNBLDBCQUNBLHdCQUNBLHlCQUNBLHFCQUNGO0dBQ0Ysd0JBQXdCLGVBQWU7R0FDdkMsMkJBQTJCLGtCQUFrQjtHQUM3Qyx3QkFBd0I7R0FDeEIsK0JBQStCO0VBQ2pDO0VBQ0EsU0FBUyx5Q0FDUCxjQUNBLGFBQ0EsNEJBQ0E7R0FDQSw2QkFDRSxPQUFPLFlBQVksZUFBZSxRQUM5Qiw2QkFDQSw2QkFBNkIsQ0FBQztHQUNwQyxLQUFLLGNBQWMsWUFBWSxPQUFPLFNBQVMsY0FDN0Msc0JBQ0UsY0FDQSxZQUFZLFdBQ1osYUFDQSwwQkFDRixHQUNHLGNBQWMsWUFBWTtFQUNqQztFQUNBLFNBQVMsbUNBQW1DLFNBQVMsY0FBYztHQUNqRSxJQUFJLGdCQUFnQjtHQUNwQixTQUFTLFdBQ1AsU0FBUyxRQUFRLGlCQUNqQixTQUFTLFFBQVEsY0FBYyxjQUM5QixnQkFBZ0IsUUFBUSxjQUFjLFVBQVU7R0FDbkQsVUFBVTtHQUNWLFNBQVMsYUFBYSxpQkFDcEIsU0FBUyxhQUFhLGNBQWMsY0FDbkMsVUFBVSxhQUFhLGNBQWMsVUFBVTtHQUNsRCxZQUFZLGtCQUNULFFBQVEsV0FBVyxZQUFZLE9BQU8sR0FDdkMsUUFBUSxpQkFBaUIsYUFBYSxhQUFhO0VBQ3ZEO0VBQ0EsU0FBUyw4QkFBOEIsU0FBUyxjQUFjO0dBQzVELFVBQVU7R0FDVixTQUFTLGFBQWEsY0FDbkIsVUFBVSxhQUFhLFVBQVUsY0FBYztHQUNsRCxlQUFlLGFBQWEsY0FBYztHQUMxQyxpQkFBaUIsWUFDZCxZQUFZLFlBQVksR0FBRyxRQUFRLFdBQVcsYUFBYSxPQUFPO0VBQ3ZFO0VBQ0EsU0FBUyx1Q0FDUCxNQUNBLGFBQ0EsZ0JBQ0Esc0JBQ0EsU0FDQTtHQUNBLElBQUksNEJBQ0QsaUJBQWlCLGVBQWU7R0FDbkMsSUFDRSxZQUFZLGdCQUFnQiwyQkFBMkIsUUFBUSxVQUM5RCxNQUFNLFlBQVksbUJBQ2hCLFNBQVMsWUFBWSxhQUNwQixZQUFZLFVBQVUsVUFBVSxZQUFZLFFBRWhELEtBQUssY0FBYyxZQUFZLE9BQU8sU0FBUyxjQUM3QywyQkFBNEIsWUFBWSxTQUN0QywwQkFDRSxNQUNBLGFBQ0EsZ0JBQ0Esc0JBQ0EsU0FBUywyQkFDTCx5QkFBeUIsa0JBQ3pCLE9BQ04sR0FDQyxjQUFjO1FBRW5CLDRCQUE0Qiw2QkFBNkIsV0FBVztFQUN4RTtFQUNBLFNBQVMsMEJBQ1AsY0FDQSxjQUNBLGdCQUNBLHNCQUNBLFNBQ0E7R0FDQSxJQUFJLGtCQUFrQix5QkFBeUIsR0FDN0MscUJBQXFCLDRCQUE0QixHQUNqRCxtQkFBbUIsMEJBQTBCLEdBQzdDLDJCQUEyQixrQ0FBa0MsR0FDN0QsbUJBQW1CLDhCQUNuQiw0QkFDRyxpQkFBaUIsZUFBZTtHQUNyQyw0QkFDRSxTQUFTLGFBQWEsYUFDdEIsU0FBUyxhQUFhLFVBQ3RCLFNBQVMsYUFBYSxPQUFPLGFBQzdCLGtDQUFrQyxZQUFZO0dBQ2hELElBQUksUUFBUSxhQUFhO0dBQ3pCLFFBQVEsYUFBYSxLQUFyQjtJQUNFLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztLQUNILENBQUMsYUFBYSxPQUFPLGlCQUFpQixVQUNwQyxJQUFJLGFBQWEsbUJBQ2pCLE9BQU8sYUFBYSxRQUFRLE1BQzVCLG1CQUNFLGNBQ0EsYUFBYSxpQkFDYixTQUNBLG1CQUNBLGNBQ0Y7S0FDRix1Q0FDRSxjQUNBLGNBQ0EsZ0JBQ0Esc0JBQ0EsT0FDRjtLQUNBLFFBQVEsUUFDTiw4QkFBOEIsY0FBYyxVQUFVLFNBQVM7S0FDakU7SUFDRixLQUFLO0tBQ0gsQ0FBQyxhQUFhLE9BQU8saUJBQWlCLFVBQ3BDLElBQUksYUFBYSxvQkFDaEIsT0FBTyxhQUFhLFFBQVEsT0FDekIsb0JBQ0UsY0FDQSxhQUFhLGlCQUNiLFNBQ0EsQ0FBQyxDQUNILElBQ0EsT0FBTyxhQUFhLFFBQVEsTUFDNUIsbUJBQ0UsY0FDQSxhQUFhLGlCQUNiLFNBQ0EsbUJBQ0EsY0FDRjtLQUNOLHVDQUNFLGNBQ0EsY0FDQSxnQkFDQSxzQkFDQSxPQUNGO0tBQ0E7SUFDRixLQUFLO0tBQ0gsSUFBSSw2QkFBNkIsMEJBQTBCLEdBQ3pELHVCQUF1QjtLQUN6QixvQkFDRSxTQUFTLGFBQWEsYUFDdEIsYUFBYSxVQUFVLGNBQWMsZ0JBQ3JDLE9BQU8sYUFBYSxRQUFRO0tBQzlCLHVDQUNFLGNBQ0EsY0FDQSxnQkFDQSxzQkFDQSxPQUNGO0tBQ0Esb0JBQW9CO0tBQ3BCLDRCQUNFLG1DQUNFLGlCQUFpQixhQUFhLGVBQy9CLGlCQUNDLE1BQU0sZUFBZSxXQUNqQixlQUFlLE9BQ2YsV0FBVyxlQUFlLFdBQ3hCLGVBQWUsY0FBYyxPQUM3QixnQkFDUixXQUFXLGVBQWUsTUFBTSx1QkFDN0IsZUFBZSxNQUFNLHFCQUFxQixLQUM1QyxpQkFBaUIsZUFBZSxjQUFjLGlCQUMvQyxTQUFTLGtCQUNQLFdBQVcsZUFBZSxNQUFNLHVCQUMvQixlQUFlLE1BQU0scUJBQXFCO0tBQy9DLFFBQVEsU0FDSixpQkFBaUIsTUFDbkIsU0FBUyxhQUFhLGNBQ25CLGlCQUFpQixhQUFhLFVBQVUsY0FBYyxRQUN4RCx1QkFBdUIsYUFBYSxjQUFjLE9BQ25ELHlCQUF5QixtQkFDdEIsWUFBWSxvQkFBb0IsR0FDakMsUUFBUSxrQkFBa0IsYUFBYSxjQUFjO0tBQ3pELGFBQWEseUJBQXlCLHlCQUNwQywwQkFDRjtLQUNBO0lBQ0YsS0FBSztLQUNILElBQUksUUFBUSxNQUFNO01BQ2hCLFFBQVEsMEJBQTBCO01BQ2xDLHVDQUNFLGNBQ0EsY0FDQSxnQkFDQSxzQkFDQSxPQUNGO01BQ0EsZUFBZSxhQUFhO01BQzVCLGFBQWEseUJBQ1gsNEJBQTRCLEtBQUs7TUFDbkMsSUFBSTtPQUNGLGtCQUNFLGNBQ0EsOEJBQ0EsY0FDQSxhQUFhLFdBQ2IsaUJBQ0EsYUFBYSxxQkFDZjtNQUNGLFNBQVMsT0FBTztPQUNkLHdCQUF3QixjQUFjLGFBQWEsUUFBUSxLQUFLO01BQ2xFO0tBQ0YsT0FDRSx1Q0FDRSxjQUNBLGNBQ0EsZ0JBQ0Esc0JBQ0EsT0FDRjtLQUNGO0lBQ0YsS0FBSztLQUNILFFBQVE7S0FDUiw2QkFDRSxTQUFTLGFBQWEsWUFDbEIsYUFBYSxVQUFVLGdCQUN2QjtLQUNOLDJCQUEyQixhQUFhO0tBQ3hDLFNBQVMsOEJBQ1QsU0FBUyw0QkFDSCwyQkFBMkIsYUFBYSxXQUMxQyxTQUFTLDRCQUNULElBQUkseUJBQXlCLFVBQzdCLE9BQU8seUJBQXlCLEVBQUUsQ0FBQyxPQUM3QixvQkFBb0IsQ0FBQyxHQUN0Qiw2QkFDQywyQkFBMkIsaUJBQzdCLFNBQVMsOEJBQ1Asb0JBQ0UsY0FDQSxhQUFhLGlCQUNiLFNBQ0EsMEJBQ0YsS0FDRCxvQkFBb0IsQ0FBQyxLQUN6QixvQkFBb0IsQ0FBQztLQUMxQix1Q0FDRSxjQUNBLGNBQ0EsZ0JBQ0Esc0JBQ0EsT0FDRjtLQUNBLG9CQUFvQjtLQUNwQjtJQUNGLEtBQUs7S0FDSCxRQUFRO0tBQ1IsNkJBQ0UsU0FBUyxhQUFhLFlBQ2xCLGFBQWEsVUFBVSxnQkFDdkI7S0FDTiwyQkFBMkIsYUFBYTtLQUN4QyxTQUFTLDhCQUNULFNBQVMsMkJBQTJCLGNBQ25DLFNBQVMsNEJBQ1IsU0FBUyx5QkFBeUIsYUFDL0Isb0JBQW9CLENBQUMsS0FDcEIsMkJBQTJCLGFBQWEsV0FDMUMsU0FBUyw0QkFDVCxJQUFJLHlCQUF5QixVQUM3QixPQUFPLHlCQUF5QixFQUFFLENBQUMsT0FDN0Isb0JBQW9CLENBQUMsR0FDdEIsNkJBQ0MsMkJBQTJCLGlCQUM3QixTQUFTLDhCQUNQLG9CQUNFLGNBQ0EsYUFBYSxpQkFDYixTQUNBLDBCQUNGLEtBQ0Qsb0JBQW9CLENBQUM7S0FDOUIsdUNBQ0UsY0FDQSxjQUNBLGdCQUNBLHNCQUNBLE9BQ0Y7S0FDQSxvQkFBb0I7S0FDcEI7SUFDRixLQUFLLElBQ0g7SUFDRixLQUFLO0tBQ0gsdUJBQXVCLGFBQWE7S0FDcEMsNkJBQTZCLGFBQWE7S0FDMUMsU0FBUyxhQUFhLGlCQUNqQiw0QkFDQyxTQUFTLDhCQUNULFNBQVMsMkJBQTJCLGlCQUNwQyxrQ0FBa0MsMEJBQTBCLEdBQzlELHFCQUFxQixjQUNyQixtQ0FDSSx1Q0FDRSxjQUNBLGNBQ0EsZ0JBQ0Esc0JBQ0EsT0FDRixJQUNBLHdDQUNFLGNBQ0EsY0FDQSxnQkFDQSxzQkFDQSxPQUNGLE1BQ0gsNEJBQ0MsU0FBUyw4QkFDVCxTQUFTLDJCQUEyQixpQkFDcEMsa0NBQWtDLFlBQVksR0FDaEQscUJBQXFCLGNBQ3JCLG1DQUNJLHVDQUNFLGNBQ0EsY0FDQSxnQkFDQSxzQkFDQSxPQUNGLEtBQ0UscUJBQXFCLGVBQ3JCLGtDQUNGLDJDQUNFLGNBQ0EsY0FDQSxnQkFDQSxzQkFDQSxPQUFPLGFBQWEsZUFBZSxVQUNoQyxNQUFNLGFBQWEsbUJBQ2pCLFNBQVMsYUFBYSxhQUNyQixhQUFhLFVBQVUsVUFBVSxhQU
15852FhLFFBQ3BELE9BQ0YsSUFDQyxhQUFhLE9BQU8saUJBQWlCLFVBQ3BDLHNCQUNFLGVBQWUsYUFBYSxpQkFDOUIsS0FBSyxnQkFDSCxNQUFPLFVBQVUsZ0JBQ2pCLHVCQUNFLGNBQ0EsY0FDQSxPQUNGLEdBQ0YsS0FBSyw0QkFDSCxLQUFLLDBCQUNMLE1BQ0UseUJBQXlCLDRCQUMzQix1QkFDRSxjQUNBLDBCQUNBLHNCQUNGO0tBQ1osUUFBUSxRQUNOLG1DQUNFLDRCQUNBLFlBQ0Y7S0FDRjtJQUNGLEtBQUs7S0FDSCx1Q0FDRSxjQUNBLGNBQ0EsZ0JBQ0Esc0JBQ0EsT0FDRjtLQUNBLFFBQVEsUUFDTiw4QkFBOEIsYUFBYSxXQUFXLFlBQVk7S0FDcEU7SUFDRixLQUFLO0tBQ0gsNkJBQ0ksUUFBUSxhQUFhLFdBQ3ZCLFNBQVMsVUFDTixxQ0FBcUMsTUFBTSxPQUFPLENBQUMsQ0FBQyxHQUNyRCxxQ0FBcUMsYUFBYSxPQUFPLENBQUMsQ0FBQztLQUMvRCx1Q0FDRSxjQUNBLGNBQ0EsZ0JBQ0Esc0JBQ0EsT0FDRjtLQUNBO0lBQ0YsU0FDRSx1Q0FDRSxjQUNBLGNBQ0EsZ0JBQ0Esc0JBQ0EsT0FDRjtHQUNKO0dBQ0EsS0FBSyxhQUFhLE9BQU8saUJBQWlCLFFBQVE7SUFDaEQsSUFDRyxlQUNDLENBQUMscUJBQ0QsU0FBUyxhQUFhLGFBQ3RCLFNBQVMsYUFBYSxVQUN0QixTQUFTLGFBQWEsT0FBTyxXQUUvQixpQkFBa0IsYUFBYSxpQkFDN0IsS0FBSyxrQkFDSCxNQUFPLFVBQVUsa0JBQ2pCLG9CQUNFLGNBQ0EsZ0JBQ0EsU0FDQSxPQUNGO0lBQ04sS0FBSyw0QkFDSCxLQUFLLDRCQUNILGdDQUFnQyxNQUFPLDRCQUN2QyxtQkFDRSxjQUNBLDBCQUNBLHdCQUNBLHlCQUNBLHFCQUNGLEdBQ0YsZ0JBQ0UsTUFBTyx5QkFBeUIsNEJBQ2hDLG9CQUNFLGNBQ0EsMEJBQ0Esd0JBQ0EsT0FDRjtHQUNOO0dBQ0Esd0JBQXdCLGVBQWU7R0FDdkMsMkJBQTJCLGtCQUFrQjtHQUM3Qyx3QkFBd0I7R0FDeEIsK0JBQStCO0dBQy9CLCtCQUErQjtFQUNqQztFQUNBLFNBQVMsMkNBQ1AsY0FDQSxhQUNBLGdCQUNBLHNCQUNBLDhCQUNBLFNBQ0E7R0FDQSwrQkFDRSxpQ0FDQyxPQUFPLFlBQVksZUFBZSxVQUNoQyxNQUFNLFlBQVksbUJBQ2hCLFNBQVMsWUFBWSxhQUNwQixZQUFZLFVBQVUsVUFBVSxZQUFZO0dBQ3BELEtBQUssY0FBYyxZQUFZLE9BQU8sU0FBUyxjQUFlO0lBQzVELElBQUksY0FBYyxZQUFZO0lBQzlCLHdCQUNFLGNBQ0EsYUFDQSxnQkFDQSxzQkFDQSw4QkFDQSxTQUFTLGNBQWMsWUFBWSxrQkFBa0IsT0FDdkQ7SUFDQSxjQUFjO0dBQ2hCO0VBQ0Y7RUFDQSxTQUFTLHdCQUNQLGNBQ0EsY0FDQSxnQkFDQSxzQkFDQSw4QkFDQSxTQUNBO0dBQ0EsSUFBSSxrQkFBa0IseUJBQXlCLEdBQzdDLHFCQUFxQiw0QkFBNEIsR0FDakQsbUJBQW1CLDBCQUEwQixHQUM3QywyQkFBMkIsa0NBQWtDLEdBQzdELG1CQUFtQjtHQUNyQixpQ0FDRyxhQUFhLE9BQU8saUJBQWlCLFVBQ3RDLElBQUksYUFBYSxtQkFDakIsT0FBTyxhQUFhLFFBQVEsTUFDNUIsbUJBQ0UsY0FDQSxhQUFhLGlCQUNiLFNBQ0EsbUJBQ0EsY0FDRjtHQUNGLElBQUksUUFBUSxhQUFhO0dBQ3pCLFFBQVEsYUFBYSxLQUFyQjtJQUNFLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztLQUNILDJDQUNFLGNBQ0EsY0FDQSxnQkFDQSxzQkFDQSw4QkFDQSxPQUNGO0tBQ0EsOEJBQThCLGNBQWMsT0FBTztLQUNuRDtJQUNGLEtBQUssSUFDSDtJQUNGLEtBQUs7S0FDSCxJQUFJLGFBQWEsYUFBYTtLQUM5QixTQUFTLGFBQWEsZ0JBQ2xCLFdBQVcsY0FBYyxtQ0FDdkIsMkNBQ0UsY0FDQSxjQUNBLGdCQUNBLHNCQUNBLDhCQUNBLE9BQ0YsSUFDQSx3Q0FDRSxjQUNBLGNBQ0EsZ0JBQ0Esc0JBQ0EsT0FDRixLQUNBLFdBQVcsZUFBZSxrQ0FDNUIsMkNBQ0UsY0FDQSxjQUNBLGdCQUNBLHNCQUNBLDhCQUNBLE9BQ0Y7S0FDSixnQ0FDRSxRQUFRLFFBQ1IsbUNBQ0UsYUFBYSxXQUNiLFlBQ0Y7S0FDRjtJQUNGLEtBQUs7S0FDSCwyQ0FDRSxjQUNBLGNBQ0EsZ0JBQ0Esc0JBQ0EsOEJBQ0EsT0FDRjtLQUNBLGdDQUNFLFFBQVEsUUFDUiw4QkFBOEIsYUFBYSxXQUFXLFlBQVk7S0FDcEU7SUFDRixTQUNFLDJDQUNFLGNBQ0EsY0FDQSxnQkFDQSxzQkFDQSw4QkFDQSxPQUNGO0dBQ0o7R0FDQSxDQUFDLGFBQWEsT0FBTyxpQkFBaUIsVUFDcEMsS0FBSyw0QkFDTCxLQUFLLDJCQUNKLGdDQUFnQyxNQUFPLDRCQUN4QyxtQkFDRSxjQUNBLDBCQUNBLHdCQUNBLHlCQUNBLHFCQUNGO0dBQ0Ysd0JBQXdCLGVBQWU7R0FDdkMsMkJBQTJCLGtCQUFrQjtHQUM3Qyx3QkFBd0I7R0FDeEIsK0JBQStCO0dBQy9CLCtCQUErQjtFQUNqQztFQUNBLFNBQVMsd0NBQ1AsdUJBQ0EsYUFDQSx5QkFDQSwrQkFDQSxrQkFDQTtHQUNBLElBQ0UsWUFBWSxlQUFlLFNBQzFCLE1BQU0sWUFBWSxtQkFDaEIsU0FBUyxZQUFZLGFBQ3BCLFlBQVksVUFBVSxVQUFVLFlBQVksUUFFaEQsS0FBSyxJQUFJLFFBQVEsWUFBWSxPQUFPLFNBQVMsUUFBUztJQUNwRCxjQUFjLE1BQU07SUFDcEIsSUFBSSxlQUFlLHVCQUNqQixpQkFBaUIseUJBQ2pCLHVCQUF1QiwrQkFDdkIsVUFDRSxTQUFTLGNBQ0wsWUFBWSxrQkFDWixrQkFDTixtQkFBbUI7SUFDckIsQ0FBQyxNQUFNLE9BQU8saUJBQWlCLFVBQzdCLElBQUksTUFBTSxtQkFDVixPQUFPLE1BQU0sUUFBUSxNQUNyQixtQkFDRSxPQUNBLE1BQU0saUJBQ04sU0FDQSxtQkFDQSxjQUNGO0lBQ0YsSUFBSSxRQUFRLE1BQU07SUFDbEIsUUFBUSxNQUFNLEtBQWQ7S0FDRSxLQUFLO01BQ0gsd0NBQ0UsY0FDQSxPQUNBLGdCQUNBLHNCQUNBLE9BQ0Y7TUFDQSxRQUFRLFFBQ04sbUNBQW1DLE1BQU0sV0FBVyxLQUFLO01BQzNEO0tBQ0YsS0FBSztNQUNILHdDQUNFLGNBQ0EsT0FDQSxnQkFDQSxzQkFDQSxPQUNGO01BQ0EsUUFBUSxRQUNOLDhCQUE4QixNQUFNLFdBQVcsS0FBSztNQUN0RDtLQUNGLFNBQ0Usd0NBQ0UsY0FDQSxPQUNBLGdCQUNBLHNCQUNBLE9BQ0Y7SUFDSjtJQUNBLCtCQUErQjtJQUMvQixRQUFRO0dBQ1Y7RUFDSjtFQUNBLFNBQVMscUNBQ1AsYUFDQSxnQkFDQSxnQkFDQTtHQUNBLElBQUksWUFBWSxlQUFlLHFCQUM3QixLQUFLLGNBQWMsWUFBWSxPQUFPLFNBQVMsY0FDN0MsaUNBQ0UsYUFDQSxnQkFDQSxjQUNGLEdBQ0csY0FBYyxZQUFZO0VBQ25DO0VBQ0EsU0FBUyxpQ0FDUCxPQUNBLGdCQUNBLGdCQUNBO0dBQ0EsUUFBUSxNQUFNLEtBQWQ7SUFDRSxLQUFLO0tBQ0gscUNBQ0UsT0FDQSxnQkFDQSxjQUNGO0tBQ0EsTUFBTSxRQUFRLHdCQUNYLFNBQVMsTUFBTSxnQkFDWixnQkFDRSxnQkFDQSxzQkFDQSxNQUFNLGVBQ04sTUFBTSxhQUNSLEtBQ0UsUUFBUSxNQUFNLFlBQ2YsaUJBQWlCLGVBQWUsa0JBQy9CLGdCQUFnQixnQkFBZ0IsS0FBSztLQUM3QztJQUNGLEtBQUs7S0FDSCxxQ0FDRSxPQUNBLGdCQUNBLGNBQ0Y7S0FDQSxNQUFNLFFBQVEsd0JBQ1YsUUFBUSxNQUFNLFlBQ2YsaUJBQWlCLGVBQWUsa0JBQy9CLGdCQUFnQixnQkFBZ0IsS0FBSztLQUN6QztJQUNGLEtBQUs7SUFDTCxLQUFLO0tBQ0gsSUFBSSx3QkFBd0I7S0FDNUIsdUJBQXVCLGlCQUNyQixNQUFNLFVBQVUsYUFDbEI7S0FDQSxxQ0FDRSxPQUNBLGdCQUNBLGNBQ0Y7S0FDQSx1QkFBdUI7S0FDdkI7SUFDRixLQUFLO0tBQ0gsU0FBUyxNQUFNLGtCQUNYLHdCQUF3QixNQUFNLFdBQ2hDLFNBQVMseUJBQ1QsU0FBUyxzQkFBc0IsaUJBQ3pCLHdCQUF3QixxQkFDekIsc0JBQXNCLFVBQ3ZCLHFDQUNFLE9BQ0EsZ0JBQ0EsY0FDRixHQUNDLHNCQUFzQix5QkFDdkIscUNBQ0UsT0FDQSxnQkFDQSxjQUNGO0tBQ047SUFDRixLQUFLO0tBQ0gsSUFDRSxPQUFPLE1BQU0sUUFBUSx5QkFDbkIsd0JBQXdCLE1BQU0sY0FBYyxNQUM5QyxRQUFRLHlCQUF5QixXQUFXLHdCQUM1QztNQUNBLElBQUksUUFBUSxNQUFNO01BQ2xCLE1BQU0sU0FBUztNQUNmLFNBQVMsNkJBQ04sMkNBQTJCLElBQUksSUFBSTtNQUN0Qyx5QkFBeUIsSUFBSSx1QkFBdUIsS0FBSztLQUMzRDtLQUNBLHFDQUNFLE9BQ0EsZ0JBQ0EsY0FDRjtLQUNBO0lBQ0YsU0FDRSxxQ0FDRSxPQUNBLGdCQUNBLGNBQ0Y7R0FDSjtFQUNGO0VBQ0EsU0FBUyx3QkFBd0IsYUFBYTtHQUM1QyxJQUFJLGdCQUFnQixZQUFZO0dBQ2hDLElBQ0UsU0FBUyxrQkFDUCxjQUFjLGNBQWMsT0FBUSxTQUFTLGNBQy9DO0lBQ0EsY0FBYyxRQUFRO0lBQ3RCO0tBQ0UsZ0JBQWlCLFlBQVksU0FDMUIsWUFBWSxVQUFVLE1BQ3RCLGNBQWM7V0FDWixTQUFTO0dBQ2xCO0VBQ0Y7RUFDQSxTQUFTLHlDQUF5QyxhQUFhO0dBQzdELElBQUksWUFBWSxZQUFZO0dBQzVCLElBQUksT0FBTyxZQUFZLFFBQVEsS0FBSztJQUNsQyxJQUFJLFNBQVMsV0FDWCxLQUFLLElBQUksSUFBSSxHQUFHLElBQUksVUFBVSxRQUFRLEtBQUs7S0FDekMsSUFBSSxnQkFBZ0IsVUFBVSxJQUM1QixrQkFBa0IseUJBQXlCO0tBQzdDLGFBQWE7S0FDYixxREFDRSxlQUNBLFdBQ0Y7S0FDQSxDQUFDLGNBQWMsT0FBTyxpQkFBaUIsVUFDckMsS0FBSyw0QkFDTCxLQUFLLDBCQUNMLE1BQU8seUJBQXlCLDRCQUNoQyxvQkFDRSxlQUNBLDBCQUNBLHdCQUNBLFNBQ0Y7S0FDRix3QkFBd0IsZUFBZTtJQUN6QztJQUNGLHdCQUF3QixXQUFXO0dBQ3JDO0dBQ0EsSUFBSSxZQUFZLGVBQWUsT0FDN0IsS0FBSyxjQUFjLFlBQVksT0FBTyxTQUFTLGNBQzdDLDRCQUE0QixXQUFXLEdBQ3BDLGNBQWMsWUFBWTtFQUNuQztFQUNBLFNBQVMsNEJBQTRCLGNBQWM7R0FDakQsSUFBSSxrQkFBa0IseUJBQXlCLEdBQzdDLHFCQUFxQiw0QkFBNEIsR0FDakQsbUJBQW1CLDBCQUEwQixHQUM3QywyQkFBMkIsa0NBQWtDO0dBQy9ELFFBQVEsYUFBYSxLQUFyQjtJQUNFLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztLQUNILHlDQUF5QyxZQUFZO0tBQ3JELGFBQWEsUUFBUSxRQUNuQixnQ0FDRSxjQUNBLGFBQWEsUUFDYixVQUFVLFNBQ1o7S0FDRjtJQUNGLEtBQUs7S0FDSCxJQUFJLDZCQUE2QiwwQkFBMEI7S0FDM0QseUNBQXlDLFlBQVk7S0FDckQsYUFBYSxVQUFVLHlCQUNyQix5QkFBeUIsMEJBQTBCO0tBQ3JEO0lBQ0YsS0FBSztLQUNILDZCQUE2QiwwQkFBMEI7S0FDdkQseUNBQXlDLFlBQVk7S0FDckQsYUFBYSxVQUFVLHlCQUNyQiw0QkFBNEIsMEJBQTBCO0tBQ3hEO0lBQ0YsS0FBSztLQUNILDZCQUE2QixhQUFhO0tBQzFDLFNBQVMsYUFBYSxpQkFDdEIsMkJBQTJCLGNBQ3pCLHFDQUNELFNBQVMsYUFBYSxVQUFVLE9BQU8sYUFBYSxPQUFPLFFBQ3RELDJCQUEyQixlQUMzQixDQUFDLGtDQUNILDRDQUE0QyxZQUFZLElBQ3ZELGFBQWEsT0FBTyxpQkFBaUIsVUFDcEMsS0FBSyw0QkFDTCxLQUFLLDBCQUNMLE1BQU8seUJBQXlCLDRCQUNoQyxvQkFDRSxjQUNBLDBCQUNBLHdCQUNBLFlBQ0YsS0FDRix5Q0FBeUMsWUFBWTtLQUN6RDtJQUNGLFNBQ0UseUNBQXlDLFlBQVk7R0FDekQ7R0FDQSxDQUFDLGFBQWEsT0FBTyxpQkFBaUIsVUFDcEMsS0FBSyw0QkFDTCxLQUFLLDJCQUNKLGdDQUFnQyxNQUFPLDRCQUN4QyxtQkFDRSxjQUNBLDBCQUNBLHdCQUNBLHlCQUNBLHFCQUNGO0dBQ0Ysd0JBQXdCLGVBQWU7R0FDdkMsMkJBQTJCLGtCQUFrQjtHQUM3QywrQkFBK0I7R0FDL0Isd0JBQXdCO0VBQzFCO0VBQ0EsU0FBUyw0Q0FBNEMsYUFBYTtHQUNoRSxJQUFJLFlBQVksWUFBWTtHQUM1QixJQUFJLE9BQU8sWUFBWSxRQUFRLEtBQUs7SUFDbEMsSUFBSSxTQUFTLFdBQ1gsS0FBSyxJQUFJLElBQUksR0FBRyxJQUFJLFVBQVUsUUFBUSxLQUFLO0tBQ3pDLElBQUksZ0JBQWdCLFVBQVUsSUFDNUIsa0JBQWtCLHlCQUF5QjtLQUM3QyxhQUFhO0tBQ2IscURBQ0UsZUFDQSxXQUNGO0tBQ0EsQ0FBQyxjQUFjLE9BQU8saUJBQWlCLFVBQ3JDLEtBQUssNEJBQ0wsS0FBSywwQkFDTCxNQUFPLHlCQUF5Qiw0QkFDaEMsb0JBQ0UsZUFDQSwwQkFDQSx3QkFDQSxTQUNGO0tBQ0Ysd0JBQXdCLGVBQWU7SUFDekM7SUFDRix3QkFBd0IsV0FBVztHQUNyQztHQUNBLEtB
15852QUssY0FBYyxZQUFZLE9BQU8sU0FBUyxjQUM3Qyx3QkFBd0IsV0FBVyxHQUNoQyxjQUFjLFlBQVk7RUFDakM7RUFDQSxTQUFTLHdCQUF3QixjQUFjO0dBQzdDLElBQUksa0JBQWtCLHlCQUF5QixHQUM3QyxxQkFBcUIsNEJBQTRCLEdBQ2pELG1CQUFtQiwwQkFBMEIsR0FDN0MsMkJBQTJCLGtDQUFrQztHQUMvRCxRQUFRLGFBQWEsS0FBckI7SUFDRSxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7S0FDSCxnQ0FDRSxjQUNBLGFBQWEsUUFDYixPQUNGO0tBQ0EsNENBQTRDLFlBQVk7S0FDeEQ7SUFDRixLQUFLO0tBQ0gsSUFBSSxXQUFXLGFBQWE7S0FDNUIsU0FBUyxjQUFjLHFDQUNuQixTQUFTLGVBQWUsQ0FBQyxrQ0FDM0IsNENBQTRDLFlBQVk7S0FDMUQ7SUFDRixTQUNFLDRDQUE0QyxZQUFZO0dBQzVEO0dBQ0EsQ0FBQyxhQUFhLE9BQU8saUJBQWlCLFVBQ3BDLEtBQUssNEJBQ0wsS0FBSywyQkFDSixnQ0FBZ0MsTUFBTyw0QkFDeEMsbUJBQ0UsY0FDQSwwQkFDQSx3QkFDQSx5QkFDQSxxQkFDRjtHQUNGLHdCQUF3QixlQUFlO0dBQ3ZDLDJCQUEyQixrQkFBa0I7R0FDN0MsK0JBQStCO0dBQy9CLHdCQUF3QjtFQUMxQjtFQUNBLFNBQVMscURBQ1Asb0JBQ0EsaUNBQ0E7R0FDQSxPQUFPLFNBQVMsYUFBYztJQUM1QixJQUFJLFFBQVEsWUFDVixVQUFVLE9BQ1YseUJBQXlCLGlDQUN6QixrQkFBa0IseUJBQXlCLEdBQzNDLHFCQUFxQiw0QkFBNEIsR0FDakQsbUJBQW1CLDBCQUEwQixHQUM3QywyQkFBMkIsa0NBQWtDO0lBQy9ELFFBQVEsUUFBUSxLQUFoQjtLQUNFLEtBQUs7S0FDTCxLQUFLO0tBQ0wsS0FBSztNQUNILGdDQUNFLFNBQ0Esd0JBQ0EsT0FDRjtNQUNBO0tBQ0YsS0FBSztLQUNMLEtBQUs7TUFDSCxTQUFTLFFBQVEsaUJBQ2YsU0FBUyxRQUFRLGNBQWMsY0FDN0IseUJBQXlCLFFBQVEsY0FBYyxVQUFVLE1BQzNELFFBQVEsMEJBQ04sWUFBWSxzQkFBc0I7TUFDdEM7S0FDRixLQUFLLElBQ0gsYUFBYSxRQUFRLGNBQWMsS0FBSztJQUM1QztJQUNBLENBQUMsUUFBUSxPQUFPLGlCQUFpQixVQUMvQixLQUFLLDRCQUNMLEtBQUssMkJBQ0osZ0NBQWdDLE1BQU8sNEJBQ3hDLG1CQUNFLFNBQ0EsMEJBQ0Esd0JBQ0EseUJBQ0EscUJBQ0Y7SUFDRix3QkFBd0IsZUFBZTtJQUN2QywyQkFBMkIsa0JBQWtCO0lBQzdDLCtCQUErQjtJQUMvQix3QkFBd0I7SUFDeEIsVUFBVSxNQUFNO0lBQ2hCLElBQUksU0FBUyxTQUFTLFFBQVMsU0FBUyxPQUFTLGFBQWE7U0FFNUQsR0FBRyxLQUFLLFFBQVEsb0JBQW9CLFNBQVMsYUFBYztLQUN6RCxVQUFVO0tBQ1Ysa0JBQWtCLFFBQVE7S0FDMUIscUJBQXFCLFF
15852BQVE7S0FDN0Isd0JBQXdCLE9BQU87S0FDL0IsSUFBSSxZQUFZLE9BQU87TUFDckIsYUFBYTtNQUNiLE1BQU07S0FDUjtLQUNBLElBQUksU0FBUyxpQkFBaUI7TUFDNUIsZ0JBQWdCLFNBQVM7TUFDekIsYUFBYTtNQUNiLE1BQU07S0FDUjtLQUNBLGFBQWE7SUFDZjtHQUNKO0VBQ0Y7RUFDQSxTQUFTLGVBQWU7R0FDdEIsWUFBWSxRQUFRLFNBQVUsWUFBWTtJQUN4QyxPQUFPLFdBQVc7R0FDcEIsQ0FBQztFQUNIO0VBQ0EsU0FBUyw2QkFBNkI7R0FDcEMsSUFBSSw4QkFDRixnQkFBZ0IsT0FBTywyQkFDbkIsMkJBQ0EsS0FBSztHQUNYLCtCQUNFLFNBQVMscUJBQXFCLFlBQzlCLFFBQVEsTUFDTix1RUFDRjtHQUNGLE9BQU87RUFDVDtFQUNBLFNBQVMsa0JBQWtCLE9BQU87R0FDaEMsS0FDRyxtQkFBbUIsbUJBQW1CLGFBQ3ZDLE1BQU0sK0JBRU4sT0FBTyxnQ0FBZ0MsQ0FBQztHQUMxQyxJQUFJLGFBQWEscUJBQXFCO0dBQ3RDLElBQUksU0FBUyxZQUNYLE9BQ0UsV0FBVyxtQkFBbUIsV0FBVyxpQ0FBaUIsSUFBSSxJQUFJLElBQ2xFLFdBQVcsZUFBZSxJQUFJLEtBQUssR0FDbkMsU0FBUyxzQkFDUCxzQkFBc0IsTUFBTSwwQkFDM0IscUJBQXFCLE9BQ3hCLHNCQUFzQjtHQUUxQixRQUFRLHNCQUFzQjtHQUM5QixVQUFVLDBCQUEwQixxQkFBcUI7R0FDekQsT0FBTztFQUNUO0VBQ0EsU0FBUyxzQkFBc0I7R0FDN0IsSUFBSSxNQUFNLDRCQUNSLElBQUksT0FBTyxnQ0FBZ0MsY0FBYyxhQUFhO0lBQ3BFLElBQUksT0FBTztJQUNYLCtCQUErQjtJQUMvQixPQUFPLDZCQUE2QixhQUNqQyw2QkFBNkI7SUFDaEMsNkJBQTZCO0dBQy9CLE9BQU8sNkJBQTZCO0dBQ3RDLE9BQU8sMkJBQTJCO0dBQ2xDLFNBQVMsU0FBUyxLQUFLLFNBQVM7R0FDaEMsT0FBTztFQUNUO0VBQ0EsU0FBUyw0QkFBNEIsT0FBTyxVQUFVO0dBQ3BELElBQUksUUFBUSxVQUFVO0lBQ3BCLElBQUksUUFBUSxNQUFNLFdBQ2hCLFdBQVcsTUFBTTtJQUNuQixTQUFTLGFBQ04sV0FBVyxNQUFNLE1BQ2hCLDZCQUNFLHNCQUFzQixNQUFNLGVBQWUsS0FBSyxDQUNsRDtJQUNKLFNBQVMsZ0NBQ04sOEJBQThCLENBQUM7SUFDbEMsNEJBQTRCLEtBQUssU0FBUyxLQUFLLE1BQU0sUUFBUSxDQUFDO0dBQ2hFO0VBQ0Y7RUFDQSxTQUFTLHNCQUFzQixNQUFNLE9BQU8sTUFBTTtHQUNoRCw0QkFDRSxRQUFRLE1BQU0sK0NBQStDO0dBQy9ELDZCQUE2Qix3Q0FBd0MsQ0FBQztHQUN0RSxJQUNHLFNBQVMsdUJBQ1Asa0NBQWtDLG1CQUNqQyxrQ0FBa0Msc0JBQ3RDLFNBQVMsS0FBSyxxQkFFZCxrQkFBa0IsTUFBTSxDQUFDLEdBQ3ZCLGtCQUNFLE1BQ0EsK0JBQ0EsNEJBQ0EsQ0FBQyxDQUNIO0dBQ0osa0JBQWtCLE1BQU0sSUFBSTtHQUM1QixLQUNHLG1CQUFtQixtQkFBbUIsYUFDdkMsU0FBUyxvQkFFTDtRQUFBLGFBQ0YsUUFBUSxNQUFNLEtBQWQ7S0FDRSxLQUFLO0tBQ0wsS0FBSztLQUNMLEtBQUs7TUFDSCxPQUNHLGtCQUFrQiwwQkFBMEIsY0FBYyxLQUMzRDtNQUNGLDhDQUE4QyxJQUFJLElBQUksTUFDbkQsOENBQThDLElBQUksSUFBSSxHQUN0RCxRQUFRLDBCQUEwQixLQUFLLEtBQUssV0FDN0MsUUFBUSxNQUNOLGtOQUNBLE9BQ0EsTUFDQSxJQUNGO01BQ0Y7S0FDRixLQUFLLEdBQ0gsK0JBQ0csUUFBUSxNQUNQLDJJQUNGLEdBQ0MsNkJBQTZCLENBQUM7SUFDckM7VUFFRixxQkFBcUIsbUJBQW1CLE1BQU0sT0FBTyxJQUFJLEdBQ3ZELGtDQUFrQyxLQUFLLEdBQ3ZDLFNBQVMsd0JBQ0wsbUJBQW1CLG1CQUFtQixjQUNyQyw2Q0FBNkMsT0FDaEQsaUNBQWlDLDBCQUMvQixrQkFDRSxNQUNBLCtCQUNBLDRCQUNBLENBQUMsQ0FDSCxJQUNKLHNCQUFzQixJQUFJO0VBQ2hDO0VBQ0EsU0FBUyxrQkFBa0IsTUFBTSxPQUFPLFdBQVc7R0FDakQsS0FBSyxvQkFBb0IsZ0JBQWdCLG9CQUFvQixXQUMzRCxNQUFNLE1BQU0sZ0NBQWdDO0dBQzlDLElBQUksTUFBTSxpQ0FBaUMsU0FBUyxnQkFBZ0I7SUFDbEUsSUFBSSxlQUFlLGdCQUNqQixlQUFlLE1BQU07SUFDdkIsUUFBUSxhQUFSO0tBQ0UsS0FBSztLQUNMLEtBQUs7TUFDSCxJQUFJLFlBQVk7TUFDaEIsd0JBQ0ksZUFBZSxhQUFhLGNBQzFCLGFBQWEsSUFDWCxRQUFRLFVBQVUsS0FDaEIsU0FDQSxhQUNBLFdBQ0EsY0FDQSxrQkFDQSxLQUFLLEdBQ0wsZUFDRixDQUNGLElBQ0EsUUFBUSxVQUNOLGFBQ0EsV0FDQSxjQUNBLGtCQUNBLEtBQUssR0FDTCxlQUNGO01BQ047S0FDRixLQUFLO01BQ0gsWUFBWTtNQUNaLHdCQUNJLGVBQWUsYUFBYSxjQUMxQixhQUFhLElBQ1gsUUFBUSxVQUFVLEtBQ2hCLFNBQ0EsVUFDQSxXQUNBLGNBQ0Esa0JBQ0EsS0FBSyxHQUNMLGVBQ0YsQ0FDRixJQUNBLFFBQVEsVUFDTixVQUNBLFdBQ0EsY0FDQSxrQkFDQSxLQUFLLEdBQ0wsZUFDRjtNQUNOO0tBQ0YsU0FDRSx1QkFDSSxlQUFlLGVBQWUsZ0JBQ2hDLElBQUksZ0JBQ0YsUUFBUSxVQUNOLFdBQ0EsZ0JBQ0EsY0FDQSxrQkFDQSxLQUFLLEdBQ0wsSUFBSSxlQUNBLGtCQUNBLEtBQUssZUFDSCxZQUNBLE1BQU0sZUFDSixpQkFDQSxPQUNWO0lBQ1I7R0FDRjtHQUNBLGFBQWEsWUFDVixDQUFDLGFBQ0EsT0FBTyxRQUFRLFFBQ2YsT0FBTyxRQUFRLEtBQUssaUJBQ3RCLDBCQUEwQixNQUFNLEtBQUssS0FDbkMscUJBQXFCLE1BQU0sS0FBSyxJQUNoQyxlQUFlLE1BQU0sT0FBTyxDQUFDLENBQUM7R0FDbEMsSUFBSSxzQkFBc0I7R0FDMUIsR0FBRztJQUNELElBQUksY0FBYyxnQkFBZ0I7S0FDaEMsb0NBQ0UsQ0FBQyxhQUNELGtCQUFrQixNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUM7S0FDdEMsUUFBUTtLQUNSLGlCQUFpQixJQUFJO0tBQ3JCLGNBQWM7S0FDZDtJQUNGLE9BQU87S0FDTCxlQUFlLE1BQU07S0FDckIsZUFBZSxLQUFLLFFBQVE7S0FDNUIsSUFDRSx1QkFDQSxDQUFDLHFDQUFxQyxZQUFZLEdBQ2xEO01BQ0EseUJBQXlCLEtBQUs7TUFDOUIsZUFBZTtNQUNmLFlBQVk7TUFDWixDQUFDLHNCQUNDLGFBQWEsaUJBQ1osMkJBQ0cseUJBQXlCLElBQ3ZCLFFBQVEsVUFBVSxLQUNoQixTQUNBLGlCQUNBLGNBQ0EsV0FDQSxjQUNBLG1CQUNBLE9BQ0YsQ0FDRixJQUNBLFFBQVEsVUFDTixpQkFDQSxjQUNBLFdBQ0EsY0FDQSxtQkFDQSxPQUNGO01BQ04sZUFBZSxPQUFPLFlBQVk7TUFDbEMsWUFBWSxlQUFlLE1BQU0sT0FBTyxDQUFDLENBQUM7T
15852UFDMUMsc0JBQXNCLENBQUM7TUFDdkI7S0FDRjtLQUNBLElBQUksY0FBYyxhQUFhO01BQzdCLHNCQUFzQjtNQUN0QixJQUFJLEtBQUssNkJBQTZCLHFCQUNwQyxJQUFJLGtCQUFrQjtXQUV0QixrQkFBbUIsS0FBSyxlQUFlLFlBQ3BDLGtCQUNDLE1BQU0sa0JBQ0Ysa0JBQ0Esa0JBQWtCLFlBQ2hCLFlBQ0E7TUFDWixJQUFJLE1BQU0saUJBQWlCO09BQ3pCLHlCQUF5QixLQUFLO09BQzlCLHNCQUNFLGlCQUNBLGNBQ0EsT0FDQSx3QkFDRjtPQUNBLGVBQWUsT0FBTyxZQUFZO09BQ2xDLFFBQVE7T0FDUixHQUFHO1FBQ0QsZUFBZTtRQUNmLFlBQVk7UUFDWixzQkFBc0I7UUFDdEIsSUFBSSxvQkFDRixhQUFhLFFBQVEsY0FBYztRQUNyQyxzQkFDRyxrQkFBa0IsY0FBYyxlQUFlLENBQUMsQ0FBQyxTQUNoRDtRQUNKLGtCQUFrQixlQUNoQixjQUNBLGlCQUNBLENBQUMsQ0FDSDtRQUNBLElBQ0Usb0JBQW9CLGVBQ3BCLG9CQUFvQix5QkFDcEI7U0FDQSxJQUNFLDJDQUNBLENBQUMsbUJBQ0Q7VUFDQSxhQUFhLDhCQUE4QjtVQUMzQyw2Q0FBNkM7VUFDN0MsWUFBWTtVQUNaLE1BQU07U0FDUjtTQUNBLGVBQWU7U0FDZixzQ0FBc0M7U0FDdEMsU0FBUyxpQkFDTixTQUFTLHNDQUNMLHNDQUFzQyxlQUN2QyxvQ0FBb0MsS0FBSyxNQUN2QyxxQ0FDQSxZQUNGO1FBQ1I7UUFDQSxZQUFZO09BQ2Q7T0FDQSxzQkFBc0IsQ0FBQztPQUN2QixJQUFJLGNBQWMsYUFBYTtZQUMxQixlQUFlLE1BQU07TUFDNUI7S0FDRjtLQUNBLElBQUksY0FBYyxrQkFBa0I7TUFDbEMseUJBQXlCLEtBQUs7TUFDOUIsc0JBQ0UsaUJBQ0EsY0FDQSxPQUNBLHdCQUNGO01BQ0EsZUFBZSxPQUFPLFlBQVk7TUFDbEMsa0JBQWtCLE1BQU0sQ0FBQztNQUN6QixrQkFBa0IsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDO01BQ3BDO0tBQ0Y7S0FDQSxHQUFHO01BQ0QsWUFBWTtNQUNaLFFBQVEsV0FBUjtPQUNFLEtBQUs7T0FDTCxLQUFLLGtCQUNILE1BQU0sTUFBTSxnREFBZ0Q7T0FDOUQsS0FBSyx3QkFDSCxLQUFLLFFBQVEsYUFBYSxVQUFVLFFBQVEsY0FBYyxPQUN4RDtPQUNKLEtBQUs7UUFDSCx5QkFBeUIsS0FBSztRQUM5Qix3QkFDRSxpQkFDQSxjQUNBLE9BQ0Esd0JBQ0Y7UUFDQSxlQUFlLE9BQU8sWUFBWTtRQUNsQyxlQUFlO1FBQ2YsT0FBTyxlQUFlLE9BQ2pCLHdCQUF3QixlQUN6QixPQUFPLGVBQWUsYUFDckIsMEJBQTBCO1FBQy9CLGtCQUNFLFdBQ0EsT0FDQSw0QkFDQSxDQUFDLDBDQUNIO1FBQ0EsTUFBTTtPQUNSLEtBQUs7UUFDSCxzQ0FBc0M7UUFDdEM7T0FDRixLQUFLO09BQ0wsS0FBSyxlQUNIO09BQ0YsU0FDRSxNQUFNLE1BQU0sMkJBQTJCO01BQzNDO01BQ0EsSUFBSSxTQUFTLHFCQUFxQixVQUNoQyxhQUNFLFdBQ0EsY0FDQSxPQUNBLHFDQUNBLDJCQUNBLG1EQUNBLDRCQUNBLDJDQUNBLG1DQUNBLDRDQUNBLFdBQ0EsTUFDQSxNQUNBLGlCQUNBLFlBQ0Y7V0FDRztPQUNILEtBQ0csUUFBUSxjQUFjLFVBQ3JCLHNCQUNBLCtCQUNBLHVCQUNBLE1BQU0sR0FDUixLQUFLLHNCQUNMO1FBQ0Esa0JBQ0UsV0FDQSxPQUNBLDRCQUNBLENBQUMsMENBQ0g7UUFDQSxJQUFJLE1BQU0sYUFBYSxXQUFXLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTTtRQUNoRCxzQkFBc0I7UUFDdEIsVUFBVSxnQkFBZ0IsZ0JBQ3hCLHNCQUFzQixLQUNwQixNQUNBLFdBQ0EsY0FDQSxxQ0FDQSwyQkFDQSxtREFDQSxPQUNBLDRCQUNBLDJDQUNBLG1DQUNBLDRDQUNBLFdBQ0EsYUFDQSxpQkFDQSxZQUNGLEdBQ0EsbUJBQ0Y7UUFDQSxNQUFNO09BQ1I7T0FDQSxzQkFDRSxXQUNBLGNBQ0EscUNBQ0EsMkJBQ0EsbURBQ0EsT0FDQSw0QkFDQSwyQ0FDQSxtQ0FDQSw0Q0FDQSxXQUNBLE1BQ0EsaUJBQ0EsWUFDRjtNQUNGO0tBQ0Y7SUFDRjtJQUNBO0dBQ0YsU0FBUztHQUNULHNCQUFzQixJQUFJO0VBQzVCO0VBQ0EsU0FBUyxzQkFDUCxNQUNBLGNBQ0EsbUJBQ0EsYUFDQSw2QkFDQSxPQUNBLGFBQ0EsY0FDQSxxQkFDQSwwQkFDQSxZQUNBLHVCQUNBLDBCQUNBLHdCQUNBO0dBQ0EsS0FBSyxnQkFBZ0I7R0FDckIsSUFBSSxlQUFlLGFBQWEsY0FDOUIsNEJBQTRCLFFBQVEsZUFBZSxPQUNuRCxpQkFBaUI7R0FDbkIsSUFDRSw0QkFDQSxlQUFlLFFBQ2YsY0FBYyxlQUFlLFdBR3pCO1FBQUEsaUJBQWlCO0tBQ2pCLGFBQWE7S0FDYixPQUFPO0tBQ1AsVUFBVTtLQUNWLFVBQVU7S0FDVixpQkFBaUIsQ0FBQztLQUNsQixrQkFBa0IsQ0FBQztLQUNuQiwwQkFBMEIsQ0FBQztLQUMzQixXQUFXO0lBQ2IsR0FDQywyQkFBMkIsTUFDNUIsaUNBQWlDLGNBQWMsT0FBTyxjQUFjLEdBQ3BFLDZCQUNJLGVBQWUsZ0JBQ2hCLDJCQUEyQixLQUFLLGVBQ2hDLDRCQUNDLE1BQU0seUJBQXlCLFdBQzNCLDJCQUNBLHlCQUF5QixjQUFBLENBQzdCLHVCQUNGLFFBQVEsNkJBQ0wsYUFBYSxTQUNiLGFBQWEsMkJBQTJCLENBQUMsR0FDekMsZUFBZSxZQUFZLEtBQUssWUFBWSxHQUM3Qyx5QkFBeUIsU0FBUyxLQUNoQyxjQUNBLFlBQ0YsS0FDSCxnQkFDRSxRQUFRLGNBQWMsUUFDbkIsK0JBQStCLE1BQU0sS0FDcEMsUUFBUSxhQUFhLFFBQ3BCLGlDQUFpQyxNQUFNLElBQ3ZDLEdBQ1AsZUFBZSx1QkFBdUIsZ0JBQWdCLFlBQVksR0FDbkUsU0FBUyxjQUNUO0tBQ0Esc0JBQXNCO0tBQ3RCLEtBQUssc0JBQXNCLGFBQ3pCLGFBQWEsS0FDWCxNQUNBLE1BQ0EsY0FDQSxPQUNBLG1CQUNBLGFBQ0EsNkJBQ0EsYUFDQSxjQUNBLHFCQUNBLDBCQUNBLFlBQ0EsZ0JBQ0EsZUFBZSwyQkFDWCx1Q0FDQSxJQUFJLGVBQWUsUUFDakIsSUFBSSxlQUFlLFdBQ2pCLGdDQUNBLHFCQUNGLE1BQU0sZUFBZSxXQUNuQiwwQkFDQSxJQUFJLGVBQWUsV0FDakIsd0JBQ0EsTUFDViwwQkFDQSxzQkFDRixDQUNGO0tBQ0Esa0JBQ0UsTUFDQSxPQUNBLGFBQ0EsQ0FBQyx3QkFDSDtLQUNBO0lBQ0Y7O0dBQ0YsYUFDRSxNQUNBLGNBQ0EsT0FDQSxtQkFDQSxhQUNBLDZCQUNBLGFBQ0EsY0FDQSxxQkFDQSwwQkFDQSxZQUNBLGdCQUNBLHVCQUNBLDBCQUNBLHNCQUNGO0VBQ0Y7RUFDQSxTQUFTLHFDQUFxQyxjQUFjO0dBQzFELEtBQUssSUFBSSxPQUFPLGdCQUFrQjtJQUNoQyxJQUFJLE1BQU0sS0FBSztJQUNmLEtBQ0csTUFBTSxPQUFPLE9BQU8sT0FBTyxPQUFPLFFBQ25DLEtBQUssUUFBUSxVQUNYLE1BQU0sS0FBSyxhQUNiLFNBQVMsUUFBUyxNQUFNLElBQUksUUFBUyxTQUFTLE9BRTlDLEtBQUssSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLFFBQVEsS0FBSztLQUNuQyxJQUFJLFFBQVEsSUFBSSxJQUNkLGNBQWMsTUFBTTtLQUN0QixRQUFRLE1BQU07S0FDZCxJQUFJO01BQ0YsSUFBSSxDQUFDLFNBQVMsWUFBWSxHQUFHLEtBQUssR0FBRyxPQUFPLENBQUM7S0FDL0MsU0FBUyxPQUFPO01BQ2QsT0FBTyxDQUFDO0tBQ1Y7SUFDRjtJQUNGLE1BQU0sS0FBSztJQUNYLElBQUksS0FBSyxlQUFlLFNBQVMsU0FBUyxLQUN4QyxJQUFLLFNBQVMsTUFBUSxPQUFPO1NBQzFCO0tBQ0gsSUFBSSxTQUFTLGNBQWM7S0FDM0IsT0FBTyxTQUFTLEtBQUssVUFBVztNQUM5QixJQUFJLFNBQVMsS0FBSyxVQUFVLEtBQUssV0FBVyxjQUFjLE9BQU8sQ0FBQztNQUNsRSxPQUFPLEtBQUs7S0FDZDtLQUNBLEtB
15852QUssUUFBUSxTQUFTLEtBQUs7S0FDM0IsT0FBTyxLQUFLO0lBQ2Q7R0FDRjtHQUNBLE9BQU8sQ0FBQztFQUNWO0VBQ0EsU0FBUyxrQkFDUCxNQUNBLGdCQUNBLGFBQ0Esc0JBQ0E7R0FDQSxpQkFBaUIsa0JBQWtCLE1BQU0sY0FBYztHQUN2RCxrQkFBa0IsQ0FBQztHQUNuQixrQkFBa0IsQ0FBQztHQUNuQixLQUFLLGtCQUFrQjtHQUN2QixLQUFLLGVBQWUsQ0FBQztHQUNyQix5QkFBeUIsS0FBSyxhQUFhO0dBQzNDLHVCQUF1QixLQUFLO0dBQzVCLEtBQUssSUFBSSxRQUFRLGdCQUFnQixJQUFJLFFBQVM7SUFDNUMsSUFBSSxRQUFRLEtBQUssTUFBTSxLQUFLLEdBQzFCLE9BQU8sS0FBSztJQUNkLHFCQUFxQixTQUFTO0lBQzlCLFNBQVMsQ0FBQztHQUNaO0dBQ0EsTUFBTSxlQUNKLHdCQUF3QixNQUFNLGFBQWEsY0FBYztFQUM3RDtFQUNBLFNBQVMsa0JBQWtCO0dBQ3pCLFFBQVEsb0JBQW9CLGdCQUFnQixvQkFBb0IsYUFDM0QsOEJBQThCLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUN4QyxDQUFDO0VBQ1A7RUFDQSxTQUFTLDJCQUEyQjtHQUNsQyxJQUFJLFNBQVMsZ0JBQWdCO0lBQzNCLElBQUksa0NBQWtDLGNBQ3BDLElBQUksa0JBQWtCLGVBQWU7U0FFckMsa0JBQW1CLGdCQUNqQix5QkFBeUIsR0FDekIsbUJBQW1CLGVBQWUsR0FDakMsa0JBQWtCLE1BQ2xCLHlCQUF5QixHQUN6QixrQkFBa0I7SUFDdkIsT0FBTyxTQUFTLGtCQUNkLHNCQUFzQixnQkFBZ0IsV0FBVyxlQUFlLEdBQzdELGtCQUFrQixnQkFBZ0I7SUFDdkMsaUJBQWlCO0dBQ25CO0VBQ0Y7RUFDQSxTQUFTLGVBQWUsT0FBTyxrQkFBa0I7R0FDL0MsT0FBTyxRQUFRLFNBQVMsb0JBQW9CO0dBQzVDLE9BQU8sUUFBUSxhQUFhLHNCQUFzQjtHQUNsRCxPQUFPLFFBQVEsY0FBYyxpQkFBaUI7R0FDOUMsT0FBTyxRQUFRLGdCQUFnQixnQkFBZ0I7RUFDakQ7RUFDQSxTQUFTLGtCQUFrQixNQUFNLE9BQU87R0FDdEMsdUJBQ0csUUFBUSxVQUNQLGtCQUNBLE1BQ0EsTUFDQSxZQUNBLG1CQUNBLGVBQ0YsR0FDQSxRQUFRLFVBQ04sb0JBQ0EsTUFDQSxNQUNBLGNBQ0EsbUJBQ0EsZUFDRixHQUNBLFFBQVEsVUFDTixrQkFDQSxNQUNBLE1BQ0EsWUFDQSxtQkFDQSxlQUNGLEdBQ0EsUUFBUSxVQUNOLGNBQ0EsTUFDQSxNQUNBLFFBQ0EsbUJBQ0EsZUFDRjtHQUNGLElBQUksMEJBQTBCO0dBQzlCLGtCQUFrQixJQUFJO0dBQ3RCLElBQUksTUFBTSxpQ0FBaUMsSUFBSSx5QkFBeUI7SUFDdEUseUJBQXlCLDZCQUE2QjtJQUN0RCxJQUNFLGlD
15852QUFpQyxpQkFDakMsaUNBQWlDLHdCQUVqQyx3QkFDRSx5QkFDQSxpQkFDQSxPQUNBLHdCQUNGO1NBQ0c7S0FDSCxJQUFJLFVBQVUsaUJBQ1osWUFBWTtLQUNkLElBQUksc0JBQXNCLEVBQUUsV0FBVywwQkFBMEI7TUFDL0QsSUFBSSxTQUNDLFFBQVEsZUFBZSxRQUNwQixrQkFDQSxnQkFDTixTQUNHLFFBQVEsZUFBZSxRQUNwQixhQUNDLFFBQVEsZUFBZSxRQUN0QiwwQkFDQTtNQUNWLFlBQ0ksVUFBVSxJQUNSLFFBQVEsVUFBVSxLQUNoQixTQUNBLE9BQ0EseUJBQ0EsU0FDQSxjQUNBLG1CQUNBLEtBQ0YsQ0FDRixJQUNBLFFBQVEsVUFDTixPQUNBLHlCQUNBLFNBQ0EsY0FDQSxtQkFDQSxLQUNGO0tBQ047SUFDRjtJQUNBLGVBQWUsK0JBQStCLGVBQWU7R0FDL0Q7R0FDQSwwQkFBMEI7R0FDMUIsMkJBQTJCO0dBQzNCLElBQUksT0FBTyxRQUFRLE1BQU07SUFDdkIsMkJBQTJCO0lBQzNCLFlBQ0UsS0FBSyxzQkFBc0IscUJBQXFCLG9CQUM1QyxvQkFDQTtJQUNOLFVBQ0UsS0FBSyxxQkFBcUIsb0JBQW9CLG9CQUMxQyxvQkFDQTtJQUNOLFFBQ0UsS0FBSyxVQUFVLFVBQVUsS0FBSyxZQUFZLFlBQVk7SUFDeEQsS0FBSyx5QkFDQSx5QkFBeUIsQ0FBQyxHQUMzQiwyQkFDRSx1QkFDQSxPQUNBLE9BQ0EsdUJBQ0YsS0FDQSxPQUFPLGlCQUFpQixTQUN2Qix5QkFBeUIsQ0FBQyxHQUMzQixrQkFBa0IsbUJBQW1CLE9BQU8sYUFBYTtJQUM3RCwwQkFBMEI7SUFDMUIsSUFBSSxZQUFZLFNBQ2QsWUFBWSxtQkFDWixnQkFBZ0IsSUFBSSx5QkFDcEIsa0JBQWtCLHVCQUF1QixnQkFDekMsaUJBQWlCLHVCQUF1QjtJQUMxQyxZQUFZO0lBQ1osVUFBVTtJQUNWLFFBQVE7SUFDUixRQUFRO0lBQ1IsSUFBSSxvQkFBb0I7S0FDdEIsZUFBZTtLQUNmLElBQUksMEJBQ0EsMEJBQTBCLGNBQ3pCLDBCQUEwQixhQUMxQiwwQkFBMEI7S0FDL0IsSUFBSSxZQUNBLFlBQVksNEJBQ1gsWUFBWSwyQkFDWixZQUFZO0tBQ2pCLElBQUksU0FBUyxhQUFhLDBCQUEwQixXQUFXO01BQzdELElBQUksaUJBQWlCLGdCQUFnQixvQkFBb0I7TUFDekQsVUFDSSxRQUFRLElBQ04sUUFBUSxVQUFVLEtBQ2hCLFNBQ0EsZ0JBQWdCLGdCQUFnQixZQUFZLFdBQzVDLFdBQ0EseUJBQ0EsY0FDQSxtQkFDQSxjQUNGLENBQ0YsSUFDQSxRQUFRLFVBQ04sZ0JBQWdCLGdCQUFnQixZQUFZLFdBQzVDLFdBQ0EseUJBQ0EsY0FDQSxtQkFDQSxjQUNGO0tBQ047S0FDQSxZQUFZLDRCQUNSLFlBQVksa0JBQ1YsV0FDQyxRQUFRLGVBQWUsUUFDdEIsbUJBQ0EsaUJBQ0wsa0JBQWtCLGlCQUNmLHFCQUNBLGtCQUNFLHFCQUNBLElBQUksWUFBWSwwQkFDZCxtQkFDQSxVQUNQLGlCQUFpQixDQUFDLEdBQ25CLFFBQVEsU0FBUyxlQUFlLEtBQUssQ0FBQyxrQkFBa0IsS0FBSyxDQUFDLEdBQzlELFFBQVEsU0FBUyxlQUFlLEtBQUssQ0FBQyxlQUFlLEtBQUssQ0FBQyxHQUMxRCwwQkFBMEI7TUFDekIsT0FBTztNQUNQLEtBQUs7TUFDTCxRQUFRLEVBQ04sVUFBVTtPQUNSLFlBQVk7T0FDWixPQUFPO09BQ1AsWUFBWTtPQUNaLE9BQU87TUFDVCxFQUNGO0tBQ0YsR0FDQSxVQUNJLFFBQVEsSUFDTixZQUFZLFFBQVEsS0FDbEIsYUFDQSxpQkFDQSx1QkFDRixDQUNGLElBQ0EsWUFBWSxRQUFRLGlCQUFpQix1QkFBdUIsR0FDaEUsWUFBWSxjQUFjLGVBQWU7SUFDN0M7SUFDQSxxQkFBcUI7SUFDckIscUJBQXFCO0lBQ3JCLDhCQUE4QiwyQkFBMkI7SUFDekQsd0JBQXdCO0lBQ3hCLDBCQUEwQjtJQUMxQixvQkFBb0I7SUFDcEIsb0JBQW9CLElBQUk7R0FDMUI7R0FDQSxPQUFPLFFBQVEsYUFDWCwyQkFBMkIsc0JBQzVCLFlBQ0MsS0FBSyx1QkFBdUIsc0JBQXNCLHNCQUM5QyxzQkFDQSxxQkFDTCwwQkFDQyxLQUFLLHdCQUNMLHVCQUF1QixzQkFDbkIsc0JBQ0Esc0JBQ0wsVUFDQyxLQUFLLHVCQUF1QixzQkFBc0Isc0JBQzlDLHNCQUNBLHFCQUNMLFFBQ0MsS0FBSyxVQUNELFVBQ0EsS0FBSywwQkFDSCwwQkFDQSxpQkFDUixLQUFLLDJCQUNBLHlCQUF5QixHQUFHLEdBQzdCLDJCQUNFLHlCQUNBLE9BQ0EsT0FDQSx3QkFDRixLQUNBLE9BQU8saUJBQWlCLGFBQ3ZCLHlCQUF5QixHQUFHLEdBQzdCLGtCQUFrQixxQkFBcUIsT0FBTyxhQUFhLElBQzlELGlCQUFpQixTQUNqQixZQUFZLHFCQUNaLFlBQVksSUFBSSwyQkFDaEIsZ0JBQWdCLHlCQUF5QixlQUN6QyxRQUFRLGlCQUNSLFVBQVUsc0JBQ1YsUUFBUSw0QkFDUixrQkFBa0IsK0JBQ25CLHVCQUNJLGVBQWUsY0FDakIsSUFBSSwwQkFDQSwwQkFBMEIsVUFDekIsMEJBQTBCLFNBQzFCLDBCQUEwQixPQUMvQixJQUFJLFlBQ0EsWUFBWSw0QkFDWCxZQUFZLDJCQUNaLFlBQVkseUJBQ2pCLElBQUksaUJBQ0EsaUJBQWlCLGNBQWMsaUJBQWlCLGFBQy9DLGlCQUFpQixXQUN0QixZQUFZLGtCQUNWLFNBQVMsY0FDUCxpQkFBaUIsWUFBWSxvQkFBb0IsV0FDbkQsVUFDSSxRQUFRLElBQ04sUUFBUSxVQUFVLEtBQ2hCLFNBQ0EsWUFBWSxnQkFBZ0IsWUFBWSxXQUN4QyxnQkFDQSxXQUNBLGNBQ0EsbUJBQ0EsY0FDRixDQUNGLElBQ0EsUUFBUSxVQUNOLFlBQVksZ0JBQWdCLFlBQVksV0FDeEMsZ0JBQ0EsV0FDQSxjQUNBLG1CQUNBLGNBQ0YsSUFDTiwwQkFBMEIsY0FDdkIsVUFDRyxRQUFRLElBQ04sUUFBUSxVQUFVLEtBQ2hCLFNBQ0EsVUFDQSxXQUNBLHlCQUNBLGNBQ0EsbUJBQ0EsY0FDRixDQUNGLElBQ0EsUUFBUSxVQUNOLFVBQ0EsV0FDQSx5QkFDQSxjQUNBLG1CQUNBLGNBQ0YsSUFDTixRQUFRLDRCQUNKLFlBQVksZ0JBQ1YscUJBQ0EsSUFBSSxRQUFRLDBCQUNWLG1CQUNBLFVBQ0wsaUJBQWlCLENBQUMsR0FDbkIsUUFBUSxtQkFDTixlQUFlLEtBQUssQ0FBQyxrQkFBa0IsZUFBZSxDQUFDLEdBQ3pELFFBQVEsU0FBUyxlQUFlLEtBQUssQ0FBQyxlQUFlLEtBQUssQ0FBQyxHQUMxRCwwQkFBMEI7SUFDekIsT0FBTztJQUNQLEtBQUs7SUFDTCxRQUFRLEVBQ04sVUFBVTtLQUNSLFlBQVk7S0FDWixPQUFPO0tBQ1AsWUFBWTtLQUNaLE9BQU87SUFDVCxFQUNGO0dBQ0YsR0FDQSxVQUNJLFFBQVEsSUFDTixZQUFZLFFBQVEsS0FDbEIsYUFDQSxXQUNBLHVCQUNGLENBQ0YsSUFDQSxZQUFZLFFBQVEsV0FBVyx1QkFBdUIsR0FDMUQsWUFBWSxjQUFjLFNBQVMsS0FDdEMsdUJBQXVCLHNCQUFzQixNQUM3Qyx1QkFBdUIsR0FDdkIsMEJBQTBCLE1BQzFCLDRCQUE0QixxQkFDNUIsc0JBQXNCLE1BQ3RCLHNCQUFzQixJQUFJO0dBQzdCLE9BQU8sUUFBUSxhQUNiLE9BQU8saUJBQWlCLGNBQ3ZCLHlCQUF5QixPQUFPLEdBQ2pDLGtCQUFrQixnQkFBZ0IsaUJBQWlCLGFBQWE7R0FDbEUsT0FBTyxRQUFRLGVBQ2IsT0FBTyxpQkFBaUIsZ0JBQ3ZCLHlCQUF5QixTQUFTLEdBQ25DLGtCQUFrQixlQUFlLGlCQUFpQixhQUFhO0dBQ2pFLDBCQUEwQixLQUFLO0dBQy9CLDRCQUE0QixjQUN4QixLQUFLLGdCQUFnQixXQUN2QixjQUFjLHVC
15852QUF1QjtHQUN2QywwQkFBMEIsS0FBSztHQUMvQixTQUFTLDRCQUNMLEtBQUssc0JBQXNCLE1BQU8sd0JBQXdCO0dBQzlELHNCQUFzQjtHQUN0Qix5QkFBeUI7R0FDekIscUJBQXFCO0dBQ3JCLGlCQUFpQiwwQkFBMEIscUJBQ3pDLEtBQUssU0FDTCxJQUNGO0dBQ0EsZ0NBQWdDO0dBQ2hDLGdDQUFnQztHQUNoQyw0QkFBNEI7R0FDNUIsNkNBQTZDLENBQUM7R0FDOUMsbUNBQW1DLDBCQUEwQixNQUFNLEtBQUs7R0FDeEUsMENBQTBDLENBQUM7R0FDM0MsK0JBQStCO0dBQy9CLG9DQUNFLDZCQUNBLGdDQUNBLDRDQUNBLGlDQUNFO0dBQ0osc0NBQXNDLHFDQUNwQztHQUNGLG9EQUFvRCxDQUFDO0dBQ3JELHVCQUF1QixrQkFBa0IsTUFBTSxLQUFLO0dBQ3BELGdDQUFnQztHQUNoQyxPQUFPLGVBQWU7R0FDdEIsTUFBTSxPQUFPLGtCQUNULHFCQUFxQiw2QkFBNkIsR0FDbkQsZ0JBQWdCO0dBQ25CLHdCQUF3Qix1QkFBdUI7R0FDL0MsT0FBTztFQUNUO0VBQ0EsU0FBUyxZQUFZLE1BQU0sYUFBYTtHQUN0QywwQkFBMEI7R0FDMUIscUJBQXFCLElBQUk7R0FDekIscUJBQXFCLGtCQUFrQjtHQUN2QyxjQUFjLENBQUM7R0FDZixVQUFVO0dBQ1YsZ0JBQWdCLHFCQUNoQixnQkFBZ0IsMkJBQ1YsY0FBYyxxQkFBcUIsR0FDcEMsZ0NBQWdDLHdCQUNqQyxnQkFBZ0IsNEJBQ1osY0FBYyxxQkFBcUIsR0FDcEMsZ0NBQWdDLHVCQUNoQyxnQ0FDQyxnQkFBZ0IsOEJBQ1osdUJBQ0EsU0FBUyxlQUNQLGFBQWEsT0FBTyxlQUNwQixlQUFlLE9BQU8sWUFBWSxPQUNsQyxvQ0FDQTtHQUNkLDRCQUE0QjtHQUM1QixJQUFJLGNBQWM7R0FDbEIsU0FBUyxlQUNILCtCQUErQixrQkFDakMsaUJBQ0UsTUFDQSwyQkFBMkIsYUFBYSxLQUFLLE9BQU8sQ0FDdEQsS0FDQSxZQUFZLE9BQU8sZUFDbkIsNENBQTRDLFdBQVc7RUFDN0Q7RUFDQSxTQUFTLCtCQUErQjtHQUN0QyxJQUFJLFVBQVUsMkJBQTJCO0dBQ3pDLE9BQU8sU0FBUyxVQUNaLENBQUMsS0FDQSxnQ0FBZ0MsYUFDL0IsZ0NBQ0EsU0FBUyxnQkFDUCxDQUFDLElBQ0QsQ0FBQyxLQUNGLGdDQUFnQyxjQUM3QixpQ0FDRixPQUFPLGdDQUFnQyxhQUN2QyxZQUFZLGdCQUNaLENBQUM7RUFDWDtFQUNBLFNBQVMsaUJBQWlCO0dBQ3hCLElBQUksaUJBQWlCLHFCQUFxQjtHQUMxQyxxQkFBcUIsSUFBSTtHQUN6QixPQUFPLFNBQVMsaUJBQWlCLHdCQUF3QjtFQUMzRDtFQUNBLFNBQVMsc0JBQXNCO0dBQzdCLElBQUksc0JBQXNCLHFCQUFxQjtHQUMvQyxxQkFBcUIsSUFBSTtHQUN6QixPQUFPO0VBQ1Q7RUFDQSxTQUFTLHVCQUF1QixPQUFPO0dBQ3JDLFNBQVMsNkJBQ04sMkJBQ0MsUUFBUSxNQUFNLGFBQWEsT0FBTyxNQUFNO0VBQzlDO0VBQ0EsU0FBUyxrQ0FBa0M7R0FDekMsK0JBQStCO0dBQy9CLCtDQUNJLGdDQUFnQyxhQUNoQyxpQ0FDQSxTQUFTLDJCQUEyQixZQUNyQyxtQ0FBbUMsQ0FBQztHQUN2QyxPQUFRLGlDQUFpQyxjQUN2QyxPQUFPLDRDQUE0QyxjQUNuRCxTQUFTLHNCQUNULGtCQUNFLG9CQUNBLCtCQUNBLDRCQUNBLENBQUMsQ0FDSDtFQUNKO0VBQ0EsU0FBUyxlQUFlLE1BQU0sT0FBTyw0QkFBNEI7R0FDL0QsSUFBSSx1QkFBdUI7R0FDM0Isb0JBQW9CO0dBQ3BCLElBQUksaUJBQWlCLGVBQWUsR0FDbEMsc0JBQXNCLG9CQUFvQjtHQUM1QyxJQUNFLHVCQUF1QixRQUN2QixrQ0FBa0MsT0FDbEM7SUFDQSxJQUFJLG1CQUFtQjtLQUNyQixJQUFJLG1CQUFtQixLQUFLO0tBQzVCLElBQUksaUJBQWlCLFNBQ2xCLHVCQUF1QixNQUFNLDZCQUE2QixHQUMzRCxpQkFBaUIsTUFBTTtLQUN6Qiw0QkFBNEIsTUFBTSxLQUFLO0lBQ3pDO0lBQ0EsNEJBQTRCO0lBQzVCLGtCQUFrQixNQUFNLEtBQUs7R0FDL0I7R0FDQSxRQUFRLENBQUM7R0FDVCxtQkFBbUI7R0FDbkIsR0FBRztJQUNELElBQUk7S0FDRixJQUNFLGtDQUFrQyxnQkFDbEMsU0FBUyxnQkFDVDtNQUNBLElBQUksYUFBYSxnQkFDZixjQUFjO01BQ2hCLFFBQVEsK0JBQVI7T0FDRSxLQUFLO1FBQ0gseUJBQXlCO1FBQ3pCLG1CQUFtQjtRQUNuQixNQUFNO09BQ1IsS0FBSztPQUNMLEtBQUs7T0FDTCxLQUFLO09BQ0wsS0FBSztRQUNILFNBQVMsMkJBQTJCLFlBQVksUUFBUSxDQUFDO1FBQ3pELElBQUksU0FBUztRQUNiLGdDQUFnQztRQUNoQyw0QkFBNEI7UUFDNUIsdUJBQXVCLE1BQU0sWUFBWSxhQUFhLE1BQU07UUFDNUQsSUFDRSw4QkFDQSxrQ0FDQTtTQUNBLG1CQUFtQjtTQUNuQixNQUFNO1FBQ1I7UUFDQTtPQUNGLFNBQ0UsU0FBVSwrQkFDUCxnQ0FBZ0MsY0FDaEMsNEJBQTRCLE1BQzdCLHVCQUF1QixNQUFNLFlBQVksYUFBYSxNQUFNO01BQ2xFO0tBQ0Y7S0FDQSxhQUFhO0tBQ2IsbUJBQW1CO0tBQ25CO0lBQ0YsU0FBUyxlQUFlO0tBQ3RCLFlBQVksTUFBTSxhQUFhO0lBQ2pDO1VBQ0s7R0FDUCxTQUFTLEtBQUs7R0FDZCx5QkFBeUI7R0FDekIsbUJBQW1CO0dBQ25CLHFCQUFxQixJQUFJO0dBQ3pCLHFCQUFxQixJQUFJO0dBQ3pCLFNBQVMsbUJBQ0wscUJBQXFCLE1BQ3RCLGdDQUFnQyxHQUNqQyxnQ0FBZ0M7R0FDbEMsT0FBTztFQUNUO0VBQ0EsU0FBUyxlQUFlO0dBQ3RCLE9BQU8sU0FBUyxpQkFBa0Isa0JBQWtCLGNBQWM7RUFDcEU7RUFDQSxTQUFTLHFCQUFxQixNQUFNLE9BQU87R0FDekMsSUFBSSx1QkFBdUI7R0FDM0Isb0JBQW9CO0dBQ3BCLElBQUksaUJBQWlCLGVBQWUsR0FDbEMsc0JBQXNCLG9CQUFvQjtHQUM1QyxJQUNFLHVCQUF1QixRQUN2QixrQ0FBa0MsT0FDbEM7SUFDQSxJQUFJLG1CQUFtQjtLQUNyQixJQUFJLG1CQUFtQixLQUFLO0tBQzVCLElBQUksaUJBQWlCLFNBQ2xCLHVCQUF1QixNQUFNLDZCQUE2QixHQUMzRCxpQkFBaUIsTUFBTTtLQUN6Qiw0QkFBNEIsTUFBTSxLQUFLO0lBQ3pDO0lBQ0EsNEJBQTRCO0lBQzVCLHFDQUFxQyxNQUFNLElBQUk7SUFDL0Msa0JBQWtCLE1BQU0sS0FBSztHQUMvQixPQUNFLG1DQUFtQywwQkFDakMsTUFDQSxLQUNGO0dBQ0YsR0FBRztJQUNELElBQUk7S0FDRixJQUNFLGtDQUFrQyxnQkFDbEMsU0FBUyxnQkFFVCxHQUFHLFFBQ0MsUUFBUSxnQkFDVCxtQkFBbUIsMkJBQ3BCLCtCQUhDO01BS0QsS0FBSztPQUNILGdDQUFnQztPQUNoQyw0QkFBNEI7T0FDNUIsdUJBQ0UsTUFDQSxPQUNBLGtCQUNBLGdCQUNGO09BQ0E7TUFDRixLQUFLO01BQ0wsS0FBSztPQUNILElBQUksbUJBQW1CLGdCQUFnQixHQUFHO1FBQ3hDLGdDQUFnQztRQUNoQyw0QkFBNEI7UUFDNUIsMEJBQTBCLEtBQUs7UUFDL0I7T0FDRjtPQUNBLFFBQVEsV0FBWTtRQUNsQixrQ0FBbUMsbUJBQ2pDLGtDQUFrQyxxQkFDbEMsdUJBQXVCLFNBQ3RCLGdDQUNDO1FBQ0osc0JBQXNCLElBQUk7T0FDNUI7T0FDQSxpQkFBaUIsS0FBSyxPQUFPLEtBQUs7T0FDbEMsTUFBTTtNQUNSLEtBQUs7T0FDSCxnQ0FBZ0M7T0FDaEMsTUFBTTtNQUNSLEtBQUs7T0FDSCxnQ0FDRTtPQUNGLE1BQU07TUFDUixLQUFLO09BQ0gsbUJBQW1CLGdCQUFnQixLQUM3QixnQ0FBZ0MsY0FDakMsNEJBQTRCLE1BQzdCLDBCQUEwQixLQUFLLE1BQzdCLGdDQU
15852FnQyxjQUNqQyw0QkFBNEIsTUFDN0IsdUJBQ0UsTUFDQSxPQUNBLGtCQUNBLDJCQUNGO09BQ0o7TUFDRixLQUFLO09BQ0gsSUFBSSxXQUFXO09BQ2YsUUFBUSxlQUFlLEtBQXZCO1FBQ0UsS0FBSyxJQUNILFdBQVcsZUFBZTtRQUM1QixLQUFLO1FBQ0wsS0FBSztTQUNILElBQUksWUFBWTtTQUNoQixJQUNFLFdBQ0ksZ0JBQWdCLFFBQVEsSUFDeEIsVUFBVSxVQUFVLFVBQ3hCO1VBQ0EsZ0NBQWdDO1VBQ2hDLDRCQUE0QjtVQUM1QixJQUFJLFVBQVUsVUFBVTtVQUN4QixJQUFJLFNBQVMsU0FBUyxpQkFBaUI7ZUFDbEM7V0FDSCxJQUFJLGNBQWMsVUFBVTtXQUM1QixTQUFTLGVBQ0gsaUJBQWlCLGFBQ25CLG1CQUFtQixXQUFXLEtBQzdCLGlCQUFpQjtVQUN4QjtVQUNBLE1BQU07U0FDUjtTQUNBO1FBQ0YsU0FDRSxRQUFRLE1BQ04sZ0ZBQ0Y7T0FDSjtPQUNBLGdDQUFnQztPQUNoQyw0QkFBNEI7T0FDNUIsdUJBQ0UsTUFDQSxPQUNBLGtCQUNBLHFDQUNGO09BQ0E7TUFDRixLQUFLO09BQ0gsZ0NBQWdDO09BQ2hDLDRCQUE0QjtPQUM1Qix1QkFDRSxNQUNBLE9BQ0Esa0JBQ0EsaUNBQ0Y7T0FDQTtNQUNGLEtBQUs7T0FDSCx5QkFBeUI7T0FDekIsK0JBQStCO09BQy9CLE1BQU07TUFDUixTQUNFLE1BQU0sTUFDSixxREFDRjtLQUNKO0tBQ0YsU0FBUyxxQkFBcUIsV0FDMUIsYUFBYSxJQUNiLDhCQUE4QjtLQUNsQztJQUNGLFNBQVMsZ0JBQWdCO0tBQ3ZCLFlBQVksTUFBTSxjQUFjO0lBQ2xDO1VBQ0s7R0FDUCx5QkFBeUI7R0FDekIscUJBQXFCLElBQUk7R0FDekIscUJBQXFCLElBQUk7R0FDekIsbUJBQW1CO0dBQ25CLElBQUksU0FBUyxnQkFBZ0IsT0FBTztHQUNwQyxxQkFBcUI7R0FDckIsZ0NBQWdDO0dBQ2hDLGdDQUFnQztHQUNoQyxPQUFPO0VBQ1Q7RUFDQSxTQUFTLGdDQUFnQztHQUN2QyxPQUFPLFNBQVMsa0JBQWtCLENBQUMsWUFBWSxJQUM3QyxrQkFBa0IsY0FBYztFQUNwQztFQUNBLFNBQVMsa0JBQWtCLFlBQVk7R0FDckMsSUFBSSxVQUFVLFdBQVc7R0FDekIsQ0FBQyxXQUFXLE9BQU8saUJBQWlCLFVBQy9CLG1CQUFtQixVQUFVLEdBQzdCLFVBQVUsa0JBQ1QsWUFDQSxXQUNBLFNBQ0EsWUFDQSxvQkFDRixHQUNBLDRDQUE0QyxVQUFVLEtBQ3JELFVBQVUsa0JBQ1QsWUFDQSxXQUNBLFNBQ0EsWUFDQSxvQkFDRjtHQUNKLFdBQVcsZ0JBQWdCLFdBQVc7R0FDdEMsU0FBUyxVQUNMLG1CQUFtQixVQUFVLElBQzVCLGlCQUFpQjtFQUN4QjtFQUNBLFNBQVMsMEJBQTBCLFlBQVk7R0FDN0MsSUFBSSxPQUFPLGtCQUFrQixZQUFZLGlCQUFpQixVQUFVO0dBQ3BFLFdBQVcsZ0JBQWdCLFdBQVc7R0FDdEMsU0FBUyxPQUFPLG1CQUFtQixVQUFVLElBQUssaUJBQWlCO0VBQ3JFO0VBQ0EsU0FBUyxnQkFBZ0IsWUFBWTtHQUNuQyxJQUFJLFVBQVUsV0FBVyxXQUN2QixtQkFBbUIsV0FBVyxPQUFPLGlCQUFpQjtHQUN4RCxtQkFBbUIsbUJBQW1CLFVBQVU7R0FDaEQsUUFBUSxXQUFXLEtBQW5CO0lBQ0UsS0FBSztJQUNMLEtBQUs7S0FDSCxVQUFVLHdCQUNSLFNBQ0EsWUFDQSxXQUFXLGNBQ1gsV0FBVyxNQUNYLEtBQUssR0FDTCw2QkFDRjtLQUNBO0lBQ0YsS0FBSztLQUNILFVBQVUsd0JBQ1IsU0FDQSxZQUNBLFdBQVcsY0FDWCxXQUFXLEtBQUssUUFDaEIsV0FBVyxLQUNYLDZCQUNGO0tBQ0E7SUFDRixLQUFLO0tBQ0gsbUJBQW1CLFVBQVU7S0FDN0IsSUFBSSxRQUFRO0tBQ1osVUFBVSx5QkFDUCxlQUNJLG9CQUFvQixLQUFLLEdBQzFCLE1BQU0sTUFBTSxPQUNWLFFBQVEsTUFBTSxjQUNiLHlCQUF5QixNQUFNLGVBQ2pDLG9CQUFvQixLQUFLLEdBQUksY0FBYyxDQUFDO0lBQ3JELFNBQ0Usc0JBQXNCLFNBQVMsVUFBVSxHQUN0QyxhQUFhLGlCQUNaLG9CQUFvQixZQUFZLG9CQUFvQixHQUNyRCxVQUFVLFVBQVUsU0FBUyxZQUFZLG9CQUFvQjtHQUNwRTtHQUNBLG1CQUNFLDRDQUE0QyxVQUFVO0dBQ3hELE9BQU87RUFDVDtFQUNBLFNBQVMsdUJBQ1AsTUFDQSxZQUNBLGFBQ0EsaUJBQ0E7R0FDQSx5QkFBeUI7R0FDekIsbUJBQW1CLFVBQVU7R0FDN0Isa0JBQWtCO0dBQ2xCLHlCQUF5QjtHQUN6QixJQUFJLGNBQWMsV0FBVztHQUM3QixJQUFJO0lBQ0YsSUFDRSxlQUNFLE1BQ0EsYUFDQSxZQUNBLGFBQ0EsNkJBQ0YsR0FDQTtLQUNBLCtCQUErQjtLQUMvQixpQkFDRSxNQUNBLDJCQUEyQixhQUFhLEtBQUssT0FBTyxDQUN0RDtLQUNBLGlCQUFpQjtLQUNqQjtJQUNGO0dBQ0YsU0FBUyxPQUFPO0lBQ2QsSUFBSSxTQUFTLGFBQWEsTUFBUSxpQkFBaUIsYUFBYztJQUNqRSwrQkFBK0I7SUFDL0IsaUJBQ0UsTUFDQSwyQkFBMkIsYUFBYSxLQUFLLE9BQU8sQ0FDdEQ7SUFDQSxpQkFBaUI7SUFDakI7R0FDRjtHQUNBLElBQUksV0FBVyxRQUFRLE9BQU87SUFDNUIsSUFBSSxlQUFlLG9CQUFvQixrQkFBa0IsT0FBTyxDQUFDO1NBQzVELElBQ0gsb0NBQ0EsT0FBTyxnQ0FBZ0MsWUFFdkMsT0FBTyxDQUFDO1NBQ0wsSUFDRCw2Q0FBNkMsT0FBTyxDQUFDLEdBQ3ZELG9CQUFvQixtQkFDbEIsb0JBQW9CLHFCQUNwQixvQkFBb0Isd0JBQ3BCLG9CQUFvQixtQ0FFdEIsa0JBQW1CLDJCQUEyQixTQUM1QyxTQUFTLG1CQUNQLE9BQU8sZ0JBQWdCLFFBQ3RCLGdCQUFnQixTQUFTO0lBQ2hDLGlCQUFpQixZQUFZLElBQUk7R0FDbkMsT0FBTyxtQkFBbUIsVUFBVTtFQUN0QztFQUNBLFNBQVMsbUJBQW1CLFlBQVk7R0FDdEMsSUFBSSxnQkFBZ0I7R0FDcEIsR0FBRztJQUNELElBQUksT0FBTyxjQUFjLFFBQVEsUUFBUTtLQUN2QyxpQkFDRSxlQUNBLDBDQUNGO0tBQ0E7SUFDRjtJQUNBLElBQUksVUFBVSxjQUFjO0lBQzVCLGFBQWEsY0FBYztJQUMzQixtQkFBbUIsYUFBYTtJQUNoQyxVQUFVLGtCQUNSLGVBQ0EsY0FDQSxTQUNBLGVBQ0Esb0JBQ0Y7SUFDQSxDQUFDLGNBQWMsT0FBTyxpQkFBaUIsVUFDckMsc0RBQXNELGFBQWE7SUFDckUsSUFBSSxTQUFTLFNBQVM7S0FDcEIsaUJBQWlCO0tBQ2pCO0lBQ0Y7SUFDQSxnQkFBZ0IsY0FBYztJQUM5QixJQUFJLFNBQVMsZUFBZTtLQUMxQixpQkFBaUI7S0FDakI7SUFDRjtJQUNBLGlCQUFpQixnQkFBZ0I7R0FDbkMsU0FBUyxTQUFTO0dBQ2xCLGlDQUFpQyxtQkFDOUIsK0JBQStCO0VBQ3BDO0VBQ0EsU0FBUyxpQkFBaUIsWUFBWSxjQUFjO0dBQ2xELEdBQUc7SUFDRCxJQUFJLE9BQU8sV0FBVyxXQUFXLFdBQVcsVUFBVTtJQUN0RCxJQUFJLFNBQVMsTUFBTTtLQUNqQixLQUFLLFNBQVM7S0FDZCxpQkFBaUI7S0FDakI7SUFDRjtJQUNBLEtBQUssV0FBVyxPQUFPLGlCQUFpQixRQUFRO0tBQzlDLHNEQUFzRCxVQUFVO0tBQ2hFLE9BQU8sV0FBVztLQUNsQixLQUFLLElBQUksUUFBUSxXQUFXLE9BQU8sU0FBUyxRQUMxQyxRQUFTLE1BQU0sZ0JBQWtCLFFBQVEsTUFBTTtLQUNqRCxXQUFXLGlCQUFpQjtJQUM5QjtJQUNBLE9BQU8sV0FBVztJQUNsQixTQUFTLFNBQ0wsS0FBSyxTQUFTLE9BQ2YsS0FBSyxlQUFlLEdBQ3BCLEtBQUssWUFBWTtJQUNwQixJQUNFLENBQUMsaUJBQ0MsYUFBYSxXQUFXLFNBQVUsU0FBUyxhQUM3QztLQUNBLGlCQUFpQjtLQUNqQjtJQUNGO0lBQ0EsaUJBQWlCLGFBQWE7R0FDaEMsU0FBUyxTQUFTO0dBQ2xCLCtCQUErQjtHQUMvQixpQkFBaUI7RUFDbkI7RUFDQSxTQUFTLGFBQ1AsTUFDQSxjQUNBLE9BQ0EsbUJBQ0EsYUFDQSw2QkFDQSxhQUNBLGNBQ0EscUJBQ0EsMEJBQ0EsWUFDQSxnQkFDQSx1QkFDQSwwQkFDQSx3QkFDQTtHQUNBLEtB
15852QUssc0JBQXNCO0dBQzNCO0lBQUcsb0JBQW9CO1VBQ2hCLHlCQUF5QjtHQUNoQyx3QkFBd0IsMEJBQTBCO0dBQ2xELHdCQUF3QixvQ0FBb0M7R0FDNUQsS0FBSyxvQkFBb0IsZ0JBQWdCLG9CQUFvQixXQUMzRCxNQUFNLE1BQU0sZ0NBQWdDO0dBQzlDLHlCQUF5QixLQUFLO0dBQzlCLElBQUksZUFBZSxhQUNqQixzQkFDRSwwQkFDQSx3QkFDQSxPQUNBLHdCQUNGO1FBQ0csSUFBSSxTQUFTLG1CQUVaO1FBQUEsMkJBQ0EsU0FBUyxnQkFDVCxTQUFTLGFBQWEsYUFDdEIsYUFBYSxVQUFVLGNBQWMsZ0JBQ3JDLE9BQU8sYUFBYSxRQUFRLE1BQzdCLDhCQUE4QiwwQkFDL0Isc0JBQ0UsRUFBRSwwQkFBMEIsMkJBQzlCO0tBQ0EsYUFBYSxDQUFDO0tBQ2QsS0FBSyxJQUFJLElBQUksR0FBRyxJQUFJLGtCQUFrQixRQUFRLEtBQUs7TUFDakQsSUFBSSxRQUFRLGtCQUFrQixFQUFFLENBQUM7TUFDakMsV0FBVyxLQUFLLENBQ2QscUJBQ0EsYUFBYSxPQUFPLFNBQ3BCLFNBQVMsU0FDVCxhQUFhLE9BQU8sTUFBTSxVQUN0QixPQUFPLE1BQU0sT0FBTyxJQUNwQixPQUFPLEtBQUssQ0FDbEIsQ0FBQztLQUNIO0tBQ0EsMkJBQTJCO01BQ3pCLE9BQU87TUFDUCxLQUFLO01BQ0wsUUFBUSxFQUNOLFVBQVU7T0FDUixPQUFPO09BQ1AsT0FBTztPQUNQLFlBQVk7T0FDWixhQUFhLDJCQUNULHFCQUNBO09BQ0osWUFBWTtNQUNkLEVBQ0Y7S0FDRjtLQUNBLDhCQUNJLDRCQUE0QixJQUMxQixZQUFZLFFBQVEsS0FDbEIsYUFDQSxhQUNBLHdCQUNGLENBQ0YsSUFDQSxZQUFZLFFBQVEsYUFBYSx3QkFBd0I7S0FDN0QsWUFBWSxjQUFjLFdBQVc7SUFDdkM7VUFFQSw4QkFBK0IsMEJBQzdCLENBQUMsc0JBQ0MsMEJBQTBCLDZCQUN4Qiw0QkFDQyxRQUFRLGVBQWUsUUFBUSxrQkFBa0IsZ0JBQ25ELGNBQ0UsUUFBUSxlQUFlLFFBQ3BCLGNBQ0MsUUFBUSxlQUFlLFFBQ3RCLGFBQ0EsVUFDUiw4QkFDSSw0QkFBNEIsSUFDMUIsUUFBUSxVQUFVLEtBQ2hCLFNBQ0EsWUFDQSwwQkFDQSx3QkFDQSxjQUNBLG1CQUNBLHdCQUNGLENBQ0YsSUFDQSxRQUFRLFVBQ04sWUFDQSwwQkFDQSx3QkFDQSxjQUNBLG1CQUNBLHdCQUNGO0dBQ1YsSUFBSSxTQUFTLGNBQWM7SUFDekIsTUFBTSxTQUNKLFFBQVEsTUFDTiw0RUFDRjtJQUNGLElBQUksaUJBQWlCLEtBQUssU0FDeEIsTUFBTSxNQUNKLDZHQUNGO0lBQ0YsU0FBUyx1QkFDTCxpQkFBaUIscUJBQXFCLE1BQ3ZDLGdDQUFnQztJQUNuQyxzQkFBc0I7SUFDdEIscUJBQXFCO0lBQ3JCLHNCQUFzQjtJQUN0Qiw0QkFBNEI7SUFDNUIsMkJBQTJCO0lBQzNCLDhCQUE4QjtJQUM5QiwrQkFBK0I7SUFDL0IsNkJBQTZCO0lBQzdCLHVDQUF1QztJQUN2QyxXQUNFLE1BQ0EsY0FDQSxPQUNBLGFBQ0EsY0FDQSxxQkFDQSxnQkFDQSx1QkFDQSxzQkFDRjtHQUNGO0VBQ0Y7RUFDQSxTQUFTLFdBQ1AsTUFDQSxjQUNBLE9BQ0EsYUFDQSxjQUNBLHFCQUNBLGdCQUNBLHVCQUNBLHdCQUNBO0dBQ0EsSUFBSSxpQkFBaUIsYUFBYSxRQUFRLGFBQWE7R0FDdkQsK0JBQStCO0dBQy9CLGtCQUFrQjtHQUNsQixpQkFDRSxNQUNBLE9BQ0EsZ0JBQ0EsYUFDQSxjQUNBLG1CQUNGO0dBQ0EsOEJBQThCO0dBQzlCLENBQUMsUUFBUSxlQUFlLFNBQ2xCLHlCQUF5QiwyQkFBMkIsSUFBSSxHQUN6RCxjQUFjLFVBQ2IseUJBQXlCLE1BQVEsY0FBYztHQUNyRCxNQUFNLGFBQWEsa0JBQ25CLE9BQU8sYUFBYSxlQUFlLGdCQUNuQyxPQUFPLGFBQWEsUUFBUSxnQkFDdEIsS0FBSyxlQUFlLE1BQ3JCLEtBQUssbUJBQW1CLEdBQ3pCLG1CQUFtQixrQkFBa0IsV0FBWTtJQUMvQyxpQkFBaUIsT0FBTztJQUN4QiwrQkFBK0IscUJBQzVCLDZCQUE2QjtJQUNoQyxvQkFBb0I7SUFDcEIsT0FBTztHQUNULENBQUMsTUFDQyxLQUFLLGVBQWUsTUFBUSxLQUFLLG1CQUFtQjtHQUMxRCxlQUFlO0dBQ2Ysa0JBQWtCLElBQUk7R0FDdEIsU0FBUyx5QkFDUCx3QkFDRSx3QkFDQSxpQkFDQSx1QkFDQSx3QkFDRjtHQUNGLDRCQUE0QixDQUFDO0dBQzdCLHdCQUF3QixPQUFPLGFBQWEsUUFBUTtHQUNwRCxJQUFJLE9BQU8sYUFBYSxlQUFlLFVBQVUsdUJBQXVCO0lBQ3RFLHdCQUF3QixxQkFBcUI7SUFDN0MscUJBQXFCLElBQUk7SUFDekIseUJBQXlCLHdCQUF3QjtJQUNqRCx3QkFBd0IsSUFBSTtJQUM1QixjQUFjO0lBQ2Qsb0JBQW9CO0lBQ3BCLElBQUk7S0FDRiw0QkFBNEIsTUFBTSxjQUFjLEtBQUs7SUFDdkQsVUFBVTtLQUNSLG1CQUFvQixhQUNqQix3QkFBd0IsSUFBSSx3QkFDNUIscUJBQXFCLElBQUk7SUFDOUI7R0FDRjtHQUNBLHVCQUF1QjtHQUN2Qiw2QkFDTSxrQkFBa0IsT0FDbkIsZ0JBQWdCLE1BQ2hCLHdCQUF3QixvQkFDdkIsZ0JBQ0EsS0FBSyxlQUNMLHdCQUNBLHNCQUNBLG9CQUNBLDJCQUNBLGtCQUNBLHFCQUNBLDJCQUNBLHlCQUNBLHVCQUF1QixLQUFLLE1BQU0sS0FBSyxDQUN6QyxNQUNDLHFCQUFxQixHQUFHLG1CQUFtQixHQUFHLGlCQUFpQjtFQUN0RTtFQUNBLFNBQVMsMEJBQTBCLE9BQU87R0FDeEMsSUFBSSx5QkFBeUIsb0JBQW9CO0lBQy9DLElBQUkscUJBQXFCLG1CQUFtQjtJQUM1QyxtQkFBbUIsT0FBTyxjQUFjLElBQUksQ0FBQztHQUMvQztFQUNGO0VBQ0EsU0FBUyx3QkFBd0IsUUFBUTtHQUN2QyxnQkFBZ0IsSUFBSTtHQUNwQixlQUNFLFNBQVMsK0JBQ0wsOEJBQ0EsaUJBQ0osZUFDQSxjQUNBLCtCQUErQixnQ0FDL0Isd0JBQ0Y7R0FDQSwrQkFBK0IsdUNBQzdCO0VBQ0o7RUFDQSxTQUFTLHVCQUF1QixPQUFPO0dBQ3JDLElBQUksT0FBTyxpQkFBaUIsUUFBUTtJQUNsQyxJQUFJLE9BQU87SUFDWCxrQkFBa0IsQ0FBQztJQUNuQixnQkFBZ0I7SUFDaEIsT0FBTyxRQUFRLFlBQ2IsT0FBTyxnQ0FBZ0MsWUFDdkMsT0FBTyxzQkFBc0IsYUFDNUIseUJBQXlCLEdBQUcsR0FDN0Isa0JBQWtCLHFCQUFxQixNQUFNLEdBQUcsSUFBSTtJQUN0RCxPQUFPLFFBQVEsYUFDYixPQUFPLGdDQUFnQyxhQUN2QyxPQUFPLHNCQUFzQixjQUM1Qix5QkFBeUIsT0FBTyxHQUNqQyxrQkFBa0IsZ0JBQWdCLE1BQU0sR0FBRyxJQUFJO0lBQ2pELE9BQU8sUUFBUSxlQUNiLE9BQU8sZ0NBQWdDLGVBQ3ZDLE9BQU8sc0JBQXNCLGdCQUM1Qix5QkFBeUIsU0FBUyxHQUNuQyxrQkFBa0IsZUFBZSxNQUFNLEdBQUcsSUFBSTtHQUNsRDtFQUNGO0VBQ0EsU0FBUyw0QkFBNEI7R0FDbkMseUJBQXlCLGlDQUNyQix1QkFBdUIsb0JBQ3pCLGtDQUNFLHFCQUNBLGtCQUNGLEdBQ0MsdUJBQXVCO0VBQzVCO0VBQ0EsU0FBUyx1QkFBdUI7R0FDOUIsSUFBSSx5QkFBeUIsd0JBQXdCO0lBQ25ELHVCQUF1QjtJQUN2QixJQUFJLE9BQU8sb0JBQ1QsZUFBZSxxQkFDZixRQUFRLHFCQUNSLHdCQUF3QixPQUFPLGFBQWEsUUFBUTtJQUN0RCxJQUNFLE9BQU8sYUFBYSxlQUFlLFVBQ25DLHVCQUNBO0tBQ0Esd0JBQXdCLHFCQUFxQjtLQUM3QyxxQkFBcUIsSUFBSTtLQUN6QixJQUFJLG1CQUFtQix3QkFBd0I7S0FDL0Msd0JBQXdCLElBQUk7S0FDNUIsSUFBSSx1QkFBdUI7S0FDM0Isb0JBQW9CO0tBQ3BCLElBQUk7TUFDRixrQkFBa0I7TUFDbEIsaUJBQWlCO01BQ2pCLHlCQUF5Qiw2QkFBNkIsQ0FBQztNQUN2RCwyQkFBMkI7TUFDM0IsNkJBQTZCLGNBQWMsTUFBTSxLQUFLO01BQ3RELGlCQUFpQixrQkFBa0I7TUFDbkMsUUFBUTtNQUNSLElBQUksaUJBQWlCLHFCQUFxQixLQUFLLGFBQWEsR0FDMUQsbUJBQW1CLE1BQU0sYUFDekIsc0JBQXNCLE1BQU07TUFDOUIsSUFDRSxtQkFBbUIsb0JBQ25CLG9CQUNBLGlCQUFpQixpQkFDakIsYUFD
15852RSxpQkFBaUIsY0FBYyxpQkFDL0IsZ0JBQ0YsR0FDQTtPQUNBLElBQ0UsU0FBUyx1QkFDVCx5QkFBeUIsZ0JBQWdCLEdBQ3pDO1FBQ0EsSUFBSSxRQUFRLG9CQUFvQixPQUM5QixNQUFNLG9CQUFvQjtRQUM1QixLQUFLLE1BQU0sUUFBUSxNQUFNO1FBQ3pCLElBQUksb0JBQW9CLGtCQUN0QixpQkFBa0IsaUJBQWlCLE9BQ2hDLGlCQUFpQixlQUFlLEtBQUssSUFDcEMsS0FDQSxpQkFBaUIsTUFBTSxNQUN6QjthQUNDO1NBQ0gsSUFBSSxNQUFNLGlCQUFpQixpQkFBaUIsVUFDMUMsTUFBTyxPQUFPLElBQUksZUFBZ0I7U0FDcEMsSUFBSSxJQUFJLGNBQWM7VUFDcEIsSUFBSSxZQUFZLElBQUksYUFBYSxHQUMvQixTQUFTLGlCQUFpQixZQUFZLFFBQ3RDLGlCQUFpQixLQUFLLElBQ3BCLG9CQUFvQixPQUNwQixNQUNGLEdBQ0EsZUFDRSxLQUFLLE1BQU0sb0JBQW9CLE1BQzNCLGlCQUNBLEtBQUssSUFBSSxvQkFBb0IsS0FBSyxNQUFNO1VBQ2hELENBQUMsVUFBVSxVQUNULGlCQUFpQixpQkFDZixpQkFBaUIsY0FDbEIsZUFBZSxnQkFDZixpQkFBaUI7VUFDcEIsSUFBSSxjQUFjLDBCQUNkLGtCQUNBLGNBQ0YsR0FDQSxZQUFZLDBCQUNWLGtCQUNBLFlBQ0Y7VUFDRixJQUNFLGVBQ0EsY0FDQyxNQUFNLFVBQVUsY0FDZixVQUFVLGVBQWUsWUFBWSxRQUNyQyxVQUFVLGlCQUFpQixZQUFZLFVBQ3ZDLFVBQVUsY0FBYyxVQUFVLFFBQ2xDLFVBQVUsZ0JBQWdCLFVBQVUsU0FDdEM7V0FDQSxJQUFJLFFBQVEsSUFBSSxZQUFZO1dBQzVCLE1BQU0sU0FBUyxZQUFZLE1BQU0sWUFBWSxNQUFNO1dBQ25ELFVBQVUsZ0JBQWdCO1dBQzFCLGlCQUFpQixnQkFDWixVQUFVLFNBQVMsS0FBSyxHQUN6QixVQUFVLE9BQU8sVUFBVSxNQUFNLFVBQVUsTUFBTSxNQUNoRCxNQUFNLE9BQU8sVUFBVSxNQUFNLFVBQVUsTUFBTSxHQUM5QyxVQUFVLFNBQVMsS0FBSztVQUM5QjtTQUNGO1FBQ0Y7T0FDRjtPQUNBLE1BQU0sQ0FBQztPQUNQLEtBQ0UsWUFBWSxrQkFDWCxZQUFZLFVBQVUsYUFHdkIsTUFBTSxVQUFVLFlBQ2QsSUFBSSxLQUFLO1FBQ1AsU0FBUztRQUNULE1BQU0sVUFBVTtRQUNoQixLQUFLLFVBQVU7T0FDakIsQ0FBQztPQUNMLGVBQWUsT0FBTyxpQkFBaUIsU0FDckMsaUJBQWlCLE1BQU07T0FDekIsS0FDRSxtQkFBbUIsR0FDbkIsbUJBQW1CLElBQUksUUFDdkIsb0JBQ0E7UUFDQSxJQUFJLE9BQU8sSUFBSTtRQUNmLEtBQUssUUFBUSxhQUFhLEtBQUs7UUFDL0IsS0FBSyxRQUFRLFlBQVksS0FBSztPQUNoQztNQUNGO01BQ0EsV0FBVyxDQUFDLENBQUM7TUFDYix1QkFBdUIsZ0JBQWdCO0tBQ3pDLFVBQVU7TUFDUixtQkFBb0Isc0JBQ2pCLHdCQUF3QixJQUFJLGtCQUM1QixxQkFBcUIsSUFBSTtLQUM5QjtJQUNGO0lBQ0EsS0FBSyxVQUFVO0lBQ2YsdUJBQXVCO0dBQ3pCO0VBQ0Y7RUFDQSxTQUFTLHFCQUFxQjtHQUM1QixJQUFJLHlCQUF5QixzQkFBc0I7SUFDakQsdUJBQXVCO0lBQ3ZCLElBQUksZ0NBQ0Y7SUFDRixJQUFJLFNBQVMsK0JBQStCO0tBQzFDLGtCQUFrQixJQUFJO0tBQ3RCLElBQUksWUFBWSxlQUNkLFVBQVU7S0FDWixDQUFDLHNCQUNDLFdBQVcsY0FDVixnQkFDRyxjQUFjLElBQ1osUUFBUSxVQUFVLEtBQ2hCLFNBQ0EsK0JBQ0EsV0FDQSxTQUNBLGNBQ0EsbUJBQ0EsaUJBQ0YsQ0FDRixJQUNBLFFBQVEsVUFDTiwrQkFDQSxXQUNBLFNBQ0EsY0FDQSxtQkFDQSxpQkFDRjtJQUNSO0lBQ0EsZ0NBQWdDO0lBQ2hDLFlBQVk7SUFDWixVQUFVO0lBQ1YsSUFBSSxzQkFBc0IsT0FBTyxVQUFVLFFBQVE7SUFDbkQsSUFBSSxPQUFPLFVBQVUsZUFBZSxTQUFTLHFCQUFxQjtLQUNoRSxzQkFBc0IscUJBQXFCO0tBQzNDLHFCQUFxQixJQUFJO0tBQ3pCLElBQUksb0JBQW9CLHdCQUF3QjtLQUNoRCx3QkFBd0IsSUFBSTtLQUM1QixJQUFJLHdCQUF3QjtLQUM1QixvQkFBb0I7S0FDcEIsSUFBSTtNQUNGLGtCQUFtQixTQUNoQixpQkFBaUIsK0JBQ2xCLDJCQUEyQixHQUMzQiwwQkFDRSwrQkFDQSxVQUFVLFdBQ1YsU0FDRixHQUNDLGlCQUFpQixrQkFBa0I7S0FDeEMsVUFBVTtNQUNSLG1CQUFvQix1QkFDakIsd0JBQXdCLElBQUksbUJBQzVCLHFCQUFxQixJQUFJO0tBQzlCO0lBQ0Y7SUFDQSxnQ0FBZ0M7SUFDaEMsWUFBWTtJQUNaLGdCQUFnQixJQUFJO0lBQ3BCLGVBQ0UsU0FBUyxZQUFZLGdDQUFnQyxpQkFDckQsZUFDQSxjQUNBLCtCQUErQixnQ0FDL0Isd0JBQ0Y7SUFDQSx1QkFBdUI7R0FDekI7RUFDRjtFQUNBLFNBQVMsbUJBQW1CO0dBQzFCLElBQ0UseUJBQXlCLHdCQUN6Qix5QkFBeUIsOEJBQ3pCO0lBQ0EsSUFBSSx5QkFBeUIsc0JBQXNCO0tBQ2pELElBQUksK0JBQStCO0tBQ25DLGdCQUFnQixJQUFJO0tBQ3BCLElBQUksVUFBVSxlQUNaLHdCQUNFLCtCQUErQjtLQUNuQyxDQUFDLHNCQUNDLFdBQVcsaUNBQ1YsZ0JBQ0csY0FBYyxJQUNaLFFBQVEsVUFBVSxLQUNoQixTQUNBLHdCQUNJLGdDQUNBLHNCQUNKLDhCQUNBLFNBQ0EsY0FDQSxtQkFDQSx3QkFBd0IsVUFBVSxpQkFDcEMsQ0FDRixJQUNBLFFBQVEsVUFDTix3QkFDSSxnQ0FDQSxzQkFDSiw4QkFDQSxTQUNBLGNBQ0EsbUJBQ0Esd0JBQXdCLFdBQVcsaUJBQ3JDO0tBQ04sK0JBQStCLG1DQUM1Qiw2QkFBNkI7SUFDbEM7SUFDQSx1QkFBdUI7SUFDdkIsK0JBQStCO0lBQy9CLHdCQUF3QjtJQUN4QixhQUFhO0lBQ2IsVUFBVTtJQUNWLElBQUksZUFBZTtJQUNuQix3QkFBd0I7SUFDeEIsSUFBSSxvQkFBb0IsMEJBQ3RCLHNCQUNHLHdCQUF3QixlQUFlLHdCQUNwQyxRQUNBO0lBQ1IsQ0FBQyxxQkFDQyxNQUFNLGFBQWEsa0JBQ25CLE9BQU8sYUFBYSxlQUFlLHVCQUNuQyxPQUFPLGFBQWEsUUFBUSx1QkFDekIsdUJBQXVCLHlCQUN0Qix1QkFBdUIsb0JBQ3hCLHNCQUFzQixxQkFBcUIsTUFDNUMsdUJBQXVCLFNBQVMsUUFBUSxZQUFZLEdBQ25ELDJCQUEyQixHQUMzQiwrQkFBK0I7SUFDcEMsSUFBSSxpQkFBaUIsUUFBUTtJQUM3QixNQUFNLG1CQUFtQix5Q0FBeUM7SUFDbEUsc0JBQXNCLCtCQUErQixPQUFPO0lBQzVELGlCQUFpQixxQkFBcUIscUJBQXFCO0lBQzNELGVBQWUsYUFBYTtJQUM1QixJQUNFLGdCQUNBLGVBQWUsT0FBTyxhQUFhLG1CQUVuQyxJQUFJO0tBQ0YsSUFBSSxXQUFXLFNBQVMsYUFBYSxRQUFRLFFBQVE7S0FDckQsUUFBUSxnQkFBUjtNQUNFLEtBQUs7T0FDSCxJQUFJLG9CQUFvQjtPQUN4QjtNQUNGLEtBQUs7T0FDSCxvQkFBb0I7T0FDcEI7TUFDRixLQUFLO09BQ0gsb0JBQW9CO09BQ3BCO01BQ0YsS0FBSztPQUNILG9CQUFvQjtPQUNwQjtNQUNGLFNBQ0Usb0JBQW9CO0tBQ3hCO0tBQ0EsYUFBYSxrQkFDWCxZQUNBLGNBQ0EsbUJBQ0EsUUFDRjtJQUNGLFNBQVMsS0FBSztLQUNaLG1CQUNJLGlCQUFpQixDQUFDLEdBQ3BCLFFBQVEsTUFDTixrREFDQSxHQUNGO0lBQ0o7SUFDRixxQkFBcUIsUUFBUSxpQkFBaUIsTUFBTTtJQUNwRCxhQUFhO0lBQ2IsSUFBSSxTQUFTLG1CQUFtQjtLQUM5QixXQUFXLHFCQUFxQjtLQUNoQyxvQkFBb0Isd0JBQXdCO0tBQzVDLHdCQUF3QixJQUFJO0tBQzVCLHFCQUFxQixJQUFJO0tBQ3pCLElBQUk7TUFDRixJQUFJLHFCQUFxQixRQUFRO01BQ2pDLEtB
15852Q0UsZUFBZSxHQUNmLGVBQWUsa0JBQWtCLFFBQ2pDLGdCQUNBO09BQ0EsSUFBSSxtQkFBbUIsa0JBQWtCLGVBQ3ZDLFlBQVksY0FBYyxpQkFBaUIsS0FBSztPQUNsRCxrQkFDRSxpQkFBaUIsUUFDakIsb0JBQ0EsaUJBQWlCLE9BQ2pCLFNBQ0Y7TUFDRjtLQUNGLFVBQVU7TUFDUixxQkFBc0IsSUFBSSxVQUN2Qix3QkFBd0IsSUFBSTtLQUNqQztJQUNGO0lBQ0EscUJBQXFCO0lBQ3JCLG1CQUFtQjtJQUNuQix5QkFBeUI7SUFDekIsSUFDRSxTQUFTLHVCQUNQLDhCQUE4QixNQUNoQyxTQUFTLHFCQUFxQixtQkFBbUIsQ0FBQyxJQUNsRCxTQUFTLCtCQUVULEtBQ0UsWUFBWSxHQUNaLFlBQVksbUJBQW1CLFFBQy9CLGFBRUEscUJBQXNCLEdBQUcsbUJBQW1CLFdBQUEsQ0FDMUMsZ0JBQ0YsR0FDRSxLQUFLLE1BQU0scUJBQ1QsNkJBQTZCLFNBQVMsUUFDcEMsaUJBQ0Y7SUFDUixPQUFPLHNCQUFzQixNQUFNLG9CQUFvQjtJQUN2RCxzQkFBc0IsT0FBTztJQUM3QixpQkFBaUIsUUFBUTtJQUN6QixPQUFPLHdCQUF3QixXQUFXLE9BQU8saUJBQWlCLE9BQzVELHdCQUF3QixDQUFDLEdBQzNCLFlBQVksd0JBQ1IsdUJBQ0Usb0JBQW9CLEdBQUssd0JBQXdCLGFBQ3JELG9CQUFvQixHQUFLLHdCQUF3QjtJQUN2RCxzQkFDRSxlQUFlLHVCQUF1QixhQUFhO0lBQ3JELDhCQUE4QixHQUFHLENBQUMsQ0FBQztHQUNyQztFQUNGO0VBQ0EsU0FBUyxjQUFjLGdCQUFnQjtHQUNyQyxpQkFBaUIsRUFBa0IsZUFBZTtHQUNsRCxPQUFPLGVBQWUsZ0JBQWdCLFVBQVUsRUFDOUMsS0FBSyxXQUFZO0lBQ2YsUUFBUSxNQUNOLCtNQUNGO0dBQ0YsRUFDRixDQUFDO0dBQ0QsT0FBTztFQUNUO0VBQ0EsU0FBUyx1QkFBdUIsTUFBTSxnQkFBZ0I7R0FDcEQsT0FBTyxLQUFLLG9CQUFvQixvQkFDNUIsaUJBQWlCLEtBQUssYUFDeEIsUUFBUSxtQkFDSixLQUFLLGNBQWMsTUFBTyxhQUFhLGNBQWM7RUFDN0Q7RUFDQSxTQUFTLHNCQUFzQjtHQUM3QixTQUFTLDBCQUNOLHNCQUFzQixlQUFlLEdBQ3RDLDJDQUNJLHlDQUF5QyxDQUFDLEdBQzVDLFFBQVEsS0FDTixrUkFDRixJQUNELHdCQUF3QixNQUN4Qiw2QkFBNkI7R0FDaEMscUJBQXFCO0dBQ3JCLG1CQUFtQjtHQUNuQixpQkFBaUI7R0FDakIsT0FBTyxvQkFBb0I7RUFDN0I7RUFDQSxTQUFTLHNCQUFzQjtHQUM3QixJQUFJLHlCQUF5Qix1QkFBdUIsT0FBTyxDQUFDO0dBQzVELElBQUksT0FBTyxvQkFDVCxpQkFBaUI7R0FDbkIsK0JBQStCO0dBQy9CLElBQUksaUJBQWlCLHFCQUFxQixtQkFBbUIsR0FDM0QsV0FDRSxNQUFNLHdCQUF3Qix1QkFBdUIsaUJBQ2pELHVCQUNBO0dBQ1IsaUJBQWlCLHFCQUFxQjtHQUN0QyxJQUFJLG1CQUFtQix3QkFBd0I7R0FDL0MsSUFBSTtJQUNGLHdCQUF3QixJQUFJO0lBQzVCLHFCQUFxQixJQUFJO0lBQ3pCLElBQUksY0FBYztJQUNsQiw0QkFBNEI7SUFDNUIsV0FBVztJQUNYLElBQUksUUFBUTtJQUNaLHVCQUF1QjtJQUN2QixzQkFBc0IscUJBQXFCO0lBQzNDLHNCQUFzQjtJQUN0QixLQUFLLG9CQUFvQixnQkFBZ0Isb0JBQW9CLFdBQzNELE1BQU0sTUFBTSx1REFBdUQ7SUFDckUseUJBQXlCLEtBQUs7SUFDOUIsMkJBQTJCLENBQUM7SUFDNUIsd0NBQXdDLENBQUM7SUFDekMsSUFBSSx5QkFBeUI7SUFDN0IsZUFBZTtJQUNmLHlCQUF5QixNQUFNO0lBQy9CLElBQUksK0JBQStCLDBCQUNqQyxrQkFDRSxlQUNBLHdCQUNBLGFBQ0Y7U0FDRztLQUNILElBQUksWUFBWSxlQUNkLFVBQVUsd0JBQ1Ysb0JBQ0UsK0JBQStCO0tBQ25DLENBQUMsc0JBQ0MsV0FBVyxjQUNWLDJCQUNHLHlCQUF5QixJQUN2QixRQUFRLFVBQVUsS0FDaEIsU0FDQSxvQkFBb0Isc0JBQXNCLFdBQzFDLFdBQ0EsU0FDQSxjQUNBLG1CQUNBLGlCQUNGLENBQ0YsSUFDQSxRQUFRLFVBQ04sb0JBQW9CLHNCQUFzQixXQUMxQyxXQUNBLFNBQ0EsY0FDQSxtQkFDQSxpQkFDRjtJQUNSO0lBQ0EsWUFBWTtJQUNaLG9CQUFvQjtJQUNwQixJQUFJLGVBQWUsU0FBUztJQUM1QiwyQkFBMkI7SUFDM0IsNEJBQTRCLFlBQVk7SUFDeEMsSUFBSSx3QkFBd0IsU0FBUztJQUNyQyxlQUFlO0lBQ2YsMkJBQTJCO0lBQzNCLDBCQUNFLFVBQ0EsdUJBQ0EsT0FDQSxhQUNBLFlBQ0Y7SUFDQSwrQkFBK0IsUUFBUTtJQUN2QyxtQkFBbUI7SUFDbkIsSUFBSSx3QkFBd0IsTUFBTTtJQUNsQyx3QkFBd0I7SUFDeEIsZUFBZTtJQUNmLFNBQVMsZUFDTCxpQkFDRSx1QkFDQSx1QkFDQSxjQUNBLENBQUMsR0FDRCxZQUNGLElBQ0EsQ0FBQyxzQkFDRCx5QkFBeUIsMEJBQ3hCLGVBQ0csYUFBYSxJQUNYLFFBQVEsVUFBVSxLQUNoQixTQUNBLHFCQUNBLHVCQUNBLHVCQUNBLGNBQ0EsbUJBQ0EsZ0JBQ0YsQ0FDRixJQUNBLFFBQVEsVUFDTixxQkFDQSx1QkFDQSx1QkFDQSxjQUNBLG1CQUNBLGdCQUNGO0lBQ1IsZUFBZSxPQUFPLHFCQUFxQjtJQUMzQyw4QkFBOEIsR0FBRyxDQUFDLENBQUM7SUFDbkMsd0NBQ0ksYUFBYSwrQkFDWCw4QkFDRSwyQkFBMkIsR0FDNUIsK0JBQStCLFlBQ2pDLDJCQUEyQjtJQUNoQyx3Q0FBd0MsMkJBQTJCLENBQUM7SUFDcEUsSUFDRSxnQkFDQSxlQUFlLE9BQU8sYUFBYSx1QkFFbkMsSUFBSTtLQUNGLGFBQWEsc0JBQXNCLFlBQVksUUFBUTtJQUN6RCxTQUFTLEtBQUs7S0FDWixtQkFDSSxpQkFBaUIsQ0FBQyxHQUNwQixRQUFRLE1BQ04sa0RBQ0EsR0FDRjtJQUNKO0lBQ0YsSUFBSSxZQUFZLFNBQVMsUUFBUTtJQUNqQyxVQUFVLGlCQUFpQjtJQUMzQixVQUFVLHdCQUF3QjtJQUNsQyxPQUFPLENBQUM7R0FDVixVQUFVO0lBQ1Isd0JBQXlCLElBQUksa0JBQzFCLHFCQUFxQixJQUFJLGdCQUMxQix1QkFBdUIsTUFBTSxjQUFjO0dBQy9DO0VBQ0Y7RUFDQSxTQUFTLDhCQUE4QixXQUFXLGFBQWEsT0FBTztHQUNwRSxjQUFjLDJCQUEyQixPQUFPLFdBQVc7R0FDM0Qsa0JBQWtCLFdBQVc7R0FDN0IsY0FBYyxzQkFBc0IsVUFBVSxXQUFXLGFBQWEsQ0FBQztHQUN2RSxZQUFZLGNBQWMsV0FBVyxhQUFhLENBQUM7R0FDbkQsU0FBUyxjQUNOLGtCQUFrQixXQUFXLENBQUMsR0FBRyxzQkFBc0IsU0FBUztFQUNyRTtFQUNBLFNBQVMsd0JBQ1AsYUFDQSx3QkFDQSxPQUNBO0dBQ0EsMkJBQTJCLENBQUM7R0FDNUIsSUFBSSxNQUFNLFlBQVksS0FDcEIsOEJBQThCLGFBQWEsYUFBYSxLQUFLO1FBQzFEO0lBQ0gsT0FBTyxTQUFTLHlCQUEwQjtLQUN4QyxJQUFJLE1BQU0sdUJBQXVCLEtBQUs7TUFDcEMsOEJBQ0Usd0JBQ0EsYUFDQSxLQUNGO01BQ0E7S0FDRjtLQUNBLElBQUksTUFBTSx1QkFBdUIsS0FBSztNQUNwQyxJQUFJLFdBQVcsdUJBQXVCO01BQ3RDLElBQ0UsZUFDRSxPQUFPLHVCQUF1QixLQUFLLDRCQUNwQyxlQUFlLE9BQU8sU0FBUyxzQkFDN0IsU0FBUywwQ0FDUixDQUFDLHVDQUF1QyxJQUFJLFFBQVEsSUFDeEQ7T0FDQSxjQUFjLDJCQUEyQixPQUFPLFdBQVc7T0FDM0Qsa0JBQWtCLFdBQVc7T0FDN0IsUUFBUSx1QkFBdUIsQ0FBQztPQUNoQyxXQUFXLGNBQWMsd0JBQXdCLE9BQU8sQ0FBQztPQUN6RCxTQUFTLGFBQ04sMkJBQ0MsT0FDQSxVQUNBLHdCQUNBLF
15852dBQ0YsR0FDQSxrQkFBa0IsVUFBVSxDQUFDLEdBQzdCLHNCQUFzQixRQUFRO09BQ2hDO01BQ0Y7S0FDRjtLQUNBLHlCQUF5Qix1QkFBdUI7SUFDbEQ7SUFDQSxRQUFRLE1BQ04sMlJBQ0EsS0FDRjtHQUNGO0VBQ0Y7RUFDQSxTQUFTLG1CQUFtQixNQUFNLFVBQVUsT0FBTztHQUNqRCxJQUFJLFlBQVksS0FBSztHQUNyQixJQUFJLFNBQVMsV0FBVztJQUN0QixZQUFZLEtBQUssWUFBWSxJQUFJLGdCQUFnQjtJQUNqRCxJQUFJLDRCQUFZLElBQUksSUFBSTtJQUN4QixVQUFVLElBQUksVUFBVSxTQUFTO0dBQ25DLE9BQ0UsWUFBYSxVQUFVLElBQUksUUFBUSxHQUNqQyxLQUFLLE1BQU0sY0FDUCw0QkFBWSxJQUFJLElBQUksR0FBSSxVQUFVLElBQUksVUFBVSxTQUFTO0dBQ2pFLFVBQVUsSUFBSSxLQUFLLE1BQ2YsMENBQTBDLENBQUMsR0FDN0MsVUFBVSxJQUFJLEtBQUssR0FDbEIsWUFBWSxrQkFBa0IsS0FBSyxNQUFNLE1BQU0sVUFBVSxLQUFLLEdBQy9ELHFCQUFxQix1QkFBdUIsTUFBTSxLQUFLLEdBQ3ZELFNBQVMsS0FBSyxXQUFXLFNBQVM7RUFDdEM7RUFDQSxTQUFTLGtCQUFrQixNQUFNLFVBQVUsYUFBYTtHQUN0RCxJQUFJLFlBQVksS0FBSztHQUNyQixTQUFTLGFBQWEsVUFBVSxPQUFPLFFBQVE7R0FDL0MsS0FBSyxlQUFlLEtBQUssaUJBQWlCO0dBQzFDLEtBQUssYUFBYSxDQUFDO0dBQ25CLE9BQU8sY0FBYyxPQUNqQixJQUFJLHVCQUNGLG9CQUFvQixxQkFBcUIsSUFBSSxHQUM5QyxxQkFBcUIsV0FBVyxrQkFBa0IsR0FDbEQscUJBQXFCLGlCQUN0QixPQUFPLGNBQWMsWUFDckIsSUFBSSx5QkFDRixzQkFBc0IsdUJBQXVCLElBQUksR0FDbEQsdUJBQXVCLFdBQVcsa0JBQWtCLEdBQ3BELHVCQUF1QjtHQUM1QiwyQkFBMkIsS0FDekIsU0FBUyxxQkFBcUIsWUFDOUIsUUFBUSxNQUNOLHlaQUNGO0dBQ0YsdUJBQXVCLFNBQ3BCLGdDQUFnQyxpQkFBaUIsZ0JBQ2pELGlDQUFpQywwQkFDakMsaUNBQWlDLGtCQUMvQixnQ0FBZ0MsY0FDL0IsaUNBQ0YsTUFBTSxJQUFJLCtCQUErQix3QkFDdEMsbUJBQW1CLG1CQUFtQixZQUNyQyxrQkFBa0IsTUFBTSxDQUFDLElBQ3hCLGlDQUFpQyxjQUNuQyxpQ0FBaUMsYUFDdEMsc0NBQXNDLGtDQUNuQyxvQ0FBb0M7R0FDekMsc0JBQXNCLElBQUk7RUFDNUI7RUFDQSxTQUFTLHNCQUFzQixlQUFlLFdBQVc7R0FDdkQsTUFBTSxjQUFjLFlBQVksbUJBQW1CO0dBQ25ELGdCQUFnQiwrQkFBK0IsZUFBZSxTQUFTO0dBQ3ZFLFNBQVMsa0JBQ04sa0JBQWtCLGVBQWUsU0FBUyxHQUMzQyxzQkFBc0IsYUFBYTtFQUN2QztFQUNBLFNBQVMsZ0NBQWdDLGVBQWU7R0FDdEQsSUFBSSxnQkFBZ0IsY0FBYyxlQUNoQyxZQUFZO0dBQ2QsU0FBUyxrQkFBa0IsWUFBWSxjQUFjO0dBQ3JELHNCQUFzQixlQUFlLFNBQVM7RUFDaEQ7RUFDQSxTQUFTLHFCQUFxQixlQUFlLFVBQVU7R0FDckQsSUFBSSxZQUFZO0dBQ2hCLFFBQVEsY0FBYyxLQUF0QjtJQUNFLEtBQUs7SUFDTCxLQUFLO0tBQ0gsSUFBSSxhQUFhLGNBQWM7S0FDL0IsSUFBSSxnQkFBZ0IsY0FBYztLQUNsQyxTQUFTLGtCQUFrQixZQUFZLGNBQWM7S0FDckQ7SUFDRixLQUFLO0tBQ0gsYUFBYSxjQUFjO0tBQzNCO0lBQ0YsS0FBSztLQUNILGFBQWEsY0FBYyxVQUFVO0tBQ3JDO0lBQ0YsU0FDRSxNQUFNLE1BQ0oseUVBQ0Y7R0FDSjtHQUNBLFNBQVMsY0FBYyxXQUFXLE9BQU8sUUFBUTtHQUNqRCxzQkFBc0IsZUFBZSxTQUFTO0VBQ2hEO0VBQ0EsU0FBUywrQ0FDUCxlQUNBLGFBQ0EsZ0JBQ0E7R0FDQSxJQUFJLE9BQU8sWUFBWSxlQUFlLFlBQ3BDLEtBQUssY0FBYyxZQUFZLE9BQU8sU0FBUyxjQUFlO0lBQzVELElBQUksT0FBTyxlQUNULFFBQVEsYUFDUixvQkFBb0IsTUFBTSxTQUFTO0lBQ3JDLG9CQUFvQixrQkFBa0I7SUFDdEMsT0FBTyxNQUFNLE1BQ1QsTUFBTSxRQUFRLFlBQ1oscUJBQ0Esa0JBQ0UsT0FDQSw0QkFDQSxNQUNBLEtBQ0YsSUFDQSwrQ0FDRSxNQUNBLE9BQ0EsaUJBQ0YsSUFDRixTQUFTLE1BQU0sa0JBQ2QscUJBQXFCLE1BQU0sUUFBUSxZQUNoQyxrQkFDRSxPQUNBLDRCQUNBLE1BQ0EsS0FDRixJQUNBLE1BQU0sZUFBZSxhQUNyQixrQkFDRSxPQUNBLGdEQUNBLE1BQ0EsT0FDQSxpQkFDRjtJQUNSLGNBQWMsWUFBWTtHQUM1QjtFQUNKO0VBQ0EsU0FBUywyQkFBMkIsTUFBTSxPQUFPO0dBQy9DLDJCQUEyQixDQUFDLENBQUM7R0FDN0IsSUFBSTtJQUNGLHVCQUF1QixPQUFPLDRCQUE0QixHQUN4RCx3QkFBd0IsS0FBSyxHQUM3QixzQkFDRSxNQUNBLE1BQU0sV0FDTixPQUNBLDRCQUNGLEdBQ0Esd0JBQXdCLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7R0FDdkQsVUFBVTtJQUNSLDJCQUEyQixDQUFDLENBQUM7R0FDL0I7RUFDRjtFQUNBLFNBQVMsK0JBQStCLE1BQU07R0FDNUMsSUFBSSxzQkFBc0IsQ0FBQztHQUMzQixLQUFLLFFBQVEsUUFBUSxtQkFBbUIsdUJBQ3JDLHNCQUFzQixDQUFDO0dBQzFCLCtDQUNFLE1BQ0EsS0FBSyxTQUNMLG1CQUNGO0VBQ0Y7RUFDQSxTQUFTLHlDQUF5QyxPQUFPO0dBQ3ZELEtBQUssbUJBQW1CLG1CQUFtQixXQUFXO0lBQ3BELElBQUksTUFBTSxNQUFNO0lBQ2hCLElBQ0UsTUFBTSxPQUNOLE1BQU0sT0FDTixNQUFNLE9BQ04sT0FBTyxPQUNQLE9BQU8sT0FDUCxPQUFPLEtBQ1A7S0FDQSxNQUFNLDBCQUEwQixLQUFLLEtBQUs7S0FDMUMsSUFBSSxTQUFTLDZDQUE2QztNQUN4RCxJQUFJLDRDQUE0QyxJQUFJLEdBQUcsR0FBRztNQUMxRCw0Q0FBNEMsSUFBSSxHQUFHO0tBQ3JELE9BQU8sOERBQThDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQztLQUNsRSxrQkFBa0IsT0FBTyxXQUFZO01BQ25DLFFBQVEsTUFDTix1T0FDRjtLQUNGLENBQUM7SUFDSDtHQUNGO0VBQ0Y7RUFDQSxTQUFTLHVCQUF1QixNQUFNLE9BQU87R0FDM0MscUJBQ0UsS0FBSyxpQkFBaUIsUUFBUSxTQUFVLGlCQUFpQjtJQUN2RCxtQkFBbUIsTUFBTSxpQkFBaUIsS0FBSztHQUNqRCxDQUFDO0VBQ0w7RUFDQSxTQUFTLG1CQUFtQixlQUFlLFVBQVU7R0FDbkQsSUFBSSxXQUFXLHFCQUFxQjtHQUNwQyxPQUFPLFNBQVMsWUFDWCxTQUFTLEtBQUssUUFBUSxHQUFHLHlCQUMxQixtQkFBbUIsZUFBZSxRQUFRO0VBQ2hEO0VBQ0EsU0FBUyxrQ0FBa0MsT0FBTztHQUNoRCwyQkFBMkIsS0FDekIsU0FBUyxxQkFBcUIsWUFDOUIsa0JBQWtCLE9BQU8sV0FBWTtJQUNuQyxRQUFRLE1BQ04seVhBQ0EsMEJBQTBCLEtBQUssQ0FDakM7R0FDRixDQUFDO0VBQ0w7RUFDQSxTQUFTLHNCQUFzQixNQUFNO0dBQ25DLFNBQVMscUJBQ1AsU0FBUyxLQUFLLFNBQ2IsU0FBUyxvQkFDTCxxQkFBcUIsb0JBQW9CLE9BQ3pDLG9CQUFvQixrQkFBa0IsT0FBTztHQUNwRCwyQkFBMkIsQ0FBQztHQUM1QixTQUFTLHFCQUFxQixXQUMxQiw2QkFDRSwyQkFBMkIsQ0FBQyxHQUFJLGtDQUFrQyxLQUNwRSx5QkFDRSx1QkFBdUIsQ0FBQyxHQUFJLGtDQUFrQztFQUN0RTtFQUNBLFNBQVMsOEJBQThCLHFCQUFxQixZQUFZO0dBQ3RFLElBQUksQ0FBQyxrQkFBa0IsMEJBQTBCO0lBQy9DLGlCQUFpQixDQUFDO0lBQ2xCLEdBQUc7S0FDRCxJQUFJLHFCQUFxQixDQUFDO0tBQzFCLEtBQUssSUFBSSxPQUFPLG9CQUFvQixTQUFTLE9BQVE7TUFDbkQsSUFBSSxDQUFDLFlBQ0gsSUFBSSxNQUFNLHFCQUFxQjtPQUM3QixJQUFJLGVBQWUsS0FBSztPQUN4QixJQUFJLE1BQU0sY0FBYyxJQUFJLFlBQVk7WUFDbkM7UUFDSCxJQUFJLGl
15852CQUFpQixLQUFLLGdCQUN4QixjQUFjLEtBQUs7UUFDckIsYUFDRyxLQUFNLEtBQUssTUFBTSxLQUFLLG1CQUFtQixJQUFJLEtBQU07UUFDdEQsYUFBYSxlQUFlLEVBQUUsaUJBQWlCLENBQUM7UUFDaEQsWUFDRSxZQUFZLFlBQ1AsWUFBWSxZQUFhLElBQzFCLFlBQ0UsWUFBWSxJQUNaO09BQ1Y7T0FDQSxNQUFNLGNBQ0YscUJBQXFCLENBQUMsR0FDeEIsc0JBQXNCLE1BQU0sU0FBUztNQUN6QyxPQUNFLFlBQWEsK0JBQ1YsWUFBWSxhQUNYLE1BQ0EsU0FBUyxxQkFBcUIsWUFBWSxHQUMxQyxTQUFTLEtBQUssdUJBQ1osS0FBSyxrQkFBa0IsU0FDM0IsR0FDQSxPQUFPLFlBQVksTUFDakIsMEJBQTBCLE1BQU0sU0FBUyxNQUN2QyxxQkFBcUIsQ0FBQyxHQUN4QixzQkFBc0IsTUFBTSxTQUFTO01BQzdDLE9BQU8sS0FBSztLQUNkO0lBQ0YsU0FBUztJQUNULGlCQUFpQixDQUFDO0dBQ3BCO0VBQ0Y7RUFDQSxTQUFTLHFDQUFxQztHQUM1QyxpQkFBaUIsT0FBTztHQUN4QiwrQkFBK0I7RUFDakM7RUFDQSxTQUFTLGlDQUFpQztHQUN4QywyQkFDRSwyQkFDQSx1QkFDRSxDQUFDO0dBQ0wsSUFBSSxzQkFBc0I7R0FDMUIsTUFBTSw4QkFDSiw2QkFBNkIsTUFDNUIsc0JBQXNCO0dBQ3pCLEtBQ0UsSUFBSSxjQUFjLE1BQU0sR0FBRyxPQUFPLE1BQU0sT0FBTyxvQkFDL0MsU0FBUyxPQUVUO0lBQ0EsSUFBSSxPQUFPLEtBQUssTUFDZCxZQUFZLG1DQUFtQyxNQUFNLFdBQVc7SUFDbEUsSUFBSSxNQUFNLFdBQ1IsS0FBTSxPQUFPLE1BQ1gsU0FBUyxPQUFRLHFCQUFxQixPQUFTLEtBQUssT0FBTyxNQUMzRCxTQUFTLFNBQVMsb0JBQW9CO1NBQ3JDLElBQ0QsT0FBTyxNQUFPLE1BQU0sdUJBQXVCLE9BQU8sWUFBWSxJQUVoRSwyQkFBMkIsQ0FBQztJQUM5QixPQUFPO0dBQ1Q7R0FDQSx5QkFBMEIsc0JBQ3hCLHlCQUF5Qix5QkFDekIsOEJBQThCLHFCQUFxQixDQUFDLENBQUM7R0FDdkQsTUFBTSwrQkFBK0IsNkJBQTZCO0VBQ3BFO0VBQ0EsU0FBUyxtQ0FBbUMsTUFBTSxhQUFhO0dBQzdELEtBQ0UsSUFBSSxpQkFBaUIsS0FBSyxnQkFDeEIsY0FBYyxLQUFLLGFBQ25CLGtCQUFrQixLQUFLLGlCQUN2QixRQUFRLEtBQUssZUFBZSxXQUM5QixJQUFJLFFBRUo7SUFDQSxJQUFJLFFBQVEsS0FBSyxNQUFNLEtBQUssR0FDMUIsT0FBTyxLQUFLLE9BQ1osaUJBQWlCLGdCQUFnQjtJQUNuQyxJQUFJLE9BQU8sZ0JBQ0w7U0FBQSxPQUFPLE9BQU8sbUJBQW1CLE9BQU8sT0FBTyxjQUNqRCxnQkFBZ0IsU0FBUyxzQkFBc0IsTUFBTSxXQUFXO0lBQUEsT0FDN0Qsa0JBQWtCLGdCQUFnQixLQUFLLGdCQUFnQjtJQUM5RCxTQUFTLENBQUM7R0FDWjtHQUNBLGNBQWM7R0FDZCxpQkFBaUI7R0FDakIsaUJBQWlCLGFBQ2YsTUFDQSxTQUFTLGNBQWMsaUJBQWlCLEdBQ3hDLFNBQVMsS0FBSyx1QkFBdUIsS0FBSyxrQkFBa0IsU0FDOUQ7R0FDQSxjQUFjLEtBQUs7R0FDbkIsSUFDRSxNQUFNLGtCQUNMLFNBQVMsZ0JBQ1Asa0NBQWtDLG1CQUNqQyxrQ0FBa0Msc0JBQ3RDLFNBQVMsS0FBSyxxQkFFZCxPQUNFLFNBQVMsZUFBZSxlQUFlLFdBQVcsR0FDakQsS0FBSyxlQUFlLE1BQ3BCLEtBQUssbUJBQW1CO0dBRTdCLElBQ0UsT0FBTyxpQkFBaUIsTUFDeEIsMEJBQTBCLE1BQU0sY0FBYyxHQUM5QztJQUNBLGNBQWMsaUJBQWlCLENBQUM7SUFDaEMsSUFDRSxnQkFBZ0IsS0FBSyxvQkFDcEIsU0FBUyxxQkFBcUIsWUFDN0IsZ0JBQWdCLHFCQUVsQixlQUFlLFdBQVc7U0FDdkIsT0FBTztJQUNaLFFBQVEscUJBQXFCLGNBQWMsR0FBM0M7S0FDRSxLQUFLO0tBQ0wsS0FBSztNQUNILGlCQUFpQjtNQUNqQjtLQUNGLEtBQUs7TUFDSCxpQkFBaUI7TUFDakI7S0FDRixLQUFLO01BQ0gsaUJBQWlCO01BQ2pCO0tBQ0YsU0FDRSxpQkFBaUI7SUFDckI7SUFDQSxjQUFjLGtDQUFrQyxLQUFLLE1BQU0sSUFBSTtJQUMvRCxTQUFTLHFCQUFxQixZQUN6QixxQkFBcUIsU0FBUyxLQUFLLFdBQVcsR0FDOUMsaUJBQWlCLHVCQUNqQixpQkFBaUIsbUJBQW1CLGdCQUFnQixXQUFXO0lBQ3BFLEtBQUssbUJBQW1CO0lBQ3hCLEtBQUssZUFBZTtJQUNwQixPQUFPO0dBQ1Q7R0FDQSxTQUFTLGVBQWUsZUFBZSxXQUFXO0dBQ2xELEtBQUssbUJBQW1CO0dBQ3hCLEtBQUssZUFBZTtHQUNwQixPQUFPO0VBQ1Q7RUFDQSxTQUFTLGtDQUFrQyxNQUFNLFlBQVk7R0FDM0Qsd0JBQXdCLHdCQUF3QixDQUFDO0dBQ2pELGlCQUFpQixPQUFPO0dBQ3hCLElBQ0UseUJBQXlCLHNCQUN6Qix5QkFBeUIsdUJBRXpCLE9BQVEsS0FBSyxlQUFlLE1BQVEsS0FBSyxtQkFBbUIsR0FBSTtHQUNsRSxJQUFJLHVCQUF1QixLQUFLO0dBQ2hDLCtCQUErQixxQkFDNUIsNkJBQTZCO0dBQ2hDLElBQUksb0JBQW9CLEtBQUssS0FBSyxpQkFBaUIsc0JBQ2pELE9BQU87R0FDVCxJQUFJLHlDQUNGO0dBQ0YseUNBQXlDLGFBQ3ZDLE1BQ0EsU0FBUyxxQkFDTCx5Q0FDQSxHQUNKLFNBQVMsS0FBSyx1QkFBdUIsS0FBSyxrQkFBa0IsU0FDOUQ7R0FDQSxJQUFJLE1BQU0sd0NBQXdDLE9BQU87R0FDekQsa0JBQ0UsTUFDQSx3Q0FDQSxVQUNGO0dBQ0EsbUNBQW1DLE1BQU0sTUFBTSxDQUFDO0dBQ2hELE9BQU8sUUFBUSxLQUFLLGdCQUNsQixLQUFLLGlCQUFpQix1QkFDcEIsa0NBQWtDLEtBQUssTUFBTSxJQUFJLElBQ2pEO0VBQ047RUFDQSxTQUFTLHNCQUFzQixNQUFNLE9BQU87R0FDMUMsSUFBSSxvQkFBb0IsR0FBRyxPQUFPO0dBQ2xDLHdCQUF3QjtHQUN4Qix3QkFBd0IsQ0FBQztHQUN6QixrQkFBa0IsTUFBTSxPQUFPLENBQUMsQ0FBQztFQUNuQztFQUNBLFNBQVMsZUFBZSxjQUFjO0dBQ3BDLGlCQUFpQix1QkFDZixTQUFTLGdCQUNULGlCQUFpQixZQUFZO0VBQ2pDO0VBQ0EsU0FBUyxvQ0FBb0M7R0FDM0MsU0FBUyxxQkFBcUIsWUFDNUIscUJBQXFCLFNBQVMsS0FBSyxXQUFZO0lBQzdDLCtCQUErQjtJQUMvQixPQUFPO0dBQ1QsQ0FBQztHQUNILGtCQUFrQixXQUFZO0lBQzVCLENBQUMsb0JBQW9CLGdCQUFnQixvQkFBb0IsWUFDckQsbUJBQ0UsbUJBQ0Esa0NBQ0YsSUFDQSwrQkFBK0I7R0FDckMsQ0FBQztFQUNIO0VBQ0EsU0FBUyx3QkFBd0I7R0FDL0IsSUFBSSxNQUFNLDRCQUE0QjtJQUNwQyxJQUFJLGtCQUFrQjtJQUN0QixNQUFNLG9CQUNGLGtCQU
15852FrQiwwQkFDbkIsNkJBQTZCLEdBQzlCLE9BQU8sMkJBQTJCLFlBQy9CLDJCQUEyQjtJQUNoQyw2QkFBNkI7R0FDL0I7R0FDQSxPQUFPO0VBQ1Q7RUFDQSxTQUFTLHFCQUFxQixZQUFZO0dBQ3hDLElBQ0UsUUFBUSxjQUNSLGFBQWEsT0FBTyxjQUNwQixjQUFjLE9BQU8sWUFFckIsT0FBTztHQUNULElBQUksZUFBZSxPQUFPLFlBQVksT0FBTztHQUM3Qyw2QkFBNkIsWUFBWSxRQUFRO0dBQ2pELE9BQU8sWUFBWSxVQUFVO0VBQy9CO0VBQ0EsU0FBUyxnQkFDUCxlQUNBLGNBQ0EsaUJBQ0EsYUFDQSxtQkFDQTtHQUNBLElBQ0UsYUFBYSxnQkFDYixtQkFDQSxnQkFBZ0IsY0FBYyxtQkFDOUI7SUFDQSxJQUFJLFNBQVMsc0JBQ1Isa0JBQWtCLHFCQUFxQixLQUFBLENBQU0sTUFDaEQsR0FDQSxZQUFZLFlBQVk7SUFDMUIsY0FDSSxnQkFBZ0IsZUFBZSxVQUFVLHFCQUFxQixRQUM1RCxxQkFBcUIsYUFBYSxVQUFVLElBQzVDLFVBQVUsYUFBYSxZQUFZLEdBQ3ZDLFNBQVMsaUJBQ0wsU0FBUyxjQUFnQixZQUFZO0lBQzNDLElBQUksUUFBUSxJQUFJLGVBQ2QsVUFDQSxVQUNBLE1BQ0EsYUFDQSxpQkFDRjtJQUNBLGNBQWMsS0FBSztLQUNWO0tBQ1AsV0FBVyxDQUNUO01BQ0UsVUFBVTtNQUNWLFVBQVUsV0FBWTtPQUNwQixJQUFJLFlBQVksa0JBQ1Y7WUFBQSxNQUFNLDRCQUE0QjtTQUNwQyxJQUFJLFdBQVcsSUFBSSxTQUFTLG1CQUFtQixTQUFTLEdBQ3RELGVBQWU7VUFDYixTQUFTLENBQUM7VUFDVixNQUFNO1VBQ04sUUFBUSxrQkFBa0I7VUFDbEI7U0FDVjtTQUNGLE9BQU8sT0FBTyxZQUFZO1NBQzFCLG9CQUNFLGlCQUNBLGNBQ0EsTUFDQSxRQUNGO1FBQ0Y7Y0FFQSxlQUFlLE9BQU8sV0FDbkIsTUFBTSxlQUFlLEdBQ3JCLFdBQVcsSUFBSSxTQUFTLG1CQUFtQixTQUFTLEdBQ3BELGVBQWU7UUFDZCxTQUFTLENBQUM7UUFDVixNQUFNO1FBQ04sUUFBUSxrQkFBa0I7UUFDbEI7T0FDVixHQUNBLE9BQU8sT0FBTyxZQUFZLEdBQzFCLG9CQUNFLGlCQUNBLGNBQ0EsUUFDQSxRQUNGO01BQ047TUFDQSxlQUFlO0tBQ2pCLENBQ0Y7SUFDRixDQUFDO0dBQ0g7RUFDRjtFQUNBLFNBQVMsZ0JBQWdCLE9BQU8sVUFBVSxlQUFlO0dBQ3ZELE1BQU0sZ0JBQWdCO0dBQ3RCLElBQUk7SUFDRixTQUFTLEtBQUs7R0FDaEIsU0FBUyxPQUFPO0lBQ2Qsa0JBQWtCLEtBQUs7R0FDekI7R0FDQSxNQUFNLGdCQUFnQjtFQUN4QjtFQUNBLFNBQVMscUJBQXFCLGVBQWUsa0JBQWtCO0dBQzdELG1CQUFtQixPQUFPLG1CQUFtQjtHQUM3QyxLQUFLLElBQUksSUFBSSxHQUFHLElBQUksY0FBYyxRQUFRLEtBQUs7SUFDN0MsSUFBSSxtQkFBbUIsY0FBYztJQUNyQyxHQUFHO0tBQ0QsSUFBSSxtQkFBbUIsS0FBSyxHQUMxQixRQUFRLGlCQUFpQjtLQUMzQixtQkFBbUIsaUJBQWlCO0tBQ3BDLElBQUksa0JBQ0YsS0FDRSxJQUFJLGFBQWEsaUJBQWlCLFNBQVMsR0FDM0MsS0FBSyxZQUNMLGNBQ0E7TUFDQSxJQUFJLHVCQUF1QixpQkFBaUIsYUFDMUMsV0FBVyxxQkFBcUIsVUFDaEMsZ0JBQWdCLHFCQUFxQjtNQUN2Qyx1QkFBdUIscUJBQXFCO01BQzVDLElBQUksYUFBYSxvQkFBb0IsTUFBTSxxQkFBcUIsR0FDOUQsTUFBTTtNQUNSLFNBQVMsV0FDTCxrQkFDRSxVQUNBLGlCQUNBLE9BQ0Esc0JBQ0EsYUFDRixJQUNBLGdCQUFnQixPQUFPLHNCQUFzQixhQUFhO01BQzlELG1CQUFtQjtLQUNyQjtVQUVBLEtBQ0UsYUFBYSxHQUNiLGFBQWEsaUJBQWlCLFFBQzlCLGNBQ0E7TUFDQSx1QkFBdUIsaUJBQWlCO01BQ3hDLFdBQVcscUJBQXFCO01BQ2hDLGdCQUFnQixxQkFBcUI7TUFDckMsdUJBQXVCLHFCQUFxQjtNQUM1QyxJQUFJLGFBQWEsb0JBQW9CLE1BQU0scUJBQXFCLEdBQzlELE1BQU07TUFDUixTQUFTLFdBQ0wsa0JBQ0UsVUFDQSxpQkFDQSxPQUNBLHNCQUNBLGFBQ0YsSUFDQSxnQkFBZ0IsT0FBTyxzQkFBc0IsYUFBYTtNQUM5RCxtQkFBbUI7S0FDckI7SUFDSjtHQUNGO0VBQ0Y7RUFDQSxTQUFTLDBCQUEwQixjQUFjLGVBQWU7R0FDOUQsbUJBQW1CLElBQUksWUFBWSxLQUNqQyxRQUFRLE1BQ04sK0dBQ0EsWUFDRjtHQUNGLElBQUksY0FBYyxjQUFjO0dBQ2hDLEtBQUssTUFBTSxnQkFDUixjQUFjLGNBQWMsNENBQTRCLElBQUksSUFBSTtHQUNuRSxJQUFJLGlCQUFpQixlQUFlO0dBQ3BDLFlBQVksSUFBSSxjQUFjLE1BQzNCLHdCQUF3QixlQUFlLGNBQWMsR0FBRyxDQUFDLENBQUMsR0FDM0QsWUFBWSxJQUFJLGNBQWM7RUFDbEM7RUFDQSxTQUFTLG9CQUFvQixjQUFjLHdCQUF3QixRQUFRO0dBQ3pFLG1CQUFtQixJQUFJLFlBQVksS0FDakMsQ0FBQywwQkFDRCxRQUFRLE1BQ04sNkhBQ0EsWUFDRjtHQUNGLElBQUksbUJBQW1CO0dBQ3ZCLDJCQUEyQixvQkFBb0I7R0FDL0Msd0JBQ0UsUUFDQSxjQUNBLGtCQUNBLHNCQUNGO0VBQ0Y7RUFDQSxTQUFTLDJCQUEyQixzQkFBc0I7R0FDeEQsSUFBSSxDQUFDLHFCQUFxQixrQkFBa0I7SUFDMUMscUJBQXFCLG1CQUFtQixDQUFDO0lBQ3pDLGdCQUFnQixRQUFRLFNBQVUsY0FBYztLQUM5QyxzQkFBc0IsaUJBQ25CLG1CQUFtQixJQUFJLFlBQVksS0FDbEMsb0JBQW9CLGNBQWMsQ0FBQyxHQUFHLG9CQUFvQixHQUM1RCxvQkFBb0IsY0FBYyxDQUFDLEdBQUcsb0JBQW9CO0lBQzlELENBQUM7SUFDRCxJQUFJLGdCQUNGLE1BQU0scUJBQXFCLFdBQ3ZCLHVCQUNBLHFCQUFxQjtJQUMzQixTQUFTLGlCQUNQLGNBQWMscUJBQ1osY0FBYyxtQkFBbUIsQ0FBQyxHQUNwQyxvQkFBb0IsbUJBQW1CLENBQUMsR0FBRyxhQUFhO0dBQzVEO0VBQ0Y7RUFDQSxTQUFTLHdCQUNQLGlCQUNBLGNBQ0Esa0JBQ0Esd0JBQ0E7R0FDQSxRQUFRLGlCQUFpQixZQUFZLEdBQXJDO0lBQ0UsS0FBSztLQUNILElBQUksa0JBQWtCO0tBQ3RCO0lBQ0YsS0FBSztLQUNILGtCQUFrQjtLQUNsQjtJQUNGLFNBQ0Usa0JBQWtCO0dBQ3RCO0dBQ0EsbUJBQW1CLGdCQUFnQixLQUNqQyxNQUNBLGNBQ0Esa0JBQ0EsZUFDRjtHQUNBLGtCQUFrQixLQUFLO0dBQ3ZCLENBQUMsaUNBQ0UsaUJBQWlCLGdCQUNoQixnQkFBZ0IsZ0JBQ2hCLFlBQVksaUJBQ2Isa0JBQWtCLENBQUM7R0FDdEIseUJBQ0ksS0FBSyxNQUFNLGtCQUNULGdCQUFnQixpQkFBaUIsY0FBYyxrQkFBa0I7SUFDL0QsU0FBUyxDQUFDO0lBQ1YsU0FBUztHQUNYLENBQUMsSUFDRCxnQkFBZ0IsaUJBQWlCLGNBQWMsa0JBQWtCLENBQUMsQ0FBQyxJQUNyRSxLQUFLLE1BQU0sa0JBQ1QsZ0JBQWdCLGlCQUFpQixjQUFjLGtCQUFrQixFQUMvRCxTQUFTLGdCQUNYLENBQUMsSUFDRCxnQkFBZ0IsaUJBQ2QsY0FDQSxrQkFDQSxDQUFDLENBQ0g7RUFDUjtFQUNBLFNBQVMsa0NBQ1AsY0FDQSxrQkFDQSxhQUNBLHFCQUNBLGlCQUNBO0dBQ0EsSUFBSSxlQUFlO0dBQ25CLElBQ0UsT0FBTyxtQkFBbUIsTUFDMUIsT0FBTyxtQkFBbUIsTUFDMUIsU0FBUyxxQkFFVCxHQUFHLFNBQVM7SUFDVixJQUFJLFNBQVMscUJBQXFCO0lBQ2xDLElBQUksVUFBVSxvQkFBb0I7SUFDbEMsSUFBSSxNQUFNLFdBQVcsTUFBTSxTQUFTO0tBQ2xDLElBQUksWUFBWSxvQkFBb0IsVUFBVTtLQUM5QyxJQUFJLGNBQWMsaUJBQWlCO0tBQ25DLElBQUksTUFBTSxTQUNSLEtBQUssVUFBVSxvQkFBb0IsUUFBUSxTQUFTLFVBQVc7TUFDN0QsSUFBSSxXQUFXLFFBQVE7TUFDdkIsS0FDRyxNQUFNLFlBQVksTUFBTSxhQUN6QixRQUFRLFVBQVUsa0JBQWtCLGlCQUVwQztNQUNGLFVBQVUsUUFBUTtLQUNwQjtLQUNGLE9BQU8sU0FBUyxZQUFhO01BQzNCLFVBQVUsMkJBQTJCLFNBQVM7TUFDOUMsSUFBSSxTQUFTLFNBQVM7TUFD
15852dEIsV0FBVyxRQUFRO01BQ25CLElBQ0UsTUFBTSxZQUNOLE1BQU0sWUFDTixPQUFPLFlBQ1AsT0FBTyxVQUNQO09BQ0Esc0JBQXNCLGVBQWU7T0FDckMsU0FBUztNQUNYO01BQ0EsWUFBWSxVQUFVO0tBQ3hCO0lBQ0Y7SUFDQSxzQkFBc0Isb0JBQW9CO0dBQzVDO0dBQ0YsaUJBQWlCLFdBQVk7SUFDM0IsSUFBSSxhQUFhLGNBQ2Ysb0JBQW9CLGVBQWUsV0FBVyxHQUM5QyxnQkFBZ0IsQ0FBQztJQUNuQixHQUFHO0tBQ0QsSUFBSSxZQUFZLDJCQUEyQixJQUFJLFlBQVk7S0FDM0QsSUFBSSxLQUFLLE1BQU0sV0FBVztNQUN4QixJQUFJLHFCQUFxQixnQkFDdkIsaUJBQWlCO01BQ25CLFFBQVEsY0FBUjtPQUNFLEtBQUssWUFDSCxJQUFJLE1BQU0saUJBQWlCLFdBQVcsR0FBRyxNQUFNO09BQ2pELEtBQUs7T0FDTCxLQUFLO1FBQ0gscUJBQXFCO1FBQ3JCO09BQ0YsS0FBSztRQUNILGlCQUFpQjtRQUNqQixxQkFBcUI7UUFDckI7T0FDRixLQUFLO1FBQ0gsaUJBQWlCO1FBQ2pCLHFCQUFxQjtRQUNyQjtPQUNGLEtBQUs7T0FDTCxLQUFLO1FBQ0gscUJBQXFCO1FBQ3JCO09BQ0YsS0FBSyxTQUNILElBQUksTUFBTSxZQUFZLFFBQVEsTUFBTTtPQUN0QyxLQUFLO09BQ0wsS0FBSztPQUNMLEtBQUs7T0FDTCxLQUFLO09BQ0wsS0FBSztPQUNMLEtBQUs7T0FDTCxLQUFLO09BQ0wsS0FBSztRQUNILHFCQUFxQjtRQUNyQjtPQUNGLEtBQUs7T0FDTCxLQUFLO09BQ0wsS0FBSztPQUNMLEtBQUs7T0FDTCxLQUFLO09BQ0wsS0FBSztPQUNMLEtBQUs7T0FDTCxLQUFLO1FBQ0gscUJBQXFCO1FBQ3JCO09BQ0YsS0FBSztPQUNMLEtBQUs7T0FDTCxLQUFLO09BQ0wsS0FBSztRQUNILHFCQUFxQjtRQUNyQjtPQUNGLEtBQUs7T0FDTCxLQUFLO09BQ0wsS0FBSztRQUNILHFCQUFxQjtRQUNyQjtPQUNGLEtBQUs7UUFDSCxxQkFBcUI7UUFDckI7T0FDRixLQUFLO09BQ0wsS0FBSztRQUNILHFCQUFxQjtRQUNyQjtPQUNGLEtBQUs7UUFDSCxxQkFBcUI7UUFDckI7T0FDRixLQUFLO09BQ0wsS0FBSztPQUNMLEtBQUs7UUFDSCxxQkFBcUI7UUFDckI7T0FDRixLQUFLO09BQ0wsS0FBSztPQUNMLEtBQUs7T0FDTCxLQUFLO09BQ0wsS0FBSztPQUNMLEtBQUs7T0FDTCxLQUFLO09BQ0wsS0FBSztRQUNILHFCQUFxQjtRQUNyQjtPQUNGLEtBQUs7UUFDSCxxQkFBcUI7UUFDckI7T0FDRixLQUFLO09BQ0wsS0FBSyxnQkFDSCxxQkFBcUI7TUFDekI7TUFDQSxJQUFJLGlCQUFpQixPQUFPLG1CQUFtQixJQUM3Qyx1QkFDRSxDQUFDLG1CQUNBLGFBQWEsZ0JBQWdCLGdCQUFnQixlQUNoRCxpQkFBaUIsaUJBQ2IsU0FBUyxZQUNQLFlBQVksWUFDWixPQUNGO01BQ04saUJBQWlCLENBQUM7TUFDbEIsS0FDRSxJQUFJLFdBQVcsWUFBWSxtQkFDM0IsU0FBUyxXQUVUO09BQ0EsSUFBSSxhQUFhO09BQ2pCLG9CQUFvQixXQUFXO09BQy9CLGFBQWEsV0FBVztPQUN4QixNQUFPLGNBQWMsT0FBTyxjQUFjLE9BQU8sY0FDL0MsU0FBUyxxQkFDVCxTQUFTLG1CQUNQLGFBQWEsWUFBWSxVQUFVLGNBQWMsR0FDbkQsUUFBUSxjQUNOLGVBQWUsS0FDYix1QkFDRSxVQUNBLFlBQ0EsaUJBQ0YsQ0FDRjtPQUNKLElBQUksc0JBQXNCO09BQzFCLFdBQVcsU0FBUztNQUN0QjtNQUNBLElBQUksZUFBZSxXQUNmLFlBQVksSUFBSSxtQkFDaEIsV0FDQSxnQkFDQSxNQUNBLGFBQ0EsaUJBQ0YsR0FDQSxjQUFjLEtBQUs7T0FDakIsT0FBTztPQUNQLFdBQVc7TUFDYixDQUFDO0tBQ0w7SUFDRjtJQUNBLElBQUksT0FBTyxtQkFBbUIsSUFBSTtLQUNoQyxHQUFHO01BQ0QscUJBQ0UsZ0JBQWdCLGdCQUFnQixrQkFBa0I7TUFDcEQsWUFDRSxlQUFlLGdCQUFnQixpQkFBaUI7TUFDbEQsSUFDRSxzQkFDQSxnQkFBZ0IsMEJBQ2YsaUJBQ0MsWUFBWSxpQkFBaUIsWUFBWSxpQkFDMUMsMkJBQTJCLGNBQWMsS0FDeEMsZUFBZSxnQ0FFakIsTUFBTTtNQUNSLElBQUksYUFBYSxvQkFBb0I7T0FDbkMsaUJBQ0Usa0JBQWtCLFdBQVcsb0JBQ3pCLHFCQUNDLHFCQUFxQixrQkFBa0IsaUJBQ3RDLG1CQUFtQixlQUNuQixtQkFBbUIsZUFDbkI7T0FDUixJQUFJLFdBRUU7WUFBQSxxQkFDQSxZQUFZLGlCQUFpQixZQUFZLFdBQzFDLFlBQVksWUFDWixxQkFBcUIscUJBQ2xCLDJCQUEyQixrQkFBa0IsSUFDN0MsTUFDSixTQUFTLHVCQUNMLHVCQUNBLHVCQUF1QixrQkFBa0IsR0FDMUMsaUJBQWlCLG1CQUFtQixLQUNyQyx1QkFBdUIsd0JBQ3BCLE1BQU0sa0JBQ0wsT0FBTyxrQkFDUCxNQUFNLGlCQUVaLHFCQUFxQjtPQUFBLE9BQ2xCLFlBQWEsTUFBUSxxQkFBcUI7T0FDakQsSUFBSSxjQUFjLG9CQUFvQjtRQUNwQyxpQkFBaUI7UUFDakIsYUFBYTtRQUNiLGlCQUFpQjtRQUNqQixXQUFXO1FBQ1gsSUFDRSxpQkFBaUIsZ0JBQ2pCLGtCQUFrQixjQUVsQixpQkFBa0IsdUJBQ2YsYUFBYSxrQkFDYixpQkFBaUIsa0JBQ2pCLFdBQVc7UUFDaEIsdUJBQ0UsUUFBUSxZQUNKLGlCQUNBLG9CQUFvQixTQUFTO1FBQ25DLG9CQUNFLFFBQVEscUJBQ0osaUJBQ0Esb0JBQW9CLGtCQUFrQjtRQUM1QyxpQkFBaUIsSUFBSSxlQUNuQixZQUNBLFdBQVcsU0FDWCxXQUNBLGFBQ0EsaUJBQ0Y7UUFDQSxlQUFlLFNBQVM7UUFDeEIsZUFBZSxnQkFBZ0I7UUFDL0IsYUFBYTtRQUNiLDJCQUEyQixpQkFBaUIsTUFBTSxlQUM5QyxpQkFBaUIsSUFBSSxlQUNyQixnQkFDQSxXQUFXLFNBQ1gsb0JBQ0EsYUFDQSxpQkFDRixHQUNDLGVBQWUsU0FBUyxtQkFDeEIsZUFBZSxnQkFBZ0Isc0JBQy9CLGFBQWE7UUFDaEIsdUJBQXVCO1FBQ3ZCLGlCQUNFLGFBQWEscUJBQ1Qsd0JBQ0UsV0FDQSxvQkFDQSxTQUNGLElBQ0E7UUFDTixTQUFTLGFBQ1Asc0NBQ0UsZUFDQSxnQkFDQSxXQUNBLGdCQUNBLENBQUMsQ0FDSDtRQUNGLFNBQVMsc0JBQ1AsU0FBUyx3QkFDVCxzQ0FDRSxlQUNBLHNCQUNBLG9CQUNBLGdCQUNBLENBQUMsQ0FDSDtPQUNKO01BQ0Y7S0FDRjtLQUNBLEdBQUc7TUFDRCxZQUFZLGFBQWEsb0JBQW9CLFVBQVUsSUFBSTtNQUMzRCxxQkFDRSxVQUFVLFlBQVksVUFBVSxTQUFTLFlBQVk7TUFDdkQsSUFDRSxhQUFhLHNCQUNaLFlBQVksc0JBQXNCLFdBQVcsVUFBVSxNQUV4RCxJQUFJLG9CQUFvQjtXQUNyQixJQUFJLG1CQUFtQixTQUFTLEdBQ25DLElBQUksdUJBQ0Ysb0JBQW9CO1dBQ2pCO09BQ0gsb0JBQW9CO09BQ3BCLElBQUksa0JBQWtCO01BQ3hCO1dBRUEscUJBQXNCLFVBQVUsVUFDOUIsQ0FBQyxzQkFDRCxZQUFZLG1CQUFtQixZQUFZLEtB
15852QzFDLGVBQWUsVUFBVSxRQUFRLFlBQVksVUFBVSxPQUNwRCxjQUNBLGdCQUFnQixXQUFXLFdBQVcsTUFDckMsb0JBQW9CLCtCQUNwQixvQkFBb0I7TUFDN0IsSUFDRSxzQkFDQyxvQkFBb0Isa0JBQWtCLGNBQWMsVUFBVSxJQUMvRDtPQUNBLCtCQUNFLGVBQ0EsbUJBQ0EsYUFDQSxpQkFDRjtPQUNBLE1BQU07TUFDUjtNQUNBLG1CQUNFLGdCQUFnQixjQUFjLFdBQVcsVUFBVTtLQUN2RDtLQUNBLGtCQUFrQixhQUNkLG9CQUFvQixVQUFVLElBQzlCO0tBQ0osUUFBUSxjQUFSO01BQ0UsS0FBSztPQUNILElBQ0UsbUJBQW1CLGVBQWUsS0FDbEMsV0FBVyxnQkFBZ0IsaUJBRTNCLGdCQUFpQixpQkFDZCxvQkFBb0IsWUFDcEIsZ0JBQWdCO09BQ3JCO01BQ0YsS0FBSztPQUNILGdCQUFnQixvQkFBb0IsZ0JBQWdCO09BQ3BEO01BQ0YsS0FBSztPQUNILFlBQVksQ0FBQztPQUNiO01BQ0YsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO09BQ0gsWUFBWSxDQUFDO09BQ2IscUJBQ0UsZUFDQSxhQUNBLGlCQUNGO09BQ0E7TUFDRixLQUFLLG1CQUNILElBQUksMEJBQTBCO01BQ2hDLEtBQUs7TUFDTCxLQUFLLFNBQ0gscUJBQ0UsZUFDQSxhQUNBLGlCQUNGO0tBQ0o7S0FDQSxJQUFJO0tBQ0osSUFBSSx3QkFDRixHQUFHO01BQ0QsUUFBUSxjQUFSO09BQ0UsS0FBSztRQUNILElBQUksWUFBWTtRQUNoQixNQUFNO09BQ1IsS0FBSztRQUNILFlBQVk7UUFDWixNQUFNO09BQ1IsS0FBSztRQUNILFlBQVk7UUFDWixNQUFNO01BQ1Y7TUFDQSxZQUFZLEtBQUs7S0FDbkI7VUFFQSxjQUNJLHlCQUF5QixjQUFjLFdBQVcsTUFDakQsWUFBWSxzQkFDYixjQUFjLGdCQUNkLFlBQVksWUFBWSxrQkFDdkIsWUFBWTtLQUNuQixjQUNHLDhCQUNDLFNBQVMsWUFBWSxXQUNwQixlQUFlLHlCQUF5QixZQUNyQyx1QkFBdUIsYUFDdkIsZ0JBQ0MsZUFBZSxRQUFRLE1BQ3RCLE9BQU8sbUJBQ1IsWUFBWSxXQUFXLE9BQU8sS0FBSyxRQUFRLEtBQUssYUFDaEQsY0FBYyxDQUFDLEtBQ3JCLGtCQUFrQiw0QkFDakIsWUFDQSxTQUNGLEdBQ0EsSUFBSSxnQkFBZ0IsV0FDaEIsWUFBWSxJQUFJLDBCQUNoQixXQUNBLGNBQ0EsTUFDQSxhQUNBLGlCQUNGLEdBQ0EsY0FBYyxLQUFLO01BQ2pCLE9BQU87TUFDUCxXQUFXO0tBQ2IsQ0FBQyxHQUNELGVBQ0ssVUFBVSxPQUFPLGdCQUNoQixlQUFlLHVCQUF1QixXQUFXLEdBQ25ELFNBQVMsaUJBQWlCLFVBQVUsT0FBTztLQUNuRCxJQUNHLGVBQWUsdUJBQ1osMEJBQTBCLGNBQWMsV0FBVyxJQUNuRCw0QkFBNEIsY0FBYyxXQUFXLEdBRXpELFlBQWEsNEJBQ1gsWUFDQSxlQUNGLEdBQ0UsSUFBSSxVQUFVLFdBQ1Ysa0JBQWtCLElBQUksb0JBQ3RCLGlCQUNBLGVBQ0EsTUFDQSxhQUNBLGlCQUNGLEdBQ0EsY0FBYyxLQUFLO01BQ2pCLE9BQU87TUFDUCxXQUFXO0tBQ2IsQ0FBQyxHQUNBLGdCQUFnQixPQUFPO0tBQzlCLGdCQUNFLGVBQ0EsY0FDQSxZQUNBLGFBQ0EsaUJBQ0Y7SUFDRjtJQUNBLHFCQUFxQixlQUFlLGdCQUFnQjtHQUN0RCxDQUFDO0VBQ0g7RUFDQSxTQUFTLHVCQUF1QixVQUFVLFVBQVUsZUFBZTtHQUNqRSxPQUFPO0lBQ0s7SUFDQTtJQUNLO0dBQ2pCO0VBQ0Y7RUFDQSxTQUFTLDRCQUE0QixhQUFhLFdBQVc7R0FDM0QsS0FDRSxJQUFJLGNBQWMsWUFBWSxXQUFXLFlBQVksQ0FBQyxHQUN0RCxTQUFTLGNBRVQ7SUFDQSxJQUFJLGFBQWEsYUFDZixZQUFZLFdBQVc7SUFDekIsYUFBYSxXQUFXO0lBQ3hCLE1BQU8sY0FBYyxPQUFPLGNBQWMsT0FBTyxjQUMvQyxTQUFTLGNBQ1AsYUFBYSxZQUFZLGFBQWEsV0FBVyxHQUNuRCxRQUFRLGNBQ04sVUFBVSxRQUNSLHVCQUF1QixhQUFhLFlBQVksU0FBUyxDQUMzRCxHQUNELGFBQWEsWUFBWSxhQUFhLFNBQVMsR0FDaEQsUUFBUSxjQUNOLFVBQVUsS0FDUix1QkFBdUIsYUFBYSxZQUFZLFNBQVMsQ0FDM0Q7SUFDSixJQUFJLE1BQU0sWUFBWSxLQUFLLE9BQU87SUFDbEMsY0FBYyxZQUFZO0dBQzVCO0dBQ0EsT0FBTyxDQUFDO0VBQ1Y7RUFDQSxTQUFTLFVBQVUsTUFBTTtHQUN2QixJQUFJLFNBQVMsTUFBTSxPQUFPO0dBQzFCO0lBQUcsT0FBTyxLQUFLO1VBQ1IsUUFBUSxNQUFNLEtBQUssT0FBTyxPQUFPLEtBQUs7R0FDN0MsT0FBTyxPQUFPLE9BQU87RUFDdkI7RUFDQSxTQUFTLHNDQUNQLGVBQ0EsT0FDQSxRQUNBLFFBQ0EsZ0JBQ0E7R0FDQSxLQUNFLElBQUksbUJBQW1CLE1BQU0sWUFBWSxZQUFZLENBQUMsR0FDdEQsU0FBUyxVQUFVLFdBQVcsU0FFOUI7SUFDQSxJQUFJLGFBQWEsUUFDZixZQUFZLFdBQVcsV0FDdkIsWUFBWSxXQUFXO0lBQ3pCLGFBQWEsV0FBVztJQUN4QixJQUFJLFNBQVMsYUFBYSxjQUFjLFFBQVE7SUFDaEQsTUFBTyxjQUFjLE9BQU8sY0FBYyxPQUFPLGNBQy9DLFNBQVMsY0FDUCxZQUFZLFdBQ2Qsa0JBQ00sWUFBWSxZQUFZLFFBQVEsZ0JBQWdCLEdBQ2xELFFBQVEsYUFDTixVQUFVLFFBQ1IsdUJBQXVCLFFBQVEsV0FBVyxTQUFTLENBQ3JELEtBQ0YsbUJBQ0UsWUFBWSxZQUFZLFFBQVEsZ0JBQWdCLEdBQ2xELFFBQVEsYUFDTixVQUFVLEtBQ1IsdUJBQXVCLFFBQVEsV0FBVyxTQUFTLENBQ3JEO0lBQ1IsU0FBUyxPQUFPO0dBQ2xCO0dBQ0EsTUFBTSxVQUFVLFVBQ2QsY0FBYyxLQUFLO0lBQVM7SUFBa0I7R0FBVSxDQUFDO0VBQzdEO0VBQ0EsU0FBUyxnQ0FBZ0MsTUFBTSxPQUFPO0dBQ3BELHFCQUFxQixNQUFNLEtBQUs7R0FDaEMsWUFBYSxRQUFRLGVBQWUsUUFBUSxhQUFhLFFBQ3ZELFFBQVEsU0FDUixTQUFTLE1BQU0sU0FDZixxQkFDRSxtQkFBbUIsQ0FBQyxHQUN0QixhQUFhLFFBQVEsTUFBTSxXQUN2QixRQUFRLE1BQ04sOEtBQ0EsSUFDRixJQUNBLFFBQVEsTUFDTiw4SUFDQSxJQUNGO0dBQ04sSUFBSSxnQkFBZ0I7SUFDWTtJQUNIO0dBQzdCO0dBQ0EsZ0JBQWdCLElBQUksS0FDbEIsYUFBYSxPQUFPLE1BQU0sTUFDMUIsc0JBQXNCLE1BQU0sT0FBTyxhQUFhO0dBQ2xELE1BQU0sbUJBQ0osQ0FBQyxNQUFNLGtDQUNQLFFBQVEsTUFBTSxZQUNkLFFBQVEsTUFDTiwyTkFDRjtFQUNKO0VBQ0EsU0FBUyxzQkFDUCxVQUNBLGFBQ0EsYUFDQSxtQkFDQTtHQUNBLGdCQUFnQixnQkFDWixjQUFjLGtDQUFrQyxXQUFXLEdBQzdELGtDQUFrQyxXQUFXLE1BQU0sZ0JBQ2hELGtCQUFrQixZQUFZO0VBQ3JDO0VBQ0EsU0FBUyxrQkFBa0IsYUFBYTtHQUN0QyxPQUFPLENBQUMsRUFDTixZQUFZLGFBQWEsVUFBVSxLQUNuQyxZQUFZLGFBQWEsU0FBUyxLQUNsQyxZQUFZLGFBQWEsVUFBVSxLQUNuQyxZQUFZLGFBQWEsV0FBVztFQUV4QztFQUNBLFNBQVMsNkJBQTZCLGFBQWE7R0FDakQsSUFBSSxDQUFDLGtCQUFrQixXQUFXLEdBQUcsT0FBTyxDQUFDO0dBQzdDLElBQUksaUJBQWlCLFlBQVksYUFBYSxTQUFTO0dBQ3ZELGNBQWMsWUFBWSxNQUFNO0dBQ2hDLE9BQU8saUJBQ0gsbUJBQW1CLGNBQ25CLFlBQVksV0FBVyxLQUFLO0VBQ2xDO0VBQ0EsU0FBUyx1QkFDUCxZQUNBLGdCQUNBLG1CQUNBO0dBQ0EsZUFBZSxRQUFRLFNBQVUsZUFBZTtJQUM5QyxZQUFZLGdCQUNSLE9BQU8sV0FBVyxhQU
15852FhLGFBQWEsTUFDMUMsZ0JBQWdCLFdBQVcsUUFDMUIsTUFBTSxjQUFjLFVBQ3JCLDJCQUEyQixjQUFjLE1BQ3hDLE1BQU0sY0FBYyxVQUNuQiw0QkFBNEIsY0FBYyxNQUMxQywyQkFBMkIsY0FBYyxPQUMzQyw2QkFBNkIsVUFBVSxNQUN0QyxrQkFBa0IsUUFDakIsMkJBQTJCLFVBQVUsTUFDeEMsa0JBQWtCLDZCQUE2QixhQUFhLEtBQzNELFdBQVcsYUFBYSxhQUFhO0dBQzdDLENBQUM7RUFDSDtFQUNBLFNBQVMsNEJBQTRCLGtCQUFrQixVQUFVO0dBQy9ELENBQUMsTUFBTSxXQUNILFFBQVEsTUFDTix3TEFDQSxrQkFDQSxrQkFDQSxnQkFDRixJQUNBLFFBQVEsTUFDTiw4RUFDQSxrQkFDQSxPQUFPLFFBQ1Q7RUFDTjtFQUNBLFNBQVMsY0FBYyxRQUFRLE1BQU07R0FDbkMsU0FDRSxPQUFPLGlCQUFpQixrQkFDeEIsT0FBTyxpQkFBaUIsZ0JBQ3BCLE9BQU8sY0FBYyxnQkFDbkIsT0FBTyxjQUNQLE9BQU8sT0FDVCxJQUNBLE9BQU8sY0FBYyxjQUFjLE9BQU8sT0FBTztHQUN2RCxPQUFPLFlBQVk7R0FDbkIsT0FBTyxPQUFPO0VBQ2hCO0VBQ0EsU0FBUyxrQ0FBa0MsUUFBUTtHQUNqRCxrQkFBa0IsTUFBTSxNQUNyQixRQUFRLE1BQ1AsOEhBQ0EsU0FBUyxNQUFNLENBQ2pCLEdBQ0EsbUJBQW1CLE1BQU07R0FDM0IsUUFBUSxhQUFhLE9BQU8sU0FBUyxTQUFTLEtBQUssT0FBQSxDQUNoRCxRQUFRLDBCQUEwQixJQUFJLENBQUMsQ0FDdkMsUUFBUSxzQ0FBc0MsRUFBRTtFQUNyRDtFQUNBLFNBQVMsc0JBQXNCLFlBQVksWUFBWTtHQUNyRCxhQUFhLGtDQUFrQyxVQUFVO0dBQ3pELE9BQU8sa0NBQWtDLFVBQVUsTUFBTSxhQUNyRCxDQUFDLElBQ0QsQ0FBQztFQUNQO0VBQ0EsU0FBUyxRQUFRLFlBQVksS0FBSyxLQUFLLE9BQU8sT0FBTyxXQUFXO0dBQzlELFFBQVEsS0FBUjtJQUNFLEtBQUs7S0FDSCxJQUFJLGFBQWEsT0FBTyxPQUN0QixvQkFBb0IsT0FBTyxLQUFLLENBQUMsQ0FBQyxHQUNoQyxXQUFXLE9BQ1IsZUFBZSxPQUFPLE9BQU8sU0FDOUIsZUFBZSxZQUFZLEtBQUs7VUFDakMsSUFBSSxhQUFhLE9BQU8sU0FBUyxhQUFhLE9BQU8sT0FDeEQsb0JBQW9CLEtBQUssT0FBTyxLQUFLLENBQUMsQ0FBQyxHQUNyQyxXQUFXLE9BQU8sZUFBZSxZQUFZLEtBQUssS0FBSztVQUN0RDtLQUNMO0lBQ0YsS0FBSztLQUNILDBCQUEwQixZQUFZLFNBQVMsS0FBSztLQUNwRDtJQUNGLEtBQUs7S0FDSCwwQkFBMEIsWUFBWSxZQUFZLEtBQUs7S0FDdkQ7SUFDRixLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztLQUNILDBCQUEwQixZQUFZLEtBQUssS0FBSztLQUNoRDtJQUNGLEtBQUs7S0FDSCxrQkFBa0IsWUFBWSxPQUFPLFNBQVM7S0FDOUM7SUFDRixLQUFLLFFBQ0gsSUFBSSxhQUFhLEtBQUs7S0FDcEIsMEJBQTBCLFlBQVksUUFBUSxLQUFLO0tBQ25EO0lBQ0Y7SUFDRixLQUFLO0lBQ0wsS0FBSztLQUNILElBQUksT0FBTyxVQUFVLFFBQVEsT0FBTyxXQUFXLE1BQU07TUFDbkQsVUFBVSxNQUNOLFFBQVEsTUFDTiw0T0FDQSxLQUNBLEdBQ0YsSUFDQSxRQUFRLE1BQ04sOEpBQ0EsS0FDQSxHQUNGO01BQ0osV0FBVyxnQkFBZ0IsR0FBRztNQUM5QjtLQUNGO0tBQ0EsSUFDRSxRQUFRLFNBQ1IsZUFBZSxPQUFPLFNBQ3RCLGFBQWEsT0FBTyxTQUNwQixjQUFjLE9BQU8sT0FDckI7TUFDQSxXQUFXLGdCQUFnQixHQUFHO01BQzlCO0tBQ0Y7S0FDQSw2QkFBNkIsT0FBTyxHQUFHO0tBQ3ZDLFFBQVEsWUFBWSxLQUFLO0tBQ3pCLFdBQVcsYUFBYSxLQUFLLEtBQUs7S0FDbEM7SUFDRixLQUFLO0lBQ0wsS0FBSztLQUNILFFBQVEsVUFDTCxXQUFXLE1BQ1IsaUJBQWlCLE1BQ2YsUUFBUSxNQUNOLDhGQUNGLElBQ0EsZUFBZSxPQUFPLFVBQ3BCLFFBQVEsTUFBTSxXQUFXLFFBQVEsTUFBTSxVQUN2Qyw0QkFDRSwwQkFBMEIsQ0FBQyxHQUM3QixRQUFRLE1BQ04sc0pBQ0YsSUFDRixRQUFRLE1BQU0sVUFDWiw0QkFDRSwwQkFBMEIsQ0FBQyxHQUM3QixRQUFRLE1BQ04sc0lBQ0YsTUFDSixZQUFZLE9BQU8sYUFBYSxNQUM5QixhQUFhLE1BQ1gsUUFBUSxNQUNOLDhGQUNGLElBQ0EsWUFBWSxPQUNWLGFBQWEsTUFBTSxRQUNuQixZQUFZLE1BQU0sUUFDbEIsd0JBQ0EsYUFBYSxPQUNiLFFBQVEsTUFBTSxRQUNkLGFBQWEsTUFBTSxRQUNuQix3QkFDRSxlQUFlLE9BQU8sVUFDckIsUUFBUSxNQUFNLFFBQ2IsMEJBQ0Usd0JBQXdCLENBQUMsR0FDM0IsUUFBUSxNQUNOLHlLQUNGLElBQ0QsUUFBUSxNQUFNLGVBQ2IsUUFBUSxNQUFNLGNBQ2QsNEJBQ0UsMEJBQTBCLENBQUMsR0FDN0IsUUFBUSxNQUNOLGtLQUNGLElBQ0YsUUFBUSxNQUFNLGNBQ1osNEJBQ0UsMEJBQTBCLENBQUMsR0FDN0IsUUFBUSxNQUNOLDhJQUNGLE9BQ0Esd0JBQXdCLENBQUMsR0FDM0IsUUFBUSxNQUNOLCtFQUNGLE1BQ0Esd0JBQXdCLENBQUMsR0FDM0IsUUFBUSxNQUNOLHNGQUNGLEtBQ0osYUFBYSxNQUNYLFFBQVEsTUFDTiw4Q0FDRixJQUNBLFFBQVEsTUFDTiwrREFDRjtLQUNWLElBQUksZUFBZSxPQUFPLE9BQU87TUFDL0IsV0FBVyxhQUNULEtBQ0Esc1JBQ0Y7TUFDQTtLQUNGLE9BQ0UsZUFBZSxPQUFPLGNBQ25CLGlCQUFpQixPQUNiLFlBQVksT0FDWCxRQUFRLFlBQVksS0FBSyxRQUFRLE1BQU0sTUFBTSxPQUFPLElBQUksR0FDMUQsUUFDRSxZQUNBLEtBQ0EsZUFDQSxNQUFNLGFBQ04sT0FDQSxJQUNGLEdBQ0EsUUFDRSxZQUNBLEtBQ0EsY0FDQSxNQUFNLFlBQ04sT0FDQSxJQUNGLEdBQ0EsUUFDRSxZQUNBLEtBQ0EsY0FDQSxNQUFNLFlBQ04sT0FDQSxJQUNGLE1BQ0MsUUFDQyxZQUNBLEtBQ0EsV0FDQSxNQUFNLFNBQ04sT0FDQSxJQUNGLEdBQ0EsUUFBUSxZQUFZLEtBQUssVUFBVSxNQUFNLFFBQVEsT0FBTyxJQUFJLEdBQzVELFFBQ0UsWUFDQSxLQUNBLFVBQ0EsTUFBTSxRQUNOLE9BQ0EsSUFDRjtLQUNSLElBQ0UsUUFBUSxTQUNSLGFBQWEsT0FBTyxTQUNwQixjQUFjLE9BQU8sT0FDckI7TUFDQSxXQUFXLGdCQUFnQixHQUFHO01BQzlCO0tBQ0Y7S0FDQSw2QkFBNkIsT0FBTyxHQUFHO0tBQ3ZDLFFBQVEsWUFBWSxLQUFLO0tBQ3pCLFdBQVcsYUFBYSxLQUFLLEtBQUs7S0FDbEM7SUFDRixLQUFLO0tBQ0gsUUFBUSxVQUNMLGVBQWUsT0FBTyxTQUNyQiw0QkFBNEIsS0FBSyxLQUFLLEdBQ3ZDLFdBQVcsVUFBVTtLQUN4QjtJQUNGLEtBQUs7S0FDSCxRQUFRLFVBQ0wsZUFBZSxPQUFPLFNBQ3JCLDRCQUE0QixLQUFLLEtBQUssR0FDeEMsMEJBQTBCLFVBQVUsVUFBVTtLQUNoRDtJQUNGLEtBQUs7S0FDSCxRQUFRLFVBQ0wsZUFBZSxPQUFPLFNBQ3JCLDRCQUE0QixLQUFLLEtBQUssR0FDeEMsMEJBQTBCLGFBQWEsVUFBVTtLQUNuRDtJQUNGLEtBQUs7S0FDSCxJQUFJLFFBQVEsT0FBTztNQUNqQixJQUFJLGFBQWEsT0FBTyxTQUFTLEVBQUUsWUFBWSxRQUM3QyxNQUFNLE1BQ0osMkpBQ0Y7TUFDRixNQUFNLE1BQU07TUFDWixJQUFJLFFBQVEsS0FBSztPQUNmLElBQUksUUFBUSxNQUFNLFVBQ2hCLE1BQU0sTUFDSixvRUFDRjtPQUNGLENBQUMsUUFBUSxZQUFZLFVBQVUsU0FBUyxLQUFLLE9BQU8sUUFDakQsV0FBVyxZQU
15852FZO01BQzVCO0tBQ0Y7S0FDQTtJQUNGLEtBQUs7S0FDSCxXQUFXLFdBQ1QsU0FBUyxlQUFlLE9BQU8sU0FBUyxhQUFhLE9BQU87S0FDOUQ7SUFDRixLQUFLO0tBQ0gsV0FBVyxRQUNULFNBQVMsZUFBZSxPQUFPLFNBQVMsYUFBYSxPQUFPO0tBQzlEO0lBQ0YsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLLE9BQ0g7SUFDRixLQUFLLGFBQ0g7SUFDRixLQUFLO0tBQ0gsSUFDRSxRQUFRLFNBQ1IsZUFBZSxPQUFPLFNBQ3RCLGNBQWMsT0FBTyxTQUNyQixhQUFhLE9BQU8sT0FDcEI7TUFDQSxXQUFXLGdCQUFnQixZQUFZO01BQ3ZDO0tBQ0Y7S0FDQSw2QkFBNkIsT0FBTyxHQUFHO0tBQ3ZDLE1BQU0sWUFBWSxLQUFLO0tBQ3ZCLFdBQVcsZUFBZSxnQkFBZ0IsY0FBYyxHQUFHO0tBQzNEO0lBQ0YsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7S0FDSCxRQUFRLFNBQ1IsZUFBZSxPQUFPLFNBQ3RCLGFBQWEsT0FBTyxTQUNmLDZCQUE2QixPQUFPLEdBQUcsR0FDeEMsV0FBVyxhQUFhLEtBQUssS0FBSyxLQUNsQyxXQUFXLGdCQUFnQixHQUFHO0tBQ2xDO0lBQ0YsS0FBSyxTQUNILE9BQU8sU0FDTCx3Q0FBd0MsU0FDdEMsd0NBQXdDLE9BQU8sQ0FBQyxHQUNsRCxRQUFRLE1BQ04sc1FBQ0EsR0FDRjtJQUNKLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0tBQ0gsU0FBUyxlQUFlLE9BQU8sU0FBUyxhQUFhLE9BQU8sUUFDeEQsV0FBVyxhQUFhLEtBQUssRUFBRSxJQUMvQixXQUFXLGdCQUFnQixHQUFHO0tBQ2xDO0lBQ0YsS0FBSztJQUNMLEtBQUs7S0FDSCxDQUFDLE1BQU0sUUFDSCxXQUFXLGFBQWEsS0FBSyxFQUFFLElBQy9CLENBQUMsTUFBTSxTQUNMLFFBQVEsU0FDUixlQUFlLE9BQU8sU0FDdEIsYUFBYSxPQUFPLFNBQ25CLDZCQUE2QixPQUFPLEdBQUcsR0FDeEMsV0FBVyxhQUFhLEtBQUssS0FBSyxLQUNsQyxXQUFXLGdCQUFnQixHQUFHO0tBQ3BDO0lBQ0YsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztLQUNILFFBQVEsU0FDUixlQUFlLE9BQU8sU0FDdEIsYUFBYSxPQUFPLFNBQ3BCLENBQUMsTUFBTSxLQUFLLEtBQ1osS0FBSyxTQUNBLDZCQUE2QixPQUFPLEdBQUcsR0FDeEMsV0FBVyxhQUFhLEtBQUssS0FBSyxLQUNsQyxXQUFXLGdCQUFnQixHQUFHO0tBQ2xDO0lBQ0YsS0FBSztJQUNMLEtBQUs7S0FDSCxRQUFRLFNBQ1IsZUFBZSxPQUFPLFNBQ3RCLGFBQWEsT0FBTyxTQUNwQixNQUFNLEtBQUssSUFDUCxXQUFXLGdCQUFnQixHQUFHLEtBQzdCLDZCQUE2QixPQUFPLEdBQUcsR0FDeEMsV0FBVyxhQUFhLEtBQUssS0FBSztLQUN0QztJQUNGLEtBQUs7S0FDSCwwQkFBMEIsZ0JBQWdCLFVBQVU7S0FDcEQsMEJBQTBCLFVBQVUsVUFBVTtLQUM5QyxxQkFBcUIsWUFBWSxXQUFXLEtBQUs7S0FDakQ7SUFDRixLQUFLO0tBQ0gsK0JBQ0UsWUFDQSxnQkFDQSxpQkFDQSxLQUNGO0tBQ0E7SUFDRixLQUFLO0tBQ0gsK0JBQ0UsWUFDQSxnQkFDQSxpQkFDQSxLQUNGO0tBQ0E7SUFDRixLQUFLO0tBQ0gsK0JBQ0UsWUFDQSxnQkFDQSxjQUNBLEtBQ0Y7S0FDQTtJQUNGLEtBQUs7S0FDSCwrQkFDRSxZQUNBLGdCQUNBLGNBQ0EsS0FDRjtLQUNBO0lBQ0YsS0FBSztLQUNILCtCQUNFLFlBQ0EsZ0JBQ0EsZUFDQSxLQUNGO0tBQ0E7SUFDRixLQUFLO0tBQ0gsK0JBQ0UsWUFDQSxnQkFDQSxjQUNBLEtBQ0Y7S0FDQTtJQUNGLEtBQUs7S0FDSCwrQkFDRSxZQUNBLGNBQ0EsWUFDQSxLQUNGO0tBQ0E7SUFDRixLQUFLO0tBQ0gsK0JBQ0UsWUFDQSxjQUNBLFlBQ0EsS0FDRjtLQUNBO0lBQ0YsS0FBSztLQUNILCtCQUNFLFlBQ0EsY0FDQSxhQUNBLEtBQ0Y7S0FDQTtJQUNGLEtBQUs7S0FDSCxRQUFRLGFBQ04sUUFBUSxNQUNOLDhEQUNGO0tBQ0YscUJBQXFCLFlBQVksTUFBTSxLQUFLO0tBQzVDO0lBQ0YsS0FBSztJQUNMLEtBQUssZUFDSDtJQUNGLEtBQUssaUJBQ0gsOEJBQ0UsUUFBUSxTQUNSLGFBQWEsT0FBTyxVQUNsQiw2QkFBNkIsQ0FBQyxHQUNoQyxRQUFRLE1BQ04sMkZBQ0EsS0FDRjtJQUNKLFNBQ0UsSUFDRSxFQUFFLElBQUksSUFBSSxXQUNULFFBQVEsSUFBSSxNQUFNLFFBQVEsSUFBSSxNQUM5QixRQUFRLElBQUksTUFBTSxRQUFRLElBQUksSUFFL0IsTUFBTyxrQkFBa0IsR0FBRyxHQUMxQixxQkFBcUIsWUFBWSxLQUFLLEtBQUs7U0FDMUM7S0FDSCw2QkFBNkIsZUFBZSxHQUFHLEtBQzdDLFFBQVEsU0FDUixlQUFlLE9BQU8sU0FDdEIsNEJBQTRCLEtBQUssS0FBSztLQUN4QztJQUNGO0dBQ0o7R0FDQSxnQ0FBZ0MsQ0FBQztFQUNuQztFQUNBLFNBQVMsdUJBQ1AsWUFDQSxLQUNBLEtBQ0EsT0FDQSxPQUNBLFdBQ0E7R0FDQSxRQUFRLEtBQVI7SUFDRSxLQUFLO0tBQ0gsa0JBQWtCLFlBQVksT0FBTyxTQUFTO0tBQzlDO0lBQ0YsS0FBSztLQUNILElBQUksUUFBUSxPQUFPO01BQ2pCLElBQUksYUFBYSxPQUFPLFNBQVMsRUFBRSxZQUFZLFFBQzdDLE1BQU0sTUFDSiwySkFDRjtNQUNGLE1BQU0sTUFBTTtNQUNaLElBQUksUUFBUSxLQUFLO09BQ2YsSUFBSSxRQUFRLE1BQU0sVUFDaEIsTUFBTSxNQUNKLG9FQUNGO09BQ0YsQ0FBQyxRQUFRLFlBQVksVUFBVSxTQUFTLEtBQUssT0FBTyxRQUNqRCxXQUFXLFlBQVk7TUFDNUI7S0FDRjtLQUNBO0lBQ0YsS0FBSztLQUNILElBQUksYUFBYSxPQUFPLE9BQU8sZUFBZSxZQUFZLEtBQUs7VUFDMUQsSUFBSSxhQUFhLE9BQU8sU0FBUyxhQUFhLE9BQU8sT0FDeEQsZUFBZSxZQUFZLEtBQUssS0FBSztVQUNsQztLQUNMO0lBQ0YsS0FBSztLQUNILFFBQVEsVUFDTCxlQUFlLE9BQU8sU0FDckIsNEJBQTRCLEtBQUssS0FBSyxHQUN4QywwQkFBMEIsVUFBVSxVQUFVO0tBQ2hEO0lBQ0YsS0FBSztLQUNILFFBQVEsVUFDTCxlQUFlLE9BQU8sU0FDckIsNEJBQTRCLEtBQUssS0FBSyxHQUN4QywwQkFBMEIsYUFBYSxVQUFVO0tBQ25EO0lBQ0YsS0FBSztLQUNILFFBQVEsVUFDTCxlQUFlLE9BQU8sU0FDckIsNEJBQTRCLEtBQUssS0FBSyxHQUN2QyxXQUFXLFVBQVU7S0FDeEI7SUFDRixLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLLE9BQ0g7SUFDRixLQUFLO0lBQ0wsS0FBSyxlQUNIO0lBQ0Y7S0FDRSxJQUFJLDZCQUE2QixlQUFlLEdBQUcsR0FDakQsUUFBUSxTQUNOLGVBQWUsT0FBTyxTQUN0Qiw0QkFBNEIsS0FBSyxLQUFLO
158521VBRXhDLEdBQUc7TUFDRCxJQUNFLFFBQVEsSUFBSSxNQUNaLFFBQVEsSUFBSSxPQUNWLFFBQVEsSUFBSSxTQUFTLFNBQVMsR0FDL0IsWUFBWSxJQUFJLE1BQU0sR0FBRyxRQUFRLElBQUksU0FBUyxJQUFJLEtBQUssQ0FBQyxHQUN4RCxNQUFNLFdBQVcscUJBQXFCLE1BQ3RDLE1BQU0sUUFBUSxNQUFNLElBQUksT0FBTyxNQUNoQyxlQUFlLE9BQU8sT0FDcEIsV0FBVyxvQkFBb0IsV0FBVyxLQUFLLEtBQUssR0FDdEQsZUFBZSxPQUFPLFFBQ3RCO09BQ0EsZUFBZSxPQUFPLE9BQ3BCLFNBQVMsUUFDUixPQUFPLGFBQ0gsV0FBVyxPQUFPLE9BQ25CLFdBQVcsYUFBYSxHQUFHLEtBQzNCLFdBQVcsZ0JBQWdCLEdBQUc7T0FDcEMsV0FBVyxpQkFBaUIsV0FBVyxPQUFPLEtBQUs7T0FDbkQsTUFBTTtNQUNSO01BQ0EsZ0NBQWdDLENBQUM7TUFDakMsT0FBTyxhQUNGLFdBQVcsT0FBTyxRQUNuQixDQUFDLE1BQU0sUUFDTCxXQUFXLGFBQWEsS0FBSyxFQUFFLElBQy9CLHFCQUFxQixZQUFZLEtBQUssS0FBSztLQUNuRDtLQUNGO0dBQ0o7R0FDQSxnQ0FBZ0MsQ0FBQztFQUNuQztFQUNBLFNBQVMscUJBQXFCLFlBQVksS0FBSyxPQUFPO0dBQ3BELGdDQUFnQyxLQUFLLEtBQUs7R0FDMUMsUUFBUSxLQUFSO0lBQ0UsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUssTUFDSDtJQUNGLEtBQUs7S0FDSCwwQkFBMEIsU0FBUyxVQUFVO0tBQzdDLDBCQUEwQixRQUFRLFVBQVU7S0FDNUMsSUFBSSxTQUFTLENBQUMsR0FDWixZQUFZLENBQUMsR0FDYjtLQUNGLEtBQUssV0FBVyxPQUNkLElBQUksTUFBTSxlQUFlLE9BQU8sR0FBRztNQUNqQyxJQUFJLFlBQVksTUFBTTtNQUN0QixJQUFJLFFBQVEsV0FDVixRQUFRLFNBQVI7T0FDRSxLQUFLO1FBQ0gsU0FBUyxDQUFDO1FBQ1Y7T0FDRixLQUFLO1FBQ0gsWUFBWSxDQUFDO1FBQ2I7T0FDRixLQUFLO09BQ0wsS0FBSywyQkFDSCxNQUFNLE1BQ0osTUFDRSw0RkFDSjtPQUNGLFNBQ0UsUUFBUSxZQUFZLEtBQUssU0FBUyxXQUFXLE9BQU8sSUFBSTtNQUM1RDtLQUNKO0tBQ0YsYUFDRSxRQUFRLFlBQVksS0FBSyxVQUFVLE1BQU0sUUFBUSxPQUFPLElBQUk7S0FDOUQsVUFBVSxRQUFRLFlBQVksS0FBSyxPQUFPLE1BQU0sS0FBSyxPQUFPLElBQUk7S0FDaEU7SUFDRixLQUFLO0tBQ0gsMEJBQTBCLFNBQVMsS0FBSztLQUN4QywwQkFBMEIsV0FBVyxVQUFVO0tBQy9DLElBQUksZUFBZ0IsVUFBVSxZQU
15852FZLFlBQVksTUFDcEQsVUFBVSxNQUNWLGlCQUFpQjtLQUNuQixLQUFLLFVBQVUsT0FDYixJQUFJLE1BQU0sZUFBZSxNQUFNLEdBQUc7TUFDaEMsSUFBSSxhQUFhLE1BQU07TUFDdkIsSUFBSSxRQUFRLFlBQ1YsUUFBUSxRQUFSO09BQ0UsS0FBSztRQUNILFlBQVk7UUFDWjtPQUNGLEtBQUs7UUFDSCxZQUFZO1FBQ1o7T0FDRixLQUFLO1FBQ0gsVUFBVTtRQUNWO09BQ0YsS0FBSztRQUNILGlCQUFpQjtRQUNqQjtPQUNGLEtBQUs7UUFDSCxVQUFVO1FBQ1Y7T0FDRixLQUFLO1FBQ0gsZUFBZTtRQUNmO09BQ0YsS0FBSztPQUNMLEtBQUs7UUFDSCxJQUFJLFFBQVEsWUFDVixNQUFNLE1BQ0osTUFDRSw0RkFDSjtRQUNGO09BQ0YsU0FDRSxRQUFRLFlBQVksS0FBSyxRQUFRLFlBQVksT0FBTyxJQUFJO01BQzVEO0tBQ0o7S0FDRixtQkFBbUIsWUFBWSxLQUFLO0tBQ3BDLFVBQ0UsWUFDQSxTQUNBLGNBQ0EsU0FDQSxnQkFDQSxXQUNBLFdBQ0EsQ0FBQyxDQUNIO0tBQ0E7SUFDRixLQUFLO0tBQ0gsMEJBQTBCLFVBQVUsS0FBSztLQUN6QywwQkFBMEIsV0FBVyxVQUFVO0tBQy9DLFNBQVMsWUFBWSxVQUFVO0tBQy9CLEtBQUssYUFBYSxPQUNoQixJQUNFLE1BQU0sZUFBZSxTQUFTLE1BQzVCLGVBQWUsTUFBTSxZQUFhLFFBQVEsZUFFNUMsUUFBUSxXQUFSO01BQ0UsS0FBSztPQUNILFVBQVU7T0FDVjtNQUNGLEtBQUs7T0FDSCxZQUFZO09BQ1o7TUFDRixLQUFLLFlBQ0gsU0FBUztNQUNYLFNBQ0UsUUFDRSxZQUNBLEtBQ0EsV0FDQSxjQUNBLE9BQ0EsSUFDRjtLQUNKO0tBQ0osb0JBQW9CLFlBQVksS0FBSztLQUNyQyxNQUFNO0tBQ04sUUFBUTtLQUNSLFdBQVcsV0FBVyxDQUFDLENBQUM7S0FDeEIsUUFBUSxNQUNKLGNBQWMsWUFBWSxDQUFDLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyxJQUMzQyxRQUFRLFNBQVMsY0FBYyxZQUFZLENBQUMsQ0FBQyxRQUFRLE9BQU8sQ0FBQyxDQUFDO0tBQ2xFO0lBQ0YsS0FBSztLQUNILDBCQUEwQixZQUFZLEtBQUs7S0FDM0MsMEJBQTBCLFdBQVcsVUFBVTtLQUMvQyxVQUFVLFlBQVksU0FBUztLQUMvQixLQUFLLGFBQWEsT0FDaEIsSUFDRSxNQUFNLGVBQWUsU0FBUyxNQUM1QixlQUFlLE1BQU0sWUFBYSxRQUFRLGVBRTVDLFFBQVEsV0FBUjtNQUNFLEtBQUs7T0FDSCxTQUFTO09BQ1Q7TUFDRixLQUFLO09BQ0gsWUFBWTtPQUNaO01BQ0YsS0FBSztPQUNILFVBQVU7T0FDVjtNQUNGLEtBQUs7T0FDSCxJQUFJLFFBQVEsY0FDVixNQUFNLE1BQ0osOERBQ0Y7T0FDRjtNQUNGLFNBQ0UsUUFDRSxZQUNBLEtBQ0EsV0FDQSxjQUNBLE9BQ0EsSUFDRjtLQUNKO0tBQ0osc0JBQXNCLFlBQVksS0FBSztLQUN2QyxhQUFhLFlBQVksUUFBUSxXQUFXLE9BQU87S0FDbkQ7SUFDRixLQUFLO0tBQ0gsb0JBQW9CLFlBQVksS0FBSztLQUNyQyxLQUFLLFdBQVcsT0FDZCxJQUNFLE1BQU0sZUFBZSxPQUFPLE1BQzFCLFNBQVMsTUFBTSxVQUFXLFFBQVEsU0FFcEMsUUFBUSxTQUFSO01BQ0UsS0FBSztPQUNILFdBQVcsV0FDVCxVQUNBLGVBQWUsT0FBTyxVQUN0QixhQUFhLE9BQU87T0FDdEI7TUFDRixTQUNFLFFBQVEsWUFBWSxLQUFLLFNBQVMsUUFBUSxPQUFPLElBQUk7S0FDekQ7S0FDSjtJQUNGLEtBQUs7S0FDSCwwQkFBMEIsZ0JBQWdCLFVBQVU7S0FDcEQsMEJBQTBCLFVBQVUsVUFBVTtLQUM5QywwQkFBMEIsVUFBVSxVQUFVO0tBQzlDLDBCQUEwQixTQUFTLFVBQVU7S0FDN0M7SUFDRixLQUFLO0lBQ0wsS0FBSztLQUNILDBCQUEwQixRQUFRLFVBQVU7S0FDNUM7SUFDRixLQUFLO0lBQ0wsS0FBSztLQUNILEtBQUssU0FBUyxHQUFHLFNBQVMsZ0JBQWdCLFFBQVEsVUFDaEQsMEJBQTBCLGdCQUFnQixTQUFTLFVBQVU7S0FDL0Q7SUFDRixLQUFLO0tBQ0gsMEJBQTBCLFNBQVMsVUFBVTtLQUM3QywwQkFBMEIsUUFBUSxVQUFVO0tBQzVDO0lBQ0YsS0FBSztLQUNILDBCQUEwQixVQUFVLFVBQVU7S0FDOUM7SUFDRixLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUssUUFDSCwwQkFBMEIsU0FBUyxVQUFVLEdBQzNDLDBCQUEwQixRQUFRLFVBQVU7SUFDaEQsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7S0FDSCxLQUFLLGtCQUFrQixPQUNyQixJQUNFLE1BQU0sZUFBZSxjQUFjLE1BQ2pDLFNBQVMsTUFBTSxpQkFBa0IsUUFBUSxTQUUzQyxRQUFRLGdCQUFSO01BQ0UsS0FBSztNQUNMLEtBQUssMkJBQ0gsTUFBTSxNQUNKLE1BQ0UsNEZBQ0o7TUFDRixTQUNFLFFBQVEsWUFBWSxLQUFLLGdCQUFnQixRQUFRLE9BQU8sSUFBSTtLQUNoRTtLQUNKO0lBQ0YsU0FDRSxJQUFJLGdCQUFnQixHQUFHLEdBQUc7S0FDeEIsS0FBSyxjQUFjLE9BQ2pCLE1BQU0sZUFBZSxVQUFVLE1BQzNCLFNBQVMsTUFBTSxhQUNqQixLQUFLLE1BQU0sVUFDVCx1QkFDRSxZQUNBLEtBQ0EsWUFDQSxRQUNBLE9BQ0EsS0FBSyxDQUNQO0tBQ047SUFDRjtHQUNKO0dBQ0EsS0FBSyxnQkFBZ0IsT0FDbkIsTUFBTSxlQUFlLFlBQVksTUFDN0IsU0FBUyxNQUFNLGVBQ2pCLFFBQVEsVUFDTixRQUFRLFlBQVksS0FBSyxjQUFjLFFBQVEsT0FBTyxJQUFJO0VBQ2xFO0VBQ0EsU0FBUyxpQkFBaUIsWUFBWSxLQUFLLFdBQVcsV0FBVztHQUMvRCxnQ0FBZ0MsS0FBSyxTQUFTO0dBQzlDLFFBQVEsS0FBUjtJQUNFLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLLE1BQ0g7SUFDRixLQUFLO0tBQ0gsSUFBSSxPQUFPLE1BQ1QsT0FBTyxNQUNQLFFBQVEsTUFDUixlQUFlLE1BQ2YsbUJBQW1CLE1BQ25CLFVBQVUsTUFDVixpQkFBaUI7S0FDbkIsS0FBSyxXQUFXLFdBQVc7TUFDekIsSUFBSSxXQUFXLFVBQVU7TUFDekIsSUFBSSxVQUFVLGVBQWUsT0FBTyxLQUFLLFFBQVEsVUFDL0MsUUFBUSxTQUFSO09BQ0UsS0FBSyxXQUNIO09BQ0YsS0FBSyxTQUNIO09BQ0YsS0FBSyxnQkFDSCxtQkFBbUI7T0FDckIsU0FDRSxVQUFVLGVBQWUsT0FBTyxLQUM5QixRQUNFLFlBQ0EsS0FDQSxTQUNBLE1BQ0EsV0FDQSxRQUNGO01BQ047S0FDSjtLQUNBLEtBQUssSUFBSSxhQUFhLFdBQVc7TUFDL0IsSUFBSSxVQUFVLFVBQVU7TUFDeEIsV0FBVyxVQUFVO01BQ3JCLElBQ0UsVUFBVSxlQUFlLFNBQVMsTUFDakMsUUFBUSxXQUFXLFFBQVEsV0FFNUIsUUFBUSxXQUFSO09BQ0UsS0FBSztRQUNILFlBQVksYUFBYSxnQ0FBZ0MsQ0FBQztRQUMxRCxPQUFPO1FBQ1A7T0FDRixLQUFLO
158521FBQ0gsWUFBWSxhQUFhLGdDQUFnQyxDQUFDO1FBQzFELE9BQU87UUFDUDtPQUNGLEtBQUs7UUFDSCxZQUFZLGFBQWEsZ0NBQWdDLENBQUM7UUFDMUQsVUFBVTtRQUNWO09BQ0YsS0FBSztRQUNILFlBQVksYUFBYSxnQ0FBZ0MsQ0FBQztRQUMxRCxpQkFBaUI7UUFDakI7T0FDRixLQUFLO1FBQ0gsWUFBWSxhQUFhLGdDQUFnQyxDQUFDO1FBQzFELFFBQVE7UUFDUjtPQUNGLEtBQUs7UUFDSCxZQUFZLGFBQWEsZ0NBQWdDLENBQUM7UUFDMUQsZUFBZTtRQUNmO09BQ0YsS0FBSztPQUNMLEtBQUs7UUFDSCxJQUFJLFFBQVEsU0FDVixNQUFNLE1BQ0osTUFDRSw0RkFDSjtRQUNGO09BQ0YsU0FDRSxZQUFZLFlBQ1YsUUFDRSxZQUNBLEtBQ0EsV0FDQSxTQUNBLFdBQ0EsUUFDRjtNQUNOO0tBQ0o7S0FDQSxNQUNFLGVBQWUsVUFBVSxRQUFRLFlBQVksVUFBVSxPQUNuRCxRQUFRLFVBQVUsVUFDbEIsUUFBUSxVQUFVO0tBQ3hCLFlBQ0UsZUFBZSxVQUFVLFFBQVEsWUFBWSxVQUFVLE9BQ25ELFFBQVEsVUFBVSxVQUNsQixRQUFRLFVBQVU7S0FDeEIsT0FDRSxDQUFDLGFBQ0Qsb0NBQ0MsUUFBUSxNQUNQLG9VQUNGLEdBQ0Msa0NBQWtDLENBQUM7S0FDdEMsQ0FBQyxPQUNDLGFBQ0Esb0NBQ0MsUUFBUSxNQUNQLDZUQUNGLEdBQ0Msa0NBQWtDLENBQUM7S0FDdEMsWUFDRSxZQUNBLE9BQ0EsY0FDQSxrQkFDQSxTQUNBLGdCQUNBLE1BQ0EsSUFDRjtLQUNBO0lBQ0YsS0FBSztLQUNILFVBQVUsUUFBUSxlQUFlLFlBQVk7S0FDN0MsS0FBSyxRQUFRLFdBQ1gsSUFDSSxtQkFBbUIsVUFBVSxPQUMvQixVQUFVLGVBQWUsSUFBSSxLQUFLLFFBQVEsa0JBRTFDLFFBQVEsTUFBUjtNQUNFLEtBQUssU0FDSDtNQUNGLEtBQUssWUFDSCxVQUFVO01BQ1osU0FDRSxVQUFVLGVBQWUsSUFBSSxLQUMzQixRQUNFLFlBQ0EsS0FDQSxNQUNBLE1BQ0EsV0FDQSxnQkFDRjtLQUNOO0tBQ0osS0FBSyxRQUFRLFdBQ1gsSUFDSSxPQUFPLFVBQVUsT0FDbEIsbUJBQW1CLFVBQVUsT0FDOUIsVUFBVSxlQUFlLElBQUksTUFDMUIsUUFBUSxRQUFRLFFBQVEsbUJBRTNCLFFBQVEsTUFBUjtNQUNFLEtBQUs7T0FDSCxTQUFTLHFCQUNOLGdDQUFnQyxDQUFDO09BQ3BDLFlBQVk7T0FDWjtNQUNGLEtBQUs7T0FDSCxTQUFTLHFCQUNOLGdDQUFnQyxDQUFDO09BQ3BDLGVBQWU7T0FDZjtNQUNGLEtBQUssWUFDSCxTQUFTLHFCQUNOLGdDQUFnQyxDQUFDLElBQ2pDLFFBQVE7TUFDYixTQUNFLFNBQVMsb0JBQ1AsUUFDRSxZQUNBLEtBQ0EsTUFDQSxNQUNBLFdBQ0EsZ0JBQ0Y7S0FDTjtLQUNKLFlBQVk7S0FDWixNQUFNO0tBQ04sWUFBWTtLQUNaLFFBQVEsWUFDSixjQUFjLFlBQVksQ0FBQyxDQUFDLEtBQUssV0FBVyxDQUFDLENBQUMsSUFDOUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFFBQ2pCLFFBQVEsWUFDTCxjQUFjLFlBQVksQ0FBQyxDQUFDLEtBQUssV0FBVyxDQUFDLENBQUMsSUFDOUMsY0FBYyxZQUFZLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO0tBQzFEO0lBQ0YsS0FBSztLQUNILFVBQVUsWUFBWTtLQUN0QixLQUFLLGdCQUFnQixXQUNuQixJQUNJLE9BQU8sVUFBVSxlQUNuQixVQUFVLGVBQWUsWUFBWSxLQUNuQyxRQUFRLFFBQ1IsQ0FBQyxVQUFVLGVBQWUsWUFBWSxHQUV4QyxRQUFRLGNBQVI7TUFDRSxLQUFLLFNBQ0g7TUFDRixLQUFLLFlBQ0g7TUFDRixTQUNFLFFBQVEsWUFBWSxLQUFLLGNBQWMsTUFBTSxXQUFXLElBQUk7S0FDaEU7S0FDSixLQUFLLFNBQVMsV0FDWixJQUNJLE9BQU8sVUFBVSxRQUNsQixPQUFPLFVBQVUsUUFDbEIsVUFBVSxlQUFlLEtBQUssTUFBTSxRQUFRLFFBQVEsUUFBUSxPQUU1RCxRQUFRLE9BQVI7TUFDRSxLQUFLO09BQ0gsU0FBUyxTQUFTLGdDQUFnQyxDQUFDO09BQ25ELFlBQVk7T0FDWjtNQUNGLEtBQUs7T0FDSCxTQUFTLFNBQVMsZ0NBQWdDLENBQUM7T0FDbkQsVUFBVTtPQUNWO01BQ0YsS0FBSyxZQUNIO01BQ0YsS0FBSztPQUNILElBQUksUUFBUSxNQUNWLE1BQU0sTUFDSiw4REFDRjtPQUNGO01BQ0YsU0FDRSxTQUFTLFFBQ1AsUUFBUSxZQUFZLEtBQUssT0FBTyxNQUFNLFdBQVcsSUFBSTtLQUMzRDtLQUNKLGVBQWUsWUFBWSxXQUFXLE9BQU87S0FDN0M7SUFDRixLQUFLO0tBQ0gsS0FBSyxJQUFJLGNBQWMsV0FDckIsSUFDSSxZQUFZLFVBQVUsYUFDeEIsVUFBVSxlQUFlLFVBQVUsS0FDakMsUUFBUSxhQUNSLENBQUMsVUFBVSxlQUFlLFVBQVUsR0FFdEMsUUFBUSxZQUFSO01BQ0UsS0FBSztPQUNILFdBQVcsV0FBVyxDQUFDO09BQ3ZCO01BQ0YsU0FDRSxRQUNFLFlBQ0EsS0FDQSxZQUNBLE1BQ0EsV0FDQSxTQUNGO0tBQ0o7S0FDSixLQUFLLG9CQUFvQixXQUN2QixJQUNJLFlBQVksVUFBVSxtQkFDdkIsVUFBVSxVQUFVLG1CQUNyQixVQUFVLGVBQWUsZ0JBQWdCLEtBQ3ZDLGNBQWMsWUFDYixRQUFRLGFBQWEsUUFBUSxVQUVoQyxRQUFRLGtCQUFSO01BQ0UsS0FBSztPQUNILGNBQWMsWUFBWSxnQ0FBZ0MsQ0FBQztPQUMzRCxXQUFXLFdBQ1QsYUFDQSxlQUFlLE9BQU8sYUFDdEIsYUFBYSxPQUFPO09BQ3RCO01BQ0YsU0FDRSxRQUNFLFlBQ0EsS0FDQSxrQkFDQSxXQUNBLFdBQ0EsT0FDRjtLQUNKO0tBQ0o7SUFDRixLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7S0FDSCxLQUFLLElBQUksY0FBYyxXQUNyQixZQUFhLFVBQVUsYUFDckIsVUFBVSxlQUFlLFVBQVUsS0FDakMsUUFBUSxhQUNSLENBQUMsVUFBVSxlQUFlLFVBQVUsS0FDcEMsUUFDRSxZQUNBLEtBQ0EsWUFDQSxNQUNBLFdBQ0EsU0FDRjtLQUNOLEtBQUssV0FBVyxXQUNkLElBQ0ksWUFBWSxVQUFVLFVBQ3ZCLFVBQVUsVUFBVSxVQUNyQixVQUFVLGVBQWUsT0FBTyxLQUM5QixjQUFjLFlBQ2IsUUFBUSxhQUFhLFFBQVEsVUFFaEMsUUFBUSxTQUFSO01BQ0UsS0FBSztNQUNMLEtBQUs7T0FDSCxJQUFJLFFBQVEsV0FDVixNQUFNLE1BQ0osTUFDRSw0RkFDSjtPQUNGO01BQ0YsU0FDRSxRQUNFLFlBQ0EsS0FDQSxTQUNBLFdBQ0EsV0FDQSxPQUNGO0tBQ0o7S0FDSjtJQUNGLFNBQ0UsSUFBSSxnQkFBZ0IsR0FBRyxHQU
15852FHO0tBQ3hCLEtBQUssSUFBSSxjQUFjLFdBQ3JCLFlBQWEsVUFBVSxhQUNyQixVQUFVLGVBQWUsVUFBVSxLQUNqQyxLQUFLLE1BQU0sYUFDWCxDQUFDLFVBQVUsZUFBZSxVQUFVLEtBQ3BDLHVCQUNFLFlBQ0EsS0FDQSxZQUNBLEtBQUssR0FDTCxXQUNBLFNBQ0Y7S0FDTixLQUFLLGtCQUFrQixXQUNyQixZQUFhLFVBQVUsaUJBQ3BCLFVBQVUsVUFBVSxpQkFDckIsQ0FBQyxVQUFVLGVBQWUsY0FBYyxLQUN0QyxjQUFjLFdBQ2IsS0FBSyxNQUFNLGFBQWEsS0FBSyxNQUFNLFdBQ3BDLHVCQUNFLFlBQ0EsS0FDQSxnQkFDQSxXQUNBLFdBQ0EsT0FDRjtLQUNOO0lBQ0Y7R0FDSjtHQUNBLEtBQUssSUFBSSxjQUFjLFdBQ3JCLFlBQWEsVUFBVSxhQUNyQixVQUFVLGVBQWUsVUFBVSxLQUNqQyxRQUFRLGFBQ1IsQ0FBQyxVQUFVLGVBQWUsVUFBVSxLQUNwQyxRQUFRLFlBQVksS0FBSyxZQUFZLE1BQU0sV0FBVyxTQUFTO0dBQ3JFLEtBQUssWUFBWSxXQUNmLFlBQWEsVUFBVSxXQUNwQixVQUFVLFVBQVUsV0FDckIsQ0FBQyxVQUFVLGVBQWUsUUFBUSxLQUNoQyxjQUFjLFdBQ2IsUUFBUSxhQUFhLFFBQVEsV0FDOUIsUUFBUSxZQUFZLEtBQUssVUFBVSxXQUFXLFdBQVcsT0FBTztFQUN4RTtFQUNBLFNBQVMsNkJBQTZCLFVBQVU7R0FDOUMsUUFBUSxVQUFSO0lBQ0UsS0FBSyxTQUNILE9BQU87SUFDVCxLQUFLLE9BQ0gsT0FBTztJQUNULFNBQ0UsT0FBTztHQUNYO0VBQ0Y7RUFDQSxTQUFTLDJCQUEyQixZQUFZO0dBQzlDLEtBQ0UsSUFBSSwwQkFBMEIsQ0FBQyxHQUFHLFFBQVEsV0FBVyxPQUFPLElBQUksR0FDaEUsSUFBSSxNQUFNLFFBQ1YsS0FDQTtJQUNBLElBQUksWUFBWSxNQUFNO0lBQ3RCLDJCQUE0QixhQUMxQiw2QkFBNkIsVUFBVSxNQUN0Qyx3QkFBd0IsYUFDdkIsTUFBTSxpQkFBaUIsU0FBUztHQUN0QztHQUNBLE9BQU87RUFDVDtFQUNBLFNBQVMsbUJBQW1CLFlBQVksZ0JBQWdCLG1CQUFtQjtHQUN6RSxJQUFJLFFBQVEsa0JBQWtCLGFBQWEsT0FBTyxnQkFDaEQsUUFBUSxNQUNOLHNKQUNGO1FBQ0c7SUFDSCxJQUFJO0lBQ0osSUFBSSxZQUFhLGNBQWMsSUFDN0I7SUFDRixLQUFLLGFBQWEsZ0JBQ2hCLElBQUksZUFBZSxlQUFlLFNBQVMsR0FBRztLQUM1QyxJQUFJLFFBQVEsZUFBZTtLQUMzQixRQUFRLFNBQ04sY0FBYyxPQUFPLFNBQ3JCLE9BQU8sVUFDTixNQUFNLFVBQVUsUUFBUSxJQUFJLEtBQ3hCLCtCQUErQixPQUFPLFNBQVMsR0FDL0MsZUFDQyxZQUFZLFlBQVksT0FBTyxLQUFLLE1BQUEsQ0FBTyxLQUFLLEtBQ2xELGFBQWEsT0FBTyxTQUNsQixNQUFNLFNBQ04sZ0JBQWdCLElBQUksU0FBUyxLQUM1QiwrQkFBK0IsT0FBTyxTQUFTLEdBQy9DLGVBQ0MsWUFDQSxVQUNHLFFBQVEsa0JBQWtCLEtBQUssQ0FBQyxDQUNoQyxZQUFZLENBQUMsQ0FDYixRQUFRLGFBQWEsTUFBTSxJQUM5QixPQUNDLEtBQUssTUFBQSxDQUFPLEtBQUssS0FDbkIsZUFDQyxZQUNBLFVBQ0csUUFBUSxrQkFBa0IsS0FBSyxDQUFDLENBQ2hDLFlBQVksQ0FBQyxDQUNiLFFBQVEsYUFBYSxNQUFNLElBQzlCLE1BQ0EsUUFDQSxNQUNQLFlBQVk7SUFDakI7SUFDRixjQUFjLGVBQWU7SUFDN0IsaUJBQWlCLFdBQVcsYUFBYSxPQUFPO0lBQ2hELG1CQUFtQixnQkFDZixjQUFjLGtDQUFrQyxXQUFXLEdBQzVELGlCQUFpQixrQ0FBa0MsY0FBYyxHQUNsRSxtQkFBbUIsZUFDaEIsUUFBUSxlQUFlLGVBQWUsU0FBUyxNQUM5QyxrQkFBa0IsVUFBVSxNQUM3QixrQkFBa0IsUUFBUSwyQkFBMkIsVUFBVTtHQUN0RTtFQUNGO0VBQ0EsU0FBUyxpQkFDUCxZQUNBLFNBQ0EsZUFDQSxPQUNBLGlCQUNBLG1CQUNBO0dBQ0EsZ0JBQWdCLE9BQU8sYUFBYTtHQUNwQyxhQUFhLFdBQVcsYUFBYSxhQUFhO0dBQ2xELElBQUksU0FBUyxZQUNYLFFBQVEsT0FBTyxPQUFmO0lBQ0UsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSyxXQUNIO0dBQ0o7UUFDRyxJQUFJLFFBQVEsT0FDZixRQUFRLE9BQU8sT0FBZjtJQUNFLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSyxXQUNIO0lBQ0YsU0FDRSxJQUNHLDZCQUE2QixPQUFPLE9BQU8sR0FDNUMsZUFBZSxLQUFLLE9BRXBCO0dBQ047R0FDRixzQkFBc0IsU0FBUyxZQUFZLE9BQU8saUJBQWlCO0VBQ3JFO0VBQ0EsU0FBUyx3QkFDUCxZQUNBLFNBQ0EsZUFDQSxPQUNBLGlCQUNBLG1CQUNBO0dBQ0EsZ0JBQWdCLE9BQU8sYUFBYTtHQUNwQyxhQUFhLFdBQVcsYUFBYSxhQUFhO0dBQ2xELElBQUksU0FBUyxZQUFZO0lBQ3ZCLFFBQVEsT0FBTyxPQUFmO0tBQ0UsS0FBSztLQUNMLEtBQUssVUFDSDtJQUNKO0lBQ0EsSUFBSSxDQUFDLE9BQU87R0FDZCxPQUNFLFFBQVEsT0FBTyxPQUFmO0lBQ0UsS0FBSztJQUNMLEtBQUssVUFDSDtJQUNGLFNBQ0UsSUFBSSxPQUFPO0dBQ2Y7R0FDRixzQkFBc0IsU0FBUyxZQUFZLE9BQU8saUJBQWlCO0VBQ3JFO0VBQ0EsU0FBUywyQkFDUCxZQUNBLFNBQ0EsZUFDQSxPQUNBLGlCQUNBLG1CQUNBO0dBQ0EsZ0JBQWdCLE9BQU8sYUFBYTtHQUNwQyxhQUFhLFdBQVcsYUFBYSxhQUFhO0dBQ2xELElBQUksU0FBUyxZQUNYLFFBQVEsT0FBTyxPQUFmO0lBQ0UsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLLFVBQ0g7R0FDSjtRQUNHLElBQUksUUFBUSxPQUNmLFFBQVEsT0FBTyxPQUFmO0lBQ0UsS0FBSztJQUNMLEtBQUssVUFDSDtJQUNGLFNBQ0UsSUFDRyw2QkFBNkIsT0FBTyxhQUFhLEd
15852BQ2xELGVBQWUsS0FBSyxPQUVwQjtHQUNOO0dBQ0Ysc0JBQXNCLFNBQVMsWUFBWSxPQUFPLGlCQUFpQjtFQUNyRTtFQUNBLFNBQVMsd0JBQ1AsWUFDQSxTQUNBLGVBQ0EsT0FDQSxpQkFDQSxtQkFDQTtHQUNBLGdCQUFnQixPQUFPLGFBQWE7R0FDcEMsYUFBYSxXQUFXLGFBQWEsYUFBYTtHQUNsRCxJQUFJLFNBQVMsWUFDWCxRQUFRLE9BQU8sT0FBZjtJQUNFLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUssV0FDSDtJQUNGLFNBQ0UsSUFBSSxNQUFNLEtBQUssR0FBRztHQUN0QjtRQUNHLElBQUksUUFBUSxPQUNmLFFBQVEsT0FBTyxPQUFmO0lBQ0UsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLLFdBQ0g7SUFDRixTQUNFLElBQ0UsQ0FBQyxNQUFNLEtBQUssTUFDWCw2QkFBNkIsT0FBTyxPQUFPLEdBQzVDLGVBQWUsS0FBSyxRQUVwQjtHQUNOO0dBQ0Ysc0JBQXNCLFNBQVMsWUFBWSxPQUFPLGlCQUFpQjtFQUNyRTtFQUNBLFNBQVMsMEJBQ1AsWUFDQSxTQUNBLGVBQ0EsT0FDQSxpQkFDQSxtQkFDQTtHQUNBLGdCQUFnQixPQUFPLGFBQWE7R0FDcEMsYUFBYSxXQUFXLGFBQWEsYUFBYTtHQUNsRCxJQUFJLFNBQVMsWUFDWCxRQUFRLE9BQU8sT0FBZjtJQUNFLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUssV0FDSDtHQUNKO1FBQ0csSUFBSSxRQUFRLE9BQ2YsUUFBUSxPQUFPLE9BQWY7SUFDRSxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUssV0FDSDtJQUNGLFNBQ0UsSUFDRyw2QkFBNkIsT0FBTyxPQUFPLEdBQzNDLGdCQUFnQixZQUFZLEtBQUssS0FBSyxHQUN2QyxlQUFlLGVBRWY7R0FDTjtHQUNGLHNCQUFzQixTQUFTLFlBQVksT0FBTyxpQkFBaUI7RUFDckU7RUFDQSxTQUFTLHVCQUF1QixZQUFZLEtBQUssT0FBTyxhQUFhO0dBQ25FLEtBQ0UsSUFBSSxvQkFBb0IsQ0FBQyxHQUN2QixrQ0FBa0IsSUFBSSxJQUFJLEdBQzFCLGFBQWEsV0FBVyxZQUN4QixJQUFJLEdBQ04sSUFBSSxXQUFXLFFBQ2YsS0FFQSxRQUFRLFdBQVcsRUFBRSxDQUFDLEtBQUssWUFBWSxHQUF2QztJQUNFLEtBQUssU0FDSDtJQUNGLEtBQUssV0FDSDtJQUNGLEtBQUssWUFDSDtJQUNGLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUssa0JBQ0g7SUFDRixTQUNFLGdCQUFnQixJQUFJLFdBQVcsRUFBRSxDQUFDLElBQUk7R0FDMUM7R0FDRixJQUFJLGdCQUFnQixHQUFHLEdBQ2hCO1NBQUEsSUFBSSxXQUFXLE9BQ2xCLElBQUksTUFBTSxlQUFlLE9BQU8sR0FBRztLQUNqQyxJQUFJLFFBQVEsTUFBTTtLQUNsQixJQUFJLFFBQVEsT0FDVjtNQUFJLElBQUEsNkJBQTZCLGVBQWUsT0FBTyxHQUNyRCxlQUFlLE9BQU8sU0FDcEIsNEJBQTRCLFNBQVMsS0FBSztXQUN6QyxJQUFJLENBQUMsTUFBTSxNQUFNLDBCQUNwQixRQUFRLFNBQVI7T0FDRSxLQUFLO1FBQ0gsYUFBYyxPQUFPLFNBQVMsYUFBYSxPQUFPLFNBQ2hELHNCQUNFLFlBQ0EsV0FBVyxhQUNYLE9BQ0EsaUJBQ0Y7UUFDRjtPQUNGLEtBQUs7T0FDTCxLQUFLO09BQ0wsS0FBSztPQUNMLEtBQUs7T0FDTCxLQUFLO09BQ0wsS0FBSyxPQUNIO09BQ0YsS0FBSztRQUNILGFBQWEsV0FBVztRQUN4QixRQUFRLFFBQVEsTUFBTSxTQUFTLEtBQUs7UUFDcEMsUUFBUSxVQUNKLFFBQVEsY0FBYyxZQUFZLEtBQUssR0FDekMsc0JBQ0UsU0FDQSxZQUNBLE9BQ0EsaUJBQ0Y7UUFDRjtPQUNGLEtBQUs7UUFDSCxnQkFBZ0IsT0FBTyxPQUFPO1FBQzlCLG1CQUFtQixZQUFZLE9BQU8saUJBQWlCO1FBQ3ZEO09BQ0YsS0FBSztPQUNMLEtBQUs7T0FDTCxLQUFLO09BQ0wsS0FBSztPQUNMLEtBQUs7T0FDTCxLQUFLO09BQ0wsS0FBSztPQUNMLEtBQUs7UUFDSCxnQkFBZ0IsT0FBTyxRQUFRLFlBQVksQ0FBQztRQUM1QyxRQUFRLE1BQ04saUVBQ0EsT0FDRjtRQUNBO09BQ0YsS0FBSztRQUNILGdCQUFnQixPQUFPLE9BQU87UUFDOUIsYUFBYSxzQ0FDWCxZQUNBLFNBQ0EsS0FDRjtRQUNBLHNCQUNFLGFBQ0EsWUFDQSxPQUNBLGlCQUNGO1FBQ0E7T0FDRixTQUNFLFlBQVksWUFBWSw0QkFDeEIsVUFBVSxPQUNWLFdBQVcsTUFDUCxnQkFBZ0IsT0FBTyxRQUFRLFlBQVksQ0FBQyxJQUM1QyxnQkFBZ0IsT0FBTyxPQUFPLEdBQy9CLGFBQWEsc0NBQ1osWUFDQSxTQUNBLEtBQ0YsR0FDQSxzQkFDRSxTQUNBLFlBQ0EsT0FDQSxpQkFDRjtNQUNOOztJQUNOO1VBR0YsS0FBSyxTQUFTLE9BQ1osSUFDRSxNQUFNLGVBQWUsS0FBSyxNQUN4QixVQUFVLE1BQU0sUUFBUyxRQUFRLFVBRW5DO0lBQUksSUFBQSw2QkFBNkIsZUFBZSxLQUFLLEdBQ25ELGVBQWUsT0FBTyxXQUNwQiw0QkFBNEIsT0FBTyxPQUFPO1NBQ3pDLElBQUksQ0FBQyxNQUFNLE1BQU0sMEJBQ3BCLFFBQVEsT0FBUjtLQUNFLEtBQUs7TUFDSCxhQUFjLE9BQU8sV0FDbkIsYUFBYSxPQUFPLFdBQ3BCLHNCQUNFLFlBQ0EsV0FBVyxhQUNYLFNBQ0EsaUJBQ0Y7TUFDRjtLQUNGLEtBQUs7S0FDTCxLQUFLO0tBQ0wsS0FBSztLQUNMLEtBQUs7S0FDTCxLQUFLO0tBQ0wsS0FBSztLQUNMLEtBQUs7S0FDTCxLQUFLO0tBQ0wsS0FBSyxPQUNIO0tBQ0YsS0FBSztNQUNILGFBQWEsV0FBVztNQUN4QixVQUFVLFVBQVUsUUFBUSxTQUFTLEtBQUs7TUFDMUMsUUFBUSxZQUNKLFVBQVUsY0FBYyxZQUFZLE9BQU8sR0FDN0MsZUFBZSxZQUNaLGtCQUFrQixTQUFTLEVBQUUsUUFBUSxXQUFXO01BQ3JEO0tBQ0YsS0FBSztNQUNILGlCQUNFLFlBQ0EsT0FDQSxTQUNBLFNBQ0EsaUJBQ0EsaUJBQ0Y7TUFDQTtLQUNGLEtBQUs7TUFDSCxpQkFDRSxZQUNBLE9BQ0EsWUFDQSxTQUNBLGlCQUNBLGlCQUNGO01BQ0E7S0FDRixLQUFLO01BQ0gsZ0JBQWdCLE9BQU8sS0FBSztNQUM1QixtQkFBbUIsWUFBWSxTQUFTLGlCQUFpQjtNQUN6RDtLQUNGLEtBQUs7TUFDSCxnQkFBZ0IsT0FBTyxLQUFLO01BQzVCLHNCQUNFLE9BQ0EsV0FBVyxVQUNYLFNBQ0EsaUJBQ0Y7TUFDQTtLQUNGLEtBQUs7TUFDSCxnQkFBZ0IsT0FBTyxLQUFLO01BQzVCLHNCQUNFLE9BQ0EsV0FBVyxPQUNYLFNBQ0EsaUJBQ0Y7TUFDQTtLQUNGLEtBQUs7TUFDSCxnQkFBZ0IsT0FBTyxXQUFXO01BQ2xDLHNCQUNFLE9BQ0EsV0FBVyxXQUNYLFNBQ0EsaUJBQ0Y7TUFDQTtLQUNGLEtBQUssUUFDSCxJQUFJLGFBQWEsS0FBSztNQUNwQixnQkFBZ0IsT0FBTyxLQUFLO01BQzVCLGFBQWEsV0FBVyxhQU
15852FhLE1BQU07TUFDM0Msc0JBQ0UsT0FDQSxZQUNBLFNBQ0EsaUJBQ0Y7TUFDQTtLQUNGO0tBQ0YsS0FBSztLQUNMLEtBQUs7TUFDSCxJQUNFLEVBQ0UsT0FBTyxXQUNOLFFBQVEsT0FBTyxXQUFXLFNBQzFCLGFBQWEsT0FBTyxXQUFXLFFBRWxDO09BQ0EsVUFBVSxRQUNOLFFBQVEsTUFDTiw0T0FDQSxPQUNBLEtBQ0YsSUFDQSxRQUFRLE1BQ04sOEpBQ0EsT0FDQSxLQUNGO09BQ0o7TUFDRjtNQUNBLDBCQUNFLFlBQ0EsT0FDQSxPQUNBLFNBQ0EsaUJBQ0EsaUJBQ0Y7TUFDQTtLQUNGLEtBQUs7S0FDTCxLQUFLO01BQ0gsYUFBYSxXQUFXLGFBQWEsS0FBSztNQUMxQyxJQUFJLGVBQWUsT0FBTyxTQUFTO09BQ2pDLGdCQUFnQixPQUFPLE1BQU0sWUFBWSxDQUFDO09BQzFDLGlCQUFpQixTQUNaLGdCQUFnQixPQUFPLE1BQU0sR0FDOUIsZ0JBQWdCLE9BQU8sYUFBYSxHQUNwQyxnQkFBZ0IsT0FBTyxZQUFZLEdBQ25DLGdCQUFnQixPQUFPLFlBQVksTUFDbEMsZ0JBQWdCLE9BQU8sU0FBUyxHQUNqQyxnQkFBZ0IsT0FBTyxRQUFRLEdBQy9CLGdCQUFnQixPQUFPLFFBQVE7T0FDbkM7TUFDRixPQUFPLElBQUksZUFBZSwwQkFBMEI7T0FDbEQsZ0JBQWdCLE9BQU8sTUFBTSxZQUFZLENBQUM7T0FDMUMsc0JBQ0UsT0FDQSxZQUNBLFNBQ0EsaUJBQ0Y7T0FDQTtNQUNGO01BQ0EsMEJBQ0UsWUFDQSxPQUNBLE1BQU0sWUFBWSxHQUNsQixTQUNBLGlCQUNBLGlCQUNGO01BQ0E7S0FDRixLQUFLO01BQ0gsMEJBQ0UsWUFDQSxPQUNBLGNBQ0EsU0FDQSxpQkFDQSxpQkFDRjtNQUNBO0tBQ0YsS0FBSztNQUNILDJCQUNFLFlBQ0EsT0FDQSxtQkFDQSxTQUNBLGlCQUNBLGlCQUNGO01BQ0E7S0FDRixLQUFLO01BQ0gsMkJBQ0UsWUFDQSxPQUNBLGNBQ0EsU0FDQSxpQkFDQSxpQkFDRjtNQUNBO0tBQ0YsS0FBSztLQUNMLEtBQUs7S0FDTCxLQUFLO0tBQ0wsS0FBSztLQUNMLEtBQUs7TUFDSCwyQkFDRSxZQUNBLE9BQ0EsT0FDQSxTQUNBLGlCQUNBLGlCQUNGO01BQ0E7S0FDRixLQUFLO0tBQ0wsS0FBSztLQUNMLEtBQUs7S0FDTCxLQUFLO0tBQ0wsS0FBSztLQUNMLEtBQUs7S0FDTCxLQUFLO0tBQ0wsS0FBSztLQUNMLEtBQUs7S0FDTCxLQUFLO0tBQ0wsS0FBSztLQUNMLEtBQUs7S0FDTCxLQUFLO0tBQ0wsS0FBSztLQUNMLEtBQUs7S0FDTCxLQUFLO0tBQ0wsS0FBSztLQUNMLEtBQUs7S0FDTCxLQUFLO0tBQ0wsS0FBSztLQUNMLEtBQUs7S0FDTCxLQUFLO0tBQ0wsS0FBSztNQUNILHdCQUNFLFlBQ0EsT0FDQSxNQUFNLFlBQVksR0FDbEIsU0FDQSxpQkFDQSxpQkFDRjtNQUNBO0tBQ0YsS0FBSztLQUNMLEtBQUs7TUFDSCxHQUFHO09BQ0QsSUFBSTtPQUNKLElBQUksZ0JBQWlCLGFBQWEsT0FDaEMsNkJBQTZCO09BQy9CLGdCQUFnQixPQUFPLGFBQWE7T0FDcEMsSUFBSSxFQUFFLGFBQWEsYUFBYTtPQUNoQyxJQUFJLFNBQVMsR0FDWCxRQUFRLE9BQU8sU0FBZjtRQUNFLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSyxVQUNILE1BQU07UUFDUixTQUNFLElBQUksQ0FBQyxNQUFNLFNBQVMsTUFBTTtPQUM5QjtZQUNHLElBQUksUUFBUSxTQUNmLFFBQVEsT0FBTyxTQUFmO1FBQ0UsS0FBSztRQUNMLEtBQUssVUFDSDtRQUNGLEtBQUs7U0FDSCxJQUFJLENBQUMsTUFBTSxXQUFXLE9BQU8sR0FBRyxNQUFNO1NBQ3RDO1FBQ0YsU0FDRSxJQUNHLDZCQUE2QixTQUFTLFVBQVUsR0FDakQsTUFBTSxLQUFLLFNBRVgsTUFBTTtPQUNaO09BQ0Ysc0JBQ0UsWUFDQSxHQUNBLFNBQ0EsMEJBQ0Y7TUFDRjtNQUNBO0tBQ0YsS0FBSztLQUNMLEtBQUs7S0FDTCxLQUFLO0tBQ0wsS0FBSztNQUNILEdBQUc7T0FDRCxJQUFJO09BQ0osZ0JBQWdCLGFBQWE7T0FDN0IsNkJBQTZCO09BQzdCLGdCQUFnQixPQUFPLGFBQWE7T0FDcEMsSUFBSSxFQUFFLGFBQWEsYUFBYTtPQUNoQyxJQUFJLFNBQVMsR0FDWCxRQUFRLE9BQU8sU0FBZjtRQUNFLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUssV0FDSCxNQUFNO1FBQ1IsU0FDRSxJQUFJLE1BQU0sT0FBTyxLQUFLLElBQUksU0FBUyxNQUFNO09BQzdDO1lBQ0csSUFBSSxRQUFRLFNBQ2YsUUFBUSxPQUFPLFNBQWY7UUFDRSxLQUFLO1FBQ0wsS0FBSztRQUNMLEtBQUssV0FDSDtRQUNGLFNBQ0UsSUFDRSxFQUFFLE1BQU0sT0FBTyxLQUFLLElBQUksYUFDdkIsNkJBQTZCLFNBQVMsVUFBVSxHQUNqRCxNQUFNLEtBQUssVUFFWCxNQUFNO09BQ1o7T0FDRixzQkFDRSxZQUNBLEdBQ0EsU0FDQSwwQkFDRjtNQUNGO01BQ0E7S0FDRixLQUFLO01BQ0gsd0JBQ0UsWUFDQSxPQUNBLFdBQ0EsU0FDQSxpQkFDQSxpQkFDRjtNQUNBO0tBQ0YsS0FBSztNQUNILHdCQUNFLFlBQ0EsT0FDQSxPQUNBLFNBQ0EsaUJBQ0EsaUJBQ0Y7TUFDQTtLQUNGLEtBQUs7TUFDSCxpQkFDRSxZQUNBLE9BQ0EsWUFDQSxTQUNBLGlCQUNBLGlCQUNGO01BQ0E7S0FDRixLQUFLO01BQ0gsaUJBQ0UsWUFDQSxPQUNBLGlCQUNBLFNBQ0EsaUJBQ0EsaUJBQ0Y7TUFDQTtLQUNGLEtBQUs7TUFDSCxpQkFDRSxZQUNBLE9BQ0EsaUJBQ0EsU0FDQSxpQkFDQSxpQkFDRjtNQUNBO0tBQ0YsS0FBSztNQUNILGlCQUNFLFlBQ0EsT0FDQSxjQUNBLFNBQ0EsaUJBQ0EsaUJBQ0Y7TUFDQTtLQUNGLEtBQUs7TUFDSCxpQkFDRSxZQUNBLE9BQ0EsY0FDQSxTQUNBLGlCQUNBLGlCQUNGO01BQ0E7S0FDRixLQUFLO01BQ0gsaUJBQ0UsWUFDQSxPQUNBLGVBQ0EsU0FDQSxpQkFDQSxpQkFDRjtNQUNBO0tBQ0YsS0FBSztNQUNILGlCQUNFLFlBQ0EsT0FDQSxjQUNBLFNBQ0EsaUJBQ0EsaUJBQ0Y7TUFDQTtLQUNGLEtBQUs7TUFDSCxpQkFDRSxZQUNBLE9BQ0EsWUFDQSxTQUNBLGlCQUNBLGlCQUNGO01BQ0E7S0FDRixLQUFLO01BQ0gsaUJBQ0UsWUFDQSxPQUNBLFlBQ0EsU0FDQSxpQkFDQSxpQkFDRjtNQUNBO0tBQ0YsS0FBSztNQUNILGlCQUNFLFlBQ0EsT0FDQSxhQUNBLFNBQ0EsaUJBQ0EsaUJBQ0Y7TUFDQTtLQUNGLEtBQUs7TUFDSCxPQUFPLFdBQ0wsd0NBQXdDLFdBQ3RDLHdDQUF3QyxTQUFTLENBQUMsR0FDcEQsUUFBUSxNQUNOLHNRQUNBLEtBQ0Y7TUFDRix3QkFDRSxZQUNBLE9BQ0EsT0FDQSxTQUNBLGlCQUNBLGlCQUNGO01BQ0E7S0FDRixTQUNFLElBQ0UsRUFBRSxJQUFJLE1BQU0sV0FDWCxRQUFRLE1BQU0sTUFBTSxRQUFRLE1BQU0sTUFDbEMsUUFBUSxNQUFNLE1BQU0sUUFBUSxNQUFNLElBQ25DO01BQ0EsSUFBSSxrQkFBa0IsS0FBSztNQUMzQixhQUFhLENBQUM7T
15852UFDZCxZQUFZLFlBQVksNEJBQ3hCLFVBQVUsT0FDVixXQUFXLE1BQ1AsZ0JBQWdCLE9BQU8sRUFBRSxZQUFZLENBQUMsS0FDcEMsZ0JBQWdCLE1BQU0sWUFBWSxHQUNuQyxnQkFBZ0Isc0JBQXNCLGVBQ3JDLGFBQ0YsSUFDSSxzQkFBc0Isa0JBQWtCLE9BQ3hDLE1BQ0osU0FBUyxpQkFDUCxrQkFBa0IsVUFDaEIsYUFBYSxDQUFDLEdBQ2hCLGdCQUFnQixPQUFPLGFBQWEsSUFDdEMsZ0JBQWdCLE9BQU8sQ0FBQztNQUM1QixHQUFHLElBQ0MsZ0JBQWdCLFlBQ2pCLDZCQUE2QixHQUM3QixJQUFJLFNBQ0wsb0JBQW9CLDBCQUEwQixHQUU5QyxJQUNFLGNBQWMsYUFBYSwwQkFBMEIsR0FFckQsZ0JBQ0UsWUFBWSwyQkFBMkIsWUFBWSxJQUMvQyxjQUFjLFFBQ2QsY0FBYyxhQUNaLDBCQUNGLEdBQ0osNkJBQ0UsR0FDQSwwQkFDRixHQUNDLElBQUksa0JBQWtCLEtBQUssSUFBSSxJQUFJO1dBQ25DO09BQ0gsUUFBUSxPQUFPLEdBQWY7UUFDRSxLQUFLO1FBQ0wsS0FBSyxVQUNILE1BQU07UUFDUixLQUFLLFdBQ0gsSUFDSSxnQkFBZ0IsMkJBQ2YsWUFBWSxDQUFDLENBQ2IsTUFBTSxHQUFHLENBQUMsR0FDYixZQUFZLGlCQUNWLFlBQVksZUFFZCxNQUFNO09BQ1o7T0FDQSxJQUFJLEtBQUssTUFBTSxJQUFJLEtBQUssSUFBSTtNQUM5QjtXQUNHLElBQUksS0FBSztNQUNkLGNBQ0Usc0JBQ0UsT0FDQSxHQUNBLFNBQ0EsaUJBQ0Y7S0FDSjtJQUNKOztHQUNSLElBQUksZ0JBQWdCLFFBQ2xCLENBQUMsTUFBTSxNQUFNLDRCQUNiLHVCQUF1QixZQUFZLGlCQUFpQixpQkFBaUI7R0FDdkUsT0FBTyxNQUFNLE9BQU8sS0FBSyxpQkFBaUIsQ0FBQyxDQUFDLFNBQ3hDLE9BQ0E7RUFDTjtFQUNBLFNBQVMsa0JBQWtCLE1BQU0sWUFBWTtHQUMzQyxRQUFRLEtBQUssUUFBYjtJQUNFLEtBQUssR0FDSCxPQUFPO0lBQ1QsS0FBSyxHQUNILE9BQU8sS0FBSztJQUNkLEtBQUssR0FDSCxPQUFPLEtBQUssS0FBSyxNQUFNLGFBQWEsTUFBTSxLQUFLO0lBQ2pELFNBQ0UsT0FDRSxLQUFLLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksSUFDM0IsT0FDQSxhQUNBLE1BQ0EsS0FBSyxLQUFLLFNBQVM7R0FFekI7RUFDRjtFQUNBLFNBQVMsdUJBQXVCLGVBQWU7R0FDN0MsUUFBUSxlQUFSO0lBQ0UsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSyxRQUNILE9BQU8sQ0FBQztJQUNWLFNBQ0UsT0FBTyxDQUFDO0dBQ1o7RUFDRjtFQUNBLFNBQVMsb0JBQW9CO0dBQzNCLElBQUksZUFBZSxPQUFPLFlBQVksa0JBQWtCO0lBQ3RELEtBQ0UsSUFBSSxRQUFRLEdBQ1YsT0FBTyxHQUNQLGtCQUFrQixZQUFZLGlCQUFpQixVQUFVLEdBQ3pELElBQUksR0FDTixJQUFJLGdCQUFnQixRQUNwQixLQUNBO0tBQ0EsSUFBSSxRQUFRLGdCQUFnQixJQUMxQixlQUFlLE1BQU0sY0FDckIsZ0JBQWdCLE1BQU0sZUFDdEIsV0FBVyxNQUFNO0tBQ25CLElBQ0UsZ0JBQ0EsWUFDQSx1QkFBdUIsYUFBYSxHQUNwQztNQUNBLGdCQUFnQjtNQUNoQixXQUFXLE1BQU07TUFDakIsS0FBSyxLQUFLLEdBQUcsSUFBSSxnQkFBZ0IsUUFBUSxLQUFLO09BQzVDLElBQUksZUFBZSxnQkFBZ0IsSUFDakMsbUJBQW1CLGFBQWE7T0FDbEMsSUFBSSxtQkFBbUIsVUFBVTtPQUNqQyxJQUFJLHNCQUFzQixhQUFhLGNBQ3JDLHVCQUF1QixhQUFhO09BQ3RDLHVCQUNFLHVCQUF1QixvQkFBb0IsTUFDekMsZUFBZSxhQUFhLGFBQzdCLGlCQUNDLHVCQUNDLGVBQWUsV0FDWixLQUNDLFdBQVcscUJBQ1gsZUFBZTtNQUMxQjtNQUNBLEVBQUU7TUFDRixRQUNHLEtBQUssZUFBZSxrQkFBbUIsTUFBTSxXQUFXO01BQzNEO01BQ0EsSUFBSSxLQUFLLE9BQU87S0FDbEI7SUFDRjtJQUNBLElBQUksSUFBSSxPQUFPLE9BQU8sT0FBTyxRQUFRO0dBQ3ZDO0dBQ0EsT0FBTyxVQUFVLGVBQ2IsUUFBUSxVQUFVLFdBQVcsVUFBVyxhQUFhLE9BQU8sU0FDNUQsUUFDQTtFQUNOO0VBQ0EsU0FBUyxrQ0FBa0Msc0JBQXNCO0dBQy9ELE9BQU8sTUFBTSxxQkFBcUIsV0FDOUIsdUJBQ0EscUJBQXFCO0VBQzNCO0VBQ0EsU0FBUyxrQkFBa0IsY0FBYztHQUN2QyxRQUFRLGNBQVI7SUFDRSxLQUFLLGVBQ0gsT0FBTztJQUNULEtBQUssZ0JBQ0gsT0FBTztJQUNULFNBQ0UsT0FBTztHQUNYO0VBQ0Y7RUFDQSxTQUFTLHdCQUF3QixpQkFBaUIsTUFBTTtHQUN0RCxJQUFJLG9CQUFvQiwwQkFDdEIsUUFBUSxNQUFSO0lBQ0UsS0FBSyxPQUNILE9BQU87SUFDVCxLQUFLLFFBQ0gsT0FBTztJQUNULFNBQ0UsT0FBTztHQUNYO0dBQ0YsT0FBTyxvQkFBb0IsMkJBQ3pCLG9CQUFvQixPQUNsQiwyQkFDQTtFQUNOO0VBQ0EsU0FBUyx3QkFDUCxNQUNBLE9BQ0EsdUJBQ0Esd0JBQ0E7R0FDQSx3QkFBd0Isa0NBQ3RCLHFCQUNGLENBQUMsQ0FBQyxjQUFjLElBQUk7R0FDcEIsc0JBQXNCLHVCQUF1QjtHQUM3QyxzQkFBc0Isb0JBQW9CO0dBQzFDLHFCQUFxQix1QkFBdUIsTUFBTSxLQUFLO0dBQ3ZELG9CQUFvQixxQkFBcUI7R0FDekMsT0FBTztFQUNUO0VBQ0EsU0FBUyxrQkFBa0IsT0FBTztHQUNoQyxRQUFRLE1BQU07R0FDZCxJQUFJLGFBQWEsT0FBTyxTQUFTLE9BQU8sT0FBTyxPQUFPLENBQUM7R0FDdkQsUUFBUSxNQUFNLFlBQVk7R0FDMUIsSUFDRSxhQUFhLFNBQ2IsZ0JBQWdCLFNBQ2hCLHVCQUF1QixPQUV2QixPQUFPLENBQUM7R0FDVixRQUFRLE9BQVI7SUFDRSxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLLHFCQUNILE9BQU8sQ0FBQztHQUNaO0dBQ0EsT0FBTyxDQUFDO0VBQ1Y7RUFDQSxTQUFTLHFCQUFxQixNQUFNLE9BQU87R0FDekMsT0FDRSxlQUFlLFFBQ2YsZUFBZSxRQUNmLGFBQWEsT0FBTyxNQUFNLFlBQzFCLGFBQWEsT0FBTyxNQUFNLFlBQzFCLGFBQWEsT0FBTyxNQUFNLFlBQ3pCLGFBQWEsT0FBTyxNQUFNLDJCQUN6QixTQUFTLE1BQU0sMkJBQ2YsUUFBUSxNQUFNLHdCQUF3QjtFQUU1QztFQUNBLFNBQVMsK0JBQStCO0dBQ3RDLElBQUksUUFBUSxPQUFPO0dBQ25CLElBQUksU0FBUyxlQUFlLE1BQU0sTUFBTTtJQUN0QyxJQUFJLFVBQVUsZ0NBQWdDLE9BQU8sQ0FBQztJQUN0RCxpQ0FBaUM7SUFDakMsT0FBTyxDQUFDO0dBQ1Y7R0FDQSxpQ0FBaUM7R0FDakMsT0FBTyxDQUFDO0VBQ1Y7RUFDQSxTQUFTLG1CQUFtQjtHQUMxQixJQUFJLFFBQVEsT0FBTztHQUNuQixPQUFPLFNBQVMsVUFBVSxpQkFBaUIsTUFBTSxPQUFPO0VBQzFEO0VBQ0EsU0FBUyx3QkFBd0I7R0FDL0IsSUFBSSxRQUFRLE9BQU87R0FDbkIsT0FBTyxTQUFTLFVBQVUsaUJBQWlCLE1BQU0sWUFBWTtFQUMvRDtFQUNBLFNBQVMsc0JBQXNCLE9BQU87R0FDcEMsV0FBVyxXQUFZO0lBQ3JCLE1BQU07R0FDUixDQUFDO0VBQ0g7RUFDQSxTQUFTLFlBQVksWUFBWSxNQUFNLFVBQVU7
15852R0FDL0MsUUFBUSxNQUFSO0lBQ0UsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztLQUNILFNBQVMsYUFBYSxXQUFXLE1BQU07S0FDdkM7SUFDRixLQUFLLE9BQ0gsU0FBUyxNQUNKLFdBQVcsTUFBTSxTQUFTLE1BQzNCLFNBQVMsV0FBVyxXQUFXLFNBQVMsU0FBUztHQUN6RDtFQUNGO0VBQ0EsU0FBUyx5QkFBeUIsQ0FBQztFQUNuQyxTQUFTLGFBQWEsWUFBWSxNQUFNLFVBQVUsVUFBVTtHQUMxRCxpQkFBaUIsWUFBWSxNQUFNLFVBQVUsUUFBUTtHQUNyRCxXQUFXLG9CQUFvQjtFQUNqQztFQUNBLFNBQVMsaUJBQWlCLFlBQVk7R0FDcEMsZUFBZSxZQUFZLEVBQUU7RUFDL0I7RUFDQSxTQUFTLGlCQUFpQixjQUFjLFNBQVMsU0FBUztHQUN4RCxhQUFhLFlBQVk7RUFDM0I7RUFDQSxTQUFTLDZCQUE2QixXQUFXO0dBQy9DLElBQUksQ0FBQyxVQUFVLG9DQUFvQztJQUNqRCxJQUFJLFFBQVEsVUFBVSxxQkFBcUI7SUFDM0MsSUFBSSxTQUFTLE9BQU87S0FDbEIsSUFBSSxRQUFRLG9CQUFvQixTQUFTO0tBQ3pDLFNBQVMsVUFDTixhQUFhLE9BQU8sTUFBTSxZQUMzQixhQUFhLE9BQU8sTUFBTSxZQUNwQixVQUFVLHFDQUFxQyxDQUFDLEdBQ2xELGtCQUFrQixPQUFPLFdBQVk7TUFDbkMsUUFBUSxNQUNOLHFQQUNGO0tBQ0YsQ0FBQyxLQUNELFFBQVEsTUFBTSw0QkFDWixVQUFVLHFDQUFxQyxDQUFDLEdBQ2xELGtCQUFrQixPQUFPLFdBQVk7TUFDbkMsUUFBUSxNQUNOLHVQQUNGO0tBQ0YsQ0FBQztJQUNUO0dBQ0Y7RUFDRjtFQUNBLFNBQVMsaUJBQWlCLE1BQU07R0FDOUIsT0FBTyxXQUFXO0VBQ3BCO0VBQ0EsU0FBUyxZQUFZLGdCQUFnQixPQUFPO0dBQzFDLGVBQWUsWUFBWSxLQUFLO0VBQ2xDO0VBQ0EsU0FBUyx5QkFBeUIsV0FBVyxPQUFPO0dBQ2xELENBQUMsTUFBTSxVQUFVLFdBQ2IsVUFBVSxPQUNWLFdBQVcsVUFBVSxXQUNuQixVQUFVLGNBQWMsT0FDeEIsVUFBQSxDQUNKLFlBQVksS0FBSztFQUNyQjtFQUNBLFNBQVMsdUJBQXVCLGdCQUFnQixtQkFBbUI7R0FDakUsSUFBSSxPQUFPLG1CQUNULFFBQVE7R0FDVixHQUFHO0lBQ0QsSUFBSSxXQUFXLEtBQUs7SUFDcEIsZUFBZSxZQUFZLElBQUk7SUFDL0IsSUFBSSxZQUFZLE1BQU0sU0FBUyxVQUM3QixJQUNJLE9BQU8sU0FBUyxNQUNsQixTQUFTLHFCQUFxQixTQUFTLG1CQUN2QztLQUNBLElBQUksTUFBTSxPQUFPO01BQ2YsZUFBZSxZQUFZLFFBQVE7TUFDbkMsaUJBQWlCLGlCQUFpQjtNQUNsQztLQUNGO0tBQ0E7SUFDRixPQUFPLElBQ0wsU0FBUyx1QkFDVCxTQUFTLCtCQUNULFNBQVMsOEJBQ1QsU0FBUyxnQ0FDVCxTQUFTLHFCQUVUO1NBQ0csSUFBSSxTQUFTLDRCQUNoQixtQ0FDRSxlQUFlLGNBQWMsZUFDL0I7U0FDRyxJQUFJLFNBQVMsNEJBQTRCO0tBQzVDLE9BQU8sZUFBZSxjQUFjO0tBQ3BDLG1DQUFtQyxJQUFJO0tBQ3ZDLEtBQUssSUFBSSxnQkFBZ0IsS0FBSyxZQUFZLGdCQUFpQjtNQUN6RCxJQUFJLG9CQUFvQixjQUFjLGFBQ3BDLFdBQVcsY0FBYztNQUMzQixjQUFjLDRCQUNaLGFBQWEsWUFDYixZQUFZLFlBQ1gsV0FBVyxZQUNWLGlCQUFpQixjQUFjLElBQUksWUFBWSxLQUNqRCxLQUFLLFlBQVksYUFBYTtNQUNoQyxnQkFBZ0I7S0FDbEI7SUFDRixPQUNFLFNBQVMsOEJBQ1AsbUNBQ0UsZUFBZSxjQUFjLElBQy9CO0lBQ04sT0FBTztHQUNULFNBQVM7R0FDVCxpQkFBaUIsaUJBQWlCO0VBQ3BDO0VBQ0EsU0FBUywrQkFBK0Isa0JBQWtCLFVBQVU7R0FDbEUsSUFBSSxPQUFPO0dBQ1gsbUJBQW1CO0dBQ25CLEdBQUc7SUFDRCxJQUFJLFdBQVcsS0FBSztJQUNwQixNQUFNLEtBQUssV0FDUCxZQUNJLEtBQUssa0JBQWtCLEtBQUssTUFBTSxTQUNuQyxLQUFLLE1BQU0sVUFBVSxXQUNwQixLQUFLLE1BQU0sVUFBVSxLQUFLLG1CQUFtQixJQUMvQyxPQUFPLEtBQUssYUFBYSxPQUFPLEtBQzlCLEtBQUssZ0JBQWdCLE9BQU8sS0FDaEMsTUFBTSxLQUFLLGFBQ1YsWUFDSyxLQUFLLGVBQWUsS0FBSyxXQUFhLEtBQUssWUFBWSxNQUN4RCxLQUFLLFlBQVksS0FBSyxnQkFBZ0I7SUFDL0MsSUFBSSxZQUFZLE1BQU0sU0FBUyxVQUM3QixJQUFNLE9BQU8sU0FBUyxNQUFPLFNBQVMsbUJBQ3BDLElBQUksTUFBTSxrQkFBa0I7U0FDdkI7U0FFTCxTQUFVLHVCQUNSLFNBQVMsK0JBQ1QsU0FBUyw4QkFDVCxTQUFTLGdDQUNUO0lBQ04sT0FBTztHQUNULFNBQVM7RUFDWDtFQUNBLFNBQVMsdUJBQXVCLGtCQUFrQjtHQUNoRCwrQkFBK0Isa0JBQWtCLENBQUMsQ0FBQztFQUNyRDtFQUNBLFNBQVMsYUFBYSxVQUFVO0dBQzlCLFdBQVcsU0FBUztHQUNwQixlQUFlLE9BQU8sU0FBUyxjQUMzQixTQUFTLFlBQVksV0FBVyxRQUFRLFdBQVcsSUFDbEQsU0FBUyxVQUFVO0VBQzFCO0VBQ0EsU0FBUyxpQkFBaUIsY0FBYztHQUN0QyxhQUFhLFlBQVk7RUFDM0I7RUFDQSxTQUFTLHlCQUF5QixvQkFBb0I7R0FDcEQsK0JBQStCLG9CQUFvQixDQUFDLENBQUM7RUFDdkQ7RUFDQSxTQUFTLGVBQWUsVUFBVSxPQUFPO0dBQ3ZDLFFBQVEsTUFBTTtHQUNkLFFBQ0UsS0FBSyxNQUFNLFNBQVMsU0FBUyxTQUFTLE1BQU0sZUFBZSxTQUFTLElBQ2hFLE1BQU0sVUFDTjtHQUNOLFNBQVMsTUFBTSxVQUNiLFFBQVEsU0FBUyxjQUFjLE9BQU8sUUFBUSxNQUFNLEtBQUssTUFBQSxDQUFPLEtBQUs7RUFDekU7RUFDQSxTQUFTLG1CQUFtQixjQUFjLE1BQU07R0FDOUMsYUFBYSxZQUFZO0VBQzNCO0VBQ0EsU0FBUyx5QkFBeUIsVUFBVTtHQUMxQyxLQUFLLElBQUksV0FBVyxTQUFTLFlBQVksUUFBUSxXQUFZO0lBQzNELElBQ0UsTUFBTSxTQUFTLFlBQ2YsWUFBWSxpQkFBaUIsUUFBUSxDQUFDLENBQUMsU0FDdkM7S0FHQSxrQkFERSxvQkFBb0IsUUFBUSxLQUFLLG9CQUFvQixRQUFRLEdBRzdELFNBQVUsV0FBVyxVQUFVO01BQzdCLFFBQVEsTUFDTiw0U0FDQSxVQUFVLGtCQUFrQixHQUM1QixTQUFTLGtCQUFrQixDQUM3QjtLQUNGLEdBQ0EsU0FBUyxTQUNULFNBQVMsT0FDWDtLQUNBO0lBQ0Y7SUFDQSxJQUFJLFFBQVEsU0FBUyxZQUFZLFdBQVcsU0FBUztTQUNoRDtLQUNILElBQUksYUFBYSxVQUFVO0tBQzNCLE9BRUUsUUFBUSxTQUFTLGVBQ2pCLFFBQVEsU0FBUyxjQUNqQixTQUFTLGVBQWUsV0FHeEIsV0FBVyxTQUFTO0tBQ3RCLFdBQVcsU0FBUztJQUN0QjtHQUNGO0VBQ0Y7RUFDQSxTQUFTLHdCQUF3QixVQUFVLE1BQU0sV0FBVztHQUMxRCxPQUNFLElBQUksT0FBTyxJQUFJLE1BQU0sT0FBTyxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUMsUUFBUSxNQUFNLEVBQUUsSUFBSTtHQUNwRSxTQUFTLE1BQU0scUJBQXFCO0dBQ3BDLFFBQVEsY0FBYyxTQUFTLE1BQU0sc0JBQXNCO0dBQzNELFlBQVksaUJBQWlCLFFBQVE7R0FDckMsSUFBSSxhQUFhLFVBQVUsU0FBUztJQUNsQyxPQUFPLFNBQVMsZUFBZTtJQUMvQixJQUFJLE1BQU0sS0FBSyxRQUFRLElBQUksMkJBQTJCO1NBRXBELEtBQUssSUFBSSxJQUFLLDJCQUEyQixHQUFJLElBQUksS0FBSyxRQUFRLEtBQUs7S0FDakUsSUFBSSxPQUFPLEtBQUs7S0FDaEIsSUFBSSxLQUFLLFNBQVMsSUFBSSxLQUFLLFVBQVU7SUFDdkM7SUFDRixNQUFNLDRCQUNBLF
15852dBQVcsU0FBUyxPQUNyQixTQUFTLFVBQVUsTUFBTSxLQUFLLFNBQVMsaUJBQWlCLFNBQ3hELFNBQVMsWUFBWSxNQUFNLFVBQVUsWUFDckMsU0FBUyxlQUFlLE1BQU0sVUFBVSxpQkFDekMseUJBQXlCLFFBQVE7R0FDdkM7RUFDRjtFQUNBLFNBQVMsMEJBQTBCLFVBQVUsT0FBTztHQUNsRCxXQUFXLFNBQVM7R0FDcEIsUUFBUSxNQUFNO0dBQ2QsSUFBSSxxQkFDRixRQUFRLFFBQ0osTUFBTSxlQUFlLG9CQUFvQixJQUN2QyxNQUFNLHFCQUNOLE1BQU0sZUFBZSxzQkFBc0IsSUFDekMsTUFBTSwwQkFDTixPQUNKO0dBQ04sU0FBUyxxQkFDUCxRQUFRLHNCQUFzQixjQUFjLE9BQU8scUJBQy9DLE1BQ0MsS0FBSyxtQkFBQSxDQUFvQixLQUFLO0dBQ3JDLHFCQUNFLFFBQVEsUUFDSixNQUFNLGVBQWUscUJBQXFCLElBQ3hDLE1BQU0sc0JBQ04sTUFBTSxlQUFlLHVCQUF1QixJQUMxQyxNQUFNLDJCQUNOLE9BQ0o7R0FDTixTQUFTLHNCQUNQLFFBQVEsc0JBQXNCLGNBQWMsT0FBTyxxQkFDL0MsTUFDQyxLQUFLLG1CQUFBLENBQW9CLEtBQUs7R0FDckMsbUJBQW1CLFNBQVMsWUFDekIsUUFBUSxRQUNKLFNBQVMsVUFBVSxTQUFTLFNBQVMsTUFDcEMscUJBQXFCLE1BQU0sU0FDNUIsU0FBUyxVQUNSLFFBQVEsc0JBQ1IsY0FBYyxPQUFPLHFCQUNqQixLQUNBLG9CQUNMLHFCQUFxQixNQUFNLFFBQzVCLFFBQVEscUJBQ0gsU0FBUyxTQUFTLHNCQUNqQixxQkFBcUIsTUFBTSxlQUFlLFdBQVcsSUFDbkQsTUFBTSxZQUNOLE1BQU0sZUFDVCxTQUFTLFlBQ1IsUUFBUSxzQkFDUixjQUFjLE9BQU8scUJBQ2pCLEtBQ0Esb0JBQ0wsUUFBUSxNQUFNLGVBQWUsY0FBYyxJQUN4QyxNQUFNLGVBQ04sTUFBTSxrQkFDVCxTQUFTLGVBQ1IsUUFBUSxTQUFTLGNBQWMsT0FBTyxRQUFRLEtBQUs7RUFDakU7RUFDQSxTQUFTLGtCQUFrQixNQUFNLGVBQWUsU0FBUztHQUN2RCxVQUFVLFFBQVEsY0FBYztHQUNoQyxPQUFPO0lBQ0M7SUFDTixLQUNFLGVBQWUsY0FBYyxZQUM3QixZQUFZLGNBQWM7SUFDNUIsTUFDRSxXQUFXLGNBQWMsWUFDekIsY0FBYyxjQUFjLFlBQzVCLFdBQVcsY0FBYyxVQUN6QixXQUFXLGNBQWMsUUFDekIsV0FBVyxjQUFjLFFBQ3pCLFVBQVUsY0FBYztJQUMxQixNQUNFLEtBQUssS0FBSyxVQUNWLEtBQUssS0FBSyxTQUNWLEtBQUssT0FBTyxRQUFRLGVBQ3BCLEtBQUssUUFBUSxRQUFRO0dBQ3pCO0VBQ0Y7RUFDQSxTQUFTLGdCQUFnQixVQUFVO0dBR2pDLE9BQU8sa0JBRkksU0FBUyxzQkFFUSxHQURWLGlCQUFpQixRQUNRLEdBQUcsUUFBUTtFQUN4RDtFQUNBLFNBQVMsc0JBQXNCLFVBQVU7R0FDdkMsSUFBSSxlQUFlLFNBQVMsc0JBQXNCO0dBQ2xELGVBQWUsSUFBSSxRQUNqQixhQUFhLElBQUksS0FDakIsYUFBYSxJQUFJLEtBQ2pCLGFBQWEsT0FDYixhQUFhLE1BQ2Y7R0FDQSxJQUFJLGdCQUFnQixpQkFBaUIsUUFBUTtHQUM3QyxPQUFPLGtCQUFrQixjQUFjLGVBQWUsUUFBUTtFQUNoRTtFQUNBLFNBQVMsNkJBQTZCLE9BQU8sYUFBYTtHQUN4RCxJQUFJLGFBQWEsT0FBTyxTQUFTLFNBQVMsT0FDeEMsUUFBUSxNQUFNLE1BQWQ7SUFDRSxLQUFLLGdCQUNILE9BQU8sTUFDTCxtT0FDQSxFQUFFLE9BQU8sTUFBTSxDQUNqQjtJQUNGLEtBQUssY0FDSCxPQUFPLGNBQ0gsT0FDQSxNQUNFLDJOQUNBLEVBQUUsT0FBTyxNQUFNLENBQ2pCO0lBQ04sS0FBSyxxQkFDSCxJQUNFLCtFQUNFLE1BQU0sV0FDUixvRkFDRSxNQUFNLFdBQ1IsOERBQ0UsTUFBTSxXQUNSLHNEQUNFLE1BQU0sU0FFUixPQUFPO0dBQ2I7R0FDRixPQUFPO0VBQ1Q7RUFDQSxTQUFTLFlBQVksZUFBZTtHQUNsQyxPQUFPLGNBQWMsZ0JBQWdCO0VBQ3ZDO0VBQ0EsU0FBUyxtQkFBbUIsU0FBUztHQUNuQyxLQUFLLGlCQUFpQixRQUFRLE9BQU87R0FDckMsS0FBSyxpQkFBaUIsU0FBUyxPQUFPO0VBQ3hDO0VBQ0EsU0FBUyxvQkFDUCxnQkFDQSxlQUNBLGlCQUNBLGtCQUNBLGdCQUNBLHVCQUNBLHFCQUNBLGlCQUNBLGVBQ0EsaUJBQ0EsbUJBQ0E7R0FDQSxJQUFJLGdCQUNGLE1BQU0sY0FBYyxXQUNoQixnQkFDQSxjQUFjO0dBQ3BCLElBQUk7SUFDRixJQUFJLGFBQWEsY0FBYyxvQkFBb0I7S0FDakQsUUFBUSxXQUFZO01BQ2xCLElBQUksY0FBYyxjQUFjLGFBQzlCLG9CQUNFLFlBQVksY0FBYyxZQUFZLFdBQVcsWUFDbkQsNEJBQTRCLGNBQWMsTUFBTTtNQUNsRCxpQkFBaUI7TUFDakIsSUFBSSxtQkFBbUIsQ0FBQztNQUN4QixhQUFhLDhCQUNWLFlBQVksYUFBYSxHQUMxQixjQUFjLGNBQWMsTUFBTSxVQUNoQyxpQkFBaUIsS0FBSyxjQUFjLE1BQU0sS0FBSztNQUNuRCw0QkFBNEIsaUJBQWlCO01BQzdDLElBQUksU0FBUyxnQkFDWCxLQUNFLElBQUksa0JBQWtCLGVBQWUsaUJBQ25DLFdBQVcsR0FDWCxJQUFJLEdBQ04sSUFBSSxnQkFBZ0IsUUFDcEIsS0FDQTtPQUNBLElBQUksaUJBQWlCLGdCQUFnQjtPQUNyQyxJQUFJLENBQUMsZUFBZSxVQUFVO1FBQzVCLElBQUksT0FBTyxlQUFlLHNCQUFzQjtRQUNoRCxJQUNFLElBQUksS0FBSyxVQUNULElBQUksS0FBSyxTQUNULEtBQUssTUFBTSxZQUFZLGVBQ3ZCLEtBQUssT0FBTyxZQUFZLFlBQ3hCO1NBQ0EsWUFBWSxtQkFBbUIsY0FBYztTQUM3QyxJQUFJLFdBQVcsMkJBQTJCO1VBQ3hDLGlCQUFpQixTQUFTO1VBQzFCO1NBQ0Y7U0FDQSxpQkFBaUIsSUFBSSxRQUNuQixtQkFBbUIsS0FBSyxjQUFjLENBQ3hDO1NBQ0EsaUJBQWlCLEtBQUssY0FBYztRQUN0QztPQUNGO01BQ0Y7TUFDRixJQUFJLElBQUksaUJBQWlCLFFBQ3ZCLE9BQ0UsZ0JBQ0UsSUFBSSw0QkFDQSxpQkFBaUIsU0FBUyw0QkFDeEIsZ0NBQ0EscUJBQ0YsbUJBQ04sR0FDQyxjQUFjLFFBQVEsS0FBSyxDQUMxQixRQUFRLElBQUksZ0JBQWdCLEdBQzVCLElBQUksUUFBUSxTQUFVLFNBQVM7T0FDN0IsT0FBTyxXQUNMLFNBQ0EsZ0NBQ0Y7TUFDRixDQUFDLENBQ0gsQ0FBQyxDQUFDLENBQUMsS0FBSyxnQkFBZ0IsY0FBYyxJQUNyQyxvQkFDRyxRQUFRLFdBQVcsQ0FDakIsa0JBQWtCLFVBQ2xCLFdBQ0YsQ0FBQyxJQUNELFlBQUEsQ0FDRixLQUFLLHVCQUF1QixxQkFBcUI7TUFFdkQsZUFBZTtNQUNmLElBQUksbUJBQ0YsT0FBTyxrQkFBa0IsU0FBUyxLQUNoQyx1QkFDQSxxQkFDRjtNQUNGLHNCQUFzQjtLQUN4QjtLQUNBLE9BQU87SUFDVCxDQUFDO0lBQ0QsY0FBYyx3QkFBd0I7SUFDdEMsSUFBSSwyQkFBMkIsQ0FBQztJQUNoQyxXQUFXLE1BQU0sS0FDZixXQUFZO0tBQ1YsS0FDRSxJQUFJLGFBQWEsY0FBYyxnQkFBZ0IsY0FBYyxFQUN6RCxTQUFTLENBQUMsRUFDWixDQUFDLEdBQ0QsSUFBSSxHQUNOLElBQUksV0
15852FBVyxRQUNmLEtBQ0E7TUFDQSxJQUFJLFlBQVksV0FBVyxJQUN6QixTQUFTLFVBQVUsUUFDbkIsZ0JBQWdCLE9BQU87TUFDekIsSUFDRSxRQUFRLGlCQUNSLGNBQWMsV0FBVyxtQkFBbUIsR0FDNUM7T0FDQSx5QkFBeUIsS0FBSyxTQUFTO09BQ3ZDLFlBQVksT0FBTyxhQUFhO09BQ2hDLEtBQ0UsSUFBSSxTQUFVLGdCQUFnQixLQUFLLEdBQ2pDLHNCQUFzQixDQUFDLEdBQ3ZCLElBQUksR0FDTixJQUFJLFVBQVUsUUFDZCxLQUNBO1FBQ0EsSUFBSSxXQUFXLFVBQVUsSUFDdkIsSUFBSSxTQUFTO1FBQ2YsSUFBSSxLQUFLLE1BQU0sZUFBZSxnQkFBZ0I7YUFDekMsSUFBSSxrQkFBa0IsR0FBRztTQUM1QixzQkFBc0IsQ0FBQztTQUN2QjtRQUNGO1FBQ0EsSUFBSSxTQUFTO1FBQ2IsSUFBSSxLQUFLLE1BQU0sUUFBUSxTQUFTO2FBQzNCLElBQUksV0FBVyxHQUFHO1NBQ3JCLHNCQUFzQixDQUFDO1NBQ3ZCO1FBQ0Y7UUFDQSxPQUFPLFNBQVM7UUFDaEIsT0FBTyxTQUFTO1FBQ2hCLFdBQVcsU0FBUyxhQUFhLE9BQU8sU0FBUztPQUNuRDtPQUNBLHVCQUNFLEtBQUssTUFBTSxpQkFDWCxLQUFLLE1BQU0sV0FDVixPQUFPLGFBQWEsU0FBUyxHQUM3QixzQkFBc0IsaUJBQ3JCLE9BQU8sUUFDUCxPQUFPLGFBQ1QsR0FDQSxvQkFBb0IsVUFBVSxpQkFDNUIsb0JBQW9CLFdBQVcsWUFDL0Isc0JBQXNCLFVBQVUsSUFDakMsb0JBQW9CLFFBQVEsZUFDNUIsb0JBQW9CLFNBQVMsUUFDN0Isc0JBQXNCLFVBQVUsVUFBVSxTQUFTLElBQ25ELG9CQUFvQixRQUFRLGVBQzVCLG9CQUFvQixTQUFTLFFBQzlCLE9BQU8sYUFBYSxTQUFTO01BQ2pDO0tBQ0Y7S0FDQSxvQkFBb0I7SUFDdEIsR0FDQSxTQUFVLE9BQU87S0FDZixjQUFjLDBCQUEwQixlQUNyQyxjQUFjLHdCQUF3QjtLQUN6QyxJQUFJO01BQ0YsUUFBUyw2QkFBNkIsT0FBTyxDQUFDLENBQUMsR0FDN0MsU0FBUyxTQUFTLGNBQWMsS0FBSztLQUN6QyxVQUFVO01BQ1IsaUJBQWlCLEdBQ2YsZUFBZSxHQUNmLG9CQUFvQixHQUNwQixrQkFBa0I7S0FDdEI7SUFDRixDQUNGO0lBQ0EsV0FBVyxTQUFTLFFBQVEsV0FBWTtLQUN0QyxLQUFLLElBQUksSUFBSSxHQUFHLElBQUkseUJBQXlCLFFBQVEsS0FDbkQseUJBQXlCLEVBQUUsQ0FBQyxPQUFPO0tBQ3JDLGNBQWMsMEJBQTBCLGVBQ3JDLGNBQWMsd0JBQXdCO0tBQ3pDLGtCQUFrQjtLQUNsQixnQkFBZ0I7SUFDbEIsQ0FBQztJQUNELE9BQU87R0FDVCxTQUFTLEdBQUc7SUFDVixPQUNFLGlCQUFpQixHQUNqQixlQUFlLEdBQ2Ysa0JBQWtCLEdBQ2xCLG9CQUFvQixHQUNwQjtHQUVKO0VBQ0Y7RUFDQSxTQUFTLDRCQUE0QixRQUFRLE1BQU07R0FDakQsS0FBSyxTQUFTLFNBQVM7R0FDdkIsS0FBSyxZQUFZLHVCQUF1QixTQUFTLE1BQU0sT0FBTztFQUNoRTtFQUNBLFNBQVMsNkJBQTZCLE1BQU07R0FDMUMsT0FBTztJQUNDO0lBQ04sT0FBTyxJQUFJLDRCQUE0QixTQUFTLElBQUk7SUFDcEQsV0FBVyxJQUFJLDRCQUE0QixjQUFjLElBQUk7SUFDN0QsS0FBSyxJQUFJLDRCQUE0QixPQUFPLElBQUk7SUFDaEQsS0FBSyxJQUFJLDRCQUE0QixPQUFPLElBQUk7R0FDbEQ7RUFDRjtFQUNBLFNBQVMsaUJBQWlCLGVBQWU7R0FDdkMsS0FBSyxpQkFBaUI7R0FDdEIsS0FBSyxhQUFhLEtBQUssa0JBQWtCO0VBQzNDO0VBQ0EsU0FBUyx3QkFDUCxPQUNBLE1BQ0EsVUFDQSxxQkFDQTtHQUNBLHlCQUF5QixLQUFLLENBQUMsQ0FBQyxpQkFDOUIsTUFDQSxVQUNBLG1CQUNGO0dBQ0EsT0FBTyxDQUFDO0VBQ1Y7RUFDQSxTQUFTLDZCQUNQLE9BQ0EsTUFDQSxVQUNBLHFCQUNBO0dBQ0EseUJBQXlCLEtBQUssQ0FBQyxDQUFDLG9CQUM5QixNQUNBLFVBQ0EsbUJBQ0Y7R0FDQSxPQUFPLENBQUM7RUFDVjtFQUNBLFNBQVMsaUJBQWlCLE1BQU07R0FDOUIsT0FBTyxRQUFRLFFBQ2IsY0FBYyxPQUFPLFNBQ3BCLENBQUMsTUFBTSxLQUFLLFFBQVEsS0FBSyxrQkFBa0IsZUFDMUM7SUFBRSxTQUFTLEtBQUs7SUFBUyxTQUFTLEtBQUs7R0FBUSxJQUMvQztFQUNOO0VBQ0EsU0FBUyx5QkFBeUIsTUFBTTtHQUN0QyxPQUFPLFFBQVEsT0FDWCxRQUNBLGNBQWMsT0FBTyxPQUNuQixRQUFRLE9BQU8sTUFBTSxPQUNyQixRQUFRLEtBQUssVUFBVSxNQUFNO0VBQ3JDO0VBQ0EsU0FBUyxxQkFDUCxnQkFDQSxNQUNBLFVBQ0EscUJBQ0E7R0FDQSxJQUFJLE1BQU0sZUFBZSxRQUFRLE9BQU87R0FDeEMsc0JBQXNCLHlCQUF5QixtQkFBbUI7R0FDbEUsS0FBSyxJQUFJLElBQUksR0FBRyxJQUFJLGVBQWUsUUFBUSxLQUFLO0lBQzlDLElBQUksT0FBTyxlQUFlO0lBQzFCLElBQ0UsS0FBSyxTQUFTLFFBQ2QsS0FBSyxhQUFhLFlBQ2xCLHlCQUF5QixLQUFLLG1CQUFtQixNQUMvQyxxQkFFRixPQUFPO0dBQ1g7R0FDQSxPQUFPO0VBQ1Q7RUFDQSxTQUFTLDJCQUEyQixPQUFPLGNBQWM7R0FDdkQsSUFBSSxNQUFNLE1BQU0sS0FBSyxPQUFPLENBQUM7R0FDN0IsUUFBUSx5QkFBeUIsS0FBSztHQUN0QyxPQUFPLG9CQUFvQixPQUFPLFlBQVk7RUFDaEQ7RUFDQSxTQUFTLGdCQUFnQixPQUFPLFlBQVk7R0FDMUMsV0FBVyxLQUFLLEtBQUs7R0FDckIsT0FBTyxDQUFDO0VBQ1Y7RUFDQSxTQUFTLGdDQUFnQyxPQUFPLGVBQWU7R0FDN0QsSUFBSSxNQUFNLE1BQU0sS0FBSyxPQUFPLENBQUM7R0FDN0IsUUFBUSx5QkFBeUIsS0FBSztHQUN0QyxPQUFPLFVBQVUsaUJBQWlCLE1BQU0sU0FBUyxhQUFhLEtBQ3pELGNBQWMsS0FBSyxHQUFHLENBQUMsS0FDeEIsQ0FBQztFQUNQO0VBQ0EsU0FBUyxhQUFhLE9BQU8sVUFBVTtHQUNyQyxJQUFJLE1BQU0sTUFBTSxLQUFLLE9BQU8sQ0FBQztHQUM3QixRQUFRLHlCQUF5QixLQUFLO0dBQ3RDLFNBQVMsUUFBUSxLQUFLO0dBQ3RCLE9BQU8sQ0FBQztFQUNWO0VBQ0EsU0FBUyxlQUFlLE9BQU8sVUFBVTtHQUN2QyxJQUFJLE1BQU0sTUFBTSxLQUFLLE9BQU8sQ0FBQztHQUM3QixRQUFRLHlCQUF5QixLQUFLO0dBQ3RDLFNBQVMsVUFBVSxLQUFLO0dBQ3hCLE9BQU8sQ0FBQztFQUNWO0VBQ0EsU0FBUyxxQ0FDUCxrQkFDQSxVQUNBLFVBQ0E7R0FDQSw4QkFBOEIsS0FBSztJQUNmO0lBQ1I7SUFDQTtHQUNaLENBQUM7R0FDRCxtQ0FDSSxpQ0FBaUMsQ0FBQyxHQUNwQyx5QkFBeUIsV0FBWTtJQUNuQyxpQ0FBaUMsQ0FBQztJQUNsQyxJQUFJLFVBQVU7SUFDZCxnQ0FBZ0MsQ0FBQztJQUNqQyxLQUFLLElBQUksSUFBSSxHQUFHLElBQUksUUFBUSxRQUFRLEtBQUs7S0FDdkMsSUFBSSxPQUFPLFFBQVE7S0FDbkIsS0FBSyxTQUFTLFVBQVUsS0FBSyxRQUFRO0lBQ3ZDO0dBQ0YsQ0FBQztFQUNMO0VBQ0EsU0FBUyxtQkFBbUIsT0FBTyxPQUFPO0dBQ3hDLElBQUksTUFBTSxNQUFNLEtBQUs7SUFDbkIsUUFBUSxNQUFNO0lBQ2QsSUFBSSxRQUFRLE1BQU0sY0FBYyxZQUFZO0lBQzVDLE1BQU0sbUJBQW1CLEtBQUs7SUFDOUIsTUFBTSxLQUFLLE1BQU0sT0FBTyxNQUFNLGVBQWUsQ0FBQztHQUNoRCxPQUNFLFFBQVMseUJBQXlCLEtBQUssR0FDckMsTUFBTSxLQUFLLE1BQU0sT0FBTyxNQUFNLGVBQWUsQ0FBQztHQUNsRCxPQUFPLENBQUM7RUFDVjtFQUNBLFNBQVMsc0NBQ1Asa0JBQ0EsZUFDQSx3QkFDQSx3QkFDQSxXQUNBO0dBQ0EsSUFBSSxhQUFhLDJCQUEyQixTQUFTO0dBQ3JELElBQUksbUJBQW1CLEtBQUssZ0NBQWdDO0lBQzFELElBQUsseUJBQXlCLENBQUMsQ0FBQyxZQUM5QixHQUFHO0tBQ0QsT0FBTyxTQUFTLGFBQWM7TUFDNUIsSUFDRSxNQUFNLFdBQVcsUUFDaEIsZUFBZSxpQkFDZCxXQUFXLGNBQWMsZ0JBQzNCO09BQ0EseUJBQXlCLENBQUM7T0FDMUIsTUFBTTtNQUNSO01BQ0EsYUFBYSxXQUFXO0tBQzFCO0tBQ0EseUJBQXlCLENBQUM7SUFDNUI7SUFDRixPQUFPO0dBQ1Q7R0FDQSxJQUFJLG1CQUFtQixLQUFLLDRCQUE0QjtJQUN0RCxJQUFJLFNBQVMsWUFDWCxPQUNHLGFBQWEsVUFBVSxlQUN4QixjQUFjLGNBQ1osY0FBYyxXQUFXLG1CQUN6QixjQUFjLFdBQVc7SUFFL0IsR0FBRztLQUNELGFBQWE7S0FDYixLQUNFLGdCQUNFLDBDQUEwQyxhQUFhLEd
15852BQ3pELFNBQVMsYUFFVDtNQUNBLElBQ0UsRUFDRyxNQUFNLFdBQVcsT0FDaEIsTUFBTSxXQUFXLE9BQ2pCLE9BQU8sV0FBVyxPQUNuQixlQUFlLGlCQUNkLFdBQVcsY0FBYyxnQkFFN0I7T0FDQSxhQUFhLENBQUM7T0FDZCxNQUFNO01BQ1I7TUFDQSxhQUFhLFdBQVc7S0FDMUI7S0FDQSxhQUFhLENBQUM7SUFDaEI7SUFDQSxPQUFPO0dBQ1Q7R0FDQSxPQUFPLG1CQUFtQixLQUFLLGdDQUN6QixnQkFBZ0IsQ0FBQyxDQUFDLGVBQ2xCLEVBQUUsZ0JBQWdCLGVBQWUsNEJBQy9CLGdCQUFnQix3QkFDaEIsd0JBQ0EsWUFDQSw2QkFDRixHQUNBLFNBQVMsZ0JBQ0osZ0JBQWdCLENBQUMsS0FDakIseUNBQ0MsZUFDQSxDQUFDLEdBQ0QsdUJBQ0EsWUFDQSxzQkFDRixHQUNDLGFBQWEsY0FDYixlQUFlLE1BQ2YsZ0JBQWdCLFNBQVMsY0FDaEMsaUJBQ0EsbUJBQW1CLEtBQUssZ0NBQ3BCLGdCQUFnQixDQUFDLENBQUMsZUFDbEIsRUFBRSxnQkFBZ0IsZUFBZSw0QkFDL0IsZ0JBQWdCLHdCQUNoQix3QkFDQSxZQUNBLDZCQUNGLEdBQ0EsU0FBUyxnQkFDSixnQkFBZ0IsQ0FBQyxLQUNqQix5Q0FDQyxlQUNBLENBQUMsR0FDRCx1QkFDQSxZQUNBLHNCQUNGLEdBQ0MsYUFBYSxjQUNiLGlCQUFpQixlQUFlLE1BQ2hDLGdCQUFnQixTQUFTLGNBQ2hDLGlCQUNBLENBQUM7RUFDVDtFQUNBLFNBQVMsdUJBQXVCLFVBQVUsb0JBQW9CO0dBQzVELElBQUksUUFBUSxTQUFTLGNBQWMsWUFBWTtHQUMvQyxNQUFNLG1CQUFtQixRQUFRO0dBQ2pDLFdBQVcsTUFBTSxzQkFBc0I7R0FDdkMsT0FBTyxTQUNMLE9BQU8sVUFBVSxTQUFTLE1BQzFCLHFCQUNJLE9BQU8sVUFBVSxTQUFTLE1BQzFCLE9BQU8sVUFBVSxTQUFTLFNBQVMsT0FBTyxXQUNoRDtFQUNGO0VBQ0EsU0FBUyx5QkFBeUIsT0FBTyxrQkFBa0I7R0FDekQsUUFBUSx5QkFBeUIsS0FBSztHQUN0Qyw0QkFBNEIsT0FBTyxnQkFBZ0I7R0FDbkQsT0FBTyxDQUFDO0VBQ1Y7RUFDQSxTQUFTLDRCQUE0QixVQUFVLGtCQUFrQjtHQUMvRCxTQUE2QyxtQ0FBaUIsSUFBSSxJQUFJO0dBQ3RFLFNBQVMsZUFBZSxJQUFJLGdCQUFnQjtFQUM5QztFQUNBLFNBQVMsaUNBQWlDLGVBQWUsa0JBQWtCO0dBQ3pFLElBQUksaUJBQWlCLGlCQUFpQjtHQUN0QyxJQUFJLFNBQVMsZ0JBQ1gsS0FDRSxJQUFJLGFBQWEsR0FDakIsYUFBYSxlQUFlLFFBQzVCLGNBQ0E7SUFDQSxJQUFJLHFCQUFxQixlQUFlO0lBQ3hDLGNBQWMsaUJBQ1osbUJBQW1CLE1BQ25CLG1CQUFtQixrQkFDbkIsaUJBQWlCLG1CQUFtQixtQkFBbUIsQ0FDekQ7R0FDRjtHQUNGLE1BQU0sY0FBYyxhQUNoQixpQkFBaUIsaUJBQWlCLFlBQ3BDLFNBQVMsa0JBQ1AsZUFBZSxRQUFRLFNBQVUsVUFBVTtJQUN6QyxLQUNFLElBQUksV0FBVyxHQUFHLElBQUksR0FDdEIsSUFBSSw4QkFBOEIsUUFDbEMsS0FDQTtLQUNBLElBQUksVUFBVSw4QkFBOEI7S0FDNUMsSUFDRSxRQUFRLHFCQUFxQixvQkFDN0IsUUFBUSxhQUFhLFlBQ3JCLFFBQVEsYUFBYSxlQUVyQiw4QkFBOEIsY0FBYztJQUNoRDtJQUNBLDhCQUE4QixTQUFTO0lBQ3ZDLFNBQVMsUUFBUSxhQUFhO0dBQ2hDLENBQUMsR0FDSCw0QkFBNEIsZUFBZSxnQkFBZ0I7RUFDL0Q7RUFDQSxTQUFTLGdDQUFnQyxlQUFlLGtCQUFrQjtHQUN4RSxJQUFJLGlCQUFpQixpQkFBaUI7R0FDdEMsSUFBSSxTQUFTLGdCQUNYLEtBQUssSUFBSSxJQUFJLEdBQUcsSUFBSSxlQUFlLFFBQVEsS0FBSztJQUM5QyxJQUFJLHFCQUFxQixlQUFlO0lBQ3hDLGNBQWMsb0JBQ1osbUJBQW1CLE1BQ25CLG1CQUFtQixrQkFDbkIsaUJBQWlCLG1CQUFtQixtQkFBbUIsQ0FDekQ7R0FDRjtHQUNGLE1BQU0sY0FBYyxhQUNoQixpQkFBaUIsaUJBQWlCLFlBQ3BDLFNBQVMsa0JBQ1AsZUFBZSxRQUFRLFNBQVUsVUFBVTtJQUN6QyxhQUFhLE9BQU8sU0FBUyxhQUN6QixxQ0FDRSxrQkFDQSxVQUNBLGFBQ0YsSUFDQSxTQUFTLFVBQVUsYUFBYTtHQUN0QyxDQUFDLEdBQ0gsUUFBUSxjQUFjLGtCQUNwQixjQUFjLGVBQWUsT0FBTyxnQkFBZ0I7RUFDMUQ7RUFDQSxTQUFTLHdCQUF3QixXQUFXO0dBQzFDLElBQUksV0FBVyxVQUFVO0dBQ3pCLFlBQVksT0FBTyxTQUFTLGFBQWEsV0FBVyxTQUFTO0dBQzdELE9BQU8sV0FBWTtJQUNqQixJQUFJLE9BQU87SUFDWCxXQUFXLFNBQVM7SUFDcEIsUUFBUSxLQUFLLFVBQWI7S0FDRSxLQUFLO0tBQ0wsS0FBSztLQUNMLEtBQUs7TUFDSCx3QkFBd0IsSUFBSTtNQUM1QixzQkFBc0IsSUFBSTtNQUMxQjtLQUNGLEtBQUs7S0FDTCxLQUFLLFNBQ0g7S0FDRixLQUFLLFFBQ0gsSUFBSSxpQkFBaUIsS0FBSyxJQUFJLFlBQVksR0FBRztJQUNqRDtJQUNBLFVBQVUsWUFBWSxJQUFJO0dBQzVCO0VBQ0Y7RUFDQSxTQUFTLG1CQUFtQixVQUFVLE1BQU0sT0FBTyxtQkFBbUI7R0FDcEUsT0FBTyxNQUFNLFNBQVMsV0FBWTtJQUNoQyxJQUFJLFdBQVc7SUFDZixJQUFJLFNBQVMsU0FBUyxZQUFZLE1BQU0sS0FBSyxZQUFZLEdBRXJEO1NBQUEsQ0FBQyxzQkFDQSxZQUFZLFNBQVMsWUFBWSxhQUFhLFNBQVMsT0FFeEQ7SUFBQSxPQUNHLElBQUksQ0FBQyxtQkFDVixJQUFJLFlBQVksUUFBUSxhQUFhLFNBQVMsTUFBTTtLQUNsRCw2QkFBNkIsU0FBUyxNQUFNLE1BQU07S0FDbEQsSUFBSSxPQUFPLFFBQVEsU0FBUyxPQUFPLE9BQU8sS0FBSyxTQUFTO0tBQ3hELElBQ0UsYUFBYSxTQUFTLFFBQ3RCLFNBQVMsYUFBYSxNQUFNLE1BQU0sTUFFbEMsT0FBTztJQUNYLE9BQU8sT0FBTztTQUNYLElBQUksQ0FBQyxTQUFTLDBCQUNqQixRQUFRLE1BQVI7S0FDRSxLQUFLO01BQ0gsSUFBSSxDQUFDLFNBQVMsYUFBYSxVQUFVLEdBQUc7TUFDeEMsT0FBTztLQUNULEtBQUs7TUFDSCxPQUFPLFNBQVMsYUFBYSxLQUFLO01BQ2xDLElBQ0UsaUJBQWlCLFFBQ2pCLFNBQVMsYUFBYSxpQkFBaUIsR0FFdkM7V0FDRyxJQUNILFNBQVMsU0FBUyxPQUNsQixTQUFTLGFBQWEsTUFBTSxPQUN6QixRQUFRLFNBQVMsUUFBUSxPQUFPLFNBQVMsT0FDdEMsT0FDQSxTQUFTLFNBQ2YsU0FBUyxhQUFhLGFBQWEsT0FDaEMsUUFBUSxTQUFTLGNBQ2QsT0FDQSxTQUFTLGdCQUNmLFNBQVMsYUFBYSxPQUFPLE9BQzFCLFFBQVEsU0FBUyxRQUFRLE9BQU8sU0FBUyxRQUU1QztNQUNGLE9BQU87S0FDVCxLQUFLO01BQ0gsSUFBSSxTQUFTLGFBQWEsaUJBQWlCLEdBQUc7TUFDOUMsT0FBTztLQUNULEtBQUs7TUFDSCxPQUFPLFNBQVMsYUFBYSxLQUFLO01BQ2xDLEtBQ0csVUFBVSxRQUFRLFNBQVMsTUFBTSxPQUFPLFNBQVMsUUFDaEQsU0FBUyxhQUFhLE1BQU0sT0FDekIsUUFBUSxTQUFTLE9BQU8sT0FBTyxTQUFTLFNBQzNDLFNBQVMsYUFBYSxhQUFhLE9BQ2hDLFFBQVEsU0FBUyxjQUNkLE9BQ0EsU0FBUyxpQkFDakIsUUFDQSxTQUFTLGFBQWEsT0FBTyxLQUM3QixDQUFDLFNBQVMsYUFBYSxVQUFVLEdBRWpDO01BQ0YsT0FBTztLQUNULFNBQ0UsT0FBTztJQUNYO0lBQ0YsV0FBVyxrQkFBa0IsU0FBUyxXQUFXO0lBQ2pELElBQUksU0FBUyxVQUFVO0dBQ3pCO0dBQ0EsT0FBTztFQUNUO0VBQ0EsU0FBUyx1QkFBdUIsVUFBVSxNQUFNLG1CQUFtQjtHQUNqRSxJQUFJLE9BQU8sTUFBTSxPQUFPO0dBQ3hCLE9BQU8sTUFBTSxTQUFTLFdBQVk7SUFDaEMsS0FDRyxNQUFNLFNBQVMsWUFDZCxZQUFZLFNBQVMsWUFDckIsYUFBYSxTQUFTLFNBQ3hCLENBQUMsbUJBRUQsT0FBTztJQUNULFdBQVcsa0JBQWtCLFNBQVMsV0FBVztJQUNqRCxJQUFJLFNBQVMsVUFBVSxPQUFPO0dBQ2hDO0dBQ0EsT0FBTztFQUNUO0VBQ0EsU0FBUyw0QkFBNEIsVUFBVSxtQkFBbUI7R0FDaEUsT0FBTyxNQUFNLFNBQVMsV0FBWTtJQUNoQyxLQUNHLE1BQU0sU0FBUyxZQUNkLFlBQVksU0FBUyxZQUNyQixhQUFhLFNBQVMsU0FDeEIsQ0FBQyxtQk
15852FFRCxPQUFPO0lBQ1QsV0FBVyxrQkFBa0IsU0FBUyxXQUFXO0lBQ2pELElBQUksU0FBUyxVQUFVLE9BQU87R0FDaEM7R0FDQSxPQUFPO0VBQ1Q7RUFDQSxTQUFTLDBCQUEwQixVQUFVO0dBQzNDLE9BQ0UsU0FBUyxTQUFTLCtCQUNsQixTQUFTLFNBQVM7RUFFdEI7RUFDQSxTQUFTLDJCQUEyQixVQUFVO0dBQzVDLE9BQ0UsU0FBUyxTQUFTLGdDQUNqQixTQUFTLFNBQVMsK0JBQ2pCLFNBQVMsY0FBYyxlQUFlO0VBRTVDO0VBQ0EsU0FBUyw4QkFBOEIsVUFBVSxVQUFVO0dBQ3pELElBQUksZ0JBQWdCLFNBQVM7R0FDN0IsSUFBSSxTQUFTLFNBQVMsNEJBQ3BCLFNBQVMsY0FBYztRQUNwQixJQUNILFNBQVMsU0FBUywrQkFDbEIsY0FBYyxlQUFlLDhCQUU3QixTQUFTO1FBQ047SUFDSCxJQUFJLFdBQVcsV0FBWTtLQUN6QixTQUFTO0tBQ1QsY0FBYyxvQkFBb0Isb0JBQW9CLFFBQVE7SUFDaEU7SUFDQSxjQUFjLGlCQUFpQixvQkFBb0IsUUFBUTtJQUMzRCxTQUFTLGNBQWM7R0FDekI7RUFDRjtFQUNBLFNBQVMsa0JBQWtCLE1BQU07R0FDL0IsT0FBTyxRQUFRLE1BQU0sT0FBTyxLQUFLLGFBQWE7SUFDNUMsSUFBSSxXQUFXLEtBQUs7SUFDcEIsSUFBSSxNQUFNLFlBQVksTUFBTSxVQUFVO0lBQ3RDLElBQUksTUFBTSxVQUFVO0tBQ2xCLFdBQVcsS0FBSztLQUNoQixJQUNFLGFBQWEsdUJBQ2IsYUFBYSxnQ0FDYixhQUFhLCtCQUNiLGFBQWEsOEJBQ2IsYUFBYSx1QkFDYixhQUFhLDBCQUNiLGFBQWEsNEJBRWI7S0FDRixJQUFJLGFBQWEscUJBQXFCLGFBQWEsbUJBQ2pELE9BQU87SUFDWDtHQUNGO0dBQ0EsT0FBTztFQUNUO0VBQ0EsU0FBUyx5Q0FBeUMsVUFBVTtHQUMxRCxJQUFJLE1BQU0sU0FBUyxVQUFVO0lBQzNCLEtBQ0UsSUFBSSx3QkFBd0IsU0FBUyxTQUFTLFlBQVksR0FDeEQsb0JBQW9CLENBQUMsR0FDckIsYUFBYSxTQUFTLFlBQ3RCLElBQUksR0FDTixJQUFJLFdBQVcsUUFDZixLQUNBO0tBQ0EsSUFBSSxPQUFPLFdBQVc7S0FDdEIsa0JBQWtCLDZCQUE2QixLQUFLLElBQUksS0FDdEQsWUFBWSxLQUFLLEtBQUssWUFBWSxJQUM5QiwyQkFBMkIsUUFBUSxJQUNuQyxLQUFLO0lBQ2I7SUFDQSxPQUFPO0tBQUUsTUFBTTtLQUF1QixPQUFPO0lBQWtCO0dBQ2pFO0dBQ0EsT0FBTyxNQUFNLFNBQVMsV0FDbEIsU0FBUyxTQUFTLHNCQUNoQjtJQUFFLE1BQU07SUFBWSxPQUFPLENBQUM7R0FBRSxJQUM5QjtJQUFFLE1BQU07SUFBWSxPQUFPLENBQUM7R0FBRSxJQUNoQyxTQUFTO0VBQ2Y7RUFDQSxTQUFTLCtCQUErQixjQUFjLE1BQU0sYUFBYTtHQUN2RSxPQUFPLFNBQVMsZUFDZCxDQUFDLE1BQU0sWUFBWSwrQkFDaEIsYUFBYSxjQUFjLE9BQ3ZCLGVBQWUsUUFDZCxPQUFPLGtDQUFrQyxJQUFJLEdBQzlDLGVBQ0Msa0NBQWtDLGFBQWEsU0FBUyxNQUN4RCxPQUNJLE9BQ0EsYUFBYSxZQUN2QixnQkFDQTtFQUNOO0VBQ0EsU0FBUyxnREFDUCxtQkFDQTtHQUNBLG9CQUFvQixrQkFBa0I7R0FDdEMsS0FBSyxJQUFJLFFBQVEsR0FBRyxvQkFBcUI7SUFDdkMsSUFBSSxNQUFNLGtCQUFrQixVQUFVO0tBQ3BDLElBQUksT0FBTyxrQkFBa0I7S0FDN0IsSUFBSSxTQUFTLHFCQUFxQixTQUFTLG1CQUFtQjtNQUM1RCxJQUFJLE1BQU0sT0FDUixPQUFPLGtCQUFrQixrQkFBa0IsV0FBVztNQUN4RDtLQUNGLE9BQ0UsU0FBVSx1QkFDUixTQUFTLGdDQUNULFNBQVMsK0JBQ1QsU0FBUyw4QkFDVCxTQUFTLHVCQUNUO0lBQ047SUFDQSxvQkFBb0Isa0JBQWtCO0dBQ3hDO0dBQ0EsT0FBTztFQUNUO0VBQ0EsU0FBUywyQkFBMkIsZ0JBQWdCO0dBQ2xELGlCQUFpQixlQUFlO0dBQ2hDLEtBQUssSUFBSSxRQUFRLEdBQUcsaUJBQWtCO0lBQ3BDLElBQUksTUFBTSxlQUFlLFVBQVU7S0FDakMsSUFBSSxPQUFPLGVBQWU7S0FDMUIsSUFDRSxTQUFTLHVCQUNULFNBQVMsZ0NBQ1QsU0FBUywrQkFDVCxTQUFTLDhCQUNULFNBQVMscUJBQ1Q7TUFDQSxJQUFJLE1BQU0sT0FBTyxPQUFPO01BQ3hCO0tBQ0YsT0FDRSxTQUFVLHFCQUFxQixTQUFTLHFCQUN0QztJQUNOO0lBQ0EsaUJBQWlCLGVBQWU7R0FDbEM7R0FDQSxPQUFPO0VBQ1Q7RUFDQSxTQUFTLHdCQUF3QixXQUFXO0dBQzFDLGlCQUFpQixTQUFTO0VBQzVCO0VBQ0EsU0FBUywrQkFBK0Isa0JBQWtCO0dBQ3hELGlCQUFpQixnQkFBZ0I7RUFDbkM7RUFDQSxTQUFTLCtCQUErQixrQkFBa0I7R0FDeEQsaUJBQWlCLGdCQUFnQjtFQUNuQztFQUNBLFNBQVMsb0JBQW9CLE1BQU0sY0FBYztHQUMvQyxTQUFTLGNBQWM7SUFDckIsV0FBVyxDQUFDO0dBQ2Q7R0FDQSxJQUFJLEtBQUssY0FBYyxrQkFBa0IsTUFBTSxPQUFPLENBQUM7R0FDdkQsSUFBSSxXQUFXLENBQUM7R0FDaEIsSUFBSTtJQUNGLEtBQUssY0FBYyxpQkFBaUIsU0FBUyxhQUFhLENBQUMsQ0FBQyxJQUN6RCxLQUFLLFNBQVMsWUFBWSxVQUFVLE1BQUEsQ0FBTyxLQUFLLE1BQU0sWUFBWTtHQUN2RSxVQUFVO0lBQ1IsS0FBSyxjQUFjLG9CQUFvQixTQUFTLGFBQWEsQ0FBQyxDQUFDO0dBQ2pFO0dBQ0EsT0FBTztFQUNUO0VBQ0EsU0FBUyx5QkFBeUIsVUFBVTtHQUMxQywyQkFBMkIsV0FBWTtJQUNyQywyQkFBMkIsU0FBVSxNQUFNO0tBQ3pDLE9BQU8sU0FBUyxJQUFJO0lBQ3RCLENBQUM7R0FDSCxDQUFDO0VBQ0g7RUFDQSxTQUFTLHlCQUNQLE1BQ0EsT0FDQSx1QkFDQSxhQUNBLHVCQUNBO0dBQ0EseUJBQ0UsbUJBQW1CLE1BQU0sWUFBWSxZQUFZO0dBQ25ELFFBQVEsa0NBQWtDLHFCQUFxQjtHQUMvRCxRQUFRLE1BQVI7SUFDRSxLQUFLO0tBQ0gsT0FBTyxNQUFNO0tBQ2IsSUFBSSxDQUFDLE1BQ0gsTUFBTSxNQUNKLHdQQUNGO0tBQ0YsT0FBTztJQUNULEtBQUs7S0FDSCxPQUFPLE1BQU07S0FDYixJQUFJLENBQUMsTUFDSCxNQUFNLE1BQ0osaU9BQ0Y7S0FDRixPQUFPO0lBQ1QsS0FBSztLQUNILE9BQU8sTUFBTTtLQUNiLElBQUksQ0FBQyxNQUNILE1BQU0sTUFDSixpT0FDRjtLQUNGLE9BQU87SUFDVCxTQUNFLE1BQU0sTUFDSix5R0FDRjtHQUNKO0VBQ0Y7RUFDQSxTQUFTLHlCQUNQLE1BQ0EsT0FDQSxVQUNBLHdCQUNBO0dBQ0EsSUFDRSxDQUFDLFNBQVMsaUNBQ1Ysb0JBQW9CLFFBQVEsR0FDNUI7SUFDQSxJQUFJLFVBQVUsU0FBUyxRQUFRLFlBQVk7SUFDM0MsUUFBUSxNQUNOLDBXQUNBLFNBQ0EsU0FDQSxPQUNGO0dBQ0Y7R0FDQSxRQUFRLE1BQVI7SUFDRSxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUssUUFDSDtJQUNGLFNBQ0UsUUFBUSxNQUNOLHlHQUNGO0dBQ0o7R0FDQSxLQUFLLFVBQVUsU0FBUyxZQUFZLFFBQVEsU0FDMUMsU0FBUyxvQkFBb0IsUUFBUSxFQUFFO0dBQ3pDLHFCQUFxQixVQUFVLE1BQU0sS0FBSztHQUMxQyxTQUFTLHVCQUF1QjtHQUNoQyxTQUFTLG9CQUFvQjtFQUMvQjtFQUNBLFNBQVMseUJBQXlCLFVBQVUsTUFBTSxPQUFPO0dBQ3ZELEtBQUssSUFBSSxXQUFXLE9BQU87SUFDekIsSUFBSSxZQUFZLE1BQU07SUFDdEIsTUFBTSxlQUFlLE9BQU8sS0FDMUIsUUFBUSxhQUNSLFF
15852BQVEsVUFBVSxNQUFNLFNBQVMsTUFBTSxZQUFZLFNBQVM7R0FDaEU7R0FDQSxRQUFRLE1BQU0sNEJBQTRCLFNBQVMsY0FBYztHQUNqRSxTQUFTLFlBQVksV0FBVyxTQUFTLFVBQVU7R0FDbkQsc0JBQXNCLFFBQVE7RUFDaEM7RUFDQSxTQUFTLG1DQUFtQyxVQUFVO0dBQ3BELEtBQUssSUFBSSxhQUFhLFNBQVMsWUFBWSxXQUFXLFNBQ3BELFNBQVMsb0JBQW9CLFdBQVcsRUFBRTtHQUM1QyxzQkFBc0IsUUFBUTtFQUNoQztFQUNBLFNBQVMsaUJBQWlCLFdBQVc7R0FDbkMsSUFBSSxlQUFlLE9BQU8sVUFBVSxhQUFhO0lBQy9DLElBQUksV0FBVyxVQUFVLFlBQVk7SUFDckMsSUFBSSxNQUFNLFNBQVMsWUFBWSxPQUFPLFNBQVMsVUFDN0MsT0FBTztHQUNYO0dBQ0EsT0FBTyxNQUFNLFVBQVUsV0FBVyxZQUFZLFVBQVU7RUFDMUQ7RUFDQSxTQUFTLGFBQWEsS0FBSyxNQUFNLGFBQWE7R0FDNUMsSUFBSSxnQkFBZ0I7R0FDcEIsSUFBSSxpQkFBaUIsYUFBYSxPQUFPLFFBQVEsTUFBTTtJQUNyRCxJQUFJLHFCQUNGLCtDQUErQyxJQUFJO0lBQ3JELHFCQUNFLGdCQUFlLE1BQU0sZ0JBQWMscUJBQXFCO0lBQzFELGFBQWEsT0FBTyxnQkFDakIsc0JBQXNCLG9CQUFtQixjQUFjO0lBQzFELGVBQWUsSUFBSSxrQkFBa0IsTUFDbEMsZUFBZSxJQUFJLGtCQUFrQixHQUNyQyxNQUFNO0tBQU87S0FBa0I7S0FBbUI7SUFBSyxHQUN4RCxTQUFTLGNBQWMsY0FBYyxrQkFBa0IsTUFDbkQsT0FBTyxjQUFjLGNBQWMsTUFBTSxHQUMzQyxxQkFBcUIsTUFBTSxRQUFRLEdBQUcsR0FDdEMsb0JBQW9CLElBQUksR0FDeEIsY0FBYyxLQUFLLFlBQVksSUFBSTtHQUN6QztFQUNGO0VBQ0EsU0FBUyxZQUFZLE1BQU0sY0FBYyxjQUFjLGlCQUFpQjtHQUN0RSxJQUFJLGdCQUFnQixlQUFlLHdCQUF3QixXQUN2RCxpQkFBaUIsWUFBWSxJQUM3QjtHQUNKLElBQUksQ0FBQyxjQUNILE1BQU0sTUFDSixpRUFDRjtHQUNGLFFBQVEsTUFBUjtJQUNFLEtBQUs7SUFDTCxLQUFLLFNBQ0gsT0FBTztJQUNULEtBQUssU0FDSCxPQUFPLGFBQWEsT0FBTyxhQUFhLGNBQ3RDLGFBQWEsT0FBTyxhQUFhLFFBQzdCLGVBQWUsWUFBWSxhQUFhLElBQUksR0FDN0MsZUFDQyxxQkFBcUIsWUFBWSxDQUFDLENBQUMsaUJBQ3BDLGtCQUFrQixhQUFhLElBQUksWUFBWSxHQUNoRCxvQkFDSSxrQkFBa0I7S0FDbEIsTUFBTTtLQUNOLFVBQVU7S0FDVixPQUFPO0tBQ1AsT0FBTztJQUNULEdBQ0EsYUFBYSxJQUFJLGNBQWMsZUFBZSxJQUNoRCxtQkFDQTtLQUFFLE1BQU07S0FBUSxVQUFVO0tBQU0sT0FBTztLQUFHLE9BQU87SUFBSztJQUM1RCxLQUFLO0tBQ0gsSUFDRSxpQkFBaUIsYUFBYSxPQUM5QixhQUFhLE9BQU8sYUFBYSxRQUNqQyxhQUFhLE9BQU8sYUFBYSxZQUNqQztNQUNBLE9BQU8sWUFBWSxhQUFhLElBQUk7TUFDcEMsSUFBSSxVQUFVLHFCQUFxQixZQUFZLENBQUMsQ0FBQyxpQkFDL0MsWUFBWSxRQUFRLElBQUksSUFBSTtNQUM5QixjQUNJLGVBQWUsYUFBYSxpQkFBaUIsY0FDOUMsWUFBWTtPQUNYLE1BQU07T0FDTixVQUFVO09BQ1YsT0FBTztPQUNQLE9BQU87UUFBRSxTQUFTO1FBQVcsU0FBUztPQUFLO01BQzdDLEdBQ0EsUUFBUSxJQUFJLE1BQU0sU0FBUyxJQUMxQixVQUFVLGFBQWEsY0FDdEIsNkJBQTZCLElBQUksQ0FDbkMsS0FDSSxRQUFRLE9BQ04sVUFBVSxXQUFXLFNBQ3RCLFVBQVUsTUFBTSxVQUFVLFNBQVMsYUFDbEMsVUFBVSxnQkFBZ0IsSUFBSSxJQUFJLEdBQ3BDLFlBQ0ksVUFBVTtPQUNWLEtBQUs7T0FDTCxJQUFJO09BQ0osTUFBTSxhQUFhO09BQ25CLGFBQWEsYUFBYTtPQUMxQixXQUFXLGFBQWE7T0FDeEIsT0FBTyxhQUFhO09BQ3BCLFVBQVUsYUFBYTtPQUN2QixnQkFBZ0IsYUFBYTtNQUMvQixHQUNBLGdCQUFnQixJQUFJLE1BQU0sT0FBTyxJQUNuQyxrQkFDRSxjQUNBLE1BQ0EsU0FDQSxVQUFVLEtBQ1o7T
15852UFDTixJQUFJLGdCQUFnQixTQUFTLGlCQUMzQixNQUNJLGVBQ0EsYUFDQSxnQ0FBZ0MsWUFBWSxJQUM1QyxXQUNBLGdDQUFnQyxZQUFZLEdBQzlDLE1BQ0UsZ1FBQ0UsWUFDSjtNQUVKLE9BQU87S0FDVDtLQUNBLElBQUksZ0JBQWdCLFNBQVMsaUJBQzNCLE1BQ0ksZUFDQSxhQUNBLGdDQUFnQyxZQUFZLElBQzVDLFdBQ0EsZ0NBQWdDLFlBQVksR0FDOUMsTUFDRSx3UUFDRSxZQUNKO0tBRUosT0FBTztJQUNULEtBQUssVUFDSCxPQUNHLGVBQWUsYUFBYSxPQUM1QixlQUFlLGFBQWEsS0FDN0IsYUFBYSxPQUFPLGdCQUNwQixnQkFDQSxlQUFlLE9BQU8sZ0JBQ3RCLGFBQWEsT0FBTyxnQkFDZCxlQUFlLGFBQWEsWUFBWSxHQUN6QyxlQUNDLHFCQUFxQixZQUFZLENBQUMsQ0FBQyxrQkFDcEMsa0JBQWtCLGFBQWEsSUFBSSxZQUFZLEdBQ2hELG9CQUNJLGtCQUFrQjtLQUNsQixNQUFNO0tBQ04sVUFBVTtLQUNWLE9BQU87S0FDUCxPQUFPO0lBQ1QsR0FDQSxhQUFhLElBQUksY0FBYyxlQUFlLElBQ2hELG1CQUNBO0tBQUUsTUFBTTtLQUFRLFVBQVU7S0FBTSxPQUFPO0tBQUcsT0FBTztJQUFLO0lBRTlELFNBQ0UsTUFBTSxNQUNKLHlEQUNFLE9BQ0EsNkJBQ0o7R0FDSjtFQUNGO0VBQ0EsU0FBUyxnQ0FBZ0MsT0FBTztHQUM5QyxJQUFJLGlCQUFpQixHQUNuQixjQUFjO0dBQ2hCLGFBQWEsT0FBTyxNQUFNLE9BQ3JCLGtCQUFtQixlQUFlLFlBQVcsTUFBTSxNQUFNLFFBQzFELGVBQWUsS0FBSyxPQUFPLEtBQUssTUFDL0Isa0JBQ0EsZUFDQyxhQUNDLFNBQVMsTUFBTSxNQUFNLFNBQVMsa0JBQWtCLE9BQU8sTUFBTSxPQUM5RDtHQUNOLGFBQWEsT0FBTyxNQUFNLFFBQ3JCLGtCQUFtQixlQUFlLGFBQVksTUFBTSxPQUFPLFFBQzVELGVBQWUsS0FBSyxPQUFPLE1BQU0sTUFDaEMsa0JBQ0EsZUFDQyxjQUNDLFNBQVMsTUFBTSxPQUNaLFNBQ0Esa0JBQWtCLE9BQU8sTUFBTSxRQUNuQztHQUNOLGFBQWEsT0FBTyxNQUFNLGNBQ3JCLGtCQUNBLGVBQWUsbUJBQWtCLE1BQU0sYUFBYSxRQUNyRCxlQUFlLEtBQUssT0FBTyxZQUFZLE1BQ3RDLGtCQUNBLGVBQ0MsbUJBQ0MsU0FBUyxNQUFNLGFBQ1osU0FDQSxrQkFBa0IsT0FBTyxNQUFNLGNBQ25DO0dBQ04sT0FBTyxvQkFBb0IsS0FBSyxDQUFDLENBQUMsU0FBUyxtQkFDeEMsZUFBZTtHQUNsQixPQUFPLGNBQWM7RUFDdkI7RUFDQSxTQUFTLFlBQVksTUFBTTtHQUN6QixPQUNFLFlBQVcsK0NBQStDLElBQUksSUFBSTtFQUV0RTtFQUNBLFNBQVMsNkJBQTZCLEtBQUs7R0FDekMsT0FBTyw4QkFBNEIsTUFBTTtFQUMzQztFQUNBLFNBQVMsNEJBQTRCLFVBQVU7R0FDN0MsT0FBTyxPQUFPLENBQUMsR0FBRyxVQUFVO0lBQzFCLG1CQUFtQixTQUFTO0lBQzVCLFlBQVk7R0FDZCxDQUFDO0VBQ0g7RUFDQSxTQUFTLGtCQUFrQixlQUFlLEtBQUssY0FBYyxPQUFPO0dBQ2xFLElBQ0csTUFBTSxjQUFjLGNBQ25CLHlDQUFxQyxNQUFNLEdBQzdDLEdBRUk7UUFBQSxDQUFDLE1BQU0sSUFBSSx5QkFBeUI7S0FDdEMsTUFBTSxVQUFVO0tBQ2hCO0lBQ0Y7VUFFQSxNQUFPLGNBQWMsY0FBYyxNQUFNLEdBQ3RDLElBQUksMEJBQTBCLENBQUMsR0FDL0IsSUFBSSxTQUFTLElBQUksVUFBVSx1QkFBdUIsS0FBSyxNQUFNLEdBQUcsR0FDakUscUJBQXFCLEtBQUssUUFBUSxZQUFZLEdBQzlDLG9CQUFvQixHQUFHLEdBQ3ZCLGNBQWMsS0FBSyxZQUFZLEdBQUc7R0FDdEMsTUFBTSxVQUFVO0dBQ2hCLElBQUksaUJBQWlCLFFBQVEsV0FBWTtJQUN2QyxPQUFRLE1BQU0sV0FBVztHQUMzQixDQUFDO0dBQ0QsSUFBSSxpQkFBaUIsU0FBUyxXQUFZO0lBQ3hDLE9BQVEsTUFBTSxXQUFXO0dBQzNCLENBQUM7RUFDSDtFQUNBLFNBQVMsYUFBYSxLQUFLO0dBQ3pCLE9BQ0UsWUFBVywrQ0FBK0MsR0FBRyxJQUFJO0VBRXJFO0VBQ0EsU0FBUyx5QkFBeUIsS0FBSztHQUNyQyxPQUFPLGtCQUFrQjtFQUMzQjtFQUNBLFNBQVMsZ0JBQWdCLGVBQWUsVUFBVSxPQUFPO0dBQ3ZELFNBQVM7R0FDVCxJQUFJLFNBQVMsU0FBUyxVQUNwQixRQUFRLFNBQVMsTUFBakI7SUFDRSxLQUFLO0tBQ0gsSUFBSSxXQUFXLGNBQWMsY0FDM0Isd0JBQ0UsK0NBQStDLE1BQU0sSUFBSSxJQUN6RCxLQUNKO0tBQ0EsSUFBSSxVQUNGLE9BQ0csU0FBUyxXQUFXLFVBQ3JCLG9CQUFvQixRQUFRLEdBQzVCO0tBRUosSUFBSSxhQUFhLE9BQU8sQ0FBQyxHQUFHLE9BQU87TUFDakMsYUFBYSxNQUFNO01BQ25CLG1CQUFtQixNQUFNO01BQ3pCLE1BQU07TUFDTixZQUFZO0tBQ2QsQ0FBQztLQUNELFlBQ0UsY0FBYyxpQkFBaUIsY0FBQSxDQUMvQixjQUFjLE9BQU87S0FDdkIsb0JBQW9CLFFBQVE7S0FDNUIscUJBQXFCLFVBQVUsU0FBUyxVQUFVO0tBQ2xELGlCQUFpQixVQUFVLE1BQU0sWUFBWSxhQUFhO0tBQzFELE9BQVEsU0FBUyxXQUFXO0lBQzlCLEtBQUs7S0FDSCxhQUFhLFlBQVksTUFBTSxJQUFJO0tBQ25DLElBQUksWUFBWSxjQUFjLGNBQzVCLDZCQUE2QixVQUFVLENBQ3pDO0tBQ0EsSUFBSSxXQUNGLE9BQ0csU0FBUyxNQUFNLFdBQVcsVUFDMUIsU0FBUyxXQUFXLFdBQ3JCLG9CQUFvQixTQUFTLEdBQzdCO0tBRUosV0FBVyw0QkFBNEIsS0FBSztLQUM1QyxDQUFDLGFBQWEsZ0JBQWdCLElBQUksVUFBVSxNQUMxQywrQkFBK0IsVUFBVSxVQUFVO0tBQ3JELGFBQ0UsY0FBYyxpQkFBaUIsY0FBQSxDQUMvQixjQUFjLE1BQU07S0FDdEIsb0JBQW9CLFNBQVM7S0FDN0IsSUFBSSxlQUFlO0tBQ25CLGFBQWEsS0FBSyxJQUFJLFFBQVEsU0FBVSxTQUFTLFFBQVE7TUFDdkQsYUFBYSxTQUFTO01BQ3RCLGFBQWEsVUFBVTtLQUN6QixDQUFDO0tBQ0QscUJBQXFCLFdBQVcsUUFBUSxRQUFRO0tBQ2hELFNBQVMsTUFBTSxXQUFXO0tBQzFCLGlCQUFpQixXQUFXLE1BQU0sWUFBWSxhQUFhO0tBQzNELE9BQVEsU0FBUyxXQUFXO0lBQzlCLEtBQUs7S0FDSCxZQUFZLGFBQWEsTUFBTSxHQUFHO0tBQ2xDLElBQ0csYUFBYSxjQUFjLGNBQzFCLHlCQUF5QixTQUFTLENBQ3BDLEdBRUEsT0FDRyxTQUFTLFdBQVcsWUFDckIsb0JBQW9CLFVBQVUsR0FDOUI7S0FFSixXQUFXO0tBQ1gsSUFBSyxhQUFhLGdCQUFnQixJQUFJLFNBQVMsR0FDN0MsV0FBWSxPQUFPLENBQUMsR0FBRyxLQUFLLEdBQzFCLDJCQUEyQixVQUFVLFVBQVU7S0FDbkQsZ0JBQWdCLGNBQWMsaUJBQWlCO0tBQy9DLGFBQWEsY0FBYyxjQUFjLFFBQVE7S0FDakQsb0JBQW9CLFVBQVU7S0FDOUIscUJBQXFCLFlBQVksUUFBUSxRQUFRO0tBQ2pELGNBQWMsS0FBSyxZQUFZLFVBQVU7S0FDekMsT0FBUSxTQUFTLFdBQVc7SUFDOUIsS0FBSyxRQUNILE9BQU87SUFDVCxTQUNFLE1BQU0sTUFDSixzRUFDRSxTQUFTLE9BQ1QsNkJBQ0o7R0FDSjtRQUVBLGlCQUFpQixTQUFTLFNBQ3ZCLFNBQVMsTUFBTSxVQUFVLGNBQWMsY0FDdEMsV0FBVyxTQUFTLFVBQ3JCLFNBQVMsTUFBTSxXQUFXLFVBQzNCLGlCQUFpQixVQUFVLE1BQU0sWUFBWSxhQUFhO0dBQzlELE9BQU8sU0FBUztFQUNsQjtFQUNBLFNBQVMsaUJBQWlCLFVBQVUsWUFBWSxNQUFNO0dBQ3BELEtBQ0UsSUFBSSxRQUFRLEtBQUssaUJBQ2Isa0VBQ0YsR0FDQSxPQUFPLE1BQU0sU0FBUyxNQUFNLE1BQU0sU0FBUyxLQUFLLE1BQ2hELFFBQVEsTUFDUixJQUFJLEdBQ04sSUFBSSxNQUFNLFFBQ1YsS0FDQTtJQUNBLElBQUksT0FBTyxNQUFNO0lBQ2pCLElBQUksS0FBSyxRQUFRLGVBQWUsWUFBWSxRQUFRO1NBQy9DLElBQUksVUFBVSxNQUFNO0dBQzNCO0dBQ0EsUUFDSSxNQUFNLFdBQVcsYUFBYSxVQUFVLE1BQU0sV0FBVyxLQUN2RCxhQUFhLE1BQU0sS0FBSyxXQUFXLEtBQUssT0FBTyxNQUNqRCxXQUFXLGFBQWEsVUFBVSxXQUFXLFVBQVU7
15852RUFDN0Q7RUFDQSxTQUFTLCtCQUErQixpQkFBaUIsY0FBYztHQUNyRSxnQkFDbUIsZ0JBQWMsYUFBYTtHQUM5QyxnQkFDbUIsbUJBQWlCLGFBQWE7R0FDakQsZ0JBQ21CLFVBQVEsYUFBYTtFQUMxQztFQUNBLFNBQVMsMkJBQTJCLGFBQWEsY0FBYztHQUM3RCxZQUNlLGdCQUFjLGFBQWE7R0FDMUMsWUFDZSxtQkFBaUIsYUFBYTtHQUM3QyxZQUNlLGNBQVksYUFBYTtFQUMxQztFQUNBLFNBQVMsNEJBQTRCLE1BQU0sY0FBYyxlQUFlO0dBQ3RFLElBQUksU0FBUyxXQUFXO0lBQ3RCLElBQUksd0JBQVEsSUFBSSxJQUFJO0lBQ3BCLElBQUksU0FBVSw0QkFBWSxJQUFJLElBQUk7SUFDbEMsT0FBTyxJQUFJLGVBQWUsS0FBSztHQUNqQyxPQUNFLFNBQVUsV0FDUCxRQUFRLE9BQU8sSUFBSSxhQUFhLEdBQ2pDLFVBQVcsd0JBQVEsSUFBSSxJQUFJLEdBQUksT0FBTyxJQUFJLGVBQWUsS0FBSztHQUNsRSxJQUFJLE1BQU0sSUFBSSxJQUFJLEdBQUcsT0FBTztHQUM1QixNQUFNLElBQUksTUFBTSxJQUFJO0dBQ3BCLGdCQUFnQixjQUFjLHFCQUFxQixJQUFJO0dBQ3ZELEtBQUssU0FBUyxHQUFHLFNBQVMsY0FBYyxRQUFRLFVBQVU7SUFDeEQsSUFBSSxPQUFPLGNBQWM7SUFDekIsSUFDRSxFQUNFLEtBQUssNEJBQ0wsS0FBSyx3QkFDSixXQUFXLFFBQVEsaUJBQWlCLEtBQUssYUFBYSxLQUFLLE1BRTlELEtBQUssaUJBQWlCLGVBQ3RCO0tBQ0EsSUFBSSxVQUFVLEtBQUssYUFBYSxZQUFZLEtBQUs7S0FDakQsVUFBVSxPQUFPO0tBQ2pCLElBQUksV0FBVyxNQUFNLElBQUksT0FBTztLQUNoQyxXQUFXLFNBQVMsS0FBSyxJQUFJLElBQUksTUFBTSxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUM7SUFDNUQ7R0FDRjtHQUNBLE9BQU87RUFDVDtFQUNBLFNBQVMsZUFBZSxlQUFlLE1BQU0sVUFBVTtHQUNyRCxnQkFBZ0IsY0FBYyxpQkFBaUI7R0FDL0MsY0FBYyxLQUFLLGFBQ2pCLFVBQ0EsWUFBWSxPQUFPLGNBQWMsY0FBYyxjQUFjLElBQUksSUFDbkU7RUFDRjtFQUNBLFNBQVMsb0JBQW9CLE1BQU0sT0FBTyxhQUFhO0dBQ3JELElBQUksOEJBQ0YsQ0FBQyxZQUFZLGFBQWE7R0FDNUIsSUFDRSxZQUFZLFlBQVksMkJBQ3hCLFFBQVEsTUFBTSxVQUVkLE9BQ0UsQ0FBQywrQkFDQyxRQUFRLE1BQU0sWUFDYixXQUFXLFFBQ1YsWUFBWSxRQUNaLFlBQVksUUFDWixXQUFXLFFBQ1gsYUFBYSxRQUNmLFFBQVEsTUFDTixxVUFDQSxNQUNBLElBQ0YsR0FDRixDQUFDO0dBRUwsUUFBUSxNQUFSO0lBQ0UsS0FBSztJQUNMLEtBQUssU0FDSCxPQUFPLENBQUM7SUFDVixLQUFLO0tBQ0gsSUFDRSxhQUFhLE9BQU8sTUFBTSxjQUMxQixhQUFhLE9BQU8sTUFBTSxRQUMxQixPQUFPLE1BQU0sTUFDYjtNQUNBLCtCQUNFLFFBQVEsTUFDTiwwakJBQ0Y7TUFDRjtLQUNGO0tBQ0EsT0FBTyxDQUFDO0lBQ1YsS0FBSztLQUNILElBQ0UsYUFBYSxPQUFPLE1BQU0sT0FDMUIsYUFBYSxPQUFPLE1BQU0sUUFDMUIsT0FBTyxNQUFNLFFBQ2IsTUFBTSxVQUNOLE1BQU0sU0FDTjtNQUNBLElBQ0UsaUJBQWlCLE1BQU0sT0FDdkIsYUFBYSxPQUFPLE1BQU0sWUFDMUI7T0FDQSxPQUFPLE1BQU07T0FDYixJQUFJLFVBQVUsTUFBTSxTQUNsQixXQUFXLE1BQU07T0FDbkIsY0FBYyxDQUFDO09BQ2YsTUFBTSxVQUFVLFlBQVksS0FBSyxVQUFVO09BQzNDLFdBQVcsWUFBWSxLQUFLLFdBQVc7T0FDdkMsUUFBUSxZQUFZLFlBQVksS0FBSyxZQUFZO09BQ2pELFVBQVUsa0JBQWtCLGFBQWEsS0FBSztPQUM5QyxXQUFXLE1BQU0sWUFBWSxTQUFTLFVBQVU7T0FDaEQsV0FDRSxNQUFNLFlBQVksU0FBUyxRQUFRLFVBQVUsU0FBUztPQUN4RCxZQUFZLFVBQ1YsUUFBUSxNQUNOLCtjQUNBLE1BQ0EsVUFDQSxPQUNGO01BQ0o7TUFDQSxnQ0FDRyxhQUFhLE9BQU8sTUFBTSxPQUMzQixhQUFhLE9BQU8sTUFBTSxRQUMxQixPQUFPLE1BQU0sT0FDVCxRQUFRLE1BQ04sK0tBQ0YsS0FDQyxNQUFNLFdBQVcsTUFBTSxXQUN4QixRQUFRLE1BQ04sa01BQ0Y7TUFDTjtLQUNGO0tBQ0EsUUFBUSxNQUFNLEtBQWQ7TUFDRSxLQUFLLGNBQ0gsT0FDRyxPQUFPLE1BQU0sWUFDYixRQUFRLE1BQU0sVUFDZixhQUFhLE9BQU8sUUFDbEIsK0JBQ0EsUUFBUSxNQUNOLHFMQUNGLEdBQ0YsYUFBYSxPQUFPLFFBQVEsUUFBUTtNQUV4QyxTQUNFLE9BQU8sQ0FBQztLQUNaO0lBQ0YsS0FBSztLQUNILE9BQ0UsTUFBTSxTQUNOLGVBQWUsT0FBTyxNQUFNLFNBQzVCLGFBQWEsT0FBTyxNQUFNO0tBQzVCLElBQ0UsQ0FBQyxRQUNELE1BQU0sVUFDTixNQUFNLFdBQ04sQ0FBQyxNQUFNLE9BQ1AsYUFBYSxPQUFPLE1BQU0sS0FDMUI7TUFDQSxnQ0FDRyxPQUNHLE1BQU0sVUFBVSxNQUFNLFVBQ3BCLFFBQVEsTUFDTixvTUFDRixJQUNBLFFBQVEsTUFDTixzT0FDRixJQUNGLFFBQVEsTUFDTiwwSkFDRjtNQUNOO0tBQ0Y7S0FDQSxPQUFPLENBQUM7SUFDVixLQUFLO0lBQ0wsS0FBSyxZQUNILCtCQUNFLFFBQVEsTUFDTix5RkFDQSxJQUNGO0dBQ047R0FDQSxPQUFPLENBQUM7RUFDVjtFQUNBLFNBQVMsaUJBQWlCLE1BQU0sT0FBTztHQUNyQyxPQUNFLFVBQVUsUUFDVixRQUFRLE1BQU0sT0FDZCxPQUFPLE1BQU0sT0FDYixRQUFRLE1BQU0sVUFDZCxXQUFXLE1BQU07RUFFckI7RUFDQSxTQUFTLGdCQUFnQixVQUFVO0dBQ2pDLE9BQU8saUJBQWlCLFNBQVMsU0FDOUIsU0FBUyxNQUFNLFVBQVUsYUFBYSxZQUNyQyxDQUFDLElBQ0QsQ0FBQztFQUNQO0VBQ0EsU0FBUyxtQkFBbUIsVUFBVTtHQUNwQyxRQUNHLFNBQVMsU0FBUyxRQUNsQixTQUFTLFVBQVUsUUFDbkIsYUFBYSxPQUFPLG1CQUFtQixtQkFBbUIsS0FDM0Q7RUFFSjtFQUNBLFNBQVMsZ0JBQWdCLE9BQU8sVUFBVTtHQUN4QyxlQUFlLE9BQU8sU0FBUyxXQUM1QixNQUFNLFlBQ1AsU0FBUyxhQUNMLE1BQU0sWUFBWSxtQkFBbUIsUUFBUSxHQUMvQyxNQUFNLGdCQUFnQixLQUFLLFFBQVEsSUFDcEMsUUFBUSxlQUFlLEtBQUssS0FBSyxHQUNsQyxTQUFTLE9BQU8sQ0FBQyxDQUFDLEtBQUssT0FBTyxLQUFLO0VBQ3ZDO0VBQ0EsU0FBUyxnQkFBZ0IsT0FBTyxlQUFlLFVBQVUsT0FBTztHQUM5RCxJQUNFLGlCQUFpQixTQUFTLFNBQ3pCLGFBQWEsT0FBTyxNQUFNLFNBQ3pCLENBQUMsTUFBTSxXQUFXLE1BQU0sS0FBSyxDQUFDLENBQUMsYUFDaEMsU0FBUyxNQUFNLFVBQVUsY0FBYyxXQUN4QztJQUNBLElBQUksU0FBUyxTQUFTLFVBQVU7S0FDOUIsSUFBSSxNQUFNLFlBQVksTUFBTSxJQUFJLEdBQzlCLFdBQVcsY0FBYyxjQUN2Qiw2QkFBNkIsR0FBRyxDQUNsQztLQUNGLElBQUksVUFBVTtNQUNaLGdCQUFnQixTQUFTO01BQ3pCLFNBQVMsaUJBQ1AsYUFBYSxPQUFPLGlCQUNwQixlQUFlLE9BQU8sY0FBYyxTQUNuQyxNQUFNLFNBQ04sUUFBUSxZQUFZLEtB
15852QUssS0FBSyxHQUMvQixjQUFjLEtBQUssT0FBTyxLQUFLO01BQ2pDLFNBQVMsTUFBTSxXQUFXO01BQzFCLFNBQVMsV0FBVztNQUNwQixvQkFBb0IsUUFBUTtNQUM1QjtLQUNGO0tBQ0EsV0FBVyxjQUFjLGlCQUFpQjtLQUMxQyxRQUFRLDRCQUE0QixLQUFLO0tBQ3pDLENBQUMsTUFBTSxnQkFBZ0IsSUFBSSxHQUFHLE1BQzVCLCtCQUErQixPQUFPLEdBQUc7S0FDM0MsV0FBVyxTQUFTLGNBQWMsTUFBTTtLQUN4QyxvQkFBb0IsUUFBUTtLQUM1QixJQUFJLGVBQWU7S0FDbkIsYUFBYSxLQUFLLElBQUksUUFBUSxTQUFVLFNBQVMsUUFBUTtNQUN2RCxhQUFhLFNBQVM7TUFDdEIsYUFBYSxVQUFVO0tBQ3pCLENBQUM7S0FDRCxxQkFBcUIsVUFBVSxRQUFRLEtBQUs7S0FDNUMsU0FBUyxXQUFXO0lBQ3RCO0lBQ0EsU0FBUyxNQUFNLGdCQUFnQixNQUFNLDhCQUFjLElBQUksSUFBSTtJQUMzRCxNQUFNLFlBQVksSUFBSSxVQUFVLGFBQWE7SUFDN0MsQ0FBQyxnQkFBZ0IsU0FBUyxNQUFNLGFBQzdCLFNBQVMsTUFBTSxVQUFVLGFBQWEsY0FDdEMsTUFBTSxTQUNOLFdBQVcsWUFBWSxLQUFLLEtBQUssR0FDbEMsY0FBYyxpQkFBaUIsUUFBUSxRQUFRLEdBQy9DLGNBQWMsaUJBQWlCLFNBQVMsUUFBUTtHQUNwRDtFQUNGO0VBQ0EsU0FBUyx1QkFBdUIsT0FBTyxlQUFlO0dBQ3BELE1BQU0sZUFDSixNQUFNLE1BQU0sU0FDWiwyQkFBMkIsT0FBTyxNQUFNLFdBQVc7R0FDckQsT0FBTyxJQUFJLE1BQU0sU0FBUyxJQUFJLE1BQU0sV0FDaEMsU0FBVSxRQUFRO0lBQ2hCLElBQUksa0JBQWtCLFdBQVcsV0FBWTtLQUMzQyxNQUFNLGVBQ0osMkJBQTJCLE9BQU8sTUFBTSxXQUFXO0tBQ3JELElBQUksTUFBTSxXQUFXO01BQ25CLElBQUksWUFBWSxNQUFNO01BQ3RCLE1BQU0sWUFBWTtNQUNsQixVQUFVO0tBQ1o7SUFDRixHQUFHLCtCQUErQixhQUFhO0lBQy9DLElBQUksTUFBTSxZQUNSLE1BQU0sOEJBQ0wsNEJBQ0MsTUFBTSxrQkFBa0IsSUFBSTtJQUNoQyxJQUFJLFdBQVcsV0FDYixXQUFZO0tBQ1YsTUFBTSxtQkFBbUIsQ0FBQztLQUMxQixJQUNFLE1BQU0sTUFBTSxVQUNYLE1BQU0sZUFDTCwyQkFBMkIsT0FBTyxNQUFNLFdBQVcsR0FDckQsTUFBTSxZQUNOO01BQ0EsSUFBSSxZQUFZLE1BQU07TUFDdEIsTUFBTSxZQUFZO01BQ2xCLFVBQVU7S0FDWjtJQUNGLElBQ0MsTUFBTSxXQUFXLDRCQUNkLEtBQ0EsMkJBQTJCLGFBQ2pDO0lBQ0EsTUFBTSxZQUFZO0lBQ2xCLE9BQU8sV0FBWTtLQUNqQixNQUFNLFlBQVk7S0FDbEIsYUFBYSxlQUFlO0tBQzVCLGFBQWEsUUFBUTtJQUN2QjtHQUNGLElBQ0E7RUFDTjtFQUNBLFNBQVMsd0JBQXdCLE9BQU87R0FDdEMsSUFDRSxNQUFNLE1BQU0sVUFDWCxNQUFNLE1BQU0sWUFBWSxDQUFDLE1BQU0sbUJBRWhDO0lBQUksSUFBQSxNQUFNLGFBQ1IsMkJBQTJCLE9BQU8sTUFBTSxXQUFXO1NBQ2hELElBQUksTUFBTSxXQUFXO0tBQ3hCLElBQUksWUFBWSxNQUFNO0tBQ3RCLE1BQU0sWUFBWTtLQUNsQixVQUFVO0lBQ1o7O0VBQ0o7RUFDQSxTQUFTLGNBQWM7R0FDckIsS0FBSztHQUNMLHdCQUF3QixJQUFJO0VBQzlCO0VBQ0EsU0FBUyxpQkFBaUI7R0FDeEIsS0FBSztHQUNMLHdCQUF3QixJQUFJO0VBQzlCO0VBQ0EsU0FBUywyQkFBMkIsT0FBTyxXQUFXO0dBQ3BELE1BQU0sY0FBYztHQUNwQixTQUFTLE1BQU0sY0FDWixNQUFNLFNBQ04sb0NBQW9CLElBQUksSUFBSSxHQUM3QixVQUFVLFFBQVEsMEJBQTBCLEtBQUssR0FDaEQsb0JBQW9CLE1BQ3JCLFlBQVksS0FBSyxLQUFLO0VBQzFCO0VBQ0EsU0FBUyx5QkFBeUIsTUFBTSxVQUFVO0dBQ2hELElBQUksRUFBRSxTQUFTLE1BQU0sVUFBVSxXQUFXO0lBQ3hDLElBQUksY0FBYyxrQkFBa0IsSUFBSSxJQUFJO0lBQzVDLElBQUksYUFBYSxJQUFJLE9BQU8sWUFBWSxJQUFJLGVBQWU7U0FDdEQ7S0FDSCw4QkFBYyxJQUFJLElBQUk7S0FDdEIsa0JBQWtCLElBQUksTUFBTSxXQUFXO0tBQ3ZDLEtBQ0UsSUFBSSxRQUFRLEtBQUssaUJBQ2IsOENBQ0YsR0FDQSxJQUFJLEdBQ04sSUFBSSxNQUFNLFFBQ1YsS0FDQTtNQUNBLElBQUksT0FBTyxNQUFNO01BQ2pCLElBQ0UsV0FBVyxLQUFLLFlBQ2hCLGNBQWMsS0FBSyxhQUFhLE9BQU8sR0FFdkMsWUFBWSxJQUFJLEtBQUssUUFBUSxZQUFZLElBQUksR0FBSSxPQUFPO0tBQzVEO0tBQ0EsUUFBUSxZQUFZLElBQUksaUJBQWlCLElBQUk7SUFDL0M7SUFDQSxRQUFRLFNBQVM7SUFDakIsT0FBTyxNQUFNLGFBQWEsaUJBQWlCO0lBQzNDLElBQUksWUFBWSxJQUFJLElBQUksS0FBSztJQUM3QixNQUFNLFFBQVEsWUFBWSxJQUFJLGlCQUFpQixLQUFLO0lBQ3BELFlBQVksSUFBSSxNQUFNLEtBQUs7SUFDM0IsS0FBSztJQUNMLE9BQU8sWUFBWSxLQUFLLElBQUk7SUFDNUIsTUFBTSxpQkFBaUIsUUFBUSxJQUFJO0lBQ25DLE1BQU0saUJBQWlCLFNBQVMsSUFBSTtJQUNwQyxJQUNJLEVBQUUsV0FBVyxhQUFhLE9BQU8sRUFBRSxXQUFXLEtBQzVDLE9BQU8sTUFBTSxLQUFLLFdBQVcsS0FBSyxPQUFPLE1BQzNDLEtBQUssYUFBYSxPQUFPLEtBQUssVUFBVTtJQUM1QyxTQUFTLE1BQU0sV0FBVztHQUM1QjtFQUNGO0VBQ0EsU0FBUyxjQUNQLGVBQ0EsS0FDQSxTQUNBLGtCQUNBLGlCQUNBLGVBQ0Esb0JBQ0EsOEJBQ0EsV0FDQTtHQUNBLEtBQUssTUFBTTtHQUNYLEtBQUssZ0JBQWdCO0dBQ3JCLEtBQUssWUFBWSxLQUFLLFVBQVUsS0FBSyxrQkFBa0I7R0FDdkQsS0FBSyxnQkFBZ0I7R0FDckIsS0FBSyxlQUNILEtBQUssT0FDTCxLQUFLLGlCQUNMLEtB
15852QUssVUFDTCxLQUFLLHNCQUNIO0dBQ0osS0FBSyxtQkFBbUI7R0FDeEIsS0FBSyxrQkFBa0IsY0FBYyxFQUFFO0dBQ3ZDLEtBQUssaUJBQ0gsS0FBSyxzQkFDTCxLQUFLLDZCQUNMLEtBQUssZUFDTCxLQUFLLFlBQ0wsS0FBSyxjQUNMLEtBQUssaUJBQ0wsS0FBSyxlQUNIO0dBQ0osS0FBSyxnQkFBZ0IsY0FBYyxDQUFDO0dBQ3BDLEtBQUssZ0JBQWdCLGNBQWMsSUFBSTtHQUN2QyxLQUFLLG1CQUFtQjtHQUN4QixLQUFLLGtCQUFrQjtHQUN2QixLQUFLLGdCQUFnQjtHQUNyQixLQUFLLHFCQUFxQjtHQUMxQixLQUFLLGNBQWM7R0FDbkIsS0FBSyxtQkFBbUI7R0FDeEIsS0FBSyxZQUFZO0dBQ2pCLEtBQUssa0JBQWtCO0dBQ3ZCLEtBQUssd0NBQXdCLElBQUksSUFBSTtHQUNyQyxLQUFLLHdCQUF3QixLQUFLLGlCQUFpQjtHQUNuRCxLQUFLLG1DQUFtQixJQUFJLElBQUk7R0FDaEMsZ0JBQWdCLEtBQUsseUJBQXlCLENBQUM7R0FDL0MsS0FBSyxNQUFNLEdBQUcsS0FBSyxLQUFLLE9BQU8sY0FBYyxxQkFBSyxJQUFJLElBQUksQ0FBQztHQUMzRCxLQUFLLGlCQUFpQixVQUFVLGtCQUFrQjtFQUNwRDtFQUNBLFNBQVMsZ0JBQ1AsZUFDQSxLQUNBLFNBQ0EsaUJBQ0Esb0JBQ0EsY0FDQSxrQkFDQSxXQUNBLGlCQUNBLGVBQ0Esb0JBQ0EsOEJBQ0E7R0FDQSxnQkFBZ0IsSUFBSSxjQUNsQixlQUNBLEtBQ0EsU0FDQSxrQkFDQSxpQkFDQSxlQUNBLG9CQUNBLDhCQUNBLFNBQ0Y7R0FDQSxNQUFNO0dBQ04sQ0FBQyxNQUFNLGlCQUFpQixPQUFPLG1CQUFtQjtHQUNsRCxPQUFPO0dBQ1AsZUFBZSxZQUFZLEdBQUcsTUFBTSxNQUFNLEdBQUc7R0FDN0MsY0FBYyxVQUFVO0dBQ3hCLGFBQWEsWUFBWTtHQUN6QixNQUFNLFlBQVk7R0FDbEIsWUFBWSxHQUFHO0dBQ2YsY0FBYyxjQUFjO0dBQzVCLFlBQVksR0FBRztHQUNmLGFBQWEsZ0JBQWdCO0lBQzNCLFNBQVM7SUFDVCxjQUFjO0lBQ2QsT0FBTztHQUNUO0dBQ0Esc0JBQXNCLFlBQVk7R0FDbEMsT0FBTztFQUNUO0VBQ0EsU0FBUyxxQkFBcUIsaUJBQWlCO0dBQzdDLElBQUksQ0FBQyxpQkFBaUIsT0FBTztHQUM3QixrQkFBa0I7R0FDbEIsT0FBTztFQUNUO0VBQ0EsU0FBUyxvQkFDUCxXQUNBLE1BQ0EsU0FDQSxXQUNBLGlCQUNBLFVBQ0E7R0FDQSxJQUNFLGdCQUNBLGVBQWUsT0FBTyxhQUFhLHFCQUVuQyxJQUFJO0lBQ0YsYUFBYSxvQkFBb0IsWUFBWSxXQUFXLE9BQU87R0FDakUsU0FBUyxLQUFLO0lBQ1osbUJBQ0ksaUJBQWlCLENBQUMsR0FDcEIsUUFBUSxNQUNOLGtEQUNBLEdBQ0Y7R0FDSjtHQUNGLGtCQUFrQixxQkFBcUIsZUFBZTtHQUN0RCxTQUFTLFVBQVUsVUFDZCxVQUFVLFVBQVUsa0JBQ3BCLFVBQVUsaUJBQWlCO0dBQ2hDLGVBQ0UsU0FBUyxXQUNULENBQUMsOEJBQ0MsNEJBQTRCLENBQUMsR0FDL0IsUUFBUSxNQUNOLDhOQUNBLDBCQUEwQixPQUFPLEtBQUssU0FDeEM7R0FDRixZQUFZLGFBQWEsSUFBSTtHQUM3QixVQUFVLFVBQVUsRUFBVyxRQUFRO0dBQ3ZDLFdBQVcsS0FBSyxNQUFNLFdBQVcsT0FBTztHQUN4QyxTQUFTLGFBQ04sZUFBZSxPQUFPLFlBQ3JCLFFBQVEsTUFDTiwwRkFDQSxRQUNGLEdBQ0QsVUFBVSxXQUFXO0dBQ3hCLFVBQVUsY0FBYyxXQUFXLFdBQVcsSUFBSTtHQUNsRCxTQUFTLFlBQ04sdUJBQXVCLE1BQU0saUJBQWlCLElBQUksR0FDbkQsc0JBQXNCLFNBQVMsV0FBVyxJQUFJLEdBQzlDLG9CQUFvQixTQUFTLFdBQVcsSUFBSTtFQUNoRDtFQUNBLFNBQVMsa0JBQWtCLE9BQU8sV0FBVztHQUMzQyxRQUFRLE1BQU07R0FDZCxJQUFJLFNBQVMsU0FBUyxTQUFTLE1BQU0sWUFBWTtJQUMvQyxJQUFJLElBQUksTUFBTTtJQUNkLE1BQU0sWUFBWSxNQUFNLEtBQUssSUFBSSxZQUFZLElBQUk7R0FDbkQ7RUFDRjtFQUNBLFNBQVMsMkJBQTJCLE9BQU8sV0FBVztHQUNwRCxrQkFBa0IsT0FBTyxTQUFTO0dBQ2xDLENBQUMsUUFBUSxNQUFNLGNBQWMsa0JBQWtCLE9BQU8sU0FBUztFQUNqRTtFQUNBLFNBQVMsMkJBQTJCLE9BQU87R0FDekMsSUFBSSxPQUFPLE1BQU0sT0FBTyxPQUFPLE1BQU0sS0FBSztJQUN4QyxJQUFJLE9BQU8sK0JBQStCLE9BQU8sUUFBUTtJQUN6RCxTQUFTLFFBQVEsc0JBQXNCLE1BQU0sT0FBTyxRQUFRO0lBQzVELDJCQUEyQixPQUFPLFFBQVE7R0FDNUM7RUFDRjtFQUNBLFNBQVMsa0NBQWtDLE9BQU87R0FDaEQsSUFBSSxPQUFPLE1BQU0sT0FBTyxPQUFPLE1BQU0sS0FBSztJQUN4QyxJQUFJLE9BQU8sa0JBQWtCLEtBQUs7SUFDbEMsT0FBTyxnQ0FBZ0MsSUFBSTtJQUMzQyxJQUFJLE9BQU8sK0JBQStCLE9BQU8sSUFBSTtJQUNyRCxTQUFTLFFBQVEsc0JBQXNCLE1BQU0sT0FBTyxJQUFJO0lBQ3hELDJCQUEyQixPQUFPLElBQUk7R0FDeEM7RUFDRjtFQUNBLFNBQVMsNkJBQTZCO0dBQ3BDLE9BQU87RUFDVDtFQUNBLFNBQVMsc0JBQ1AsY0FDQSxrQkFDQSxXQUNBLGFBQ0E7R0FDQSxJQUFJLGlCQUFpQixxQkFBcUI7R0FDMUMscUJBQXFCLElBQUk7R0FDekIsSUFBSSxtQkFBbUIsd0JBQXdCO0dBQy9DLElBQUk7SUFDRix3QkFBeUIsSUFBSSx1QkFDM0IsY0FBYyxjQUFjLGtCQUFrQixXQUFXLFdBQVc7R0FDeEUsVUFBVTtJQUNSLHdCQUF5QixJQUFJLGtCQUMxQixxQkFBcUIsSUFBSTtHQUM5QjtFQUNGO0VBQ0EsU0FBUyx3QkFDUCxjQUNBLGtCQUNBLFdBQ0EsYUFDQTtHQUNBLElBQUksaUJBQWlCLHFCQUFxQjtHQUMxQyxxQkFBcUIsSUFBSTtHQUN6QixJQUFJLG1CQUFtQix3QkFBd0I7R0FDL0MsSUFBSTtJQUNGLHdCQUF5QixJQUFJLHlCQUMzQixjQUFjLGNBQWMsa0JBQWtCLFdBQVcsV0FBVztHQUN4RSxVQUFVO0lBQ1Isd0JBQXlCLElBQUksa0JBQzFCLHFCQUFxQixJQUFJO0dBQzlCO0VBQ0Y7RUFDQSxTQUFTLGNBQ1AsY0FDQSxrQkFDQSxpQkFDQSxhQUNBO0dBQ0EsSUFBSSxVQUFVO0lBQ1osSUFBSSxZQUFZLDBCQUEwQixXQUFXO0lBQ3JELElBQUksU0FBUyxXQUNYLGtDQUNFLGNBQ0Esa0JBQ0EsYUFDQSxtQkFDQSxlQUNGLEdBQ0UsdUJBQXVCLGNBQWMsV0FBVztTQUMvQyxJQUNILHVCQUNFLFdBQ0EsY0FDQSxrQkFDQSxpQkFDQSxXQUNGLEdBRUEsWUFBWSxnQkFBZ0I7U0FDekIsSUFDRix1QkFBdUIsY0FBYyxXQUFXLEdBQ2pELG1CQUFtQixLQUNqQixLQUFLLHlCQUF5QixRQUFRLFlBQVksR0FDcEQ7S0FDQSxPQUFPLFNBQVMsWUFBYTtNQUMzQixJQUFJLFFBQVEsb0JBQW9CLFNBQVM7TUFDekMsSUFBSSxTQUFTLE9BQ1gsUUFBUSxNQUFNLEtBQWQ7T0FDRSxLQUFLO
158521FBQ0gsUUFBUSxNQUFNO1FBQ2QsSUFBSSxNQUFNLFFBQVEsY0FBYyxjQUFjO1NBQzVDLElBQUksUUFBUSx3QkFBd0IsTUFBTSxZQUFZO1NBQ3RELElBQUksTUFBTSxPQUFPO1VBQ2YsSUFBSSxPQUFPO1VBQ1gsS0FBSyxnQkFBZ0I7VUFDckIsS0FBSyxLQUFLLGtCQUFrQixHQUFHLFFBQVM7V0FDdEMsSUFBSSxPQUFPLEtBQU0sS0FBSyxNQUFNLEtBQUs7V0FDakMsS0FBSyxjQUFjLE1BQU07V0FDekIsU0FBUyxDQUFDO1VBQ1o7VUFDQSxzQkFBc0IsS0FBSztVQUMzQixDQUFDLG9CQUFvQixnQkFBZ0Isb0JBQ25DLGNBQ0UscUNBQ0EsTUFBTSxJQUFJLG1CQUNaLDhCQUE4QixHQUFHLENBQUMsQ0FBQztTQUN2QztRQUNGO1FBQ0E7T0FDRixLQUFLO09BQ0wsS0FBSyxJQUNILE9BQVEsK0JBQStCLE9BQU8sQ0FBQyxHQUM3QyxTQUFTLFFBQVEsc0JBQXNCLE1BQU0sT0FBTyxDQUFDLEdBQ3JELGdCQUFnQixHQUNoQiwyQkFBMkIsT0FBTyxDQUFDO01BQ3pDO01BQ0YsUUFBUSwwQkFBMEIsV0FBVztNQUM3QyxTQUFTLFNBQ1Asa0NBQ0UsY0FDQSxrQkFDQSxhQUNBLG1CQUNBLGVBQ0Y7TUFDRixJQUFJLFVBQVUsV0FBVztNQUN6QixZQUFZO0tBQ2Q7S0FDQSxTQUFTLGFBQWEsWUFBWSxnQkFBZ0I7SUFDcEQsT0FDRSxrQ0FDRSxjQUNBLGtCQUNBLGFBQ0EsTUFDQSxlQUNGO0dBQ0o7RUFDRjtFQUNBLFNBQVMsMEJBQTBCLGFBQWE7R0FDOUMsY0FBYyxlQUFlLFdBQVc7R0FDeEMsT0FBTywyQkFBMkIsV0FBVztFQUMvQztFQUNBLFNBQVMsMkJBQTJCLFlBQVk7R0FDOUMsb0JBQW9CO0dBQ3BCLGFBQWEsMkJBQTJCLFVBQVU7
15852R0FDbEQsSUFBSSxTQUFTLFlBQVk7SUFDdkIsSUFBSSxpQkFBaUIsdUJBQXVCLFVBQVU7SUFDdEQsSUFBSSxTQUFTLGdCQUFnQixhQUFhO1NBQ3JDO0tBQ0gsSUFBSSxNQUFNLGVBQWU7S0FDekIsSUFBSSxPQUFPLEtBQUs7TUFDZCxhQUFhLDZCQUE2QixjQUFjO01BQ3hELElBQUksU0FBUyxZQUFZLE9BQU87TUFDaEMsYUFBYTtLQUNmLE9BQU8sSUFBSSxPQUFPLEtBQUs7TUFDckIsYUFBYSw2QkFBNkIsY0FBYztNQUN4RCxJQUFJLFNBQVMsWUFBWSxPQUFPO01BQ2hDLGFBQWE7S0FDZixPQUFPLElBQUksTUFBTSxLQUFLO01BQ3BCLElBQUksZUFBZSxVQUFVLFFBQVEsY0FBYyxjQUNqRCxPQUFPLE1BQU0sZUFBZSxNQUN4QixlQUFlLFVBQVUsZ0JBQ3pCO01BQ04sYUFBYTtLQUNmLE9BQU8sbUJBQW1CLGVBQWUsYUFBYTtJQUN4RDtHQUNGO0dBQ0Esb0JBQW9CO0dBQ3BCLE9BQU87RUFDVDtFQUNBLFNBQVMsaUJBQWlCLGNBQWM7R0FDdEMsUUFBUSxjQUFSO0lBQ0UsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUssZUFDSCxPQUFPO0lBQ1QsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSztJQUNMLEtBQUs7SUFDTCxLQUFLO0lBQ0wsS0FBSyxnQkFDSCxPQUFPO0lBQ1QsS0FBSyxXQUNILFFBQVEsd0JBQXdCLEdBQWhDO0tBQ0UsS0FBSyxtQkFDSCxPQUFPO0tBQ1QsS0FBSyxzQkFDSCxPQUFPO0tBQ1QsS0FBSztLQUNMLEtBQUssYUFDSCxPQUFPO0tBQ1QsS0FBSyxjQUNILE9BQU87S0FDVCxTQUNFLE9BQU87SUFDWDtJQUNGLFNBQ0UsT0FBTztHQUNYO0VBQ0Y7RUFDQSxTQUFTLHVCQUF1QixjQUFjLGFBQWE7R0FDekQsUUFBUSxjQUFSO0lBQ0UsS0FBSztJQUNMLEtBQUs7S0FDSCxjQUFjO0tBQ2Q7SUFDRixLQUFLO0lBQ0wsS0FBSztLQUNILGFBQWE7S0FDYjtJQUNGLEtBQUs7SUFDTCxLQUFLO0tBQ0gsY0FBYztLQUNkO0lBQ0YsS0FBSztJQUNMLEtBQUs7S0FDSCxlQUFlLE9BQU8sWUFBWSxTQUFTO0tBQzNDO0lBQ0YsS0FBSztJQUNMLEtBQUssc0JBQ0gsc0JBQXNCLE9BQU8sWUFBWSxTQUFTO0dBQ3REO0VBQ0Y7RUFDQSxTQUFTLGtEQUNQLHFCQUNBLFdBQ0EsY0FDQSxrQkFDQSxpQkFDQSxhQUNBO0dBQ0EsSUFDRSxTQUFTLHVCQUNULG9CQUFvQixnQkFBZ0IsYUFFcEMsT0FDRyxzQkFBc0I7SUFDVjtJQUNHO0lBQ0k7SUFDTDtJQUNiLGtCQUFrQixDQUFDLGVBQWU7R0FDcEMsR0FDQSxTQUFTLGNBQ0wsWUFBWSxvQkFBb0IsU0FBUyxHQUMzQyxTQUFTLGFBQWEsMkJBQTJCLFNBQVMsSUFDNUQ7R0FFSixvQkFBb0Isb0JBQW9CO0dBQ3hDLFlBQVksb0JBQW9CO0dBQ2hDLFNBQVMsbUJBQ1AsT0FBTyxVQUFVLFFBQVEsZUFBZSxLQUN4QyxVQUFVLEtBQUssZUFBZTtHQUNoQyxPQUFPO0VBQ1Q7RUFDQSxTQUFTLHVCQUNQLFdBQ0EsY0FDQSxrQkFDQSxpQkFDQSxhQUNBO0dBQ0EsUUFBUSxjQUFSO0lBQ0UsS0FBSyxXQUNILE9BQ0csY0FBYyxrREFDYixhQUNBLFdBQ0EsY0FDQSxrQkFDQSxpQkFDQSxXQUNGLEdBQ0EsQ0FBQztJQUVMLEtBQUssYUFDSCxPQUNHLGFBQWEsa0RBQ1osWUFDQSxXQUNBLGNBQ0Esa0JBQ0EsaUJBQ0EsV0FDRixHQUNBLENBQUM7SUFFTCxLQUFLLGFBQ0gsT0FDRyxjQUFjLGtEQUNiLGFBQ0EsV0FDQSxjQUNBLGtCQUNBLGlCQUNBLFdBQ0YsR0FDQSxDQUFDO0lBRUwsS0FBSztLQUNILElBQUksWUFBWSxZQUFZO0tBQzVCLGVBQWUsSUFDYixXQUNBLGtEQUNFLGVBQWUsSUFBSSxTQUFTLEtBQUssTUFDakMsV0FDQSxjQUNBLGtCQUNBLGlCQUNBLFdBQ0YsQ0FDRjtLQUNBLE9BQU8sQ0FBQztJQUNWLEtBQUsscUJBQ0gsT0FDRyxZQUFZLFlBQVksV0FDekIsc0JBQXNCLElBQ3BCLFdBQ0Esa0RBQ0Usc0JBQXNCLElBQUksU0FBUyxLQUFLLE1BQ3hDLFdBQ0EsY0FDQSxrQkFDQSxpQkFDQSxXQUNGLENBQ0YsR0FDQSxDQUFDO0dBRVA7R0FDQSxPQUFPLENBQUM7RUFDVjtFQUNBLFNBQVMsK0JBQStCLGNBQWM7R0FDcEQsSUFBSSxhQUFhLDJCQUEyQixhQUFhLE1BQU07R0FDL0QsSUFBSSxTQUFTLFlBQVk7SUFDdkIsSUFBSSxpQkFBaUIsdUJBQXVCLFVBQVU7SUFDdEQsSUFBSSxTQUFTLGdCQUNYO0tBQU0sSUFBQSxhQUFhLGVBQWUsS0FBTSxPQUFPLFlBRXpDO1VBQUEsYUFBYSw2QkFBNkIsY0FBYyxHQUMxRCxTQUFTLFlBQ1Q7T0FDQSxhQUFhLFlBQVk7T0FDekIsZ0JBQWdCLGFBQWEsVUFBVSxXQUFZO1FBQ2pELGtDQUFrQyxjQUFjO09BQ2xELENBQUM7T0FDRDtNQUNGO1lBQ0ssSUFBSSxPQUFPLFlBRVo7VUFBQSxhQUFhLDZCQUE2QixjQUFjLEdBQzFELFNBQVMsWUFDVDtPQUNBLGFBQWEsWUFBWTtPQUN6QixnQkFBZ0IsYUFBYSxVQUFVLFdBQVk7UUFDakQsa0NBQWtDLGNBQWM7T0FDbEQsQ0FBQztPQUNEO01BQ0Y7WUFDSyxJQUNMLE1BQU0sY0FDTixlQUFlLFVBQVUsUUFBUSxjQUFjLGNBQy9DO01BQ0EsYUFBYSxZQUNYLE1BQU0sZUFBZSxNQUNqQixlQUFlLFVBQVUsZ0JBQ3pCO01BQ047S0FDRjs7R0FDSjtHQUNBLGFBQWEsWUFBWTtFQUMzQjtFQUNBLFNBQVMsbUNBQW1DLGFBQWE7R0FDdkQsSUFBSSxTQUFTLFlBQVksV0FBVyxPQUFPLENBQUM7R0FDNUMsS0FDRSxJQUFJLG1CQUFtQixZQUFZLGtCQUNuQyxJQUFJLGl
15852CQUFpQixTQUVyQjtJQUNBLElBQUksZ0JBQWdCLDBCQUEwQixZQUFZLFdBQVc7SUFDckUsSUFBSSxTQUFTLGVBQWU7S0FDMUIsZ0JBQWdCLFlBQVk7S0FDNUIsSUFBSSxtQkFBbUIsSUFBSSxjQUFjLFlBQ3JDLGNBQWMsTUFDZCxhQUNGLEdBQ0EsUUFBUTtLQUNWLFNBQVMseUJBQ1AsUUFBUSxNQUNOLHFIQUNGO0tBQ0Ysd0JBQXdCO0tBQ3hCLGNBQWMsT0FBTyxjQUFjLGdCQUFnQjtLQUNuRCxTQUFTLHlCQUNQLFFBQVEsTUFDTix5SEFDRjtLQUNGLHdCQUF3QjtJQUMxQixPQUNFLE9BQ0csbUJBQW1CLG9CQUFvQixhQUFhLEdBQ3JELFNBQVMsb0JBQ1AsMkJBQTJCLGdCQUFnQixHQUM1QyxZQUFZLFlBQVksZUFDekIsQ0FBQztJQUVMLGlCQUFpQixNQUFNO0dBQ3pCO0dBQ0EsT0FBTyxDQUFDO0VBQ1Y7RUFDQSxTQUFTLHdDQUF3QyxhQUFhLEtBQUssS0FBSztHQUN0RSxtQ0FBbUMsV0FBVyxLQUFLLElBQUksT0FBTyxHQUFHO0VBQ25FO0VBQ0EsU0FBUyx3QkFBd0I7R0FDL0IsNEJBQTRCLENBQUM7R0FDN0IsU0FBUyxlQUNQLG1DQUFtQyxXQUFXLE1BQzdDLGNBQWM7R0FDakIsU0FBUyxjQUNQLG1DQUFtQyxVQUFVLE1BQzVDLGFBQWE7R0FDaEIsU0FBUyxlQUNQLG1DQUFtQyxXQUFXLE1BQzdDLGNBQWM7R0FDakIsZUFBZSxRQUFRLHVDQUF1QztHQUM5RCxzQkFBc0IsUUFBUSx1Q0FBdUM7RUFDdkU7RUFDQSxTQUFTLDRCQUE0QixhQUFhLFdBQVc7R0FDM0QsWUFBWSxjQUFjLGNBQ3RCLFlBQVksWUFBWSxNQUMxQiw4QkFDSSw0QkFBNEIsQ0FBQyxHQUMvQixVQUFVLDBCQUNSLFVBQVUseUJBQ1YscUJBQ0Y7RUFDTjtFQUNBLFNBQVMsNEJBQTRCLG9CQUFvQjtHQUN2RCw2QkFBNkIsdUJBQ3pCLDJCQUEyQixvQkFDN0IsVUFBVSwwQkFDUixVQUFVLHlCQUNWLFdBQVk7SUFDViw2QkFBNkIsdUJBQzFCLDJCQUEyQjtJQUM5QixLQUFLLElBQUksSUFBSSxHQUFHLElBQUksbUJBQW1CLFFBQVEsS0FBSyxHQUFHO0tBQ3JELElBQUksT0FBTyxtQkFBbUIsSUFDNUIsb0JBQW9CLG1CQUFtQixJQUFJLElBQzNDLFdBQVcsbUJBQW1CLElBQUk7S0FDcEMsSUFBSSxlQUFlLE9BQU8sbUJBQ3hCLElBQ0UsU0FBUywyQkFBMkIscUJBQXFCLElBQUksR0FFN0Q7VUFDRztLQUNQLElBQUksV0FBVyxvQkFBb0IsSUFBSTtLQUN2QyxTQUFTLGFBQ04sbUJBQW1CLE9BQU8sR0FBRyxDQUFDLEdBQzlCLEtBQUssR0FDTCxPQUFPO01BQ04sU0FBUyxDQUFDO01BQ1YsTUFBTTtNQUNOLFFBQVEsS0FBSztNQUNiLFFBQVE7S0FDVixHQUNBLE9BQU8sT0FBTyxJQUFJLEdBQ2xCLG9CQUNFLFVBQ0EsTUFDQSxtQkFDQSxRQUNGO0lBQ0o7R0FDRixDQUNGO0VBQ0o7RUFDQSxTQUFTLGlCQUFpQixXQUFXO0dBQ25DLFNBQVMsUUFBUSxhQUFhO0lBQzVCLE9BQU8sNEJBQTRCLGFBQWEsU0FBUztHQUMzRDtHQUNBLFNBQVMsZUFDUCw0QkFBNEIsYUFBYSxTQUFTO0dBQ3BELFNBQVMsY0FBYyw0QkFBNEIsWUFBWSxTQUFTO0dBQ3hFLFNBQVMsZUFDUCw0QkFBNEIsYUFBYSxTQUFTO0dBQ3BELGVBQWUsUUFBUSxPQUFPO0dBQzlCLHNCQUFzQixRQUFRLE9BQU87R0FDckMsS0FBSyxJQUFJLElBQUksR0FBRyxJQUFJLCtCQUErQixRQUFRLEtBQUs7SUFDOUQsSUFBSSxlQUFlLCtCQUErQjtJQUNsRCxhQUFhLGNBQWMsY0FBYyxhQUFhLFlBQVk7R0FDcEU7R0FDQSxPQUVFLElBQUksK0JBQStCL
15852FdBQ2pDLElBQUksK0JBQStCLElBQUssU0FBUyxFQUFFLGFBR3JELCtCQUErQixDQUFDLEdBQzlCLFNBQVMsRUFBRSxhQUFhLCtCQUErQixNQUFNO0dBQ2pFLEtBQUssVUFBVSxpQkFBaUIsVUFBQSxDQUFXO0dBQzNDLElBQUksUUFBUSxHQUNWLEtBQUssZUFBZSxHQUFHLGVBQWUsRUFBRSxRQUFRLGdCQUFnQixHQUFHO0lBQ2pFLElBQUksT0FBTyxFQUFFLGVBQ1gsb0JBQW9CLEVBQUUsZUFBZSxJQUNyQyxZQUFZLEtBQUsscUJBQXFCO0lBQ3hDLElBQUksZUFBZSxPQUFPLG1CQUN4QixhQUFhLDRCQUE0QixDQUFDO1NBQ3ZDLElBQUksV0FBVztLQUNsQixJQUFJLFNBQVM7S0FDYixJQUNFLHFCQUNBLGtCQUFrQixhQUFhLFlBQVksR0FFM0M7TUFDSSxJQUFBLE9BQU8sbUJBQ1IsWUFBWSxrQkFBa0IscUJBQXFCLE1BRXBELFNBQVMsVUFBVTtXQUVuQixJQUFJLFNBQVMsMkJBQTJCLElBQUksR0FBRztLQUNqRCxPQUNHLFNBQVMsVUFBVTtLQUN4QixlQUFlLE9BQU8sU0FDakIsRUFBRSxlQUFlLEtBQUssVUFDdEIsRUFBRSxPQUFPLGNBQWMsQ0FBQyxHQUFJLGdCQUFnQjtLQUNqRCw0QkFBNEIsQ0FBQztJQUMvQjtHQUNGO0VBQ0o7RUFDQSxTQUFTLHNDQUFzQztHQUM3QyxTQUFTLGVBQWUsT0FBTztJQUM3QixNQUFNLGdCQUNKLHVCQUF1QixNQUFNLFFBQzdCLE1BQU0sVUFBVTtLQUNkLFNBQVMsV0FBWTtNQUNuQixPQUFPLElBQUksUUFBUSxTQUFVLFNBQVM7T0FDcEMsT0FBUSxpQkFBaUI7TUFDM0IsQ0FBQztLQUNIO0tBQ0EsWUFBWTtLQUNaLFFBQVE7SUFDVixDQUFDO0dBQ0w7R0FDQSxTQUFTLHlCQUF5QjtJQUNoQyxTQUFTLG1CQUFtQixlQUFlLEdBQUksaUJBQWlCO0lBQ2hFLGVBQWUsV0FBVyxxQkFBcUIsRUFBRTtHQUNuRDtHQUNBLFNBQVMsc0JBQXNCO0lBQzdCLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxZQUFZO0tBQzFDLElBQUksZUFBZSxXQUFXO0tBQzlCLGdCQUNFLFFBQVEsYUFBYSxPQUNyQixXQUFXLFNBQVMsYUFBYSxLQUFLO01BQ3BDLE9BQU8sYUFBYSxTQUFTO01BQzdCLE1BQU07TUFDTixTQUFTO0tBQ1gsQ0FBQztJQUNMO0dBQ0Y7R0FDQSxJQUFJLGFBQWEsT0FBTyxZQUFZO0lBQ2xDLElBQUksY0FBYyxDQUFDLEdBQ2pCLGlCQUFpQjtJQUNuQixXQUFXLGlCQUFpQixZQUFZLGNBQWM7SUFDdEQsV0FBVyxpQkFBaUIsbUJBQW1CLHNCQUFzQjtJQUNyRSxXQUFXLGlCQUFpQixpQkFBaUIsc0JBQXNCO0lBQ25FLFdBQVcscUJBQXFCLEdBQUc7SUFDbkMsT0FBTyxXQUFZO0tBQ2pCLGNBQWMsQ0FBQztLQUNmLFdBQVcsb0JBQW9CLFlBQVksY0FBYztLQUN6RCxXQUFXLG9CQUNULG1CQUNBLHNCQUNGO0tBQ0EsV0FBVyxvQkFDVCxpQkFDQSxzQkFDRjtLQUNBLFNBQVMsbUJBQ04sZUFBZSxHQUFJLGlCQUFpQjtJQUN6QztHQUNGO0VBQ0Y7RUFDQSxTQUFTLGFBQWEsY0FBYztHQUNsQyxLQUFLLGdCQUFnQjtFQUN2QjtFQUNBLFNBQVMsc0JBQXNCLGNBQWM7R0FDM0MsS0FBSyxnQkFBZ0I7RUFDdkI7RUFDQSxTQUFTLDZCQUE2QixXQUFXO0dBQy9DLFVBQVUsa0NBQ1AsVUFBVSxzQkFDUCxRQUFRLE1BQ04sb0lBQ0YsSUFDQSxRQUFRLE1BQ04sb01BQ0Y7RUFDUjtFQUNBLGdCQUFnQixPQUFPLGtDQUNyQixlQUNFLE9BQU8sK0JBQStCLCtCQUN4QywrQkFBK0IsNEJBQTRCLE1BQU0sQ0FBQztFQUNwRSxJQUFJLFlBQUEsa0JBQUEsR0FDRixRQUFBLGNBQUEsR0FDQSxXQUFBLGtCQUFBLEdBQ0EsZUFBZSxNQUNmLGlCQUFpQixNQUNqQixTQUFTLE9BQU8sUUFDaEIsNEJBQTRCLE9BQU8sSUFBSSxlQUFlLEdBQ3RELHFCQUFxQixPQUFPLElBQUksNEJBQTRCLEdBQzVELG9CQUFvQixPQUFPLElBQUksY0FBYyxHQUM3QyxzQkFBc0IsT0FBTyxJQUFJLGdCQUFnQixHQUNqRCx5QkFBeUIsT0FBTyxJQUFJLG1CQUFtQixHQUN2RCxzQkFBc0IsT0FBTyxJQUFJLGdCQUFnQixHQUNqRCxzQkFBc0IsT0FBTyxJQUFJLGdCQUFnQixHQUNqRCxxQkFBcUIsT0FBTyxJQUFJLGVBQWUsR0FDL0MseUJBQXlCLE9BQU8sSUFBSSxtQkFBbUIsR0FDdkQsc0JBQXNCLE9BQU8sSUFBSSxnQkFBZ0IsR0FDakQsMkJBQTJCLE9BQU8sSUFBSSxxQkFBcUIsR0FDM0Qsa0JBQWtCLE9BQU8sSUFBSSxZQUFZLEdBQ3pDLGtCQUFrQixPQUFPLElBQUksWUFBWTtFQUUzQyxJQUFJLHNCQUFzQixPQUFPLElBQUksZ0JBQWdCLEdBQ25ELDJCQUEyQixPQUFPLElBQUkscUJBQXFCO0VBRTdELElBQUksNEJBQTRCLE9BQU8sSUFBSSwyQkFBMkIsR0FDcEUsNkJBQTZCLE9BQU8sSUFBSSx1QkFBdUIsR0FDL0QseUJBQXlCLE9BQU8sSUFBSSxtQkFBbUIsR0FDdkQsd0JBQXdCLE9BQU8sVUFDL0IseUJBQXlCLE9BQU8sSUFBSSx3QkFBd0IsR0FDNUQsY0FBYyxNQUFNLFNBQ3BCLHVCQUNFLE1BQU0saUVBQ1IsMEJBQ0UsU0FBUyw4REFDWCxhQUFhLE9BQU8sT0FBTztHQUN6QixTQUFTLENBQUM7R0FDVixNQUFNO0dBQ04sUUFBUTtHQUNSLFFBQVE7RUFDVixDQUFDLEdBQ0QsYUFBYSxDQUFDO0VBQ2hCLElBQUksYUFBYSxDQUFDO0VBQ2xCLElBQUksaUJBQWlCLElBQ25CLHFCQUFxQixhQUFhLElBQUksR0FDdEMsMEJBQTBCLGFBQWEsSUFBSSxHQUMzQywwQkFBMEIsYUFBYSxJQUFJLEdBQzNDLCtCQUErQixhQUFhLElBQUksR0FDaEQsZ0JBQWdCLEdBQ2hCLFNBQ0EsVUFDQSxVQUNBLFdBQ0EsV0FDQSxvQkFDQTtFQUNGLFlBQVkscUJBQXFCLENBQUM7RUFDbEMsSUFBSSxRQUNGLFFBQ0EsVUFBVSxDQUFDO0VBQ2IsSUFBSSxzQkFBc0IsS0FDeEIsZUFBZSxPQUFPLFVBQVUsVUFBVSxLQUMxQztFQUNGLElBQUksVUFBVSxNQUNaLGNBQWMsQ0FBQyxHQUNmLGlCQUFpQixPQUFPLFVBQVUsZ0JBQ2xDLHFCQUFxQixVQUFVLDJCQUMvQixtQkFBbUIsVUFBVSx5QkFDN0IsY0FBYyxVQUFVLHNCQUN4QixlQUFlLFVBQVUsdUJBQ3pCLFFBQVEsVUFBVSxjQUNsQiwwQkFBMEIsVUFBVSxrQ0FDcEMsb0JBQW9CLFVBQVUsNEJBQzlCLHVCQUF1QixVQUFVLCtCQUNqQyxtQkFBbUIsVUFBVSx5QkFDN0IsY0FBYyxVQUFVLHNCQUN4QixlQUFlLFVBQVUsdUJBQ3pCLFFBQVEsVUFBVSxLQUNsQixnQ0FBZ0MsVUFBVSwrQkFDMUMsYUFBYSxNQUNiLGVBQWUsTUFDZixpQkFBaUIsQ0FBQyxHQUNsQixvQkFBb0IsZ0JBQWdCLE9BQU8sZ0NBQzNDLFFBQVEsS0FBSyxRQUFRLEtBQUssUUFBUSxlQUNsQyxNQUFNLEtBQUssS0FDWCxNQUFNLEtBQUssS0FDWCwyQkFBMkIsS0FDM0IsNkJBQTZCLFFBQzdCLGdCQUFnQixTQUNoQix3QkFBd0IsR0FDeEIsMEJBQTBCLEdBQzFCLHVCQUF1QixJQUN2QixvQkFBb0IsV0FDcEIsWUFBWSxLQUFLLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQzlDLHNCQUFzQixrQkFBa0IsV0FDeEMsbUJBQW1CLGtCQUFrQixXQUNyQywrQkFBK0Isc0JBQXNCLFdBQ3JELDJCQUEyQixtQk
15852FBbUIsV0FDOUMsbUNBQW1DLHNCQUFzQixXQUN6RCw2QkFBNkIsb0JBQW9CLFdBQ2pELCtCQUErQixzQkFBc0IsV0FDckQsMEJBQTBCLG1CQUFtQixXQUM3Qyx5QkFBeUIsaUJBQWlCLFdBQzFDLGtDQUFrQixJQUFJLElBQUksR0FDMUIsK0JBQStCLENBQUMsR0FDaEMsNEJBQTRCLENBQUMsR0FDN0IsbUJBQW1CO0dBQ2pCLFFBQVEsQ0FBQztHQUNULFVBQVUsQ0FBQztHQUNYLE9BQU8sQ0FBQztHQUNSLFFBQVEsQ0FBQztHQUNULE9BQU8sQ0FBQztHQUNSLE9BQU8sQ0FBQztHQUNSLFFBQVEsQ0FBQztFQUNYLEdBQ0EsNkJBQTZCLE9BQzNCLCtZQUNGLEdBQ0EsNEJBQTRCLENBQUMsR0FDN0IsOEJBQThCLENBQUMsR0FDL0IsZ0NBQWdDLENBQUMsR0FDakMsc0RBQXNELFlBQ3RELDZCQUE2QixDQUFDLEdBQzlCLCtCQUErQixDQUFDLEdBQ2hDLDZCQUE2QixDQUFDLEdBQzlCLHNCQUFzQixDQUFDLEdBQ3ZCLDBCQUEwQixDQUFDO0VBQzdCLElBQUksMkJBQTJCLENBQUM7RUFDaEMsSUFBSSxpQkFBaUIsQ0FBQyxTQUFTLGNBQWMsR0FDM0MsdUJBQXVCLENBQUMsR0FDeEIsZ0JBQWdCLHVCQUNoQixjQUNFLDhlQUE4ZSxNQUM1ZSxHQUNGLEdBQ0YsY0FDRSwwRkFBMEYsTUFDeEYsR0FDRixHQUNGLGtCQUFrQixZQUFZLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FDL0MsaUJBQWlCLG1DQUFtQyxNQUFNLEdBQUcsR0FDN0QsdUJBQXVCO0dBQ3JCLFNBQVM7R0FDVCxTQUFTO0dBQ1QsYUFBYTtHQUNiLGtCQUFrQjtHQUNsQixnQkFBZ0I7R0FDaEIsbUJBQW1CO0dBQ25CLHdCQUF3QjtHQUN4QixzQkFBc0I7R0FDdEIscUJBQXFCO0dBQ3JCLG1CQUFtQixDQUFDO0VBQ3RCLEdBQ0EsVUFBVSxDQUFDLEdBQ1gsc0JBQXNCO0dBQ3BCLFdBQ0UseUpBQXlKLE1BQ3ZKLEdBQ0Y7R0FDRixZQUNFLCtKQUErSixNQUM3SixHQUNGO0dBQ0Ysb0JBQW9CLENBQUMsdUJBQXVCLHFCQUFxQjtHQUNqRSxRQUNFLGdTQUFnUyxNQUM5UixHQUNGO0dBQ0YsYUFDRSxnSUFBZ0ksTUFDOUgsR0FDRjtHQUNGLGtCQUFrQixDQUFDLHVCQUF1Qix1QkFBdUI7R0FDakUsZ0JBQWdCO0lBQ2Q7SUFDQTtJQUNBO0dBQ0Y7R0FDQSxrQkFBa0I7SUFDaEI7SUFDQTtJQUNBO0dBQ0Y7R0FDQSxrQkFBa0IsQ0FBQyx1QkFBdUIsdUJBQXVCO0dBQ2pFLGtCQUFrQixDQUFDLHVCQUF1Qix1QkFBdUI7R0FDakUsY0FBYztJQUNaO0lBQ0E7SUFDQTtHQUNGO0dBQ0EsYUFBYTtJQUNYO0lBQ0E7SUFDQTtJQUNBO0dBQ0Y7R0FDQSxhQUFhO0lBQ1g7SUFDQTtJQUNBO0lBQ0E7SUFDQTtHQUNGO0dBQ0EsY0FDRSxzSUFBc0ksTUFDcEksR0FDRjtHQUNGLG1CQUFtQixDQUFDLHdCQUF3Qix3QkFBd0I7R0FDcEUsaUJBQWlCO0lBQ2Y7SUFDQTtJQUNBO0dBQ0Y7R0FDQSxtQkFBbUI7SUFDakI7SUFDQTtJQUNBO0dBQ0Y7R0FDQSxtQkFBbUIsQ0FBQyx3QkFBd0Isd0JBQXdCO0dBQ3BFLG1CQUFtQixDQUFDLHdCQUF3Qix3QkFBd0I7R0FDcEUsWUFBWTtJQUFDO0lBQW1CO0lBQW1CO0dBQWlCO0dBQ3BFLGNBQWM7SUFDWjtJQUNBO0lBQ0E7SUFDQTtHQUNGO0dBQ0EsYUFBYTtJQUNYO0lBQ0E7SUFDQTtHQUNGO0dBQ0EsYUFBYTtJQUNYO0lBQ0E7SUFDQTtJQUNBO0dBQ0Y7R0FDQSxXQUFXO0lBQUM7SUFBa0I7SUFBa0I7R0FBZ0I7R0FDaEUsYUFBYTtJQUNYO0lBQ0E7SUFDQTtJQUNBO0dBQ0Y7R0FDQSxhQUFhLENBQUMsa0JBQWtCO0dBQ2hDLFlBQVk7SUFBQztJQUFtQjtJQUFtQjtHQUFpQjtHQUNwRSxTQUFTLENBQUMsZUFBZSxhQUFhO0dBQ3RDLHNCQUFzQixDQUNwQiwwQkFDQSx1QkFDRjtHQUNBLFdBQVcsQ0FBQyxpQkFBaUIsZUFBZTtHQUM1QyxNQUFNO0lBQUM7SUFBYTtJQUFZO0dBQVk7R0FDNUMsVUFBVSxDQUFDLGlCQUFpQixVQUFVO0dBQ3RDLE1BQU0seVFBQXlRLE1BQzdRLEdBQ0Y7R0FDQSxlQUFlO0lBQ2I7SUFDQTtJQUNBO0lBQ0E7R0FDRjtHQUNBLGFBQ0UseUhBQXlILE1BQ3ZILEdBQ0Y7R0FDRixLQUFLLENBQUMsYUFBYSxRQUFRO0dBQzNCLE1BQU0sbUdBQW1HLE1BQ3ZHLEdBQ0Y7R0FDQSxVQUFVO0lBQ1I7SUFDQTtJQUNBO0lBQ0E7R0FDRjtHQUNBLFlBQVksQ0FBQyxpQkFBaUIsaUJBQWlCO0dBQy9DLGVBQWUsQ0FBQyxXQUFXO0dBQzNCLFNBQVMsQ0FBQyxhQUFhLFFBQVE7R0FDL0IsU0FBUyxDQUFDLGNBQWMsY0FBYztHQUN0QyxZQUFZLENBQUMsUUFBUTtHQUNyQixjQUFjO0lBQ1o7SUFDQTtJQUNBO0dBQ0Y7R0FDQSxPQUFPO0lBQUM7SUFBVTtJQUFRO0lBQVM7R0FBSztHQUN4QyxZQUFZLENBQUMsaUJBQWlCLGlCQUFpQjtHQUMvQyxhQUFhLENBQUMsa0JBQWtCLGtCQUFrQjtHQUNsRCxXQUFXO0lBQUM7SUFBa0I7SUFBcUI7R0FBZTtHQUNsRSxRQUFRO0lBQUM7SUFBZ0I7SUFBYztJQUFlO0dBQVc7R0FDakUsYUFBYSxDQUFDLGtCQUFrQixrQkFBa0I7R0FDbEQsY0FBYyxDQUFDLG1CQUFtQixtQkFBbUI7R0FDckQsUUFBUTtJQUFDO0lBQWE7SUFBYTtHQUFhO0dBQ2hELE1BQU0sdUdBQXVHLE1BQzNHLEdBQ0Y7R0FDQSxjQUFjLENBQUMsaUJBQWlCLGVBQWU7R0FDL0MsUUFBUTtJQUNOO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7R0FDRjtHQUNBLFNBQVM7SUFBQztJQUFnQjtJQUFnQjtHQUFjO0dBQ3hELFVBQVUsQ0FBQyxhQUFhLFdBQVc7R0FDbkMsb0JBQW9CLENBQUMsdUJBQXVCLHFCQUFxQjtHQUNqRSxTQUFTO0lBQUM7SUFBaUI7SUFBZTtJQUFnQjtHQUFZO0dBQ3RFLGNBQWMsQ0FBQyxtQkFBbUIsbUJBQW1CO0dBQ3JELGVBQWUsQ0FBQyxvQkFBb0Isb0JBQW9CO0dBQ3hELGdCQUFnQixDQUFDLFlBQVk7R0FDN0IsaUJBQWlCLENBQUMsYUFBYTtHQUMvQixpQkFBaUIsQ0FBQyxhQUFhO0dBQy9CLGNBQWMsQ0FBQyxnQkFBZ0IsZ0JBQWdCO0dBQy9DLFlBQVksQ0FBQyxjQUFjLGNBQWM7R0FDekMsV0FBVyxDQUFDLGFBQWEsYUFBYTtHQUN0QyxjQUFjO0lBQ1o7SUFDQTtJQUNBO0lBQ0E7R0FDRjtHQUNBLG1CQUFtQixDQUFDLHdCQUF3Qix3QkFBd0I7R0FDcEUsb0JBQW9CLENBQ2xCLHlCQUNBLHlCQUNGO0dBQ0EsZUFBZTtJQUNiO0lBQ0E7SUFDQTtJQUNBO0dBQ0Y7R0FDQSxvQkFBb0IsQ0FDbEIseUJBQ0EseUJBQ0Y7R0FDQSxxQkFBcUIsQ0FDbkIsMEJBQ0EsMEJBQ0Y7R0FDQSxnQkFBZ0I7SUFDZDtJQUNBO0lBQ0E7SUFDQTtH
15852QUNGO0dBQ0EsY0FBYyxDQUFDLHFCQUFxQixtQkFBbUI7R0FDdkQsVUFBVSxDQUFDLGdCQUFnQixlQUFlO0dBQzFDLFlBQVk7SUFDVjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0dBQ0Y7R0FDQSxlQUFlO0lBQUM7SUFBcUI7SUFBaUI7R0FBZ0I7R0FDdEUsWUFBWSxDQUFDLGdCQUFnQixvQkFBb0I7R0FDakQsVUFBVSxDQUFDLGNBQWM7RUFDM0IsR0FDQSxtQkFBbUIsWUFDbkIsY0FBYyxRQUNkLDhCQUE4QiwwQkFDOUIsWUFBWSxTQUNaLGdCQUFnQixTQUNoQixvQ0FBb0MsU0FDcEMsbUJBQW1CLENBQUMsR0FDcEIsb0JBQW9CLENBQUMsR0FDckIsb0JBQW9CLENBQUMsR0FDckIseUJBQXlCLENBQUMsR0FDMUIsa0JBQWtCLElBQUksSUFDcEIsMjZCQUEyNkIsTUFDejZCLEdBQ0YsQ0FDRixHQUNBLGlCQUFpQixzQ0FDakIsZ0JBQWdCLDhCQUNoQiwwQkFBVSxJQUFJLElBQUk7R0FDaEIsQ0FBQyxpQkFBaUIsZ0JBQWdCO0dBQ2xDLENBQUMsV0FBVyxLQUFLO0dBQ2pCLENBQUMsYUFBYSxZQUFZO0dBQzFCLENBQUMsZUFBZSxhQUFhO0dBQzdCLENBQUMsZ0JBQWdCLGVBQWU7R0FDaEMsQ0FBQyxxQkFBcUIsb0JBQW9CO0dBQzFDLENBQUMsY0FBYyxhQUFhO0dBQzVCLENBQUMsaUJBQWlCLGdCQUFnQjtHQUNsQyxDQUFDLGFBQWEsWUFBWTtHQUMxQixDQUFDLFlBQVksV0FBVztHQUN4QixDQUFDLFlBQVksV0FBVztHQUN4QixDQUFDLHNCQUFzQixxQkFBcUI7R0FDNUMsQ0FBQyw2QkFBNkIsNkJBQTZCO0dBQzNELENBQUMsZ0JBQWdCLGVBQWU7R0FDaEMsQ0FBQyxrQkFBa0IsaUJBQWlCO0dBQ3BDLENBQUMsb0JBQW9CLG1CQUFtQjtHQUN4QyxDQUFDLG9CQUFvQixtQkFBbUI7R0FDeEMsQ0FBQyxlQUFlLGNBQWM7R0FDOUIsQ0FBQyxZQUFZLFdBQVc7R0FDeEIsQ0FBQyxjQUFjLGFBQWE7R0FDNUIsQ0FBQyxnQkFBZ0IsZUFBZTtHQUNoQyxDQUFDLGNBQWMsYUFBYTtHQUM1QixDQUFDLFlBQVksV0FBVztHQUN4QixDQUFDLGtCQUFrQixrQkFBa0I7R0FDckMsQ0FBQyxlQUFlLGNBQWM7R0FDOUIsQ0FBQyxhQUFhLFlBQVk7R0FDMUIsQ0FBQyxlQUFlLGNBQWM7R0FDOUIsQ0FBQyxjQUFjLGFBQWE7R0FDNUIsQ0FBQyxhQUFhLFlBQVk7R0FDMUIsQ0FBQyw4QkFBOEIsOEJBQThCO0dBQzdELENBQUMsNEJBQTRCLDRCQUE0QjtHQUN6RCxDQUFDLGFBQWEsYUFBYTtHQUMzQixDQUFDLGdCQUFnQixnQkFBZ0I7R0FDakMsQ0FBQyxrQkFBa0IsaUJBQWlCO0dBQ3BDLENBQUMsaUJBQWlCLGdCQUFnQjtHQUNsQyxDQUFDLGlCQUFpQixnQkFBZ0I7R0FDbEMsQ0FBQyxhQUFhLFlBQVk7R0FDMUIsQ0FBQyxhQUFhLFlBQVk7R0FDMUIsQ0FBQyxlQUFlLGNBQWM7R0FDOUIsQ0FBQyxZQUFZLFdBQVc7R0FDeEIsQ0FBQyxvQkFBb0IsbUJBQW1CO0dBQ3hDLENBQUMscUJBQXFCLG9CQUFvQjtHQUMxQyxDQUFDLGNBQWMsYUFBYTtHQUM1QixDQUFDLFlBQVksVUFBVTtHQUN2QixDQUFDLGlCQUFpQixnQkFBZ0I7R0FDbEMsQ0FBQyxtQkFBbUIsa0JBQWtCO0dBQ3RDLENBQUMsa0JBQWtCLGlCQUFpQjtHQUNwQyxDQUFDLGFBQWEsWUFBWTtHQUMxQixDQUFDLGVBQWUsY0FBYztHQUM5QixDQUFDLHlCQUF5Qix3QkFBd0I7R0FDbEQsQ0FBQywwQkFBMEIseUJBQXlCO0dBQ3BELENBQUMsbUJBQW1CLGtCQUFrQjtHQUN0QyxDQUFDLG9CQUFvQixtQkFBbUI7R0FDeEMsQ0FBQyxpQkFBaUIsZ0JBQWdCO0dBQ2xDLENBQUMsa0JBQWtCLGlCQUFpQjtHQUNwQyxDQUFDLG9CQUFvQixtQkFBbUI7R0FDeEMsQ0FBQyxpQkFBaUIsZ0JBQWdCO0dBQ2xDLENBQUMsZUFBZSxjQUFjO0dBQzlCLENBQUMsY0FBYyxhQUFhO0dBQzVCLENBQUMsa0JBQWtCLGlCQUFpQjtHQUNwQyxDQUFDLGlCQUFpQixnQkFBZ0I7R0FDbEMsQ0FBQyxtQkFBbUIsa0JBQWtCO0dBQ3RDLENBQUMscUJBQXFCLG9CQUFvQjtHQUMxQyxDQUFDLHNCQUFzQixxQkFBcUI7R0FDNUMsQ0FBQyxlQUFlLGNBQWM7R0FDOUIsQ0FBQyxnQkFBZ0IsZUFBZTtHQUNoQyxDQUFDLGNBQWMsY0FBYztHQUM3QixDQUFDLGVBQWUsY0FBYztHQUM5QixDQUFDLFlBQVksV0FBVztHQUN4QixDQUFDLGdCQUFnQixlQUFlO0dBQ2hDLENBQUMsaUJBQWlCLGdCQUFnQjtHQUNsQyxDQUFDLGdCQUFnQixlQUFlO0dBQ2hDLENBQUMsWUFBWSxZQUFZO0dBQ3pCLENBQUMsZUFBZSxlQUFlO0dBQy9CLENBQUMsZUFBZSxlQUFlO0dBQy9CLENBQUMsZUFBZSxjQUFjO0dBQzlCLENBQUMsZUFBZSxjQUFjO0dBQzlCLENBQUMsY0FBYyxhQUFhO0dBQzVCLENBQUMsV0FBVyxVQUFVO0VBQ3hCLENBQUMsR0FDRCx3QkFBd0I7R0FDdEIsUUFBUTtHQUNSLGVBQWU7R0FDZixrQkFBa0I7R0FDbEIsV0FBVztHQUNYLFFBQVE7R0FDUixpQkFBaUI7R0FDakIsS0FBSztHQUNMLElBQUk7R0FDSixPQUFPO0dBQ1AsZ0JBQWdCO0dBQ2hCLGNBQWM7R0FDZCxhQUFhO0dBQ2IsV0FBVztHQUNYLFVBQVU7R0FDVixVQUFVO0dBQ1YsU0FBUztHQUNULGFBQWE7R0FDYixhQUFhO0dBQ2IsV0FBVztHQUNYLFNBQVM7R0FDVCxTQUFTO0dBQ1QsVUFBVTtHQUNWLE1BQU07R0FDTixPQUFPO0dBQ1AsU0FBUztHQUNULFdBQVc7R0FDWCxNQUFNO0dBQ04sU0FBUztHQUNULFNBQVM7R0FDVCxpQkFBaUI7R0FDakIsYUFBYTtHQUNiLFVBQVU7R0FDVixjQUFjO0dBQ2QsUUFBUTtHQUNSLGdCQUFnQjtHQUNoQixhQUFhO0dBQ2IseUJBQXlCO0dBQ3pCLE1BQU07R0FDTixVQUFVO0dBQ1YsU0FBUztHQUNULGdCQUFnQjtHQUNoQixjQUFjO0dBQ2QsT0FBTztHQUNQLEtBQUs7R0FDTCxVQUFVO0dBQ1YseUJBQXlCO0dBQ3pCLHVCQUF1QjtHQUN2QixVQUFVO0dBQ1YsV0FBVztHQUNYLFNBQVM7R0FDVCxjQUFjO0dBQ2QsZUFBZTtHQUNmLEtBQUs7R0FDTCxNQUFNO0dBQ04sWUFBWTtHQUNaLFlBQVk7R0FDWixhQUFhO0dBQ2IsZ0JBQWdCO0dBQ2hCLFlBQVk7R0FDWixhQUFhO0dBQ2IsU0FBUztHQUNULFFBQVE7R0FDUixRQUFRO0dBQ1IsTUFBTTtHQUNOLE1BQU07R0FDTixVQUFVO0dBQ1YsU0FBUztHQUNULFdBQVc7R0FDWCxjQUFjO0dBQ2QsTUFBTTtHQUNOLElBQUk7R0FDSixZQUFZO0dBQ1osYUFBYTtHQUNiLE9BQU87R0FDUCxXQUFXO0dBQ1gsV0FBVztHQUNYLFdBQVc7R0FDWCxJQUFJO0dBQ0osUUFBUTtHQUNSLFVBQVU7
15852R0FDVixTQUFTO0dBQ1QsV0FBVztHQUNYLFVBQVU7R0FDVixXQUFXO0dBQ1gsU0FBUztHQUNULE1BQU07R0FDTixPQUFPO0dBQ1AsTUFBTTtHQUNOLE1BQU07R0FDTixNQUFNO0dBQ04sS0FBSztHQUNMLFVBQVU7R0FDVixhQUFhO0dBQ2IsY0FBYztHQUNkLEtBQUs7R0FDTCxXQUFXO0dBQ1gsT0FBTztHQUNQLFlBQVk7R0FDWixRQUFRO0dBQ1IsS0FBSztHQUNMLFdBQVc7R0FDWCxVQUFVO0dBQ1YsT0FBTztHQUNQLE1BQU07R0FDTixVQUFVO0dBQ1YsT0FBTztHQUNQLFlBQVk7R0FDWixNQUFNO0dBQ04sU0FBUztHQUNULFNBQVM7R0FDVCxhQUFhO0dBQ2IsYUFBYTtHQUNiLFFBQVE7R0FDUixTQUFTO0dBQ1QsU0FBUztHQUNULFlBQVk7R0FDWixVQUFVO0dBQ1YsZ0JBQWdCO0dBQ2hCLEtBQUs7R0FDTCxVQUFVO0dBQ1YsVUFBVTtHQUNWLE1BQU07R0FDTixNQUFNO0dBQ04sU0FBUztHQUNULFNBQVM7R0FDVCxPQUFPO0dBQ1AsUUFBUTtHQUNSLFdBQVc7R0FDWCxVQUFVO0dBQ1YsVUFBVTtHQUNWLE9BQU87R0FDUCxNQUFNO0dBQ04sT0FBTztHQUNQLE1BQU07R0FDTixZQUFZO0dBQ1osS0FBSztHQUNMLFFBQVE7R0FDUixTQUFTO0dBQ1QsUUFBUTtHQUNSLE9BQU87R0FDUCxNQUFNO0dBQ04sT0FBTztHQUNQLFNBQVM7R0FDVCxVQUFVO0dBQ1YsUUFBUTtHQUNSLE9BQU87R0FDUCxNQUFNO0dBQ04sUUFBUTtHQUNSLE9BQU87R0FDUCxPQUFPO0dBQ1AsT0FBTztHQUNQLE1BQU07R0FDTixPQUFPO0dBQ1AsY0FBYztHQUNkLGlCQUFpQjtHQUNqQixZQUFZO0dBQ1osVUFBVTtHQUNWLG1CQUFtQjtHQUNuQixzQkFBc0I7R0FDdEIsY0FBYztHQUNkLFlBQVk7R0FDWixXQUFXO0dBQ1gsWUFBWTtHQUNaLGVBQWU7R0FDZixRQUFRO0dBQ1IsZUFBZTtHQUNmLGVBQWU7R0FDZixhQUFhO0dBQ2IsU0FBUztHQUNULGVBQWU7R0FDZixlQUFlO0dBQ2Ysa0JBQWtCO0dBQ2xCLGFBQWE7R0FDYixNQUFNO0dBQ04sT0FBTztHQUNQLE1BQU07R0FDTixJQUFJO0dBQ0osVUFBVTtHQUNWLFdBQVc7R0FDWCxjQUFjO0dBQ2QsTUFBTTtHQUNOLFVBQVU7R0FDVixhQUFhO0dBQ2IsZUFBZTtHQUNmLFVBQVU7R0FDVixhQUFhO0dBQ2IsT0FBTztHQUNQLG9CQUFvQjtHQUNwQix1QkFBdUI7R0FDdkIsMkJBQTJCO0dBQzNCLCtCQUErQjtHQUMvQixjQUFjO0dBQ2QsaUJBQWlCO0dBQ2pCLGdCQUFnQjtHQUNoQixtQkFBbUI7R0FDbkIsbUJBQW1CO0dBQ25CLGtCQUFrQjtHQUNsQixRQUFRO0dBQ1IsSUFBSTtHQUNKLElBQUk7R0FDSixHQUFHO0dBQ0gsVUFBVTtHQUNWLFlBQVk7R0FDWixTQUFTO0dBQ1QsaUJBQWlCO0dBQ2pCLFdBQVc7R0FDWCxTQUFTO0dBQ1QsU0FBUztHQUNULGtCQUFrQjtHQUNsQixxQkFBcUI7R0FDckIsS0FBSztHQUNMLElBQUk7R0FDSixJQUFJO0dBQ0osVUFBVTtHQUNWLFdBQVc7R0FDWCxrQkFBa0I7R0FDbEIscUJBQXFCO0dBQ3JCLEtBQUs7R0FDTCxVQUFVO0dBQ1YsMkJBQTJCO0dBQzNCLE1BQU07R0FDTixhQUFhO0dBQ2IsZ0JBQWdCO0dBQ2hCLFVBQVU7R0FDVixhQUFhO0dBQ2IsUUFBUTtHQUNSLFdBQVc7R0FDWCxhQUFhO0dBQ2IsY0FBYztHQUNkLGlCQUFpQjtHQUNqQixZQUFZO0dBQ1osZUFBZTtHQUNmLFdBQVc7R0FDWCxZQUFZO0dBQ1osZUFBZTtHQUNmLFVBQVU7R0FDVixhQUFhO0dBQ2IsZ0JBQWdCO0dBQ2hCLG9CQUFvQjtHQUNwQixhQUFhO0dBQ2IsZ0JBQWdCO0dBQ2hCLFdBQVc7R0FDWCxjQUFjO0dBQ2QsYUFBYTtHQUNiLGdCQUFnQjtHQUNoQixZQUFZO0dBQ1osZUFBZTtHQUNmLFFBQVE7R0FDUixNQUFNO0dBQ04sSUFBSTtHQUNKLElBQUk7R0FDSixJQUFJO0dBQ0osSUFBSTtHQUNKLFdBQVc7R0FDWCxjQUFjO0dBQ2QsNEJBQTRCO0dBQzVCLGdDQUFnQztHQUNoQywwQkFBMEI7R0FDMUIsOEJBQThCO0dBQzlCLFVBQVU7R0FDVixtQkFBbUI7R0FDbkIsZUFBZTtHQUNmLFNBQVM7R0FDVCxXQUFXO0dBQ1gsZUFBZTtHQUNmLGNBQWM7R0FDZCxrQkFBa0I7R0FDbEIsYUFBYTtHQUNiLGdCQUFnQjtHQUNoQixtQkFBbUI7R0FDbkIsS0FBSztHQUNMLElBQUk7R0FDSixRQUFRO0dBQ1IsV0FBVztHQUNYLElBQUk7R0FDSixJQUFJO0dBQ0osSUFBSTtHQUNKLElBQUk7R0FDSixHQUFHO0dBQ0gsY0FBYztHQUNkLGtCQUFrQjtHQUNsQixTQUFTO0dBQ1QsV0FBVztHQUNYLFlBQVk7R0FDWixVQUFVO0dBQ1YsY0FBYztHQUNkLGVBQWU7R0FDZixrQkFBa0I7R0FDbEIsZUFBZTtHQUNmLGtCQUFrQjtHQUNsQixtQkFBbUI7R0FDbkIsT0FBTztHQUNQLFdBQVc7R0FDWCxjQUFjO0dBQ2QsY0FBYztHQUNkLFdBQVc7R0FDWCxjQUFjO0dBQ2QsYUFBYTtHQUNiLGdCQUFnQjtHQUNoQixhQUFhO0dBQ2IsYUFBYTtHQUNiLE1BQU07R0FDTixrQkFBa0I7R0FDbEIsVUFBVTtHQUNWLFdBQVc7R0FDWCxjQUFjO0dBQ2QsTUFBTTtHQUNOLFlBQVk7R0FDWixRQUFRO0dBQ1IsU0FBUztHQUNULFVBQVU7R0FDVixPQUFPO0dBQ1AsUUFBUTtHQUNSLGFBQWE7R0FDYixRQUFRO0dBQ1IsVUFBVTtHQUNWLGtCQUFrQjtHQUNsQixxQkFBcUI7R0FDckIsbUJBQW1CO0dBQ25CLHNCQUFzQjtHQUN0QixZQUFZO0dBQ1osZUFBZTtHQUNmLFNBQVM7R0FDVCxZQUFZO0dBQ1osWUFBWTtHQUNaLHFCQUFxQjtHQUNyQixrQkFBa0I7R0FDbEIsY0FBYztHQUNkLGVBQWU7R0FDZixrQkFBa0I7R0FDbEIsUUFBUTtHQUNSLFdBQVc7R0FDWCxXQUFXO0dBQ1gsV0FBVztHQUNYLFNBQVM7R0FDVCxlQUFlO0dBQ2YscUJBQXFCO0dBQ3JCLFFBQVE7R0FDUixlQUFlO0dBQ2YscUJBQXFCO0dBQ3JCLGdCQUFnQjtHQUNoQixVQUFVO0dBQ1YsR0FBRztHQUNILFFBQVE7R0FDUixNQUFNO0dBQ04sTUFBTTtHQUNOLGlCQUFpQjtHQUNqQixvQkFBb0I7R0FDcEIsYUFBYTtHQUNiLFdBQVc7R0FDWCxvQkFBb0I7R0FDcEIsa0JBQWtCO0dBQ2xCLFVBQVU7R0FDVixTQUFTO0dBQ1QsUUFBUTtHQUNSLFNBQVM7R0FDVCxRQUFRO0dBQ1IsSUFBSTtHQUNKLElBQUk7R0FDSixPQUFPO0dBQ1AsVUFBVTtHQUNWLE1BQU07R0FDTixnQkFBZ0I7R0FDaEIsbUJBQW1CO0dBQ25CLE9BQU87R0FDUCxTQUFTO0dBQ1Qsa0JBQWtCO0dBQ2xCLGtCQUFrQjtHQUNsQixPQUFPO0dBQ1AsY0FBYztHQUNkLGFBQWE7R0FDYixjQUFjO0dBQ2QsT0FBTztHQUNQLE9BQU87R0FDUCxhQUFhO0dBQ2IsV0FBVztHQUNYLGNBQWM7R0FDZCxhQUFhO0dBQ2IsZ0JBQWdCO0dBQ2hCLHVC
15852QUF1QjtHQUN2QiwwQkFBMEI7R0FDMUIsd0JBQXdCO0dBQ3hCLDJCQUEyQjtHQUMzQixRQUFRO0dBQ1IsUUFBUTtHQUNSLGlCQUFpQjtHQUNqQixvQkFBb0I7R0FDcEIsa0JBQWtCO0dBQ2xCLHFCQUFxQjtHQUNyQixlQUFlO0dBQ2Ysa0JBQWtCO0dBQ2xCLGdCQUFnQjtHQUNoQixtQkFBbUI7R0FDbkIsa0JBQWtCO0dBQ2xCLHFCQUFxQjtHQUNyQixhQUFhO0dBQ2IsZ0JBQWdCO0dBQ2hCLGVBQWU7R0FDZixrQkFBa0I7R0FDbEIsZ0NBQWdDO0dBQ2hDLDBCQUEwQjtHQUMxQixjQUFjO0dBQ2QsZ0JBQWdCO0dBQ2hCLGFBQWE7R0FDYixTQUFTO0dBQ1QsU0FBUztHQUNULFlBQVk7R0FDWixlQUFlO0dBQ2YsZ0JBQWdCO0dBQ2hCLG1CQUFtQjtHQUNuQixZQUFZO0dBQ1osZUFBZTtHQUNmLGtCQUFrQjtHQUNsQixJQUFJO0dBQ0osV0FBVztHQUNYLGlCQUFpQjtHQUNqQixvQkFBb0I7R0FDcEIsUUFBUTtHQUNSLElBQUk7R0FDSixJQUFJO0dBQ0osbUJBQW1CO0dBQ25CLHNCQUFzQjtHQUN0QixvQkFBb0I7R0FDcEIsdUJBQXVCO0dBQ3ZCLFNBQVM7R0FDVCxhQUFhO0dBQ2IsZ0JBQWdCO0dBQ2hCLGNBQWM7R0FDZCxpQkFBaUI7R0FDakIsWUFBWTtHQUNaLGdCQUFnQjtHQUNoQixjQUFjO0dBQ2QsYUFBYTtHQUNiLGdCQUFnQjtHQUNoQixRQUFRO0dBQ1IsY0FBYztHQUNkLGlCQUFpQjtHQUNqQixTQUFTO0dBQ1QsVUFBVTtHQUNWLGNBQWM7R0FDZCxhQUFhO0dBQ2IsaUJBQWlCO0dBQ2pCLGFBQWE7R0FDYixpQkFBaUI7R0FDakIsVUFBVTtHQUNWLGFBQWE7R0FDYixjQUFjO0dBQ2QsaUJBQWlCO0dBQ2pCLFNBQVM7R0FDVCxZQUFZO0dBQ1osWUFBWTtHQUNaLGVBQWU7R0FDZixrQkFBa0I7R0FDbEIsT0FBTztHQUNQLFFBQVE7R0FDUixhQUFhO0dBQ2IsZ0JBQWdCO0dBQ2hCLGFBQWE7R0FDYixnQkFBZ0I7R0FDaEIsSUFBSTtHQUNKLElBQUk7R0FDSixHQUFHO0dBQ0gsa0JBQWtCO0dBQ2xCLFNBQVM7R0FDVCxZQUFZO0dBQ1osY0FBYztHQUNkLGlCQUFpQjtHQUNqQixjQUFjO0dBQ2QsaUJBQWlCO0dBQ2pCLFdBQVc7R0FDWCxjQUFjO0dBQ2QsV0FBVztHQUNYLGNBQWM7R0FDZCxXQUFXO0dBQ1gsY0FBYztHQUNkLFlBQVk7R0FDWixlQUFlO0dBQ2YsV0FBVztHQUNYLGNBQWM7R0FDZCxTQUFTO0dBQ1QsWUFBWTtHQUNaLFNBQVM7R0FDVCxZQUFZO0dBQ1osT0FBTztHQUNQLGFBQWE7R0FDYixZQUFZO0dBQ1osZUFBZTtHQUNmLFVBQVU7R0FDVixJQUFJO0dBQ0osSUFBSTtHQUNKLEdBQUc7R0FDSCxrQkFBa0I7R0FDbEIsR0FBRztHQUNILFlBQVk7RUFDZCxHQUNBLGlCQUFpQjtHQUNmLGdCQUFnQjtHQUNoQixvQkFBb0I7R0FDcEIsZ0JBQWdCO0dBQ2hCLGlCQUFpQjtHQUNqQixlQUFlO0dBQ2YsZ0JBQWdCO0dBQ2hCLHFCQUFxQjtHQUNyQixjQUFjO0dBQ2Qsd0JBQXdCO0dBQ3hCLHFCQUFxQjtHQUNyQixnQkFBZ0I7R0FDaEIsaUJBQWlCO0dBQ2pCLGlCQUFpQjtHQUNqQixjQUFjO0dBQ2QsY0FBYztHQUNkLGtCQUFrQjtHQUNsQix3QkFBd0I7R0FDeEIsb0JBQW9CO0dBQ3BCLG9CQUFvQjtHQUNwQixnQkFBZ0I7R0FDaEIsaUJBQWlCO0dBQ2pCLGlCQUFpQjtHQUNqQixpQkFBaUI7R0FDakIsYUFBYTtHQUNiLGlCQUFpQjtHQUNqQixpQkFBaUI7R0FDakIsaUJBQWlCO0dBQ2pCLGtCQUFrQjtHQUNsQixlQUFlO0dBQ2YsYUFBYTtHQUNiLGFBQWE7R0FDYixpQkFBaUI7R0FDakIsbUJBQW1CO0dBQ25CLGdCQUFnQjtHQUNoQix5QkFBeUI7R0FDekIsaUJBQWlCO0dBQ2pCLGlCQUFpQjtHQUNqQixnQkFBZ0I7R0FDaEIsaUJBQWlCO0dBQ2pCLG9CQUFvQjtHQUNwQixxQkFBcUI7R0FDckIsZUFBZTtHQUNmLG1CQUFtQjtHQUNuQixhQUFhO0dBQ2IsaUJBQWlCO0dBQ2pCLGlCQUFpQjtHQUNqQixpQkFBaUI7R0FDakIsZ0JBQWdCO0dBQ2hCLGdCQUFnQjtHQUNoQixxQkFBcUI7R0FDckIsK0JBQStCO0dBQy9CLHFCQUFxQjtHQUNyQixxQkFBcUI7RUFDdkIsR0FDQSxxQkFBcUIsQ0FBQyxHQUN0QixVQUFVLE9BQ1IsdU9BQ0YsR0FDQSxlQUFlLE9BQ2IsMk9BQ0YsR0FDQSxtQkFBbUIsQ0FBQyxHQUNwQixtQkFBbUIsQ0FBQyxHQUNwQixtQkFBbUIsUUFDbkIsMkJBQTJCLGFBQzNCLFFBQVEsT0FDTix1T0FDRixHQUNBLGFBQWEsT0FDWCwyT0FDRixHQUNBLHVCQUNFLDRIQUNGLHdCQUF3QixNQUN4QixnQkFBZ0IsTUFDaEIsZUFBZSxNQUNmLHVCQUF1QixDQUFDLEdBQ3hCLFlBQVksRUFDVixnQkFBZ0IsT0FBTyxVQUN2QixnQkFBZ0IsT0FBTyxPQUFPLFlBQzlCLGdCQUFnQixPQUFPLE9BQU8sU0FBUyxnQkFFekMsZ0NBQWdDLENBQUM7RUFDbkMsSUFBSSxXQUNGLElBQUk7R0FDRixJQUFJLG1CQUFtQixDQUFDO0dBQ3hCLE9BQU8sZUFBZSxrQkFBa0IsV0FBVyxFQUNqRCxLQUFLLFdBQVk7SUFDZixnQ0FBZ0MsQ0FBQztHQUNuQyxFQUNGLENBQUM7R0FDRCxPQUFPLGlCQUFpQixRQUFRLGtCQUFrQixnQkFBZ0I7R0FDbEUsT0FBTyxvQkFBb0IsUUFBUSxrQkFBa0IsZ0JBQWdCO0VBQ3ZFLFNBQVMsR0FBRztHQUNWLGdDQUFnQyxDQUFDO0VBQ25DO0VBQ0YsSUFBSSxPQUFPLE1BQ1QsWUFBWSxNQUNaLGVBQWUsTUFDZixpQkFBaUI7R0FDZixZQUFZO0dBQ1osU0FBUztHQUNULFlBQVk7R0FDWixXQUFXLFNBQVUsT0FBTztJQUMxQixPQUFPLE1BQU0sYUFBYSxLQUFLLElBQUk7R0FDckM7R0FDQSxrQkFBa0I7R0FDbEIsV0FBVztFQUNiLEdBQ0EsaUJBQWlCLHFCQUFxQixjQUFjLEdBQ3BELG1CQUFtQixPQUFPLENBQUMsR0FBRyxnQkFBZ0I7R0FBRSxNQUFNO0dBQUcsUUFBUTtFQUFFLENBQUMsR0FDcEUsbUJBQW1CLHFCQUFxQixnQkFBZ0IsR0FDeEQsZUFDQSxlQUNBLGdCQUNBLHNCQUFzQixPQUFPLENBQUMsR0FBRyxrQkFBa0I7R0FDakQsU0FBUztHQUNULFNBQVM7R0FDVCxTQUFTO0dBQ1QsU0FBUztHQUNULE9BQU87R0FDUCxPQUFPO0dBQ1AsU0FBUztHQUNULFVBQVU7R0FDVixRQUFRO0dBQ1IsU0FBUztHQUNULGtCQUFrQjtHQUNsQixRQUFRO0dBQ1IsU0FBUztHQUNULGVBQWUsU0FBVSxPQUFPO0lBQzlCLE9BQU8sS0FBSyxNQUFNLE1BQU0sZ0JBQ3BCLE1BQU0sZ0JBQWdCLE1BQU0sYUFDMUIsTUFBTSxZQUNOLE1BQU0sY0FDUixNQUFNO0dBQ1o7R0FDQSxXQUFXLFNBQVUsT0FBTztJQUMxQixJQUFJLGVBQWUsT0FBTyxPQUFPLE1BQU07SUFDdkMsVUFBVSxtQkFDUCxrQkFBa0IsZ0JBQWdCLE1BQU0sUUFDbkMsZ0JBQWdCLE1BQU0sVUFBVSxlQUFlLFNBQ2hELGdCQUFnQixNQUFNLFVBQVUsZUFBZSxXQUMvQyxnQkFBZ0IsZ0JBQWdCLEdBQ3BDLGlCQUFpQjtJQUNwQixPQUFPO0dBQ1Q7R0FDQSxXQUFXLFNBQVUsT0FBTztJQUMxQixPQUFPLGVBQWUsUUFBUSxNQUFNLFlBQVk7R0FDbEQ7RUFDRixDQUFDLEdBQ0Qsc0JBQXNCLHFCQUFxQixtQkFBbUIsR0FFOUQscUJBQXFCLHFCQURBLE9BQU8sQ0FBQyxHQUFHLHFCQUFxQixFQUFFLGNBQWMsRUFBRSxDQUNaLENBQUMsR0FFNUQsc0JBQXNCLHFCQURBLE9BQU8sQ0FBQyxHQUFHLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxDQUNULENBQUMsR0FNOUQsMEJBQTBCLHFCQUxBLE9BQU8sQ0FBQyxHQUFHLGdCQUFnQjtHQUNuRCxlQUFlO0dBQ2YsYUFBYTtHQUNiLGVBQWU7RUFDakIsQ0FDcUUsQ0FBQyxHQVF0RSwwQkFBMEIscUJBUEEsT0FBTyxDQUFDLEdBQUcsZ0JBQWdCLEVBQ25ELGVBQWUsU0FBVSxPQUFPO0dBQzlCLE9BQU8sbUJBQW1CLFFBQ3RCLE1BQU0sZ0JBQ04sT0FBTztFQUNiLEVBQ0YsQ0FDcUUsQ0FBQyxHQUV0RSw0QkFBNEIscUJBREEsT0FBTyxDQUFDLEdBQUcsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLENBRXZDLENBQzFCLEdBQ0Esc0JBQXNCLDJCQUN0QixlQUFlO0dBQ2IsS0FBSztHQUNMLFVBQVU7
15852R0FDVixNQUFNO0dBQ04sSUFBSTtHQUNKLE9BQU87R0FDUCxNQUFNO0dBQ04sS0FBSztHQUNMLEtBQUs7R0FDTCxNQUFNO0dBQ04sTUFBTTtHQUNOLFFBQVE7R0FDUixpQkFBaUI7RUFDbkIsR0FDQSxpQkFBaUI7R0FDZixHQUFHO0dBQ0gsR0FBRztHQUNILElBQUk7R0FDSixJQUFJO0dBQ0osSUFBSTtHQUNKLElBQUk7R0FDSixJQUFJO0dBQ0osSUFBSTtHQUNKLElBQUk7R0FDSixJQUFJO0dBQ0osSUFBSTtHQUNKLElBQUk7R0FDSixJQUFJO0dBQ0osSUFBSTtHQUNKLElBQUk7R0FDSixJQUFJO0dBQ0osSUFBSTtHQUNKLElBQUk7R0FDSixJQUFJO0dBQ0osSUFBSTtHQUNKLElBQUk7R0FDSixLQUFLO0dBQ0wsS0FBSztHQUNMLEtBQUs7R0FDTCxLQUFLO0dBQ0wsS0FBSztHQUNMLEtBQUs7R0FDTCxLQUFLO0dBQ0wsS0FBSztHQUNMLEtBQUs7R0FDTCxLQUFLO0dBQ0wsS0FBSztHQUNMLEtBQUs7R0FDTCxLQUFLO0dBQ0wsS0FBSztHQUNMLEtBQUs7RUFDUCxHQUNBLG9CQUFvQjtHQUNsQixLQUFLO0dBQ0wsU0FBUztHQUNULE1BQU07R0FDTixPQUFPO0VBQ1QsR0F1Q0EseUJBQXlCLHFCQXRDQSxPQUFPLENBQUMsR0FBRyxrQkFBa0I7R0FDcEQsS0FBSyxTQUFVLGFBQWE7SUFDMUIsSUFBSSxZQUFZLEtBQUs7S0FDbkIsSUFBSSxNQUFNLGFBQWEsWUFBWSxRQUFRLFlBQVk7S0FDdkQsSUFBSSxtQkFBbUIsS0FBSyxPQUFPO0lBQ3JDO0lBQ0EsT0FBTyxlQUFlLFlBQVksUUFDNUIsY0FBYyxpQkFBaUIsV0FBVyxHQUM1QyxPQUFPLGNBQWMsVUFBVSxPQUFPLGFBQWEsV0FBVyxLQUM5RCxjQUFjLFlBQVksUUFBUSxZQUFZLFlBQVksT0FDeEQsZUFBZSxZQUFZLFlBQVksaUJBQ3ZDO0dBQ1I7R0FDQSxNQUFNO0dBQ04sVUFBVTtHQUNWLFNBQVM7R0FDVCxVQUFVO0dBQ1YsUUFBUTtHQUNSLFNBQVM7R0FDVCxRQUFRO0dBQ1IsUUFBUTtHQUNSLGtCQUFrQjtHQUNsQixVQUFVLFNBQVUsT0FBTztJQUN6QixPQUFPLGVBQWUsTUFBTSxPQUFPLGlCQUFpQixLQUFLLElBQUk7R0FDL0Q7R0FDQSxTQUFTLFNBQVUsT0FBTztJQUN4QixPQUFPLGNBQWMsTUFBTSxRQUFRLFlBQVksTUFBTSxPQUNqRCxNQUFNLFVBQ047R0FDTjtHQUNBLE9BQU8sU0FBVSxPQUFPO0lBQ3RCLE9BQU8sZUFBZSxNQUFNLE9BQ3hCLGlCQUFpQixLQUFLLElBQ3RCLGNBQWMsTUFBTSxRQUFRLFlBQVksTUFBTSxPQUM1QyxNQUFNLFVBQ047R0FDUjtFQUNGLENBQ21FLENBQUMsR0FhcEUsd0JBQXdCLHFCQVpBLE9BQU8sQ0FBQyxHQUFHLHFCQUFxQjtHQUN0RCxXQUFXO0dBQ1gsT0FBTztHQUNQLFFBQVE7R0FDUixVQUFVO0dBQ1Ysb0JBQW9CO0dBQ3BCLE9BQU87R0FDUCxPQUFPO0dBQ1AsT0FBTztHQUNQLGFBQWE7R0FDYixXQUFXO0VBQ2IsQ0FDaUUsQ0FBQyxHQUVsRSx1QkFBdUIscUJBREEsT0FBTyxDQUFDLEdBQUcsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLENBQ0YsQ0FBQyxHQVdoRSxzQkFBc0IscUJBVkEsT0FBTyxDQUFDLEdBQUcsa0JBQWtCO0dBQ2pELFNBQVM7R0FDVCxlQUFlO0dBQ2YsZ0JBQWdCO0dBQ2hCLFFBQVE7R0FDUixTQUFTO0dBQ1QsU0FBUztHQUNULFVBQVU7R0FDVixrQkFBa0I7RUFDcEIsQ0FDNkQsQ0FBQyxHQU05RCwyQkFBMkIscUJBTEEsT0FBTyxDQUFDLEdBQUcsZ0JBQWdCO0dBQ3BELGNBQWM7R0FDZCxhQUFhO0dBQ2IsZUFBZTtFQUNqQixDQUN1RSxDQUFDLEdBcUJ4RSxzQkFBc0IscUJBcEJBLE9BQU8sQ0FBQyxHQUFHLHFCQUFxQjtHQUNwRCxRQUFRLFNBQVUsT0FBTztJQUN2QixPQUFPLFlBQVksUUFDZixNQUFNLFNBQ04saUJBQWlCLFFBQ2YsQ0FBQyxNQUFNLGNBQ1A7R0FDUjtHQUNBLFFBQVEsU0FBVSxPQUFPO0lBQ3ZCLE9BQU8sWUFBWSxRQUNmLE1BQU0sU0FDTixpQkFBaUIsUUFDZixDQUFDLE1BQU0sY0FDUCxnQkFBZ0IsUUFDZCxDQUFDLE1BQU0sYUFDUDtHQUNWO0dBQ0EsUUFBUTtHQUNSLFdBQVc7RUFDYixDQUM2RCxDQUFDLEdBTTlELHVCQUF1QixxQkFMQSxPQUFPLENBQUMsR0FBRyxnQkFBZ0I7R0FDaEQsVUFBVTtHQUNWLFVBQVU7R0FDVixRQUFRO0VBQ1YsQ0FDK0QsQ0FBQyxHQUNoRSxlQUFlO0dBQUM7R0FBRztHQUFJO0dBQUk7RUFBRSxHQUM3QixnQkFBZ0IsS0FDaEIseUJBQXlCLGFBQWEsc0JBQXNCLFFBQzVELGVBQWU7RUFDakIsYUFDRSxrQkFBa0IsYUFDakIsZUFBZSxTQUFTO0VBQzNCLElBQUksdUJBQ0EsYUFBYSxlQUFlLFVBQVUsQ0FBQyxjQUN6Qyw2QkFDRSxjQUNDLENBQUMsMEJBQ0MsZ0JBQWdCLElBQUksZ0JBQWdCLE1BQU0sZUFDL0MsZ0JBQWdCLElBQ2hCLGdCQUFnQixPQUFPLGFBQWEsYUFBYSxHQUNqRCxtQkFBbUIsQ0FBQyxHQUNwQixjQUFjLENBQUMsR0FDZixzQkFBc0I7R0FDcEIsT0FBTyxDQUFDO0dBQ1IsTUFBTSxDQUFDO0dBQ1AsVUFBVSxDQUFDO0dBQ1gsa0JBQWtCLENBQUM7R0FDbkIsT0FBTyxDQUFDO0dBQ1IsT0FBTyxDQUFDO0dBQ1IsUUFBUSxDQUFDO0dBQ1QsVUFBVSxDQUFDO0dBQ1gsT0FBTyxDQUFDO0dBQ1IsUUFBUSxDQUFDO0dBQ1QsS0FBSyxDQUFDO0dBQ04sTUFBTSxDQUFDO0dBQ1AsTUFBTSxDQUFDO0dBQ1AsS0FBSyxDQUFDO0dBQ04sTUFBTSxDQUFDO0VBQ1QsR0FDQSxrQkFBa0IsTUFDbEIsc0JBQXNCLE1BQ3RCLHdCQUF3QixDQUFDO0VBQzNCLGNBQ0csd0JBQ0MsaUJBQWlCLE9BQU8sTUFDdkIsQ0FBQyxTQUFTLGdCQUFnQixJQUFJLFNBQVM7RUFDNUMsSUFBSSxXQUFXLGVBQWUsT0FBTyxPQUFPLEtBQUssT0FBTyxLQUFLLElBQzNELDJCQUNFLGFBQWEsa0JBQWtCLFlBQVksTUFBTSxTQUFTLGNBQzVELGdCQUFnQixNQUNoQixvQkFBb0IsTUFDcEIsZ0JBQWdCLE1BQ2hCLFlBQVksQ0FBQyxHQUNiLGlCQUFpQjtHQUNmLGNBQWMsY0FBYyxhQUFhLGNBQWM7R0FDdkQsb0JBQW9CLGNBQWMsYUFBYSxvQkFBb0I7R0FDbkUsZ0JBQWdCLGNBQWMsYUFBYSxnQkFBZ0I7R0FDM0QsZUFBZSxjQUFjLGNBQWMsZUFBZTtHQUMxRCxpQkFBaUIsY0FBYyxjQUFjLGlCQUFpQjtHQUM5RCxrQkFBa0IsY0FBYyxjQUFjLGtCQUFrQjtHQUNoRSxlQUFlLGNBQWMsY0FBYyxlQUFlO0VBQzVELEdBQ0EscUJBQXFCLENBQUMsR0FDdEIsUUFBUSxDQUFDO0VBQ1gsY0FDSSxRQUFRLFNBQVMsY0FBYyxLQUFLLENBQUMsQ0FBQyxPQUN4QyxvQkFBb0IsV0FDakIsT0FBTyxlQUFlLGFBQWEsV0FDcEMsT0FBTyxlQUFlLG1CQUFtQixXQUN6QyxPQUFPLGVBQWUsZUFBZSxZQUN2QyxxQkFBcUIsVUFDbkIsT0FBTyxlQUFlLGNBQWM7RUFDeEMsSUFBSSxnQkFBZ0IsMkJBQTJCLGNBQWMsR0FDM0Qsc0JBQXNCLDJCQUEyQixvQkFBb0IsR0FDckUsa0JBQWtCLDJCQUEyQixnQkFBZ0IsR0FDN0QsaUJBQWlCLDJCQUEyQixlQUFlLEdBQzNELG1CQUFtQiwyQkFBMkIsaUJBQWlCLEdBQy9ELG9CQUFvQiwyQkFBMkIsa0JBQWtCLEdBQ2pFLGlCQUFpQiwyQkFBMkIsZUFBZSxHQUMzRCw2Q0FBNkIsSUFBSSxJQUFJLEdBQ3JDLDBCQUNFLG9wQkFBb3BCLE1BQ2xwQixHQUNGO0VBQ0osd0JBQXdCLEtBQUssV0FBVztFQUN4QyxJQUFJLDBCQUEwQixHQUM1QixnQkFBZ0I7RUFDbEIsSUFDRSxhQUFhLE9BQU8sZUFDcEIsZUFBZSxPQUFPLFlBQVksS0FDbEM7R0FDQSxJQUFJLG1CQUFtQjtHQUN2QixJQUFJLGl
15852CQUFpQixXQUFZO0lBQy9CLE9BQU8saUJBQWlCLElBQUk7R0FDOUI7RUFDRixPQUFPO0dBQ0wsSUFBSSxZQUFZO0dBQ2hCLGlCQUFpQixXQUFZO0lBQzNCLE9BQU8sVUFBVSxJQUFJO0dBQ3ZCO0VBQ0Y7RUFDQSxJQUFJLG9CQUNBLGVBQWUsT0FBTyxjQUNsQixjQUNBLFNBQVUsT0FBTztHQUNmLElBQ0UsYUFBYSxPQUFPLFVBQ3BCLGVBQWUsT0FBTyxPQUFPLFlBQzdCO0lBQ0EsSUFBSSxRQUFRLElBQUksT0FBTyxXQUFXLFNBQVM7S0FDekMsU0FBUyxDQUFDO0tBQ1YsWUFBWSxDQUFDO0tBQ2IsU0FDRSxhQUFhLE9BQU8sU0FDcEIsU0FBUyxTQUNULGFBQWEsT0FBTyxNQUFNLFVBQ3RCLE9BQU8sTUFBTSxPQUFPLElBQ3BCLE9BQU8sS0FBSztLQUNYO0lBQ1QsQ0FBQztJQUNELElBQUksQ0FBQyxPQUFPLGNBQWMsS0FBSyxHQUFHO0dBQ3BDLE9BQU8sSUFDTCxhQUFhLE9BQU8sV0FDcEIsZUFBZSxPQUFPLFFBQVEsTUFDOUI7SUFDQSxRQUFRLEtBQUsscUJBQXFCLEtBQUs7SUFDdkM7R0FDRjtHQUNBLFFBQVEsTUFBTSxLQUFLO0VBQ3JCLEdBQ04scUJBQ0UsMEpBQ0YsY0FBYyxHQUNkLGdCQUFnQixHQUNoQixrQkFBa0IsR0FDbEIsZ0JBQWdCLEdBQ2hCLHFCQUFxQixLQUNyQixVQUFVLFNBQ1YsUUFBUSxTQUNSLFlBQVksU0FDWixxQkFDRSxnQkFBZ0IsT0FBTyxXQUN2QixlQUFlLE9BQU8sUUFBUSxhQUM5QixnQkFBZ0IsT0FBTyxlQUN2QixlQUFlLE9BQU8sWUFBWSxTQUNwQyxtQkFBbUIsZ0JBQ25CLG9CQUFvQixlQUNwQixlQUFlLFlBQ2YsK0JBQStCLENBQUMsR0FDaEMsa0NBQWtDO0dBQ2hDLE9BQU87R0FDUCxZQUFZO0dBQ1osYUFBYTtHQUNiLE9BQU87RUFDVCxHQUNBLDJCQUEyQjtHQUN6QixPQUFPO0dBQ1AsS0FBSztHQUNMLFFBQVEsRUFBRSxVQUFVLGdDQUFnQztFQUN0RCxHQUNBLDRCQUE0QixDQUFDLGlCQUFpQixFQUFFLEdBQ2hELHdCQUNFLGlIQUNGLGdDQUFnQyxDQUFDLGlCQUFpQixxQkFBcUIsR0FDdkUsbUJBQW1CLEdBQ25CLG1DQUFtQyxHQUNuQyxtQkFBbUIsQ0FBQyxHQUNwQix3QkFBd0IsR0FDeEIsMkJBQTJCLEdBQzNCLHFCQUFxQixDQUFDO0VBQ3hCLE9BQU8sT0FBTyxrQkFBa0I7RUFDaEMsSUFBSSxnQkFBZ0IsTUFDbEIsbUJBQW1CLE1BQ25CLFNBQVMsR0FDVCxpQkFBaUIsR0FDakIsY0FBYyxHQUNkLG1CQUFtQixHQUNuQixvQkFBb0IsSUFDcEIsc0JBQXNCO0VBQ3hCLElBQUksb0JBQW9CLENBQUM7RUFDekIsSUFBSTtHQUN3QixPQUFPLGtCQUFrQixDQUFDLENBQUM7RUFHdkQsU0FBUyxLQUFLO0dBQ1osb0JBQW9CLENBQUM7RUFDdkI7RUFDQSxJQUFJLGlDQUFpQixJQUFJLFFBQVEsR0FDL0IsWUFBWSxDQUFDLEdBQ2IsaUJBQWlCLEdBQ2pCLG1CQUFtQixNQUNuQixnQkFBZ0IsR0FDaEIsVUFBVSxDQUFDLEdBQ1gsZUFBZSxHQUNmLHNCQUFzQixNQUN0QixnQkFBZ0IsR0FDaEIsc0JBQXNCLElBQ3RCLHVCQUF1QixNQUN2Qix5QkFBeUIsTUFDekIsY0FBYyxDQUFDLEdBQ2YsdUJBQXVCLENBQUMsR0FDeEIsdUJBQXVCLE1BQ3ZCLGtCQUFrQixNQUNsQix5QkFBeUIsQ0FBQyxHQUMxQiw2QkFBNkIsTUFDM0IsZ0pBQ0YsR0FDQSxjQUFjLGFBQWEsSUFBSTtFQUNqQyxJQUFJLG9CQUFvQixhQUFhLElBQUk7RUFDekMsSUFBSSxnQkFBZ0IsQ0FBQztFQUNyQixJQUFJLDRCQUE0QixNQUM5Qix3QkFBd0IsTUFDeEIsK0JBQStCLENBQUMsR0FDaEMsdUJBQ0UsZ0JBQWdCLE9BQU8sa0JBQ25CLGtCQUNBLFdBQVk7R0FDVixJQUFJLFlBQVksQ0FBQyxHQUNmLFNBQVUsS0FBSyxTQUFTO0lBQ3RCLFNBQVMsQ0FBQztJQUNWLGtCQU
15852FrQixTQUFVLE1BQU0sVUFBVTtLQUMxQyxVQUFVLEtBQUssUUFBUTtJQUN6QjtHQUNGO0dBQ0YsS0FBSyxRQUFRLFdBQVk7SUFDdkIsT0FBTyxVQUFVLENBQUM7SUFDbEIsVUFBVSxRQUFRLFNBQVUsVUFBVTtLQUNwQyxPQUFPLFNBQVM7SUFDbEIsQ0FBQztHQUNIO0VBQ0YsR0FDTixxQkFBcUIsVUFBVSwyQkFDL0IsaUJBQWlCLFVBQVUseUJBQzNCLGVBQWU7R0FDYixVQUFVO0dBQ1YsVUFBVTtHQUNWLFVBQVU7R0FDVixlQUFlO0dBQ2YsZ0JBQWdCO0dBQ2hCLGNBQWM7R0FDZCxrQkFBa0I7R0FDbEIsbUJBQW1CO0VBQ3JCLEdBQ0EsMkJBQTJCLE1BQzNCLE1BQU0sVUFBVSxjQUNoQixhQUFhLFFBQVEsYUFDakIsUUFBUSxhQUNSLFdBQVk7R0FDVixPQUFPO0VBQ1QsR0FDSixpQkFBaUIsR0FDakIsZ0JBQWdCLEdBQ2hCLGtCQUFrQixJQUNsQixrQkFBa0IsSUFDbEIsZ0JBQWdCLElBQ2hCLGVBQWUsTUFDZixvQkFBb0IsTUFDcEIseUJBQXlCLElBQ3pCLDBCQUEwQixJQUMxQiwyQkFBMkIsTUFDM0IseUJBQXlCLE1BQ3pCLHdCQUF3QixNQUN4QiwrQkFBK0IsQ0FBQyxHQUNoQyxvQkFBb0IsSUFDcEIscUJBQXFCLE1BQ3JCLHFCQUFxQixNQUNyQixxQkFBcUIsR0FDckIsMkJBQTJCLE1BQzNCLDhCQUE4QixNQUM5QixvQkFBb0IsTUFDcEIsb0JBQW9CLE1BQ3BCLDBCQUEwQixNQUMxQix3QkFBd0IsTUFDeEIsc0JBQXNCLElBQ3RCLHNCQUFzQixNQUN0Qix1QkFBdUIsTUFDdkIsdUJBQXVCLEdBQ3ZCLHVCQUF1QixNQUN2Qiw2QkFBNkIsTUFDN0IsZ0NBQWdDLE1BQ2hDLHNCQUFzQixNQUN0QixzQkFBc0IsTUFDdEIsNEJBQTRCLE1BQzVCLDBCQUEwQixNQUMxQixpQkFBaUIsSUFDakIsZ0JBQWdCLElBQ2hCLGlCQUFpQixHQUNqQixnQkFBZ0IsTUFDaEIsY0FBYyxHQUNkLGlCQUFpQixNQUNqQix3QkFBd0IsQ0FBQyxHQUN6Qix3QkFBd0IsQ0FBQyxHQUN6Qiw0QkFBNEIsTUFDNUIsK0JBQStCLEdBQy9CLHVCQUF1QixHQUN2QixpQ0FBaUMsTUFDakMsOEJBQThCLHFCQUFxQjtFQUNyRCxxQkFBcUIsSUFBSSxTQUFVLFlBQVksYUFBYTtHQUMxRCxpQ0FBaUMsTUFBTTtHQUN2QyxJQUNFLGFBQWEsT0FBTyxlQUNwQixTQUFTLGVBQ1QsZUFBZSxPQUFPLFlBQVksTUFDbEM7SUFDQSxJQUFJLElBQUksdUJBQXVCLElBQUksc0JBQXNCO0tBQ3ZELHNCQUFzQixJQUFJO0tBQzFCLElBQUksZUFBZSxzQkFBc0IsR0FDdkMsZUFBZSxpQkFBaUI7S0FDbEMsSUFDRSxpQkFBaUIsNkJBQ2pCLGlCQUFpQixxQkFFakIsNEJBQTRCO0tBQzlCLHNCQUFzQjtLQUN0QixzQkFBc0I7SUFDeEI7SUFDQSxvQkFBb0IsWUFBWSxXQUFXO0dBQzdDO0dBQ0EsSUFBSSxTQUFTLDBCQUNYLEtBQUssZUFBZSxvQkFBb0IsU0FBUyxlQUMvQyxxQkFBcUIsY0FBYyx3QkFBd0IsR0FDeEQsZUFBZSxhQUFhO0dBQ25DLGVBQWUsV0FBVztHQUMxQixJQUFJLFNBQVMsY0FBYztJQUN6QixLQUFLLGVBQWUsb0JBQW9CLFNBQVMsZUFDL0MscUJBQXFCLGNBQWMsWUFBWSxHQUM1QyxlQUFlLGFBQWE7SUFDakMsSUFBSSxNQUFNLHNCQUFzQjtLQUM5QixlQUFlO0tBQ2YsU0FBUyxpQkFDTixlQUFlLDJCQUEyQixDQUFDO0tBQzlDLEtBQUssSUFBSSxJQUFJLEdBQUcsSUFBSSxhQUFhLFFBQVEsS0FBSztNQUM1QyxJQUFJLGlCQUFpQixhQUFhO01BQ2xDLE9BQU8sYUFBYSxRQUFRLGNBQWMsS0FDeEMsYUFBYSxLQUFLLGNBQWM7S0FDcEM7SUFDRjtHQUNGO0dBQ0EsU0FBUywrQkFDUCw0QkFBNEIsWUFBWSxXQUFXO0VBQ3ZEO0VBQ0EsSUFBSSxlQUFlLGFBQWEsSUFBSSxHQUNsQywwQkFBMEI7R0FDeEIsK0JBQStCLFdBQVksQ0FBQztHQUM1QyxxQ0FBcUMsV0FBWSxDQUFDO0dBQ2xELDRCQUE0QixXQUFZLENBQUM7R0FDekMsMkJBQTJCLFdBQVksQ0FBQztHQUN4Qyx3QkFBd0IsV0FBWSxDQUFDO0VBQ3ZDLEdBQ0Esb0NBQW9DLENBQUMsR0FDckMsMkNBQTJDLENBQUMsR0FDNUMsMkNBQTJDLENBQUMsR0FDNUMsa0RBQWtELENBQUMsR0FDbkQscUNBQXFDLENBQUMsR0FDdEMsNENBQTRDLENBQUMsR0FDN0MsK0NBQStCLElBQUksSUFBSTtFQUN6Qyx3QkFBd0IsZ0NBQWdDLFNBQ3RELE9BQ0EsVUFDQTtHQUNBLDZCQUE2QixJQUFJLE1BQU0sSUFBSSxNQUN4QyxlQUFlLE9BQU8sU0FBUyxzQkFDOUIsQ0FBQyxNQUFNLFNBQVMsbUJBQW1CLGdDQUNuQyxrQ0FBa0MsS0FBSyxLQUFLLEdBQzlDLE1BQU0sT0FBTyxvQkFDWCxlQUFlLE9BQU8sU0FBUyw2QkFDL0IseUNBQXlDLEtBQUssS0FBSyxHQUNyRCxlQUFlLE9BQU8sU0FBUyw2QkFDN0IsQ0FBQyxNQUNDLFNBQVMsMEJBQTBCLGdDQUNyQyx5Q0FBeUMsS0FBSyxLQUFLLEdBQ3JELE1BQU0sT0FBTyxvQkFDWCxlQUFlLE9BQU8sU0FBUyxvQ0FDL0IsZ0RBQWdELEtBQUssS0FBSyxHQUM1RCxlQUFlLE9BQU8sU0FBUyx1QkFDN0IsQ0FBQyxNQUFNLFNBQVMsb0JBQW9CLGdDQUNwQyxtQ0FBbUMsS0FBSyxLQUFLLEdBQy9DLE1BQU0sT0FBTyxvQkFDWCxlQUFlLE9BQU8sU0FBUyw4QkFDL0IsMENBQTBDLEtBQUssS0FBSztFQUMxRDtFQUNBLHdCQUF3QixzQ0FBc0MsV0FBWTtHQUN4RSxJQUFJLGdEQUFnQyxJQUFJLElBQUk7R0FDNUMsSUFBSSxrQ0FBa0MsV0FDbkMsa0NBQWtDLFFBQVEsU0FBVSxPQUFPO0lBQzFELDhCQUE4QixJQUM1QiwwQkFBMEIsS0FBSyxLQUFLLFdBQ3RDO0lBQ0EsNkJBQTZCLElBQUksTUFBTSxJQUFJO0dBQzdDLENBQUMsR0FDQSxvQ0FBb0MsQ0FBQztHQUN4QyxJQUFJLHVEQUF1QyxJQUFJLElBQUk7R0FDbkQsSUFBSSx5Q0FBeUMsV0FDMUMseUNBQXlDLFFBQVEsU0FBVSxPQUFPO0lBQ2pFLHFDQUFxQyxJQUNuQywwQkFBMEIsS0FBSyxLQUFLLFdBQ3RDO0lBQ0EsNkJBQTZCLElBQUksTUFBTSxJQUFJO0dBQzdDLENBQUMsR0FDQSwyQ0FBMkMsQ0FBQztHQUMvQyxJQUFJLHVEQUF1QyxJQUFJLElBQUk7R0FDbkQsSUFBSSx5Q0FBeUMsV0FDMUMseUNBQXlDLFFBQVEsU0FBVSxPQUFPO0lBQ2pFLHFDQUFxQyxJQUNuQywwQkFBMEIsS0FBSyxLQUFLLFdBQ3RDO0lBQ0EsNkJBQTZCLElBQUksTUFBTSxJQUFJO0dBQzdDLENBQUMsR0FDQSwyQ0FBMkMsQ0FBQztHQUMvQyxJQUFJLDhEQUE4QyxJQUFJLElBQUk7R0FDMUQsSUFBSSxnREFBZ0QsV0FDakQsZ0RBQWdELFFBQy9DLFNBQVUsT0FBTztJQUNmLDRDQUE0QyxJQUMxQywwQkFBMEIsS0FBSyxLQUFLLFdBQ3RDO0lBQ0EsNkJBQTZCLElBQUksTUFBTSxJQUFJO0dBQzdDLENBQ0YsR0FDQyxrREFBa0QsQ0FBQztHQUN0RCxJQUFJLGlEQUFpQyxJQUFJLElBQUk7R0FDN0MsSUFBSSxtQ0FBbUMsV0FDcEMsbUNBQW1DLFFBQVEsU0FBVSxPQUFPO0lBQzNELCtCQUErQixJQUM3QiwwQkFBMEIsS0FBSyxLQUFLLFdBQ3RDO0lBQ0EsNkJBQTZCLElBQUksTUFBTSxJQUFJO0dBQzdDLENBQUMsR0FDQSxxQ0FBcUMsQ0FBQztHQUN6QyxJQUFJLHdEQUF3QyxJQUFJLElBQUk7R0FDcEQsSUFBSSwwQ0FBMEMsV0FDM0MsMENBQTBDLFFBQVEsU0FBVSxPQUFPO0lBQ2xFLHNDQU
15852FzQyxJQUNwQywwQkFBMEIsS0FBSyxLQUFLLFdBQ3RDO0lBQ0EsNkJBQTZCLElBQUksTUFBTSxJQUFJO0dBQzdDLENBQUMsR0FDQSw0Q0FBNEMsQ0FBQztHQUNoRCxJQUFJLElBQUkscUNBQXFDLE1BQU07SUFDakQsSUFBSSxjQUFjLGtCQUNoQixvQ0FDRjtJQUNBLFFBQVEsTUFDTiw0VEFDQSxXQUNGO0dBQ0Y7R0FDQSxJQUFJLDRDQUE0QyxTQUM1QyxjQUFjLGtCQUNkLDJDQUNGLEdBQ0EsUUFBUSxNQUNOLDZlQUNBLFdBQ0Y7R0FDRixJQUFJLHNDQUFzQyxTQUN0QyxjQUFjLGtCQUNkLHFDQUNGLEdBQ0EsUUFBUSxNQUNOLGdTQUNBLFdBQ0Y7R0FDRixJQUFJLDhCQUE4QixTQUM5QixjQUFjLGtCQUFrQiw2QkFBNkIsR0FDL0QsUUFBUSxLQUNOLGtrQkFDQSxXQUNGO0dBQ0YsSUFBSSxxQ0FBcUMsU0FDckMsY0FBYyxrQkFDZCxvQ0FDRixHQUNBLFFBQVEsS0FDTixpd0JBQ0EsV0FDRjtHQUNGLElBQUksK0JBQStCLFNBQy9CLGNBQWMsa0JBQWtCLDhCQUE4QixHQUNoRSxRQUFRLEtBQ04sd2lCQUNBLFdBQ0Y7RUFDSjtFQUNBLElBQUksOENBQThCLElBQUksSUFBSSxHQUN4Qyw0Q0FBNEIsSUFBSSxJQUFJO0VBQ3RDLHdCQUF3Qiw2QkFBNkIsU0FDbkQsT0FDQSxVQUNBO0dBQ0EsSUFBSSxhQUFhO0dBQ2pCLEtBQUssSUFBSSxPQUFPLE9BQU8sU0FBUyxPQUM5QixLQUFLLE9BQU8scUJBQXFCLGFBQWEsT0FDM0MsT0FBTyxLQUFLO0dBQ2pCLFNBQVMsYUFDTCxRQUFRLE1BQ04scUlBQ0YsSUFDQSxDQUFDLDBCQUEwQixJQUFJLE1BQU0sSUFBSSxNQUN2QyxPQUFPLDRCQUE0QixJQUFJLFVBQVUsR0FDbkQsUUFBUSxNQUFNLEtBQUssZ0JBQ2pCLFFBQVEsTUFBTSxLQUFLLHFCQUNsQixTQUFTLFlBQ1IsZUFBZSxPQUFPLFNBQVMscUJBQ2xDLEtBQUssTUFBTSxTQUNSLE9BQU8sQ0FBQyxHQUFJLDRCQUE0QixJQUFJLFlBQVksSUFBSSxJQUNoRSxLQUFLLEtBQUssS0FBSztFQUNyQjtFQUNBLHdCQUF3Qiw0QkFBNEIsV0FBWTtHQUM5RCw0QkFBNEIsUUFBUSxTQUFVLFlBQVk7SUFDeEQsSUFBSSxNQUFNLFdBQVcsUUFBUTtLQUMzQixJQUFJLGFBQWEsV0FBVyxJQUMxQiw4QkFBYyxJQUFJLElBQUk7S0FDeEIsV0FBVyxRQUFRLFNBQVUsT0FBTztNQUNsQyxZQUFZLElBQUksMEJBQTBCLEtBQUssS0FBSyxXQUFXO01BQy9ELDBCQUEwQixJQUFJLE1BQU0sSUFBSTtLQUMxQyxDQUFDO0tBQ0QsSUFBSSxjQUFjLGtCQUFrQixXQUFXO0tBQy9DLGtCQUFrQixZQUFZLFdBQVk7TUFDeEMsUUFBUSxNQUNOLGtUQUNBLFdBQ0Y7S0FDRixDQUFDO0lBQ0g7R0FDRixDQUFDO0VBQ0g7RUFDQSx3QkFBd0IseUJBQXlCLFdBQVk7R0FDM0Qsb0NBQW9DLENBQUM7R0FDckMsMkNBQTJDLENBQUM7R0FDNUMsMkNBQTJDLENBQUM7R0FDNUMsa0RBQWtELENBQUM7R0FDbkQscUNBQXFDLENBQUM7R0FDdEMsNENBQTRDLENBQUM7R0FDN0MsOENBQThCLElBQUksSUFBSTtFQUN4QztFQUNBLElBQUksMkJBQTJCLElBQzdCLGdCQUFnQixFQUNkLDBCQUEwQixTQUFVLFdBQVcsT0FBTyxXQUFXO0dBQy9ELElBQUksZUFBZTtHQUNuQixjQUFjLENBQUM7R0FDZixJQUFJO0lBQ0YsT0FBTyxVQUFVLE9BQU8sU0FBUztHQUNuQyxVQUFVO0lBQ1IsY0FBYztHQUNoQjtFQUNGLEVBQ0YsR0FDQSxxQkFDRSxjQUFjLHlCQUF5QixLQUFLLGFBQWEsR0FDM0QsYUFBYSxFQUNYLDBCQUEwQixTQUFVLFVBQVU7R0FDNUMsSUFBSSxlQUFlO0dBQ25CLGNBQWMsQ0FBQztHQUNmLElBQUk7SUFDRixPQUFPLFNBQVMsT0FBTztHQUN6QixVQUFVO0lBQ1IsY0FBYztHQUNoQjtFQUNGLEVBQ0YsR0FDQSxrQkFBa0IsV0FBVyx5QkFBeUIsS0FBSyxVQUFVLEdBQ3JFLHdCQUF3QixFQUN0QiwwQkFBMEIsU0FBVSxjQUFjLFVBQVU7R0FDMUQsSUFBSTtJQUNGLFNBQVMsa0JBQWtCO0dBQzdCLFNBQVMsT0FBTztJQUNkLHdCQUF3QixjQUFjLGFBQWEsUUFBUSxLQUFLO0dBQ2xFO0VBQ0YsRUFDRixHQUNBLDZCQUNFLHNCQUFzQix5QkFBeUIsS0FDN0MscUJBQ0YsR0FDRix5QkFBeUIsRUFDdkIsMEJBQTBCLFNBQ3hCLGNBQ0EsVUFDQSxXQUNBLFdBQ0EsVUFDQTtHQUNBLElBQUk7SUFDRixTQUFTLG1CQUFtQixXQUFXLFdBQVcsUUFBUTtHQUM1RCxTQUFTLE9BQU87SUFDZCx3QkFBd0IsY0FBYyxhQUFhLFFBQVEsS0FBSztHQUNsRTtFQUNGLEVBQ0YsR0FDQSw4QkFDRSx1QkFBdUIseUJBQXlCLEtBQzlDLHNCQUNGLEdBQ0Ysd0JBQXdCLEVBQ3RCLDBCQUEwQixTQUFVLFVBQVUsV0FBVztHQUN2RCxJQUFJLFFBQVEsVUFBVTtHQUN0QixTQUFTLGtCQUFrQixVQUFVLE9BQU8sRUFDMUMsZ0JBQWdCLFNBQVMsUUFBUSxRQUFRLEdBQzNDLENBQUM7RUFDSCxFQUNGLEdBQ0EsNkJBQ0Usc0JBQXNCLHlCQUF5QixLQUM3QyxxQkFDRixHQUNGLDJCQUEyQixFQUN6QiwwQkFBMEIsU0FDeEIsU0FDQSx3QkFDQSxVQUNBO0dBQ0EsSUFBSTtJQUNGLFNBQVMscUJBQXFCO0dBQ2hDLFNBQVMsT0FBTztJQUNkLHdCQUF3QixTQUFTLHdCQUF3QixLQUFLO0dBQ2hFO0VBQ0YsRUFDRixHQUNBLGdDQUNFLHlCQUF5Qix5QkFBeUIsS0FDaEQsd0JBQ0YsR0FDRixhQUFhLEVBQ1gsMEJBQTBCLFNBQVUsUUFBUTtHQUMxQyxJQUFJLFNBQVMsT0FBTztHQUNwQixTQUFTLE9BQU87R0FDaEIsU0FBUyxPQUFPO0dBQ2hCLE9BQVEsT0FBTyxVQUFVO0VBQzNCLEVBQ0YsR0FDQSxrQkFBa0IsV0FBVyx5QkFBeUIsS0FBSyxVQUFVLEdBQ3JFLGNBQWMsRUFDWiwwQkFBMEIsU0FDeEIsU0FDQSx3QkFDQSxTQUNBO0dBQ0EsSUFBSTtJQUNGLFFBQVE7R0FDVixTQUFTLE9BQU87SUFDZCx3QkFBd0IsU0FBUyx3QkFBd0IsS0FBSztHQUNoRTtFQUNGLEVBQ0YsR0FDQSxtQkFBbUIsWUFBWSx5QkFBeUIsS0FBSyxXQUFXLEdBQ3hFLGVBQWUsRUFDYiwwQkFBMEIsU0FBVSxNQUFNO0dBQ3hDLElBQUksT0FBTyxLQUFLO0dBQ2hCLE9BQU8sS0FBSyxLQUFLLFFBQVE7RUFDM0IsRUFDRixHQUNBLG9CQUNFLGFBQWEseUJBQXlCLEtBQUssWUFBWSxHQUN6RCxvQkFBb0IsTUFDbEIsZ2FBQ0YsR0FDQSwyQkFBMkIsTUFDekIsc0lBQ0YsR0FDQSwwQkFBMEIsTUFDeEIsa1hBQ0YsR0FDQSw4QkFBOEIsRUFDNUIsTUFBTSxXQUFZO0dBQ2hCLFFBQVEsTUFDTixrSUFDRjtFQUNGLEVBQ0YsR0FDQSxxQkFBcUIsTUFDckIscUJBQXFCLE1BQ3JCLHFCQUFxQixDQUFDLEdBQ3RCLG9CQUFvQixNQUNwQixtQ0FBbUMsQ0FBQyxHQUNwQyxrQkFBa0IsTUFDbEIseUJBQXlCLEdBQ3pCLG1CQUFtQixNQUNuQjtFQUNGLElBQUkseUJBQTBCLG1CQUFtQixDQUFDO0VBQ2xELElBQUksd0JBQXdCLENBQUM7RUFDN0IsSUFBSSw4QkFBOEIsQ0FBQztFQUNuQyxJQUFJLDRCQUE0QixDQUFDO0VBQ2pDLG9CQUFvQixTQUFVLGFBQWEsZ0JBQWdCLE9BQU87R0FD
15852aEUsSUFDRSxTQUFTLFNBQ1QsYUFBYSxPQUFPLFNBQ3BCLE1BQU0sV0FDSixDQUFDLE1BQU0sT0FBTyxhQUFhLFFBQVEsTUFBTSxPQUN6QyxNQUFNLE1BQU0sT0FBTyxZQUNyQjtJQUNBLElBQUksYUFBYSxPQUFPLE1BQU0sUUFDNUIsTUFBTSxNQUNKLGlJQUNGO0lBQ0YsTUFBTSxPQUFPLFlBQVk7SUFDekIsSUFBSSxnQkFBZ0IsMEJBQTBCLFdBQVcsR0FDdkQsZUFBZSxpQkFBaUI7SUFDbEMsSUFBSSxDQUFDLHNCQUFzQixlQUFlO0tBQ3hDLHNCQUFzQixnQkFBZ0IsQ0FBQztLQUN2QyxRQUFRLE1BQU07S0FDZCxjQUFjLFlBQVk7S0FDMUIsSUFBSSw0QkFBNEI7S0FDaEMsZUFDRSxhQUFhLE9BQU8sWUFBWSxRQUMvQixlQUFlLDBCQUEwQixXQUFXLE9BQ3BELDRCQUNDLHFDQUFxQyxlQUFlO0tBQ3hELDZCQUNHLGtCQUNFLDRCQUNDLGdEQUNBLGdCQUNBO0tBQ04sSUFBSSxxQkFBcUI7S0FDekIsUUFBUSxTQUNOLGdCQUFnQixVQUNkLGdCQUFnQixNQUNsQixhQUFhLE9BQU8sTUFBTSxNQUNyQixnQkFBZ0IsMEJBQTBCLEtBQUssSUFDaEQsYUFBYSxPQUFPLE1BQU0sU0FBUyxnQkFBZ0IsTUFBTSxPQUM3RCxrQkFDRyxxQkFDQyxpQ0FBaUMsZ0JBQWdCO0tBQ3ZELGtCQUFrQixnQkFBZ0IsV0FBWTtNQUM1QyxRQUFRLE1BQ04sNkhBQ0EsMkJBQ0Esa0JBQ0Y7S0FDRixDQUFDO0lBQ0g7R0FDRjtFQUNGO0VBQ0EsSUFBSSx1QkFBdUIsc0JBQXNCLENBQUMsQ0FBQyxHQUNqRCxtQkFBbUIsc0JBQXNCLENBQUMsQ0FBQyxHQUMzQyxjQUFjLEdBQ2QsZUFBZSxHQUNmLGNBQWMsR0FDZCxnQkFBZ0IsR0FDaEIsaUJBQWlCLENBQUM7RUFDcEIsSUFBSSw0QkFBNEIsQ0FBQztFQUNqQyxJQUFJLDJCQUEyQjtFQUMvQixJQUFJLGtDQUFrQyxDQUFDLEdBQ3JDLCtCQUErQixhQUFhLElBQUksR0FDaEQsaUNBQWlDLGFBQWEsQ0FBQyxHQUMvQyw2QkFBNkIsYUFBYSxJQUFJLEdBQzlDLGdCQUFnQixNQUNoQiw2QkFBNkIsR0FDN0Isd0JBQXdCLEdBQ3hCLHNCQUFzQixhQUFhLENBQUMsR0FDcEMsVUFBVSxHQUNWLFlBQVksR0FDWixZQUFZLEd
15852BQ1osU0FBUyxHQUNULFVBQVUsR0FDVjtFQUNGLElBQUksMERBQTBDLElBQUksSUFBSTtFQUN0RCxJQUFJLG1EQUFtQyxJQUFJLElBQUk7RUFDL0MsSUFBSSxtREFBbUMsSUFBSSxJQUFJO0VBQy9DLElBQUksMkNBQTJCLElBQUksSUFBSTtFQUN2QyxJQUFJLGNBQWMsR0FDaEIsMEJBQTBCLE1BQzFCLGNBQWMsTUFDZCxxQkFBcUIsTUFDckIsK0JBQStCLENBQUMsR0FDaEMsNkNBQTZDLENBQUMsR0FDOUMsc0NBQXNDLENBQUMsR0FDdkMsaUJBQWlCLEdBQ2pCLHVCQUF1QixHQUN2QixnQkFBZ0IsTUFDaEIsd0JBQXdCLEdBQ3hCLGtCQUFrQixJQUNsQix1QkFBdUIsTUFDdkIsZUFBZSxNQUNmLDBCQUEwQixJQUMxQiw2QkFBNkIsQ0FBQyxHQUM5Qix3QkFBd0I7R0FDVDtHQUNSO0dBQ0wsYUFBYTtHQUNiLFlBQVk7R0FDWixXQUFXO0dBQ1gscUJBQXFCO0dBQ3JCLGlCQUFpQjtHQUNqQixvQkFBb0I7R0FDcEIsU0FBUztHQUNULFlBQVk7R0FDWixRQUFRO0dBQ1IsVUFBVTtHQUNWLGVBQWU7R0FDZixrQkFBa0I7R0FDbEIsZUFBZTtHQUNmLHNCQUFzQjtHQUN0QixPQUFPO0dBQ1AseUJBQXlCO0dBQ3pCLGNBQWM7R0FDZCxnQkFBZ0I7R0FDaEIsZUFBZTtHQUNmLGNBQWM7R0FDZCxpQkFBaUI7R0FDakIsZ0JBQWdCO0VBQ2xCLEdBQ0EsOEJBQThCLE1BQzlCLDJDQUEyQyxNQUMzQywrQkFBK0IsTUFDL0IsaUNBQWlDLE1BQ2pDLDJDQUEyQyxNQUMzQyw0Q0FBNEMsTUFDNUMsOENBQThDO0VBQ2hELDhCQUE4QjtHQUM1QixhQUFhLFNBQVUsU0FBUztJQUM5QixPQUFPLFlBQVksT0FBTztHQUM1QjtHQUNLO0dBQ0wsYUFBYSxTQUFVLFVBQVUsTUFBTTtJQUNyQyx1QkFBdUI7SUFDdkIsa0JBQWtCO0lBQ2xCLHFCQUFxQixJQUFJO0lBQ3pCLE9BQU8sY0FBYyxVQUFVLElBQUk7R0FDckM7R0FDQSxZQUFZLFNBQVUsU0FBUztJQUM3Qix1QkFBdUI7SUFDdkIsa0JBQWtCO0lBQ2xCLE9BQU8sWUFBWSxPQUFPO0dBQzVCO0dBQ0EsV0FBVyxTQUFVLFFBQVEsTUFBTTtJQUNqQyx1QkFBdUI7SUFDdkIsa0JBQWtCO0lBQ2xCLHFCQUFxQixJQUFJO0lBQ3pCLE9BQU8sWUFBWSxRQUFRLElBQUk7R0FDakM7R0FDQSxxQkFBcUIsU0FBVSxLQUFLLFFBQVEsTUFBTTtJQUNoRCx1QkFBdUI7SUFDdkIsa0JBQWtCO0lBQ2xCLHFCQUFxQixJQUFJO0lBQ3pCLE9BQU8sc0JBQXNCLEtBQUssUUFBUSxJQUFJO0dBQ2hEO0dBQ0Esb0JBQW9CLFNBQVUsUUFBUSxNQUFNO0lBQzFDLHVCQUF1QjtJQUN2QixrQkFBa0I7SUFDbEIscUJBQXFCLElBQUk7SUFDekIsZ0JBQWdCLEdBQUcsV0FBVyxRQUFRLElBQUk7R0FDNUM7R0FDQSxpQkFBaUIsU0FBVSxRQUFRLE1BQU07SUFDdkMsdUJBQXVCO0lBQ3ZCLGtCQUFrQjtJQUNsQixxQkFBcUIsSUFBSTtJQUN6QixPQUFPLGtCQUFrQixRQUFRLElBQUk7R0FDdkM7R0FDQSxTQUFTLFNBQVUsUUFBUSxNQUFNO0lBQy9CLHVCQUF1QjtJQUN2QixrQkFBa0I7SUFDbEIscUJBQXFCLElBQUk7SUFDekIsSUFBSSxpQkFBaUIscUJBQXFCO0lBQzFDLHFCQUFxQixJQUFJO0lBQ3pCLElBQUk7S0FDRixPQUFPLFVBQVUsUUFBUSxJQUFJO0lBQy9CLFVBQVU7S0FDUixxQkFBcUIsSUFBSTtJQUMzQjtHQUNGO0dBQ0EsWUFBWSxTQUFVLFNBQVMsWUFBWSxNQUFNO0lBQy9DLHVCQUF1QjtJQUN2QixrQkFBa0I7SUFDbEIsSUFBSSxpQkFBaUIscUJBQXFCO0lBQzFDLHFCQUFxQixJQUFJO0lBQ3pCLElBQUk7S0FDRixPQUFPLGFBQWEsU0FBUyxZQUFZLElBQUk7SUFDL0MsVUFBVTtLQUNSLHFCQUFxQixJQUFJO0lBQzNCO0dBQ0Y7R0FDQSxRQUFRLFNBQVUsY0FBYztJQUM5Qix1QkFBdUI7SUFDdkIsa0JBQWtCO0lBQ2xCLE9BQU8sU0FBUyxZQUFZO0dBQzlCO0dBQ0EsVUFBVSxTQUFVLGNBQWM7SUFDaEMsdUJBQXVCO0lBQ3ZCLGtCQUFrQjtJQUNsQixJQUFJLGlCQUFpQixxQkFBcUI7SUFDMUMscUJBQXFCLElBQUk7SUFDekIsSUFBSTtLQUNGLE9BQU8sV0FBVyxZQU
15852FZO0lBQ2hDLFVBQVU7S0FDUixxQkFBcUIsSUFBSTtJQUMzQjtHQUNGO0dBQ0EsZUFBZSxXQUFZO0lBQ3pCLHVCQUF1QjtJQUN2QixrQkFBa0I7R0FDcEI7R0FDQSxrQkFBa0IsU0FBVSxPQUFPLGNBQWM7SUFDL0MsdUJBQXVCO0lBQ3ZCLGtCQUFrQjtJQUNsQixPQUFPLG1CQUFtQixPQUFPLFlBQVk7R0FDL0M7R0FDQSxlQUFlLFdBQVk7SUFDekIsdUJBQXVCO0lBQ3ZCLGtCQUFrQjtJQUNsQixPQUFPLGdCQUFnQjtHQUN6QjtHQUNBLHNCQUFzQixTQUNwQixXQUNBLGFBQ0EsbUJBQ0E7SUFDQSx1QkFBdUI7SUFDdkIsa0JBQWtCO0lBQ2xCLE9BQU8sdUJBQ0wsV0FDQSxhQUNBLGlCQUNGO0dBQ0Y7R0FDQSxPQUFPLFdBQVk7SUFDakIsdUJBQXVCO0lBQ3ZCLGtCQUFrQjtJQUNsQixPQUFPLFFBQVE7R0FDakI7R0FDQSxjQUFjLFNBQVUsUUFBUSxjQUFjO0lBQzVDLHVCQUF1QjtJQUN2QixrQkFBa0I7SUFDbEIsd0JBQXdCO0lBQ3hCLE9BQU8saUJBQWlCLFFBQVEsWUFBWTtHQUM5QztHQUNBLGdCQUFnQixTQUFVLFFBQVEsY0FBYztJQUM5Qyx1QkFBdUI7SUFDdkIsa0JBQWtCO0lBQ2xCLE9BQU8saUJBQWlCLFFBQVEsWUFBWTtHQUM5QztHQUNBLGVBQWUsU0FBVSxhQUFhO0lBQ3BDLHVCQUF1QjtJQUN2QixrQkFBa0I7SUFDbEIsT0FBTyxnQkFBZ0IsV0FBVztHQUNwQztHQUN5QjtHQUNYO0dBQ2QsaUJBQWlCLFdBQVk7SUFDM0IsdUJBQXVCO0lBQ3ZCLGtCQUFrQjtJQUNsQixPQUFPLGFBQWE7R0FDdEI7R0FDQSxnQkFBZ0IsU0FBVSxVQUFVO0lBQ2xDLHVCQUF1QjtJQUN2QixrQkFBa0I7SUFDbEIsT0FBTyxXQUFXLFFBQVE7R0FDNUI7RUFDRjtFQUNBLDJDQUEyQztHQUN6QyxhQUFhLFNBQVUsU0FBUztJQUM5QixPQUFPLFlBQVksT0FBTztHQUM1QjtHQUNLO0dBQ0wsYUFBYSxTQUFVLFVBQVUsTUFBTTtJQUNyQyx1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLE9BQU8sY0FBYyxVQUFVLElBQUk7R0FDckM7R0FDQSxZQUFZLFNBQVUsU0FBUztJQUM3Qix1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLE9BQU8sWUFBWSxPQUFPO0dBQzVCO0dBQ0EsV0FBVyxTQUFVLFFBQVEsTUFBTTtJQUNqQyx1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLE9BQU8sWUFBWSxRQUFRLElBQUk7R0FDakM7R0FDQSxxQkFBcUIsU0FBVSxLQUFLLFFBQVEsTUFBTTtJQUNoRCx1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLE9BQU8sc0JBQXNCLEtBQUssUUFBUSxJQUFJO0dBQ2hEO0dBQ0Esb0JBQW9CLFNBQVUsUUFBUSxNQUFNO0lBQzFDLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsZ0JBQWdCLEdBQUcsV0FBVyxRQUFRLElBQUk7R0FDNUM7R0FDQSxpQkFBaUIsU0FBVSxRQUFRLE1BQU07SUFDdkMsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixPQUFPLGtCQUFrQixRQUFRLElBQUk7R0FDdkM7R0FDQSxTQUFTLFNBQVUsUUFBUSxNQUFNO0lBQy9CLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsSUFBSSxpQkFBaUIscUJBQXFCO0lBQzFDLHFCQUFxQixJQUFJO0lBQ3pCLElBQUk7S0FDRixPQUFPLFVBQVUsUUFBUSxJQUFJO0lBQy9CLFVBQVU7S0FDUixxQkFBcUIsSUFBSTtJQUMzQjtHQUNGO0dBQ0EsWUFBWSxTQUFVLFNBQVMsWUFBWSxNQUFNO0lBQy9DLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsSUFBSSxpQkFBaUIscUJBQXFCO0lBQzFDLHFCQUFxQixJQUFJO0lBQ3pCLElBQUk7S0FDRixPQUFPLGFBQWEsU0FBUyxZQUFZLElBQUk7SUFDL0MsVUFBVTtLQUNSLHFCQUFxQixJQUFJO0lBQzNCO0dBQ0Y7R0FDQSxRQUFRLFNBQVUsY0FBYztJQUM5Qix1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLE9BQU8sU0FBUyxZQUFZO0dBQzlCO0dBQ0EsVUFBVSxTQUFVLGNBQWM7SUFDaEMsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixJQUFJLGlCQUFpQixxQkFBcUI7SUFDMUMscUJBQXFCLElBQUk7SUFDekIsSUFBSTtLQUNGLE9BQU8sV0FBVyxZQU
15852FZO0lBQ2hDLFVBQVU7S0FDUixxQkFBcUIsSUFBSTtJQUMzQjtHQUNGO0dBQ0EsZUFBZSxXQUFZO0lBQ3pCLHVCQUF1QjtJQUN2QixtQkFBbUI7R0FDckI7R0FDQSxrQkFBa0IsU0FBVSxPQUFPLGNBQWM7SUFDL0MsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixPQUFPLG1CQUFtQixPQUFPLFlBQVk7R0FDL0M7R0FDQSxlQUFlLFdBQVk7SUFDekIsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixPQUFPLGdCQUFnQjtHQUN6QjtHQUNBLHNCQUFzQixTQUNwQixXQUNBLGFBQ0EsbUJBQ0E7SUFDQSx1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLE9BQU8sdUJBQ0wsV0FDQSxhQUNBLGlCQUNGO0dBQ0Y7R0FDQSxPQUFPLFdBQVk7SUFDakIsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixPQUFPLFFBQVE7R0FDakI7R0FDQSxnQkFBZ0IsU0FBVSxRQUFRLGNBQWM7SUFDOUMsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixPQUFPLGlCQUFpQixRQUFRLFlBQVk7R0FDOUM7R0FDQSxjQUFjLFNBQVUsUUFBUSxjQUFjO0lBQzVDLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsd0JBQXdCO0lBQ3hCLE9BQU8saUJBQWlCLFFBQVEsWUFBWTtHQUM5QztHQUNBLGVBQWUsU0FBVSxhQUFhO0lBQ3BDLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsT0FBTyxnQkFBZ0IsV0FBVztHQUNwQztHQUN5QjtHQUNYO0dBQ2QsaUJBQWlCLFdBQVk7SUFDM0IsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixPQUFPLGFBQWE7R0FDdEI7R0FDQSxnQkFBZ0IsU0FBVSxVQUFVO0lBQ2xDLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsT0FBTyxXQUFXLFFBQVE7R0FDNUI7RUFDRjtFQUNBLCtCQUErQjtHQUM3QixhQUFhLFNBQVUsU0FBUztJQUM5QixPQUFPLFlBQVksT0FBTztHQUM1QjtHQUNLO0dBQ0wsYUFBYSxTQUFVLFVBQVUsTUFBTTtJQUNyQyx1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLE9BQU8sZUFBZSxVQUFVLElBQUk7R0FDdEM7R0FDQSxZQUFZLFNBQVUsU0FBUztJQUM3Qix1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLE9BQU8sWUFBWSxPQUFPO0dBQzVCO0dBQ0EsV0FBVyxTQUFVLFFBQVEsTUFBTTtJQUNqQyx1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLGlCQUFpQixNQUFNLFNBQVMsUUFBUSxJQUFJO0dBQzlDO0dBQ0EscUJBQXFCLFNBQVUsS0FBSyxRQUFRLE1BQU07SUFDaEQsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixPQUFPLHVCQUF1QixLQUFLLFFBQVEsSUFBSTtHQUNqRDtHQUNBLG9CQUFvQixTQUFVLFFBQVEsTUFBTTtJQUMxQyx1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLE9BQU8saUJBQWlCLEdBQUcsV0FBVyxRQUFRLElBQUk7R0FDcEQ7R0FDQSxpQkFBaUIsU0FBVSxRQUFRLE1BQU07SUFDdkMsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixPQUFPLGlCQUFpQixHQUFHLFFBQVEsUUFBUSxJQUFJO0dBQ2pEO0dBQ0EsU0FBUyxTQUFVLFFBQVEsTUFBTTtJQUMvQix1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLElBQUksaUJBQWlCLHFCQUFxQjtJQUMxQyxxQkFBcUIsSUFBSTtJQUN6QixJQUFJO0tBQ0YsT0FBTyxXQUFXLFFBQVEsSUFBSTtJQUNoQyxVQUFVO0tBQ1IscUJBQXFCLElBQUk7SUFDM0I7R0FDRjtHQUNBLFlBQVksU0FBVSxTQUFTLFlBQVksTUFBTTtJQUMvQyx1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLElBQUksaUJBQWlCLHFCQUFxQjtJQUMxQyxxQkFBcUIsSUFBSTtJQUN6QixJQUFJO0tBQ0YsT0FBTyxjQUFjLFNBQVMsWUFBWSxJQUFJO0lBQ2hELFVBQVU7S0FDUixxQkFBcUIsSUFBSTtJQUMzQjtHQUNGO0dBQ0EsUUFBUSxXQUFZO0lBQ2xCLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsT0FBTyx5QkFBeUIsQ0FBQyxDQUFDO0dBQ3BDO0dBQ0EsVUFBVSxXQUFZO0lBQ3BCLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsSUFBSSxpQkFBaUIscUJBQXFCO0lBQzFDLHFCQUFxQixJQUFJO0lBQ3pCLElBQUk7S0FDRixPQUFPLGNBQWMsaUJBQWlCO0lBQ3hDLFVBQVU7S0FDUixxQkFBcUIsSUFBSTtJQUMzQjtHQUNGO0dBQ0EsZUFBZSxXQUFZO0lBQ3pCLHVCQUF1QjtJQUN2QixtQkFBbUI7R0FDckI7R0FDQSxrQkFBa0IsU0FBVSxPQUFPLGNBQWM7SUFDL0MsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixPQUFPLG9CQUFvQixPQUFPLFlBQVk7R0FDaEQ7R0FDQSxlQUFlLFdBQVk7SUFDekIsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixPQUFPLGlCQUFpQjtHQUMxQjtHQUNBLHNCQUFzQixTQUNwQixXQUNBLGFBQ0EsbUJBQ0E7SUFDQSx1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLE9BQU8sd0JBQ0wsV0FDQSxhQUNBLGlCQUNGO0dBQ0Y7R0FDQSxPQUFPLFdBQVk7SUFDakIsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixPQUFPLHlCQUF5QixDQUFDLENBQUM7R0FDcEM7R0FDQSxjQUFjLFNBQVUsUUFBUTtJQUM5Qix1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLHdCQUF3QjtJQUN4QixPQUFPLGtCQUFrQixNQUFNO0dBQ2pDO0dBQ0EsZ0JBQWdCLFNBQVUsUUFBUTtJQUNoQyx1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLE9BQU8sa0JBQWtCLE1BQU07R0FDakM7R0FDQSxlQUFlLFNBQVUsYUFBYSxTQUFTO0lBQzdDLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsT0FBTyxpQkFBaUIsYUFBYSxPQUFPO0dBQzlDO0dBQ3lCO0dBQ1g7R0FDZCxpQkFBaUIsV0FBWTtJQUMzQix1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLE9BQU8seUJBQXlCLENBQUMsQ0FBQztHQUNwQztHQUNBLGdCQUFnQixTQUFVLFVBQVU7SUFDbEMsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixPQUFPLFlBQVksUUFBUTtHQUM3QjtFQUNGO0VBQ0EsaUNBQWlDO0dBQy9CLGFBQWEsU0FBVSxTQUFTO0lBQzlCLE9BQU8sWUFBWSxPQUFPO0dBQzVCO0dBQ0s7R0FDTCxhQUFhLFNBQVUsVUFBVSxNQUFNO0lBQ3JDLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsT0FBTyxlQUFlLFVBQVUsSUFBSTtHQUN0QztHQUNBLFlBQVksU0FBVSxTQUFTO0lBQzdCLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsT0FBTyxZQUFZLE9BQU87R0FDNUI7R0FDQSxXQUFXLFNBQVUsUUFBUSxNQUFNO0lBQ2pDLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsaUJBQWlCLE1BQU0sU0FBUyxRQUFRLElBQUk7R0FDOUM7R0FDQSxxQkFBcUIsU0FBVSxLQUFLLFFBQVEsTUFBTTtJQUNoRCx1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLE9BQU8sdUJBQXVCLEtBQUssUUFBUSxJQUFJO0dBQ2pEO0
15852dBQ0Esb0JBQW9CLFNBQVUsUUFBUSxNQUFNO0lBQzFDLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsT0FBTyxpQkFBaUIsR0FBRyxXQUFXLFFBQVEsSUFBSTtHQUNwRDtHQUNBLGlCQUFpQixTQUFVLFFBQVEsTUFBTTtJQUN2Qyx1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLE9BQU8saUJBQWlCLEdBQUcsUUFBUSxRQUFRLElBQUk7R0FDakQ7R0FDQSxTQUFTLFNBQVUsUUFBUSxNQUFNO0lBQy9CLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsSUFBSSxpQkFBaUIscUJBQXFCO0lBQzFDLHFCQUFxQixJQUFJO0lBQ3pCLElBQUk7S0FDRixPQUFPLFdBQVcsUUFBUSxJQUFJO0lBQ2hDLFVBQVU7S0FDUixxQkFBcUIsSUFBSTtJQUMzQjtHQUNGO0dBQ0EsWUFBWSxTQUFVLFNBQVMsWUFBWSxNQUFNO0lBQy9DLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsSUFBSSxpQkFBaUIscUJBQXFCO0lBQzFDLHFCQUFxQixJQUFJO0lBQ3pCLElBQUk7S0FDRixPQUFPLGdCQUFnQixTQUFTLFlBQVksSUFBSTtJQUNsRCxVQUFVO0tBQ1IscUJBQXFCLElBQUk7SUFDM0I7R0FDRjtHQUNBLFFBQVEsV0FBWTtJQUNsQix1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLE9BQU8seUJBQXlCLENBQUMsQ0FBQztHQUNwQztHQUNBLFVBQVUsV0FBWTtJQUNwQix1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLElBQUksaUJBQWlCLHFCQUFxQjtJQUMxQyxxQkFBcUIsSUFBSTtJQUN6QixJQUFJO0tBQ0YsT0FBTyxnQkFBZ0IsaUJBQWlCO0lBQzFDLFVBQVU7S0FDUixxQkFBcUIsSUFBSTtJQUMzQjtHQUNGO0dBQ0EsZUFBZSxXQUFZO0lBQ3pCLHVCQUF1QjtJQUN2QixtQkFBbUI7R0FDckI7R0FDQSxrQkFBa0IsU0FBVSxPQUFPLGNBQWM7SUFDL0MsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixPQUFPLHNCQUFzQixPQUFPLFlBQVk7R0FDbEQ7R0FDQSxlQUFlLFdBQVk7SUFDekIsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixPQUFPLG1CQUFtQjtHQUM1QjtHQUNBLHNCQUFzQixTQUNwQixXQUNBLGFBQ0EsbUJBQ0E7SUFDQSx1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLE9BQU8sd0JBQ0wsV0FDQSxhQUNBLGlCQUNGO0dBQ0Y7R0FDQSxPQUFPLFdBQVk7SUFDakIsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixPQUFPLHlCQUF5QixDQUFDLENBQUM7R0FDcEM7R0FDQSxjQUFjLFNBQVUsUUFBUTtJQUM5Qix1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLHdCQUF3QjtJQUN4QixPQUFPLG9CQUFvQixNQUFNO0dBQ25DO0dBQ0EsZ0JBQWdCLFNBQVUsUUFBUTtJQUNoQyx1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLE9BQU8sb0JBQW9CLE1BQU07R0FDbkM7R0FDQSxlQUFlLFNBQVUsYUFBYSxTQUFTO0lBQzdDLHVCQUF1QjtJQUN2QixtQkFBbUI7SUFDbkIsT0FBTyxtQkFBbUIsYUFBYSxPQUFPO0dBQ2hEO0dBQ3lCO0dBQ1g7R0FDZCxpQkFBaUIsV0FBWTtJQUMzQix1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLE9BQU8seUJBQXlCLENBQUMsQ0FBQztHQUNwQztHQUNBLGdCQUFnQixTQUFVLFVBQVU7SUFDbEMsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixPQUFPLFlBQVksUUFBUTtHQUM3QjtFQUNGO0VBQ0EsMkNBQTJDO0dBQ3pDLGFBQWEsU0FBVSxTQUFTO0lBQzlCLHlCQUF5QjtJQUN6QixPQUFPLFlBQVksT0FBTztHQUM1QjtHQUNBLEtBQUssU0FBVSxRQUFRO0lBQ3JCLHNCQUFzQjtJQUN0QixPQUFPLElBQUksTUFBTTtHQUNuQjtHQUNBLGFBQWEsU0FBVSxVQUFVLE1BQU07SUFDckMsdUJBQXVCO0lBQ3ZCLHNCQUFzQjtJQUN0QixrQkFBa0I7SUFDbEIsT0FBTyxjQUFjLFVBQVUsSUFBSTtHQUNyQztHQUNBLFlBQVksU0FBVSxTQUFTO0lBQzdCLHVCQUF1QjtJQUN2QixzQkFBc0I7SUFDdEIsa0JBQWtCO0lBQ2xCLE9BQU8sWUFBWSxPQUFPO0dBQzVCO0dBQ0EsV0FBVyxTQUFVLFFBQVEsTUFBTTtJQUNqQyx1QkFBdUI7SUFDdkIsc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNsQixPQUFPLFlBQVksUUFBUSxJQUFJO0dBQ2pDO0dBQ0EscUJBQXFCLFNBQVUsS0FBSyxRQUFRLE1BQU07SUFDaEQsdUJBQXVCO0lBQ3ZCLHNCQUFzQjtJQUN0QixrQkFBa0I7SUFDbEIsT0FBTyxzQkFBc0IsS0FBSyxRQUFRLElBQUk7R0FDaEQ7R0FDQSxvQkFBb0IsU0FBVSxRQUFRLE1BQU07SUFDMUMsdUJBQXVCO0lBQ3ZCLHNCQUFzQjtJQUN0QixrQkFBa0I7SUFDbEIsZ0JBQWdCLEdBQUcsV0FBVyxRQUFRLElBQUk7R0FDNUM7R0FDQSxpQkFBaUIsU0FBVSxRQUFRLE1BQU07SUFDdkMsdUJBQXVCO0lBQ3ZCLHNCQUFzQjtJQUN0QixrQkFBa0I7SUFDbEIsT0FBTyxrQkFBa0IsUUFBUSxJQUFJO0dBQ3ZDO0dBQ0EsU0FBUyxTQUFVLFFBQVEsTUFBTTtJQUMvQix1QkFBdUI7SUFDdkIsc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNsQixJQUFJLGlCQUFpQixxQkFBcUI7SUFDMUMscUJBQXFCLElBQUk7SUFDekIsSUFBSTtLQUNGLE9BQU8sVUFBVSxRQUFRLElBQUk7SUFDL0IsVUFBVTtLQUNSLHFCQUFxQixJQUFJO0lBQzNCO0dBQ0Y7R0FDQSxZQUFZLFNBQVUsU0FBUyxZQUFZLE1BQU07SUFDL0MsdUJBQXVCO0lBQ3ZCLHNCQUFzQjtJQUN0QixrQkFBa0I7SUFDbEIsSUFBSSxpQkFBaUIscUJBQXFCO0lBQzFDLHFCQUFxQixJQUFJO0lBQ3pCLElBQUk7S0FDRixPQUFPLGFBQWEsU0FBUyxZQUFZLElBQUk7SUFDL0MsVUFBVTtLQUNSLHFCQUFxQixJQUFJO0lBQzNCO0dBQ0Y7R0FDQSxRQUFRLFNBQVUsY0FBYztJQUM5Qix1QkFBdUI7SUFDdkIsc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNsQixPQUFPLFNBQVMsWUFBWTtHQUM5QjtHQUNBLFVBQVUsU0FBVSxjQUFjO0lBQ2hDLHVCQUF1QjtJQUN2QixzQkFBc0I7SUFDdEIsa0JBQWtCO0lBQ2xCLElBQUksaUJBQWlCLHFCQUFxQjtJQUMxQyxxQkFBcUIsSUFBSTtJQUN6QixJQUFJO0tBQ0YsT0FBTyxXQUFXLFlBQVk7SUFDaEMsVUFBVTtLQUNSLHFCQUFxQixJQUFJO0lBQzNCO0dBQ0Y7R0FDQSxlQUFlLFdBQVk7SUFDekIsdUJBQXVCO0lBQ3ZCLHNCQUFzQjtJQUN0QixrQkFBa0I7R0FDcEI7R0FDQSxrQkFBa0IsU0FBVSxPQUFPLGNBQWM7SUFDL0MsdUJBQXVCO0lBQ3ZCLHNCQUFzQjtJQUN0QixrQkFBa0I7SUFDbEIsT0FBTyxtQkFBbUIsT0FBTyxZQUFZO0dBQy9DO0dBQ0EsZUFBZSxXQUFZO0lBQ3pCLHVCQUF1QjtJQUN2QixzQkFBc0I7SUFDdEIsa0JBQWtCO0lBQ2xCLE9BQU8sZ0JBQWdCO0dBQ3pCO0dBQ0Esc0JBQXNCLFNBQ3BCLFdBQ0EsYUFDQSxtQk
15852FDQTtJQUNBLHVCQUF1QjtJQUN2QixzQkFBc0I7SUFDdEIsa0JBQWtCO0lBQ2xCLE9BQU8sdUJBQ0wsV0FDQSxhQUNBLGlCQUNGO0dBQ0Y7R0FDQSxPQUFPLFdBQVk7SUFDakIsdUJBQXVCO0lBQ3ZCLHNCQUFzQjtJQUN0QixrQkFBa0I7SUFDbEIsT0FBTyxRQUFRO0dBQ2pCO0dBQ0EsY0FBYyxTQUFVLFFBQVEsY0FBYztJQUM1Qyx1QkFBdUI7SUFDdkIsc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNsQixPQUFPLGlCQUFpQixRQUFRLFlBQVk7R0FDOUM7R0FDQSxnQkFBZ0IsU0FBVSxRQUFRLGNBQWM7SUFDOUMsdUJBQXVCO0lBQ3ZCLHNCQUFzQjtJQUN0QixrQkFBa0I7SUFDbEIsT0FBTyxpQkFBaUIsUUFBUSxZQUFZO0dBQzlDO0dBQ0EsZUFBZSxTQUFVLGFBQWE7SUFDcEMsdUJBQXVCO0lBQ3ZCLHNCQUFzQjtJQUN0QixrQkFBa0I7SUFDbEIsT0FBTyxnQkFBZ0IsV0FBVztHQUNwQztHQUNBLGNBQWMsU0FBVSxNQUFNO0lBQzVCLHNCQUFzQjtJQUN0QixPQUFPLGFBQWEsSUFBSTtHQUMxQjtHQUN5QjtHQUN6QixpQkFBaUIsV0FBWTtJQUMzQix1QkFBdUI7SUFDdkIsa0JBQWtCO0lBQ2xCLE9BQU8sYUFBYTtHQUN0QjtHQUNBLGdCQUFnQixTQUFVLFVBQVU7SUFDbEMsdUJBQXVCO0lBQ3ZCLHNCQUFzQjtJQUN0QixrQkFBa0I7SUFDbEIsT0FBTyxXQUFXLFFBQVE7R0FDNUI7RUFDRjtFQUNBLDRDQUE0QztHQUMxQyxhQUFhLFNBQVUsU0FBUztJQUM5Qix5QkFBeUI7SUFDekIsT0FBTyxZQUFZLE9BQU87R0FDNUI7R0FDQSxLQUFLLFNBQVUsUUFBUTtJQUNyQixzQkFBc0I7SUFDdEIsT0FBTyxJQUFJLE1BQU07R0FDbkI7R0FDQSxhQUFhLFNBQVUsVUFBVSxNQUFNO0lBQ3JDLHVCQUF1QjtJQUN2QixzQkFBc0I7SUFDdEIsbUJBQW1CO0lBQ25CLE9BQU8sZUFBZSxVQUFVLElBQUk7R0FDdEM7R0FDQSxZQUFZLFNBQVUsU0FBUztJQUM3Qix1QkFBdUI7SUFDdkIsc0JBQXNCO0lBQ3RCLG1CQUFtQjtJQUNuQixPQUFPLFlBQVksT0FBTztHQUM1QjtHQUNBLF
15852dBQVcsU0FBVSxRQUFRLE1BQU07SUFDakMsdUJBQXVCO0lBQ3ZCLHNCQUFzQjtJQUN0QixtQkFBbUI7SUFDbkIsaUJBQWlCLE1BQU0sU0FBUyxRQUFRLElBQUk7R0FDOUM7R0FDQSxxQkFBcUIsU0FBVSxLQUFLLFFBQVEsTUFBTTtJQUNoRCx1QkFBdUI7SUFDdkIsc0JBQXNCO0lBQ3RCLG1CQUFtQjtJQUNuQixPQUFPLHVCQUF1QixLQUFLLFFBQVEsSUFBSTtHQUNqRDtHQUNBLG9CQUFvQixTQUFVLFFBQVEsTUFBTTtJQUMxQyx1QkFBdUI7SUFDdkIsc0JBQXNCO0lBQ3RCLG1CQUFtQjtJQUNuQixPQUFPLGlCQUFpQixHQUFHLFdBQVcsUUFBUSxJQUFJO0dBQ3BEO0dBQ0EsaUJBQWlCLFNBQVUsUUFBUSxNQUFNO0lBQ3ZDLHVCQUF1QjtJQUN2QixzQkFBc0I7SUFDdEIsbUJBQW1CO0lBQ25CLE9BQU8saUJBQWlCLEdBQUcsUUFBUSxRQUFRLElBQUk7R0FDakQ7R0FDQSxTQUFTLFNBQVUsUUFBUSxNQUFNO0lBQy9CLHVCQUF1QjtJQUN2QixzQkFBc0I7SUFDdEIsbUJBQW1CO0lBQ25CLElBQUksaUJBQWlCLHFCQUFxQjtJQUMxQyxxQkFBcUIsSUFBSTtJQUN6QixJQUFJO0tBQ0YsT0FBTyxXQUFXLFFBQVEsSUFBSTtJQUNoQyxVQUFVO0tBQ1IscUJBQXFCLElBQUk7SUFDM0I7R0FDRjtHQUNBLFlBQVksU0FBVSxTQUFTLFlBQVksTUFBTTtJQUMvQyx1QkFBdUI7SUFDdkIsc0JBQXNCO0lBQ3RCLG1CQUFtQjtJQUNuQixJQUFJLGlCQUFpQixxQkFBcUI7SUFDMUMscUJBQXFCLElBQUk7SUFDekIsSUFBSTtLQUNGLE9BQU8sY0FBYyxTQUFTLFlBQVksSUFBSTtJQUNoRCxVQUFVO0tBQ1IscUJBQXFCLElBQUk7SUFDM0I7R0FDRjtHQUNBLFFBQVEsV0FBWTtJQUNsQix1QkFBdUI7SUFDdkIsc0JBQXNCO0lBQ3RCLG1CQUFtQjtJQUNuQixPQUFPLHlCQUF5QixDQUFDLENBQUM7R0FDcEM7R0FDQSxVQUFVLFdBQVk7SUFDcEIsdUJBQXVCO0lBQ3ZCLHNCQUFzQjtJQUN0QixtQkFBbUI7SUFDbkIsSUFBSSxpQkFBaUIscUJBQXFCO0lBQzFDLHFCQUFxQixJQUFJO0lBQ3pCLElBQUk7S0FDRixPQUFPLGNBQWMsaUJBQWlCO0lBQ3hDLFVBQVU7S0FDUixxQkFBcUIsSUFBSTtJQUMzQjtHQUNGO0dBQ0EsZUFBZSxXQUFZO0lBQ3pCLHVCQUF1QjtJQUN2QixzQkFBc0I7SUFDdEIsbUJBQW1CO0dBQ3JCO0dBQ0Esa0JBQWtCLFNBQVUsT0FBTyxjQUFjO0lBQy9DLHVCQUF1QjtJQUN2QixzQkFBc0I7SUFDdEIsbUJBQW1CO0lBQ25CLE9BQU8sb0JBQW9CLE9BQU8sWUFBWTtHQUNoRDtHQUNBLGVBQWUsV0FBWTtJQUN6Qix1QkFBdUI7SUFDdkIsc0JBQXNCO0lBQ3RCLG1CQUFtQjtJQUNuQixPQUFPLGlCQUFpQjtHQUMxQjtHQUNBLHNCQUFzQixTQUNwQixXQUNBLGFBQ0EsbUJBQ0E7SUFDQSx1QkFBdUI7SUFDdkIsc0JBQXNCO0lBQ3RCLG1CQUFtQjtJQUNuQixPQUFPLHdCQUNMLFdBQ0EsYUFDQSxpQkFDRjtHQUNGO0dBQ0EsT0FBTyxXQUFZO0lBQ2pCLHVCQUF1QjtJQUN2QixzQkFBc0I7SUFDdEIsbUJBQW1CO0lBQ25CLE9BQU8seUJBQXlCLENBQUMsQ0FBQztHQUNwQztHQUNBLGNBQWMsU0FBVSxRQUFRO0lBQzlCLHVCQUF1QjtJQUN2QixzQkFBc0I7SUFDdEIsbUJBQW1CO0lBQ25CLE9BQU8sa0JBQWtCLE1BQU07R0FDakM7R0FDQSxnQkFBZ0IsU0FBVSxRQUFRO0lBQ2hDLHVCQUF1QjtJQUN2QixzQkFBc0I7SUFDdEIsbUJBQW1CO0lBQ25CLE9BQU8sa0JBQWtCLE1BQU07R0FDakM7R0FDQSxlQUFlLFNBQVUsYUFBYSxTQUFTO0lBQzdDLHVCQUF1QjtJQUN2QixzQkFBc0I7SUFDdEIsbUJBQW1CO0lBQ25CLE9BQU8saUJBQWlCLGFBQWEsT0FBTztHQUM5QztHQUNBLGNBQWMsU0FBVSxNQUFNO0lBQzVCLHNCQUFzQjtJQUN0QixPQUFPLGFBQWEsSUFBSTtHQUMxQjtHQUN5QjtHQUN6QixpQkFBaUIsV0FBWTtJQUMzQix1QkFBdUI7SUFDdkIsbUJBQW1CO0lBQ25CLE9BQU8seUJBQXlCLENBQUMsQ0FBQztHQUNwQztHQUNBLGdCQUFnQixTQUFVLFVBQVU7SUFDbEMsdUJBQXVCO0lBQ3ZCLHNCQUFzQjtJQUN0QixtQkFBbUI7SUFDbkIsT0FBTyxZQUFZLFFBQVE7R0FDN0I7RUFDRjtFQUNBLDhDQUE4QztHQUM1QyxhQUFhLFNBQVUsU0FBUztJQUM5Qix5QkFBeUI7SUFDekIsT0FBTyxZQUFZLE9BQU87R0FDNUI7R0FDQSxLQUFLLFNBQVUsUUFBUTtJQUNyQixzQkFBc0I7SUFDdEIsT0FBTyxJQUFJLE1BQU07R0FDbkI7R0FDQSxhQUFhLFNBQVUsVUFBVSxNQUFNO0lBQ3JDLHVCQUF1QjtJQUN2QixzQkFBc0I7SUFDdEIsbUJBQW1CO0lBQ25CLE9BQU8sZUFBZSxVQUFVLElBQUk7R0FDdEM7R0FDQSxZQUFZLFNBQVUsU0FBUztJQUM3Qix1QkFBdUI7SUFDdkIsc0JBQXNCO0lBQ3RCLG1CQUFtQjtJQUNuQixPQUFPLFlBQVksT0FBTztHQUM1QjtHQUNBLF
15852dBQVcsU0FBVSxRQUFRLE1BQU07SUFDakMsdUJBQXVCO0lBQ3ZCLHNCQUFzQjtJQUN0QixtQkFBbUI7SUFDbkIsaUJBQWlCLE1BQU0sU0FBUyxRQUFRLElBQUk7R0FDOUM7R0FDQSxxQkFBcUIsU0FBVSxLQUFLLFFBQVEsTUFBTTtJQUNoRCx1QkFBdUI7SUFDdkIsc0JBQXNCO0lBQ3RCLG1CQUFtQjtJQUNuQixPQUFPLHVCQUF1QixLQUFLLFFBQVEsSUFBSTtHQUNqRDtHQUNBLG9CQUFvQixTQUFVLFFBQVEsTUFBTTtJQUMxQyx1QkFBdUI7SUFDdkIsc0JBQXNCO0lBQ3RCLG1CQUFtQjtJQUNuQixPQUFPLGlCQUFpQixHQUFHLFdBQVcsUUFBUSxJQUFJO0dBQ3BEO0dBQ0EsaUJBQWlCLFNBQVUsUUFBUSxNQUFNO0lBQ3ZDLHVCQUF1QjtJQUN2QixzQkFBc0I7SUFDdEIsbUJBQW1CO0lBQ25CLE9BQU8saUJBQWlCLEdBQUcsUUFBUSxRQUFRLElBQUk7R0FDakQ7R0FDQSxTQUFTLFNBQVUsUUFBUSxNQUFNO0lBQy9CLHVCQUF1QjtJQUN2QixzQkFBc0I7SUFDdEIsbUJBQW1CO0lBQ25CLElBQUksaUJBQWlCLHFCQUFxQjtJQUMxQyxxQkFBcUIsSUFBSTtJQUN6QixJQUFJO0tBQ0YsT0FBTyxXQUFXLFFBQVEsSUFBSTtJQUNoQyxVQUFVO0tBQ1IscUJBQXFCLElBQUk7SUFDM0I7R0FDRjtHQUNBLFlBQVksU0FBVSxTQUFTLFlBQVksTUFBTTtJQUMvQyx1QkFBdUI7SUFDdkIsc0JBQXNCO0lBQ3RCLG1CQUFtQjtJQUNuQixJQUFJLGlCQUFpQixxQkFBcUI7SUFDMUMscUJBQXFCLElBQUk7SUFDekIsSUFBSTtLQUNGLE9BQU8sZ0JBQWdCLFNBQVMsWUFBWSxJQUFJO0lBQ2xELFVBQVU7S0FDUixxQkFBcUIsSUFBSTtJQUMzQjtHQUNGO0dBQ0EsUUFBUSxXQUFZO0lBQ2xCLHVCQUF1QjtJQUN2QixzQkFBc0I7SUFDdEIsbUJBQW1CO0lBQ25CLE9BQU8seUJBQXlCLENBQUMsQ0FBQztHQUNwQztHQUNBLFVBQVUsV0FBWTtJQUNwQix1QkFBdUI7SUFDdkIsc0JBQXNCO0lBQ3RCLG1CQUFtQjtJQUNuQixJQUFJLGlCQUFpQixxQkFBcUI7SUFDMUMscUJBQXFCLElBQUk7SUFDekIsSUFBSTtLQUNGLE9BQU8sZ0JBQWdCLGlCQUFpQjtJQUMxQyxVQUFVO0tBQ1IscUJBQXFCLElBQUk7SUFDM0I7R0FDRjtHQUNBLGVBQWUsV0FBWTtJQUN6Qix1QkFBdUI7SUFDdkIsc0JBQXNCO0lBQ3RCLG1CQUFtQjtHQUNyQjtHQUNBLGtCQUFrQixTQUFVLE9BQU8sY0FBYztJQUMvQyx1QkFBdUI7SUFDdkIsc0JBQXNCO0lBQ3RCLG1CQUFtQjtJQUNuQixPQUFPLHNCQUFzQixPQUFPLFlBQVk7R0FDbEQ7R0FDQSxlQUFlLFdBQVk7SUFDekIsdUJBQXVCO0lBQ3ZCLHNCQUFzQjtJQUN0QixtQkFBbUI7SUFDbkIsT0FBTyxtQkFBbUI7R0FDNUI7R0FDQSxzQkFBc0IsU0FDcEIsV0FDQSxhQUNBLG1CQUNBO0lBQ0EsdUJBQXVCO0lBQ3ZCLHNCQUFzQjtJQUN0QixtQkFBbUI7SUFDbkIsT0FBTyx3QkFDTCxXQUNBLGFBQ0EsaUJBQ0Y7R0FDRjtHQUNBLE9BQU8sV0FBWTtJQUNqQix1QkFBdUI7SUFDdkIsc0JBQXNCO0lBQ3RCLG1CQUFtQjtJQUNuQixPQUFPLHlCQUF5QixDQUFDLENBQUM7R0FDcEM7R0FDQSxjQUFjLFNBQVUsUUFBUTtJQUM5Qix1QkFBdUI7SUFDdkIsc0JBQXNCO0lBQ3RCLG1CQUFtQjtJQUNuQixPQUFPLG9CQUFvQixNQUFNO0dBQ25DO0dBQ0EsZ0JBQWdCLFNBQVUsUUFBUTtJQUNoQyx1QkFBdUI7SUFDdkIsc0JBQXNCO0lBQ3RCLG1CQUFtQjtJQUNuQixPQUFPLG9CQUFvQixNQUFNO0dBQ25DO0dBQ0EsZUFBZSxTQUFVLGFBQWEsU0FBUztJQUM3Qyx1QkFBdUI7SUFDdkIsc0JBQXNCO0lBQ3RCLG1CQUFtQjtJQUNuQixPQUFPLG1CQUFtQixhQUFhLE9BQU87R0FDaEQ7R0FDQSxjQUFjLFNBQVUsTUFBTTtJQUM1QixzQkFBc0I7SUFDdEIsT0FBTyxhQUFhLElBQUk7R0FDMUI7R0FDeUI7R0FDekIsaUJBQWlCLFdBQVk7SUFDM0IsdUJBQXVCO0lBQ3ZCLG1CQUFtQjtJQUNuQixPQUFPLHlCQUF5QixDQUFDLENBQUM7R0FDcEM7R0FDQSxnQkFBZ0IsU0FBVSxVQUFVO0lBQ2xDLHVCQUF1QjtJQUN2QixzQkFBc0I7SUFDdEIsbUJBQW1CO0lBQ25CLE9BQU8sWUFBWSxRQUFRO0dBQzdCO0VBQ0Y7RUFDQSxJQUFJLHVCQUF1QixDQUFDO0VBQzVCLElBQUksMERBQTBDLElBQUksSUFBSTtFQUN0RCxJQUFJLGlEQUFpQyxJQUFJLElBQUk7RUFDN0MsSUFBSSxzRUFBc0QsSUFBSSxJQUFJO0VBQ2xFLElBQUksOERBQThDLElBQUksSUFBSTtFQUMxRCxJQUFJLDREQUE0QyxJQUFJLElBQUk7RUFDeEQsSUFBSSxvREFBb0MsSUFBSSxJQUFJO0VBQ2hELElBQUksNkNBQTZCLElBQUksSUFBSTtFQUN6QyxJQUFJLGdEQUFnQyxJQUFJLElBQUk7RUFDNUMsSUFBSSxvREFBb0MsSUFBSSxJQUFJO0VBQ2hELElBQUksMkNBQTJCLElBQUksSUFBSTtFQUN2QyxPQUFPLE9BQU8sb0JBQW9CO0VBQ2xDLElBQUksd0JBQXdCO0dBQ3hCLGlCQUFpQixTQUFVLE1BQU0sU0FBUyxVQUFVO0lBQ2xELE9BQU8sS0FBSztJQUNaLElBQUksT0FBTyxrQkFBa0IsSUFBSSxHQUMvQixTQUFTLGFBQWEsSUFBSTtJQUM1QixPQUFPLFVBQVU7SUFDakIsS0FBSyxNQUFNLFlBQ1QsU0FBUyxhQUNSLHNCQUFzQixRQUFRLEdBQUksT0FBTyxXQUFXO0lBQ3ZELFVBQVUsY0FBYyxNQUFNLFFBQVEsSUFBSTtJQUMxQyxTQUFTLFlBQ04sdUJBQXVCLE1BQU0sbUJBQW1CLElBQUksR0FDckQsc0JBQXNCLFNBQVMsTUFBTSxJQUFJLEdBQ3pDLG9CQUFvQixTQUFTLE1BQU0sSUFBSTtHQUMzQztHQUNBLHFCQUFxQixTQUFVLE1BQU0sU0FBUyxVQUFVO0lBQ3RELE9BQU8sS0FBSztJQUNaLElBQUksT0FBTyxrQkFBa0IsSUFBSSxHQUMvQixTQUFTLGFBQWEsSUFBSTtJQUM1QixPQUFPLE1BQU07SUFDYixPQUFPLFVBQVU7SUFDakIsS0FBSyxNQUFNLFlBQ1QsU0FBUyxhQUNSLHNCQUFzQixRQUFRLEdBQUksT0FBTyxXQUFXO0lBQ3ZELFVBQVUsY0FBYyxNQUFNLFFBQVEsSUFBSTtJQUMxQyxTQUFTLFlBQ04sdUJBQXVCLE1BQU0sdUJBQXVCLElBQUksR0FDekQsc0JBQXNCLFNBQVMsTUFBTSxJQUFJLEdBQ3pDLG9CQUFvQixTQUFTLE1BQU0sSUFBSTtHQUMzQztHQUNBLG9CQUFvQixTQUFVLE1BQU0sVUFBVTtJQUM1QyxPQUFPLEtBQUs7SUFDWixJQUFJLE9BQU8sa0JBQWtCLElBQUksR0FDL0IsU0FBUyxhQUFhLElBQUk7SUFDNUIsT0FBTyxNQUFNO0lBQ2IsS0FBSyxNQUFNLFlBQ1QsU0FBUyxhQUNSLHNCQUFzQixRQUFRLEdBQUksT0FBTyxXQUFXO0lBQ3ZELFdBQVcsY0FBYyxNQUFNLFFBQVEsSUFBSTtJQUMzQyxTQUFTLGFBQ04sdUJBQXVCLE1BQU0sc0JBQXNCLElBQUksR0FDeEQsc0JBQXNCLFVBQVUsTUFBTSxJQUFJLEdBQzFDLG9CQUFvQixVQUFVLE1BQU0sSUFBSTtHQUM1QztFQUNGLEdBQ0EsZ0JBQWdCLE1BQ2hCLG9CQUFvQixNQUNwQiw4QkFBOEIsTUFDNUIsMEtBQ0YsR0FDQSxtQk
15852FBbUIsQ0FBQztFQUN0QixJQUFJLHVCQUF1QixDQUFDO0VBQzVCLElBQUksNkNBQTZDLENBQUM7RUFDbEQsSUFBSSwyQkFBMkIsQ0FBQztFQUNoQyxJQUFJLGlEQUFpRCxDQUFDO0VBQ3RELElBQUksK0JBQStCLENBQUM7RUFDcEMsSUFBSSwwQkFBMEIsQ0FBQztFQUMvQixJQUFJLDBCQUEwQixDQUFDO0VBQy9CLElBQUksd0NBQXdDLENBQUM7RUFDN0MsSUFBSSxtQkFBbUI7R0FDbkIsWUFBWTtHQUNaLGFBQWE7R0FDYixXQUFXO0dBQ1gsaUJBQWlCO0VBQ25CLEdBQ0Esa0RBQWtELENBQUMsR0FDbkQsNENBQTRDO0VBQzlDLDREQUE0QyxJQUFJLElBQUk7RUFDcEQsSUFBSSw0QkFBNEIsQ0FBQyxHQUMvQiwyQkFBMkIsTUFDM0IsbUNBQW1DLE1BQ25DLGdDQUFnQyxHQUNoQyw4Q0FBOEIsSUFBSSxJQUFJLEdBQ3RDLG1CQUFtQixDQUFDLEdBQ3BCLCtCQUErQixHQUMvQiwrQkFBK0IsR0FDL0Isd0JBQXdCLEdBQ3hCLDJCQUEyQixDQUFDLEdBQzVCLDRCQUE0QixDQUFDLEdBQzdCLGdDQUFnQyxDQUFDLEdBQ2pDLGlCQUFpQixDQUFDLEdBQ2xCLGtCQUFrQixlQUFlLE9BQU8sVUFBVSxVQUFVLEtBQzVELGFBQWEsTUFDYixrQkFBa0IsTUFDbEIsaUJBQWlCLE1BQ2pCLCtCQUErQixDQUFDLEdBQ2hDLHlCQUF5QixDQUFDLEdBQzFCLDZCQUE2QixDQUFDLEdBQzlCLGlDQUFpQyxDQUFDLEdBQ2xDLGFBQWEsTUFDYix3QkFBd0IsQ0FBQyxHQUN6Qix1QkFBdUIsTUFDdkIsb0JBQW9CLENBQUMsR0FDckIsc0JBQXNCLE1BQ3RCLHlCQUF5QjtHQUN2QixpQkFBaUIsU0FBVSxjQUFjO0lBQ3ZDLElBQUksUUFBUSxZQUFZLFlBQVksR0FDbEMsZUFBZSxNQUFNLEtBQUssSUFBSSxZQUFZO0lBQzVDLEtBQUssTUFBTSxpQkFDUCxlQUFlLGFBQWEsR0FDOUIsTUFBTSxLQUFLLElBQUksY0FBYyxZQUFZO0lBQzNDLE9BQU87R0FDVDtHQUNBLGFBQWEsV0FBWTtJQUN2QixPQUFPLFlBQVksWUFBWSxDQUFDLENBQUMsV0FBVztHQUM5QztHQUNBLFVBQVUsV0FBWTtJQUNwQixPQUFPO0dBQ1Q7RUFDRjtFQUNGLElBQUksZUFBZSxPQUFPLFVBQVUsT0FBTyxLQUFLO0dBQzlDLElBQUksWUFBWSxPQUFPO0dBQ3ZCLFVBQVUsb0JBQW9CO0dBQzl
15852CLFVBQVUsMkJBQTJCO0dBQ3JDLFVBQVUsZUFBZTtHQUN6QixVQUFVLGtCQUFrQjtHQUM1QixVQUFVLGVBQWU7RUFDM0I7RUFDQSxJQUFJLGNBQWMsQ0FBQyxHQUNqQixrQkFBa0IsZUFBZSxPQUFPLFVBQVUsVUFBVSxLQUM1RCxZQUFZLEdBQ1osZ0JBQWdCLEdBQ2hCLGdCQUFnQixHQUNoQixpQkFBaUIsR0FDakIsbUJBQW1CLEdBQ25CLGNBQWMsR0FDZCxnQkFBZ0IsR0FDaEIseUJBQXlCLEdBQ3pCLDBCQUEwQixHQUMxQixnQkFBZ0IsR0FDaEIsbUJBQW1CLFdBQ25CLHFCQUFxQixNQUNyQixpQkFBaUIsTUFDakIsZ0NBQWdDLEdBQ2hDLGVBQWUsR0FDZixtQkFBbUIsR0FDbkIsa0JBQWtCLEdBQ2xCLHVCQUF1QixHQUN2QixzQkFBc0IsR0FDdEIsd0NBQXdDLEdBQ3hDLG9DQUFvQyxHQUNwQyw4QkFBOEIsR0FDOUIsdUJBQXVCLEdBQ3ZCLG9CQUFvQixHQUNwQixnQ0FBZ0MsY0FDaEMsNEJBQTRCLE1BQzVCLDZDQUE2QyxDQUFDLEdBQzlDLG1DQUFtQyxDQUFDLEdBQ3BDLDBDQUEwQyxDQUFDLEdBQzNDLHVCQUF1QixHQUN2QiwrQkFBK0IsZ0JBQy9CLGlDQUFpQyxHQUNqQyw0Q0FBNEMsR0FDNUMsZ0NBQWdDLEdBQ2hDLDZCQUE2QixHQUM3QixvQ0FBb0MsR0FDcEMscUNBQXFDLE1BQ3JDLHNDQUFzQyxNQUN0QyxvREFBb0QsQ0FBQyxHQUNyRCwrQkFBK0IsR0FDL0IsaUNBQWlDLEdBQ2pDLHVCQUF1QixLQUN2QixxQ0FBcUMsVUFDckMsb0JBQW9CLEtBQ3BCLDRCQUE0QixNQUM1QiwyQkFBMkIsTUFDM0IseUNBQXlDLE1BQ3pDLG1CQUFtQixHQUNuQixpQ0FBaUMsR0FDakMseUJBQXlCLEdBQ3pCLDJCQUEyQixHQUMzQixxQkFBcUIsR0FDckIseUJBQXlCLEdBQ3pCLHVCQUF1QixHQUN2QiwrQkFBK0IsR0FDL0IsdUJBQXVCLEdBQ3ZCLHdCQUF3QixHQUN4Qix1QkFBdUIsR0FDdkIscUJBQXFCLE1BQ3JCLHNCQUFzQixNQUN0QixzQkFBc0IsR0FDdEIsK0JBQStCLEdBQy9CLDhCQUE4QixJQUM5Qiw0QkFBNEIsTUFDNUIsMkJBQTJCLE1BQzNCLHdCQUF3QixNQUN4Qiw4QkFBOEIsTUFDOUIseUJBQXlCLE1BQ3pCLCtCQUErQixNQUMvQiw2QkFBNkIsa0JBQzdCLHVDQUF1QyxNQUN2QyxzQkFBc0IsSUFDdEIsb0JBQW9CLEdBQ3BCLHdCQUF3QixNQUN4QiwyQkFBMkIsQ0FBQyxHQUM1Qix3Q0FBd0MsQ0FBQyxHQUN6Qyw4QkFBOEIsSUFDOUIsMkJBQTJCLEdBQzNCLCtCQUErQixNQUMvQiwyQkFBMkIsQ0FBQyxHQUM1Qix5Q0FBeUMsQ0FBQyxHQUMxQyw4Q0FBOEMsTUFDOUMsNkJBQTZCLENBQUM7RUFDaEMsSUFBSSxnRUFBZ0QsSUFBSSxJQUFJO0VBQzVELElBQUksd0JBQXdCLENBQUMsR0FDM0IscUJBQXFCLE1BQ3JCLG9CQUFvQixNQUNwQix1QkFBdUIsQ0FBQyxHQUN4QiwyQkFBMkIsQ0FBQyxHQUM1QiwyQkFBMkIsQ0FBQyxHQUM1QixpQkFBaUIsQ0FBQyxHQUNsQiw2QkFBNkIsR0FDN0Isc0JBQXNCLENBQUM7RUFDekIsQ0FBQyxXQUFZO0dBQ1gsS0FBSyxJQUFJLElBQUksR0FBRyxJQUFJLHdCQUF3QixRQUFRLEtBQUs7SUFDdkQsSUFBSSxZQUFZLHdCQUF3QixJQUN0QyxlQUFlLFVBQVUsWUFBWTtJQUN2QyxZQUFZLFVBQVUsRUFBRSxDQUFDLFlBQVksSUFBSSxVQUFVLE1BQU0sQ0FBQztJQUMxRCxvQkFBb0IsY0FBYyxPQUFPLFNBQVM7R0FDcEQ7R0FDQSxvQkFBb0IsZUFBZSxnQkFBZ0I7R0FDbkQsb0JBQW9CLHFCQUFxQixzQkFBc0I7R0FDL0Qsb0JBQW9CLGlCQUFpQixrQkFBa0I7R0FDdkQsb0JBQW9CLFlBQVksZUFBZTtHQUMvQyxvQkFBb0IsV0FBVyxTQUFTO0dBQ3hDLG9CQUFvQixZQUFZLFFBQVE7R0FDeEMsb0JBQW9CLGdCQUFnQixpQkFBaUI7R0FDckQsb0JBQW9CLGtCQUFrQixtQkFBbUI7R0FDekQsb0JBQW9CLG1CQUFtQixvQkFBb0I7R0FDM0Qsb0JBQW9CLGdCQUFnQixpQkFBaUI7RUFDdkQsRUFBQSxDQUFHO0VBQ0gsb0JBQW9CLGdCQUFnQixDQUFDLFlBQVksV0FBVyxDQUFDO0VBQzdELG9CQUFvQixnQkFBZ0IsQ0FBQyxZQUFZLFdBQVcsQ0FBQztFQUM3RCxvQkFBb0Isa0JBQWtCLENBQUMsY0FBYyxhQUFhLENBQUM7RUFDbkUsb0JBQW9CLGtCQUFrQixDQUFDLGNBQWMsYUFBYSxDQUFDO0VBQ25FLHNCQUNFLFlBQ0Esb0VBQW9FLE1BQ2xFLEdBQ0YsQ0FDRjtFQUNBLHNCQUNFLFlBQ0EsdUZBQXVGLE1BQ3JGLEdBQ0YsQ0FDRjtFQUNBLHNCQUFzQixpQkFBaUI7R0FDckM7R0FDQTtHQUNBO0dBQ0E7RUFDRixDQUFDO0VBQ0Qsc0JBQ0Usb0JBQ0EsMkRBQTJELE1BQU0sR0FBRyxDQUN0RTtFQUNBLHNCQUNFLHNCQUNBLDZEQUE2RCxNQUFNLEdBQUcsQ0FDeEU7RUFDQSxzQkFDRSx1QkFDQSw4REFBOEQsTUFBTSxHQUFHLENBQ3pFO0VBQ0EsSUFBSSxrQkFDQSw2TkFBNk4sTUFDM04sR0FDRixHQUNGLHFCQUFxQixJQUFJLElBQ3ZCLGlFQUNHLE1BQU0sR0FBRyxDQUFDLENBQ1YsT0FBTyxlQUFlLENBQzNCLEdBQ0Esa0JBQWtCLG9CQUFvQixLQUFLLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQ3hFLGtDQUFrQyxDQUFDLEdBQ25DLGtDQUFrQyxDQUFDLEdBQ25DLHdCQUF3QixDQUFDLEdBQ3pCLHdCQUF3QixDQUFDLEdBQ3pCLDBCQUEwQixDQUFDLEdBQzNCLDBCQUEwQixDQUFDLEdBQzNCLDZCQUE2QixDQUFDO0VBQ2hDLElBQUksMENBQTBDLENBQUM7RUFDL0MsSUFBSSwyQkFBMkIsVUFDN0IsdUNBQXVDLGtCQUN2QyxpQkFBaUIsZ0NBQ2pCLGVBQWUsd0NBQ2YsYUFBYSxDQUFDLEdBQ2QsMkJBQ0Usb0VBQ0YsNkJBQTZCLDRCQUM3QixzQkFBc0IsS0FDdEIsb0JBQW9CLE1BQ3BCLHNCQUFzQixLQUN0QixvQkFBb0IsTUFDcEIsOEJBQThCLE1BQzlCLDZCQUE2QixNQUM3QiwrQkFBK0IsTUFDL0IsNkJBQTZCLFFBQzdCLDZCQUE2QixRQUM3Qiw2QkFBNkIsUUFDN0IseUJBQXlCLE1BQ3pCLDZCQUE2QixLQUM3QiwrQkFBK0IsV0FDL0IsUUFBUSxTQUNSLDJCQUEyQixHQUMzQiwwQkFBMEIsR0FDMUIsMkJBQTJCLEdBQzNCLGdCQUFnQixNQUNoQix1QkFBdUIsTUFDdkIsb0JBQW9CLENBQUMsR0FDckIsb0JBQW9CO0dBQUUsUUFBUSxDQUFDO0dBQUcsU0FBUyxDQUFDO0VBQUUsR0FDOUMsaUNBQWlDLE1BQ2pDLGlCQUFpQixLQUFLLEdBQ3RCLGtCQUFrQixlQUFlLE9BQU8sYUFBYSxhQUFhLEtB
15852QUssR0FDdkUsZ0JBQ0UsZUFBZSxPQUFPLGVBQWUsZUFBZSxLQUFLLEdBQzNELFlBQVksSUFDWixlQUFlLGVBQWUsT0FBTyxVQUFVLFVBQVUsS0FBSyxHQUM5RCw2QkFDRSxlQUFlLE9BQU8sd0JBQ2xCLHdCQUNBLGlCQUNOLG9CQUNFLGVBQWUsT0FBTyxpQkFDbEIsaUJBQ0EsZ0JBQWdCLE9BQU8sZUFDckIsU0FBVSxVQUFVO0dBQ2xCLE9BQU8sYUFDSixRQUFRLElBQUksQ0FBQyxDQUNiLEtBQUssUUFBUSxDQUFDLENBQ2QsTUFBTSxxQkFBcUI7RUFDaEMsSUFDQSxpQkFDUixtQ0FBbUM7RUFDckMsNEJBQTRCLFVBQVUsVUFBVSxTQUM5QyxXQUNBLFNBQ0E7R0FDQSxVQUNFLGFBQWEsT0FBTyxVQUNoQixFQUFFLFVBQVUsUUFBUSxJQUNwQixPQUFPLENBQUMsR0FBRyxPQUFPO0dBQ3hCLFFBQVEsZ0JBQWdCLEtBQUs7R0FDN0IsT0FBTyxLQUFLLE9BQU8sUUFBUSxXQUFXLE9BQU87RUFDL0M7RUFDQSw0QkFBNEIsVUFBVSxnQkFBZ0IsV0FBWTtHQUNoRSxLQUNFLElBQUksUUFBUSxLQUFLLFFBQ2YsV0FBVyxLQUFLLFdBQ2hCLGFBQWEsTUFBTSxjQUFjLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxHQUNoRCxTQUFTLENBQUMsR0FDVixJQUFJLEdBQ04sSUFBSSxXQUFXLFFBQ2YsS0FDQTtJQUNBLElBQUksU0FBUyxXQUFXLEVBQUUsQ0FBQztJQUMzQixTQUFTLFVBQ1AsT0FBTyxXQUFXLFNBQ2xCLE9BQU8sa0JBQWtCLFlBQ3pCLE9BQU8sS0FBSyxXQUFXLEVBQUU7R0FDN0I7R0FDQSxPQUFPO0VBQ1Q7RUFDQSw0QkFBNEIsVUFBVSxtQkFBbUIsV0FBWTtHQUNuRSxPQUFPLGlCQUFpQixLQUFLLFFBQVEsS0FBSyxTQUFTO0VBQ3JEO0VBQ0EsaUJBQWlCLFVBQVUsbUJBQW1CLFNBQzVDLE1BQ0EsVUFDQSxxQkFDQTtHQUNBLElBQUksU0FBUyxNQUNYLFVBQVU7R0FDWixJQUNFLFFBQVEsdUJBQ1IsY0FBYyxPQUFPLHdCQUNuQixTQUFTLG9CQUFvQixVQUFVLE1BQ3pDLFNBQVMsVUFBVSxPQUFPLFVBRTFCO0dBQ0YsU0FBUyxLQUFLLG9CQUFvQixLQUFLLGtCQUFrQixDQUFDO0dBQzFELElBQUksWUFBWSxLQUFLO0dBQ3JCLElBQ0UsT0FDQSxxQkFBcUIsV0FBVyxNQUFNLFVBQVUsbUJBQW1CLEdBQ25FO0lBQ0EsSUFBSSxtQkFBbUIsTUFDckIsbUJBQW1CO0lBQ3JCLFFBQVEsdUJBQ04sY0FBYyxPQUFPLHVCQUNyQixDQUFDLE1BQU0sb0JBQW9CLFNBQzFCLG1CQUFtQixTQUFVLE9BQU87S0FDbkMsaUJBQWlCLG9CQUNmLE1BQ0EsVUFDQSxtQkFDRjtLQUNBLGVBQWUsT0FBTyxXQUNsQixTQUFTLEtBQUssTUFBTSxLQUFLLElBQ3pCLFNBQVMsWUFBWSxLQUFLO0lBQ2hDO0lBQ0YsU0FBUyxXQUNMLFVBQVUsaUJBQWlCLG9CQUFvQixLQUMvQyxrQkFDQSxNQUNBLFVBQ0EsbUJBQ0YsR0FDQSxPQUFPLGlCQUFpQixTQUFTLFNBQVMsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQ3JELFVBQVUsT0FBTyxvQkFBb0IsS0FDcEMsUUFDQSxTQUNBLE9BQ0Y7SUFDRixTQUFTLGlCQUFpQixtQkFBbUI7SUFDN0MsVUFBVSxLQUFLO0tBQ1A7S0FDSTtLQUNXO0tBQ0g7S0FDVDtJQUNYLENBQUM7SUFDRCwwQ0FDRSxLQUFLLGdCQUNMLHlCQUNBLE1BQ0Esa0JBQ0EsTUFDRjtHQUNGO0dBQ0EsS0FBSyxrQkFBa0I7RUFDekI7RUFDQSxpQkFBaUIsVUFBVSxzQkFBc0IsU0FDL0MsTUFDQSxVQUNBLHFCQUNBO0dBQ0EsSUFBSSxZQUFZLEtBQUs7R0FDckIsSUFDRSxTQUFTLGNBQ1AsV0FBVyxxQkFDWCxXQUNBLE1BQ0EsVUFDQSxtQkFDRixHQUNBLE9BQU8sV0FDUDtJQUNBLElBQUksbUJBQW1CLFVBQVU7SUFDakMsc0JBQXNCLGlCQUFpQjtJQUN2QyxJQUFJLFVBQVUsaUJBQWlCO0lBQy9CLG1CQUFtQixpQkFDakIsaUJBQWlCLG1CQUNuQjtJQUNBLDBDQUNFLEtBQUssZ0JBQ0wsOEJBQ0EsTUFDQSxxQkFDQSxnQkFDRjtJQUNBLFVBQVUsT0FBTyxVQUFVLENBQUM7SUFDNUIsU0FBUyxXQUFXLFFBQVE7R0FDOUI7RUFDRjtFQUNBLGlCQUFpQixVQUFVLGdCQUFnQixTQUFVLE9BQU87R0FDMUQsSUFBSSxrQkFBa0IsMENBQ3BCLEtBQUssY0FDUDtHQUNBLElBQUksU0FBUyxpQkFBaUIsT0FBTyxDQUFDO0dBQ3RDLGtCQUFrQix5QkFBeUIsZUFBZTtHQUMxRCxJQUFJLGlCQUFpQixLQUFLO0dBQzFCLElBQ0csU0FBUyxrQkFBa0IsSUFBSSxlQUFlLFVBQy9DLENBQUMsTUFBTSxTQUNQO0lBQ0EsSUFBSSxPQUNGLE1BQU0sZ0JBQWdCLFdBQ2xCLGdCQUFnQixjQUFjLEVBQUUsSUFDaEMsU0FBUyxlQUFlLEVBQUU7SUFDaEMsSUFBSSxnQkFDRixLQUFLLElBQUksSUFBSSxHQUFHLElBQUksZUFBZSxRQUFRLEtBQUs7S0FDOUMsSUFBSSxvQkFBb0IsZUFBZTtLQUN2QyxLQUFLLGlCQUNILGtCQUFrQixNQUNsQixrQkFBa0Isa0JBQ2xCLGlCQUFpQixrQkFBa0IsbUJBQW1CLENBQ3hEO0lBQ0Y7SUFDRixnQkFBZ0IsWUFBWSxJQUFJO0lBQ2hDLFFBQVEsS0FBSyxjQUFjLEtBQUs7SUFDaEMsSUFBSSxnQkFDRixLQUFLLElBQUksR0FBRyxJQUFJLGVBQWUsUUFBUSxLQUNyQyxvQkFBcUIsZUFBZSxJQUNsQyxLQUFLLG9CQUNILGtCQUFrQixNQUNsQixrQkFBa0Isa0JBQ2xCLGlCQUFpQixrQkFBa0IsbUJBQW1CLENBQ3hEO0lBQ04sZ0JBQWdCLFlBQVksSUFBSTtJQUNoQyxPQUFPO0dBQ1Q7R0FDQSxPQUFPLGdCQUFnQixjQUFjLEtBQUs7RUFDNUM7RUFDQSxpQkFBaUIsVUFBVSxRQUFRLFNBQVUsY0FBYztHQUN6RCx5Q0FDRSxLQUFLLGVBQWUsT0FDcEIsQ0FBQyxHQUNELDRCQUNBLGNBQ0EsS0FBSyxHQUNMLEtBQUssQ0FDUDtFQUNGO0VBQ0EsaUJBQWlCLFVBQVUsWUFBWSxTQUFVLGNBQWM7R0FDN0QsSUFBSSxXQUFXLENBQUM7R0FDaEIseUNBQ0UsS0FBSyxlQUFlLE9BQ3BCLENBQUMsR0FDRCxpQkFDQSxVQUNBLEtBQUssR0FDTCxLQUFLLENBQ1A7R0FDQSxLQUNFLElBQUksSUFBSSxTQUFTLFNBQVMsR0FDMUIsS0FBSyxLQUFLLENBQUMsMkJBQTJCLFNBQVMsSUFBSSxZQUFZLEdBQy9EO0VBRUo7RUFDQSxpQkFBaUIsVUFBVSxPQUFPLFdBQVk7R0FDNUMsSUFBSSxrQkFBa0IsMENBQ3BCLEtBQUssY0FDUDtHQUNBLFNBQVMsb0JBQ0wsa0JBQWtCLHlCQUF5QixlQUFlLEdBQzNELGtCQUNDLGtDQUFrQyxlQUFlLENBQUMsQ0FBQyxlQUNyRCxTQUFTLG1CQUNQLDBDQUNFLEtBQUssZ0JBQ0wsaUNBQ0EsZUFDRjtFQUNOO0VBQ0EsaUJBQWlCLFVBQVUsZUFBZSxTQUFVLFVBQVU7
15852R0FDNUQsSUFBSSxVQUFVLENBQUMsR0FDYixhQUFhLENBQUM7R0FDaEIsMENBQ0UsS0FBSyxnQkFDTCxTQUFVLE9BQU87SUFDZixJQUFJLE1BQU0sTUFBTSxLQUFLLFVBQVUsQ0FBQztTQUMzQixPQUFRLGFBQWEsQ0FBQztJQUMzQixPQUFPLENBQUM7R0FDVixDQUNGO0dBQ0EsV0FDRSxDQUFDLGNBQ0QsUUFBUSxNQUNOLCtHQUNGO0dBQ0YsU0FBUyxLQUFLLGVBQWUsS0FBSyw2QkFBYSxJQUFJLElBQUk7R0FDdkQsS0FBSyxXQUFXLElBQUksUUFBUTtHQUM1QiwwQ0FDRSxLQUFLLGdCQUNMLGNBQ0EsUUFDRjtFQUNGO0VBQ0EsaUJBQWlCLFVBQVUsaUJBQWlCLFNBQVUsVUFBVTtHQUM5RCxJQUFJLFlBQVksS0FBSztHQUNyQixJQUFJLFNBQVMsYUFBYSxVQUFVLElBQUksUUFBUSxHQUFHO0lBQ2pELFVBQVUsT0FBTyxRQUFRO0lBQ3pCLDBDQUNFLEtBQUssZ0JBQ0wsZ0JBQ0EsUUFDRjtJQUNBLEtBQ0UsSUFBSSxJQUFLLFlBQVksR0FDckIsSUFBSSw4QkFBOEIsUUFDbEMsS0FDQTtLQUNBLElBQUksVUFBVSw4QkFBOEI7S0FDNUMsUUFBUSxxQkFBcUIsUUFBUSxRQUFRLGFBQWEsV0FDdEQsU0FBUyxVQUFVLFFBQVEsUUFBUSxJQUNsQyw4QkFBOEIsZUFBZTtJQUNwRDtJQUNBLDhCQUE4QixTQUFTO0dBQ3pDLE9BQ0UsUUFBUSxNQUNOLHlKQUNGO0VBQ0o7RUFDQSxJQUFJLGdDQUFnQyxDQUFDLEdBQ25DLGlDQUFpQyxDQUFDO0VBQ3BDLGlCQUFpQixVQUFVLGlCQUFpQixXQUFZO0dBQ3RELElBQUksUUFBUSxDQUFDO0dBQ2IsMENBQ0UsS0FBSyxnQkFDTCxvQkFDQSxLQUNGO0dBQ0EsT0FBTztFQUNUO0VBQ0EsaUJBQWlCLFVBQVUsY0FBYyxTQUFVLG9CQUFvQjtHQUNyRSxJQUFJLGtCQUFrQiwwQ0FDcEIsS0FBSyxjQUNQO0dBQ0EsT0FBTyxTQUFTLGtCQUNaLE9BQ0EseUJBQXlCLGVBQWUsQ0FBQyxDQUFDLFlBQ3hDLGtCQUNGO0VBQ047RUFDQSxpQkFBaUIsVUFBVSwwQkFBMEIsU0FBVSxXQUFXO0dBQ3hFLElBQUksa0JBQWtCLDBDQUNwQixLQUFLLGNBQ1A7R0FDQSxJQUFJLFNBQVMsaUJBQWlCLE9BQU8sS0FBSztHQUMxQyxJQUFJLFdBQVcsQ0FBQztHQUNoQiwwQ0FDRSxLQUFLLGdCQUNMLGlCQUNBLFFBQ0Y7R0FDQSxJQUFJLHFCQUFxQix5QkFBeUIsZUFBZTtHQUNqRSxJQUFJLE1BQU0sU0FBUyxRQUFRO0lBQ3pCLGtCQUFrQjtJQUNsQixJQUFJLHdCQUF3QixLQUFLLGNBQWMsR0FBRztLQUNoRCxHQUFHO01BQ0QsS0FBSyxXQUFXLEtBQUssZUFBZSxRQUFRLFNBQVMsV0FBWTtPQUMvRCxJQUFJLE1BQU0sU0FBUyxLQUFLO1FBQ3RCLFdBQVcsU0FBUyxVQUFVO1FBQzlCLE1BQU07T0FDUjtPQUNBLElBQ0UsTUFBTSxTQUFTLE9BQ2YsTUFBTSxTQUFTLE9BQ2YsT0FBTyxTQUFTLEtBRWhCO09BQ0YsV0FBVyxTQUFTO01BQ3RCO01BQ0EsV0FBVztLQUNiO0tBQ0EsUUFBUSxhQUFhLGtCQUFrQjtJQUN6QztJQUNBLFdBQVcsS0FBSztJQUNoQixJQUFJLFNBQVUscUJBQ1osZ0JBQWdCLHdCQUF3QixTQUFTO0lBQ25ELG9CQUFvQixZQUNmLFNBQVMsS0FBSyw2QkFDZixxQkFBcUIsS0FBSyxtQ0FDeEIsV0FDQSwwQ0FBMEMsUUFBUSxDQUFDLENBQUMsSUFDdEQsU0FBUyxXQUNKLFNBQVMsS0FBSywrQkFDYixZQUNBLHlCQUF5QixRQUFRLENBQUMsQ0FBQyx3QkFDakMsU0FDRixHQUNELFNBQ0MsTUFBTSxhQUNOLFlBQVksS0FBSyw4QkFDYixLQUFLLDhCQUNMLEtBQUs7SUFDbkIsT0FBUSxVQUFVLEtBQUs7R0FDekI7R0FDQSxrQkFBa0IseUJBQXlCLFNBQVMsRUFBRTtHQUN0RCxTQUFTLHlCQUF5QixTQUFTLFNBQVMsU0FBUyxFQUFFO0dBQy9ELElBQUksNEJBQTRCLHdCQUM5QixLQUFLLGNBQ1AsSUFDSSxnQkFBZ0IsZ0JBQ2hCO0dBQ0osSUFBSSxRQUFRLDJCQUNWLE9BQU8sS0FBSztHQUNkLHFCQUNFLDBCQUEwQix3QkFBd0IsZUFBZSxJQUNqRSxLQUFLO0dBQ1AsNEJBQ0UsMEJBQTBCLHdCQUF3QixNQUFNLElBQ3hELEtBQUs7R0FDUCxJQUFJLGNBQWMsZ0JBQWdCLHdCQUF3QixTQUFTLEdBQ2pFLGFBQWEsT0FBTyx3QkFBd0IsU0FBUyxHQUNyRCxvQ0FDRSxjQUFjLEtBQUssa0NBQ25CLGFBQWEsS0FBSztHQUN0QixhQUNFLHNCQUNBLDZCQUNBLGNBQWMsS0FBSywrQkFDbkIsYUFBYSxLQUFLO0dBQ3BCLGtCQUNHLHNCQUFzQixvQkFBb0IsYUFDMUMsNkJBQTZCLFdBQVcsYUFDekMscUNBQ0EsYUFDSSxLQUFLLGlDQUNKLENBQUMsc0JBQXNCLG9CQUFvQixhQUN6QyxDQUFDLDZCQUE2QixXQUFXLFlBQzFDLEtBQUssNENBQ0w7R0FDUixPQUFPLGtCQUFrQixLQUFLLGtDQUM1QixrQkFBa0IsS0FBSyw2Q0FDdkIsc0NBQ0UsaUJBQ0EsS0FBSyxnQkFDTCxTQUFTLElBQ1QsU0FBUyxTQUFTLFNBQVMsSUFDM0IsU0FDRixJQUNFLGtCQUNBLEtBQUs7RUFDWDtFQUNBLGlCQUFpQixVQUFVLGlCQUFpQixTQUFVLFlBQVk7R0FDaEUsSUFBSSxhQUFhLE9BQU8sWUFDdEIsTUFBTSxNQUNKLCtHQUNGO0dBQ0YsSUFBSSxXQUFXLENBQUM7R0FDaEIsMENBQ0UsS0FBSyxnQkFDTCxpQkFDQSxRQUNGO0dBQ0EsSUFBSSxxQkFBcUIsQ0FBQyxNQUFNO0dBQ2hDLElBQUksTUFBTSxTQUFTLFFBQVE7SUFDekIsSUFBSSxlQUFlLDBDQUNqQixLQUFLLGNBQ1A7SUFDQSxlQUFlLHFCQUNYLGFBQWEsTUFDYixhQUFhLE1BQ2IsMENBQTBDLEtBQUssY0FBYyxJQUM3RCxhQUFhLE1BQU0sYUFBYTtJQUNwQyxJQUFJLFNBQVMsY0FBYztJQUMzQixJQUFJLE1BQU0sYUFBYSxLQUFLO0tBQzFCLGFBQWEseUJBQXlCLFlBQVk7S0FDbEQsdUJBQXVCLFlBQVksa0JBQWtCO0tBQ3JEO0lBQ0Y7SUFDQSxlQUFlLHlCQUF5QixZQUFZO0lBQ3BELElBQUksTUFBTSxhQUFhLFVBQVU7S0FDL0IsSUFBSSxPQUFPLGFBQWEsVUFBVTtNQUNoQyxxQkFDRSxVQUFVLGVBQWUsYUFBYSxPQUFPO01BQy9DLFNBQVMscUJBQ0wsbUJBQW1CLGVBQWUsVUFBVSxJQUM1QyxRQUFRLEtBQ04sbUlBQ0Y7TUFDSjtLQUNGO0tBQ0EsYUFBYSxlQUFlLFVBQVU7SUFDeEM7R0FDRjtHQUNBLEtBQ0UsZUFBZSxxQkFBcUIsU0FBUyxTQUFTLElBQUksR0FDMUQsa0JBQWtCLHFCQUFxQixLQUFLLFNBQVMsVUFFckQ7SUFDQSxJQUFJLFFBQVEsU0FBUztJQUNyQixNQUFNLE1BQU0sT0FDTixRQUFRLHlCQUF5QixLQUFLLEdBQ3hDLHVCQUF1QixPQUFPLGtCQUFrQixLQUNoRCx5QkFBeUIsS0FBSyxDQUFDLENBQUMsZUFBZSxVQUFVO0lBQzdELGdCQUFnQixxQkFBcUIsS0FBSztHQUM1QztFQUNGO0VBQ0EsSUFBSSw4Q0FBOEMsTUFDaEQsWUFBWSxHQUNaLFNBQVMsR0FDVCxVQUFVLEdBQ1YsVUFBVSxHQUNWLFdBQVcsR0FDWCxrQ0FBa0IsSUFBSSxJQUFJLEdBQzFCLGlDQUFpQixJQUFJLElBQUksR0FDekIscUJBQXFCLHdCQUF3QjtFQUMvQyx3QkFBd0IsSUFBSTtHQUMxQixHQU
15852FHLFdBQVk7SUFDYixJQUFJLHVCQUF1QixtQkFBbUIsRUFBRSxHQUM5QyxlQUFlLGdCQUFnQjtJQUNqQyxPQUFPLHdCQUF3QjtHQUNqQztHQUNBLEdBQUcsU0FBVSxNQUFNO0lBQ2pCLElBQUksV0FBVyxvQkFBb0IsSUFBSTtJQUN2QyxTQUFTLFlBQVksTUFBTSxTQUFTLE9BQU8sV0FBVyxTQUFTLE9BQzNELG1CQUFtQixRQUFRLElBQzNCLG1CQUFtQixFQUFFLElBQUk7R0FDL0I7R0FDQSxHQUFHLFNBQVUsTUFBTTtJQUNqQixtQkFBbUIsRUFBRSxJQUFJO0lBQ3pCLGFBQWEsZ0JBQWdCLE1BQU0sSUFBSTtHQUN6QztHQUNBLEdBQUcsU0FBVSxNQUFNLGFBQWE7SUFDOUIsbUJBQW1CLEVBQUUsTUFBTSxXQUFXO0lBQ3RDLGFBQWEsY0FBYyxNQUFNLFdBQVc7R0FDOUM7R0FDQSxHQUFHLFNBQVUsTUFBTSxJQUFJLFNBQVM7SUFDOUIsbUJBQW1CLEVBQUUsTUFBTSxJQUFJLE9BQU87SUFDdEMsSUFBSSxnQkFBZ0I7SUFDcEIsSUFBSSxpQkFBaUIsUUFBUSxJQUFJO0tBQy9CLElBQUksa0JBQ0YsZ0NBQ0EsK0NBQStDLEVBQUUsSUFDakQ7S0FDRixZQUFZLEtBQ1IsV0FBVyxRQUFRLGVBQ2YsbUJBQ0Esb0JBQ0EsK0NBQ0UsUUFBUSxXQUNWLElBQ0EsT0FDRixhQUFhLE9BQU8sUUFBUSxlQUN6QixtQkFDQyxtQkFDQSwrQ0FDRSxRQUFRLFVBQ1YsSUFDQSxVQUNILG1CQUNDLGFBQ0EsK0NBQStDLElBQUksSUFDbkQsUUFDSCxtQkFDQyxhQUNBLCtDQUErQyxJQUFJLElBQ25EO0tBQ04sSUFBSSxNQUFNO0tBQ1YsUUFBUSxJQUFSO01BQ0UsS0FBSztPQUNILE1BQU0sWUFBWSxJQUFJO09BQ3RCO01BQ0YsS0FBSyxVQUNILE1BQU0sYUFBYSxJQUFJO0tBQzNCO0tBQ0EsSUFDRSxFQUNFLGdCQUFnQixJQUFJLEdBQUcsTUFDckIsT0FBTyxPQUNQO01BQ0UsS0FBSztNQUNMLE1BQ0UsWUFBWSxNQUFNLFdBQVcsUUFBUSxjQUNqQyxLQUFLLElBQ0w7TUFDRjtLQUNOLEdBQ0EsT0FDRixHQUNBLGdCQUFnQixJQUFJLEtBQUssSUFBSSxHQUM3QixTQUFTLGNBQWMsY0FBYyxlQUFlLEtBQ2pELFlBQVksTUFDWCxjQUFjLGNBQ1osNkJBQTZCLEdBQUcsQ0FDbEMsS0FDRCxhQUFhLE1BQ1osY0FBYyxjQUFjLHlCQUF5QixHQUFHLENBQUMsS0FFL0Q7TUFDQSxJQUFJLFdBQVcsY0FBYyxjQUFjLE1BQU07TUFDakQscUJBQXFCLFVBQVUsUUFBUSxJQUFJO01BQzNDLFlBQVksT0FDUixTQUFTLDBCQUEwQixDQUFDLEdBQ3JDLFNBQVMsU0FBUyxTQUFTLFVBQzFCLFdBQVk7T0FDVix1QkFBdUIsUUFBUTtNQUNqQztNQUNKLG9CQUFvQixRQUFRO01BQzVCLGNBQWMsS0FBSyxZQUFZLFFBQVE7S0FDekM7SUFDRjtHQUNGO0dBQ0EsR0FBRyxTQUFVLE1BQU0sU0FBUztJQUMxQixtQkFBbUIsRUFBRSxNQUFNLE9BQU87SUFDbEMsSUFBSSxnQkFBZ0I7SUFDcEIsSUFBSSxpQkFBaUIsTUFBTTtLQUN6QixJQUFJLEtBQ0EsV0FBVyxhQUFhLE9BQU8sUUFBUSxLQUFLLFFBQVEsS0FBSyxVQUMzRCxrQkFDRSxzQ0FDQSwrQ0FBK0MsRUFBRSxJQUNqRCxnQkFDQSwrQ0FBK0MsSUFBSSxJQUNuRCxPQUNGLE1BQU07S0FDUixRQUFRLElBQVI7TUFDRSxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUs7TUFDTCxLQUFLO01BQ0wsS0FBSztNQUNMLEtBQUssVUFDSCxNQUFNLGFBQWEsSUFBSTtLQUMzQjtLQUNBLElBQ0UsQ0FBQyxnQkFBZ0IsSUFBSSxHQUFHLE1BQ3RCLE9BQU8sT0FBTztNQUFFLEtBQUs7TUFBdUI7S0FBSyxHQUFHLE9BQU8sR0FDN0QsZ0JBQWdCLElBQUksS0FBSyxJQUFJLEdBQzdCLFNBQVMsY0FBYyxjQUFjLGVBQWUsSUFDcEQ7TUFDQSxRQUFRLElBQVI7T0FDRSxLQUFLO09BQ0wsS0FBSztPQUNMLEtBQUs7T0FDTCxLQUFLO09BQ0wsS0FBSztPQUNMLEtBQUssVUFDSCxJQUFJLGNBQWMsY0FBYyx5QkFBeUIsR0FBRyxDQUFDLEdBQzNEO01BQ047TUFDQSxLQUFLLGNBQWMsY0FBYyxNQUFNO01BQ3ZDLHFCQUFxQixJQUFJLFFBQVEsSUFBSTtNQUNyQyxvQkFBb0IsRUFBRTtNQUN0QixjQUFjLEtBQUssWUFBWSxFQUFFO0tBQ25DO0lBQ0Y7R0FDRjtHQUNBLEdBQUcsU0FBVSxLQUFLLFNBQVM7SUFDekIsbUJBQW1CLEVBQUUsS0FBSyxPQUFPO0lBQ2pDLElBQUksZ0JBQWdCO0lBQ3BCLElBQUksaUJBQWlCLEtBQUs7S0FDeEIsSUFBSSxVQUFVLHFCQUFxQixhQUFhLENBQUMsQ0FBQyxrQkFDaEQsTUFBTSxhQUFhLEd
15852BQUcsR0FDdEIsV0FBVyxRQUFRLElBQUksR0FBRztLQUM1QixhQUNJLFdBQVcsY0FBYyxjQUN6Qix5QkFBeUIsR0FBRyxDQUM5QixHQUNBLGFBQ0ksTUFBTSxPQUFPO01BQU87TUFBSyxPQUFPLENBQUM7S0FBRSxHQUFHLE9BQU8sSUFDOUMsVUFBVSxnQkFBZ0IsSUFBSSxHQUFHLE1BQ2hDLDJCQUEyQixLQUFLLE9BQU8sR0FDeEMsV0FBVyxjQUFjLGNBQWMsUUFBUSxHQUNoRCxvQkFBb0IsUUFBUSxHQUM1QixxQkFBcUIsVUFBVSxRQUFRLEdBQUcsR0FDMUMsY0FBYyxLQUFLLFlBQVksUUFBUSxJQUN4QyxXQUFXO01BQ1YsTUFBTTtNQUNOLFVBQVU7TUFDVixPQUFPO01BQ1AsT0FBTztLQUNULEdBQ0EsUUFBUSxJQUFJLEtBQUssUUFBUTtJQUM3QjtHQUNGO0dBQ0EsR0FBRyxTQUFVLE1BQU0sWUFBWSxTQUFTO0lBQ3RDLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxPQUFPO0lBQzlDLElBQUksZ0JBQWdCO0lBQ3BCLElBQUksaUJBQWlCLE1BQU07S0FDekIsSUFBSSxTQUFTLHFCQUFxQixhQUFhLENBQUMsQ0FBQyxpQkFDL0MsTUFBTSxZQUFZLElBQUk7S0FDeEIsYUFBYSxjQUFjO0tBQzNCLElBQUksV0FBVyxPQUFPLElBQUksR0FBRztLQUM3QixJQUFJLENBQUMsVUFBVTtNQUNiLElBQUksUUFBUTtPQUFFLFNBQVM7T0FBVyxTQUFTO01BQUs7TUFDaEQsSUFDRyxXQUFXLGNBQWMsY0FDeEIsNkJBQTZCLEdBQUcsQ0FDbEMsR0FFQSxNQUFNLFVBQVUsU0FBUztXQUN0QjtPQUNILE9BQU8sT0FDTDtRQUNFLEtBQUs7UUFDQztRQUNOLG1CQUFtQjtPQUNyQixHQUNBLE9BQ0Y7T0FDQSxDQUFDLFVBQVUsZ0JBQWdCLElBQUksR0FBRyxNQUNoQywrQkFBK0IsTUFBTSxPQUFPO09BQzlDLElBQUksT0FBUSxXQUFXLGNBQWMsY0FBYyxNQUFNO09BQ3pELG9CQUFvQixJQUFJO09BQ3hCLHFCQUFxQixNQUFNLFFBQVEsSUFBSTtPQUN2QyxLQUFLLEtBQUssSUFBSSxRQUFRLFNBQVUsU0FBUyxRQUFRO1FBQy9DLEtBQUssU0FBUztRQUNkLEtBQUssVUFBVTtPQUNqQixDQUFDO09BQ0QsS0FBSyxpQkFBaUIsUUFBUSxXQUFZO1FBQ3hDLE1BQU0sV0FBVztPQUNuQixDQUFDO09BQ0QsS0FBSyxpQkFBaUIsU0FBUyxXQUFZO1FBQ3pDLE1BQU0sV0FBVztPQUNuQixDQUFDO09BQ0QsTUFBTSxXQUFXO09BQ2pCLGlCQUFpQixVQUFVLFlBQVksYUFBYTtNQUN0RDtNQUNBLFdBQVc7T0FDVCxNQUFNO09BQ04sVUFBVTtPQUNWLE9BQU87T0FDQTtNQUNUO01BQ0EsT0FBTyxJQUFJLEtBQUssUUFBUTtLQUMxQjtJQUNGO0dBQ0Y7R0FDQSxHQUFHLFNBQVUsS0FBSyxTQUFTO0lBQ3pCLG1CQUFtQixFQUFFLEtBQUssT0FBTztJQUNqQyxJQUFJLGdCQUFnQjtJQUNwQixJQUFJLGlCQUFpQixLQUFLO0tBQ3hCLElBQUksVUFBVSxxQkFBcUIsYUFBYSxDQUFDLENBQUMsa0JBQ2hELE1BQU0sYUFBYSxHQUFHLEdBQ3RCLFdBQVcsUUFBUSxJQUFJLEdBQUc7S0FDNUIsYUFDSSxXQUFXLGNBQWMsY0FDekIseUJBQXlCLEdBQUcsQ0FDOUIsR0FDQSxhQUNJLE1BQU0sT0FBTztNQUFPO01BQUssT0FBTyxDQUFDO01BQUcsTUFBTTtLQUFTLEdBQUcsT0FBTyxJQUM5RCxVQUFVLGdCQUFnQixJQUFJLEdBQUcsTUFDaEMsMkJBQTJCLEtBQUssT0FBTyxHQUN4QyxXQUFXLGNBQWMsY0FBYyxRQUFRLEdBQ2hELG9CQUFvQixRQUFRLEdBQzVCLHFCQUFxQixVQUFVLFFBQVEsR0FBRyxHQUMxQyxjQUFjLEtBQUssWUFBWSxRQUFRLElBQ3hDLFdBQVc7TUFDVixNQUFNO01BQ04sVUFBVTtNQUNWLE9BQU87TUFDUCxPQUFPO0tBQ1QsR0FDQSxRQUFRLElBQUksS0FBSyxRQUFRO0lBQzdCO0dBQ0Y7RUFDRjtFQUNBLElBQUksaUJBQWlCLGdCQUFnQixPQUFPLFdBQVcsT0FBTyxVQUM1RCxZQUFZLE1BQ1osK0JBQStCLEtBQy9CLDBCQUEwQixLQUMxQixnQ0FBZ0MsS0FDaEMsNEJBQTRCLEdBQzVCLGtCQUFrQixNQUNsQixvQkFBb0IsTUFDcEIsdUJBQXVCLFlBQ3ZCLHdCQUF3QjtHQUN0QixVQUFVO0dBQ1YsVUFBVTtHQUNWLFVBQVU7R0FDVixlQUFlO0dBQ2YsZ0JBQWdCO0dBQ2hCLGNBQWM7RUFDaEIsR0FDQSxjQUFjLFVBQ2QsYUFDRSw2SkFDRixhQUFhLElBQ2IsTUFBTSxLQUNOLE9BQU8sU0FBUyxVQUFVO0VBQzVCLElBQUksNEJBQTRCLENBQUM7RUFDakMsSUFBSSxvQkFBb0IsTUFDdEIsOEJBQThCLE1BQzlCLDhCQUE4QixNQUM5QixnQkFBZ0IsTUFDaEIsMEJBQTBCLE1BQzFCLDBCQUEwQixNQUMxQixpQkFBaUIsTUFDakIsZ0JBQWdCLE1BQ2hCLGtCQUFrQixNQUNsQixxQkFBcUI7RUFDdkIsb0JBQW9CLFNBQVUsT0FBTyxJQUFJLE1BQU0sT0FBTztHQUNwRCxLQUFLLFNBQVMsT0FBTyxFQUFFO0dBQ3ZCLFNBQVMsT0FDTCxPQUFPLGdCQUFnQixHQUFHLGVBQWUsTUFBTSxHQUFHLEtBQUssR0FDeEQsR0FBRyxnQkFBZ0IsTUFDbkIsR0FBRyxZQUFZLE1BQ2YsTUFBTSxnQkFBZ0IsT0FBTyxDQUFDLEdBQUcsTUFBTSxhQUFhLEd
15852BQ3BELE9BQU8sK0JBQStCLE9BQU8sQ0FBQyxHQUMvQyxTQUFTLFFBQVEsc0JBQXNCLE1BQU0sT0FBTyxDQUFDO0VBQ3pEO0VBQ0EsOEJBQThCLFNBQVUsT0FBTyxJQUFJLE1BQU07R0FDdkQsS0FBSyxTQUFTLE9BQU8sRUFBRTtHQUN2QixTQUFTLE9BQ0wsT0FBTyxtQkFBbUIsR0FBRyxlQUFlLE1BQU0sQ0FBQyxHQUNwRCxHQUFHLGdCQUFnQixNQUNuQixHQUFHLFlBQVksTUFDZixNQUFNLGdCQUFnQixPQUFPLENBQUMsR0FBRyxNQUFNLGFBQWEsR0FDcEQsT0FBTywrQkFBK0IsT0FBTyxDQUFDLEdBQy9DLFNBQVMsUUFBUSxzQkFBc0IsTUFBTSxPQUFPLENBQUM7RUFDekQ7RUFDQSw4QkFBOEIsU0FBVSxPQUFPLElBQUksU0FBUyxTQUFTO0dBQ25FLEtBQUssU0FBUyxPQUFPLEVBQUU7R0FDdkIsU0FBUyxPQUNMLFVBQVUsZUFBZSxHQUFHLGVBQWUsU0FBUyxPQUFPLEdBQzVELEdBQUcsZ0JBQWdCLFNBQ25CLEdBQUcsWUFBWSxTQUNmLE1BQU0sZ0JBQWdCLE9BQU8sQ0FBQyxHQUFHLE1BQU0sYUFBYSxHQUNwRCxVQUFVLCtCQUErQixPQUFPLENBQUMsR0FDbEQsU0FBUyxXQUFXLHNCQUFzQixTQUFTLE9BQU8sQ0FBQztFQUMvRDtFQUNBLGdCQUFnQixTQUFVLE9BQU8sTUFBTSxPQUFPO0dBQzVDLE1BQU0sZUFBZSxnQkFBZ0IsTUFBTSxlQUFlLE1BQU0sR0FBRyxLQUFLO0dBQ3hFLE1BQU0sY0FBYyxNQUFNLFVBQVUsZUFBZSxNQUFNO0dBQ3pELE9BQU8sK0JBQStCLE9BQU8sQ0FBQztHQUM5QyxTQUFTLFFBQVEsc0JBQXNCLE1BQU0sT0FBTyxDQUFDO0VBQ3ZEO0VBQ0EsMEJBQTBCLFNBQVUsT0FBTyxNQUFNO0dBQy9DLE1BQU0sZUFBZSxtQkFBbUIsTUFBTSxlQUFlLE1BQU0sQ0FBQztHQUNwRSxNQUFNLGNBQWMsTUFBTSxVQUFVLGVBQWUsTUFBTTtHQUN6RCxPQUFPLCtCQUErQixPQUFPLENBQUM7R0FDOUMsU0FBUyxRQUFRLHNCQUFzQixNQUFNLE9BQU8sQ0FBQztFQUN2RDtFQUNBLDBCQUEwQixTQUFVLE9BQU8sU0FBUyxTQUFTO0dBQzNELE1BQU0sZUFBZSxlQUNuQixNQUFNLGVBQ04sU0FDQSxPQUNGO0dBQ0EsTUFBTSxjQUFjLE1BQU0sVUFBVSxlQUFlLE1BQU07R0FDekQsVUFBVSwrQkFBK0IsT0FBTyxDQUFDO0dBQ2pELFNBQVMsV0FBVyxzQkFBc0IsU0FBUyxPQUFPLENBQUM7RUFDN0Q7RUFDQSxpQkFBaUIsU0FBVSxPQUFPO0dBQ2hDLElBQUksT0FBTywrQkFBK0IsT0FBTyxDQUFDO0dBQ2xELFNBQVMsUUFBUSxzQkFBc0IsTUFBTSxPQUFPLENBQUM7RUFDdkQ7RUFDQSxnQkFBZ0IsU0FBVSxPQUFPO0dBQy9CLElBQUksT0FBTyxtQkFBbUIsR0FDNUIsT0FBTywrQkFBK0IsT0FBTyxJQUFJO0dBQ25ELFNBQVMsUUFBUSxzQkFBc0IsTUFBTSxPQUFPLElBQUk7RUFDMUQ7RUFDQSxrQkFBa0IsU0FBVSxvQkFBb0I7R0FDOUMsa0JBQWtCO0VBQ3BCO0VBQ0EscUJBQXFCLFNBQVUsc0JBQXNCO0dBQ25ELG9CQUFvQjtFQUN0QjtFQUNBLElBQUksV0FBVyxDQUFDLEdBQ2Qsb0JBQW9CLE1BQ3BCLDRCQUE0QixDQUFDLEdBQzdCLGNBQWMsTUFDZCxhQUFhLE1BQ2IsY0FBYyxNQUNkLGlDQUFpQixJQUFJLElBQUksR0FDekIsd0NBQXdCLElBQUksSUFBSSxHQUNoQyxpQ0FBaUMsQ0FBQyxHQUNsQywyQkFDRSxzUEFBc1AsTUFDcFAsR0FDRixHQUNGLDJCQUEyQjtFQUM3QixzQkFBc0IsVUFBVSxTQUFTLGFBQWEsVUFBVSxTQUM5RCxTQUFVLFVBQVU7R0FDbEIsSUFBSSxPQUFPLEtBQUs7R0FDaEIsSUFBSSxTQUFTLE1BQU0sTUFBTSxNQUFNLGtDQUFrQztHQUNqRSxJQUFJLE9BQU87R0FDWCxlQUFlLE9BQU8sS0FBSyxLQUN2QixRQUFRLE1BQ04sMklBQ0YsSUFDQSxpQkFBaUIsS0FBSyxFQUFFLElBQ3RCLFFBQVEsTUFDTixvSkFDRixJQUNBLGdCQUFnQixPQUFPLEtBQUssTUFDNUIsUUFBUSxNQUNOLG9GQUNGO0dBQ04sT0FBTztHQUNQLElBQUksVUFBVSxLQUFLO0dBRW5CLG9CQUFvQixTQURYLGtCQUFrQixPQUNLLEdBQUcsTUFBTSxNQUFNLE1BQU0sSUFBSTtFQUMzRDtFQUNGLHNCQUFzQixVQUFVLFVBQVUsYUFBYSxVQUFVLFVBQy9ELFdBQVk7R0FDVixJQUFJLE9BQU87R0FDWCxlQUFlLE9BQU8sS0FBSyxNQUN6QixRQUFRLE1BQ04sa0lBQ0Y7R0FDRixPQUFPLEtBQUs7R0FDWixJQUFJLFNBQVMsTUFBTTtJQUNqQixLQUFLLGdCQUFnQjtJQUNyQixJQUFJLFlBQVksS0FBSztJQUNyQixDQUFDLG9CQUFvQixnQkFBZ0Isb0JBQW9CLGFBQ3ZELFFBQVEsTUFDTixrTUFDRjtJQUNGLG9CQUFvQixLQUFLLFNBQVMsR0FBRyxNQUFNLE1BQU0sTUFBTSxJQUFJO0lBQzNELGdCQUFnQjtJQUNoQixVQUFVLGdDQUFnQztHQUM1QztFQUNGO0VBQ0Ysc0JBQXNCLFVBQVUsNkJBQTZCLFNBQzNELFFBQ0E7R0FDQSxJQUFJLFFBQVE7SUFDVixJQUFJLGlCQUFpQixzQkFBc0I7SUFDM0MsU0FBUztLQUFFLFdBQVc7S0FBYztLQUFRLFVBQVU7SUFBZTtJQUNyRSxLQUNFLElBQUksSUFBSSxHQUNSLElBQUksK0JBQStCL
15852FVBQ25DLE1BQU0sa0JBQ04saUJBQWlCLCtCQUErQixFQUFFLENBQUMsVUFDbkQ7SUFFRiwrQkFBK0IsT0FBTyxHQUFHLEdBQUcsTUFBTTtJQUNsRCxNQUFNLEtBQUssK0JBQStCLE1BQU07R0FDbEQ7RUFDRjtFQUNBLENBQUMsV0FBWTtHQUNYLElBQUksZ0NBQWdDLE1BQU07R0FDMUMsSUFBSSxhQUFhLCtCQUNmLE1BQU0sTUFDSiw0SUFDRyxnQ0FDQyxvRkFDTjtFQUNKLEVBQUEsQ0FBRztFQUNILGVBQWdCLE9BQU8sT0FDckIsUUFBUSxJQUFJLGFBQ1osZUFBZSxPQUFPLElBQUksVUFBVSxXQUNwQyxlQUFlLE9BQU8sT0FDdEIsUUFBUSxJQUFJLGFBQ1osZUFBZSxPQUFPLElBQUksVUFBVSxTQUNwQyxlQUFlLE9BQU8sSUFBSSxVQUFVLFdBQ3BDLFFBQVEsTUFDTiwySUFDRjtFQUNGLHdCQUF3QixjQUFjLFNBQVUsb0JBQW9CO0dBQ2xFLElBQUksUUFBUSxtQkFBbUI7R0FDL0IsSUFBSSxLQUFLLE1BQU0sT0FBTztJQUNwQixJQUFJLGVBQWUsT0FBTyxtQkFBbUIsUUFDM0MsTUFBTSxNQUFNLGdEQUFnRDtJQUM5RCxxQkFBcUIsT0FBTyxLQUFLLGtCQUFrQixDQUFDLENBQUMsS0FBSyxHQUFHO0lBQzdELE1BQU0sTUFDSix3REFDRSxrQkFDSjtHQUNGO0dBQ0EscUJBQXFCLDhCQUE4QixLQUFLO0dBQ3hELHFCQUNFLFNBQVMscUJBQ0wseUJBQXlCLGtCQUFrQixJQUMzQztHQUNOLHFCQUNFLFNBQVMscUJBQXFCLE9BQU8sbUJBQW1CO0dBQzFELE9BQU87RUFDVDtFQUNBLElBQ0UsRUFBRSxXQUFZO0dBQ1osSUFBSSxZQUFZO0lBQ2QsWUFBWTtJQUNaLFNBQVM7SUFDVCxxQkFBcUI7SUFDckIsc0JBQXNCO0lBQ3RCLG1CQUFtQjtHQUNyQjtHQUNBLFVBQVUsb0JBQW9CO0dBQzl
15852CLFVBQVUsOEJBQThCO0dBQ3hDLFVBQVUsOEJBQThCO0dBQ3hDLFVBQVUsZ0JBQWdCO0dBQzFCLFVBQVUsMEJBQTBCO0dBQ3BDLFVBQVUsMEJBQTBCO0dBQ3BDLFVBQVUsaUJBQWlCO0dBQzNCLFVBQVUsZ0JBQWdCO0dBQzFCLFVBQVUsa0JBQWtCO0dBQzVCLFVBQVUscUJBQXFCO0dBQy9CLFVBQVUsa0JBQWtCO0dBQzVCLFVBQVUsZUFBZTtHQUN6QixVQUFVLG9CQUFvQjtHQUM5QixVQUFVLGtCQUFrQjtHQUM1QixPQUFPLGdCQUFnQixTQUFTO0VBQ2xDLEVBQUEsQ0FBRyxLQUNILGFBQ0EsT0FBTyxRQUFRLE9BQU8sU0FDcEIsS0FBSyxVQUFVLFVBQVUsUUFBUSxRQUFRLEtBQ3pDLE9BQU8sVUFBVSxVQUFVLFFBQVEsTUFBTSxLQUN6QyxLQUFLLFVBQVUsVUFBVSxRQUFRLFNBQVMsSUFDNUM7R0FDQSxJQUFJLFdBQVcsT0FBTyxTQUFTO0dBQy9CLG1CQUFtQixLQUFLLFFBQVEsS0FDOUIsUUFBUSxLQUNOLDhHQUNHLFlBQVksV0FDVCxnSEFDQSxLQUNOLGtCQUNGO0VBQ0o7RUFDQSxRQUFRLGFBQWEsU0FBVSxXQUFXLFNBQVM7R0FDakQsSUFBSSxDQUFDLGlCQUFpQixTQUFTLEdBQzdCLE1BQU0sTUFBTSx3Q0FBd0M7R0FDdEQsNkJBQTZCLFNBQVM7R0FDdEMsSUFBSSxlQUFlLENBQUMsR0FDbEIsbUJBQW1CLElBQ25CLGtCQUFrQix3QkFDbEIsZ0JBQWdCLHNCQUNoQixxQkFBcUI7R0FDdkIsU0FBUyxXQUNQLEtBQUssTUFBTSxZQUNWLFFBQVEsVUFDTCxRQUFRLEtBQ04sdUdBQ0YsSUFDQSxhQUFhLE9BQU8sV0FDcEIsU0FBUyxXQUNULFFBQVEsYUFBYSxzQkFDckIsUUFBUSxNQUNOLDJLQUNGLEdBQ0osQ0FBQyxNQUFNLFFBQVEsd0JBQXdCLGVBQWUsQ0FBQyxJQUN2RCxLQUFLLE1BQU0sUUFBUSxxQkFDaEIsbUJBQW1CLFFBQVEsbUJBQzlCLEtBQUssTUFBTSxRQUFRLG9CQUNoQixrQkFBa0IsUUFBUSxrQkFDN0IsS0FBSyxNQUFNLFFBQVEsa0JBQ2hCLGdCQUFnQixRQUFRLGdCQUMzQixLQUFLLE1BQU0sUUFBUSx1QkFDaEIscUJBQXFCLFF
15852BQVE7R0FDbEMsVUFBVSxnQkFDUixXQUNBLEdBQ0EsQ0FBQyxHQUNELE1BQ0EsTUFDQSxjQUNBLGtCQUNBLE1BQ0EsaUJBQ0EsZUFDQSxvQkFDQSxtQ0FDRjtHQUNBLFVBQVUsZ0NBQWdDLFFBQVE7R0FDbEQsMkJBQTJCLFNBQVM7R0FDcEMsT0FBTyxJQUFJLGFBQWEsT0FBTztFQUNqQztFQUNBLFFBQVEsY0FBYyxTQUFVLFdBQVcsaUJBQWlCLFNBQVM7R0FDbkUsSUFBSSxDQUFDLGlCQUFpQixTQUFTLEdBQzdCLE1BQU0sTUFBTSx3Q0FBd0M7R0FDdEQsNkJBQTZCLFNBQVM7R0FDdEMsS0FBSyxNQUFNLG1CQUNULFFBQVEsTUFDTixvSEFDRjtHQUNGLElBQUksZUFBZSxDQUFDLEdBQ2xCLG1CQUFtQixJQUNuQixrQkFBa0Isd0JBQ2xCLGdCQUFnQixzQkFDaEIscUJBQXFCLDJCQUNyQixZQUFZO0dBQ2QsU0FBUyxXQUNQLEtBQUssTUFBTSxZQUNWLENBQUMsTUFBTSxRQUFRLHdCQUF3QixlQUFlLENBQUMsSUFDeEQsS0FBSyxNQUFNLFFBQVEscUJBQ2hCLG1CQUFtQixRQUFRLG1CQUM5QixLQUFLLE1BQU0sUUFBUSxvQkFDaEIsa0JBQWtCLFFBQVEsa0JBQzdCLEtBQUssTUFBTSxRQUFRLGtCQUNoQixnQkFBZ0IsUUFBUSxnQkFDM0IsS0FBSyxNQUFNLFFBQVEsdUJBQ2hCLHFCQUFxQixRQUFRLHFCQUNoQyxLQUFLLE1BQU0sUUFBUSxjQUFjLFlBQVksUUFBUTtHQUN2RCxrQkFBa0IsZ0JBQ2hCLFdBQ0EsR0FDQSxDQUFDLEdBQ0QsaUJBQ0EsUUFBUSxVQUFVLFVBQVUsTUFDNUIsY0FDQSxrQkFDQSxXQUNBLGlCQUNBLGVBQ0Esb0JBQ0EsbUNBQ0Y7R0FDQSxnQkFBZ0IsVUFBVSxxQkFBcUIsSUFBSTtHQUNuRCxVQUFVLGdCQUFnQjtHQUMxQixlQUFlLGtCQUFrQixPQUFPO0dBQ3hDLGVBQWUsZ0NBQWdDLFlBQVk7R0FDM0QsbUJBQW1CLGFBQWEsWUFBWTtHQUM1QyxpQkFBaUIsV0FBVztHQUM1QixjQUFjLFNBQVMsa0JBQWtCLFlBQVk7R0FDckQsdUJBQXVCLGNBQWMsaUJBQWlCLElBQUk7R0FDMUQsVUFBVTtHQUNWLGdCQUFnQixRQUFRLFFBQVE7R0FDaEMsa0JBQWtCLGlCQUFpQixPQUFPO0dBQzFDLHNCQUFzQixlQUFlO0dBQ3JDLFVBQVUsZ0NBQWdDLGdCQUFnQjtHQUMxRCwyQkFBMkIsU0FBUztHQUNwQyxPQUFPLElBQUksc0JBQXNCLGVBQWU7RUFDbEQ7RUFDQSxRQUFRLFVBQVU7RUFDbEIsZ0JBQWdCLE9BQU8sa0NBQ3JCLGVBQ0UsT0FBTywrQkFBK0IsOEJBQ3hDLCtCQUErQiwyQkFBMkIsTUFBTSxDQUFDO0NBQ3JFLEVBQUEsQ0FBRzs7Ozs7Q0M1LzhCSCxPQUFPLFVBQUEscUNBQUEiLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMCwxLDIsM119

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.