Files
napseer-gateway/resources/scripts/napseer_mcp_server.py
T

7521 lines
1.2 MiB
Plaintext

#!/usr/bin/env python3
"""Local stdio MCP server for authenticated Napseer REST operations.
Run this on the agent machine. It keeps Napseer credentials local and exposes
MCP tools over stdin/stdout. The wrapper calls Napseer REST underneath.
Default credential file:
./.napseer/auth.json
Environment overrides:
NAPSEER_TOKEN=<bearer token>
NAPSEER_BASE_URL=https://api.napseer.com
NAPSEER_PROJECT_ID=<default project uuid>
auth.json shape:
{
"base_url": "https://api.napseer.com",
"token": "np_...",
"project_id": "PROJECT_UUID"
}
"""
import json
import base64
import getpass
import hashlib
import html
import hmac
import os
import pathlib
import queue
import random
import re
import secrets
import sqlite3
import socket
import ssl
import struct
import subprocess
import sys
import tempfile
import threading
import time
import urllib.error
import urllib.parse
import urllib.request
import uuid
import webbrowser
from datetime import datetime, timedelta, timezone
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
from napseer_spake2 import (
relay_aad,
relay_context_hash,
relay_key_from_secret,
spake2_gateway_finish,
)
try:
import fcntl
except ImportError: # pragma: no cover - Windows fallback
fcntl = None
class ReusableThreadingHTTPServer(ThreadingHTTPServer):
allow_reuse_address = True
def local_state_dir():
preferred = pathlib.Path.cwd() / ".napseer"
legacy = pathlib.Path.cwd() / "napseer"
if preferred.exists() or not legacy.exists():
return preferred
return legacy
def state_dir_status_payload():
preferred = pathlib.Path.cwd() / ".napseer"
legacy = pathlib.Path.cwd() / "napseer"
active = AUTH_DIR
if preferred.exists() and legacy.exists():
message = "Both .napseer and legacy napseer directories exist; .napseer is active."
elif active == legacy:
message = "Legacy napseer directory is active because .napseer does not exist."
else:
message = ".napseer directory is active."
return {
"active_state_dir": str(active),
"preferred_state_dir": str(preferred),
"legacy_state_dir": str(legacy),
"legacy_state_dir_active": active == legacy,
"preferred_state_dir_exists": preferred.exists(),
"legacy_state_dir_exists": legacy.exists(),
"state_dir_message": message,
}
AUTH_DIR = local_state_dir()
AUTH_PATH = AUTH_DIR / "auth.json"
VAULT_PATH = AUTH_DIR / "vault.json"
GATEWAY_RELAY_SECRET_PATH = AUTH_DIR / "gateway-relay-secret.json"
GATEWAY_RELAY_STATE_PATH = AUTH_DIR / "gateway-relay-state.json"
GATEWAY_SCHEDULES_PATH = AUTH_DIR / "gateway-schedules.json"
INDEX_PATH = AUTH_DIR / "index.sqlite"
INDEX_LOCK_PATH = AUTH_DIR / "index.lock"
DEFAULT_KEY_PATH = AUTH_DIR / "id_ed25519"
SCRIPT_PATH = pathlib.Path(__file__).resolve()
SCRIPT_NAME = SCRIPT_PATH.name
SCRIPT_DEPENDENCY_NAMES = ("napseer_spake2.py",)
CONTRACT_VERSION = "napseer.mcp.contract.v1"
AGENT_NAMESPACE = "/agents"
AGENT_STARTER_NODES = {
"profile": "Agent profile. Describe the agent's purpose, owner, and operating scope.",
"role": "Agent role. Define responsibilities, authority, and expected outputs.",
"personality": "Agent personality. Define communication style, judgment posture, and collaboration norms.",
"tools": "Tool policy. List preferred tools, disallowed tools, and tool-use rules.",
"rules": "Operating rules. Capture durable constraints this agent must follow.",
"memory": "Agent-local memory. Store facts that belong to this agent rather than the project root.",
"evals": "Evaluation notes. Track checks, regressions, and quality criteria for this agent.",
}
# BEGIN GENERATED LOCAL UI ASSETS
LOCAL_UI_ASSETS = {
"/_astro/LocalManagerApp.C81PrYha.js": {
"content_type": "text/javascript; charset=utf-8",
"bytes": 233816,
"sha256": "e3b57964e61b592e8aac8efca06d168fc70bb45026edaded3862bc7840fb25f0",
"body_b64": "LyogZW1wdHkgY3NzICAgICAgICAgICAgICAgICAgICAgICAqL2ltcG9ydHtyIGFzIG0sYSBhcyBEbCxnIGFzIExsLFIgYXMgUW8sYiBhcyBHc31mcm9tIi4vaW5kZXguQ0dvVWg1UlIuanMiO3ZhciBFcj17ZXhwb3J0czp7fX0sdW49e307LyoqCiAqIEBsaWNlbnNlIFJlYWN0CiAqIHJlYWN0LWpzeC1ydW50aW1lLnByb2R1Y3Rpb24uanMKICoKICogQ29weXJpZ2h0IChjKSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4KICoKICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlCiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4KICovdmFyIGVzO2Z1bmN0aW9uIEZsKCl7aWYoZXMpcmV0dXJuIHVuO2VzPTE7dmFyIGU9U3ltYm9sLmZvcigicmVhY3QudHJhbnNpdGlvbmFsLmVsZW1lbnQiKSx0PVN5bWJvbC5mb3IoInJlYWN0LmZyYWdtZW50Iik7ZnVuY3Rpb24gbihyLHMsYSl7dmFyIGk9bnVsbDtpZihhIT09dm9pZCAwJiYoaT0iIithKSxzLmtleSE9PXZvaWQgMCYmKGk9IiIrcy5rZXkpLCJrZXkiaW4gcyl7YT17fTtmb3IodmFyIGwgaW4gcylsIT09ImtleSImJihhW2xdPXNbbF0pfWVsc2UgYT1zO3JldHVybiBzPWEucmVmLHskJHR5cGVvZjplLHR5cGU6cixrZXk6aSxyZWY6cyE9PXZvaWQgMD9zOm51bGwscHJvcHM6YX19cmV0dXJuIHVuLkZyYWdtZW50PXQsdW4uanN4PW4sdW4uanN4cz1uLHVufXZhciB0cztmdW5jdGlvbiBJbCgpe3JldHVybiB0c3x8KHRzPTEsRXIuZXhwb3J0cz1GbCgpKSxFci5leHBvcnRzfXZhciBvPUlsKCk7ZnVuY3Rpb24gQWUoZSl7cmV0dXJuIE9iamVjdC5rZXlzKGUpfWZ1bmN0aW9uIEFyKGUpe3JldHVybiBlJiZ0eXBlb2YgZT09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KGUpfWZ1bmN0aW9uIGZvKGUsdCl7Y29uc3Qgbj17Li4uZX0scj10O3JldHVybiBBcihlKSYmQXIodCkmJk9iamVjdC5rZXlzKHQpLmZvckVhY2gocz0+e0FyKHJbc10pJiZzIGluIGU/bltzXT1mbyhuW3NdLHJbc10pOm5bc109cltzXX0pLG59ZnVuY3Rpb24gemwoZSl7cmV0dXJuIGUucmVwbGFjZSgvW0EtWl0vZyx0PT5gLSR7dC50b0xvd2VyQ2FzZSgpfWApfWZ1bmN0aW9uIEJsKGUpe3JldHVybiB0eXBlb2YgZSE9InN0cmluZyJ8fCFlLmluY2x1ZGVzKCJ2YXIoLS1tYW50aW5lLXNjYWxlKSIpP2U6ZS5tYXRjaCgvXmNhbGNcKCguKj8pXCkkLyk/LlsxXS5zcGxpdCgiKiIpWzBdLnRyaW0oKX1mdW5jdGlvbiB2bihlKXtjb25zdCB0PUJsKGUpO3JldHVybiB0eXBlb2YgdD09Im51bWJlciI/dDp0eXBlb2YgdD09InN0cmluZyI/dC5pbmNsdWRlcygiY2FsYyIpfHx0LmluY2x1ZGVzKCJ2YXIiKT90OnQuaW5jbHVkZXMoInB4Iik/TnVtYmVyKHQucmVwbGFjZSgicHgiLCIiKSk6dC5pbmNsdWRlcygicmVtIik/TnVtYmVyKHQucmVwbGFjZSgicmVtIiwiIikpKjE2OnQuaW5jbHVkZXMoImVtIik/TnVtYmVyKHQucmVwbGFjZSgiZW0iLCIiKSkqMTY6TnVtYmVyKHQpOk5hTn1mdW5jdGlvbiBucyhlKXtyZXR1cm4gZT09PSIwcmVtIj8iMHJlbSI6YGNhbGMoJHtlfSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKWB9ZnVuY3Rpb24gWHMoZSx7c2hvdWxkU2NhbGU6dD0hMX09e30pe2Z1bmN0aW9uIG4ocil7aWYocj09PTB8fHI9PT0iMCIpcmV0dXJuYDAke2V9YDtpZih0eXBlb2Ygcj09Im51bWJlciIpe2NvbnN0IHM9YCR7ci8xNn0ke2V9YDtyZXR1cm4gdD9ucyhzKTpzfWlmKHR5cGVvZiByPT0ic3RyaW5nIil7aWYocj09PSIifHxyLnN0YXJ0c1dpdGgoImNhbGMoIil8fHIuc3RhcnRzV2l0aCgiY2xhbXAoIil8fHIuaW5jbHVkZXMoInJnYmEoIikpcmV0dXJuIHI7aWYoci5pbmNsdWRlcygiLCIpKXJldHVybiByLnNwbGl0KCIsIikubWFwKGE9Pm4oYSkpLmpvaW4oIiwiKTtpZihyLmluY2x1ZGVzKCIgIikpcmV0dXJuIHIuc3BsaXQoIiAiKS5tYXAoYT0+bihhKSkuam9pbigiICIpO2NvbnN0IHM9ci5yZXBsYWNlKCJweCIsIiIpO2lmKCFOdW1iZXIuaXNOYU4oTnVtYmVyKHMpKSl7Y29uc3QgYT1gJHtOdW1iZXIocykvMTZ9JHtlfWA7cmV0dXJuIHQ/bnMoYSk6YX19cmV0dXJuIHJ9cmV0dXJuIG59Y29uc3QgTj1YcygicmVtIix7c2hvdWxkU2NhbGU6ITB9KSxycz1YcygiZW0iKTtmdW5jdGlvbiBDbihlKXtyZXR1cm4gT2JqZWN0LmtleXMoZSkucmVkdWNlKCh0LG4pPT4oZVtuXSE9PXZvaWQgMCYmKHRbbl09ZVtuXSksdCkse30pfWZ1bmN0aW9uIEtzKGUpe2lmKHR5cGVvZiBlPT0ibnVtYmVyIilyZXR1cm4hMDtpZih0eXBlb2YgZT09InN0cmluZyIpe2lmKGUuc3RhcnRzV2l0aCgiY2FsYygiKXx8ZS5zdGFydHNXaXRoKCJ2YXIoIil8fGUuaW5jbHVkZXMoIiAiKSYmZS50cmltKCkhPT0iIilyZXR1cm4hMDtjb25zdCB0PS9eWystXT9bMC05XSsoXC5bMC05XSspPyhweHxlbXxyZW18ZXh8Y2h8bGh8cmxofHZ3fHZofHZtaW58dm1heHx2Ynx2aXxzdnd8c3ZofGx2d3xsdmh8ZHZ3fGR2aHxjbXxtbXxpbnxwdHxwY3xxfGNxd3xjcWh8Y3FpfGNxYnxjcW1pbnxjcW1heHwlKT8kLztyZXR1cm4gZS50cmltKCkuc3BsaXQoL1xzKy8pLmV2ZXJ5KG49PnQudGVzdChuKSl9cmV0dXJuITF9ZnVuY3Rpb24gSnMoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSl8fGU9PT1udWxsPyExOnR5cGVvZiBlPT0ib2JqZWN0Ij9lLnR5cGUhPT1tLkZyYWdtZW50OiExfWZ1bmN0aW9uIEx0KGUpe2NvbnN0IHQ9bS5jcmVhdGVDb250ZXh0KG51bGwpO3JldHVyblt0LCgpPT57Y29uc3Qgcj1tLnVzZSh0KTtpZihyPT09bnVsbCl0aHJvdyBuZXcgRXJyb3IoZSk7cmV0dXJuIHJ9XX1jb25zdCBWbD17YXBwOjEwMCxtb2RhbDoyMDAscG9wb3ZlcjozMDAsb3ZlcmxheTo0MDAsbWF4Ojk5OTl9O2Z1bmN0aW9uIEZ0KGUpe3JldHVybiBWbFtlXX1jb25zdCBXbD0oKT0+e307ZnVuY3Rpb24gSGwoZSx0PXthY3RpdmU6ITB9KXtyZXR1cm4gdHlwZW9mIGUhPSJmdW5jdGlvbiJ8fCF0LmFjdGl2ZT90Lm9uS2V5RG93bnx8V2w6bj0+e24ua2V5PT09IkVzY2FwZSImJihlKG4pLHQub25UcmlnZ2VyPy4oKSl9fWZ1bmN0aW9uIG1lKGUsdD0ic2l6ZSIsbj0hMCl7aWYoZSE9PXZvaWQgMClyZXR1cm4gS3MoZSk/bj9OKGUpOmU6YHZhcigtLSR7dH0tJHtlfSlgfWZ1bmN0aW9uIEVlKGUpe3JldHVybiBtZShlLCJtYW50aW5lLXNwYWNpbmciKX1mdW5jdGlvbiBtdChlKXtyZXR1cm4gZT09PXZvaWQgMD8idmFyKC0tbWFudGluZS1yYWRpdXMtZGVmYXVsdCkiOm1lKGUsIm1hbnRpbmUtcmFkaXVzIil9ZnVuY3Rpb24gT2UoZSl7cmV0dXJuIG1lKGUsIm1hbnRpbmUtZm9udC1zaXplIil9ZnVuY3Rpb24gcWwoZSl7cmV0dXJuIG1lKGUsIm1hbnRpbmUtbGluZS1oZWlnaHQiLCExKX1mdW5jdGlvbiBwbyhlKXtpZihlKXJldHVybiBtZShlLCJtYW50aW5lLXNoYWRvdyIsITEpfWZ1bmN0aW9uIFlsKGUsdCl7cmV0dXJuIGUgaW4gdD92bih0W2VdKTp2bihlKX1mdW5jdGlvbiBVbChlLHQpe2NvbnN0IG49ZS5tYXAocj0+KHt2YWx1ZTpyLHB4OllsKHIsdCl9KSk7cmV0dXJuIG4uc29ydCgocixzKT0+ci5weC1zLnB4KSxufWZ1bmN0aW9uIFh0KGUpe3JldHVybiB0eXBlb2YgZT09Im9iamVjdCImJmUhPT1udWxsPyJiYXNlImluIGU/ZS5iYXNlOnZvaWQgMDplfWZ1bmN0aW9uIEdsKGU9Im1hbnRpbmUtIil7cmV0dXJuYCR7ZX0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsMTEpfWB9ZnVuY3Rpb24gaG4oZSl7Y29uc3QgdD1tLnVzZVJlZihlKTtyZXR1cm4gbS51c2VFZmZlY3QoKCk9Pnt0LmN1cnJlbnQ9ZX0pLG0udXNlTWVtbygoKT0+KCguLi5uKT0+dC5jdXJyZW50Py4oLi4ubikpLFtdKX1mdW5jdGlvbiBycihlLHQpe2NvbnN0e2RlbGF5Om4sZmx1c2hPblVubW91bnQ6cixsZWFkaW5nOnMsbWF4V2FpdDphfT10eXBlb2YgdD09Im51bWJlciI/e2RlbGF5OnQsZmx1c2hPblVubW91bnQ6ITEsbGVhZGluZzohMSxtYXhXYWl0OnZvaWQgMH06dCxpPWhuKGUpLGw9bS51c2VSZWYoMCksYz1tLnVzZVJlZigwKSxkPW0udXNlUmVmKG51bGwpLHU9bS51c2VNZW1vKCgpPT57Y29uc3QgZj1PYmplY3QuYXNzaWduKCguLi5wKT0+e3dpbmRvdy5jbGVhclRpbWVvdXQobC5jdXJyZW50KSxkLmN1cnJlbnQ9cDtjb25zdCBoPWYuX2lzRmlyc3RDYWxsO2YuX2lzRmlyc3RDYWxsPSExO2Z1bmN0aW9uIHkoKXt3aW5kb3cuY2xlYXJUaW1lb3V0KGwuY3VycmVudCksd2luZG93LmNsZWFyVGltZW91dChjLmN1cnJlbnQpLGwuY3VycmVudD0wLGMuY3VycmVudD0wLGYuX2lzRmlyc3RDYWxsPSEwLGYuX2hhc1BlbmRpbmdDYWxsYmFjaz0hMX1mdW5jdGlvbiBnKCl7YSE9PXZvaWQgMCYmYy5jdXJyZW50PT09MCYmKGMuY3VycmVudD13aW5kb3cuc2V0VGltZW91dCgoKT0+e2lmKGwuY3VycmVudCE9PTApe2NvbnN0IGo9ZC5jdXJyZW50O3koKSxpKC4uLmopfX0sYSkpfWlmKHMmJmgpe2koLi4ucCk7Y29uc3Qgaj0oKT0+e3koKX0sdz0oKT0+e2wuY3VycmVudCE9PTAmJih5KCksaSguLi5wKSl9LFM9KCk9Pnt5KCl9O2YuZmx1c2g9dyxmLmNhbmNlbD1TLGwuY3VycmVudD13aW5kb3cuc2V0VGltZW91dChqLG4pLGcoKTtyZXR1cm59aWYocyYmIWgpe2YuX2hhc1BlbmRpbmdDYWxsYmFjaz0hMDtjb25zdCBqPSgpPT57bC5jdXJyZW50IT09MCYmKHkoKSxpKC4uLnApKX0sdz0oKT0+e3koKX07Zi5mbHVzaD1qLGYuY2FuY2VsPXc7Y29uc3QgUz0oKT0+e3koKX07bC5jdXJyZW50PXdpbmRvdy5zZXRUaW1lb3V0KFMsbiksZygpO3JldHVybn1mLl9oYXNQZW5kaW5nQ2FsbGJhY2s9ITA7Y29uc3Qgdj0oKT0+e2wuY3VycmVudCE9PTAmJih5KCksaSguLi5wKSl9LHg9KCk9Pnt5KCl9O2YuZmx1c2g9dixmLmNhbmNlbD14LGwuY3VycmVudD13aW5kb3cuc2V0VGltZW91dCh2LG4pLGcoKX0se2ZsdXNoOigpPT57fSxjYW5jZWw6KCk9Pnt9LGlzUGVuZGluZzooKT0+Zi5faGFzUGVuZGluZ0NhbGxiYWNrLF9pc0ZpcnN0Q2FsbDohMCxfaGFzUGVuZGluZ0NhbGxiYWNrOiExfSk7cmV0dXJuIGZ9LFtpLG4scyxhXSk7cmV0dXJuIG0udXNlRWZmZWN0KCgpPT4oKT0+e3I/dS5mbHVzaCgpOnUuY2FuY2VsKCl9LFt1LHJdKSx1fWNvbnN0IFhsPVsibW91c2Vkb3duIiwidG91Y2hzdGFydCJdO2Z1bmN0aW9uIEtsKGUsdCxuLHI9ITApe2NvbnN0IHM9bS51c2VSZWYobnVsbCksYT10fHxYbCxpPW0udXNlRWZmZWN0RXZlbnQoYz0+e2NvbnN0e3RhcmdldDpkfT1jPz97fTtpZighZG9jdW1lbnQuYm9keS5jb250YWlucyhkKSYmZD8udGFnTmFtZSE9PSJIVE1MIilyZXR1cm47Y29uc3QgdT1jLmNvbXBvc2VkUGF0aCgpO0FycmF5LmlzQXJyYXkobik/bi5ldmVyeShmPT4hIWYmJiF1LmluY2x1ZGVzKGYpKSYmZShjKTpzLmN1cnJlbnQmJiF1LmluY2x1ZGVzKHMuY3VycmVudCkmJmUoYyl9KSxsPWEuam9pbigiLCIpO3JldHVybiBtLnVzZUVmZmVjdCgoKT0+e2lmKCFyKXJldHVybjtjb25zdCBjPWwuc3BsaXQoIiwiKTtyZXR1cm4gYy5mb3JFYWNoKGQ9PmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZCxpKSksKCk9PntjLmZvckVhY2goZD0+ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihkLGkpKX19LFtsLHJdKSxzfWZ1bmN0aW9uIEpsKGUsdCl7cmV0dXJuIHR5cGVvZiB3aW5kb3c8InUiJiYibWF0Y2hNZWRpYSJpbiB3aW5kb3c/d2luZG93Lm1hdGNoTWVkaWEoZSkubWF0Y2hlczohMX1mdW5jdGlvbiBabChlLHQse2dldEluaXRpYWxWYWx1ZUluRWZmZWN0Om59PXtnZXRJbml0aWFsVmFsdWVJbkVmZmVjdDohMH0pe2NvbnN0W3Isc109bS51c2VTdGF0ZShuP3Q6SmwoZSkpO3JldHVybiBtLnVzZUVmZmVjdCgoKT0+e3RyeXtpZigibWF0Y2hNZWRpYSJpbiB3aW5kb3cpe2NvbnN0IGE9d2luZG93Lm1hdGNoTWVkaWEoZSk7cyhhLm1hdGNoZXMpO2NvbnN0IGk9bD0+cyhsLm1hdGNoZXMpO3JldHVybiBhLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsaSksKCk9PnthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZSIsaSl9fX1jYXRjaHtyZXR1cm59fSxbZV0pLHJ8fCExfWNvbnN0IEl0PXR5cGVvZiBkb2N1bWVudDwidSI/bS51c2VMYXlvdXRFZmZlY3Q6bS51c2VFZmZlY3Q7ZnVuY3Rpb24gS24oZSx0KXtjb25zdCBuPW0udXNlUmVmKCExKTttLnVzZUVmZmVjdCgoKT0+KCk9PntuLmN1cnJlbnQ9ITF9LFtdKSxtLnVzZUVmZmVjdCgoKT0+e2lmKG4uY3VycmVudClyZXR1cm4gZSgpO24uY3VycmVudD0hMH0sdCl9ZnVuY3Rpb24gWnMoe29wZW5lZDplLHNob3VsZFJldHVybkZvY3VzOnQ9ITB9KXtjb25zdCBuPW0udXNlUmVmKG51bGwpLHI9KCk9PntuLmN1cnJlbnQmJiJmb2N1cyJpbiBuLmN1cnJlbnQmJnR5cGVvZiBuLmN1cnJlbnQuZm9jdXM9PSJmdW5jdGlvbiImJm4uY3VycmVudD8uZm9jdXMoe3ByZXZlbnRTY3JvbGw6ITB9KX07cmV0dXJuIEtuKCgpPT57bGV0IHM9LTE7Y29uc3QgYT1pPT57aS5rZXk9PT0iVGFiIiYmd2luZG93LmNsZWFyVGltZW91dChzKX07cmV0dXJuIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLGEpLGU/bi5jdXJyZW50PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ6dCYmKHM9d2luZG93LnNldFRpbWVvdXQociwxMCkpLCgpPT57d2luZG93LmNsZWFyVGltZW91dChzKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixhKX19LFtlLHRdKSxyfWNvbnN0IFFsPS9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9ufG9iamVjdC8sUXM9ImEsIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBidXR0b24sIG9iamVjdCwgW3RhYmluZGV4XSI7ZnVuY3Rpb24gZWMoZSl7cmV0dXJuIGUuc3R5bGUuZGlzcGxheT09PSJub25lIn1mdW5jdGlvbiB0YyhlKXtpZihlLmdldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iKXx8ZS5nZXRBdHRyaWJ1dGUoImhpZGRlbiIpfHxlLmdldEF0dHJpYnV0ZSgidHlwZSIpPT09ImhpZGRlbiIpcmV0dXJuITE7bGV0IHQ9ZTtmb3IoO3QmJiEodD09PWRvY3VtZW50LmJvZHl8fHQubm9kZVR5cGU9PT0xMSk7KXtpZihlYyh0KSlyZXR1cm4hMTt0PXQucGFyZW50Tm9kZX1yZXR1cm4hMH1mdW5jdGlvbiBlYShlKXtsZXQgdD1lLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKTtyZXR1cm4gdD09PW51bGwmJih0PXZvaWQgMCkscGFyc2VJbnQodCwxMCl9ZnVuY3Rpb24gS3IoZSl7Y29uc3QgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksbj0hTnVtYmVyLmlzTmFOKGVhKGUpKTtyZXR1cm4oUWwudGVzdCh0KSYmIWUuZGlzYWJsZWR8fGUgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCYmZS5ocmVmfHxuKSYmdGMoZSl9ZnVuY3Rpb24gdGEoZSl7Y29uc3QgdD1lYShlKTtyZXR1cm4oTnVtYmVyLmlzTmFOKHQpfHx0Pj0wKSYmS3IoZSl9ZnVuY3Rpb24gbmMoZSl7cmV0dXJuIEFycmF5LmZyb20oZS5xdWVyeVNlbGVjdG9yQWxsKFFzKSkuZmlsdGVyKHRhKX1mdW5jdGlvbiByYyhlLHQpe2NvbnN0IG49bmMoZSk7aWYoIW4ubGVuZ3RoKXt0LnByZXZlbnREZWZhdWx0KCk7cmV0dXJufWNvbnN0IHI9blt0LnNoaWZ0S2V5PzA6bi5sZW5ndGgtMV0scz1lLmdldFJvb3ROb2RlKCk7bGV0IGE9cj09PXMuYWN0aXZlRWxlbWVudHx8ZT09PXMuYWN0aXZlRWxlbWVudDtjb25zdCBpPXMuYWN0aXZlRWxlbWVudDtpZihpLnRhZ05hbWU9PT0iSU5QVVQiJiZpLmdldEF0dHJpYnV0ZSgidHlwZSIpPT09InJhZGlvIiYmKGE9bi5maWx0ZXIoYz0+Yy5nZXRBdHRyaWJ1dGUoInR5cGUiKT09PSJyYWRpbyImJmMuZ2V0QXR0cmlidXRlKCJuYW1lIik9PT1pLmdldEF0dHJpYnV0ZSgibmFtZSIpKS5pbmNsdWRlcyhyKSksIWEpcmV0dXJuO3QucHJldmVudERlZmF1bHQoKTtjb25zdCBsPW5bdC5zaGlmdEtleT9uLmxlbmd0aC0xOjBdO2wmJmwuZm9jdXMoKX1mdW5jdGlvbiBvYyhlPSEwKXtjb25zdCB0PW0udXNlUmVmKG51bGwpLG49cz0+e2xldCBhPXMucXVlcnlTZWxlY3RvcigiW2RhdGEtYXV0b2ZvY3VzXSIpO2lmKCFhKXtjb25zdCBpPUFycmF5LmZyb20ocy5xdWVyeVNlbGVjdG9yQWxsKFFzKSk7YT1pLmZpbmQodGEpfHxpLmZpbmQoS3IpfHxudWxsLCFhJiZLcihzKSYmKGE9cyl9YT9hLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSk6Y29uc29sZS53YXJuKCJbQG1hbnRpbmUvaG9va3MvdXNlLWZvY3VzLXRyYXBdIEZhaWxlZCB0byBmaW5kIGZvY3VzYWJsZSBlbGVtZW50IHdpdGhpbiBwcm92aWRlZCBub2RlIixzKX0scj1tLnVzZUNhbGxiYWNrKHM9PntpZihlKXtpZihzPT09bnVsbCl7dC5jdXJyZW50PW51bGw7cmV0dXJufXQuY3VycmVudCE9PXMmJihzZXRUaW1lb3V0KCgpPT57cy5nZXRSb290Tm9kZSgpP24ocyk6Y29uc29sZS53YXJuKCJbQG1hbnRpbmUvaG9va3MvdXNlLWZvY3VzLXRyYXBdIFJlZiBub2RlIGlzIG5vdCBwYXJ0IG9mIHRoZSBkb20iLHMpfSksdC5jdXJyZW50PXMpfX0sW2VdKTtyZXR1cm4gbS51c2VFZmZlY3QoKCk9PntpZighZSlyZXR1cm47dC5jdXJyZW50JiZzZXRUaW1lb3V0KCgpPT57dC5jdXJyZW50JiZuKHQuY3VycmVudCl9KTtjb25zdCBzPWE9PnthLmtleT09PSJUYWIiJiZ0LmN1cnJlbnQmJnJjKHQuY3VycmVudCxhKX07cmV0dXJuIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHMpLCgpPT5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixzKX0sW2VdKSxyfWZ1bmN0aW9uIG5uKGUpe2NvbnN0W3Qsbl09bS51c2VTdGF0ZShgbWFudGluZS0ke20udXNlSWQoKS5yZXBsYWNlKC86L2csIiIpfWApO3JldHVybiBJdCgoKT0+e24oR2woKSl9LFtdKSx0eXBlb2YgZT09InN0cmluZyI/ZTp0fWZ1bmN0aW9uIHNjKGUsdCxuKXtjb25zdCByPW0udXNlRWZmZWN0RXZlbnQodCk7bS51c2VFZmZlY3QoKCk9Pih3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihlLHIsbiksKCk9PndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKGUscixuKSksW2VdKX1mdW5jdGlvbiBKcihlLHQpe2lmKHR5cGVvZiBlPT0iZnVuY3Rpb24iKXJldHVybiBlKHQpO3R5cGVvZiBlPT0ib2JqZWN0IiYmZSE9PW51bGwmJiJjdXJyZW50ImluIGUmJihlLmN1cnJlbnQ9dCl9ZnVuY3Rpb24gYWMoLi4uZSl7Y29uc3QgdD1uZXcgTWFwO3JldHVybiBuPT57aWYoZS5mb3JFYWNoKHI9Pntjb25zdCBzPUpyKHIsbik7cyYmdC5zZXQocixzKX0pLHQuc2l6ZT4wKXJldHVybigpPT57ZS5mb3JFYWNoKHI9Pntjb25zdCBzPXQuZ2V0KHIpO3MmJnR5cGVvZiBzPT0iZnVuY3Rpb24iP3MoKTpKcihyLG51bGwpfSksdC5jbGVhcigpfX19ZnVuY3Rpb24gTGUoLi4uZSl7cmV0dXJuIG0udXNlQ2FsbGJhY2soYWMoLi4uZSksZSl9ZnVuY3Rpb24gSm4oe3ZhbHVlOmUsZGVmYXVsdFZhbHVlOnQsZmluYWxWYWx1ZTpuLG9uQ2hhbmdlOnI9KCk9Pnt9fSl7Y29uc3RbcyxhXT1tLnVzZVN0YXRlKHQhPT12b2lkIDA/dDpuKSxpPShsLC4uLmMpPT57YShsKSxyPy4obCwuLi5jKX07cmV0dXJuIGUhPT12b2lkIDA/W2UsciwhMF06W3MsaSwhMV19ZnVuY3Rpb24gbmEoZSx0KXtyZXR1cm4gWmwoIihwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpIixlLHQpfWZ1bmN0aW9uIGljKGUpe2NvbnN0IHQ9bS51c2VSZWYodm9pZCAwKTtyZXR1cm4gbS51c2VFZmZlY3QoKCk9Pnt0LmN1cnJlbnQ9ZX0sW2VdKSx0LmN1cnJlbnR9dmFyIG1vPURsKCk7Y29uc3QgbGM9TGwobW8pO3ZhciBjYz17fTtmdW5jdGlvbiBkYygpe3JldHVybiJkZXZlbG9wbWVudCJ9ZnVuY3Rpb24gcmEoZSl7Y29uc3QgdD1Rby52ZXJzaW9uO3JldHVybiB0eXBlb2YgUW8udmVyc2lvbiE9InN0cmluZyJ8fHQuc3RhcnRzV2l0aCgiMTguIik/ZT8ucmVmOmU/LnByb3BzPy5yZWZ9ZnVuY3Rpb24gcW4oZSx0PWRvY3VtZW50KXtjb25zdCBuPXQucXVlcnlTZWxlY3RvcihlKTtpZihuKXJldHVybiBuO2NvbnN0IHI9dC5xdWVyeVNlbGVjdG9yQWxsKCIqIik7Zm9yKGxldCBzPTA7czxyLmxlbmd0aDtzKz0xKXtjb25zdCBhPXJbc107aWYoYS5zaGFkb3dSb290KXtjb25zdCBpPXFuKGUsYS5zaGFkb3dSb290KTtpZihpKXJldHVybiBpfX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBjdChlLHQ9ZG9jdW1lbnQpe2NvbnN0IG49W10scj10LnF1ZXJ5U2VsZWN0b3JBbGwoZSk7bi5wdXNoKC4uLkFycmF5LmZyb20ocikpO2NvbnN0IHM9dC5xdWVyeVNlbGVjdG9yQWxsKCIqIik7Zm9yKGxldCBhPTA7YTxzLmxlbmd0aDthKz0xKXtjb25zdCBpPXNbYV07aWYoaS5zaGFkb3dSb290KXtjb25zdCBsPWN0KGUsaS5zaGFkb3dSb290KTtuLnB1c2goLi4ubCl9fXJldHVybiBufWZ1bmN0aW9uIGl0KGUpe2lmKCFlKXJldHVybiBkb2N1bWVudDtjb25zdCB0PWUuZ2V0Um9vdE5vZGUoKTtyZXR1cm4gdCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3R8fHQgaW5zdGFuY2VvZiBEb2N1bWVudD90OmRvY3VtZW50fWZ1bmN0aW9uIG9yKGUpe2NvbnN0IHQ9bS5DaGlsZHJlbi50b0FycmF5KGUpO3JldHVybiB0Lmxlbmd0aCE9PTF8fCFKcyh0WzBdKT9udWxsOnRbMF19ZnVuY3Rpb24gb2EoZSl7dmFyIHQsbixyPSIiO2lmKHR5cGVvZiBlPT0ic3RyaW5nInx8dHlwZW9mIGU9PSJudW1iZXIiKXIrPWU7ZWxzZSBpZih0eXBlb2YgZT09Im9iamVjdCIpaWYoQXJyYXkuaXNBcnJheShlKSl7dmFyIHM9ZS5sZW5ndGg7Zm9yKHQ9MDt0PHM7dCsrKWVbdF0mJihuPW9hKGVbdF0pKSYmKHImJihyKz0iICIpLHIrPW4pfWVsc2UgZm9yKG4gaW4gZSllW25dJiYociYmKHIrPSIgIikscis9bik7cmV0dXJuIHJ9ZnVuY3Rpb24gX2UoKXtmb3IodmFyIGUsdCxuPTAscj0iIixzPWFyZ3VtZW50cy5sZW5ndGg7bjxzO24rKykoZT1hcmd1bWVudHNbbl0pJiYodD1vYShlKSkmJihyJiYocis9IiAiKSxyKz10KTtyZXR1cm4gcn1jb25zdCB1Yz17fTtmdW5jdGlvbiBmYyhlKXtjb25zdCB0PXt9O3JldHVybiBlLmZvckVhY2gobj0+e09iamVjdC5lbnRyaWVzKG4pLmZvckVhY2goKFtyLHNdKT0+e3Rbcl0/dFtyXT1fZSh0W3JdLHMpOnRbcl09c30pfSksdH1mdW5jdGlvbiB4bih7dGhlbWU6ZSxjbGFzc05hbWVzOnQscHJvcHM6bixzdHlsZXNDdHg6cn0pe3JldHVybiBmYygoQXJyYXkuaXNBcnJheSh0KT90Olt0XSkubWFwKHM9PnR5cGVvZiBzPT0iZnVuY3Rpb24iP3MoZSxuLHIpOnN8fHVjKSl9ZnVuY3Rpb24gWm4oe3RoZW1lOmUsc3R5bGVzOnQscHJvcHM6bixzdHlsZXNDdHg6cn0pe2NvbnN0IHM9QXJyYXkuaXNBcnJheSh0KT90Olt0XSxhPXt9O2Zvcihjb25zdCBpIG9mIHMpdHlwZW9mIGk9PSJmdW5jdGlvbiI/T2JqZWN0LmFzc2lnbihhLGkoZSxuLHIpKTppJiZPYmplY3QuYXNzaWduKGEsaSk7cmV0dXJuIGF9ZnVuY3Rpb24gb3MoZSl7cmV0dXJuIGU9PT0iYXV0byJ8fGU9PT0iZGFyayJ8fGU9PT0ibGlnaHQifWZ1bmN0aW9uIHBjKHtrZXk6ZT0ibWFudGluZS1jb2xvci1zY2hlbWUtdmFsdWUifT17fSl7bGV0IHQ7cmV0dXJue2dldDpuPT57aWYodHlwZW9mIHdpbmRvdz4idSIpcmV0dXJuIG47dHJ5e2NvbnN0IHI9d2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKGUpO3JldHVybiBvcyhyKT9yOm59Y2F0Y2h7cmV0dXJuIG59fSxzZXQ6bj0+e3RyeXt3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oZSxuKX1jYXRjaChyKXtjb25zb2xlLndhcm4oIltAbWFudGluZS9jb3JlXSBMb2NhbCBzdG9yYWdlIGNvbG9yIHNjaGVtZSBtYW5hZ2VyIHdhcyB1bmFibGUgdG8gc2F2ZSBjb2xvciBzY2hlbWUuIixyKX19LHN1YnNjcmliZTpuPT57dD1yPT57ci5zdG9yYWdlQXJlYT09PXdpbmRvdy5sb2NhbFN0b3JhZ2UmJnIua2V5PT09ZSYmb3Moci5uZXdWYWx1ZSkmJm4oci5uZXdWYWx1ZSl9LHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJzdG9yYWdlIix0KX0sdW5zdWJzY3JpYmU6KCk9Pnt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigic3RvcmFnZSIsdCl9LGNsZWFyOigpPT57d2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGUpfX19ZnVuY3Rpb24gd24oZSx0KXtyZXR1cm4gdHlwZW9mIGUucHJpbWFyeVNoYWRlPT0ibnVtYmVyIj9lLnByaW1hcnlTaGFkZTp0PT09ImRhcmsiP2UucHJpbWFyeVNoYWRlLmRhcms6ZS5wcmltYXJ5U2hhZGUubGlnaHR9ZnVuY3Rpb24gbWMoZSl7cmV0dXJuL14jPyhbMC05QS1GXXszfSl7MSwyfShbMC05QS1GXXsyfSk/JC9pLnRlc3QoZSl9ZnVuY3Rpb24gaGMoZSl7bGV0IHQ9ZS5yZXBsYWNlKCIjIiwiIik7aWYodC5sZW5ndGg9PT0zKXtjb25zdCByPXQuc3BsaXQoIiIpO3Q9W3JbMF0sclswXSxyWzFdLHJbMV0sclsyXSxyWzJdXS5qb2luKCIiKX1pZih0Lmxlbmd0aD09PTgpe2NvbnN0IHI9cGFyc2VJbnQodC5zbGljZSg2LDgpLDE2KS8yNTU7cmV0dXJue3I6cGFyc2VJbnQodC5zbGljZSgwLDIpLDE2KSxnOnBhcnNlSW50KHQuc2xpY2UoMiw0KSwxNiksYjpwYXJzZUludCh0LnNsaWNlKDQsNiksMTYpLGE6cn19Y29uc3Qgbj1wYXJzZUludCh0LDE2KTtyZXR1cm57cjpuPj4xNiYyNTUsZzpuPj44JjI1NSxiOm4mMjU1LGE6MX19ZnVuY3Rpb24gZ2MoZSl7Y29uc3RbdCxuLHIsc109ZS5yZXBsYWNlKC9bXjAtOSwuL10vZywiIikuc3BsaXQoL1svLF0vKS5tYXAoTnVtYmVyKTtyZXR1cm57cjp0LGc6bixiOnIsYTpzPT09dm9pZCAwPzE6c319ZnVuY3Rpb24gYmMoZSl7Y29uc3QgdD1lLm1hdGNoKC9eaHNsYT9cKFxzKihcZCspXHMqLFxzKihcZCslKVxzKixccyooXGQrJSlccyooLFxzKigwP1wuXGQrfFxkKyhcLlxkKyk/KSk/XHMqXCkkL2kpO2lmKCF0KXJldHVybntyOjAsZzowLGI6MCxhOjF9O2NvbnN0IG49cGFyc2VJbnQodFsxXSwxMCkscj1wYXJzZUludCh0WzJdLDEwKS8xMDAscz1wYXJzZUludCh0WzNdLDEwKS8xMDAsYT10WzVdP3BhcnNlRmxvYXQodFs1XSk6dm9pZCAwLGk9KDEtTWF0aC5hYnMoMipzLTEpKSpyLGw9bi82MCxjPWkqKDEtTWF0aC5hYnMobCUyLTEpKSxkPXMtaS8yO2xldCB1LGYscDtyZXR1cm4gbD49MCYmbDwxPyh1PWksZj1jLHA9MCk6bD49MSYmbDwyPyh1PWMsZj1pLHA9MCk6bD49MiYmbDwzPyh1PTAsZj1pLHA9Yyk6bD49MyYmbDw0Pyh1PTAsZj1jLHA9aSk6bD49NCYmbDw1Pyh1PWMsZj0wLHA9aSk6KHU9aSxmPTAscD1jKSx7cjpNYXRoLnJvdW5kKCh1K2QpKjI1NSksZzpNYXRoLnJvdW5kKChmK2QpKjI1NSksYjpNYXRoLnJvdW5kKChwK2QpKjI1NSksYTphfHwxfX1mdW5jdGlvbiBobyhlKXtyZXR1cm4gbWMoZSk/aGMoZSk6ZS5zdGFydHNXaXRoKCJyZ2IiKT9nYyhlKTplLnN0YXJ0c1dpdGgoImhzbCIpP2JjKGUpOntyOjAsZzowLGI6MCxhOjF9fWZ1bmN0aW9uIE9yKGUpe3JldHVybiBlPD0uMDM5Mjg/ZS8xMi45MjooKGUrLjA1NSkvMS4wNTUpKioyLjR9ZnVuY3Rpb24geWMoZSl7Y29uc3QgdD1lLm1hdGNoKC9va2xjaFwoKC4qPyklXHMvKTtyZXR1cm4gdD9wYXJzZUZsb2F0KHRbMV0pOm51bGx9ZnVuY3Rpb24gdmMoZSl7aWYoZS5zdGFydHNXaXRoKCJva2xjaCgiKSlyZXR1cm4oeWMoZSl8fDApLzEwMDtjb25zdHtyOnQsZzpuLGI6cn09aG8oZSkscz10LzI1NSxhPW4vMjU1LGk9ci8yNTUsbD1PcihzKSxjPU9yKGEpLGQ9T3IoaSk7cmV0dXJuIC4yMTI2KmwrLjcxNTIqYysuMDcyMipkfWZ1bmN0aW9uIGZuKGUsdD0uMTc5KXtyZXR1cm4gZS5zdGFydHNXaXRoKCJ2YXIoIik/ITE6dmMoZSk+dH1mdW5jdGlvbiBObih7Y29sb3I6ZSx0aGVtZTp0LGNvbG9yU2NoZW1lOm59KXtpZih0eXBlb2YgZSE9InN0cmluZyIpdGhyb3cgbmV3IEVycm9yKGBbQG1hbnRpbmUvY29yZV0gRmFpbGVkIHRvIHBhcnNlIGNvbG9yLiBFeHBlY3RlZCBjb2xvciB0byBiZSBhIHN0cmluZywgaW5zdGVhZCBnb3QgJHt0eXBlb2YgZX1gKTtpZihlPT09ImJyaWdodCIpcmV0dXJue2NvbG9yOmUsdmFsdWU6bj09PSJkYXJrIj90LndoaXRlOnQuYmxhY2ssc2hhZGU6dm9pZCAwLGlzVGhlbWVDb2xvcjohMSxpc0xpZ2h0OmZuKG49PT0iZGFyayI/dC53aGl0ZTp0LmJsYWNrLHQubHVtaW5hbmNlVGhyZXNob2xkKSx2YXJpYWJsZToiLS1tYW50aW5lLWNvbG9yLWJyaWdodCJ9O2lmKGU9PT0iZGltbWVkIilyZXR1cm57Y29sb3I6ZSx2YWx1ZTpuPT09ImRhcmsiP3QuY29sb3JzLmRhcmtbMl06dC5jb2xvcnMuZ3JheVs3XSxzaGFkZTp2b2lkIDAsaXNUaGVtZUNvbG9yOiExLGlzTGlnaHQ6Zm4obj09PSJkYXJrIj90LmNvbG9ycy5kYXJrWzJdOnQuY29sb3JzLmdyYXlbNl0sdC5sdW1pbmFuY2VUaHJlc2hvbGQpLHZhcmlhYmxlOiItLW1hbnRpbmUtY29sb3ItZGltbWVkIn07aWYoZT09PSJ3aGl0ZSJ8fGU9PT0iYmxhY2siKXJldHVybntjb2xvcjplLHZhbHVlOmU9PT0id2hpdGUiP3Qud2hpdGU6dC5ibGFjayxzaGFkZTp2b2lkIDAsaXNUaGVtZUNvbG9yOiExLGlzTGlnaHQ6Zm4oZT09PSJ3aGl0ZSI/dC53aGl0ZTp0LmJsYWNrLHQubHVtaW5hbmNlVGhyZXNob2xkKSx2YXJpYWJsZTpgLS1tYW50aW5lLWNvbG9yLSR7ZX1gfTtjb25zdFtyLHNdPWUuc3BsaXQoIi4iKSxhPXM/TnVtYmVyKHMpOnZvaWQgMCxpPXIgaW4gdC5jb2xvcnM7aWYoaSl7Y29uc3QgbD1hIT09dm9pZCAwP3QuY29sb3JzW3JdW2FdOnQuY29sb3JzW3JdW3duKHQsbnx8ImxpZ2h0IildO3JldHVybntjb2xvcjpyLHZhbHVlOmwsc2hhZGU6YSxpc1RoZW1lQ29sb3I6aSxpc0xpZ2h0OmZuKGwsdC5sdW1pbmFuY2VUaHJlc2hvbGQpLHZhcmlhYmxlOnM/YC0tbWFudGluZS1jb2xvci0ke3J9LSR7YX1gOmAtLW1hbnRpbmUtY29sb3ItJHtyfS1maWxsZWRgfX1yZXR1cm57Y29sb3I6ZSx2YWx1ZTplLGlzVGhlbWVDb2xvcjppLGlzTGlnaHQ6Zm4oZSx0Lmx1bWluYW5jZVRocmVzaG9sZCksc2hhZGU6YSx2YXJpYWJsZTp2b2lkIDB9fWZ1bmN0aW9uIHB0KGUsdCl7Y29uc3Qgbj1Obih7Y29sb3I6ZXx8dC5wcmltYXJ5Q29sb3IsdGhlbWU6dH0pO3JldHVybiBuLnZhcmlhYmxlP2B2YXIoJHtuLnZhcmlhYmxlfSlgOmV9ZnVuY3Rpb24gQXQoZSx0KXtpZihlLnN0YXJ0c1dpdGgoInZhcigiKSlyZXR1cm5gY29sb3ItbWl4KGluIHNyZ2IsICR7ZX0sIGJsYWNrICR7dCoxMDB9JSlgO2NvbnN0e3I6bixnOnIsYjpzLGF9PWhvKGUpLGk9MS10LGw9Yz0+TWF0aC5yb3VuZChjKmkpO3JldHVybmByZ2JhKCR7bChuKX0sICR7bChyKX0sICR7bChzKX0sICR7YX0pYH1mdW5jdGlvbiBacihlLHQpe2NvbnN0IG49e2Zyb206ZT8uZnJvbXx8dC5kZWZhdWx0R3JhZGllbnQuZnJvbSx0bzplPy50b3x8dC5kZWZhdWx0R3JhZGllbnQudG8sZGVnOmU/LmRlZz8/dC5kZWZhdWx0R3JhZGllbnQuZGVnPz8wfSxyPXB0KG4uZnJvbSx0KSxzPXB0KG4udG8sdCk7cmV0dXJuYGxpbmVhci1ncmFkaWVudCgke24uZGVnfWRlZywgJHtyfSAwJSwgJHtzfSAxMDAlKWB9ZnVuY3Rpb24gQ3QoZSx0KXtpZih0eXBlb2YgZSE9InN0cmluZyJ8fHQ+MXx8dDwwKXJldHVybiJyZ2JhKDAsIDAsIDAsIDEpIjtpZihlLnN0YXJ0c1dpdGgoInZhcigiKSlyZXR1cm5gY29sb3ItbWl4KGluIHNyZ2IsICR7ZX0sIHRyYW5zcGFyZW50ICR7KDEtdCkqMTAwfSUpYDtpZihlLnN0YXJ0c1dpdGgoIm9rbGNoIikpcmV0dXJuIGUuaW5jbHVkZXMoIi8iKT9lLnJlcGxhY2UoL1wvXHMqW1xkLl0rXHMqXCkvLGAvICR7dH0pYCk6ZS5yZXBsYWNlKCIpIixgIC8gJHt0fSlgKTtjb25zdHtyOm4sZzpyLGI6c309aG8oZSk7cmV0dXJuYHJnYmEoJHtufSwgJHtyfSwgJHtzfSwgJHt0fSlgfWNvbnN0IHNzPUN0LHhjPSh7Y29sb3I6ZSx0aGVtZTp0LHZhcmlhbnQ6bixncmFkaWVudDpyLGF1dG9Db250cmFzdDpzfSk9Pntjb25zdCBhPU5uKHtjb2xvcjplLHRoZW1lOnR9KSxpPXR5cGVvZiBzPT0iYm9vbGVhbiI/czp0LmF1dG9Db250cmFzdDtpZihuPT09Im5vbmUiKXJldHVybntiYWNrZ3JvdW5kOiJ0cmFuc3BhcmVudCIsaG92ZXI6InRyYW5zcGFyZW50Iixjb2xvcjoiaW5oZXJpdCIsYm9yZGVyOiJub25lIn07aWYobj09PSJmaWxsZWQiKXtjb25zdCBsPWkmJmEuaXNMaWdodD8idmFyKC0tbWFudGluZS1jb2xvci1ibGFjaykiOiJ2YXIoLS1tYW50aW5lLWNvbG9yLXdoaXRlKSI7cmV0dXJuIGEuaXNUaGVtZUNvbG9yP2Euc2hhZGU9PT12b2lkIDA/e2JhY2tncm91bmQ6YHZhcigtLW1hbnRpbmUtY29sb3ItJHtlfS1maWxsZWQpYCxob3ZlcjpgdmFyKC0tbWFudGluZS1jb2xvci0ke2V9LWZpbGxlZC1ob3ZlcilgLGNvbG9yOmwsYm9yZGVyOmAke04oMSl9IHNvbGlkIHRyYW5zcGFyZW50YH06e2JhY2tncm91bmQ6YHZhcigtLW1hbnRpbmUtY29sb3ItJHthLmNvbG9yfS0ke2Euc2hhZGV9KWAsaG92ZXI6YHZhcigtLW1hbnRpbmUtY29sb3ItJHthLmNvbG9yfS0ke2Euc2hhZGU9PT05Pzg6YS5zaGFkZSsxfSlgLGNvbG9yOmwsYm9yZGVyOmAke04oMSl9IHNvbGlkIHRyYW5zcGFyZW50YH06e2JhY2tncm91bmQ6ZSxob3ZlcjpBdChlLC4xKSxjb2xvcjpsLGJvcmRlcjpgJHtOKDEpfSBzb2xpZCB0cmFuc3BhcmVudGB9fWlmKG49PT0ibGlnaHQiKXtpZihhLmlzVGhlbWVDb2xvcil7aWYoYS5zaGFkZT09PXZvaWQgMClyZXR1cm57YmFja2dyb3VuZDpgdmFyKC0tbWFudGluZS1jb2xvci0ke2V9LWxpZ2h0KWAsaG92ZXI6YHZhcigtLW1hbnRpbmUtY29sb3ItJHtlfS1saWdodC1ob3ZlcilgLGNvbG9yOmB2YXIoLS1tYW50aW5lLWNvbG9yLSR7ZX0tbGlnaHQtY29sb3IpYCxib3JkZXI6YCR7TigxKX0gc29saWQgdHJhbnNwYXJlbnRgfTtjb25zdCBsPXQuY29sb3JzW2EuY29sb3JdW2Euc2hhZGVdO3JldHVybntiYWNrZ3JvdW5kOmwsaG92ZXI6QXQobCwuMSksY29sb3I6YHZhcigtLW1hbnRpbmUtY29sb3ItJHthLmNvbG9yfS1saWdodC1jb2xvcilgLGJvcmRlcjpgJHtOKDEpfSBzb2xpZCB0cmFuc3BhcmVudGB9fXJldHVybntiYWNrZ3JvdW5kOkN0KGUsLjEpLGhvdmVyOkN0KGUsLjEyKSxjb2xvcjplLGJvcmRlcjpgJHtOKDEpfSBzb2xpZCB0cmFuc3BhcmVudGB9fWlmKG49PT0ib3V0bGluZSIpcmV0dXJuIGEuaXNUaGVtZUNvbG9yP2Euc2hhZGU9PT12b2lkIDA/e2JhY2tncm91bmQ6InRyYW5zcGFyZW50Iixob3ZlcjpgdmFyKC0tbWFudGluZS1jb2xvci0ke2V9LW91dGxpbmUtaG92ZXIpYCxjb2xvcjpgdmFyKC0tbWFudGluZS1jb2xvci0ke2V9LW91dGxpbmUpYCxib3JkZXI6YCR7TigxKX0gc29saWQgdmFyKC0tbWFudGluZS1jb2xvci0ke2V9LW91dGxpbmUpYH06e2JhY2tncm91bmQ6InRyYW5zcGFyZW50Iixob3ZlcjpDdCh0LmNvbG9yc1thLmNvbG9yXVthLnNoYWRlXSwuMDUpLGNvbG9yOmB2YXIoLS1tYW50aW5lLWNvbG9yLSR7YS5jb2xvcn0tJHthLnNoYWRlfSlgLGJvcmRlcjpgJHtOKDEpfSBzb2xpZCB2YXIoLS1tYW50aW5lLWNvbG9yLSR7YS5jb2xvcn0tJHthLnNoYWRlfSlgfTp7YmFja2dyb3VuZDoidHJhbnNwYXJlbnQiLGhvdmVyOkN0KGUsLjA1KSxjb2xvcjplLGJvcmRlcjpgJHtOKDEpfSBzb2xpZCAke2V9YH07aWYobj09PSJzdWJ0bGUiKXtpZihhLmlzVGhlbWVDb2xvcil7aWYoYS5zaGFkZT09PXZvaWQgMClyZXR1cm57YmFja2dyb3VuZDoidHJhbnNwYXJlbnQiLGhvdmVyOmB2YXIoLS1tYW50aW5lLWNvbG9yLSR7ZX0tbGlnaHQtaG92ZXIpYCxjb2xvcjpgdmFyKC0tbWFudGluZS1jb2xvci0ke2V9LWxpZ2h0LWNvbG9yKWAsYm9yZGVyOmAke04oMSl9IHNvbGlkIHRyYW5zcGFyZW50YH07Y29uc3QgbD10LmNvbG9yc1thLmNvbG9yXVthLnNoYWRlXTtyZXR1cm57YmFja2dyb3VuZDoidHJhbnNwYXJlbnQiLGhvdmVyOkN0KGwsLjEyKSxjb2xvcjpgdmFyKC0tbWFudGluZS1jb2xvci0ke2EuY29sb3J9LSR7TWF0aC5taW4oYS5zaGFkZSw2KX0pYCxib3JkZXI6YCR7TigxKX0gc29saWQgdHJhbnNwYXJlbnRgfX1yZXR1cm57YmFja2dyb3VuZDoidHJhbnNwYXJlbnQiLGhvdmVyOkN0KGUsLjEyKSxjb2xvcjplLGJvcmRlcjpgJHtOKDEpfSBzb2xpZCB0cmFuc3BhcmVudGB9fXJldHVybiBuPT09InRyYW5zcGFyZW50Ij9hLmlzVGhlbWVDb2xvcj9hLnNoYWRlPT09dm9pZCAwP3tiYWNrZ3JvdW5kOiJ0cmFuc3BhcmVudCIsaG92ZXI6InRyYW5zcGFyZW50Iixjb2xvcjpgdmFyKC0tbWFudGluZS1jb2xvci0ke2V9LWxpZ2h0LWNvbG9yKWAsYm9yZGVyOmAke04oMSl9IHNvbGlkIHRyYW5zcGFyZW50YH06e2JhY2tncm91bmQ6InRyYW5zcGFyZW50Iixob3ZlcjoidHJhbnNwYXJlbnQiLGNvbG9yOmB2YXIoLS1tYW50aW5lLWNvbG9yLSR7YS5jb2xvcn0tJHtNYXRoLm1pbihhLnNoYWRlLDYpfSlgLGJvcmRlcjpgJHtOKDEpfSBzb2xpZCB0cmFuc3BhcmVudGB9OntiYWNrZ3JvdW5kOiJ0cmFuc3BhcmVudCIsaG92ZXI6InRyYW5zcGFyZW50Iixjb2xvcjplLGJvcmRlcjpgJHtOKDEpfSBzb2xpZCB0cmFuc3BhcmVudGB9Om49PT0id2hpdGUiP2EuaXNUaGVtZUNvbG9yP2Euc2hhZGU9PT12b2lkIDA/e2JhY2tncm91bmQ6InZhcigtLW1hbnRpbmUtY29sb3Itd2hpdGUpIixob3ZlcjpBdCh0LndoaXRlLC4wMSksY29sb3I6YHZhcigtLW1hbnRpbmUtY29sb3ItJHtlfS1maWxsZWQpYCxib3JkZXI6YCR7TigxKX0gc29saWQgdHJhbnNwYXJlbnRgfTp7YmFja2dyb3VuZDoidmFyKC0tbWFudGluZS1jb2xvci13aGl0ZSkiLGhvdmVyOkF0KHQud2hpdGUsLjAxKSxjb2xvcjpgdmFyKC0tbWFudGluZS1jb2xvci0ke2EuY29sb3J9LSR7YS5zaGFkZX0pYCxib3JkZXI6YCR7TigxKX0gc29saWQgdHJhbnNwYXJlbnRgfTp7YmFja2dyb3VuZDoidmFyKC0tbWFudGluZS1jb2xvci13aGl0ZSkiLGhvdmVyOkF0KHQud2hpdGUsLjAxKSxjb2xvcjplLGJvcmRlcjpgJHtOKDEpfSBzb2xpZCB0cmFuc3BhcmVudGB9Om49PT0iZ3JhZGllbnQiP3tiYWNrZ3JvdW5kOlpyKHIsdCksaG92ZXI6WnIocix0KSxjb2xvcjoidmFyKC0tbWFudGluZS1jb2xvci13aGl0ZSkiLGJvcmRlcjoibm9uZSJ9Om49PT0iZGVmYXVsdCI/e2JhY2tncm91bmQ6InZhcigtLW1hbnRpbmUtY29sb3ItZGVmYXVsdCkiLGhvdmVyOiJ2YXIoLS1tYW50aW5lLWNvbG9yLWRlZmF1bHQtaG92ZXIpIixjb2xvcjoidmFyKC0tbWFudGluZS1jb2xvci1kZWZhdWx0LWNvbG9yKSIsYm9yZGVyOmAke04oMSl9IHNvbGlkIHZhcigtLW1hbnRpbmUtY29sb3ItZGVmYXVsdC1ib3JkZXIpYH06e319O2Z1bmN0aW9uIHdjKHtjb2xvcjplLHRoZW1lOnQsYXV0b0NvbnRyYXN0Om59KXtyZXR1cm4gdC5hdXRvQ29udHJhc3QmJk5uKHtjb2xvcjplfHx0LnByaW1hcnlDb2xvcix0aGVtZTp0fSkuaXNMaWdodD8idmFyKC0tbWFudGluZS1jb2xvci1ibGFjaykiOiJ2YXIoLS1tYW50aW5lLWNvbG9yLXdoaXRlKSJ9ZnVuY3Rpb24gYXMoZSx0KXtyZXR1cm4gd2Moe2NvbG9yOmUuY29sb3JzW2UucHJpbWFyeUNvbG9yXVt3bihlLHQpXSx0aGVtZTplLGF1dG9Db250cmFzdDpudWxsfSl9Y29uc3Qgc2E9bS5jcmVhdGVDb250ZXh0KG51bGwpO2Z1bmN0aW9uIGh0KCl7Y29uc3QgZT1tLnVzZShzYSk7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJbQG1hbnRpbmUvY29yZV0gTWFudGluZVByb3ZpZGVyIHdhcyBub3QgZm91bmQgaW4gdHJlZSIpO3JldHVybiBlfWZ1bmN0aW9uIGpjKCl7cmV0dXJuIGh0KCkuY3NzVmFyaWFibGVzUmVzb2x2ZXJ9ZnVuY3Rpb24gU2MoKXtyZXR1cm4gaHQoKS5jbGFzc05hbWVzUHJlZml4fWZ1bmN0aW9uIGdvKCl7cmV0dXJuIGh0KCkuZ2V0U3R5bGVOb25jZX1mdW5jdGlvbiBDYygpe3JldHVybiBodCgpLndpdGhTdGF0aWNDbGFzc2VzfWZ1bmN0aW9uIE5jKCl7cmV0dXJuIGh0KCkuaGVhZGxlc3N9ZnVuY3Rpb24ga2MoKXtyZXR1cm4gaHQoKS5zdHlsZXNUcmFuc2Zvcm0/LnN4fWZ1bmN0aW9uIFJjKCl7cmV0dXJuIGh0KCkuc3R5bGVzVHJhbnNmb3JtPy5zdHlsZXN9ZnVuY3Rpb24gc3IoKXtyZXR1cm4gaHQoKS5lbnZ8fCJkZWZhdWx0In1mdW5jdGlvbiBfYygpe3JldHVybiBodCgpLmRlZHVwbGljYXRlSW5saW5lU3R5bGVzfWZ1bmN0aW9uIEh0KGUsdCl7Y29uc3Qgbj10eXBlb2Ygd2luZG93PCJ1IiYmIm1hdGNoTWVkaWEiaW4gd2luZG93JiZ3aW5kb3cubWF0Y2hNZWRpYSgiKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSIpPy5tYXRjaGVzLHI9ZSE9PSJhdXRvIj9lOm4/ImRhcmsiOiJsaWdodCI7dCgpPy5zZXRBdHRyaWJ1dGUoImRhdGEtbWFudGluZS1jb2xvci1zY2hlbWUiLHIpfWZ1bmN0aW9uICRjKHttYW5hZ2VyOmUsZGVmYXVsdENvbG9yU2NoZW1lOnQsZ2V0Um9vdEVsZW1lbnQ6bixmb3JjZUNvbG9yU2NoZW1lOnJ9KXtjb25zdCBzPW0udXNlUmVmKG51bGwpLFthLGldPW0udXNlU3RhdGUoKCk9PmUuZ2V0KHQpKSxsPXJ8fGEsYz1tLnVzZUNhbGxiYWNrKHU9PntyfHwoSHQodSxuKSxpKHUpLGUuc2V0KHUpKX0sW2Uuc2V0LGwscl0pLGQ9bS51c2VDYWxsYmFjaygoKT0+e2kodCksSHQodCxuKSxlLmNsZWFyKCl9LFtlLmNsZWFyLHRdKTtyZXR1cm4gbS51c2VFZmZlY3QoKCk9PihlLnN1YnNjcmliZShjKSxlLnVuc3Vic2NyaWJlKSxbZS5zdWJzY3JpYmUsZS51bnN1YnNjcmliZV0pLEl0KCgpPT57SHQoZS5nZXQodCksbil9LFtdKSxtLnVzZUVmZmVjdCgoKT0+e2lmKHIpcmV0dXJuIEh0KHIsbiksKCk9Pnt9O3I9PT12b2lkIDAmJkh0KGEsbiksdHlwZW9mIHdpbmRvdzwidSImJiJtYXRjaE1lZGlhImluIHdpbmRvdyYmKHMuY3VycmVudD13aW5kb3cubWF0Y2hNZWRpYSgiKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSIpKTtjb25zdCB1PWY9PnthPT09ImF1dG8iJiZIdChmLm1hdGNoZXM/ImRhcmsiOiJsaWdodCIsbil9O3JldHVybiBzLmN1cnJlbnQ/LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsdSksKCk9PnMuY3VycmVudD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix1KX0sW2Escl0pLHtjb2xvclNjaGVtZTpsLHNldENvbG9yU2NoZW1lOmMsY2xlYXJDb2xvclNjaGVtZTpkfX1jb25zdCBUYz17ZGFyazpbIiNDOUM5QzkiLCIjYjhiOGI4IiwiIzgyODI4MiIsIiM2OTY5NjkiLCIjNDI0MjQyIiwiIzNiM2IzYiIsIiMyZTJlMmUiLCIjMjQyNDI0IiwiIzFmMWYxZiIsIiMxNDE0MTQiXSxncmF5OlsiI2Y4ZjlmYSIsIiNmMWYzZjUiLCIjZTllY2VmIiwiI2RlZTJlNiIsIiNjZWQ0ZGEiLCIjYWRiNWJkIiwiIzg2OGU5NiIsIiM0OTUwNTciLCIjMzQzYTQwIiwiIzIxMjUyOSJdLHJlZDpbIiNmZmY1ZjUiLCIjZmZlM2UzIiwiI2ZmYzljOSIsIiNmZmE4YTgiLCIjZmY4Nzg3IiwiI2ZmNmI2YiIsIiNmYTUyNTIiLCIjZjAzZTNlIiwiI2UwMzEzMSIsIiNjOTJhMmEiXSxwaW5rOlsiI2ZmZjBmNiIsIiNmZmRlZWIiLCIjZmNjMmQ3IiwiI2ZhYTJjMSIsIiNmNzgzYWMiLCIjZjA2NTk1IiwiI2U2NDk4MCIsIiNkNjMzNmMiLCIjYzIyNTVjIiwiI2E2MWU0ZCJdLGdyYXBlOlsiI2Y4ZjBmYyIsIiNmM2Q5ZmEiLCIjZWViZWZhIiwiI2U1OTlmNyIsIiNkYTc3ZjIiLCIjY2M1ZGU4IiwiI2JlNGJkYiIsIiNhZTNlYzkiLCIjOWMzNmI1IiwiIzg2MmU5YyJdLHZpb2xldDpbIiNmM2YwZmYiLCIjZTVkYmZmIiwiI2QwYmZmZiIsIiNiMTk3ZmMiLCIjOTc3NWZhIiwiIzg0NWVmNyIsIiM3OTUwZjIiLCIjNzA0OGU4IiwiIzY3NDFkOSIsIiM1ZjNkYzQiXSxpbmRpZ286WyIjZWRmMmZmIiwiI2RiZTRmZiIsIiNiYWM4ZmYiLCIjOTFhN2ZmIiwiIzc0OGZmYyIsIiM1YzdjZmEiLCIjNGM2ZWY1IiwiIzQyNjNlYiIsIiMzYjViZGIiLCIjMzY0ZmM3Il0sYmx1ZTpbIiNlN2Y1ZmYiLCIjZDBlYmZmIiwiI2E1ZDhmZiIsIiM3NGMwZmMiLCIjNGRhYmY3IiwiIzMzOWFmMCIsIiMyMjhiZTYiLCIjMWM3ZWQ2IiwiIzE5NzFjMiIsIiMxODY0YWIiXSxjeWFuOlsiI2UzZmFmYyIsIiNjNWY2ZmEiLCIjOTllOWYyIiwiIzY2ZDllOCIsIiMzYmM5ZGIiLCIjMjJiOGNmIiwiIzE1YWFiZiIsIiMxMDk4YWQiLCIjMGM4NTk5IiwiIzBiNzI4NSJdLHRlYWw6WyIjZTZmY2Y1IiwiI2MzZmFlOCIsIiM5NmYyZDciLCIjNjNlNmJlIiwiIzM4ZDlhOSIsIiMyMGM5OTciLCIjMTJiODg2IiwiIzBjYTY3OCIsIiMwOTkyNjgiLCIjMDg3ZjViIl0sZ3JlZW46WyIjZWJmYmVlIiwiI2QzZjlkOCIsIiNiMmYyYmIiLCIjOGNlOTlhIiwiIzY5ZGI3YyIsIiM1MWNmNjYiLCIjNDBjMDU3IiwiIzM3YjI0ZCIsIiMyZjllNDQiLCIjMmI4YTNlIl0sbGltZTpbIiNmNGZjZTMiLCIjZTlmYWM4IiwiI2Q4ZjVhMiIsIiNjMGViNzUiLCIjYTllMzRiIiwiIzk0ZDgyZCIsIiM4MmM5MWUiLCIjNzRiODE2IiwiIzY2YTgwZiIsIiM1Yzk0MGQiXSx5ZWxsb3c6WyIjZmZmOWRiIiwiI2ZmZjNiZiIsIiNmZmVjOTkiLCIjZmZlMDY2IiwiI2ZmZDQzYiIsIiNmY2M0MTkiLCIjZmFiMDA1IiwiI2Y1OWYwMCIsIiNmMDhjMDAiLCIjZTY3NzAwIl0sb3JhbmdlOlsiI2ZmZjRlNiIsIiNmZmU4Y2MiLCIjZmZkOGE4IiwiI2ZmYzA3OCIsIiNmZmE5NGQiLCIjZmY5MjJiIiwiI2ZkN2UxNCIsIiNmNzY3MDciLCIjZTg1OTBjIiwiI2Q5NDgwZiJdfSxpcz0iLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBTZWdvZSBVSSwgUm9ib3RvLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmLCBBcHBsZSBDb2xvciBFbW9qaSwgU2Vnb2UgVUkgRW1vamkiLGJvPXtzY2FsZToxLGZvbnRTbW9vdGhpbmc6ITAsZm9jdXNSaW5nOiJhdXRvIix3aGl0ZToiI2ZmZiIsYmxhY2s6IiMwMDAiLGNvbG9yczpUYyxwcmltYXJ5U2hhZGU6e2xpZ2h0OjYsZGFyazo4fSxwcmltYXJ5Q29sb3I6ImJsdWUiLHZhcmlhbnRDb2xvclJlc29sdmVyOnhjLGF1dG9Db250cmFzdDohMSxsdW1pbmFuY2VUaHJlc2hvbGQ6LjMsZm9udEZhbWlseTppcyxmb250RmFtaWx5TW9ub3NwYWNlOiJ1aS1tb25vc3BhY2UsIFNGTW9uby1SZWd1bGFyLCBNZW5sbywgTW9uYWNvLCBDb25zb2xhcywgTGliZXJhdGlvbiBNb25vLCBDb3VyaWVyIE5ldywgbW9ub3NwYWNlIixyZXNwZWN0UmVkdWNlZE1vdGlvbjohMSxjdXJzb3JUeXBlOiJkZWZhdWx0IixkZWZhdWx0R3JhZGllbnQ6e2Zyb206ImJsdWUiLHRvOiJjeWFuIixkZWc6NDV9LGRlZmF1bHRSYWRpdXM6Im1kIixhY3RpdmVDbGFzc05hbWU6Im1hbnRpbmUtYWN0aXZlIixmb2N1c0NsYXNzTmFtZToiIixoZWFkaW5nczp7Zm9udEZhbWlseTppcyxmb250V2VpZ2h0OiI3MDAiLHRleHRXcmFwOiJ3cmFwIixzaXplczp7aDE6e2ZvbnRTaXplOk4oMzQpLGxpbmVIZWlnaHQ6IjEuMyJ9LGgyOntmb250U2l6ZTpOKDI2KSxsaW5lSGVpZ2h0OiIxLjM1In0saDM6e2ZvbnRTaXplOk4oMjIpLGxpbmVIZWlnaHQ6IjEuNCJ9LGg0Ontmb250U2l6ZTpOKDE4KSxsaW5lSGVpZ2h0OiIxLjQ1In0saDU6e2ZvbnRTaXplOk4oMTYpLGxpbmVIZWlnaHQ6IjEuNSJ9LGg2Ontmb250U2l6ZTpOKDE0KSxsaW5lSGVpZ2h0OiIxLjUifX19LGZvbnRTaXplczp7eHM6TigxMiksc206TigxNCksbWQ6TigxNiksbGc6TigxOCkseGw6TigyMCl9LGxpbmVIZWlnaHRzOnt4czoiMS40IixzbToiMS40NSIsbWQ6IjEuNTUiLGxnOiIxLjYiLHhsOiIxLjY1In0sZm9udFdlaWdodHM6e3JlZ3VsYXI6IjQwMCIsbWVkaXVtOiI2MDAiLGJvbGQ6IjcwMCJ9LHJhZGl1czp7eHM6TigyKSxzbTpOKDQpLG1kOk4oOCksbGc6TigxNikseGw6TigzMil9LHNwYWNpbmc6e3hzOk4oMTApLHNtOk4oMTIpLG1kOk4oMTYpLGxnOk4oMjApLHhsOk4oMzIpfSxicmVha3BvaW50czp7eHM6IjM2ZW0iLHNtOiI0OGVtIixtZDoiNjJlbSIsbGc6Ijc1ZW0iLHhsOiI4OGVtIn0sc2hhZG93czp7eHM6YDAgJHtOKDEpfSAke04oMyl9IHJnYmEoMCwgMCwgMCwgMC4wNSksIDAgJHtOKDEpfSAke04oMil9IHJnYmEoMCwgMCwgMCwgMC4xKWAsc206YDAgJHtOKDEpfSAke04oMyl9IHJnYmEoMCwgMCwgMCwgMC4wNSksIHJnYmEoMCwgMCwgMCwgMC4wNSkgMCAke04oMTApfSAke04oMTUpfSAke04oLTUpfSwgcmdiYSgwLCAwLCAwLCAwLjA0KSAwICR7Tig3KX0gJHtOKDcpfSAke04oLTUpfWAsbWQ6YDAgJHtOKDEpfSAke04oMyl9IHJnYmEoMCwgMCwgMCwgMC4wNSksIHJnYmEoMCwgMCwgMCwgMC4wNSkgMCAke04oMjApfSAke04oMjUpfSAke04oLTUpfSwgcmdiYSgwLCAwLCAwLCAwLjA0KSAwICR7TigxMCl9ICR7TigxMCl9ICR7TigtNSl9YCxsZzpgMCAke04oMSl9ICR7TigzKX0gcmdiYSgwLCAwLCAwLCAwLjA1KSwgcmdiYSgwLCAwLCAwLCAwLjA1KSAwICR7TigyOCl9ICR7TigyMyl9ICR7TigtNyl9LCByZ2JhKDAsIDAsIDAsIDAuMDQpIDAgJHtOKDEyKX0gJHtOKDEyKX0gJHtOKC03KX1gLHhsOmAwICR7TigxKX0gJHtOKDMpfSByZ2JhKDAsIDAsIDAsIDAuMDUpLCByZ2JhKDAsIDAsIDAsIDAuMDUpIDAgJHtOKDM2KX0gJHtOKDI4KX0gJHtOKC03KX0sIHJnYmEoMCwgMCwgMCwgMC4wNCkgMCAke04oMTcpfSAke04oMTcpfSAke04oLTcpfWB9LG90aGVyOnt9LGNvbXBvbmVudHM6e319LFBjPSJbQG1hbnRpbmUvY29yZV0gTWFudGluZVByb3ZpZGVyOiBJbnZhbGlkIHRoZW1lLnByaW1hcnlDb2xvciwgaXQgYWNjZXB0cyBvbmx5IGtleSBvZiB0aGVtZS5jb2xvcnMsIGxlYXJuIG1vcmUg4oCTIGh0dHBzOi8vbWFudGluZS5kZXYvdGhlbWluZy9jb2xvcnMvI3ByaW1hcnktY29sb3IiLGxzPSJbQG1hbnRpbmUvY29yZV0gTWFudGluZVByb3ZpZGVyOiBJbnZhbGlkIHRoZW1lLnByaW1hcnlTaGFkZSwgaXQgYWNjZXB0cyBvbmx5IDAtOSBpbnRlZ2VycyBvciBhbiBvYmplY3QgeyBsaWdodDogMC05LCBkYXJrOiAwLTkgfSI7ZnVuY3Rpb24gTXIoZSl7cmV0dXJuIGU8MHx8ZT45PyExOnBhcnNlSW50KGUudG9TdHJpbmcoKSwxMCk9PT1lfWZ1bmN0aW9uIGNzKGUpe2lmKCEoZS5wcmltYXJ5Q29sb3IgaW4gZS5jb2xvcnMpKXRocm93IG5ldyBFcnJvcihQYyk7aWYodHlwZW9mIGUucHJpbWFyeVNoYWRlPT0ib2JqZWN0IiYmKCFNcihlLnByaW1hcnlTaGFkZS5kYXJrKXx8IU1yKGUucHJpbWFyeVNoYWRlLmxpZ2h0KSkpdGhyb3cgbmV3IEVycm9yKGxzKTtpZih0eXBlb2YgZS5wcmltYXJ5U2hhZGU9PSJudW1iZXIiJiYhTXIoZS5wcmltYXJ5U2hhZGUpKXRocm93IG5ldyBFcnJvcihscyl9ZnVuY3Rpb24gRWMoZSx0KXtpZighdClyZXR1cm4gY3MoZSksZTtjb25zdCBuPWZvKGUsdCk7cmV0dXJuIHQuZm9udEZhbWlseSYmIXQuaGVhZGluZ3M/LmZvbnRGYW1pbHkmJihuLmhlYWRpbmdzLmZvbnRGYW1pbHk9dC5mb250RmFtaWx5KSxjcyhuKSxufWNvbnN0IHlvPW0uY3JlYXRlQ29udGV4dChudWxsKSxBYz0oKT0+bS51c2UoeW8pfHxibztmdW5jdGlvbiBSdCgpe2NvbnN0IGU9bS51c2UoeW8pO2lmKCFlKXRocm93IG5ldyBFcnJvcigiQG1hbnRpbmUvY29yZTogTWFudGluZVByb3ZpZGVyIHdhcyBub3QgZm91bmQgaW4gY29tcG9uZW50IHRyZWUsIG1ha2Ugc3VyZSB5b3UgaGF2ZSBpdCBpbiB5b3VyIGFwcCIpO3JldHVybiBlfWZ1bmN0aW9uIGFhKHt0aGVtZTplLGNoaWxkcmVuOnQsaW5oZXJpdDpuPSEwfSl7Y29uc3Qgcj1BYygpO3JldHVybiBvLmpzeCh5byx7dmFsdWU6bS51c2VNZW1vKCgpPT5FYyhuP3I6Ym8sZSksW2UscixuXSksY2hpbGRyZW46dH0pfWFhLmRpc3BsYXlOYW1lPSJAbWFudGluZS9jb3JlL01hbnRpbmVUaGVtZVByb3ZpZGVyIjtmdW5jdGlvbiBEcihlKXtyZXR1cm4gT2JqZWN0LmVudHJpZXMoZSkubWFwKChbdCxuXSk9PmAke3R9OiAke259O2ApLmpvaW4oIiIpfWZ1bmN0aW9uIGlhKGUsdCl7Y29uc3Qgbj10P1t0XTpbIjpyb290IiwiOmhvc3QiXSxyPURyKGUudmFyaWFibGVzKSxzPXI/YCR7bi5qb2luKCIsICIpfXske3J9fWA6IiIsYT1EcihlLmRhcmspLGk9RHIoZS5saWdodCksbD1jPT5uLm1hcChkPT5kPT09Ijpob3N0Ij9gJHtkfShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT0iJHtjfSJdKWA6YCR7ZH1bZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT0iJHtjfSJdYCkuam9pbigiLCAiKTtyZXR1cm5gJHtzfQoKJHthP2Ake2woImRhcmsiKX17JHthfX1gOiIifQoKJHtpP2Ake2woImxpZ2h0Iil9eyR7aX19YDoiIn1gfWZ1bmN0aW9uIHpuKHt0aGVtZTplLGNvbG9yOnQsY29sb3JTY2hlbWU6bixuYW1lOnI9dCx3aXRoQ29sb3JWYWx1ZXM6cz0hMH0pe2lmKCFlLmNvbG9yc1t0XSlyZXR1cm57fTtpZihuPT09ImxpZ2h0Iil7Y29uc3QgbD13bihlLCJsaWdodCIpLGM9e1tgLS1tYW50aW5lLWNvbG9yLSR7cn0tdGV4dGBdOmB2YXIoLS1tYW50aW5lLWNvbG9yLSR7cn0tZmlsbGVkKWAsW2AtLW1hbnRpbmUtY29sb3ItJHtyfS1maWxsZWRgXTpgdmFyKC0tbWFudGluZS1jb2xvci0ke3J9LSR7bH0pYCxbYC0tbWFudGluZS1jb2xvci0ke3J9LWZpbGxlZC1ob3ZlcmBdOmB2YXIoLS1tYW50aW5lLWNvbG9yLSR7cn0tJHtsPT09OT84OmwrMX0pYCxbYC0tbWFudGluZS1jb2xvci0ke3J9LWxpZ2h0YF06YHZhcigtLW1hbnRpbmUtY29sb3ItJHtyfS0xKWAsW2AtLW1hbnRpbmUtY29sb3ItJHtyfS1saWdodC1ob3ZlcmBdOmB2YXIoLS1tYW50aW5lLWNvbG9yLSR7cn0tMilgLFtgLS1tYW50aW5lLWNvbG9yLSR7cn0tbGlnaHQtY29sb3JgXTpgdmFyKC0tbWFudGluZS1jb2xvci0ke3J9LTkpYCxbYC0tbWFudGluZS1jb2xvci0ke3J9LW91dGxpbmVgXTpgdmFyKC0tbWFudGluZS1jb2xvci0ke3J9LSR7bH0pYCxbYC0tbWFudGluZS1jb2xvci0ke3J9LW91dGxpbmUtaG92ZXJgXTpzcyhlLmNvbG9yc1t0XVtsXSwuMDUpfTtyZXR1cm4gcz97W2AtLW1hbnRpbmUtY29sb3ItJHtyfS0wYF06ZS5jb2xvcnNbdF1bMF0sW2AtLW1hbnRpbmUtY29sb3ItJHtyfS0xYF06ZS5jb2xvcnNbdF1bMV0sW2AtLW1hbnRpbmUtY29sb3ItJHtyfS0yYF06ZS5jb2xvcnNbdF1bMl0sW2AtLW1hbnRpbmUtY29sb3ItJHtyfS0zYF06ZS5jb2xvcnNbdF1bM10sW2AtLW1hbnRpbmUtY29sb3ItJHtyfS00YF06ZS5jb2xvcnNbdF1bNF0sW2AtLW1hbnRpbmUtY29sb3ItJHtyfS01YF06ZS5jb2xvcnNbdF1bNV0sW2AtLW1hbnRpbmUtY29sb3ItJHtyfS02YF06ZS5jb2xvcnNbdF1bNl0sW2AtLW1hbnRpbmUtY29sb3ItJHtyfS03YF06ZS5jb2xvcnNbdF1bN10sW2AtLW1hbnRpbmUtY29sb3ItJHtyfS04YF06ZS5jb2xvcnNbdF1bOF0sW2AtLW1hbnRpbmUtY29sb3ItJHtyfS05YF06ZS5jb2xvcnNbdF1bOV0sLi4uY306Y31jb25zdCBhPXduKGUsImRhcmsiKSxpPXtbYC0tbWFudGluZS1jb2xvci0ke3J9LXRleHRgXTpgdmFyKC0tbWFudGluZS1jb2xvci0ke3J9LTQpYCxbYC0tbWFudGluZS1jb2xvci0ke3J9LWZpbGxlZGBdOmB2YXIoLS1tYW50aW5lLWNvbG9yLSR7cn0tJHthfSlgLFtgLS1tYW50aW5lLWNvbG9yLSR7cn0tZmlsbGVkLWhvdmVyYF06YHZhcigtLW1hbnRpbmUtY29sb3ItJHtyfS0ke2E9PT05Pzg6YSsxfSlgLFtgLS1tYW50aW5lLWNvbG9yLSR7cn0tbGlnaHRgXTpBdChlLmNvbG9yc1t0XVs5XSwuNSksW2AtLW1hbnRpbmUtY29sb3ItJHtyfS1saWdodC1ob3ZlcmBdOkF0KGUuY29sb3JzW3RdWzldLC4zKSxbYC0tbWFudGluZS1jb2xvci0ke3J9LWxpZ2h0LWNvbG9yYF06YHZhcigtLW1hbnRpbmUtY29sb3ItJHtyfS0wKWAsW2AtLW1hbnRpbmUtY29sb3ItJHtyfS1vdXRsaW5lYF06YHZhcigtLW1hbnRpbmUtY29sb3ItJHtyfS0ke01hdGgubWF4KGEtNCwwKX0pYCxbYC0tbWFudGluZS1jb2xvci0ke3J9LW91dGxpbmUtaG92ZXJgXTpzcyhlLmNvbG9yc1t0XVtNYXRoLm1heChhLTQsMCldLC4wNSl9O3JldHVybiBzP3tbYC0tbWFudGluZS1jb2xvci0ke3J9LTBgXTplLmNvbG9yc1t0XVswXSxbYC0tbWFudGluZS1jb2xvci0ke3J9LTFgXTplLmNvbG9yc1t0XVsxXSxbYC0tbWFudGluZS1jb2xvci0ke3J9LTJgXTplLmNvbG9yc1t0XVsyXSxbYC0tbWFudGluZS1jb2xvci0ke3J9LTNgXTplLmNvbG9yc1t0XVszXSxbYC0tbWFudGluZS1jb2xvci0ke3J9LTRgXTplLmNvbG9yc1t0XVs0XSxbYC0tbWFudGluZS1jb2xvci0ke3J9LTVgXTplLmNvbG9yc1t0XVs1XSxbYC0tbWFudGluZS1jb2xvci0ke3J9LTZgXTplLmNvbG9yc1t0XVs2XSxbYC0tbWFudGluZS1jb2xvci0ke3J9LTdgXTplLmNvbG9yc1t0XVs3XSxbYC0tbWFudGluZS1jb2xvci0ke3J9LThgXTplLmNvbG9yc1t0XVs4XSxbYC0tbWFudGluZS1jb2xvci0ke3J9LTlgXTplLmNvbG9yc1t0XVs5XSwuLi5pfTppfWZ1bmN0aW9uIE9jKGUpe3JldHVybiEhZSYmdHlwZW9mIGU9PSJvYmplY3QiJiYibWFudGluZS12aXJ0dWFsLWNvbG9yImluIGV9ZnVuY3Rpb24gUHQoZSx0LG4pe0FlKHQpLmZvckVhY2gocj0+T2JqZWN0LmFzc2lnbihlLHtbYC0tbWFudGluZS0ke259LSR7cn1gXTp0W3JdfSkpfWNvbnN0IGxhPWU9Pntjb25zdCB0PXduKGUsImxpZ2h0Iiksbj1lLmRlZmF1bHRSYWRpdXMgaW4gZS5yYWRpdXM/ZS5yYWRpdXNbZS5kZWZhdWx0UmFkaXVzXTpOKGUuZGVmYXVsdFJhZGl1cykscj17dmFyaWFibGVzOnsiLS1tYW50aW5lLXotaW5kZXgtYXBwIjoiMTAwIiwiLS1tYW50aW5lLXotaW5kZXgtbW9kYWwiOiIyMDAiLCItLW1hbnRpbmUtei1pbmRleC1wb3BvdmVyIjoiMzAwIiwiLS1tYW50aW5lLXotaW5kZXgtb3ZlcmxheSI6IjQwMCIsIi0tbWFudGluZS16LWluZGV4LW1heCI6Ijk5OTkiLCItLW1hbnRpbmUtc2NhbGUiOmUuc2NhbGUudG9TdHJpbmcoKSwiLS1tYW50aW5lLWN1cnNvci10eXBlIjplLmN1cnNvclR5cGUsIi0tbWFudGluZS13ZWJraXQtZm9udC1zbW9vdGhpbmciOmUuZm9udFNtb290aGluZz8iYW50aWFsaWFzZWQiOiJ1bnNldCIsIi0tbWFudGluZS1tb3otZm9udC1zbW9vdGhpbmciOmUuZm9udFNtb290aGluZz8iZ3JheXNjYWxlIjoidW5zZXQiLCItLW1hbnRpbmUtY29sb3Itd2hpdGUiOmUud2hpdGUsIi0tbWFudGluZS1jb2xvci1ibGFjayI6ZS5ibGFjaywiLS1tYW50aW5lLWxpbmUtaGVpZ2h0IjplLmxpbmVIZWlnaHRzLm1kLCItLW1hbnRpbmUtZm9udC1mYW1pbHkiOmUuZm9udEZhbWlseSwiLS1tYW50aW5lLWZvbnQtZmFtaWx5LW1vbm9zcGFjZSI6ZS5mb250RmFtaWx5TW9ub3NwYWNlLCItLW1hbnRpbmUtZm9udC1mYW1pbHktaGVhZGluZ3MiOmUuaGVhZGluZ3MuZm9udEZhbWlseSwiLS1tYW50aW5lLWhlYWRpbmctZm9udC13ZWlnaHQiOmUuaGVhZGluZ3MuZm9udFdlaWdodCwiLS1tYW50aW5lLWhlYWRpbmctdGV4dC13cmFwIjplLmhlYWRpbmdzLnRleHRXcmFwLCItLW1hbnRpbmUtcmFkaXVzLWRlZmF1bHQiOm4sIi0tbWFudGluZS1wcmltYXJ5LWNvbG9yLWZpbGxlZCI6YHZhcigtLW1hbnRpbmUtY29sb3ItJHtlLnByaW1hcnlDb2xvcn0tZmlsbGVkKWAsIi0tbWFudGluZS1wcmltYXJ5LWNvbG9yLWZpbGxlZC1ob3ZlciI6YHZhcigtLW1hbnRpbmUtY29sb3ItJHtlLnByaW1hcnlDb2xvcn0tZmlsbGVkLWhvdmVyKWAsIi0tbWFudGluZS1wcmltYXJ5LWNvbG9yLWxpZ2h0IjpgdmFyKC0tbWFudGluZS1jb2xvci0ke2UucHJpbWFyeUNvbG9yfS1saWdodClgLCItLW1hbnRpbmUtcHJpbWFyeS1jb2xvci1saWdodC1ob3ZlciI6YHZhcigtLW1hbnRpbmUtY29sb3ItJHtlLnByaW1hcnlDb2xvcn0tbGlnaHQtaG92ZXIpYCwiLS1tYW50aW5lLXByaW1hcnktY29sb3ItbGlnaHQtY29sb3IiOmB2YXIoLS1tYW50aW5lLWNvbG9yLSR7ZS5wcmltYXJ5Q29sb3J9LWxpZ2h0LWNvbG9yKWB9LGxpZ2h0OnsiLS1tYW50aW5lLWNvbG9yLXNjaGVtZSI6ImxpZ2h0IiwiLS1tYW50aW5lLXByaW1hcnktY29sb3ItY29udHJhc3QiOmFzKGUsImxpZ2h0IiksIi0tbWFudGluZS1jb2xvci1icmlnaHQiOiJ2YXIoLS1tYW50aW5lLWNvbG9yLWJsYWNrKSIsIi0tbWFudGluZS1jb2xvci10ZXh0IjplLmJsYWNrLCItLW1hbnRpbmUtY29sb3ItYm9keSI6ZS53aGl0ZSwiLS1tYW50aW5lLWNvbG9yLWVycm9yIjoidmFyKC0tbWFudGluZS1jb2xvci1yZWQtNikiLCItLW1hbnRpbmUtY29sb3ItcGxhY2Vob2xkZXIiOiJ2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktNSkiLCItLW1hbnRpbmUtY29sb3ItYW5jaG9yIjpgdmFyKC0tbWFudGluZS1jb2xvci0ke2UucHJpbWFyeUNvbG9yfS0ke3R9KWAsIi0tbWFudGluZS1jb2xvci1kZWZhdWx0IjoidmFyKC0tbWFudGluZS1jb2xvci13aGl0ZSkiLCItLW1hbnRpbmUtY29sb3ItZGVmYXVsdC1ob3ZlciI6InZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS0wKSIsIi0tbWFudGluZS1jb2xvci1kZWZhdWx0LWNvbG9yIjoidmFyKC0tbWFudGluZS1jb2xvci1ibGFjaykiLCItLW1hbnRpbmUtY29sb3ItZGVmYXVsdC1ib3JkZXIiOiJ2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktNCkiLCItLW1hbnRpbmUtY29sb3ItZGltbWVkIjoidmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTYpIiwiLS1tYW50aW5lLWNvbG9yLWRpc2FibGVkIjoidmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTIpIiwiLS1tYW50aW5lLWNvbG9yLWRpc2FibGVkLWNvbG9yIjoidmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTUpIiwiLS1tYW50aW5lLWNvbG9yLWRpc2FibGVkLWJvcmRlciI6InZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS0zKSJ9LGRhcms6eyItLW1hbnRpbmUtY29sb3Itc2NoZW1lIjoiZGFyayIsIi0tbWFudGluZS1wcmltYXJ5LWNvbG9yLWNvbnRyYXN0IjphcyhlLCJkYXJrIiksIi0tbWFudGluZS1jb2xvci1icmlnaHQiOiJ2YXIoLS1tYW50aW5lLWNvbG9yLXdoaXRlKSIsIi0tbWFudGluZS1jb2xvci10ZXh0IjoidmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTApIiwiLS1tYW50aW5lLWNvbG9yLWJvZHkiOiJ2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNykiLCItLW1hbnRpbmUtY29sb3ItZXJyb3IiOiJ2YXIoLS1tYW50aW5lLWNvbG9yLXJlZC04KSIsIi0tbWFudGluZS1jb2xvci1wbGFjZWhvbGRlciI6InZhcigtLW1hbnRpbmUtY29sb3ItZGFyay0zKSIsIi0tbWFudGluZS1jb2xvci1hbmNob3IiOmB2YXIoLS1tYW50aW5lLWNvbG9yLSR7ZS5wcmltYXJ5Q29sb3J9LTQpYCwiLS1tYW50aW5lLWNvbG9yLWRlZmF1bHQiOiJ2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNikiLCItLW1hbnRpbmUtY29sb3ItZGVmYXVsdC1ob3ZlciI6InZhcigtLW1hbnRpbmUtY29sb3ItZGFyay01KSIsIi0tbWFudGluZS1jb2xvci1kZWZhdWx0LWNvbG9yIjoidmFyKC0tbWFudGluZS1jb2xvci13aGl0ZSkiLCItLW1hbnRpbmUtY29sb3ItZGVmYXVsdC1ib3JkZXIiOiJ2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNCkiLCItLW1hbnRpbmUtY29sb3ItZGltbWVkIjoidmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTIpIiwiLS1tYW50aW5lLWNvbG9yLWRpc2FibGVkIjoidmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTYpIiwiLS1tYW50aW5lLWNvbG9yLWRpc2FibGVkLWNvbG9yIjoidmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTMpIiwiLS1tYW50aW5lLWNvbG9yLWRpc2FibGVkLWJvcmRlciI6InZhcigtLW1hbnRpbmUtY29sb3ItZGFyay00KSJ9fTtQdChyLnZhcmlhYmxlcyxlLmJyZWFrcG9pbnRzLCJicmVha3BvaW50IiksUHQoci52YXJpYWJsZXMsZS5zcGFjaW5nLCJzcGFjaW5nIiksUHQoci52YXJpYWJsZXMsZS5mb250U2l6ZXMsImZvbnQtc2l6ZSIpLFB0KHIudmFyaWFibGVzLGUubGluZUhlaWdodHMsImxpbmUtaGVpZ2h0IiksUHQoci52YXJpYWJsZXMsZS5zaGFkb3dzLCJzaGFkb3ciKSxQdChyLnZhcmlhYmxlcyxlLnJhZGl1cywicmFkaXVzIiksUHQoci52YXJpYWJsZXMsZS5mb250V2VpZ2h0cywiZm9udC13ZWlnaHQiKSxlLmNvbG9yc1tlLnByaW1hcnlDb2xvcl0uZm9yRWFjaCgoYSxpKT0+e3IudmFyaWFibGVzW2AtLW1hbnRpbmUtcHJpbWFyeS1jb2xvci0ke2l9YF09YHZhcigtLW1hbnRpbmUtY29sb3ItJHtlLnByaW1hcnlDb2xvcn0tJHtpfSlgfSksQWUoZS5jb2xvcnMpLmZvckVhY2goYT0+e2NvbnN0IGk9ZS5jb2xvcnNbYV07aWYoT2MoaSkpe09iamVjdC5hc3NpZ24oci5saWdodCx6bih7dGhlbWU6ZSxuYW1lOmkubmFtZSxjb2xvcjppLmxpZ2h0LGNvbG9yU2NoZW1lOiJsaWdodCIsd2l0aENvbG9yVmFsdWVzOiEwfSkpLE9iamVjdC5hc3NpZ24oci5kYXJrLHpuKHt0aGVtZTplLG5hbWU6aS5uYW1lLGNvbG9yOmkuZGFyayxjb2xvclNjaGVtZToiZGFyayIsd2l0aENvbG9yVmFsdWVzOiEwfSkpO3JldHVybn1pLmZvckVhY2goKGwsYyk9PntyLnZhcmlhYmxlc1tgLS1tYW50aW5lLWNvbG9yLSR7YX0tJHtjfWBdPWx9KSxPYmplY3QuYXNzaWduKHIubGlnaHQsem4oe3RoZW1lOmUsY29sb3I6YSxjb2xvclNjaGVtZToibGlnaHQiLHdpdGhDb2xvclZhbHVlczohMX0pKSxPYmplY3QuYXNzaWduKHIuZGFyayx6bih7dGhlbWU6ZSxjb2xvcjphLGNvbG9yU2NoZW1lOiJkYXJrIix3aXRoQ29sb3JWYWx1ZXM6ITF9KSl9KTtjb25zdCBzPWUuaGVhZGluZ3Muc2l6ZXM7cmV0dXJuIEFlKHMpLmZvckVhY2goYT0+e3IudmFyaWFibGVzW2AtLW1hbnRpbmUtJHthfS1mb250LXNpemVgXT1zW2FdLmZvbnRTaXplLHIudmFyaWFibGVzW2AtLW1hbnRpbmUtJHthfS1saW5lLWhlaWdodGBdPXNbYV0ubGluZUhlaWdodCxyLnZhcmlhYmxlc1tgLS1tYW50aW5lLSR7YX0tZm9udC13ZWlnaHRgXT1zW2FdLmZvbnRXZWlnaHR8fGUuaGVhZGluZ3MuZm9udFdlaWdodH0pLHJ9O2Z1bmN0aW9uIE1jKCl7Y29uc3QgZT1SdCgpLHQ9Z28oKSxuPUFlKGUuYnJlYWtwb2ludHMpLnJlZHVjZSgocixzKT0+e2NvbnN0IGE9ZS5icmVha3BvaW50c1tzXS5pbmNsdWRlcygicHgiKSxpPXZuKGUuYnJlYWtwb2ludHNbc10pO3JldHVybmAke3J9QG1lZGlhIChtYXgtd2lkdGg6ICR7YT9gJHtpLS4xfXB4YDpycyhpLS4xKX0pIHsubWFudGluZS12aXNpYmxlLWZyb20tJHtzfSB7ZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O319QG1lZGlhIChtaW4td2lkdGg6ICR7YT9gJHtpfXB4YDpycyhpKX0pIHsubWFudGluZS1oaWRkZW4tZnJvbS0ke3N9IHtkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7fX1gfSwiIik7cmV0dXJuIG8uanN4KCJzdHlsZSIseyJkYXRhLW1hbnRpbmUtc3R5bGVzIjoiY2xhc3NlcyIsbm9uY2U6dD8uKCksZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6e19faHRtbDpufX0pfWZ1bmN0aW9uIERjKHt0aGVtZTplLGdlbmVyYXRvcjp0fSl7Y29uc3Qgbj1sYShlKSxyPXQ/LihlKTtyZXR1cm4gcj9mbyhuLHIpOm59Y29uc3QgTHI9bGEoYm8pO2Z1bmN0aW9uIExjKGUpe2NvbnN0IHQ9e3ZhcmlhYmxlczp7fSxsaWdodDp7fSxkYXJrOnt9fTtyZXR1cm4gQWUoZS52YXJpYWJsZXMpLmZvckVhY2gobj0+e0xyLnZhcmlhYmxlc1tuXSE9PWUudmFyaWFibGVzW25dJiYodC52YXJpYWJsZXNbbl09ZS52YXJpYWJsZXNbbl0pfSksQWUoZS5saWdodCkuZm9yRWFjaChuPT57THIubGlnaHRbbl0hPT1lLmxpZ2h0W25dJiYodC5saWdodFtuXT1lLmxpZ2h0W25dKX0pLEFlKGUuZGFyaykuZm9yRWFjaChuPT57THIuZGFya1tuXSE9PWUuZGFya1tuXSYmKHQuZGFya1tuXT1lLmRhcmtbbl0pfSksdH1mdW5jdGlvbiBGYyhlKXtyZXR1cm4gaWEoe3ZhcmlhYmxlczp7fSxkYXJrOnsiLS1tYW50aW5lLWNvbG9yLXNjaGVtZSI6ImRhcmsifSxsaWdodDp7Ii0tbWFudGluZS1jb2xvci1zY2hlbWUiOiJsaWdodCJ9fSxlKX1mdW5jdGlvbiBjYSh7Y3NzVmFyaWFibGVzU2VsZWN0b3I6ZSxkZWR1cGxpY2F0ZUNzc1ZhcmlhYmxlczp0fSl7Y29uc3Qgbj1SdCgpLHI9Z28oKSxzPURjKHt0aGVtZTpuLGdlbmVyYXRvcjpqYygpfSksYT0oZT09PXZvaWQgMHx8ZT09PSI6cm9vdCJ8fGU9PT0iOmhvc3QiKSYmdCxpPWlhKGE/TGMocyk6cyxlKTtyZXR1cm4gaT9vLmpzeCgic3R5bGUiLHsiZGF0YS1tYW50aW5lLXN0eWxlcyI6ITAsbm9uY2U6cj8uKCksZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6e19faHRtbDpgJHtpfSR7YT8iIjpGYyhlKX1gfX0pOm51bGx9Y2EuZGlzcGxheU5hbWU9IkBtYW50aW5lL0Nzc1ZhcmlhYmxlcyI7ZnVuY3Rpb24gSWMoe3Jlc3BlY3RSZWR1Y2VkTW90aW9uOmUsZ2V0Um9vdEVsZW1lbnQ6dH0pe0l0KCgpPT57ZSYmdCgpPy5zZXRBdHRyaWJ1dGUoImRhdGEtcmVzcGVjdC1yZWR1Y2VkLW1vdGlvbiIsInRydWUiKX0sW2VdKX1mdW5jdGlvbiBRcih7dGhlbWU6ZSxjaGlsZHJlbjp0LGdldFN0eWxlTm9uY2U6bix3aXRoU3RhdGljQ2xhc3NlczpyPSEwLHdpdGhHbG9iYWxDbGFzc2VzOnM9ITAsZGVkdXBsaWNhdGVDc3NWYXJpYWJsZXM6YT0hMCx3aXRoQ3NzVmFyaWFibGVzOmk9ITAsY3NzVmFyaWFibGVzU2VsZWN0b3I6bCxjbGFzc05hbWVzUHJlZml4OmM9Im1hbnRpbmUiLGNvbG9yU2NoZW1lTWFuYWdlcjpkPXBjKCksZGVmYXVsdENvbG9yU2NoZW1lOnU9ImxpZ2h0IixnZXRSb290RWxlbWVudDpmPSgpPT5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsY3NzVmFyaWFibGVzUmVzb2x2ZXI6cCxmb3JjZUNvbG9yU2NoZW1lOmgsc3R5bGVzVHJhbnNmb3JtOnksZW52OmcsZGVkdXBsaWNhdGVJbmxpbmVTdHlsZXM6dj0hMX0pe2NvbnN0e2NvbG9yU2NoZW1lOngsc2V0Q29sb3JTY2hlbWU6aixjbGVhckNvbG9yU2NoZW1lOnd9PSRjKHtkZWZhdWx0Q29sb3JTY2hlbWU6dSxmb3JjZUNvbG9yU2NoZW1lOmgsbWFuYWdlcjpkLGdldFJvb3RFbGVtZW50OmZ9KTtyZXR1cm4gSWMoe3Jlc3BlY3RSZWR1Y2VkTW90aW9uOmU/LnJlc3BlY3RSZWR1Y2VkTW90aW9ufHwhMSxnZXRSb290RWxlbWVudDpmfSksby5qc3goc2Ese3ZhbHVlOntjb2xvclNjaGVtZTp4LHNldENvbG9yU2NoZW1lOmosY2xlYXJDb2xvclNjaGVtZTp3LGdldFJvb3RFbGVtZW50OmYsY2xhc3NOYW1lc1ByZWZpeDpjLGdldFN0eWxlTm9uY2U6bixjc3NWYXJpYWJsZXNSZXNvbHZlcjpwLGNzc1ZhcmlhYmxlc1NlbGVjdG9yOmw/PyI6cm9vdCIsd2l0aFN0YXRpY0NsYXNzZXM6cixzdHlsZXNUcmFuc2Zvcm06eSxlbnY6ZyxkZWR1cGxpY2F0ZUlubGluZVN0eWxlczp2fSxjaGlsZHJlbjpvLmpzeHMoYWEse3RoZW1lOmUsY2hpbGRyZW46W2kmJm8uanN4KGNhLHtjc3NWYXJpYWJsZXNTZWxlY3RvcjpsLGRlZHVwbGljYXRlQ3NzVmFyaWFibGVzOmF9KSxzJiZvLmpzeChNYyx7fSksdF19KX0pfVFyLmRpc3BsYXlOYW1lPSJAbWFudGluZS9jb3JlL01hbnRpbmVQcm92aWRlciI7ZnVuY3Rpb24gTShlLHQsbil7Y29uc3Qgcj1SdCgpLHM9ci5jb21wb25lbnRzW2VdPy5kZWZhdWx0UHJvcHMsYT10eXBlb2Ygcz09ImZ1bmN0aW9uIj9zKHIpOnM7cmV0dXJuey4uLnQsLi4uYSwuLi5DbihuKX19ZnVuY3Rpb24gdm8oe2NsYXNzTmFtZXM6ZSxzdHlsZXM6dCxwcm9wczpuLHN0eWxlc0N0eDpyfSl7Y29uc3Qgcz1SdCgpO3JldHVybntyZXNvbHZlZENsYXNzTmFtZXM6eG4oe3RoZW1lOnMsY2xhc3NOYW1lczplLHByb3BzOm4sc3R5bGVzQ3R4OnJ8fHZvaWQgMH0pLHJlc29sdmVkU3R5bGVzOlpuKHt0aGVtZTpzLHN0eWxlczp0LHByb3BzOm4sc3R5bGVzQ3R4OnJ8fHZvaWQgMH0pfX1jb25zdCB6Yz17YWx3YXlzOiJtYW50aW5lLWZvY3VzLWFsd2F5cyIsYXV0bzoibWFudGluZS1mb2N1cy1hdXRvIixuZXZlcjoibWFudGluZS1mb2N1cy1uZXZlciJ9O2Z1bmN0aW9uIEJjKHt0aGVtZTplLG9wdGlvbnM6dCx1bnN0eWxlZDpufSl7cmV0dXJuIF9lKHQ/LmZvY3VzYWJsZSYmIW4mJihlLmZvY3VzQ2xhc3NOYW1lfHx6Y1tlLmZvY3VzUmluZ10pLHQ/LmFjdGl2ZSYmIW4mJmUuYWN0aXZlQ2xhc3NOYW1lKX1mdW5jdGlvbiBWYyh7c2VsZWN0b3I6ZSxzdHlsZXNDdHg6dCxvcHRpb25zOm4scHJvcHM6cix0aGVtZTpzfSl7cmV0dXJuIHhuKHt0aGVtZTpzLGNsYXNzTmFtZXM6bj8uY2xhc3NOYW1lcyxwcm9wczpuPy5wcm9wc3x8cixzdHlsZXNDdHg6dH0pW2VdfWZ1bmN0aW9uIFdjKHtzZWxlY3RvcjplLHN0eWxlc0N0eDp0LHRoZW1lOm4sY2xhc3NOYW1lczpyLHByb3BzOnN9KXtyZXR1cm4geG4oe3RoZW1lOm4sY2xhc3NOYW1lczpyLHByb3BzOnMsc3R5bGVzQ3R4OnR9KVtlXX1mdW5jdGlvbiBIYyh7cm9vdFNlbGVjdG9yOmUsc2VsZWN0b3I6dCxjbGFzc05hbWU6bn0pe3JldHVybiBlPT09dD9uOnZvaWQgMH1mdW5jdGlvbiBxYyh7c2VsZWN0b3I6ZSxjbGFzc2VzOnQsdW5zdHlsZWQ6bn0pe3JldHVybiBuP3ZvaWQgMDp0W2VdfWZ1bmN0aW9uIFljKHt0aGVtZU5hbWU6ZSxjbGFzc05hbWVzUHJlZml4OnQsc2VsZWN0b3I6bix3aXRoU3RhdGljQ2xhc3M6cn0pe3JldHVybiByPT09ITE/W106ZS5tYXAocz0+YCR7dH0tJHtzfS0ke259YCl9ZnVuY3Rpb24gVWMoe29wdGlvbnM6ZSxjbGFzc2VzOnQsc2VsZWN0b3I6bix1bnN0eWxlZDpyfSl7cmV0dXJuIGU/LnZhcmlhbnQmJiFyP3RbYCR7bn0tLSR7ZS52YXJpYW50fWBdOnZvaWQgMH1mdW5jdGlvbiBHYyh7dGhlbWU6ZSxvcHRpb25zOnQsdGhlbWVOYW1lOm4sc2VsZWN0b3I6cixjbGFzc05hbWVzUHJlZml4OnMscmVzb2x2ZWRDbGFzc05hbWVzOmEscmVzb2x2ZWRUaGVtZUNsYXNzTmFtZXM6aSxjbGFzc2VzOmwsdW5zdHlsZWQ6YyxjbGFzc05hbWU6ZCxyb290U2VsZWN0b3I6dSxwcm9wczpmLHN0eWxlc0N0eDpwLHdpdGhTdGF0aWNDbGFzc2VzOmgsaGVhZGxlc3M6eSx0cmFuc2Zvcm1lZFN0eWxlczpnfSl7cmV0dXJuIF9lKEJjKHt0aGVtZTplLG9wdGlvbnM6dCx1bnN0eWxlZDpjfHx5fSksaS5tYXAodj0+dltyXSksVWMoe29wdGlvbnM6dCxjbGFzc2VzOmwsc2VsZWN0b3I6cix1bnN0eWxlZDpjfHx5fSksYVtyXSxXYyh7c2VsZWN0b3I6cixzdHlsZXNDdHg6cCx0aGVtZTplLGNsYXNzTmFtZXM6Zyxwcm9wczpmfSksVmMoe3NlbGVjdG9yOnIsc3R5bGVzQ3R4OnAsb3B0aW9uczp0LHByb3BzOmYsdGhlbWU6ZX0pLEhjKHtyb290U2VsZWN0b3I6dSxzZWxlY3RvcjpyLGNsYXNzTmFtZTpkfSkscWMoe3NlbGVjdG9yOnIsY2xhc3NlczpsLHVuc3R5bGVkOmN8fHl9KSxoJiYheSYmWWMoe3RoZW1lTmFtZTpuLGNsYXNzTmFtZXNQcmVmaXg6cyxzZWxlY3RvcjpyLHdpdGhTdGF0aWNDbGFzczp0Py53aXRoU3RhdGljQ2xhc3N9KSx0Py5jbGFzc05hbWUpfWZ1bmN0aW9uIHhvKHtzdHlsZTplLHRoZW1lOnR9KXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9lLnJlZHVjZSgobixyKT0+KHsuLi5uLC4uLnhvKHtzdHlsZTpyLHRoZW1lOnR9KX0pLHt9KTp0eXBlb2YgZT09ImZ1bmN0aW9uIj9lKHQpOmU/P3t9fWZ1bmN0aW9uIFhjKHt0aGVtZTplLHNlbGVjdG9yOnQsb3B0aW9uczpuLHByb3BzOnIsc3R5bGVzQ3R4OnMscm9vdFNlbGVjdG9yOmEsd2l0aFN0eWxlc1RyYW5zZm9ybTppLHJlc29sdmVkU3R5bGVzOmwscmVzb2x2ZWRUaGVtZVN0eWxlczpjLHJlc29sdmVkVmFyczpkLHJlc29sdmVkUm9vdFN0eWxlOnV9KXtyZXR1cm57Li4uY1t0XSwuLi5sW3RdLC4uLiFpJiZabih7dGhlbWU6ZSxzdHlsZXM6bj8uc3R5bGVzLHByb3BzOm4/LnByb3BzfHxyLHN0eWxlc0N0eDpzfSlbdF0sLi4uZFt0XSwuLi5hPT09dD91Om51bGwsLi4ueG8oe3N0eWxlOm4/LnN0eWxlLHRoZW1lOmV9KX19ZnVuY3Rpb24gS2MoZSl7cmV0dXJuIGUucmVkdWNlKCh0LG4pPT4obiYmT2JqZWN0LmtleXMobikuZm9yRWFjaChyPT57dFtyXT17Li4udFtyXSwuLi5DbihuW3JdKX19KSx0KSx7fSl9ZnVuY3Rpb24gSmMoe3Byb3BzOmUsc3R5bGVzQ3R4OnQsdGhlbWVOYW1lOm4sdGhlbWU6cn0pe2NvbnN0IHM9UmMoKT8uKCk7cmV0dXJue2dldFRyYW5zZm9ybWVkU3R5bGVzOmk9PnM/Wy4uLmkubWFwKGw9PnMobCx7cHJvcHM6ZSx0aGVtZTpyLGN0eDp0fSkpLC4uLm4ubWFwKGw9PnMoci5jb21wb25lbnRzW2xdPy5zdHlsZXMse3Byb3BzOmUsdGhlbWU6cixjdHg6dH0pKV0uZmlsdGVyKEJvb2xlYW4pOltdLHdpdGhTdHlsZXNUcmFuc2Zvcm06ISFzfX1mdW5jdGlvbiB0ZSh7bmFtZTplLGNsYXNzZXM6dCxwcm9wczpuLHN0eWxlc0N0eDpyLGNsYXNzTmFtZTpzLHN0eWxlOmEscm9vdFNlbGVjdG9yOmk9InJvb3QiLHVuc3R5bGVkOmwsY2xhc3NOYW1lczpjLHN0eWxlczpkLHZhcnM6dSx2YXJzUmVzb2x2ZXI6ZixhdHRyaWJ1dGVzOnB9KXtjb25zdCBoPVJ0KCkseT1TYygpLGc9Q2MoKSx2PU5jKCkseD0oQXJyYXkuaXNBcnJheShlKT9lOltlXSkuZmlsdGVyKFQ9PlQpLHt3aXRoU3R5bGVzVHJhbnNmb3JtOmosZ2V0VHJhbnNmb3JtZWRTdHlsZXM6d309SmMoe3Byb3BzOm4sc3R5bGVzQ3R4OnIsdGhlbWVOYW1lOngsdGhlbWU6aH0pLFM9eG4oe3RoZW1lOmgsY2xhc3NOYW1lczpjLHByb3BzOm4sc3R5bGVzQ3R4OnJ9KSxDPXgubWFwKFQ9PnhuKHt0aGVtZTpoLGNsYXNzTmFtZXM6aC5jb21wb25lbnRzW1RdPy5jbGFzc05hbWVzLHByb3BzOm4sc3R5bGVzQ3R4OnJ9KSksaz1qP3t9OlpuKHt0aGVtZTpoLHN0eWxlczpkLHByb3BzOm4sc3R5bGVzQ3R4OnJ9KSxfPXt9O2lmKCFqKWZvcihjb25zdCBUIG9mIHgpe2NvbnN0IEE9Wm4oe3RoZW1lOmgsc3R5bGVzOmguY29tcG9uZW50c1tUXT8uc3R5bGVzLHByb3BzOm4sc3R5bGVzQ3R4OnJ9KTtmb3IoY29uc3QgRCBvZiBPYmplY3Qua2V5cyhBKSlfW0RdPXsuLi5fW0RdLC4uLkFbRF19fWNvbnN0ICQ9S2MoW3Y/e306Zj8uKGgsbixyKSwuLi54Lm1hcChUPT5oLmNvbXBvbmVudHM/LltUXT8udmFycz8uKGgsbixyKSksdT8uKGgsbixyKV0pLE89eG8oe3N0eWxlOmEsdGhlbWU6aH0pO3JldHVybihULEEpPT4oey4uLnA/LltUXSxjbGFzc05hbWU6R2Moe3RoZW1lOmgsb3B0aW9uczpBLHRoZW1lTmFtZTp4LHNlbGVjdG9yOlQsY2xhc3NOYW1lc1ByZWZpeDp5LHJlc29sdmVkQ2xhc3NOYW1lczpTLHJlc29sdmVkVGhlbWVDbGFzc05hbWVzOkMsY2xhc3Nlczp0LHVuc3R5bGVkOmwsY2xhc3NOYW1lOnMscm9vdFNlbGVjdG9yOmkscHJvcHM6bixzdHlsZXNDdHg6cix3aXRoU3RhdGljQ2xhc3NlczpnLGhlYWRsZXNzOnYsdHJhbnNmb3JtZWRTdHlsZXM6dyhbQT8uc3R5bGVzLGRdKX0pLHN0eWxlOlhjKHt0aGVtZTpoLHNlbGVjdG9yOlQsb3B0aW9uczpBLHByb3BzOm4sc3R5bGVzQ3R4OnIscm9vdFNlbGVjdG9yOmksd2l0aFN0eWxlc1RyYW5zZm9ybTpqLHJlc29sdmVkU3R5bGVzOmsscmVzb2x2ZWRUaGVtZVN0eWxlczpfLHJlc29sdmVkVmFyczokLHJlc29sdmVkUm9vdFN0eWxlOk99KX0pfWZ1bmN0aW9uIGJuKGUpe3JldHVybiBBZShlKS5yZWR1Y2UoKHQsbik9PmVbbl0hPT12b2lkIDA/YCR7dH0ke3psKG4pfToke2Vbbl19O2A6dCwiIikudHJpbSgpfWZ1bmN0aW9uIFpjKHtzZWxlY3RvcjplLHN0eWxlczp0LG1lZGlhOm4sY29udGFpbmVyOnJ9KXtjb25zdCBzPXQ/Ym4odCk6IiIsYT1BcnJheS5pc0FycmF5KG4pP24ubWFwKGw9PmBAbWVkaWEke2wucXVlcnl9eyR7ZX17JHtibihsLnN0eWxlcyl9fX1gKTpbXSxpPUFycmF5LmlzQXJyYXkocik/ci5tYXAobD0+YEBjb250YWluZXIgJHtsLnF1ZXJ5fXske2V9eyR7Ym4obC5zdHlsZXMpfX19YCk6W107cmV0dXJuYCR7cz9gJHtlfXske3N9fWA6IiJ9JHthLmpvaW4oIiIpfSR7aS5qb2luKCIiKX1gLnRyaW0oKX1mdW5jdGlvbiBRYyhlKXtsZXQgdD01MzgxO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXQ9KHQ8PDUpK3QrZS5jaGFyQ29kZUF0KG4pJjQyOTQ5NjcyOTU7cmV0dXJuKHQ+Pj4wKS50b1N0cmluZygzNil9ZnVuY3Rpb24gd28oe2RlZHVwbGljYXRlOmUsLi4udH0pe2NvbnN0IG49Z28oKSxyPVpjKHQpO3JldHVybiBlP28uanN4KCJzdHlsZSIse2hyZWY6YG1hbnRpbmUtJHtRYyhyKX1gLHByZWNlZGVuY2U6Im1hbnRpbmUiLG5vbmNlOm4/LigpLGNoaWxkcmVuOnJ9KTpvLmpzeCgic3R5bGUiLHsiZGF0YS1tYW50aW5lLXN0eWxlcyI6ImlubGluZSIsbm9uY2U6bj8uKCksZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6e19faHRtbDpyfX0pfWZ1bmN0aW9uIGVkKGUpe2xldCB0PTUzODE7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspdD0odDw8NSkrdCtlLmNoYXJDb2RlQXQobikmNDI5NDk2NzI5NTtyZXR1cm4odD4+PjApLnRvU3RyaW5nKDM2KX1mdW5jdGlvbiB0ZChlLHQpe3JldHVybmBfX21kaV9fLSR7ZWQoYCR7ZT9ibihlKToiIn18JHtBcnJheS5pc0FycmF5KHQpP3QubWFwKG49PmAke24ucXVlcnl9OiR7Ym4obi5zdHlsZXMpfWApLmpvaW4oInwiKToiIn1gKX1gfWZ1bmN0aW9uIGpvKGUpe2NvbnN0e206dCxteDpuLG15OnIsbXQ6cyxtYjphLG1sOmksbXI6bCxtZTpjLG1zOmQsbWlzOnUsbWllOmYscCxweDpoLHB5OnkscHQ6ZyxwYjp2LHBsOngscHI6aixwZTp3LHBzOlMscGlzOkMscGllOmssYmQ6XyxiZHJzOiQsYmc6TyxjOlQsb3BhY2l0eTpBLGZmOkQsZno6VixmdzpYLGx0czpKLHRhOlAsbGg6VyxmczpJLHR0OnosdGQ6Syx3OmxlLG1pdzpzZSxtYXc6Q2UsaDp2ZSxtaWg6VGUsbWFoOndlLGJnc3o6Y2UsYmdwOnhlLGJncjp1ZSxiZ2E6TCxwb3M6TmUsdG9wOmZlLGxlZnQ6ZGUsYm90dG9tOkhlLHJpZ2h0OkJ0LGluc2V0OkYsZGlzcGxheTp4dCxmbGV4Ond0LGhpZGRlbkZyb206anQsdmlzaWJsZUZyb206VHQsbGlnaHRIaWRkZW46SmUsZGFya0hpZGRlbjpGZSxzeDpoZSwuLi5wZX09ZTtyZXR1cm57c3R5bGVQcm9wczpDbih7bTp0LG14Om4sbXk6cixtdDpzLG1iOmEsbWw6aSxtcjpsLG1lOmMsbXM6ZCxtaXM6dSxtaWU6ZixwLHB4OmgscHk6eSxwdDpnLHBiOnYscGw6eCxwcjpqLHBpczpDLHBpZTprLHBlOncscHM6UyxiZDpfLGJnOk8sYzpULG9wYWNpdHk6QSxmZjpELGZ6OlYsZnc6WCxsdHM6Six0YTpQLGxoOlcsZnM6SSx0dDp6LHRkOkssdzpsZSxtaXc6c2UsbWF3OkNlLGg6dmUsbWloOlRlLG1haDp3ZSxiZ3N6OmNlLGJncDp4ZSxiZ3I6dWUsYmdhOkwscG9zOk5lLHRvcDpmZSxsZWZ0OmRlLGJvdHRvbTpIZSxyaWdodDpCdCxpbnNldDpGLGRpc3BsYXk6eHQsZmxleDp3dCxiZHJzOiQsaGlkZGVuRnJvbTpqdCx2aXNpYmxlRnJvbTpUdCxsaWdodEhpZGRlbjpKZSxkYXJrSGlkZGVuOkZlLHN4OmhlfSkscmVzdDpwZX19Y29uc3QgbmQ9e206e3R5cGU6InNwYWNpbmciLHByb3BlcnR5OiJtYXJnaW4ifSxtdDp7dHlwZToic3BhY2luZyIscHJvcGVydHk6Im1hcmdpblRvcCJ9LG1iOnt0eXBlOiJzcGFjaW5nIixwcm9wZXJ0eToibWFyZ2luQm90dG9tIn0sbWw6e3R5cGU6InNwYWNpbmciLHByb3BlcnR5OiJtYXJnaW5MZWZ0In0sbXI6e3R5cGU6InNwYWNpbmciLHByb3BlcnR5OiJtYXJnaW5SaWdodCJ9LG1zOnt0eXBlOiJzcGFjaW5nIixwcm9wZXJ0eToibWFyZ2luSW5saW5lU3RhcnQifSxtZTp7dHlwZToic3BhY2luZyIscHJvcGVydHk6Im1hcmdpbklubGluZUVuZCJ9LG1pczp7dHlwZToic3BhY2luZyIscHJvcGVydHk6Im1hcmdpbklubGluZVN0YXJ0In0sbWllOnt0eXBlOiJzcGFjaW5nIixwcm9wZXJ0eToibWFyZ2luSW5saW5lRW5kIn0sbXg6e3R5cGU6InNwYWNpbmciLHByb3BlcnR5OiJtYXJnaW5JbmxpbmUifSxteTp7dHlwZToic3BhY2luZyIscHJvcGVydHk6Im1hcmdpbkJsb2NrIn0scDp7dHlwZToic3BhY2luZyIscHJvcGVydHk6InBhZGRpbmcifSxwdDp7dHlwZToic3BhY2luZyIscHJvcGVydHk6InBhZGRpbmdUb3AifSxwYjp7dHlwZToic3BhY2luZyIscHJvcGVydHk6InBhZGRpbmdCb3R0b20ifSxwbDp7dHlwZToic3BhY2luZyIscHJvcGVydHk6InBhZGRpbmdMZWZ0In0scHI6e3R5cGU6InNwYWNpbmciLHByb3BlcnR5OiJwYWRkaW5nUmlnaHQifSxwczp7dHlwZToic3BhY2luZyIscHJvcGVydHk6InBhZGRpbmdJbmxpbmVTdGFydCJ9LHBlOnt0eXBlOiJzcGFjaW5nIixwcm9wZXJ0eToicGFkZGluZ0lubGluZUVuZCJ9LHBpczp7dHlwZToic3BhY2luZyIscHJvcGVydHk6InBhZGRpbmdJbmxpbmVTdGFydCJ9LHBpZTp7dHlwZToic3BhY2luZyIscHJvcGVydHk6InBhZGRpbmdJbmxpbmVFbmQifSxweDp7dHlwZToic3BhY2luZyIscHJvcGVydHk6InBhZGRpbmdJbmxpbmUifSxweTp7dHlwZToic3BhY2luZyIscHJvcGVydHk6InBhZGRpbmdCbG9jayJ9LGJkOnt0eXBlOiJib3JkZXIiLHByb3BlcnR5OiJib3JkZXIifSxiZHJzOnt0eXBlOiJyYWRpdXMiLHByb3BlcnR5OiJib3JkZXJSYWRpdXMifSxiZzp7dHlwZToiY29sb3IiLHByb3BlcnR5OiJiYWNrZ3JvdW5kIn0sYzp7dHlwZToidGV4dENvbG9yIixwcm9wZXJ0eToiY29sb3IifSxvcGFjaXR5Ont0eXBlOiJpZGVudGl0eSIscHJvcGVydHk6Im9wYWNpdHkifSxmZjp7dHlwZToiZm9udEZhbWlseSIscHJvcGVydHk6ImZvbnRGYW1pbHkifSxmejp7dHlwZToiZm9udFNpemUiLHByb3BlcnR5OiJmb250U2l6ZSJ9LGZ3Ont0eXBlOiJpZGVudGl0eSIscHJvcGVydHk6ImZvbnRXZWlnaHQifSxsdHM6e3R5cGU6InNpemUiLHByb3BlcnR5OiJsZXR0ZXJTcGFjaW5nIn0sdGE6e3R5cGU6ImlkZW50aXR5Iixwcm9wZXJ0eToidGV4dEFsaWduIn0sbGg6e3R5cGU6ImxpbmVIZWlnaHQiLHByb3BlcnR5OiJsaW5lSGVpZ2h0In0sZnM6e3R5cGU6ImlkZW50aXR5Iixwcm9wZXJ0eToiZm9udFN0eWxlIn0sdHQ6e3R5cGU6ImlkZW50aXR5Iixwcm9wZXJ0eToidGV4dFRyYW5zZm9ybSJ9LHRkOnt0eXBlOiJpZGVudGl0eSIscHJvcGVydHk6InRleHREZWNvcmF0aW9uIn0sdzp7dHlwZToic3BhY2luZyIscHJvcGVydHk6IndpZHRoIn0sbWl3Ont0eXBlOiJzcGFjaW5nIixwcm9wZXJ0eToibWluV2lkdGgifSxtYXc6e3R5cGU6InNwYWNpbmciLHByb3BlcnR5OiJtYXhXaWR0aCJ9LGg6e3R5cGU6InNwYWNpbmciLHByb3BlcnR5OiJoZWlnaHQifSxtaWg6e3R5cGU6InNwYWNpbmciLHByb3BlcnR5OiJtaW5IZWlnaHQifSxtYWg6e3R5cGU6InNwYWNpbmciLHByb3BlcnR5OiJtYXhIZWlnaHQifSxiZ3N6Ont0eXBlOiJzaXplIixwcm9wZXJ0eToiYmFja2dyb3VuZFNpemUifSxiZ3A6e3R5cGU6ImlkZW50aXR5Iixwcm9wZXJ0eToiYmFja2dyb3VuZFBvc2l0aW9uIn0sYmdyOnt0eXBlOiJpZGVudGl0eSIscHJvcGVydHk6ImJhY2tncm91bmRSZXBlYXQifSxiZ2E6e3R5cGU6ImlkZW50aXR5Iixwcm9wZXJ0eToiYmFja2dyb3VuZEF0dGFjaG1lbnQifSxwb3M6e3R5cGU6ImlkZW50aXR5Iixwcm9wZXJ0eToicG9zaXRpb24ifSx0b3A6e3R5cGU6InNpemUiLHByb3BlcnR5OiJ0b3AifSxsZWZ0Ont0eXBlOiJzaXplIixwcm9wZXJ0eToibGVmdCJ9LGJvdHRvbTp7dHlwZToic2l6ZSIscHJvcGVydHk6ImJvdHRvbSJ9LHJpZ2h0Ont0eXBlOiJzaXplIixwcm9wZXJ0eToicmlnaHQifSxpbnNldDp7dHlwZToic2l6ZSIscHJvcGVydHk6Imluc2V0In0sZGlzcGxheTp7dHlwZToiaWRlbnRpdHkiLHByb3BlcnR5OiJkaXNwbGF5In0sZmxleDp7dHlwZToiaWRlbnRpdHkiLHByb3BlcnR5OiJmbGV4In19O2Z1bmN0aW9uIFNvKGUsdCl7Y29uc3Qgbj1Obih7Y29sb3I6ZSx0aGVtZTp0fSk7cmV0dXJuIG4uY29sb3I9PT0iZGltbWVkIj8idmFyKC0tbWFudGluZS1jb2xvci1kaW1tZWQpIjpuLmNvbG9yPT09ImJyaWdodCI/InZhcigtLW1hbnRpbmUtY29sb3ItYnJpZ2h0KSI6bi52YXJpYWJsZT9gdmFyKCR7bi52YXJpYWJsZX0pYDpuLmNvbG9yfWZ1bmN0aW9uIHJkKGUsdCl7Y29uc3Qgbj1Obih7Y29sb3I6ZSx0aGVtZTp0fSk7cmV0dXJuIG4uaXNUaGVtZUNvbG9yJiZuLnNoYWRlPT09dm9pZCAwP2B2YXIoLS1tYW50aW5lLWNvbG9yLSR7bi5jb2xvcn0tdGV4dClgOlNvKGUsdCl9ZnVuY3Rpb24gb2QoZSx0KXtpZih0eXBlb2YgZT09Im51bWJlciIpcmV0dXJuIE4oZSk7aWYodHlwZW9mIGU9PSJzdHJpbmciKXtjb25zdFtuLHIsLi4uc109ZS5zcGxpdCgiICIpLmZpbHRlcihpPT5pLnRyaW0oKSE9PSIiKTtsZXQgYT1gJHtOKG4pfWA7cmV0dXJuIHImJihhKz1gICR7cn1gKSxzLmxlbmd0aD4wJiYoYSs9YCAke1NvKHMuam9pbigiICIpLHQpfWApLGEudHJpbSgpfXJldHVybiBlfWNvbnN0IGRzPXt0ZXh0OiJ2YXIoLS1tYW50aW5lLWZvbnQtZmFtaWx5KSIsbW9ubzoidmFyKC0tbWFudGluZS1mb250LWZhbWlseS1tb25vc3BhY2UpIixtb25vc3BhY2U6InZhcigtLW1hbnRpbmUtZm9udC1mYW1pbHktbW9ub3NwYWNlKSIsaGVhZGluZzoidmFyKC0tbWFudGluZS1mb250LWZhbWlseS1oZWFkaW5ncykiLGhlYWRpbmdzOiJ2YXIoLS1tYW50aW5lLWZvbnQtZmFtaWx5LWhlYWRpbmdzKSJ9O2Z1bmN0aW9uIHNkKGUpe3JldHVybiB0eXBlb2YgZT09InN0cmluZyImJmUgaW4gZHM/ZHNbZV06ZX1jb25zdCBhZD1bImgxIiwiaDIiLCJoMyIsImg0IiwiaDUiLCJoNiJdO2Z1bmN0aW9uIGlkKGUsdCl7cmV0dXJuIHR5cGVvZiBlPT0ic3RyaW5nIiYmZSBpbiB0LmZvbnRTaXplcz9gdmFyKC0tbWFudGluZS1mb250LXNpemUtJHtlfSlgOnR5cGVvZiBlPT0ic3RyaW5nIiYmYWQuaW5jbHVkZXMoZSk/YHZhcigtLW1hbnRpbmUtJHtlfS1mb250LXNpemUpYDp0eXBlb2YgZT09Im51bWJlciJ8fHR5cGVvZiBlPT0ic3RyaW5nIj9OKGUpOmV9ZnVuY3Rpb24gbGQoZSl7cmV0dXJuIGV9Y29uc3QgY2Q9WyJoMSIsImgyIiwiaDMiLCJoNCIsImg1IiwiaDYiXTtmdW5jdGlvbiBkZChlLHQpe3JldHVybiB0eXBlb2YgZT09InN0cmluZyImJmUgaW4gdC5saW5lSGVpZ2h0cz9gdmFyKC0tbWFudGluZS1saW5lLWhlaWdodC0ke2V9KWA6dHlwZW9mIGU9PSJzdHJpbmciJiZjZC5pbmNsdWRlcyhlKT9gdmFyKC0tbWFudGluZS0ke2V9LWxpbmUtaGVpZ2h0KWA6ZX1mdW5jdGlvbiB1ZChlLHQpe3JldHVybiB0eXBlb2YgZT09InN0cmluZyImJmUgaW4gdC5yYWRpdXM/YHZhcigtLW1hbnRpbmUtcmFkaXVzLSR7ZX0pYDp0eXBlb2YgZT09Im51bWJlciJ8fHR5cGVvZiBlPT0ic3RyaW5nIj9OKGUpOmV9ZnVuY3Rpb24gZmQoZSl7cmV0dXJuIHR5cGVvZiBlPT0ibnVtYmVyIj9OKGUpOmV9ZnVuY3Rpb24gcGQoZSx0KXtpZih0eXBlb2YgZT09Im51bWJlciIpcmV0dXJuIE4oZSk7aWYodHlwZW9mIGU9PSJzdHJpbmciKXtjb25zdCBuPWUucmVwbGFjZSgiLSIsIiIpO2lmKCEobiBpbiB0LnNwYWNpbmcpKXJldHVybiBOKGUpO2NvbnN0IHI9YC0tbWFudGluZS1zcGFjaW5nLSR7bn1gO3JldHVybiBlLnN0YXJ0c1dpdGgoIi0iKT9gY2FsYyh2YXIoJHtyfSkgKiAtMSlgOmB2YXIoJHtyfSlgfXJldHVybiBlfWNvbnN0IEZyPXtjb2xvcjpTbyx0ZXh0Q29sb3I6cmQsZm9udFNpemU6aWQsc3BhY2luZzpwZCxyYWRpdXM6dWQsaWRlbnRpdHk6bGQsc2l6ZTpmZCxsaW5lSGVpZ2h0OmRkLGZvbnRGYW1pbHk6c2QsYm9yZGVyOm9kfTtmdW5jdGlvbiB1cyhlKXtyZXR1cm4gZS5yZXBsYWNlKCIobWluLXdpZHRoOiAiLCIiKS5yZXBsYWNlKCJlbSkiLCIiKX1mdW5jdGlvbiBtZCh7bWVkaWE6ZSwuLi50fSl7Y29uc3Qgbj1PYmplY3Qua2V5cyhlKS5zb3J0KChyLHMpPT5OdW1iZXIodXMocikpLU51bWJlcih1cyhzKSkpLm1hcChyPT4oe3F1ZXJ5OnIsc3R5bGVzOmVbcl19KSk7cmV0dXJuey4uLnQsbWVkaWE6bn19ZnVuY3Rpb24gaGQoZSl7aWYodHlwZW9mIGUhPSJvYmplY3QifHxlPT09bnVsbClyZXR1cm4hMTtjb25zdCB0PU9iamVjdC5rZXlzKGUpO3JldHVybiEodC5sZW5ndGg9PT0xJiZ0WzBdPT09ImJhc2UiKX1mdW5jdGlvbiBnZChlKXtyZXR1cm4gdHlwZW9mIGU9PSJvYmplY3QiJiZlIT09bnVsbD8iYmFzZSJpbiBlP2UuYmFzZTp2b2lkIDA6ZX1mdW5jdGlvbiBiZChlKXtyZXR1cm4gdHlwZW9mIGU9PSJvYmplY3QiJiZlIT09bnVsbD9BZShlKS5maWx0ZXIodD0+dCE9PSJiYXNlIik6W119ZnVuY3Rpb24geWQoZSx0KXtyZXR1cm4gdHlwZW9mIGU9PSJvYmplY3QiJiZlIT09bnVsbCYmdCBpbiBlP2VbdF06ZX1mdW5jdGlvbiB2ZCh7c3R5bGVQcm9wczplLGRhdGE6dCx0aGVtZTpufSl7cmV0dXJuIG1kKEFlKGUpLnJlZHVjZSgocixzKT0+e2lmKHM9PT0iaGlkZGVuRnJvbSJ8fHM9PT0idmlzaWJsZUZyb20ifHxzPT09InN4IilyZXR1cm4gcjtjb25zdCBhPXRbc10saT1BcnJheS5pc0FycmF5KGEucHJvcGVydHkpP2EucHJvcGVydHk6W2EucHJvcGVydHldLGw9Z2QoZVtzXSk7aWYoIWhkKGVbc10pKXJldHVybiBpLmZvckVhY2goZD0+e3IuaW5saW5lU3R5bGVzW2RdPUZyW2EudHlwZV0obCxuKX0pLHI7ci5oYXNSZXNwb25zaXZlU3R5bGVzPSEwO2NvbnN0IGM9YmQoZVtzXSk7cmV0dXJuIGkuZm9yRWFjaChkPT57bCE9bnVsbCYmKHIuc3R5bGVzW2RdPUZyW2EudHlwZV0obCxuKSksYy5mb3JFYWNoKHU9Pntjb25zdCBmPWAobWluLXdpZHRoOiAke24uYnJlYWtwb2ludHNbdV19KWA7ci5tZWRpYVtmXT17Li4uci5tZWRpYVtmXSxbZF06RnJbYS50eXBlXSh5ZChlW3NdLHUpLG4pfX0pfSkscn0se2hhc1Jlc3BvbnNpdmVTdHlsZXM6ITEsc3R5bGVzOnt9LGlubGluZVN0eWxlczp7fSxtZWRpYTp7fX0pKX1mdW5jdGlvbiBkYSgpe3JldHVybmBfX21fXy0ke20udXNlSWQoKS5yZXBsYWNlKC9bOsKrwrtdL2csIiIpfWB9ZnVuY3Rpb24geGQoZSl7cmV0dXJuIGV9Y29uc3Qgd2Q9eGQ7ZnVuY3Rpb24gdWEoZSl7cmV0dXJuIGV9ZnVuY3Rpb24gWShlKXtjb25zdCB0PWU7cmV0dXJuIHQuZXh0ZW5kPXVhLHQud2l0aFByb3BzPW49Pntjb25zdCByPXM9Pm8uanN4KHQsey4uLm4sLi4uc30pO3JldHVybiByLmV4dGVuZD10LmV4dGVuZCxyLmRpc3BsYXlOYW1lPWBXaXRoUHJvcHMoJHt0LmRpc3BsYXlOYW1lfSlgLHJ9LHR9ZnVuY3Rpb24gamQoZSl7cmV0dXJuIFkoZSl9ZnVuY3Rpb24gZ3QoZSl7Y29uc3QgdD1lO3JldHVybiB0LndpdGhQcm9wcz1uPT57Y29uc3Qgcj1zPT5vLmpzeCh0LHsuLi5uLC4uLnN9KTtyZXR1cm4gci5leHRlbmQ9dC5leHRlbmQsci5kaXNwbGF5TmFtZT1gV2l0aFByb3BzKCR7dC5kaXNwbGF5TmFtZX0pYCxyfSx0LmV4dGVuZD11YSx0fWZ1bmN0aW9uIGZhKGUpe3JldHVybmBkYXRhLSR7KGUuc3RhcnRzV2l0aCgiZGF0YS0iKT9lLnNsaWNlKDUpOmUpLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csIiQxLSQyIikudG9Mb3dlckNhc2UoKX1gfWZ1bmN0aW9uIFNkKGUpe3JldHVybiBPYmplY3Qua2V5cyhlKS5yZWR1Y2UoKHQsbik9Pntjb25zdCByPWVbbl07cmV0dXJuIHI9PT12b2lkIDB8fHI9PT0iInx8cj09PSExfHxyPT09bnVsbHx8KHRbZmEobildPWVbbl0pLHR9LHt9KX1mdW5jdGlvbiBwYShlKXtyZXR1cm4gZT90eXBlb2YgZT09InN0cmluZyI/e1tmYShlKV06ITB9OkFycmF5LmlzQXJyYXkoZSk/Wy4uLmVdLnJlZHVjZSgodCxuKT0+KHsuLi50LC4uLnBhKG4pfSkse30pOlNkKGUpOm51bGx9ZnVuY3Rpb24gZW8oZSx0KXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9bLi4uZV0ucmVkdWNlKChuLHIpPT4oey4uLm4sLi4uZW8ocix0KX0pLHt9KTp0eXBlb2YgZT09ImZ1bmN0aW9uIj9lKHQpOmU/P3t9fWZ1bmN0aW9uIENkKHt0aGVtZTplLHN0eWxlOnQsdmFyczpuLHN0eWxlUHJvcHM6cn0pe2NvbnN0IHM9ZW8odCxlKSxhPWVvKG4sZSk7cmV0dXJuey4uLnMsLi4uYSwuLi5yfX1mdW5jdGlvbiBtYSh7Y29tcG9uZW50OmUsc3R5bGU6dCxfX3ZhcnM6bixjbGFzc05hbWU6cix2YXJpYW50OnMsbW9kOmEsc2l6ZTppLGhpZGRlbkZyb206bCx2aXNpYmxlRnJvbTpjLGxpZ2h0SGlkZGVuOmQsZGFya0hpZGRlbjp1LHJlbmRlclJvb3Q6ZixfX3NpemU6cCxyZWY6aCwuLi55fSl7Y29uc3QgZz1SdCgpLHY9ZXx8ImRpdiIse3N0eWxlUHJvcHM6eCxyZXN0Omp9PWpvKHkpLHc9a2MoKT8uKCk/Lih4LnN4KSxTPWRhKCksQz12ZCh7c3R5bGVQcm9wczp4LHRoZW1lOmcsZGF0YTpuZH0pLGs9X2MoKSxfPWsmJkMuaGFzUmVzcG9uc2l2ZVN0eWxlcz90ZChDLnN0eWxlcyxDLm1lZGlhKTpTLCQ9e3JlZjpoLHN0eWxlOkNkKHt0aGVtZTpnLHN0eWxlOnQsdmFyczpuLHN0eWxlUHJvcHM6Qy5pbmxpbmVTdHlsZXN9KSxjbGFzc05hbWU6X2Uocix3LHtbX106Qy5oYXNSZXNwb25zaXZlU3R5bGVzLCJtYW50aW5lLWxpZ2h0LWhpZGRlbiI6ZCwibWFudGluZS1kYXJrLWhpZGRlbiI6dSxbYG1hbnRpbmUtaGlkZGVuLWZyb20tJHtsfWBdOmwsW2BtYW50aW5lLXZpc2libGUtZnJvbS0ke2N9YF06Y30pLCJkYXRhLXZhcmlhbnQiOnMsImRhdGEtc2l6ZSI6S3MoaSk/dm9pZCAwOml8fHZvaWQgMCxzaXplOnAsLi4ucGEoYSksLi4uan07cmV0dXJuIG8uanN4cyhvLkZyYWdtZW50LHtjaGlsZHJlbjpbQy5oYXNSZXNwb25zaXZlU3R5bGVzJiZvLmpzeCh3byx7c2VsZWN0b3I6YC4ke199YCxzdHlsZXM6Qy5zdHlsZXMsbWVkaWE6Qy5tZWRpYSxkZWR1cGxpY2F0ZTprfSksdHlwZW9mIGY9PSJmdW5jdGlvbiI/ZigkKTpvLmpzeCh2LHsuLi4kfSldfSl9bWEuZGlzcGxheU5hbWU9IkBtYW50aW5lL2NvcmUvQm94Ijtjb25zdCBxPXdkKG1hKSxOZD1tLmNyZWF0ZUNvbnRleHQoe2RpcjoibHRyIix0b2dnbGVEaXJlY3Rpb246KCk9Pnt9LHNldERpcmVjdGlvbjooKT0+e319KTtmdW5jdGlvbiBDbygpe3JldHVybiBtLnVzZShOZCl9Y29uc3Rba2QsQmVdPUx0KCJTY3JvbGxBcmVhLlJvb3QgY29tcG9uZW50IHdhcyBub3QgZm91bmQgaW4gdHJlZSIpO2Z1bmN0aW9uIE50KGUsdCl7Y29uc3Qgbj1tLnVzZUVmZmVjdEV2ZW50KHQpO0l0KCgpPT57bGV0IHI9MDtpZihlKXtjb25zdCBzPW5ldyBSZXNpemVPYnNlcnZlcigoKT0+e2NhbmNlbEFuaW1hdGlvbkZyYW1lKHIpLHI9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShuKX0pO3JldHVybiBzLm9ic2VydmUoZSksKCk9Pnt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUocikscy51bm9ic2VydmUoZSl9fX0sW2VdKX1mdW5jdGlvbiBSZChlKXtjb25zdHtzdHlsZTp0LC4uLm59PWUscj1CZSgpLFtzLGFdPW0udXNlU3RhdGUoMCksW2ksbF09bS51c2VTdGF0ZSgwKSxjPSEhKHMmJmkpO3JldHVybiBOdChyLnNjcm9sbGJhclgsKCk9Pntjb25zdCBkPXIuc2Nyb2xsYmFyWD8ub2Zmc2V0SGVpZ2h0fHwwO3Iub25Db3JuZXJIZWlnaHRDaGFuZ2UoZCksbChkKX0pLE50KHIuc2Nyb2xsYmFyWSwoKT0+e2NvbnN0IGQ9ci5zY3JvbGxiYXJZPy5vZmZzZXRXaWR0aHx8MDtyLm9uQ29ybmVyV2lkdGhDaGFuZ2UoZCksYShkKX0pLGM/by5qc3goImRpdiIsey4uLm4sc3R5bGU6ey4uLnQsd2lkdGg6cyxoZWlnaHQ6aX19KTpudWxsfWZ1bmN0aW9uIF9kKGUpe2NvbnN0IHQ9QmUoKSxuPSEhKHQuc2Nyb2xsYmFyWCYmdC5zY3JvbGxiYXJZKTtyZXR1cm4gdC50eXBlIT09InNjcm9sbCImJm4/by5qc3goUmQsey4uLmV9KTpudWxsfWNvbnN0ICRkPXtzY3JvbGxIaWRlRGVsYXk6MWUzLHR5cGU6ImhvdmVyIn07ZnVuY3Rpb24gaGEoZSl7Y29uc3R7dHlwZTp0LHNjcm9sbEhpZGVEZWxheTpuLHNjcm9sbGJhcnM6cixnZXRTdHlsZXM6cyxyZWY6YSwuLi5pfT1NKCJTY3JvbGxBcmVhUm9vdCIsJGQsZSksW2wsY109bS51c2VTdGF0ZShudWxsKSxbZCx1XT1tLnVzZVN0YXRlKG51bGwpLFtmLHBdPW0udXNlU3RhdGUobnVsbCksW2gseV09bS51c2VTdGF0ZShudWxsKSxbZyx2XT1tLnVzZVN0YXRlKG51bGwpLFt4LGpdPW0udXNlU3RhdGUoMCksW3csU109bS51c2VTdGF0ZSgwKSxbQyxrXT1tLnVzZVN0YXRlKCExKSxbXywkXT1tLnVzZVN0YXRlKCExKSxPPUxlKGEsVD0+YyhUKSk7cmV0dXJuIG8uanN4KGtkLHt2YWx1ZTp7dHlwZTp0LHNjcm9sbEhpZGVEZWxheTpuLHNjcm9sbEFyZWE6bCx2aWV3cG9ydDpkLG9uVmlld3BvcnRDaGFuZ2U6dSxjb250ZW50OmYsb25Db250ZW50Q2hhbmdlOnAsc2Nyb2xsYmFyWDpoLG9uU2Nyb2xsYmFyWENoYW5nZTp5LHNjcm9sbGJhclhFbmFibGVkOkMsb25TY3JvbGxiYXJYRW5hYmxlZENoYW5nZTprLHNjcm9sbGJhclk6ZyxvblNjcm9sbGJhcllDaGFuZ2U6dixzY3JvbGxiYXJZRW5hYmxlZDpfLG9uU2Nyb2xsYmFyWUVuYWJsZWRDaGFuZ2U6JCxvbkNvcm5lcldpZHRoQ2hhbmdlOmosb25Db3JuZXJIZWlnaHRDaGFuZ2U6UyxnZXRTdHlsZXM6c30sY2hpbGRyZW46by5qc3gocSx7Li4uaSxyZWY6TyxfX3ZhcnM6eyItLXNhLWNvcm5lci13aWR0aCI6ciE9PSJ4eSI/IjBweCI6YCR7eH1weGAsIi0tc2EtY29ybmVyLWhlaWdodCI6ciE9PSJ4eSI/IjBweCI6YCR7d31weGB9fSl9KX1oYS5kaXNwbGF5TmFtZT0iQG1hbnRpbmUvY29yZS9TY3JvbGxBcmVhUm9vdCI7ZnVuY3Rpb24gZ2EoZSx0KXtjb25zdCBuPWUvdDtyZXR1cm4gTnVtYmVyLmlzTmFOKG4pPzA6bn1mdW5jdGlvbiBhcihlKXtjb25zdCB0PWdhKGUudmlld3BvcnQsZS5jb250ZW50KSxuPWUuc2Nyb2xsYmFyLnBhZGRpbmdTdGFydCtlLnNjcm9sbGJhci5wYWRkaW5nRW5kLHI9KGUuc2Nyb2xsYmFyLnNpemUtbikqdDtyZXR1cm4gTWF0aC5tYXgociwxOCl9ZnVuY3Rpb24gYmEoZSx0KXtyZXR1cm4gbj0+e2lmKGVbMF09PT1lWzFdfHx0WzBdPT09dFsxXSlyZXR1cm4gdFswXTtjb25zdCByPSh0WzFdLXRbMF0pLyhlWzFdLWVbMF0pO3JldHVybiB0WzBdK3IqKG4tZVswXSl9fWZ1bmN0aW9uIFRkKGUsW3Qsbl0pe3JldHVybiBNYXRoLm1pbihuLE1hdGgubWF4KHQsZSkpfWZ1bmN0aW9uIGZzKGUsdCxuPSJsdHIiKXtjb25zdCByPWFyKHQpLHM9dC5zY3JvbGxiYXIucGFkZGluZ1N0YXJ0K3Quc2Nyb2xsYmFyLnBhZGRpbmdFbmQsYT10LnNjcm9sbGJhci5zaXplLXMsaT10LmNvbnRlbnQtdC52aWV3cG9ydCxsPWEtcixjPVRkKGUsbj09PSJsdHIiP1swLGldOltpKi0xLDBdKTtyZXR1cm4gYmEoWzAsaV0sWzAsbF0pKGMpfWZ1bmN0aW9uIFBkKGUsdCxuLHI9Imx0ciIpe2NvbnN0IHM9YXIobiksYT1zLzIsaT10fHxhLGw9cy1pLGM9bi5zY3JvbGxiYXIucGFkZGluZ1N0YXJ0K2ksZD1uLnNjcm9sbGJhci5zaXplLW4uc2Nyb2xsYmFyLnBhZGRpbmdFbmQtbCx1PW4uY29udGVudC1uLnZpZXdwb3J0LGY9cj09PSJsdHIiP1swLHVdOlt1Ki0xLDBdO3JldHVybiBiYShbYyxkXSxmKShlKX1mdW5jdGlvbiB5YShlLHQpe3JldHVybiBlPjAmJmU8dH1mdW5jdGlvbiBRbihlKXtyZXR1cm4gZT9wYXJzZUludChlLDEwKTowfWZ1bmN0aW9uIE10KGUsdCx7Y2hlY2tGb3JEZWZhdWx0UHJldmVudGVkOm49ITB9PXt9KXtyZXR1cm4gcj0+e2U/LihyKSwobj09PSExfHwhci5kZWZhdWx0UHJldmVudGVkKSYmdD8uKHIpfX1jb25zdFtFZCx2YV09THQoIlNjcm9sbEFyZWFTY3JvbGxiYXIgd2FzIG5vdCBmb3VuZCBpbiB0cmVlIik7ZnVuY3Rpb24geGEoZSl7Y29uc3R7c2l6ZXM6dCxoYXNUaHVtYjpuLG9uVGh1bWJDaGFuZ2U6cixvblRodW1iUG9pbnRlclVwOnMsb25UaHVtYlBvaW50ZXJEb3duOmEsb25UaHVtYlBvc2l0aW9uQ2hhbmdlOmksb25EcmFnU2Nyb2xsOmwsb25XaGVlbFNjcm9sbDpjLG9uUmVzaXplOmQscmVmOnUsLi4uZn09ZSxwPUJlKCksW2gseV09bS51c2VTdGF0ZShudWxsKSxnPUxlKHUsJD0+eSgkKSksdj1tLnVzZVJlZihudWxsKSx4PW0udXNlUmVmKCIiKSx7dmlld3BvcnQ6an09cCx3PXQuY29udGVudC10LnZpZXdwb3J0LFM9bS51c2VFZmZlY3RFdmVudChjKSxDPWhuKGkpLGs9cnIoZCwxMCksXz0kPT57di5jdXJyZW50JiZsKHt4OiQuY2xpZW50WC12LmN1cnJlbnQubGVmdCx5OiQuY2xpZW50WS12LmN1cnJlbnQudG9wfSl9O3JldHVybiBtLnVzZUVmZmVjdCgoKT0+e2NvbnN0ICQ9Tz0+e2NvbnN0IFQ9Ty50YXJnZXQ7aD8uY29udGFpbnMoVCkmJlMoTyx3KX07cmV0dXJuIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIndoZWVsIiwkLHtwYXNzaXZlOiExfSksKCk9PmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIndoZWVsIiwkLHtwYXNzaXZlOiExfSl9LFtqLGgsd10pLG0udXNlRWZmZWN0KEMsW3QsQ10pLE50KGgsayksTnQocC5jb250ZW50LGspLG8uanN4KEVkLHt2YWx1ZTp7c2Nyb2xsYmFyOmgsaGFzVGh1bWI6bixvblRodW1iQ2hhbmdlOmhuKHIpLG9uVGh1bWJQb2ludGVyVXA6aG4ocyksb25UaHVtYlBvc2l0aW9uQ2hhbmdlOkMsb25UaHVtYlBvaW50ZXJEb3duOmhuKGEpfSxjaGlsZHJlbjpvLmpzeCgiZGl2Iix7Li4uZixyZWY6ZywiZGF0YS1tYW50aW5lLXNjcm9sbGJhciI6ITAsc3R5bGU6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsLi4uZi5zdHlsZX0sb25Qb2ludGVyRG93bjpNdChlLm9uUG9pbnRlckRvd24sJD0+eyQucHJldmVudERlZmF1bHQoKSwkLmJ1dHRvbj09PTAmJigkLnRhcmdldC5zZXRQb2ludGVyQ2FwdHVyZSgkLnBvaW50ZXJJZCksdi5jdXJyZW50PWguZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkseC5jdXJyZW50PWRvY3VtZW50LmJvZHkuc3R5bGUud2Via2l0VXNlclNlbGVjdCxkb2N1bWVudC5ib2R5LnN0eWxlLndlYmtpdFVzZXJTZWxlY3Q9Im5vbmUiLF8oJCkpfSksb25Qb2ludGVyTW92ZTpNdChlLm9uUG9pbnRlck1vdmUsXyksb25Qb2ludGVyVXA6TXQoZS5vblBvaW50ZXJVcCwkPT57Y29uc3QgTz0kLnRhcmdldDtPLmhhc1BvaW50ZXJDYXB0dXJlKCQucG9pbnRlcklkKSYmKCQucHJldmVudERlZmF1bHQoKSxPLnJlbGVhc2VQb2ludGVyQ2FwdHVyZSgkLnBvaW50ZXJJZCkpfSksb25Mb3N0UG9pbnRlckNhcHR1cmU6KCk9Pntkb2N1bWVudC5ib2R5LnN0eWxlLndlYmtpdFVzZXJTZWxlY3Q9eC5jdXJyZW50LHYuY3VycmVudD1udWxsfX0pfSl9Y29uc3Qgd2E9ZT0+e2NvbnN0e3NpemVzOnQsb25TaXplc0NoYW5nZTpuLHN0eWxlOnIscmVmOnMsLi4uYX09ZSxpPUJlKCksW2wsY109bS51c2VTdGF0ZSgpLGQ9bS51c2VSZWYobnVsbCksdT1MZShzLGQsaS5vblNjcm9sbGJhclhDaGFuZ2UpO3JldHVybiBtLnVzZUVmZmVjdCgoKT0+e2QuY3VycmVudCYmYyhnZXRDb21wdXRlZFN0eWxlKGQuY3VycmVudCkpfSxbZF0pLG8uanN4KHhhLHsiZGF0YS1vcmllbnRhdGlvbiI6Imhvcml6b250YWwiLC4uLmEscmVmOnUsc2l6ZXM6dCxzdHlsZTp7Li4uciwiLS1zYS10aHVtYi13aWR0aCI6YCR7YXIodCl9cHhgfSxvblRodW1iUG9pbnRlckRvd246Zj0+ZS5vblRodW1iUG9pbnRlckRvd24oZi54KSxvbkRyYWdTY3JvbGw6Zj0+ZS5vbkRyYWdTY3JvbGwoZi54KSxvbldoZWVsU2Nyb2xsOihmLHApPT57aWYoaS52aWV3cG9ydCl7Y29uc3QgaD1pLnZpZXdwb3J0LnNjcm9sbExlZnQrZi5kZWx0YVg7ZS5vbldoZWVsU2Nyb2xsKGgpLHlhKGgscCkmJmYucHJldmVudERlZmF1bHQoKX19LG9uUmVzaXplOigpPT57ZC5jdXJyZW50JiZpLnZpZXdwb3J0JiZsJiZuKHtjb250ZW50Omkudmlld3BvcnQuc2Nyb2xsV2lkdGgsdmlld3BvcnQ6aS52aWV3cG9ydC5vZmZzZXRXaWR0aCxzY3JvbGxiYXI6e3NpemU6ZC5jdXJyZW50LmNsaWVudFdpZHRoLHBhZGRpbmdTdGFydDpRbihsLnBhZGRpbmdMZWZ0KSxwYWRkaW5nRW5kOlFuKGwucGFkZGluZ1JpZ2h0KX19KX19KX07d2EuZGlzcGxheU5hbWU9IkBtYW50aW5lL2NvcmUvU2Nyb2xsQXJlYVNjcm9sbGJhclgiO2Z1bmN0aW9uIGphKGUpe2NvbnN0e3NpemVzOnQsb25TaXplc0NoYW5nZTpuLHN0eWxlOnIscmVmOnMsLi4uYX09ZSxpPUJlKCksW2wsY109bS51c2VTdGF0ZSgpLGQ9bS51c2VSZWYobnVsbCksdT1MZShzLGQsaS5vblNjcm9sbGJhcllDaGFuZ2UpO3JldHVybiBtLnVzZUVmZmVjdCgoKT0+e2QuY3VycmVudCYmYyh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkLmN1cnJlbnQpKX0sW10pLG8uanN4KHhhLHsuLi5hLCJkYXRhLW9yaWVudGF0aW9uIjoidmVydGljYWwiLHJlZjp1LHNpemVzOnQsc3R5bGU6eyItLXNhLXRodW1iLWhlaWdodCI6YCR7YXIodCl9cHhgLC4uLnJ9LG9uVGh1bWJQb2ludGVyRG93bjpmPT5lLm9uVGh1bWJQb2ludGVyRG93bihmLnkpLG9uRHJhZ1Njcm9sbDpmPT5lLm9uRHJhZ1Njcm9sbChmLnkpLG9uV2hlZWxTY3JvbGw6KGYscCk9PntpZihpLnZpZXdwb3J0KXtjb25zdCBoPWkudmlld3BvcnQuc2Nyb2xsVG9wK2YuZGVsdGFZO2Uub25XaGVlbFNjcm9sbChoKSx5YShoLHApJiZmLnByZXZlbnREZWZhdWx0KCl9fSxvblJlc2l6ZTooKT0+e2QuY3VycmVudCYmaS52aWV3cG9ydCYmbCYmbih7Y29udGVudDppLnZpZXdwb3J0LnNjcm9sbEhlaWdodCx2aWV3cG9ydDppLnZpZXdwb3J0Lm9mZnNldEhlaWdodCxzY3JvbGxiYXI6e3NpemU6ZC5jdXJyZW50LmNsaWVudEhlaWdodCxwYWRkaW5nU3RhcnQ6UW4obC5wYWRkaW5nVG9wKSxwYWRkaW5nRW5kOlFuKGwucGFkZGluZ0JvdHRvbSl9fSl9fSl9amEuZGlzcGxheU5hbWU9IkBtYW50aW5lL2NvcmUvU2Nyb2xsQXJlYVNjcm9sbGJhclkiO2Z1bmN0aW9uIGlyKGUpe2NvbnN0e29yaWVudGF0aW9uOnQ9InZlcnRpY2FsIiwuLi5ufT1lLHtkaXI6cn09Q28oKSxzPUJlKCksYT1tLnVzZVJlZihudWxsKSxpPW0udXNlUmVmKDApLFtsLGNdPW0udXNlU3RhdGUoe2NvbnRlbnQ6MCx2aWV3cG9ydDowLHNjcm9sbGJhcjp7c2l6ZTowLHBhZGRpbmdTdGFydDowLHBhZGRpbmdFbmQ6MH19KSxkPWdhKGwudmlld3BvcnQsbC5jb250ZW50KSx1PXsuLi5uLHNpemVzOmwsb25TaXplc0NoYW5nZTpjLGhhc1RodW1iOmQ+MCYmZDwxLG9uVGh1bWJDaGFuZ2U6cD0+e2EuY3VycmVudD1wfSxvblRodW1iUG9pbnRlclVwOigpPT57aS5jdXJyZW50PTB9LG9uVGh1bWJQb2ludGVyRG93bjpwPT57aS5jdXJyZW50PXB9fSxmPShwLGgpPT5QZChwLGkuY3VycmVudCxsLGgpO3JldHVybiB0PT09Imhvcml6b250YWwiP28uanN4KHdhLHsuLi51LG9uVGh1bWJQb3NpdGlvbkNoYW5nZTooKT0+e2lmKHMudmlld3BvcnQmJmEuY3VycmVudCl7Y29uc3QgcD1zLnZpZXdwb3J0LnNjcm9sbExlZnQsaD1mcyhwLGwscik7YS5jdXJyZW50LnN0eWxlLnRyYW5zZm9ybT1gdHJhbnNsYXRlM2QoJHtofXB4LCAwLCAwKWB9fSxvbldoZWVsU2Nyb2xsOnA9PntzLnZpZXdwb3J0JiYocy52aWV3cG9ydC5zY3JvbGxMZWZ0PXApfSxvbkRyYWdTY3JvbGw6cD0+e3Mudmlld3BvcnQmJihzLnZpZXdwb3J0LnNjcm9sbExlZnQ9ZihwLHIpKX19KTp0PT09InZlcnRpY2FsIj9vLmpzeChqYSx7Li4udSxvblRodW1iUG9zaXRpb25DaGFuZ2U6KCk9PntpZihzLnZpZXdwb3J0JiZhLmN1cnJlbnQpe2NvbnN0IHA9cy52aWV3cG9ydC5zY3JvbGxUb3AsaD1mcyhwLGwpO2wuc2Nyb2xsYmFyLnNpemU9PT0wP2EuY3VycmVudC5zdHlsZS5zZXRQcm9wZXJ0eSgiLS10aHVtYi1vcGFjaXR5IiwiMCIpOmEuY3VycmVudC5zdHlsZS5zZXRQcm9wZXJ0eSgiLS10aHVtYi1vcGFjaXR5IiwiMSIpLGEuY3VycmVudC5zdHlsZS50cmFuc2Zvcm09YHRyYW5zbGF0ZTNkKDAsICR7aH1weCwgMClgfX0sb25XaGVlbFNjcm9sbDpwPT57cy52aWV3cG9ydCYmKHMudmlld3BvcnQuc2Nyb2xsVG9wPXApfSxvbkRyYWdTY3JvbGw6cD0+e3Mudmlld3BvcnQmJihzLnZpZXdwb3J0LnNjcm9sbFRvcD1mKHApKX19KTpudWxsfWlyLmRpc3BsYXlOYW1lPSJAbWFudGluZS9jb3JlL1Njcm9sbEFyZWFTY3JvbGxiYXJWaXNpYmxlIjtmdW5jdGlvbiBObyhlKXtjb25zdCB0PUJlKCkse2ZvcmNlTW91bnQ6biwuLi5yfT1lLFtzLGFdPW0udXNlU3RhdGUoITEpLGk9ZS5vcmllbnRhdGlvbj09PSJob3Jpem9udGFsIixsPXJyKCgpPT57aWYodC52aWV3cG9ydCl7Y29uc3QgYz10LnZpZXdwb3J0Lm9mZnNldFdpZHRoPHQudmlld3BvcnQuc2Nyb2xsV2lkdGgsZD10LnZpZXdwb3J0Lm9mZnNldEhlaWdodDx0LnZpZXdwb3J0LnNjcm9sbEhlaWdodDthKGk/YzpkKX19LDEwKTtyZXR1cm4gTnQodC52aWV3cG9ydCxsKSxOdCh0LmNvbnRlbnQsbCksbnx8cz9vLmpzeChpcix7ImRhdGEtc3RhdGUiOnM/InZpc2libGUiOiJoaWRkZW4iLC4uLnJ9KTpudWxsfU5vLmRpc3BsYXlOYW1lPSJAbWFudGluZS9jb3JlL1Njcm9sbEFyZWFTY3JvbGxiYXJBdXRvIjtmdW5jdGlvbiBTYShlKXtjb25zdHtmb3JjZU1vdW50OnQsLi4ubn09ZSxyPUJlKCksW3MsYV09bS51c2VTdGF0ZSghMSk7cmV0dXJuIG0udXNlRWZmZWN0KCgpPT57Y29uc3R7c2Nyb2xsQXJlYTppfT1yO2xldCBsPTA7aWYoaSl7Y29uc3QgYz0oKT0+e3dpbmRvdy5jbGVhclRpbWVvdXQobCksYSghMCl9LGQ9KCk9PntsPXdpbmRvdy5zZXRUaW1lb3V0KCgpPT5hKCExKSxyLnNjcm9sbEhpZGVEZWxheSl9O3JldHVybiBpLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJlbnRlciIsYyksaS5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVybGVhdmUiLGQpLCgpPT57d2luZG93LmNsZWFyVGltZW91dChsKSxpLnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJlbnRlciIsYyksaS5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVybGVhdmUiLGQpfX19LFtyLnNjcm9sbEFyZWEsci5zY3JvbGxIaWRlRGVsYXldKSx0fHxzP28uanN4KE5vLHsiZGF0YS1zdGF0ZSI6cz8idmlzaWJsZSI6ImhpZGRlbiIsLi4ubn0pOm51bGx9U2EuZGlzcGxheU5hbWU9IkBtYW50aW5lL2NvcmUvU2Nyb2xsQXJlYVNjcm9sbGJhckhvdmVyIjtmdW5jdGlvbiBBZChlKXtjb25zdHtmb3JjZU1vdW50OnQsLi4ubn09ZSxyPUJlKCkscz1lLm9yaWVudGF0aW9uPT09Imhvcml6b250YWwiLFthLGldPW0udXNlU3RhdGUoImhpZGRlbiIpLGw9cnIoKCk9PmkoImlkbGUiKSwxMDApO3JldHVybiBtLnVzZUVmZmVjdCgoKT0+e2lmKGE9PT0iaWRsZSIpe2NvbnN0IGM9d2luZG93LnNldFRpbWVvdXQoKCk9PmkoImhpZGRlbiIpLHIuc2Nyb2xsSGlkZURlbGF5KTtyZXR1cm4oKT0+d2luZG93LmNsZWFyVGltZW91dChjKX19LFthLHIuc2Nyb2xsSGlkZURlbGF5XSksbS51c2VFZmZlY3QoKCk9Pntjb25zdHt2aWV3cG9ydDpjfT1yLGQ9cz8ic2Nyb2xsTGVmdCI6InNjcm9sbFRvcCI7aWYoYyl7bGV0IHU9Y1tkXTtjb25zdCBmPSgpPT57Y29uc3QgcD1jW2RdO3UhPT1wJiYoaSgic2Nyb2xsaW5nIiksbCgpKSx1PXB9O3JldHVybiBjLmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsZiksKCk9PmMucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixmKX19LFtyLnZpZXdwb3J0LHMsbF0pLHR8fGEhPT0iaGlkZGVuIj9vLmpzeChpcix7ImRhdGEtc3RhdGUiOmE9PT0iaGlkZGVuIj8iaGlkZGVuIjoidmlzaWJsZSIsLi4ubixvblBvaW50ZXJFbnRlcjpNdChlLm9uUG9pbnRlckVudGVyLCgpPT5pKCJpbnRlcmFjdGluZyIpKSxvblBvaW50ZXJMZWF2ZTpNdChlLm9uUG9pbnRlckxlYXZlLCgpPT5pKCJpZGxlIikpfSk6bnVsbH1mdW5jdGlvbiB0byhlKXtjb25zdHtmb3JjZU1vdW50OnQsLi4ubn09ZSxyPUJlKCkse29uU2Nyb2xsYmFyWEVuYWJsZWRDaGFuZ2U6cyxvblNjcm9sbGJhcllFbmFibGVkQ2hhbmdlOmF9PXIsaT1lLm9yaWVudGF0aW9uPT09Imhvcml6b250YWwiO3JldHVybiBtLnVzZUVmZmVjdCgoKT0+KGk/cyghMCk6YSghMCksKCk9PntpP3MoITEpOmEoITEpfSksW2kscyxhXSksci50eXBlPT09ImhvdmVyIj9vLmpzeChTYSx7Li4ubixmb3JjZU1vdW50OnR9KTpyLnR5cGU9PT0ic2Nyb2xsIj9vLmpzeChBZCx7Li4ubixmb3JjZU1vdW50OnR9KTpyLnR5cGU9PT0iYXV0byI/by5qc3goTm8sey4uLm4sZm9yY2VNb3VudDp0fSk6ci50eXBlPT09ImFsd2F5cyI/by5qc3goaXIsey4uLm59KTpudWxsfXRvLmRpc3BsYXlOYW1lPSJAbWFudGluZS9jb3JlL1Njcm9sbEFyZWFTY3JvbGxiYXIiO2Z1bmN0aW9uIE9kKGUsdD0oKT0+e30pe2xldCBuPXtsZWZ0OmUuc2Nyb2xsTGVmdCx0b3A6ZS5zY3JvbGxUb3B9LHI9MDtyZXR1cm4oZnVuY3Rpb24gcygpe2NvbnN0IGE9e2xlZnQ6ZS5zY3JvbGxMZWZ0LHRvcDplLnNjcm9sbFRvcH0saT1uLmxlZnQhPT1hLmxlZnQsbD1uLnRvcCE9PWEudG9wOyhpfHxsKSYmdCgpLG49YSxyPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUocyl9KSgpLCgpPT53aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUocil9ZnVuY3Rpb24gQ2EoZSl7Y29uc3R7c3R5bGU6dCxyZWY6biwuLi5yfT1lLHM9QmUoKSxhPXZhKCkse29uVGh1bWJQb3NpdGlvbkNoYW5nZTppfT1hLGw9TGUobix1PT5hLm9uVGh1bWJDaGFuZ2UodSkpLGM9bS51c2VSZWYodm9pZCAwKSxkPXJyKCgpPT57Yy5jdXJyZW50JiYoYy5jdXJyZW50KCksYy5jdXJyZW50PXZvaWQgMCl9LDEwMCk7cmV0dXJuIG0udXNlRWZmZWN0KCgpPT57Y29uc3R7dmlld3BvcnQ6dX09cztpZih1KXtjb25zdCBmPSgpPT57ZCgpLGMuY3VycmVudHx8KGMuY3VycmVudD1PZCh1LGkpLGkoKSl9O3JldHVybiBpKCksdS5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLGYpLCgpPT51LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsZil9fSxbcy52aWV3cG9ydCxkLGldKSxvLmpzeCgiZGl2Iix7ImRhdGEtc3RhdGUiOmEuaGFzVGh1bWI/InZpc2libGUiOiJoaWRkZW4iLC4uLnIscmVmOmwsc3R5bGU6e3dpZHRoOiJ2YXIoLS1zYS10aHVtYi13aWR0aCkiLGhlaWdodDoidmFyKC0tc2EtdGh1bWItaGVpZ2h0KSIsLi4udH0sb25Qb2ludGVyRG93bkNhcHR1cmU6TXQoZS5vblBvaW50ZXJEb3duQ2FwdHVyZSx1PT57Y29uc3QgZj11LnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxwPXUuY2xpZW50WC1mLmxlZnQsaD11LmNsaWVudFktZi50b3A7YS5vblRodW1iUG9pbnRlckRvd24oe3g6cCx5Omh9KX0pLG9uUG9pbnRlclVwOk10KGUub25Qb2ludGVyVXAsYS5vblRodW1iUG9pbnRlclVwKX0pfUNhLmRpc3BsYXlOYW1lPSJAbWFudGluZS9jb3JlL1Njcm9sbEFyZWFUaHVtYiI7ZnVuY3Rpb24gbm8oZSl7Y29uc3R7Zm9yY2VNb3VudDp0LC4uLm59PWUscj12YSgpO3JldHVybiB0fHxyLmhhc1RodW1iP28uanN4KENhLHsuLi5ufSk6bnVsbH1uby5kaXNwbGF5TmFtZT0iQG1hbnRpbmUvY29yZS9TY3JvbGxBcmVhVGh1bWIiO2Z1bmN0aW9uIE5hKHtjaGlsZHJlbjplLHN0eWxlOnQscmVmOm4sb25XaGVlbDpyLC4uLnN9KXtjb25zdCBhPUJlKCksaT1MZShuLGEub25WaWV3cG9ydENoYW5nZSksbD1jPT57aWYocj8uKGMpLGEuc2Nyb2xsYmFyWEVuYWJsZWQmJmEudmlld3BvcnQmJmMuc2hpZnRLZXkpe2NvbnN0e3Njcm9sbFRvcDpkLHNjcm9sbEhlaWdodDp1LGNsaWVudEhlaWdodDpmLHNjcm9sbFdpZHRoOnAsY2xpZW50V2lkdGg6aH09YS52aWV3cG9ydCx5PWQ8MSxnPWQ+PXUtZi0xO3A+aCYmKHl8fGcpJiZjLnN0b3BQcm9wYWdhdGlvbigpfX07cmV0dXJuIG8uanN4KHEsey4uLnMscmVmOmksb25XaGVlbDpsLHN0eWxlOntvdmVyZmxvd1g6YS5zY3JvbGxiYXJYRW5hYmxlZD8ic2Nyb2xsIjoiaGlkZGVuIixvdmVyZmxvd1k6YS5zY3JvbGxiYXJZRW5hYmxlZD8ic2Nyb2xsIjoiaGlkZGVuIiwuLi50fSxjaGlsZHJlbjpvLmpzeCgiZGl2Iix7Li4uYS5nZXRTdHlsZXMoImNvbnRlbnQiKSxyZWY6YS5vbkNvbnRlbnRDaGFuZ2UsY2hpbGRyZW46ZX0pfSl9TmEuZGlzcGxheU5hbWU9IkBtYW50aW5lL2NvcmUvU2Nyb2xsQXJlYVZpZXdwb3J0Ijt2YXIga289e3Jvb3Q6Im1fZDU3MDY5YjUiLGNvbnRlbnQ6Im1fYjEzMzZjNiIsdmlld3BvcnQ6Im1fYzA3ODNmZjkiLHZpZXdwb3J0SW5uZXI6Im1fZjhmNjMxZGQiLHNjcm9sbGJhcjoibV9jNDRiYTkzMyIsdGh1bWI6Im1fZDhiNWUzNjMiLGNvcm5lcjoibV8yMTY1NzI2OCJ9O2Z1bmN0aW9uIGxyKCl7cmV0dXJuIHR5cGVvZiB3aW5kb3c8InUifWZ1bmN0aW9uIHJuKGUpe3JldHVybiBrYShlKT8oZS5ub2RlTmFtZXx8IiIpLnRvTG93ZXJDYXNlKCk6IiNkb2N1bWVudCJ9ZnVuY3Rpb24gRGUoZSl7dmFyIHQ7cmV0dXJuKGU9PW51bGx8fCh0PWUub3duZXJEb2N1bWVudCk9PW51bGw/dm9pZCAwOnQuZGVmYXVsdFZpZXcpfHx3aW5kb3d9ZnVuY3Rpb24gb3QoZSl7dmFyIHQ7cmV0dXJuKHQ9KGthKGUpP2Uub3duZXJEb2N1bWVudDplLmRvY3VtZW50KXx8d2luZG93LmRvY3VtZW50KT09bnVsbD92b2lkIDA6dC5kb2N1bWVudEVsZW1lbnR9ZnVuY3Rpb24ga2EoZSl7cmV0dXJuIGxyKCk/ZSBpbnN0YW5jZW9mIE5vZGV8fGUgaW5zdGFuY2VvZiBEZShlKS5Ob2RlOiExfWZ1bmN0aW9uIGtlKGUpe3JldHVybiBscigpP2UgaW5zdGFuY2VvZiBFbGVtZW50fHxlIGluc3RhbmNlb2YgRGUoZSkuRWxlbWVudDohMX1mdW5jdGlvbiBidChlKXtyZXR1cm4gbHIoKT9lIGluc3RhbmNlb2YgSFRNTEVsZW1lbnR8fGUgaW5zdGFuY2VvZiBEZShlKS5IVE1MRWxlbWVudDohMX1mdW5jdGlvbiBwcyhlKXtyZXR1cm4hbHIoKXx8dHlwZW9mIFNoYWRvd1Jvb3Q+InUiPyExOmUgaW5zdGFuY2VvZiBTaGFkb3dSb290fHxlIGluc3RhbmNlb2YgRGUoZSkuU2hhZG93Um9vdH1mdW5jdGlvbiBrbihlKXtjb25zdHtvdmVyZmxvdzp0LG92ZXJmbG93WDpuLG92ZXJmbG93WTpyLGRpc3BsYXk6c309R2UoZSk7cmV0dXJuL2F1dG98c2Nyb2xsfG92ZXJsYXl8aGlkZGVufGNsaXAvLnRlc3QodCtyK24pJiZzIT09ImlubGluZSImJnMhPT0iY29udGVudHMifWZ1bmN0aW9uIE1kKGUpe3JldHVybi9eKHRhYmxlfHRkfHRoKSQvLnRlc3Qocm4oZSkpfWZ1bmN0aW9uIGNyKGUpe3RyeXtpZihlLm1hdGNoZXMoIjpwb3BvdmVyLW9wZW4iKSlyZXR1cm4hMH1jYXRjaHt9dHJ5e3JldHVybiBlLm1hdGNoZXMoIjptb2RhbCIpfWNhdGNoe3JldHVybiExfX1jb25zdCBEZD0vdHJhbnNmb3JtfHRyYW5zbGF0ZXxzY2FsZXxyb3RhdGV8cGVyc3BlY3RpdmV8ZmlsdGVyLyxMZD0vcGFpbnR8bGF5b3V0fHN0cmljdHxjb250ZW50LyxFdD1lPT4hIWUmJmUhPT0ibm9uZSI7bGV0IElyO2Z1bmN0aW9uIFJvKGUpe2NvbnN0IHQ9a2UoZSk/R2UoZSk6ZTtyZXR1cm4gRXQodC50cmFuc2Zvcm0pfHxFdCh0LnRyYW5zbGF0ZSl8fEV0KHQuc2NhbGUpfHxFdCh0LnJvdGF0ZSl8fEV0KHQucGVyc3BlY3RpdmUpfHwhX28oKSYmKEV0KHQuYmFja2Ryb3BGaWx0ZXIpfHxFdCh0LmZpbHRlcikpfHxEZC50ZXN0KHQud2lsbENoYW5nZXx8IiIpfHxMZC50ZXN0KHQuY29udGFpbnx8IiIpfWZ1bmN0aW9uIEZkKGUpe2xldCB0PWt0KGUpO2Zvcig7YnQodCkmJiFadCh0KTspe2lmKFJvKHQpKXJldHVybiB0O2lmKGNyKHQpKXJldHVybiBudWxsO3Q9a3QodCl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gX28oKXtyZXR1cm4gSXI9PW51bGwmJihJcj10eXBlb2YgQ1NTPCJ1IiYmQ1NTLnN1cHBvcnRzJiZDU1Muc3VwcG9ydHMoIi13ZWJraXQtYmFja2Ryb3AtZmlsdGVyIiwibm9uZSIpKSxJcn1mdW5jdGlvbiBadChlKXtyZXR1cm4vXihodG1sfGJvZHl8I2RvY3VtZW50KSQvLnRlc3Qocm4oZSkpfWZ1bmN0aW9uIEdlKGUpe3JldHVybiBEZShlKS5nZXRDb21wdXRlZFN0eWxlKGUpfWZ1bmN0aW9uIGRyKGUpe3JldHVybiBrZShlKT97c2Nyb2xsTGVmdDplLnNjcm9sbExlZnQsc2Nyb2xsVG9wOmUuc2Nyb2xsVG9wfTp7c2Nyb2xsTGVmdDplLnNjcm9sbFgsc2Nyb2xsVG9wOmUuc2Nyb2xsWX19ZnVuY3Rpb24ga3QoZSl7aWYocm4oZSk9PT0iaHRtbCIpcmV0dXJuIGU7Y29uc3QgdD1lLmFzc2lnbmVkU2xvdHx8ZS5wYXJlbnROb2RlfHxwcyhlKSYmZS5ob3N0fHxvdChlKTtyZXR1cm4gcHModCk/dC5ob3N0OnR9ZnVuY3Rpb24gUmEoZSl7Y29uc3QgdD1rdChlKTtyZXR1cm4gWnQodCk/ZS5vd25lckRvY3VtZW50P2Uub3duZXJEb2N1bWVudC5ib2R5OmUuYm9keTpidCh0KSYma24odCk/dDpSYSh0KX1mdW5jdGlvbiBqbihlLHQsbil7dmFyIHI7dD09PXZvaWQgMCYmKHQ9W10pLG49PT12b2lkIDAmJihuPSEwKTtjb25zdCBzPVJhKGUpLGE9cz09PSgocj1lLm93bmVyRG9jdW1lbnQpPT1udWxsP3ZvaWQgMDpyLmJvZHkpLGk9RGUocyk7aWYoYSl7Y29uc3QgbD1ybyhpKTtyZXR1cm4gdC5jb25jYXQoaSxpLnZpc3VhbFZpZXdwb3J0fHxbXSxrbihzKT9zOltdLGwmJm4/am4obCk6W10pfWVsc2UgcmV0dXJuIHQuY29uY2F0KHMsam4ocyxbXSxuKSl9ZnVuY3Rpb24gcm8oZSl7cmV0dXJuIGUucGFyZW50JiZPYmplY3QuZ2V0UHJvdG90eXBlT2YoZS5wYXJlbnQpP2UuZnJhbWVFbGVtZW50Om51bGx9Y29uc3QgSWQ9WyJ0b3AiLCJyaWdodCIsImJvdHRvbSIsImxlZnQiXSxYZT1NYXRoLm1pbixTZT1NYXRoLm1heCxlcj1NYXRoLnJvdW5kLEJuPU1hdGguZmxvb3IsbnQ9ZT0+KHt4OmUseTplfSksemQ9e2xlZnQ6InJpZ2h0IixyaWdodDoibGVmdCIsYm90dG9tOiJ0b3AiLHRvcDoiYm90dG9tIn07ZnVuY3Rpb24gb28oZSx0LG4pe3JldHVybiBTZShlLFhlKHQsbikpfWZ1bmN0aW9uIHJ0KGUsdCl7cmV0dXJuIHR5cGVvZiBlPT0iZnVuY3Rpb24iP2UodCk6ZX1mdW5jdGlvbiBLZShlKXtyZXR1cm4gZS5zcGxpdCgiLSIpWzBdfWZ1bmN0aW9uIG9uKGUpe3JldHVybiBlLnNwbGl0KCItIilbMV19ZnVuY3Rpb24gJG8oZSl7cmV0dXJuIGU9PT0ieCI/InkiOiJ4In1mdW5jdGlvbiBUbyhlKXtyZXR1cm4gZT09PSJ5Ij8iaGVpZ2h0Ijoid2lkdGgifWZ1bmN0aW9uIFllKGUpe2NvbnN0IHQ9ZVswXTtyZXR1cm4gdD09PSJ0Inx8dD09PSJiIj8ieSI6IngifWZ1bmN0aW9uIFBvKGUpe3JldHVybiAkbyhZZShlKSl9ZnVuY3Rpb24gQmQoZSx0LG4pe249PT12b2lkIDAmJihuPSExKTtjb25zdCByPW9uKGUpLHM9UG8oZSksYT1UbyhzKTtsZXQgaT1zPT09IngiP3I9PT0obj8iZW5kIjoic3RhcnQiKT8icmlnaHQiOiJsZWZ0IjpyPT09InN0YXJ0Ij8iYm90dG9tIjoidG9wIjtyZXR1cm4gdC5yZWZlcmVuY2VbYV0+dC5mbG9hdGluZ1thXSYmKGk9dHIoaSkpLFtpLHRyKGkpXX1mdW5jdGlvbiBWZChlKXtjb25zdCB0PXRyKGUpO3JldHVybltzbyhlKSx0LHNvKHQpXX1mdW5jdGlvbiBzbyhlKXtyZXR1cm4gZS5pbmNsdWRlcygic3RhcnQiKT9lLnJlcGxhY2UoInN0YXJ0IiwiZW5kIik6ZS5yZXBsYWNlKCJlbmQiLCJzdGFydCIpfWNvbnN0IG1zPVsibGVmdCIsInJpZ2h0Il0saHM9WyJyaWdodCIsImxlZnQiXSxXZD1bInRvcCIsImJvdHRvbSJdLEhkPVsiYm90dG9tIiwidG9wIl07ZnVuY3Rpb24gcWQoZSx0LG4pe3N3aXRjaChlKXtjYXNlInRvcCI6Y2FzZSJib3R0b20iOnJldHVybiBuP3Q/aHM6bXM6dD9tczpocztjYXNlImxlZnQiOmNhc2UicmlnaHQiOnJldHVybiB0P1dkOkhkO2RlZmF1bHQ6cmV0dXJuW119fWZ1bmN0aW9uIFlkKGUsdCxuLHIpe2NvbnN0IHM9b24oZSk7bGV0IGE9cWQoS2UoZSksbj09PSJzdGFydCIscik7cmV0dXJuIHMmJihhPWEubWFwKGk9PmkrIi0iK3MpLHQmJihhPWEuY29uY2F0KGEubWFwKHNvKSkpKSxhfWZ1bmN0aW9uIHRyKGUpe2NvbnN0IHQ9S2UoZSk7cmV0dXJuIHpkW3RdK2Uuc2xpY2UodC5sZW5ndGgpfWZ1bmN0aW9uIFVkKGUpe3JldHVybnt0b3A6MCxyaWdodDowLGJvdHRvbTowLGxlZnQ6MCwuLi5lfX1mdW5jdGlvbiBFbyhlKXtyZXR1cm4gdHlwZW9mIGUhPSJudW1iZXIiP1VkKGUpOnt0b3A6ZSxyaWdodDplLGJvdHRvbTplLGxlZnQ6ZX19ZnVuY3Rpb24gUXQoZSl7Y29uc3R7eDp0LHk6bix3aWR0aDpyLGhlaWdodDpzfT1lO3JldHVybnt3aWR0aDpyLGhlaWdodDpzLHRvcDpuLGxlZnQ6dCxyaWdodDp0K3IsYm90dG9tOm4rcyx4OnQseTpufX12YXIgR2Q9dHlwZW9mIGRvY3VtZW50PCJ1IixYZD1mdW5jdGlvbigpe30sYW89R2Q/bS51c2VMYXlvdXRFZmZlY3Q6WGQ7Y29uc3QgS2Q9ey4uLkdzfSxKZD1LZC51c2VJbnNlcnRpb25FZmZlY3QsWmQ9SmR8fChlPT5lKCkpO2Z1bmN0aW9uIFFkKGUpe2NvbnN0IHQ9bS51c2VSZWYoKCk9Pnt9KTtyZXR1cm4gWmQoKCk9Pnt0LmN1cnJlbnQ9ZX0pLG0udXNlQ2FsbGJhY2soZnVuY3Rpb24oKXtmb3IodmFyIG49YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheShuKSxzPTA7czxuO3MrKylyW3NdPWFyZ3VtZW50c1tzXTtyZXR1cm4gdC5jdXJyZW50PT1udWxsP3ZvaWQgMDp0LmN1cnJlbnQoLi4ucil9LFtdKX1mdW5jdGlvbiBncyhlLHQsbil7bGV0e3JlZmVyZW5jZTpyLGZsb2F0aW5nOnN9PWU7Y29uc3QgYT1ZZSh0KSxpPVBvKHQpLGw9VG8oaSksYz1LZSh0KSxkPWE9PT0ieSIsdT1yLngrci53aWR0aC8yLXMud2lkdGgvMixmPXIueStyLmhlaWdodC8yLXMuaGVpZ2h0LzIscD1yW2xdLzItc1tsXS8yO2xldCBoO3N3aXRjaChjKXtjYXNlInRvcCI6aD17eDp1LHk6ci55LXMuaGVpZ2h0fTticmVhaztjYXNlImJvdHRvbSI6aD17eDp1LHk6ci55K3IuaGVpZ2h0fTticmVhaztjYXNlInJpZ2h0IjpoPXt4OnIueCtyLndpZHRoLHk6Zn07YnJlYWs7Y2FzZSJsZWZ0IjpoPXt4OnIueC1zLndpZHRoLHk6Zn07YnJlYWs7ZGVmYXVsdDpoPXt4OnIueCx5OnIueX19c3dpdGNoKG9uKHQpKXtjYXNlInN0YXJ0IjpoW2ldLT1wKihuJiZkPy0xOjEpO2JyZWFrO2Nhc2UiZW5kIjpoW2ldKz1wKihuJiZkPy0xOjEpO2JyZWFrfXJldHVybiBofWFzeW5jIGZ1bmN0aW9uIGV1KGUsdCl7dmFyIG47dD09PXZvaWQgMCYmKHQ9e30pO2NvbnN0e3g6cix5OnMscGxhdGZvcm06YSxyZWN0czppLGVsZW1lbnRzOmwsc3RyYXRlZ3k6Y309ZSx7Ym91bmRhcnk6ZD0iY2xpcHBpbmdBbmNlc3RvcnMiLHJvb3RCb3VuZGFyeTp1PSJ2aWV3cG9ydCIsZWxlbWVudENvbnRleHQ6Zj0iZmxvYXRpbmciLGFsdEJvdW5kYXJ5OnA9ITEscGFkZGluZzpoPTB9PXJ0KHQsZSkseT1FbyhoKSx2PWxbcD9mPT09ImZsb2F0aW5nIj8icmVmZXJlbmNlIjoiZmxvYXRpbmciOmZdLHg9UXQoYXdhaXQgYS5nZXRDbGlwcGluZ1JlY3Qoe2VsZW1lbnQ6KG49YXdhaXQoYS5pc0VsZW1lbnQ9PW51bGw/dm9pZCAwOmEuaXNFbGVtZW50KHYpKSk9PW51bGx8fG4/djp2LmNvbnRleHRFbGVtZW50fHxhd2FpdChhLmdldERvY3VtZW50RWxlbWVudD09bnVsbD92b2lkIDA6YS5nZXREb2N1bWVudEVsZW1lbnQobC5mbG9hdGluZykpLGJvdW5kYXJ5OmQscm9vdEJvdW5kYXJ5OnUsc3RyYXRlZ3k6Y30pKSxqPWY9PT0iZmxvYXRpbmciP3t4OnIseTpzLHdpZHRoOmkuZmxvYXRpbmcud2lkdGgsaGVpZ2h0OmkuZmxvYXRpbmcuaGVpZ2h0fTppLnJlZmVyZW5jZSx3PWF3YWl0KGEuZ2V0T2Zmc2V0UGFyZW50PT1udWxsP3ZvaWQgMDphLmdldE9mZnNldFBhcmVudChsLmZsb2F0aW5nKSksUz1hd2FpdChhLmlzRWxlbWVudD09bnVsbD92b2lkIDA6YS5pc0VsZW1lbnQodykpP2F3YWl0KGEuZ2V0U2NhbGU9PW51bGw/dm9pZCAwOmEuZ2V0U2NhbGUodykpfHx7eDoxLHk6MX06e3g6MSx5OjF9LEM9UXQoYS5jb252ZXJ0T2Zmc2V0UGFyZW50UmVsYXRpdmVSZWN0VG9WaWV3cG9ydFJlbGF0aXZlUmVjdD9hd2FpdCBhLmNvbnZlcnRPZmZzZXRQYXJlbnRSZWxhdGl2ZVJlY3RUb1ZpZXdwb3J0UmVsYXRpdmVSZWN0KHtlbGVtZW50czpsLHJlY3Q6aixvZmZzZXRQYXJlbnQ6dyxzdHJhdGVneTpjfSk6aik7cmV0dXJue3RvcDooeC50b3AtQy50b3AreS50b3ApL1MueSxib3R0b206KEMuYm90dG9tLXguYm90dG9tK3kuYm90dG9tKS9TLnksbGVmdDooeC5sZWZ0LUMubGVmdCt5LmxlZnQpL1MueCxyaWdodDooQy5yaWdodC14LnJpZ2h0K3kucmlnaHQpL1MueH19Y29uc3QgdHU9NTAsbnU9YXN5bmMoZSx0LG4pPT57Y29uc3R7cGxhY2VtZW50OnI9ImJvdHRvbSIsc3RyYXRlZ3k6cz0iYWJzb2x1dGUiLG1pZGRsZXdhcmU6YT1bXSxwbGF0Zm9ybTppfT1uLGw9aS5kZXRlY3RPdmVyZmxvdz9pOnsuLi5pLGRldGVjdE92ZXJmbG93OmV1fSxjPWF3YWl0KGkuaXNSVEw9PW51bGw/dm9pZCAwOmkuaXNSVEwodCkpO2xldCBkPWF3YWl0IGkuZ2V0RWxlbWVudFJlY3RzKHtyZWZlcmVuY2U6ZSxmbG9hdGluZzp0LHN0cmF0ZWd5OnN9KSx7eDp1LHk6Zn09Z3MoZCxyLGMpLHA9cixoPTA7Y29uc3QgeT17fTtmb3IobGV0IGc9MDtnPGEubGVuZ3RoO2crKyl7Y29uc3Qgdj1hW2ddO2lmKCF2KWNvbnRpbnVlO2NvbnN0e25hbWU6eCxmbjpqfT12LHt4OncseTpTLGRhdGE6QyxyZXNldDprfT1hd2FpdCBqKHt4OnUseTpmLGluaXRpYWxQbGFjZW1lbnQ6cixwbGFjZW1lbnQ6cCxzdHJhdGVneTpzLG1pZGRsZXdhcmVEYXRhOnkscmVjdHM6ZCxwbGF0Zm9ybTpsLGVsZW1lbnRzOntyZWZlcmVuY2U6ZSxmbG9hdGluZzp0fX0pO3U9dz8/dSxmPVM/P2YseVt4XT17Li4ueVt4XSwuLi5DfSxrJiZoPHR1JiYoaCsrLHR5cGVvZiBrPT0ib2JqZWN0IiYmKGsucGxhY2VtZW50JiYocD1rLnBsYWNlbWVudCksay5yZWN0cyYmKGQ9ay5yZWN0cz09PSEwP2F3YWl0IGkuZ2V0RWxlbWVudFJlY3RzKHtyZWZlcmVuY2U6ZSxmbG9hdGluZzp0LHN0cmF0ZWd5OnN9KTprLnJlY3RzKSx7eDp1LHk6Zn09Z3MoZCxwLGMpKSxnPS0xKX1yZXR1cm57eDp1LHk6ZixwbGFjZW1lbnQ6cCxzdHJhdGVneTpzLG1pZGRsZXdhcmVEYXRhOnl9fSxydT1lPT4oe25hbWU6ImFycm93IixvcHRpb25zOmUsYXN5bmMgZm4odCl7Y29uc3R7eDpuLHk6cixwbGFjZW1lbnQ6cyxyZWN0czphLHBsYXRmb3JtOmksZWxlbWVudHM6bCxtaWRkbGV3YXJlRGF0YTpjfT10LHtlbGVtZW50OmQscGFkZGluZzp1PTB9PXJ0KGUsdCl8fHt9O2lmKGQ9PW51bGwpcmV0dXJue307Y29uc3QgZj1Fbyh1KSxwPXt4Om4seTpyfSxoPVBvKHMpLHk9VG8oaCksZz1hd2FpdCBpLmdldERpbWVuc2lvbnMoZCksdj1oPT09InkiLHg9dj8idG9wIjoibGVmdCIsaj12PyJib3R0b20iOiJyaWdodCIsdz12PyJjbGllbnRIZWlnaHQiOiJjbGllbnRXaWR0aCIsUz1hLnJlZmVyZW5jZVt5XSthLnJlZmVyZW5jZVtoXS1wW2hdLWEuZmxvYXRpbmdbeV0sQz1wW2hdLWEucmVmZXJlbmNlW2hdLGs9YXdhaXQoaS5nZXRPZmZzZXRQYXJlbnQ9PW51bGw/dm9pZCAwOmkuZ2V0T2Zmc2V0UGFyZW50KGQpKTtsZXQgXz1rP2tbd106MDsoIV98fCFhd2FpdChpLmlzRWxlbWVudD09bnVsbD92b2lkIDA6aS5pc0VsZW1lbnQoaykpKSYmKF89bC5mbG9hdGluZ1t3XXx8YS5mbG9hdGluZ1t5XSk7Y29uc3QgJD1TLzItQy8yLE89Xy8yLWdbeV0vMi0xLFQ9WGUoZlt4XSxPKSxBPVhlKGZbal0sTyksRD1ULFY9Xy1nW3ldLUEsWD1fLzItZ1t5XS8yKyQsSj1vbyhELFgsViksUD0hYy5hcnJvdyYmb24ocykhPW51bGwmJlghPT1KJiZhLnJlZmVyZW5jZVt5XS8yLShYPEQ/VDpBKS1nW3ldLzI8MCxXPVA/WDxEP1gtRDpYLVY6MDtyZXR1cm57W2hdOnBbaF0rVyxkYXRhOntbaF06SixjZW50ZXJPZmZzZXQ6WC1KLVcsLi4uUCYme2FsaWdubWVudE9mZnNldDpXfX0scmVzZXQ6UH19fSksb3U9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT12b2lkIDAmJihlPXt9KSx7bmFtZToiZmxpcCIsb3B0aW9uczplLGFzeW5jIGZuKHQpe3ZhciBuLHI7Y29uc3R7cGxhY2VtZW50OnMsbWlkZGxld2FyZURhdGE6YSxyZWN0czppLGluaXRpYWxQbGFjZW1lbnQ6bCxwbGF0Zm9ybTpjLGVsZW1lbnRzOmR9PXQse21haW5BeGlzOnU9ITAsY3Jvc3NBeGlzOmY9ITAsZmFsbGJhY2tQbGFjZW1lbnRzOnAsZmFsbGJhY2tTdHJhdGVneTpoPSJiZXN0Rml0IixmYWxsYmFja0F4aXNTaWRlRGlyZWN0aW9uOnk9Im5vbmUiLGZsaXBBbGlnbm1lbnQ6Zz0hMCwuLi52fT1ydChlLHQpO2lmKChuPWEuYXJyb3cpIT1udWxsJiZuLmFsaWdubWVudE9mZnNldClyZXR1cm57fTtjb25zdCB4PUtlKHMpLGo9WWUobCksdz1LZShsKT09PWwsUz1hd2FpdChjLmlzUlRMPT1udWxsP3ZvaWQgMDpjLmlzUlRMKGQuZmxvYXRpbmcpKSxDPXB8fCh3fHwhZz9bdHIobCldOlZkKGwpKSxrPXkhPT0ibm9uZSI7IXAmJmsmJkMucHVzaCguLi5ZZChsLGcseSxTKSk7Y29uc3QgXz1bbCwuLi5DXSwkPWF3YWl0IGMuZGV0ZWN0T3ZlcmZsb3codCx2KSxPPVtdO2xldCBUPSgocj1hLmZsaXApPT1udWxsP3ZvaWQgMDpyLm92ZXJmbG93cyl8fFtdO2lmKHUmJk8ucHVzaCgkW3hdKSxmKXtjb25zdCBYPUJkKHMsaSxTKTtPLnB1c2goJFtYWzBdXSwkW1hbMV1dKX1pZihUPVsuLi5ULHtwbGFjZW1lbnQ6cyxvdmVyZmxvd3M6T31dLCFPLmV2ZXJ5KFg9Plg8PTApKXt2YXIgQSxEO2NvbnN0IFg9KCgoQT1hLmZsaXApPT1udWxsP3ZvaWQgMDpBLmluZGV4KXx8MCkrMSxKPV9bWF07aWYoSiYmKCEoZj09PSJhbGlnbm1lbnQiP2ohPT1ZZShKKTohMSl8fFQuZXZlcnkoST0+WWUoSS5wbGFjZW1lbnQpPT09aj9JLm92ZXJmbG93c1swXT4wOiEwKSkpcmV0dXJue2RhdGE6e2luZGV4Olgsb3ZlcmZsb3dzOlR9LHJlc2V0OntwbGFjZW1lbnQ6Sn19O2xldCBQPShEPVQuZmlsdGVyKFc9Plcub3ZlcmZsb3dzWzBdPD0wKS5zb3J0KChXLEkpPT5XLm92ZXJmbG93c1sxXS1JLm92ZXJmbG93c1sxXSlbMF0pPT1udWxsP3ZvaWQgMDpELnBsYWNlbWVudDtpZighUClzd2l0Y2goaCl7Y2FzZSJiZXN0Rml0Ijp7dmFyIFY7Y29uc3QgVz0oVj1ULmZpbHRlcihJPT57aWYoayl7Y29uc3Qgej1ZZShJLnBsYWNlbWVudCk7cmV0dXJuIHo9PT1qfHx6PT09InkifXJldHVybiEwfSkubWFwKEk9PltJLnBsYWNlbWVudCxJLm92ZXJmbG93cy5maWx0ZXIoej0+ej4wKS5yZWR1Y2UoKHosSyk9PnorSywwKV0pLnNvcnQoKEkseik9PklbMV0telsxXSlbMF0pPT1udWxsP3ZvaWQgMDpWWzBdO1cmJihQPVcpO2JyZWFrfWNhc2UiaW5pdGlhbFBsYWNlbWVudCI6UD1sO2JyZWFrfWlmKHMhPT1QKXJldHVybntyZXNldDp7cGxhY2VtZW50OlB9fX1yZXR1cm57fX19fTtmdW5jdGlvbiBicyhlLHQpe3JldHVybnt0b3A6ZS50b3AtdC5oZWlnaHQscmlnaHQ6ZS5yaWdodC10LndpZHRoLGJvdHRvbTplLmJvdHRvbS10LmhlaWdodCxsZWZ0OmUubGVmdC10LndpZHRofX1mdW5jdGlvbiB5cyhlKXtyZXR1cm4gSWQuc29tZSh0PT5lW3RdPj0wKX1jb25zdCBzdT1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e30pLHtuYW1lOiJoaWRlIixvcHRpb25zOmUsYXN5bmMgZm4odCl7Y29uc3R7cmVjdHM6bixwbGF0Zm9ybTpyfT10LHtzdHJhdGVneTpzPSJyZWZlcmVuY2VIaWRkZW4iLC4uLmF9PXJ0KGUsdCk7c3dpdGNoKHMpe2Nhc2UicmVmZXJlbmNlSGlkZGVuIjp7Y29uc3QgaT1hd2FpdCByLmRldGVjdE92ZXJmbG93KHQsey4uLmEsZWxlbWVudENvbnRleHQ6InJlZmVyZW5jZSJ9KSxsPWJzKGksbi5yZWZlcmVuY2UpO3JldHVybntkYXRhOntyZWZlcmVuY2VIaWRkZW5PZmZzZXRzOmwscmVmZXJlbmNlSGlkZGVuOnlzKGwpfX19Y2FzZSJlc2NhcGVkIjp7Y29uc3QgaT1hd2FpdCByLmRldGVjdE92ZXJmbG93KHQsey4uLmEsYWx0Qm91bmRhcnk6ITB9KSxsPWJzKGksbi5mbG9hdGluZyk7cmV0dXJue2RhdGE6e2VzY2FwZWRPZmZzZXRzOmwsZXNjYXBlZDp5cyhsKX19fWRlZmF1bHQ6cmV0dXJue319fX19O2Z1bmN0aW9uIF9hKGUpe2NvbnN0IHQ9WGUoLi4uZS5tYXAoYT0+YS5sZWZ0KSksbj1YZSguLi5lLm1hcChhPT5hLnRvcCkpLHI9U2UoLi4uZS5tYXAoYT0+YS5yaWdodCkpLHM9U2UoLi4uZS5tYXAoYT0+YS5ib3R0b20pKTtyZXR1cm57eDp0LHk6bix3aWR0aDpyLXQsaGVpZ2h0OnMtbn19ZnVuY3Rpb24gYXUoZSl7Y29uc3QgdD1lLnNsaWNlKCkuc29ydCgocyxhKT0+cy55LWEueSksbj1bXTtsZXQgcj1udWxsO2ZvcihsZXQgcz0wO3M8dC5sZW5ndGg7cysrKXtjb25zdCBhPXRbc107IXJ8fGEueS1yLnk+ci5oZWlnaHQvMj9uLnB1c2goW2FdKTpuW24ubGVuZ3RoLTFdLnB1c2goYSkscj1hfXJldHVybiBuLm1hcChzPT5RdChfYShzKSkpfWNvbnN0IGl1PWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dm9pZCAwJiYoZT17fSkse25hbWU6ImlubGluZSIsb3B0aW9uczplLGFzeW5jIGZuKHQpe2NvbnN0e3BsYWNlbWVudDpuLGVsZW1lbnRzOnIscmVjdHM6cyxwbGF0Zm9ybTphLHN0cmF0ZWd5Oml9PXQse3BhZGRpbmc6bD0yLHg6Yyx5OmR9PXJ0KGUsdCksdT1BcnJheS5mcm9tKGF3YWl0KGEuZ2V0Q2xpZW50UmVjdHM9PW51bGw/dm9pZCAwOmEuZ2V0Q2xpZW50UmVjdHMoci5yZWZlcmVuY2UpKXx8W10pLGY9YXUodSkscD1RdChfYSh1KSksaD1FbyhsKTtmdW5jdGlvbiB5KCl7aWYoZi5sZW5ndGg9PT0yJiZmWzBdLmxlZnQ+ZlsxXS5yaWdodCYmYyE9bnVsbCYmZCE9bnVsbClyZXR1cm4gZi5maW5kKHY9PmM+di5sZWZ0LWgubGVmdCYmYzx2LnJpZ2h0K2gucmlnaHQmJmQ+di50b3AtaC50b3AmJmQ8di5ib3R0b20raC5ib3R0b20pfHxwO2lmKGYubGVuZ3RoPj0yKXtpZihZZShuKT09PSJ5Iil7Y29uc3QgVD1mWzBdLEE9ZltmLmxlbmd0aC0xXSxEPUtlKG4pPT09InRvcCIsVj1ULnRvcCxYPUEuYm90dG9tLEo9RD9ULmxlZnQ6QS5sZWZ0LFA9RD9ULnJpZ2h0OkEucmlnaHQsVz1QLUosST1YLVY7cmV0dXJue3RvcDpWLGJvdHRvbTpYLGxlZnQ6SixyaWdodDpQLHdpZHRoOlcsaGVpZ2h0OkkseDpKLHk6Vn19Y29uc3Qgdj1LZShuKT09PSJsZWZ0Iix4PVNlKC4uLmYubWFwKFQ9PlQucmlnaHQpKSxqPVhlKC4uLmYubWFwKFQ9PlQubGVmdCkpLHc9Zi5maWx0ZXIoVD0+dj9ULmxlZnQ9PT1qOlQucmlnaHQ9PT14KSxTPXdbMF0udG9wLEM9d1t3Lmxlbmd0aC0xXS5ib3R0b20saz1qLF89eCwkPV8tayxPPUMtUztyZXR1cm57dG9wOlMsYm90dG9tOkMsbGVmdDprLHJpZ2h0Ol8sd2lkdGg6JCxoZWlnaHQ6Tyx4OmsseTpTfX1yZXR1cm4gcH1jb25zdCBnPWF3YWl0IGEuZ2V0RWxlbWVudFJlY3RzKHtyZWZlcmVuY2U6e2dldEJvdW5kaW5nQ2xpZW50UmVjdDp5fSxmbG9hdGluZzpyLmZsb2F0aW5nLHN0cmF0ZWd5Oml9KTtyZXR1cm4gcy5yZWZlcmVuY2UueCE9PWcucmVmZXJlbmNlLnh8fHMucmVmZXJlbmNlLnkhPT1nLnJlZmVyZW5jZS55fHxzLnJlZmVyZW5jZS53aWR0aCE9PWcucmVmZXJlbmNlLndpZHRofHxzLnJlZmVyZW5jZS5oZWlnaHQhPT1nLnJlZmVyZW5jZS5oZWlnaHQ/e3Jlc2V0OntyZWN0czpnfX06e319fX0sJGE9bmV3IFNldChbImxlZnQiLCJ0b3AiXSk7YXN5bmMgZnVuY3Rpb24gbHUoZSx0KXtjb25zdHtwbGFjZW1lbnQ6bixwbGF0Zm9ybTpyLGVsZW1lbnRzOnN9PWUsYT1hd2FpdChyLmlzUlRMPT1udWxsP3ZvaWQgMDpyLmlzUlRMKHMuZmxvYXRpbmcpKSxpPUtlKG4pLGw9b24obiksYz1ZZShuKT09PSJ5IixkPSRhLmhhcyhpKT8tMToxLHU9YSYmYz8tMToxLGY9cnQodCxlKTtsZXR7bWFpbkF4aXM6cCxjcm9zc0F4aXM6aCxhbGlnbm1lbnRBeGlzOnl9PXR5cGVvZiBmPT0ibnVtYmVyIj97bWFpbkF4aXM6Zixjcm9zc0F4aXM6MCxhbGlnbm1lbnRBeGlzOm51bGx9OnttYWluQXhpczpmLm1haW5BeGlzfHwwLGNyb3NzQXhpczpmLmNyb3NzQXhpc3x8MCxhbGlnbm1lbnRBeGlzOmYuYWxpZ25tZW50QXhpc307cmV0dXJuIGwmJnR5cGVvZiB5PT0ibnVtYmVyIiYmKGg9bD09PSJlbmQiP3kqLTE6eSksYz97eDpoKnUseTpwKmR9Ont4OnAqZCx5OmgqdX19Y29uc3QgY3U9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT12b2lkIDAmJihlPTApLHtuYW1lOiJvZmZzZXQiLG9wdGlvbnM6ZSxhc3luYyBmbih0KXt2YXIgbixyO2NvbnN0e3g6cyx5OmEscGxhY2VtZW50OmksbWlkZGxld2FyZURhdGE6bH09dCxjPWF3YWl0IGx1KHQsZSk7cmV0dXJuIGk9PT0oKG49bC5vZmZzZXQpPT1udWxsP3ZvaWQgMDpuLnBsYWNlbWVudCkmJihyPWwuYXJyb3cpIT1udWxsJiZyLmFsaWdubWVudE9mZnNldD97fTp7eDpzK2MueCx5OmErYy55LGRhdGE6ey4uLmMscGxhY2VtZW50Oml9fX19fSxkdT1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e30pLHtuYW1lOiJzaGlmdCIsb3B0aW9uczplLGFzeW5jIGZuKHQpe2NvbnN0e3g6bix5OnIscGxhY2VtZW50OnMscGxhdGZvcm06YX09dCx7bWFpbkF4aXM6aT0hMCxjcm9zc0F4aXM6bD0hMSxsaW1pdGVyOmM9e2ZuOng9PntsZXR7eDpqLHk6d309eDtyZXR1cm57eDpqLHk6d319fSwuLi5kfT1ydChlLHQpLHU9e3g6bix5OnJ9LGY9YXdhaXQgYS5kZXRlY3RPdmVyZmxvdyh0LGQpLHA9WWUoS2UocykpLGg9JG8ocCk7bGV0IHk9dVtoXSxnPXVbcF07aWYoaSl7Y29uc3QgeD1oPT09InkiPyJ0b3AiOiJsZWZ0IixqPWg9PT0ieSI/ImJvdHRvbSI6InJpZ2h0Iix3PXkrZlt4XSxTPXktZltqXTt5PW9vKHcseSxTKX1pZihsKXtjb25zdCB4PXA9PT0ieSI/InRvcCI6ImxlZnQiLGo9cD09PSJ5Ij8iYm90dG9tIjoicmlnaHQiLHc9ZytmW3hdLFM9Zy1mW2pdO2c9b28odyxnLFMpfWNvbnN0IHY9Yy5mbih7Li4udCxbaF06eSxbcF06Z30pO3JldHVybnsuLi52LGRhdGE6e3g6di54LW4seTp2LnktcixlbmFibGVkOntbaF06aSxbcF06bH19fX19fSx1dT1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e30pLHtvcHRpb25zOmUsZm4odCl7Y29uc3R7eDpuLHk6cixwbGFjZW1lbnQ6cyxyZWN0czphLG1pZGRsZXdhcmVEYXRhOml9PXQse29mZnNldDpsPTAsbWFpbkF4aXM6Yz0hMCxjcm9zc0F4aXM6ZD0hMH09cnQoZSx0KSx1PXt4Om4seTpyfSxmPVllKHMpLHA9JG8oZik7bGV0IGg9dVtwXSx5PXVbZl07Y29uc3QgZz1ydChsLHQpLHY9dHlwZW9mIGc9PSJudW1iZXIiP3ttYWluQXhpczpnLGNyb3NzQXhpczowfTp7bWFpbkF4aXM6MCxjcm9zc0F4aXM6MCwuLi5nfTtpZihjKXtjb25zdCB3PXA9PT0ieSI/ImhlaWdodCI6IndpZHRoIixTPWEucmVmZXJlbmNlW3BdLWEuZmxvYXRpbmdbd10rdi5tYWluQXhpcyxDPWEucmVmZXJlbmNlW3BdK2EucmVmZXJlbmNlW3ddLXYubWFpbkF4aXM7aDxTP2g9UzpoPkMmJihoPUMpfWlmKGQpe3ZhciB4LGo7Y29uc3Qgdz1wPT09InkiPyJ3aWR0aCI6ImhlaWdodCIsUz0kYS5oYXMoS2UocykpLEM9YS5yZWZlcmVuY2VbZl0tYS5mbG9hdGluZ1t3XSsoUyYmKCh4PWkub2Zmc2V0KT09bnVsbD92b2lkIDA6eFtmXSl8fDApKyhTPzA6di5jcm9zc0F4aXMpLGs9YS5yZWZlcmVuY2VbZl0rYS5yZWZlcmVuY2Vbd10rKFM/MDooKGo9aS5vZmZzZXQpPT1udWxsP3ZvaWQgMDpqW2ZdKXx8MCktKFM/di5jcm9zc0F4aXM6MCk7eTxDP3k9Qzp5PmsmJih5PWspfXJldHVybntbcF06aCxbZl06eX19fX0sZnU9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT12b2lkIDAmJihlPXt9KSx7bmFtZToic2l6ZSIsb3B0aW9uczplLGFzeW5jIGZuKHQpe3ZhciBuLHI7Y29uc3R7cGxhY2VtZW50OnMscmVjdHM6YSxwbGF0Zm9ybTppLGVsZW1lbnRzOmx9PXQse2FwcGx5OmM9KCk9Pnt9LC4uLmR9PXJ0KGUsdCksdT1hd2FpdCBpLmRldGVjdE92ZXJmbG93KHQsZCksZj1LZShzKSxwPW9uKHMpLGg9WWUocyk9PT0ieSIse3dpZHRoOnksaGVpZ2h0Omd9PWEuZmxvYXRpbmc7bGV0IHYseDtmPT09InRvcCJ8fGY9PT0iYm90dG9tIj8odj1mLHg9cD09PShhd2FpdChpLmlzUlRMPT1udWxsP3ZvaWQgMDppLmlzUlRMKGwuZmxvYXRpbmcpKT8ic3RhcnQiOiJlbmQiKT8ibGVmdCI6InJpZ2h0Iik6KHg9Zix2PXA9PT0iZW5kIj8idG9wIjoiYm90dG9tIik7Y29uc3Qgaj1nLXUudG9wLXUuYm90dG9tLHc9eS11LmxlZnQtdS5yaWdodCxTPVhlKGctdVt2XSxqKSxDPVhlKHktdVt4XSx3KSxrPSF0Lm1pZGRsZXdhcmVEYXRhLnNoaWZ0O2xldCBfPVMsJD1DO2lmKChuPXQubWlkZGxld2FyZURhdGEuc2hpZnQpIT1udWxsJiZuLmVuYWJsZWQueCYmKCQ9dyksKHI9dC5taWRkbGV3YXJlRGF0YS5zaGlmdCkhPW51bGwmJnIuZW5hYmxlZC55JiYoXz1qKSxrJiYhcCl7Y29uc3QgVD1TZSh1LmxlZnQsMCksQT1TZSh1LnJpZ2h0LDApLEQ9U2UodS50b3AsMCksVj1TZSh1LmJvdHRvbSwwKTtoPyQ9eS0yKihUIT09MHx8QSE9PTA/VCtBOlNlKHUubGVmdCx1LnJpZ2h0KSk6Xz1nLTIqKEQhPT0wfHxWIT09MD9EK1Y6U2UodS50b3AsdS5ib3R0b20pKX1hd2FpdCBjKHsuLi50LGF2YWlsYWJsZVdpZHRoOiQsYXZhaWxhYmxlSGVpZ2h0Ol99KTtjb25zdCBPPWF3YWl0IGkuZ2V0RGltZW5zaW9ucyhsLmZsb2F0aW5nKTtyZXR1cm4geSE9PU8ud2lkdGh8fGchPT1PLmhlaWdodD97cmVzZXQ6e3JlY3RzOiEwfX06e319fX07ZnVuY3Rpb24gVGEoZSl7Y29uc3QgdD1HZShlKTtsZXQgbj1wYXJzZUZsb2F0KHQud2lkdGgpfHwwLHI9cGFyc2VGbG9hdCh0LmhlaWdodCl8fDA7Y29uc3Qgcz1idChlKSxhPXM/ZS5vZmZzZXRXaWR0aDpuLGk9cz9lLm9mZnNldEhlaWdodDpyLGw9ZXIobikhPT1hfHxlcihyKSE9PWk7cmV0dXJuIGwmJihuPWEscj1pKSx7d2lkdGg6bixoZWlnaHQ6ciwkOmx9fWZ1bmN0aW9uIEFvKGUpe3JldHVybiBrZShlKT9lOmUuY29udGV4dEVsZW1lbnR9ZnVuY3Rpb24gS3QoZSl7Y29uc3QgdD1BbyhlKTtpZighYnQodCkpcmV0dXJuIG50KDEpO2NvbnN0IG49dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx7d2lkdGg6cixoZWlnaHQ6cywkOmF9PVRhKHQpO2xldCBpPShhP2VyKG4ud2lkdGgpOm4ud2lkdGgpL3IsbD0oYT9lcihuLmhlaWdodCk6bi5oZWlnaHQpL3M7cmV0dXJuKCFpfHwhTnVtYmVyLmlzRmluaXRlKGkpKSYmKGk9MSksKCFsfHwhTnVtYmVyLmlzRmluaXRlKGwpKSYmKGw9MSkse3g6aSx5Omx9fWNvbnN0IHB1PW50KDApO2Z1bmN0aW9uIFBhKGUpe2NvbnN0IHQ9RGUoZSk7cmV0dXJuIV9vKCl8fCF0LnZpc3VhbFZpZXdwb3J0P3B1Ont4OnQudmlzdWFsVmlld3BvcnQub2Zmc2V0TGVmdCx5OnQudmlzdWFsVmlld3BvcnQub2Zmc2V0VG9wfX1mdW5jdGlvbiBtdShlLHQsbil7cmV0dXJuIHQ9PT12b2lkIDAmJih0PSExKSwhbnx8dCYmbiE9PURlKGUpPyExOnR9ZnVuY3Rpb24gRHQoZSx0LG4scil7dD09PXZvaWQgMCYmKHQ9ITEpLG49PT12b2lkIDAmJihuPSExKTtjb25zdCBzPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYT1BbyhlKTtsZXQgaT1udCgxKTt0JiYocj9rZShyKSYmKGk9S3QocikpOmk9S3QoZSkpO2NvbnN0IGw9bXUoYSxuLHIpP1BhKGEpOm50KDApO2xldCBjPShzLmxlZnQrbC54KS9pLngsZD0ocy50b3ArbC55KS9pLnksdT1zLndpZHRoL2kueCxmPXMuaGVpZ2h0L2kueTtpZihhKXtjb25zdCBwPURlKGEpLGg9ciYma2Uocik/RGUocik6cjtsZXQgeT1wLGc9cm8oeSk7Zm9yKDtnJiZyJiZoIT09eTspe2NvbnN0IHY9S3QoZykseD1nLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGo9R2UoZyksdz14LmxlZnQrKGcuY2xpZW50TGVmdCtwYXJzZUZsb2F0KGoucGFkZGluZ0xlZnQpKSp2LngsUz14LnRvcCsoZy5jbGllbnRUb3ArcGFyc2VGbG9hdChqLnBhZGRpbmdUb3ApKSp2Lnk7Yyo9di54LGQqPXYueSx1Kj12LngsZio9di55LGMrPXcsZCs9Uyx5PURlKGcpLGc9cm8oeSl9fXJldHVybiBRdCh7d2lkdGg6dSxoZWlnaHQ6Zix4OmMseTpkfSl9ZnVuY3Rpb24gdXIoZSx0KXtjb25zdCBuPWRyKGUpLnNjcm9sbExlZnQ7cmV0dXJuIHQ/dC5sZWZ0K246RHQob3QoZSkpLmxlZnQrbn1mdW5jdGlvbiBFYShlLHQpe2NvbnN0IG49ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxyPW4ubGVmdCt0LnNjcm9sbExlZnQtdXIoZSxuKSxzPW4udG9wK3Quc2Nyb2xsVG9wO3JldHVybnt4OnIseTpzfX1mdW5jdGlvbiBodShlKXtsZXR7ZWxlbWVudHM6dCxyZWN0Om4sb2Zmc2V0UGFyZW50OnIsc3RyYXRlZ3k6c309ZTtjb25zdCBhPXM9PT0iZml4ZWQiLGk9b3QociksbD10P2NyKHQuZmxvYXRpbmcpOiExO2lmKHI9PT1pfHxsJiZhKXJldHVybiBuO2xldCBjPXtzY3JvbGxMZWZ0OjAsc2Nyb2xsVG9wOjB9LGQ9bnQoMSk7Y29uc3QgdT1udCgwKSxmPWJ0KHIpO2lmKChmfHwhZiYmIWEpJiYoKHJuKHIpIT09ImJvZHkifHxrbihpKSkmJihjPWRyKHIpKSxmKSl7Y29uc3QgaD1EdChyKTtkPUt0KHIpLHUueD1oLngrci5jbGllbnRMZWZ0LHUueT1oLnkrci5jbGllbnRUb3B9Y29uc3QgcD1pJiYhZiYmIWE/RWEoaSxjKTpudCgwKTtyZXR1cm57d2lkdGg6bi53aWR0aCpkLngsaGVpZ2h0Om4uaGVpZ2h0KmQueSx4Om4ueCpkLngtYy5zY3JvbGxMZWZ0KmQueCt1LngrcC54LHk6bi55KmQueS1jLnNjcm9sbFRvcCpkLnkrdS55K3AueX19ZnVuY3Rpb24gZ3UoZSl7cmV0dXJuIEFycmF5LmZyb20oZS5nZXRDbGllbnRSZWN0cygpKX1mdW5jdGlvbiBidShlKXtjb25zdCB0PW90KGUpLG49ZHIoZSkscj1lLm93bmVyRG9jdW1lbnQuYm9keSxzPVNlKHQuc2Nyb2xsV2lkdGgsdC5jbGllbnRXaWR0aCxyLnNjcm9sbFdpZHRoLHIuY2xpZW50V2lkdGgpLGE9U2UodC5zY3JvbGxIZWlnaHQsdC5jbGllbnRIZWlnaHQsci5zY3JvbGxIZWlnaHQsci5jbGllbnRIZWlnaHQpO2xldCBpPS1uLnNjcm9sbExlZnQrdXIoZSk7Y29uc3QgbD0tbi5zY3JvbGxUb3A7cmV0dXJuIEdlKHIpLmRpcmVjdGlvbj09PSJydGwiJiYoaSs9U2UodC5jbGllbnRXaWR0aCxyLmNsaWVudFdpZHRoKS1zKSx7d2lkdGg6cyxoZWlnaHQ6YSx4OmkseTpsfX1jb25zdCB2cz0yNTtmdW5jdGlvbiB5dShlLHQpe2NvbnN0IG49RGUoZSkscj1vdChlKSxzPW4udmlzdWFsVmlld3BvcnQ7bGV0IGE9ci5jbGllbnRXaWR0aCxpPXIuY2xpZW50SGVpZ2h0LGw9MCxjPTA7aWYocyl7YT1zLndpZHRoLGk9cy5oZWlnaHQ7Y29uc3QgdT1fbygpOyghdXx8dSYmdD09PSJmaXhlZCIpJiYobD1zLm9mZnNldExlZnQsYz1zLm9mZnNldFRvcCl9Y29uc3QgZD11cihyKTtpZihkPD0wKXtjb25zdCB1PXIub3duZXJEb2N1bWVudCxmPXUuYm9keSxwPWdldENvbXB1dGVkU3R5bGUoZiksaD11LmNvbXBhdE1vZGU9PT0iQ1NTMUNvbXBhdCImJnBhcnNlRmxvYXQocC5tYXJnaW5MZWZ0KStwYXJzZUZsb2F0KHAubWFyZ2luUmlnaHQpfHwwLHk9TWF0aC5hYnMoci5jbGllbnRXaWR0aC1mLmNsaWVudFdpZHRoLWgpO3k8PXZzJiYoYS09eSl9ZWxzZSBkPD12cyYmKGErPWQpO3JldHVybnt3aWR0aDphLGhlaWdodDppLHg6bCx5OmN9fWZ1bmN0aW9uIHZ1KGUsdCl7Y29uc3Qgbj1EdChlLCEwLHQ9PT0iZml4ZWQiKSxyPW4udG9wK2UuY2xpZW50VG9wLHM9bi5sZWZ0K2UuY2xpZW50TGVmdCxhPWJ0KGUpP0t0KGUpOm50KDEpLGk9ZS5jbGllbnRXaWR0aCphLngsbD1lLmNsaWVudEhlaWdodCphLnksYz1zKmEueCxkPXIqYS55O3JldHVybnt3aWR0aDppLGhlaWdodDpsLHg6Yyx5OmR9fWZ1bmN0aW9uIHhzKGUsdCxuKXtsZXQgcjtpZih0PT09InZpZXdwb3J0IilyPXl1KGUsbik7ZWxzZSBpZih0PT09ImRvY3VtZW50IilyPWJ1KG90KGUpKTtlbHNlIGlmKGtlKHQpKXI9dnUodCxuKTtlbHNle2NvbnN0IHM9UGEoZSk7cj17eDp0Lngtcy54LHk6dC55LXMueSx3aWR0aDp0LndpZHRoLGhlaWdodDp0LmhlaWdodH19cmV0dXJuIFF0KHIpfWZ1bmN0aW9uIEFhKGUsdCl7Y29uc3Qgbj1rdChlKTtyZXR1cm4gbj09PXR8fCFrZShuKXx8WnQobik/ITE6R2UobikucG9zaXRpb249PT0iZml4ZWQifHxBYShuLHQpfWZ1bmN0aW9uIHh1KGUsdCl7Y29uc3Qgbj10LmdldChlKTtpZihuKXJldHVybiBuO2xldCByPWpuKGUsW10sITEpLmZpbHRlcihsPT5rZShsKSYmcm4obCkhPT0iYm9keSIpLHM9bnVsbDtjb25zdCBhPUdlKGUpLnBvc2l0aW9uPT09ImZpeGVkIjtsZXQgaT1hP2t0KGUpOmU7Zm9yKDtrZShpKSYmIVp0KGkpOyl7Y29uc3QgbD1HZShpKSxjPVJvKGkpOyFjJiZsLnBvc2l0aW9uPT09ImZpeGVkIiYmKHM9bnVsbCksKGE/IWMmJiFzOiFjJiZsLnBvc2l0aW9uPT09InN0YXRpYyImJiEhcyYmKHMucG9zaXRpb249PT0iYWJzb2x1dGUifHxzLnBvc2l0aW9uPT09ImZpeGVkIil8fGtuKGkpJiYhYyYmQWEoZSxpKSk/cj1yLmZpbHRlcih1PT51IT09aSk6cz1sLGk9a3QoaSl9cmV0dXJuIHQuc2V0KGUscikscn1mdW5jdGlvbiB3dShlKXtsZXR7ZWxlbWVudDp0LGJvdW5kYXJ5Om4scm9vdEJvdW5kYXJ5OnIsc3RyYXRlZ3k6c309ZTtjb25zdCBpPVsuLi5uPT09ImNsaXBwaW5nQW5jZXN0b3JzIj9jcih0KT9bXTp4dSh0LHRoaXMuX2MpOltdLmNvbmNhdChuKSxyXSxsPXhzKHQsaVswXSxzKTtsZXQgYz1sLnRvcCxkPWwucmlnaHQsdT1sLmJvdHRvbSxmPWwubGVmdDtmb3IobGV0IHA9MTtwPGkubGVuZ3RoO3ArKyl7Y29uc3QgaD14cyh0LGlbcF0scyk7Yz1TZShoLnRvcCxjKSxkPVhlKGgucmlnaHQsZCksdT1YZShoLmJvdHRvbSx1KSxmPVNlKGgubGVmdCxmKX1yZXR1cm57d2lkdGg6ZC1mLGhlaWdodDp1LWMseDpmLHk6Y319ZnVuY3Rpb24ganUoZSl7Y29uc3R7d2lkdGg6dCxoZWlnaHQ6bn09VGEoZSk7cmV0dXJue3dpZHRoOnQsaGVpZ2h0Om59fWZ1bmN0aW9uIFN1KGUsdCxuKXtjb25zdCByPWJ0KHQpLHM9b3QodCksYT1uPT09ImZpeGVkIixpPUR0KGUsITAsYSx0KTtsZXQgbD17c2Nyb2xsTGVmdDowLHNjcm9sbFRvcDowfTtjb25zdCBjPW50KDApO2Z1bmN0aW9uIGQoKXtjLng9dXIocyl9aWYocnx8IXImJiFhKWlmKChybih0KSE9PSJib2R5Inx8a24ocykpJiYobD1kcih0KSkscil7Y29uc3QgaD1EdCh0LCEwLGEsdCk7Yy54PWgueCt0LmNsaWVudExlZnQsYy55PWgueSt0LmNsaWVudFRvcH1lbHNlIHMmJmQoKTthJiYhciYmcyYmZCgpO2NvbnN0IHU9cyYmIXImJiFhP0VhKHMsbCk6bnQoMCksZj1pLmxlZnQrbC5zY3JvbGxMZWZ0LWMueC11LngscD1pLnRvcCtsLnNjcm9sbFRvcC1jLnktdS55O3JldHVybnt4OmYseTpwLHdpZHRoOmkud2lkdGgsaGVpZ2h0OmkuaGVpZ2h0fX1mdW5jdGlvbiB6cihlKXtyZXR1cm4gR2UoZSkucG9zaXRpb249PT0ic3RhdGljIn1mdW5jdGlvbiB3cyhlLHQpe2lmKCFidChlKXx8R2UoZSkucG9zaXRpb249PT0iZml4ZWQiKXJldHVybiBudWxsO2lmKHQpcmV0dXJuIHQoZSk7bGV0IG49ZS5vZmZzZXRQYXJlbnQ7cmV0dXJuIG90KGUpPT09biYmKG49bi5vd25lckRvY3VtZW50LmJvZHkpLG59ZnVuY3Rpb24gT2EoZSx0KXtjb25zdCBuPURlKGUpO2lmKGNyKGUpKXJldHVybiBuO2lmKCFidChlKSl7bGV0IHM9a3QoZSk7Zm9yKDtzJiYhWnQocyk7KXtpZihrZShzKSYmIXpyKHMpKXJldHVybiBzO3M9a3Qocyl9cmV0dXJuIG59bGV0IHI9d3MoZSx0KTtmb3IoO3ImJk1kKHIpJiZ6cihyKTspcj13cyhyLHQpO3JldHVybiByJiZadChyKSYmenIocikmJiFSbyhyKT9uOnJ8fEZkKGUpfHxufWNvbnN0IEN1PWFzeW5jIGZ1bmN0aW9uKGUpe2NvbnN0IHQ9dGhpcy5nZXRPZmZzZXRQYXJlbnR8fE9hLG49dGhpcy5nZXREaW1lbnNpb25zLHI9YXdhaXQgbihlLmZsb2F0aW5nKTtyZXR1cm57cmVmZXJlbmNlOlN1KGUucmVmZXJlbmNlLGF3YWl0IHQoZS5mbG9hdGluZyksZS5zdHJhdGVneSksZmxvYXRpbmc6e3g6MCx5OjAsd2lkdGg6ci53aWR0aCxoZWlnaHQ6ci5oZWlnaHR9fX07ZnVuY3Rpb24gTnUoZSl7cmV0dXJuIEdlKGUpLmRpcmVjdGlvbj09PSJydGwifWNvbnN0IGt1PXtjb252ZXJ0T2Zmc2V0UGFyZW50UmVsYXRpdmVSZWN0VG9WaWV3cG9ydFJlbGF0aXZlUmVjdDpodSxnZXREb2N1bWVudEVsZW1lbnQ6b3QsZ2V0Q2xpcHBpbmdSZWN0Ond1LGdldE9mZnNldFBhcmVudDpPYSxnZXRFbGVtZW50UmVjdHM6Q3UsZ2V0Q2xpZW50UmVjdHM6Z3UsZ2V0RGltZW5zaW9uczpqdSxnZXRTY2FsZTpLdCxpc0VsZW1lbnQ6a2UsaXNSVEw6TnV9O2Z1bmN0aW9uIE1hKGUsdCl7cmV0dXJuIGUueD09PXQueCYmZS55PT09dC55JiZlLndpZHRoPT09dC53aWR0aCYmZS5oZWlnaHQ9PT10LmhlaWdodH1mdW5jdGlvbiBSdShlLHQpe2xldCBuPW51bGwscjtjb25zdCBzPW90KGUpO2Z1bmN0aW9uIGEoKXt2YXIgbDtjbGVhclRpbWVvdXQociksKGw9bik9PW51bGx8fGwuZGlzY29ubmVjdCgpLG49bnVsbH1mdW5jdGlvbiBpKGwsYyl7bD09PXZvaWQgMCYmKGw9ITEpLGM9PT12b2lkIDAmJihjPTEpLGEoKTtjb25zdCBkPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkse2xlZnQ6dSx0b3A6Zix3aWR0aDpwLGhlaWdodDpofT1kO2lmKGx8fHQoKSwhcHx8IWgpcmV0dXJuO2NvbnN0IHk9Qm4oZiksZz1CbihzLmNsaWVudFdpZHRoLSh1K3ApKSx2PUJuKHMuY2xpZW50SGVpZ2h0LShmK2gpKSx4PUJuKHUpLHc9e3Jvb3RNYXJnaW46LXkrInB4ICIrLWcrInB4ICIrLXYrInB4ICIrLXgrInB4Iix0aHJlc2hvbGQ6U2UoMCxYZSgxLGMpKXx8MX07bGV0IFM9ITA7ZnVuY3Rpb24gQyhrKXtjb25zdCBfPWtbMF0uaW50ZXJzZWN0aW9uUmF0aW87aWYoXyE9PWMpe2lmKCFTKXJldHVybiBpKCk7Xz9pKCExLF8pOnI9c2V0VGltZW91dCgoKT0+e2koITEsMWUtNyl9LDFlMyl9Xz09PTEmJiFNYShkLGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpJiZpKCksUz0hMX10cnl7bj1uZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoQyx7Li4udyxyb290OnMub3duZXJEb2N1bWVudH0pfWNhdGNoe249bmV3IEludGVyc2VjdGlvbk9ic2VydmVyKEMsdyl9bi5vYnNlcnZlKGUpfXJldHVybiBpKCEwKSxhfWZ1bmN0aW9uIGpzKGUsdCxuLHIpe3I9PT12b2lkIDAmJihyPXt9KTtjb25zdHthbmNlc3RvclNjcm9sbDpzPSEwLGFuY2VzdG9yUmVzaXplOmE9ITAsZWxlbWVudFJlc2l6ZTppPXR5cGVvZiBSZXNpemVPYnNlcnZlcj09ImZ1bmN0aW9uIixsYXlvdXRTaGlmdDpsPXR5cGVvZiBJbnRlcnNlY3Rpb25PYnNlcnZlcj09ImZ1bmN0aW9uIixhbmltYXRpb25GcmFtZTpjPSExfT1yLGQ9QW8oZSksdT1zfHxhP1suLi5kP2puKGQpOltdLC4uLnQ/am4odCk6W11dOltdO3UuZm9yRWFjaCh4PT57cyYmeC5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLG4se3Bhc3NpdmU6ITB9KSxhJiZ4LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsbil9KTtjb25zdCBmPWQmJmw/UnUoZCxuKTpudWxsO2xldCBwPS0xLGg9bnVsbDtpJiYoaD1uZXcgUmVzaXplT2JzZXJ2ZXIoeD0+e2xldFtqXT14O2omJmoudGFyZ2V0PT09ZCYmaCYmdCYmKGgudW5vYnNlcnZlKHQpLGNhbmNlbEFuaW1hdGlvbkZyYW1lKHApLHA9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dmFyIHc7KHc9aCk9PW51bGx8fHcub2JzZXJ2ZSh0KX0pKSxuKCl9KSxkJiYhYyYmaC5vYnNlcnZlKGQpLHQmJmgub2JzZXJ2ZSh0KSk7bGV0IHksZz1jP0R0KGUpOm51bGw7YyYmdigpO2Z1bmN0aW9uIHYoKXtjb25zdCB4PUR0KGUpO2cmJiFNYShnLHgpJiZuKCksZz14LHk9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHYpfXJldHVybiBuKCksKCk9Pnt2YXIgeDt1LmZvckVhY2goaj0+e3MmJmoucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixuKSxhJiZqLnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsbil9KSxmPy4oKSwoeD1oKT09bnVsbHx8eC5kaXNjb25uZWN0KCksaD1udWxsLGMmJmNhbmNlbEFuaW1hdGlvbkZyYW1lKHkpfX1jb25zdCBfdT1jdSwkdT1kdSxUdT1vdSxQdT1mdSxFdT1zdSxTcz1ydSxBdT1pdSxPdT11dSxNdT0oZSx0LG4pPT57Y29uc3Qgcj1uZXcgTWFwLHM9e3BsYXRmb3JtOmt1LC4uLm59LGE9ey4uLnMucGxhdGZvcm0sX2M6cn07cmV0dXJuIG51KGUsdCx7Li4ucyxwbGF0Zm9ybTphfSl9O3ZhciBEdT10eXBlb2YgZG9jdW1lbnQ8InUiLEx1PWZ1bmN0aW9uKCl7fSxZbj1EdT9tLnVzZUxheW91dEVmZmVjdDpMdTtmdW5jdGlvbiBucihlLHQpe2lmKGU9PT10KXJldHVybiEwO2lmKHR5cGVvZiBlIT10eXBlb2YgdClyZXR1cm4hMTtpZih0eXBlb2YgZT09ImZ1bmN0aW9uIiYmZS50b1N0cmluZygpPT09dC50b1N0cmluZygpKXJldHVybiEwO2xldCBuLHIscztpZihlJiZ0JiZ0eXBlb2YgZT09Im9iamVjdCIpe2lmKEFycmF5LmlzQXJyYXkoZSkpe2lmKG49ZS5sZW5ndGgsbiE9PXQubGVuZ3RoKXJldHVybiExO2ZvcihyPW47ci0tIT09MDspaWYoIW5yKGVbcl0sdFtyXSkpcmV0dXJuITE7cmV0dXJuITB9aWYocz1PYmplY3Qua2V5cyhlKSxuPXMubGVuZ3RoLG4hPT1PYmplY3Qua2V5cyh0KS5sZW5ndGgpcmV0dXJuITE7Zm9yKHI9bjtyLS0hPT0wOylpZighe30uaGFzT3duUHJvcGVydHkuY2FsbCh0LHNbcl0pKXJldHVybiExO2ZvcihyPW47ci0tIT09MDspe2NvbnN0IGE9c1tyXTtpZighKGE9PT0iX293bmVyIiYmZS4kJHR5cGVvZikmJiFucihlW2FdLHRbYV0pKXJldHVybiExfXJldHVybiEwfXJldHVybiBlIT09ZSYmdCE9PXR9ZnVuY3Rpb24gRGEoZSl7cmV0dXJuIHR5cGVvZiB3aW5kb3c+InUiPzE6KGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8d2luZG93KS5kZXZpY2VQaXhlbFJhdGlvfHwxfWZ1bmN0aW9uIENzKGUsdCl7Y29uc3Qgbj1EYShlKTtyZXR1cm4gTWF0aC5yb3VuZCh0Km4pL259ZnVuY3Rpb24gQnIoZSl7Y29uc3QgdD1tLnVzZVJlZihlKTtyZXR1cm4gWW4oKCk9Pnt0LmN1cnJlbnQ9ZX0pLHR9ZnVuY3Rpb24gRnUoZSl7ZT09PXZvaWQgMCYmKGU9e30pO2NvbnN0e3BsYWNlbWVudDp0PSJib3R0b20iLHN0cmF0ZWd5Om49ImFic29sdXRlIixtaWRkbGV3YXJlOnI9W10scGxhdGZvcm06cyxlbGVtZW50czp7cmVmZXJlbmNlOmEsZmxvYXRpbmc6aX09e30sdHJhbnNmb3JtOmw9ITAsd2hpbGVFbGVtZW50c01vdW50ZWQ6YyxvcGVuOmR9PWUsW3UsZl09bS51c2VTdGF0ZSh7eDowLHk6MCxzdHJhdGVneTpuLHBsYWNlbWVudDp0LG1pZGRsZXdhcmVEYXRhOnt9LGlzUG9zaXRpb25lZDohMX0pLFtwLGhdPW0udXNlU3RhdGUocik7bnIocCxyKXx8aChyKTtjb25zdFt5LGddPW0udXNlU3RhdGUobnVsbCksW3YseF09bS51c2VTdGF0ZShudWxsKSxqPW0udXNlQ2FsbGJhY2soST0+e0khPT1rLmN1cnJlbnQmJihrLmN1cnJlbnQ9SSxnKEkpKX0sW10pLHc9bS51c2VDYWxsYmFjayhJPT57SSE9PV8uY3VycmVudCYmKF8uY3VycmVudD1JLHgoSSkpfSxbXSksUz1hfHx5LEM9aXx8dixrPW0udXNlUmVmKG51bGwpLF89bS51c2VSZWYobnVsbCksJD1tLnVzZVJlZih1KSxPPWMhPW51bGwsVD1CcihjKSxBPUJyKHMpLEQ9QnIoZCksVj1tLnVzZUNhbGxiYWNrKCgpPT57aWYoIWsuY3VycmVudHx8IV8uY3VycmVudClyZXR1cm47Y29uc3QgST17cGxhY2VtZW50OnQsc3RyYXRlZ3k6bixtaWRkbGV3YXJlOnB9O0EuY3VycmVudCYmKEkucGxhdGZvcm09QS5jdXJyZW50KSxNdShrLmN1cnJlbnQsXy5jdXJyZW50LEkpLnRoZW4oej0+e2NvbnN0IEs9ey4uLnosaXNQb3NpdGlvbmVkOkQuY3VycmVudCE9PSExfTtYLmN1cnJlbnQmJiFucigkLmN1cnJlbnQsSykmJigkLmN1cnJlbnQ9Syxtby5mbHVzaFN5bmMoKCk9PntmKEspfSkpfSl9LFtwLHQsbixBLERdKTtZbigoKT0+e2Q9PT0hMSYmJC5jdXJyZW50LmlzUG9zaXRpb25lZCYmKCQuY3VycmVudC5pc1Bvc2l0aW9uZWQ9ITEsZihJPT4oey4uLkksaXNQb3NpdGlvbmVkOiExfSkpKX0sW2RdKTtjb25zdCBYPW0udXNlUmVmKCExKTtZbigoKT0+KFguY3VycmVudD0hMCwoKT0+e1guY3VycmVudD0hMX0pLFtdKSxZbigoKT0+e2lmKFMmJihrLmN1cnJlbnQ9UyksQyYmKF8uY3VycmVudD1DKSxTJiZDKXtpZihULmN1cnJlbnQpcmV0dXJuIFQuY3VycmVudChTLEMsVik7VigpfX0sW1MsQyxWLFQsT10pO2NvbnN0IEo9bS51c2VNZW1vKCgpPT4oe3JlZmVyZW5jZTprLGZsb2F0aW5nOl8sc2V0UmVmZXJlbmNlOmosc2V0RmxvYXRpbmc6d30pLFtqLHddKSxQPW0udXNlTWVtbygoKT0+KHtyZWZlcmVuY2U6UyxmbG9hdGluZzpDfSksW1MsQ10pLFc9bS51c2VNZW1vKCgpPT57Y29uc3QgST17cG9zaXRpb246bixsZWZ0OjAsdG9wOjB9O2lmKCFQLmZsb2F0aW5nKXJldHVybiBJO2NvbnN0IHo9Q3MoUC5mbG9hdGluZyx1LngpLEs9Q3MoUC5mbG9hdGluZyx1LnkpO3JldHVybiBsP3suLi5JLHRyYW5zZm9ybToidHJhbnNsYXRlKCIreisicHgsICIrSysicHgpIiwuLi5EYShQLmZsb2F0aW5nKT49MS41JiZ7d2lsbENoYW5nZToidHJhbnNmb3JtIn19Ontwb3NpdGlvbjpuLGxlZnQ6eix0b3A6S319LFtuLGwsUC5mbG9hdGluZyx1LngsdS55XSk7cmV0dXJuIG0udXNlTWVtbygoKT0+KHsuLi51LHVwZGF0ZTpWLHJlZnM6SixlbGVtZW50czpQLGZsb2F0aW5nU3R5bGVzOld9KSxbdSxWLEosUCxXXSl9Y29uc3QgSXU9ZT0+e2Z1bmN0aW9uIHQobil7cmV0dXJue30uaGFzT3duUHJvcGVydHkuY2FsbChuLCJjdXJyZW50Iil9cmV0dXJue25hbWU6ImFycm93IixvcHRpb25zOmUsZm4obil7Y29uc3R7ZWxlbWVudDpyLHBhZGRpbmc6c309dHlwZW9mIGU9PSJmdW5jdGlvbiI/ZShuKTplO3JldHVybiByJiZ0KHIpP3IuY3VycmVudCE9bnVsbD9Tcyh7ZWxlbWVudDpyLmN1cnJlbnQscGFkZGluZzpzfSkuZm4obik6e306cj9Tcyh7ZWxlbWVudDpyLHBhZGRpbmc6c30pLmZuKG4pOnt9fX19LHp1PShlLHQpPT57Y29uc3Qgbj1fdShlKTtyZXR1cm57bmFtZTpuLm5hbWUsZm46bi5mbixvcHRpb25zOltlLHRdfX0sQnU9KGUsdCk9Pntjb25zdCBuPSR1KGUpO3JldHVybntuYW1lOm4ubmFtZSxmbjpuLmZuLG9wdGlvbnM6W2UsdF19fSxOcz0oZSx0KT0+KHtmbjpPdShlKS5mbixvcHRpb25zOltlLHRdfSksa3M9KGUsdCk9Pntjb25zdCBuPVR1KGUpO3JldHVybntuYW1lOm4ubmFtZSxmbjpuLmZuLG9wdGlvbnM6W2UsdF19fSxWdT0oZSx0KT0+e2NvbnN0IG49UHUoZSk7cmV0dXJue25hbWU6bi5uYW1lLGZuOm4uZm4sb3B0aW9uczpbZSx0XX19LFd1PShlLHQpPT57Y29uc3Qgbj1FdShlKTtyZXR1cm57bmFtZTpuLm5hbWUsZm46bi5mbixvcHRpb25zOltlLHRdfX0sUnM9KGUsdCk9Pntjb25zdCBuPUF1KGUpO3JldHVybntuYW1lOm4ubmFtZSxmbjpuLmZuLG9wdGlvbnM6W2UsdF19fSxIdT0oZSx0KT0+e2NvbnN0IG49SXUoZSk7cmV0dXJue25hbWU6bi5uYW1lLGZuOm4uZm4sb3B0aW9uczpbZSx0XX19O2Z1bmN0aW9uIExhKGUpe2NvbnN0IHQ9bS51c2VSZWYodm9pZCAwKSxuPW0udXNlQ2FsbGJhY2socj0+e2NvbnN0IHM9ZS5tYXAoYT0+e2lmKGEhPW51bGwpe2lmKHR5cGVvZiBhPT0iZnVuY3Rpb24iKXtjb25zdCBpPWEsbD1pKHIpO3JldHVybiB0eXBlb2YgbD09ImZ1bmN0aW9uIj9sOigpPT57aShudWxsKX19cmV0dXJuIGEuY3VycmVudD1yLCgpPT57YS5jdXJyZW50PW51bGx9fX0pO3JldHVybigpPT57cy5mb3JFYWNoKGE9PmE/LigpKX19LGUpO3JldHVybiBtLnVzZU1lbW8oKCk9PmUuZXZlcnkocj0+cj09bnVsbCk/bnVsbDpyPT57dC5jdXJyZW50JiYodC5jdXJyZW50KCksdC5jdXJyZW50PXZvaWQgMCksciE9bnVsbCYmKHQuY3VycmVudD1uKHIpKX0sZSl9Y29uc3QgcXU9ey4uLkdzfTtsZXQgX3M9ITEsWXU9MDtjb25zdCAkcz0oKT0+ImZsb2F0aW5nLXVpLSIrTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiw2KStZdSsrO2Z1bmN0aW9uIFV1KCl7Y29uc3RbZSx0XT1tLnVzZVN0YXRlKCgpPT5fcz8kcygpOnZvaWQgMCk7cmV0dXJuIGFvKCgpPT57ZT09bnVsbCYmdCgkcygpKX0sW10pLG0udXNlRWZmZWN0KCgpPT57X3M9ITB9LFtdKSxlfWNvbnN0IEd1PXF1LnVzZUlkLFh1PUd1fHxVdTtmdW5jdGlvbiBLdSgpe2NvbnN0IGU9bmV3IE1hcDtyZXR1cm57ZW1pdCh0LG4pe3ZhciByOyhyPWUuZ2V0KHQpKT09bnVsbHx8ci5mb3JFYWNoKHM9PnMobikpfSxvbih0LG4pe2UuaGFzKHQpfHxlLnNldCh0LG5ldyBTZXQpLGUuZ2V0KHQpLmFkZChuKX0sb2ZmKHQsbil7dmFyIHI7KHI9ZS5nZXQodCkpPT1udWxsfHxyLmRlbGV0ZShuKX19fWNvbnN0IEp1PW0uY3JlYXRlQ29udGV4dChudWxsKSxadT1tLmNyZWF0ZUNvbnRleHQobnVsbCksUXU9KCk9Pnt2YXIgZTtyZXR1cm4oKGU9bS51c2VDb250ZXh0KEp1KSk9PW51bGw/dm9pZCAwOmUuaWQpfHxudWxsfSxlZj0oKT0+bS51c2VDb250ZXh0KFp1KTtmdW5jdGlvbiB0ZihlKXtjb25zdHtvcGVuOnQ9ITEsb25PcGVuQ2hhbmdlOm4sZWxlbWVudHM6cn09ZSxzPVh1KCksYT1tLnVzZVJlZih7fSksW2ldPW0udXNlU3RhdGUoKCk9Pkt1KCkpLGw9UXUoKSE9bnVsbCxbYyxkXT1tLnVzZVN0YXRlKHIucmVmZXJlbmNlKSx1PVFkKChoLHksZyk9PnthLmN1cnJlbnQub3BlbkV2ZW50PWg/eTp2b2lkIDAsaS5lbWl0KCJvcGVuY2hhbmdlIix7b3BlbjpoLGV2ZW50OnkscmVhc29uOmcsbmVzdGVkOmx9KSxuPy4oaCx5LGcpfSksZj1tLnVzZU1lbW8oKCk9Pih7c2V0UG9zaXRpb25SZWZlcmVuY2U6ZH0pLFtdKSxwPW0udXNlTWVtbygoKT0+KHtyZWZlcmVuY2U6Y3x8ci5yZWZlcmVuY2V8fG51bGwsZmxvYXRpbmc6ci5mbG9hdGluZ3x8bnVsbCxkb21SZWZlcmVuY2U6ci5yZWZlcmVuY2V9KSxbYyxyLnJlZmVyZW5jZSxyLmZsb2F0aW5nXSk7cmV0dXJuIG0udXNlTWVtbygoKT0+KHtkYXRhUmVmOmEsb3Blbjp0LG9uT3BlbkNoYW5nZTp1LGVsZW1lbnRzOnAsZXZlbnRzOmksZmxvYXRpbmdJZDpzLHJlZnM6Zn0pLFt0LHUscCxpLHMsZl0pfWZ1bmN0aW9uIG5mKGUpe2U9PT12b2lkIDAmJihlPXt9KTtjb25zdHtub2RlSWQ6dH09ZSxuPXRmKHsuLi5lLGVsZW1lbnRzOntyZWZlcmVuY2U6bnVsbCxmbG9hdGluZzpudWxsLC4uLmUuZWxlbWVudHN9fSkscj1lLnJvb3RDb250ZXh0fHxuLHM9ci5lbGVtZW50cyxbYSxpXT1tLnVzZVN0YXRlKG51bGwpLFtsLGNdPW0udXNlU3RhdGUobnVsbCksdT1zPy5kb21SZWZlcmVuY2V8fGEsZj1tLnVzZVJlZihudWxsKSxwPWVmKCk7YW8oKCk9Pnt1JiYoZi5jdXJyZW50PXUpfSxbdV0pO2NvbnN0IGg9RnUoey4uLmUsZWxlbWVudHM6ey4uLnMsLi4ubCYme3JlZmVyZW5jZTpsfX19KSx5PW0udXNlQ2FsbGJhY2sodz0+e2NvbnN0IFM9a2Uodyk/e2dldEJvdW5kaW5nQ2xpZW50UmVjdDooKT0+dy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxnZXRDbGllbnRSZWN0czooKT0+dy5nZXRDbGllbnRSZWN0cygpLGNvbnRleHRFbGVtZW50Ond9Onc7YyhTKSxoLnJlZnMuc2V0UmVmZXJlbmNlKFMpfSxbaC5yZWZzXSksZz1tLnVzZUNhbGxiYWNrKHc9Pnsoa2Uodyl8fHc9PT1udWxsKSYmKGYuY3VycmVudD13LGkodykpLChrZShoLnJlZnMucmVmZXJlbmNlLmN1cnJlbnQpfHxoLnJlZnMucmVmZXJlbmNlLmN1cnJlbnQ9PT1udWxsfHx3IT09bnVsbCYmIWtlKHcpKSYmaC5yZWZzLnNldFJlZmVyZW5jZSh3KX0sW2gucmVmc10pLHY9bS51c2VNZW1vKCgpPT4oey4uLmgucmVmcyxzZXRSZWZlcmVuY2U6ZyxzZXRQb3NpdGlvblJlZmVyZW5jZTp5LGRvbVJlZmVyZW5jZTpmfSksW2gucmVmcyxnLHldKSx4PW0udXNlTWVtbygoKT0+KHsuLi5oLmVsZW1lbnRzLGRvbVJlZmVyZW5jZTp1fSksW2guZWxlbWVudHMsdV0pLGo9bS51c2VNZW1vKCgpPT4oey4uLmgsLi4ucixyZWZzOnYsZWxlbWVudHM6eCxub2RlSWQ6dH0pLFtoLHYseCx0LHJdKTtyZXR1cm4gYW8oKCk9PntyLmRhdGFSZWYuY3VycmVudC5mbG9hdGluZ0NvbnRleHQ9ajtjb25zdCB3PXA/Lm5vZGVzUmVmLmN1cnJlbnQuZmluZChTPT5TLmlkPT09dCk7dyYmKHcuY29udGV4dD1qKX0pLG0udXNlTWVtbygoKT0+KHsuLi5oLGNvbnRleHQ6aixyZWZzOnYsZWxlbWVudHM6eH0pLFtoLHYseCxqXSl9Y29uc3QgRmE9e3Njcm9sbEhpZGVEZWxheToxZTMsdHlwZToiaG92ZXIiLHNjcm9sbGJhcnM6Inh5In0sSWE9KGUse3Njcm9sbGJhclNpemU6dCxvdmVyc2Nyb2xsQmVoYXZpb3I6bixzY3JvbGxiYXJzOnJ9KT0+e2xldCBzPW47cmV0dXJuIG4mJnImJihyPT09IngiP3M9YCR7bn0gYXV0b2A6cj09PSJ5IiYmKHM9YGF1dG8gJHtufWApKSx7cm9vdDp7Ii0tc2Nyb2xsYXJlYS1zY3JvbGxiYXItc2l6ZSI6Tih0KSwiLS1zY3JvbGxhcmVhLW92ZXItc2Nyb2xsLWJlaGF2aW9yIjpzfX19LF90PVkoZT0+e2NvbnN0IHQ9TSgiU2Nyb2xsQXJlYSIsRmEsZSkse2NsYXNzTmFtZXM6bixjbGFzc05hbWU6cixzdHlsZTpzLHN0eWxlczphLHVuc3R5bGVkOmksc2Nyb2xsYmFyU2l6ZTpsLHZhcnM6Yyx0eXBlOmQsc2Nyb2xsSGlkZURlbGF5OnUsdmlld3BvcnRQcm9wczpmLHZpZXdwb3J0UmVmOnAsb25TY3JvbGxQb3NpdGlvbkNoYW5nZTpoLGNoaWxkcmVuOnksb2Zmc2V0U2Nyb2xsYmFyczpnLHNjcm9sbGJhcnM6dixvbkJvdHRvbVJlYWNoZWQ6eCxvblRvcFJlYWNoZWQ6aixvbkxlZnRSZWFjaGVkOncsb25SaWdodFJlYWNoZWQ6UyxvdmVyc2Nyb2xsQmVoYXZpb3I6QyxzdGFydFNjcm9sbFBvc2l0aW9uOmssYXR0cmlidXRlczpfLC4uLiR9PXQsW08sVF09bS51c2VTdGF0ZSghMSksW0EsRF09bS51c2VTdGF0ZSghMSksW1YsWF09bS51c2VTdGF0ZSghMSksSj1tLnVzZVJlZighMCksUD1tLnVzZVJlZighMSksVz1tLnVzZVJlZighMCksST1tLnVzZVJlZighMSksej10ZSh7bmFtZToiU2Nyb2xsQXJlYSIscHJvcHM6dCxjbGFzc2VzOmtvLGNsYXNzTmFtZTpyLHN0eWxlOnMsY2xhc3NOYW1lczpuLHN0eWxlczphLHVuc3R5bGVkOmksYXR0cmlidXRlczpfLHZhcnM6Yyx2YXJzUmVzb2x2ZXI6SWF9KSxLPW0udXNlUmVmKG51bGwpLGxlPUxhKFtwLEtdKTtyZXR1cm4gSXQoKCk9PntrJiZLLmN1cnJlbnQmJksuY3VycmVudC5zY3JvbGxUbyh7bGVmdDprLng/PzAsdG9wOmsueT8/MH0pfSxbXSksTnQoZz09PSJwcmVzZW50Ij9LLmN1cnJlbnQ6bnVsbCwoKT0+e2NvbnN0IHNlPUsuY3VycmVudDtzZSYmKEQoc2Uuc2Nyb2xsSGVpZ2h0PnNlLmNsaWVudEhlaWdodCksWChzZS5zY3JvbGxXaWR0aD5zZS5jbGllbnRXaWR0aCkpfSksby5qc3hzKGhhLHtnZXRTdHlsZXM6eix0eXBlOmQ9PT0ibmV2ZXIiPyJhbHdheXMiOmQsc2Nyb2xsSGlkZURlbGF5OnUsc2Nyb2xsYmFyczp2LC4uLnooInJvb3QiKSwuLi4kLGNoaWxkcmVuOltvLmpzeChOYSx7Li4uZiwuLi56KCJ2aWV3cG9ydCIse3N0eWxlOmY/LnN0eWxlfSkscmVmOmxlLCJkYXRhLW9mZnNldC1zY3JvbGxiYXJzIjpnPT09ITA/Inh5IjpnfHx2b2lkIDAsImRhdGEtc2Nyb2xsYmFycyI6dnx8dm9pZCAwLCJkYXRhLWhvcml6b250YWwtaGlkZGVuIjpnPT09InByZXNlbnQiJiYhVj8idHJ1ZSI6dm9pZCAwLCJkYXRhLXZlcnRpY2FsLWhpZGRlbiI6Zz09PSJwcmVzZW50IiYmIUE/InRydWUiOnZvaWQgMCxvblNjcm9sbDpzZT0+e2Y/Lm9uU2Nyb2xsPy4oc2UpLGg/Lih7eDpzZS5jdXJyZW50VGFyZ2V0LnNjcm9sbExlZnQseTpzZS5jdXJyZW50VGFyZ2V0LnNjcm9sbFRvcH0pO2NvbnN0e3Njcm9sbFRvcDpDZSxzY3JvbGxIZWlnaHQ6dmUsY2xpZW50SGVpZ2h0OlRlLHNjcm9sbExlZnQ6d2Usc2Nyb2xsV2lkdGg6Y2UsY2xpZW50V2lkdGg6eGV9PXNlLmN1cnJlbnRUYXJnZXQsdWU9Q2UtKHZlLVRlKT49LS44LEw9Q2U9PT0wO3VlJiYhUC5jdXJyZW50JiZ4Py4oKSxMJiYhSi5jdXJyZW50JiZqPy4oKSxQLmN1cnJlbnQ9dWUsSi5jdXJyZW50PUw7Y29uc3QgTmU9d2UtKGNlLXhlKT49LS44LGZlPXdlPT09MDtOZSYmIUkuY3VycmVudCYmUz8uKCksZmUmJiFXLmN1cnJlbnQmJnc/LigpLEkuY3VycmVudD1OZSxXLmN1cnJlbnQ9ZmV9LGNoaWxkcmVuOnl9KSwodj09PSJ4eSJ8fHY9PT0ieCIpJiZvLmpzeCh0byx7Li4ueigic2Nyb2xsYmFyIiksb3JpZW50YXRpb246Imhvcml6b250YWwiLCJkYXRhLWhpZGRlbiI6ZD09PSJuZXZlciJ8fGc9PT0icHJlc2VudCImJiFWPyEwOnZvaWQgMCxmb3JjZU1vdW50OiEwLG9uTW91c2VFbnRlcjooKT0+VCghMCksb25Nb3VzZUxlYXZlOigpPT5UKCExKSxjaGlsZHJlbjpvLmpzeChubyx7Li4ueigidGh1bWIiKX0pfSksKHY9PT0ieHkifHx2PT09InkiKSYmby5qc3godG8sey4uLnooInNjcm9sbGJhciIpLG9yaWVudGF0aW9uOiJ2ZXJ0aWNhbCIsImRhdGEtaGlkZGVuIjpkPT09Im5ldmVyInx8Zz09PSJwcmVzZW50IiYmIUE/ITA6dm9pZCAwLGZvcmNlTW91bnQ6ITAsb25Nb3VzZUVudGVyOigpPT5UKCEwKSxvbk1vdXNlTGVhdmU6KCk9PlQoITEpLGNoaWxkcmVuOm8uanN4KG5vLHsuLi56KCJ0aHVtYiIpfSl9KSxvLmpzeChfZCx7Li4ueigiY29ybmVyIiksImRhdGEtaG92ZXJlZCI6T3x8dm9pZCAwLCJkYXRhLWhpZGRlbiI6ZD09PSJuZXZlciJ8fHZvaWQgMH0pXX0pfSk7X3QuZGlzcGxheU5hbWU9IkBtYW50aW5lL2NvcmUvU2Nyb2xsQXJlYSI7Y29uc3QgT289WShlPT57Y29uc3R7Y2hpbGRyZW46dCxjbGFzc05hbWVzOm4sc3R5bGVzOnIsc2Nyb2xsYmFyU2l6ZTpzLHNjcm9sbEhpZGVEZWxheTphLHR5cGU6aSxkaXI6bCxvZmZzZXRTY3JvbGxiYXJzOmMsb3ZlcnNjcm9sbEJlaGF2aW9yOmQsdmlld3BvcnRSZWY6dSxvblNjcm9sbFBvc2l0aW9uQ2hhbmdlOmYsdW5zdHlsZWQ6cCx2YXJpYW50Omgsdmlld3BvcnRQcm9wczp5LHNjcm9sbGJhcnM6ZyxzdHlsZTp2LHZhcnM6eCxvbkJvdHRvbVJlYWNoZWQ6aixvblRvcFJlYWNoZWQ6dyxzdGFydFNjcm9sbFBvc2l0aW9uOlMsb25PdmVyZmxvd0NoYW5nZTpDLC4uLmt9PU0oIlNjcm9sbEFyZWFBdXRvc2l6ZSIsRmEsZSksXz1tLnVzZVJlZihudWxsKSwkPUxhKFt1LF9dKSxPPW0udXNlUmVmKCExKSxUPW0udXNlUmVmKCExKSxBPW0udXNlRWZmZWN0RXZlbnQoKCk9Pntjb25zdCBEPV8uY3VycmVudDtpZighRHx8IUMpcmV0dXJuO2NvbnN0IFY9RC5zY3JvbGxIZWlnaHQ+RC5jbGllbnRIZWlnaHQ7ViE9PU8uY3VycmVudCYmKFQuY3VycmVudD9DKFYpOihULmN1cnJlbnQ9ITAsViYmQyghMCkpLE8uY3VycmVudD1WKX0pO3JldHVybiBOdChDP18uY3VycmVudDpudWxsLEEpLG8uanN4KHEsey4uLmssdmFyaWFudDpoLHN0eWxlOlt7ZGlzcGxheToiZmxleCIsb3ZlcmZsb3c6ImhpZGRlbiJ9LHZdLGNoaWxkcmVuOm8uanN4KHEse3N0eWxlOntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLGZsZXg6MSxvdmVyZmxvdzoiaGlkZGVuIiwuLi5nPT09InkiJiZ7bWluV2lkdGg6MH0sLi4uZz09PSJ4IiYme21pbkhlaWdodDowfSwuLi5nPT09Inh5IiYme21pbldpZHRoOjAsbWluSGVpZ2h0OjB9LC4uLmc9PT0hMSYme21pbldpZHRoOjAsbWluSGVpZ2h0OjB9fSxjaGlsZHJlbjpvLmpzeChfdCx7Y2xhc3NOYW1lczpuLHN0eWxlczpyLHNjcm9sbEhpZGVEZWxheTphLHNjcm9sbGJhclNpemU6cyx0eXBlOmksZGlyOmwsb2Zmc2V0U2Nyb2xsYmFyczpjLG92ZXJzY3JvbGxCZWhhdmlvcjpkLHZpZXdwb3J0UmVmOiQsb25TY3JvbGxQb3NpdGlvbkNoYW5nZTpmLHVuc3R5bGVkOnAsdmFyaWFudDpoLHZpZXdwb3J0UHJvcHM6eSx2YXJzOngsc2Nyb2xsYmFyczpnLG9uQm90dG9tUmVhY2hlZDpqLG9uVG9wUmVhY2hlZDp3LHN0YXJ0U2Nyb2xsUG9zaXRpb246UywiZGF0YS1hdXRvc2l6ZSI6InRydWUiLGNoaWxkcmVuOnR9KX0pfSl9KTtfdC5jbGFzc2VzPWtvO190LnZhcnNSZXNvbHZlcj1JYTtPby5kaXNwbGF5TmFtZT0iQG1hbnRpbmUvY29yZS9TY3JvbGxBcmVhQXV0b3NpemUiO09vLmNsYXNzZXM9a287X3QuQXV0b3NpemU9T287dmFyIHphPXtyb290OiJtXzg3Y2YyNjMxIn07Y29uc3QgcmY9e19fc3RhdGljU2VsZWN0b3I6IlVuc3R5bGVkQnV0dG9uIn0sZnI9Z3QoZT0+e2NvbnN0IHQ9TSgiVW5zdHlsZWRCdXR0b24iLHJmLGUpLHtjbGFzc05hbWU6bixjb21wb25lbnQ6cj0iYnV0dG9uIixfX3N0YXRpY1NlbGVjdG9yOnMsdW5zdHlsZWQ6YSxjbGFzc05hbWVzOmksc3R5bGVzOmwsc3R5bGU6YyxhdHRyaWJ1dGVzOmQsLi4udX09dDtyZXR1cm4gby5qc3gocSx7Li4udGUoe25hbWU6cyxwcm9wczp0LGNsYXNzZXM6emEsY2xhc3NOYW1lOm4sc3R5bGU6YyxjbGFzc05hbWVzOmksc3R5bGVzOmwsdW5zdHlsZWQ6YSxhdHRyaWJ1dGVzOmR9KSgicm9vdCIse2ZvY3VzYWJsZTohMH0pLGNvbXBvbmVudDpyLHR5cGU6cj09PSJidXR0b24iPyJidXR0b24iOnZvaWQgMCwuLi51fSl9KTtmci5jbGFzc2VzPXphO2ZyLmRpc3BsYXlOYW1lPSJAbWFudGluZS9jb3JlL1Vuc3R5bGVkQnV0dG9uIjt2YXIgQmE9e3Jvb3Q6Im1fNTE1YTk3ZjgifTtjb25zdCBNbz1ZKGU9Pntjb25zdCB0PU0oIlZpc3VhbGx5SGlkZGVuIixudWxsLGUpLHtjbGFzc05hbWVzOm4sY2xhc3NOYW1lOnIsc3R5bGU6cyxzdHlsZXM6YSx1bnN0eWxlZDppLHZhcnM6bCxhdHRyaWJ1dGVzOmMsLi4uZH09dDtyZXR1cm4gby5qc3gocSx7Y29tcG9uZW50OiJzcGFuIiwuLi50ZSh7bmFtZToiVmlzdWFsbHlIaWRkZW4iLGNsYXNzZXM6QmEscHJvcHM6dCxjbGFzc05hbWU6cixzdHlsZTpzLGNsYXNzTmFtZXM6bixzdHlsZXM6YSx1bnN0eWxlZDppLGF0dHJpYnV0ZXM6Y30pKCJyb290IiksLi4uZH0pfSk7TW8uY2xhc3Nlcz1CYTtNby5kaXNwbGF5TmFtZT0iQG1hbnRpbmUvY29yZS9WaXN1YWxseUhpZGRlbiI7dmFyIFZhPXtyb290OiJtXzFiNzI4NGEzIn07Y29uc3QgV2E9KGUse3JhZGl1czp0LHNoYWRvdzpufSk9Pih7cm9vdDp7Ii0tcGFwZXItcmFkaXVzIjp0PT09dm9pZCAwP3ZvaWQgMDptdCh0KSwiLS1wYXBlci1zaGFkb3ciOnBvKG4pfX0pLGVuPWd0KGU9Pntjb25zdCB0PU0oIlBhcGVyIixudWxsLGUpLHtjbGFzc05hbWVzOm4sY2xhc3NOYW1lOnIsc3R5bGU6cyxzdHlsZXM6YSx1bnN0eWxlZDppLHdpdGhCb3JkZXI6bCx2YXJzOmMscmFkaXVzOmQsc2hhZG93OnUsdmFyaWFudDpmLG1vZDpwLGF0dHJpYnV0ZXM6aCwuLi55fT10LGc9dGUoe25hbWU6IlBhcGVyIixwcm9wczp0LGNsYXNzZXM6VmEsY2xhc3NOYW1lOnIsc3R5bGU6cyxjbGFzc05hbWVzOm4sc3R5bGVzOmEsdW5zdHlsZWQ6aSxhdHRyaWJ1dGVzOmgsdmFyczpjLHZhcnNSZXNvbHZlcjpXYX0pO3JldHVybiBvLmpzeChxLHttb2Q6W3siZGF0YS13aXRoLWJvcmRlciI6bH0scF0sLi4uZygicm9vdCIpLHZhcmlhbnQ6ZiwuLi55fSl9KTtlbi5jbGFzc2VzPVZhO2VuLnZhcnNSZXNvbHZlcj1XYTtlbi5kaXNwbGF5TmFtZT0iQG1hbnRpbmUvY29yZS9QYXBlciI7ZnVuY3Rpb24gVHMoZSx0LG4scil7cmV0dXJuIGU9PT0iY2VudGVyInx8cj09PSJjZW50ZXIiP3t0b3A6dH06ZT09PSJlbmQiP3tib3R0b206bn06ZT09PSJzdGFydCI/e3RvcDpufTp7fX1mdW5jdGlvbiBQcyhlLHQsbixyLHMpe3JldHVybiBlPT09ImNlbnRlciJ8fHI9PT0iY2VudGVyIj97bGVmdDp0fTplPT09ImVuZCI/e1tzPT09Imx0ciI/InJpZ2h0IjoibGVmdCJdOm59OmU9PT0ic3RhcnQiP3tbcz09PSJsdHIiPyJsZWZ0IjoicmlnaHQiXTpufTp7fX1jb25zdCBvZj17Ym90dG9tOiJib3JkZXJUb3BMZWZ0UmFkaXVzIixsZWZ0OiJib3JkZXJUb3BSaWdodFJhZGl1cyIscmlnaHQ6ImJvcmRlckJvdHRvbUxlZnRSYWRpdXMiLHRvcDoiYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMifTtmdW5jdGlvbiBzZih7cG9zaXRpb246ZSxhcnJvd1NpemU6dCxhcnJvd09mZnNldDpuLGFycm93UmFkaXVzOnIsYXJyb3dQb3NpdGlvbjpzLGFycm93WDphLGFycm93WTppLGRpcjpsfSl7Y29uc3RbYyxkPSJjZW50ZXIiXT1lLnNwbGl0KCItIiksdT17d2lkdGg6dCxoZWlnaHQ6dCx0cmFuc2Zvcm06InJvdGF0ZSg0NWRlZykiLHBvc2l0aW9uOiJhYnNvbHV0ZSIsW29mW2NdXTpyfSxmPS10LzI7cmV0dXJuIGM9PT0ibGVmdCI/ey4uLnUsLi4uVHMoZCxpLG4scykscmlnaHQ6Zixib3JkZXJMZWZ0Q29sb3I6InRyYW5zcGFyZW50Iixib3JkZXJCb3R0b21Db2xvcjoidHJhbnNwYXJlbnQiLGNsaXBQYXRoOiJwb2x5Z29uKDEwMCUgMCwgMCAwLCAxMDAlIDEwMCUpIn06Yz09PSJyaWdodCI/ey4uLnUsLi4uVHMoZCxpLG4scyksbGVmdDpmLGJvcmRlclJpZ2h0Q29sb3I6InRyYW5zcGFyZW50Iixib3JkZXJUb3BDb2xvcjoidHJhbnNwYXJlbnQiLGNsaXBQYXRoOiJwb2x5Z29uKDAgMTAwJSwgMCAwLCAxMDAlIDEwMCUpIn06Yz09PSJ0b3AiP3suLi51LC4uLlBzKGQsYSxuLHMsbCksYm90dG9tOmYsYm9yZGVyVG9wQ29sb3I6InRyYW5zcGFyZW50Iixib3JkZXJMZWZ0Q29sb3I6InRyYW5zcGFyZW50IixjbGlwUGF0aDoicG9seWdvbigwIDEwMCUsIDEwMCUgMTAwJSwgMTAwJSAwKSJ9OmM9PT0iYm90dG9tIj97Li4udSwuLi5QcyhkLGEsbixzLGwpLHRvcDpmLGJvcmRlckJvdHRvbUNvbG9yOiJ0cmFuc3BhcmVudCIsYm9yZGVyUmlnaHRDb2xvcjoidHJhbnNwYXJlbnQiLGNsaXBQYXRoOiJwb2x5Z29uKDAgMTAwJSwgMCAwLCAxMDAlIDApIn06e319ZnVuY3Rpb24gSGEoe3Bvc2l0aW9uOmUsYXJyb3dTaXplOnQsYXJyb3dPZmZzZXQ6bixhcnJvd1JhZGl1czpyLGFycm93UG9zaXRpb246cyx2aXNpYmxlOmEsYXJyb3dYOmksYXJyb3dZOmwsc3R5bGU6YywuLi5kfSl7Y29uc3R7ZGlyOnV9PUNvKCk7cmV0dXJuIGE/by5qc3goImRpdiIsey4uLmQsc3R5bGU6ey4uLmMsLi4uc2Yoe3Bvc2l0aW9uOmUsYXJyb3dTaXplOnQsYXJyb3dPZmZzZXQ6bixhcnJvd1JhZGl1czpyLGFycm93UG9zaXRpb246cyxkaXI6dSxhcnJvd1g6aSxhcnJvd1k6bH0pfX0pOm51bGx9SGEuZGlzcGxheU5hbWU9IkBtYW50aW5lL2NvcmUvRmxvYXRpbmdBcnJvdyI7ZnVuY3Rpb24gYWYoZSx0KXtpZihlPT09InJ0bCImJih0LmluY2x1ZGVzKCJyaWdodCIpfHx0LmluY2x1ZGVzKCJsZWZ0IikpKXtjb25zdFtuLHJdPXQuc3BsaXQoIi0iKSxzPW49PT0icmlnaHQiPyJsZWZ0IjoicmlnaHQiO3JldHVybiByPT09dm9pZCAwP3M6YCR7c30tJHtyfWB9cmV0dXJuIHR9dmFyIHFhPXtyb290OiJtXzk4MTRlNDVmIn07Y29uc3QgbGY9e3pJbmRleDpGdCgibW9kYWwiKX0sWWE9KGUse2dyYWRpZW50OnQsY29sb3I6bixiYWNrZ3JvdW5kT3BhY2l0eTpyLGJsdXI6cyxyYWRpdXM6YSx6SW5kZXg6aX0pPT4oe3Jvb3Q6eyItLW92ZXJsYXktYmciOnR8fChuIT09dm9pZCAwfHxyIT09dm9pZCAwKSYmQ3Qobnx8IiMwMDAiLHI/Py42KXx8dm9pZCAwLCItLW92ZXJsYXktZmlsdGVyIjpzP2BibHVyKCR7TihzKX0pYDp2b2lkIDAsIi0tb3ZlcmxheS1yYWRpdXMiOmE9PT12b2lkIDA/dm9pZCAwOm10KGEpLCItLW92ZXJsYXktei1pbmRleCI6aT8udG9TdHJpbmcoKX19KSxSbj1ndChlPT57Y29uc3QgdD1NKCJPdmVybGF5IixsZixlKSx7Y2xhc3NOYW1lczpuLGNsYXNzTmFtZTpyLHN0eWxlOnMsc3R5bGVzOmEsdW5zdHlsZWQ6aSx2YXJzOmwsZml4ZWQ6YyxjZW50ZXI6ZCxjaGlsZHJlbjp1LHJhZGl1czpmLHpJbmRleDpwLGdyYWRpZW50OmgsYmx1cjp5LGNvbG9yOmcsYmFja2dyb3VuZE9wYWNpdHk6dixtb2Q6eCxhdHRyaWJ1dGVzOmosLi4ud309dDtyZXR1cm4gby5qc3gocSx7Li4udGUoe25hbWU6Ik92ZXJsYXkiLHByb3BzOnQsY2xhc3NlczpxYSxjbGFzc05hbWU6cixzdHlsZTpzLGNsYXNzTmFtZXM6bixzdHlsZXM6YSx1bnN0eWxlZDppLGF0dHJpYnV0ZXM6aix2YXJzOmwsdmFyc1Jlc29sdmVyOllhfSkoInJvb3QiKSxtb2Q6W3tjZW50ZXI6ZCxmaXhlZDpjfSx4XSwuLi53LGNoaWxkcmVuOnV9KX0pO1JuLmNsYXNzZXM9cWE7Um4udmFyc1Jlc29sdmVyPVlhO1JuLmRpc3BsYXlOYW1lPSJAbWFudGluZS9jb3JlL092ZXJsYXkiO2Z1bmN0aW9uIFZyKGUpe2NvbnN0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cmV0dXJuIHQuc2V0QXR0cmlidXRlKCJkYXRhLXBvcnRhbCIsInRydWUiKSx0eXBlb2YgZS5jbGFzc05hbWU9PSJzdHJpbmciJiZ0LmNsYXNzTGlzdC5hZGQoLi4uZS5jbGFzc05hbWUuc3BsaXQoIiAiKS5maWx0ZXIoQm9vbGVhbikpLHR5cGVvZiBlLnN0eWxlPT0ib2JqZWN0IiYmT2JqZWN0LmFzc2lnbih0LnN0eWxlLGUuc3R5bGUpLHR5cGVvZiBlLmlkPT0ic3RyaW5nIiYmdC5zZXRBdHRyaWJ1dGUoImlkIixlLmlkKSx0fWZ1bmN0aW9uIGNmKHt0YXJnZXQ6ZSxyZXVzZVRhcmdldE5vZGU6dCwuLi5ufSl7aWYoZSlyZXR1cm4gdHlwZW9mIGU9PSJzdHJpbmciP2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZSl8fFZyKG4pOmU7aWYodCl7Y29uc3Qgcj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJbZGF0YS1tYW50aW5lLXNoYXJlZC1wb3J0YWwtbm9kZV0iKTtpZihyKXJldHVybiByO2NvbnN0IHM9VnIobik7cmV0dXJuIHMuc2V0QXR0cmlidXRlKCJkYXRhLW1hbnRpbmUtc2hhcmVkLXBvcnRhbC1ub2RlIiwidHJ1ZSIpLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocyksc31yZXR1cm4gVnIobil9Y29uc3QgZGY9e3JldXNlVGFyZ2V0Tm9kZTohMH0sVWE9WShlPT57Y29uc3R7Y2hpbGRyZW46dCx0YXJnZXQ6bixyZXVzZVRhcmdldE5vZGU6cixyZWY6cywuLi5hfT1NKCJQb3J0YWwiLGRmLGUpLFtpLGxdPW0udXNlU3RhdGUoITEpLGM9bS51c2VSZWYobnVsbCk7cmV0dXJuIEl0KCgpPT4obCghMCksYy5jdXJyZW50PWNmKHt0YXJnZXQ6bixyZXVzZVRhcmdldE5vZGU6ciwuLi5hfSksSnIocyxjLmN1cnJlbnQpLCFuJiYhciYmYy5jdXJyZW50JiZkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGMuY3VycmVudCksKCk9PnshbiYmIXImJmMuY3VycmVudCYmZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChjLmN1cnJlbnQpfSksW25dKSwhaXx8IWMuY3VycmVudD9udWxsOm1vLmNyZWF0ZVBvcnRhbChvLmpzeChvLkZyYWdtZW50LHtjaGlsZHJlbjp0fSksYy5jdXJyZW50KX0pO1VhLmRpc3BsYXlOYW1lPSJAbWFudGluZS9jb3JlL1BvcnRhbCI7Y29uc3QgcHI9WSgoe3dpdGhpblBvcnRhbDplPSEwLGNoaWxkcmVuOnQsLi4ubn0pPT5zcigpPT09InRlc3QifHwhZT9vLmpzeChvLkZyYWdtZW50LHtjaGlsZHJlbjp0fSk6by5qc3goVWEsey4uLm4sY2hpbGRyZW46dH0pKTtwci5kaXNwbGF5TmFtZT0iQG1hbnRpbmUvY29yZS9PcHRpb25hbFBvcnRhbCI7Y29uc3QgcG49ZT0+KHtpbjp7b3BhY2l0eToxLHRyYW5zZm9ybToic2NhbGUoMSkifSxvdXQ6e29wYWNpdHk6MCx0cmFuc2Zvcm06YHNjYWxlKC45KSB0cmFuc2xhdGVZKCR7ZT09PSJib3R0b20iPzEwOi0xMH1weClgfSx0cmFuc2l0aW9uUHJvcGVydHk6InRyYW5zZm9ybSwgb3BhY2l0eSJ9KSxWbj17ZmFkZTp7aW46e29wYWNpdHk6MX0sb3V0OntvcGFjaXR5OjB9LHRyYW5zaXRpb25Qcm9wZXJ0eToib3BhY2l0eSJ9LCJmYWRlLXVwIjp7aW46e29wYWNpdHk6MSx0cmFuc2Zvcm06InRyYW5zbGF0ZVkoMCkifSxvdXQ6e29wYWNpdHk6MCx0cmFuc2Zvcm06InRyYW5zbGF0ZVkoMzBweCkifSx0cmFuc2l0aW9uUHJvcGVydHk6Im9wYWNpdHksIHRyYW5zZm9ybSJ9LCJmYWRlLWRvd24iOntpbjp7b3BhY2l0eToxLHRyYW5zZm9ybToidHJhbnNsYXRlWSgwKSJ9LG91dDp7b3BhY2l0eTowLHRyYW5zZm9ybToidHJhbnNsYXRlWSgtMzBweCkifSx0cmFuc2l0aW9uUHJvcGVydHk6Im9wYWNpdHksIHRyYW5zZm9ybSJ9LCJmYWRlLWxlZnQiOntpbjp7b3BhY2l0eToxLHRyYW5zZm9ybToidHJhbnNsYXRlWCgwKSJ9LG91dDp7b3BhY2l0eTowLHRyYW5zZm9ybToidHJhbnNsYXRlWCgzMHB4KSJ9LHRyYW5zaXRpb25Qcm9wZXJ0eToib3BhY2l0eSwgdHJhbnNmb3JtIn0sImZhZGUtcmlnaHQiOntpbjp7b3BhY2l0eToxLHRyYW5zZm9ybToidHJhbnNsYXRlWCgwKSJ9LG91dDp7b3BhY2l0eTowLHRyYW5zZm9ybToidHJhbnNsYXRlWCgtMzBweCkifSx0cmFuc2l0aW9uUHJvcGVydHk6Im9wYWNpdHksIHRyYW5zZm9ybSJ9LHNjYWxlOntpbjp7b3BhY2l0eToxLHRyYW5zZm9ybToic2NhbGUoMSkifSxvdXQ6e29wYWNpdHk6MCx0cmFuc2Zvcm06InNjYWxlKDApIn0sY29tbW9uOnt0cmFuc2Zvcm1PcmlnaW46InRvcCJ9LHRyYW5zaXRpb25Qcm9wZXJ0eToidHJhbnNmb3JtLCBvcGFjaXR5In0sInNjYWxlLXkiOntpbjp7b3BhY2l0eToxLHRyYW5zZm9ybToic2NhbGVZKDEpIn0sb3V0OntvcGFjaXR5OjAsdHJhbnNmb3JtOiJzY2FsZVkoMCkifSxjb21tb246e3RyYW5zZm9ybU9yaWdpbjoidG9wIn0sdHJhbnNpdGlvblByb3BlcnR5OiJ0cmFuc2Zvcm0sIG9wYWNpdHkifSwic2NhbGUteCI6e2luOntvcGFjaXR5OjEsdHJhbnNmb3JtOiJzY2FsZVgoMSkifSxvdXQ6e29wYWNpdHk6MCx0cmFuc2Zvcm06InNjYWxlWCgwKSJ9LGNvbW1vbjp7dHJhbnNmb3JtT3JpZ2luOiJsZWZ0In0sdHJhbnNpdGlvblByb3BlcnR5OiJ0cmFuc2Zvcm0sIG9wYWNpdHkifSwic2tldy11cCI6e2luOntvcGFjaXR5OjEsdHJhbnNmb3JtOiJ0cmFuc2xhdGVZKDApIHNrZXcoMGRlZywgMGRlZykifSxvdXQ6e29wYWNpdHk6MCx0cmFuc2Zvcm06InRyYW5zbGF0ZVkoLTIwcHgpIHNrZXcoLTEwZGVnLCAtNWRlZykifSxjb21tb246e3RyYW5zZm9ybU9yaWdpbjoidG9wIn0sdHJhbnNpdGlvblByb3BlcnR5OiJ0cmFuc2Zvcm0sIG9wYWNpdHkifSwic2tldy1kb3duIjp7aW46e29wYWNpdHk6MSx0cmFuc2Zvcm06InRyYW5zbGF0ZVkoMCkgc2tldygwZGVnLCAwZGVnKSJ9LG91dDp7b3BhY2l0eTowLHRyYW5zZm9ybToidHJhbnNsYXRlWSgyMHB4KSBza2V3KC0xMGRlZywgLTVkZWcpIn0sY29tbW9uOnt0cmFuc2Zvcm1PcmlnaW46ImJvdHRvbSJ9LHRyYW5zaXRpb25Qcm9wZXJ0eToidHJhbnNmb3JtLCBvcGFjaXR5In0sInJvdGF0ZS1sZWZ0Ijp7aW46e29wYWNpdHk6MSx0cmFuc2Zvcm06InRyYW5zbGF0ZVkoMCkgcm90YXRlKDBkZWcpIn0sb3V0OntvcGFjaXR5OjAsdHJhbnNmb3JtOiJ0cmFuc2xhdGVZKDIwcHgpIHJvdGF0ZSgtNWRlZykifSxjb21tb246e3RyYW5zZm9ybU9yaWdpbjoiYm90dG9tIn0sdHJhbnNpdGlvblByb3BlcnR5OiJ0cmFuc2Zvcm0sIG9wYWNpdHkifSwicm90YXRlLXJpZ2h0Ijp7aW46e29wYWNpdHk6MSx0cmFuc2Zvcm06InRyYW5zbGF0ZVkoMCkgcm90YXRlKDBkZWcpIn0sb3V0OntvcGFjaXR5OjAsdHJhbnNmb3JtOiJ0cmFuc2xhdGVZKDIwcHgpIHJvdGF0ZSg1ZGVnKSJ9LGNvbW1vbjp7dHJhbnNmb3JtT3JpZ2luOiJ0b3AifSx0cmFuc2l0aW9uUHJvcGVydHk6InRyYW5zZm9ybSwgb3BhY2l0eSJ9LCJzbGlkZS1kb3duIjp7aW46e29wYWNpdHk6MSx0cmFuc2Zvcm06InRyYW5zbGF0ZVkoMCkifSxvdXQ6e29wYWNpdHk6MCx0cmFuc2Zvcm06InRyYW5zbGF0ZVkoLTEwMCUpIn0sY29tbW9uOnt0cmFuc2Zvcm1PcmlnaW46InRvcCJ9LHRyYW5zaXRpb25Qcm9wZXJ0eToidHJhbnNmb3JtLCBvcGFjaXR5In0sInNsaWRlLXVwIjp7aW46e29wYWNpdHk6MSx0cmFuc2Zvcm06InRyYW5zbGF0ZVkoMCkifSxvdXQ6e29wYWNpdHk6MCx0cmFuc2Zvcm06InRyYW5zbGF0ZVkoMTAwJSkifSxjb21tb246e3RyYW5zZm9ybU9yaWdpbjoiYm90dG9tIn0sdHJhbnNpdGlvblByb3BlcnR5OiJ0cmFuc2Zvcm0sIG9wYWNpdHkifSwic2xpZGUtbGVmdCI6e2luOntvcGFjaXR5OjEsdHJhbnNmb3JtOiJ0cmFuc2xhdGVYKDApIn0sb3V0OntvcGFjaXR5OjAsdHJhbnNmb3JtOiJ0cmFuc2xhdGVYKDEwMCUpIn0sY29tbW9uOnt0cmFuc2Zvcm1PcmlnaW46ImxlZnQifSx0cmFuc2l0aW9uUHJvcGVydHk6InRyYW5zZm9ybSwgb3BhY2l0eSJ9LCJzbGlkZS1yaWdodCI6e2luOntvcGFjaXR5OjEsdHJhbnNmb3JtOiJ0cmFuc2xhdGVYKDApIn0sb3V0OntvcGFjaXR5OjAsdHJhbnNmb3JtOiJ0cmFuc2xhdGVYKC0xMDAlKSJ9LGNvbW1vbjp7dHJhbnNmb3JtT3JpZ2luOiJyaWdodCJ9LHRyYW5zaXRpb25Qcm9wZXJ0eToidHJhbnNmb3JtLCBvcGFjaXR5In0scG9wOnsuLi5wbigiYm90dG9tIiksY29tbW9uOnt0cmFuc2Zvcm1PcmlnaW46ImNlbnRlciBjZW50ZXIifX0sInBvcC1ib3R0b20tbGVmdCI6ey4uLnBuKCJib3R0b20iKSxjb21tb246e3RyYW5zZm9ybU9yaWdpbjoiYm90dG9tIGxlZnQifX0sInBvcC1ib3R0b20tcmlnaHQiOnsuLi5wbigiYm90dG9tIiksY29tbW9uOnt0cmFuc2Zvcm1PcmlnaW46ImJvdHRvbSByaWdodCJ9fSwicG9wLXRvcC1sZWZ0Ijp7Li4ucG4oInRvcCIpLGNvbW1vbjp7dHJhbnNmb3JtT3JpZ2luOiJ0b3AgbGVmdCJ9fSwicG9wLXRvcC1yaWdodCI6ey4uLnBuKCJ0b3AiKSxjb21tb246e3RyYW5zZm9ybU9yaWdpbjoidG9wIHJpZ2h0In19fSxFcz17ZW50ZXJpbmc6ImluIixlbnRlcmVkOiJpbiIsZXhpdGluZzoib3V0IixleGl0ZWQ6Im91dCIsInByZS1leGl0aW5nIjoib3V0IiwicHJlLWVudGVyaW5nIjoib3V0In07ZnVuY3Rpb24gQXMoe3RyYW5zaXRpb246ZSxzdGF0ZTp0LGR1cmF0aW9uOm4sdGltaW5nRnVuY3Rpb246cn0pe2NvbnN0IHM9e1dlYmtpdEJhY2tmYWNlVmlzaWJpbGl0eToiaGlkZGVuIix0cmFuc2l0aW9uRHVyYXRpb246YCR7bn1tc2AsdHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uOnJ9O3JldHVybiB0eXBlb2YgZT09InN0cmluZyI/ZSBpbiBWbj97dHJhbnNpdGlvblByb3BlcnR5OlZuW2VdLnRyYW5zaXRpb25Qcm9wZXJ0eSwuLi5zLC4uLlZuW2VdLmNvbW1vbiwuLi5WbltlXVtFc1t0XV19Ont9Ont0cmFuc2l0aW9uUHJvcGVydHk6ZS50cmFuc2l0aW9uUHJvcGVydHksLi4ucywuLi5lLmNvbW1vbiwuLi5lW0VzW3RdXX19ZnVuY3Rpb24gdWYoe2R1cmF0aW9uOmUsZXhpdER1cmF0aW9uOnQsdGltaW5nRnVuY3Rpb246bixtb3VudGVkOnIsb25FbnRlcjpzLG9uRXhpdDphLG9uRW50ZXJlZDppLG9uRXhpdGVkOmwsZW50ZXJEZWxheTpjLGV4aXREZWxheTpkfSl7Y29uc3QgdT1SdCgpLGY9bmEoKSxwPXUucmVzcGVjdFJlZHVjZWRNb3Rpb24/ZjohMSxbaCx5XT1tLnVzZVN0YXRlKHA/MDplKSxbZyx2XT1tLnVzZVN0YXRlKHI/ImVudGVyZWQiOiJleGl0ZWQiKSx4PW0udXNlUmVmKC0xKSxqPW0udXNlUmVmKC0xKSx3PW0udXNlUmVmKC0xKTtmdW5jdGlvbiBTKCl7d2luZG93LmNsZWFyVGltZW91dCh4LmN1cnJlbnQpLHdpbmRvdy5jbGVhclRpbWVvdXQoai5jdXJyZW50KSxjYW5jZWxBbmltYXRpb25GcmFtZSh3LmN1cnJlbnQpfWNvbnN0IEM9Xz0+e1MoKTtjb25zdCAkPV8/czphLE89Xz9pOmwsVD1wPzA6Xz9lOnQ7eShUKSxUPT09MD8odHlwZW9mICQ9PSJmdW5jdGlvbiImJiQoKSx0eXBlb2YgTz09ImZ1bmN0aW9uIiYmTygpLHYoXz8iZW50ZXJlZCI6ImV4aXRlZCIpKTp3LmN1cnJlbnQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57bGMuZmx1c2hTeW5jKCgpPT57dihfPyJwcmUtZW50ZXJpbmciOiJwcmUtZXhpdGluZyIpfSksdy5jdXJyZW50PXJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3R5cGVvZiAkPT0iZnVuY3Rpb24iJiYkKCksdihfPyJlbnRlcmluZyI6ImV4aXRpbmciKSx4LmN1cnJlbnQ9d2luZG93LnNldFRpbWVvdXQoKCk9Pnt0eXBlb2YgTz09ImZ1bmN0aW9uIiYmTygpLHYoXz8iZW50ZXJlZCI6ImV4aXRlZCIpfSxUKX0pfSl9LGs9Xz0+e2lmKFMoKSx0eXBlb2YoXz9jOmQpIT0ibnVtYmVyIil7QyhfKTtyZXR1cm59ai5jdXJyZW50PXdpbmRvdy5zZXRUaW1lb3V0KCgpPT57QyhfKX0sXz9jOmQpfTtyZXR1cm4gS24oKCk9PntrKHIpfSxbcl0pLG0udXNlRWZmZWN0KCgpPT4oKT0+e1MoKX0sW10pLHt0cmFuc2l0aW9uRHVyYXRpb246aCx0cmFuc2l0aW9uU3RhdHVzOmcsdHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uOm58fCJlYXNlIn19ZnVuY3Rpb24gc24oe2tlZXBNb3VudGVkOmUsdHJhbnNpdGlvbjp0PSJmYWRlIixkdXJhdGlvbjpuPTI1MCxleGl0RHVyYXRpb246cj1uLG1vdW50ZWQ6cyxjaGlsZHJlbjphLHRpbWluZ0Z1bmN0aW9uOmk9ImVhc2UiLG9uRXhpdDpsLG9uRW50ZXJlZDpjLG9uRW50ZXI6ZCxvbkV4aXRlZDp1LGVudGVyRGVsYXk6ZixleGl0RGVsYXk6cH0pe2NvbnN0IGg9c3IoKSx7dHJhbnNpdGlvbkR1cmF0aW9uOnksdHJhbnNpdGlvblN0YXR1czpnLHRyYW5zaXRpb25UaW1pbmdGdW5jdGlvbjp2fT11Zih7bW91bnRlZDpzLGV4aXREdXJhdGlvbjpyLGR1cmF0aW9uOm4sdGltaW5nRnVuY3Rpb246aSxvbkV4aXQ6bCxvbkVudGVyZWQ6YyxvbkVudGVyOmQsb25FeGl0ZWQ6dSxlbnRlckRlbGF5OmYsZXhpdERlbGF5OnB9KTtpZihoPT09InRlc3QiKXJldHVybiBzP28uanN4KG8uRnJhZ21lbnQse2NoaWxkcmVuOmEoe30pfSk6ZT9hKHtkaXNwbGF5OiJub25lIn0pOm51bGw7aWYoeT09PTApcmV0dXJuIGU/by5qc3gobS5BY3Rpdml0eSx7bW9kZTpzPyJ2aXNpYmxlIjoiaGlkZGVuIixjaGlsZHJlbjphKHt9KX0pOnM/by5qc3goby5GcmFnbWVudCx7Y2hpbGRyZW46YSh7fSl9KTpudWxsO2NvbnN0IHg9Zz09PSJleGl0ZWQiO3JldHVybiBlP28uanN4KG0uQWN0aXZpdHkse21vZGU6eD8iaGlkZGVuIjoidmlzaWJsZSIsY2hpbGRyZW46YSh4P3t9OkFzKHt0cmFuc2l0aW9uOnQsZHVyYXRpb246eSxzdGF0ZTpnLHRpbWluZ0Z1bmN0aW9uOnZ9KSl9KTp4P251bGw6by5qc3goby5GcmFnbWVudCx7Y2hpbGRyZW46YShBcyh7dHJhbnNpdGlvbjp0LGR1cmF0aW9uOnksc3RhdGU6Zyx0aW1pbmdGdW5jdGlvbjp2fSkpfSl9c24uZGlzcGxheU5hbWU9IkBtYW50aW5lL2NvcmUvVHJhbnNpdGlvbiI7Y29uc3RbZmYsR2FdPUx0KCJQb3BvdmVyIGNvbXBvbmVudCB3YXMgbm90IGZvdW5kIGluIHRoZSB0cmVlIik7ZnVuY3Rpb24gbXIoe2NoaWxkcmVuOmUsYWN0aXZlOnQ9ITAscmVmUHJvcDpuPSJyZWYiLGlubmVyUmVmOnJ9KXtjb25zdCBzPUxlKG9jKHQpLHIpLGE9b3IoZSk7cmV0dXJuIGE/bS5jbG9uZUVsZW1lbnQoYSx7W25dOnN9KTplfWZ1bmN0aW9uIFhhKGUpe3JldHVybiBvLmpzeChNbyx7dGFiSW5kZXg6LTEsImRhdGEtYXV0b2ZvY3VzIjohMCwuLi5lfSl9bXIuZGlzcGxheU5hbWU9IkBtYW50aW5lL2NvcmUvRm9jdXNUcmFwIjtYYS5kaXNwbGF5TmFtZT0iQG1hbnRpbmUvY29yZS9Gb2N1c1RyYXBJbml0aWFsRm9jdXMiO21yLkluaXRpYWxGb2N1cz1YYTt2YXIgS2E9e2Ryb3Bkb3duOiJtXzM4YTg1NjU5IixhcnJvdzoibV9hMzFkYzZjMSIsb3ZlcmxheToibV8zZDdiYzkwOCJ9O2NvbnN0IERvPVkoZT0+e2NvbnN0IHQ9TSgiUG9wb3ZlckRyb3Bkb3duIixudWxsLGUpLHtjbGFzc05hbWU6bixzdHlsZTpyLHZhcnM6cyxjaGlsZHJlbjphLG9uS2V5RG93bkNhcHR1cmU6aSx2YXJpYW50OmwsY2xhc3NOYW1lczpjLHN0eWxlczpkLHJlZjp1LC4uLmZ9PXQscD1HYSgpLGg9WnMoe29wZW5lZDpwLm9wZW5lZCxzaG91bGRSZXR1cm5Gb2N1czpwLnJldHVybkZvY3VzfSkseT1wLndpdGhSb2xlcz97ImFyaWEtbGFiZWxsZWRieSI6cC5nZXRUYXJnZXRJZCgpLGlkOnAuZ2V0RHJvcGRvd25JZCgpLHJvbGU6ImRpYWxvZyIsdGFiSW5kZXg6LTF9Ont9LGc9TGUodSxwLmZsb2F0aW5nKTtyZXR1cm4gcC5kaXNhYmxlZD9udWxsOm8uanN4KHByLHsuLi5wLnBvcnRhbFByb3BzLHdpdGhpblBvcnRhbDpwLndpdGhpblBvcnRhbCxjaGlsZHJlbjpvLmpzeChzbix7bW91bnRlZDpwLm9wZW5lZCwuLi5wLnRyYW5zaXRpb25Qcm9wcyx0cmFuc2l0aW9uOnAudHJhbnNpdGlvblByb3BzPy50cmFuc2l0aW9ufHwiZmFkZSIsZHVyYXRpb246cC50cmFuc2l0aW9uUHJvcHM/LmR1cmF0aW9uPz8xNTAsa2VlcE1vdW50ZWQ6cC5rZWVwTW91bnRlZCxleGl0RHVyYXRpb246dHlwZW9mIHAudHJhbnNpdGlvblByb3BzPy5leGl0RHVyYXRpb249PSJudW1iZXIiP3AudHJhbnNpdGlvblByb3BzLmV4aXREdXJhdGlvbjpwLnRyYW5zaXRpb25Qcm9wcz8uZHVyYXRpb24sY2hpbGRyZW46dj0+by5qc3gobXIse2FjdGl2ZTpwLnRyYXBGb2N1cyYmcC5vcGVuZWQsaW5uZXJSZWY6ZyxjaGlsZHJlbjpvLmpzeHMocSx7Li4ueSwuLi5mLHZhcmlhbnQ6bCxvbktleURvd25DYXB0dXJlOkhsKCgpPT57cC5vbkNsb3NlPy4oKSxwLm9uRGlzbWlzcz8uKCl9LHthY3RpdmU6cC5jbG9zZU9uRXNjYXBlLG9uVHJpZ2dlcjpoLG9uS2V5RG93bjppfSksImRhdGEtcG9zaXRpb24iOnAucGxhY2VtZW50LCJkYXRhLWZpeGVkIjpwLmZsb2F0aW5nU3RyYXRlZ3k9PT0iZml4ZWQifHx2b2lkIDAsLi4ucC5nZXRTdHlsZXMoImRyb3Bkb3duIix7Y2xhc3NOYW1lOm4scHJvcHM6dCxjbGFzc05hbWVzOmMsc3R5bGVzOmQsc3R5bGU6W3suLi52LHpJbmRleDpwLnpJbmRleCx0b3A6cC55Pz8wLGxlZnQ6cC54Pz8wLHdpZHRoOnAud2lkdGg9PT0idGFyZ2V0Ij92b2lkIDA6TihwLndpZHRoKSwuLi5wLnJlZmVyZW5jZUhpZGRlbj97ZGlzcGxheToibm9uZSJ9Om51bGx9LHAucmVzb2x2ZWRTdHlsZXMuZHJvcGRvd24sZD8uZHJvcGRvd24scl19KSxjaGlsZHJlbjpbYSxvLmpzeChIYSx7cmVmOnAuYXJyb3dSZWYsYXJyb3dYOnAuYXJyb3dYLGFycm93WTpwLmFycm93WSx2aXNpYmxlOnAud2l0aEFycm93LHBvc2l0aW9uOnAucGxhY2VtZW50LGFycm93U2l6ZTpwLmFycm93U2l6ZSxhcnJvd1JhZGl1czpwLmFycm93UmFkaXVzLGFycm93T2Zmc2V0OnAuYXJyb3dPZmZzZXQsYXJyb3dQb3NpdGlvbjpwLmFycm93UG9zaXRpb24sLi4ucC5nZXRTdHlsZXMoImFycm93Iix7cHJvcHM6dCxjbGFzc05hbWVzOmMsc3R5bGVzOmR9KX0pXX0pfSl9KX0pfSk7RG8uY2xhc3Nlcz1LYTtEby5kaXNwbGF5TmFtZT0iQG1hbnRpbmUvY29yZS9Qb3BvdmVyRHJvcGRvd24iO2NvbnN0IHBmPXtyZWZQcm9wOiJyZWYiLHBvcHVwVHlwZToiZGlhbG9nIn0sSmE9WShlPT57Y29uc3R7Y2hpbGRyZW46dCxyZWZQcm9wOm4scG9wdXBUeXBlOnIscmVmOnMsLi4uYX09TSgiUG9wb3ZlclRhcmdldCIscGYsZSksaT1vcih0KTtpZighaSl0aHJvdyBuZXcgRXJyb3IoIlBvcG92ZXIuVGFyZ2V0IGNvbXBvbmVudCBjaGlsZHJlbiBzaG91bGQgYmUgYW4gZWxlbWVudCBvciBhIGNvbXBvbmVudCB0aGF0IGFjY2VwdHMgcmVmLiBGcmFnbWVudHMsIHN0cmluZ3MsIG51bWJlcnMgYW5kIG90aGVyIHByaW1pdGl2ZSB2YWx1ZXMgYXJlIG5vdCBzdXBwb3J0ZWQiKTtjb25zdCBsPWEsYz1HYSgpLGQ9TGUoYy5yZWZlcmVuY2UscmEoaSkscyksdT1jLndpdGhSb2xlcz97ImFyaWEtaGFzcG9wdXAiOnIsImFyaWEtZXhwYW5kZWQiOmMub3BlbmVkLCJhcmlhLWNvbnRyb2xzIjpjLm9wZW5lZD9jLmdldERyb3Bkb3duSWQoKTp2b2lkIDAsaWQ6Yy5nZXRUYXJnZXRJZCgpfTp7fSxmPWkucHJvcHM7cmV0dXJuIG0uY2xvbmVFbGVtZW50KGksey4uLmwsLi4udSwuLi5jLnRhcmdldFByb3BzLGNsYXNzTmFtZTpfZShjLnRhcmdldFByb3BzLmNsYXNzTmFtZSxsLmNsYXNzTmFtZSxmLmNsYXNzTmFtZSksW25dOmQsLi4uYy5jb250cm9sbGVkP251bGw6e29uQ2xpY2s6cD0+e2Mub25Ub2dnbGUoKSxmLm9uQ2xpY2s/LihwKX19fSl9KTtKYS5kaXNwbGF5TmFtZT0iQG1hbnRpbmUvY29yZS9Qb3BvdmVyVGFyZ2V0IjtmdW5jdGlvbiBtZihlKXtpZihlPT09dm9pZCAwKXJldHVybntzaGlmdDohMCxmbGlwOiEwfTtjb25zdCB0PXsuLi5lfTtyZXR1cm4gZS5zaGlmdD09PXZvaWQgMCYmKHQuc2hpZnQ9ITApLGUuZmxpcD09PXZvaWQgMCYmKHQuZmxpcD0hMCksdH1mdW5jdGlvbiBoZihlLHQsbil7Y29uc3Qgcj1tZihlLm1pZGRsZXdhcmVzKSxzPVt6dShlLm9mZnNldCksV3UoKV07cmV0dXJuIGUuZHJvcGRvd25WaXNpYmxlJiZuIT09InRlc3QiJiZlLnByZXZlbnRQb3NpdGlvbkNoYW5nZVdoZW5WaXNpYmxlJiYoci5mbGlwPSExKSxyLmZsaXAmJnMucHVzaCh0eXBlb2Ygci5mbGlwPT0iYm9vbGVhbiI/a3MoKTprcyhyLmZsaXApKSxyLnNoaWZ0JiZzLnB1c2goQnUodHlwZW9mIHIuc2hpZnQ9PSJib29sZWFuIj97bGltaXRlcjpOcygpLHBhZGRpbmc6NX06e2xpbWl0ZXI6TnMoKSxwYWRkaW5nOjUsLi4uci5zaGlmdH0pKSxyLmlubGluZSYmcy5wdXNoKHR5cGVvZiByLmlubGluZT09ImJvb2xlYW4iP1JzKCk6UnMoci5pbmxpbmUpKSxzLnB1c2goSHUoe2VsZW1lbnQ6ZS5hcnJvd1JlZixwYWRkaW5nOmUuYXJyb3dPZmZzZXR9KSksKHIuc2l6ZXx8ZS53aWR0aD09PSJ0YXJnZXQiKSYmcy5wdXNoKFZ1KHsuLi50eXBlb2Ygci5zaXplPT0iYm9vbGVhbiI/e306ci5zaXplLGFwcGx5KHtyZWN0czphLGF2YWlsYWJsZVdpZHRoOmksYXZhaWxhYmxlSGVpZ2h0OmwsLi4uY30pe2NvbnN0IGQ9dCgpLnJlZnMuZmxvYXRpbmcuY3VycmVudD8uc3R5bGU/P3t9O3Iuc2l6ZSYmKHR5cGVvZiByLnNpemU9PSJvYmplY3QiJiZyLnNpemUuYXBwbHk/ci5zaXplLmFwcGx5KHtyZWN0czphLGF2YWlsYWJsZVdpZHRoOmksYXZhaWxhYmxlSGVpZ2h0OmwsLi4uY30pOk9iamVjdC5hc3NpZ24oZCx7bWF4V2lkdGg6YCR7aX1weGAsbWF4SGVpZ2h0OmAke2x9cHhgfSkpLGUud2lkdGg9PT0idGFyZ2V0IiYmT2JqZWN0LmFzc2lnbihkLHt3aWR0aDpgJHthLnJlZmVyZW5jZS53aWR0aH1weGB9KX19KSksc31mdW5jdGlvbiBnZihlKXtjb25zdCB0PXNyKCksW24scl09Sm4oe3ZhbHVlOmUub3BlbmVkLGRlZmF1bHRWYWx1ZTplLmRlZmF1bHRPcGVuZWQsZmluYWxWYWx1ZTohMSxvbkNoYW5nZTplLm9uQ2hhbmdlfSkscz1tLnVzZVJlZihuKSxhPSgpPT57biYmIWUuZGlzYWJsZWQmJnIoITEpfSxpPSgpPT57ZS5kaXNhYmxlZHx8cighbil9LGw9bmYoe3N0cmF0ZWd5OmUuc3RyYXRlZ3kscGxhY2VtZW50OmUucHJldmVudFBvc2l0aW9uQ2hhbmdlV2hlblZpc2libGU/ZS5wb3NpdGlvblJlZi5jdXJyZW50OmUucG9zaXRpb24sbWlkZGxld2FyZTpoZihlLCgpPT5sLHQpLHdoaWxlRWxlbWVudHNNb3VudGVkOmUua2VlcE1vdW50ZWQ/dm9pZCAwOmpzfSk7cmV0dXJuIG0udXNlRWZmZWN0KCgpPT57aWYoISghbC5yZWZzLnJlZmVyZW5jZS5jdXJyZW50fHwhbC5yZWZzLmZsb2F0aW5nLmN1cnJlbnQpJiZuKXJldHVybiBqcyhsLnJlZnMucmVmZXJlbmNlLmN1cnJlbnQsbC5yZWZzLmZsb2F0aW5nLmN1cnJlbnQsbC51cGRhdGUpfSxbbixsLnVwZGF0ZV0pLEtuKCgpPT57ZS5vblBvc2l0aW9uQ2hhbmdlPy4obC5wbGFjZW1lbnQpLGUucG9zaXRpb25SZWYuY3VycmVudD1sLnBsYWNlbWVudH0sW2wucGxhY2VtZW50LGUucHJldmVudFBvc2l0aW9uQ2hhbmdlV2hlblZpc2libGVdKSxLbigoKT0+e24hPT1zLmN1cnJlbnQmJihuP2Uub25PcGVuPy4oKTplLm9uQ2xvc2U/LigpKSxzLmN1cnJlbnQ9bn0sW24sZS5vbkNsb3NlLGUub25PcGVuXSksSXQoKCk9PntsZXQgYz0tMTtyZXR1cm4gbiYmKGM9d2luZG93LnNldFRpbWVvdXQoKCk9PmUuc2V0RHJvcGRvd25WaXNpYmxlKCEwKSw0KSksKCk9Pnt3aW5kb3cuY2xlYXJUaW1lb3V0KGMpfX0sW24sZS5wb3NpdGlvbl0pLHtmbG9hdGluZzpsLGNvbnRyb2xsZWQ6dHlwZW9mIGUub3BlbmVkPT0iYm9vbGVhbiIsb3BlbmVkOm4sb25DbG9zZTphLG9uVG9nZ2xlOml9fWNvbnN0IGJmPXtwb3NpdGlvbjoiYm90dG9tIixvZmZzZXQ6OCx0cmFuc2l0aW9uUHJvcHM6e3RyYW5zaXRpb246ImZhZGUiLGR1cmF0aW9uOjE1MH0sbWlkZGxld2FyZXM6e2ZsaXA6ITAsc2hpZnQ6ITAsaW5saW5lOiExfSxhcnJvd1NpemU6NyxhcnJvd09mZnNldDo1LGFycm93UmFkaXVzOjAsYXJyb3dQb3NpdGlvbjoic2lkZSIsY2xvc2VPbkNsaWNrT3V0c2lkZTohMCx3aXRoaW5Qb3J0YWw6ITAsY2xvc2VPbkVzY2FwZTohMCx0cmFwRm9jdXM6ITEsd2l0aFJvbGVzOiEwLHJldHVybkZvY3VzOiExLHdpdGhPdmVybGF5OiExLGhpZGVEZXRhY2hlZDohMCxjbGlja091dHNpZGVFdmVudHM6WyJtb3VzZWRvd24iLCJ0b3VjaHN0YXJ0Il0sekluZGV4OkZ0KCJwb3BvdmVyIiksX19zdGF0aWNTZWxlY3RvcjoiUG9wb3ZlciIsd2lkdGg6Im1heC1jb250ZW50In0sWmE9KGUse3JhZGl1czp0LHNoYWRvdzpufSk9Pih7ZHJvcGRvd246eyItLXBvcG92ZXItcmFkaXVzIjp0PT09dm9pZCAwP3ZvaWQgMDptdCh0KSwiLS1wb3BvdmVyLXNoYWRvdyI6cG8obil9fSk7ZnVuY3Rpb24gTWUoZSl7Y29uc3QgdD1NKCJQb3BvdmVyIixiZixlKSx7Y2hpbGRyZW46bixwb3NpdGlvbjpyLG9mZnNldDpzLG9uUG9zaXRpb25DaGFuZ2U6YSxvcGVuZWQ6aSx0cmFuc2l0aW9uUHJvcHM6bCxvbkV4aXRUcmFuc2l0aW9uRW5kOmMsb25FbnRlclRyYW5zaXRpb25FbmQ6ZCx3aWR0aDp1LG1pZGRsZXdhcmVzOmYsd2l0aEFycm93OnAsYXJyb3dTaXplOmgsYXJyb3dPZmZzZXQ6eSxhcnJvd1JhZGl1czpnLGFycm93UG9zaXRpb246dix1bnN0eWxlZDp4LGNsYXNzTmFtZXM6aixzdHlsZXM6dyxjbG9zZU9uQ2xpY2tPdXRzaWRlOlMsd2l0aGluUG9ydGFsOkMscG9ydGFsUHJvcHM6ayxjbG9zZU9uRXNjYXBlOl8sY2xpY2tPdXRzaWRlRXZlbnRzOiQsdHJhcEZvY3VzOk8sb25DbG9zZTpULG9uRGlzbWlzczpBLG9uT3BlbjpELG9uQ2hhbmdlOlYsekluZGV4OlgscmFkaXVzOkosc2hhZG93OlAsaWQ6VyxkZWZhdWx0T3BlbmVkOkksX19zdGF0aWNTZWxlY3Rvcjp6LHdpdGhSb2xlczpLLGRpc2FibGVkOmxlLHJldHVybkZvY3VzOnNlLHZhcmlhbnQ6Q2Usa2VlcE1vdW50ZWQ6dmUsdmFyczpUZSxmbG9hdGluZ1N0cmF0ZWd5OndlLHdpdGhPdmVybGF5OmNlLG92ZXJsYXlQcm9wczp4ZSxoaWRlRGV0YWNoZWQ6dWUsYXR0cmlidXRlczpMLHByZXZlbnRQb3NpdGlvbkNoYW5nZVdoZW5WaXNpYmxlOk5lLC4uLmZlfT10LGRlPXRlKHtuYW1lOnoscHJvcHM6dCxjbGFzc2VzOkthLGNsYXNzTmFtZXM6aixzdHlsZXM6dyx1bnN0eWxlZDp4LGF0dHJpYnV0ZXM6TCxyb290U2VsZWN0b3I6ImRyb3Bkb3duIix2YXJzOlRlLHZhcnNSZXNvbHZlcjpaYX0pLHtyZXNvbHZlZFN0eWxlczpIZX09dm8oe2NsYXNzTmFtZXM6aixzdHlsZXM6dyxwcm9wczp0fSksW0J0LEZdPW0udXNlU3RhdGUoaT8/ST8/ITEpLHh0PW0udXNlUmVmKHIpLHd0PW0udXNlUmVmKG51bGwpLFtqdCxUdF09bS51c2VTdGF0ZShudWxsKSxbSmUsRmVdPW0udXNlU3RhdGUobnVsbCkse2RpcjpoZX09Q28oKSxwZT1zcigpLEI9bm4oVyksRz1nZih7bWlkZGxld2FyZXM6Zix3aWR0aDp1LHBvc2l0aW9uOmFmKGhlLHIpLG9mZnNldDp0eXBlb2Ygcz09Im51bWJlciI/cysocD9oLzI6MCk6cyxhcnJvd1JlZjp3dCxhcnJvd09mZnNldDp5LG9uUG9zaXRpb25DaGFuZ2U6YSxvcGVuZWQ6aSxkZWZhdWx0T3BlbmVkOkksb25DaGFuZ2U6Vixvbk9wZW46RCxvbkNsb3NlOlQsb25EaXNtaXNzOkEsc3RyYXRlZ3k6d2UsZHJvcGRvd25WaXNpYmxlOkJ0LHNldERyb3Bkb3duVmlzaWJsZTpGLHBvc2l0aW9uUmVmOnh0LGRpc2FibGVkOmxlLHByZXZlbnRQb3NpdGlvbkNoYW5nZVdoZW5WaXNpYmxlOk5lLGtlZXBNb3VudGVkOnZlfSk7S2woKCk9PntTJiYoRy5vbkNsb3NlKCksQT8uKCkpfSwkLFtqdCxKZV0pO2NvbnN0IFU9bS51c2VDYWxsYmFjayhJZT0+e1R0KEllKSxHLmZsb2F0aW5nLnJlZnMuc2V0UmVmZXJlbmNlKEllKX0sW0cuZmxvYXRpbmcucmVmcy5zZXRSZWZlcmVuY2VdKSxhZT1tLnVzZUNhbGxiYWNrKEllPT57RmUoSWUpLEcuZmxvYXRpbmcucmVmcy5zZXRGbG9hdGluZyhJZSl9LFtHLmZsb2F0aW5nLnJlZnMuc2V0RmxvYXRpbmddKSxWdD1tLnVzZUNhbGxiYWNrKCgpPT57bD8ub25FeGl0ZWQ/LigpLGM/LigpLEYoITEpLE5lfHwoeHQuY3VycmVudD1yKX0sW2w/Lm9uRXhpdGVkLGMsTmUscl0pLFBlPW0udXNlQ2FsbGJhY2soKCk9PntsPy5vbkVudGVyZWQ/LigpLGQ/LigpfSxbbD8ub25FbnRlcmVkLGRdKTtyZXR1cm4gby5qc3hzKGZmLHt2YWx1ZTp7cmV0dXJuRm9jdXM6c2UsZGlzYWJsZWQ6bGUsY29udHJvbGxlZDpHLmNvbnRyb2xsZWQscmVmZXJlbmNlOlUsZmxvYXRpbmc6YWUseDpHLmZsb2F0aW5nLngseTpHLmZsb2F0aW5nLnksYXJyb3dYOkcuZmxvYXRpbmc/Lm1pZGRsZXdhcmVEYXRhPy5hcnJvdz8ueCxhcnJvd1k6Ry5mbG9hdGluZz8ubWlkZGxld2FyZURhdGE/LmFycm93Py55LG9wZW5lZDpHLm9wZW5lZCxhcnJvd1JlZjp3dCx0cmFuc2l0aW9uUHJvcHM6ey4uLmwsb25FeGl0ZWQ6VnQsb25FbnRlcmVkOlBlfSx3aWR0aDp1LHdpdGhBcnJvdzpwLGFycm93U2l6ZTpoLGFycm93T2Zmc2V0OnksYXJyb3dSYWRpdXM6ZyxhcnJvd1Bvc2l0aW9uOnYscGxhY2VtZW50OkcuZmxvYXRpbmcucGxhY2VtZW50LHRyYXBGb2N1czpPLHdpdGhpblBvcnRhbDpDLHBvcnRhbFByb3BzOmssekluZGV4OlgscmFkaXVzOkosc2hhZG93OlAsY2xvc2VPbkVzY2FwZTpfLG9uRGlzbWlzczpBLG9uQ2xvc2U6Ry5vbkNsb3NlLG9uVG9nZ2xlOkcub25Ub2dnbGUsZ2V0VGFyZ2V0SWQ6KCk9PkIsZ2V0RHJvcGRvd25JZDooKT0+YCR7Qn0tZHJvcGRvd25gLHdpdGhSb2xlczpLLHRhcmdldFByb3BzOmZlLF9fc3RhdGljU2VsZWN0b3I6eixjbGFzc05hbWVzOmosc3R5bGVzOncsdW5zdHlsZWQ6eCx2YXJpYW50OkNlLGtlZXBNb3VudGVkOnZlLGdldFN0eWxlczpkZSxyZXNvbHZlZFN0eWxlczpIZSxmbG9hdGluZ1N0cmF0ZWd5OndlLHJlZmVyZW5jZUhpZGRlbjp1ZSYmcGUhPT0idGVzdCI/Ry5mbG9hdGluZy5taWRkbGV3YXJlRGF0YS5oaWRlPy5yZWZlcmVuY2VIaWRkZW46ITF9LGNoaWxkcmVuOltuLGNlJiZvLmpzeChzbix7dHJhbnNpdGlvbjoiZmFkZSIsbW91bnRlZDpHLm9wZW5lZCxkdXJhdGlvbjpsPy5kdXJhdGlvbnx8MjUwLGV4aXREdXJhdGlvbjpsPy5leGl0RHVyYXRpb258fDI1MCxjaGlsZHJlbjpJZT0+by5qc3gocHIse3dpdGhpblBvcnRhbDpDLGNoaWxkcmVuOm8uanN4KFJuLHsuLi54ZSwuLi5kZSgib3ZlcmxheSIse2NsYXNzTmFtZTp4ZT8uY2xhc3NOYW1lLHN0eWxlOltJZSx4ZT8uc3R5bGVdfSl9KX0pfSldfSl9TWUuVGFyZ2V0PUphO01lLkRyb3Bkb3duPURvO01lLnZhcnNSZXNvbHZlcj1aYTtNZS5kaXNwbGF5TmFtZT0iQG1hbnRpbmUvY29yZS9Qb3BvdmVyIjtNZS5leHRlbmQ9ZT0+ZTtNZS53aXRoUHJvcHM9ZT0+e2NvbnN0IHQ9bj0+by5qc3goTWUsey4uLmUsLi4ubn0pO3JldHVybiB0LmV4dGVuZD1NZS5leHRlbmQsdC5kaXNwbGF5TmFtZT1gV2l0aFByb3BzKCR7TWUuZGlzcGxheU5hbWV9KWAsdH07dmFyIFVlPXtyb290OiJtXzVhZTJlM2MiLGJhcnNMb2FkZXI6Im1fN2EyYmQ0Y2QiLGJhcjoibV84NzBiYjc5IiwiYmFycy1sb2FkZXItYW5pbWF0aW9uIjoibV81ZDJiM2I5ZCIsZG90c0xvYWRlcjoibV80ZTNmMjJkNyIsZG90OiJtXzg3MGM0YWYiLCJsb2FkZXItZG90cy1hbmltYXRpb24iOiJtX2FhYzM0YTEiLG92YWxMb2FkZXI6Im1fYjM0NDE0ZGYiLCJvdmFsLWxvYWRlci1hbmltYXRpb24iOiJtX2Y4ZTg5YzRiIn07Y29uc3QgUWE9KHtjbGFzc05hbWU6ZSwuLi50fSk9Pm8uanN4cyhxLHtjb21wb25lbnQ6InNwYW4iLGNsYXNzTmFtZTpfZShVZS5iYXJzTG9hZGVyLGUpLC4uLnQsY2hpbGRyZW46W28uanN4KCJzcGFuIix7Y2xhc3NOYW1lOlVlLmJhcn0pLG8uanN4KCJzcGFuIix7Y2xhc3NOYW1lOlVlLmJhcn0pLG8uanN4KCJzcGFuIix7Y2xhc3NOYW1lOlVlLmJhcn0pXX0pO1FhLmRpc3BsYXlOYW1lPSJAbWFudGluZS9jb3JlL0JhcnMiO2NvbnN0IGVpPSh7Y2xhc3NOYW1lOmUsLi4udH0pPT5vLmpzeHMocSx7Y29tcG9uZW50OiJzcGFuIixjbGFzc05hbWU6X2UoVWUuZG90c0xvYWRlcixlKSwuLi50LGNoaWxkcmVuOltvLmpzeCgic3BhbiIse2NsYXNzTmFtZTpVZS5kb3R9KSxvLmpzeCgic3BhbiIse2NsYXNzTmFtZTpVZS5kb3R9KSxvLmpzeCgic3BhbiIse2NsYXNzTmFtZTpVZS5kb3R9KV19KTtlaS5kaXNwbGF5TmFtZT0iQG1hbnRpbmUvY29yZS9Eb3RzIjtjb25zdCB0aT0oe2NsYXNzTmFtZTplLC4uLnR9KT0+by5qc3gocSx7Y29tcG9uZW50OiJzcGFuIixjbGFzc05hbWU6X2UoVWUub3ZhbExvYWRlcixlKSwuLi50fSk7dGkuZGlzcGxheU5hbWU9IkBtYW50aW5lL2NvcmUvT3ZhbCI7Y29uc3Qgbmk9e2JhcnM6UWEsb3ZhbDp0aSxkb3RzOmVpfSx5Zj17bG9hZGVyczpuaSx0eXBlOiJvdmFsIn0scmk9KGUse3NpemU6dCxjb2xvcjpufSk9Pih7cm9vdDp7Ii0tbG9hZGVyLXNpemUiOm1lKHQsImxvYWRlci1zaXplIiksIi0tbG9hZGVyLWNvbG9yIjpuP3B0KG4sZSk6dm9pZCAwfX0pLGFuPVkoZT0+e2NvbnN0IHQ9TSgiTG9hZGVyIix5ZixlKSx7c2l6ZTpuLGNvbG9yOnIsdHlwZTpzLHZhcnM6YSxjbGFzc05hbWU6aSxzdHlsZTpsLGNsYXNzTmFtZXM6YyxzdHlsZXM6ZCx1bnN0eWxlZDp1LGxvYWRlcnM6Zix2YXJpYW50OnAsY2hpbGRyZW46aCxhdHRyaWJ1dGVzOnksLi4uZ309dCx2PXRlKHtuYW1lOiJMb2FkZXIiLHByb3BzOnQsY2xhc3NlczpVZSxjbGFzc05hbWU6aSxzdHlsZTpsLGNsYXNzTmFtZXM6YyxzdHlsZXM6ZCx1bnN0eWxlZDp1LGF0dHJpYnV0ZXM6eSx2YXJzOmEsdmFyc1Jlc29sdmVyOnJpfSk7cmV0dXJuIGg/by5qc3gocSx7Li4udigicm9vdCIpLC4uLmcsY2hpbGRyZW46aH0pOm8uanN4KHEsey4uLnYoInJvb3QiKSxjb21wb25lbnQ6ZltzXSx2YXJpYW50OnAsc2l6ZTpuLC4uLmd9KX0pO2FuLmRlZmF1bHRMb2FkZXJzPW5pO2FuLmNsYXNzZXM9VWU7YW4udmFyc1Jlc29sdmVyPXJpO2FuLmRpc3BsYXlOYW1lPSJAbWFudGluZS9jb3JlL0xvYWRlciI7ZnVuY3Rpb24gb2koe3NpemU6ZT0idmFyKC0tY2ItaWNvbi1zaXplLCA3MCUpIixzdHlsZTp0LC4uLm59KXtyZXR1cm4gby5qc3goInN2ZyIse3ZpZXdCb3g6IjAgMCAxNSAxNSIsZmlsbDoibm9uZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIixzdHlsZTp7Li4udCx3aWR0aDplLGhlaWdodDplfSwuLi5uLGNoaWxkcmVuOm8uanN4KCJwYXRoIix7ZDoiTTExLjc4MTYgNC4wMzE1N0MxMi4wMDYyIDMuODA3MDIgMTIuMDA2MiAzLjQ0Mjk1IDExLjc4MTYgMy4yMTg0QzExLjU1NzEgMi45OTM4NSAxMS4xOTMgMi45OTM4NSAxMC45Njg1IDMuMjE4NEw3LjUwMDA1IDYuNjg2ODJMNC4wMzE2NCAzLjIxODRDMy44MDcwOCAyLjk5Mzg1IDMuNDQzMDEgMi45OTM4NSAzLjIxODQ2IDMuMjE4NEMyLjk5MzkxIDMuNDQyOTUgMi45OTM5MSAzLjgwNzAyIDMuMjE4NDYgNC4wMzE1N0w2LjY4Njg4IDcuNDk5OTlMMy4yMTg0NiAxMC45Njg0QzIuOTkzOTEgMTEuMTkzIDIuOTkzOTEgMTEuNTU3IDMuMjE4NDYgMTEuNzgxNkMzLjQ0MzAxIDEyLjAwNjEgMy44MDcwOCAxMi4wMDYxIDQuMDMxNjQgMTEuNzgxNkw3LjUwMDA1IDguMzEzMTZMMTAuOTY4NSAxMS43ODE2QzExLjE5MyAxMi4wMDYxIDExLjU1NzEgMTIuMDA2MSAxMS43ODE2IDExLjc4MTZDMTIuMDA2MiAxMS41NTcgMTIuMDA2MiAxMS4xOTMgMTEuNzgxNiAxMC45Njg0TDguMzEzMjIgNy40OTk5OUwxMS43ODE2IDQuMDMxNTdaIixmaWxsOiJjdXJyZW50Q29sb3IiLGZpbGxSdWxlOiJldmVub2RkIixjbGlwUnVsZToiZXZlbm9kZCJ9KX0pfW9pLmRpc3BsYXlOYW1lPSJAbWFudGluZS9jb3JlL0Nsb3NlSWNvbiI7dmFyIHNpPXtyb290OiJtXzg2YTQ0ZGE1Iiwicm9vdC0tc3VidGxlIjoibV8yMjBjODBmMiJ9O2NvbnN0IHZmPXt2YXJpYW50OiJzdWJ0bGUifSxhaT0oZSx7c2l6ZTp0LHJhZGl1czpuLGljb25TaXplOnJ9KT0+KHtyb290OnsiLS1jYi1zaXplIjptZSh0LCJjYi1zaXplIiksIi0tY2ItcmFkaXVzIjpuPT09dm9pZCAwP3ZvaWQgMDptdChuKSwiLS1jYi1pY29uLXNpemUiOk4ocil9fSksX249Z3QoZT0+e2NvbnN0IHQ9TSgiQ2xvc2VCdXR0b24iLHZmLGUpLHtpY29uU2l6ZTpuLGNoaWxkcmVuOnIsdmFyczpzLHJhZGl1czphLGNsYXNzTmFtZTppLGNsYXNzTmFtZXM6bCxzdHlsZTpjLHN0eWxlczpkLHVuc3R5bGVkOnUsImRhdGEtZGlzYWJsZWQiOmYsZGlzYWJsZWQ6cCx2YXJpYW50OmgsaWNvbjp5LG1vZDpnLGF0dHJpYnV0ZXM6dixfX3N0YXRpY1NlbGVjdG9yOngsLi4uan09dCx3PXRlKHtuYW1lOnh8fCJDbG9zZUJ1dHRvbiIscHJvcHM6dCxjbGFzc05hbWU6aSxzdHlsZTpjLGNsYXNzZXM6c2ksY2xhc3NOYW1lczpsLHN0eWxlczpkLHVuc3R5bGVkOnUsYXR0cmlidXRlczp2LHZhcnM6cyx2YXJzUmVzb2x2ZXI6YWl9KTtyZXR1cm4gby5qc3hzKGZyLHsuLi5qLHVuc3R5bGVkOnUsdmFyaWFudDpoLGRpc2FibGVkOnAsbW9kOlt7ZGlzYWJsZWQ6cHx8Zn0sZ10sLi4udygicm9vdCIse3ZhcmlhbnQ6aCxhY3RpdmU6IXAmJiFmfSksY2hpbGRyZW46W3l8fG8uanN4KG9pLHt9KSxyXX0pfSk7X24uY2xhc3Nlcz1zaTtfbi52YXJzUmVzb2x2ZXI9YWk7X24uZGlzcGxheU5hbWU9IkBtYW50aW5lL2NvcmUvQ2xvc2VCdXR0b24iO2Z1bmN0aW9uIHhmKGUpe3JldHVybiBtLkNoaWxkcmVuLnRvQXJyYXkoZSkuZmlsdGVyKEJvb2xlYW4pfXZhciBpaT17cm9vdDoibV80MDgxYmY5MCJ9O2NvbnN0IHdmPXtwcmV2ZW50R3Jvd092ZXJmbG93OiEwLGdhcDoibWQiLGFsaWduOiJjZW50ZXIiLGp1c3RpZnk6ImZsZXgtc3RhcnQiLHdyYXA6IndyYXAifSxsaT0oZSx7Z3Jvdzp0LHByZXZlbnRHcm93T3ZlcmZsb3c6bixnYXA6cixhbGlnbjpzLGp1c3RpZnk6YSx3cmFwOml9LHtjaGlsZFdpZHRoOmx9KT0+KHtyb290OnsiLS1ncm91cC1jaGlsZC13aWR0aCI6dCYmbj9sOnZvaWQgMCwiLS1ncm91cC1nYXAiOkVlKHIpLCItLWdyb3VwLWFsaWduIjpzLCItLWdyb3VwLWp1c3RpZnkiOmEsIi0tZ3JvdXAtd3JhcCI6aX19KSxvZT1ZKGU9Pntjb25zdCB0PU0oIkdyb3VwIix3ZixlKSx7Y2xhc3NOYW1lczpuLGNsYXNzTmFtZTpyLHN0eWxlOnMsc3R5bGVzOmEsdW5zdHlsZWQ6aSxjaGlsZHJlbjpsLGdhcDpjLGFsaWduOmQsanVzdGlmeTp1LHdyYXA6Zixncm93OnAscHJldmVudEdyb3dPdmVyZmxvdzpoLHZhcnM6eSx2YXJpYW50OmcsX19zaXplOnYsbW9kOngsYXR0cmlidXRlczpqLC4uLnd9PXQsUz14ZihsKSxDPVMubGVuZ3RoLGs9RWUoYz8/Im1kIik7cmV0dXJuIG8uanN4KHEsey4uLnRlKHtuYW1lOiJHcm91cCIscHJvcHM6dCxzdHlsZXNDdHg6e2NoaWxkV2lkdGg6YGNhbGMoJHsxMDAvQ30lIC0gKCR7a30gLSAke2t9IC8gJHtDfSkpYH0sY2xhc3NOYW1lOnIsc3R5bGU6cyxjbGFzc2VzOmlpLGNsYXNzTmFtZXM6bixzdHlsZXM6YSx1bnN0eWxlZDppLGF0dHJpYnV0ZXM6aix2YXJzOnksdmFyc1Jlc29sdmVyOmxpfSkoInJvb3QiKSx2YXJpYW50OmcsbW9kOlt7Z3JvdzpwfSx4XSxzaXplOnYsLi4udyxjaGlsZHJlbjpTfSl9KTtvZS5jbGFzc2VzPWlpO29lLnZhcnNSZXNvbHZlcj1saTtvZS5kaXNwbGF5TmFtZT0iQG1hbnRpbmUvY29yZS9Hcm91cCI7Y29uc3RbamYseXRdPUx0KCJNb2RhbEJhc2UgY29tcG9uZW50IHdhcyBub3QgZm91bmQgaW4gdHJlZSIpO2Z1bmN0aW9uIFNmKHtvcGVuZWQ6ZSx0cmFuc2l0aW9uRHVyYXRpb246dH0pe2NvbnN0W24scl09bS51c2VTdGF0ZShlKSxzPW0udXNlUmVmKC0xKSxhPW5hKCk/MDp0O3JldHVybiBtLnVzZUVmZmVjdCgoKT0+KGU/KHIoITApLHdpbmRvdy5jbGVhclRpbWVvdXQocy5jdXJyZW50KSk6YT09PTA/cighMSk6cy5jdXJyZW50PXdpbmRvdy5zZXRUaW1lb3V0KCgpPT5yKCExKSxhKSwoKT0+d2luZG93LmNsZWFyVGltZW91dChzLmN1cnJlbnQpKSxbZSxhXSksbn1mdW5jdGlvbiBDZih7aWQ6ZSx0cmFuc2l0aW9uUHJvcHM6dCxvcGVuZWQ6bix0cmFwRm9jdXM6cixjbG9zZU9uRXNjYXBlOnMsb25DbG9zZTphLHJldHVybkZvY3VzOml9KXtjb25zdCBsPW5uKGUpLFtjLGRdPW0udXNlU3RhdGUoITEpLFt1LGZdPW0udXNlU3RhdGUoITEpLHA9U2Yoe29wZW5lZDpuLHRyYW5zaXRpb25EdXJhdGlvbjp0eXBlb2YgdD8uZHVyYXRpb249PSJudW1iZXIiP3Q/LmR1cmF0aW9uOjIwMH0pO3JldHVybiBzYygia2V5ZG93biIsaD0+e2gua2V5PT09IkVzY2FwZSImJnMmJiFoLmlzQ29tcG9zaW5nJiZuJiZoLnRhcmdldD8uZ2V0QXR0cmlidXRlKCJkYXRhLW1hbnRpbmUtc3RvcC1wcm9wYWdhdGlvbiIpIT09InRydWUiJiZhKCl9LHtjYXB0dXJlOiEwfSksWnMoe29wZW5lZDpuLHNob3VsZFJldHVybkZvY3VzOnImJml9KSx7X2lkOmwsdGl0bGVNb3VudGVkOmMsYm9keU1vdW50ZWQ6dSxzaG91bGRMb2NrU2Nyb2xsOnAsc2V0VGl0bGVNb3VudGVkOmQsc2V0Qm9keU1vdW50ZWQ6Zn19dmFyIHR0PWZ1bmN0aW9uKCl7cmV0dXJuIHR0PU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgbixyPTEscz1hcmd1bWVudHMubGVuZ3RoO3I8cztyKyspe249YXJndW1lbnRzW3JdO2Zvcih2YXIgYSBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLGEpJiYodFthXT1uW2FdKX1yZXR1cm4gdH0sdHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtmdW5jdGlvbiBjaShlLHQpe3ZhciBuPXt9O2Zvcih2YXIgciBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiZ0LmluZGV4T2Yocik8MCYmKG5bcl09ZVtyXSk7aWYoZSE9bnVsbCYmdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM9PSJmdW5jdGlvbiIpZm9yKHZhciBzPTAscj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO3M8ci5sZW5ndGg7cysrKXQuaW5kZXhPZihyW3NdKTwwJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSxyW3NdKSYmKG5bcltzXV09ZVtyW3NdXSk7cmV0dXJuIG59ZnVuY3Rpb24gTmYoZSx0LG4pe2lmKG58fGFyZ3VtZW50cy5sZW5ndGg9PT0yKWZvcih2YXIgcj0wLHM9dC5sZW5ndGgsYTtyPHM7cisrKShhfHwhKHIgaW4gdCkpJiYoYXx8KGE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCwwLHIpKSxhW3JdPXRbcl0pO3JldHVybiBlLmNvbmNhdChhfHxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0KSl9dmFyIFVuPSJyaWdodC1zY3JvbGwtYmFyLXBvc2l0aW9uIixHbj0id2lkdGgtYmVmb3JlLXNjcm9sbC1iYXIiLGtmPSJ3aXRoLXNjcm9sbC1iYXJzLWhpZGRlbiIsUmY9Ii0tcmVtb3ZlZC1ib2R5LXNjcm9sbC1iYXItc2l6ZSI7ZnVuY3Rpb24gV3IoZSx0KXtyZXR1cm4gdHlwZW9mIGU9PSJmdW5jdGlvbiI/ZSh0KTplJiYoZS5jdXJyZW50PXQpLGV9ZnVuY3Rpb24gX2YoZSx0KXt2YXIgbj1tLnVzZVN0YXRlKGZ1bmN0aW9uKCl7cmV0dXJue3ZhbHVlOmUsY2FsbGJhY2s6dCxmYWNhZGU6e2dldCBjdXJyZW50KCl7cmV0dXJuIG4udmFsdWV9LHNldCBjdXJyZW50KHIpe3ZhciBzPW4udmFsdWU7cyE9PXImJihuLnZhbHVlPXIsbi5jYWxsYmFjayhyLHMpKX19fX0pWzBdO3JldHVybiBuLmNhbGxiYWNrPXQsbi5mYWNhZGV9dmFyICRmPXR5cGVvZiB3aW5kb3c8InUiP20udXNlTGF5b3V0RWZmZWN0Om0udXNlRWZmZWN0LE9zPW5ldyBXZWFrTWFwO2Z1bmN0aW9uIFRmKGUsdCl7dmFyIG49X2YobnVsbCxmdW5jdGlvbihyKXtyZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uKHMpe3JldHVybiBXcihzLHIpfSl9KTtyZXR1cm4gJGYoZnVuY3Rpb24oKXt2YXIgcj1Pcy5nZXQobik7aWYocil7dmFyIHM9bmV3IFNldChyKSxhPW5ldyBTZXQoZSksaT1uLmN1cnJlbnQ7cy5mb3JFYWNoKGZ1bmN0aW9uKGwpe2EuaGFzKGwpfHxXcihsLG51bGwpfSksYS5mb3JFYWNoKGZ1bmN0aW9uKGwpe3MuaGFzKGwpfHxXcihsLGkpfSl9T3Muc2V0KG4sZSl9LFtlXSksbn1mdW5jdGlvbiBQZihlKXtyZXR1cm4gZX1mdW5jdGlvbiBFZihlLHQpe3Q9PT12b2lkIDAmJih0PVBmKTt2YXIgbj1bXSxyPSExLHM9e3JlYWQ6ZnVuY3Rpb24oKXtpZihyKXRocm93IG5ldyBFcnJvcigiU2lkZWNhcjogY291bGQgbm90IGByZWFkYCBmcm9tIGFuIGBhc3NpZ25lZGAgbWVkaXVtLiBgcmVhZGAgY291bGQgYmUgdXNlZCBvbmx5IHdpdGggYHVzZU1lZGl1bWAuIik7cmV0dXJuIG4ubGVuZ3RoP25bbi5sZW5ndGgtMV06ZX0sdXNlTWVkaXVtOmZ1bmN0aW9uKGEpe3ZhciBpPXQoYSxyKTtyZXR1cm4gbi5wdXNoKGkpLGZ1bmN0aW9uKCl7bj1uLmZpbHRlcihmdW5jdGlvbihsKXtyZXR1cm4gbCE9PWl9KX19LGFzc2lnblN5bmNNZWRpdW06ZnVuY3Rpb24oYSl7Zm9yKHI9ITA7bi5sZW5ndGg7KXt2YXIgaT1uO249W10saS5mb3JFYWNoKGEpfW49e3B1c2g6ZnVuY3Rpb24obCl7cmV0dXJuIGEobCl9LGZpbHRlcjpmdW5jdGlvbigpe3JldHVybiBufX19LGFzc2lnbk1lZGl1bTpmdW5jdGlvbihhKXtyPSEwO3ZhciBpPVtdO2lmKG4ubGVuZ3RoKXt2YXIgbD1uO249W10sbC5mb3JFYWNoKGEpLGk9bn12YXIgYz1mdW5jdGlvbigpe3ZhciB1PWk7aT1bXSx1LmZvckVhY2goYSl9LGQ9ZnVuY3Rpb24oKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihjKX07ZCgpLG49e3B1c2g6ZnVuY3Rpb24odSl7aS5wdXNoKHUpLGQoKX0sZmlsdGVyOmZ1bmN0aW9uKHUpe3JldHVybiBpPWkuZmlsdGVyKHUpLG59fX19O3JldHVybiBzfWZ1bmN0aW9uIEFmKGUpe2U9PT12b2lkIDAmJihlPXt9KTt2YXIgdD1FZihudWxsKTtyZXR1cm4gdC5vcHRpb25zPXR0KHthc3luYzohMCxzc3I6ITF9LGUpLHR9dmFyIGRpPWZ1bmN0aW9uKGUpe3ZhciB0PWUuc2lkZUNhcixuPWNpKGUsWyJzaWRlQ2FyIl0pO2lmKCF0KXRocm93IG5ldyBFcnJvcigiU2lkZWNhcjogcGxlYXNlIHByb3ZpZGUgYHNpZGVDYXJgIHByb3BlcnR5IHRvIGltcG9ydCB0aGUgcmlnaHQgY2FyIik7dmFyIHI9dC5yZWFkKCk7aWYoIXIpdGhyb3cgbmV3IEVycm9yKCJTaWRlY2FyIG1lZGl1bSBub3QgZm91bmQiKTtyZXR1cm4gbS5jcmVhdGVFbGVtZW50KHIsdHQoe30sbikpfTtkaS5pc1NpZGVDYXJFeHBvcnQ9ITA7ZnVuY3Rpb24gT2YoZSx0KXtyZXR1cm4gZS51c2VNZWRpdW0odCksZGl9dmFyIHVpPUFmKCksSHI9ZnVuY3Rpb24oKXt9LGhyPW0uZm9yd2FyZFJlZihmdW5jdGlvbihlLHQpe3ZhciBuPW0udXNlUmVmKG51bGwpLHI9bS51c2VTdGF0ZSh7b25TY3JvbGxDYXB0dXJlOkhyLG9uV2hlZWxDYXB0dXJlOkhyLG9uVG91Y2hNb3ZlQ2FwdHVyZTpIcn0pLHM9clswXSxhPXJbMV0saT1lLmZvcndhcmRQcm9wcyxsPWUuY2hpbGRyZW4sYz1lLmNsYXNzTmFtZSxkPWUucmVtb3ZlU2Nyb2xsQmFyLHU9ZS5lbmFibGVkLGY9ZS5zaGFyZHMscD1lLnNpZGVDYXIsaD1lLm5vUmVsYXRpdmUseT1lLm5vSXNvbGF0aW9uLGc9ZS5pbmVydCx2PWUuYWxsb3dQaW5jaFpvb20seD1lLmFzLGo9eD09PXZvaWQgMD8iZGl2Ijp4LHc9ZS5nYXBNb2RlLFM9Y2koZSxbImZvcndhcmRQcm9wcyIsImNoaWxkcmVuIiwiY2xhc3NOYW1lIiwicmVtb3ZlU2Nyb2xsQmFyIiwiZW5hYmxlZCIsInNoYXJkcyIsInNpZGVDYXIiLCJub1JlbGF0aXZlIiwibm9Jc29sYXRpb24iLCJpbmVydCIsImFsbG93UGluY2hab29tIiwiYXMiLCJnYXBNb2RlIl0pLEM9cCxrPVRmKFtuLHRdKSxfPXR0KHR0KHt9LFMpLHMpO3JldHVybiBtLmNyZWF0ZUVsZW1lbnQobS5GcmFnbWVudCxudWxsLHUmJm0uY3JlYXRlRWxlbWVudChDLHtzaWRlQ2FyOnVpLHJlbW92ZVNjcm9sbEJhcjpkLHNoYXJkczpmLG5vUmVsYXRpdmU6aCxub0lzb2xhdGlvbjp5LGluZXJ0Omcsc2V0Q2FsbGJhY2tzOmEsYWxsb3dQaW5jaFpvb206ISF2LGxvY2tSZWY6bixnYXBNb2RlOnd9KSxpP20uY2xvbmVFbGVtZW50KG0uQ2hpbGRyZW4ub25seShsKSx0dCh0dCh7fSxfKSx7cmVmOmt9KSk6bS5jcmVhdGVFbGVtZW50KGosdHQoe30sXyx7Y2xhc3NOYW1lOmMscmVmOmt9KSxsKSl9KTtoci5kZWZhdWx0UHJvcHM9e2VuYWJsZWQ6ITAscmVtb3ZlU2Nyb2xsQmFyOiEwLGluZXJ0OiExfTtoci5jbGFzc05hbWVzPXtmdWxsV2lkdGg6R24semVyb1JpZ2h0OlVufTt2YXIgTWY9ZnVuY3Rpb24oKXtpZih0eXBlb2YgX193ZWJwYWNrX25vbmNlX188InUiKXJldHVybiBfX3dlYnBhY2tfbm9uY2VfX307ZnVuY3Rpb24gRGYoKXtpZighZG9jdW1lbnQpcmV0dXJuIG51bGw7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtlLnR5cGU9InRleHQvY3NzIjt2YXIgdD1NZigpO3JldHVybiB0JiZlLnNldEF0dHJpYnV0ZSgibm9uY2UiLHQpLGV9ZnVuY3Rpb24gTGYoZSx0KXtlLnN0eWxlU2hlZXQ/ZS5zdHlsZVNoZWV0LmNzc1RleHQ9dDplLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHQpKX1mdW5jdGlvbiBGZihlKXt2YXIgdD1kb2N1bWVudC5oZWFkfHxkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdO3QuYXBwZW5kQ2hpbGQoZSl9dmFyIElmPWZ1bmN0aW9uKCl7dmFyIGU9MCx0PW51bGw7cmV0dXJue2FkZDpmdW5jdGlvbihuKXtlPT0wJiYodD1EZigpKSYmKExmKHQsbiksRmYodCkpLGUrK30scmVtb3ZlOmZ1bmN0aW9uKCl7ZS0tLCFlJiZ0JiYodC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCksdD1udWxsKX19fSx6Zj1mdW5jdGlvbigpe3ZhciBlPUlmKCk7cmV0dXJuIGZ1bmN0aW9uKHQsbil7bS51c2VFZmZlY3QoZnVuY3Rpb24oKXtyZXR1cm4gZS5hZGQodCksZnVuY3Rpb24oKXtlLnJlbW92ZSgpfX0sW3QmJm5dKX19LGZpPWZ1bmN0aW9uKCl7dmFyIGU9emYoKSx0PWZ1bmN0aW9uKG4pe3ZhciByPW4uc3R5bGVzLHM9bi5keW5hbWljO3JldHVybiBlKHIscyksbnVsbH07cmV0dXJuIHR9LEJmPXtsZWZ0OjAsdG9wOjAscmlnaHQ6MCxnYXA6MH0scXI9ZnVuY3Rpb24oZSl7cmV0dXJuIHBhcnNlSW50KGV8fCIiLDEwKXx8MH0sVmY9ZnVuY3Rpb24oZSl7dmFyIHQ9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSksbj10W2U9PT0icGFkZGluZyI/InBhZGRpbmdMZWZ0IjoibWFyZ2luTGVmdCJdLHI9dFtlPT09InBhZGRpbmciPyJwYWRkaW5nVG9wIjoibWFyZ2luVG9wIl0scz10W2U9PT0icGFkZGluZyI/InBhZGRpbmdSaWdodCI6Im1hcmdpblJpZ2h0Il07cmV0dXJuW3FyKG4pLHFyKHIpLHFyKHMpXX0sV2Y9ZnVuY3Rpb24oZSl7aWYoZT09PXZvaWQgMCYmKGU9Im1hcmdpbiIpLHR5cGVvZiB3aW5kb3c+InUiKXJldHVybiBCZjt2YXIgdD1WZihlKSxuPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCxyPXdpbmRvdy5pbm5lcldpZHRoO3JldHVybntsZWZ0OnRbMF0sdG9wOnRbMV0scmlnaHQ6dFsyXSxnYXA6TWF0aC5tYXgoMCxyLW4rdFsyXS10WzBdKX19LEhmPWZpKCksSnQ9ImRhdGEtc2Nyb2xsLWxvY2tlZCIscWY9ZnVuY3Rpb24oZSx0LG4scil7dmFyIHM9ZS5sZWZ0LGE9ZS50b3AsaT1lLnJpZ2h0LGw9ZS5nYXA7cmV0dXJuIG49PT12b2lkIDAmJihuPSJtYXJnaW4iKSxgCiAgLmAuY29uY2F0KGtmLGAgewogICBvdmVyZmxvdzogaGlkZGVuIGApLmNvbmNhdChyLGA7CiAgIHBhZGRpbmctcmlnaHQ6IGApLmNvbmNhdChsLCJweCAiKS5jb25jYXQocixgOwogIH0KICBib2R5W2ApLmNvbmNhdChKdCxgXSB7CiAgICBvdmVyZmxvdzogaGlkZGVuIGApLmNvbmNhdChyLGA7CiAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluOwogICAgYCkuY29uY2F0KFt0JiYicG9zaXRpb246IHJlbGF0aXZlICIuY29uY2F0KHIsIjsiKSxuPT09Im1hcmdpbiImJmAKICAgIHBhZGRpbmctbGVmdDogYC5jb25jYXQocyxgcHg7CiAgICBwYWRkaW5nLXRvcDogYCkuY29uY2F0KGEsYHB4OwogICAgcGFkZGluZy1yaWdodDogYCkuY29uY2F0KGksYHB4OwogICAgbWFyZ2luLWxlZnQ6MDsKICAgIG1hcmdpbi10b3A6MDsKICAgIG1hcmdpbi1yaWdodDogYCkuY29uY2F0KGwsInB4ICIpLmNvbmNhdChyLGA7CiAgICBgKSxuPT09InBhZGRpbmciJiYicGFkZGluZy1yaWdodDogIi5jb25jYXQobCwicHggIikuY29uY2F0KHIsIjsiKV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oIiIpLGAKICB9CiAgCiAgLmApLmNvbmNhdChVbixgIHsKICAgIHJpZ2h0OiBgKS5jb25jYXQobCwicHggIikuY29uY2F0KHIsYDsKICB9CiAgCiAgLmApLmNvbmNhdChHbixgIHsKICAgIG1hcmdpbi1yaWdodDogYCkuY29uY2F0KGwsInB4ICIpLmNvbmNhdChyLGA7CiAgfQogIAogIC5gKS5jb25jYXQoVW4sIiAuIikuY29uY2F0KFVuLGAgewogICAgcmlnaHQ6IDAgYCkuY29uY2F0KHIsYDsKICB9CiAgCiAgLmApLmNvbmNhdChHbiwiIC4iKS5jb25jYXQoR24sYCB7CiAgICBtYXJnaW4tcmlnaHQ6IDAgYCkuY29uY2F0KHIsYDsKICB9CiAgCiAgYm9keVtgKS5jb25jYXQoSnQsYF0gewogICAgYCkuY29uY2F0KFJmLCI6ICIpLmNvbmNhdChsLGBweDsKICB9CmApfSxNcz1mdW5jdGlvbigpe3ZhciBlPXBhcnNlSW50KGRvY3VtZW50LmJvZHkuZ2V0QXR0cmlidXRlKEp0KXx8IjAiLDEwKTtyZXR1cm4gaXNGaW5pdGUoZSk/ZTowfSxZZj1mdW5jdGlvbigpe20udXNlRWZmZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmJvZHkuc2V0QXR0cmlidXRlKEp0LChNcygpKzEpLnRvU3RyaW5nKCkpLGZ1bmN0aW9uKCl7dmFyIGU9TXMoKS0xO2U8PTA/ZG9jdW1lbnQuYm9keS5yZW1vdmVBdHRyaWJ1dGUoSnQpOmRvY3VtZW50LmJvZHkuc2V0QXR0cmlidXRlKEp0LGUudG9TdHJpbmcoKSl9fSxbXSl9LFVmPWZ1bmN0aW9uKGUpe3ZhciB0PWUubm9SZWxhdGl2ZSxuPWUubm9JbXBvcnRhbnQscj1lLmdhcE1vZGUscz1yPT09dm9pZCAwPyJtYXJnaW4iOnI7WWYoKTt2YXIgYT1tLnVzZU1lbW8oZnVuY3Rpb24oKXtyZXR1cm4gV2Yocyl9LFtzXSk7cmV0dXJuIG0uY3JlYXRlRWxlbWVudChIZix7c3R5bGVzOnFmKGEsIXQscyxuPyIiOiIhaW1wb3J0YW50Iil9KX0saW89ITE7aWYodHlwZW9mIHdpbmRvdzwidSIpdHJ5e3ZhciBXbj1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sInBhc3NpdmUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaW89ITAsITB9fSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLFduLFduKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGVzdCIsV24sV24pfWNhdGNoe2lvPSExfXZhciBxdD1pbz97cGFzc2l2ZTohMX06ITEsR2Y9ZnVuY3Rpb24oZSl7cmV0dXJuIGUudGFnTmFtZT09PSJURVhUQVJFQSJ9LHBpPWZ1bmN0aW9uKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgRWxlbWVudCkpcmV0dXJuITE7dmFyIG49d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSk7cmV0dXJuIG5bdF0hPT0iaGlkZGVuIiYmIShuLm92ZXJmbG93WT09PW4ub3ZlcmZsb3dYJiYhR2YoZSkmJm5bdF09PT0idmlzaWJsZSIpfSxYZj1mdW5jdGlvbihlKXtyZXR1cm4gcGkoZSwib3ZlcmZsb3dZIil9LEtmPWZ1bmN0aW9uKGUpe3JldHVybiBwaShlLCJvdmVyZmxvd1giKX0sRHM9ZnVuY3Rpb24oZSx0KXt2YXIgbj10Lm93bmVyRG9jdW1lbnQscj10O2Rve3R5cGVvZiBTaGFkb3dSb290PCJ1IiYmciBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QmJihyPXIuaG9zdCk7dmFyIHM9bWkoZSxyKTtpZihzKXt2YXIgYT1oaShlLHIpLGk9YVsxXSxsPWFbMl07aWYoaT5sKXJldHVybiEwfXI9ci5wYXJlbnROb2RlfXdoaWxlKHImJnIhPT1uLmJvZHkpO3JldHVybiExfSxKZj1mdW5jdGlvbihlKXt2YXIgdD1lLnNjcm9sbFRvcCxuPWUuc2Nyb2xsSGVpZ2h0LHI9ZS5jbGllbnRIZWlnaHQ7cmV0dXJuW3QsbixyXX0sWmY9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zY3JvbGxMZWZ0LG49ZS5zY3JvbGxXaWR0aCxyPWUuY2xpZW50V2lkdGg7cmV0dXJuW3QsbixyXX0sbWk9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT09PSJ2Ij9YZih0KTpLZih0KX0saGk9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT09PSJ2Ij9KZih0KTpaZih0KX0sUWY9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT09PSJoIiYmdD09PSJydGwiPy0xOjF9LGVwPWZ1bmN0aW9uKGUsdCxuLHIscyl7dmFyIGE9UWYoZSx3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KS5kaXJlY3Rpb24pLGk9YSpyLGw9bi50YXJnZXQsYz10LmNvbnRhaW5zKGwpLGQ9ITEsdT1pPjAsZj0wLHA9MDtkb3tpZighbClicmVhazt2YXIgaD1oaShlLGwpLHk9aFswXSxnPWhbMV0sdj1oWzJdLHg9Zy12LWEqeTsoeXx8eCkmJm1pKGUsbCkmJihmKz14LHArPXkpO3ZhciBqPWwucGFyZW50Tm9kZTtsPWomJmoubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU/ai5ob3N0Omp9d2hpbGUoIWMmJmwhPT1kb2N1bWVudC5ib2R5fHxjJiYodC5jb250YWlucyhsKXx8dD09PWwpKTtyZXR1cm4odSYmTWF0aC5hYnMoZik8MXx8IXUmJk1hdGguYWJzKHApPDEpJiYoZD0hMCksZH0sSG49ZnVuY3Rpb24oZSl7cmV0dXJuImNoYW5nZWRUb3VjaGVzImluIGU/W2UuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WCxlLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFldOlswLDBdfSxMcz1mdW5jdGlvbihlKXtyZXR1cm5bZS5kZWx0YVgsZS5kZWx0YVldfSxGcz1mdW5jdGlvbihlKXtyZXR1cm4gZSYmImN1cnJlbnQiaW4gZT9lLmN1cnJlbnQ6ZX0sdHA9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZVswXT09PXRbMF0mJmVbMV09PT10WzFdfSxucD1mdW5jdGlvbihlKXtyZXR1cm5gCiAgLmJsb2NrLWludGVyYWN0aXZpdHktYC5jb25jYXQoZSxgIHtwb2ludGVyLWV2ZW50czogbm9uZTt9CiAgLmFsbG93LWludGVyYWN0aXZpdHktYCkuY29uY2F0KGUsYCB7cG9pbnRlci1ldmVudHM6IGFsbDt9CmApfSxycD0wLFl0PVtdO2Z1bmN0aW9uIG9wKGUpe3ZhciB0PW0udXNlUmVmKFtdKSxuPW0udXNlUmVmKFswLDBdKSxyPW0udXNlUmVmKCkscz1tLnVzZVN0YXRlKHJwKyspWzBdLGE9bS51c2VTdGF0ZShmaSlbMF0saT1tLnVzZVJlZihlKTttLnVzZUVmZmVjdChmdW5jdGlvbigpe2kuY3VycmVudD1lfSxbZV0pLG0udXNlRWZmZWN0KGZ1bmN0aW9uKCl7aWYoZS5pbmVydCl7ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJibG9jay1pbnRlcmFjdGl2aXR5LSIuY29uY2F0KHMpKTt2YXIgZz1OZihbZS5sb2NrUmVmLmN1cnJlbnRdLChlLnNoYXJkc3x8W10pLm1hcChGcyksITApLmZpbHRlcihCb29sZWFuKTtyZXR1cm4gZy5mb3JFYWNoKGZ1bmN0aW9uKHYpe3JldHVybiB2LmNsYXNzTGlzdC5hZGQoImFsbG93LWludGVyYWN0aXZpdHktIi5jb25jYXQocykpfSksZnVuY3Rpb24oKXtkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoImJsb2NrLWludGVyYWN0aXZpdHktIi5jb25jYXQocykpLGcuZm9yRWFjaChmdW5jdGlvbih2KXtyZXR1cm4gdi5jbGFzc0xpc3QucmVtb3ZlKCJhbGxvdy1pbnRlcmFjdGl2aXR5LSIuY29uY2F0KHMpKX0pfX19LFtlLmluZXJ0LGUubG9ja1JlZi5jdXJyZW50LGUuc2hhcmRzXSk7dmFyIGw9bS51c2VDYWxsYmFjayhmdW5jdGlvbihnLHYpe2lmKCJ0b3VjaGVzImluIGcmJmcudG91Y2hlcy5sZW5ndGg9PT0yfHxnLnR5cGU9PT0id2hlZWwiJiZnLmN0cmxLZXkpcmV0dXJuIWkuY3VycmVudC5hbGxvd1BpbmNoWm9vbTt2YXIgeD1IbihnKSxqPW4uY3VycmVudCx3PSJkZWx0YVgiaW4gZz9nLmRlbHRhWDpqWzBdLXhbMF0sUz0iZGVsdGFZImluIGc/Zy5kZWx0YVk6alsxXS14WzFdLEMsaz1nLnRhcmdldCxfPU1hdGguYWJzKHcpPk1hdGguYWJzKFMpPyJoIjoidiI7aWYoInRvdWNoZXMiaW4gZyYmXz09PSJoIiYmay50eXBlPT09InJhbmdlIilyZXR1cm4hMTt2YXIgJD13aW5kb3cuZ2V0U2VsZWN0aW9uKCksTz0kJiYkLmFuY2hvck5vZGUsVD1PP089PT1rfHxPLmNvbnRhaW5zKGspOiExO2lmKFQpcmV0dXJuITE7dmFyIEE9RHMoXyxrKTtpZighQSlyZXR1cm4hMDtpZihBP0M9XzooQz1fPT09InYiPyJoIjoidiIsQT1EcyhfLGspKSwhQSlyZXR1cm4hMTtpZighci5jdXJyZW50JiYiY2hhbmdlZFRvdWNoZXMiaW4gZyYmKHd8fFMpJiYoci5jdXJyZW50PUMpLCFDKXJldHVybiEwO3ZhciBEPXIuY3VycmVudHx8QztyZXR1cm4gZXAoRCx2LGcsRD09PSJoIj93OlMpfSxbXSksYz1tLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKGcpe3ZhciB2PWc7aWYoISghWXQubGVuZ3RofHxZdFtZdC5sZW5ndGgtMV0hPT1hKSl7dmFyIHg9ImRlbHRhWSJpbiB2P0xzKHYpOkhuKHYpLGo9dC5jdXJyZW50LmZpbHRlcihmdW5jdGlvbihDKXtyZXR1cm4gQy5uYW1lPT09di50eXBlJiYoQy50YXJnZXQ9PT12LnRhcmdldHx8di50YXJnZXQ9PT1DLnNoYWRvd1BhcmVudCkmJnRwKEMuZGVsdGEseCl9KVswXTtpZihqJiZqLnNob3VsZCl7di5jYW5jZWxhYmxlJiZ2LnByZXZlbnREZWZhdWx0KCk7cmV0dXJufWlmKCFqKXt2YXIgdz0oaS5jdXJyZW50LnNoYXJkc3x8W10pLm1hcChGcykuZmlsdGVyKEJvb2xlYW4pLmZpbHRlcihmdW5jdGlvbihDKXtyZXR1cm4gQy5jb250YWlucyh2LnRhcmdldCl9KSxTPXcubGVuZ3RoPjA/bCh2LHdbMF0pOiFpLmN1cnJlbnQubm9Jc29sYXRpb247UyYmdi5jYW5jZWxhYmxlJiZ2LnByZXZlbnREZWZhdWx0KCl9fX0sW10pLGQ9bS51c2VDYWxsYmFjayhmdW5jdGlvbihnLHYseCxqKXt2YXIgdz17bmFtZTpnLGRlbHRhOnYsdGFyZ2V0Ongsc2hvdWxkOmosc2hhZG93UGFyZW50OnNwKHgpfTt0LmN1cnJlbnQucHVzaCh3KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5jdXJyZW50PXQuY3VycmVudC5maWx0ZXIoZnVuY3Rpb24oUyl7cmV0dXJuIFMhPT13fSl9LDEpfSxbXSksdT1tLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKGcpe24uY3VycmVudD1IbihnKSxyLmN1cnJlbnQ9dm9pZCAwfSxbXSksZj1tLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKGcpe2QoZy50eXBlLExzKGcpLGcudGFyZ2V0LGwoZyxlLmxvY2tSZWYuY3VycmVudCkpfSxbXSkscD1tLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKGcpe2QoZy50eXBlLEhuKGcpLGcudGFyZ2V0LGwoZyxlLmxvY2tSZWYuY3VycmVudCkpfSxbXSk7bS51c2VFZmZlY3QoZnVuY3Rpb24oKXtyZXR1cm4gWXQucHVzaChhKSxlLnNldENhbGxiYWNrcyh7b25TY3JvbGxDYXB0dXJlOmYsb25XaGVlbENhcHR1cmU6ZixvblRvdWNoTW92ZUNhcHR1cmU6cH0pLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIndoZWVsIixjLHF0KSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLGMscXQpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHUscXQpLGZ1bmN0aW9uKCl7WXQ9WXQuZmlsdGVyKGZ1bmN0aW9uKGcpe3JldHVybiBnIT09YX0pLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIndoZWVsIixjLHF0KSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLGMscXQpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHUscXQpfX0sW10pO3ZhciBoPWUucmVtb3ZlU2Nyb2xsQmFyLHk9ZS5pbmVydDtyZXR1cm4gbS5jcmVhdGVFbGVtZW50KG0uRnJhZ21lbnQsbnVsbCx5P20uY3JlYXRlRWxlbWVudChhLHtzdHlsZXM6bnAocyl9KTpudWxsLGg/bS5jcmVhdGVFbGVtZW50KFVmLHtub1JlbGF0aXZlOmUubm9SZWxhdGl2ZSxnYXBNb2RlOmUuZ2FwTW9kZX0pOm51bGwpfWZ1bmN0aW9uIHNwKGUpe2Zvcih2YXIgdD1udWxsO2UhPT1udWxsOyllIGluc3RhbmNlb2YgU2hhZG93Um9vdCYmKHQ9ZS5ob3N0LGU9ZS5ob3N0KSxlPWUucGFyZW50Tm9kZTtyZXR1cm4gdH1jb25zdCBhcD1PZih1aSxvcCk7dmFyIGdpPW0uZm9yd2FyZFJlZihmdW5jdGlvbihlLHQpe3JldHVybiBtLmNyZWF0ZUVsZW1lbnQoaHIsdHQoe30sZSx7cmVmOnQsc2lkZUNhcjphcH0pKX0pO2dpLmNsYXNzTmFtZXM9aHIuY2xhc3NOYW1lcztmdW5jdGlvbiBiaSh7a2VlcE1vdW50ZWQ6ZSxvcGVuZWQ6dCxvbkNsb3NlOm4saWQ6cix0cmFuc2l0aW9uUHJvcHM6cyxvbkV4aXRUcmFuc2l0aW9uRW5kOmEsb25FbnRlclRyYW5zaXRpb25FbmQ6aSx0cmFwRm9jdXM6bCxjbG9zZU9uRXNjYXBlOmMscmV0dXJuRm9jdXM6ZCxjbG9zZU9uQ2xpY2tPdXRzaWRlOnUsd2l0aGluUG9ydGFsOmYscG9ydGFsUHJvcHM6cCxsb2NrU2Nyb2xsOmgsY2hpbGRyZW46eSx6SW5kZXg6ZyxzaGFkb3c6dixwYWRkaW5nOngsX192YXJzOmosdW5zdHlsZWQ6dyxyZW1vdmVTY3JvbGxQcm9wczpTLC4uLkN9KXtjb25zdHtfaWQ6ayx0aXRsZU1vdW50ZWQ6Xyxib2R5TW91bnRlZDokLHNob3VsZExvY2tTY3JvbGw6TyxzZXRUaXRsZU1vdW50ZWQ6VCxzZXRCb2R5TW91bnRlZDpBfT1DZih7aWQ6cix0cmFuc2l0aW9uUHJvcHM6cyxvcGVuZWQ6dCx0cmFwRm9jdXM6bCxjbG9zZU9uRXNjYXBlOmMsb25DbG9zZTpuLHJldHVybkZvY3VzOmR9KSx7a2V5OkQsLi4uVn09U3x8e307cmV0dXJuIG8uanN4KHByLHsuLi5wLHdpdGhpblBvcnRhbDpmLGNoaWxkcmVuOm8uanN4KGpmLHt2YWx1ZTp7b3BlbmVkOnQsb25DbG9zZTpuLGNsb3NlT25DbGlja091dHNpZGU6dSxvbkV4aXRUcmFuc2l0aW9uRW5kOmEsb25FbnRlclRyYW5zaXRpb25FbmQ6aSx0cmFuc2l0aW9uUHJvcHM6ey4uLnMsa2VlcE1vdW50ZWQ6ZX0sZ2V0VGl0bGVJZDooKT0+YCR7a30tdGl0bGVgLGdldEJvZHlJZDooKT0+YCR7a30tYm9keWAsdGl0bGVNb3VudGVkOl8sYm9keU1vdW50ZWQ6JCxzZXRUaXRsZU1vdW50ZWQ6VCxzZXRCb2R5TW91bnRlZDpBLHRyYXBGb2N1czpsLGNsb3NlT25Fc2NhcGU6Yyx6SW5kZXg6Zyx1bnN0eWxlZDp3fSxjaGlsZHJlbjpvLmpzeChnaSx7ZW5hYmxlZDpPJiZoLC4uLlYsY2hpbGRyZW46by5qc3gocSx7Li4uQyxpZDprLF9fdmFyczp7Li4uaiwiLS1tYi16LWluZGV4IjooZ3x8RnQoIm1vZGFsIikpLnRvU3RyaW5nKCksIi0tbWItc2hhZG93Ijpwbyh2KSwiLS1tYi1wYWRkaW5nIjpFZSh4KX0sY2hpbGRyZW46eX0pfSxEKX0pfSl9YmkuZGlzcGxheU5hbWU9IkBtYW50aW5lL2NvcmUvTW9kYWxCYXNlIjtmdW5jdGlvbiBpcCgpe2NvbnN0IGU9eXQoKTtyZXR1cm4gbS51c2VFZmZlY3QoKCk9PihlLnNldEJvZHlNb3VudGVkKCEwKSwoKT0+ZS5zZXRCb2R5TW91bnRlZCghMSkpLFtdKSxlLmdldEJvZHlJZCgpfXZhciB0bj17dGl0bGU6Im1fNjE1YWY2YzkiLGhlYWRlcjoibV9iNTQ4OWMzYyIsaW5uZXI6Im1fNjBjMjIyYzciLGNvbnRlbnQ6Im1fZmQxYWIwYWEiLGNsb3NlOiJtXzYwNmNiMjY5Iixib2R5OiJtXzVkZjI5MzExIn07ZnVuY3Rpb24geWkoe2NsYXNzTmFtZTplLC4uLnR9KXtjb25zdCBuPWlwKCkscj15dCgpO3JldHVybiBvLmpzeChxLHtpZDpuLGNsYXNzTmFtZTpfZSh7W3RuLmJvZHldOiFyLnVuc3R5bGVkfSxlKSwuLi50fSl9eWkuZGlzcGxheU5hbWU9IkBtYW50aW5lL2NvcmUvTW9kYWxCYXNlQm9keSI7ZnVuY3Rpb24gdmkoe2NsYXNzTmFtZTplLG9uQ2xpY2s6dCwuLi5ufSl7Y29uc3Qgcj15dCgpO3JldHVybiBvLmpzeChfbix7Li4ubixvbkNsaWNrOnM9PntyLm9uQ2xvc2UoKSx0Py4ocyl9LGNsYXNzTmFtZTpfZSh7W3RuLmNsb3NlXTohci51bnN0eWxlZH0sZSksdW5zdHlsZWQ6ci51bnN0eWxlZH0pfXZpLmRpc3BsYXlOYW1lPSJAbWFudGluZS9jb3JlL01vZGFsQmFzZUNsb3NlQnV0dG9uIjtmdW5jdGlvbiB4aSh7dHJhbnNpdGlvblByb3BzOmUsY2xhc3NOYW1lOnQsaW5uZXJQcm9wczpuLG9uS2V5RG93bjpyLHN0eWxlOnMscmVmOmEsLi4uaX0pe2NvbnN0IGw9eXQoKTtyZXR1cm4gby5qc3goc24se21vdW50ZWQ6bC5vcGVuZWQsdHJhbnNpdGlvbjoicG9wIiwuLi5sLnRyYW5zaXRpb25Qcm9wcyxvbkV4aXRlZDooKT0+e2wub25FeGl0VHJhbnNpdGlvbkVuZD8uKCksbC50cmFuc2l0aW9uUHJvcHM/Lm9uRXhpdGVkPy4oKX0sb25FbnRlcmVkOigpPT57bC5vbkVudGVyVHJhbnNpdGlvbkVuZD8uKCksbC50cmFuc2l0aW9uUHJvcHM/Lm9uRW50ZXJlZD8uKCl9LC4uLmUsY2hpbGRyZW46Yz0+by5qc3goImRpdiIsey4uLm4sY2xhc3NOYW1lOl9lKHtbdG4uaW5uZXJdOiFsLnVuc3R5bGVkfSxuLmNsYXNzTmFtZSksY2hpbGRyZW46by5qc3gobXIse2FjdGl2ZTpsLm9wZW5lZCYmbC50cmFwRm9jdXMsaW5uZXJSZWY6YSxjaGlsZHJlbjpvLmpzeChlbix7Li4uaSxjb21wb25lbnQ6InNlY3Rpb24iLHJvbGU6ImRpYWxvZyIsdGFiSW5kZXg6LTEsImFyaWEtbW9kYWwiOiEwLCJhcmlhLWRlc2NyaWJlZGJ5IjpsLmJvZHlNb3VudGVkP2wuZ2V0Qm9keUlkKCk6dm9pZCAwLCJhcmlhLWxhYmVsbGVkYnkiOmwudGl0bGVNb3VudGVkP2wuZ2V0VGl0bGVJZCgpOnZvaWQgMCxzdHlsZTpbcyxjXSxjbGFzc05hbWU6X2Uoe1t0bi5jb250ZW50XTohbC51bnN0eWxlZH0sdCksdW5zdHlsZWQ6bC51bnN0eWxlZCxjaGlsZHJlbjppLmNoaWxkcmVufSl9KX0pfSl9eGkuZGlzcGxheU5hbWU9IkBtYW50aW5lL2NvcmUvTW9kYWxCYXNlQ29udGVudCI7ZnVuY3Rpb24gd2koe2NsYXNzTmFtZTplLC4uLnR9KXtjb25zdCBuPXl0KCk7cmV0dXJuIG8uanN4KHEse2NvbXBvbmVudDoiaGVhZGVyIixjbGFzc05hbWU6X2Uoe1t0bi5oZWFkZXJdOiFuLnVuc3R5bGVkfSxlKSwuLi50fSl9d2kuZGlzcGxheU5hbWU9IkBtYW50aW5lL2NvcmUvTW9kYWxCYXNlSGVhZGVyIjtjb25zdCBscD17ZHVyYXRpb246MjAwLHRpbWluZ0Z1bmN0aW9uOiJlYXNlIix0cmFuc2l0aW9uOiJmYWRlIn07ZnVuY3Rpb24gY3AoZSl7Y29uc3QgdD15dCgpO3JldHVybnsuLi5scCwuLi50LnRyYW5zaXRpb25Qcm9wcywuLi5lfX1mdW5jdGlvbiBqaSh7b25DbGljazplLHRyYW5zaXRpb25Qcm9wczp0LHN0eWxlOm4sdmlzaWJsZTpyLC4uLnN9KXtjb25zdCBhPXl0KCksaT1jcCh0KTtyZXR1cm4gby5qc3goc24se21vdW50ZWQ6ciE9PXZvaWQgMD9yOmEub3BlbmVkLC4uLmksdHJhbnNpdGlvbjoiZmFkZSIsY2hpbGRyZW46bD0+by5qc3goUm4se2ZpeGVkOiEwLHN0eWxlOltuLGxdLHpJbmRleDphLnpJbmRleCx1bnN0eWxlZDphLnVuc3R5bGVkLG9uQ2xpY2s6Yz0+e2U/LihjKSxhLmNsb3NlT25DbGlja091dHNpZGUmJmEub25DbG9zZSgpfSwuLi5zfSl9KX1qaS5kaXNwbGF5TmFtZT0iQG1hbnRpbmUvY29yZS9Nb2RhbEJhc2VPdmVybGF5IjtmdW5jdGlvbiBkcCgpe2NvbnN0IGU9eXQoKTtyZXR1cm4gbS51c2VFZmZlY3QoKCk9PihlLnNldFRpdGxlTW91bnRlZCghMCksKCk9PmUuc2V0VGl0bGVNb3VudGVkKCExKSksW10pLGUuZ2V0VGl0bGVJZCgpfWZ1bmN0aW9uIFNpKHtjbGFzc05hbWU6ZSwuLi50fSl7Y29uc3Qgbj1kcCgpLHI9eXQoKTtyZXR1cm4gby5qc3gocSx7Y29tcG9uZW50OiJoMiIsY2xhc3NOYW1lOl9lKHtbdG4udGl0bGVdOiFyLnVuc3R5bGVkfSxlKSxpZDpuLC4uLnR9KX1TaS5kaXNwbGF5TmFtZT0iQG1hbnRpbmUvY29yZS9Nb2RhbEJhc2VUaXRsZSI7ZnVuY3Rpb24gdXAoe2NoaWxkcmVuOmV9KXtyZXR1cm4gby5qc3goby5GcmFnbWVudCx7Y2hpbGRyZW46ZX0pfWNvbnN0IENpPW0uY3JlYXRlQ29udGV4dCh7c2l6ZToic20ifSksTmk9WShlPT57Y29uc3QgdD1NKCJJbnB1dENsZWFyQnV0dG9uIixudWxsLGUpLHtzaXplOm4sdmFyaWFudDpyLHZhcnM6cyxjbGFzc05hbWVzOmEsc3R5bGVzOmksLi4ubH09dCxjPW0udXNlKENpKSx7cmVzb2x2ZWRDbGFzc05hbWVzOmQscmVzb2x2ZWRTdHlsZXM6dX09dm8oe2NsYXNzTmFtZXM6YSxzdHlsZXM6aSxwcm9wczp0fSk7cmV0dXJuIG8uanN4KF9uLHt2YXJpYW50OnJ8fCJ0cmFuc3BhcmVudCIsc2l6ZTpufHxjPy5zaXplfHwic20iLGNsYXNzTmFtZXM6ZCxzdHlsZXM6dSxfX3N0YXRpY1NlbGVjdG9yOiJJbnB1dENsZWFyQnV0dG9uIixzdHlsZTp7cG9pbnRlckV2ZW50czoiYWxsIixiYWNrZ3JvdW5kOiJ2YXIoLS1pbnB1dC1iZykiLC4uLmwuc3R5bGV9LC4uLmx9KX0pO05pLmRpc3BsYXlOYW1lPSJAbWFudGluZS9jb3JlL0lucHV0Q2xlYXJCdXR0b24iO2NvbnN0IGZwPXt4czo3LHNtOjgsbWQ6MTAsbGc6MTIseGw6MTV9O2Z1bmN0aW9uIHBwKHtfX2NsZWFyYWJsZTplLF9fY2xlYXJTZWN0aW9uOnQscmlnaHRTZWN0aW9uOm4sX19kZWZhdWx0UmlnaHRTZWN0aW9uOnIsc2l6ZTpzPSJzbSIsX19jbGVhclNlY3Rpb25Nb2RlOmE9ImJvdGgifSl7Y29uc3QgaT1lJiZ0O3JldHVybiBhPT09InJpZ2h0U2VjdGlvbiI/bj09PW51bGw/bnVsbDpufHxyOmE9PT0iY2xlYXIiP249PT1udWxsP251bGw6aXx8cjppJiYobnx8cik/by5qc3hzKCJkaXYiLHsiZGF0YS1jb21iaW5lZC1jbGVhci1zZWN0aW9uIjohMCxzdHlsZTp7ZGlzcGxheToiZmxleCIsZ2FwOjIsYWxpZ25JdGVtczoiY2VudGVyIixwYWRkaW5nSW5saW5lRW5kOmZwW3NdfSxjaGlsZHJlbjpbaSxufHxyXX0pOm49PT1udWxsP251bGw6bnx8aXx8cn1jb25zdCAkbj1tLmNyZWF0ZUNvbnRleHQoe29mZnNldEJvdHRvbTohMSxvZmZzZXRUb3A6ITEsZGVzY3JpYmVkQnk6dm9pZCAwLGdldFN0eWxlczpudWxsLGlucHV0SWQ6dm9pZCAwLGxhYmVsSWQ6dm9pZCAwfSk7dmFyIFZlPXt3cmFwcGVyOiJtXzZjMDE4NTcwIixpbnB1dDoibV84ZmI3ZWJlNyIsc2VjdGlvbjoibV84MjU3N2ZjMiIscGxhY2Vob2xkZXI6Im1fODhiYWNmZDAiLHJvb3Q6Im1fNDZiNzc1MjUiLGxhYmVsOiJtXzhmZGMxMzExIixyZXF1aXJlZDoibV83OGE5NDY2MiIsZXJyb3I6Im1fOGY4MTY2MjUiLGRlc2NyaXB0aW9uOiJtX2ZlNDdjZTU5In07Y29uc3Qga2k9KGUse3NpemU6dH0pPT4oe2Rlc2NyaXB0aW9uOnsiLS1pbnB1dC1kZXNjcmlwdGlvbi1zaXplIjp0PT09dm9pZCAwP3ZvaWQgMDpgY2FsYygke09lKHQpfSAtICR7TigyKX0pYH19KSxUbj1ZKGU9Pntjb25zdCB0PU0oIklucHV0RGVzY3JpcHRpb24iLG51bGwsZSkse2NsYXNzTmFtZXM6bixjbGFzc05hbWU6cixzdHlsZTpzLHN0eWxlczphLHVuc3R5bGVkOmksdmFyczpsLF9fc3RhdGljU2VsZWN0b3I6YyxfX2luaGVyaXRTdHlsZXM6ZD0hMCxhdHRyaWJ1dGVzOnUsLi4uZn09TSgiSW5wdXREZXNjcmlwdGlvbiIsbnVsbCx0KSxwPW0udXNlKCRuKSxoPXRlKHtuYW1lOlsiSW5wdXRXcmFwcGVyIixjXSxwcm9wczp0LGNsYXNzZXM6VmUsY2xhc3NOYW1lOnIsc3R5bGU6cyxjbGFzc05hbWVzOm4sc3R5bGVzOmEsdW5zdHlsZWQ6aSxhdHRyaWJ1dGVzOnUscm9vdFNlbGVjdG9yOiJkZXNjcmlwdGlvbiIsdmFyczpsLHZhcnNSZXNvbHZlcjpraX0pO3JldHVybiBvLmpzeChxLHtjb21wb25lbnQ6InAiLC4uLihkJiZwPy5nZXRTdHlsZXN8fGgpKCJkZXNjcmlwdGlvbiIscD8uZ2V0U3R5bGVzP3tjbGFzc05hbWU6cixzdHlsZTpzfTp2b2lkIDApLC4uLmZ9KX0pO1RuLmNsYXNzZXM9VmU7VG4udmFyc1Jlc29sdmVyPWtpO1RuLmRpc3BsYXlOYW1lPSJAbWFudGluZS9jb3JlL0lucHV0RGVzY3JpcHRpb24iO2NvbnN0IFJpPShlLHtzaXplOnR9KT0+KHtlcnJvcjp7Ii0taW5wdXQtZXJyb3Itc2l6ZSI6dD09PXZvaWQgMD92b2lkIDA6YGNhbGMoJHtPZSh0KX0gLSAke04oMil9KWB9fSksUG49WShlPT57Y29uc3QgdD1NKCJJbnB1dEVycm9yIixudWxsLGUpLHtjbGFzc05hbWVzOm4sY2xhc3NOYW1lOnIsc3R5bGU6cyxzdHlsZXM6YSx1bnN0eWxlZDppLHZhcnM6bCxhdHRyaWJ1dGVzOmMsX19zdGF0aWNTZWxlY3RvcjpkLF9faW5oZXJpdFN0eWxlczp1PSEwLC4uLmZ9PXQscD10ZSh7bmFtZTpbIklucHV0V3JhcHBlciIsZF0scHJvcHM6dCxjbGFzc2VzOlZlLGNsYXNzTmFtZTpyLHN0eWxlOnMsY2xhc3NOYW1lczpuLHN0eWxlczphLHVuc3R5bGVkOmksYXR0cmlidXRlczpjLHJvb3RTZWxlY3RvcjoiZXJyb3IiLHZhcnM6bCx2YXJzUmVzb2x2ZXI6Uml9KSxoPW0udXNlKCRuKTtyZXR1cm4gby5qc3gocSx7Y29tcG9uZW50OiJwIiwuLi4odSYmaD8uZ2V0U3R5bGVzfHxwKSgiZXJyb3IiLGg/LmdldFN0eWxlcz97Y2xhc3NOYW1lOnIsc3R5bGU6c306dm9pZCAwKSwuLi5mfSl9KTtQbi5jbGFzc2VzPVZlO1BuLnZhcnNSZXNvbHZlcj1SaTtQbi5kaXNwbGF5TmFtZT0iQG1hbnRpbmUvY29yZS9JbnB1dEVycm9yIjtjb25zdCBtcD17bGFiZWxFbGVtZW50OiJsYWJlbCJ9LF9pPShlLHtzaXplOnR9KT0+KHtsYWJlbDp7Ii0taW5wdXQtbGFiZWwtc2l6ZSI6T2UodCksIi0taW5wdXQtYXN0ZXJpc2stY29sb3IiOnZvaWQgMH19KSxFbj1ZKGU9Pntjb25zdCB0PU0oIklucHV0TGFiZWwiLG1wLGUpLHtjbGFzc05hbWVzOm4sY2xhc3NOYW1lOnIsc3R5bGU6cyxzdHlsZXM6YSx1bnN0eWxlZDppLHZhcnM6bCxsYWJlbEVsZW1lbnQ6YyxyZXF1aXJlZDpkLGh0bWxGb3I6dSxvbk1vdXNlRG93bjpmLGNoaWxkcmVuOnAsX19zdGF0aWNTZWxlY3RvcjpoLG1vZDp5LGF0dHJpYnV0ZXM6ZywuLi52fT10LHg9dGUoe25hbWU6WyJJbnB1dFdyYXBwZXIiLGhdLHByb3BzOnQsY2xhc3NlczpWZSxjbGFzc05hbWU6cixzdHlsZTpzLGNsYXNzTmFtZXM6bixzdHlsZXM6YSx1bnN0eWxlZDppLGF0dHJpYnV0ZXM6Zyxyb290U2VsZWN0b3I6ImxhYmVsIix2YXJzOmwsdmFyc1Jlc29sdmVyOl9pfSksaj1tLnVzZSgkbiksdz1qPy5nZXRTdHlsZXN8fHg7cmV0dXJuIG8uanN4cyhxLHsuLi53KCJsYWJlbCIsaj8uZ2V0U3R5bGVzP3tjbGFzc05hbWU6cixzdHlsZTpzfTp2b2lkIDApLGNvbXBvbmVudDpjLGh0bWxGb3I6Yz09PSJsYWJlbCI/dTp2b2lkIDAsbW9kOlt7cmVxdWlyZWQ6ZH0seV0sb25Nb3VzZURvd246Uz0+e2Y/LihTKSwhUy5kZWZhdWx0UHJldmVudGVkJiZTLmRldGFpbD4xJiZTLnByZXZlbnREZWZhdWx0KCl9LC4uLnYsY2hpbGRyZW46W3AsZCYmby5qc3goInNwYW4iLHsuLi53KCJyZXF1aXJlZCIpLCJhcmlhLWhpZGRlbiI6ITAsY2hpbGRyZW46IiAqIn0pXX0pfSk7RW4uY2xhc3Nlcz1WZTtFbi52YXJzUmVzb2x2ZXI9X2k7RW4uZGlzcGxheU5hbWU9IkBtYW50aW5lL2NvcmUvSW5wdXRMYWJlbCI7Y29uc3QgTG89WShlPT57Y29uc3QgdD1NKCJJbnB1dFBsYWNlaG9sZGVyIixudWxsLGUpLHtjbGFzc05hbWVzOm4sY2xhc3NOYW1lOnIsc3R5bGU6cyxzdHlsZXM6YSx1bnN0eWxlZDppLHZhcnM6bCxfX3N0YXRpY1NlbGVjdG9yOmMsZXJyb3I6ZCxtb2Q6dSxhdHRyaWJ1dGVzOmYsLi4ucH09dDtyZXR1cm4gby5qc3gocSx7Li4udGUoe25hbWU6WyJJbnB1dFBsYWNlaG9sZGVyIixjXSxwcm9wczp0LGNsYXNzZXM6VmUsY2xhc3NOYW1lOnIsc3R5bGU6cyxjbGFzc05hbWVzOm4sc3R5bGVzOmEsdW5zdHlsZWQ6aSxhdHRyaWJ1dGVzOmYscm9vdFNlbGVjdG9yOiJwbGFjZWhvbGRlciJ9KSgicGxhY2Vob2xkZXIiKSxtb2Q6W3tlcnJvcjohIWR9LHVdLGNvbXBvbmVudDoic3BhbiIsLi4ucH0pfSk7TG8uY2xhc3Nlcz1WZTtMby5kaXNwbGF5TmFtZT0iQG1hbnRpbmUvY29yZS9JbnB1dFBsYWNlaG9sZGVyIjtmdW5jdGlvbiBocChlLHtoYXNEZXNjcmlwdGlvbjp0LGhhc0Vycm9yOm59KXtjb25zdCByPWUuZmluZEluZGV4KGw9Pmw9PT0iaW5wdXQiKSxzPWUuc2xpY2UoMCxyKSxhPWUuc2xpY2UocisxKSxpPXQmJnMuaW5jbHVkZXMoImRlc2NyaXB0aW9uIil8fG4mJnMuaW5jbHVkZXMoImVycm9yIik7cmV0dXJue29mZnNldEJvdHRvbTp0JiZhLmluY2x1ZGVzKCJkZXNjcmlwdGlvbiIpfHxuJiZhLmluY2x1ZGVzKCJlcnJvciIpLG9mZnNldFRvcDppfX1jb25zdCBncD17bGFiZWxFbGVtZW50OiJsYWJlbCIsaW5wdXRDb250YWluZXI6ZT0+ZSxpbnB1dFdyYXBwZXJPcmRlcjpbImxhYmVsIiwiZGVzY3JpcHRpb24iLCJpbnB1dCIsImVycm9yIl19LCRpPShlLHtzaXplOnR9KT0+KHtsYWJlbDp7Ii0taW5wdXQtbGFiZWwtc2l6ZSI6T2UodCksIi0taW5wdXQtYXN0ZXJpc2stY29sb3IiOnZvaWQgMH0sZXJyb3I6eyItLWlucHV0LWVycm9yLXNpemUiOnQ9PT12b2lkIDA/dm9pZCAwOmBjYWxjKCR7T2UodCl9IC0gJHtOKDIpfSlgfSxkZXNjcmlwdGlvbjp7Ii0taW5wdXQtZGVzY3JpcHRpb24tc2l6ZSI6dD09PXZvaWQgMD92b2lkIDA6YGNhbGMoJHtPZSh0KX0gLSAke04oMil9KWB9fSksZ3I9WShlPT57Y29uc3QgdD1NKCJJbnB1dFdyYXBwZXIiLGdwLGUpLHtjbGFzc05hbWVzOm4sY2xhc3NOYW1lOnIsc3R5bGU6cyxzdHlsZXM6YSx1bnN0eWxlZDppLHZhcnM6bCxzaXplOmMsdmFyaWFudDpkLF9fc3RhdGljU2VsZWN0b3I6dSxpbnB1dENvbnRhaW5lcjpmLGlucHV0V3JhcHBlck9yZGVyOnAsbGFiZWw6aCxlcnJvcjp5LGRlc2NyaXB0aW9uOmcsbGFiZWxQcm9wczp2LGRlc2NyaXB0aW9uUHJvcHM6eCxlcnJvclByb3BzOmosbGFiZWxFbGVtZW50OncsY2hpbGRyZW46Uyx3aXRoQXN0ZXJpc2s6QyxpZDprLHJlcXVpcmVkOl8sX19zdHlsZXNBcGlQcm9wczokLG1vZDpPLGF0dHJpYnV0ZXM6VCwuLi5BfT10LEQ9dGUoe25hbWU6WyJJbnB1dFdyYXBwZXIiLHVdLHByb3BzOiR8fHQsY2xhc3NlczpWZSxjbGFzc05hbWU6cixzdHlsZTpzLGNsYXNzTmFtZXM6bixzdHlsZXM6YSx1bnN0eWxlZDppLGF0dHJpYnV0ZXM6VCx2YXJzOmwsdmFyc1Jlc29sdmVyOiRpfSksVj17c2l6ZTpjLHZhcmlhbnQ6ZCxfX3N0YXRpY1NlbGVjdG9yOnV9LFg9bm4oayksSj10eXBlb2YgQz09ImJvb2xlYW4iP0M6XyxQPWo/LmlkfHxgJHtYfS1lcnJvcmAsVz14Py5pZHx8YCR7WH0tZGVzY3JpcHRpb25gLEk9WCx6PSEheSYmdHlwZW9mIHkhPSJib29sZWFuIixLPSEhZyxsZT1gJHt6P1A6IiJ9ICR7Sz9XOiIifWAsc2U9bGUudHJpbSgpLmxlbmd0aD4wP2xlLnRyaW0oKTp2b2lkIDAsQ2U9dj8uaWR8fGAke1h9LWxhYmVsYCx2ZT1oJiZvLmpzeChFbix7bGFiZWxFbGVtZW50OncsaWQ6Q2UsaHRtbEZvcjpJLHJlcXVpcmVkOkosLi4uViwuLi52LGNoaWxkcmVuOmh9LCJsYWJlbCIpLFRlPUsmJm8uanN4KFRuLHsuLi54LC4uLlYsc2l6ZTp4Py5zaXplfHxWLnNpemUsaWQ6eD8uaWR8fFcsY2hpbGRyZW46Z30sImRlc2NyaXB0aW9uIiksd2U9by5qc3gobS5GcmFnbWVudCx7Y2hpbGRyZW46ZihTKX0sImlucHV0IiksY2U9eiYmbS5jcmVhdGVFbGVtZW50KFBuLHsuLi5qLC4uLlYsc2l6ZTpqPy5zaXplfHxWLnNpemUsa2V5OiJlcnJvciIsaWQ6aj8uaWR8fFB9LHkpLHhlPXAubWFwKHVlPT57c3dpdGNoKHVlKXtjYXNlImxhYmVsIjpyZXR1cm4gdmU7Y2FzZSJpbnB1dCI6cmV0dXJuIHdlO2Nhc2UiZGVzY3JpcHRpb24iOnJldHVybiBUZTtjYXNlImVycm9yIjpyZXR1cm4gY2U7ZGVmYXVsdDpyZXR1cm4gbnVsbH19KTtyZXR1cm4gby5qc3goJG4se3ZhbHVlOntnZXRTdHlsZXM6RCxkZXNjcmliZWRCeTpzZSxpbnB1dElkOkksbGFiZWxJZDpDZSwuLi5ocChwLHtoYXNEZXNjcmlwdGlvbjpLLGhhc0Vycm9yOnp9KX0sY2hpbGRyZW46by5qc3gocSx7dmFyaWFudDpkLHNpemU6Yyxtb2Q6W3tlcnJvcjohIXl9LE9dLGlkOnc9PT0ibGFiZWwiP3ZvaWQgMDprLC4uLkQoInJvb3QiKSwuLi5BLGNoaWxkcmVuOnhlfSl9KX0pO2dyLmNsYXNzZXM9VmU7Z3IudmFyc1Jlc29sdmVyPSRpO2dyLmRpc3BsYXlOYW1lPSJAbWFudGluZS9jb3JlL0lucHV0V3JhcHBlciI7Y29uc3QgYnA9e3ZhcmlhbnQ6ImRlZmF1bHQiLGxlZnRTZWN0aW9uUG9pbnRlckV2ZW50czoibm9uZSIscmlnaHRTZWN0aW9uUG9pbnRlckV2ZW50czoibm9uZSIsd2l0aEFyaWE6ITAsd2l0aEVycm9yU3R5bGVzOiEwLHNpemU6InNtIixsb2FkaW5nOiExLGxvYWRpbmdQb3NpdGlvbjoicmlnaHQifSxUaT0oZSx0LG4pPT4oe3dyYXBwZXI6eyItLWlucHV0LW1hcmdpbi10b3AiOm4ub2Zmc2V0VG9wPyJjYWxjKHZhcigtLW1hbnRpbmUtc3BhY2luZy14cykgLyAyKSI6dm9pZCAwLCItLWlucHV0LW1hcmdpbi1ib3R0b20iOm4ub2Zmc2V0Qm90dG9tPyJjYWxjKHZhcigtLW1hbnRpbmUtc3BhY2luZy14cykgLyAyKSI6dm9pZCAwLCItLWlucHV0LWhlaWdodCI6bWUodC5zaXplLCJpbnB1dC1oZWlnaHQiKSwiLS1pbnB1dC1meiI6T2UodC5zaXplKSwiLS1pbnB1dC1yYWRpdXMiOnQucmFkaXVzPT09dm9pZCAwP3ZvaWQgMDptdCh0LnJhZGl1cyksIi0taW5wdXQtbGVmdC1zZWN0aW9uLXdpZHRoIjp0LmxlZnRTZWN0aW9uV2lkdGghPT12b2lkIDA/Tih0LmxlZnRTZWN0aW9uV2lkdGgpOnZvaWQgMCwiLS1pbnB1dC1yaWdodC1zZWN0aW9uLXdpZHRoIjp0LnJpZ2h0U2VjdGlvbldpZHRoIT09dm9pZCAwP04odC5yaWdodFNlY3Rpb25XaWR0aCk6dm9pZCAwLCItLWlucHV0LXBhZGRpbmcteSI6dC5tdWx0aWxpbmU/bWUodC5zaXplLCJpbnB1dC1wYWRkaW5nLXkiKTp2b2lkIDAsIi0taW5wdXQtbGVmdC1zZWN0aW9uLXBvaW50ZXItZXZlbnRzIjp0LmxlZnRTZWN0aW9uUG9pbnRlckV2ZW50cywiLS1pbnB1dC1yaWdodC1zZWN0aW9uLXBvaW50ZXItZXZlbnRzIjp0LnJpZ2h0U2VjdGlvblBvaW50ZXJFdmVudHN9fSksJGU9Z3QoZT0+e2NvbnN0IHQ9TSgiSW5wdXQiLGJwLGUpLHtjbGFzc05hbWVzOm4sY2xhc3NOYW1lOnIsc3R5bGU6cyxzdHlsZXM6YSx1bnN0eWxlZDppLHJlcXVpcmVkOmwsX19zdGF0aWNTZWxlY3RvcjpjLF9fc3R5bGVzQXBpUHJvcHM6ZCxzaXplOnUsd3JhcHBlclByb3BzOmYsZXJyb3I6cCxkaXNhYmxlZDpoLGxlZnRTZWN0aW9uOnksbGVmdFNlY3Rpb25Qcm9wczpnLGxlZnRTZWN0aW9uV2lkdGg6dixyaWdodFNlY3Rpb246eCxyaWdodFNlY3Rpb25Qcm9wczpqLHJpZ2h0U2VjdGlvbldpZHRoOncscmlnaHRTZWN0aW9uUG9pbnRlckV2ZW50czpTLGxlZnRTZWN0aW9uUG9pbnRlckV2ZW50czpDLHZhcmlhbnQ6ayx2YXJzOl8scG9pbnRlcjokLG11bHRpbGluZTpPLHJhZGl1czpULGlkOkEsd2l0aEFyaWE6RCx3aXRoRXJyb3JTdHlsZXM6Vixtb2Q6WCxpbnB1dFNpemU6SixhdHRyaWJ1dGVzOlAsX19jbGVhclNlY3Rpb246VyxfX2NsZWFyYWJsZTpJLF9fY2xlYXJTZWN0aW9uTW9kZTp6LF9fZGVmYXVsdFJpZ2h0U2VjdGlvbjpLLGxvYWRpbmc6bGUsbG9hZGluZ1Bvc2l0aW9uOnNlLHJvb3RSZWY6Q2UsLi4udmV9PXQse3N0eWxlUHJvcHM6VGUscmVzdDp3ZX09am8odmUpLGNlPW0udXNlKCRuKSx4ZT17b2Zmc2V0Qm90dG9tOmNlPy5vZmZzZXRCb3R0b20sb2Zmc2V0VG9wOmNlPy5vZmZzZXRUb3B9LHVlPXRlKHtuYW1lOlsiSW5wdXQiLGNdLHByb3BzOmR8fHQsY2xhc3NlczpWZSxjbGFzc05hbWU6cixzdHlsZTpzLGNsYXNzTmFtZXM6bixzdHlsZXM6YSx1bnN0eWxlZDppLGF0dHJpYnV0ZXM6UCxzdHlsZXNDdHg6eGUscm9vdFNlbGVjdG9yOiJ3cmFwcGVyIix2YXJzOl8sdmFyc1Jlc29sdmVyOlRpfSksTD1EP3tyZXF1aXJlZDpsLGRpc2FibGVkOmgsImFyaWEtaW52YWxpZCI6cD8hMDp2b2lkIDAsImFyaWEtZGVzY3JpYmVkYnkiOmNlPy5kZXNjcmliZWRCeSxpZDpjZT8uaW5wdXRJZHx8QX06e30sTmU9bGU/by5qc3goYW4se3NpemU6c2U9PT0ibGVmdCI/ImNhbGModmFyKC0taW5wdXQtbGVmdC1zZWN0aW9uLXNpemUpIC8gMikiOiJjYWxjKHZhcigtLWlucHV0LXJpZ2h0LXNlY3Rpb24tc2l6ZSkgLyAyKSJ9KTpudWxsLGZlPWxlJiZzZT09PSJsZWZ0Ij9OZTp5LGRlPXBwKHtfX2NsZWFyYWJsZTpJLF9fY2xlYXJTZWN0aW9uOlcscmlnaHRTZWN0aW9uOmxlJiZzZT09PSJyaWdodCI/TmU6eCxfX2RlZmF1bHRSaWdodFNlY3Rpb246SyxzaXplOnUsX19jbGVhclNlY3Rpb25Nb2RlOnp9KTtyZXR1cm4gby5qc3goQ2kse3ZhbHVlOntzaXplOnV8fCJzbSJ9LGNoaWxkcmVuOm8uanN4cyhxLHtyZWY6Q2UsLi4udWUoIndyYXBwZXIiKSwuLi5UZSwuLi5mLG1vZDpbe2Vycm9yOiEhcCYmVixwb2ludGVyOiQsZGlzYWJsZWQ6aCxtdWx0aWxpbmU6TywiZGF0YS13aXRoLXJpZ2h0LXNlY3Rpb24iOiEhZGUsImRhdGEtd2l0aC1sZWZ0LXNlY3Rpb24iOiEhZmV9LFhdLHZhcmlhbnQ6ayxzaXplOnUsY2hpbGRyZW46W2ZlJiZvLmpzeCgiZGl2Iix7Li4uZywiZGF0YS1wb3NpdGlvbiI6ImxlZnQiLC4uLnVlKCJzZWN0aW9uIix7Y2xhc3NOYW1lOmc/LmNsYXNzTmFtZSxzdHlsZTpnPy5zdHlsZX0pLGNoaWxkcmVuOmZlfSksby5qc3gocSx7Y29tcG9uZW50OiJpbnB1dCIsLi4ud2UsLi4uTCxyZXF1aXJlZDpsLG1vZDp7ZGlzYWJsZWQ6aCxlcnJvcjohIXAmJlZ9LHZhcmlhbnQ6ayxfX3NpemU6SiwuLi51ZSgiaW5wdXQiKX0pLGRlJiZvLmpzeCgiZGl2Iix7Li4uaiwiZGF0YS1wb3NpdGlvbiI6InJpZ2h0IiwuLi51ZSgic2VjdGlvbiIse2NsYXNzTmFtZTpqPy5jbGFzc05hbWUsc3R5bGU6aj8uc3R5bGV9KSxjaGlsZHJlbjpkZX0pXX0pfSl9KTskZS5jbGFzc2VzPVZlOyRlLnZhcnNSZXNvbHZlcj1UaTskZS5XcmFwcGVyPWdyOyRlLkxhYmVsPUVuOyRlLkVycm9yPVBuOyRlLkRlc2NyaXB0aW9uPVRuOyRlLlBsYWNlaG9sZGVyPUxvOyRlLkNsZWFyQnV0dG9uPU5pOyRlLmRpc3BsYXlOYW1lPSJAbWFudGluZS9jb3JlL0lucHV0IjtmdW5jdGlvbiB5cChlLHQsbil7Y29uc3Qgcj1NKGUsdCxuKSx7bGFiZWw6cyxkZXNjcmlwdGlvbjphLGVycm9yOmkscmVxdWlyZWQ6bCxjbGFzc05hbWVzOmMsc3R5bGVzOmQsY2xhc3NOYW1lOnUsdW5zdHlsZWQ6ZixfX3N0YXRpY1NlbGVjdG9yOnAsX19zdHlsZXNBcGlQcm9wczpoLGVycm9yUHJvcHM6eSxsYWJlbFByb3BzOmcsZGVzY3JpcHRpb25Qcm9wczp2LHdyYXBwZXJQcm9wczp4LGlkOmosc2l6ZTp3LHN0eWxlOlMsaW5wdXRDb250YWluZXI6QyxpbnB1dFdyYXBwZXJPcmRlcjprLHdpdGhBc3RlcmlzazpfLHZhcmlhbnQ6JCx2YXJzOk8sbW9kOlQsYXR0cmlidXRlczpBLC4uLkR9PXIse3N0eWxlUHJvcHM6VixyZXN0Olh9PWpvKEQpLEo9e2xhYmVsOnMsZGVzY3JpcHRpb246YSxlcnJvcjppLHJlcXVpcmVkOmwsY2xhc3NOYW1lczpjLGNsYXNzTmFtZTp1LF9fc3RhdGljU2VsZWN0b3I6cCxfX3N0eWxlc0FwaVByb3BzOmh8fHIsZXJyb3JQcm9wczp5LGxhYmVsUHJvcHM6ZyxkZXNjcmlwdGlvblByb3BzOnYsdW5zdHlsZWQ6ZixzdHlsZXM6ZCxzaXplOncsc3R5bGU6UyxpbnB1dENvbnRhaW5lcjpDLGlucHV0V3JhcHBlck9yZGVyOmssd2l0aEFzdGVyaXNrOl8sdmFyaWFudDokLGlkOmosbW9kOlQsYXR0cmlidXRlczpBLC4uLnh9O3JldHVybnsuLi5YLGNsYXNzTmFtZXM6YyxzdHlsZXM6ZCx1bnN0eWxlZDpmLHdyYXBwZXJQcm9wczp7Li4uSiwuLi5WfSxpbnB1dFByb3BzOntyZXF1aXJlZDpsLGNsYXNzTmFtZXM6YyxzdHlsZXM6ZCx1bnN0eWxlZDpmLHNpemU6dyxfX3N0YXRpY1NlbGVjdG9yOnAsX19zdHlsZXNBcGlQcm9wczpofHxyLGVycm9yOmksdmFyaWFudDokLGlkOmosYXR0cmlidXRlczpBfX19Y29uc3QgdnA9e19fc3RhdGljU2VsZWN0b3I6IklucHV0QmFzZSIsd2l0aEFyaWE6ITAsc2l6ZToic20ifSwkdD1ndChlPT57Y29uc3R7aW5wdXRQcm9wczp0LHdyYXBwZXJQcm9wczpuLC4uLnJ9PXlwKCJJbnB1dEJhc2UiLHZwLGUpO3JldHVybiBvLmpzeCgkZS5XcmFwcGVyLHsuLi5uLGNoaWxkcmVuOm8uanN4KCRlLHsuLi50LC4uLnJ9KX0pfSk7JHQuY2xhc3Nlcz17Li4uJGUuY2xhc3NlcywuLi4kZS5XcmFwcGVyLmNsYXNzZXN9OyR0LmRpc3BsYXlOYW1lPSJAbWFudGluZS9jb3JlL0lucHV0QmFzZSI7dmFyIFBpPXtyb290OiJtX2I2ZDhiMTYyIn07ZnVuY3Rpb24geHAoZSl7aWYoZT09PSJzdGFydCIpcmV0dXJuInN0YXJ0IjtpZihlPT09ImVuZCJ8fGUpcmV0dXJuImVuZCJ9Y29uc3Qgd3A9e2luaGVyaXQ6ITF9LEVpPShlLHt2YXJpYW50OnQsbGluZUNsYW1wOm4sZ3JhZGllbnQ6cixzaXplOnN9KT0+KHtyb290OnsiLS10ZXh0LWZ6IjpPZShzKSwiLS10ZXh0LWxoIjpxbChzKSwiLS10ZXh0LWdyYWRpZW50Ijp0PT09ImdyYWRpZW50Ij9acihyLGUpOnZvaWQgMCwiLS10ZXh0LWxpbmUtY2xhbXAiOnR5cGVvZiBuPT0ibnVtYmVyIj9uLnRvU3RyaW5nKCk6dm9pZCAwfX0pLE90PWd0KGU9Pntjb25zdCB0PU0oIlRleHQiLHdwLGUpLHtsaW5lQ2xhbXA6bix0cnVuY2F0ZTpyLGlubGluZTpzLGluaGVyaXQ6YSxncmFkaWVudDppLHNwYW46bCxfX3N0YXRpY1NlbGVjdG9yOmMsdmFyczpkLGNsYXNzTmFtZTp1LHN0eWxlOmYsY2xhc3NOYW1lczpwLHN0eWxlczpoLHVuc3R5bGVkOnksdmFyaWFudDpnLG1vZDp2LHNpemU6eCxhdHRyaWJ1dGVzOmosLi4ud309dDtyZXR1cm4gby5qc3gocSx7Li4udGUoe25hbWU6WyJUZXh0IixjXSxwcm9wczp0LGNsYXNzZXM6UGksY2xhc3NOYW1lOnUsc3R5bGU6ZixjbGFzc05hbWVzOnAsc3R5bGVzOmgsdW5zdHlsZWQ6eSxhdHRyaWJ1dGVzOmosdmFyczpkLHZhcnNSZXNvbHZlcjpFaX0pKCJyb290Iix7Zm9jdXNhYmxlOiEwfSksY29tcG9uZW50Omw/InNwYW4iOiJwIix2YXJpYW50OmcsbW9kOlt7ImRhdGEtdHJ1bmNhdGUiOnhwKHIpLCJkYXRhLWxpbmUtY2xhbXAiOnR5cGVvZiBuPT0ibnVtYmVyIiwiZGF0YS1pbmxpbmUiOnMsImRhdGEtaW5oZXJpdCI6YX0sdl0sc2l6ZTp4LC4uLnd9KX0pO090LmNsYXNzZXM9UGk7T3QudmFyc1Jlc29sdmVyPUVpO090LmRpc3BsYXlOYW1lPSJAbWFudGluZS9jb3JlL1RleHQiO2Z1bmN0aW9uIEFpKGUpe3JldHVybiB0eXBlb2YgZT09InN0cmluZyI/e3ZhbHVlOmUsbGFiZWw6ZX06dHlwZW9mIGU9PSJvYmplY3QiJiYidmFsdWUiaW4gZSYmISgibGFiZWwiaW4gZSk/e3ZhbHVlOmUudmFsdWUsbGFiZWw6YCR7ZS52YWx1ZX1gLGRpc2FibGVkOmUuZGlzYWJsZWR9OnR5cGVvZiBlPT0ib2JqZWN0IiYmImdyb3VwImluIGU/e2dyb3VwOmUuZ3JvdXAsaXRlbXM6ZS5pdGVtcy5tYXAodD0+QWkodCkpfTp0eXBlb2YgZT09Im51bWJlciJ8fHR5cGVvZiBlPT0iYmlnaW50Inx8dHlwZW9mIGU9PSJib29sZWFuIj97dmFsdWU6ZSxsYWJlbDpgJHtlfWB9OmV9ZnVuY3Rpb24ganAoZSl7cmV0dXJuIGU/ZS5tYXAodD0+QWkodCkpOltdfWZ1bmN0aW9uIE9pKGUpe3JldHVybiBlLnJlZHVjZSgodCxuKT0+Imdyb3VwImluIG4/ey4uLnQsLi4uT2kobi5pdGVtcyl9Oih0W2Ake24udmFsdWV9YF09bix0KSx7fSl9dmFyIFJlPXtkcm9wZG93bjoibV84OGI2MmE0MSIsc2VhcmNoOiJtXzk4NTUxN2Q4IixvcHRpb25zOiJtX2IyODIxYTZlIixvcHRpb246Im1fOTIyNTNhYTUiLGVtcHR5OiJtXzI1MzBjZDFkIixoZWFkZXI6Im1fODU4Zjk0YmQiLGZvb3RlcjoibV84MmI5NjdjYiIsZ3JvdXA6Im1fMjU0ZjNlNGYiLGdyb3VwTGFiZWw6Im1fMmJiMmU5ZTUiLGNoZXZyb246Im1fMjk0MzIyMGIiLG9wdGlvbnNEcm9wZG93bk9wdGlvbjoibV8zOTBiNWY0IixvcHRpb25zRHJvcGRvd25DaGVja0ljb246Im1fOGVlNTNmYzIiLG9wdGlvbnNEcm9wZG93bkNoZWNrUGxhY2Vob2xkZXI6Im1fYTUzMGVlMGEifTtjb25zdCBTcD17ZXJyb3I6bnVsbH0sTWk9KGUse3NpemU6dCxjb2xvcjpufSk9Pih7Y2hldnJvbjp7Ii0tY29tYm9ib3gtY2hldnJvbi1zaXplIjptZSh0LCJjb21ib2JveC1jaGV2cm9uLXNpemUiKSwiLS1jb21ib2JveC1jaGV2cm9uLWNvbG9yIjpuP3B0KG4sZSk6dm9pZCAwfX0pLGJyPVkoZT0+e2NvbnN0IHQ9TSgiQ29tYm9ib3hDaGV2cm9uIixTcCxlKSx7c2l6ZTpuLGVycm9yOnIsc3R5bGU6cyxjbGFzc05hbWU6YSxjbGFzc05hbWVzOmksc3R5bGVzOmwsdW5zdHlsZWQ6Yyx2YXJzOmQsYXR0cmlidXRlczp1LG1vZDpmLC4uLnB9PXQsaD10ZSh7bmFtZToiQ29tYm9ib3hDaGV2cm9uIixjbGFzc2VzOlJlLHByb3BzOnQsc3R5bGU6cyxjbGFzc05hbWU6YSxjbGFzc05hbWVzOmksc3R5bGVzOmwsdW5zdHlsZWQ6Yyx2YXJzOmQsdmFyc1Jlc29sdmVyOk1pLGF0dHJpYnV0ZXM6dSxyb290U2VsZWN0b3I6ImNoZXZyb24ifSk7cmV0dXJuIG8uanN4KHEse2NvbXBvbmVudDoic3ZnIiwuLi5wLC4uLmgoImNoZXZyb24iKSxzaXplOm4sdmlld0JveDoiMCAwIDE1IDE1IixmaWxsOiJub25lIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLG1vZDpbImNvbWJvYm94LWNoZXZyb24iLHtlcnJvcjpyfSxmXSxjaGlsZHJlbjpvLmpzeCgicGF0aCIse2Q6Ik00LjkzMTc5IDUuNDMxNzlDNC43NTYwNSA1LjYwNzUzIDQuNzU2MDUgNS44OTI0NSA0LjkzMTc5IDYuMDY4MTlDNS4xMDc1MyA2LjI0MzkyIDUuMzkyNDUgNi4yNDM5MiA1LjU2ODE5IDYuMDY4MTlMNy40OTk5OSA0LjEzNjM4TDkuNDMxNzkgNi4wNjgxOUM5LjYwNzUzIDYuMjQzOTIgOS44OTI0NSA2LjI0MzkyIDEwLjA2ODIgNi4wNjgxOUMxMC4yNDM5IDUuODkyNDUgMTAuMjQzOSA1LjYwNzUzIDEwLjA2ODIgNS40MzE3OUw3LjgxODE5IDMuMTgxNzlDNy43MzM3OSAzLjA5NzQgNy42MTkzMyAzLjA0OTk5IDcuNDk5OTkgMy4wNDk5OUM3LjM4MDY0IDMuMDQ5OTkgNy4yNjYxOCAzLjA5NzQgNy4xODE3OSAzLjE4MTc5TDQuOTMxNzkgNS40MzE3OVpNMTAuMDY4MiA5LjU2ODE5QzEwLjI0MzkgOS4zOTI0NSAxMC4yNDM5IDkuMTA3NTMgMTAuMDY4MiA4LjkzMTc5QzkuODkyNDUgOC43NTYwNiA5LjYwNzUzIDguNzU2MDYgOS40MzE3OSA4LjkzMTc5TDcuNDk5OTkgMTAuODYzNkw1LjU2ODE5IDguOTMxNzlDNS4zOTI0NSA4Ljc1NjA2IDUuMTA3NTMgOC43NTYwNiA0LjkzMTc5IDguOTMxNzlDNC43NTYwNSA5LjEwNzUzIDQuNzU2MDUgOS4zOTI0NSA0LjkzMTc5IDkuNTY4MTlMNy4xODE3OSAxMS44MTgyQzcuMzU3NTMgMTEuOTkzOSA3LjY0MjQ1IDExLjk5MzkgNy44MTgxOSAxMS44MTgyTDEwLjA2ODIgOS41NjgxOVoiLGZpbGw6ImN1cnJlbnRDb2xvciIsZmlsbFJ1bGU6ImV2ZW5vZGQiLGNsaXBSdWxlOiJldmVub2RkIn0pfSl9KTtici5jbGFzc2VzPVJlO2JyLnZhcnNSZXNvbHZlcj1NaTtici5kaXNwbGF5TmFtZT0iQG1hbnRpbmUvY29yZS9Db21ib2JveENoZXZyb24iO2NvbnN0W0NwLFdlXT1MdCgiQ29tYm9ib3ggY29tcG9uZW50IHdhcyBub3QgZm91bmQgaW4gdHJlZSIpO2Z1bmN0aW9uIERpKHtzaXplOmUsb25Nb3VzZURvd246dCxvbkNsaWNrOm4sb25DbGVhcjpyLC4uLnN9KXtyZXR1cm4gby5qc3goJGUuQ2xlYXJCdXR0b24se3RhYkluZGV4Oi0xLCJhcmlhLWhpZGRlbiI6ITAsLi4ucyxvbk1vdXNlRG93bjphPT57YS5wcmV2ZW50RGVmYXVsdCgpLHQ/LihhKX0sb25DbGljazphPT57cigpLG4/LihhKX19KX1EaS5kaXNwbGF5TmFtZT0iQG1hbnRpbmUvY29yZS9Db21ib2JveENsZWFyQnV0dG9uIjtjb25zdCBGbz1ZKGU9Pntjb25zdHtjbGFzc05hbWVzOnQsc3R5bGVzOm4sY2xhc3NOYW1lOnIsc3R5bGU6cyxoaWRkZW46YSwuLi5pfT1NKCJDb21ib2JveERyb3Bkb3duIixudWxsLGUpLGw9V2UoKTtyZXR1cm4gby5qc3goTWUuRHJvcGRvd24sey4uLmkscm9sZToicHJlc2VudGF0aW9uIiwiZGF0YS1oaWRkZW4iOmF8fHZvaWQgMCwuLi5sLmdldFN0eWxlcygiZHJvcGRvd24iLHtjbGFzc05hbWU6cixzdHlsZTpzLGNsYXNzTmFtZXM6dCxzdHlsZXM6bn0pfSl9KTtGby5jbGFzc2VzPVJlO0ZvLmRpc3BsYXlOYW1lPSJAbWFudGluZS9jb3JlL0NvbWJvYm94RHJvcGRvd24iO2NvbnN0IE5wPXtyZWZQcm9wOiJyZWYifSxMaT1ZKGU9Pntjb25zdHtjaGlsZHJlbjp0LHJlZlByb3A6bixyZWY6cn09TSgiQ29tYm9ib3hEcm9wZG93blRhcmdldCIsTnAsZSk7aWYoV2UoKSwhSnModCkpdGhyb3cgbmV3IEVycm9yKCJDb21ib2JveC5Ecm9wZG93blRhcmdldCBjb21wb25lbnQgY2hpbGRyZW4gc2hvdWxkIGJlIGFuIGVsZW1lbnQgb3IgYSBjb21wb25lbnQgdGhhdCBhY2NlcHRzIHJlZi4gRnJhZ21lbnRzLCBzdHJpbmdzLCBudW1iZXJzIGFuZCBvdGhlciBwcmltaXRpdmUgdmFsdWVzIGFyZSBub3Qgc3VwcG9ydGVkIik7cmV0dXJuIG8uanN4KE1lLlRhcmdldCx7cmVmOnIscmVmUHJvcDpuLGNoaWxkcmVuOnR9KX0pO0xpLmRpc3BsYXlOYW1lPSJAbWFudGluZS9jb3JlL0NvbWJvYm94RHJvcGRvd25UYXJnZXQiO2NvbnN0IElvPVkoZT0+e2NvbnN0e2NsYXNzTmFtZXM6dCxjbGFzc05hbWU6bixzdHlsZTpyLHN0eWxlczpzLHZhcnM6YSwuLi5pfT1NKCJDb21ib2JveEVtcHR5IixudWxsLGUpO3JldHVybiBvLmpzeChxLHsuLi5XZSgpLmdldFN0eWxlcygiZW1wdHkiLHtjbGFzc05hbWU6bixjbGFzc05hbWVzOnQsc3R5bGVzOnMsc3R5bGU6cn0pLC4uLml9KX0pO0lvLmNsYXNzZXM9UmU7SW8uZGlzcGxheU5hbWU9IkBtYW50aW5lL2NvcmUvQ29tYm9ib3hFbXB0eSI7ZnVuY3Rpb24gem8oe29uS2V5RG93bjplLHdpdGhLZXlib2FyZE5hdmlnYXRpb246dCx3aXRoQXJpYUF0dHJpYnV0ZXM6bix3aXRoRXhwYW5kZWRBdHRyaWJ1dGU6cix0YXJnZXRUeXBlOnMsYXV0b0NvbXBsZXRlOmF9KXtjb25zdCBpPVdlKCksW2wsY109bS51c2VTdGF0ZShudWxsKSxkPXU9PntpZihlPy4odSksIWkucmVhZE9ubHkmJnQpe2lmKHUubmF0aXZlRXZlbnQuaXNDb21wb3NpbmcpcmV0dXJuO2lmKHUubmF0aXZlRXZlbnQuY29kZT09PSJBcnJvd0Rvd24iJiYodS5wcmV2ZW50RGVmYXVsdCgpLGkuc3RvcmUuZHJvcGRvd25PcGVuZWQ/YyhpLnN0b3JlLnNlbGVjdE5leHRPcHRpb24oKSk6KGkuc3RvcmUub3BlbkRyb3Bkb3duKCJrZXlib2FyZCIpLGMoaS5zdG9yZS5zZWxlY3RBY3RpdmVPcHRpb24oKSksaS5zdG9yZS51cGRhdGVTZWxlY3RlZE9wdGlvbkluZGV4KCJzZWxlY3RlZCIse3Njcm9sbEludG9WaWV3OiEwfSkpKSx1Lm5hdGl2ZUV2ZW50LmNvZGU9PT0iQXJyb3dVcCImJih1LnByZXZlbnREZWZhdWx0KCksaS5zdG9yZS5kcm9wZG93bk9wZW5lZD9jKGkuc3RvcmUuc2VsZWN0UHJldmlvdXNPcHRpb24oKSk6KGkuc3RvcmUub3BlbkRyb3Bkb3duKCJrZXlib2FyZCIpLGMoaS5zdG9yZS5zZWxlY3RBY3RpdmVPcHRpb24oKSksaS5zdG9yZS51cGRhdGVTZWxlY3RlZE9wdGlvbkluZGV4KCJzZWxlY3RlZCIse3Njcm9sbEludG9WaWV3OiEwfSkpKSx1Lm5hdGl2ZUV2ZW50LmNvZGU9PT0iRW50ZXIifHx1Lm5hdGl2ZUV2ZW50LmNvZGU9PT0iTnVtcGFkRW50ZXIiKXtpZih1Lm5hdGl2ZUV2ZW50LmtleUNvZGU9PT0yMjkpcmV0dXJuO2NvbnN0IGY9aS5zdG9yZS5nZXRTZWxlY3RlZE9wdGlvbkluZGV4KCk7aS5zdG9yZS5kcm9wZG93bk9wZW5lZCYmZiE9PS0xPyh1LnByZXZlbnREZWZhdWx0KCksaS5zdG9yZS5jbGlja1NlbGVjdGVkT3B0aW9uKCkpOnM9PT0iYnV0dG9uIiYmKHUucHJldmVudERlZmF1bHQoKSxpLnN0b3JlLm9wZW5Ecm9wZG93bigia2V5Ym9hcmQiKSl9dS5rZXk9PT0iRXNjYXBlIiYmaS5zdG9yZS5jbG9zZURyb3Bkb3duKCJrZXlib2FyZCIpLHUubmF0aXZlRXZlbnQuY29kZT09PSJTcGFjZSImJnM9PT0iYnV0dG9uIiYmKHUucHJldmVudERlZmF1bHQoKSxpLnN0b3JlLnRvZ2dsZURyb3Bkb3duKCJrZXlib2FyZCIpKX19O3JldHVybnsuLi5uP3suLi5yP3tyb2xlOiJjb21ib2JveCJ9Ont9LCJhcmlhLWhhc3BvcHVwIjoibGlzdGJveCIsImFyaWEtZXhwYW5kZWQiOnI/ISEoaS5zdG9yZS5saXN0SWQmJmkuc3RvcmUuZHJvcGRvd25PcGVuZWQpOnZvaWQgMCwiYXJpYS1jb250cm9scyI6aS5zdG9yZS5kcm9wZG93bk9wZW5lZCYmaS5zdG9yZS5saXN0SWQ/aS5zdG9yZS5saXN0SWQ6dm9pZCAwLCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnQiOmkuc3RvcmUuZHJvcGRvd25PcGVuZWQmJmx8fHZvaWQgMCxhdXRvQ29tcGxldGU6YSwiZGF0YS1leHBhbmRlZCI6aS5zdG9yZS5kcm9wZG93bk9wZW5lZHx8dm9pZCAwLCJkYXRhLW1hbnRpbmUtc3RvcC1wcm9wYWdhdGlvbiI6aS5zdG9yZS5kcm9wZG93bk9wZW5lZHx8dm9pZCAwfTp7fSxvbktleURvd246ZH19Y29uc3Qga3A9e3JlZlByb3A6InJlZiIsdGFyZ2V0VHlwZToiaW5wdXQiLHdpdGhLZXlib2FyZE5hdmlnYXRpb246ITAsd2l0aEFyaWFBdHRyaWJ1dGVzOiEwLHdpdGhFeHBhbmRlZEF0dHJpYnV0ZTohMSxhdXRvQ29tcGxldGU6Im9mZiJ9LEZpPVkoZT0+e2NvbnN0e2NoaWxkcmVuOnQscmVmUHJvcDpuLHdpdGhLZXlib2FyZE5hdmlnYXRpb246cix3aXRoQXJpYUF0dHJpYnV0ZXM6cyx3aXRoRXhwYW5kZWRBdHRyaWJ1dGU6YSx0YXJnZXRUeXBlOmksYXV0b0NvbXBsZXRlOmwscmVmOmMsLi4uZH09TSgiQ29tYm9ib3hFdmVudHNUYXJnZXQiLGtwLGUpLHU9b3IodCk7aWYoIXUpdGhyb3cgbmV3IEVycm9yKCJDb21ib2JveC5FdmVudHNUYXJnZXQgY29tcG9uZW50IGNoaWxkcmVuIHNob3VsZCBiZSBhbiBlbGVtZW50IG9yIGEgY29tcG9uZW50IHRoYXQgYWNjZXB0cyByZWYuIEZyYWdtZW50cywgc3RyaW5ncywgbnVtYmVycyBhbmQgb3RoZXIgcHJpbWl0aXZlIHZhbHVlcyBhcmUgbm90IHN1cHBvcnRlZCIpO2NvbnN0IGY9V2UoKTtyZXR1cm4gbS5jbG9uZUVsZW1lbnQodSx7Li4uem8oe3RhcmdldFR5cGU6aSx3aXRoQXJpYUF0dHJpYnV0ZXM6cyx3aXRoS2V5Ym9hcmROYXZpZ2F0aW9uOnIsd2l0aEV4cGFuZGVkQXR0cmlidXRlOmEsb25LZXlEb3duOnUucHJvcHMub25LZXlEb3duLGF1dG9Db21wbGV0ZTpsfSksLi4uZCxbbl06TGUoYyxmLnN0b3JlLnRhcmdldFJlZixyYSh1KSl9KX0pO0ZpLmRpc3BsYXlOYW1lPSJAbWFudGluZS9jb3JlL0NvbWJvYm94RXZlbnRzVGFyZ2V0Ijtjb25zdCBCbz1ZKGU9Pntjb25zdHtjbGFzc05hbWVzOnQsY2xhc3NOYW1lOm4sc3R5bGU6cixzdHlsZXM6cyx2YXJzOmEsLi4uaX09TSgiQ29tYm9ib3hGb290ZXIiLG51bGwsZSk7cmV0dXJuIG8uanN4KHEsey4uLldlKCkuZ2V0U3R5bGVzKCJmb290ZXIiLHtjbGFzc05hbWU6bixjbGFzc05hbWVzOnQsc3R5bGU6cixzdHlsZXM6c30pLC4uLmksb25Nb3VzZURvd246bD0+e2wucHJldmVudERlZmF1bHQoKX19KX0pO0JvLmNsYXNzZXM9UmU7Qm8uZGlzcGxheU5hbWU9IkBtYW50aW5lL2NvcmUvQ29tYm9ib3hGb290ZXIiO2NvbnN0IFZvPVkoZT0+e2NvbnN0e2NsYXNzTmFtZXM6dCxjbGFzc05hbWU6bixzdHlsZTpyLHN0eWxlczpzLHZhcnM6YSxjaGlsZHJlbjppLGxhYmVsOmwsaWQ6YywuLi5kfT1NKCJDb21ib2JveEdyb3VwIixudWxsLGUpLHU9V2UoKSxmPW5uKGMpO3JldHVybiBvLmpzeHMocSx7cm9sZToiZ3JvdXAiLCJhcmlhLWxhYmVsbGVkYnkiOmw/Zjp2b2lkIDAsLi4udS5nZXRTdHlsZXMoImdyb3VwIix7Y2xhc3NOYW1lOm4sY2xhc3NOYW1lczp0LHN0eWxlOnIsc3R5bGVzOnN9KSwuLi5kLGNoaWxkcmVuOltsJiZvLmpzeCgiZGl2Iix7aWQ6ZiwuLi51LmdldFN0eWxlcygiZ3JvdXBMYWJlbCIse2NsYXNzTmFtZXM6dCxzdHlsZXM6c30pLGNoaWxkcmVuOmx9KSxpXX0pfSk7Vm8uY2xhc3Nlcz1SZTtWby5kaXNwbGF5TmFtZT0iQG1hbnRpbmUvY29yZS9Db21ib2JveEdyb3VwIjtjb25zdCBXbz1ZKGU9Pntjb25zdHtjbGFzc05hbWVzOnQsY2xhc3NOYW1lOm4sc3R5bGU6cixzdHlsZXM6cyx2YXJzOmEsLi4uaX09TSgiQ29tYm9ib3hIZWFkZXIiLG51bGwsZSk7cmV0dXJuIG8uanN4KHEsey4uLldlKCkuZ2V0U3R5bGVzKCJoZWFkZXIiLHtjbGFzc05hbWU6bixjbGFzc05hbWVzOnQsc3R5bGU6cixzdHlsZXM6c30pLC4uLmksb25Nb3VzZURvd246bD0+e2wucHJldmVudERlZmF1bHQoKX19KX0pO1dvLmNsYXNzZXM9UmU7V28uZGlzcGxheU5hbWU9IkBtYW50aW5lL2NvcmUvQ29tYm9ib3hIZWFkZXIiO2Z1bmN0aW9uIElpKHt2YWx1ZTplLHZhbHVlc0RpdmlkZXI6dD0iLCIsLi4ubn0pe3JldHVybiBvLmpzeCgiaW5wdXQiLHt0eXBlOiJoaWRkZW4iLHZhbHVlOkFycmF5LmlzQXJyYXkoZSk/ZS5qb2luKHQpOmU/YCR7ZX1gOiIiLC4uLm59KX1JaS5kaXNwbGF5TmFtZT0iQG1hbnRpbmUvY29yZS9Db21ib2JveEhpZGRlbklucHV0Ijtjb25zdCBIbz1ZKGU9Pntjb25zdCB0PU0oIkNvbWJvYm94T3B0aW9uIixudWxsLGUpLHtjbGFzc05hbWVzOm4sY2xhc3NOYW1lOnIsc3R5bGU6cyxzdHlsZXM6YSx2YXJzOmksb25DbGljazpsLGlkOmMsYWN0aXZlOmQsb25Nb3VzZURvd246dSxvbk1vdXNlT3ZlcjpmLGRpc2FibGVkOnAsc2VsZWN0ZWQ6aCxtb2Q6eSwuLi5nfT10LHY9V2UoKSx4PW0udXNlSWQoKSxqPWN8fHg7cmV0dXJuIG8uanN4KHEsey4uLnYuZ2V0U3R5bGVzKCJvcHRpb24iLHtjbGFzc05hbWU6cixjbGFzc05hbWVzOm4sc3R5bGVzOmEsc3R5bGU6c30pLC4uLmcsaWQ6aixtb2Q6WyJjb21ib2JveC1vcHRpb24iLHsiY29tYm9ib3gtYWN0aXZlIjpkLCJjb21ib2JveC1kaXNhYmxlZCI6cCwiY29tYm9ib3gtc2VsZWN0ZWQiOmh9LHldLHJvbGU6Im9wdGlvbiIsb25DbGljazp3PT57cD93LnByZXZlbnREZWZhdWx0KCk6KHYub25PcHRpb25TdWJtaXQ/Lih0LnZhbHVlLHQpLGw/Lih3KSl9LG9uTW91c2VEb3duOnc9Pnt3LnByZXZlbnREZWZhdWx0KCksdT8uKHcpfSxvbk1vdXNlT3Zlcjp3PT57di5yZXNldFNlbGVjdGlvbk9uT3B0aW9uSG92ZXImJnYuc3RvcmUucmVzZXRTZWxlY3RlZE9wdGlvbigpLGY/Lih3KX19KX0pO0hvLmNsYXNzZXM9UmU7SG8uZGlzcGxheU5hbWU9IkBtYW50aW5lL2NvcmUvQ29tYm9ib3hPcHRpb24iO2NvbnN0IHFvPVkoZT0+e2NvbnN0e2NsYXNzTmFtZXM6dCxjbGFzc05hbWU6bixzdHlsZTpyLHN0eWxlczpzLGlkOmEsb25Nb3VzZURvd246aSxsYWJlbGxlZEJ5OmwsLi4uY309TSgiQ29tYm9ib3hPcHRpb25zIixudWxsLGUpLGQ9V2UoKSx1PW5uKGEpO3JldHVybiBtLnVzZUVmZmVjdCgoKT0+e2Quc3RvcmUuc2V0TGlzdElkKHUpfSxbdV0pLG8uanN4KHEsey4uLmQuZ2V0U3R5bGVzKCJvcHRpb25zIix7Y2xhc3NOYW1lOm4sc3R5bGU6cixjbGFzc05hbWVzOnQsc3R5bGVzOnN9KSwuLi5jLGlkOnUscm9sZToibGlzdGJveCIsImFyaWEtbGFiZWxsZWRieSI6bCxvbk1vdXNlRG93bjpmPT57Zi5wcmV2ZW50RGVmYXVsdCgpLGk/LihmKX19KX0pO3FvLmNsYXNzZXM9UmU7cW8uZGlzcGxheU5hbWU9IkBtYW50aW5lL2NvcmUvQ29tYm9ib3hPcHRpb25zIjtjb25zdCBScD17d2l0aEFyaWFBdHRyaWJ1dGVzOiEwLHdpdGhLZXlib2FyZE5hdmlnYXRpb246ITB9LFlvPVkoZT0+e2NvbnN0e2NsYXNzTmFtZXM6dCxzdHlsZXM6bix1bnN0eWxlZDpyLHZhcnM6cyx3aXRoQXJpYUF0dHJpYnV0ZXM6YSxvbktleURvd246aSx3aXRoS2V5Ym9hcmROYXZpZ2F0aW9uOmwsc2l6ZTpjLHJlZjpkLC4uLnV9PU0oIkNvbWJvYm94U2VhcmNoIixScCxlKSxmPVdlKCkscD1mLmdldFN0eWxlcygic2VhcmNoIiksaD16byh7dGFyZ2V0VHlwZToiaW5wdXQiLHdpdGhBcmlhQXR0cmlidXRlczphLHdpdGhLZXlib2FyZE5hdmlnYXRpb246bCx3aXRoRXhwYW5kZWRBdHRyaWJ1dGU6ITEsb25LZXlEb3duOmksYXV0b0NvbXBsZXRlOiJvZmYifSk7cmV0dXJuIG8uanN4KCRlLHtyZWY6TGUoZCxmLnN0b3JlLnNlYXJjaFJlZiksY2xhc3NOYW1lczpbe2lucHV0OnAuY2xhc3NOYW1lfSx0XSxzdHlsZXM6W3tpbnB1dDpwLnN0eWxlfSxuXSxzaXplOmN8fGYuc2l6ZSwuLi5oLC4uLnUsX19zdGF0aWNTZWxlY3RvcjoiQ29tYm9ib3gifSl9KTtZby5jbGFzc2VzPVJlO1lvLmRpc3BsYXlOYW1lPSJAbWFudGluZS9jb3JlL0NvbWJvYm94U2VhcmNoIjtjb25zdCBfcD17cmVmUHJvcDoicmVmIix0YXJnZXRUeXBlOiJpbnB1dCIsd2l0aEtleWJvYXJkTmF2aWdhdGlvbjohMCx3aXRoQXJpYUF0dHJpYnV0ZXM6ITAsd2l0aEV4cGFuZGVkQXR0cmlidXRlOiExLGF1dG9Db21wbGV0ZToib2ZmIn0semk9WShlPT57Y29uc3R7Y2hpbGRyZW46dCxyZWZQcm9wOm4sd2l0aEtleWJvYXJkTmF2aWdhdGlvbjpyLHdpdGhBcmlhQXR0cmlidXRlczpzLHdpdGhFeHBhbmRlZEF0dHJpYnV0ZTphLHRhcmdldFR5cGU6aSxhdXRvQ29tcGxldGU6bCxyZWY6YywuLi5kfT1NKCJDb21ib2JveFRhcmdldCIsX3AsZSksdT1vcih0KTtpZighdSl0aHJvdyBuZXcgRXJyb3IoIkNvbWJvYm94LlRhcmdldCBjb21wb25lbnQgY2hpbGRyZW4gc2hvdWxkIGJlIGFuIGVsZW1lbnQgb3IgYSBjb21wb25lbnQgdGhhdCBhY2NlcHRzIHJlZi4gRnJhZ21lbnRzLCBzdHJpbmdzLCBudW1iZXJzIGFuZCBvdGhlciBwcmltaXRpdmUgdmFsdWVzIGFyZSBub3Qgc3VwcG9ydGVkIik7Y29uc3QgZj1XZSgpLHA9bS5jbG9uZUVsZW1lbnQodSx7Li4uem8oe3RhcmdldFR5cGU6aSx3aXRoQXJpYUF0dHJpYnV0ZXM6cyx3aXRoS2V5Ym9hcmROYXZpZ2F0aW9uOnIsd2l0aEV4cGFuZGVkQXR0cmlidXRlOmEsb25LZXlEb3duOnUucHJvcHMub25LZXlEb3duLGF1dG9Db21wbGV0ZTpsfSksLi4uZH0pO3JldHVybiBvLmpzeChNZS5UYXJnZXQse3JlZlByb3A6bixyZWY6TGUoYyxmLnN0b3JlLnRhcmdldFJlZiksY2hpbGRyZW46cH0pfSk7emkuZGlzcGxheU5hbWU9IkBtYW50aW5lL2NvcmUvQ29tYm9ib3hUYXJnZXQiO2Z1bmN0aW9uICRwKGUsdCxuKXtmb3IobGV0IHI9ZS0xO3I+PTA7ci09MSlpZighdFtyXS5oYXNBdHRyaWJ1dGUoImRhdGEtY29tYm9ib3gtZGlzYWJsZWQiKSlyZXR1cm4gcjtpZihuKXtmb3IobGV0IHI9dC5sZW5ndGgtMTtyPi0xO3ItPTEpaWYoIXRbcl0uaGFzQXR0cmlidXRlKCJkYXRhLWNvbWJvYm94LWRpc2FibGVkIikpcmV0dXJuIHJ9cmV0dXJuIGV9ZnVuY3Rpb24gVHAoZSx0LG4pe2ZvcihsZXQgcj1lKzE7cjx0Lmxlbmd0aDtyKz0xKWlmKCF0W3JdLmhhc0F0dHJpYnV0ZSgiZGF0YS1jb21ib2JveC1kaXNhYmxlZCIpKXJldHVybiByO2lmKG4pe2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cis9MSlpZighdFtyXS5oYXNBdHRyaWJ1dGUoImRhdGEtY29tYm9ib3gtZGlzYWJsZWQiKSlyZXR1cm4gcn1yZXR1cm4gZX1mdW5jdGlvbiBQcChlKXtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrPTEpaWYoIWVbdF0uaGFzQXR0cmlidXRlKCJkYXRhLWNvbWJvYm94LWRpc2FibGVkIikpcmV0dXJuIHQ7cmV0dXJuLTF9ZnVuY3Rpb24gQmkoe2RlZmF1bHRPcGVuZWQ6ZSxvcGVuZWQ6dCxvbk9wZW5lZENoYW5nZTpuLG9uRHJvcGRvd25DbG9zZTpyLG9uRHJvcGRvd25PcGVuOnMsbG9vcDphPSEwLHNjcm9sbEJlaGF2aW9yOmk9Imluc3RhbnQifT17fSl7Y29uc3RbbCxjXT1Kbih7dmFsdWU6dCxkZWZhdWx0VmFsdWU6ZSxmaW5hbFZhbHVlOiExLG9uQ2hhbmdlOm59KSxkPW0udXNlUmVmKG51bGwpLHU9bS51c2VSZWYoLTEpLGY9bS51c2VSZWYobnVsbCkscD1tLnVzZVJlZihudWxsKSxoPW0udXNlUmVmKC0xKSx5PW0udXNlUmVmKC0xKSxnPW0udXNlUmVmKC0xKSx2PW0udXNlQ2FsbGJhY2soKFA9InVua25vd24iKT0+e2x8fChjKCEwKSxzPy4oUCkpfSxbYyxzLGxdKSx4PW0udXNlQ2FsbGJhY2soKFA9InVua25vd24iKT0+e2wmJihjKCExKSxyPy4oUCkpfSxbYyxyLGxdKSxqPW0udXNlQ2FsbGJhY2soKFA9InVua25vd24iKT0+e2w/eChQKTp2KFApfSxbeCx2LGxdKSx3PW0udXNlQ2FsbGJhY2soKCk9Pntjb25zdCBQPWl0KHAuY3VycmVudCksVz1xbihgIyR7ZC5jdXJyZW50fSBbZGF0YS1jb21ib2JveC1zZWxlY3RlZF1gLFApO1c/LnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1jb21ib2JveC1zZWxlY3RlZCIpLFc/LnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1zZWxlY3RlZCIpfSxbXSksUz1tLnVzZUNhbGxiYWNrKFA9Pntjb25zdCBXPWl0KHAuY3VycmVudCksST1xbihgIyR7ZC5jdXJyZW50fWAsVyksej1JP2N0KCJbZGF0YS1jb21ib2JveC1vcHRpb25dIixJKTpudWxsO2lmKCF6KXJldHVybiBudWxsO2NvbnN0IEs9UD49ei5sZW5ndGg/MDpQPDA/ei5sZW5ndGgtMTpQO3JldHVybiB1LmN1cnJlbnQ9Syx6Py5bS10mJiF6W0tdLmhhc0F0dHJpYnV0ZSgiZGF0YS1jb21ib2JveC1kaXNhYmxlZCIpPyh3KCkseltLXS5zZXRBdHRyaWJ1dGUoImRhdGEtY29tYm9ib3gtc2VsZWN0ZWQiLCJ0cnVlIikseltLXS5zZXRBdHRyaWJ1dGUoImFyaWEtc2VsZWN0ZWQiLCJ0cnVlIikseltLXS5zY3JvbGxJbnRvVmlldyh7YmxvY2s6Im5lYXJlc3QiLGJlaGF2aW9yOml9KSx6W0tdLmlkKTpudWxsfSxbaSx3XSksQz1tLnVzZUNhbGxiYWNrKCgpPT57Y29uc3QgUD1pdChwLmN1cnJlbnQpLFc9cW4oYCMke2QuY3VycmVudH0gW2RhdGEtY29tYm9ib3gtYWN0aXZlXWAsUCk7cmV0dXJuIFMoVz9jdChgIyR7ZC5jdXJyZW50fSBbZGF0YS1jb21ib2JveC1vcHRpb25dYCxQKS5maW5kSW5kZXgoST0+ST09PVcpOjApfSxbU10pLGs9bS51c2VDYWxsYmFjaygoKT0+e2NvbnN0IFA9aXQocC5jdXJyZW50KSxXPWN0KGAjJHtkLmN1cnJlbnR9IFtkYXRhLWNvbWJvYm94LW9wdGlvbl1gLFApO3JldHVybiBTKFRwKHUuY3VycmVudCxXLGEpKX0sW1MsYV0pLF89bS51c2VDYWxsYmFjaygoKT0+e2NvbnN0IFA9aXQocC5jdXJyZW50KSxXPWN0KGAjJHtkLmN1cnJlbnR9IFtkYXRhLWNvbWJvYm94LW9wdGlvbl1gLFApO3JldHVybiBTKCRwKHUuY3VycmVudCxXLGEpKX0sW1MsYV0pLCQ9bS51c2VDYWxsYmFjaygoKT0+e2NvbnN0IFA9aXQocC5jdXJyZW50KTtyZXR1cm4gUyhQcChjdChgIyR7ZC5jdXJyZW50fSBbZGF0YS1jb21ib2JveC1vcHRpb25dYCxQKSkpfSxbU10pLE89bS51c2VDYWxsYmFjaygoUD0ic2VsZWN0ZWQiLFcpPT57aWYodHlwZW9mIFA9PSJudW1iZXIiKXt1LmN1cnJlbnQ9UDtjb25zdCBJPWl0KHAuY3VycmVudCksej1jdChgIyR7ZC5jdXJyZW50fSBbZGF0YS1jb21ib2JveC1vcHRpb25dYCxJKTtXPy5zY3JvbGxJbnRvVmlldyYmeltQXT8uc2Nyb2xsSW50b1ZpZXcoe2Jsb2NrOiJuZWFyZXN0IixiZWhhdmlvcjppfSk7cmV0dXJufWcuY3VycmVudD13aW5kb3cuc2V0VGltZW91dCgoKT0+e2NvbnN0IEk9aXQocC5jdXJyZW50KSx6PWN0KGAjJHtkLmN1cnJlbnR9IFtkYXRhLWNvbWJvYm94LW9wdGlvbl1gLEkpLEs9ei5maW5kSW5kZXgobGU9PmxlLmhhc0F0dHJpYnV0ZShgZGF0YS1jb21ib2JveC0ke1B9YCkpO3UuY3VycmVudD1LLFc/LnNjcm9sbEludG9WaWV3JiZ6W0tdPy5zY3JvbGxJbnRvVmlldyh7YmxvY2s6Im5lYXJlc3QiLGJlaGF2aW9yOml9KX0sMCl9LFtdKSxUPW0udXNlQ2FsbGJhY2soKCk9Pnt1LmN1cnJlbnQ9LTEsdygpfSxbd10pLEE9bS51c2VDYWxsYmFjaygoKT0+e2NvbnN0IFA9aXQocC5jdXJyZW50KTtjdChgIyR7ZC5jdXJyZW50fSBbZGF0YS1jb21ib2JveC1vcHRpb25dYCxQKT8uW3UuY3VycmVudF0/LmNsaWNrKCl9LFtdKSxEPW0udXNlQ2FsbGJhY2soUD0+e2QuY3VycmVudD1QfSxbXSksVj1tLnVzZUNhbGxiYWNrKCgpPT57aC5jdXJyZW50PXdpbmRvdy5zZXRUaW1lb3V0KCgpPT5mLmN1cnJlbnQ/LmZvY3VzKCksMCl9LFtdKSxYPW0udXNlQ2FsbGJhY2soKCk9Pnt5LmN1cnJlbnQ9d2luZG93LnNldFRpbWVvdXQoKCk9PnAuY3VycmVudD8uZm9jdXMoKSwwKX0sW10pLEo9bS51c2VDYWxsYmFjaygoKT0+dS5jdXJyZW50LFtdKTtyZXR1cm4gbS51c2VFZmZlY3QoKCk9PigpPT57d2luZG93LmNsZWFyVGltZW91dChoLmN1cnJlbnQpLHdpbmRvdy5jbGVhclRpbWVvdXQoeS5jdXJyZW50KSx3aW5kb3cuY2xlYXJUaW1lb3V0KGcuY3VycmVudCl9LFtdKSx7ZHJvcGRvd25PcGVuZWQ6bCxvcGVuRHJvcGRvd246dixjbG9zZURyb3Bkb3duOngsdG9nZ2xlRHJvcGRvd246aixzZWxlY3RlZE9wdGlvbkluZGV4OnUuY3VycmVudCxnZXRTZWxlY3RlZE9wdGlvbkluZGV4Okosc2VsZWN0T3B0aW9uOlMsc2VsZWN0Rmlyc3RPcHRpb246JCxzZWxlY3RBY3RpdmVPcHRpb246QyxzZWxlY3ROZXh0T3B0aW9uOmssc2VsZWN0UHJldmlvdXNPcHRpb246XyxyZXNldFNlbGVjdGVkT3B0aW9uOlQsdXBkYXRlU2VsZWN0ZWRPcHRpb25JbmRleDpPLGxpc3RJZDpkLmN1cnJlbnQsc2V0TGlzdElkOkQsY2xpY2tTZWxlY3RlZE9wdGlvbjpBLHNlYXJjaFJlZjpmLGZvY3VzU2VhcmNoSW5wdXQ6Vix0YXJnZXRSZWY6cCxmb2N1c1RhcmdldDpYfX1jb25zdCBFcD17a2VlcE1vdW50ZWQ6ITAsd2l0aGluUG9ydGFsOiEwLHJlc2V0U2VsZWN0aW9uT25PcHRpb25Ib3ZlcjohMSx3aWR0aDoidGFyZ2V0Iix0cmFuc2l0aW9uUHJvcHM6e3RyYW5zaXRpb246ImZhZGUiLGR1cmF0aW9uOjB9LHNpemU6InNtIn0sVmk9KGUse3NpemU6dCxkcm9wZG93blBhZGRpbmc6bn0pPT4oe29wdGlvbnM6eyItLWNvbWJvYm94LW9wdGlvbi1meiI6T2UodCksIi0tY29tYm9ib3gtb3B0aW9uLXBhZGRpbmciOm1lKHQsImNvbWJvYm94LW9wdGlvbi1wYWRkaW5nIil9LGRyb3Bkb3duOnsiLS1jb21ib2JveC1wYWRkaW5nIjpuPT09dm9pZCAwP3ZvaWQgMDpOKG4pLCItLWNvbWJvYm94LW9wdGlvbi1meiI6T2UodCksIi0tY29tYm9ib3gtb3B0aW9uLXBhZGRpbmciOm1lKHQsImNvbWJvYm94LW9wdGlvbi1wYWRkaW5nIil9fSksZWU9ZT0+e2NvbnN0IHQ9TSgiQ29tYm9ib3giLEVwLGUpLHtjbGFzc05hbWVzOm4sc3R5bGVzOnIsdW5zdHlsZWQ6cyxjaGlsZHJlbjphLHN0b3JlOmksdmFyczpsLG9uT3B0aW9uU3VibWl0OmMsb25DbG9zZTpkLHNpemU6dSxkcm9wZG93blBhZGRpbmc6ZixyZXNldFNlbGVjdGlvbk9uT3B0aW9uSG92ZXI6cCxfX3N0YXRpY1NlbGVjdG9yOmgscmVhZE9ubHk6eSxhdHRyaWJ1dGVzOmcsLi4udn09dCx4PUJpKCksaj1pfHx4LHc9dGUoe25hbWU6aHx8IkNvbWJvYm94IixjbGFzc2VzOlJlLHByb3BzOnQsY2xhc3NOYW1lczpuLHN0eWxlczpyLHVuc3R5bGVkOnMsYXR0cmlidXRlczpnLHZhcnM6bCx2YXJzUmVzb2x2ZXI6Vml9KSxTPSgpPT57ZD8uKCksai5jbG9zZURyb3Bkb3duKCl9O3JldHVybiBvLmpzeChDcCx7dmFsdWU6e2dldFN0eWxlczp3LHN0b3JlOmosb25PcHRpb25TdWJtaXQ6YyxzaXplOnUscmVzZXRTZWxlY3Rpb25Pbk9wdGlvbkhvdmVyOnAscmVhZE9ubHk6eX0sY2hpbGRyZW46by5qc3goTWUse29wZW5lZDpqLmRyb3Bkb3duT3BlbmVkLHByZXZlbnRQb3NpdGlvbkNoYW5nZVdoZW5WaXNpYmxlOiExLC4uLnYsb25DaGFuZ2U6Qz0+IUMmJlMoKSx3aXRoUm9sZXM6ITEsdW5zdHlsZWQ6cyxjaGlsZHJlbjphfSl9KX0sQXA9ZT0+ZTtlZS5leHRlbmQ9QXA7ZWUuY2xhc3Nlcz1SZTtlZS52YXJzUmVzb2x2ZXI9Vmk7ZWUuZGlzcGxheU5hbWU9IkBtYW50aW5lL2NvcmUvQ29tYm9ib3giO2VlLlRhcmdldD16aTtlZS5Ecm9wZG93bj1GbztlZS5PcHRpb25zPXFvO2VlLk9wdGlvbj1IbztlZS5TZWFyY2g9WW87ZWUuRW1wdHk9SW87ZWUuQ2hldnJvbj1icjtlZS5Gb290ZXI9Qm87ZWUuSGVhZGVyPVdvO2VlLkV2ZW50c1RhcmdldD1GaTtlZS5Ecm9wZG93blRhcmdldD1MaTtlZS5Hcm91cD1WbztlZS5DbGVhckJ1dHRvbj1EaTtlZS5IaWRkZW5JbnB1dD1JaTtmdW5jdGlvbiBPcCh7c2l6ZTplLHN0eWxlOnQsLi4ubn0pe3JldHVybiBvLmpzeCgic3ZnIix7dmlld0JveDoiMCAwIDEwIDciLGZpbGw6Im5vbmUiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsc3R5bGU6ZSE9PXZvaWQgMD97d2lkdGg6TihlKSxoZWlnaHQ6TihlKSwuLi50fTp0LCJhcmlhLWhpZGRlbiI6ITAsLi4ubixjaGlsZHJlbjpvLmpzeCgicGF0aCIse2Q6Ik00IDQuNTg2TDEuNzA3IDIuMjkzQTEgMSAwIDEgMCAuMjkzIDMuNzA3bDMgM2EuOTk3Ljk5NyAwIDAgMCAxLjQxNCAwbDUtNUExIDEgMCAxIDAgOC4yOTMuMjkzTDQgNC41ODZ6IixmaWxsOiJjdXJyZW50Q29sb3IiLGZpbGxSdWxlOiJldmVub2RkIixjbGlwUnVsZToiZXZlbm9kZCJ9KX0pfWZ1bmN0aW9uIFNuKGUpe3JldHVybiJncm91cCJpbiBlfWZ1bmN0aW9uIFdpKHtvcHRpb25zOmUsc2VhcmNoOnQsbGltaXQ6bn0pe2NvbnN0IHI9dC50cmltKCkudG9Mb3dlckNhc2UoKSxzPVtdO2ZvcihsZXQgYT0wO2E8ZS5sZW5ndGg7YSs9MSl7Y29uc3QgaT1lW2FdO2lmKHMubGVuZ3RoPT09bilyZXR1cm4gcztTbihpKSYmcy5wdXNoKHtncm91cDppLmdyb3VwLGl0ZW1zOldpKHtvcHRpb25zOmkuaXRlbXMsc2VhcmNoOnQsbGltaXQ6bi1zLmxlbmd0aH0pfSksU24oaSl8fGkubGFiZWwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhyKSYmcy5wdXNoKGkpfXJldHVybiBzfWZ1bmN0aW9uIE1wKGUpe2lmKGUubGVuZ3RoPT09MClyZXR1cm4hMDtmb3IoY29uc3QgdCBvZiBlKWlmKCEoImdyb3VwImluIHQpfHx0Lml0ZW1zLmxlbmd0aD4wKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIEhpKGUsdD1uZXcgU2V0KXtpZihBcnJheS5pc0FycmF5KGUpKWZvcihjb25zdCBuIG9mIGUpaWYoU24obikpSGkobi5pdGVtcyx0KTtlbHNle2lmKHR5cGVvZiBuLnZhbHVlPiJ1Iil0aHJvdyBuZXcgRXJyb3IoIltAbWFudGluZS9jb3JlXSBFYWNoIG9wdGlvbiBtdXN0IGhhdmUgdmFsdWUgcHJvcGVydHkiKTtpZih0LmhhcyhuLnZhbHVlKSl0aHJvdyBuZXcgRXJyb3IoYFtAbWFudGluZS9jb3JlXSBEdXBsaWNhdGUgb3B0aW9ucyBhcmUgbm90IHN1cHBvcnRlZC4gT3B0aW9uIHdpdGggdmFsdWUgIiR7bi52YWx1ZX0iIHdhcyBwcm92aWRlZCBtb3JlIHRoYW4gb25jZWApO3QuYWRkKG4udmFsdWUpfX1mdW5jdGlvbiBEcChlLHQpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2UuaW5jbHVkZXModCk6ZT09PXR9ZnVuY3Rpb24gcWkoe2RhdGE6ZSx3aXRoQ2hlY2tJY29uOnQsd2l0aEFsaWduZWRMYWJlbHM6bix2YWx1ZTpyLGNoZWNrSWNvblBvc2l0aW9uOnMsdW5zdHlsZWQ6YSxyZW5kZXJPcHRpb246aX0pe2lmKCFTbihlKSl7Y29uc3QgYz1EcChyLGUudmFsdWUpLGQ9dCYmKGM/by5qc3goT3Ase2NsYXNzTmFtZTpSZS5vcHRpb25zRHJvcGRvd25DaGVja0ljb259KTpuP28uanN4KCJkaXYiLHtjbGFzc05hbWU6UmUub3B0aW9uc0Ryb3Bkb3duQ2hlY2tQbGFjZWhvbGRlcn0pOm51bGwpLHU9by5qc3hzKG8uRnJhZ21lbnQse2NoaWxkcmVuOltzPT09ImxlZnQiJiZkLG8uanN4KCJzcGFuIix7Y2hpbGRyZW46ZS5sYWJlbH0pLHM9PT0icmlnaHQiJiZkXX0pO3JldHVybiBvLmpzeChlZS5PcHRpb24se3ZhbHVlOmUudmFsdWUsZGlzYWJsZWQ6ZS5kaXNhYmxlZCxjbGFzc05hbWU6X2Uoe1tSZS5vcHRpb25zRHJvcGRvd25PcHRpb25dOiFhfSksImRhdGEtcmV2ZXJzZSI6cz09PSJyaWdodCJ8fHZvaWQgMCwiZGF0YS1jaGVja2VkIjpjfHx2b2lkIDAsImFyaWEtc2VsZWN0ZWQiOmMsYWN0aXZlOmMsY2hpbGRyZW46dHlwZW9mIGk9PSJmdW5jdGlvbiI/aSh7b3B0aW9uOmUsY2hlY2tlZDpjfSk6dX0pfWNvbnN0IGw9ZS5pdGVtcy5tYXAoYz0+by5qc3gocWkse2RhdGE6Yyx2YWx1ZTpyLHVuc3R5bGVkOmEsd2l0aENoZWNrSWNvbjp0LHdpdGhBbGlnbmVkTGFiZWxzOm4sY2hlY2tJY29uUG9zaXRpb246cyxyZW5kZXJPcHRpb246aX0sYCR7Yy52YWx1ZX1gKSk7cmV0dXJuIG8uanN4KGVlLkdyb3VwLHtsYWJlbDplLmdyb3VwLGNoaWxkcmVuOmx9KX1mdW5jdGlvbiBMcCh7ZGF0YTplLGhpZGRlbjp0LGhpZGRlbldoZW5FbXB0eTpuLGZpbHRlcjpyLHNlYXJjaDpzLGxpbWl0OmEsbWF4RHJvcGRvd25IZWlnaHQ6aSx3aXRoU2Nyb2xsQXJlYTpsPSEwLGZpbHRlck9wdGlvbnM6Yz0hMCx3aXRoQ2hlY2tJY29uOmQ9ITEsd2l0aEFsaWduZWRMYWJlbHM6dT0hMSx2YWx1ZTpmLGNoZWNrSWNvblBvc2l0aW9uOnAsbm90aGluZ0ZvdW5kTWVzc2FnZTpoLHVuc3R5bGVkOnksbGFiZWxJZDpnLHJlbmRlck9wdGlvbjp2LHNjcm9sbEFyZWFQcm9wczp4LCJhcmlhLWxhYmVsIjpqfSl7SGkoZSk7Y29uc3Qgdz10eXBlb2Ygcz09InN0cmluZyI/KHJ8fFdpKSh7b3B0aW9uczplLHNlYXJjaDpjP3M6IiIsbGltaXQ6YT8/MS8wfSk6ZSxTPU1wKHcpLEM9dy5tYXAoaz0+by5qc3gocWkse2RhdGE6ayx3aXRoQ2hlY2tJY29uOmQsd2l0aEFsaWduZWRMYWJlbHM6dSx2YWx1ZTpmLGNoZWNrSWNvblBvc2l0aW9uOnAsdW5zdHlsZWQ6eSxyZW5kZXJPcHRpb246dn0sU24oayk/ay5ncm91cDpgJHtrLnZhbHVlfWApKTtyZXR1cm4gby5qc3goZWUuRHJvcGRvd24se2hpZGRlbjp0fHxuJiZTLCJkYXRhLWNvbXBvc2VkIjohMCxjaGlsZHJlbjpvLmpzeHMoZWUuT3B0aW9ucyx7bGFiZWxsZWRCeTpnLCJhcmlhLWxhYmVsIjpqLGNoaWxkcmVuOltsP28uanN4KF90LkF1dG9zaXplLHttYWg6aT8/MjIwLHR5cGU6InNjcm9sbCIsc2Nyb2xsYmFyU2l6ZToidmFyKC0tY29tYm9ib3gtcGFkZGluZykiLG9mZnNldFNjcm9sbGJhcnM6InkiLC4uLngsY2hpbGRyZW46Q30pOkMsUyYmaCYmby5qc3goZWUuRW1wdHkse2NoaWxkcmVuOmh9KV19KX0pfXZhciBZaT17cm9vdDoibV8zNDdkYjBlYyIsInJvb3QtLWRvdCI6Im1fZmJkODFlM2QiLGxhYmVsOiJtXzVhZGQ1MDJhIixzZWN0aW9uOiJtXzkxZmRkYTliIn07Y29uc3QgVWk9KGUse3JhZGl1czp0LGNvbG9yOm4sZ3JhZGllbnQ6cix2YXJpYW50OnMsc2l6ZTphLGF1dG9Db250cmFzdDppLGNpcmNsZTpsfSk9Pntjb25zdCBjPWUudmFyaWFudENvbG9yUmVzb2x2ZXIoe2NvbG9yOm58fGUucHJpbWFyeUNvbG9yLHRoZW1lOmUsZ3JhZGllbnQ6cix2YXJpYW50OnN8fCJmaWxsZWQiLGF1dG9Db250cmFzdDppfSk7cmV0dXJue3Jvb3Q6eyItLWJhZGdlLWhlaWdodCI6bWUoYSwiYmFkZ2UtaGVpZ2h0IiksIi0tYmFkZ2UtcGFkZGluZy14IjptZShhLCJiYWRnZS1wYWRkaW5nLXgiKSwiLS1iYWRnZS1meiI6bWUoYSwiYmFkZ2UtZnoiKSwiLS1iYWRnZS1yYWRpdXMiOmx8fHQ9PT12b2lkIDA/dm9pZCAwOm10KHQpLCItLWJhZGdlLWJnIjpufHxzP2MuYmFja2dyb3VuZDp2b2lkIDAsIi0tYmFkZ2UtY29sb3IiOm58fHM/Yy5jb2xvcjp2b2lkIDAsIi0tYmFkZ2UtYmQiOm58fHM/Yy5ib3JkZXI6dm9pZCAwLCItLWJhZGdlLWRvdC1jb2xvciI6cz09PSJkb3QiP3B0KG4sZSk6dm9pZCAwfX19LGR0PWd0KGU9Pntjb25zdCB0PU0oIkJhZGdlIixudWxsLGUpLHtjbGFzc05hbWVzOm4sY2xhc3NOYW1lOnIsc3R5bGU6cyxzdHlsZXM6YSx1bnN0eWxlZDppLHZhcnM6bCxyYWRpdXM6Yyxjb2xvcjpkLGdyYWRpZW50OnUsbGVmdFNlY3Rpb246ZixyaWdodFNlY3Rpb246cCxjaGlsZHJlbjpoLHZhcmlhbnQ6eSxmdWxsV2lkdGg6ZyxhdXRvQ29udHJhc3Q6dixjaXJjbGU6eCxtb2Q6aixhdHRyaWJ1dGVzOncsLi4uU309dCxDPXRlKHtuYW1lOiJCYWRnZSIscHJvcHM6dCxjbGFzc2VzOllpLGNsYXNzTmFtZTpyLHN0eWxlOnMsY2xhc3NOYW1lczpuLHN0eWxlczphLHVuc3R5bGVkOmksYXR0cmlidXRlczp3LHZhcnM6bCx2YXJzUmVzb2x2ZXI6VWl9KTtyZXR1cm4gby5qc3hzKHEse3ZhcmlhbnQ6eSxtb2Q6W3tibG9jazpnLGNpcmNsZTp4LCJ3aXRoLXJpZ2h0LXNlY3Rpb24iOiEhcCwid2l0aC1sZWZ0LXNlY3Rpb24iOiEhZn0sal0sLi4uQygicm9vdCIse3ZhcmlhbnQ6eX0pLC4uLlMsY2hpbGRyZW46W2YmJm8uanN4KCJzcGFuIix7Li4uQygic2VjdGlvbiIpLCJkYXRhLXBvc2l0aW9uIjoibGVmdCIsY2hpbGRyZW46Zn0pLG8uanN4KCJzcGFuIix7Li4uQygibGFiZWwiKSxjaGlsZHJlbjpofSkscCYmby5qc3goInNwYW4iLHsuLi5DKCJzZWN0aW9uIiksImRhdGEtcG9zaXRpb24iOiJyaWdodCIsY2hpbGRyZW46cH0pXX0pfSk7ZHQuY2xhc3Nlcz1ZaTtkdC52YXJzUmVzb2x2ZXI9VWk7ZHQuZGlzcGxheU5hbWU9IkBtYW50aW5lL2NvcmUvQmFkZ2UiO3ZhciBsbj17cm9vdDoibV83N2M5ZDI3ZCIsaW5uZXI6Im1fODBmMTMwMWIiLGxhYmVsOiJtXzgxMTU2MGI5IixzZWN0aW9uOiJtX2E3NDAzNmEiLGxvYWRlcjoibV9hMjViODZlZSIsZ3JvdXA6Im1fODBkNmQ4NDQiLGdyb3VwU2VjdGlvbjoibV83MGJlMmEwMSJ9O2NvbnN0IElzPXtvcmllbnRhdGlvbjoiaG9yaXpvbnRhbCJ9LEdpPShlLHtib3JkZXJXaWR0aDp0fSk9Pih7Z3JvdXA6eyItLWJ1dHRvbi1ib3JkZXItd2lkdGgiOk4odCl9fSkseXI9WShlPT57Y29uc3QgdD1NKCJCdXR0b25Hcm91cCIsSXMsZSkse2NsYXNzTmFtZTpuLHN0eWxlOnIsY2xhc3NOYW1lczpzLHN0eWxlczphLHVuc3R5bGVkOmksb3JpZW50YXRpb246bCx2YXJzOmMsYm9yZGVyV2lkdGg6ZCxtb2Q6dSxhdHRyaWJ1dGVzOmYsLi4ucH09TSgiQnV0dG9uR3JvdXAiLElzLGUpO3JldHVybiBvLmpzeChxLHsuLi50ZSh7bmFtZToiQnV0dG9uR3JvdXAiLHByb3BzOnQsY2xhc3NlczpsbixjbGFzc05hbWU6bixzdHlsZTpyLGNsYXNzTmFtZXM6cyxzdHlsZXM6YSx1bnN0eWxlZDppLGF0dHJpYnV0ZXM6Zix2YXJzOmMsdmFyc1Jlc29sdmVyOkdpLHJvb3RTZWxlY3RvcjoiZ3JvdXAifSkoImdyb3VwIiksbW9kOlt7ImRhdGEtb3JpZW50YXRpb24iOmx9LHVdLHJvbGU6Imdyb3VwIiwuLi5wfSl9KTt5ci5jbGFzc2VzPWxuO3lyLnZhcnNSZXNvbHZlcj1HaTt5ci5kaXNwbGF5TmFtZT0iQG1hbnRpbmUvY29yZS9CdXR0b25Hcm91cCI7Y29uc3QgWGk9KGUse3JhZGl1czp0LGNvbG9yOm4sZ3JhZGllbnQ6cix2YXJpYW50OnMsYXV0b0NvbnRyYXN0OmEsc2l6ZTppfSk9Pntjb25zdCBsPWUudmFyaWFudENvbG9yUmVzb2x2ZXIoe2NvbG9yOm58fGUucHJpbWFyeUNvbG9yLHRoZW1lOmUsZ3JhZGllbnQ6cix2YXJpYW50OnN8fCJmaWxsZWQiLGF1dG9Db250cmFzdDphfSk7cmV0dXJue2dyb3VwU2VjdGlvbjp7Ii0tc2VjdGlvbi1oZWlnaHQiOm1lKGksInNlY3Rpb24taGVpZ2h0IiksIi0tc2VjdGlvbi1wYWRkaW5nLXgiOm1lKGksInNlY3Rpb24tcGFkZGluZy14IiksIi0tc2VjdGlvbi1meiI6aT8uaW5jbHVkZXMoImNvbXBhY3QiKT9PZShpLnJlcGxhY2UoImNvbXBhY3QtIiwiIikpOk9lKGkpLCItLXNlY3Rpb24tcmFkaXVzIjp0PT09dm9pZCAwP3ZvaWQgMDptdCh0KSwiLS1zZWN0aW9uLWJnIjpufHxzP2wuYmFja2dyb3VuZDp2b2lkIDAsIi0tc2VjdGlvbi1jb2xvciI6bC5jb2xvciwiLS1zZWN0aW9uLWJkIjpufHxzP2wuYm9yZGVyOnZvaWQgMH19fSx2cj1ZKGU9Pntjb25zdCB0PU0oIkJ1dHRvbkdyb3VwU2VjdGlvbiIsbnVsbCxlKSx7Y2xhc3NOYW1lOm4sc3R5bGU6cixjbGFzc05hbWVzOnMsc3R5bGVzOmEsdW5zdHlsZWQ6aSx2YXJzOmwsZ3JhZGllbnQ6YyxyYWRpdXM6ZCxhdXRvQ29udHJhc3Q6dSxhdHRyaWJ1dGVzOmYsLi4ucH09dDtyZXR1cm4gby5qc3gocSx7Li4udGUoe25hbWU6IkJ1dHRvbkdyb3VwU2VjdGlvbiIscHJvcHM6dCxjbGFzc2VzOmxuLGNsYXNzTmFtZTpuLHN0eWxlOnIsY2xhc3NOYW1lczpzLHN0eWxlczphLHVuc3R5bGVkOmksYXR0cmlidXRlczpmLHZhcnM6bCx2YXJzUmVzb2x2ZXI6WGkscm9vdFNlbGVjdG9yOiJncm91cFNlY3Rpb24ifSkoImdyb3VwU2VjdGlvbiIpLC4uLnB9KX0pO3ZyLmNsYXNzZXM9bG47dnIudmFyc1Jlc29sdmVyPVhpO3ZyLmRpc3BsYXlOYW1lPSJAbWFudGluZS9jb3JlL0J1dHRvbkdyb3VwU2VjdGlvbiI7Y29uc3QgRnA9e2luOntvcGFjaXR5OjEsdHJhbnNmb3JtOmB0cmFuc2xhdGUoLTUwJSwgY2FsYygtNTAlICsgJHtOKDEpfSkpYH0sb3V0OntvcGFjaXR5OjAsdHJhbnNmb3JtOiJ0cmFuc2xhdGUoLTUwJSwgLTIwMCUpIn0sY29tbW9uOnt0cmFuc2Zvcm1PcmlnaW46ImNlbnRlciJ9LHRyYW5zaXRpb25Qcm9wZXJ0eToidHJhbnNmb3JtLCBvcGFjaXR5In0sS2k9KGUse3JhZGl1czp0LGNvbG9yOm4sZ3JhZGllbnQ6cix2YXJpYW50OnMsc2l6ZTphLGp1c3RpZnk6aSxhdXRvQ29udHJhc3Q6bH0pPT57Y29uc3QgYz1lLnZhcmlhbnRDb2xvclJlc29sdmVyKHtjb2xvcjpufHxlLnByaW1hcnlDb2xvcix0aGVtZTplLGdyYWRpZW50OnIsdmFyaWFudDpzfHwiZmlsbGVkIixhdXRvQ29udHJhc3Q6bH0pO3JldHVybntyb290OnsiLS1idXR0b24tanVzdGlmeSI6aSwiLS1idXR0b24taGVpZ2h0IjptZShhLCJidXR0b24taGVpZ2h0IiksIi0tYnV0dG9uLXBhZGRpbmcteCI6bWUoYSwiYnV0dG9uLXBhZGRpbmcteCIpLCItLWJ1dHRvbi1meiI6YT8uaW5jbHVkZXMoImNvbXBhY3QiKT9PZShhLnJlcGxhY2UoImNvbXBhY3QtIiwiIikpOk9lKGEpLCItLWJ1dHRvbi1yYWRpdXMiOnQ9PT12b2lkIDA/dm9pZCAwOm10KHQpLCItLWJ1dHRvbi1iZyI6bnx8cz9jLmJhY2tncm91bmQ6dm9pZCAwLCItLWJ1dHRvbi1ob3ZlciI6bnx8cz9jLmhvdmVyOnZvaWQgMCwiLS1idXR0b24tY29sb3IiOmMuY29sb3IsIi0tYnV0dG9uLWJkIjpufHxzP2MuYm9yZGVyOnZvaWQgMCwiLS1idXR0b24taG92ZXItY29sb3IiOm58fHM/Yy5ob3ZlckNvbG9yOnZvaWQgMH19fSxFPWd0KGU9Pntjb25zdCB0PU0oIkJ1dHRvbiIsbnVsbCxlKSx7c3R5bGU6bix2YXJzOnIsY2xhc3NOYW1lOnMsY29sb3I6YSxkaXNhYmxlZDppLGNoaWxkcmVuOmwsbGVmdFNlY3Rpb246YyxyaWdodFNlY3Rpb246ZCxmdWxsV2lkdGg6dSx2YXJpYW50OmYscmFkaXVzOnAsbG9hZGluZzpoLGxvYWRlclByb3BzOnksZ3JhZGllbnQ6ZyxjbGFzc05hbWVzOnYsc3R5bGVzOngsdW5zdHlsZWQ6aiwiZGF0YS1kaXNhYmxlZCI6dyxhdXRvQ29udHJhc3Q6Uyxtb2Q6QyxhdHRyaWJ1dGVzOmssLi4uX309dCwkPXRlKHtuYW1lOiJCdXR0b24iLHByb3BzOnQsY2xhc3NlczpsbixjbGFzc05hbWU6cyxzdHlsZTpuLGNsYXNzTmFtZXM6dixzdHlsZXM6eCx1bnN0eWxlZDpqLGF0dHJpYnV0ZXM6ayx2YXJzOnIsdmFyc1Jlc29sdmVyOktpfSksTz0hIWMsVD0hIWQ7cmV0dXJuIG8uanN4cyhmcix7Li4uJCgicm9vdCIse2FjdGl2ZTohaSYmIWgmJiF3fSksdW5zdHlsZWQ6aix2YXJpYW50OmYsZGlzYWJsZWQ6aXx8aCxtb2Q6W3tkaXNhYmxlZDppfHx3LGxvYWRpbmc6aCxibG9jazp1LCJ3aXRoLWxlZnQtc2VjdGlvbiI6Tywid2l0aC1yaWdodC1zZWN0aW9uIjpUfSxDXSwuLi5fLGNoaWxkcmVuOlt0eXBlb2YgaD09ImJvb2xlYW4iJiZvLmpzeChzbix7bW91bnRlZDpoLHRyYW5zaXRpb246RnAsZHVyYXRpb246MTUwLGNoaWxkcmVuOkE9Pm8uanN4KHEse2NvbXBvbmVudDoic3BhbiIsLi4uJCgibG9hZGVyIix7c3R5bGU6QX0pLCJhcmlhLWhpZGRlbiI6ITAsY2hpbGRyZW46by5qc3goYW4se2NvbG9yOiJ2YXIoLS1idXR0b24tY29sb3IpIixzaXplOiJjYWxjKHZhcigtLWJ1dHRvbi1oZWlnaHQpIC8gMS44KSIsLi4ueX0pfSl9KSxvLmpzeHMoInNwYW4iLHsuLi4kKCJpbm5lciIpLGNoaWxkcmVuOltjJiZvLmpzeChxLHtjb21wb25lbnQ6InNwYW4iLC4uLiQoInNlY3Rpb24iKSxtb2Q6e3Bvc2l0aW9uOiJsZWZ0In0sY2hpbGRyZW46Y30pLG8uanN4KHEse2NvbXBvbmVudDoic3BhbiIsbW9kOntsb2FkaW5nOmh9LC4uLiQoImxhYmVsIiksY2hpbGRyZW46bH0pLGQmJm8uanN4KHEse2NvbXBvbmVudDoic3BhbiIsLi4uJCgic2VjdGlvbiIpLG1vZDp7cG9zaXRpb246InJpZ2h0In0sY2hpbGRyZW46ZH0pXX0pXX0pfSk7RS5jbGFzc2VzPWxuO0UudmFyc1Jlc29sdmVyPUtpO0UuZGlzcGxheU5hbWU9IkBtYW50aW5lL2NvcmUvQnV0dG9uIjtFLkdyb3VwPXlyO0UuR3JvdXBTZWN0aW9uPXZyO3ZhciBKaT17cm9vdDoibV9iMTgzYzBhMiJ9O2NvbnN0IFppPShlLHtjb2xvcjp0fSk9Pih7cm9vdDp7Ii0tY29kZS1iZyI6dD9wdCh0LGUpOnZvaWQgMH19KSx1dD1ZKGU9Pntjb25zdCB0PU0oIkNvZGUiLG51bGwsZSkse2NsYXNzTmFtZXM6bixjbGFzc05hbWU6cixzdHlsZTpzLHN0eWxlczphLHVuc3R5bGVkOmksdmFyczpsLGNvbG9yOmMsYmxvY2s6ZCxtb2Q6dSxhdHRyaWJ1dGVzOmYsLi4ucH09dCxoPXRlKHtuYW1lOiJDb2RlIixwcm9wczp0LGNsYXNzZXM6SmksY2xhc3NOYW1lOnIsc3R5bGU6cyxjbGFzc05hbWVzOm4sc3R5bGVzOmEsdW5zdHlsZWQ6aSxhdHRyaWJ1dGVzOmYsdmFyczpsLHZhcnNSZXNvbHZlcjpaaX0pO3JldHVybiBvLmpzeChxLHtjb21wb25lbnQ6ZD8icHJlIjoiY29kZSIsbW9kOlt7YmxvY2s6ZH0sdV0sLi4uaCgicm9vdCIpLC4uLnAsZGlyOiJsdHIifSl9KTt1dC5jbGFzc2VzPUppO3V0LnZhcnNSZXNvbHZlcj1aaTt1dC5kaXNwbGF5TmFtZT0iQG1hbnRpbmUvY29yZS9Db2RlIjtjb25zdCBJcD1bImJvcmRlckJvdHRvbVdpZHRoIiwiYm9yZGVyTGVmdFdpZHRoIiwiYm9yZGVyUmlnaHRXaWR0aCIsImJvcmRlclRvcFdpZHRoIiwiYm94U2l6aW5nIiwiZm9udEZhbWlseSIsImZvbnRTaXplIiwiZm9udFN0eWxlIiwiZm9udFdlaWdodCIsImxldHRlclNwYWNpbmciLCJsaW5lSGVpZ2h0IiwicGFkZGluZ0JvdHRvbSIsInBhZGRpbmdMZWZ0IiwicGFkZGluZ1JpZ2h0IiwicGFkZGluZ1RvcCIsInRhYlNpemUiLCJ0ZXh0SW5kZW50IiwidGV4dFJlbmRlcmluZyIsInRleHRUcmFuc2Zvcm0iLCJ3aWR0aCIsIndvcmRCcmVhayIsIndvcmRTcGFjaW5nIiwic2Nyb2xsYmFyR3V0dGVyIl0senM9eyJtaW4taGVpZ2h0IjoiMCIsIm1heC1oZWlnaHQiOiJub25lIixoZWlnaHQ6IjAiLHZpc2liaWxpdHk6ImhpZGRlbiIsb3ZlcmZsb3c6ImhpZGRlbiIscG9zaXRpb246ImFic29sdXRlIiwiei1pbmRleCI6Ii0xMDAwIix0b3A6IjAiLHJpZ2h0OiIwIixkaXNwbGF5OiJibG9jayJ9O2Z1bmN0aW9uIEJzKGUpe09iamVjdC5rZXlzKHpzKS5mb3JFYWNoKHQ9PntlLnN0eWxlLnNldFByb3BlcnR5KHQsenNbdF0sImltcG9ydGFudCIpfSl9ZnVuY3Rpb24genAoZSl7Y29uc3QgdD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKTtpZih0PT09bnVsbClyZXR1cm4gbnVsbDtjb25zdCBuPXt9O2Zvcihjb25zdCByIG9mIElwKW5bcl09dFtyXTtyZXR1cm4gbi5ib3hTaXppbmc9PT0iIj9udWxsOntzaXppbmdTdHlsZTpuLHBhZGRpbmdTaXplOnBhcnNlRmxvYXQobi5wYWRkaW5nQm90dG9tKStwYXJzZUZsb2F0KG4ucGFkZGluZ1RvcCksYm9yZGVyU2l6ZTpwYXJzZUZsb2F0KG4uYm9yZGVyQm90dG9tV2lkdGgpK3BhcnNlRmxvYXQobi5ib3JkZXJUb3BXaWR0aCl9fWxldCBiZT1udWxsO2Z1bmN0aW9uIEJwKGUsdCxuPTEscj0xLzApe2JlfHwoYmU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGV4dGFyZWEiKSxiZS5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiLTEiKSxiZS5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwidHJ1ZSIpLGJlLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsImF1dG9zaXplIG1lYXN1cmVtZW50IiksQnMoYmUpKSxiZS5wYXJlbnROb2RlPT09bnVsbCYmZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiZSk7Y29uc3R7cGFkZGluZ1NpemU6cyxib3JkZXJTaXplOmEsc2l6aW5nU3R5bGU6aX09ZSx7Ym94U2l6aW5nOmx9PWk7T2JqZWN0LmtleXMoaSkuZm9yRWFjaChwPT57YmUuc3R5bGVbcF09aVtwXX0pLEJzKGJlKSxiZS52YWx1ZT10O2xldCBjPWw9PT0iYm9yZGVyLWJveCI/YmUuc2Nyb2xsSGVpZ2h0K2E6YmUuc2Nyb2xsSGVpZ2h0LXM7YmUudmFsdWU9dCxjPWw9PT0iYm9yZGVyLWJveCI/YmUuc2Nyb2xsSGVpZ2h0K2E6YmUuc2Nyb2xsSGVpZ2h0LXMsYmUudmFsdWU9IngiO2NvbnN0IGQ9YmUuc2Nyb2xsSGVpZ2h0LXM7bGV0IHU9ZCpuO2w9PT0iYm9yZGVyLWJveCImJih1PXUrcythKSxjPU1hdGgubWF4KHUsYyk7bGV0IGY9ZCpyO3JldHVybiBsPT09ImJvcmRlci1ib3giJiYoZj1mK3MrYSksYz1NYXRoLm1pbihmLGMpLFtjLGRdfWZ1bmN0aW9uIFZwKHttYXhSb3dzOmUsbWluUm93czp0LG9uQ2hhbmdlOm4scmVmOnIsLi4uc30pe2NvbnN0IGE9cy52YWx1ZSE9PXZvaWQgMCxpPW0udXNlUmVmKG51bGwpLGw9TGUoaSxyKSxjPW0udXNlUmVmKDApLGQ9KCk9Pntjb25zdCBmPWkuY3VycmVudDtpZighZilyZXR1cm47Y29uc3QgcD16cChmKTtpZighcClyZXR1cm47Y29uc3RbaF09QnAocCxmLnZhbHVlfHxmLnBsYWNlaG9sZGVyfHwieCIsdCxlKTtjLmN1cnJlbnQhPT1oJiYoYy5jdXJyZW50PWgsZi5zdHlsZS5zZXRQcm9wZXJ0eSgiaGVpZ2h0IixgJHtofXB4YCwiaW1wb3J0YW50IikpfSx1PWY9PnthfHxkKCksbj8uKGYpfTtyZXR1cm4gbS51c2VMYXlvdXRFZmZlY3QoZCksbS51c2VFZmZlY3QoKCk9Pntjb25zdCBmPSgpPT5kKCk7cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLGYpLCgpPT53aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIixmKX0sW10pLG0udXNlRWZmZWN0KCgpPT57Y29uc3QgZj0oKT0+ZCgpO3JldHVybiBkb2N1bWVudC5mb250cy5hZGRFdmVudExpc3RlbmVyKCJsb2FkaW5nZG9uZSIsZiksKCk9PmRvY3VtZW50LmZvbnRzLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRpbmdkb25lIixmKX0sW10pLG0udXNlRWZmZWN0KCgpPT57Y29uc3QgZj1wPT57aWYoaS5jdXJyZW50Py5mb3JtPT09cC50YXJnZXQmJiFhKXtjb25zdCBoPWkuY3VycmVudC52YWx1ZTtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PntpLmN1cnJlbnQmJmghPT1pLmN1cnJlbnQudmFsdWUmJmQoKX0pfX07cmV0dXJuIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigicmVzZXQiLGYpLCgpPT5kb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2V0IixmKX0sW2FdKSxvLmpzeCgidGV4dGFyZWEiLHsuLi5zLG9uQ2hhbmdlOnUscmVmOmx9KX1jb25zdCBXcD17c2l6ZToic20ifSxxZT1ZKGU9Pntjb25zdHthdXRvc2l6ZTp0LG1heFJvd3M6bixtaW5Sb3dzOnIsX19zdGF0aWNTZWxlY3RvcjpzLHJlc2l6ZTphLC4uLml9PU0oIlRleHRhcmVhIixXcCxlKSxsPXQmJmRjKCkhPT0idGVzdCIsYz1sP3ttYXhSb3dzOm4sbWluUm93czpyfTp7fTtyZXR1cm4gby5qc3goJHQse2NvbXBvbmVudDpsP1ZwOiJ0ZXh0YXJlYSIsLi4uaSxfX3N0YXRpY1NlbGVjdG9yOnN8fCJUZXh0YXJlYSIsbXVsdGlsaW5lOiEwLCJkYXRhLW5vLW92ZXJmbG93Ijp0JiZuPT09dm9pZCAwfHx2b2lkIDAsX192YXJzOnsiLS1pbnB1dC1yZXNpemUiOmF9LC4uLmN9KX0pO3FlLmNsYXNzZXM9JHQuY2xhc3NlcztxZS5kaXNwbGF5TmFtZT0iQG1hbnRpbmUvY29yZS9UZXh0YXJlYSI7Y29uc3RbSHAsY25dPUx0KCJNb2RhbCBjb21wb25lbnQgd2FzIG5vdCBmb3VuZCBpbiB0cmVlIik7dmFyIHZ0PXtyb290OiJtXzlkZjAyODIyIixjb250ZW50OiJtXzU0YzQ0NTM5Iixpbm5lcjoibV8xZjk1OGYxNiIsaGVhZGVyOiJtX2QwZTJiOWNkIn07Y29uc3QgeHI9WShlPT57Y29uc3R7Y2xhc3NOYW1lczp0LGNsYXNzTmFtZTpuLHN0eWxlOnIsc3R5bGVzOnMsdmFyczphLC4uLml9PU0oIk1vZGFsQm9keSIsbnVsbCxlKTtyZXR1cm4gby5qc3goeWksey4uLmNuKCkuZ2V0U3R5bGVzKCJib2R5Iix7Y2xhc3NOYW1lczp0LHN0eWxlOnIsc3R5bGVzOnMsY2xhc3NOYW1lOm59KSwuLi5pfSl9KTt4ci5jbGFzc2VzPXZ0O3hyLmRpc3BsYXlOYW1lPSJAbWFudGluZS9jb3JlL01vZGFsQm9keSI7Y29uc3Qgd3I9WShlPT57Y29uc3R7Y2xhc3NOYW1lczp0LGNsYXNzTmFtZTpuLHN0eWxlOnIsc3R5bGVzOnMsdmFyczphLC4uLml9PU0oIk1vZGFsQ2xvc2VCdXR0b24iLG51bGwsZSk7cmV0dXJuIG8uanN4KHZpLHsuLi5jbigpLmdldFN0eWxlcygiY2xvc2UiLHtjbGFzc05hbWVzOnQsc3R5bGU6cixzdHlsZXM6cyxjbGFzc05hbWU6bn0pLC4uLml9KX0pO3dyLmNsYXNzZXM9dnQ7d3IuZGlzcGxheU5hbWU9IkBtYW50aW5lL2NvcmUvTW9kYWxDbG9zZUJ1dHRvbiI7Y29uc3QganI9WShlPT57Y29uc3R7Y2xhc3NOYW1lczp0LGNsYXNzTmFtZTpuLHN0eWxlOnIsc3R5bGVzOnMsdmFyczphLGNoaWxkcmVuOmksX19oaWRkZW46bCwuLi5jfT1NKCJNb2RhbENvbnRlbnQiLG51bGwsZSksZD1jbigpLHU9ZC5zY3JvbGxBcmVhQ29tcG9uZW50fHx1cDtyZXR1cm4gby5qc3goeGksey4uLmQuZ2V0U3R5bGVzKCJjb250ZW50Iix7Y2xhc3NOYW1lOm4sc3R5bGU6cixzdHlsZXM6cyxjbGFzc05hbWVzOnR9KSxpbm5lclByb3BzOmQuZ2V0U3R5bGVzKCJpbm5lciIse2NsYXNzTmFtZTpuLHN0eWxlOnIsc3R5bGVzOnMsY2xhc3NOYW1lczp0fSksImRhdGEtZnVsbC1zY3JlZW4iOmQuZnVsbFNjcmVlbnx8dm9pZCAwLCJkYXRhLW1vZGFsLWNvbnRlbnQiOiEwLCJkYXRhLWhpZGRlbiI6bHx8dm9pZCAwLC4uLmMsY2hpbGRyZW46by5qc3godSx7c3R5bGU6e21heEhlaWdodDpkLmZ1bGxTY3JlZW4/IjEwMGR2aCI6YGNhbGMoMTAwZHZoIC0gKCR7TihkLnlPZmZzZXQpfSAqIDIpKWB9LGNoaWxkcmVuOml9KX0pfSk7anIuY2xhc3Nlcz12dDtqci5kaXNwbGF5TmFtZT0iQG1hbnRpbmUvY29yZS9Nb2RhbENvbnRlbnQiO2NvbnN0IFNyPVkoZT0+e2NvbnN0e2NsYXNzTmFtZXM6dCxjbGFzc05hbWU6bixzdHlsZTpyLHN0eWxlczpzLHZhcnM6YSwuLi5pfT1NKCJNb2RhbEhlYWRlciIsbnVsbCxlKTtyZXR1cm4gby5qc3god2ksey4uLmNuKCkuZ2V0U3R5bGVzKCJoZWFkZXIiLHtjbGFzc05hbWVzOnQsc3R5bGU6cixzdHlsZXM6cyxjbGFzc05hbWU6bn0pLC4uLml9KX0pO1NyLmNsYXNzZXM9dnQ7U3IuZGlzcGxheU5hbWU9IkBtYW50aW5lL2NvcmUvTW9kYWxIZWFkZXIiO2NvbnN0IENyPVkoZT0+e2NvbnN0e2NsYXNzTmFtZXM6dCxjbGFzc05hbWU6bixzdHlsZTpyLHN0eWxlczpzLHZhcnM6YSwuLi5pfT1NKCJNb2RhbE92ZXJsYXkiLG51bGwsZSk7cmV0dXJuIG8uanN4KGppLHsuLi5jbigpLmdldFN0eWxlcygib3ZlcmxheSIse2NsYXNzTmFtZXM6dCxzdHlsZTpyLHN0eWxlczpzLGNsYXNzTmFtZTpufSksLi4uaX0pfSk7Q3IuY2xhc3Nlcz12dDtDci5kaXNwbGF5TmFtZT0iQG1hbnRpbmUvY29yZS9Nb2RhbE92ZXJsYXkiO2NvbnN0IHFwPXtfX3N0YXRpY1NlbGVjdG9yOiJNb2RhbCIsY2xvc2VPbkNsaWNrT3V0c2lkZTohMCx3aXRoaW5Qb3J0YWw6ITAsbG9ja1Njcm9sbDohMCx0cmFwRm9jdXM6ITAscmV0dXJuRm9jdXM6ITAsY2xvc2VPbkVzY2FwZTohMCxrZWVwTW91bnRlZDohMSx6SW5kZXg6RnQoIm1vZGFsIiksdHJhbnNpdGlvblByb3BzOntkdXJhdGlvbjoyMDAsdHJhbnNpdGlvbjoiZmFkZS1kb3duIn0seU9mZnNldDoiNWR2aCJ9LFFpPShlLHtyYWRpdXM6dCxzaXplOm4seU9mZnNldDpyLHhPZmZzZXQ6c30pPT4oe3Jvb3Q6eyItLW1vZGFsLXJhZGl1cyI6dD09PXZvaWQgMD92b2lkIDA6bXQodCksIi0tbW9kYWwtc2l6ZSI6bWUobiwibW9kYWwtc2l6ZSIpLCItLW1vZGFsLXktb2Zmc2V0IjpOKHIpLCItLW1vZGFsLXgtb2Zmc2V0IjpOKHMpfX0pLEFuPVkoZT0+e2NvbnN0IHQ9TSgiTW9kYWxSb290IixxcCxlKSx7Y2xhc3NOYW1lczpuLGNsYXNzTmFtZTpyLHN0eWxlOnMsc3R5bGVzOmEsdW5zdHlsZWQ6aSx2YXJzOmwseU9mZnNldDpjLHNjcm9sbEFyZWFDb21wb25lbnQ6ZCxyYWRpdXM6dSxmdWxsU2NyZWVuOmYsY2VudGVyZWQ6cCx4T2Zmc2V0OmgsX19zdGF0aWNTZWxlY3Rvcjp5LGF0dHJpYnV0ZXM6ZywuLi52fT10LHg9dGUoe25hbWU6eSxjbGFzc2VzOnZ0LHByb3BzOnQsY2xhc3NOYW1lOnIsc3R5bGU6cyxjbGFzc05hbWVzOm4sc3R5bGVzOmEsdW5zdHlsZWQ6aSxhdHRyaWJ1dGVzOmcsdmFyczpsLHZhcnNSZXNvbHZlcjpRaX0pO3JldHVybiBvLmpzeChIcCx7dmFsdWU6e3lPZmZzZXQ6YyxzY3JvbGxBcmVhQ29tcG9uZW50OmQsZ2V0U3R5bGVzOngsZnVsbFNjcmVlbjpmfSxjaGlsZHJlbjpvLmpzeChiaSx7Li4ueCgicm9vdCIpLCJkYXRhLWZ1bGwtc2NyZWVuIjpmfHx2b2lkIDAsImRhdGEtY2VudGVyZWQiOnB8fHZvaWQgMCwiZGF0YS1vZmZzZXQtc2Nyb2xsYmFycyI6ZD09PV90LkF1dG9zaXplfHx2b2lkIDAsdW5zdHlsZWQ6aSwuLi52fSl9KX0pO0FuLmNsYXNzZXM9dnQ7QW4udmFyc1Jlc29sdmVyPVFpO0FuLmRpc3BsYXlOYW1lPSJAbWFudGluZS9jb3JlL01vZGFsUm9vdCI7Y29uc3QgZWw9bS5jcmVhdGVDb250ZXh0KG51bGwpO2Z1bmN0aW9uIHRsKHtjaGlsZHJlbjplfSl7Y29uc3RbdCxuXT1tLnVzZVN0YXRlKFtdKSxbcixzXT1tLnVzZVN0YXRlKEZ0KCJtb2RhbCIpKTtyZXR1cm4gby5qc3goZWwse3ZhbHVlOntzdGFjazp0LGFkZE1vZGFsOihhLGkpPT57bihsPT5bLi4ubmV3IFNldChbLi4ubCxhXSldKSxzKGw9PnR5cGVvZiBpPT0ibnVtYmVyIiYmdHlwZW9mIGw9PSJudW1iZXIiP01hdGgubWF4KGwsaSk6bCl9LHJlbW92ZU1vZGFsOmE9Pm4oaT0+aS5maWx0ZXIobD0+bCE9PWEpKSxnZXRaSW5kZXg6YT0+YGNhbGMoJHtyfSArICR7dC5pbmRleE9mKGEpfSArIDEpYCxjdXJyZW50SWQ6dFt0Lmxlbmd0aC0xXSxtYXhaSW5kZXg6cn0sY2hpbGRyZW46ZX0pfXRsLmRpc3BsYXlOYW1lPSJAbWFudGluZS9jb3JlL01vZGFsU3RhY2siO2NvbnN0IE5yPVkoZT0+e2NvbnN0e2NsYXNzTmFtZXM6dCxjbGFzc05hbWU6bixzdHlsZTpyLHN0eWxlczpzLHZhcnM6YSwuLi5pfT1NKCJNb2RhbFRpdGxlIixudWxsLGUpO3JldHVybiBvLmpzeChTaSx7Li4uY24oKS5nZXRTdHlsZXMoInRpdGxlIix7Y2xhc3NOYW1lczp0LHN0eWxlOnIsc3R5bGVzOnMsY2xhc3NOYW1lOm59KSwuLi5pfSl9KTtOci5jbGFzc2VzPXZ0O05yLmRpc3BsYXlOYW1lPSJAbWFudGluZS9jb3JlL01vZGFsVGl0bGUiO2NvbnN0IFlwPXtjbG9zZU9uQ2xpY2tPdXRzaWRlOiEwLHdpdGhpblBvcnRhbDohMCxsb2NrU2Nyb2xsOiEwLHRyYXBGb2N1czohMCxyZXR1cm5Gb2N1czohMCxjbG9zZU9uRXNjYXBlOiEwLGtlZXBNb3VudGVkOiExLHpJbmRleDpGdCgibW9kYWwiKSx0cmFuc2l0aW9uUHJvcHM6e2R1cmF0aW9uOjIwMCx0cmFuc2l0aW9uOiJmYWRlLWRvd24ifSx3aXRoT3ZlcmxheTohMCx3aXRoQ2xvc2VCdXR0b246ITB9LGllPVkoZT0+e2NvbnN0e3RpdGxlOnQsd2l0aE92ZXJsYXk6bixvdmVybGF5UHJvcHM6cix3aXRoQ2xvc2VCdXR0b246cyxjbG9zZUJ1dHRvblByb3BzOmEsY2hpbGRyZW46aSxyYWRpdXM6bCxvcGVuZWQ6YyxzdGFja0lkOmQsekluZGV4OnUsLi4uZn09TSgiTW9kYWwiLFlwLGUpLHA9bS51c2UoZWwpLGg9ISF0fHxzLHk9cCYmZD97Y2xvc2VPbkVzY2FwZTpwLmN1cnJlbnRJZD09PWQsdHJhcEZvY3VzOnAuY3VycmVudElkPT09ZCx6SW5kZXg6cC5nZXRaSW5kZXgoZCl9Ont9LGc9bj09PSExPyExOmQmJnA/cC5jdXJyZW50SWQ9PT1kOmM7cmV0dXJuIG0udXNlRWZmZWN0KCgpPT57cCYmZCYmKGM/cC5hZGRNb2RhbChkLHV8fEZ0KCJtb2RhbCIpKTpwLnJlbW92ZU1vZGFsKGQpKX0sW2MsZCx1XSksby5qc3hzKEFuLHtyYWRpdXM6bCxvcGVuZWQ6Yyx6SW5kZXg6cCYmZD9wLmdldFpJbmRleChkKTp1LC4uLmYsLi4ueSxjaGlsZHJlbjpbbiYmby5qc3goQ3Ise3Zpc2libGU6Zyx0cmFuc2l0aW9uUHJvcHM6cCYmZD97ZHVyYXRpb246MH06dm9pZCAwLC4uLnJ9KSxvLmpzeHMoanIse3JhZGl1czpsLF9faGlkZGVuOnAmJmQmJmM/ZCE9PXAuY3VycmVudElkOiExLGNoaWxkcmVuOltoJiZvLmpzeHMoU3Ise2NoaWxkcmVuOlt0JiZvLmpzeChOcix7Y2hpbGRyZW46dH0pLHMmJm8uanN4KHdyLHsuLi5hfSldfSksby5qc3goeHIse2NoaWxkcmVuOml9KV19KV19KX0pO2llLmNsYXNzZXM9dnQ7aWUuZGlzcGxheU5hbWU9IkBtYW50aW5lL2NvcmUvTW9kYWwiO2llLlJvb3Q9QW47aWUuT3ZlcmxheT1DcjtpZS5Db250ZW50PWpyO2llLkJvZHk9eHI7aWUuSGVhZGVyPVNyO2llLlRpdGxlPU5yO2llLkNsb3NlQnV0dG9uPXdyO2llLlN0YWNrPXRsO2NvbnN0IFVwPXtzaXplOiJzbSIsd2l0aENoZWNrSWNvbjohMCxhbGxvd0Rlc2VsZWN0OiEwLGNoZWNrSWNvblBvc2l0aW9uOiJsZWZ0IixvcGVuT25Gb2N1czohMH0seW49amQoZT0+e2NvbnN0IHQ9TSgiU2VsZWN0IixVcCxlKSx7Y2xhc3NOYW1lczpuLHN0eWxlczpyLHVuc3R5bGVkOnMsdmFyczphLGRyb3Bkb3duT3BlbmVkOmksZGVmYXVsdERyb3Bkb3duT3BlbmVkOmwsb25Ecm9wZG93bkNsb3NlOmMsb25Ecm9wZG93bk9wZW46ZCxvbkZvY3VzOnUsb25CbHVyOmYsb25DbGljazpwLG9uQ2hhbmdlOmgsZGF0YTp5LHZhbHVlOmcsZGVmYXVsdFZhbHVlOnYsc2VsZWN0Rmlyc3RPcHRpb25PbkNoYW5nZTp4LHNlbGVjdEZpcnN0T3B0aW9uT25Ecm9wZG93bk9wZW46aixvbk9wdGlvblN1Ym1pdDp3LGNvbWJvYm94UHJvcHM6UyxyZWFkT25seTpDLGRpc2FibGVkOmssZmlsdGVyOl8sbGltaXQ6JCx3aXRoU2Nyb2xsQXJlYTpPLG1heERyb3Bkb3duSGVpZ2h0OlQsc2l6ZTpBLHNlYXJjaGFibGU6RCxyaWdodFNlY3Rpb246VixjaGVja0ljb25Qb3NpdGlvbjpYLHdpdGhDaGVja0ljb246Six3aXRoQWxpZ25lZExhYmVsczpQLG5vdGhpbmdGb3VuZE1lc3NhZ2U6VyxuYW1lOkksZm9ybTp6LHNlYXJjaFZhbHVlOkssZGVmYXVsdFNlYXJjaFZhbHVlOmxlLG9uU2VhcmNoQ2hhbmdlOnNlLGFsbG93RGVzZWxlY3Q6Q2UsZXJyb3I6dmUscmlnaHRTZWN0aW9uUG9pbnRlckV2ZW50czpUZSxpZDp3ZSxjbGVhcmFibGU6Y2UsY2xlYXJTZWN0aW9uTW9kZTp4ZSxjbGVhckJ1dHRvblByb3BzOnVlLGhpZGRlbklucHV0UHJvcHM6TCxyZW5kZXJPcHRpb246TmUsb25DbGVhcjpmZSxhdXRvQ29tcGxldGU6ZGUsc2Nyb2xsQXJlYVByb3BzOkhlLF9fZGVmYXVsdFJpZ2h0U2VjdGlvbjpCdCxfX2NsZWFyU2VjdGlvbjpGLF9fY2xlYXJhYmxlOnh0LGNoZXZyb25Db2xvcjp3dCxhdXRvU2VsZWN0T25CbHVyOmp0LG9wZW5PbkZvY3VzOlR0LGF0dHJpYnV0ZXM6SmUsLi4uRmV9PXQsaGU9bS51c2VNZW1vKCgpPT5qcCh5KSxbeV0pLHBlPW0udXNlUmVmKHt9KSxCPW0udXNlTWVtbygoKT0+T2koaGUpLFtoZV0pLEc9bm4od2UpLFtVLGFlLFZ0XT1Kbih7dmFsdWU6ZyxkZWZhdWx0VmFsdWU6dixmaW5hbFZhbHVlOm51bGwsb25DaGFuZ2U6aH0pLFBlPVUhPW51bGw/YCR7VX1gaW4gQj9CW2Ake1V9YF06cGUuY3VycmVudFtgJHtVfWBdOnZvaWQgMCxJZT1pYyhQZSksW1d0LF9yLERuXT1Kbih7dmFsdWU6SyxkZWZhdWx0VmFsdWU6bGUsZmluYWxWYWx1ZTpQZT9QZS5sYWJlbDoiIixvbkNoYW5nZTpzZX0pLGdlPUJpKHtvcGVuZWQ6aSxkZWZhdWx0T3BlbmVkOmwsb25Ecm9wZG93bk9wZW46KCk9PntkPy4oKSxqP2dlLnNlbGVjdEZpcnN0T3B0aW9uKCk6Z2UudXBkYXRlU2VsZWN0ZWRPcHRpb25JbmRleCgiYWN0aXZlIix7c2Nyb2xsSW50b1ZpZXc6ITB9KX0sb25Ecm9wZG93bkNsb3NlOigpPT57Yz8uKCksc2V0VGltZW91dChnZS5yZXNldFNlbGVjdGVkT3B0aW9uLDApfX0pLHN0PWplPT57X3IoamUpLGdlLnJlc2V0U2VsZWN0ZWRPcHRpb24oKX0se3Jlc29sdmVkQ2xhc3NOYW1lczpMbixyZXNvbHZlZFN0eWxlczpGbn09dm8oe3Byb3BzOnQsc3R5bGVzOnIsY2xhc3NOYW1lczpufSk7bS51c2VFZmZlY3QoKCk9Pnt4JiZnZS5zZWxlY3RGaXJzdE9wdGlvbigpfSxbeCxXdF0pLG0udXNlRWZmZWN0KCgpPT57Zz09PW51bGwmJnN0KCIiKSxnIT1udWxsJiZQZSYmKEllPy52YWx1ZSE9PVBlLnZhbHVlfHxJZT8ubGFiZWwhPT1QZS5sYWJlbCkmJnN0KFBlLmxhYmVsKX0sW2csUGVdKSxtLnVzZUVmZmVjdCgoKT0+eyFWdCYmIURuJiZzdChVIT1udWxsP2Ake1V9YGluIEI/QltgJHtVfWBdPy5sYWJlbDpwZS5jdXJyZW50W2Ake1V9YF0/LmxhYmVsfHwiIjoiIil9LFtCLFVdKSxtLnVzZUVmZmVjdCgoKT0+e1UmJmAke1V9YGluIEImJihwZS5jdXJyZW50W2Ake1V9YF09QltgJHtVfWBdKX0sW0IsVV0pO2NvbnN0ICRyPW8uanN4KGVlLkNsZWFyQnV0dG9uLHsuLi51ZSxvbkNsZWFyOigpPT57YWUobnVsbCxudWxsKSxzdCgiIiksZmU/LigpfX0pLFRyPWNlJiYhIVUmJiFrJiYhQztyZXR1cm4gby5qc3hzKG8uRnJhZ21lbnQse2NoaWxkcmVuOltvLmpzeHMoZWUse3N0b3JlOmdlLF9fc3RhdGljU2VsZWN0b3I6IlNlbGVjdCIsY2xhc3NOYW1lczpMbixzdHlsZXM6Rm4sdW5zdHlsZWQ6cyxyZWFkT25seTpDLHNpemU6QSxhdHRyaWJ1dGVzOkplLGtlZXBNb3VudGVkOmp0LG9uT3B0aW9uU3VibWl0OmplPT57dz8uKGplKTtjb25zdCBaZT1DZSYmYCR7QltqZV0udmFsdWV9YD09YCR7VX1gP251bGw6QltqZV0sZG49WmU/WmUudmFsdWU6bnVsbDtkbiE9PVUmJmFlKGRuLFplKSwhVnQmJnN0KGRuIT1udWxsJiZaZT8ubGFiZWx8fCIiKSxnZS5jbG9zZURyb3Bkb3duKCl9LC4uLlMsY2hpbGRyZW46W28uanN4KGVlLlRhcmdldCx7dGFyZ2V0VHlwZTpEPyJpbnB1dCI6ImJ1dHRvbiIsYXV0b0NvbXBsZXRlOmRlLHdpdGhFeHBhbmRlZEF0dHJpYnV0ZTohMCxjaGlsZHJlbjpvLmpzeCgkdCx7aWQ6RyxfX2RlZmF1bHRSaWdodFNlY3Rpb246by5qc3goZWUuQ2hldnJvbix7c2l6ZTpBLGVycm9yOnZlLHVuc3R5bGVkOnMsY29sb3I6d3R9KSxfX2NsZWFyU2VjdGlvbjokcixfX2NsZWFyYWJsZTpUcixfX2NsZWFyU2VjdGlvbk1vZGU6eGUscmlnaHRTZWN0aW9uOlYscmlnaHRTZWN0aW9uUG9pbnRlckV2ZW50czpUZXx8Im5vbmUiLC4uLkZlLHNpemU6QSxfX3N0YXRpY1NlbGVjdG9yOiJTZWxlY3QiLGRpc2FibGVkOmsscmVhZE9ubHk6Q3x8IUQsdmFsdWU6V3Qsb25DaGFuZ2U6amU9PntzdChqZS5jdXJyZW50VGFyZ2V0LnZhbHVlKSxnZS5vcGVuRHJvcGRvd24oKSx4JiZnZS5zZWxlY3RGaXJzdE9wdGlvbigpfSxvbkZvY3VzOmplPT57VHQmJkQmJmdlLm9wZW5Ecm9wZG93bigpLHU/LihqZSl9LG9uQmx1cjpqZT0+e2p0JiZnZS5jbGlja1NlbGVjdGVkT3B0aW9uKCksRCYmZ2UuY2xvc2VEcm9wZG93bigpO2NvbnN0IFplPVUhPW51bGwmJihgJHtVfWBpbiBCP0JbYCR7VX1gXTpwZS5jdXJyZW50W2Ake1V9YF0pO3N0KFplJiZaZS5sYWJlbHx8IiIpLGY/LihqZSl9LG9uQ2xpY2s6amU9PntEP2dlLm9wZW5Ecm9wZG93bigpOmdlLnRvZ2dsZURyb3Bkb3duKCkscD8uKGplKX0sY2xhc3NOYW1lczpMbixzdHlsZXM6Rm4sdW5zdHlsZWQ6cyxwb2ludGVyOiFELGVycm9yOnZlLGF0dHJpYnV0ZXM6SmV9KX0pLG8uanN4KExwLHtkYXRhOmhlLGhpZGRlbjpDfHxrLGZpbHRlcjpfLHNlYXJjaDpXdCxsaW1pdDokLGhpZGRlbldoZW5FbXB0eTohVyx3aXRoU2Nyb2xsQXJlYTpPLG1heERyb3Bkb3duSGVpZ2h0OlQsZmlsdGVyT3B0aW9uczohIUQmJlBlPy5sYWJlbCE9PVd0LHZhbHVlOlUsY2hlY2tJY29uUG9zaXRpb246WCx3aXRoQ2hlY2tJY29uOkosd2l0aEFsaWduZWRMYWJlbHM6UCxub3RoaW5nRm91bmRNZXNzYWdlOlcsdW5zdHlsZWQ6cyxsYWJlbElkOkZlLmxhYmVsP2Ake0d9LWxhYmVsYDp2b2lkIDAsImFyaWEtbGFiZWwiOkZlLmxhYmVsP3ZvaWQgMDpGZVsiYXJpYS1sYWJlbCJdLHJlbmRlck9wdGlvbjpOZSxzY3JvbGxBcmVhUHJvcHM6SGV9KV19KSxvLmpzeChlZS5IaWRkZW5JbnB1dCx7dmFsdWU6VSxuYW1lOkksZm9ybTp6LGRpc2FibGVkOmssLi4uTH0pXX0pfSk7eW4uY2xhc3Nlcz17Li4uJHQuY2xhc3NlcywuLi5lZS5jbGFzc2VzfTt5bi5kaXNwbGF5TmFtZT0iQG1hbnRpbmUvY29yZS9TZWxlY3QiO2Z1bmN0aW9uIG5sKGUpe2lmKGUhPT12b2lkIDApcmV0dXJuIHR5cGVvZiBlPT0ibnVtYmVyIj9OKGUpOmV9ZnVuY3Rpb24gR3Aoe3NwYWNpbmc6ZSx2ZXJ0aWNhbFNwYWNpbmc6dCxjb2xzOm4sbWluQ29sV2lkdGg6cixhdXRvUm93czpzLHNlbGVjdG9yOmF9KXtjb25zdCBpPVJ0KCksbD10PT09dm9pZCAwP2U6dCxjPXIhPT12b2lkIDAsZD1Dbih7Ii0tc2ctc3BhY2luZy14IjpFZShYdChlKSksIi0tc2ctc3BhY2luZy15IjpFZShYdChsKSksIi0tc2ctYXV0by1yb3dzIjpzLC4uLmM/eyItLXNnLW1pbi1jb2wtd2lkdGgiOm5sKHIpfTp7Ii0tc2ctY29scyI6WHQobik/LnRvU3RyaW5nKCl9fSksdT1BZShpLmJyZWFrcG9pbnRzKS5yZWR1Y2UoKGYscCk9PihmW3BdfHwoZltwXT17fSksdHlwZW9mIGU9PSJvYmplY3QiJiZlW3BdIT09dm9pZCAwJiYoZltwXVsiLS1zZy1zcGFjaW5nLXgiXT1FZShlW3BdKSksdHlwZW9mIGw9PSJvYmplY3QiJiZsW3BdIT09dm9pZCAwJiYoZltwXVsiLS1zZy1zcGFjaW5nLXkiXT1FZShsW3BdKSksIWMmJnR5cGVvZiBuPT0ib2JqZWN0IiYmbltwXSE9PXZvaWQgMCYmKGZbcF1bIi0tc2ctY29scyJdPW5bcF0pLGYpLHt9KTtyZXR1cm4gby5qc3god28se3N0eWxlczpkLG1lZGlhOlVsKEFlKHUpLGkuYnJlYWtwb2ludHMpLmZpbHRlcihmPT5BZSh1W2YudmFsdWVdKS5sZW5ndGg+MCkubWFwKGY9Pih7cXVlcnk6YChtaW4td2lkdGg6ICR7aS5icmVha3BvaW50c1tmLnZhbHVlXX0pYCxzdHlsZXM6dVtmLnZhbHVlXX0pKSxzZWxlY3RvcjphfSl9ZnVuY3Rpb24gWXIoZSl7cmV0dXJuIHR5cGVvZiBlPT0ib2JqZWN0IiYmZSE9PW51bGw/QWUoZSk6W119ZnVuY3Rpb24gWHAoZSl7cmV0dXJuIGUuc29ydCgodCxuKT0+dm4odCktdm4obikpfWZ1bmN0aW9uIEtwKHtzcGFjaW5nOmUsdmVydGljYWxTcGFjaW5nOnQsY29sczpuLG1pbkNvbFdpZHRoOnJ9KXtyZXR1cm4gWHAoQXJyYXkuZnJvbShuZXcgU2V0KFsuLi5ZcihlKSwuLi5Zcih0KSwuLi5yIT09dm9pZCAwP1tdOllyKG4pXSkpKX1mdW5jdGlvbiBKcCh7c3BhY2luZzplLHZlcnRpY2FsU3BhY2luZzp0LGNvbHM6bixtaW5Db2xXaWR0aDpyLGF1dG9Sb3dzOnMsc2VsZWN0b3I6YX0pe2NvbnN0IGk9dD09PXZvaWQgMD9lOnQsbD1yIT09dm9pZCAwLGM9Q24oeyItLXNnLXNwYWNpbmcteCI6RWUoWHQoZSkpLCItLXNnLXNwYWNpbmcteSI6RWUoWHQoaSkpLCItLXNnLWF1dG8tcm93cyI6cywuLi5sP3siLS1zZy1taW4tY29sLXdpZHRoIjpubChyKX06eyItLXNnLWNvbHMiOlh0KG4pPy50b1N0cmluZygpfX0pLGQ9S3Aoe3NwYWNpbmc6ZSx2ZXJ0aWNhbFNwYWNpbmc6dCxjb2xzOm4sbWluQ29sV2lkdGg6cn0pLHU9ZC5yZWR1Y2UoKGYscCk9PihmW3BdfHwoZltwXT17fSksdHlwZW9mIGU9PSJvYmplY3QiJiZlW3BdIT09dm9pZCAwJiYoZltwXVsiLS1zZy1zcGFjaW5nLXgiXT1FZShlW3BdKSksdHlwZW9mIGk9PSJvYmplY3QiJiZpW3BdIT09dm9pZCAwJiYoZltwXVsiLS1zZy1zcGFjaW5nLXkiXT1FZShpW3BdKSksIWwmJnR5cGVvZiBuPT0ib2JqZWN0IiYmbltwXSE9PXZvaWQgMCYmKGZbcF1bIi0tc2ctY29scyJdPW5bcF0pLGYpLHt9KTtyZXR1cm4gby5qc3god28se3N0eWxlczpjLGNvbnRhaW5lcjpkLm1hcChmPT4oe3F1ZXJ5OmBzaW1wbGUtZ3JpZCAobWluLXdpZHRoOiAke2Z9KWAsc3R5bGVzOnVbZl19KSksc2VsZWN0b3I6YX0pfXZhciBybD17Y29udGFpbmVyOiJtXzkyNWMyZDJjIixyb290OiJtXzI0MTVhMTU3In07Y29uc3QgWnA9e2NvbHM6MSxzcGFjaW5nOiJtZCIsdHlwZToibWVkaWEifSxHdD1ZKGU9Pntjb25zdCB0PU0oIlNpbXBsZUdyaWQiLFpwLGUpLHtjbGFzc05hbWVzOm4sY2xhc3NOYW1lOnIsc3R5bGU6cyxzdHlsZXM6YSx1bnN0eWxlZDppLHZhcnM6bCxjb2xzOmMsdmVydGljYWxTcGFjaW5nOmQsc3BhY2luZzp1LHR5cGU6ZixtaW5Db2xXaWR0aDpwLGF1dG9GbG93OmgsYXV0b1Jvd3M6eSxhdHRyaWJ1dGVzOmcsLi4udn09dCx4PXRlKHtuYW1lOiJTaW1wbGVHcmlkIixjbGFzc2VzOnJsLHByb3BzOnQsY2xhc3NOYW1lOnIsc3R5bGU6cyxjbGFzc05hbWVzOm4sc3R5bGVzOmEsdW5zdHlsZWQ6aSxhdHRyaWJ1dGVzOmcsdmFyczpsfSksaj1kYSgpLHc9cCE9PXZvaWQgMD9ofHwiYXV0by1maWxsIjp2b2lkIDA7cmV0dXJuIGY9PT0iY29udGFpbmVyIj9vLmpzeHMoby5GcmFnbWVudCx7Y2hpbGRyZW46W28uanN4KEpwLHsuLi50LHNlbGVjdG9yOmAuJHtqfWB9KSxvLmpzeCgiZGl2Iix7Li4ueCgiY29udGFpbmVyIiksY2hpbGRyZW46by5qc3gocSx7Li4ueCgicm9vdCIse2NsYXNzTmFtZTpqfSksLi4udiwiZGF0YS1hdXRvLWNvbHMiOnd9KX0pXX0pOm8uanN4cyhvLkZyYWdtZW50LHtjaGlsZHJlbjpbby5qc3goR3Asey4uLnQsc2VsZWN0b3I6YC4ke2p9YH0pLG8uanN4KHEsey4uLngoInJvb3QiLHtjbGFzc05hbWU6an0pLC4uLnYsImRhdGEtYXV0by1jb2xzIjp3fSldfSl9KTtHdC5jbGFzc2VzPXJsO0d0LmRpc3BsYXlOYW1lPSJAbWFudGluZS9jb3JlL1NpbXBsZUdyaWQiO3ZhciBvbD17cm9vdDoibV82ZDczMTEyNyJ9O2NvbnN0IFFwPXtnYXA6Im1kIixhbGlnbjoic3RyZXRjaCIsanVzdGlmeToiZmxleC1zdGFydCJ9LHNsPShlLHtnYXA6dCxhbGlnbjpuLGp1c3RpZnk6cn0pPT4oe3Jvb3Q6eyItLXN0YWNrLWdhcCI6RWUodCksIi0tc3RhY2stYWxpZ24iOm4sIi0tc3RhY2stanVzdGlmeSI6cn19KSx5ZT1ZKGU9Pntjb25zdCB0PU0oIlN0YWNrIixRcCxlKSx7Y2xhc3NOYW1lczpuLGNsYXNzTmFtZTpyLHN0eWxlOnMsc3R5bGVzOmEsdW5zdHlsZWQ6aSx2YXJzOmwsYWxpZ246YyxqdXN0aWZ5OmQsZ2FwOnUsdmFyaWFudDpmLGF0dHJpYnV0ZXM6cCwuLi5ofT10O3JldHVybiBvLmpzeChxLHsuLi50ZSh7bmFtZToiU3RhY2siLHByb3BzOnQsY2xhc3NlczpvbCxjbGFzc05hbWU6cixzdHlsZTpzLGNsYXNzTmFtZXM6bixzdHlsZXM6YSx1bnN0eWxlZDppLGF0dHJpYnV0ZXM6cCx2YXJzOmwsdmFyc1Jlc29sdmVyOnNsfSkoInJvb3QiKSx2YXJpYW50OmYsLi4uaH0pfSk7eWUuY2xhc3Nlcz1vbDt5ZS52YXJzUmVzb2x2ZXI9c2w7eWUuZGlzcGxheU5hbWU9IkBtYW50aW5lL2NvcmUvU3RhY2siO2NvbnN0W2VtLHRtXT1MdCgiVGFibGUgY29tcG9uZW50IHdhcyBub3QgZm91bmQgaW4gdGhlIHRyZWUiKTt2YXIgT249e3RhYmxlOiJtX2IyM2ZhMGVmIix0aDoibV80ZTdhYTRmMyIsdHI6Im1fNGU3YWE0ZmQiLHRkOiJtXzRlN2FhNGVmIix0Ym9keToibV9iMjQwNDUzNyIsdGhlYWQ6Im1fYjI0MmQ5NzUiLGNhcHRpb246Im1fOWU1YTNhYzciLHNjcm9sbENvbnRhaW5lcjoibV9hMTAwYzE1IixzY3JvbGxDb250YWluZXJJbm5lcjoibV82MjI1OTc0MSJ9O2Z1bmN0aW9uIG5tKGUsdCl7aWYoIXQpcmV0dXJuO2NvbnN0IG49e307cmV0dXJuIHQuY29sdW1uQm9yZGVyJiZlLndpdGhDb2x1bW5Cb3JkZXJzJiYoblsiZGF0YS13aXRoLWNvbHVtbi1ib3JkZXIiXT0hMCksdC5yb3dCb3JkZXImJmUud2l0aFJvd0JvcmRlcnMmJihuWyJkYXRhLXdpdGgtcm93LWJvcmRlciJdPSEwKSx0LnN0cmlwZWQmJmUuc3RyaXBlZCYmKG5bImRhdGEtc3RyaXBlZCJdPWUuc3RyaXBlZCksdC5oaWdobGlnaHRPbkhvdmVyJiZlLmhpZ2hsaWdodE9uSG92ZXImJihuWyJkYXRhLWhvdmVyIl09ITApLHQuY2FwdGlvblNpZGUmJmUuY2FwdGlvblNpZGUmJihuWyJkYXRhLXNpZGUiXT1lLmNhcHRpb25TaWRlKSx0LnN0aWNreUhlYWRlciYmZS5zdGlja3lIZWFkZXImJihuWyJkYXRhLXN0aWNreSJdPSEwKSxufWZ1bmN0aW9uIHp0KGUsdCl7Y29uc3Qgbj1gVGFibGUke2UuY2hhckF0KDApLnRvVXBwZXJDYXNlKCl9JHtlLnNsaWNlKDEpfWAscj1ZKHM9Pntjb25zdCBhPU0obix7fSxzKSx7Y2xhc3NOYW1lczppLGNsYXNzTmFtZTpsLHN0eWxlOmMsc3R5bGVzOmQsLi4udX09YSxmPXRtKCk7cmV0dXJuIG8uanN4KHEse2NvbXBvbmVudDplLC4uLm5tKGYsdCksLi4uZi5nZXRTdHlsZXMoZSx7Y2xhc3NOYW1lOmwsY2xhc3NOYW1lczppLHN0eWxlOmMsc3R5bGVzOmQscHJvcHM6YX0pLC4uLnV9KX0pO3JldHVybiByLmRpc3BsYXlOYW1lPWBAbWFudGluZS9jb3JlLyR7bn1gLHIuY2xhc3Nlcz1PbixyfWNvbnN0IGxvPXp0KCJ0aCIse2NvbHVtbkJvcmRlcjohMH0pLGFsPXp0KCJ0ZCIse2NvbHVtbkJvcmRlcjohMH0pLFhuPXp0KCJ0ciIse3Jvd0JvcmRlcjohMCxzdHJpcGVkOiEwLGhpZ2hsaWdodE9uSG92ZXI6ITB9KSxpbD16dCgidGhlYWQiLHtzdGlja3lIZWFkZXI6ITB9KSxsbD16dCgidGJvZHkiKSxjbD16dCgidGZvb3QiKSxkbD16dCgiY2FwdGlvbiIse2NhcHRpb25TaWRlOiEwfSkscm09e3R5cGU6InNjcm9sbGFyZWEifSx1bD0oZSx7bWluV2lkdGg6dCxtYXhIZWlnaHQ6bix0eXBlOnJ9KT0+KHtzY3JvbGxDb250YWluZXI6eyItLXRhYmxlLW1pbi13aWR0aCI6Tih0KSwiLS10YWJsZS1tYXgtaGVpZ2h0IjpOKG4pLCItLXRhYmxlLW92ZXJmbG93IjpyPT09Im5hdGl2ZSI/ImF1dG8iOnZvaWQgMH19KSxrcj1ZKGU9Pntjb25zdCB0PU0oIlRhYmxlU2Nyb2xsQ29udGFpbmVyIixybSxlKSx7Y2xhc3NOYW1lczpuLGNsYXNzTmFtZTpyLHN0eWxlOnMsc3R5bGVzOmEsdW5zdHlsZWQ6aSx2YXJzOmwsY2hpbGRyZW46YyxtaW5XaWR0aDpkLG1heEhlaWdodDp1LHR5cGU6ZixzY3JvbGxBcmVhUHJvcHM6cCxhdHRyaWJ1dGVzOmgsLi4ueX09dCxnPXRlKHtuYW1lOiJUYWJsZVNjcm9sbENvbnRhaW5lciIsY2xhc3NlczpPbixwcm9wczp0LGNsYXNzTmFtZTpyLHN0eWxlOnMsY2xhc3NOYW1lczpuLHN0eWxlczphLHVuc3R5bGVkOmksYXR0cmlidXRlczpoLHZhcnM6bCx2YXJzUmVzb2x2ZXI6dWwscm9vdFNlbGVjdG9yOiJzY3JvbGxDb250YWluZXIifSk7cmV0dXJuIG8uanN4KHEse2NvbXBvbmVudDpmPT09InNjcm9sbGFyZWEiP190OiJkaXYiLC4uLmY9PT0ic2Nyb2xsYXJlYSI/dT97b2Zmc2V0U2Nyb2xsYmFyczoieHkiLC4uLnB9OntvZmZzZXRTY3JvbGxiYXJzOiJ4IiwuLi5wfTp7fSwuLi5nKCJzY3JvbGxDb250YWluZXIiKSwuLi55LGNoaWxkcmVuOm8uanN4KCJkaXYiLHsuLi5nKCJzY3JvbGxDb250YWluZXJJbm5lciIpLGNoaWxkcmVuOmN9KX0pfSk7a3IuY2xhc3Nlcz1Pbjtrci52YXJzUmVzb2x2ZXI9dWw7a3IuZGlzcGxheU5hbWU9IkBtYW50aW5lL2NvcmUvVGFibGVTY3JvbGxDb250YWluZXIiO2Z1bmN0aW9uIFVvKHtkYXRhOmV9KXtyZXR1cm4gby5qc3hzKG8uRnJhZ21lbnQse2NoaWxkcmVuOltlLmNhcHRpb24mJm8uanN4KGRsLHtjaGlsZHJlbjplLmNhcHRpb259KSxlLmhlYWQmJm8uanN4KGlsLHtjaGlsZHJlbjpvLmpzeChYbix7Y2hpbGRyZW46ZS5oZWFkLm1hcCgodCxuKT0+by5qc3gobG8se2NoaWxkcmVuOnR9LG4pKX0pfSksZS5ib2R5JiZvLmpzeChsbCx7Y2hpbGRyZW46ZS5ib2R5Lm1hcCgodCxuKT0+by5qc3goWG4se2NoaWxkcmVuOnQubWFwKChyLHMpPT5vLmpzeChhbCx7Y2hpbGRyZW46cn0scykpfSxuKSl9KSxlLmZvb3QmJm8uanN4KGNsLHtjaGlsZHJlbjpvLmpzeChYbix7Y2hpbGRyZW46ZS5mb290Lm1hcCgodCxuKT0+by5qc3gobG8se2NoaWxkcmVuOnR9LG4pKX0pfSldfSl9VW8uZGlzcGxheU5hbWU9IkBtYW50aW5lL2NvcmUvVGFibGVEYXRhUmVuZGVyZXIiO2NvbnN0IG9tPXt3aXRoUm93Qm9yZGVyczohMCx2ZXJ0aWNhbFNwYWNpbmc6N30sZmw9KGUse2xheW91dDp0LGNhcHRpb25TaWRlOm4saG9yaXpvbnRhbFNwYWNpbmc6cix2ZXJ0aWNhbFNwYWNpbmc6cyxib3JkZXJDb2xvcjphLHN0cmlwZWRDb2xvcjppLGhpZ2hsaWdodE9uSG92ZXJDb2xvcjpsLHN0cmlwZWQ6YyxoaWdobGlnaHRPbkhvdmVyOmQsc3RpY2t5SGVhZGVyT2Zmc2V0OnUsc3RpY2t5SGVhZGVyOmZ9KT0+KHt0YWJsZTp7Ii0tdGFibGUtbGF5b3V0Ijp0LCItLXRhYmxlLWNhcHRpb24tc2lkZSI6biwiLS10YWJsZS1ob3Jpem9udGFsLXNwYWNpbmciOkVlKHIpLCItLXRhYmxlLXZlcnRpY2FsLXNwYWNpbmciOkVlKHMpLCItLXRhYmxlLWJvcmRlci1jb2xvciI6YT9wdChhLGUpOnZvaWQgMCwiLS10YWJsZS1zdHJpcGVkLWNvbG9yIjpjJiZpP3B0KGksZSk6dm9pZCAwLCItLXRhYmxlLWhpZ2hsaWdodC1vbi1ob3Zlci1jb2xvciI6ZCYmbD9wdChsLGUpOnZvaWQgMCwiLS10YWJsZS1zdGlja3ktaGVhZGVyLW9mZnNldCI6Zj9OKHUpOnZvaWQgMH19KSxyZT1ZKGU9Pntjb25zdCB0PU0oIlRhYmxlIixvbSxlKSx7Y2xhc3NOYW1lczpuLGNsYXNzTmFtZTpyLHN0eWxlOnMsc3R5bGVzOmEsdW5zdHlsZWQ6aSx2YXJzOmwsaG9yaXpvbnRhbFNwYWNpbmc6Yyx2ZXJ0aWNhbFNwYWNpbmc6ZCxjYXB0aW9uU2lkZTp1LHN0cmlwZWRDb2xvcjpmLGhpZ2hsaWdodE9uSG92ZXJDb2xvcjpwLHN0cmlwZWQ6aCxoaWdobGlnaHRPbkhvdmVyOnksd2l0aENvbHVtbkJvcmRlcnM6Zyx3aXRoUm93Qm9yZGVyczp2LHdpdGhUYWJsZUJvcmRlcjp4LGJvcmRlckNvbG9yOmosbGF5b3V0OncsZGF0YTpTLGNoaWxkcmVuOkMsc3RpY2t5SGVhZGVyOmssc3RpY2t5SGVhZGVyT2Zmc2V0Ol8sbW9kOiQsdGFidWxhck51bXM6TyxhdHRyaWJ1dGVzOlQsLi4uQX09dCxEPXRlKHtuYW1lOiJUYWJsZSIscHJvcHM6dCxjbGFzc05hbWU6cixzdHlsZTpzLGNsYXNzZXM6T24sY2xhc3NOYW1lczpuLHN0eWxlczphLHVuc3R5bGVkOmksYXR0cmlidXRlczpULHJvb3RTZWxlY3RvcjoidGFibGUiLHZhcnM6bCx2YXJzUmVzb2x2ZXI6Zmx9KTtyZXR1cm4gby5qc3goZW0se3ZhbHVlOntnZXRTdHlsZXM6RCxzdGlja3lIZWFkZXI6ayxzdHJpcGVkOmg9PT0hMD8ib2RkIjpofHx2b2lkIDAsaGlnaGxpZ2h0T25Ib3Zlcjp5LHdpdGhDb2x1bW5Cb3JkZXJzOmcsd2l0aFJvd0JvcmRlcnM6dixjYXB0aW9uU2lkZTp1fHwiYm90dG9tIn0sY2hpbGRyZW46by5qc3gocSx7Y29tcG9uZW50OiJ0YWJsZSIsbW9kOlt7ImRhdGEtd2l0aC10YWJsZS1ib3JkZXIiOngsImRhdGEtdGFidWxhci1udW1zIjpPfSwkXSwuLi5EKCJ0YWJsZSIpLC4uLkEsY2hpbGRyZW46Q3x8ISFTJiZvLmpzeChVbyx7ZGF0YTpTfSl9KX0pfSk7cmUuY2xhc3Nlcz1PbjtyZS52YXJzUmVzb2x2ZXI9Zmw7cmUuZGlzcGxheU5hbWU9IkBtYW50aW5lL2NvcmUvVGFibGUiO3JlLlRkPWFsO3JlLlRoPWxvO3JlLlRyPVhuO3JlLlRoZWFkPWlsO3JlLlRib2R5PWxsO3JlLlRmb290PWNsO3JlLkNhcHRpb249ZGw7cmUuU2Nyb2xsQ29udGFpbmVyPWtyO3JlLkRhdGFSZW5kZXJlcj1Vbztjb25zdCBaPVkoZT0+by5qc3goJHQse2NvbXBvbmVudDoiaW5wdXQiLC4uLk0oIlRleHRJbnB1dCIsbnVsbCxlKSxfX3N0YXRpY1NlbGVjdG9yOiJUZXh0SW5wdXQifSkpO1ouY2xhc3Nlcz0kdC5jbGFzc2VzO1ouZGlzcGxheU5hbWU9IkBtYW50aW5lL2NvcmUvVGV4dElucHV0Ijtjb25zdCBzbT1bImgxIiwiaDIiLCJoMyIsImg0IiwiaDUiLCJoNiJdLGFtPVsieHMiLCJzbSIsIm1kIiwibGciLCJ4bCJdO2Z1bmN0aW9uIGltKGUsdCl7Y29uc3Qgbj10IT09dm9pZCAwP3Q6YGgke2V9YDtyZXR1cm4gc20uaW5jbHVkZXMobik/e2ZvbnRTaXplOmB2YXIoLS1tYW50aW5lLSR7bn0tZm9udC1zaXplKWAsZm9udFdlaWdodDpgdmFyKC0tbWFudGluZS0ke259LWZvbnQtd2VpZ2h0KWAsbGluZUhlaWdodDpgdmFyKC0tbWFudGluZS0ke259LWxpbmUtaGVpZ2h0KWB9OmFtLmluY2x1ZGVzKG4pP3tmb250U2l6ZTpgdmFyKC0tbWFudGluZS1mb250LXNpemUtJHtufSlgLGZvbnRXZWlnaHQ6YHZhcigtLW1hbnRpbmUtaCR7ZX0tZm9udC13ZWlnaHQpYCxsaW5lSGVpZ2h0OmB2YXIoLS1tYW50aW5lLWgke2V9LWxpbmUtaGVpZ2h0KWB9Ontmb250U2l6ZTpOKG4pLGZvbnRXZWlnaHQ6YHZhcigtLW1hbnRpbmUtaCR7ZX0tZm9udC13ZWlnaHQpYCxsaW5lSGVpZ2h0OmB2YXIoLS1tYW50aW5lLWgke2V9LWxpbmUtaGVpZ2h0KWB9fXZhciBwbD17cm9vdDoibV84YTVkMTM1NyJ9O2NvbnN0IGxtPXtvcmRlcjoxfSxtbD0oZSx7b3JkZXI6dCxzaXplOm4sbGluZUNsYW1wOnIsdGV4dFdyYXA6c30pPT57Y29uc3QgYT1pbSh0fHwxLG4pO3JldHVybntyb290OnsiLS10aXRsZS1mdyI6YS5mb250V2VpZ2h0LCItLXRpdGxlLWxoIjphLmxpbmVIZWlnaHQsIi0tdGl0bGUtZnoiOmEuZm9udFNpemUsIi0tdGl0bGUtbGluZS1jbGFtcCI6dHlwZW9mIHI9PSJudW1iZXIiP3IudG9TdHJpbmcoKTp2b2lkIDAsIi0tdGl0bGUtdGV4dC13cmFwIjpzfX19LFJyPVkoZT0+e2NvbnN0IHQ9TSgiVGl0bGUiLGxtLGUpLHtjbGFzc05hbWVzOm4sY2xhc3NOYW1lOnIsc3R5bGU6cyxzdHlsZXM6YSx1bnN0eWxlZDppLG9yZGVyOmwsdmFyczpjLHNpemU6ZCx2YXJpYW50OnUsbGluZUNsYW1wOmYsdGV4dFdyYXA6cCxtb2Q6aCxhdHRyaWJ1dGVzOnksLi4uZ309dCx2PXRlKHtuYW1lOiJUaXRsZSIscHJvcHM6dCxjbGFzc2VzOnBsLGNsYXNzTmFtZTpyLHN0eWxlOnMsY2xhc3NOYW1lczpuLHN0eWxlczphLHVuc3R5bGVkOmksYXR0cmlidXRlczp5LHZhcnM6Yyx2YXJzUmVzb2x2ZXI6bWx9KTtyZXR1cm5bMSwyLDMsNCw1LDZdLmluY2x1ZGVzKGwpP28uanN4KHEsey4uLnYoInJvb3QiKSxjb21wb25lbnQ6YGgke2x9YCx2YXJpYW50OnUsbW9kOlt7b3JkZXI6bCwiZGF0YS1saW5lLWNsYW1wIjp0eXBlb2YgZj09Im51bWJlciJ9LGhdLHNpemU6ZCwuLi5nfSk6bnVsbH0pO1JyLmNsYXNzZXM9cGw7UnIudmFyc1Jlc29sdmVyPW1sO1JyLmRpc3BsYXlOYW1lPSJAbWFudGluZS9jb3JlL1RpdGxlIjtmdW5jdGlvbiBjbShlKXtyZXR1cm4vXihodHRwcz86XC9cL3xtYWlsdG86fFwvfCMpL2kudGVzdChlKX1mdW5jdGlvbiBmdChlLHQpe2NvbnN0IG49W10scj0vKFxbW15cXV0rXF1cKFteKV0rXCl8YFteYF0rYHxcKlwqW14qXStcKlwqfFwqW14qXStcKikvZztsZXQgcz0wLGE9MDtmb3IoY29uc3QgaSBvZiBlLm1hdGNoQWxsKHIpKXtpZihpLmluZGV4PT09dm9pZCAwKWNvbnRpbnVlO2kuaW5kZXg+cyYmbi5wdXNoKGUuc2xpY2UocyxpLmluZGV4KSk7Y29uc3QgbD1pWzBdLGM9YCR7dH0tJHthfWA7aWYobC5zdGFydHNXaXRoKCJbIikmJmwuaW5jbHVkZXMoIl0oIikpe2NvbnN0IGQ9bC5zbGljZSgxLGwuaW5kZXhPZigiXSgiKSksdT1sLnNsaWNlKGwuaW5kZXhPZigiXSgiKSsyLC0xKS50cmltKCk7bi5wdXNoKGNtKHUpP28uanN4KCJhIix7aHJlZjp1LHJlbDoibm9yZWZlcnJlciIsdGFyZ2V0OnUuc3RhcnRzV2l0aCgiaHR0cCIpPyJfYmxhbmsiOnZvaWQgMCxjaGlsZHJlbjpmdChkLGAke2N9LWxhYmVsYCl9LGMpOmQpfWVsc2UgbC5zdGFydHNXaXRoKCJgIik/bi5wdXNoKG8uanN4KCJjb2RlIix7Y2hpbGRyZW46bC5zbGljZSgxLC0xKX0sYykpOmwuc3RhcnRzV2l0aCgiKioiKT9uLnB1c2goby5qc3goInN0cm9uZyIse2NoaWxkcmVuOmZ0KGwuc2xpY2UoMiwtMiksYyl9LGMpKTpsLnN0YXJ0c1dpdGgoIioiKSYmbi5wdXNoKG8uanN4KCJlbSIse2NoaWxkcmVuOmZ0KGwuc2xpY2UoMSwtMSksYyl9LGMpKTtzPWkuaW5kZXgrbC5sZW5ndGgsYSs9MX1yZXR1cm4gczxlLmxlbmd0aCYmbi5wdXNoKGUuc2xpY2UocykpLG59ZnVuY3Rpb24gVnMoZSl7cmV0dXJuIGUudHJpbSgpLnJlcGxhY2UoL15cfC8sIiIpLnJlcGxhY2UoL1x8JC8sIiIpLnNwbGl0KCJ8IikubWFwKHQ9PnQudHJpbSgpKX1mdW5jdGlvbiBkbShlKXtyZXR1cm4gZT8vXlxzKlx8P1xzKjo/LXszLH06P1xzKihcfFxzKjo/LXszLH06P1xzKikrXHw/XHMqJC8udGVzdChlKTohMX1mdW5jdGlvbiBTdChlLHQsbil7dC5sZW5ndGgmJihlLnB1c2goby5qc3goInAiLHtjaGlsZHJlbjpmdCh0LmpvaW4oIiAiKSxuKX0sbikpLHQubGVuZ3RoPTApfWZ1bmN0aW9uIGduKHt2YWx1ZTplLGVtcHR5OnQ9Ik5vIGNvbnRlbnQgcmVjb3JkZWQuIn0pe2NvbnN0IG49KGU/PyIiKS5yZXBsYWNlKC9cclxuL2csYApgKTtpZighbi50cmltKCkpcmV0dXJuIG8uanN4KCJwIix7Y2xhc3NOYW1lOiJtdXRlZCIsY2hpbGRyZW46dH0pO2NvbnN0IHI9bi5zcGxpdChgCmApLHM9W10sYT1bXTtsZXQgaT0wO2Zvcig7aTxyLmxlbmd0aDspe2NvbnN0IGM9cltpXS50cmltRW5kKCksZD1gbWQtJHtpfWA7aWYoIWMudHJpbSgpKXtTdChzLGEsYCR7ZH0tcGApLGkrPTE7Y29udGludWV9Y29uc3QgdT1jLm1hdGNoKC9eYGBgKFxTKyk/XHMqJC8pO2lmKHUpe1N0KHMsYSxgJHtkfS1wYCk7Y29uc3QgaD11WzFdfHwiIix5PVtdO2ZvcihpKz0xO2k8ci5sZW5ndGgmJiFyW2ldLnRyaW1FbmQoKS5zdGFydHNXaXRoKCJgYGAiKTspeS5wdXNoKHJbaV0pLGkrPTE7cy5wdXNoKG8uanN4cygicHJlIix7Y2xhc3NOYW1lOiJtZC1jb2RlLWJsb2NrIixjaGlsZHJlbjpbaD9vLmpzeCgic3BhbiIse2NoaWxkcmVuOmh9KTpudWxsLG8uanN4KCJjb2RlIix7Y2hpbGRyZW46eS5qb2luKGAKYCl9KV19LGQpKSxpKz0xO2NvbnRpbnVlfWNvbnN0IGY9Yy5tYXRjaCgvXigjezEsNH0pXHMrKC4rKSQvKTtpZihmKXtTdChzLGEsYCR7ZH0tcGApO2NvbnN0IGg9ZlsxXS5sZW5ndGgseT1mdChmWzJdLGQpO2g9PT0xP3MucHVzaChvLmpzeCgiaDIiLHtjaGlsZHJlbjp5fSxkKSk6aD09PTI/cy5wdXNoKG8uanN4KCJoMyIse2NoaWxkcmVuOnl9LGQpKTpzLnB1c2goby5qc3goImg0Iix7Y2hpbGRyZW46eX0sZCkpLGkrPTE7Y29udGludWV9aWYoL15ccyotLS0rXHMqJC8udGVzdChjKSl7U3QocyxhLGAke2R9LXBgKSxzLnB1c2goby5qc3goImhyIix7fSxkKSksaSs9MTtjb250aW51ZX1pZihjLmluY2x1ZGVzKCJ8IikmJmRtKHJbaSsxXSkpe1N0KHMsYSxgJHtkfS1wYCk7Y29uc3QgaD1WcyhjKSx5PVtdO2ZvcihpKz0yO2k8ci5sZW5ndGgmJnJbaV0uaW5jbHVkZXMoInwiKSYmcltpXS50cmltKCk7KXkucHVzaChWcyhyW2ldKSksaSs9MTtzLnB1c2goby5qc3hzKCJ0YWJsZSIse2NsYXNzTmFtZToibWQtdGFibGUiLGNoaWxkcmVuOltvLmpzeCgidGhlYWQiLHtjaGlsZHJlbjpvLmpzeCgidHIiLHtjaGlsZHJlbjpoLm1hcCgoZyx2KT0+by5qc3goInRoIix7Y2hpbGRyZW46ZnQoZyxgJHtkfS1oLSR7dn1gKX0sdikpfSl9KSxvLmpzeCgidGJvZHkiLHtjaGlsZHJlbjp5Lm1hcCgoZyx2KT0+by5qc3goInRyIix7Y2hpbGRyZW46aC5tYXAoKHgsaik9Pm8uanN4KCJ0ZCIse2NoaWxkcmVuOmZ0KGdbal0/PyIiLGAke2R9LXItJHt2fS0ke2p9YCl9LGopKX0sdikpfSldfSxkKSk7Y29udGludWV9aWYoYy5tYXRjaCgvXlxzKig/OlstKitdXHMrfFxkK1wuXHMrKSguKykkLykpe1N0KHMsYSxgJHtkfS1wYCk7Y29uc3QgaD0vXlxzKlxkK1wuXHMrLy50ZXN0KGMpLHk9W107Zm9yKDtpPHIubGVuZ3RoOyl7Y29uc3Qgdj1yW2ldLnRyaW1FbmQoKS5tYXRjaCgvXlxzKig/OlstKitdXHMrfFxkK1wuXHMrKSguKykkLyk7aWYoIXZ8fC9eXHMqXGQrXC5ccysvLnRlc3QocltpXSkhPT1oKWJyZWFrO2xldCB4PXZbMV0sajtjb25zdCB3PXgubWF0Y2goL15cWyggfHh8WClcXVxzKyguKykkLyk7dyYmKGo9d1sxXS50b0xvd2VyQ2FzZSgpPT09IngiLHg9d1syXSkseS5wdXNoKHt0ZXh0OngsY2hlY2tlZDpqfSksaSs9MX1jb25zdCBnPXkubWFwKCh2LHgpPT5vLmpzeHMoImxpIix7Y2hpbGRyZW46W3YuY2hlY2tlZD09PXZvaWQgMD9udWxsOm8uanN4KCJpbnB1dCIse2NoZWNrZWQ6di5jaGVja2VkLHJlYWRPbmx5OiEwLHR5cGU6ImNoZWNrYm94In0pLGZ0KHYudGV4dCxgJHtkfS1saS0ke3h9YCldfSx4KSk7cy5wdXNoKGg/by5qc3goIm9sIix7Y2hpbGRyZW46Z30sZCk6by5qc3goInVsIix7Y2hpbGRyZW46Z30sZCkpO2NvbnRpbnVlfWlmKGMudHJpbVN0YXJ0KCkuc3RhcnRzV2l0aCgiPiIpKXtTdChzLGEsYCR7ZH0tcGApO2NvbnN0IGg9W107Zm9yKDtpPHIubGVuZ3RoJiZyW2ldLnRyaW1TdGFydCgpLnN0YXJ0c1dpdGgoIj4iKTspaC5wdXNoKHJbaV0udHJpbVN0YXJ0KCkucmVwbGFjZSgvXj5ccz8vLCIiKSksaSs9MTtzLnB1c2goby5qc3goImJsb2NrcXVvdGUiLHtjaGlsZHJlbjpmdChoLmpvaW4oIiAiKSxkKX0sZCkpO2NvbnRpbnVlfWEucHVzaChjLnRyaW0oKSksaSs9MX1yZXR1cm4gU3QocyxhLCJtZC1maW5hbC1wIiksby5qc3goImRpdiIse2NsYXNzTmFtZToibWFya2Rvd24tdmlldyIsY2hpbGRyZW46c30pfWNvbnN0IHVtPXtFbnRlcjoiRW50ZXIiLEVzY2FwZToiRXNjYXBlIixUYWI6IlRhYiIsQlRhYjoiQlRhYiIsQmFja3NwYWNlOiJCYWNrc3BhY2UiLERlbGV0ZToiRGVsZXRlIixBcnJvd1VwOiJBcnJvd1VwIixBcnJvd0Rvd246IkFycm93RG93biIsQXJyb3dMZWZ0OiJBcnJvd0xlZnQiLEFycm93UmlnaHQ6IkFycm93UmlnaHQiLFBhZ2VVcDoiUGFnZVVwIixQYWdlRG93bjoiUGFnZURvd24iLEhvbWU6IkhvbWUiLEVuZDoiRW5kIixJbnNlcnQ6Ikluc2VydCIsRjE6IkYxIixGMjoiRjIiLEYzOiJGMyIsRjQ6IkY0IixGNToiRjUiLEY2OiJGNiIsRjc6IkY3IixGODoiRjgiLEY5OiJGOSIsRjEwOiJGMTAiLEYxMToiRjExIixGMTI6IkYxMiJ9LGZtPXsiICI6IlNwYWNlIiwiQCI6IlNwYWNlIiwiWyI6IlsiLCJcXCI6IlxcIiwiXSI6Il0iLCJeIjoiXiIsXzoiXyIsIj8iOiI/In07ZnVuY3Rpb24gcG0oZSl7aWYoZS5uYXRpdmVFdmVudD8uaXNDb21wb3Npbmd8fGUuaXNDb21wb3NpbmcpcmV0dXJuIG51bGw7Y29uc3QgdD1lLnNoaWZ0S2V5JiZlLmtleT09PSJUYWIiPyJCVGFiIjp1bVtlLmtleV0sbj1lLmFsdEtleXx8ZS5tZXRhS2V5PyJNLSI6IiI7aWYoZS5jdHJsS2V5KXtjb25zdCByPWUua2V5LnRvTG93ZXJDYXNlKCk7aWYoIW4mJnI9PT0idiIpcmV0dXJuIG51bGw7aWYoL15bYS16XSQvLnRlc3QocikpcmV0dXJue3R5cGU6InRlcm1pbmFsLmtleSIsa2V5OmBDLSR7bn0ke3J9YH07aWYodClyZXR1cm57dHlwZToidGVybWluYWwua2V5IixrZXk6YEMtJHtufSR7dH1gfTtjb25zdCBzPWZtW2Uua2V5XTtyZXR1cm4gcz97dHlwZToidGVybWluYWwua2V5IixrZXk6YEMtJHtufSR7c31gfTpudWxsfXJldHVybiB0P3t0eXBlOiJ0ZXJtaW5hbC5rZXkiLGtleTpgJHtufSR7dH1gfTplLmtleS5sZW5ndGg9PT0xJiYhbj97dHlwZToidGVybWluYWwua2V5Iix0ZXh0OmUua2V5fTplLmtleS5sZW5ndGg9PT0xP3t0eXBlOiJ0ZXJtaW5hbC5rZXkiLGtleTpgJHtufSR7ZS5rZXl9YH06bnVsbH1jb25zdCBtbT17bG9ja2VkOiEwLHZhdWx0X2NvbmZpZ3VyZWQ6ITEscHJvamVjdF9pZDoiIixhdXRoX3BhdGg6IiIsd3JhcHBlcjp7dXBfdG9fZGF0ZTohMCx1cGRhdGVfcmVxdWlyZWQ6ITEsdmVyaWZpY2F0aW9uOiJzaGEyNTYiLHJlbW90ZV9pbnRlZ3JpdHlfb2s6ITAsbG9jYWxfc2hhMjU2OiIiLHJlbW90ZV9zaGEyNTY6IiIscmVtb3RlX3ZlcnNpb246IiIscmVtb3RlX2J1aWxkX2NvbW1pdDoiIixsb2NhbF9ieXRlczowLHJlbW90ZV9ieXRlczowfSxub2RlczpbXSxhZ2VudF9ub2RlczpbXSxjb25uZWN0ZWRfYWdlbnRzOltdLHNlbGVjdGVkX3BhdGg6IiIsc2VsZWN0ZWRfbm9kZTpudWxsLHNjaGVkdWxlczpbXSxmZWVkYmFjazpbXX07bGV0IGhsPSIiO2NvbnN0IGdsPSJuYXBzZWVyLmxvY2FsLnByb2plY3RVbmxvY2tzIjtmdW5jdGlvbiBobSh7dmFsdWU6ZSxkaXNhYmxlZDp0LGZvY3VzZWQ6bixvbkZvY3VzOnIsb25CbHVyOnMsb25LZXlEb3duOmEsb25QYXN0ZTppLHZpZXdwb3J0UmVmOmx9KXtyZXR1cm4gby5qc3goImRpdiIse3JlZjpsLGNsYXNzTmFtZTpgdGVybWluYWwtY29uc29sZSAke24/ImZvY3VzZWQiOiIifSAke3Q/ImRpc2FibGVkIjoiIn1gLHRhYkluZGV4OnQ/LTE6MCxyb2xlOiJ0ZXh0Ym94IiwiYXJpYS1sYWJlbCI6IkdhdGV3YXkgdGVybWluYWwiLCJhcmlhLW11bHRpbGluZSI6InRydWUiLG9uRm9jdXM6cixvbkJsdXI6cyxvbktleURvd246YSxvblBhc3RlOmksb25Nb3VzZURvd246KCk9Pnt0fHxsLmN1cnJlbnQ/LmZvY3VzKCl9LGNoaWxkcmVuOm8uanN4KCJwcmUiLHtjbGFzc05hbWU6InRlcm1pbmFsLW91dHB1dCIsY2hpbGRyZW46ZX0pfSl9ZnVuY3Rpb24gTW4oZSl7cmV0dXJuIGUuc3BsaXQoIi8iKS5maWx0ZXIoQm9vbGVhbil9ZnVuY3Rpb24gZXQoZSl7cmV0dXJuIE1uKGUpLmF0KC0xKXx8ZXx8IlVudGl0bGVkIG5vZGUifWZ1bmN0aW9uIGx0KGUpe2NvbnN0IHQ9TW4oZSk7cmV0dXJuIHQubGVuZ3RoPjE/YC8ke3Quc2xpY2UoMCwtMSkuam9pbigiLyIpfWA6Ii8ifWZ1bmN0aW9uIG1uKGUpe2NvbnN0IHQ9TW4oZSk7cmV0dXJuIHRbMF09PT0iYWdlbnRzIiYmdFsxXXx8IiJ9ZnVuY3Rpb24gVXIoZSl7Y29uc3QgdD1NbihlKTtyZXR1cm4gdFswXSE9PSJhZ2VudHMifHwhdFsxXT9lOmAvJHt0LnNsaWNlKDIpLmpvaW4oIi8iKX1gfWZ1bmN0aW9uIEdyKGUpe2NvbnN0IHQ9ZS5yZXBsYWNlKC9ccysvZywiICIpLnRyaW0oKTtyZXR1cm4gdC5sZW5ndGg+MTEwP2Ake3Quc2xpY2UoMCwxMTApfS4uLmA6dHx8Ik5vIGNvbnRlbnQifWZ1bmN0aW9uIGJsKGUpe3JldHVybiBPYmplY3QudmFsdWVzKGUuZm9sZGVycykucmVkdWNlKCh0LG4pPT50K2JsKG4pLGUubm9kZXMubGVuZ3RoKX1mdW5jdGlvbiBjbyhlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9lLmxlbmd0aDplJiZ0eXBlb2YgZT09Im9iamVjdCI/T2JqZWN0LmtleXMoZSkubGVuZ3RoOjB9ZnVuY3Rpb24geWwoKXtpZih0eXBlb2Ygd2luZG93PiJ1IilyZXR1cm4gbmV3IFNldDt0cnl7cmV0dXJuIG5ldyBTZXQoSlNPTi5wYXJzZSh3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShnbCl8fCJbXSIpKX1jYXRjaHtyZXR1cm4gbmV3IFNldH19ZnVuY3Rpb24gWHIoZSl7aWYodHlwZW9mIHdpbmRvdz4idSJ8fCFlKXJldHVybjtjb25zdCB0PXlsKCk7dC5hZGQoZSksd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oZ2wsSlNPTi5zdHJpbmdpZnkoWy4uLnRdKSl9ZnVuY3Rpb24gV3MoZSl7cmV0dXJuISEoZSYmeWwoKS5oYXMoZSkpfWZ1bmN0aW9uIFV0KGUpe3JldHVybiBjbyhlKT4wfWZ1bmN0aW9uIEhzKGUpe2NvbnN0IHQ9e2ZvbGRlcnM6e30sbm9kZXM6W119O2Zvcihjb25zdCBuIG9mIGUpe2NvbnN0IHI9TW4obi5mdWxsX3BhdGgpO2xldCBzPXQ7Zm9yKGNvbnN0IGEgb2Ygci5zbGljZSgwLC0xKSlzLmZvbGRlcnNbYV0/Pz17Zm9sZGVyczp7fSxub2RlczpbXX0scz1zLmZvbGRlcnNbYV07cy5ub2Rlcy5wdXNoKG4pfXJldHVybiB0fWZ1bmN0aW9uIHFzKGUpe3JldHVybiBlPy50YWdzPy5qb2luKCIsICIpPz8iIn1mdW5jdGlvbiBRZShlLHQpe3JldHVybiBKU09OLnN0cmluZ2lmeShlPz90LG51bGwsMil9ZnVuY3Rpb24gWXMoZSl7cmV0dXJuIGUuc3BsaXQoIiwiKS5tYXAodD0+dC50cmltKCkpLmZpbHRlcihCb29sZWFuKX1hc3luYyBmdW5jdGlvbiBuZShlLHQpe2NvbnN0IG49YXdhaXQgZmV0Y2goZSx7bWV0aG9kOiJQT1NUIixoZWFkZXJzOnsiY29udGVudC10eXBlIjoiYXBwbGljYXRpb24vanNvbiIsIngtbmFwc2Vlci1jc3JmIjpobH0sYm9keTpKU09OLnN0cmluZ2lmeSh0KX0pLHI9YXdhaXQgbi5qc29uKCkuY2F0Y2goKCk9Pm51bGwpO2lmKCFuLm9rKXRocm93IG5ldyBFcnJvcihyPy5lcnJvcj8/YFJlcXVlc3QgZmFpbGVkOiAke24uc3RhdHVzfWApO3JldHVybiByfWZ1bmN0aW9uIHVvKHticmFuY2g6ZSxzZWxlY3RlZFBhdGg6dCxvblNlbGVjdDpuLG9wZW5Gb2xkZXJzOnIsb25Ub2dnbGVGb2xkZXI6cyxvbkNvbnRleHRBY3Rpb246YSxwcmVmaXg6aT0iIn0pe2NvbnN0IGw9T2JqZWN0LmtleXMoZS5mb2xkZXJzKS5zb3J0KCksYz1bLi4uZS5ub2Rlc10uc29ydCgoZCx1KT0+ZC5mdWxsX3BhdGgubG9jYWxlQ29tcGFyZSh1LmZ1bGxfcGF0aCkpO3JldHVybiBvLmpzeHMoby5GcmFnbWVudCx7Y2hpbGRyZW46W2wubWFwKGQ9Pntjb25zdCB1PWk/YCR7aX0vJHtkfWA6YC8ke2R9YCxmPXIuaGFzKHUpLHA9ZS5mb2xkZXJzW2RdO3JldHVybiBvLmpzeHMoImRldGFpbHMiLHtjbGFzc05hbWU6YGZvbGRlciAke2Y/Im9wZW4iOiIifWAsb3BlbjpmLG9uVG9nZ2xlOmg9PnModSxoLmN1cnJlbnRUYXJnZXQub3BlbiksY2hpbGRyZW46W28uanN4cygic3VtbWFyeSIse2NsYXNzTmFtZToidHJlZS1yb3cgZm9sZGVyLXJvdyIsb25Db250ZXh0TWVudTpoPT5hKGgse2tpbmQ6ImZvbGRlciIsZm9sZGVyUGF0aDp1fSksb25Ub3VjaFN0YXJ0Omg9PmEoaCx7a2luZDoiZm9sZGVyIixmb2xkZXJQYXRoOnV9KSxjaGlsZHJlbjpbby5qc3goInNwYW4iLHtjbGFzc05hbWU6InRyZWUtY2FyZXQiLGNoaWxkcmVuOmY/InYiOiI+In0pLG8uanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJmb2xkZXItaWNvbiIsY2hpbGRyZW46ImRpciJ9KSxvLmpzeCgic3BhbiIse2NsYXNzTmFtZToiZm9sZGVyLW5hbWUiLGNoaWxkcmVuOmR9KSxvLmpzeCgic3BhbiIse2NsYXNzTmFtZToidHJlZS1jb3VudCIsY2hpbGRyZW46YmwocCl9KV19KSxvLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJ0cmVlLWNoaWxkcmVuIixjaGlsZHJlbjpvLmpzeCh1byx7YnJhbmNoOnAsc2VsZWN0ZWRQYXRoOnQsb25TZWxlY3Q6bixvcGVuRm9sZGVyczpyLG9uVG9nZ2xlRm9sZGVyOnMsb25Db250ZXh0QWN0aW9uOmEscHJlZml4OnV9KX0pXX0sdSl9KSxjLm1hcChkPT5vLmpzeHMoImJ1dHRvbiIse2NsYXNzTmFtZTpgdHJlZS1yb3cgZmlsZSBmaWxlLXJvdyAke2QuZnVsbF9wYXRoPT09dD8iYWN0aXZlIjoiIn1gLG9uQ2xpY2s6KCk9Pm4oZC5mdWxsX3BhdGgpLG9uQ29udGV4dE1lbnU6dT0+YSh1LHtraW5kOiJub2RlIixub2RlOmR9KSxvblRvdWNoU3RhcnQ6dT0+YSh1LHtraW5kOiJub2RlIixub2RlOmR9KSx0eXBlOiJidXR0b24iLGNoaWxkcmVuOltvLmpzeCgic3BhbiIse2NsYXNzTmFtZToidHJlZS1jYXJldCJ9KSxvLmpzeCgic3BhbiIse2NsYXNzTmFtZToiZmlsZS1pY29uIixjaGlsZHJlbjoicmVjIn0pLG8uanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJmaWxlLW5hbWUiLGNoaWxkcmVuOmV0KGQuZnVsbF9wYXRoKX0pLG8uanN4KCJzbWFsbCIse2NoaWxkcmVuOmQudHlwZXx8Im5vdGUifSldfSxkLmlkKSldfSl9ZnVuY3Rpb24gVXMoe2RlZmF1bHRWYWx1ZTplLGxhYmVsOnQ9IkNvbnRlbnQifSl7Y29uc3RbbixyXT1tLnVzZVN0YXRlKGUpLFtzLGFdPW0udXNlU3RhdGUoInNwbGl0IiksaT1tLnVzZVJlZihudWxsKTtmdW5jdGlvbiBsKGMsZD0iIix1PSJ0ZXh0Iil7Y29uc3QgZj1pLmN1cnJlbnQ7aWYoIWYpe3IoeD0+YCR7eH0ke3g/YApgOiIifSR7Y30ke3V9JHtkfWApO3JldHVybn1jb25zdCBwPWYuc2VsZWN0aW9uU3RhcnQsaD1mLnNlbGVjdGlvbkVuZCx5PW4uc2xpY2UocCxoKXx8dSxnPWAke24uc2xpY2UoMCxwKX0ke2N9JHt5fSR7ZH0ke24uc2xpY2UoaCl9YCx2PXArYy5sZW5ndGgreS5sZW5ndGgrZC5sZW5ndGg7cihnKSx3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57Zi5mb2N1cygpLGYuc2V0U2VsZWN0aW9uUmFuZ2Uodix2KX0pfXJldHVybiBvLmpzeHMoImRpdiIse2NsYXNzTmFtZToibWFya2Rvd24tZWRpdG9yIixjaGlsZHJlbjpbby5qc3goImlucHV0Iix7dHlwZToiaGlkZGVuIixuYW1lOiJjb250ZW50X3RleHQiLHZhbHVlOm4scmVhZE9ubHk6ITB9KSxvLmpzeHMoImRpdiIse2NsYXNzTmFtZToibWFya2Rvd24tZWRpdG9yLWhlYWQiLGNoaWxkcmVuOltvLmpzeCgic3BhbiIse2NoaWxkcmVuOnR9KSxvLmpzeHMoImRpdiIse2NsYXNzTmFtZToiZWRpdG9yLW1vZGUtdG9nZ2xlIixyb2xlOiJ0YWJsaXN0IiwiYXJpYS1sYWJlbCI6Ik1hcmtkb3duIGVkaXRvciBtb2RlIixjaGlsZHJlbjpbby5qc3goImJ1dHRvbiIse2NsYXNzTmFtZTpzPT09IndyaXRlIj8iYWN0aXZlIjoiIix0eXBlOiJidXR0b24iLHJvbGU6InRhYiIsImFyaWEtc2VsZWN0ZWQiOnM9PT0id3JpdGUiLG9uQ2xpY2s6KCk9PmEoIndyaXRlIiksY2hpbGRyZW46IldyaXRlIn0pLG8uanN4KCJidXR0b24iLHtjbGFzc05hbWU6cz09PSJzcGxpdCI/ImFjdGl2ZSI6IiIsdHlwZToiYnV0dG9uIixyb2xlOiJ0YWIiLCJhcmlhLXNlbGVjdGVkIjpzPT09InNwbGl0IixvbkNsaWNrOigpPT5hKCJzcGxpdCIpLGNoaWxkcmVuOiJTcGxpdCJ9KSxvLmpzeCgiYnV0dG9uIix7Y2xhc3NOYW1lOnM9PT0icHJldmlldyI/ImFjdGl2ZSI6IiIsdHlwZToiYnV0dG9uIixyb2xlOiJ0YWIiLCJhcmlhLXNlbGVjdGVkIjpzPT09InByZXZpZXciLG9uQ2xpY2s6KCk9PmEoInByZXZpZXciKSxjaGlsZHJlbjoiUHJldmlldyJ9KV19KV19KSxvLmpzeHMoImRpdiIse2NsYXNzTmFtZToibWFya2Rvd24tdG9vbGJhciIsImFyaWEtbGFiZWwiOiJNYXJrZG93biBmb3JtYXR0aW5nIixjaGlsZHJlbjpbby5qc3goRSx7c2l6ZToieHMiLHZhcmlhbnQ6ImRlZmF1bHQiLHR5cGU6ImJ1dHRvbiIsb25DbGljazooKT0+bCgiIyMgIiwiIiwiSGVhZGluZyIpLGNoaWxkcmVuOiJIMiJ9KSxvLmpzeChFLHtzaXplOiJ4cyIsdmFyaWFudDoiZGVmYXVsdCIsdHlwZToiYnV0dG9uIixvbkNsaWNrOigpPT5sKCIqKiIsIioqIiksY2hpbGRyZW46IkIifSksby5qc3goRSx7c2l6ZToieHMiLHZhcmlhbnQ6ImRlZmF1bHQiLHR5cGU6ImJ1dHRvbiIsb25DbGljazooKT0+bCgiXyIsIl8iKSxjaGlsZHJlbjoiSSJ9KSxvLmpzeChFLHtzaXplOiJ4cyIsdmFyaWFudDoiZGVmYXVsdCIsdHlwZToiYnV0dG9uIixvbkNsaWNrOigpPT5sKCItICIsIiIsIkxpc3QgaXRlbSIpLGNoaWxkcmVuOiJMaXN0In0pLG8uanN4KEUse3NpemU6InhzIix2YXJpYW50OiJkZWZhdWx0Iix0eXBlOiJidXR0b24iLG9uQ2xpY2s6KCk9PmwoImAiLCJgIiwiY29kZSIpLGNoaWxkcmVuOiJDb2RlIn0pLG8uanN4KEUse3NpemU6InhzIix2YXJpYW50OiJkZWZhdWx0Iix0eXBlOiJidXR0b24iLG9uQ2xpY2s6KCk9PmwoIlsiLCJdKGh0dHBzOi8vKSIsImxpbmsiKSxjaGlsZHJlbjoiTGluayJ9KV19KSxvLmpzeHMoImRpdiIse2NsYXNzTmFtZTpgbWFya2Rvd24tZWRpdG9yLWJvZHkgbW9kZS0ke3N9YCxjaGlsZHJlbjpbcyE9PSJwcmV2aWV3Ij9vLmpzeChxZSx7cmVmOmksY2xhc3NOYW1lOiJtYXJrZG93bi10ZXh0YXJlYSIsdmFsdWU6bixvbkNoYW5nZTpjPT5yKGMuY3VycmVudFRhcmdldC52YWx1ZSksbWluUm93czoyNH0pOm51bGwscyE9PSJ3cml0ZSI/by5qc3goImRpdiIse2NsYXNzTmFtZToibWFya2Rvd24tcHJldmlldyIscm9sZToidGFicGFuZWwiLCJhcmlhLWxhYmVsIjoiTWFya2Rvd24gcHJldmlldyIsY2hpbGRyZW46bi50cmltKCk/by5qc3goZ24se3ZhbHVlOm59KTpvLmpzeCgicCIse2NsYXNzTmFtZToibXV0ZWQiLGNoaWxkcmVuOiJOb3RoaW5nIHRvIHByZXZpZXcuIn0pfSk6bnVsbF19KV19KX1mdW5jdGlvbiB2bSgpe2NvbnN0W2UsdF09bS51c2VTdGF0ZShtbSksW24scl09bS51c2VTdGF0ZSgiZmlsZXN5c3RlbSIpLFtzLGFdPW0udXNlU3RhdGUoIiIpLFtpLGxdPW0udXNlU3RhdGUoIiIpLFtjLGRdPW0udXNlU3RhdGUobmV3IFNldCksW3UsZl09bS51c2VTdGF0ZShudWxsKSxbcCxoXT1tLnVzZVN0YXRlKCExKSxbeSxnXT1tLnVzZVN0YXRlKCExKSxbdix4XT1tLnVzZVN0YXRlKCJwbGFpbnRleHQiKSxbaix3XT1tLnVzZVN0YXRlKCJEaXNjb25uZWN0ZWQiKSxbUyxDXT1tLnVzZVN0YXRlKG51bGwpLFtrLF9dPW0udXNlU3RhdGUoIi8iKSxbJCxPXT1tLnVzZVN0YXRlKG51bGwpLFtULEFdPW0udXNlU3RhdGUoIiIpLFtELFZdPW0udXNlU3RhdGUoIiIpLFtYLEpdPW0udXNlU3RhdGUoIiIpLFtQLFddPW0udXNlU3RhdGUoITEpLFtJLHpdPW0udXNlU3RhdGUoITEpLFtLLGxlXT1tLnVzZVN0YXRlKG51bGwpLFtzZSxDZV09bS51c2VUcmFuc2l0aW9uKCksdmU9bS51c2VEZWZlcnJlZFZhbHVlKHMudHJpbSgpLnRvTG93ZXJDYXNlKCkpLFRlPW0udXNlUmVmKG51bGwpLHdlPW0udXNlUmVmKFByb21pc2UucmVzb2x2ZSgpKSxjZT1tLnVzZVJlZihudWxsKSx4ZT1tLnVzZVJlZighMSksdWU9bS51c2VNZW1vKCgpPT52ZT9lLm5vZGVzLmZpbHRlcihiPT5bYi5mdWxsX3BhdGgsYi50eXBlLGIudGFncy5qb2luKCIgIiksYi5jb250ZW50X3RleHRdLmpvaW4oIiAiKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHZlKSk6ZS5ub2RlcyxbdmUsZS5ub2Rlc10pLEw9aT9lLnNlbGVjdGVkX25vZGU/P2Uubm9kZXMuZmluZChiPT5iLmZ1bGxfcGF0aD09PWkpPz9udWxsOm51bGwsTmU9bS51c2VNZW1vKCgpPT5Icyh1ZSksW3VlXSksZmU9bS51c2VNZW1vKCgpPT5bLi4ubmV3IFNldChlLmFnZW50X25vZGVzLm1hcChiPT5tbihiLmZ1bGxfcGF0aCkpLmZpbHRlcihCb29sZWFuKSldLnNvcnQoKSxbZS5hZ2VudF9ub2Rlc10pLGRlPVR8fGZlWzBdfHwiIixIZT1tLnVzZU1lbW8oKCk9PmUuYWdlbnRfbm9kZXMuZmlsdGVyKGI9Pm1uKGIuZnVsbF9wYXRoKT09PWRlKSxbZGUsZS5hZ2VudF9ub2Rlc10pLEJ0PW0udXNlTWVtbygoKT0+SHMoSGUpLFtIZV0pLEY9RD9lLmFnZW50X25vZGVzLmZpbmQoYj0+Yi5mdWxsX3BhdGg9PT1EKT8/bnVsbDpIZVswXT8/bnVsbCx4dD1MP2V0KEwuZnVsbF9wYXRoKToiTmV3IG1lbW9yeSByZWNvcmQiLHd0PWx0KEw/TC5mdWxsX3BhdGg6aSksanQ9Y28oTD8ubGlua3MpLFR0PWNvKEw/Lm1ldGFkYXRhKSxKZT0hIShlLmVuY3J5cHRpb25fc3RhdGUmJmUuZW5jcnlwdGlvbl9zdGF0ZSE9PSJwbGFpbnRleHQiKSxGZT0hSmV8fHl8fFdzKGUucHJvamVjdF9pZCk7bS51c2VFZmZlY3QoKCk9PntoZSgpfSxbXSksbS51c2VFZmZlY3QoKCk9PntpZighaSlyZXR1cm47Y29uc3QgYj1pLnNwbGl0KCIvIikuZmlsdGVyKEJvb2xlYW4pO2IubGVuZ3RoPDJ8fGQoUj0+e2NvbnN0IEg9bmV3IFNldChSKTtmb3IobGV0IFE9MDtRPGIubGVuZ3RoLTE7USs9MSlILmFkZChgLyR7Yi5zbGljZSgwLFErMSkuam9pbigiLyIpfWApO3JldHVybiBIfSl9LFtpXSksbS51c2VFZmZlY3QoKCk9PnshVCYmZmUubGVuZ3RoJiZBKGZlWzBdKX0sW1QsZmVdKTthc3luYyBmdW5jdGlvbiBoZShiPXt9KXtjb25zdCBSPWIubW9kZT8/bixIPWIucT8/cyxRPWIucGF0aD8/aSxQcj1uZXcgVVJMU2VhcmNoUGFyYW1zKHttb2RlOlIscTpILHBhdGg6UX0pLGF0PWF3YWl0KGF3YWl0IGZldGNoKGAvbG9jYWwtYXBpL3N0YXRlPyR7UHJ9YCkpLmpzb24oKTtobD1hdC5jc3JmX3Rva2VuPz8iIixDZSgoKT0+e3QoYXQpLHIoUiksYShIKSxsKGF0LnNlbGVjdGVkX3BhdGh8fFEpLGcoYXQuZW5jcnlwdGlvbl9zdGF0ZT09PSJwbGFpbnRleHQifHxXcyhhdC5wcm9qZWN0X2lkKXx8cCYmYXQucHJvamVjdF9pZD09PWUucHJvamVjdF9pZCYmRmUpfSl9ZnVuY3Rpb24gcGUoYixSPXU/Im1vZGFsIjoibWVtb3J5Iil7bGUoe3Njb3BlOlIsdGV4dDpifSl9ZnVuY3Rpb24gQigpe3U9PT0iYWdlbnQtY29uc29sZSImJihXKCExKSx3KCJEaXNjb25uZWN0ZWQiKSx6KCExKSxjZS5jdXJyZW50JiYod2luZG93LmNsZWFyVGltZW91dChjZS5jdXJyZW50KSxjZS5jdXJyZW50PW51bGwpKSxmKG51bGwpLGxlKGI9PmI/LnNjb3BlPT09Im1vZGFsIj9udWxsOmIpfWZ1bmN0aW9uIEcoYil7bGUoUj0+Uj8uc2NvcGU9PT0ibW9kYWwiP251bGw6UiksZihiKX1mdW5jdGlvbiBVKGIpe3JldHVybiBLPy5zY29wZT09PWI/by5qc3goImRpdiIse2NsYXNzTmFtZToibm90aWNlIixjaGlsZHJlbjpLLnRleHR9KTpudWxsfWFzeW5jIGZ1bmN0aW9uIGFlKGIsUixIPXU/Im1vZGFsIjoibWVtb3J5Iil7bGUoUT0+UT8uc2NvcGU9PT1IfHxRPy5zY29wZT09PSJtb2RhbCI/bnVsbDpRKTt0cnl7cmV0dXJuIGF3YWl0IGIoKSxhd2FpdCBoZSgpLHBlKFIsSCksITB9Y2F0Y2goUSl7cmV0dXJuIHBlKFEgaW5zdGFuY2VvZiBFcnJvcj9RLm1lc3NhZ2U6IkFjdGlvbiBmYWlsZWQuIixIKSwhMX19YXN5bmMgZnVuY3Rpb24gVnQoYil7Yi5wcmV2ZW50RGVmYXVsdCgpO2NvbnN0IFI9bmV3IEZvcm1EYXRhKGIuY3VycmVudFRhcmdldCksSD1TdHJpbmcoUi5nZXQoInBhc3NwaHJhc2UiKT8/IiIpLFE9U3RyaW5nKFIuZ2V0KCJjb25maXJtIik/PyIiKTtpZihIIT09USl7cGUoIlBhc3NwaHJhc2VzIGRvIG5vdCBtYXRjaC4iLCJtb2RhbCIpO3JldHVybn1hd2FpdCBhZSgoKT0+bmUoIi9sb2NhbC1hcGkvZ2F0ZXdheS9zZXR1cCIse3Bhc3NwaHJhc2U6SCxkZWZhdWx0X2NvbW1hbmQ6U3RyaW5nKFIuZ2V0KCJkZWZhdWx0X2NvbW1hbmQiKT8/IiIpLnRyaW0oKX0pLCJHYXRld2F5IHZhdWx0IHJlYWR5LiIpfWFzeW5jIGZ1bmN0aW9uIFBlKCl7YXdhaXQgYWUoKCk9Pm5lKCIvbG9jYWwtYXBpL2dhdGV3YXkvbG9jayIse30pLCJHYXRld2F5IGxvY2tlZC4iKX1hc3luYyBmdW5jdGlvbiBJZShiKXtiLnByZXZlbnREZWZhdWx0KCk7Y29uc3QgUj1uZXcgRm9ybURhdGEoYi5jdXJyZW50VGFyZ2V0KTtsZShIPT5IPy5zY29wZT09PSJwcm9qZWN0cyI/bnVsbDpIKTt0cnl7Y29uc3QgSD1hd2FpdCBuZSgiL2xvY2FsLWFwaS9ib290c3RyYXAtcHJvamVjdCIse3NsdWc6U3RyaW5nKFIuZ2V0KCJzbHVnIik/PyIiKSxuYW1lOlN0cmluZyhSLmdldCgibmFtZSIpPz8iIiksZGVzY3JpcHRpb246U3RyaW5nKFIuZ2V0KCJkZXNjcmlwdGlvbiIpPz8iIiksZW5jcnlwdGlvbjp2LHBhc3NwaHJhc2U6dj09PSJlbmNyeXB0ZWQiP1N0cmluZyhSLmdldCgicGFzc3BocmFzZSIpPz8iIik6dm9pZCAwfSk7SC5wcm9qZWN0X2lkJiZYcihILnByb2plY3RfaWQpLGF3YWl0IGhlKCksZyghMCksaCghMCkscGUoSC5lbmNyeXB0aW9uX3N0YXRlPT09ImVuY3J5cHRlZCI/IkVuY3J5cHRlZCBwcm9qZWN0IGNyZWF0ZWQuIjoiUHJvamVjdCBjcmVhdGVkLiIsInByb2plY3RzIil9Y2F0Y2goSCl7cGUoSCBpbnN0YW5jZW9mIEVycm9yP0gubWVzc2FnZToiUHJvamVjdCBib290c3RyYXAgZmFpbGVkLiIsInByb2plY3RzIil9fWZ1bmN0aW9uIFd0KGIpe2woYiksRygibm9kZS12aWV3IiksaGUoe3BhdGg6Yn0pfWZ1bmN0aW9uIF9yKCl7bCgiIiksdChiPT4oey4uLmIsc2VsZWN0ZWRfcGF0aDoiIixzZWxlY3RlZF9ub2RlOm51bGx9KSksRygibm9kZSIpfWZ1bmN0aW9uIERuKGIsUil7ZChIPT57Y29uc3QgUT1uZXcgU2V0KEgpO3JldHVybiBSP1EuYWRkKGIpOlEuZGVsZXRlKGIpLFF9KX1mdW5jdGlvbiBnZShiKXtsKGIpLEcoIm5vZGUtdmlldyIpLGhlKHttb2RlOiJmaWxlc3lzdGVtIixwYXRoOmJ9KX1mdW5jdGlvbiBzdChiLFIpe2lmKCEoImJ1dHRvbiJpbiBiJiZiLmJ1dHRvbiE9PTIpKXtpZihiLnByZXZlbnREZWZhdWx0KCksInRvdWNoZXMiaW4gYil7Y29uc3QgSD1iLnRvdWNoZXNbMF07Qyh7Li4uUix4OkguY2xpZW50WCx5OkguY2xpZW50WX0pO3JldHVybn1DKHsuLi5SLHg6Yi5jbGllbnRYLHk6Yi5jbGllbnRZfSl9fWZ1bmN0aW9uIExuKCl7aWYoSmUmJiFGZSl7RygicHJvamVjdC11bmxvY2siKTtyZXR1cm59IUplJiZlLnByb2plY3RfaWQmJlhyKGUucHJvamVjdF9pZCksaCghMCl9ZnVuY3Rpb24gRm4oYil7Yi5wcmV2ZW50RGVmYXVsdCgpO2NvbnN0IFI9bmV3IEZvcm1EYXRhKGIuY3VycmVudFRhcmdldCk7aWYoIVN0cmluZyhSLmdldCgicGFzc3BocmFzZSIpPz8iIikudHJpbSgpKXtwZSgiUHJvamVjdCBwYXNzcGhyYXNlIGlzIHJlcXVpcmVkLiIsIm1vZGFsIik7cmV0dXJufVhyKGUucHJvamVjdF9pZCksZyghMCksaCghMCksQigpfWFzeW5jIGZ1bmN0aW9uICRyKGIpe2IucHJldmVudERlZmF1bHQoKTtjb25zdCBSPW5ldyBGb3JtRGF0YShiLmN1cnJlbnRUYXJnZXQpO1coITEpLEooIiIpLHcoIkNvbm5lY3RpbmciKTtjb25zdCBIPWF3YWl0IGFlKGFzeW5jKCk9Pnthd2FpdCBuZSgiL2xvY2FsLWFwaS9nYXRld2F5L3VubG9jayIse3Bhc3NwaHJhc2U6U3RyaW5nKFIuZ2V0KCJwYXNzcGhyYXNlIik/PyIiKX0pLGF3YWl0IG5lKCIvbG9jYWwtYXBpL2dhdGV3YXkvY29uZmlndXJlIix7ZGVmYXVsdF9jb21tYW5kOlN0cmluZyhSLmdldCgiZGVmYXVsdF9jb21tYW5kIik/PyIiKS50cmltKCl9KTtjb25zdCBRPWF3YWl0IG5lKCIvbG9jYWwtYXBpL2dhdGV3YXkvdGVybWluYWwvY2FwdHVyZSIse30pO0ooUS5vdXRwdXR8fCIiKX0sIkdhdGV3YXkgcGFzc3BocmFzZSBhY2NlcHRlZC4iLCJtb2RhbCIpO1coSCksdyhIPyJDb25uZWN0ZWQgdG8gY29uZmlndXJlZCBsb2NhbCBnYXRld2F5IHRhcmdldCI6IkRpc2Nvbm5lY3RlZCIpLEgmJndpbmRvdy5zZXRUaW1lb3V0KCgpPT5aZSgpLDUwKX1hc3luYyBmdW5jdGlvbiBUcigpe2F3YWl0IGFlKGFzeW5jKCk9Pntjb25zdCBSPWF3YWl0IG5lKCIvbG9jYWwtYXBpL2dhdGV3YXkvdGVybWluYWwvcmVzdGFydCIse30pO0ooUi5vdXRwdXR8fCIiKX0sIkFnZW50IHRlcm1pbmFsIHJlc3RhcnRlZC4iLCJtb2RhbCIpJiYoVyghMCksdygiQ29ubmVjdGVkIHRvIGNvbmZpZ3VyZWQgbG9jYWwgZ2F0ZXdheSB0YXJnZXQiKSx3aW5kb3cuc2V0VGltZW91dCgoKT0+WmUoKSw1MCkpfWFzeW5jIGZ1bmN0aW9uIGplKCl7YXdhaXQgYWUoYXN5bmMoKT0+e2F3YWl0IG5lKCIvbG9jYWwtYXBpL2dhdGV3YXkvdGVybWluYWwva2lsbCIse30pLEooIiIpfSwiQWdlbnQgdGVybWluYWwga2lsbGVkLiIsIm1vZGFsIikmJihXKCExKSx3KCJEaXNjb25uZWN0ZWQiKSx6KCExKSl9ZnVuY3Rpb24gWmUoKXt3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57VGUuY3VycmVudD8uZm9jdXMoe3ByZXZlbnRTY3JvbGw6ITB9KX0pfWFzeW5jIGZ1bmN0aW9uIGRuKCl7aWYoIXhlLmN1cnJlbnQpe3hlLmN1cnJlbnQ9ITA7dHJ5e2NvbnN0IGI9YXdhaXQgbmUoIi9sb2NhbC1hcGkvZ2F0ZXdheS90ZXJtaW5hbC9jYXB0dXJlIix7fSk7SihiLm91dHB1dHx8IiIpfWZpbmFsbHl7eGUuY3VycmVudD0hMX19fWZ1bmN0aW9uIEdvKGI9OTApe2NlLmN1cnJlbnQmJndpbmRvdy5jbGVhclRpbWVvdXQoY2UuY3VycmVudCksY2UuY3VycmVudD13aW5kb3cuc2V0VGltZW91dCgoKT0+e2NlLmN1cnJlbnQ9bnVsbCxkbigpfSxiKX1mdW5jdGlvbiBYbyhiKXt3ZS5jdXJyZW50PXdlLmN1cnJlbnQuY2F0Y2goKCk9Pnt9KS50aGVuKGFzeW5jKCk9PntpZihiLnR5cGU9PT0idGVybWluYWwuaW5wdXQiKWF3YWl0IG5lKCIvbG9jYWwtYXBpL2dhdGV3YXkvdGVybWluYWwvaW5wdXQiLHtpbnB1dDpTdHJpbmcoYi5kYXRhPz9iLmlucHV0Pz8iIiksZW50ZXI6ISFiLmVudGVyLGVudGVyX2RlbGF5X21zOk51bWJlcihiLmVudGVyX2RlbGF5X21zPz8wKSxzdHJlYW06ITB9KTtlbHNlIGlmKGIudHlwZT09PSJ0ZXJtaW5hbC5rZXkiKWF3YWl0IG5lKCIvbG9jYWwtYXBpL2dhdGV3YXkvdGVybWluYWwva2V5IixiKTtlbHNlIHJldHVybjtHbyhiLmtleT09PSJFbnRlciI/MTQwOjcwKSxiLmtleT09PSJFbnRlciImJndpbmRvdy5zZXRUaW1lb3V0KCgpPT5HbygwKSw0NTApfSkuY2F0Y2goUj0+e3BlKFIgaW5zdGFuY2VvZiBFcnJvcj9SLm1lc3NhZ2U6IlRlcm1pbmFsIGlucHV0IGZhaWxlZC4iLCJtb2RhbCIpfSl9ZnVuY3Rpb24gdmwoYil7cmV0dXJuIHBtKGIpfWZ1bmN0aW9uIHhsKGIpe2lmKCFQKXJldHVybjtjb25zdCBSPXZsKGIpO1ImJihiLnByZXZlbnREZWZhdWx0KCksWG8oUikpfWZ1bmN0aW9uIHdsKGIpe2lmKCFQKXJldHVybjtjb25zdCBSPWIuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCJ0ZXh0Iik7UiYmKGIucHJldmVudERlZmF1bHQoKSxYbyh7dHlwZToidGVybWluYWwuaW5wdXQiLGRhdGE6UixlbnRlcjohMSxlbnRlcl9kZWxheV9tczowfSkpfWZ1bmN0aW9uIEtvKGIpe2woYi5mdWxsX3BhdGgpLHQoUj0+KHsuLi5SLHNlbGVjdGVkX3BhdGg6Yi5mdWxsX3BhdGgsc2VsZWN0ZWRfbm9kZTpifSkpLEcoIm5vZGUiKSxoZSh7cGF0aDpiLmZ1bGxfcGF0aH0pfWFzeW5jIGZ1bmN0aW9uIGpsKGIpe2IucHJldmVudERlZmF1bHQoKTtjb25zdCBSPW5ldyBGb3JtRGF0YShiLmN1cnJlbnRUYXJnZXQpO2F3YWl0IGFlKCgpPT5uZSgiL2xvY2FsLWFwaS9ub2Rlcy91cHNlcnQiLHtwYXRoOlN0cmluZyhSLmdldCgicGF0aCIpPz8iIiksdHlwZTpTdHJpbmcoUi5nZXQoInR5cGUiKT8/Im5vdGUiKSx0YWdzOllzKFN0cmluZyhSLmdldCgidGFncyIpPz8iIikpLGNvbnRlbnRfdGV4dDpTdHJpbmcoUi5nZXQoImNvbnRlbnRfdGV4dCIpPz8iIiksbGlua3M6SlNPTi5wYXJzZShTdHJpbmcoUi5nZXQoImxpbmtzIil8fCJbXSIpKSxtZXRhZGF0YTpKU09OLnBhcnNlKFN0cmluZyhSLmdldCgibWV0YWRhdGEiKXx8Int9IikpfSksIk5vZGUgc2F2ZWQuIikmJkIoKX1hc3luYyBmdW5jdGlvbiBTbChiKXtiLnByZXZlbnREZWZhdWx0KCk7Y29uc3QgUj1uZXcgRm9ybURhdGEoYi5jdXJyZW50VGFyZ2V0KSxIPVN0cmluZyhSLmdldCgiYWdlbnRfc2x1ZyIpPz8iIikudHJpbSgpO2F3YWl0IGFlKCgpPT5uZSgiL2xvY2FsLWFwaS9hZ2VudHMvY3JlYXRlIix7YWdlbnRfc2x1ZzpIfSksIkFnZW50IHdvcmtzcGFjZSBjcmVhdGVkLiIpJiYoQShIKSxCKCkpfWZ1bmN0aW9uIENsKCl7VigiIiksRygiYWdlbnQtbm9kZSIpfWZ1bmN0aW9uIE5sKGIpe1YoYiksRygiYWdlbnQtbm9kZS12aWV3Iil9ZnVuY3Rpb24gSm8oYil7QShtbihiLmZ1bGxfcGF0aCkpLFYoYi5mdWxsX3BhdGgpLEcoImFnZW50LW5vZGUiKX1hc3luYyBmdW5jdGlvbiBrbChiKXtiLnByZXZlbnREZWZhdWx0KCk7Y29uc3QgUj1uZXcgRm9ybURhdGEoYi5jdXJyZW50VGFyZ2V0KTthd2FpdCBhZSgoKT0+bmUoIi9sb2NhbC1hcGkvYWdlbnRzL25vZGVzL3Vwc2VydCIse2FnZW50X3NsdWc6ZGUscGF0aDpTdHJpbmcoUi5nZXQoInBhdGgiKT8/IiIpLHR5cGU6U3RyaW5nKFIuZ2V0KCJ0eXBlIik/PyJhZ2VudC1maWxlIiksdGFnczpZcyhTdHJpbmcoUi5nZXQoInRhZ3MiKT8/IiIpKSxjb250ZW50X3RleHQ6U3RyaW5nKFIuZ2V0KCJjb250ZW50X3RleHQiKT8/IiIpLGxpbmtzOkpTT04ucGFyc2UoU3RyaW5nKFIuZ2V0KCJsaW5rcyIpfHwiW10iKSksbWV0YWRhdGE6SlNPTi5wYXJzZShTdHJpbmcoUi5nZXQoIm1ldGFkYXRhIil8fCJ7fSIpKX0pLCJBZ2VudCBmaWxlIHNhdmVkLiIpJiZCKCl9YXN5bmMgZnVuY3Rpb24gWm8oYil7YXdhaXQgYWUoKCk9Pm5lKCIvbG9jYWwtYXBpL2FnZW50cy9ub2Rlcy9hcmNoaXZlIix7YWdlbnRfc2x1ZzptbihiKSxwYXRoOlVyKGIpfSksIkFnZW50IGZpbGUgYXJjaGl2ZWQuIix1PyJtb2RhbCI6ImFnZW50cyIpfWFzeW5jIGZ1bmN0aW9uIFJsKGIpe2IucHJldmVudERlZmF1bHQoKTtjb25zdCBSPW5ldyBGb3JtRGF0YShiLmN1cnJlbnRUYXJnZXQpO2F3YWl0IGFlKCgpPT5uZSgiL2xvY2FsLWFwaS9hZ2VudHMvbm9kZXMvbGluayIse2FnZW50X3NsdWc6ZGUsc291cmNlX3BhdGg6U3RyaW5nKFIuZ2V0KCJzb3VyY2VfcGF0aCIpPz8iIiksdGFyZ2V0X3BhdGg6U3RyaW5nKFIuZ2V0KCJ0YXJnZXRfcGF0aCIpPz8iIikscmVsYXRpb246U3RyaW5nKFIuZ2V0KCJyZWxhdGlvbiIpfHwicmVmZXJlbmNlcyIpfSksIkFnZW50IGZpbGUgbGlua2VkLiIpJiZCKCl9YXN5bmMgZnVuY3Rpb24gSW4oYixSPXU/Im1vZGFsIjoibWVtb3J5Iil7cmV0dXJuIGFlKCgpPT5uZSgiL2xvY2FsLWFwaS9ub2Rlcy9hcmNoaXZlIix7cGF0aDpifSksIk5vZGUgYXJjaGl2ZWQuIixSKX1hc3luYyBmdW5jdGlvbiBfbChiKXtiLnByZXZlbnREZWZhdWx0KCk7Y29uc3QgUj1uZXcgRm9ybURhdGEoYi5jdXJyZW50VGFyZ2V0KSxIPVN0cmluZyhSLmdldCgiZm9sZGVyX3BhdGgiKT8/IiIpLnJlcGxhY2UoL15cLyt8XC8rJC9nLCIiKTtpZighSCl7cGUoIkZvbGRlciBwYXRoIGlzIHJlcXVpcmVkLiIsIm1vZGFsIik7cmV0dXJufWF3YWl0IGFlKCgpPT5uZSgiL2xvY2FsLWFwaS9ub2Rlcy91cHNlcnQiLHtwYXRoOmAvJHtIfS8uZm9sZGVyYCx0eXBlOiJmb2xkZXIiLHRhZ3M6WyJmb2xkZXIiXSxjb250ZW50X3RleHQ6IiIsbGlua3M6W10sbWV0YWRhdGE6e2Rlc2NyaXB0aW9uOmBWaXJ0dWFsIGZvbGRlciAvJHtIfWB9fSksIkZvbGRlciBjcmVhdGVkLiIpJiZCKCl9YXN5bmMgZnVuY3Rpb24gJGwoYil7Yi5wcmV2ZW50RGVmYXVsdCgpO2NvbnN0IFI9bmV3IEZvcm1EYXRhKGIuY3VycmVudFRhcmdldCksSD1rLnJlcGxhY2UoL1wvKyQvZywiIil8fCIvIixRPWAvJHtTdHJpbmcoUi5nZXQoImZvbGRlcl9wYXRoIik/PyIiKS5yZXBsYWNlKC9eXC8rfFwvKyQvZywiIil9YCxQcj1lLm5vZGVzLmZpbHRlcih6ZT0+bHQoemUuZnVsbF9wYXRoKT09PUh8fGx0KHplLmZ1bGxfcGF0aCkuc3RhcnRzV2l0aChgJHtIfS9gKSk7Zm9yKGNvbnN0IHplIG9mIFByKXtjb25zdCBhdD1sdCh6ZS5mdWxsX3BhdGgpLE1sPWAke2F0PT09SD9ROmF0LnJlcGxhY2UoYCR7SH0vYCxgJHtRfS9gKX0vJHtldCh6ZS5mdWxsX3BhdGgpfWAucmVwbGFjZSgvXC8rL2csIi8iKTthd2FpdCBuZSgiL2xvY2FsLWFwaS9ub2Rlcy91cHNlcnQiLHtwYXRoOk1sLHR5cGU6emUudHlwZXx8Im5vdGUiLHRhZ3M6emUudGFncyxjb250ZW50X3RleHQ6emUuY29udGVudF90ZXh0LGxpbmtzOnplLmxpbmtzfHxbXSxtZXRhZGF0YTp6ZS5tZXRhZGF0YXx8e319KSxhd2FpdCBuZSgiL2xvY2FsLWFwaS9ub2Rlcy9hcmNoaXZlIix7cGF0aDp6ZS5mdWxsX3BhdGh9KX1hd2FpdCBoZSgpLEIoKSxwZSgiRm9sZGVyIHJlbmFtZWQuIiwibWVtb3J5Iil9YXN5bmMgZnVuY3Rpb24gVGwoYixSPXU/Im1vZGFsIjoibWVtb3J5Iil7cmV0dXJuIGFlKGFzeW5jKCk9Pntjb25zdCBIPWUubm9kZXMuZmlsdGVyKFE9Pmx0KFEuZnVsbF9wYXRoKT09PWJ8fGx0KFEuZnVsbF9wYXRoKS5zdGFydHNXaXRoKGAke2J9L2ApKTtmb3IoY29uc3QgUSBvZiBIKWF3YWl0IG5lKCIvbG9jYWwtYXBpL25vZGVzL2FyY2hpdmUiLHtwYXRoOlEuZnVsbF9wYXRofSl9LCJGb2xkZXIgYXJjaGl2ZWQuIixSKX1hc3luYyBmdW5jdGlvbiBQbCgpeyQ9PT0iZm9sZGVyIiYmYXdhaXQgVGwoaywibW9kYWwiKSYmKEIoKSxwZSgiRm9sZGVyIGFyY2hpdmVkLiIsIm1lbW9yeSIpKSwkPT09Im5vZGUiJiZpJiZhd2FpdCBJbihpLCJtb2RhbCIpJiYoQigpLHBlKCJOb2RlIGFyY2hpdmVkLiIsIm1lbW9yeSIpKX1hc3luYyBmdW5jdGlvbiBFbChiKXtiLnByZXZlbnREZWZhdWx0KCk7Y29uc3QgUj1uZXcgRm9ybURhdGEoYi5jdXJyZW50VGFyZ2V0KTthd2FpdCBhZSgoKT0+bmUoIi9sb2NhbC1hcGkvbm9kZXMvbGluayIse3NvdXJjZV9wYXRoOlN0cmluZyhSLmdldCgic291cmNlX3BhdGgiKT8/IiIpLHRhcmdldF9wYXRoOlN0cmluZyhSLmdldCgidGFyZ2V0X3BhdGgiKT8/IiIpLHJlbGF0aW9uOlN0cmluZyhSLmdldCgicmVsYXRpb24iKXx8InJlZmVyZW5jZXMiKX0pLCJOb2RlcyBsaW5rZWQuIikmJkIoKX1hc3luYyBmdW5jdGlvbiBBbChiKXtiLnByZXZlbnREZWZhdWx0KCk7Y29uc3QgUj1uZXcgRm9ybURhdGEoYi5jdXJyZW50VGFyZ2V0KTthd2FpdCBhZSgoKT0+bmUoIi9sb2NhbC1hcGkvc2NoZWR1bGVzIix7bmFtZTpTdHJpbmcoUi5nZXQoIm5hbWUiKT8/IiIpLGNyb25fZXhwcjpTdHJpbmcoUi5nZXQoImNyb25fZXhwciIpPz8iIiksdGltZXpvbmU6U3RyaW5nKFIuZ2V0KCJ0aW1lem9uZSIpfHwiVVRDIiksdGFyZ2V0X2FnZW50X2lkOlN0cmluZyhSLmdldCgidGFyZ2V0X2FnZW50X2lkIil8fCIiKXx8dm9pZCAwLGluc3RydWN0aW9uX3RleHQ6U3RyaW5nKFIuZ2V0KCJpbnN0cnVjdGlvbl90ZXh0Iik/PyIiKSxwYXlsb2FkOkpTT04ucGFyc2UoU3RyaW5nKFIuZ2V0KCJwYXlsb2FkIil8fCJ7fSIpKX0pLCJTY2hlZHVsZSBzaWduZWQgYW5kIHB1Ymxpc2hlZC4iKSYmQigpfWFzeW5jIGZ1bmN0aW9uIE9sKGIpe2IucHJldmVudERlZmF1bHQoKTtjb25zdCBSPW5ldyBGb3JtRGF0YShiLmN1cnJlbnRUYXJnZXQpO2F3YWl0IGFlKCgpPT5uZSgiL2xvY2FsLWFwaS9mZWVkYmFjayIse2tpbmQ6U3RyaW5nKFIuZ2V0KCJraW5kIil8fCJzdWdnZXN0aW9uIiksc2V2ZXJpdHk6U3RyaW5nKFIuZ2V0KCJzZXZlcml0eSIpfHwiaW5mbyIpLHRpdGxlOlN0cmluZyhSLmdldCgidGl0bGUiKT8/IiIpLGJvZHk6U3RyaW5nKFIuZ2V0KCJib2R5Iik/PyIiKX0pLCJGZWVkYmFjayBzdWJtaXR0ZWQuIikmJkIoKX1yZXR1cm4hcHx8IUZlP28uanN4cyhRcix7ZGVmYXVsdENvbG9yU2NoZW1lOiJsaWdodCIsY2hpbGRyZW46W28uanN4cygibWFpbiIse2NoaWxkcmVuOltvLmpzeHMoImRpdiIse2NsYXNzTmFtZToidG9wYmFyIixjaGlsZHJlbjpbby5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImJyYW5kIixjaGlsZHJlbjpbby5qc3goInNwYW4iLHtjbGFzc05hbWU6Im1hcmsiLGNoaWxkcmVuOiJOIn0pLG8uanN4KCJzcGFuIix7Y2hpbGRyZW46Ik5hcHNlZXIgbG9jYWwgbWFuYWdlciJ9KV19KSxlLnZhdWx0X2NvbmZpZ3VyZWQ/by5qc3goRSx7c2l6ZToieHMiLHZhcmlhbnQ6ImRlZmF1bHQiLG9uQ2xpY2s6KCk9PnZvaWQgUGUoKSxjaGlsZHJlbjoiTG9jayBHYXRld2F5In0pOm51bGxdfSksby5qc3hzKCJzZWN0aW9uIix7Y2xhc3NOYW1lOiJwcm9qZWN0LWRhc2hib2FyZC1saXN0IixjaGlsZHJlbjpbby5qc3goImRpdiIse2NsYXNzTmFtZToic2VjdGlvbi1oZWFkIixjaGlsZHJlbjpvLmpzeHMoImRpdiIse2NoaWxkcmVuOltvLmpzeCgiaDEiLHtjaGlsZHJlbjoiUHJvamVjdHMifSksby5qc3goInAiLHtjbGFzc05hbWU6Im11dGVkIixjaGlsZHJlbjoiTG9jYWwgbWFuYWdlciBpcyBzY29wZWQgdG8gdGhlIHByb2plY3QgY29uZmlndXJlZCBpbiB0aGlzIHJlcG9zaXRvcnkuIn0pXX0pfSksVSgicHJvamVjdHMiKSxlLmJvb3RzdHJhcF9yZXF1aXJlZD9vLmpzeHMoZW4se2NsYXNzTmFtZToibG9jYWwtcHJvamVjdC1jYXJkIixjb21wb25lbnQ6ImZvcm0iLG9uU3VibWl0OkllLGNoaWxkcmVuOltvLmpzeCgic3BhbiIse2NsYXNzTmFtZToicmVjb3JkLWtpY2tlciIsY2hpbGRyZW46ImJvb3RzdHJhcCJ9KSxvLmpzeCgic3Ryb25nIix7Y2hpbGRyZW46IkNyZWF0ZSB0aGlzIHByb2plY3QifSksby5qc3goInAiLHtjaGlsZHJlbjoiQ2hvb3NlIHRoZSBpbml0aWFsIHByb2plY3Qgb3B0aW9ucyBmb3IgdGhpcyBsb2NhbCBjaGVja291dC4ifSksby5qc3hzKHllLHtnYXA6InNtIixjaGlsZHJlbjpbby5qc3goWix7bmFtZToibmFtZSIsbGFiZWw6IlByb2plY3QgbmFtZSIscmVxdWlyZWQ6ITAscGxhY2Vob2xkZXI6Ik5hcHNlZXIifSksby5qc3goWix7bmFtZToic2x1ZyIsbGFiZWw6IlByb2plY3Qgc2x1ZyIscmVxdWlyZWQ6ITAscGxhY2Vob2xkZXI6Im5hcHNlZXIifSksby5qc3gocWUse25hbWU6ImRlc2NyaXB0aW9uIixsYWJlbDoiRGVzY3JpcHRpb24iLG1pblJvd3M6Mn0pLG8uanN4KHluLHtkYXRhOlt7dmFsdWU6InBsYWludGV4dCIsbGFiZWw6IlBsYWludGV4dCBwcm9qZWN0In0se3ZhbHVlOiJlbmNyeXB0ZWQiLGxhYmVsOiJFbmNyeXB0ZWQgcHJvamVjdCJ9XSxsYWJlbDoiSW5pdGlhbCBwcml2YWN5Iix2YWx1ZTp2LG9uQ2hhbmdlOmI9PngoYj09PSJlbmNyeXB0ZWQiPyJlbmNyeXB0ZWQiOiJwbGFpbnRleHQiKX0pLHY9PT0iZW5jcnlwdGVkIj9vLmpzeChaLHtuYW1lOiJwYXNzcGhyYXNlIix0eXBlOiJwYXNzd29yZCIsbGFiZWw6IlByb2plY3QgcGFzc3BocmFzZSIscmVxdWlyZWQ6ITB9KTpudWxsLG8uanN4KG9lLHtqdXN0aWZ5OiJmbGV4LWVuZCIsY2hpbGRyZW46by5qc3goRSx7dHlwZToic3VibWl0IixjaGlsZHJlbjoiQ3JlYXRlIHByb2plY3QifSl9KSxlLmF1dGhfY29uZmlndXJlZD9udWxsOm8uanN4KE90LHtjbGFzc05hbWU6Im11dGVkIixjaGlsZHJlbjoiTG9jYWwgYXV0aCB3aWxsIGJlIGNyZWF0ZWQgYmVmb3JlIHRoZSBwcm9qZWN0IGlzIHNhdmVkLiJ9KV19KV19KTpvLmpzeHMoImJ1dHRvbiIse2NsYXNzTmFtZToibG9jYWwtcHJvamVjdC1jYXJkIixvbkNsaWNrOkxuLHR5cGU6ImJ1dHRvbiIsY2hpbGRyZW46W28uanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJyZWNvcmQta2lja2VyIixjaGlsZHJlbjplLmVuY3J5cHRpb25fc3RhdGV8fCJwbGFpbnRleHQifSksby5qc3goInN0cm9uZyIse2NoaWxkcmVuOmUucHJvamVjdF9uYW1lfHxlLnByb2plY3Rfc2x1Z3x8IkxvY2FsIHByb2plY3QifSksby5qc3goInAiLHtjaGlsZHJlbjplLnByb2plY3RfZGVzY3JpcHRpb258fCJObyBwcm9qZWN0IGRlc2NyaXB0aW9uIHlldC4ifSksby5qc3goImNvZGUiLHtjaGlsZHJlbjplLnByb2plY3RfaWR8fCJub3QgY29uZmlndXJlZCJ9KV19KV19KV19KSxvLmpzeChpZSx7b3BlbmVkOnU9PT0icHJvamVjdC11bmxvY2siLG9uQ2xvc2U6Qix0aXRsZToiT3BlbiBlbmNyeXB0ZWQgcHJvamVjdCIsY2VudGVyZWQ6ITAsY2hpbGRyZW46by5qc3goImZvcm0iLHtjbGFzc05hbWU6Im1vZGFsLWZvcm0iLG9uU3VibWl0OkZuLGNoaWxkcmVuOm8uanN4cyh5ZSx7Z2FwOiJzbSIsY2hpbGRyZW46W1UoIm1vZGFsIiksby5qc3goWix7bmFtZToicGFzc3BocmFzZSIscmVxdWlyZWQ6ITAsdHlwZToicGFzc3dvcmQiLGxhYmVsOiJQcm9qZWN0IHBhc3NwaHJhc2Ugb3IgcmVjb3Zlcnkgd29yZHMiLGF1dG9Gb2N1czohMH0pLG8uanN4cyhvZSx7anVzdGlmeToiZmxleC1lbmQiLGNoaWxkcmVuOltvLmpzeChFLHt2YXJpYW50OiJkZWZhdWx0IixvbkNsaWNrOkIsdHlwZToiYnV0dG9uIixjaGlsZHJlbjoiQ2FuY2VsIn0pLG8uanN4KEUse3R5cGU6InN1Ym1pdCIsY2hpbGRyZW46Ik9wZW4gcHJvamVjdCJ9KV19KV19KX0pfSldfSk6by5qc3hzKFFyLHtkZWZhdWx0Q29sb3JTY2hlbWU6ImxpZ2h0IixjaGlsZHJlbjpbby5qc3hzKCJtYWluIix7b25DbGljazooKT0+QyhudWxsKSxjaGlsZHJlbjpbby5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InRvcGJhciIsY2hpbGRyZW46W28uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJicmFuZCIsY2hpbGRyZW46W28uanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJtYXJrIixjaGlsZHJlbjoiTiJ9KSxvLmpzeCgic3BhbiIse2NoaWxkcmVuOiJOYXBzZWVyIGxvY2FsIG1hbmFnZXIifSldfSksby5qc3hzKCJuYXYiLHtjaGlsZHJlbjpbby5qc3goImEiLHtocmVmOiIjbWVtb3J5IixjaGlsZHJlbjoiTWVtb3J5In0pLG8uanN4KCJhIix7aHJlZjoiI2FnZW50cyIsY2hpbGRyZW46IkFnZW50cyJ9KSxvLmpzeCgiYSIse2hyZWY6IiNzY2hlZHVsZXMiLGNoaWxkcmVuOiJTY2hlZHVsZXMifSksby5qc3goImEiLHtocmVmOiIjYXV0aCIsY2hpbGRyZW46IkF1dGgifSksby5qc3goImEiLHtocmVmOiIjZmVlZGJhY2siLGNoaWxkcmVuOiJGZWVkYmFjayJ9KSxvLmpzeCgiYSIse2hyZWY6IiN1cGRhdGUiLGNoaWxkcmVuOiJVcGRhdGUifSldfSksby5qc3goRSx7c2l6ZToieHMiLHZhcmlhbnQ6ImRlZmF1bHQiLG9uQ2xpY2s6KCk9PmgoITEpLGNoaWxkcmVuOiJQcm9qZWN0cyJ9KSxvLmpzeChFLHtzaXplOiJ4cyIsb25DbGljazooKT0+RygiYWdlbnQtY29uc29sZSIpLGNoaWxkcmVuOiJBZ2VudCBDb25zb2xlIn0pLGUudmF1bHRfY29uZmlndXJlZD9vLmpzeChFLHtzaXplOiJ4cyIsdmFyaWFudDoiZGVmYXVsdCIsb25DbGljazooKT0+dm9pZCBQZSgpLGNoaWxkcmVuOiJMb2NrIEdhdGV3YXkifSk6bnVsbF19KSxvLmpzeHMoZW4se2NsYXNzTmFtZToiaGVybyIsY2hpbGRyZW46W28uanN4KFJyLHtvcmRlcjoxLGNoaWxkcmVuOmUucHJvamVjdF9uYW1lfHwiUHJvamVjdCBtZW1vcnkifSksby5qc3hzKE90LHtjbGFzc05hbWU6Im11dGVkIixjaGlsZHJlbjpbIlRoaXMgVUkgcnVucyBvbiAiLG8uanN4KHV0LHtjaGlsZHJlbjoiMTI3LjAuMC4xIn0pLCIsIHJlYWRzICIsby5qc3godXQse2NoaWxkcmVuOmUuYXV0aF9wYXRofSksIiwgYW5kIHNpZ25zIGV4ZWN1dGFibGUgc2NoZWR1bGVzIGxvY2FsbHkuIl19KSxvLmpzeHMoImRpdiIse2NsYXNzTmFtZToic3RhdHMiLGNoaWxkcmVuOltvLmpzeHMoImRpdiIse2NsYXNzTmFtZToic3RhdCIsY2hpbGRyZW46W28uanN4KCJiIix7Y2hpbGRyZW46IlByb2plY3QifSksby5qc3goInNwYW4iLHtjbGFzc05hbWU6Im1vbm8iLGNoaWxkcmVuOmUucHJvamVjdF9zbHVnfHxlLnByb2plY3RfaWR8fCJsb2FkaW5nIn0pXX0pLG8uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJzdGF0IixjaGlsZHJlbjpbby5qc3goImIiLHtjaGlsZHJlbjoiQWdlbnQifSksby5qc3goInNwYW4iLHtjbGFzc05hbWU6Im1vbm8iLGNoaWxkcmVuOmUuYWdlbnRfaWR8fCJ1bmtub3duIn0pXX0pLG8uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJzdGF0IixjaGlsZHJlbjpbby5qc3goImIiLHtjaGlsZHJlbjoiQ29ubmVjdGVkIGFnZW50cyJ9KSxvLmpzeCgic3BhbiIse2NoaWxkcmVuOmUuY29ubmVjdGVkX2FnZW50cy5maWx0ZXIoYj0+Yi5jb25uZWN0ZWQpLmxlbmd0aH0pXX0pLG8uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJzdGF0IixjaGlsZHJlbjpbby5qc3goImIiLHtjaGlsZHJlbjoiRW5jcnlwdGlvbiJ9KSxvLmpzeCgic3BhbiIse2NoaWxkcmVuOmUuZW5jcnlwdGlvbl9zdGF0ZXx8InBsYWludGV4dCJ9KV19KSxvLmpzeHMoImRpdiIse2NsYXNzTmFtZToic3RhdCIsY2hpbGRyZW46W28uanN4KCJiIix7Y2hpbGRyZW46IldyYXBwZXIifSksby5qc3goInNwYW4iLHtjaGlsZHJlbjplLndyYXBwZXIudXBfdG9fZGF0ZT8iVXAgdG8gZGF0ZSI6IlVwZGF0ZSBhdmFpbGFibGUifSldfSldfSldfSksby5qc3hzKCJzZWN0aW9uIix7aWQ6Im1lbW9yeSIsY2hpbGRyZW46W28uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJzZWN0aW9uLWhlYWQiLGNoaWxkcmVuOltvLmpzeHMoImRpdiIse2NoaWxkcmVuOltvLmpzeCgiaDIiLHtjaGlsZHJlbjoiTWVtb3J5In0pLG8uanN4KCJwIix7Y2xhc3NOYW1lOiJtdXRlZCIsY2hpbGRyZW46IkZpbGVzeXN0ZW0gbW9kZSBpcyBkZWZhdWx0LiBQYXRoLWxpc3QgbW9kZSBrZWVwcyB0aGUgY2Fub25pY2FsIGZsYXQgcGF0aHMuIn0pXX0pLG8uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJoZWFkZXItYWN0aW9ucyIsY2hpbGRyZW46W28uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJ0YWJzIixjaGlsZHJlbjpbby5qc3goRSx7c2l6ZToieHMiLHZhcmlhbnQ6bj09PSJmaWxlc3lzdGVtIj8iZmlsbGVkIjoiZGVmYXVsdCIsb25DbGljazooKT0+dm9pZCBoZSh7bW9kZToiZmlsZXN5c3RlbSJ9KSxjaGlsZHJlbjoiRm9sZGVycyJ9KSxvLmpzeChFLHtzaXplOiJ4cyIsdmFyaWFudDpuPT09InBhdGgtbGlzdCI/ImZpbGxlZCI6ImRlZmF1bHQiLG9uQ2xpY2s6KCk9PnZvaWQgaGUoe21vZGU6InBhdGgtbGlzdCJ9KSxjaGlsZHJlbjoiVHJlZSBsaXN0In0pXX0pLG8uanN4KEUse3NpemU6InhzIixvbkNsaWNrOl9yLGNoaWxkcmVuOiJBZGQgbm9kZSJ9KV19KV19KSxVKCJtZW1vcnkiKSxvLmpzeHMoImRpdiIse2NsYXNzTmFtZToic2VhcmNoIixjaGlsZHJlbjpbby5qc3goWix7b25DaGFuZ2U6Yj0+YShiLnRhcmdldC52YWx1ZSksb25LZXlEb3duOmI9PntiLmtleT09PSJFbnRlciImJmhlKHtxOnN9KX0scGxhY2Vob2xkZXI6IlNlYXJjaCBwYXRocywgdGFncywgb3IgY29udGVudCIsdmFsdWU6c30pLG8uanN4KEUse2Rpc2FibGVkOnNlLG9uQ2xpY2s6KCk9PnZvaWQgaGUoe3E6c30pLGNoaWxkcmVuOiJTZWFyY2gifSldfSksbj09PSJmaWxlc3lzdGVtIj9vLmpzeHMoImRpdiIse2NsYXNzTmFtZToid29ya3NwYWNlIixjaGlsZHJlbjpbby5qc3hzKCJhc2lkZSIse2NsYXNzTmFtZToic2lkZSIsY2hpbGRyZW46W28uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJzaWRlLWhlYWQiLGNoaWxkcmVuOltvLmpzeCgic3Ryb25nIix7Y2hpbGRyZW46IkZpbGVzIn0pLG8uanN4cygic3BhbiIse2NsYXNzTmFtZToibXV0ZWQiLGNoaWxkcmVuOlt1ZS5sZW5ndGgsIiBub2RlcyJdfSldfSksby5qc3goImRpdiIse2NsYXNzTmFtZToidHJlZSIsY2hpbGRyZW46dWUubGVuZ3RoP28uanN4KHVvLHticmFuY2g6TmUsc2VsZWN0ZWRQYXRoOmksb25TZWxlY3Q6V3Qsb3BlbkZvbGRlcnM6YyxvblRvZ2dsZUZvbGRlcjpEbixvbkNvbnRleHRBY3Rpb246c3R9KTpvLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJlbXB0eSIsY2hpbGRyZW46Ik5vIG5vZGVzIGZvdW5kLiJ9KX0pXX0pLG8uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJkZXRhaWwiLGNoaWxkcmVuOltvLmpzeHMoImRpdiIse2NsYXNzTmFtZToiZGV0YWlsLWhlYWQgcmVjb3JkLWhlYWQiLGNoaWxkcmVuOltvLmpzeHMoImRpdiIse2NsYXNzTmFtZToicmVjb3JkLXRpdGxlIixjaGlsZHJlbjpbby5qc3hzKCJzcGFuIix7Y2xhc3NOYW1lOiJyZWNvcmQta2lja2VyIixjaGlsZHJlbjpbTD8udHlwZT8/ImRyYWZ0IiwiIHJlY29yZCJdfSksby5qc3goInN0cm9uZyIse2NoaWxkcmVuOnh0fSksby5qc3goImNvZGUiLHtjaGlsZHJlbjpMPy5mdWxsX3BhdGg/PyhpfHwiL25ldy1ub2RlIil9KV19KSxvLmpzeHMob2Use2dhcDo2LHdyYXA6IndyYXAiLGp1c3RpZnk6ImZsZXgtZW5kIixjaGlsZHJlbjpbby5qc3goRSx7ZGlzYWJsZWQ6IUwsc2l6ZToieHMiLHZhcmlhbnQ6ImRlZmF1bHQiLG9uQ2xpY2s6KCk9PkwmJkcoIm5vZGUiKSx0eXBlOiJidXR0b24iLGNoaWxkcmVuOiJFZGl0In0pLG8uanN4KEUse2Rpc2FibGVkOiFMJiYhaSxzaXplOiJ4cyIsdmFyaWFudDoiZGVmYXVsdCIsb25DbGljazooKT0+RygibGluayIpLHR5cGU6ImJ1dHRvbiIsY2hpbGRyZW46IkFkZCBsaW5rIn0pLG8uanN4KEUse2NvbG9yOiJyZWQiLGRpc2FibGVkOiFMLHNpemU6InhzIix2YXJpYW50OiJsaWdodCIsb25DbGljazooKT0+TCYmdm9pZCBJbihMLmZ1bGxfcGF0aCksdHlwZToiYnV0dG9uIixjaGlsZHJlbjoiQXJjaGl2ZSJ9KV19KV19KSxvLmpzeHMoImRpdiIse2NsYXNzTmFtZToicmVjb3JkLW1ldGEiLGNoaWxkcmVuOltvLmpzeHMoInNwYW4iLHtjaGlsZHJlbjpbby5qc3goImIiLHtjaGlsZHJlbjoiRm9sZGVyIn0pLHd0XX0pLG8uanN4cygic3BhbiIse2NoaWxkcmVuOltvLmpzeCgiYiIse2NoaWxkcmVuOiJUYWdzIn0pLEw/LnRhZ3MubGVuZ3RoPz8wXX0pLG8uanN4cygic3BhbiIse2NoaWxkcmVuOltvLmpzeCgiYiIse2NoaWxkcmVuOiJMaW5rcyJ9KSxqdF19KSxvLmpzeHMoInNwYW4iLHtjaGlsZHJlbjpbby5qc3goImIiLHtjaGlsZHJlbjoiTWV0YWRhdGEifSksVHRdfSldfSksby5qc3goImRpdiIse2NsYXNzTmFtZToiZGV0YWlsLWJvZHkgcmVjb3JkLXJlYWQiLGNoaWxkcmVuOkw/by5qc3hzKG8uRnJhZ21lbnQse2NoaWxkcmVuOltvLmpzeHMoImRpdiIse2NsYXNzTmFtZToicmVhZC1zZWN0aW9uIixjaGlsZHJlbjpbby5qc3goImgzIix7Y2hpbGRyZW46IkNvbnRlbnQifSksby5qc3goZ24se3ZhbHVlOkwuY29udGVudF90ZXh0fSldfSksby5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InJlY29yZC1zdHJ1Y3R1cmUiLGNoaWxkcmVuOltvLmpzeHMoImRpdiIse2NsYXNzTmFtZToicmVhZC1zZWN0aW9uIixjaGlsZHJlbjpbby5qc3goImgzIix7Y2hpbGRyZW46IkxpbmtzIn0pLFV0KEwubGlua3MpP28uanN4KCJwcmUiLHtjaGlsZHJlbjpRZShMLmxpbmtzLFtdKX0pOm8uanN4KCJwIix7Y2xhc3NOYW1lOiJtdXRlZCIsY2hpbGRyZW46Ik5vIGxpbmtzIHJlY29yZGVkLiJ9KV19KSxvLmpzeHMoImRpdiIse2NsYXNzTmFtZToicmVhZC1zZWN0aW9uIixjaGlsZHJlbjpbby5qc3goImgzIix7Y2hpbGRyZW46Ik1ldGFkYXRhIn0pLFV0KEwubWV0YWRhdGEpP28uanN4KCJwcmUiLHtjaGlsZHJlbjpRZShMLm1ldGFkYXRhLHt9KX0pOm8uanN4KCJwIix7Y2xhc3NOYW1lOiJtdXRlZCIsY2hpbGRyZW46Ik5vIG1ldGFkYXRhIHJlY29yZGVkLiJ9KV19KV19KV19KTpvLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJlbXB0eSIsY2hpbGRyZW46IlNlbGVjdCBhIG5vZGUgb3IgdXNlIEFkZCBub2RlIHRvIGNyZWF0ZSBhIHJlY29yZC4ifSl9KV19KV19KTpvLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJkZXRhaWwiLGNoaWxkcmVuOm8uanN4cyhyZSx7Y2xhc3NOYW1lOiJub2RlLXRhYmxlIixjaGlsZHJlbjpbby5qc3gocmUuVGhlYWQse2NoaWxkcmVuOm8uanN4cyhyZS5Ucix7Y2hpbGRyZW46W28uanN4KHJlLlRoLHtjaGlsZHJlbjoiUmVjb3JkIn0pLG8uanN4KHJlLlRoLHtjaGlsZHJlbjoiRm9sZGVyIn0pLG8uanN4KHJlLlRoLHtjaGlsZHJlbjoiVGFncyJ9KSxvLmpzeChyZS5UaCx7Y2hpbGRyZW46IlByZXZpZXcifSksby5qc3gocmUuVGgse2NoaWxkcmVuOiJBY3Rpb25zIn0pXX0pfSksby5qc3gocmUuVGJvZHkse2NoaWxkcmVuOnVlLm1hcChiPT5vLmpzeHMocmUuVHIse2NoaWxkcmVuOltvLmpzeChyZS5UZCx7Y2hpbGRyZW46by5qc3hzKCJidXR0b24iLHtjbGFzc05hbWU6InJlY29yZC1saW5rIixvbkNsaWNrOigpPT5nZShiLmZ1bGxfcGF0aCksdHlwZToiYnV0dG9uIixjaGlsZHJlbjpbby5qc3goInNwYW4iLHtjaGlsZHJlbjpldChiLmZ1bGxfcGF0aCl9KSxvLmpzeCh1dCx7Y2hpbGRyZW46Yi50eXBlfHwibm90ZSJ9KV19KX0pLG8uanN4KHJlLlRkLHtjaGlsZHJlbjpvLmpzeCh1dCx7Y2hpbGRyZW46bHQoYi5mdWxsX3BhdGgpfSl9KSxvLmpzeChyZS5UZCx7Y2hpbGRyZW46by5qc3gob2Use2dhcDo0LGNoaWxkcmVuOmIudGFncy5tYXAoUj0+by5qc3goZHQse2NvbG9yOiJncmF5IixjaGlsZHJlbjpSfSxSKSl9KX0pLG8uanN4KHJlLlRkLHtjbGFzc05hbWU6InByZXZpZXctY2VsbCIsY2hpbGRyZW46R3IoYi5jb250ZW50X3RleHQpfSksby5qc3gocmUuVGQse2NoaWxkcmVuOm8uanN4cyhvZSx7Z2FwOjYsd3JhcDoibm93cmFwIixjaGlsZHJlbjpbby5qc3goRSx7c2l6ZToieHMiLHZhcmlhbnQ6ImRlZmF1bHQiLG9uQ2xpY2s6KCk9PmdlKGIuZnVsbF9wYXRoKSxjaGlsZHJlbjoiT3BlbiJ9KSxvLmpzeChFLHtzaXplOiJ4cyIsdmFyaWFudDoibGlnaHQiLG9uQ2xpY2s6KCk9PktvKGIpLGNoaWxkcmVuOiJFZGl0In0pLG8uanN4KEUse3NpemU6InhzIixjb2xvcjoicmVkIix2YXJpYW50OiJzdWJ0bGUiLG9uQ2xpY2s6KCk9PnZvaWQgSW4oYi5mdWxsX3BhdGgpLGNoaWxkcmVuOiJBcmNoaXZlIn0pXX0pfSldfSxiLmlkKSl9KV19KX0pXX0pLG8uanN4cygic2VjdGlvbiIse2lkOiJhZ2VudHMiLGNoaWxkcmVuOltvLmpzeHMoImRpdiIse2NsYXNzTmFtZToic2VjdGlvbi1oZWFkIixjaGlsZHJlbjpbby5qc3hzKCJkaXYiLHtjaGlsZHJlbjpbby5qc3goImgyIix7Y2hpbGRyZW46IkFnZW50cyJ9KSxvLmpzeHMoInAiLHtjbGFzc05hbWU6Im11dGVkIixjaGlsZHJlbjpbIkNvbm5lY3RlZCB3b3JrZXJzIGFyZSBydW50aW1lIGFjY2VzczsgcGVyc29uYWxpdGllcyBhbmQgcm9sZXMgbGl2ZSBhcyBmaWxlcyB1bmRlciAiLG8uanN4KHV0LHtjaGlsZHJlbjoiL2FnZW50cy88c2x1Zz4ifSksIi4iXX0pXX0pLG8uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJoZWFkZXItYWN0aW9ucyIsY2hpbGRyZW46W28uanN4KEUse3NpemU6InhzIix2YXJpYW50OiJkZWZhdWx0IixvbkNsaWNrOigpPT5HKCJhZ2VudC1jcmVhdGUiKSxjaGlsZHJlbjoiQWRkIGFnZW50In0pLG8uanN4KEUse3NpemU6InhzIixkaXNhYmxlZDohZGUsb25DbGljazpDbCxjaGlsZHJlbjoiQWRkIGZpbGUifSldfSldfSksVSgiYWdlbnRzIiksby5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImRldGFpbCBjb25uZWN0ZWQtYWdlbnRzLXBhbmVsIixjaGlsZHJlbjpbby5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InNpZGUtaGVhZCIsY2hpbGRyZW46W28uanN4KCJzdHJvbmciLHtjaGlsZHJlbjoiQ29ubmVjdGVkIGFnZW50cyJ9KSxvLmpzeHMoInNwYW4iLHtjbGFzc05hbWU6Im11dGVkIixjaGlsZHJlbjpbZS5jb25uZWN0ZWRfYWdlbnRzLmZpbHRlcihiPT5iLmNvbm5lY3RlZCkubGVuZ3RoLCIgb25saW5lIl19KV19KSxlLmNvbm5lY3RlZF9hZ2VudHMuZmlsdGVyKGI9PmIuY29ubmVjdGVkKS5sZW5ndGg/by5qc3goImRpdiIse2NsYXNzTmFtZToiYWdlbnQtY29ubmVjdGlvbi1saXN0IixjaGlsZHJlbjplLmNvbm5lY3RlZF9hZ2VudHMuZmlsdGVyKGI9PmIuY29ubmVjdGVkKS5tYXAoYj0+by5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImFnZW50LWNvbm5lY3Rpb24tcm93IixjaGlsZHJlbjpbby5qc3hzKCJkaXYiLHtjaGlsZHJlbjpbby5qc3goInN0cm9uZyIse2NoaWxkcmVuOmIubmFtZX0pLG8uanN4KCJjb2RlIix7Y2hpbGRyZW46Yi5hZ2VudF9pZH0pXX0pLG8uanN4KGR0LHtjb2xvcjoiZ3JlZW4iLGNoaWxkcmVuOiJjb25uZWN0ZWQifSksby5qc3goInNwYW4iLHtjaGlsZHJlbjpiLmxhc3Rfc2Vlbl9hdD9uZXcgRGF0ZShiLmxhc3Rfc2Vlbl9hdCkudG9Mb2NhbGVTdHJpbmcoKToiTm8gcmVjZW50IHRva2VuIn0pLG8uanN4KCJzbWFsbCIse2NoaWxkcmVuOmIucm9vdF9wYXRofSldfSxiLmlkKSl9KTpvLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJlbXB0eSIsY2hpbGRyZW46Ik5vIGNvbm5lY3RlZCBhZ2VudHMgYXJlIGFjdGl2ZSBmb3IgdGhpcyBhY2NvdW50IHJpZ2h0IG5vdy4ifSldfSksby5qc3hzKCJkaXYiLHtjbGFzc05hbWU6IndvcmtzcGFjZSIsY2hpbGRyZW46W28uanN4cygiYXNpZGUiLHtjbGFzc05hbWU6InNpZGUiLGNoaWxkcmVuOltvLmpzeHMoImRpdiIse2NsYXNzTmFtZToic2lkZS1oZWFkIixjaGlsZHJlbjpbby5qc3goInN0cm9uZyIse2NoaWxkcmVuOiJBZ2VudCBmb2xkZXJzIn0pLG8uanN4cygic3BhbiIse2NsYXNzTmFtZToibXV0ZWQiLGNoaWxkcmVuOltmZS5sZW5ndGgsIiBhZ2VudHMiXX0pXX0pLG8uanN4KCJkaXYiLHtjbGFzc05hbWU6InRyZWUiLGNoaWxkcmVuOmZlLmxlbmd0aD9mZS5tYXAoYj0+by5qc3hzKCJidXR0b24iLHtjbGFzc05hbWU6YHRyZWUtcm93IGZpbGUgZmlsZS1yb3cgJHtiPT09ZGU/ImFjdGl2ZSI6IiJ9YCxvbkNsaWNrOigpPT57QShiKSxWKCIiKX0sdHlwZToiYnV0dG9uIixjaGlsZHJlbjpbby5qc3goInNwYW4iLHtjbGFzc05hbWU6InRyZWUtY2FyZXQifSksby5qc3goInNwYW4iLHtjbGFzc05hbWU6ImZvbGRlci1pY29uIixjaGlsZHJlbjoiYWd0In0pLG8uanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJmaWxlLW5hbWUiLGNoaWxkcmVuOmJ9KSxvLmpzeCgic21hbGwiLHtjaGlsZHJlbjplLmFnZW50X25vZGVzLmZpbHRlcihSPT5tbihSLmZ1bGxfcGF0aCk9PT1iKS5sZW5ndGh9KV19LGIpKTpvLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJlbXB0eSIsY2hpbGRyZW46Ik5vIGFnZW50IGZvbGRlcnMgeWV0LiJ9KX0pXX0pLG8uanN4cygiYXNpZGUiLHtjbGFzc05hbWU6InNpZGUiLGNoaWxkcmVuOltvLmpzeHMoImRpdiIse2NsYXNzTmFtZToic2lkZS1oZWFkIixjaGlsZHJlbjpbby5qc3hzKCJzdHJvbmciLHtjaGlsZHJlbjpbZGV8fCJBZ2VudCIsIiBmaWxlcyJdfSksby5qc3hzKCJzcGFuIix7Y2xhc3NOYW1lOiJtdXRlZCIsY2hpbGRyZW46W0hlLmxlbmd0aCwiIGZpbGVzIl19KV19KSxvLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJ0cmVlIixjaGlsZHJlbjpIZS5sZW5ndGg/by5qc3godW8se2JyYW5jaDpCdCxzZWxlY3RlZFBhdGg6Rj8uZnVsbF9wYXRoPz8iIixvblNlbGVjdDpObCxvcGVuRm9sZGVyczpjLG9uVG9nZ2xlRm9sZGVyOkRuLG9uQ29udGV4dEFjdGlvbjooKT0+e319KTpvLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJlbXB0eSIsY2hpbGRyZW46IlVzZSBBZGQgYWdlbnQgb3IgQWRkIGZpbGUgdG8gY3JlYXRlIGFuIGFnZW50IHdvcmtzcGFjZS4ifSl9KV19KSxvLmpzeHMoImRpdiIse2NsYXNzTmFtZToiZGV0YWlsIixjaGlsZHJlbjpbby5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImRldGFpbC1oZWFkIHJlY29yZC1oZWFkIixjaGlsZHJlbjpbby5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InJlY29yZC10aXRsZSIsY2hpbGRyZW46W28uanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJyZWNvcmQta2lja2VyIixjaGlsZHJlbjoiYWdlbnQgZmlsZSJ9KSxvLmpzeCgic3Ryb25nIix7Y2hpbGRyZW46Rj9ldChGLmZ1bGxfcGF0aCk6ZGV8fCJObyBhZ2VudCBzZWxlY3RlZCJ9KSxvLmpzeCgiY29kZSIse2NoaWxkcmVuOkY/LmZ1bGxfcGF0aD8/KGRlP2AvYWdlbnRzLyR7ZGV9YDoiL2FnZW50cyIpfSldfSksby5qc3hzKG9lLHtnYXA6Nix3cmFwOiJ3cmFwIixqdXN0aWZ5OiJmbGV4LWVuZCIsY2hpbGRyZW46W28uanN4KEUse2Rpc2FibGVkOiFGLHNpemU6InhzIix2YXJpYW50OiJkZWZhdWx0IixvbkNsaWNrOigpPT5GJiZHKCJhZ2VudC1ub2RlLXZpZXciKSx0eXBlOiJidXR0b24iLGNoaWxkcmVuOiJPcGVuIn0pLG8uanN4KEUse2Rpc2FibGVkOiFGLHNpemU6InhzIix2YXJpYW50OiJkZWZhdWx0IixvbkNsaWNrOigpPT5GJiZKbyhGKSx0eXBlOiJidXR0b24iLGNoaWxkcmVuOiJFZGl0In0pLG8uanN4KEUse2Rpc2FibGVkOiFGLHNpemU6InhzIix2YXJpYW50OiJkZWZhdWx0IixvbkNsaWNrOigpPT5HKCJhZ2VudC1saW5rIiksdHlwZToiYnV0dG9uIixjaGlsZHJlbjoiQWRkIGxpbmsifSksby5qc3goRSx7ZGlzYWJsZWQ6IUYsY29sb3I6InJlZCIsc2l6ZToieHMiLHZhcmlhbnQ6ImxpZ2h0IixvbkNsaWNrOigpPT5GJiZ2b2lkIFpvKEYuZnVsbF9wYXRoKSx0eXBlOiJidXR0b24iLGNoaWxkcmVuOiJEZWxldGUifSldfSldfSksby5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InJlY29yZC1tZXRhIixjaGlsZHJlbjpbby5qc3hzKCJzcGFuIix7Y2hpbGRyZW46W28uanN4KCJiIix7Y2hpbGRyZW46IkFnZW50In0pLGRlfHwibm9uZSJdfSksby5qc3hzKCJzcGFuIix7Y2hpbGRyZW46W28uanN4KCJiIix7Y2hpbGRyZW46IkZvbGRlciJ9KSxGP2x0KEYuZnVsbF9wYXRoKToiLyJdfSksby5qc3hzKCJzcGFuIix7Y2hpbGRyZW46W28uanN4KCJiIix7Y2hpbGRyZW46IlVwZGF0ZWQifSksRj8udXBkYXRlZF9hdD9uZXcgRGF0ZShGLnVwZGF0ZWRfYXQpLnRvTG9jYWxlU3RyaW5nKCk6InVua25vd24iXX0pLG8uanN4cygic3BhbiIse2NoaWxkcmVuOltvLmpzeCgiYiIse2NoaWxkcmVuOiJQYXRoIn0pLEY/LmZ1bGxfcGF0aD8/IiJdfSldfSksby5qc3goImRpdiIse2NsYXNzTmFtZToiZGV0YWlsLWJvZHkgcmVjb3JkLXJlYWQiLGNoaWxkcmVuOkY/by5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InJlYWQtc2VjdGlvbiIsY2hpbGRyZW46W28uanN4KCJoMyIse2NoaWxkcmVuOkYubmFtZXx8ZXQoRi5mdWxsX3BhdGgpfSksby5qc3goZ24se3ZhbHVlOkYuY29udGVudF90ZXh0fSldfSk6by5qc3goImRpdiIse2NsYXNzTmFtZToiZW1wdHkiLGNoaWxkcmVuOiJTZWxlY3QgYW4gYWdlbnQgZmlsZSB0byBpbnNwZWN0IHJvbGUsIHBlcnNvbmFsaXR5LCBydWxlcywgb3IgbWVtb3J5LiJ9KX0pXX0pXX0pXX0pLG8uanN4cygic2VjdGlvbiIse2lkOiJzY2hlZHVsZXMiLGNoaWxkcmVuOltvLmpzeHMoImRpdiIse2NsYXNzTmFtZToic2VjdGlvbi1oZWFkIixjaGlsZHJlbjpbby5qc3hzKCJkaXYiLHtjaGlsZHJlbjpbby5qc3goImgyIix7Y2hpbGRyZW46IlNpZ25lZCBzY2hlZHVsZXMifSksby5qc3goInAiLHtjbGFzc05hbWU6Im11dGVkIixjaGlsZHJlbjoiRXhlY3V0YWJsZSBjcm9uIGNoYW5nZXMgYXJlIHNpZ25lZCBsb2NhbGx5IGJlZm9yZSBwdWJsaXNoLiJ9KV19KSxvLmpzeChFLHtzaXplOiJ4cyIsb25DbGljazooKT0+Rygic2NoZWR1bGUiKSxjaGlsZHJlbjoiQWRkIHNjaGVkdWxlIn0pXX0pLFUoInNjaGVkdWxlcyIpLG8uanN4KCJkaXYiLHtjbGFzc05hbWU6ImRldGFpbCB0YWJsZS1wYW5lbCIsY2hpbGRyZW46by5qc3hzKCJ0YWJsZSIse2NoaWxkcmVuOltvLmpzeCgidGhlYWQiLHtjaGlsZHJlbjpvLmpzeHMoInRyIix7Y2hpbGRyZW46W28uanN4KCJ0aCIse2NoaWxkcmVuOiJOYW1lIn0pLG8uanN4KCJ0aCIse2NoaWxkcmVuOiJDcm9uIn0pLG8uanN4KCJ0aCIse2NoaWxkcmVuOiJUYXJnZXQifSksby5qc3goInRoIix7Y2hpbGRyZW46IlZlcnNpb24ifSksby5qc3goInRoIix7Y2hpbGRyZW46IlN0YXR1cyJ9KV19KX0pLG8uanN4KCJ0Ym9keSIse2NoaWxkcmVuOmUuc2NoZWR1bGVzLm1hcChiPT5vLmpzeHMoInRyIix7Y2hpbGRyZW46W28uanN4KCJ0ZCIse2NoaWxkcmVuOmIubmFtZX0pLG8uanN4KCJ0ZCIse2NoaWxkcmVuOm8uanN4KHV0LHtjaGlsZHJlbjpiLmNyb25fZXhwcn0pfSksby5qc3goInRkIix7Y2hpbGRyZW46Yi50YXJnZXRfYWdlbnRfaWR8fCJhbGwifSksby5qc3goInRkIix7Y2hpbGRyZW46Yi52ZXJzaW9ufSksby5qc3goInRkIix7Y2hpbGRyZW46by5qc3goZHQse2NvbG9yOmIuZW5hYmxlZD8iZ3JlZW4iOiJncmF5IixjaGlsZHJlbjpiLmVuYWJsZWQ/Im9uIjoib2ZmIn0pfSldfSxgJHtiLm5hbWV9LSR7Yi52ZXJzaW9ufWApKX0pXX0pfSldfSksby5qc3hzKCJzZWN0aW9uIix7aWQ6ImF1dGgiLGNoaWxkcmVuOltvLmpzeCgiaDIiLHtjaGlsZHJlbjoiQXV0aCJ9KSxvLmpzeHMoInAiLHtjbGFzc05hbWU6Im11dGVkIixjaGlsZHJlbjpbIkFjY291bnQgbW9kZTogIixvLmpzeCgiY29kZSIse2NoaWxkcmVuOmUuYWNjb3VudF9tb2RlfHwidW5rbm93biJ9KV19KSxVKCJhdXRoIiksby5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImFjdGlvbnMiLGNoaWxkcmVuOltvLmpzeChFLHtvbkNsaWNrOigpPT52b2lkIGFlKCgpPT5uZSgiL2xvY2FsLWFwaS9hdXRoL3JlbmV3Iix7fSksIlRva2VuIHJlbmV3ZWQuIiwiYXV0aCIpLGNoaWxkcmVuOiJSZW5ldyB0b2tlbiJ9KSxvLmpzeChFLHt2YXJpYW50OiJkZWZhdWx0IixvbkNsaWNrOigpPT52b2lkIGFlKCgpPT5uZSgiL2xvY2FsLWFwaS9hdXRoL2NsYWltIix7fSksIkNsYWltIGZsb3cgc3RhcnRlZC4iLCJhdXRoIiksY2hpbGRyZW46IkxvZ2luIC8gY2xhaW0gYWNjb3VudCJ9KV19KV19KSxvLmpzeHMoInNlY3Rpb24iLHtpZDoiZmVlZGJhY2siLGNoaWxkcmVuOltvLmpzeHMoImRpdiIse2NsYXNzTmFtZToic2VjdGlvbi1oZWFkIixjaGlsZHJlbjpbby5qc3hzKCJkaXYiLHtjaGlsZHJlbjpbby5qc3goImgyIix7Y2hpbGRyZW46IkZlZWRiYWNrIn0pLG8uanN4KCJwIix7Y2xhc3NOYW1lOiJtdXRlZCIsY2hpbGRyZW46IlNlbmQgcHJvZHVjdCBwcm9ibGVtcyBvciBzdWdnZXN0aW9ucyBmcm9tIHRoaXMgcHJvamVjdC4ifSldfSksby5qc3goRSx7c2l6ZToieHMiLG9uQ2xpY2s6KCk9PkcoImZlZWRiYWNrIiksY2hpbGRyZW46IkFkZCBmZWVkYmFjayJ9KV19KSxVKCJmZWVkYmFjayIpLG8uanN4KCJkaXYiLHtjbGFzc05hbWU6ImRldGFpbCB0YWJsZS1wYW5lbCIsY2hpbGRyZW46by5qc3hzKCJ0YWJsZSIse2NoaWxkcmVuOltvLmpzeCgidGhlYWQiLHtjaGlsZHJlbjpvLmpzeHMoInRyIix7Y2hpbGRyZW46W28uanN4KCJ0aCIse2NoaWxkcmVuOiJLaW5kIn0pLG8uanN4KCJ0aCIse2NoaWxkcmVuOiJTZXZlcml0eSJ9KSxvLmpzeCgidGgiLHtjaGlsZHJlbjoiVGl0bGUifSksby5qc3goInRoIix7Y2hpbGRyZW46IlN0YXR1cyJ9KV19KX0pLG8uanN4KCJ0Ym9keSIse2NoaWxkcmVuOmUuZmVlZGJhY2subWFwKGI9Pm8uanN4cygidHIiLHtjaGlsZHJlbjpbby5qc3goInRkIix7Y2hpbGRyZW46Yi5raW5kfSksby5qc3goInRkIix7Y2hpbGRyZW46Yi5zZXZlcml0eX0pLG8uanN4KCJ0ZCIse2NoaWxkcmVuOmIudGl0bGV9KSxvLmpzeCgidGQiLHtjaGlsZHJlbjpiLnN0YXR1c30pXX0sYCR7Yi5raW5kfS0ke2IudGl0bGV9YCkpfSldfSl9KV19KSxvLmpzeHMoInNlY3Rpb24iLHtpZDoidXBkYXRlIixjaGlsZHJlbjpbby5qc3goImgyIix7Y2hpbGRyZW46IldyYXBwZXIgdXBkYXRlIn0pLG8uanN4cygicCIse2NsYXNzTmFtZToibXV0ZWQiLGNoaWxkcmVuOlsiVmVyc2lvbjogIixvLmpzeCgiY29kZSIse2NoaWxkcmVuOmUud3JhcHBlci5yZW1vdGVfdmVyc2lvbnx8InVua25vd24ifSksIiDCtyBWZXJpZmljYXRpb246IiwiICIsby5qc3goImNvZGUiLHtjaGlsZHJlbjplLndyYXBwZXIudmVyaWZpY2F0aW9ufHwic2hhMjU2In0pLCIgIixlLndyYXBwZXIucmVtb3RlX2ludGVncml0eV9vaz8iT0siOiJ1bnZlcmlmaWVkIl19KSxvLmpzeHMoInAiLHtjbGFzc05hbWU6Im11dGVkIixjaGlsZHJlbjpbIkxvY2FsIFNIQTogIixvLmpzeCgiY29kZSIse2NoaWxkcmVuOmUud3JhcHBlci5sb2NhbF9zaGEyNTZ9KV19KSxvLmpzeHMoInAiLHtjbGFzc05hbWU6Im11dGVkIixjaGlsZHJlbjpbIlJlbW90ZSBTSEE6ICIsby5qc3goImNvZGUiLHtjaGlsZHJlbjplLndyYXBwZXIucmVtb3RlX3NoYTI1Nn0pXX0pLG8uanN4cygicCIse2NsYXNzTmFtZToibXV0ZWQiLGNoaWxkcmVuOlsiQnl0ZXM6IGxvY2FsICIsZS53cmFwcGVyLmxvY2FsX2J5dGVzPz8wLCIgwrcgcmVtb3RlICIsZS53cmFwcGVyLnJlbW90ZV9ieXRlcz8/MF19KSxVKCJ1cGRhdGUiKSxvLmpzeChFLHtjb2xvcjoicmVkIixvbkNsaWNrOigpPT52b2lkIGFlKCgpPT5uZSgiL2xvY2FsLWFwaS91cGRhdGUiLHtjb25maXJtOiJ1cGRhdGUifSksIldyYXBwZXIgdXBkYXRlZC4iLCJ1cGRhdGUiKSxjaGlsZHJlbjoiVXBkYXRlIHdyYXBwZXIgZnJvbSBzZXJ2ZXIifSldfSldfSksUz9vLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJjb250ZXh0LW1lbnUiLHN0eWxlOntsZWZ0OlMueCx0b3A6Uy55fSxvbkNsaWNrOmI9PmIuc3RvcFByb3BhZ2F0aW9uKCksY2hpbGRyZW46Uy5raW5kPT09ImZvbGRlciI/by5qc3hzKG8uRnJhZ21lbnQse2NoaWxkcmVuOltvLmpzeCgiYnV0dG9uIix7dHlwZToiYnV0dG9uIixvbkNsaWNrOigpPT57bChgJHtTLmZvbGRlclBhdGh9L25ldy1ub2RlYCksRygibm9kZSIpLEMobnVsbCl9LGNoaWxkcmVuOiJDcmVhdGUgbm9kZSJ9KSxvLmpzeCgiYnV0dG9uIix7dHlwZToiYnV0dG9uIixvbkNsaWNrOigpPT57XyhgJHtTLmZvbGRlclBhdGh9L25ldy1mb2xkZXJgKSxHKCJmb2xkZXItY3JlYXRlIiksQyhudWxsKX0sY2hpbGRyZW46IkNyZWF0ZSBmb2xkZXIifSksby5qc3goImJ1dHRvbiIse3R5cGU6ImJ1dHRvbiIsb25DbGljazooKT0+e18oUy5mb2xkZXJQYXRoKSxHKCJmb2xkZXItcmVuYW1lIiksQyhudWxsKX0sY2hpbGRyZW46IlJlbmFtZSBmb2xkZXIifSksby5qc3goImJ1dHRvbiIse3R5cGU6ImJ1dHRvbiIsb25DbGljazooKT0+e18oUy5mb2xkZXJQYXRoKSxPKCJmb2xkZXIiKSxHKCJkZWxldGUtY29uZmlybSIpLEMobnVsbCl9LGNoaWxkcmVuOiJEZWxldGUgZm9sZGVyIn0pXX0pOm8uanN4cyhvLkZyYWdtZW50LHtjaGlsZHJlbjpbby5qc3goImJ1dHRvbiIse3R5cGU6ImJ1dHRvbiIsb25DbGljazooKT0+e2dlKFMubm9kZS5mdWxsX3BhdGgpLEMobnVsbCl9LGNoaWxkcmVuOiJPcGVuIn0pLG8uanN4KCJidXR0b24iLHt0eXBlOiJidXR0b24iLG9uQ2xpY2s6KCk9PntLbyhTLm5vZGUpLEMobnVsbCl9LGNoaWxkcmVuOiJSZW5hbWUgLyBlZGl0In0pLG8uanN4KCJidXR0b24iLHt0eXBlOiJidXR0b24iLG9uQ2xpY2s6KCk9PntsKFMubm9kZS5mdWxsX3BhdGgpLE8oIm5vZGUiKSxHKCJkZWxldGUtY29uZmlybSIpLEMobnVsbCl9LGNoaWxkcmVuOiJEZWxldGUifSldfSl9KTpudWxsLG8uanN4KGllLHtvcGVuZWQ6dT09PSJmb2xkZXItY3JlYXRlIixvbkNsb3NlOkIsdGl0bGU6IkFkZCBmb2xkZXIiLGNlbnRlcmVkOiEwLGNoaWxkcmVuOm8uanN4KCJmb3JtIix7Y2xhc3NOYW1lOiJtb2RhbC1mb3JtIixvblN1Ym1pdDpfbCxjaGlsZHJlbjpvLmpzeHMoeWUse2dhcDoic20iLGNoaWxkcmVuOltVKCJtb2RhbCIpLG8uanN4KFose25hbWU6ImZvbGRlcl9wYXRoIixyZXF1aXJlZDohMCxsYWJlbDoiRm9sZGVyIHBhdGgiLGRlZmF1bHRWYWx1ZTprfSksby5qc3hzKG9lLHtqdXN0aWZ5OiJmbGV4LWVuZCIsY2hpbGRyZW46W28uanN4KEUse3ZhcmlhbnQ6ImRlZmF1bHQiLG9uQ2xpY2s6Qix0eXBlOiJidXR0b24iLGNoaWxkcmVuOiJDYW5jZWwifSksby5qc3goRSx7dHlwZToic3VibWl0IixjaGlsZHJlbjoiQ3JlYXRlIGZvbGRlciJ9KV19KV19KX0pfSksby5qc3goaWUse29wZW5lZDp1PT09ImZvbGRlci1yZW5hbWUiLG9uQ2xvc2U6Qix0aXRsZToiUmVuYW1lIGZvbGRlciIsY2VudGVyZWQ6ITAsY2hpbGRyZW46by5qc3goImZvcm0iLHtjbGFzc05hbWU6Im1vZGFsLWZvcm0iLG9uU3VibWl0OiRsLGNoaWxkcmVuOm8uanN4cyh5ZSx7Z2FwOiJzbSIsY2hpbGRyZW46W1UoIm1vZGFsIiksby5qc3goWix7bmFtZToiZm9sZGVyX3BhdGgiLHJlcXVpcmVkOiEwLGxhYmVsOiJGb2xkZXIgcGF0aCIsZGVmYXVsdFZhbHVlOmt9KSxvLmpzeHMob2Use2p1c3RpZnk6ImZsZXgtZW5kIixjaGlsZHJlbjpbby5qc3goRSx7dmFyaWFudDoiZGVmYXVsdCIsb25DbGljazpCLHR5cGU6ImJ1dHRvbiIsY2hpbGRyZW46IkNhbmNlbCJ9KSxvLmpzeChFLHt0eXBlOiJzdWJtaXQiLGNoaWxkcmVuOiJSZW5hbWUgZm9sZGVyIn0pXX0pXX0pfSl9KSxvLmpzeChpZSx7b3BlbmVkOnU9PT0iZGVsZXRlLWNvbmZpcm0iLG9uQ2xvc2U6Qix0aXRsZToiRGVsZXRlIixjZW50ZXJlZDohMCxjaGlsZHJlbjpvLmpzeHMoeWUse2dhcDoic20iLGNoaWxkcmVuOltVKCJtb2RhbCIpLG8uanN4KE90LHtjaGlsZHJlbjokPT09ImZvbGRlciI/IkFyY2hpdmUgZXZlcnkgbm9kZSB1bmRlciB0aGlzIGZvbGRlci4iOiJBcmNoaXZlIHRoaXMgbm9kZS4ifSksby5qc3hzKG9lLHtqdXN0aWZ5OiJmbGV4LWVuZCIsY2hpbGRyZW46W28uanN4KEUse3ZhcmlhbnQ6ImRlZmF1bHQiLG9uQ2xpY2s6Qix0eXBlOiJidXR0b24iLGNoaWxkcmVuOiJDYW5jZWwifSksby5qc3goRSx7Y29sb3I6InJlZCIsb25DbGljazooKT0+dm9pZCBQbCgpLHR5cGU6ImJ1dHRvbiIsY2hpbGRyZW46IkRlbGV0ZSJ9KV19KV19KX0pLG8uanN4KGllLHtvcGVuZWQ6dT09PSJub2RlLXZpZXciLG9uQ2xvc2U6Qix0aXRsZTpMPy5uYW1lPz94dCxzaXplOiJ4bCIsY2VudGVyZWQ6ITAsY2hpbGRyZW46TD9vLmpzeHMoImRpdiIse2NsYXNzTmFtZToicmVjb3JkLXZpZXciLGNoaWxkcmVuOltvLmpzeHMoImRpdiIse2NsYXNzTmFtZToicmVjb3JkLXRpdGxlIixjaGlsZHJlbjpbby5qc3hzKCJzcGFuIix7Y2xhc3NOYW1lOiJyZWNvcmQta2lja2VyIixjaGlsZHJlbjpbTC50eXBlfHwibm90ZSIsIiByZWNvcmQiXX0pLG8uanN4KCJzdHJvbmciLHtjaGlsZHJlbjpldChMLmZ1bGxfcGF0aCl9KSxvLmpzeCgiY29kZSIse2NoaWxkcmVuOkwuZnVsbF9wYXRofSldfSksby5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InJlY29yZC1tZXRhIixjaGlsZHJlbjpbby5qc3hzKCJzcGFuIix7Y2hpbGRyZW46W28uanN4KCJiIix7Y2hpbGRyZW46Ik5hbWUifSksTC5uYW1lfHxldChMLmZ1bGxfcGF0aCldfSksby5qc3hzKCJzcGFuIix7Y2hpbGRyZW46W28uanN4KCJiIix7Y2hpbGRyZW46IkRhdGUifSksTC51cGRhdGVkX2F0P25ldyBEYXRlKEwudXBkYXRlZF9hdCkudG9Mb2NhbGVTdHJpbmcoKToidW5rbm93biJdfSksby5qc3hzKCJzcGFuIix7Y2hpbGRyZW46W28uanN4KCJiIix7Y2hpbGRyZW46IkRlc2NyaXB0aW9uIn0pLEdyKEwuY29udGVudF90ZXh0KV19KSxvLmpzeHMoInNwYW4iLHtjaGlsZHJlbjpbby5qc3goImIiLHtjaGlsZHJlbjoiUGF0aCJ9KSxMLmZ1bGxfcGF0aF19KV19KSxvLmpzeHMoImRpdiIse2NsYXNzTmFtZToicmVjb3JkLXJlYWQiLGNoaWxkcmVuOltvLmpzeHMoImRpdiIse2NsYXNzTmFtZToicmVhZC1zZWN0aW9uIixjaGlsZHJlbjpbby5qc3goImgzIix7Y2hpbGRyZW46IkNvbnRlbnQifSksby5qc3goZ24se3ZhbHVlOkwuY29udGVudF90ZXh0fSldfSksby5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InJlY29yZC1zdHJ1Y3R1cmUiLGNoaWxkcmVuOltvLmpzeHMoImRpdiIse2NsYXNzTmFtZToicmVhZC1zZWN0aW9uIixjaGlsZHJlbjpbby5qc3goImgzIix7Y2hpbGRyZW46IkxpbmtzIn0pLFV0KEwubGlua3MpP28uanN4KCJwcmUiLHtjaGlsZHJlbjpRZShMLmxpbmtzLFtdKX0pOm8uanN4KCJwIix7Y2xhc3NOYW1lOiJtdXRlZCIsY2hpbGRyZW46Ik5vIGxpbmtzIHJlY29yZGVkLiJ9KV19KSxvLmpzeHMoImRpdiIse2NsYXNzTmFtZToicmVhZC1zZWN0aW9uIixjaGlsZHJlbjpbby5qc3goImgzIix7Y2hpbGRyZW46Ik1ldGFkYXRhIn0pLFV0KEwubWV0YWRhdGEpP28uanN4KCJwcmUiLHtjaGlsZHJlbjpRZShMLm1ldGFkYXRhLHt9KX0pOm8uanN4KCJwIix7Y2xhc3NOYW1lOiJtdXRlZCIsY2hpbGRyZW46Ik5vIG1ldGFkYXRhIHJlY29yZGVkLiJ9KV19KV19KV19KSxvLmpzeHMob2Use2p1c3RpZnk6ImZsZXgtZW5kIixtdDoibWQiLGNoaWxkcmVuOltvLmpzeChFLHt2YXJpYW50OiJkZWZhdWx0IixvbkNsaWNrOigpPT5HKCJub2RlIiksdHlwZToiYnV0dG9uIixjaGlsZHJlbjoiRWRpdCJ9KSxvLmpzeChFLHt2YXJpYW50OiJkZWZhdWx0IixvbkNsaWNrOigpPT5HKCJsaW5rIiksdHlwZToiYnV0dG9uIixjaGlsZHJlbjoiQWRkIGxpbmsifSksby5qc3goRSx7Y29sb3I6InJlZCIsdmFyaWFudDoic3VidGxlIixvbkNsaWNrOigpPT52b2lkIEluKEwuZnVsbF9wYXRoKSx0eXBlOiJidXR0b24iLGNoaWxkcmVuOiJEZWxldGUifSldfSldfSk6by5qc3goImRpdiIse2NsYXNzTmFtZToiZW1wdHkiLGNoaWxkcmVuOiJMb2FkaW5nIG5vZGUuIn0pfSksby5qc3goaWUse29wZW5lZDp1PT09Im5vZGUiLG9uQ2xvc2U6Qix0aXRsZTpMPyJFZGl0IG5vZGUiOiJBZGQgbm9kZSIsc2l6ZToibWluKDE0NDBweCwgOTZ2dykiLGNlbnRlcmVkOiEwLGNsYXNzTmFtZXM6e2JvZHk6ImVkaXRvci1tb2RhbC1ib2R5Iixjb250ZW50OiJlZGl0b3ItbW9kYWwtY29udGVudCJ9LGNoaWxkcmVuOm8uanN4KCJmb3JtIix7Y2xhc3NOYW1lOiJtb2RhbC1mb3JtIixvblN1Ym1pdDpqbCxjaGlsZHJlbjpvLmpzeHMoeWUse2dhcDoic20iLGNoaWxkcmVuOltVKCJtb2RhbCIpLG8uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJyZWNvcmQtc2VjdGlvbiIsY2hpbGRyZW46W28uanN4KCJoMyIse2NoaWxkcmVuOiJJZGVudGl0eSJ9KSxvLmpzeChaLHtuYW1lOiJwYXRoIixyZXF1aXJlZDohMCxkZWZhdWx0VmFsdWU6TD8uZnVsbF9wYXRoPz9pLGxhYmVsOiJGdWxsIHBhdGgiLHBsYWNlaG9sZGVyOiIvZGVjaXNpb25zL2F1dGgtbW9kZWwifSksby5qc3hzKEd0LHtjb2xzOntiYXNlOjEsc206Mn0sY2hpbGRyZW46W28uanN4KFose25hbWU6InR5cGUiLGRlZmF1bHRWYWx1ZTpMPy50eXBlPz8ibm90ZSIsbGFiZWw6IlR5cGUifSksby5qc3goWix7bmFtZToidGFncyIsZGVmYXVsdFZhbHVlOnFzKEwpLGxhYmVsOiJUYWdzIENTViIscGxhY2Vob2xkZXI6ImRlY2lzaW9uLCBhdXRoIn0pXX0pXX0pLG8uanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJyZWNvcmQtc2VjdGlvbiIsY2hpbGRyZW46W28uanN4KCJoMyIse2NoaWxkcmVuOiJCb2R5In0pLG8uanN4KFVzLHtkZWZhdWx0VmFsdWU6TD8uY29udGVudF90ZXh0Pz8iIn0pXX0pLG8uanN4cygiZGV0YWlscyIse2NsYXNzTmFtZToicmVjb3JkLXNlY3Rpb24gc3RydWN0dXJlLXNlY3Rpb24iLGNoaWxkcmVuOltvLmpzeCgic3VtbWFyeSIse2NoaWxkcmVuOiJMaW5rcyBhbmQgbWV0YWRhdGEgSlNPTiJ9KSxvLmpzeHMoR3Qse2NvbHM6e2Jhc2U6MSxzbToyfSxjaGlsZHJlbjpbby5qc3gocWUse2NsYXNzTmFtZToibW9ubyIsbmFtZToibGlua3MiLGRlZmF1bHRWYWx1ZTpRZShMPy5saW5rcyxbXSksbGFiZWw6IkxpbmtzIEpTT04iLG1pblJvd3M6N30pLG8uanN4KHFlLHtjbGFzc05hbWU6Im1vbm8iLG5hbWU6Im1ldGFkYXRhIixkZWZhdWx0VmFsdWU6UWUoTD8ubWV0YWRhdGEse30pLGxhYmVsOiJNZXRhZGF0YSBKU09OIixtaW5Sb3dzOjd9KV19KV19KSxvLmpzeHMob2Use2p1c3RpZnk6ImZsZXgtZW5kIixjaGlsZHJlbjpbby5qc3goRSx7dmFyaWFudDoiZGVmYXVsdCIsb25DbGljazpCLHR5cGU6ImJ1dHRvbiIsY2hpbGRyZW46IkNhbmNlbCJ9KSxvLmpzeChFLHt0eXBlOiJzdWJtaXQiLGNoaWxkcmVuOiJTYXZlIG5vZGUifSldfSldfSl9LEw/LmlkPz8oaXx8Im5ldy1ub2RlIikpfSksby5qc3goaWUse29wZW5lZDp1PT09ImFnZW50LWNyZWF0ZSIsb25DbG9zZTpCLHRpdGxlOiJBZGQgYWdlbnQiLGNlbnRlcmVkOiEwLGNoaWxkcmVuOm8uanN4KCJmb3JtIix7Y2xhc3NOYW1lOiJtb2RhbC1mb3JtIixvblN1Ym1pdDpTbCxjaGlsZHJlbjpvLmpzeHMoeWUse2dhcDoic20iLGNoaWxkcmVuOltVKCJtb2RhbCIpLG8uanN4KFose25hbWU6ImFnZW50X3NsdWciLHJlcXVpcmVkOiEwLGxhYmVsOiJBZ2VudCBzbHVnIixwbGFjZWhvbGRlcjoicmVzZWFyY2hlciJ9KSxvLmpzeHMob2Use2p1c3RpZnk6ImZsZXgtZW5kIixjaGlsZHJlbjpbby5qc3goRSx7dmFyaWFudDoiZGVmYXVsdCIsb25DbGljazpCLHR5cGU6ImJ1dHRvbiIsY2hpbGRyZW46IkNhbmNlbCJ9KSxvLmpzeChFLHt0eXBlOiJzdWJtaXQiLGNoaWxkcmVuOiJDcmVhdGUgYWdlbnQifSldfSldfSl9KX0pLG8uanN4KGllLHtvcGVuZWQ6dT09PSJhZ2VudC1ub2RlLXZpZXciLG9uQ2xvc2U6Qix0aXRsZTpGPy5uYW1lPz8iQWdlbnQgZmlsZSIsc2l6ZToieGwiLGNlbnRlcmVkOiEwLGNoaWxkcmVuOkY/by5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InJlY29yZC12aWV3IixjaGlsZHJlbjpbby5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InJlY29yZC10aXRsZSIsY2hpbGRyZW46W28uanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJyZWNvcmQta2lja2VyIixjaGlsZHJlbjpGLnR5cGV8fCJhZ2VudC1maWxlIn0pLG8uanN4KCJzdHJvbmciLHtjaGlsZHJlbjpldChGLmZ1bGxfcGF0aCl9KSxvLmpzeCgiY29kZSIse2NoaWxkcmVuOkYuZnVsbF9wYXRofSldfSksby5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InJlY29yZC1tZXRhIixjaGlsZHJlbjpbby5qc3hzKCJzcGFuIix7Y2hpbGRyZW46W28uanN4KCJiIix7Y2hpbGRyZW46Ik5hbWUifSksRi5uYW1lfHxldChGLmZ1bGxfcGF0aCldfSksby5qc3hzKCJzcGFuIix7Y2hpbGRyZW46W28uanN4KCJiIix7Y2hpbGRyZW46IkRhdGUifSksRi51cGRhdGVkX2F0P25ldyBEYXRlKEYudXBkYXRlZF9hdCkudG9Mb2NhbGVTdHJpbmcoKToidW5rbm93biJdfSksby5qc3hzKCJzcGFuIix7Y2hpbGRyZW46W28uanN4KCJiIix7Y2hpbGRyZW46IkRlc2NyaXB0aW9uIn0pLEdyKEYuY29udGVudF90ZXh0KV19KSxvLmpzeHMoInNwYW4iLHtjaGlsZHJlbjpbby5qc3goImIiLHtjaGlsZHJlbjoiUGF0aCJ9KSxGLmZ1bGxfcGF0aF19KV19KSxvLmpzeHMoImRpdiIse2NsYXNzTmFtZToicmVjb3JkLXJlYWQiLGNoaWxkcmVuOltvLmpzeHMoImRpdiIse2NsYXNzTmFtZToicmVhZC1zZWN0aW9uIixjaGlsZHJlbjpbby5qc3goImgzIix7Y2hpbGRyZW46IkNvbnRlbnQifSksby5qc3goZ24se3ZhbHVlOkYuY29udGVudF90ZXh0fSldfSksby5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InJlY29yZC1zdHJ1Y3R1cmUiLGNoaWxkcmVuOltvLmpzeHMoImRpdiIse2NsYXNzTmFtZToicmVhZC1zZWN0aW9uIixjaGlsZHJlbjpbby5qc3goImgzIix7Y2hpbGRyZW46IkxpbmtzIn0pLFV0KEYubGlua3MpP28uanN4KCJwcmUiLHtjaGlsZHJlbjpRZShGLmxpbmtzLFtdKX0pOm8uanN4KCJwIix7Y2xhc3NOYW1lOiJtdXRlZCIsY2hpbGRyZW46Ik5vIGxpbmtzIHJlY29yZGVkLiJ9KV19KSxvLmpzeHMoImRpdiIse2NsYXNzTmFtZToicmVhZC1zZWN0aW9uIixjaGlsZHJlbjpbby5qc3goImgzIix7Y2hpbGRyZW46Ik1ldGFkYXRhIn0pLFV0KEYubWV0YWRhdGEpP28uanN4KCJwcmUiLHtjaGlsZHJlbjpRZShGLm1ldGFkYXRhLHt9KX0pOm8uanN4KCJwIix7Y2xhc3NOYW1lOiJtdXRlZCIsY2hpbGRyZW46Ik5vIG1ldGFkYXRhIHJlY29yZGVkLiJ9KV19KV19KV19KSxvLmpzeHMob2Use2p1c3RpZnk6ImZsZXgtZW5kIixtdDoibWQiLGNoaWxkcmVuOltvLmpzeChFLHt2YXJpYW50OiJkZWZhdWx0IixvbkNsaWNrOigpPT5KbyhGKSx0eXBlOiJidXR0b24iLGNoaWxkcmVuOiJFZGl0In0pLG8uanN4KEUse3ZhcmlhbnQ6ImRlZmF1bHQiLG9uQ2xpY2s6KCk9PkcoImFnZW50LWxpbmsiKSx0eXBlOiJidXR0b24iLGNoaWxkcmVuOiJBZGQgbGluayJ9KSxvLmpzeChFLHtjb2xvcjoicmVkIix2YXJpYW50OiJzdWJ0bGUiLG9uQ2xpY2s6KCk9PnZvaWQgWm8oRi5mdWxsX3BhdGgpLHR5cGU6ImJ1dHRvbiIsY2hpbGRyZW46IkRlbGV0ZSJ9KV19KV19KTpvLmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJlbXB0eSIsY2hpbGRyZW46IlNlbGVjdCBhbiBhZ2VudCBmaWxlLiJ9KX0pLG8uanN4KGllLHtvcGVuZWQ6dT09PSJhZ2VudC1ub2RlIixvbkNsb3NlOkIsdGl0bGU6Rj8iRWRpdCBhZ2VudCBmaWxlIjoiQWRkIGFnZW50IGZpbGUiLHNpemU6Im1pbigxNDQwcHgsIDk2dncpIixjZW50ZXJlZDohMCxjbGFzc05hbWVzOntib2R5OiJlZGl0b3ItbW9kYWwtYm9keSIsY29udGVudDoiZWRpdG9yLW1vZGFsLWNvbnRlbnQifSxjaGlsZHJlbjpvLmpzeCgiZm9ybSIse2NsYXNzTmFtZToibW9kYWwtZm9ybSIsb25TdWJtaXQ6a2wsY2hpbGRyZW46by5qc3hzKHllLHtnYXA6InNtIixjaGlsZHJlbjpbVSgibW9kYWwiKSxvLmpzeHMoImRpdiIse2NsYXNzTmFtZToicmVjb3JkLXNlY3Rpb24iLGNoaWxkcmVuOltvLmpzeCgiaDMiLHtjaGlsZHJlbjoiSWRlbnRpdHkifSksby5qc3goWix7bmFtZToicGF0aCIscmVxdWlyZWQ6ITAsZGVmYXVsdFZhbHVlOkY/VXIoRi5mdWxsX3BhdGgpOiIvbWVtb3J5L25ldy1ub3RlIixsYWJlbDoiUGF0aCBpbiBhZ2VudCBmb2xkZXIiLHBsYWNlaG9sZGVyOiIvcm9sZSJ9KSxvLmpzeHMoR3Qse2NvbHM6e2Jhc2U6MSxzbToyfSxjaGlsZHJlbjpbby5qc3goWix7bmFtZToidHlwZSIsZGVmYXVsdFZhbHVlOkY/LnR5cGU/PyJhZ2VudC1maWxlIixsYWJlbDoiVHlwZSJ9KSxvLmpzeChaLHtuYW1lOiJ0YWdzIixkZWZhdWx0VmFsdWU6cXMoRiksbGFiZWw6IlRhZ3MgQ1NWIixwbGFjZWhvbGRlcjoiYWdlbnQsIHJvbGUifSldfSldfSksby5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InJlY29yZC1zZWN0aW9uIixjaGlsZHJlbjpbby5qc3goImgzIix7Y2hpbGRyZW46IkJvZHkifSksby5qc3goVXMse2RlZmF1bHRWYWx1ZTpGPy5jb250ZW50X3RleHQ/PyIifSldfSksby5qc3hzKCJkZXRhaWxzIix7Y2xhc3NOYW1lOiJyZWNvcmQtc2VjdGlvbiBzdHJ1Y3R1cmUtc2VjdGlvbiIsY2hpbGRyZW46W28uanN4KCJzdW1tYXJ5Iix7Y2hpbGRyZW46IkxpbmtzIGFuZCBtZXRhZGF0YSBKU09OIn0pLG8uanN4cyhHdCx7Y29sczp7YmFzZToxLHNtOjJ9LGNoaWxkcmVuOltvLmpzeChxZSx7Y2xhc3NOYW1lOiJtb25vIixuYW1lOiJsaW5rcyIsZGVmYXVsdFZhbHVlOlFlKEY/LmxpbmtzLFtdKSxsYWJlbDoiTGlua3MgSlNPTiIsbWluUm93czo3fSksby5qc3gocWUse2NsYXNzTmFtZToibW9ubyIsbmFtZToibWV0YWRhdGEiLGRlZmF1bHRWYWx1ZTpRZShGPy5tZXRhZGF0YSx7fSksbGFiZWw6Ik1ldGFkYXRhIEpTT04iLG1pblJvd3M6N30pXX0pXX0pLG8uanN4cyhvZSx7anVzdGlmeToiZmxleC1lbmQiLGNoaWxkcmVuOltvLmpzeChFLHt2YXJpYW50OiJkZWZhdWx0IixvbkNsaWNrOkIsdHlwZToiYnV0dG9uIixjaGlsZHJlbjoiQ2FuY2VsIn0pLG8uanN4KEUse3R5cGU6InN1Ym1pdCIsY2hpbGRyZW46IlNhdmUgZmlsZSJ9KV19KV19KX0sRj8uaWQ/PyhEfHwibmV3LWFnZW50LWZpbGUiKSl9KSxvLmpzeChpZSx7b3BlbmVkOnU9PT0ibGluayIsb25DbG9zZTpCLHRpdGxlOiJBZGQgbGluayIsc2l6ZToibGciLGNlbnRlcmVkOiEwLGNoaWxkcmVuOm8uanN4KCJmb3JtIix7Y2xhc3NOYW1lOiJtb2RhbC1mb3JtIixvblN1Ym1pdDpFbCxjaGlsZHJlbjpvLmpzeHMoeWUse2dhcDoic20iLGNoaWxkcmVuOltVKCJtb2RhbCIpLG8uanN4KFose25hbWU6InNvdXJjZV9wYXRoIixkZWZhdWx0VmFsdWU6TD8uZnVsbF9wYXRoPz9pLHJlcXVpcmVkOiEwLGxhYmVsOiJTb3VyY2UgcGF0aCJ9KSxvLmpzeChaLHtuYW1lOiJ0YXJnZXRfcGF0aCIscmVxdWlyZWQ6ITAsbGFiZWw6IlRhcmdldCBwYXRoIn0pLG8uanN4KFose25hbWU6InJlbGF0aW9uIixkZWZhdWx0VmFsdWU6InJlZmVyZW5jZXMiLGxhYmVsOiJSZWxhdGlvbiJ9KSxvLmpzeHMob2Use2p1c3RpZnk6ImZsZXgtZW5kIixjaGlsZHJlbjpbby5qc3goRSx7dmFyaWFudDoiZGVmYXVsdCIsb25DbGljazpCLHR5cGU6ImJ1dHRvbiIsY2hpbGRyZW46IkNhbmNlbCJ9KSxvLmpzeChFLHt0eXBlOiJzdWJtaXQiLGNoaWxkcmVuOiJDcmVhdGUgbGluayJ9KV19KV19KX0pfSksby5qc3goaWUse29wZW5lZDp1PT09ImFnZW50LWxpbmsiLG9uQ2xvc2U6Qix0aXRsZToiQWRkIGFnZW50IGxpbmsiLHNpemU6ImxnIixjZW50ZXJlZDohMCxjaGlsZHJlbjpvLmpzeCgiZm9ybSIse2NsYXNzTmFtZToibW9kYWwtZm9ybSIsb25TdWJtaXQ6UmwsY2hpbGRyZW46by5qc3hzKHllLHtnYXA6InNtIixjaGlsZHJlbjpbVSgibW9kYWwiKSxvLmpzeChaLHtuYW1lOiJzb3VyY2VfcGF0aCIsZGVmYXVsdFZhbHVlOkY/VXIoRi5mdWxsX3BhdGgpOiIiLHJlcXVpcmVkOiEwLGxhYmVsOiJTb3VyY2UgcGF0aCBpbiBhZ2VudCBmb2xkZXIifSksby5qc3goWix7bmFtZToidGFyZ2V0X3BhdGgiLHJlcXVpcmVkOiEwLGxhYmVsOiJUYXJnZXQgcGF0aCIscGxhY2Vob2xkZXI6Ii9kZWNpc2lvbnMvYXV0aC1tb2RlbCBvciAvbWVtb3J5L3JlbGF0ZWQtZmlsZSJ9KSxvLmpzeChaLHtuYW1lOiJyZWxhdGlvbiIsZGVmYXVsdFZhbHVlOiJyZWZlcmVuY2VzIixsYWJlbDoiUmVsYXRpb24ifSksby5qc3hzKG9lLHtqdXN0aWZ5OiJmbGV4LWVuZCIsY2hpbGRyZW46W28uanN4KEUse3ZhcmlhbnQ6ImRlZmF1bHQiLG9uQ2xpY2s6Qix0eXBlOiJidXR0b24iLGNoaWxkcmVuOiJDYW5jZWwifSksby5qc3goRSx7dHlwZToic3VibWl0IixjaGlsZHJlbjoiQ3JlYXRlIGxpbmsifSldfSldfSl9KX0pLG8uanN4KGllLHtvcGVuZWQ6dT09PSJzY2hlZHVsZSIsb25DbG9zZTpCLHRpdGxlOiJBZGQgc2lnbmVkIHNjaGVkdWxlIixzaXplOiJsZyIsY2VudGVyZWQ6ITAsY2hpbGRyZW46by5qc3goImZvcm0iLHtjbGFzc05hbWU6Im1vZGFsLWZvcm0iLG9uU3VibWl0OkFsLGNoaWxkcmVuOm8uanN4cyh5ZSx7Z2FwOiJzbSIsY2hpbGRyZW46W1UoIm1vZGFsIiksby5qc3goWix7bmFtZToibmFtZSIscmVxdWlyZWQ6ITAsbGFiZWw6Ik5hbWUiLHBsYWNlaG9sZGVyOiJob3VybHktc3VtbWFyeSJ9KSxvLmpzeChaLHtuYW1lOiJjcm9uX2V4cHIiLHJlcXVpcmVkOiEwLGxhYmVsOiJDcm9uIGV4cHJlc3Npb24iLHBsYWNlaG9sZGVyOiIwICogKiAqICoifSksby5qc3goWix7bmFtZToidGltZXpvbmUiLGxhYmVsOiJUaW1lem9uZSIsZGVmYXVsdFZhbHVlOiJVVEMifSksby5qc3goWix7bmFtZToidGFyZ2V0X2FnZW50X2lkIixsYWJlbDoiVGFyZ2V0IGFnZW50IGlkIixkZWZhdWx0VmFsdWU6ZS5hZ2VudF9pZD8/IiJ9KSxvLmpzeChxZSx7bmFtZToiaW5zdHJ1Y3Rpb25fdGV4dCIscmVxdWlyZWQ6ITAsbGFiZWw6Ikluc3RydWN0aW9uIixwbGFjZWhvbGRlcjoiU3VtbWFyaXplIHJlY2VudCBub2Rlcy4iLG1pblJvd3M6NX0pLG8uanN4KHFlLHtjbGFzc05hbWU6Im1vbm8iLG5hbWU6InBheWxvYWQiLGxhYmVsOiJQYXlsb2FkIEpTT04iLGRlZmF1bHRWYWx1ZToie30iLG1pblJvd3M6NX0pLG8uanN4cyhvZSx7anVzdGlmeToiZmxleC1lbmQiLGNoaWxkcmVuOltvLmpzeChFLHt2YXJpYW50OiJkZWZhdWx0IixvbkNsaWNrOkIsdHlwZToiYnV0dG9uIixjaGlsZHJlbjoiQ2FuY2VsIn0pLG8uanN4KEUse3R5cGU6InN1Ym1pdCIsY2hpbGRyZW46IlNpZ24gYW5kIHB1Ymxpc2gifSldfSldfSl9KX0pLG8uanN4KGllLHtvcGVuZWQ6dT09PSJmZWVkYmFjayIsb25DbG9zZTpCLHRpdGxlOiJBZGQgZmVlZGJhY2siLHNpemU6ImxnIixjZW50ZXJlZDohMCxjaGlsZHJlbjpvLmpzeCgiZm9ybSIse2NsYXNzTmFtZToibW9kYWwtZm9ybSIsb25TdWJtaXQ6T2wsY2hpbGRyZW46by5qc3hzKHllLHtnYXA6InNtIixjaGlsZHJlbjpbVSgibW9kYWwiKSxvLmpzeCh5bix7bmFtZToia2luZCIsbGFiZWw6IktpbmQiLGRlZmF1bHRWYWx1ZToic3VnZ2VzdGlvbiIsZGF0YTpbInN1Z2dlc3Rpb24iLCJwcm9ibGVtIl19KSxvLmpzeCh5bix7bmFtZToic2V2ZXJpdHkiLGxhYmVsOiJTZXZlcml0eSIsZGVmYXVsdFZhbHVlOiJpbmZvIixkYXRhOlsiaW5mbyIsImxvdyIsIm1lZGl1bSIsImhpZ2giLCJjcml0aWNhbCJdfSksby5qc3goWix7bmFtZToidGl0bGUiLHJlcXVpcmVkOiEwLGxhYmVsOiJUaXRsZSJ9KSxvLmpzeChxZSx7bmFtZToiYm9keSIscmVxdWlyZWQ6ITAsbGFiZWw6IkJvZHkiLG1pblJvd3M6NX0pLG8uanN4cyhvZSx7anVzdGlmeToiZmxleC1lbmQiLGNoaWxkcmVuOltvLmpzeChFLHt2YXJpYW50OiJkZWZhdWx0IixvbkNsaWNrOkIsdHlwZToiYnV0dG9uIixjaGlsZHJlbjoiQ2FuY2VsIn0pLG8uanN4KEUse3R5cGU6InN1Ym1pdCIsY2hpbGRyZW46IlN1Ym1pdCBmZWVkYmFjayJ9KV19KV19KX0pfSksby5qc3goaWUse29wZW5lZDp1PT09ImFnZW50LWNvbnNvbGUiLG9uQ2xvc2U6Qix0aXRsZToiQWdlbnQgQ29uc29sZSIsc2l6ZToieGwiLGNlbnRlcmVkOiEwLGNoaWxkcmVuOmUudmF1bHRfY29uZmlndXJlZD9vLmpzeHMoeWUse2NsYXNzTmFtZToiYWdlbnQtY29uc29sZS1zaGVsbCIsZ2FwOiJzbSIsY2hpbGRyZW46W1UoIm1vZGFsIiksUD9vLmpzeHMoby5GcmFnbWVudCx7Y2hpbGRyZW46W28uanN4cyhvZSx7anVzdGlmeToic3BhY2UtYmV0d2VlbiIsY2hpbGRyZW46W28uanN4KGR0LHtjb2xvcjoiZ3JlZW4iLGNoaWxkcmVuOmp9KSxvLmpzeHMob2Use2dhcDoieHMiLGNoaWxkcmVuOltvLmpzeChFLHt2YXJpYW50OiJkZWZhdWx0IixvbkNsaWNrOigpPT52b2lkIFRyKCksY2hpbGRyZW46IlJlc3RhcnQifSksby5qc3goRSx7Y29sb3I6InJlZCIsdmFyaWFudDoiZGVmYXVsdCIsb25DbGljazooKT0+dm9pZCBqZSgpLGNoaWxkcmVuOiJLaWxsIn0pXX0pXX0pLG8uanN4KGhtLHt2YWx1ZTpYfHwidGVybWluYWwgcmVhZHkiLGRpc2FibGVkOiFQLGZvY3VzZWQ6SSxvbkZvY3VzOigpPT56KCEwKSxvbkJsdXI6KCk9PnooITEpLG9uS2V5RG93bjp4bCxvblBhc3RlOndsLHZpZXdwb3J0UmVmOlRlfSldfSk6by5qc3goImZvcm0iLHtjbGFzc05hbWU6Im1vZGFsLWZvcm0gYWdlbnQtY29uc29sZS1jb25uZWN0IixvblN1Ym1pdDokcixjaGlsZHJlbjpvLmpzeHMoeWUse2dhcDoic20iLGNoaWxkcmVuOltvLmpzeChaLHtuYW1lOiJwYXNzcGhyYXNlIixyZXF1aXJlZDohMCx0eXBlOiJwYXNzd29yZCIsbGFiZWw6IkdhdGV3YXkgcGFzc3BocmFzZSIsYXV0b0ZvY3VzOiEwfSksby5qc3goWix7bmFtZToiZGVmYXVsdF9jb21tYW5kIixsYWJlbDoiRGVmYXVsdCBjb21tYW5kIixkZWZhdWx0VmFsdWU6ZS5nYXRld2F5X2RlZmF1bHRfY29tbWFuZHx8ImNvZGV4In0pLG8uanN4cyhvZSx7anVzdGlmeToic3BhY2UtYmV0d2VlbiIsY2hpbGRyZW46W28uanN4KGR0LHtjb2xvcjoiZ3JheSIsY2hpbGRyZW46an0pLG8uanN4KEUse3R5cGU6InN1Ym1pdCIsY2hpbGRyZW46IkNvbm5lY3QifSldfSldfSl9KV19KTpvLmpzeCgiZm9ybSIse2NsYXNzTmFtZToibW9kYWwtZm9ybSIsb25TdWJtaXQ6VnQsY2hpbGRyZW46by5qc3hzKHllLHtnYXA6InNtIixjaGlsZHJlbjpbVSgibW9kYWwiKSxvLmpzeChPdCx7Y2xhc3NOYW1lOiJtdXRlZCIsY2hpbGRyZW46IkFnZW50IENvbnNvbGUgbmVlZHMgYSBzZXBhcmF0ZSBsb2NhbCBnYXRld2F5IHZhdWx0LiBQcm9qZWN0IG1lbW9yeSBkb2VzIG5vdC4ifSksby5qc3goWix7bmFtZToicGFzc3BocmFzZSIscmVxdWlyZWQ6ITAsdHlwZToicGFzc3dvcmQiLGxhYmVsOiJHYXRld2F5IHBhc3NwaHJhc2UiLGF1dG9Gb2N1czohMH0pLG8uanN4KFose25hbWU6ImNvbmZpcm0iLHJlcXVpcmVkOiEwLHR5cGU6InBhc3N3b3JkIixsYWJlbDoiQ29uZmlybSBwYXNzcGhyYXNlIn0pLG8uanN4KFose25hbWU6ImRlZmF1bHRfY29tbWFuZCIsbGFiZWw6IkRlZmF1bHQgY29tbWFuZCIsZGVmYXVsdFZhbHVlOiJjb2RleCJ9KSxvLmpzeHMob2Use2p1c3RpZnk6InNwYWNlLWJldHdlZW4iLGNoaWxkcmVuOltvLmpzeChkdCx7Y29sb3I6ImdyYXkiLGNoaWxkcmVuOiJOb3QgY29uZmlndXJlZCJ9KSxvLmpzeChFLHt0eXBlOiJzdWJtaXQiLGNoaWxkcmVuOiJDcmVhdGUgZ2F0ZXdheSB2YXVsdCJ9KV19KV19KX0pfSldfSl9ZXhwb3J0e3ZtIGFzIGRlZmF1bHR9Owo="
},
"/_astro/client.CxYlr3v_.js": {
"content_type": "text/javascript; charset=utf-8",
"bytes": 182703,
"sha256": "aa669b65d6e43e368e9ec3915544134d17a3fc3c98de60adcb21ad94165095db",
"body_b64": "aW1wb3J0e2MgYXMgUmgsYSBhcyBqaCxyIGFzIG5hfWZyb20iLi9pbmRleC5DR29VaDVSUi5qcyI7dmFyIHRpPXtleHBvcnRzOnt9fSxtZT17fSxhaT17ZXhwb3J0czp7fX0sdWk9e307LyoqCiAqIEBsaWNlbnNlIFJlYWN0CiAqIHNjaGVkdWxlci5wcm9kdWN0aW9uLmpzCiAqCiAqIENvcHlyaWdodCAoYykgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuCiAqCiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAqL3ZhciBueTtmdW5jdGlvbiBWaCgpe3JldHVybiBueXx8KG55PTEsKGZ1bmN0aW9uKFQpe2Z1bmN0aW9uIGsoeixvKXt2YXIgVT16Lmxlbmd0aDt6LnB1c2gobyk7bDpmb3IoOzA8VTspe3ZhciBXPVUtMT4+PjEsdz16W1ddO2lmKDA8UGwodyxvKSl6W1ddPW8seltVXT13LFU9VztlbHNlIGJyZWFrIGx9fWZ1bmN0aW9uIFgoeil7cmV0dXJuIHoubGVuZ3RoPT09MD9udWxsOnpbMF19ZnVuY3Rpb24gcyh6KXtpZih6Lmxlbmd0aD09PTApcmV0dXJuIG51bGw7dmFyIG89elswXSxVPXoucG9wKCk7aWYoVSE9PW8pe3pbMF09VTtsOmZvcih2YXIgVz0wLHc9ei5sZW5ndGgsQWw9dz4+PjE7VzxBbDspe3ZhciBJPTIqKFcrMSktMSxqPXpbSV0seWw9SSsxLG50PXpbeWxdO2lmKDA+UGwoaixVKSl5bDx3JiYwPlBsKG50LGopPyh6W1ddPW50LHpbeWxdPVUsVz15bCk6KHpbV109aix6W0ldPVUsVz1JKTtlbHNlIGlmKHlsPHcmJjA+UGwobnQsVSkpeltXXT1udCx6W3lsXT1VLFc9eWw7ZWxzZSBicmVhayBsfX1yZXR1cm4gb31mdW5jdGlvbiBQbCh6LG8pe3ZhciBVPXouc29ydEluZGV4LW8uc29ydEluZGV4O3JldHVybiBVIT09MD9VOnouaWQtby5pZH1pZihULnVuc3RhYmxlX25vdz12b2lkIDAsdHlwZW9mIHBlcmZvcm1hbmNlPT0ib2JqZWN0IiYmdHlwZW9mIHBlcmZvcm1hbmNlLm5vdz09ImZ1bmN0aW9uIil7dmFyIHl0PXBlcmZvcm1hbmNlO1QudW5zdGFibGVfbm93PWZ1bmN0aW9uKCl7cmV0dXJuIHl0Lm5vdygpfX1lbHNle3ZhciBCdD1EYXRlLGZhPUJ0Lm5vdygpO1QudW5zdGFibGVfbm93PWZ1bmN0aW9uKCl7cmV0dXJuIEJ0Lm5vdygpLWZhfX12YXIgemw9W10samw9W10sX2E9MSxfPW51bGwsdGw9MyxIbD0hMSxpbD0hMSxWbD0hMSxIYT0hMSxOYT10eXBlb2Ygc2V0VGltZW91dD09ImZ1bmN0aW9uIj9zZXRUaW1lb3V0Om51bGwsYnU9dHlwZW9mIGNsZWFyVGltZW91dD09ImZ1bmN0aW9uIj9jbGVhclRpbWVvdXQ6bnVsbCxwbD10eXBlb2Ygc2V0SW1tZWRpYXRlPCJ1Ij9zZXRJbW1lZGlhdGU6bnVsbDtmdW5jdGlvbiBZdCh6KXtmb3IodmFyIG89WChqbCk7byE9PW51bGw7KXtpZihvLmNhbGxiYWNrPT09bnVsbClzKGpsKTtlbHNlIGlmKG8uc3RhcnRUaW1lPD16KXMoamwpLG8uc29ydEluZGV4PW8uZXhwaXJhdGlvblRpbWUsayh6bCxvKTtlbHNlIGJyZWFrO289WChqbCl9fWZ1bmN0aW9uIGNhKHope2lmKFZsPSExLFl0KHopLCFpbClpZihYKHpsKSE9PW51bGwpaWw9ITAsZXR8fChldD0hMCxLbCgpKTtlbHNle3ZhciBvPVgoamwpO28hPT1udWxsJiZodChjYSxvLnN0YXJ0VGltZS16KX19dmFyIGV0PSExLG10PS0xLGx0PTUscWE9LTE7ZnVuY3Rpb24gaGUoKXtyZXR1cm4gSGE/ITA6IShULnVuc3RhYmxlX25vdygpLXFhPGx0KX1mdW5jdGlvbiBCYSgpe2lmKEhhPSExLGV0KXt2YXIgej1ULnVuc3RhYmxlX25vdygpO3FhPXo7dmFyIG89ITA7dHJ5e2w6e2lsPSExLFZsJiYoVmw9ITEsYnUobXQpLG10PS0xKSxIbD0hMDt2YXIgVT10bDt0cnl7dDp7Zm9yKFl0KHopLF89WCh6bCk7XyE9PW51bGwmJiEoXy5leHBpcmF0aW9uVGltZT56JiZoZSgpKTspe3ZhciBXPV8uY2FsbGJhY2s7aWYodHlwZW9mIFc9PSJmdW5jdGlvbiIpe18uY2FsbGJhY2s9bnVsbCx0bD1fLnByaW9yaXR5TGV2ZWw7dmFyIHc9VyhfLmV4cGlyYXRpb25UaW1lPD16KTtpZih6PVQudW5zdGFibGVfbm93KCksdHlwZW9mIHc9PSJmdW5jdGlvbiIpe18uY2FsbGJhY2s9dyxZdCh6KSxvPSEwO2JyZWFrIHR9Xz09PVgoemwpJiZzKHpsKSxZdCh6KX1lbHNlIHMoemwpO189WCh6bCl9aWYoXyE9PW51bGwpbz0hMDtlbHNle3ZhciBBbD1YKGpsKTtBbCE9PW51bGwmJmh0KGNhLEFsLnN0YXJ0VGltZS16KSxvPSExfX1icmVhayBsfWZpbmFsbHl7Xz1udWxsLHRsPVUsSGw9ITF9bz12b2lkIDB9fWZpbmFsbHl7bz9LbCgpOmV0PSExfX19dmFyIEtsO2lmKHR5cGVvZiBwbD09ImZ1bmN0aW9uIilLbD1mdW5jdGlvbigpe3BsKEJhKX07ZWxzZSBpZih0eXBlb2YgTWVzc2FnZUNoYW5uZWw8InUiKXt2YXIgZGU9bmV3IE1lc3NhZ2VDaGFubmVsLHp1PWRlLnBvcnQyO2RlLnBvcnQxLm9ubWVzc2FnZT1CYSxLbD1mdW5jdGlvbigpe3p1LnBvc3RNZXNzYWdlKG51bGwpfX1lbHNlIEtsPWZ1bmN0aW9uKCl7TmEoQmEsMCl9O2Z1bmN0aW9uIGh0KHosbyl7bXQ9TmEoZnVuY3Rpb24oKXt6KFQudW5zdGFibGVfbm93KCkpfSxvKX1ULnVuc3RhYmxlX0lkbGVQcmlvcml0eT01LFQudW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHk9MSxULnVuc3RhYmxlX0xvd1ByaW9yaXR5PTQsVC51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eT0zLFQudW5zdGFibGVfUHJvZmlsaW5nPW51bGwsVC51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eT0yLFQudW5zdGFibGVfY2FuY2VsQ2FsbGJhY2s9ZnVuY3Rpb24oeil7ei5jYWxsYmFjaz1udWxsfSxULnVuc3RhYmxlX2ZvcmNlRnJhbWVSYXRlPWZ1bmN0aW9uKHopezA+enx8MTI1PHo/Y29uc29sZS5lcnJvcigiZm9yY2VGcmFtZVJhdGUgdGFrZXMgYSBwb3NpdGl2ZSBpbnQgYmV0d2VlbiAwIGFuZCAxMjUsIGZvcmNpbmcgZnJhbWUgcmF0ZXMgaGlnaGVyIHRoYW4gMTI1IGZwcyBpcyBub3Qgc3VwcG9ydGVkIik6bHQ9MDx6P01hdGguZmxvb3IoMWUzL3opOjV9LFQudW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGx9LFQudW5zdGFibGVfbmV4dD1mdW5jdGlvbih6KXtzd2l0Y2godGwpe2Nhc2UgMTpjYXNlIDI6Y2FzZSAzOnZhciBvPTM7YnJlYWs7ZGVmYXVsdDpvPXRsfXZhciBVPXRsO3RsPW87dHJ5e3JldHVybiB6KCl9ZmluYWxseXt0bD1VfX0sVC51bnN0YWJsZV9yZXF1ZXN0UGFpbnQ9ZnVuY3Rpb24oKXtIYT0hMH0sVC51bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHk9ZnVuY3Rpb24oeixvKXtzd2l0Y2goeil7Y2FzZSAxOmNhc2UgMjpjYXNlIDM6Y2FzZSA0OmNhc2UgNTpicmVhaztkZWZhdWx0Ono9M312YXIgVT10bDt0bD16O3RyeXtyZXR1cm4gbygpfWZpbmFsbHl7dGw9VX19LFQudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjaz1mdW5jdGlvbih6LG8sVSl7dmFyIFc9VC51bnN0YWJsZV9ub3coKTtzd2l0Y2godHlwZW9mIFU9PSJvYmplY3QiJiZVIT09bnVsbD8oVT1VLmRlbGF5LFU9dHlwZW9mIFU9PSJudW1iZXIiJiYwPFU/VytVOlcpOlU9Vyx6KXtjYXNlIDE6dmFyIHc9LTE7YnJlYWs7Y2FzZSAyOnc9MjUwO2JyZWFrO2Nhc2UgNTp3PTEwNzM3NDE4MjM7YnJlYWs7Y2FzZSA0Onc9MWU0O2JyZWFrO2RlZmF1bHQ6dz01ZTN9cmV0dXJuIHc9VSt3LHo9e2lkOl9hKyssY2FsbGJhY2s6byxwcmlvcml0eUxldmVsOnosc3RhcnRUaW1lOlUsZXhwaXJhdGlvblRpbWU6dyxzb3J0SW5kZXg6LTF9LFU+Vz8oei5zb3J0SW5kZXg9VSxrKGpsLHopLFgoemwpPT09bnVsbCYmej09PVgoamwpJiYoVmw/KGJ1KG10KSxtdD0tMSk6Vmw9ITAsaHQoY2EsVS1XKSkpOih6LnNvcnRJbmRleD13LGsoemwseiksaWx8fEhsfHwoaWw9ITAsZXR8fChldD0hMCxLbCgpKSkpLHp9LFQudW5zdGFibGVfc2hvdWxkWWllbGQ9aGUsVC51bnN0YWJsZV93cmFwQ2FsbGJhY2s9ZnVuY3Rpb24oeil7dmFyIG89dGw7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIFU9dGw7dGw9bzt0cnl7cmV0dXJuIHouYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7dGw9VX19fX0pKHVpKSksdWl9dmFyIGZ5O2Z1bmN0aW9uIHBoKCl7cmV0dXJuIGZ5fHwoZnk9MSxhaS5leHBvcnRzPVZoKCkpLGFpLmV4cG9ydHN9LyoqCiAqIEBsaWNlbnNlIFJlYWN0CiAqIHJlYWN0LWRvbS1jbGllbnQucHJvZHVjdGlvbi5qcwogKgogKiBDb3B5cmlnaHQgKGMpIE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLgogKgogKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLgogKi92YXIgY3k7ZnVuY3Rpb24gS2goKXtpZihjeSlyZXR1cm4gbWU7Y3k9MTt2YXIgVD1waCgpLGs9UmgoKSxYPWpoKCk7ZnVuY3Rpb24gcyhsKXt2YXIgdD0iaHR0cHM6Ly9yZWFjdC5kZXYvZXJyb3JzLyIrbDtpZigxPGFyZ3VtZW50cy5sZW5ndGgpe3QrPSI/YXJnc1tdPSIrZW5jb2RlVVJJQ29tcG9uZW50KGFyZ3VtZW50c1sxXSk7Zm9yKHZhciBhPTI7YTxhcmd1bWVudHMubGVuZ3RoO2ErKyl0Kz0iJmFyZ3NbXT0iK2VuY29kZVVSSUNvbXBvbmVudChhcmd1bWVudHNbYV0pfXJldHVybiJNaW5pZmllZCBSZWFjdCBlcnJvciAjIitsKyI7IHZpc2l0ICIrdCsiIGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4ifWZ1bmN0aW9uIFBsKGwpe3JldHVybiEoIWx8fGwubm9kZVR5cGUhPT0xJiZsLm5vZGVUeXBlIT09OSYmbC5ub2RlVHlwZSE9PTExKX1mdW5jdGlvbiB5dChsKXt2YXIgdD1sLGE9bDtpZihsLmFsdGVybmF0ZSlmb3IoO3QucmV0dXJuOyl0PXQucmV0dXJuO2Vsc2V7bD10O2RvIHQ9bCwodC5mbGFncyY0MDk4KSE9PTAmJihhPXQucmV0dXJuKSxsPXQucmV0dXJuO3doaWxlKGwpfXJldHVybiB0LnRhZz09PTM/YTpudWxsfWZ1bmN0aW9uIEJ0KGwpe2lmKGwudGFnPT09MTMpe3ZhciB0PWwubWVtb2l6ZWRTdGF0ZTtpZih0PT09bnVsbCYmKGw9bC5hbHRlcm5hdGUsbCE9PW51bGwmJih0PWwubWVtb2l6ZWRTdGF0ZSkpLHQhPT1udWxsKXJldHVybiB0LmRlaHlkcmF0ZWR9cmV0dXJuIG51bGx9ZnVuY3Rpb24gZmEobCl7aWYobC50YWc9PT0zMSl7dmFyIHQ9bC5tZW1vaXplZFN0YXRlO2lmKHQ9PT1udWxsJiYobD1sLmFsdGVybmF0ZSxsIT09bnVsbCYmKHQ9bC5tZW1vaXplZFN0YXRlKSksdCE9PW51bGwpcmV0dXJuIHQuZGVoeWRyYXRlZH1yZXR1cm4gbnVsbH1mdW5jdGlvbiB6bChsKXtpZih5dChsKSE9PWwpdGhyb3cgRXJyb3IocygxODgpKX1mdW5jdGlvbiBqbChsKXt2YXIgdD1sLmFsdGVybmF0ZTtpZighdCl7aWYodD15dChsKSx0PT09bnVsbCl0aHJvdyBFcnJvcihzKDE4OCkpO3JldHVybiB0IT09bD9udWxsOmx9Zm9yKHZhciBhPWwsdT10Ozspe3ZhciBlPWEucmV0dXJuO2lmKGU9PT1udWxsKWJyZWFrO3ZhciBuPWUuYWx0ZXJuYXRlO2lmKG49PT1udWxsKXtpZih1PWUucmV0dXJuLHUhPT1udWxsKXthPXU7Y29udGludWV9YnJlYWt9aWYoZS5jaGlsZD09PW4uY2hpbGQpe2ZvcihuPWUuY2hpbGQ7bjspe2lmKG49PT1hKXJldHVybiB6bChlKSxsO2lmKG49PT11KXJldHVybiB6bChlKSx0O249bi5zaWJsaW5nfXRocm93IEVycm9yKHMoMTg4KSl9aWYoYS5yZXR1cm4hPT11LnJldHVybilhPWUsdT1uO2Vsc2V7Zm9yKHZhciBmPSExLGM9ZS5jaGlsZDtjOyl7aWYoYz09PWEpe2Y9ITAsYT1lLHU9bjticmVha31pZihjPT09dSl7Zj0hMCx1PWUsYT1uO2JyZWFrfWM9Yy5zaWJsaW5nfWlmKCFmKXtmb3IoYz1uLmNoaWxkO2M7KXtpZihjPT09YSl7Zj0hMCxhPW4sdT1lO2JyZWFrfWlmKGM9PT11KXtmPSEwLHU9bixhPWU7YnJlYWt9Yz1jLnNpYmxpbmd9aWYoIWYpdGhyb3cgRXJyb3IocygxODkpKX19aWYoYS5hbHRlcm5hdGUhPT11KXRocm93IEVycm9yKHMoMTkwKSl9aWYoYS50YWchPT0zKXRocm93IEVycm9yKHMoMTg4KSk7cmV0dXJuIGEuc3RhdGVOb2RlLmN1cnJlbnQ9PT1hP2w6dH1mdW5jdGlvbiBfYShsKXt2YXIgdD1sLnRhZztpZih0PT09NXx8dD09PTI2fHx0PT09Mjd8fHQ9PT02KXJldHVybiBsO2ZvcihsPWwuY2hpbGQ7bCE9PW51bGw7KXtpZih0PV9hKGwpLHQhPT1udWxsKXJldHVybiB0O2w9bC5zaWJsaW5nfXJldHVybiBudWxsfXZhciBfPU9iamVjdC5hc3NpZ24sdGw9U3ltYm9sLmZvcigicmVhY3QuZWxlbWVudCIpLEhsPVN5bWJvbC5mb3IoInJlYWN0LnRyYW5zaXRpb25hbC5lbGVtZW50IiksaWw9U3ltYm9sLmZvcigicmVhY3QucG9ydGFsIiksVmw9U3ltYm9sLmZvcigicmVhY3QuZnJhZ21lbnQiKSxIYT1TeW1ib2wuZm9yKCJyZWFjdC5zdHJpY3RfbW9kZSIpLE5hPVN5bWJvbC5mb3IoInJlYWN0LnByb2ZpbGVyIiksYnU9U3ltYm9sLmZvcigicmVhY3QuY29uc3VtZXIiKSxwbD1TeW1ib2wuZm9yKCJyZWFjdC5jb250ZXh0IiksWXQ9U3ltYm9sLmZvcigicmVhY3QuZm9yd2FyZF9yZWYiKSxjYT1TeW1ib2wuZm9yKCJyZWFjdC5zdXNwZW5zZSIpLGV0PVN5bWJvbC5mb3IoInJlYWN0LnN1c3BlbnNlX2xpc3QiKSxtdD1TeW1ib2wuZm9yKCJyZWFjdC5tZW1vIiksbHQ9U3ltYm9sLmZvcigicmVhY3QubGF6eSIpLHFhPVN5bWJvbC5mb3IoInJlYWN0LmFjdGl2aXR5IiksaGU9U3ltYm9sLmZvcigicmVhY3QubWVtb19jYWNoZV9zZW50aW5lbCIpLEJhPVN5bWJvbC5pdGVyYXRvcjtmdW5jdGlvbiBLbChsKXtyZXR1cm4gbD09PW51bGx8fHR5cGVvZiBsIT0ib2JqZWN0Ij9udWxsOihsPUJhJiZsW0JhXXx8bFsiQEBpdGVyYXRvciJdLHR5cGVvZiBsPT0iZnVuY3Rpb24iP2w6bnVsbCl9dmFyIGRlPVN5bWJvbC5mb3IoInJlYWN0LmNsaWVudC5yZWZlcmVuY2UiKTtmdW5jdGlvbiB6dShsKXtpZihsPT1udWxsKXJldHVybiBudWxsO2lmKHR5cGVvZiBsPT0iZnVuY3Rpb24iKXJldHVybiBsLiQkdHlwZW9mPT09ZGU/bnVsbDpsLmRpc3BsYXlOYW1lfHxsLm5hbWV8fG51bGw7aWYodHlwZW9mIGw9PSJzdHJpbmciKXJldHVybiBsO3N3aXRjaChsKXtjYXNlIFZsOnJldHVybiJGcmFnbWVudCI7Y2FzZSBOYTpyZXR1cm4iUHJvZmlsZXIiO2Nhc2UgSGE6cmV0dXJuIlN0cmljdE1vZGUiO2Nhc2UgY2E6cmV0dXJuIlN1c3BlbnNlIjtjYXNlIGV0OnJldHVybiJTdXNwZW5zZUxpc3QiO2Nhc2UgcWE6cmV0dXJuIkFjdGl2aXR5In1pZih0eXBlb2YgbD09Im9iamVjdCIpc3dpdGNoKGwuJCR0eXBlb2Ype2Nhc2UgaWw6cmV0dXJuIlBvcnRhbCI7Y2FzZSBwbDpyZXR1cm4gbC5kaXNwbGF5TmFtZXx8IkNvbnRleHQiO2Nhc2UgYnU6cmV0dXJuKGwuX2NvbnRleHQuZGlzcGxheU5hbWV8fCJDb250ZXh0IikrIi5Db25zdW1lciI7Y2FzZSBZdDp2YXIgdD1sLnJlbmRlcjtyZXR1cm4gbD1sLmRpc3BsYXlOYW1lLGx8fChsPXQuZGlzcGxheU5hbWV8fHQubmFtZXx8IiIsbD1sIT09IiI/IkZvcndhcmRSZWYoIitsKyIpIjoiRm9yd2FyZFJlZiIpLGw7Y2FzZSBtdDpyZXR1cm4gdD1sLmRpc3BsYXlOYW1lfHxudWxsLHQhPT1udWxsP3Q6enUobC50eXBlKXx8Ik1lbW8iO2Nhc2UgbHQ6dD1sLl9wYXlsb2FkLGw9bC5faW5pdDt0cnl7cmV0dXJuIHp1KGwodCkpfWNhdGNoe319cmV0dXJuIG51bGx9dmFyIGh0PUFycmF5LmlzQXJyYXksej1rLl9fQ0xJRU5UX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1dBUk5fVVNFUlNfVEhFWV9DQU5OT1RfVVBHUkFERSxvPVguX19ET01fSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfV0FSTl9VU0VSU19USEVZX0NBTk5PVF9VUEdSQURFLFU9e3BlbmRpbmc6ITEsZGF0YTpudWxsLG1ldGhvZDpudWxsLGFjdGlvbjpudWxsfSxXPVtdLHc9LTE7ZnVuY3Rpb24gQWwobCl7cmV0dXJue2N1cnJlbnQ6bH19ZnVuY3Rpb24gSShsKXswPnd8fChsLmN1cnJlbnQ9V1t3XSxXW3ddPW51bGwsdy0tKX1mdW5jdGlvbiBqKGwsdCl7dysrLFdbd109bC5jdXJyZW50LGwuY3VycmVudD10fXZhciB5bD1BbChudWxsKSxudD1BbChudWxsKSxRdD1BbChudWxsKSxTZT1BbChudWxsKTtmdW5jdGlvbiBzZShsLHQpe3N3aXRjaChqKFF0LHQpLGoobnQsbCksaih5bCxudWxsKSx0Lm5vZGVUeXBlKXtjYXNlIDk6Y2FzZSAxMTpsPShsPXQuZG9jdW1lbnRFbGVtZW50KSYmKGw9bC5uYW1lc3BhY2VVUkkpP0gxKGwpOjA7YnJlYWs7ZGVmYXVsdDppZihsPXQudGFnTmFtZSx0PXQubmFtZXNwYWNlVVJJKXQ9SDEodCksbD1OMSh0LGwpO2Vsc2Ugc3dpdGNoKGwpe2Nhc2Uic3ZnIjpsPTE7YnJlYWs7Y2FzZSJtYXRoIjpsPTI7YnJlYWs7ZGVmYXVsdDpsPTB9fUkoeWwpLGooeWwsbCl9ZnVuY3Rpb24gWWEoKXtJKHlsKSxJKG50KSxJKFF0KX1mdW5jdGlvbiBHbihsKXtsLm1lbW9pemVkU3RhdGUhPT1udWxsJiZqKFNlLGwpO3ZhciB0PXlsLmN1cnJlbnQsYT1OMSh0LGwudHlwZSk7dCE9PWEmJihqKG50LGwpLGooeWwsYSkpfWZ1bmN0aW9uIGdlKGwpe250LmN1cnJlbnQ9PT1sJiYoSSh5bCksSShudCkpLFNlLmN1cnJlbnQ9PT1sJiYoSShTZSksY2UuX2N1cnJlbnRWYWx1ZT1VKX12YXIgQ24sZWk7ZnVuY3Rpb24gaWEobCl7aWYoQ249PT12b2lkIDApdHJ5e3Rocm93IEVycm9yKCl9Y2F0Y2goYSl7dmFyIHQ9YS5zdGFjay50cmltKCkubWF0Y2goL1xuKCAqKGF0ICk/KS8pO0NuPXQmJnRbMV18fCIiLGVpPS0xPGEuc3RhY2suaW5kZXhPZihgCiAgICBhdGApPyIgKDxhbm9ueW1vdXM+KSI6LTE8YS5zdGFjay5pbmRleE9mKCJAIik/IkB1bmtub3duOjA6MCI6IiJ9cmV0dXJuYApgK0NuK2wrZWl9dmFyIFpuPSExO2Z1bmN0aW9uIFJuKGwsdCl7aWYoIWx8fFpuKXJldHVybiIiO1puPSEwO3ZhciBhPUVycm9yLnByZXBhcmVTdGFja1RyYWNlO0Vycm9yLnByZXBhcmVTdGFja1RyYWNlPXZvaWQgMDt0cnl7dmFyIHU9e0RldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdDpmdW5jdGlvbigpe3RyeXtpZih0KXt2YXIgQT1mdW5jdGlvbigpe3Rocm93IEVycm9yKCl9O2lmKE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBLnByb3RvdHlwZSwicHJvcHMiLHtzZXQ6ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigpfX0pLHR5cGVvZiBSZWZsZWN0PT0ib2JqZWN0IiYmUmVmbGVjdC5jb25zdHJ1Y3Qpe3RyeXtSZWZsZWN0LmNvbnN0cnVjdChBLFtdKX1jYXRjaChTKXt2YXIgZD1TfVJlZmxlY3QuY29uc3RydWN0KGwsW10sQSl9ZWxzZXt0cnl7QS5jYWxsKCl9Y2F0Y2goUyl7ZD1TfWwuY2FsbChBLnByb3RvdHlwZSl9fWVsc2V7dHJ5e3Rocm93IEVycm9yKCl9Y2F0Y2goUyl7ZD1TfShBPWwoKSkmJnR5cGVvZiBBLmNhdGNoPT0iZnVuY3Rpb24iJiZBLmNhdGNoKGZ1bmN0aW9uKCl7fSl9fWNhdGNoKFMpe2lmKFMmJmQmJnR5cGVvZiBTLnN0YWNrPT0ic3RyaW5nIilyZXR1cm5bUy5zdGFjayxkLnN0YWNrXX1yZXR1cm5bbnVsbCxudWxsXX19O3UuRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290LmRpc3BsYXlOYW1lPSJEZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3QiO3ZhciBlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodS5EZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3QsIm5hbWUiKTtlJiZlLmNvbmZpZ3VyYWJsZSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHUuRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290LCJuYW1lIix7dmFsdWU6IkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdCJ9KTt2YXIgbj11LkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdCgpLGY9blswXSxjPW5bMV07aWYoZiYmYyl7dmFyIGk9Zi5zcGxpdChgCmApLGg9Yy5zcGxpdChgCmApO2ZvcihlPXU9MDt1PGkubGVuZ3RoJiYhaVt1XS5pbmNsdWRlcygiRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290Iik7KXUrKztmb3IoO2U8aC5sZW5ndGgmJiFoW2VdLmluY2x1ZGVzKCJEZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3QiKTspZSsrO2lmKHU9PT1pLmxlbmd0aHx8ZT09PWgubGVuZ3RoKWZvcih1PWkubGVuZ3RoLTEsZT1oLmxlbmd0aC0xOzE8PXUmJjA8PWUmJmlbdV0hPT1oW2VdOyllLS07Zm9yKDsxPD11JiYwPD1lO3UtLSxlLS0paWYoaVt1XSE9PWhbZV0pe2lmKHUhPT0xfHxlIT09MSlkbyBpZih1LS0sZS0tLDA+ZXx8aVt1XSE9PWhbZV0pe3ZhciBnPWAKYCtpW3VdLnJlcGxhY2UoIiBhdCBuZXcgIiwiIGF0ICIpO3JldHVybiBsLmRpc3BsYXlOYW1lJiZnLmluY2x1ZGVzKCI8YW5vbnltb3VzPiIpJiYoZz1nLnJlcGxhY2UoIjxhbm9ueW1vdXM+IixsLmRpc3BsYXlOYW1lKSksZ313aGlsZSgxPD11JiYwPD1lKTticmVha319fWZpbmFsbHl7Wm49ITEsRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U9YX1yZXR1cm4oYT1sP2wuZGlzcGxheU5hbWV8fGwubmFtZToiIik/aWEoYSk6IiJ9ZnVuY3Rpb24gc3kobCx0KXtzd2l0Y2gobC50YWcpe2Nhc2UgMjY6Y2FzZSAyNzpjYXNlIDU6cmV0dXJuIGlhKGwudHlwZSk7Y2FzZSAxNjpyZXR1cm4gaWEoIkxhenkiKTtjYXNlIDEzOnJldHVybiBsLmNoaWxkIT09dCYmdCE9PW51bGw/aWEoIlN1c3BlbnNlIEZhbGxiYWNrIik6aWEoIlN1c3BlbnNlIik7Y2FzZSAxOTpyZXR1cm4gaWEoIlN1c3BlbnNlTGlzdCIpO2Nhc2UgMDpjYXNlIDE1OnJldHVybiBSbihsLnR5cGUsITEpO2Nhc2UgMTE6cmV0dXJuIFJuKGwudHlwZS5yZW5kZXIsITEpO2Nhc2UgMTpyZXR1cm4gUm4obC50eXBlLCEwKTtjYXNlIDMxOnJldHVybiBpYSgiQWN0aXZpdHkiKTtkZWZhdWx0OnJldHVybiIifX1mdW5jdGlvbiBuaShsKXt0cnl7dmFyIHQ9IiIsYT1udWxsO2RvIHQrPXN5KGwsYSksYT1sLGw9bC5yZXR1cm47d2hpbGUobCk7cmV0dXJuIHR9Y2F0Y2godSl7cmV0dXJuYApFcnJvciBnZW5lcmF0aW5nIHN0YWNrOiBgK3UubWVzc2FnZStgCmArdS5zdGFja319dmFyIGpuPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksVm49VC51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrLHBuPVQudW5zdGFibGVfY2FuY2VsQ2FsbGJhY2ssZ3k9VC51bnN0YWJsZV9zaG91bGRZaWVsZCxieT1ULnVuc3RhYmxlX3JlcXVlc3RQYWludCxObD1ULnVuc3RhYmxlX25vdyx6eT1ULnVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsLGZpPVQudW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHksY2k9VC51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eSxiZT1ULnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LEF5PVQudW5zdGFibGVfTG93UHJpb3JpdHksaWk9VC51bnN0YWJsZV9JZGxlUHJpb3JpdHksVHk9VC5sb2csb3k9VC51bnN0YWJsZV9zZXREaXNhYmxlWWllbGRWYWx1ZSxBdT1udWxsLHFsPW51bGw7ZnVuY3Rpb24gWHQobCl7aWYodHlwZW9mIFR5PT0iZnVuY3Rpb24iJiZveShsKSxxbCYmdHlwZW9mIHFsLnNldFN0cmljdE1vZGU9PSJmdW5jdGlvbiIpdHJ5e3FsLnNldFN0cmljdE1vZGUoQXUsbCl9Y2F0Y2h7fX12YXIgQmw9TWF0aC5jbHozMj9NYXRoLmNsejMyOk95LEV5PU1hdGgubG9nLE15PU1hdGguTE4yO2Z1bmN0aW9uIE95KGwpe3JldHVybiBsPj4+PTAsbD09PTA/MzI6MzEtKEV5KGwpL015fDApfDB9dmFyIHplPTI1NixBZT0yNjIxNDQsVGU9NDE5NDMwNDtmdW5jdGlvbiB2YShsKXt2YXIgdD1sJjQyO2lmKHQhPT0wKXJldHVybiB0O3N3aXRjaChsJi1sKXtjYXNlIDE6cmV0dXJuIDE7Y2FzZSAyOnJldHVybiAyO2Nhc2UgNDpyZXR1cm4gNDtjYXNlIDg6cmV0dXJuIDg7Y2FzZSAxNjpyZXR1cm4gMTY7Y2FzZSAzMjpyZXR1cm4gMzI7Y2FzZSA2NDpyZXR1cm4gNjQ7Y2FzZSAxMjg6cmV0dXJuIDEyODtjYXNlIDI1NjpjYXNlIDUxMjpjYXNlIDEwMjQ6Y2FzZSAyMDQ4OmNhc2UgNDA5NjpjYXNlIDgxOTI6Y2FzZSAxNjM4NDpjYXNlIDMyNzY4OmNhc2UgNjU1MzY6Y2FzZSAxMzEwNzI6cmV0dXJuIGwmMjYxODg4O2Nhc2UgMjYyMTQ0OmNhc2UgNTI0Mjg4OmNhc2UgMTA0ODU3NjpjYXNlIDIwOTcxNTI6cmV0dXJuIGwmMzkzMjE2MDtjYXNlIDQxOTQzMDQ6Y2FzZSA4Mzg4NjA4OmNhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpyZXR1cm4gbCY2MjkxNDU2MDtjYXNlIDY3MTA4ODY0OnJldHVybiA2NzEwODg2NDtjYXNlIDEzNDIxNzcyODpyZXR1cm4gMTM0MjE3NzI4O2Nhc2UgMjY4NDM1NDU2OnJldHVybiAyNjg0MzU0NTY7Y2FzZSA1MzY4NzA5MTI6cmV0dXJuIDUzNjg3MDkxMjtjYXNlIDEwNzM3NDE4MjQ6cmV0dXJuIDA7ZGVmYXVsdDpyZXR1cm4gbH19ZnVuY3Rpb24gb2UobCx0LGEpe3ZhciB1PWwucGVuZGluZ0xhbmVzO2lmKHU9PT0wKXJldHVybiAwO3ZhciBlPTAsbj1sLnN1c3BlbmRlZExhbmVzLGY9bC5waW5nZWRMYW5lcztsPWwud2FybUxhbmVzO3ZhciBjPXUmMTM0MjE3NzI3O3JldHVybiBjIT09MD8odT1jJn5uLHUhPT0wP2U9dmEodSk6KGYmPWMsZiE9PTA/ZT12YShmKTphfHwoYT1jJn5sLGEhPT0wJiYoZT12YShhKSkpKSk6KGM9dSZ+bixjIT09MD9lPXZhKGMpOmYhPT0wP2U9dmEoZik6YXx8KGE9dSZ+bCxhIT09MCYmKGU9dmEoYSkpKSksZT09PTA/MDp0IT09MCYmdCE9PWUmJih0Jm4pPT09MCYmKG49ZSYtZSxhPXQmLXQsbj49YXx8bj09PTMyJiYoYSY0MTk0MDQ4KSE9PTApP3Q6ZX1mdW5jdGlvbiBUdShsLHQpe3JldHVybihsLnBlbmRpbmdMYW5lcyZ+KGwuc3VzcGVuZGVkTGFuZXMmfmwucGluZ2VkTGFuZXMpJnQpPT09MH1mdW5jdGlvbiBEeShsLHQpe3N3aXRjaChsKXtjYXNlIDE6Y2FzZSAyOmNhc2UgNDpjYXNlIDg6Y2FzZSA2NDpyZXR1cm4gdCsyNTA7Y2FzZSAxNjpjYXNlIDMyOmNhc2UgMTI4OmNhc2UgMjU2OmNhc2UgNTEyOmNhc2UgMTAyNDpjYXNlIDIwNDg6Y2FzZSA0MDk2OmNhc2UgODE5MjpjYXNlIDE2Mzg0OmNhc2UgMzI3Njg6Y2FzZSA2NTUzNjpjYXNlIDEzMTA3MjpjYXNlIDI2MjE0NDpjYXNlIDUyNDI4ODpjYXNlIDEwNDg1NzY6Y2FzZSAyMDk3MTUyOnJldHVybiB0KzVlMztjYXNlIDQxOTQzMDQ6Y2FzZSA4Mzg4NjA4OmNhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpyZXR1cm4tMTtjYXNlIDY3MTA4ODY0OmNhc2UgMTM0MjE3NzI4OmNhc2UgMjY4NDM1NDU2OmNhc2UgNTM2ODcwOTEyOmNhc2UgMTA3Mzc0MTgyNDpyZXR1cm4tMTtkZWZhdWx0OnJldHVybi0xfX1mdW5jdGlvbiB2aSgpe3ZhciBsPVRlO3JldHVybiBUZTw8PTEsKFRlJjYyOTE0NTYwKT09PTAmJihUZT00MTk0MzA0KSxsfWZ1bmN0aW9uIEtuKGwpe2Zvcih2YXIgdD1bXSxhPTA7MzE+YTthKyspdC5wdXNoKGwpO3JldHVybiB0fWZ1bmN0aW9uIG91KGwsdCl7bC5wZW5kaW5nTGFuZXN8PXQsdCE9PTI2ODQzNTQ1NiYmKGwuc3VzcGVuZGVkTGFuZXM9MCxsLnBpbmdlZExhbmVzPTAsbC53YXJtTGFuZXM9MCl9ZnVuY3Rpb24gVXkobCx0LGEsdSxlLG4pe3ZhciBmPWwucGVuZGluZ0xhbmVzO2wucGVuZGluZ0xhbmVzPWEsbC5zdXNwZW5kZWRMYW5lcz0wLGwucGluZ2VkTGFuZXM9MCxsLndhcm1MYW5lcz0wLGwuZXhwaXJlZExhbmVzJj1hLGwuZW50YW5nbGVkTGFuZXMmPWEsbC5lcnJvclJlY292ZXJ5RGlzYWJsZWRMYW5lcyY9YSxsLnNoZWxsU3VzcGVuZENvdW50ZXI9MDt2YXIgYz1sLmVudGFuZ2xlbWVudHMsaT1sLmV4cGlyYXRpb25UaW1lcyxoPWwuaGlkZGVuVXBkYXRlcztmb3IoYT1mJn5hOzA8YTspe3ZhciBnPTMxLUJsKGEpLEE9MTw8ZztjW2ddPTAsaVtnXT0tMTt2YXIgZD1oW2ddO2lmKGQhPT1udWxsKWZvcihoW2ddPW51bGwsZz0wO2c8ZC5sZW5ndGg7ZysrKXt2YXIgUz1kW2ddO1MhPT1udWxsJiYoUy5sYW5lJj0tNTM2ODcwOTEzKX1hJj1+QX11IT09MCYmeWkobCx1LDApLG4hPT0wJiZlPT09MCYmbC50YWchPT0wJiYobC5zdXNwZW5kZWRMYW5lc3w9biZ+KGYmfnQpKX1mdW5jdGlvbiB5aShsLHQsYSl7bC5wZW5kaW5nTGFuZXN8PXQsbC5zdXNwZW5kZWRMYW5lcyY9fnQ7dmFyIHU9MzEtQmwodCk7bC5lbnRhbmdsZWRMYW5lc3w9dCxsLmVudGFuZ2xlbWVudHNbdV09bC5lbnRhbmdsZW1lbnRzW3VdfDEwNzM3NDE4MjR8YSYyNjE5MzB9ZnVuY3Rpb24gbWkobCx0KXt2YXIgYT1sLmVudGFuZ2xlZExhbmVzfD10O2ZvcihsPWwuZW50YW5nbGVtZW50czthOyl7dmFyIHU9MzEtQmwoYSksZT0xPDx1O2UmdHxsW3VdJnQmJihsW3VdfD10KSxhJj1+ZX19ZnVuY3Rpb24gaGkobCx0KXt2YXIgYT10Ji10O3JldHVybiBhPShhJjQyKSE9PTA/MTp4bihhKSwoYSYobC5zdXNwZW5kZWRMYW5lc3x0KSkhPT0wPzA6YX1mdW5jdGlvbiB4bihsKXtzd2l0Y2gobCl7Y2FzZSAyOmw9MTticmVhaztjYXNlIDg6bD00O2JyZWFrO2Nhc2UgMzI6bD0xNjticmVhaztjYXNlIDI1NjpjYXNlIDUxMjpjYXNlIDEwMjQ6Y2FzZSAyMDQ4OmNhc2UgNDA5NjpjYXNlIDgxOTI6Y2FzZSAxNjM4NDpjYXNlIDMyNzY4OmNhc2UgNjU1MzY6Y2FzZSAxMzEwNzI6Y2FzZSAyNjIxNDQ6Y2FzZSA1MjQyODg6Y2FzZSAxMDQ4NTc2OmNhc2UgMjA5NzE1MjpjYXNlIDQxOTQzMDQ6Y2FzZSA4Mzg4NjA4OmNhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpsPTEyODticmVhaztjYXNlIDI2ODQzNTQ1NjpsPTEzNDIxNzcyODticmVhaztkZWZhdWx0Omw9MH1yZXR1cm4gbH1mdW5jdGlvbiBMbihsKXtyZXR1cm4gbCY9LWwsMjxsPzg8bD8obCYxMzQyMTc3MjcpIT09MD8zMjoyNjg0MzU0NTY6ODoyfWZ1bmN0aW9uIGRpKCl7dmFyIGw9by5wO3JldHVybiBsIT09MD9sOihsPXdpbmRvdy5ldmVudCxsPT09dm9pZCAwPzMyOkkxKGwudHlwZSkpfWZ1bmN0aW9uIFNpKGwsdCl7dmFyIGE9by5wO3RyeXtyZXR1cm4gby5wPWwsdCgpfWZpbmFsbHl7by5wPWF9fXZhciBHdD1NYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKSxkbD0iX19yZWFjdEZpYmVyJCIrR3Qsb2w9Il9fcmVhY3RQcm9wcyQiK0d0LFFhPSJfX3JlYWN0Q29udGFpbmVyJCIrR3QsSm49Il9fcmVhY3RFdmVudHMkIitHdCxfeT0iX19yZWFjdExpc3RlbmVycyQiK0d0LEh5PSJfX3JlYWN0SGFuZGxlcyQiK0d0LHNpPSJfX3JlYWN0UmVzb3VyY2VzJCIrR3QsRXU9Il9fcmVhY3RNYXJrZXIkIitHdDtmdW5jdGlvbiBXbihsKXtkZWxldGUgbFtkbF0sZGVsZXRlIGxbb2xdLGRlbGV0ZSBsW0puXSxkZWxldGUgbFtfeV0sZGVsZXRlIGxbSHldfWZ1bmN0aW9uIFhhKGwpe3ZhciB0PWxbZGxdO2lmKHQpcmV0dXJuIHQ7Zm9yKHZhciBhPWwucGFyZW50Tm9kZTthOyl7aWYodD1hW1FhXXx8YVtkbF0pe2lmKGE9dC5hbHRlcm5hdGUsdC5jaGlsZCE9PW51bGx8fGEhPT1udWxsJiZhLmNoaWxkIT09bnVsbClmb3IobD1DMShsKTtsIT09bnVsbDspe2lmKGE9bFtkbF0pcmV0dXJuIGE7bD1DMShsKX1yZXR1cm4gdH1sPWEsYT1sLnBhcmVudE5vZGV9cmV0dXJuIG51bGx9ZnVuY3Rpb24gR2EobCl7aWYobD1sW2RsXXx8bFtRYV0pe3ZhciB0PWwudGFnO2lmKHQ9PT01fHx0PT09Nnx8dD09PTEzfHx0PT09MzF8fHQ9PT0yNnx8dD09PTI3fHx0PT09MylyZXR1cm4gbH1yZXR1cm4gbnVsbH1mdW5jdGlvbiBNdShsKXt2YXIgdD1sLnRhZztpZih0PT09NXx8dD09PTI2fHx0PT09Mjd8fHQ9PT02KXJldHVybiBsLnN0YXRlTm9kZTt0aHJvdyBFcnJvcihzKDMzKSl9ZnVuY3Rpb24gQ2EobCl7dmFyIHQ9bFtzaV07cmV0dXJuIHR8fCh0PWxbc2ldPXtob2lzdGFibGVTdHlsZXM6bmV3IE1hcCxob2lzdGFibGVTY3JpcHRzOm5ldyBNYXB9KSx0fWZ1bmN0aW9uIG1sKGwpe2xbRXVdPSEwfXZhciBnaT1uZXcgU2V0LGJpPXt9O2Z1bmN0aW9uIHlhKGwsdCl7WmEobCx0KSxaYShsKyJDYXB0dXJlIix0KX1mdW5jdGlvbiBaYShsLHQpe2ZvcihiaVtsXT10LGw9MDtsPHQubGVuZ3RoO2wrKylnaS5hZGQodFtsXSl9dmFyIE55PVJlZ0V4cCgiXls6QS1aX2EtelxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDJGRlxcdTAzNzAtXFx1MDM3RFxcdTAzN0YtXFx1MUZGRlxcdTIwMEMtXFx1MjAwRFxcdTIwNzAtXFx1MjE4RlxcdTJDMDAtXFx1MkZFRlxcdTMwMDEtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZGRF1bOkEtWl9hLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyRkZcXHUwMzcwLVxcdTAzN0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxcdTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkRcXC0uMC05XFx1MDBCN1xcdTAzMDAtXFx1MDM2RlxcdTIwM0YtXFx1MjA0MF0qJCIpLHppPXt9LEFpPXt9O2Z1bmN0aW9uIHF5KGwpe3JldHVybiBqbi5jYWxsKEFpLGwpPyEwOmpuLmNhbGwoemksbCk/ITE6TnkudGVzdChsKT9BaVtsXT0hMDooemlbbF09ITAsITEpfWZ1bmN0aW9uIEVlKGwsdCxhKXtpZihxeSh0KSlpZihhPT09bnVsbClsLnJlbW92ZUF0dHJpYnV0ZSh0KTtlbHNle3N3aXRjaCh0eXBlb2YgYSl7Y2FzZSJ1bmRlZmluZWQiOmNhc2UiZnVuY3Rpb24iOmNhc2Uic3ltYm9sIjpsLnJlbW92ZUF0dHJpYnV0ZSh0KTtyZXR1cm47Y2FzZSJib29sZWFuIjp2YXIgdT10LnRvTG93ZXJDYXNlKCkuc2xpY2UoMCw1KTtpZih1IT09ImRhdGEtIiYmdSE9PSJhcmlhLSIpe2wucmVtb3ZlQXR0cmlidXRlKHQpO3JldHVybn19bC5zZXRBdHRyaWJ1dGUodCwiIithKX19ZnVuY3Rpb24gTWUobCx0LGEpe2lmKGE9PT1udWxsKWwucmVtb3ZlQXR0cmlidXRlKHQpO2Vsc2V7c3dpdGNoKHR5cGVvZiBhKXtjYXNlInVuZGVmaW5lZCI6Y2FzZSJmdW5jdGlvbiI6Y2FzZSJzeW1ib2wiOmNhc2UiYm9vbGVhbiI6bC5yZW1vdmVBdHRyaWJ1dGUodCk7cmV0dXJufWwuc2V0QXR0cmlidXRlKHQsIiIrYSl9fWZ1bmN0aW9uIGR0KGwsdCxhLHUpe2lmKHU9PT1udWxsKWwucmVtb3ZlQXR0cmlidXRlKGEpO2Vsc2V7c3dpdGNoKHR5cGVvZiB1KXtjYXNlInVuZGVmaW5lZCI6Y2FzZSJmdW5jdGlvbiI6Y2FzZSJzeW1ib2wiOmNhc2UiYm9vbGVhbiI6bC5yZW1vdmVBdHRyaWJ1dGUoYSk7cmV0dXJufWwuc2V0QXR0cmlidXRlTlModCxhLCIiK3UpfX1mdW5jdGlvbiB4bChsKXtzd2l0Y2godHlwZW9mIGwpe2Nhc2UiYmlnaW50IjpjYXNlImJvb2xlYW4iOmNhc2UibnVtYmVyIjpjYXNlInN0cmluZyI6Y2FzZSJ1bmRlZmluZWQiOnJldHVybiBsO2Nhc2Uib2JqZWN0IjpyZXR1cm4gbDtkZWZhdWx0OnJldHVybiIifX1mdW5jdGlvbiBUaShsKXt2YXIgdD1sLnR5cGU7cmV0dXJuKGw9bC5ub2RlTmFtZSkmJmwudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJih0PT09ImNoZWNrYm94Inx8dD09PSJyYWRpbyIpfWZ1bmN0aW9uIEJ5KGwsdCxhKXt2YXIgdT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGwuY29uc3RydWN0b3IucHJvdG90eXBlLHQpO2lmKCFsLmhhc093blByb3BlcnR5KHQpJiZ0eXBlb2YgdTwidSImJnR5cGVvZiB1LmdldD09ImZ1bmN0aW9uIiYmdHlwZW9mIHUuc2V0PT0iZnVuY3Rpb24iKXt2YXIgZT11LmdldCxuPXUuc2V0O3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkobCx0LHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGUuY2FsbCh0aGlzKX0sc2V0OmZ1bmN0aW9uKGYpe2E9IiIrZixuLmNhbGwodGhpcyxmKX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkobCx0LHtlbnVtZXJhYmxlOnUuZW51bWVyYWJsZX0pLHtnZXRWYWx1ZTpmdW5jdGlvbigpe3JldHVybiBhfSxzZXRWYWx1ZTpmdW5jdGlvbihmKXthPSIiK2Z9LHN0b3BUcmFja2luZzpmdW5jdGlvbigpe2wuX3ZhbHVlVHJhY2tlcj1udWxsLGRlbGV0ZSBsW3RdfX19fWZ1bmN0aW9uIHduKGwpe2lmKCFsLl92YWx1ZVRyYWNrZXIpe3ZhciB0PVRpKGwpPyJjaGVja2VkIjoidmFsdWUiO2wuX3ZhbHVlVHJhY2tlcj1CeShsLHQsIiIrbFt0XSl9fWZ1bmN0aW9uIG9pKGwpe2lmKCFsKXJldHVybiExO3ZhciB0PWwuX3ZhbHVlVHJhY2tlcjtpZighdClyZXR1cm4hMDt2YXIgYT10LmdldFZhbHVlKCksdT0iIjtyZXR1cm4gbCYmKHU9VGkobCk/bC5jaGVja2VkPyJ0cnVlIjoiZmFsc2UiOmwudmFsdWUpLGw9dSxsIT09YT8odC5zZXRWYWx1ZShsKSwhMCk6ITF9ZnVuY3Rpb24gT2UobCl7aWYobD1sfHwodHlwZW9mIGRvY3VtZW50PCJ1Ij9kb2N1bWVudDp2b2lkIDApLHR5cGVvZiBsPiJ1IilyZXR1cm4gbnVsbDt0cnl7cmV0dXJuIGwuYWN0aXZlRWxlbWVudHx8bC5ib2R5fWNhdGNoe3JldHVybiBsLmJvZHl9fXZhciBZeT0vW1xuIlxcXS9nO2Z1bmN0aW9uIExsKGwpe3JldHVybiBsLnJlcGxhY2UoWXksZnVuY3Rpb24odCl7cmV0dXJuIlxcIit0LmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpKyIgIn0pfWZ1bmN0aW9uICRuKGwsdCxhLHUsZSxuLGYsYyl7bC5uYW1lPSIiLGYhPW51bGwmJnR5cGVvZiBmIT0iZnVuY3Rpb24iJiZ0eXBlb2YgZiE9InN5bWJvbCImJnR5cGVvZiBmIT0iYm9vbGVhbiI/bC50eXBlPWY6bC5yZW1vdmVBdHRyaWJ1dGUoInR5cGUiKSx0IT1udWxsP2Y9PT0ibnVtYmVyIj8odD09PTAmJmwudmFsdWU9PT0iInx8bC52YWx1ZSE9dCkmJihsLnZhbHVlPSIiK3hsKHQpKTpsLnZhbHVlIT09IiIreGwodCkmJihsLnZhbHVlPSIiK3hsKHQpKTpmIT09InN1Ym1pdCImJmYhPT0icmVzZXQifHxsLnJlbW92ZUF0dHJpYnV0ZSgidmFsdWUiKSx0IT1udWxsP0ZuKGwsZix4bCh0KSk6YSE9bnVsbD9GbihsLGYseGwoYSkpOnUhPW51bGwmJmwucmVtb3ZlQXR0cmlidXRlKCJ2YWx1ZSIpLGU9PW51bGwmJm4hPW51bGwmJihsLmRlZmF1bHRDaGVja2VkPSEhbiksZSE9bnVsbCYmKGwuY2hlY2tlZD1lJiZ0eXBlb2YgZSE9ImZ1bmN0aW9uIiYmdHlwZW9mIGUhPSJzeW1ib2wiKSxjIT1udWxsJiZ0eXBlb2YgYyE9ImZ1bmN0aW9uIiYmdHlwZW9mIGMhPSJzeW1ib2wiJiZ0eXBlb2YgYyE9ImJvb2xlYW4iP2wubmFtZT0iIit4bChjKTpsLnJlbW92ZUF0dHJpYnV0ZSgibmFtZSIpfWZ1bmN0aW9uIEVpKGwsdCxhLHUsZSxuLGYsYyl7aWYobiE9bnVsbCYmdHlwZW9mIG4hPSJmdW5jdGlvbiImJnR5cGVvZiBuIT0ic3ltYm9sIiYmdHlwZW9mIG4hPSJib29sZWFuIiYmKGwudHlwZT1uKSx0IT1udWxsfHxhIT1udWxsKXtpZighKG4hPT0ic3VibWl0IiYmbiE9PSJyZXNldCJ8fHQhPW51bGwpKXt3bihsKTtyZXR1cm59YT1hIT1udWxsPyIiK3hsKGEpOiIiLHQ9dCE9bnVsbD8iIit4bCh0KTphLGN8fHQ9PT1sLnZhbHVlfHwobC52YWx1ZT10KSxsLmRlZmF1bHRWYWx1ZT10fXU9dT8/ZSx1PXR5cGVvZiB1IT0iZnVuY3Rpb24iJiZ0eXBlb2YgdSE9InN5bWJvbCImJiEhdSxsLmNoZWNrZWQ9Yz9sLmNoZWNrZWQ6ISF1LGwuZGVmYXVsdENoZWNrZWQ9ISF1LGYhPW51bGwmJnR5cGVvZiBmIT0iZnVuY3Rpb24iJiZ0eXBlb2YgZiE9InN5bWJvbCImJnR5cGVvZiBmIT0iYm9vbGVhbiImJihsLm5hbWU9Ziksd24obCl9ZnVuY3Rpb24gRm4obCx0LGEpe3Q9PT0ibnVtYmVyIiYmT2UobC5vd25lckRvY3VtZW50KT09PWx8fGwuZGVmYXVsdFZhbHVlPT09IiIrYXx8KGwuZGVmYXVsdFZhbHVlPSIiK2EpfWZ1bmN0aW9uIFJhKGwsdCxhLHUpe2lmKGw9bC5vcHRpb25zLHQpe3Q9e307Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspdFsiJCIrYVtlXV09ITA7Zm9yKGE9MDthPGwubGVuZ3RoO2ErKyllPXQuaGFzT3duUHJvcGVydHkoIiQiK2xbYV0udmFsdWUpLGxbYV0uc2VsZWN0ZWQhPT1lJiYobFthXS5zZWxlY3RlZD1lKSxlJiZ1JiYobFthXS5kZWZhdWx0U2VsZWN0ZWQ9ITApfWVsc2V7Zm9yKGE9IiIreGwoYSksdD1udWxsLGU9MDtlPGwubGVuZ3RoO2UrKyl7aWYobFtlXS52YWx1ZT09PWEpe2xbZV0uc2VsZWN0ZWQ9ITAsdSYmKGxbZV0uZGVmYXVsdFNlbGVjdGVkPSEwKTtyZXR1cm59dCE9PW51bGx8fGxbZV0uZGlzYWJsZWR8fCh0PWxbZV0pfXQhPT1udWxsJiYodC5zZWxlY3RlZD0hMCl9fWZ1bmN0aW9uIE1pKGwsdCxhKXtpZih0IT1udWxsJiYodD0iIit4bCh0KSx0IT09bC52YWx1ZSYmKGwudmFsdWU9dCksYT09bnVsbCkpe2wuZGVmYXVsdFZhbHVlIT09dCYmKGwuZGVmYXVsdFZhbHVlPXQpO3JldHVybn1sLmRlZmF1bHRWYWx1ZT1hIT1udWxsPyIiK3hsKGEpOiIifWZ1bmN0aW9uIE9pKGwsdCxhLHUpe2lmKHQ9PW51bGwpe2lmKHUhPW51bGwpe2lmKGEhPW51bGwpdGhyb3cgRXJyb3Iocyg5MikpO2lmKGh0KHUpKXtpZigxPHUubGVuZ3RoKXRocm93IEVycm9yKHMoOTMpKTt1PXVbMF19YT11fWE9PW51bGwmJihhPSIiKSx0PWF9YT14bCh0KSxsLmRlZmF1bHRWYWx1ZT1hLHU9bC50ZXh0Q29udGVudCx1PT09YSYmdSE9PSIiJiZ1IT09bnVsbCYmKGwudmFsdWU9dSksd24obCl9ZnVuY3Rpb24gamEobCx0KXtpZih0KXt2YXIgYT1sLmZpcnN0Q2hpbGQ7aWYoYSYmYT09PWwubGFzdENoaWxkJiZhLm5vZGVUeXBlPT09Myl7YS5ub2RlVmFsdWU9dDtyZXR1cm59fWwudGV4dENvbnRlbnQ9dH12YXIgUXk9bmV3IFNldCgiYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQgYXNwZWN0UmF0aW8gYm9yZGVySW1hZ2VPdXRzZXQgYm9yZGVySW1hZ2VTbGljZSBib3JkZXJJbWFnZVdpZHRoIGJveEZsZXggYm94RmxleEdyb3VwIGJveE9yZGluYWxHcm91cCBjb2x1bW5Db3VudCBjb2x1bW5zIGZsZXggZmxleEdyb3cgZmxleFBvc2l0aXZlIGZsZXhTaHJpbmsgZmxleE5lZ2F0aXZlIGZsZXhPcmRlciBncmlkQXJlYSBncmlkUm93IGdyaWRSb3dFbmQgZ3JpZFJvd1NwYW4gZ3JpZFJvd1N0YXJ0IGdyaWRDb2x1bW4gZ3JpZENvbHVtbkVuZCBncmlkQ29sdW1uU3BhbiBncmlkQ29sdW1uU3RhcnQgZm9udFdlaWdodCBsaW5lQ2xhbXAgbGluZUhlaWdodCBvcGFjaXR5IG9yZGVyIG9ycGhhbnMgc2NhbGUgdGFiU2l6ZSB3aWRvd3MgekluZGV4IHpvb20gZmlsbE9wYWNpdHkgZmxvb2RPcGFjaXR5IHN0b3BPcGFjaXR5IHN0cm9rZURhc2hhcnJheSBzdHJva2VEYXNob2Zmc2V0IHN0cm9rZU1pdGVybGltaXQgc3Ryb2tlT3BhY2l0eSBzdHJva2VXaWR0aCBNb3pBbmltYXRpb25JdGVyYXRpb25Db3VudCBNb3pCb3hGbGV4IE1vekJveEZsZXhHcm91cCBNb3pMaW5lQ2xhbXAgbXNBbmltYXRpb25JdGVyYXRpb25Db3VudCBtc0ZsZXggbXNab29tIG1zRmxleEdyb3cgbXNGbGV4TmVnYXRpdmUgbXNGbGV4T3JkZXIgbXNGbGV4UG9zaXRpdmUgbXNGbGV4U2hyaW5rIG1zR3JpZENvbHVtbiBtc0dyaWRDb2x1bW5TcGFuIG1zR3JpZFJvdyBtc0dyaWRSb3dTcGFuIFdlYmtpdEFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50IFdlYmtpdEJveEZsZXggV2ViS2l0Qm94RmxleEdyb3VwIFdlYmtpdEJveE9yZGluYWxHcm91cCBXZWJraXRDb2x1bW5Db3VudCBXZWJraXRDb2x1bW5zIFdlYmtpdEZsZXggV2Via2l0RmxleEdyb3cgV2Via2l0RmxleFBvc2l0aXZlIFdlYmtpdEZsZXhTaHJpbmsgV2Via2l0TGluZUNsYW1wIi5zcGxpdCgiICIpKTtmdW5jdGlvbiBEaShsLHQsYSl7dmFyIHU9dC5pbmRleE9mKCItLSIpPT09MDthPT1udWxsfHx0eXBlb2YgYT09ImJvb2xlYW4ifHxhPT09IiI/dT9sLnNldFByb3BlcnR5KHQsIiIpOnQ9PT0iZmxvYXQiP2wuY3NzRmxvYXQ9IiI6bFt0XT0iIjp1P2wuc2V0UHJvcGVydHkodCxhKTp0eXBlb2YgYSE9Im51bWJlciJ8fGE9PT0wfHxReS5oYXModCk/dD09PSJmbG9hdCI/bC5jc3NGbG9hdD1hOmxbdF09KCIiK2EpLnRyaW0oKTpsW3RdPWErInB4In1mdW5jdGlvbiBVaShsLHQsYSl7aWYodCE9bnVsbCYmdHlwZW9mIHQhPSJvYmplY3QiKXRocm93IEVycm9yKHMoNjIpKTtpZihsPWwuc3R5bGUsYSE9bnVsbCl7Zm9yKHZhciB1IGluIGEpIWEuaGFzT3duUHJvcGVydHkodSl8fHQhPW51bGwmJnQuaGFzT3duUHJvcGVydHkodSl8fCh1LmluZGV4T2YoIi0tIik9PT0wP2wuc2V0UHJvcGVydHkodSwiIik6dT09PSJmbG9hdCI/bC5jc3NGbG9hdD0iIjpsW3VdPSIiKTtmb3IodmFyIGUgaW4gdCl1PXRbZV0sdC5oYXNPd25Qcm9wZXJ0eShlKSYmYVtlXSE9PXUmJkRpKGwsZSx1KX1lbHNlIGZvcih2YXIgbiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJkRpKGwsbix0W25dKX1mdW5jdGlvbiBybihsKXtpZihsLmluZGV4T2YoIi0iKT09PS0xKXJldHVybiExO3N3aXRjaChsKXtjYXNlImFubm90YXRpb24teG1sIjpjYXNlImNvbG9yLXByb2ZpbGUiOmNhc2UiZm9udC1mYWNlIjpjYXNlImZvbnQtZmFjZS1zcmMiOmNhc2UiZm9udC1mYWNlLXVyaSI6Y2FzZSJmb250LWZhY2UtZm9ybWF0IjpjYXNlImZvbnQtZmFjZS1uYW1lIjpjYXNlIm1pc3NpbmctZ2x5cGgiOnJldHVybiExO2RlZmF1bHQ6cmV0dXJuITB9fXZhciBYeT1uZXcgTWFwKFtbImFjY2VwdENoYXJzZXQiLCJhY2NlcHQtY2hhcnNldCJdLFsiaHRtbEZvciIsImZvciJdLFsiaHR0cEVxdWl2IiwiaHR0cC1lcXVpdiJdLFsiY3Jvc3NPcmlnaW4iLCJjcm9zc29yaWdpbiJdLFsiYWNjZW50SGVpZ2h0IiwiYWNjZW50LWhlaWdodCJdLFsiYWxpZ25tZW50QmFzZWxpbmUiLCJhbGlnbm1lbnQtYmFzZWxpbmUiXSxbImFyYWJpY0Zvcm0iLCJhcmFiaWMtZm9ybSJdLFsiYmFzZWxpbmVTaGlmdCIsImJhc2VsaW5lLXNoaWZ0Il0sWyJjYXBIZWlnaHQiLCJjYXAtaGVpZ2h0Il0sWyJjbGlwUGF0aCIsImNsaXAtcGF0aCJdLFsiY2xpcFJ1bGUiLCJjbGlwLXJ1bGUiXSxbImNvbG9ySW50ZXJwb2xhdGlvbiIsImNvbG9yLWludGVycG9sYXRpb24iXSxbImNvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnMiLCJjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMiXSxbImNvbG9yUHJvZmlsZSIsImNvbG9yLXByb2ZpbGUiXSxbImNvbG9yUmVuZGVyaW5nIiwiY29sb3ItcmVuZGVyaW5nIl0sWyJkb21pbmFudEJhc2VsaW5lIiwiZG9taW5hbnQtYmFzZWxpbmUiXSxbImVuYWJsZUJhY2tncm91bmQiLCJlbmFibGUtYmFja2dyb3VuZCJdLFsiZmlsbE9wYWNpdHkiLCJmaWxsLW9wYWNpdHkiXSxbImZpbGxSdWxlIiwiZmlsbC1ydWxlIl0sWyJmbG9vZENvbG9yIiwiZmxvb2QtY29sb3IiXSxbImZsb29kT3BhY2l0eSIsImZsb29kLW9wYWNpdHkiXSxbImZvbnRGYW1pbHkiLCJmb250LWZhbWlseSJdLFsiZm9udFNpemUiLCJmb250LXNpemUiXSxbImZvbnRTaXplQWRqdXN0IiwiZm9udC1zaXplLWFkanVzdCJdLFsiZm9udFN0cmV0Y2giLCJmb250LXN0cmV0Y2giXSxbImZvbnRTdHlsZSIsImZvbnQtc3R5bGUiXSxbImZvbnRWYXJpYW50IiwiZm9udC12YXJpYW50Il0sWyJmb250V2VpZ2h0IiwiZm9udC13ZWlnaHQiXSxbImdseXBoTmFtZSIsImdseXBoLW5hbWUiXSxbImdseXBoT3JpZW50YXRpb25Ib3Jpem9udGFsIiwiZ2x5cGgtb3JpZW50YXRpb24taG9yaXpvbnRhbCJdLFsiZ2x5cGhPcmllbnRhdGlvblZlcnRpY2FsIiwiZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwiXSxbImhvcml6QWR2WCIsImhvcml6LWFkdi14Il0sWyJob3Jpek9yaWdpblgiLCJob3Jpei1vcmlnaW4teCJdLFsiaW1hZ2VSZW5kZXJpbmciLCJpbWFnZS1yZW5kZXJpbmciXSxbImxldHRlclNwYWNpbmciLCJsZXR0ZXItc3BhY2luZyJdLFsibGlnaHRpbmdDb2xvciIsImxpZ2h0aW5nLWNvbG9yIl0sWyJtYXJrZXJFbmQiLCJtYXJrZXItZW5kIl0sWyJtYXJrZXJNaWQiLCJtYXJrZXItbWlkIl0sWyJtYXJrZXJTdGFydCIsIm1hcmtlci1zdGFydCJdLFsib3ZlcmxpbmVQb3NpdGlvbiIsIm92ZXJsaW5lLXBvc2l0aW9uIl0sWyJvdmVybGluZVRoaWNrbmVzcyIsIm92ZXJsaW5lLXRoaWNrbmVzcyJdLFsicGFpbnRPcmRlciIsInBhaW50LW9yZGVyIl0sWyJwYW5vc2UtMSIsInBhbm9zZS0xIl0sWyJwb2ludGVyRXZlbnRzIiwicG9pbnRlci1ldmVudHMiXSxbInJlbmRlcmluZ0ludGVudCIsInJlbmRlcmluZy1pbnRlbnQiXSxbInNoYXBlUmVuZGVyaW5nIiwic2hhcGUtcmVuZGVyaW5nIl0sWyJzdG9wQ29sb3IiLCJzdG9wLWNvbG9yIl0sWyJzdG9wT3BhY2l0eSIsInN0b3Atb3BhY2l0eSJdLFsic3RyaWtldGhyb3VnaFBvc2l0aW9uIiwic3RyaWtldGhyb3VnaC1wb3NpdGlvbiJdLFsic3RyaWtldGhyb3VnaFRoaWNrbmVzcyIsInN0cmlrZXRocm91Z2gtdGhpY2tuZXNzIl0sWyJzdHJva2VEYXNoYXJyYXkiLCJzdHJva2UtZGFzaGFycmF5Il0sWyJzdHJva2VEYXNob2Zmc2V0Iiwic3Ryb2tlLWRhc2hvZmZzZXQiXSxbInN0cm9rZUxpbmVjYXAiLCJzdHJva2UtbGluZWNhcCJdLFsic3Ryb2tlTGluZWpvaW4iLCJzdHJva2UtbGluZWpvaW4iXSxbInN0cm9rZU1pdGVybGltaXQiLCJzdHJva2UtbWl0ZXJsaW1pdCJdLFsic3Ryb2tlT3BhY2l0eSIsInN0cm9rZS1vcGFjaXR5Il0sWyJzdHJva2VXaWR0aCIsInN0cm9rZS13aWR0aCJdLFsidGV4dEFuY2hvciIsInRleHQtYW5jaG9yIl0sWyJ0ZXh0RGVjb3JhdGlvbiIsInRleHQtZGVjb3JhdGlvbiJdLFsidGV4dFJlbmRlcmluZyIsInRleHQtcmVuZGVyaW5nIl0sWyJ0cmFuc2Zvcm1PcmlnaW4iLCJ0cmFuc2Zvcm0tb3JpZ2luIl0sWyJ1bmRlcmxpbmVQb3NpdGlvbiIsInVuZGVybGluZS1wb3NpdGlvbiJdLFsidW5kZXJsaW5lVGhpY2tuZXNzIiwidW5kZXJsaW5lLXRoaWNrbmVzcyJdLFsidW5pY29kZUJpZGkiLCJ1bmljb2RlLWJpZGkiXSxbInVuaWNvZGVSYW5nZSIsInVuaWNvZGUtcmFuZ2UiXSxbInVuaXRzUGVyRW0iLCJ1bml0cy1wZXItZW0iXSxbInZBbHBoYWJldGljIiwidi1hbHBoYWJldGljIl0sWyJ2SGFuZ2luZyIsInYtaGFuZ2luZyJdLFsidklkZW9ncmFwaGljIiwidi1pZGVvZ3JhcGhpYyJdLFsidk1hdGhlbWF0aWNhbCIsInYtbWF0aGVtYXRpY2FsIl0sWyJ2ZWN0b3JFZmZlY3QiLCJ2ZWN0b3ItZWZmZWN0Il0sWyJ2ZXJ0QWR2WSIsInZlcnQtYWR2LXkiXSxbInZlcnRPcmlnaW5YIiwidmVydC1vcmlnaW4teCJdLFsidmVydE9yaWdpblkiLCJ2ZXJ0LW9yaWdpbi15Il0sWyJ3b3JkU3BhY2luZyIsIndvcmQtc3BhY2luZyJdLFsid3JpdGluZ01vZGUiLCJ3cml0aW5nLW1vZGUiXSxbInhtbG5zWGxpbmsiLCJ4bWxuczp4bGluayJdLFsieEhlaWdodCIsIngtaGVpZ2h0Il1dKSxHeT0vXltcdTAwMDAtXHUwMDFGIF0qaltcclxuXHRdKmFbXHJcblx0XSp2W1xyXG5cdF0qYVtcclxuXHRdKnNbXHJcblx0XSpjW1xyXG5cdF0qcltcclxuXHRdKmlbXHJcblx0XSpwW1xyXG5cdF0qdFtcclxuXHRdKjovaTtmdW5jdGlvbiBEZShsKXtyZXR1cm4gR3kudGVzdCgiIitsKT8iamF2YXNjcmlwdDp0aHJvdyBuZXcgRXJyb3IoJ1JlYWN0IGhhcyBibG9ja2VkIGEgamF2YXNjcmlwdDogVVJMIGFzIGEgc2VjdXJpdHkgcHJlY2F1dGlvbi4nKSI6bH1mdW5jdGlvbiBTdCgpe312YXIga249bnVsbDtmdW5jdGlvbiBJbihsKXtyZXR1cm4gbD1sLnRhcmdldHx8bC5zcmNFbGVtZW50fHx3aW5kb3csbC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCYmKGw9bC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCksbC5ub2RlVHlwZT09PTM/bC5wYXJlbnROb2RlOmx9dmFyIFZhPW51bGwscGE9bnVsbDtmdW5jdGlvbiBfaShsKXt2YXIgdD1HYShsKTtpZih0JiYobD10LnN0YXRlTm9kZSkpe3ZhciBhPWxbb2xdfHxudWxsO2w6c3dpdGNoKGw9dC5zdGF0ZU5vZGUsdC50eXBlKXtjYXNlImlucHV0IjppZigkbihsLGEudmFsdWUsYS5kZWZhdWx0VmFsdWUsYS5kZWZhdWx0VmFsdWUsYS5jaGVja2VkLGEuZGVmYXVsdENoZWNrZWQsYS50eXBlLGEubmFtZSksdD1hLm5hbWUsYS50eXBlPT09InJhZGlvIiYmdCE9bnVsbCl7Zm9yKGE9bDthLnBhcmVudE5vZGU7KWE9YS5wYXJlbnROb2RlO2ZvcihhPWEucXVlcnlTZWxlY3RvckFsbCgnaW5wdXRbbmFtZT0iJytMbCgiIit0KSsnIl1bdHlwZT0icmFkaW8iXScpLHQ9MDt0PGEubGVuZ3RoO3QrKyl7dmFyIHU9YVt0XTtpZih1IT09bCYmdS5mb3JtPT09bC5mb3JtKXt2YXIgZT11W29sXXx8bnVsbDtpZighZSl0aHJvdyBFcnJvcihzKDkwKSk7JG4odSxlLnZhbHVlLGUuZGVmYXVsdFZhbHVlLGUuZGVmYXVsdFZhbHVlLGUuY2hlY2tlZCxlLmRlZmF1bHRDaGVja2VkLGUudHlwZSxlLm5hbWUpfX1mb3IodD0wO3Q8YS5sZW5ndGg7dCsrKXU9YVt0XSx1LmZvcm09PT1sLmZvcm0mJm9pKHUpfWJyZWFrIGw7Y2FzZSJ0ZXh0YXJlYSI6TWkobCxhLnZhbHVlLGEuZGVmYXVsdFZhbHVlKTticmVhayBsO2Nhc2Uic2VsZWN0Ijp0PWEudmFsdWUsdCE9bnVsbCYmUmEobCwhIWEubXVsdGlwbGUsdCwhMSl9fX12YXIgUG49ITE7ZnVuY3Rpb24gSGkobCx0LGEpe2lmKFBuKXJldHVybiBsKHQsYSk7UG49ITA7dHJ5e3ZhciB1PWwodCk7cmV0dXJuIHV9ZmluYWxseXtpZihQbj0hMSwoVmEhPT1udWxsfHxwYSE9PW51bGwpJiYoZG4oKSxWYSYmKHQ9VmEsbD1wYSxwYT1WYT1udWxsLF9pKHQpLGwpKSlmb3IodD0wO3Q8bC5sZW5ndGg7dCsrKV9pKGxbdF0pfX1mdW5jdGlvbiBPdShsLHQpe3ZhciBhPWwuc3RhdGVOb2RlO2lmKGE9PT1udWxsKXJldHVybiBudWxsO3ZhciB1PWFbb2xdfHxudWxsO2lmKHU9PT1udWxsKXJldHVybiBudWxsO2E9dVt0XTtsOnN3aXRjaCh0KXtjYXNlIm9uQ2xpY2siOmNhc2Uib25DbGlja0NhcHR1cmUiOmNhc2Uib25Eb3VibGVDbGljayI6Y2FzZSJvbkRvdWJsZUNsaWNrQ2FwdHVyZSI6Y2FzZSJvbk1vdXNlRG93biI6Y2FzZSJvbk1vdXNlRG93bkNhcHR1cmUiOmNhc2Uib25Nb3VzZU1vdmUiOmNhc2Uib25Nb3VzZU1vdmVDYXB0dXJlIjpjYXNlIm9uTW91c2VVcCI6Y2FzZSJvbk1vdXNlVXBDYXB0dXJlIjpjYXNlIm9uTW91c2VFbnRlciI6KHU9IXUuZGlzYWJsZWQpfHwobD1sLnR5cGUsdT0hKGw9PT0iYnV0dG9uInx8bD09PSJpbnB1dCJ8fGw9PT0ic2VsZWN0Inx8bD09PSJ0ZXh0YXJlYSIpKSxsPSF1O2JyZWFrIGw7ZGVmYXVsdDpsPSExfWlmKGwpcmV0dXJuIG51bGw7aWYoYSYmdHlwZW9mIGEhPSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IocygyMzEsdCx0eXBlb2YgYSkpO3JldHVybiBhfXZhciBzdD0hKHR5cGVvZiB3aW5kb3c+InUifHx0eXBlb2Ygd2luZG93LmRvY3VtZW50PiJ1Inx8dHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50PiJ1IiksbGY9ITE7aWYoc3QpdHJ5e3ZhciBEdT17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoRHUsInBhc3NpdmUiLHtnZXQ6ZnVuY3Rpb24oKXtsZj0hMH19KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsRHUsRHUpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0IixEdSxEdSl9Y2F0Y2h7bGY9ITF9dmFyIEN0PW51bGwsdGY9bnVsbCxVZT1udWxsO2Z1bmN0aW9uIE5pKCl7aWYoVWUpcmV0dXJuIFVlO3ZhciBsLHQ9dGYsYT10Lmxlbmd0aCx1LGU9InZhbHVlImluIEN0P0N0LnZhbHVlOkN0LnRleHRDb250ZW50LG49ZS5sZW5ndGg7Zm9yKGw9MDtsPGEmJnRbbF09PT1lW2xdO2wrKyk7dmFyIGY9YS1sO2Zvcih1PTE7dTw9ZiYmdFthLXVdPT09ZVtuLXVdO3UrKyk7cmV0dXJuIFVlPWUuc2xpY2UobCwxPHU/MS11OnZvaWQgMCl9ZnVuY3Rpb24gX2UobCl7dmFyIHQ9bC5rZXlDb2RlO3JldHVybiJjaGFyQ29kZSJpbiBsPyhsPWwuY2hhckNvZGUsbD09PTAmJnQ9PT0xMyYmKGw9MTMpKTpsPXQsbD09PTEwJiYobD0xMyksMzI8PWx8fGw9PT0xMz9sOjB9ZnVuY3Rpb24gSGUoKXtyZXR1cm4hMH1mdW5jdGlvbiBxaSgpe3JldHVybiExfWZ1bmN0aW9uIEVsKGwpe2Z1bmN0aW9uIHQoYSx1LGUsbixmKXt0aGlzLl9yZWFjdE5hbWU9YSx0aGlzLl90YXJnZXRJbnN0PWUsdGhpcy50eXBlPXUsdGhpcy5uYXRpdmVFdmVudD1uLHRoaXMudGFyZ2V0PWYsdGhpcy5jdXJyZW50VGFyZ2V0PW51bGw7Zm9yKHZhciBjIGluIGwpbC5oYXNPd25Qcm9wZXJ0eShjKSYmKGE9bFtjXSx0aGlzW2NdPWE/YShuKTpuW2NdKTtyZXR1cm4gdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9KG4uZGVmYXVsdFByZXZlbnRlZCE9bnVsbD9uLmRlZmF1bHRQcmV2ZW50ZWQ6bi5yZXR1cm5WYWx1ZT09PSExKT9IZTpxaSx0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPXFpLHRoaXN9cmV0dXJuIF8odC5wcm90b3R5cGUse3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dGhpcy5kZWZhdWx0UHJldmVudGVkPSEwO3ZhciBhPXRoaXMubmF0aXZlRXZlbnQ7YSYmKGEucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOnR5cGVvZiBhLnJldHVyblZhbHVlIT0idW5rbm93biImJihhLnJldHVyblZhbHVlPSExKSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1IZSl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMubmF0aXZlRXZlbnQ7YSYmKGEuc3RvcFByb3BhZ2F0aW9uP2Euc3RvcFByb3BhZ2F0aW9uKCk6dHlwZW9mIGEuY2FuY2VsQnViYmxlIT0idW5rbm93biImJihhLmNhbmNlbEJ1YmJsZT0hMCksdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD1IZSl9LHBlcnNpc3Q6ZnVuY3Rpb24oKXt9LGlzUGVyc2lzdGVudDpIZX0pLHR9dmFyIG1hPXtldmVudFBoYXNlOjAsYnViYmxlczowLGNhbmNlbGFibGU6MCx0aW1lU3RhbXA6ZnVuY3Rpb24obCl7cmV0dXJuIGwudGltZVN0YW1wfHxEYXRlLm5vdygpfSxkZWZhdWx0UHJldmVudGVkOjAsaXNUcnVzdGVkOjB9LE5lPUVsKG1hKSxVdT1fKHt9LG1hLHt2aWV3OjAsZGV0YWlsOjB9KSxDeT1FbChVdSksYWYsdWYsX3UscWU9Xyh7fSxVdSx7c2NyZWVuWDowLHNjcmVlblk6MCxjbGllbnRYOjAsY2xpZW50WTowLHBhZ2VYOjAscGFnZVk6MCxjdHJsS2V5OjAsc2hpZnRLZXk6MCxhbHRLZXk6MCxtZXRhS2V5OjAsZ2V0TW9kaWZpZXJTdGF0ZTpuZixidXR0b246MCxidXR0b25zOjAscmVsYXRlZFRhcmdldDpmdW5jdGlvbihsKXtyZXR1cm4gbC5yZWxhdGVkVGFyZ2V0PT09dm9pZCAwP2wuZnJvbUVsZW1lbnQ9PT1sLnNyY0VsZW1lbnQ/bC50b0VsZW1lbnQ6bC5mcm9tRWxlbWVudDpsLnJlbGF0ZWRUYXJnZXR9LG1vdmVtZW50WDpmdW5jdGlvbihsKXtyZXR1cm4ibW92ZW1lbnRYImluIGw/bC5tb3ZlbWVudFg6KGwhPT1fdSYmKF91JiZsLnR5cGU9PT0ibW91c2Vtb3ZlIj8oYWY9bC5zY3JlZW5YLV91LnNjcmVlblgsdWY9bC5zY3JlZW5ZLV91LnNjcmVlblkpOnVmPWFmPTAsX3U9bCksYWYpfSxtb3ZlbWVudFk6ZnVuY3Rpb24obCl7cmV0dXJuIm1vdmVtZW50WSJpbiBsP2wubW92ZW1lbnRZOnVmfX0pLEJpPUVsKHFlKSxaeT1fKHt9LHFlLHtkYXRhVHJhbnNmZXI6MH0pLFJ5PUVsKFp5KSxqeT1fKHt9LFV1LHtyZWxhdGVkVGFyZ2V0OjB9KSxlZj1FbChqeSksVnk9Xyh7fSxtYSx7YW5pbWF0aW9uTmFtZTowLGVsYXBzZWRUaW1lOjAscHNldWRvRWxlbWVudDowfSkscHk9RWwoVnkpLEt5PV8oe30sbWEse2NsaXBib2FyZERhdGE6ZnVuY3Rpb24obCl7cmV0dXJuImNsaXBib2FyZERhdGEiaW4gbD9sLmNsaXBib2FyZERhdGE6d2luZG93LmNsaXBib2FyZERhdGF9fSkseHk9RWwoS3kpLEx5PV8oe30sbWEse2RhdGE6MH0pLFlpPUVsKEx5KSxKeT17RXNjOiJFc2NhcGUiLFNwYWNlYmFyOiIgIixMZWZ0OiJBcnJvd0xlZnQiLFVwOiJBcnJvd1VwIixSaWdodDoiQXJyb3dSaWdodCIsRG93bjoiQXJyb3dEb3duIixEZWw6IkRlbGV0ZSIsV2luOiJPUyIsTWVudToiQ29udGV4dE1lbnUiLEFwcHM6IkNvbnRleHRNZW51IixTY3JvbGw6IlNjcm9sbExvY2siLE1velByaW50YWJsZUtleToiVW5pZGVudGlmaWVkIn0sV3k9ezg6IkJhY2tzcGFjZSIsOToiVGFiIiwxMjoiQ2xlYXIiLDEzOiJFbnRlciIsMTY6IlNoaWZ0IiwxNzoiQ29udHJvbCIsMTg6IkFsdCIsMTk6IlBhdXNlIiwyMDoiQ2Fwc0xvY2siLDI3OiJFc2NhcGUiLDMyOiIgIiwzMzoiUGFnZVVwIiwzNDoiUGFnZURvd24iLDM1OiJFbmQiLDM2OiJIb21lIiwzNzoiQXJyb3dMZWZ0IiwzODoiQXJyb3dVcCIsMzk6IkFycm93UmlnaHQiLDQwOiJBcnJvd0Rvd24iLDQ1OiJJbnNlcnQiLDQ2OiJEZWxldGUiLDExMjoiRjEiLDExMzoiRjIiLDExNDoiRjMiLDExNToiRjQiLDExNjoiRjUiLDExNzoiRjYiLDExODoiRjciLDExOToiRjgiLDEyMDoiRjkiLDEyMToiRjEwIiwxMjI6IkYxMSIsMTIzOiJGMTIiLDE0NDoiTnVtTG9jayIsMTQ1OiJTY3JvbGxMb2NrIiwyMjQ6Ik1ldGEifSx3eT17QWx0OiJhbHRLZXkiLENvbnRyb2w6ImN0cmxLZXkiLE1ldGE6Im1ldGFLZXkiLFNoaWZ0OiJzaGlmdEtleSJ9O2Z1bmN0aW9uICR5KGwpe3ZhciB0PXRoaXMubmF0aXZlRXZlbnQ7cmV0dXJuIHQuZ2V0TW9kaWZpZXJTdGF0ZT90LmdldE1vZGlmaWVyU3RhdGUobCk6KGw9d3lbbF0pPyEhdFtsXTohMX1mdW5jdGlvbiBuZigpe3JldHVybiAkeX12YXIgRnk9Xyh7fSxVdSx7a2V5OmZ1bmN0aW9uKGwpe2lmKGwua2V5KXt2YXIgdD1KeVtsLmtleV18fGwua2V5O2lmKHQhPT0iVW5pZGVudGlmaWVkIilyZXR1cm4gdH1yZXR1cm4gbC50eXBlPT09ImtleXByZXNzIj8obD1fZShsKSxsPT09MTM/IkVudGVyIjpTdHJpbmcuZnJvbUNoYXJDb2RlKGwpKTpsLnR5cGU9PT0ia2V5ZG93biJ8fGwudHlwZT09PSJrZXl1cCI/V3lbbC5rZXlDb2RlXXx8IlVuaWRlbnRpZmllZCI6IiJ9LGNvZGU6MCxsb2NhdGlvbjowLGN0cmxLZXk6MCxzaGlmdEtleTowLGFsdEtleTowLG1ldGFLZXk6MCxyZXBlYXQ6MCxsb2NhbGU6MCxnZXRNb2RpZmllclN0YXRlOm5mLGNoYXJDb2RlOmZ1bmN0aW9uKGwpe3JldHVybiBsLnR5cGU9PT0ia2V5cHJlc3MiP19lKGwpOjB9LGtleUNvZGU6ZnVuY3Rpb24obCl7cmV0dXJuIGwudHlwZT09PSJrZXlkb3duInx8bC50eXBlPT09ImtleXVwIj9sLmtleUNvZGU6MH0sd2hpY2g6ZnVuY3Rpb24obCl7cmV0dXJuIGwudHlwZT09PSJrZXlwcmVzcyI/X2UobCk6bC50eXBlPT09ImtleWRvd24ifHxsLnR5cGU9PT0ia2V5dXAiP2wua2V5Q29kZTowfX0pLHJ5PUVsKEZ5KSxreT1fKHt9LHFlLHtwb2ludGVySWQ6MCx3aWR0aDowLGhlaWdodDowLHByZXNzdXJlOjAsdGFuZ2VudGlhbFByZXNzdXJlOjAsdGlsdFg6MCx0aWx0WTowLHR3aXN0OjAscG9pbnRlclR5cGU6MCxpc1ByaW1hcnk6MH0pLFFpPUVsKGt5KSxJeT1fKHt9LFV1LHt0b3VjaGVzOjAsdGFyZ2V0VG91Y2hlczowLGNoYW5nZWRUb3VjaGVzOjAsYWx0S2V5OjAsbWV0YUtleTowLGN0cmxLZXk6MCxzaGlmdEtleTowLGdldE1vZGlmaWVyU3RhdGU6bmZ9KSxQeT1FbChJeSksbG09Xyh7fSxtYSx7cHJvcGVydHlOYW1lOjAsZWxhcHNlZFRpbWU6MCxwc2V1ZG9FbGVtZW50OjB9KSx0bT1FbChsbSksYW09Xyh7fSxxZSx7ZGVsdGFYOmZ1bmN0aW9uKGwpe3JldHVybiJkZWx0YVgiaW4gbD9sLmRlbHRhWDoid2hlZWxEZWx0YVgiaW4gbD8tbC53aGVlbERlbHRhWDowfSxkZWx0YVk6ZnVuY3Rpb24obCl7cmV0dXJuImRlbHRhWSJpbiBsP2wuZGVsdGFZOiJ3aGVlbERlbHRhWSJpbiBsPy1sLndoZWVsRGVsdGFZOiJ3aGVlbERlbHRhImluIGw/LWwud2hlZWxEZWx0YTowfSxkZWx0YVo6MCxkZWx0YU1vZGU6MH0pLHVtPUVsKGFtKSxlbT1fKHt9LG1hLHtuZXdTdGF0ZTowLG9sZFN0YXRlOjB9KSxubT1FbChlbSksZm09WzksMTMsMjcsMzJdLGZmPXN0JiYiQ29tcG9zaXRpb25FdmVudCJpbiB3aW5kb3csSHU9bnVsbDtzdCYmImRvY3VtZW50TW9kZSJpbiBkb2N1bWVudCYmKEh1PWRvY3VtZW50LmRvY3VtZW50TW9kZSk7dmFyIGNtPXN0JiYiVGV4dEV2ZW50ImluIHdpbmRvdyYmIUh1LFhpPXN0JiYoIWZmfHxIdSYmODxIdSYmMTE+PUh1KSxHaT0iICIsQ2k9ITE7ZnVuY3Rpb24gWmkobCx0KXtzd2l0Y2gobCl7Y2FzZSJrZXl1cCI6cmV0dXJuIGZtLmluZGV4T2YodC5rZXlDb2RlKSE9PS0xO2Nhc2Uia2V5ZG93biI6cmV0dXJuIHQua2V5Q29kZSE9PTIyOTtjYXNlImtleXByZXNzIjpjYXNlIm1vdXNlZG93biI6Y2FzZSJmb2N1c291dCI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24gUmkobCl7cmV0dXJuIGw9bC5kZXRhaWwsdHlwZW9mIGw9PSJvYmplY3QiJiYiZGF0YSJpbiBsP2wuZGF0YTpudWxsfXZhciBLYT0hMTtmdW5jdGlvbiBpbShsLHQpe3N3aXRjaChsKXtjYXNlImNvbXBvc2l0aW9uZW5kIjpyZXR1cm4gUmkodCk7Y2FzZSJrZXlwcmVzcyI6cmV0dXJuIHQud2hpY2ghPT0zMj9udWxsOihDaT0hMCxHaSk7Y2FzZSJ0ZXh0SW5wdXQiOnJldHVybiBsPXQuZGF0YSxsPT09R2kmJkNpP251bGw6bDtkZWZhdWx0OnJldHVybiBudWxsfX1mdW5jdGlvbiB2bShsLHQpe2lmKEthKXJldHVybiBsPT09ImNvbXBvc2l0aW9uZW5kInx8IWZmJiZaaShsLHQpPyhsPU5pKCksVWU9dGY9Q3Q9bnVsbCxLYT0hMSxsKTpudWxsO3N3aXRjaChsKXtjYXNlInBhc3RlIjpyZXR1cm4gbnVsbDtjYXNlImtleXByZXNzIjppZighKHQuY3RybEtleXx8dC5hbHRLZXl8fHQubWV0YUtleSl8fHQuY3RybEtleSYmdC5hbHRLZXkpe2lmKHQuY2hhciYmMTx0LmNoYXIubGVuZ3RoKXJldHVybiB0LmNoYXI7aWYodC53aGljaClyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh0LndoaWNoKX1yZXR1cm4gbnVsbDtjYXNlImNvbXBvc2l0aW9uZW5kIjpyZXR1cm4gWGkmJnQubG9jYWxlIT09ImtvIj9udWxsOnQuZGF0YTtkZWZhdWx0OnJldHVybiBudWxsfX12YXIgeW09e2NvbG9yOiEwLGRhdGU6ITAsZGF0ZXRpbWU6ITAsImRhdGV0aW1lLWxvY2FsIjohMCxlbWFpbDohMCxtb250aDohMCxudW1iZXI6ITAscGFzc3dvcmQ6ITAscmFuZ2U6ITAsc2VhcmNoOiEwLHRlbDohMCx0ZXh0OiEwLHRpbWU6ITAsdXJsOiEwLHdlZWs6ITB9O2Z1bmN0aW9uIGppKGwpe3ZhciB0PWwmJmwubm9kZU5hbWUmJmwubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gdD09PSJpbnB1dCI/ISF5bVtsLnR5cGVdOnQ9PT0idGV4dGFyZWEifWZ1bmN0aW9uIFZpKGwsdCxhLHUpe1ZhP3BhP3BhLnB1c2godSk6cGE9W3VdOlZhPXUsdD1Ubih0LCJvbkNoYW5nZSIpLDA8dC5sZW5ndGgmJihhPW5ldyBOZSgib25DaGFuZ2UiLCJjaGFuZ2UiLG51bGwsYSx1KSxsLnB1c2goe2V2ZW50OmEsbGlzdGVuZXJzOnR9KSl9dmFyIE51PW51bGwscXU9bnVsbDtmdW5jdGlvbiBtbShsKXtFMShsLDApfWZ1bmN0aW9uIEJlKGwpe3ZhciB0PU11KGwpO2lmKG9pKHQpKXJldHVybiBsfWZ1bmN0aW9uIHBpKGwsdCl7aWYobD09PSJjaGFuZ2UiKXJldHVybiB0fXZhciBLaT0hMTtpZihzdCl7dmFyIGNmO2lmKHN0KXt2YXIgdmY9Im9uaW5wdXQiaW4gZG9jdW1lbnQ7aWYoIXZmKXt2YXIgeGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7eGkuc2V0QXR0cmlidXRlKCJvbmlucHV0IiwicmV0dXJuOyIpLHZmPXR5cGVvZiB4aS5vbmlucHV0PT0iZnVuY3Rpb24ifWNmPXZmfWVsc2UgY2Y9ITE7S2k9Y2YmJighZG9jdW1lbnQuZG9jdW1lbnRNb2RlfHw5PGRvY3VtZW50LmRvY3VtZW50TW9kZSl9ZnVuY3Rpb24gTGkoKXtOdSYmKE51LmRldGFjaEV2ZW50KCJvbnByb3BlcnR5Y2hhbmdlIixKaSkscXU9TnU9bnVsbCl9ZnVuY3Rpb24gSmkobCl7aWYobC5wcm9wZXJ0eU5hbWU9PT0idmFsdWUiJiZCZShxdSkpe3ZhciB0PVtdO1ZpKHQscXUsbCxJbihsKSksSGkobW0sdCl9fWZ1bmN0aW9uIGhtKGwsdCxhKXtsPT09ImZvY3VzaW4iPyhMaSgpLE51PXQscXU9YSxOdS5hdHRhY2hFdmVudCgib25wcm9wZXJ0eWNoYW5nZSIsSmkpKTpsPT09ImZvY3Vzb3V0IiYmTGkoKX1mdW5jdGlvbiBkbShsKXtpZihsPT09InNlbGVjdGlvbmNoYW5nZSJ8fGw9PT0ia2V5dXAifHxsPT09ImtleWRvd24iKXJldHVybiBCZShxdSl9ZnVuY3Rpb24gU20obCx0KXtpZihsPT09ImNsaWNrIilyZXR1cm4gQmUodCl9ZnVuY3Rpb24gc20obCx0KXtpZihsPT09ImlucHV0Inx8bD09PSJjaGFuZ2UiKXJldHVybiBCZSh0KX1mdW5jdGlvbiBnbShsLHQpe3JldHVybiBsPT09dCYmKGwhPT0wfHwxL2w9PT0xL3QpfHxsIT09bCYmdCE9PXR9dmFyIFlsPXR5cGVvZiBPYmplY3QuaXM9PSJmdW5jdGlvbiI/T2JqZWN0LmlzOmdtO2Z1bmN0aW9uIEJ1KGwsdCl7aWYoWWwobCx0KSlyZXR1cm4hMDtpZih0eXBlb2YgbCE9Im9iamVjdCJ8fGw9PT1udWxsfHx0eXBlb2YgdCE9Im9iamVjdCJ8fHQ9PT1udWxsKXJldHVybiExO3ZhciBhPU9iamVjdC5rZXlzKGwpLHU9T2JqZWN0LmtleXModCk7aWYoYS5sZW5ndGghPT11Lmxlbmd0aClyZXR1cm4hMTtmb3IodT0wO3U8YS5sZW5ndGg7dSsrKXt2YXIgZT1hW3VdO2lmKCFqbi5jYWxsKHQsZSl8fCFZbChsW2VdLHRbZV0pKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIFdpKGwpe2Zvcig7bCYmbC5maXJzdENoaWxkOylsPWwuZmlyc3RDaGlsZDtyZXR1cm4gbH1mdW5jdGlvbiB3aShsLHQpe3ZhciBhPVdpKGwpO2w9MDtmb3IodmFyIHU7YTspe2lmKGEubm9kZVR5cGU9PT0zKXtpZih1PWwrYS50ZXh0Q29udGVudC5sZW5ndGgsbDw9dCYmdT49dClyZXR1cm57bm9kZTphLG9mZnNldDp0LWx9O2w9dX1sOntmb3IoO2E7KXtpZihhLm5leHRTaWJsaW5nKXthPWEubmV4dFNpYmxpbmc7YnJlYWsgbH1hPWEucGFyZW50Tm9kZX1hPXZvaWQgMH1hPVdpKGEpfX1mdW5jdGlvbiAkaShsLHQpe3JldHVybiBsJiZ0P2w9PT10PyEwOmwmJmwubm9kZVR5cGU9PT0zPyExOnQmJnQubm9kZVR5cGU9PT0zPyRpKGwsdC5wYXJlbnROb2RlKToiY29udGFpbnMiaW4gbD9sLmNvbnRhaW5zKHQpOmwuY29tcGFyZURvY3VtZW50UG9zaXRpb24/ISEobC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0KSYxNik6ITE6ITF9ZnVuY3Rpb24gRmkobCl7bD1sIT1udWxsJiZsLm93bmVyRG9jdW1lbnQhPW51bGwmJmwub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyE9bnVsbD9sLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc6d2luZG93O2Zvcih2YXIgdD1PZShsLmRvY3VtZW50KTt0IGluc3RhbmNlb2YgbC5IVE1MSUZyYW1lRWxlbWVudDspe3RyeXt2YXIgYT10eXBlb2YgdC5jb250ZW50V2luZG93LmxvY2F0aW9uLmhyZWY9PSJzdHJpbmcifWNhdGNoe2E9ITF9aWYoYSlsPXQuY29udGVudFdpbmRvdztlbHNlIGJyZWFrO3Q9T2UobC5kb2N1bWVudCl9cmV0dXJuIHR9ZnVuY3Rpb24geWYobCl7dmFyIHQ9bCYmbC5ub2RlTmFtZSYmbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiB0JiYodD09PSJpbnB1dCImJihsLnR5cGU9PT0idGV4dCJ8fGwudHlwZT09PSJzZWFyY2gifHxsLnR5cGU9PT0idGVsInx8bC50eXBlPT09InVybCJ8fGwudHlwZT09PSJwYXNzd29yZCIpfHx0PT09InRleHRhcmVhInx8bC5jb250ZW50RWRpdGFibGU9PT0idHJ1ZSIpfXZhciBibT1zdCYmImRvY3VtZW50TW9kZSJpbiBkb2N1bWVudCYmMTE+PWRvY3VtZW50LmRvY3VtZW50TW9kZSx4YT1udWxsLG1mPW51bGwsWXU9bnVsbCxoZj0hMTtmdW5jdGlvbiByaShsLHQsYSl7dmFyIHU9YS53aW5kb3c9PT1hP2EuZG9jdW1lbnQ6YS5ub2RlVHlwZT09PTk/YTphLm93bmVyRG9jdW1lbnQ7aGZ8fHhhPT1udWxsfHx4YSE9PU9lKHUpfHwodT14YSwic2VsZWN0aW9uU3RhcnQiaW4gdSYmeWYodSk/dT17c3RhcnQ6dS5zZWxlY3Rpb25TdGFydCxlbmQ6dS5zZWxlY3Rpb25FbmR9Oih1PSh1Lm93bmVyRG9jdW1lbnQmJnUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8d2luZG93KS5nZXRTZWxlY3Rpb24oKSx1PXthbmNob3JOb2RlOnUuYW5jaG9yTm9kZSxhbmNob3JPZmZzZXQ6dS5hbmNob3JPZmZzZXQsZm9jdXNOb2RlOnUuZm9jdXNOb2RlLGZvY3VzT2Zmc2V0OnUuZm9jdXNPZmZzZXR9KSxZdSYmQnUoWXUsdSl8fChZdT11LHU9VG4obWYsIm9uU2VsZWN0IiksMDx1Lmxlbmd0aCYmKHQ9bmV3IE5lKCJvblNlbGVjdCIsInNlbGVjdCIsbnVsbCx0LGEpLGwucHVzaCh7ZXZlbnQ6dCxsaXN0ZW5lcnM6dX0pLHQudGFyZ2V0PXhhKSkpfWZ1bmN0aW9uIGhhKGwsdCl7dmFyIGE9e307cmV0dXJuIGFbbC50b0xvd2VyQ2FzZSgpXT10LnRvTG93ZXJDYXNlKCksYVsiV2Via2l0IitsXT0id2Via2l0Iit0LGFbIk1veiIrbF09Im1veiIrdCxhfXZhciBMYT17YW5pbWF0aW9uZW5kOmhhKCJBbmltYXRpb24iLCJBbmltYXRpb25FbmQiKSxhbmltYXRpb25pdGVyYXRpb246aGEoIkFuaW1hdGlvbiIsIkFuaW1hdGlvbkl0ZXJhdGlvbiIpLGFuaW1hdGlvbnN0YXJ0OmhhKCJBbmltYXRpb24iLCJBbmltYXRpb25TdGFydCIpLHRyYW5zaXRpb25ydW46aGEoIlRyYW5zaXRpb24iLCJUcmFuc2l0aW9uUnVuIiksdHJhbnNpdGlvbnN0YXJ0OmhhKCJUcmFuc2l0aW9uIiwiVHJhbnNpdGlvblN0YXJ0IiksdHJhbnNpdGlvbmNhbmNlbDpoYSgiVHJhbnNpdGlvbiIsIlRyYW5zaXRpb25DYW5jZWwiKSx0cmFuc2l0aW9uZW5kOmhhKCJUcmFuc2l0aW9uIiwiVHJhbnNpdGlvbkVuZCIpfSxkZj17fSxraT17fTtzdCYmKGtpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlLCJBbmltYXRpb25FdmVudCJpbiB3aW5kb3d8fChkZWxldGUgTGEuYW5pbWF0aW9uZW5kLmFuaW1hdGlvbixkZWxldGUgTGEuYW5pbWF0aW9uaXRlcmF0aW9uLmFuaW1hdGlvbixkZWxldGUgTGEuYW5pbWF0aW9uc3RhcnQuYW5pbWF0aW9uKSwiVHJhbnNpdGlvbkV2ZW50ImluIHdpbmRvd3x8ZGVsZXRlIExhLnRyYW5zaXRpb25lbmQudHJhbnNpdGlvbik7ZnVuY3Rpb24gZGEobCl7aWYoZGZbbF0pcmV0dXJuIGRmW2xdO2lmKCFMYVtsXSlyZXR1cm4gbDt2YXIgdD1MYVtsXSxhO2ZvcihhIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShhKSYmYSBpbiBraSlyZXR1cm4gZGZbbF09dFthXTtyZXR1cm4gbH12YXIgSWk9ZGEoImFuaW1hdGlvbmVuZCIpLFBpPWRhKCJhbmltYXRpb25pdGVyYXRpb24iKSxsMD1kYSgiYW5pbWF0aW9uc3RhcnQiKSx6bT1kYSgidHJhbnNpdGlvbnJ1biIpLEFtPWRhKCJ0cmFuc2l0aW9uc3RhcnQiKSxUbT1kYSgidHJhbnNpdGlvbmNhbmNlbCIpLHQwPWRhKCJ0cmFuc2l0aW9uZW5kIiksYTA9bmV3IE1hcCxTZj0iYWJvcnQgYXV4Q2xpY2sgYmVmb3JlVG9nZ2xlIGNhbmNlbCBjYW5QbGF5IGNhblBsYXlUaHJvdWdoIGNsaWNrIGNsb3NlIGNvbnRleHRNZW51IGNvcHkgY3V0IGRyYWcgZHJhZ0VuZCBkcmFnRW50ZXIgZHJhZ0V4aXQgZHJhZ0xlYXZlIGRyYWdPdmVyIGRyYWdTdGFydCBkcm9wIGR1cmF0aW9uQ2hhbmdlIGVtcHRpZWQgZW5jcnlwdGVkIGVuZGVkIGVycm9yIGdvdFBvaW50ZXJDYXB0dXJlIGlucHV0IGludmFsaWQga2V5RG93biBrZXlQcmVzcyBrZXlVcCBsb2FkIGxvYWRlZERhdGEgbG9hZGVkTWV0YWRhdGEgbG9hZFN0YXJ0IGxvc3RQb2ludGVyQ2FwdHVyZSBtb3VzZURvd24gbW91c2VNb3ZlIG1vdXNlT3V0IG1vdXNlT3ZlciBtb3VzZVVwIHBhc3RlIHBhdXNlIHBsYXkgcGxheWluZyBwb2ludGVyQ2FuY2VsIHBvaW50ZXJEb3duIHBvaW50ZXJNb3ZlIHBvaW50ZXJPdXQgcG9pbnRlck92ZXIgcG9pbnRlclVwIHByb2dyZXNzIHJhdGVDaGFuZ2UgcmVzZXQgcmVzaXplIHNlZWtlZCBzZWVraW5nIHN0YWxsZWQgc3VibWl0IHN1c3BlbmQgdGltZVVwZGF0ZSB0b3VjaENhbmNlbCB0b3VjaEVuZCB0b3VjaFN0YXJ0IHZvbHVtZUNoYW5nZSBzY3JvbGwgdG9nZ2xlIHRvdWNoTW92ZSB3YWl0aW5nIHdoZWVsIi5zcGxpdCgiICIpO1NmLnB1c2goInNjcm9sbEVuZCIpO2Z1bmN0aW9uIHR0KGwsdCl7YTAuc2V0KGwsdCkseWEodCxbbF0pfXZhciBZZT10eXBlb2YgcmVwb3J0RXJyb3I9PSJmdW5jdGlvbiI/cmVwb3J0RXJyb3I6ZnVuY3Rpb24obCl7aWYodHlwZW9mIHdpbmRvdz09Im9iamVjdCImJnR5cGVvZiB3aW5kb3cuRXJyb3JFdmVudD09ImZ1bmN0aW9uIil7dmFyIHQ9bmV3IHdpbmRvdy5FcnJvckV2ZW50KCJlcnJvciIse2J1YmJsZXM6ITAsY2FuY2VsYWJsZTohMCxtZXNzYWdlOnR5cGVvZiBsPT0ib2JqZWN0IiYmbCE9PW51bGwmJnR5cGVvZiBsLm1lc3NhZ2U9PSJzdHJpbmciP1N0cmluZyhsLm1lc3NhZ2UpOlN0cmluZyhsKSxlcnJvcjpsfSk7aWYoIXdpbmRvdy5kaXNwYXRjaEV2ZW50KHQpKXJldHVybn1lbHNlIGlmKHR5cGVvZiBwcm9jZXNzPT0ib2JqZWN0IiYmdHlwZW9mIHByb2Nlc3MuZW1pdD09ImZ1bmN0aW9uIil7cHJvY2Vzcy5lbWl0KCJ1bmNhdWdodEV4Y2VwdGlvbiIsbCk7cmV0dXJufWNvbnNvbGUuZXJyb3IobCl9LEpsPVtdLEphPTAsc2Y9MDtmdW5jdGlvbiBRZSgpe2Zvcih2YXIgbD1KYSx0PXNmPUphPTA7dDxsOyl7dmFyIGE9SmxbdF07SmxbdCsrXT1udWxsO3ZhciB1PUpsW3RdO0psW3QrK109bnVsbDt2YXIgZT1KbFt0XTtKbFt0KytdPW51bGw7dmFyIG49SmxbdF07aWYoSmxbdCsrXT1udWxsLHUhPT1udWxsJiZlIT09bnVsbCl7dmFyIGY9dS5wZW5kaW5nO2Y9PT1udWxsP2UubmV4dD1lOihlLm5leHQ9Zi5uZXh0LGYubmV4dD1lKSx1LnBlbmRpbmc9ZX1uIT09MCYmdTAoYSxlLG4pfX1mdW5jdGlvbiBYZShsLHQsYSx1KXtKbFtKYSsrXT1sLEpsW0phKytdPXQsSmxbSmErK109YSxKbFtKYSsrXT11LHNmfD11LGwubGFuZXN8PXUsbD1sLmFsdGVybmF0ZSxsIT09bnVsbCYmKGwubGFuZXN8PXUpfWZ1bmN0aW9uIGdmKGwsdCxhLHUpe3JldHVybiBYZShsLHQsYSx1KSxHZShsKX1mdW5jdGlvbiBTYShsLHQpe3JldHVybiBYZShsLG51bGwsbnVsbCx0KSxHZShsKX1mdW5jdGlvbiB1MChsLHQsYSl7bC5sYW5lc3w9YTt2YXIgdT1sLmFsdGVybmF0ZTt1IT09bnVsbCYmKHUubGFuZXN8PWEpO2Zvcih2YXIgZT0hMSxuPWwucmV0dXJuO24hPT1udWxsOyluLmNoaWxkTGFuZXN8PWEsdT1uLmFsdGVybmF0ZSx1IT09bnVsbCYmKHUuY2hpbGRMYW5lc3w9YSksbi50YWc9PT0yMiYmKGw9bi5zdGF0ZU5vZGUsbD09PW51bGx8fGwuX3Zpc2liaWxpdHkmMXx8KGU9ITApKSxsPW4sbj1uLnJldHVybjtyZXR1cm4gbC50YWc9PT0zPyhuPWwuc3RhdGVOb2RlLGUmJnQhPT1udWxsJiYoZT0zMS1CbChhKSxsPW4uaGlkZGVuVXBkYXRlcyx1PWxbZV0sdT09PW51bGw/bFtlXT1bdF06dS5wdXNoKHQpLHQubGFuZT1hfDUzNjg3MDkxMiksbik6bnVsbH1mdW5jdGlvbiBHZShsKXtpZig1MDxsZSl0aHJvdyBsZT0wLERjPW51bGwsRXJyb3IocygxODUpKTtmb3IodmFyIHQ9bC5yZXR1cm47dCE9PW51bGw7KWw9dCx0PWwucmV0dXJuO3JldHVybiBsLnRhZz09PTM/bC5zdGF0ZU5vZGU6bnVsbH12YXIgV2E9e307ZnVuY3Rpb24gb20obCx0LGEsdSl7dGhpcy50YWc9bCx0aGlzLmtleT1hLHRoaXMuc2libGluZz10aGlzLmNoaWxkPXRoaXMucmV0dXJuPXRoaXMuc3RhdGVOb2RlPXRoaXMudHlwZT10aGlzLmVsZW1lbnRUeXBlPW51bGwsdGhpcy5pbmRleD0wLHRoaXMucmVmQ2xlYW51cD10aGlzLnJlZj1udWxsLHRoaXMucGVuZGluZ1Byb3BzPXQsdGhpcy5kZXBlbmRlbmNpZXM9dGhpcy5tZW1vaXplZFN0YXRlPXRoaXMudXBkYXRlUXVldWU9dGhpcy5tZW1vaXplZFByb3BzPW51bGwsdGhpcy5tb2RlPXUsdGhpcy5zdWJ0cmVlRmxhZ3M9dGhpcy5mbGFncz0wLHRoaXMuZGVsZXRpb25zPW51bGwsdGhpcy5jaGlsZExhbmVzPXRoaXMubGFuZXM9MCx0aGlzLmFsdGVybmF0ZT1udWxsfWZ1bmN0aW9uIFFsKGwsdCxhLHUpe3JldHVybiBuZXcgb20obCx0LGEsdSl9ZnVuY3Rpb24gYmYobCl7cmV0dXJuIGw9bC5wcm90b3R5cGUsISghbHx8IWwuaXNSZWFjdENvbXBvbmVudCl9ZnVuY3Rpb24gZ3QobCx0KXt2YXIgYT1sLmFsdGVybmF0ZTtyZXR1cm4gYT09PW51bGw/KGE9UWwobC50YWcsdCxsLmtleSxsLm1vZGUpLGEuZWxlbWVudFR5cGU9bC5lbGVtZW50VHlwZSxhLnR5cGU9bC50eXBlLGEuc3RhdGVOb2RlPWwuc3RhdGVOb2RlLGEuYWx0ZXJuYXRlPWwsbC5hbHRlcm5hdGU9YSk6KGEucGVuZGluZ1Byb3BzPXQsYS50eXBlPWwudHlwZSxhLmZsYWdzPTAsYS5zdWJ0cmVlRmxhZ3M9MCxhLmRlbGV0aW9ucz1udWxsKSxhLmZsYWdzPWwuZmxhZ3MmNjUwMTE3MTIsYS5jaGlsZExhbmVzPWwuY2hpbGRMYW5lcyxhLmxhbmVzPWwubGFuZXMsYS5jaGlsZD1sLmNoaWxkLGEubWVtb2l6ZWRQcm9wcz1sLm1lbW9pemVkUHJvcHMsYS5tZW1vaXplZFN0YXRlPWwubWVtb2l6ZWRTdGF0ZSxhLnVwZGF0ZVF1ZXVlPWwudXBkYXRlUXVldWUsdD1sLmRlcGVuZGVuY2llcyxhLmRlcGVuZGVuY2llcz10PT09bnVsbD9udWxsOntsYW5lczp0LmxhbmVzLGZpcnN0Q29udGV4dDp0LmZpcnN0Q29udGV4dH0sYS5zaWJsaW5nPWwuc2libGluZyxhLmluZGV4PWwuaW5kZXgsYS5yZWY9bC5yZWYsYS5yZWZDbGVhbnVwPWwucmVmQ2xlYW51cCxhfWZ1bmN0aW9uIGUwKGwsdCl7bC5mbGFncyY9NjUwMTE3MTQ7dmFyIGE9bC5hbHRlcm5hdGU7cmV0dXJuIGE9PT1udWxsPyhsLmNoaWxkTGFuZXM9MCxsLmxhbmVzPXQsbC5jaGlsZD1udWxsLGwuc3VidHJlZUZsYWdzPTAsbC5tZW1vaXplZFByb3BzPW51bGwsbC5tZW1vaXplZFN0YXRlPW51bGwsbC51cGRhdGVRdWV1ZT1udWxsLGwuZGVwZW5kZW5jaWVzPW51bGwsbC5zdGF0ZU5vZGU9bnVsbCk6KGwuY2hpbGRMYW5lcz1hLmNoaWxkTGFuZXMsbC5sYW5lcz1hLmxhbmVzLGwuY2hpbGQ9YS5jaGlsZCxsLnN1YnRyZWVGbGFncz0wLGwuZGVsZXRpb25zPW51bGwsbC5tZW1vaXplZFByb3BzPWEubWVtb2l6ZWRQcm9wcyxsLm1lbW9pemVkU3RhdGU9YS5tZW1vaXplZFN0YXRlLGwudXBkYXRlUXVldWU9YS51cGRhdGVRdWV1ZSxsLnR5cGU9YS50eXBlLHQ9YS5kZXBlbmRlbmNpZXMsbC5kZXBlbmRlbmNpZXM9dD09PW51bGw/bnVsbDp7bGFuZXM6dC5sYW5lcyxmaXJzdENvbnRleHQ6dC5maXJzdENvbnRleHR9KSxsfWZ1bmN0aW9uIENlKGwsdCxhLHUsZSxuKXt2YXIgZj0wO2lmKHU9bCx0eXBlb2YgbD09ImZ1bmN0aW9uIiliZihsKSYmKGY9MSk7ZWxzZSBpZih0eXBlb2YgbD09InN0cmluZyIpZj1VaChsLGEseWwuY3VycmVudCk/MjY6bD09PSJodG1sInx8bD09PSJoZWFkInx8bD09PSJib2R5Ij8yNzo1O2Vsc2UgbDpzd2l0Y2gobCl7Y2FzZSBxYTpyZXR1cm4gbD1RbCgzMSxhLHQsZSksbC5lbGVtZW50VHlwZT1xYSxsLmxhbmVzPW4sbDtjYXNlIFZsOnJldHVybiBzYShhLmNoaWxkcmVuLGUsbix0KTtjYXNlIEhhOmY9OCxlfD0yNDticmVhaztjYXNlIE5hOnJldHVybiBsPVFsKDEyLGEsdCxlfDIpLGwuZWxlbWVudFR5cGU9TmEsbC5sYW5lcz1uLGw7Y2FzZSBjYTpyZXR1cm4gbD1RbCgxMyxhLHQsZSksbC5lbGVtZW50VHlwZT1jYSxsLmxhbmVzPW4sbDtjYXNlIGV0OnJldHVybiBsPVFsKDE5LGEsdCxlKSxsLmVsZW1lbnRUeXBlPWV0LGwubGFuZXM9bixsO2RlZmF1bHQ6aWYodHlwZW9mIGw9PSJvYmplY3QiJiZsIT09bnVsbClzd2l0Y2gobC4kJHR5cGVvZil7Y2FzZSBwbDpmPTEwO2JyZWFrIGw7Y2FzZSBidTpmPTk7YnJlYWsgbDtjYXNlIFl0OmY9MTE7YnJlYWsgbDtjYXNlIG10OmY9MTQ7YnJlYWsgbDtjYXNlIGx0OmY9MTYsdT1udWxsO2JyZWFrIGx9Zj0yOSxhPUVycm9yKHMoMTMwLGw9PT1udWxsPyJudWxsIjp0eXBlb2YgbCwiIikpLHU9bnVsbH1yZXR1cm4gdD1RbChmLGEsdCxlKSx0LmVsZW1lbnRUeXBlPWwsdC50eXBlPXUsdC5sYW5lcz1uLHR9ZnVuY3Rpb24gc2EobCx0LGEsdSl7cmV0dXJuIGw9UWwoNyxsLHUsdCksbC5sYW5lcz1hLGx9ZnVuY3Rpb24gemYobCx0LGEpe3JldHVybiBsPVFsKDYsbCxudWxsLHQpLGwubGFuZXM9YSxsfWZ1bmN0aW9uIG4wKGwpe3ZhciB0PVFsKDE4LG51bGwsbnVsbCwwKTtyZXR1cm4gdC5zdGF0ZU5vZGU9bCx0fWZ1bmN0aW9uIEFmKGwsdCxhKXtyZXR1cm4gdD1RbCg0LGwuY2hpbGRyZW4hPT1udWxsP2wuY2hpbGRyZW46W10sbC5rZXksdCksdC5sYW5lcz1hLHQuc3RhdGVOb2RlPXtjb250YWluZXJJbmZvOmwuY29udGFpbmVySW5mbyxwZW5kaW5nQ2hpbGRyZW46bnVsbCxpbXBsZW1lbnRhdGlvbjpsLmltcGxlbWVudGF0aW9ufSx0fXZhciBmMD1uZXcgV2Vha01hcDtmdW5jdGlvbiBXbChsLHQpe2lmKHR5cGVvZiBsPT0ib2JqZWN0IiYmbCE9PW51bGwpe3ZhciBhPWYwLmdldChsKTtyZXR1cm4gYSE9PXZvaWQgMD9hOih0PXt2YWx1ZTpsLHNvdXJjZTp0LHN0YWNrOm5pKHQpfSxmMC5zZXQobCx0KSx0KX1yZXR1cm57dmFsdWU6bCxzb3VyY2U6dCxzdGFjazpuaSh0KX19dmFyIHdhPVtdLCRhPTAsWmU9bnVsbCxRdT0wLHdsPVtdLCRsPTAsWnQ9bnVsbCxmdD0xLGN0PSIiO2Z1bmN0aW9uIGJ0KGwsdCl7d2FbJGErK109UXUsd2FbJGErK109WmUsWmU9bCxRdT10fWZ1bmN0aW9uIGMwKGwsdCxhKXt3bFskbCsrXT1mdCx3bFskbCsrXT1jdCx3bFskbCsrXT1adCxadD1sO3ZhciB1PWZ0O2w9Y3Q7dmFyIGU9MzItQmwodSktMTt1Jj1+KDE8PGUpLGErPTE7dmFyIG49MzItQmwodCkrZTtpZigzMDxuKXt2YXIgZj1lLWUlNTtuPSh1JigxPDxmKS0xKS50b1N0cmluZygzMiksdT4+PWYsZS09ZixmdD0xPDwzMi1CbCh0KStlfGE8PGV8dSxjdD1uK2x9ZWxzZSBmdD0xPDxufGE8PGV8dSxjdD1sfWZ1bmN0aW9uIFRmKGwpe2wucmV0dXJuIT09bnVsbCYmKGJ0KGwsMSksYzAobCwxLDApKX1mdW5jdGlvbiBvZihsKXtmb3IoO2w9PT1aZTspWmU9d2FbLS0kYV0sd2FbJGFdPW51bGwsUXU9d2FbLS0kYV0sd2FbJGFdPW51bGw7Zm9yKDtsPT09WnQ7KVp0PXdsWy0tJGxdLHdsWyRsXT1udWxsLGN0PXdsWy0tJGxdLHdsWyRsXT1udWxsLGZ0PXdsWy0tJGxdLHdsWyRsXT1udWxsfWZ1bmN0aW9uIGkwKGwsdCl7d2xbJGwrK109ZnQsd2xbJGwrK109Y3Qsd2xbJGwrK109WnQsZnQ9dC5pZCxjdD10Lm92ZXJmbG93LFp0PWx9dmFyIFNsPW51bGwsJD1udWxsLEc9ITEsUnQ9bnVsbCxGbD0hMSxFZj1FcnJvcihzKDUxOSkpO2Z1bmN0aW9uIGp0KGwpe3ZhciB0PUVycm9yKHMoNDE4LDE8YXJndW1lbnRzLmxlbmd0aCYmYXJndW1lbnRzWzFdIT09dm9pZCAwJiZhcmd1bWVudHNbMV0/InRleHQiOiJIVE1MIiwiIikpO3Rocm93IFh1KFdsKHQsbCkpLEVmfWZ1bmN0aW9uIHYwKGwpe3ZhciB0PWwuc3RhdGVOb2RlLGE9bC50eXBlLHU9bC5tZW1vaXplZFByb3BzO3N3aXRjaCh0W2RsXT1sLHRbb2xdPXUsYSl7Y2FzZSJkaWFsb2ciOkIoImNhbmNlbCIsdCksQigiY2xvc2UiLHQpO2JyZWFrO2Nhc2UiaWZyYW1lIjpjYXNlIm9iamVjdCI6Y2FzZSJlbWJlZCI6QigibG9hZCIsdCk7YnJlYWs7Y2FzZSJ2aWRlbyI6Y2FzZSJhdWRpbyI6Zm9yKGE9MDthPGFlLmxlbmd0aDthKyspQihhZVthXSx0KTticmVhaztjYXNlInNvdXJjZSI6QigiZXJyb3IiLHQpO2JyZWFrO2Nhc2UiaW1nIjpjYXNlImltYWdlIjpjYXNlImxpbmsiOkIoImVycm9yIix0KSxCKCJsb2FkIix0KTticmVhaztjYXNlImRldGFpbHMiOkIoInRvZ2dsZSIsdCk7YnJlYWs7Y2FzZSJpbnB1dCI6QigiaW52YWxpZCIsdCksRWkodCx1LnZhbHVlLHUuZGVmYXVsdFZhbHVlLHUuY2hlY2tlZCx1LmRlZmF1bHRDaGVja2VkLHUudHlwZSx1Lm5hbWUsITApO2JyZWFrO2Nhc2Uic2VsZWN0IjpCKCJpbnZhbGlkIix0KTticmVhaztjYXNlInRleHRhcmVhIjpCKCJpbnZhbGlkIix0KSxPaSh0LHUudmFsdWUsdS5kZWZhdWx0VmFsdWUsdS5jaGlsZHJlbil9YT11LmNoaWxkcmVuLHR5cGVvZiBhIT0ic3RyaW5nIiYmdHlwZW9mIGEhPSJudW1iZXIiJiZ0eXBlb2YgYSE9ImJpZ2ludCJ8fHQudGV4dENvbnRlbnQ9PT0iIithfHx1LnN1cHByZXNzSHlkcmF0aW9uV2FybmluZz09PSEwfHxVMSh0LnRleHRDb250ZW50LGEpPyh1LnBvcG92ZXIhPW51bGwmJihCKCJiZWZvcmV0b2dnbGUiLHQpLEIoInRvZ2dsZSIsdCkpLHUub25TY3JvbGwhPW51bGwmJkIoInNjcm9sbCIsdCksdS5vblNjcm9sbEVuZCE9bnVsbCYmQigic2Nyb2xsZW5kIix0KSx1Lm9uQ2xpY2shPW51bGwmJih0Lm9uY2xpY2s9U3QpLHQ9ITApOnQ9ITEsdHx8anQobCwhMCl9ZnVuY3Rpb24geTAobCl7Zm9yKFNsPWwucmV0dXJuO1NsOylzd2l0Y2goU2wudGFnKXtjYXNlIDU6Y2FzZSAzMTpjYXNlIDEzOkZsPSExO3JldHVybjtjYXNlIDI3OmNhc2UgMzpGbD0hMDtyZXR1cm47ZGVmYXVsdDpTbD1TbC5yZXR1cm59fWZ1bmN0aW9uIEZhKGwpe2lmKGwhPT1TbClyZXR1cm4hMTtpZighRylyZXR1cm4geTAobCksRz0hMCwhMTt2YXIgdD1sLnRhZyxhO2lmKChhPXQhPT0zJiZ0IT09MjcpJiYoKGE9dD09PTUpJiYoYT1sLnR5cGUsYT0hKGEhPT0iZm9ybSImJmEhPT0iYnV0dG9uIil8fFZjKGwudHlwZSxsLm1lbW9pemVkUHJvcHMpKSxhPSFhKSxhJiYkJiZqdChsKSx5MChsKSx0PT09MTMpe2lmKGw9bC5tZW1vaXplZFN0YXRlLGw9bCE9PW51bGw/bC5kZWh5ZHJhdGVkOm51bGwsIWwpdGhyb3cgRXJyb3IocygzMTcpKTskPUcxKGwpfWVsc2UgaWYodD09PTMxKXtpZihsPWwubWVtb2l6ZWRTdGF0ZSxsPWwhPT1udWxsP2wuZGVoeWRyYXRlZDpudWxsLCFsKXRocm93IEVycm9yKHMoMzE3KSk7JD1HMShsKX1lbHNlIHQ9PT0yNz8odD0kLFB0KGwudHlwZSk/KGw9SmMsSmM9bnVsbCwkPWwpOiQ9dCk6JD1TbD9rbChsLnN0YXRlTm9kZS5uZXh0U2libGluZyk6bnVsbDtyZXR1cm4hMH1mdW5jdGlvbiBnYSgpeyQ9U2w9bnVsbCxHPSExfWZ1bmN0aW9uIE1mKCl7dmFyIGw9UnQ7cmV0dXJuIGwhPT1udWxsJiYoVWw9PT1udWxsP1VsPWw6VWwucHVzaC5hcHBseShVbCxsKSxSdD1udWxsKSxsfWZ1bmN0aW9uIFh1KGwpe1J0PT09bnVsbD9SdD1bbF06UnQucHVzaChsKX12YXIgT2Y9QWwobnVsbCksYmE9bnVsbCx6dD1udWxsO2Z1bmN0aW9uIFZ0KGwsdCxhKXtqKE9mLHQuX2N1cnJlbnRWYWx1ZSksdC5fY3VycmVudFZhbHVlPWF9ZnVuY3Rpb24gQXQobCl7bC5fY3VycmVudFZhbHVlPU9mLmN1cnJlbnQsSShPZil9ZnVuY3Rpb24gRGYobCx0LGEpe2Zvcig7bCE9PW51bGw7KXt2YXIgdT1sLmFsdGVybmF0ZTtpZigobC5jaGlsZExhbmVzJnQpIT09dD8obC5jaGlsZExhbmVzfD10LHUhPT1udWxsJiYodS5jaGlsZExhbmVzfD10KSk6dSE9PW51bGwmJih1LmNoaWxkTGFuZXMmdCkhPT10JiYodS5jaGlsZExhbmVzfD10KSxsPT09YSlicmVhaztsPWwucmV0dXJufX1mdW5jdGlvbiBVZihsLHQsYSx1KXt2YXIgZT1sLmNoaWxkO2ZvcihlIT09bnVsbCYmKGUucmV0dXJuPWwpO2UhPT1udWxsOyl7dmFyIG49ZS5kZXBlbmRlbmNpZXM7aWYobiE9PW51bGwpe3ZhciBmPWUuY2hpbGQ7bj1uLmZpcnN0Q29udGV4dDtsOmZvcig7biE9PW51bGw7KXt2YXIgYz1uO249ZTtmb3IodmFyIGk9MDtpPHQubGVuZ3RoO2krKylpZihjLmNvbnRleHQ9PT10W2ldKXtuLmxhbmVzfD1hLGM9bi5hbHRlcm5hdGUsYyE9PW51bGwmJihjLmxhbmVzfD1hKSxEZihuLnJldHVybixhLGwpLHV8fChmPW51bGwpO2JyZWFrIGx9bj1jLm5leHR9fWVsc2UgaWYoZS50YWc9PT0xOCl7aWYoZj1lLnJldHVybixmPT09bnVsbCl0aHJvdyBFcnJvcihzKDM0MSkpO2YubGFuZXN8PWEsbj1mLmFsdGVybmF0ZSxuIT09bnVsbCYmKG4ubGFuZXN8PWEpLERmKGYsYSxsKSxmPW51bGx9ZWxzZSBmPWUuY2hpbGQ7aWYoZiE9PW51bGwpZi5yZXR1cm49ZTtlbHNlIGZvcihmPWU7ZiE9PW51bGw7KXtpZihmPT09bCl7Zj1udWxsO2JyZWFrfWlmKGU9Zi5zaWJsaW5nLGUhPT1udWxsKXtlLnJldHVybj1mLnJldHVybixmPWU7YnJlYWt9Zj1mLnJldHVybn1lPWZ9fWZ1bmN0aW9uIHJhKGwsdCxhLHUpe2w9bnVsbDtmb3IodmFyIGU9dCxuPSExO2UhPT1udWxsOyl7aWYoIW4pe2lmKChlLmZsYWdzJjUyNDI4OCkhPT0wKW49ITA7ZWxzZSBpZigoZS5mbGFncyYyNjIxNDQpIT09MClicmVha31pZihlLnRhZz09PTEwKXt2YXIgZj1lLmFsdGVybmF0ZTtpZihmPT09bnVsbCl0aHJvdyBFcnJvcihzKDM4NykpO2lmKGY9Zi5tZW1vaXplZFByb3BzLGYhPT1udWxsKXt2YXIgYz1lLnR5cGU7WWwoZS5wZW5kaW5nUHJvcHMudmFsdWUsZi52YWx1ZSl8fChsIT09bnVsbD9sLnB1c2goYyk6bD1bY10pfX1lbHNlIGlmKGU9PT1TZS5jdXJyZW50KXtpZihmPWUuYWx0ZXJuYXRlLGY9PT1udWxsKXRocm93IEVycm9yKHMoMzg3KSk7Zi5tZW1vaXplZFN0YXRlLm1lbW9pemVkU3RhdGUhPT1lLm1lbW9pemVkU3RhdGUubWVtb2l6ZWRTdGF0ZSYmKGwhPT1udWxsP2wucHVzaChjZSk6bD1bY2VdKX1lPWUucmV0dXJufWwhPT1udWxsJiZVZih0LGwsYSx1KSx0LmZsYWdzfD0yNjIxNDR9ZnVuY3Rpb24gUmUobCl7Zm9yKGw9bC5maXJzdENvbnRleHQ7bCE9PW51bGw7KXtpZighWWwobC5jb250ZXh0Ll9jdXJyZW50VmFsdWUsbC5tZW1vaXplZFZhbHVlKSlyZXR1cm4hMDtsPWwubmV4dH1yZXR1cm4hMX1mdW5jdGlvbiB6YShsKXtiYT1sLHp0PW51bGwsbD1sLmRlcGVuZGVuY2llcyxsIT09bnVsbCYmKGwuZmlyc3RDb250ZXh0PW51bGwpfWZ1bmN0aW9uIHNsKGwpe3JldHVybiBtMChiYSxsKX1mdW5jdGlvbiBqZShsLHQpe3JldHVybiBiYT09PW51bGwmJnphKGwpLG0wKGwsdCl9ZnVuY3Rpb24gbTAobCx0KXt2YXIgYT10Ll9jdXJyZW50VmFsdWU7aWYodD17Y29udGV4dDp0LG1lbW9pemVkVmFsdWU6YSxuZXh0Om51bGx9LHp0PT09bnVsbCl7aWYobD09PW51bGwpdGhyb3cgRXJyb3IocygzMDgpKTt6dD10LGwuZGVwZW5kZW5jaWVzPXtsYW5lczowLGZpcnN0Q29udGV4dDp0fSxsLmZsYWdzfD01MjQyODh9ZWxzZSB6dD16dC5uZXh0PXQ7cmV0dXJuIGF9dmFyIEVtPXR5cGVvZiBBYm9ydENvbnRyb2xsZXI8InUiP0Fib3J0Q29udHJvbGxlcjpmdW5jdGlvbigpe3ZhciBsPVtdLHQ9dGhpcy5zaWduYWw9e2Fib3J0ZWQ6ITEsYWRkRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihhLHUpe2wucHVzaCh1KX19O3RoaXMuYWJvcnQ9ZnVuY3Rpb24oKXt0LmFib3J0ZWQ9ITAsbC5mb3JFYWNoKGZ1bmN0aW9uKGEpe3JldHVybiBhKCl9KX19LE1tPVQudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayxPbT1ULnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LGVsPXskJHR5cGVvZjpwbCxDb25zdW1lcjpudWxsLFByb3ZpZGVyOm51bGwsX2N1cnJlbnRWYWx1ZTpudWxsLF9jdXJyZW50VmFsdWUyOm51bGwsX3RocmVhZENvdW50OjB9O2Z1bmN0aW9uIF9mKCl7cmV0dXJue2NvbnRyb2xsZXI6bmV3IEVtLGRhdGE6bmV3IE1hcCxyZWZDb3VudDowfX1mdW5jdGlvbiBHdShsKXtsLnJlZkNvdW50LS0sbC5yZWZDb3VudD09PTAmJk1tKE9tLGZ1bmN0aW9uKCl7bC5jb250cm9sbGVyLmFib3J0KCl9KX12YXIgQ3U9bnVsbCxIZj0wLGthPTAsSWE9bnVsbDtmdW5jdGlvbiBEbShsLHQpe2lmKEN1PT09bnVsbCl7dmFyIGE9Q3U9W107SGY9MCxrYT1CYygpLElhPXtzdGF0dXM6InBlbmRpbmciLHZhbHVlOnZvaWQgMCx0aGVuOmZ1bmN0aW9uKHUpe2EucHVzaCh1KX19fXJldHVybiBIZisrLHQudGhlbihoMCxoMCksdH1mdW5jdGlvbiBoMCgpe2lmKC0tSGY9PT0wJiZDdSE9PW51bGwpe0lhIT09bnVsbCYmKElhLnN0YXR1cz0iZnVsZmlsbGVkIik7dmFyIGw9Q3U7Q3U9bnVsbCxrYT0wLElhPW51bGw7Zm9yKHZhciB0PTA7dDxsLmxlbmd0aDt0KyspKDAsbFt0XSkoKX19ZnVuY3Rpb24gVW0obCx0KXt2YXIgYT1bXSx1PXtzdGF0dXM6InBlbmRpbmciLHZhbHVlOm51bGwscmVhc29uOm51bGwsdGhlbjpmdW5jdGlvbihlKXthLnB1c2goZSl9fTtyZXR1cm4gbC50aGVuKGZ1bmN0aW9uKCl7dS5zdGF0dXM9ImZ1bGZpbGxlZCIsdS52YWx1ZT10O2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKSgwLGFbZV0pKHQpfSxmdW5jdGlvbihlKXtmb3IodS5zdGF0dXM9InJlamVjdGVkIix1LnJlYXNvbj1lLGU9MDtlPGEubGVuZ3RoO2UrKykoMCxhW2VdKSh2b2lkIDApfSksdX12YXIgZDA9ei5TO3ouUz1mdW5jdGlvbihsLHQpe3J2PU5sKCksdHlwZW9mIHQ9PSJvYmplY3QiJiZ0IT09bnVsbCYmdHlwZW9mIHQudGhlbj09ImZ1bmN0aW9uIiYmRG0obCx0KSxkMCE9PW51bGwmJmQwKGwsdCl9O3ZhciBBYT1BbChudWxsKTtmdW5jdGlvbiBOZigpe3ZhciBsPUFhLmN1cnJlbnQ7cmV0dXJuIGwhPT1udWxsP2w6Si5wb29sZWRDYWNoZX1mdW5jdGlvbiBWZShsLHQpe3Q9PT1udWxsP2ooQWEsQWEuY3VycmVudCk6aihBYSx0LnBvb2wpfWZ1bmN0aW9uIFMwKCl7dmFyIGw9TmYoKTtyZXR1cm4gbD09PW51bGw/bnVsbDp7cGFyZW50OmVsLl9jdXJyZW50VmFsdWUscG9vbDpsfX12YXIgUGE9RXJyb3Iocyg0NjApKSxxZj1FcnJvcihzKDQ3NCkpLHBlPUVycm9yKHMoNTQyKSksS2U9e3RoZW46ZnVuY3Rpb24oKXt9fTtmdW5jdGlvbiBzMChsKXtyZXR1cm4gbD1sLnN0YXR1cyxsPT09ImZ1bGZpbGxlZCJ8fGw9PT0icmVqZWN0ZWQifWZ1bmN0aW9uIGcwKGwsdCxhKXtzd2l0Y2goYT1sW2FdLGE9PT12b2lkIDA/bC5wdXNoKHQpOmEhPT10JiYodC50aGVuKFN0LFN0KSx0PWEpLHQuc3RhdHVzKXtjYXNlImZ1bGZpbGxlZCI6cmV0dXJuIHQudmFsdWU7Y2FzZSJyZWplY3RlZCI6dGhyb3cgbD10LnJlYXNvbix6MChsKSxsO2RlZmF1bHQ6aWYodHlwZW9mIHQuc3RhdHVzPT0ic3RyaW5nIil0LnRoZW4oU3QsU3QpO2Vsc2V7aWYobD1KLGwhPT1udWxsJiYxMDA8bC5zaGVsbFN1c3BlbmRDb3VudGVyKXRocm93IEVycm9yKHMoNDgyKSk7bD10LGwuc3RhdHVzPSJwZW5kaW5nIixsLnRoZW4oZnVuY3Rpb24odSl7aWYodC5zdGF0dXM9PT0icGVuZGluZyIpe3ZhciBlPXQ7ZS5zdGF0dXM9ImZ1bGZpbGxlZCIsZS52YWx1ZT11fX0sZnVuY3Rpb24odSl7aWYodC5zdGF0dXM9PT0icGVuZGluZyIpe3ZhciBlPXQ7ZS5zdGF0dXM9InJlamVjdGVkIixlLnJlYXNvbj11fX0pfXN3aXRjaCh0LnN0YXR1cyl7Y2FzZSJmdWxmaWxsZWQiOnJldHVybiB0LnZhbHVlO2Nhc2UicmVqZWN0ZWQiOnRocm93IGw9dC5yZWFzb24sejAobCksbH10aHJvdyBvYT10LFBhfX1mdW5jdGlvbiBUYShsKXt0cnl7dmFyIHQ9bC5faW5pdDtyZXR1cm4gdChsLl9wYXlsb2FkKX1jYXRjaChhKXt0aHJvdyBhIT09bnVsbCYmdHlwZW9mIGE9PSJvYmplY3QiJiZ0eXBlb2YgYS50aGVuPT0iZnVuY3Rpb24iPyhvYT1hLFBhKTphfX12YXIgb2E9bnVsbDtmdW5jdGlvbiBiMCgpe2lmKG9hPT09bnVsbCl0aHJvdyBFcnJvcihzKDQ1OSkpO3ZhciBsPW9hO3JldHVybiBvYT1udWxsLGx9ZnVuY3Rpb24gejAobCl7aWYobD09PVBhfHxsPT09cGUpdGhyb3cgRXJyb3Iocyg0ODMpKX12YXIgbHU9bnVsbCxadT0wO2Z1bmN0aW9uIHhlKGwpe3ZhciB0PVp1O3JldHVybiBadSs9MSxsdT09PW51bGwmJihsdT1bXSksZzAobHUsbCx0KX1mdW5jdGlvbiBSdShsLHQpe3Q9dC5wcm9wcy5yZWYsbC5yZWY9dCE9PXZvaWQgMD90Om51bGx9ZnVuY3Rpb24gTGUobCx0KXt0aHJvdyB0LiQkdHlwZW9mPT09dGw/RXJyb3Iocyg1MjUpKToobD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCksRXJyb3IocygzMSxsPT09IltvYmplY3QgT2JqZWN0XSI/Im9iamVjdCB3aXRoIGtleXMgeyIrT2JqZWN0LmtleXModCkuam9pbigiLCAiKSsifSI6bCkpKX1mdW5jdGlvbiBBMChsKXtmdW5jdGlvbiB0KHksdil7aWYobCl7dmFyIG09eS5kZWxldGlvbnM7bT09PW51bGw/KHkuZGVsZXRpb25zPVt2XSx5LmZsYWdzfD0xNik6bS5wdXNoKHYpfX1mdW5jdGlvbiBhKHksdil7aWYoIWwpcmV0dXJuIG51bGw7Zm9yKDt2IT09bnVsbDspdCh5LHYpLHY9di5zaWJsaW5nO3JldHVybiBudWxsfWZ1bmN0aW9uIHUoeSl7Zm9yKHZhciB2PW5ldyBNYXA7eSE9PW51bGw7KXkua2V5IT09bnVsbD92LnNldCh5LmtleSx5KTp2LnNldCh5LmluZGV4LHkpLHk9eS5zaWJsaW5nO3JldHVybiB2fWZ1bmN0aW9uIGUoeSx2KXtyZXR1cm4geT1ndCh5LHYpLHkuaW5kZXg9MCx5LnNpYmxpbmc9bnVsbCx5fWZ1bmN0aW9uIG4oeSx2LG0pe3JldHVybiB5LmluZGV4PW0sbD8obT15LmFsdGVybmF0ZSxtIT09bnVsbD8obT1tLmluZGV4LG08dj8oeS5mbGFnc3w9NjcxMDg4NjYsdik6bSk6KHkuZmxhZ3N8PTY3MTA4ODY2LHYpKTooeS5mbGFnc3w9MTA0ODU3Nix2KX1mdW5jdGlvbiBmKHkpe3JldHVybiBsJiZ5LmFsdGVybmF0ZT09PW51bGwmJih5LmZsYWdzfD02NzEwODg2NikseX1mdW5jdGlvbiBjKHksdixtLGIpe3JldHVybiB2PT09bnVsbHx8di50YWchPT02Pyh2PXpmKG0seS5tb2RlLGIpLHYucmV0dXJuPXksdik6KHY9ZSh2LG0pLHYucmV0dXJuPXksdil9ZnVuY3Rpb24gaSh5LHYsbSxiKXt2YXIgTz1tLnR5cGU7cmV0dXJuIE89PT1WbD9nKHksdixtLnByb3BzLmNoaWxkcmVuLGIsbS5rZXkpOnYhPT1udWxsJiYodi5lbGVtZW50VHlwZT09PU98fHR5cGVvZiBPPT0ib2JqZWN0IiYmTyE9PW51bGwmJk8uJCR0eXBlb2Y9PT1sdCYmVGEoTyk9PT12LnR5cGUpPyh2PWUodixtLnByb3BzKSxSdSh2LG0pLHYucmV0dXJuPXksdik6KHY9Q2UobS50eXBlLG0ua2V5LG0ucHJvcHMsbnVsbCx5Lm1vZGUsYiksUnUodixtKSx2LnJldHVybj15LHYpfWZ1bmN0aW9uIGgoeSx2LG0sYil7cmV0dXJuIHY9PT1udWxsfHx2LnRhZyE9PTR8fHYuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8hPT1tLmNvbnRhaW5lckluZm98fHYuc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uIT09bS5pbXBsZW1lbnRhdGlvbj8odj1BZihtLHkubW9kZSxiKSx2LnJldHVybj15LHYpOih2PWUodixtLmNoaWxkcmVufHxbXSksdi5yZXR1cm49eSx2KX1mdW5jdGlvbiBnKHksdixtLGIsTyl7cmV0dXJuIHY9PT1udWxsfHx2LnRhZyE9PTc/KHY9c2EobSx5Lm1vZGUsYixPKSx2LnJldHVybj15LHYpOih2PWUodixtKSx2LnJldHVybj15LHYpfWZ1bmN0aW9uIEEoeSx2LG0pe2lmKHR5cGVvZiB2PT0ic3RyaW5nIiYmdiE9PSIifHx0eXBlb2Ygdj09Im51bWJlciJ8fHR5cGVvZiB2PT0iYmlnaW50IilyZXR1cm4gdj16ZigiIit2LHkubW9kZSxtKSx2LnJldHVybj15LHY7aWYodHlwZW9mIHY9PSJvYmplY3QiJiZ2IT09bnVsbCl7c3dpdGNoKHYuJCR0eXBlb2Ype2Nhc2UgSGw6cmV0dXJuIG09Q2Uodi50eXBlLHYua2V5LHYucHJvcHMsbnVsbCx5Lm1vZGUsbSksUnUobSx2KSxtLnJldHVybj15LG07Y2FzZSBpbDpyZXR1cm4gdj1BZih2LHkubW9kZSxtKSx2LnJldHVybj15LHY7Y2FzZSBsdDpyZXR1cm4gdj1UYSh2KSxBKHksdixtKX1pZihodCh2KXx8S2wodikpcmV0dXJuIHY9c2Eodix5Lm1vZGUsbSxudWxsKSx2LnJldHVybj15LHY7aWYodHlwZW9mIHYudGhlbj09ImZ1bmN0aW9uIilyZXR1cm4gQSh5LHhlKHYpLG0pO2lmKHYuJCR0eXBlb2Y9PT1wbClyZXR1cm4gQSh5LGplKHksdiksbSk7TGUoeSx2KX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBkKHksdixtLGIpe3ZhciBPPXYhPT1udWxsP3Yua2V5Om51bGw7aWYodHlwZW9mIG09PSJzdHJpbmciJiZtIT09IiJ8fHR5cGVvZiBtPT0ibnVtYmVyInx8dHlwZW9mIG09PSJiaWdpbnQiKXJldHVybiBPIT09bnVsbD9udWxsOmMoeSx2LCIiK20sYik7aWYodHlwZW9mIG09PSJvYmplY3QiJiZtIT09bnVsbCl7c3dpdGNoKG0uJCR0eXBlb2Ype2Nhc2UgSGw6cmV0dXJuIG0ua2V5PT09Tz9pKHksdixtLGIpOm51bGw7Y2FzZSBpbDpyZXR1cm4gbS5rZXk9PT1PP2goeSx2LG0sYik6bnVsbDtjYXNlIGx0OnJldHVybiBtPVRhKG0pLGQoeSx2LG0sYil9aWYoaHQobSl8fEtsKG0pKXJldHVybiBPIT09bnVsbD9udWxsOmcoeSx2LG0sYixudWxsKTtpZih0eXBlb2YgbS50aGVuPT0iZnVuY3Rpb24iKXJldHVybiBkKHksdix4ZShtKSxiKTtpZihtLiQkdHlwZW9mPT09cGwpcmV0dXJuIGQoeSx2LGplKHksbSksYik7TGUoeSxtKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBTKHksdixtLGIsTyl7aWYodHlwZW9mIGI9PSJzdHJpbmciJiZiIT09IiJ8fHR5cGVvZiBiPT0ibnVtYmVyInx8dHlwZW9mIGI9PSJiaWdpbnQiKXJldHVybiB5PXkuZ2V0KG0pfHxudWxsLGModix5LCIiK2IsTyk7aWYodHlwZW9mIGI9PSJvYmplY3QiJiZiIT09bnVsbCl7c3dpdGNoKGIuJCR0eXBlb2Ype2Nhc2UgSGw6cmV0dXJuIHk9eS5nZXQoYi5rZXk9PT1udWxsP206Yi5rZXkpfHxudWxsLGkodix5LGIsTyk7Y2FzZSBpbDpyZXR1cm4geT15LmdldChiLmtleT09PW51bGw/bTpiLmtleSl8fG51bGwsaCh2LHksYixPKTtjYXNlIGx0OnJldHVybiBiPVRhKGIpLFMoeSx2LG0sYixPKX1pZihodChiKXx8S2woYikpcmV0dXJuIHk9eS5nZXQobSl8fG51bGwsZyh2LHksYixPLG51bGwpO2lmKHR5cGVvZiBiLnRoZW49PSJmdW5jdGlvbiIpcmV0dXJuIFMoeSx2LG0seGUoYiksTyk7aWYoYi4kJHR5cGVvZj09PXBsKXJldHVybiBTKHksdixtLGplKHYsYiksTyk7TGUodixiKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBFKHksdixtLGIpe2Zvcih2YXIgTz1udWxsLEM9bnVsbCxNPXYsTj12PTAsUT1udWxsO00hPT1udWxsJiZOPG0ubGVuZ3RoO04rKyl7TS5pbmRleD5OPyhRPU0sTT1udWxsKTpRPU0uc2libGluZzt2YXIgWj1kKHksTSxtW05dLGIpO2lmKFo9PT1udWxsKXtNPT09bnVsbCYmKE09USk7YnJlYWt9bCYmTSYmWi5hbHRlcm5hdGU9PT1udWxsJiZ0KHksTSksdj1uKFosdixOKSxDPT09bnVsbD9PPVo6Qy5zaWJsaW5nPVosQz1aLE09UX1pZihOPT09bS5sZW5ndGgpcmV0dXJuIGEoeSxNKSxHJiZidCh5LE4pLE87aWYoTT09PW51bGwpe2Zvcig7TjxtLmxlbmd0aDtOKyspTT1BKHksbVtOXSxiKSxNIT09bnVsbCYmKHY9bihNLHYsTiksQz09PW51bGw/Tz1NOkMuc2libGluZz1NLEM9TSk7cmV0dXJuIEcmJmJ0KHksTiksT31mb3IoTT11KE0pO048bS5sZW5ndGg7TisrKVE9UyhNLHksTixtW05dLGIpLFEhPT1udWxsJiYobCYmUS5hbHRlcm5hdGUhPT1udWxsJiZNLmRlbGV0ZShRLmtleT09PW51bGw/TjpRLmtleSksdj1uKFEsdixOKSxDPT09bnVsbD9PPVE6Qy5zaWJsaW5nPVEsQz1RKTtyZXR1cm4gbCYmTS5mb3JFYWNoKGZ1bmN0aW9uKGVhKXtyZXR1cm4gdCh5LGVhKX0pLEcmJmJ0KHksTiksT31mdW5jdGlvbiBEKHksdixtLGIpe2lmKG09PW51bGwpdGhyb3cgRXJyb3IocygxNTEpKTtmb3IodmFyIE89bnVsbCxDPW51bGwsTT12LE49dj0wLFE9bnVsbCxaPW0ubmV4dCgpO00hPT1udWxsJiYhWi5kb25lO04rKyxaPW0ubmV4dCgpKXtNLmluZGV4Pk4/KFE9TSxNPW51bGwpOlE9TS5zaWJsaW5nO3ZhciBlYT1kKHksTSxaLnZhbHVlLGIpO2lmKGVhPT09bnVsbCl7TT09PW51bGwmJihNPVEpO2JyZWFrfWwmJk0mJmVhLmFsdGVybmF0ZT09PW51bGwmJnQoeSxNKSx2PW4oZWEsdixOKSxDPT09bnVsbD9PPWVhOkMuc2libGluZz1lYSxDPWVhLE09UX1pZihaLmRvbmUpcmV0dXJuIGEoeSxNKSxHJiZidCh5LE4pLE87aWYoTT09PW51bGwpe2Zvcig7IVouZG9uZTtOKyssWj1tLm5leHQoKSlaPUEoeSxaLnZhbHVlLGIpLFohPT1udWxsJiYodj1uKFosdixOKSxDPT09bnVsbD9PPVo6Qy5zaWJsaW5nPVosQz1aKTtyZXR1cm4gRyYmYnQoeSxOKSxPfWZvcihNPXUoTSk7IVouZG9uZTtOKyssWj1tLm5leHQoKSlaPVMoTSx5LE4sWi52YWx1ZSxiKSxaIT09bnVsbCYmKGwmJlouYWx0ZXJuYXRlIT09bnVsbCYmTS5kZWxldGUoWi5rZXk9PT1udWxsP046Wi5rZXkpLHY9bihaLHYsTiksQz09PW51bGw/Tz1aOkMuc2libGluZz1aLEM9Wik7cmV0dXJuIGwmJk0uZm9yRWFjaChmdW5jdGlvbihaaCl7cmV0dXJuIHQoeSxaaCl9KSxHJiZidCh5LE4pLE99ZnVuY3Rpb24gTCh5LHYsbSxiKXtpZih0eXBlb2YgbT09Im9iamVjdCImJm0hPT1udWxsJiZtLnR5cGU9PT1WbCYmbS5rZXk9PT1udWxsJiYobT1tLnByb3BzLmNoaWxkcmVuKSx0eXBlb2YgbT09Im9iamVjdCImJm0hPT1udWxsKXtzd2l0Y2gobS4kJHR5cGVvZil7Y2FzZSBIbDpsOntmb3IodmFyIE89bS5rZXk7diE9PW51bGw7KXtpZih2LmtleT09PU8pe2lmKE89bS50eXBlLE89PT1WbCl7aWYodi50YWc9PT03KXthKHksdi5zaWJsaW5nKSxiPWUodixtLnByb3BzLmNoaWxkcmVuKSxiLnJldHVybj15LHk9YjticmVhayBsfX1lbHNlIGlmKHYuZWxlbWVudFR5cGU9PT1PfHx0eXBlb2YgTz09Im9iamVjdCImJk8hPT1udWxsJiZPLiQkdHlwZW9mPT09bHQmJlRhKE8pPT09di50eXBlKXthKHksdi5zaWJsaW5nKSxiPWUodixtLnByb3BzKSxSdShiLG0pLGIucmV0dXJuPXkseT1iO2JyZWFrIGx9YSh5LHYpO2JyZWFrfWVsc2UgdCh5LHYpO3Y9di5zaWJsaW5nfW0udHlwZT09PVZsPyhiPXNhKG0ucHJvcHMuY2hpbGRyZW4seS5tb2RlLGIsbS5rZXkpLGIucmV0dXJuPXkseT1iKTooYj1DZShtLnR5cGUsbS5rZXksbS5wcm9wcyxudWxsLHkubW9kZSxiKSxSdShiLG0pLGIucmV0dXJuPXkseT1iKX1yZXR1cm4gZih5KTtjYXNlIGlsOmw6e2ZvcihPPW0ua2V5O3YhPT1udWxsOyl7aWYodi5rZXk9PT1PKWlmKHYudGFnPT09NCYmdi5zdGF0ZU5vZGUuY29udGFpbmVySW5mbz09PW0uY29udGFpbmVySW5mbyYmdi5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb249PT1tLmltcGxlbWVudGF0aW9uKXthKHksdi5zaWJsaW5nKSxiPWUodixtLmNoaWxkcmVufHxbXSksYi5yZXR1cm49eSx5PWI7YnJlYWsgbH1lbHNle2EoeSx2KTticmVha31lbHNlIHQoeSx2KTt2PXYuc2libGluZ31iPUFmKG0seS5tb2RlLGIpLGIucmV0dXJuPXkseT1ifXJldHVybiBmKHkpO2Nhc2UgbHQ6cmV0dXJuIG09VGEobSksTCh5LHYsbSxiKX1pZihodChtKSlyZXR1cm4gRSh5LHYsbSxiKTtpZihLbChtKSl7aWYoTz1LbChtKSx0eXBlb2YgTyE9ImZ1bmN0aW9uIil0aHJvdyBFcnJvcihzKDE1MCkpO3JldHVybiBtPU8uY2FsbChtKSxEKHksdixtLGIpfWlmKHR5cGVvZiBtLnRoZW49PSJmdW5jdGlvbiIpcmV0dXJuIEwoeSx2LHhlKG0pLGIpO2lmKG0uJCR0eXBlb2Y9PT1wbClyZXR1cm4gTCh5LHYsamUoeSxtKSxiKTtMZSh5LG0pfXJldHVybiB0eXBlb2YgbT09InN0cmluZyImJm0hPT0iInx8dHlwZW9mIG09PSJudW1iZXIifHx0eXBlb2YgbT09ImJpZ2ludCI/KG09IiIrbSx2IT09bnVsbCYmdi50YWc9PT02PyhhKHksdi5zaWJsaW5nKSxiPWUodixtKSxiLnJldHVybj15LHk9Yik6KGEoeSx2KSxiPXpmKG0seS5tb2RlLGIpLGIucmV0dXJuPXkseT1iKSxmKHkpKTphKHksdil9cmV0dXJuIGZ1bmN0aW9uKHksdixtLGIpe3RyeXtadT0wO3ZhciBPPUwoeSx2LG0sYik7cmV0dXJuIGx1PW51bGwsT31jYXRjaChNKXtpZihNPT09UGF8fE09PT1wZSl0aHJvdyBNO3ZhciBDPVFsKDI5LE0sbnVsbCx5Lm1vZGUpO3JldHVybiBDLmxhbmVzPWIsQy5yZXR1cm49eSxDfWZpbmFsbHl7fX19dmFyIEVhPUEwKCEwKSxUMD1BMCghMSkscHQ9ITE7ZnVuY3Rpb24gQmYobCl7bC51cGRhdGVRdWV1ZT17YmFzZVN0YXRlOmwubWVtb2l6ZWRTdGF0ZSxmaXJzdEJhc2VVcGRhdGU6bnVsbCxsYXN0QmFzZVVwZGF0ZTpudWxsLHNoYXJlZDp7cGVuZGluZzpudWxsLGxhbmVzOjAsaGlkZGVuQ2FsbGJhY2tzOm51bGx9LGNhbGxiYWNrczpudWxsfX1mdW5jdGlvbiBZZihsLHQpe2w9bC51cGRhdGVRdWV1ZSx0LnVwZGF0ZVF1ZXVlPT09bCYmKHQudXBkYXRlUXVldWU9e2Jhc2VTdGF0ZTpsLmJhc2VTdGF0ZSxmaXJzdEJhc2VVcGRhdGU6bC5maXJzdEJhc2VVcGRhdGUsbGFzdEJhc2VVcGRhdGU6bC5sYXN0QmFzZVVwZGF0ZSxzaGFyZWQ6bC5zaGFyZWQsY2FsbGJhY2tzOm51bGx9KX1mdW5jdGlvbiBLdChsKXtyZXR1cm57bGFuZTpsLHRhZzowLHBheWxvYWQ6bnVsbCxjYWxsYmFjazpudWxsLG5leHQ6bnVsbH19ZnVuY3Rpb24geHQobCx0LGEpe3ZhciB1PWwudXBkYXRlUXVldWU7aWYodT09PW51bGwpcmV0dXJuIG51bGw7aWYodT11LnNoYXJlZCwoUiYyKSE9PTApe3ZhciBlPXUucGVuZGluZztyZXR1cm4gZT09PW51bGw/dC5uZXh0PXQ6KHQubmV4dD1lLm5leHQsZS5uZXh0PXQpLHUucGVuZGluZz10LHQ9R2UobCksdTAobCxudWxsLGEpLHR9cmV0dXJuIFhlKGwsdSx0LGEpLEdlKGwpfWZ1bmN0aW9uIGp1KGwsdCxhKXtpZih0PXQudXBkYXRlUXVldWUsdCE9PW51bGwmJih0PXQuc2hhcmVkLChhJjQxOTQwNDgpIT09MCkpe3ZhciB1PXQubGFuZXM7dSY9bC5wZW5kaW5nTGFuZXMsYXw9dSx0LmxhbmVzPWEsbWkobCxhKX19ZnVuY3Rpb24gUWYobCx0KXt2YXIgYT1sLnVwZGF0ZVF1ZXVlLHU9bC5hbHRlcm5hdGU7aWYodSE9PW51bGwmJih1PXUudXBkYXRlUXVldWUsYT09PXUpKXt2YXIgZT1udWxsLG49bnVsbDtpZihhPWEuZmlyc3RCYXNlVXBkYXRlLGEhPT1udWxsKXtkb3t2YXIgZj17bGFuZTphLmxhbmUsdGFnOmEudGFnLHBheWxvYWQ6YS5wYXlsb2FkLGNhbGxiYWNrOm51bGwsbmV4dDpudWxsfTtuPT09bnVsbD9lPW49ZjpuPW4ubmV4dD1mLGE9YS5uZXh0fXdoaWxlKGEhPT1udWxsKTtuPT09bnVsbD9lPW49dDpuPW4ubmV4dD10fWVsc2UgZT1uPXQ7YT17YmFzZVN0YXRlOnUuYmFzZVN0YXRlLGZpcnN0QmFzZVVwZGF0ZTplLGxhc3RCYXNlVXBkYXRlOm4sc2hhcmVkOnUuc2hhcmVkLGNhbGxiYWNrczp1LmNhbGxiYWNrc30sbC51cGRhdGVRdWV1ZT1hO3JldHVybn1sPWEubGFzdEJhc2VVcGRhdGUsbD09PW51bGw/YS5maXJzdEJhc2VVcGRhdGU9dDpsLm5leHQ9dCxhLmxhc3RCYXNlVXBkYXRlPXR9dmFyIFhmPSExO2Z1bmN0aW9uIFZ1KCl7aWYoWGYpe3ZhciBsPUlhO2lmKGwhPT1udWxsKXRocm93IGx9fWZ1bmN0aW9uIHB1KGwsdCxhLHUpe1hmPSExO3ZhciBlPWwudXBkYXRlUXVldWU7cHQ9ITE7dmFyIG49ZS5maXJzdEJhc2VVcGRhdGUsZj1lLmxhc3RCYXNlVXBkYXRlLGM9ZS5zaGFyZWQucGVuZGluZztpZihjIT09bnVsbCl7ZS5zaGFyZWQucGVuZGluZz1udWxsO3ZhciBpPWMsaD1pLm5leHQ7aS5uZXh0PW51bGwsZj09PW51bGw/bj1oOmYubmV4dD1oLGY9aTt2YXIgZz1sLmFsdGVybmF0ZTtnIT09bnVsbCYmKGc9Zy51cGRhdGVRdWV1ZSxjPWcubGFzdEJhc2VVcGRhdGUsYyE9PWYmJihjPT09bnVsbD9nLmZpcnN0QmFzZVVwZGF0ZT1oOmMubmV4dD1oLGcubGFzdEJhc2VVcGRhdGU9aSkpfWlmKG4hPT1udWxsKXt2YXIgQT1lLmJhc2VTdGF0ZTtmPTAsZz1oPWk9bnVsbCxjPW47ZG97dmFyIGQ9Yy5sYW5lJi01MzY4NzA5MTMsUz1kIT09Yy5sYW5lO2lmKFM/KFkmZCk9PT1kOih1JmQpPT09ZCl7ZCE9PTAmJmQ9PT1rYSYmKFhmPSEwKSxnIT09bnVsbCYmKGc9Zy5uZXh0PXtsYW5lOjAsdGFnOmMudGFnLHBheWxvYWQ6Yy5wYXlsb2FkLGNhbGxiYWNrOm51bGwsbmV4dDpudWxsfSk7bDp7dmFyIEU9bCxEPWM7ZD10O3ZhciBMPWE7c3dpdGNoKEQudGFnKXtjYXNlIDE6aWYoRT1ELnBheWxvYWQsdHlwZW9mIEU9PSJmdW5jdGlvbiIpe0E9RS5jYWxsKEwsQSxkKTticmVhayBsfUE9RTticmVhayBsO2Nhc2UgMzpFLmZsYWdzPUUuZmxhZ3MmLTY1NTM3fDEyODtjYXNlIDA6aWYoRT1ELnBheWxvYWQsZD10eXBlb2YgRT09ImZ1bmN0aW9uIj9FLmNhbGwoTCxBLGQpOkUsZD09bnVsbClicmVhayBsO0E9Xyh7fSxBLGQpO2JyZWFrIGw7Y2FzZSAyOnB0PSEwfX1kPWMuY2FsbGJhY2ssZCE9PW51bGwmJihsLmZsYWdzfD02NCxTJiYobC5mbGFnc3w9ODE5MiksUz1lLmNhbGxiYWNrcyxTPT09bnVsbD9lLmNhbGxiYWNrcz1bZF06Uy5wdXNoKGQpKX1lbHNlIFM9e2xhbmU6ZCx0YWc6Yy50YWcscGF5bG9hZDpjLnBheWxvYWQsY2FsbGJhY2s6Yy5jYWxsYmFjayxuZXh0Om51bGx9LGc9PT1udWxsPyhoPWc9UyxpPUEpOmc9Zy5uZXh0PVMsZnw9ZDtpZihjPWMubmV4dCxjPT09bnVsbCl7aWYoYz1lLnNoYXJlZC5wZW5kaW5nLGM9PT1udWxsKWJyZWFrO1M9YyxjPVMubmV4dCxTLm5leHQ9bnVsbCxlLmxhc3RCYXNlVXBkYXRlPVMsZS5zaGFyZWQucGVuZGluZz1udWxsfX13aGlsZSghMCk7Zz09PW51bGwmJihpPUEpLGUuYmFzZVN0YXRlPWksZS5maXJzdEJhc2VVcGRhdGU9aCxlLmxhc3RCYXNlVXBkYXRlPWcsbj09PW51bGwmJihlLnNoYXJlZC5sYW5lcz0wKSwkdHw9ZixsLmxhbmVzPWYsbC5tZW1vaXplZFN0YXRlPUF9fWZ1bmN0aW9uIG8wKGwsdCl7aWYodHlwZW9mIGwhPSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IocygxOTEsbCkpO2wuY2FsbCh0KX1mdW5jdGlvbiBFMChsLHQpe3ZhciBhPWwuY2FsbGJhY2tzO2lmKGEhPT1udWxsKWZvcihsLmNhbGxiYWNrcz1udWxsLGw9MDtsPGEubGVuZ3RoO2wrKylvMChhW2xdLHQpfXZhciB0dT1BbChudWxsKSxKZT1BbCgwKTtmdW5jdGlvbiBNMChsLHQpe2w9SHQsaihKZSxsKSxqKHR1LHQpLEh0PWx8dC5iYXNlTGFuZXN9ZnVuY3Rpb24gR2YoKXtqKEplLEh0KSxqKHR1LHR1LmN1cnJlbnQpfWZ1bmN0aW9uIENmKCl7SHQ9SmUuY3VycmVudCxJKHR1KSxJKEplKX12YXIgWGw9QWwobnVsbCkscmw9bnVsbDtmdW5jdGlvbiBMdChsKXt2YXIgdD1sLmFsdGVybmF0ZTtqKGFsLGFsLmN1cnJlbnQmMSksaihYbCxsKSxybD09PW51bGwmJih0PT09bnVsbHx8dHUuY3VycmVudCE9PW51bGx8fHQubWVtb2l6ZWRTdGF0ZSE9PW51bGwpJiYocmw9bCl9ZnVuY3Rpb24gWmYobCl7aihhbCxhbC5jdXJyZW50KSxqKFhsLGwpLHJsPT09bnVsbCYmKHJsPWwpfWZ1bmN0aW9uIE8wKGwpe2wudGFnPT09MjI/KGooYWwsYWwuY3VycmVudCksaihYbCxsKSxybD09PW51bGwmJihybD1sKSk6SnQoKX1mdW5jdGlvbiBKdCgpe2ooYWwsYWwuY3VycmVudCksaihYbCxYbC5jdXJyZW50KX1mdW5jdGlvbiBHbChsKXtJKFhsKSxybD09PWwmJihybD1udWxsKSxJKGFsKX12YXIgYWw9QWwoMCk7ZnVuY3Rpb24gV2UobCl7Zm9yKHZhciB0PWw7dCE9PW51bGw7KXtpZih0LnRhZz09PTEzKXt2YXIgYT10Lm1lbW9pemVkU3RhdGU7aWYoYSE9PW51bGwmJihhPWEuZGVoeWRyYXRlZCxhPT09bnVsbHx8eGMoYSl8fExjKGEpKSlyZXR1cm4gdH1lbHNlIGlmKHQudGFnPT09MTkmJih0Lm1lbW9pemVkUHJvcHMucmV2ZWFsT3JkZXI9PT0iZm9yd2FyZHMifHx0Lm1lbW9pemVkUHJvcHMucmV2ZWFsT3JkZXI9PT0iYmFja3dhcmRzInx8dC5tZW1vaXplZFByb3BzLnJldmVhbE9yZGVyPT09InVuc3RhYmxlX2xlZ2FjeS1iYWNrd2FyZHMifHx0Lm1lbW9pemVkUHJvcHMucmV2ZWFsT3JkZXI9PT0idG9nZXRoZXIiKSl7aWYoKHQuZmxhZ3MmMTI4KSE9PTApcmV0dXJuIHR9ZWxzZSBpZih0LmNoaWxkIT09bnVsbCl7dC5jaGlsZC5yZXR1cm49dCx0PXQuY2hpbGQ7Y29udGludWV9aWYodD09PWwpYnJlYWs7Zm9yKDt0LnNpYmxpbmc9PT1udWxsOyl7aWYodC5yZXR1cm49PT1udWxsfHx0LnJldHVybj09PWwpcmV0dXJuIG51bGw7dD10LnJldHVybn10LnNpYmxpbmcucmV0dXJuPXQucmV0dXJuLHQ9dC5zaWJsaW5nfXJldHVybiBudWxsfXZhciBUdD0wLEg9bnVsbCxLPW51bGwsbmw9bnVsbCx3ZT0hMSxhdT0hMSxNYT0hMSwkZT0wLEt1PTAsdXU9bnVsbCxfbT0wO2Z1bmN0aW9uIFAoKXt0aHJvdyBFcnJvcihzKDMyMSkpfWZ1bmN0aW9uIFJmKGwsdCl7aWYodD09PW51bGwpcmV0dXJuITE7Zm9yKHZhciBhPTA7YTx0Lmxlbmd0aCYmYTxsLmxlbmd0aDthKyspaWYoIVlsKGxbYV0sdFthXSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gamYobCx0LGEsdSxlLG4pe3JldHVybiBUdD1uLEg9dCx0Lm1lbW9pemVkU3RhdGU9bnVsbCx0LnVwZGF0ZVF1ZXVlPW51bGwsdC5sYW5lcz0wLHouSD1sPT09bnVsbHx8bC5tZW1vaXplZFN0YXRlPT09bnVsbD9jdjpsYyxNYT0hMSxuPWEodSxlKSxNYT0hMSxhdSYmKG49VTAodCxhLHUsZSkpLEQwKGwpLG59ZnVuY3Rpb24gRDAobCl7ei5IPUp1O3ZhciB0PUshPT1udWxsJiZLLm5leHQhPT1udWxsO2lmKFR0PTAsbmw9Sz1IPW51bGwsd2U9ITEsS3U9MCx1dT1udWxsLHQpdGhyb3cgRXJyb3IocygzMDApKTtsPT09bnVsbHx8Zmx8fChsPWwuZGVwZW5kZW5jaWVzLGwhPT1udWxsJiZSZShsKSYmKGZsPSEwKSl9ZnVuY3Rpb24gVTAobCx0LGEsdSl7SD1sO3ZhciBlPTA7ZG97aWYoYXUmJih1dT1udWxsKSxLdT0wLGF1PSExLDI1PD1lKXRocm93IEVycm9yKHMoMzAxKSk7aWYoZSs9MSxubD1LPW51bGwsbC51cGRhdGVRdWV1ZSE9bnVsbCl7dmFyIG49bC51cGRhdGVRdWV1ZTtuLmxhc3RFZmZlY3Q9bnVsbCxuLmV2ZW50cz1udWxsLG4uc3RvcmVzPW51bGwsbi5tZW1vQ2FjaGUhPW51bGwmJihuLm1lbW9DYWNoZS5pbmRleD0wKX16Lkg9aXYsbj10KGEsdSl9d2hpbGUoYXUpO3JldHVybiBufWZ1bmN0aW9uIEhtKCl7dmFyIGw9ei5ILHQ9bC51c2VTdGF0ZSgpWzBdO3JldHVybiB0PXR5cGVvZiB0LnRoZW49PSJmdW5jdGlvbiI/eHUodCk6dCxsPWwudXNlU3RhdGUoKVswXSwoSyE9PW51bGw/Sy5tZW1vaXplZFN0YXRlOm51bGwpIT09bCYmKEguZmxhZ3N8PTEwMjQpLHR9ZnVuY3Rpb24gVmYoKXt2YXIgbD0kZSE9PTA7cmV0dXJuICRlPTAsbH1mdW5jdGlvbiBwZihsLHQsYSl7dC51cGRhdGVRdWV1ZT1sLnVwZGF0ZVF1ZXVlLHQuZmxhZ3MmPS0yMDUzLGwubGFuZXMmPX5hfWZ1bmN0aW9uIEtmKGwpe2lmKHdlKXtmb3IobD1sLm1lbW9pemVkU3RhdGU7bCE9PW51bGw7KXt2YXIgdD1sLnF1ZXVlO3QhPT1udWxsJiYodC5wZW5kaW5nPW51bGwpLGw9bC5uZXh0fXdlPSExfVR0PTAsbmw9Sz1IPW51bGwsYXU9ITEsS3U9JGU9MCx1dT1udWxsfWZ1bmN0aW9uIFRsKCl7dmFyIGw9e21lbW9pemVkU3RhdGU6bnVsbCxiYXNlU3RhdGU6bnVsbCxiYXNlUXVldWU6bnVsbCxxdWV1ZTpudWxsLG5leHQ6bnVsbH07cmV0dXJuIG5sPT09bnVsbD9ILm1lbW9pemVkU3RhdGU9bmw9bDpubD1ubC5uZXh0PWwsbmx9ZnVuY3Rpb24gdWwoKXtpZihLPT09bnVsbCl7dmFyIGw9SC5hbHRlcm5hdGU7bD1sIT09bnVsbD9sLm1lbW9pemVkU3RhdGU6bnVsbH1lbHNlIGw9Sy5uZXh0O3ZhciB0PW5sPT09bnVsbD9ILm1lbW9pemVkU3RhdGU6bmwubmV4dDtpZih0IT09bnVsbClubD10LEs9bDtlbHNle2lmKGw9PT1udWxsKXRocm93IEguYWx0ZXJuYXRlPT09bnVsbD9FcnJvcihzKDQ2NykpOkVycm9yKHMoMzEwKSk7Sz1sLGw9e21lbW9pemVkU3RhdGU6Sy5tZW1vaXplZFN0YXRlLGJhc2VTdGF0ZTpLLmJhc2VTdGF0ZSxiYXNlUXVldWU6Sy5iYXNlUXVldWUscXVldWU6Sy5xdWV1ZSxuZXh0Om51bGx9LG5sPT09bnVsbD9ILm1lbW9pemVkU3RhdGU9bmw9bDpubD1ubC5uZXh0PWx9cmV0dXJuIG5sfWZ1bmN0aW9uIEZlKCl7cmV0dXJue2xhc3RFZmZlY3Q6bnVsbCxldmVudHM6bnVsbCxzdG9yZXM6bnVsbCxtZW1vQ2FjaGU6bnVsbH19ZnVuY3Rpb24geHUobCl7dmFyIHQ9S3U7cmV0dXJuIEt1Kz0xLHV1PT09bnVsbCYmKHV1PVtdKSxsPWcwKHV1LGwsdCksdD1ILChubD09PW51bGw/dC5tZW1vaXplZFN0YXRlOm5sLm5leHQpPT09bnVsbCYmKHQ9dC5hbHRlcm5hdGUsei5IPXQ9PT1udWxsfHx0Lm1lbW9pemVkU3RhdGU9PT1udWxsP2N2OmxjKSxsfWZ1bmN0aW9uIHJlKGwpe2lmKGwhPT1udWxsJiZ0eXBlb2YgbD09Im9iamVjdCIpe2lmKHR5cGVvZiBsLnRoZW49PSJmdW5jdGlvbiIpcmV0dXJuIHh1KGwpO2lmKGwuJCR0eXBlb2Y9PT1wbClyZXR1cm4gc2wobCl9dGhyb3cgRXJyb3Iocyg0MzgsU3RyaW5nKGwpKSl9ZnVuY3Rpb24geGYobCl7dmFyIHQ9bnVsbCxhPUgudXBkYXRlUXVldWU7aWYoYSE9PW51bGwmJih0PWEubWVtb0NhY2hlKSx0PT1udWxsKXt2YXIgdT1ILmFsdGVybmF0ZTt1IT09bnVsbCYmKHU9dS51cGRhdGVRdWV1ZSx1IT09bnVsbCYmKHU9dS5tZW1vQ2FjaGUsdSE9bnVsbCYmKHQ9e2RhdGE6dS5kYXRhLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5zbGljZSgpfSksaW5kZXg6MH0pKSl9aWYodD09bnVsbCYmKHQ9e2RhdGE6W10saW5kZXg6MH0pLGE9PT1udWxsJiYoYT1GZSgpLEgudXBkYXRlUXVldWU9YSksYS5tZW1vQ2FjaGU9dCxhPXQuZGF0YVt0LmluZGV4XSxhPT09dm9pZCAwKWZvcihhPXQuZGF0YVt0LmluZGV4XT1BcnJheShsKSx1PTA7dTxsO3UrKylhW3VdPWhlO3JldHVybiB0LmluZGV4KyssYX1mdW5jdGlvbiBvdChsLHQpe3JldHVybiB0eXBlb2YgdD09ImZ1bmN0aW9uIj90KGwpOnR9ZnVuY3Rpb24ga2UobCl7dmFyIHQ9dWwoKTtyZXR1cm4gTGYodCxLLGwpfWZ1bmN0aW9uIExmKGwsdCxhKXt2YXIgdT1sLnF1ZXVlO2lmKHU9PT1udWxsKXRocm93IEVycm9yKHMoMzExKSk7dS5sYXN0UmVuZGVyZWRSZWR1Y2VyPWE7dmFyIGU9bC5iYXNlUXVldWUsbj11LnBlbmRpbmc7aWYobiE9PW51bGwpe2lmKGUhPT1udWxsKXt2YXIgZj1lLm5leHQ7ZS5uZXh0PW4ubmV4dCxuLm5leHQ9Zn10LmJhc2VRdWV1ZT1lPW4sdS5wZW5kaW5nPW51bGx9aWYobj1sLmJhc2VTdGF0ZSxlPT09bnVsbClsLm1lbW9pemVkU3RhdGU9bjtlbHNle3Q9ZS5uZXh0O3ZhciBjPWY9bnVsbCxpPW51bGwsaD10LGc9ITE7ZG97dmFyIEE9aC5sYW5lJi01MzY4NzA5MTM7aWYoQSE9PWgubGFuZT8oWSZBKT09PUE6KFR0JkEpPT09QSl7dmFyIGQ9aC5yZXZlcnRMYW5lO2lmKGQ9PT0wKWkhPT1udWxsJiYoaT1pLm5leHQ9e2xhbmU6MCxyZXZlcnRMYW5lOjAsZ2VzdHVyZTpudWxsLGFjdGlvbjpoLmFjdGlvbixoYXNFYWdlclN0YXRlOmguaGFzRWFnZXJTdGF0ZSxlYWdlclN0YXRlOmguZWFnZXJTdGF0ZSxuZXh0Om51bGx9KSxBPT09a2EmJihnPSEwKTtlbHNlIGlmKChUdCZkKT09PWQpe2g9aC5uZXh0LGQ9PT1rYSYmKGc9ITApO2NvbnRpbnVlfWVsc2UgQT17bGFuZTowLHJldmVydExhbmU6aC5yZXZlcnRMYW5lLGdlc3R1cmU6bnVsbCxhY3Rpb246aC5hY3Rpb24saGFzRWFnZXJTdGF0ZTpoLmhhc0VhZ2VyU3RhdGUsZWFnZXJTdGF0ZTpoLmVhZ2VyU3RhdGUsbmV4dDpudWxsfSxpPT09bnVsbD8oYz1pPUEsZj1uKTppPWkubmV4dD1BLEgubGFuZXN8PWQsJHR8PWQ7QT1oLmFjdGlvbixNYSYmYShuLEEpLG49aC5oYXNFYWdlclN0YXRlP2guZWFnZXJTdGF0ZTphKG4sQSl9ZWxzZSBkPXtsYW5lOkEscmV2ZXJ0TGFuZTpoLnJldmVydExhbmUsZ2VzdHVyZTpoLmdlc3R1cmUsYWN0aW9uOmguYWN0aW9uLGhhc0VhZ2VyU3RhdGU6aC5oYXNFYWdlclN0YXRlLGVhZ2VyU3RhdGU6aC5lYWdlclN0YXRlLG5leHQ6bnVsbH0saT09PW51bGw/KGM9aT1kLGY9bik6aT1pLm5leHQ9ZCxILmxhbmVzfD1BLCR0fD1BO2g9aC5uZXh0fXdoaWxlKGghPT1udWxsJiZoIT09dCk7aWYoaT09PW51bGw/Zj1uOmkubmV4dD1jLCFZbChuLGwubWVtb2l6ZWRTdGF0ZSkmJihmbD0hMCxnJiYoYT1JYSxhIT09bnVsbCkpKXRocm93IGE7bC5tZW1vaXplZFN0YXRlPW4sbC5iYXNlU3RhdGU9ZixsLmJhc2VRdWV1ZT1pLHUubGFzdFJlbmRlcmVkU3RhdGU9bn1yZXR1cm4gZT09PW51bGwmJih1LmxhbmVzPTApLFtsLm1lbW9pemVkU3RhdGUsdS5kaXNwYXRjaF19ZnVuY3Rpb24gSmYobCl7dmFyIHQ9dWwoKSxhPXQucXVldWU7aWYoYT09PW51bGwpdGhyb3cgRXJyb3IocygzMTEpKTthLmxhc3RSZW5kZXJlZFJlZHVjZXI9bDt2YXIgdT1hLmRpc3BhdGNoLGU9YS5wZW5kaW5nLG49dC5tZW1vaXplZFN0YXRlO2lmKGUhPT1udWxsKXthLnBlbmRpbmc9bnVsbDt2YXIgZj1lPWUubmV4dDtkbyBuPWwobixmLmFjdGlvbiksZj1mLm5leHQ7d2hpbGUoZiE9PWUpO1lsKG4sdC5tZW1vaXplZFN0YXRlKXx8KGZsPSEwKSx0Lm1lbW9pemVkU3RhdGU9bix0LmJhc2VRdWV1ZT09PW51bGwmJih0LmJhc2VTdGF0ZT1uKSxhLmxhc3RSZW5kZXJlZFN0YXRlPW59cmV0dXJuW24sdV19ZnVuY3Rpb24gXzAobCx0LGEpe3ZhciB1PUgsZT11bCgpLG49RztpZihuKXtpZihhPT09dm9pZCAwKXRocm93IEVycm9yKHMoNDA3KSk7YT1hKCl9ZWxzZSBhPXQoKTt2YXIgZj0hWWwoKEt8fGUpLm1lbW9pemVkU3RhdGUsYSk7aWYoZiYmKGUubWVtb2l6ZWRTdGF0ZT1hLGZsPSEwKSxlPWUucXVldWUsJGYocTAuYmluZChudWxsLHUsZSxsKSxbbF0pLGUuZ2V0U25hcHNob3QhPT10fHxmfHxubCE9PW51bGwmJm5sLm1lbW9pemVkU3RhdGUudGFnJjEpe2lmKHUuZmxhZ3N8PTIwNDgsZXUoOSx7ZGVzdHJveTp2b2lkIDB9LE4wLmJpbmQobnVsbCx1LGUsYSx0KSxudWxsKSxKPT09bnVsbCl0aHJvdyBFcnJvcihzKDM0OSkpO258fChUdCYxMjcpIT09MHx8SDAodSx0LGEpfXJldHVybiBhfWZ1bmN0aW9uIEgwKGwsdCxhKXtsLmZsYWdzfD0xNjM4NCxsPXtnZXRTbmFwc2hvdDp0LHZhbHVlOmF9LHQ9SC51cGRhdGVRdWV1ZSx0PT09bnVsbD8odD1GZSgpLEgudXBkYXRlUXVldWU9dCx0LnN0b3Jlcz1bbF0pOihhPXQuc3RvcmVzLGE9PT1udWxsP3Quc3RvcmVzPVtsXTphLnB1c2gobCkpfWZ1bmN0aW9uIE4wKGwsdCxhLHUpe3QudmFsdWU9YSx0LmdldFNuYXBzaG90PXUsQjAodCkmJlkwKGwpfWZ1bmN0aW9uIHEwKGwsdCxhKXtyZXR1cm4gYShmdW5jdGlvbigpe0IwKHQpJiZZMChsKX0pfWZ1bmN0aW9uIEIwKGwpe3ZhciB0PWwuZ2V0U25hcHNob3Q7bD1sLnZhbHVlO3RyeXt2YXIgYT10KCk7cmV0dXJuIVlsKGwsYSl9Y2F0Y2h7cmV0dXJuITB9fWZ1bmN0aW9uIFkwKGwpe3ZhciB0PVNhKGwsMik7dCE9PW51bGwmJl9sKHQsbCwyKX1mdW5jdGlvbiBXZihsKXt2YXIgdD1UbCgpO2lmKHR5cGVvZiBsPT0iZnVuY3Rpb24iKXt2YXIgYT1sO2lmKGw9YSgpLE1hKXtYdCghMCk7dHJ5e2EoKX1maW5hbGx5e1h0KCExKX19fXJldHVybiB0Lm1lbW9pemVkU3RhdGU9dC5iYXNlU3RhdGU9bCx0LnF1ZXVlPXtwZW5kaW5nOm51bGwsbGFuZXM6MCxkaXNwYXRjaDpudWxsLGxhc3RSZW5kZXJlZFJlZHVjZXI6b3QsbGFzdFJlbmRlcmVkU3RhdGU6bH0sdH1mdW5jdGlvbiBRMChsLHQsYSx1KXtyZXR1cm4gbC5iYXNlU3RhdGU9YSxMZihsLEssdHlwZW9mIHU9PSJmdW5jdGlvbiI/dTpvdCl9ZnVuY3Rpb24gTm0obCx0LGEsdSxlKXtpZihsbihsKSl0aHJvdyBFcnJvcihzKDQ4NSkpO2lmKGw9dC5hY3Rpb24sbCE9PW51bGwpe3ZhciBuPXtwYXlsb2FkOmUsYWN0aW9uOmwsbmV4dDpudWxsLGlzVHJhbnNpdGlvbjohMCxzdGF0dXM6InBlbmRpbmciLHZhbHVlOm51bGwscmVhc29uOm51bGwsbGlzdGVuZXJzOltdLHRoZW46ZnVuY3Rpb24oZil7bi5saXN0ZW5lcnMucHVzaChmKX19O3ouVCE9PW51bGw/YSghMCk6bi5pc1RyYW5zaXRpb249ITEsdShuKSxhPXQucGVuZGluZyxhPT09bnVsbD8obi5uZXh0PXQucGVuZGluZz1uLFgwKHQsbikpOihuLm5leHQ9YS5uZXh0LHQucGVuZGluZz1hLm5leHQ9bil9fWZ1bmN0aW9uIFgwKGwsdCl7dmFyIGE9dC5hY3Rpb24sdT10LnBheWxvYWQsZT1sLnN0YXRlO2lmKHQuaXNUcmFuc2l0aW9uKXt2YXIgbj16LlQsZj17fTt6LlQ9Zjt0cnl7dmFyIGM9YShlLHUpLGk9ei5TO2khPT1udWxsJiZpKGYsYyksRzAobCx0LGMpfWNhdGNoKGgpe3dmKGwsdCxoKX1maW5hbGx5e24hPT1udWxsJiZmLnR5cGVzIT09bnVsbCYmKG4udHlwZXM9Zi50eXBlcyksei5UPW59fWVsc2UgdHJ5e249YShlLHUpLEcwKGwsdCxuKX1jYXRjaChoKXt3ZihsLHQsaCl9fWZ1bmN0aW9uIEcwKGwsdCxhKXthIT09bnVsbCYmdHlwZW9mIGE9PSJvYmplY3QiJiZ0eXBlb2YgYS50aGVuPT0iZnVuY3Rpb24iP2EudGhlbihmdW5jdGlvbih1KXtDMChsLHQsdSl9LGZ1bmN0aW9uKHUpe3JldHVybiB3ZihsLHQsdSl9KTpDMChsLHQsYSl9ZnVuY3Rpb24gQzAobCx0LGEpe3Quc3RhdHVzPSJmdWxmaWxsZWQiLHQudmFsdWU9YSxaMCh0KSxsLnN0YXRlPWEsdD1sLnBlbmRpbmcsdCE9PW51bGwmJihhPXQubmV4dCxhPT09dD9sLnBlbmRpbmc9bnVsbDooYT1hLm5leHQsdC5uZXh0PWEsWDAobCxhKSkpfWZ1bmN0aW9uIHdmKGwsdCxhKXt2YXIgdT1sLnBlbmRpbmc7aWYobC5wZW5kaW5nPW51bGwsdSE9PW51bGwpe3U9dS5uZXh0O2RvIHQuc3RhdHVzPSJyZWplY3RlZCIsdC5yZWFzb249YSxaMCh0KSx0PXQubmV4dDt3aGlsZSh0IT09dSl9bC5hY3Rpb249bnVsbH1mdW5jdGlvbiBaMChsKXtsPWwubGlzdGVuZXJzO2Zvcih2YXIgdD0wO3Q8bC5sZW5ndGg7dCsrKSgwLGxbdF0pKCl9ZnVuY3Rpb24gUjAobCx0KXtyZXR1cm4gdH1mdW5jdGlvbiBqMChsLHQpe2lmKEcpe3ZhciBhPUouZm9ybVN0YXRlO2lmKGEhPT1udWxsKXtsOnt2YXIgdT1IO2lmKEcpe2lmKCQpe3Q6e2Zvcih2YXIgZT0kLG49Rmw7ZS5ub2RlVHlwZSE9PTg7KXtpZighbil7ZT1udWxsO2JyZWFrIHR9aWYoZT1rbChlLm5leHRTaWJsaW5nKSxlPT09bnVsbCl7ZT1udWxsO2JyZWFrIHR9fW49ZS5kYXRhLGU9bj09PSJGISJ8fG49PT0iRiI/ZTpudWxsfWlmKGUpeyQ9a2woZS5uZXh0U2libGluZyksdT1lLmRhdGE9PT0iRiEiO2JyZWFrIGx9fWp0KHUpfXU9ITF9dSYmKHQ9YVswXSl9fXJldHVybiBhPVRsKCksYS5tZW1vaXplZFN0YXRlPWEuYmFzZVN0YXRlPXQsdT17cGVuZGluZzpudWxsLGxhbmVzOjAsZGlzcGF0Y2g6bnVsbCxsYXN0UmVuZGVyZWRSZWR1Y2VyOlIwLGxhc3RSZW5kZXJlZFN0YXRlOnR9LGEucXVldWU9dSxhPWV2LmJpbmQobnVsbCxILHUpLHUuZGlzcGF0Y2g9YSx1PVdmKCExKSxuPVBmLmJpbmQobnVsbCxILCExLHUucXVldWUpLHU9VGwoKSxlPXtzdGF0ZTp0LGRpc3BhdGNoOm51bGwsYWN0aW9uOmwscGVuZGluZzpudWxsfSx1LnF1ZXVlPWUsYT1ObS5iaW5kKG51bGwsSCxlLG4sYSksZS5kaXNwYXRjaD1hLHUubWVtb2l6ZWRTdGF0ZT1sLFt0LGEsITFdfWZ1bmN0aW9uIFYwKGwpe3ZhciB0PXVsKCk7cmV0dXJuIHAwKHQsSyxsKX1mdW5jdGlvbiBwMChsLHQsYSl7aWYodD1MZihsLHQsUjApWzBdLGw9a2Uob3QpWzBdLHR5cGVvZiB0PT0ib2JqZWN0IiYmdCE9PW51bGwmJnR5cGVvZiB0LnRoZW49PSJmdW5jdGlvbiIpdHJ5e3ZhciB1PXh1KHQpfWNhdGNoKGYpe3Rocm93IGY9PT1QYT9wZTpmfWVsc2UgdT10O3Q9dWwoKTt2YXIgZT10LnF1ZXVlLG49ZS5kaXNwYXRjaDtyZXR1cm4gYSE9PXQubWVtb2l6ZWRTdGF0ZSYmKEguZmxhZ3N8PTIwNDgsZXUoOSx7ZGVzdHJveTp2b2lkIDB9LHFtLmJpbmQobnVsbCxlLGEpLG51bGwpKSxbdSxuLGxdfWZ1bmN0aW9uIHFtKGwsdCl7bC5hY3Rpb249dH1mdW5jdGlvbiBLMChsKXt2YXIgdD11bCgpLGE9SztpZihhIT09bnVsbClyZXR1cm4gcDAodCxhLGwpO3VsKCksdD10Lm1lbW9pemVkU3RhdGUsYT11bCgpO3ZhciB1PWEucXVldWUuZGlzcGF0Y2g7cmV0dXJuIGEubWVtb2l6ZWRTdGF0ZT1sLFt0LHUsITFdfWZ1bmN0aW9uIGV1KGwsdCxhLHUpe3JldHVybiBsPXt0YWc6bCxjcmVhdGU6YSxkZXBzOnUsaW5zdDp0LG5leHQ6bnVsbH0sdD1ILnVwZGF0ZVF1ZXVlLHQ9PT1udWxsJiYodD1GZSgpLEgudXBkYXRlUXVldWU9dCksYT10Lmxhc3RFZmZlY3QsYT09PW51bGw/dC5sYXN0RWZmZWN0PWwubmV4dD1sOih1PWEubmV4dCxhLm5leHQ9bCxsLm5leHQ9dSx0Lmxhc3RFZmZlY3Q9bCksbH1mdW5jdGlvbiB4MCgpe3JldHVybiB1bCgpLm1lbW9pemVkU3RhdGV9ZnVuY3Rpb24gSWUobCx0LGEsdSl7dmFyIGU9VGwoKTtILmZsYWdzfD1sLGUubWVtb2l6ZWRTdGF0ZT1ldSgxfHQse2Rlc3Ryb3k6dm9pZCAwfSxhLHU9PT12b2lkIDA/bnVsbDp1KX1mdW5jdGlvbiBQZShsLHQsYSx1KXt2YXIgZT11bCgpO3U9dT09PXZvaWQgMD9udWxsOnU7dmFyIG49ZS5tZW1vaXplZFN0YXRlLmluc3Q7SyE9PW51bGwmJnUhPT1udWxsJiZSZih1LEsubWVtb2l6ZWRTdGF0ZS5kZXBzKT9lLm1lbW9pemVkU3RhdGU9ZXUodCxuLGEsdSk6KEguZmxhZ3N8PWwsZS5tZW1vaXplZFN0YXRlPWV1KDF8dCxuLGEsdSkpfWZ1bmN0aW9uIEwwKGwsdCl7SWUoODM5MDY1Niw4LGwsdCl9ZnVuY3Rpb24gJGYobCx0KXtQZSgyMDQ4LDgsbCx0KX1mdW5jdGlvbiBCbShsKXtILmZsYWdzfD00O3ZhciB0PUgudXBkYXRlUXVldWU7aWYodD09PW51bGwpdD1GZSgpLEgudXBkYXRlUXVldWU9dCx0LmV2ZW50cz1bbF07ZWxzZXt2YXIgYT10LmV2ZW50czthPT09bnVsbD90LmV2ZW50cz1bbF06YS5wdXNoKGwpfX1mdW5jdGlvbiBKMChsKXt2YXIgdD11bCgpLm1lbW9pemVkU3RhdGU7cmV0dXJuIEJtKHtyZWY6dCxuZXh0SW1wbDpsfSksZnVuY3Rpb24oKXtpZigoUiYyKSE9PTApdGhyb3cgRXJyb3Iocyg0NDApKTtyZXR1cm4gdC5pbXBsLmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpfX1mdW5jdGlvbiBXMChsLHQpe3JldHVybiBQZSg0LDIsbCx0KX1mdW5jdGlvbiB3MChsLHQpe3JldHVybiBQZSg0LDQsbCx0KX1mdW5jdGlvbiAkMChsLHQpe2lmKHR5cGVvZiB0PT0iZnVuY3Rpb24iKXtsPWwoKTt2YXIgYT10KGwpO3JldHVybiBmdW5jdGlvbigpe3R5cGVvZiBhPT0iZnVuY3Rpb24iP2EoKTp0KG51bGwpfX1pZih0IT1udWxsKXJldHVybiBsPWwoKSx0LmN1cnJlbnQ9bCxmdW5jdGlvbigpe3QuY3VycmVudD1udWxsfX1mdW5jdGlvbiBGMChsLHQsYSl7YT1hIT1udWxsP2EuY29uY2F0KFtsXSk6bnVsbCxQZSg0LDQsJDAuYmluZChudWxsLHQsbCksYSl9ZnVuY3Rpb24gRmYoKXt9ZnVuY3Rpb24gcjAobCx0KXt2YXIgYT11bCgpO3Q9dD09PXZvaWQgMD9udWxsOnQ7dmFyIHU9YS5tZW1vaXplZFN0YXRlO3JldHVybiB0IT09bnVsbCYmUmYodCx1WzFdKT91WzBdOihhLm1lbW9pemVkU3RhdGU9W2wsdF0sbCl9ZnVuY3Rpb24gazAobCx0KXt2YXIgYT11bCgpO3Q9dD09PXZvaWQgMD9udWxsOnQ7dmFyIHU9YS5tZW1vaXplZFN0YXRlO2lmKHQhPT1udWxsJiZSZih0LHVbMV0pKXJldHVybiB1WzBdO2lmKHU9bCgpLE1hKXtYdCghMCk7dHJ5e2woKX1maW5hbGx5e1h0KCExKX19cmV0dXJuIGEubWVtb2l6ZWRTdGF0ZT1bdSx0XSx1fWZ1bmN0aW9uIHJmKGwsdCxhKXtyZXR1cm4gYT09PXZvaWQgMHx8KFR0JjEwNzM3NDE4MjQpIT09MCYmKFkmMjYxOTMwKT09PTA/bC5tZW1vaXplZFN0YXRlPXQ6KGwubWVtb2l6ZWRTdGF0ZT1hLGw9SXYoKSxILmxhbmVzfD1sLCR0fD1sLGEpfWZ1bmN0aW9uIEkwKGwsdCxhLHUpe3JldHVybiBZbChhLHQpP2E6dHUuY3VycmVudCE9PW51bGw/KGw9cmYobCxhLHUpLFlsKGwsdCl8fChmbD0hMCksbCk6KFR0JjQyKT09PTB8fChUdCYxMDczNzQxODI0KSE9PTAmJihZJjI2MTkzMCk9PT0wPyhmbD0hMCxsLm1lbW9pemVkU3RhdGU9YSk6KGw9SXYoKSxILmxhbmVzfD1sLCR0fD1sLHQpfWZ1bmN0aW9uIFAwKGwsdCxhLHUsZSl7dmFyIG49by5wO28ucD1uIT09MCYmOD5uP246ODt2YXIgZj16LlQsYz17fTt6LlQ9YyxQZihsLCExLHQsYSk7dHJ5e3ZhciBpPWUoKSxoPXouUztpZihoIT09bnVsbCYmaChjLGkpLGkhPT1udWxsJiZ0eXBlb2YgaT09Im9iamVjdCImJnR5cGVvZiBpLnRoZW49PSJmdW5jdGlvbiIpe3ZhciBnPVVtKGksdSk7THUobCx0LGcsUmwobCkpfWVsc2UgTHUobCx0LHUsUmwobCkpfWNhdGNoKEEpe0x1KGwsdCx7dGhlbjpmdW5jdGlvbigpe30sc3RhdHVzOiJyZWplY3RlZCIscmVhc29uOkF9LFJsKCkpfWZpbmFsbHl7by5wPW4sZiE9PW51bGwmJmMudHlwZXMhPT1udWxsJiYoZi50eXBlcz1jLnR5cGVzKSx6LlQ9Zn19ZnVuY3Rpb24gWW0oKXt9ZnVuY3Rpb24ga2YobCx0LGEsdSl7aWYobC50YWchPT01KXRocm93IEVycm9yKHMoNDc2KSk7dmFyIGU9bHYobCkucXVldWU7UDAobCxlLHQsVSxhPT09bnVsbD9ZbTpmdW5jdGlvbigpe3JldHVybiB0dihsKSxhKHUpfSl9ZnVuY3Rpb24gbHYobCl7dmFyIHQ9bC5tZW1vaXplZFN0YXRlO2lmKHQhPT1udWxsKXJldHVybiB0O3Q9e21lbW9pemVkU3RhdGU6VSxiYXNlU3RhdGU6VSxiYXNlUXVldWU6bnVsbCxxdWV1ZTp7cGVuZGluZzpudWxsLGxhbmVzOjAsZGlzcGF0Y2g6bnVsbCxsYXN0UmVuZGVyZWRSZWR1Y2VyOm90LGxhc3RSZW5kZXJlZFN0YXRlOlV9LG5leHQ6bnVsbH07dmFyIGE9e307cmV0dXJuIHQubmV4dD17bWVtb2l6ZWRTdGF0ZTphLGJhc2VTdGF0ZTphLGJhc2VRdWV1ZTpudWxsLHF1ZXVlOntwZW5kaW5nOm51bGwsbGFuZXM6MCxkaXNwYXRjaDpudWxsLGxhc3RSZW5kZXJlZFJlZHVjZXI6b3QsbGFzdFJlbmRlcmVkU3RhdGU6YX0sbmV4dDpudWxsfSxsLm1lbW9pemVkU3RhdGU9dCxsPWwuYWx0ZXJuYXRlLGwhPT1udWxsJiYobC5tZW1vaXplZFN0YXRlPXQpLHR9ZnVuY3Rpb24gdHYobCl7dmFyIHQ9bHYobCk7dC5uZXh0PT09bnVsbCYmKHQ9bC5hbHRlcm5hdGUubWVtb2l6ZWRTdGF0ZSksTHUobCx0Lm5leHQucXVldWUse30sUmwoKSl9ZnVuY3Rpb24gSWYoKXtyZXR1cm4gc2woY2UpfWZ1bmN0aW9uIGF2KCl7cmV0dXJuIHVsKCkubWVtb2l6ZWRTdGF0ZX1mdW5jdGlvbiB1digpe3JldHVybiB1bCgpLm1lbW9pemVkU3RhdGV9ZnVuY3Rpb24gUW0obCl7Zm9yKHZhciB0PWwucmV0dXJuO3QhPT1udWxsOyl7c3dpdGNoKHQudGFnKXtjYXNlIDI0OmNhc2UgMzp2YXIgYT1SbCgpO2w9S3QoYSk7dmFyIHU9eHQodCxsLGEpO3UhPT1udWxsJiYoX2wodSx0LGEpLGp1KHUsdCxhKSksdD17Y2FjaGU6X2YoKX0sbC5wYXlsb2FkPXQ7cmV0dXJufXQ9dC5yZXR1cm59fWZ1bmN0aW9uIFhtKGwsdCxhKXt2YXIgdT1SbCgpO2E9e2xhbmU6dSxyZXZlcnRMYW5lOjAsZ2VzdHVyZTpudWxsLGFjdGlvbjphLGhhc0VhZ2VyU3RhdGU6ITEsZWFnZXJTdGF0ZTpudWxsLG5leHQ6bnVsbH0sbG4obCk/bnYodCxhKTooYT1nZihsLHQsYSx1KSxhIT09bnVsbCYmKF9sKGEsbCx1KSxmdihhLHQsdSkpKX1mdW5jdGlvbiBldihsLHQsYSl7dmFyIHU9UmwoKTtMdShsLHQsYSx1KX1mdW5jdGlvbiBMdShsLHQsYSx1KXt2YXIgZT17bGFuZTp1LHJldmVydExhbmU6MCxnZXN0dXJlOm51bGwsYWN0aW9uOmEsaGFzRWFnZXJTdGF0ZTohMSxlYWdlclN0YXRlOm51bGwsbmV4dDpudWxsfTtpZihsbihsKSludih0LGUpO2Vsc2V7dmFyIG49bC5hbHRlcm5hdGU7aWYobC5sYW5lcz09PTAmJihuPT09bnVsbHx8bi5sYW5lcz09PTApJiYobj10Lmxhc3RSZW5kZXJlZFJlZHVjZXIsbiE9PW51bGwpKXRyeXt2YXIgZj10Lmxhc3RSZW5kZXJlZFN0YXRlLGM9bihmLGEpO2lmKGUuaGFzRWFnZXJTdGF0ZT0hMCxlLmVhZ2VyU3RhdGU9YyxZbChjLGYpKXJldHVybiBYZShsLHQsZSwwKSxKPT09bnVsbCYmUWUoKSwhMX1jYXRjaHt9ZmluYWxseXt9aWYoYT1nZihsLHQsZSx1KSxhIT09bnVsbClyZXR1cm4gX2woYSxsLHUpLGZ2KGEsdCx1KSwhMH1yZXR1cm4hMX1mdW5jdGlvbiBQZihsLHQsYSx1KXtpZih1PXtsYW5lOjIscmV2ZXJ0TGFuZTpCYygpLGdlc3R1cmU6bnVsbCxhY3Rpb246dSxoYXNFYWdlclN0YXRlOiExLGVhZ2VyU3RhdGU6bnVsbCxuZXh0Om51bGx9LGxuKGwpKXtpZih0KXRocm93IEVycm9yKHMoNDc5KSl9ZWxzZSB0PWdmKGwsYSx1LDIpLHQhPT1udWxsJiZfbCh0LGwsMil9ZnVuY3Rpb24gbG4obCl7dmFyIHQ9bC5hbHRlcm5hdGU7cmV0dXJuIGw9PT1IfHx0IT09bnVsbCYmdD09PUh9ZnVuY3Rpb24gbnYobCx0KXthdT13ZT0hMDt2YXIgYT1sLnBlbmRpbmc7YT09PW51bGw/dC5uZXh0PXQ6KHQubmV4dD1hLm5leHQsYS5uZXh0PXQpLGwucGVuZGluZz10fWZ1bmN0aW9uIGZ2KGwsdCxhKXtpZigoYSY0MTk0MDQ4KSE9PTApe3ZhciB1PXQubGFuZXM7dSY9bC5wZW5kaW5nTGFuZXMsYXw9dSx0LmxhbmVzPWEsbWkobCxhKX19dmFyIEp1PXtyZWFkQ29udGV4dDpzbCx1c2U6cmUsdXNlQ2FsbGJhY2s6UCx1c2VDb250ZXh0OlAsdXNlRWZmZWN0OlAsdXNlSW1wZXJhdGl2ZUhhbmRsZTpQLHVzZUxheW91dEVmZmVjdDpQLHVzZUluc2VydGlvbkVmZmVjdDpQLHVzZU1lbW86UCx1c2VSZWR1Y2VyOlAsdXNlUmVmOlAsdXNlU3RhdGU6UCx1c2VEZWJ1Z1ZhbHVlOlAsdXNlRGVmZXJyZWRWYWx1ZTpQLHVzZVRyYW5zaXRpb246UCx1c2VTeW5jRXh0ZXJuYWxTdG9yZTpQLHVzZUlkOlAsdXNlSG9zdFRyYW5zaXRpb25TdGF0dXM6UCx1c2VGb3JtU3RhdGU6UCx1c2VBY3Rpb25TdGF0ZTpQLHVzZU9wdGltaXN0aWM6UCx1c2VNZW1vQ2FjaGU6UCx1c2VDYWNoZVJlZnJlc2g6UH07SnUudXNlRWZmZWN0RXZlbnQ9UDt2YXIgY3Y9e3JlYWRDb250ZXh0OnNsLHVzZTpyZSx1c2VDYWxsYmFjazpmdW5jdGlvbihsLHQpe3JldHVybiBUbCgpLm1lbW9pemVkU3RhdGU9W2wsdD09PXZvaWQgMD9udWxsOnRdLGx9LHVzZUNvbnRleHQ6c2wsdXNlRWZmZWN0OkwwLHVzZUltcGVyYXRpdmVIYW5kbGU6ZnVuY3Rpb24obCx0LGEpe2E9YSE9bnVsbD9hLmNvbmNhdChbbF0pOm51bGwsSWUoNDE5NDMwOCw0LCQwLmJpbmQobnVsbCx0LGwpLGEpfSx1c2VMYXlvdXRFZmZlY3Q6ZnVuY3Rpb24obCx0KXtyZXR1cm4gSWUoNDE5NDMwOCw0LGwsdCl9LHVzZUluc2VydGlvbkVmZmVjdDpmdW5jdGlvbihsLHQpe0llKDQsMixsLHQpfSx1c2VNZW1vOmZ1bmN0aW9uKGwsdCl7dmFyIGE9VGwoKTt0PXQ9PT12b2lkIDA/bnVsbDp0O3ZhciB1PWwoKTtpZihNYSl7WHQoITApO3RyeXtsKCl9ZmluYWxseXtYdCghMSl9fXJldHVybiBhLm1lbW9pemVkU3RhdGU9W3UsdF0sdX0sdXNlUmVkdWNlcjpmdW5jdGlvbihsLHQsYSl7dmFyIHU9VGwoKTtpZihhIT09dm9pZCAwKXt2YXIgZT1hKHQpO2lmKE1hKXtYdCghMCk7dHJ5e2EodCl9ZmluYWxseXtYdCghMSl9fX1lbHNlIGU9dDtyZXR1cm4gdS5tZW1vaXplZFN0YXRlPXUuYmFzZVN0YXRlPWUsbD17cGVuZGluZzpudWxsLGxhbmVzOjAsZGlzcGF0Y2g6bnVsbCxsYXN0UmVuZGVyZWRSZWR1Y2VyOmwsbGFzdFJlbmRlcmVkU3RhdGU6ZX0sdS5xdWV1ZT1sLGw9bC5kaXNwYXRjaD1YbS5iaW5kKG51bGwsSCxsKSxbdS5tZW1vaXplZFN0YXRlLGxdfSx1c2VSZWY6ZnVuY3Rpb24obCl7dmFyIHQ9VGwoKTtyZXR1cm4gbD17Y3VycmVudDpsfSx0Lm1lbW9pemVkU3RhdGU9bH0sdXNlU3RhdGU6ZnVuY3Rpb24obCl7bD1XZihsKTt2YXIgdD1sLnF1ZXVlLGE9ZXYuYmluZChudWxsLEgsdCk7cmV0dXJuIHQuZGlzcGF0Y2g9YSxbbC5tZW1vaXplZFN0YXRlLGFdfSx1c2VEZWJ1Z1ZhbHVlOkZmLHVzZURlZmVycmVkVmFsdWU6ZnVuY3Rpb24obCx0KXt2YXIgYT1UbCgpO3JldHVybiByZihhLGwsdCl9LHVzZVRyYW5zaXRpb246ZnVuY3Rpb24oKXt2YXIgbD1XZighMSk7cmV0dXJuIGw9UDAuYmluZChudWxsLEgsbC5xdWV1ZSwhMCwhMSksVGwoKS5tZW1vaXplZFN0YXRlPWwsWyExLGxdfSx1c2VTeW5jRXh0ZXJuYWxTdG9yZTpmdW5jdGlvbihsLHQsYSl7dmFyIHU9SCxlPVRsKCk7aWYoRyl7aWYoYT09PXZvaWQgMCl0aHJvdyBFcnJvcihzKDQwNykpO2E9YSgpfWVsc2V7aWYoYT10KCksSj09PW51bGwpdGhyb3cgRXJyb3IocygzNDkpKTsoWSYxMjcpIT09MHx8SDAodSx0LGEpfWUubWVtb2l6ZWRTdGF0ZT1hO3ZhciBuPXt2YWx1ZTphLGdldFNuYXBzaG90OnR9O3JldHVybiBlLnF1ZXVlPW4sTDAocTAuYmluZChudWxsLHUsbixsKSxbbF0pLHUuZmxhZ3N8PTIwNDgsZXUoOSx7ZGVzdHJveTp2b2lkIDB9LE4wLmJpbmQobnVsbCx1LG4sYSx0KSxudWxsKSxhfSx1c2VJZDpmdW5jdGlvbigpe3ZhciBsPVRsKCksdD1KLmlkZW50aWZpZXJQcmVmaXg7aWYoRyl7dmFyIGE9Y3QsdT1mdDthPSh1Jn4oMTw8MzItQmwodSktMSkpLnRvU3RyaW5nKDMyKSthLHQ9Il8iK3QrIlJfIithLGE9JGUrKywwPGEmJih0Kz0iSCIrYS50b1N0cmluZygzMikpLHQrPSJfIn1lbHNlIGE9X20rKyx0PSJfIit0KyJyXyIrYS50b1N0cmluZygzMikrIl8iO3JldHVybiBsLm1lbW9pemVkU3RhdGU9dH0sdXNlSG9zdFRyYW5zaXRpb25TdGF0dXM6SWYsdXNlRm9ybVN0YXRlOmowLHVzZUFjdGlvblN0YXRlOmowLHVzZU9wdGltaXN0aWM6ZnVuY3Rpb24obCl7dmFyIHQ9VGwoKTt0Lm1lbW9pemVkU3RhdGU9dC5iYXNlU3RhdGU9bDt2YXIgYT17cGVuZGluZzpudWxsLGxhbmVzOjAsZGlzcGF0Y2g6bnVsbCxsYXN0UmVuZGVyZWRSZWR1Y2VyOm51bGwsbGFzdFJlbmRlcmVkU3RhdGU6bnVsbH07cmV0dXJuIHQucXVldWU9YSx0PVBmLmJpbmQobnVsbCxILCEwLGEpLGEuZGlzcGF0Y2g9dCxbbCx0XX0sdXNlTWVtb0NhY2hlOnhmLHVzZUNhY2hlUmVmcmVzaDpmdW5jdGlvbigpe3JldHVybiBUbCgpLm1lbW9pemVkU3RhdGU9UW0uYmluZChudWxsLEgpfSx1c2VFZmZlY3RFdmVudDpmdW5jdGlvbihsKXt2YXIgdD1UbCgpLGE9e2ltcGw6bH07cmV0dXJuIHQubWVtb2l6ZWRTdGF0ZT1hLGZ1bmN0aW9uKCl7aWYoKFImMikhPT0wKXRocm93IEVycm9yKHMoNDQwKSk7cmV0dXJuIGEuaW1wbC5hcHBseSh2b2lkIDAsYXJndW1lbnRzKX19fSxsYz17cmVhZENvbnRleHQ6c2wsdXNlOnJlLHVzZUNhbGxiYWNrOnIwLHVzZUNvbnRleHQ6c2wsdXNlRWZmZWN0OiRmLHVzZUltcGVyYXRpdmVIYW5kbGU6RjAsdXNlSW5zZXJ0aW9uRWZmZWN0OlcwLHVzZUxheW91dEVmZmVjdDp3MCx1c2VNZW1vOmswLHVzZVJlZHVjZXI6a2UsdXNlUmVmOngwLHVzZVN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIGtlKG90KX0sdXNlRGVidWdWYWx1ZTpGZix1c2VEZWZlcnJlZFZhbHVlOmZ1bmN0aW9uKGwsdCl7dmFyIGE9dWwoKTtyZXR1cm4gSTAoYSxLLm1lbW9pemVkU3RhdGUsbCx0KX0sdXNlVHJhbnNpdGlvbjpmdW5jdGlvbigpe3ZhciBsPWtlKG90KVswXSx0PXVsKCkubWVtb2l6ZWRTdGF0ZTtyZXR1cm5bdHlwZW9mIGw9PSJib29sZWFuIj9sOnh1KGwpLHRdfSx1c2VTeW5jRXh0ZXJuYWxTdG9yZTpfMCx1c2VJZDphdix1c2VIb3N0VHJhbnNpdGlvblN0YXR1czpJZix1c2VGb3JtU3RhdGU6VjAsdXNlQWN0aW9uU3RhdGU6VjAsdXNlT3B0aW1pc3RpYzpmdW5jdGlvbihsLHQpe3ZhciBhPXVsKCk7cmV0dXJuIFEwKGEsSyxsLHQpfSx1c2VNZW1vQ2FjaGU6eGYsdXNlQ2FjaGVSZWZyZXNoOnV2fTtsYy51c2VFZmZlY3RFdmVudD1KMDt2YXIgaXY9e3JlYWRDb250ZXh0OnNsLHVzZTpyZSx1c2VDYWxsYmFjazpyMCx1c2VDb250ZXh0OnNsLHVzZUVmZmVjdDokZix1c2VJbXBlcmF0aXZlSGFuZGxlOkYwLHVzZUluc2VydGlvbkVmZmVjdDpXMCx1c2VMYXlvdXRFZmZlY3Q6dzAsdXNlTWVtbzprMCx1c2VSZWR1Y2VyOkpmLHVzZVJlZjp4MCx1c2VTdGF0ZTpmdW5jdGlvbigpe3JldHVybiBKZihvdCl9LHVzZURlYnVnVmFsdWU6RmYsdXNlRGVmZXJyZWRWYWx1ZTpmdW5jdGlvbihsLHQpe3ZhciBhPXVsKCk7cmV0dXJuIEs9PT1udWxsP3JmKGEsbCx0KTpJMChhLEsubWVtb2l6ZWRTdGF0ZSxsLHQpfSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGw9SmYob3QpWzBdLHQ9dWwoKS5tZW1vaXplZFN0YXRlO3JldHVyblt0eXBlb2YgbD09ImJvb2xlYW4iP2w6eHUobCksdF19LHVzZVN5bmNFeHRlcm5hbFN0b3JlOl8wLHVzZUlkOmF2LHVzZUhvc3RUcmFuc2l0aW9uU3RhdHVzOklmLHVzZUZvcm1TdGF0ZTpLMCx1c2VBY3Rpb25TdGF0ZTpLMCx1c2VPcHRpbWlzdGljOmZ1bmN0aW9uKGwsdCl7dmFyIGE9dWwoKTtyZXR1cm4gSyE9PW51bGw/UTAoYSxLLGwsdCk6KGEuYmFzZVN0YXRlPWwsW2wsYS5xdWV1ZS5kaXNwYXRjaF0pfSx1c2VNZW1vQ2FjaGU6eGYsdXNlQ2FjaGVSZWZyZXNoOnV2fTtpdi51c2VFZmZlY3RFdmVudD1KMDtmdW5jdGlvbiB0YyhsLHQsYSx1KXt0PWwubWVtb2l6ZWRTdGF0ZSxhPWEodSx0KSxhPWE9PW51bGw/dDpfKHt9LHQsYSksbC5tZW1vaXplZFN0YXRlPWEsbC5sYW5lcz09PTAmJihsLnVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZT1hKX12YXIgYWM9e2VucXVldWVTZXRTdGF0ZTpmdW5jdGlvbihsLHQsYSl7bD1sLl9yZWFjdEludGVybmFsczt2YXIgdT1SbCgpLGU9S3QodSk7ZS5wYXlsb2FkPXQsYSE9bnVsbCYmKGUuY2FsbGJhY2s9YSksdD14dChsLGUsdSksdCE9PW51bGwmJihfbCh0LGwsdSksanUodCxsLHUpKX0sZW5xdWV1ZVJlcGxhY2VTdGF0ZTpmdW5jdGlvbihsLHQsYSl7bD1sLl9yZWFjdEludGVybmFsczt2YXIgdT1SbCgpLGU9S3QodSk7ZS50YWc9MSxlLnBheWxvYWQ9dCxhIT1udWxsJiYoZS5jYWxsYmFjaz1hKSx0PXh0KGwsZSx1KSx0IT09bnVsbCYmKF9sKHQsbCx1KSxqdSh0LGwsdSkpfSxlbnF1ZXVlRm9yY2VVcGRhdGU6ZnVuY3Rpb24obCx0KXtsPWwuX3JlYWN0SW50ZXJuYWxzO3ZhciBhPVJsKCksdT1LdChhKTt1LnRhZz0yLHQhPW51bGwmJih1LmNhbGxiYWNrPXQpLHQ9eHQobCx1LGEpLHQhPT1udWxsJiYoX2wodCxsLGEpLGp1KHQsbCxhKSl9fTtmdW5jdGlvbiB2dihsLHQsYSx1LGUsbixmKXtyZXR1cm4gbD1sLnN0YXRlTm9kZSx0eXBlb2YgbC5zaG91bGRDb21wb25lbnRVcGRhdGU9PSJmdW5jdGlvbiI/bC5zaG91bGRDb21wb25lbnRVcGRhdGUodSxuLGYpOnQucHJvdG90eXBlJiZ0LnByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudD8hQnUoYSx1KXx8IUJ1KGUsbik6ITB9ZnVuY3Rpb24geXYobCx0LGEsdSl7bD10LnN0YXRlLHR5cGVvZiB0LmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM9PSJmdW5jdGlvbiImJnQuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhhLHUpLHR5cGVvZiB0LlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzPT0iZnVuY3Rpb24iJiZ0LlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKGEsdSksdC5zdGF0ZSE9PWwmJmFjLmVucXVldWVSZXBsYWNlU3RhdGUodCx0LnN0YXRlLG51bGwpfWZ1bmN0aW9uIE9hKGwsdCl7dmFyIGE9dDtpZigicmVmImluIHQpe2E9e307Zm9yKHZhciB1IGluIHQpdSE9PSJyZWYiJiYoYVt1XT10W3VdKX1pZihsPWwuZGVmYXVsdFByb3BzKXthPT09dCYmKGE9Xyh7fSxhKSk7Zm9yKHZhciBlIGluIGwpYVtlXT09PXZvaWQgMCYmKGFbZV09bFtlXSl9cmV0dXJuIGF9ZnVuY3Rpb24gbXYobCl7WWUobCl9ZnVuY3Rpb24gaHYobCl7Y29uc29sZS5lcnJvcihsKX1mdW5jdGlvbiBkdihsKXtZZShsKX1mdW5jdGlvbiB0bihsLHQpe3RyeXt2YXIgYT1sLm9uVW5jYXVnaHRFcnJvcjthKHQudmFsdWUse2NvbXBvbmVudFN0YWNrOnQuc3RhY2t9KX1jYXRjaCh1KXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgdX0pfX1mdW5jdGlvbiBTdihsLHQsYSl7dHJ5e3ZhciB1PWwub25DYXVnaHRFcnJvcjt1KGEudmFsdWUse2NvbXBvbmVudFN0YWNrOmEuc3RhY2ssZXJyb3JCb3VuZGFyeTp0LnRhZz09PTE/dC5zdGF0ZU5vZGU6bnVsbH0pfWNhdGNoKGUpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyBlfSl9fWZ1bmN0aW9uIHVjKGwsdCxhKXtyZXR1cm4gYT1LdChhKSxhLnRhZz0zLGEucGF5bG9hZD17ZWxlbWVudDpudWxsfSxhLmNhbGxiYWNrPWZ1bmN0aW9uKCl7dG4obCx0KX0sYX1mdW5jdGlvbiBzdihsKXtyZXR1cm4gbD1LdChsKSxsLnRhZz0zLGx9ZnVuY3Rpb24gZ3YobCx0LGEsdSl7dmFyIGU9YS50eXBlLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcjtpZih0eXBlb2YgZT09ImZ1bmN0aW9uIil7dmFyIG49dS52YWx1ZTtsLnBheWxvYWQ9ZnVuY3Rpb24oKXtyZXR1cm4gZShuKX0sbC5jYWxsYmFjaz1mdW5jdGlvbigpe1N2KHQsYSx1KX19dmFyIGY9YS5zdGF0ZU5vZGU7ZiE9PW51bGwmJnR5cGVvZiBmLmNvbXBvbmVudERpZENhdGNoPT0iZnVuY3Rpb24iJiYobC5jYWxsYmFjaz1mdW5jdGlvbigpe1N2KHQsYSx1KSx0eXBlb2YgZSE9ImZ1bmN0aW9uIiYmKEZ0PT09bnVsbD9GdD1uZXcgU2V0KFt0aGlzXSk6RnQuYWRkKHRoaXMpKTt2YXIgYz11LnN0YWNrO3RoaXMuY29tcG9uZW50RGlkQ2F0Y2godS52YWx1ZSx7Y29tcG9uZW50U3RhY2s6YyE9PW51bGw/YzoiIn0pfSl9ZnVuY3Rpb24gR20obCx0LGEsdSxlKXtpZihhLmZsYWdzfD0zMjc2OCx1IT09bnVsbCYmdHlwZW9mIHU9PSJvYmplY3QiJiZ0eXBlb2YgdS50aGVuPT0iZnVuY3Rpb24iKXtpZih0PWEuYWx0ZXJuYXRlLHQhPT1udWxsJiZyYSh0LGEsZSwhMCksYT1YbC5jdXJyZW50LGEhPT1udWxsKXtzd2l0Y2goYS50YWcpe2Nhc2UgMzE6Y2FzZSAxMzpyZXR1cm4gcmw9PT1udWxsP1NuKCk6YS5hbHRlcm5hdGU9PT1udWxsJiZsbD09PTAmJihsbD0zKSxhLmZsYWdzJj0tMjU3LGEuZmxhZ3N8PTY1NTM2LGEubGFuZXM9ZSx1PT09S2U/YS5mbGFnc3w9MTYzODQ6KHQ9YS51cGRhdGVRdWV1ZSx0PT09bnVsbD9hLnVwZGF0ZVF1ZXVlPW5ldyBTZXQoW3VdKTp0LmFkZCh1KSxIYyhsLHUsZSkpLCExO2Nhc2UgMjI6cmV0dXJuIGEuZmxhZ3N8PTY1NTM2LHU9PT1LZT9hLmZsYWdzfD0xNjM4NDoodD1hLnVwZGF0ZVF1ZXVlLHQ9PT1udWxsPyh0PXt0cmFuc2l0aW9uczpudWxsLG1hcmtlckluc3RhbmNlczpudWxsLHJldHJ5UXVldWU6bmV3IFNldChbdV0pfSxhLnVwZGF0ZVF1ZXVlPXQpOihhPXQucmV0cnlRdWV1ZSxhPT09bnVsbD90LnJldHJ5UXVldWU9bmV3IFNldChbdV0pOmEuYWRkKHUpKSxIYyhsLHUsZSkpLCExfXRocm93IEVycm9yKHMoNDM1LGEudGFnKSl9cmV0dXJuIEhjKGwsdSxlKSxTbigpLCExfWlmKEcpcmV0dXJuIHQ9WGwuY3VycmVudCx0IT09bnVsbD8oKHQuZmxhZ3MmNjU1MzYpPT09MCYmKHQuZmxhZ3N8PTI1NiksdC5mbGFnc3w9NjU1MzYsdC5sYW5lcz1lLHUhPT1FZiYmKGw9RXJyb3Iocyg0MjIpLHtjYXVzZTp1fSksWHUoV2wobCxhKSkpKToodSE9PUVmJiYodD1FcnJvcihzKDQyMykse2NhdXNlOnV9KSxYdShXbCh0LGEpKSksbD1sLmN1cnJlbnQuYWx0ZXJuYXRlLGwuZmxhZ3N8PTY1NTM2LGUmPS1lLGwubGFuZXN8PWUsdT1XbCh1LGEpLGU9dWMobC5zdGF0ZU5vZGUsdSxlKSxRZihsLGUpLGxsIT09NCYmKGxsPTIpKSwhMTt2YXIgbj1FcnJvcihzKDUyMCkse2NhdXNlOnV9KTtpZihuPVdsKG4sYSksUHU9PT1udWxsP1B1PVtuXTpQdS5wdXNoKG4pLGxsIT09NCYmKGxsPTIpLHQ9PT1udWxsKXJldHVybiEwO3U9V2wodSxhKSxhPXQ7ZG97c3dpdGNoKGEudGFnKXtjYXNlIDM6cmV0dXJuIGEuZmxhZ3N8PTY1NTM2LGw9ZSYtZSxhLmxhbmVzfD1sLGw9dWMoYS5zdGF0ZU5vZGUsdSxsKSxRZihhLGwpLCExO2Nhc2UgMTppZih0PWEudHlwZSxuPWEuc3RhdGVOb2RlLChhLmZsYWdzJjEyOCk9PT0wJiYodHlwZW9mIHQuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yPT0iZnVuY3Rpb24ifHxuIT09bnVsbCYmdHlwZW9mIG4uY29tcG9uZW50RGlkQ2F0Y2g9PSJmdW5jdGlvbiImJihGdD09PW51bGx8fCFGdC5oYXMobikpKSlyZXR1cm4gYS5mbGFnc3w9NjU1MzYsZSY9LWUsYS5sYW5lc3w9ZSxlPXN2KGUpLGd2KGUsbCxhLHUpLFFmKGEsZSksITF9YT1hLnJldHVybn13aGlsZShhIT09bnVsbCk7cmV0dXJuITF9dmFyIGVjPUVycm9yKHMoNDYxKSksZmw9ITE7ZnVuY3Rpb24gZ2wobCx0LGEsdSl7dC5jaGlsZD1sPT09bnVsbD9UMCh0LG51bGwsYSx1KTpFYSh0LGwuY2hpbGQsYSx1KX1mdW5jdGlvbiBidihsLHQsYSx1LGUpe2E9YS5yZW5kZXI7dmFyIG49dC5yZWY7aWYoInJlZiJpbiB1KXt2YXIgZj17fTtmb3IodmFyIGMgaW4gdSljIT09InJlZiImJihmW2NdPXVbY10pfWVsc2UgZj11O3JldHVybiB6YSh0KSx1PWpmKGwsdCxhLGYsbixlKSxjPVZmKCksbCE9PW51bGwmJiFmbD8ocGYobCx0LGUpLEV0KGwsdCxlKSk6KEcmJmMmJlRmKHQpLHQuZmxhZ3N8PTEsZ2wobCx0LHUsZSksdC5jaGlsZCl9ZnVuY3Rpb24genYobCx0LGEsdSxlKXtpZihsPT09bnVsbCl7dmFyIG49YS50eXBlO3JldHVybiB0eXBlb2Ygbj09ImZ1bmN0aW9uIiYmIWJmKG4pJiZuLmRlZmF1bHRQcm9wcz09PXZvaWQgMCYmYS5jb21wYXJlPT09bnVsbD8odC50YWc9MTUsdC50eXBlPW4sQXYobCx0LG4sdSxlKSk6KGw9Q2UoYS50eXBlLG51bGwsdSx0LHQubW9kZSxlKSxsLnJlZj10LnJlZixsLnJldHVybj10LHQuY2hpbGQ9bCl9aWYobj1sLmNoaWxkLCFoYyhsLGUpKXt2YXIgZj1uLm1lbW9pemVkUHJvcHM7aWYoYT1hLmNvbXBhcmUsYT1hIT09bnVsbD9hOkJ1LGEoZix1KSYmbC5yZWY9PT10LnJlZilyZXR1cm4gRXQobCx0LGUpfXJldHVybiB0LmZsYWdzfD0xLGw9Z3Qobix1KSxsLnJlZj10LnJlZixsLnJldHVybj10LHQuY2hpbGQ9bH1mdW5jdGlvbiBBdihsLHQsYSx1LGUpe2lmKGwhPT1udWxsKXt2YXIgbj1sLm1lbW9pemVkUHJvcHM7aWYoQnUobix1KSYmbC5yZWY9PT10LnJlZilpZihmbD0hMSx0LnBlbmRpbmdQcm9wcz11PW4saGMobCxlKSkobC5mbGFncyYxMzEwNzIpIT09MCYmKGZsPSEwKTtlbHNlIHJldHVybiB0LmxhbmVzPWwubGFuZXMsRXQobCx0LGUpfXJldHVybiBuYyhsLHQsYSx1LGUpfWZ1bmN0aW9uIFR2KGwsdCxhLHUpe3ZhciBlPXUuY2hpbGRyZW4sbj1sIT09bnVsbD9sLm1lbW9pemVkU3RhdGU6bnVsbDtpZihsPT09bnVsbCYmdC5zdGF0ZU5vZGU9PT1udWxsJiYodC5zdGF0ZU5vZGU9e192aXNpYmlsaXR5OjEsX3BlbmRpbmdNYXJrZXJzOm51bGwsX3JldHJ5Q2FjaGU6bnVsbCxfdHJhbnNpdGlvbnM6bnVsbH0pLHUubW9kZT09PSJoaWRkZW4iKXtpZigodC5mbGFncyYxMjgpIT09MCl7aWYobj1uIT09bnVsbD9uLmJhc2VMYW5lc3xhOmEsbCE9PW51bGwpe2Zvcih1PXQuY2hpbGQ9bC5jaGlsZCxlPTA7dSE9PW51bGw7KWU9ZXx1LmxhbmVzfHUuY2hpbGRMYW5lcyx1PXUuc2libGluZzt1PWUmfm59ZWxzZSB1PTAsdC5jaGlsZD1udWxsO3JldHVybiBvdihsLHQsbixhLHUpfWlmKChhJjUzNjg3MDkxMikhPT0wKXQubWVtb2l6ZWRTdGF0ZT17YmFzZUxhbmVzOjAsY2FjaGVQb29sOm51bGx9LGwhPT1udWxsJiZWZSh0LG4hPT1udWxsP24uY2FjaGVQb29sOm51bGwpLG4hPT1udWxsP00wKHQsbik6R2YoKSxPMCh0KTtlbHNlIHJldHVybiB1PXQubGFuZXM9NTM2ODcwOTEyLG92KGwsdCxuIT09bnVsbD9uLmJhc2VMYW5lc3xhOmEsYSx1KX1lbHNlIG4hPT1udWxsPyhWZSh0LG4uY2FjaGVQb29sKSxNMCh0LG4pLEp0KCksdC5tZW1vaXplZFN0YXRlPW51bGwpOihsIT09bnVsbCYmVmUodCxudWxsKSxHZigpLEp0KCkpO3JldHVybiBnbChsLHQsZSxhKSx0LmNoaWxkfWZ1bmN0aW9uIFd1KGwsdCl7cmV0dXJuIGwhPT1udWxsJiZsLnRhZz09PTIyfHx0LnN0YXRlTm9kZSE9PW51bGx8fCh0LnN0YXRlTm9kZT17X3Zpc2liaWxpdHk6MSxfcGVuZGluZ01hcmtlcnM6bnVsbCxfcmV0cnlDYWNoZTpudWxsLF90cmFuc2l0aW9uczpudWxsfSksdC5zaWJsaW5nfWZ1bmN0aW9uIG92KGwsdCxhLHUsZSl7dmFyIG49TmYoKTtyZXR1cm4gbj1uPT09bnVsbD9udWxsOntwYXJlbnQ6ZWwuX2N1cnJlbnRWYWx1ZSxwb29sOm59LHQubWVtb2l6ZWRTdGF0ZT17YmFzZUxhbmVzOmEsY2FjaGVQb29sOm59LGwhPT1udWxsJiZWZSh0LG51bGwpLEdmKCksTzAodCksbCE9PW51bGwmJnJhKGwsdCx1LCEwKSx0LmNoaWxkTGFuZXM9ZSxudWxsfWZ1bmN0aW9uIGFuKGwsdCl7cmV0dXJuIHQ9ZW4oe21vZGU6dC5tb2RlLGNoaWxkcmVuOnQuY2hpbGRyZW59LGwubW9kZSksdC5yZWY9bC5yZWYsbC5jaGlsZD10LHQucmV0dXJuPWwsdH1mdW5jdGlvbiBFdihsLHQsYSl7cmV0dXJuIEVhKHQsbC5jaGlsZCxudWxsLGEpLGw9YW4odCx0LnBlbmRpbmdQcm9wcyksbC5mbGFnc3w9MixHbCh0KSx0Lm1lbW9pemVkU3RhdGU9bnVsbCxsfWZ1bmN0aW9uIENtKGwsdCxhKXt2YXIgdT10LnBlbmRpbmdQcm9wcyxlPSh0LmZsYWdzJjEyOCkhPT0wO2lmKHQuZmxhZ3MmPS0xMjksbD09PW51bGwpe2lmKEcpe2lmKHUubW9kZT09PSJoaWRkZW4iKXJldHVybiBsPWFuKHQsdSksdC5sYW5lcz01MzY4NzA5MTIsV3UobnVsbCxsKTtpZihaZih0KSwobD0kKT8obD1YMShsLEZsKSxsPWwhPT1udWxsJiZsLmRhdGE9PT0iJiI/bDpudWxsLGwhPT1udWxsJiYodC5tZW1vaXplZFN0YXRlPXtkZWh5ZHJhdGVkOmwsdHJlZUNvbnRleHQ6WnQhPT1udWxsP3tpZDpmdCxvdmVyZmxvdzpjdH06bnVsbCxyZXRyeUxhbmU6NTM2ODcwOTEyLGh5ZHJhdGlvbkVycm9yczpudWxsfSxhPW4wKGwpLGEucmV0dXJuPXQsdC5jaGlsZD1hLFNsPXQsJD1udWxsKSk6bD1udWxsLGw9PT1udWxsKXRocm93IGp0KHQpO3JldHVybiB0LmxhbmVzPTUzNjg3MDkxMixudWxsfXJldHVybiBhbih0LHUpfXZhciBuPWwubWVtb2l6ZWRTdGF0ZTtpZihuIT09bnVsbCl7dmFyIGY9bi5kZWh5ZHJhdGVkO2lmKFpmKHQpLGUpaWYodC5mbGFncyYyNTYpdC5mbGFncyY9LTI1Nyx0PUV2KGwsdCxhKTtlbHNlIGlmKHQubWVtb2l6ZWRTdGF0ZSE9PW51bGwpdC5jaGlsZD1sLmNoaWxkLHQuZmxhZ3N8PTEyOCx0PW51bGw7ZWxzZSB0aHJvdyBFcnJvcihzKDU1OCkpO2Vsc2UgaWYoZmx8fHJhKGwsdCxhLCExKSxlPShhJmwuY2hpbGRMYW5lcykhPT0wLGZsfHxlKXtpZih1PUosdSE9PW51bGwmJihmPWhpKHUsYSksZiE9PTAmJmYhPT1uLnJldHJ5TGFuZSkpdGhyb3cgbi5yZXRyeUxhbmU9ZixTYShsLGYpLF9sKHUsbCxmKSxlYztTbigpLHQ9RXYobCx0LGEpfWVsc2UgbD1uLnRyZWVDb250ZXh0LCQ9a2woZi5uZXh0U2libGluZyksU2w9dCxHPSEwLFJ0PW51bGwsRmw9ITEsbCE9PW51bGwmJmkwKHQsbCksdD1hbih0LHUpLHQuZmxhZ3N8PTQwOTY7cmV0dXJuIHR9cmV0dXJuIGw9Z3QobC5jaGlsZCx7bW9kZTp1Lm1vZGUsY2hpbGRyZW46dS5jaGlsZHJlbn0pLGwucmVmPXQucmVmLHQuY2hpbGQ9bCxsLnJldHVybj10LGx9ZnVuY3Rpb24gdW4obCx0KXt2YXIgYT10LnJlZjtpZihhPT09bnVsbClsIT09bnVsbCYmbC5yZWYhPT1udWxsJiYodC5mbGFnc3w9NDE5NDgxNik7ZWxzZXtpZih0eXBlb2YgYSE9ImZ1bmN0aW9uIiYmdHlwZW9mIGEhPSJvYmplY3QiKXRocm93IEVycm9yKHMoMjg0KSk7KGw9PT1udWxsfHxsLnJlZiE9PWEpJiYodC5mbGFnc3w9NDE5NDgxNil9fWZ1bmN0aW9uIG5jKGwsdCxhLHUsZSl7cmV0dXJuIHphKHQpLGE9amYobCx0LGEsdSx2b2lkIDAsZSksdT1WZigpLGwhPT1udWxsJiYhZmw/KHBmKGwsdCxlKSxFdChsLHQsZSkpOihHJiZ1JiZUZih0KSx0LmZsYWdzfD0xLGdsKGwsdCxhLGUpLHQuY2hpbGQpfWZ1bmN0aW9uIE12KGwsdCxhLHUsZSxuKXtyZXR1cm4gemEodCksdC51cGRhdGVRdWV1ZT1udWxsLGE9VTAodCx1LGEsZSksRDAobCksdT1WZigpLGwhPT1udWxsJiYhZmw/KHBmKGwsdCxuKSxFdChsLHQsbikpOihHJiZ1JiZUZih0KSx0LmZsYWdzfD0xLGdsKGwsdCxhLG4pLHQuY2hpbGQpfWZ1bmN0aW9uIE92KGwsdCxhLHUsZSl7aWYoemEodCksdC5zdGF0ZU5vZGU9PT1udWxsKXt2YXIgbj1XYSxmPWEuY29udGV4dFR5cGU7dHlwZW9mIGY9PSJvYmplY3QiJiZmIT09bnVsbCYmKG49c2woZikpLG49bmV3IGEodSxuKSx0Lm1lbW9pemVkU3RhdGU9bi5zdGF0ZSE9PW51bGwmJm4uc3RhdGUhPT12b2lkIDA/bi5zdGF0ZTpudWxsLG4udXBkYXRlcj1hYyx0LnN0YXRlTm9kZT1uLG4uX3JlYWN0SW50ZXJuYWxzPXQsbj10LnN0YXRlTm9kZSxuLnByb3BzPXUsbi5zdGF0ZT10Lm1lbW9pemVkU3RhdGUsbi5yZWZzPXt9LEJmKHQpLGY9YS5jb250ZXh0VHlwZSxuLmNvbnRleHQ9dHlwZW9mIGY9PSJvYmplY3QiJiZmIT09bnVsbD9zbChmKTpXYSxuLnN0YXRlPXQubWVtb2l6ZWRTdGF0ZSxmPWEuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLHR5cGVvZiBmPT0iZnVuY3Rpb24iJiYodGModCxhLGYsdSksbi5zdGF0ZT10Lm1lbW9pemVkU3RhdGUpLHR5cGVvZiBhLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcz09ImZ1bmN0aW9uInx8dHlwZW9mIG4uZ2V0U25hcHNob3RCZWZvcmVVcGRhdGU9PSJmdW5jdGlvbiJ8fHR5cGVvZiBuLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQhPSJmdW5jdGlvbiImJnR5cGVvZiBuLmNvbXBvbmVudFdpbGxNb3VudCE9ImZ1bmN0aW9uInx8KGY9bi5zdGF0ZSx0eXBlb2Ygbi5jb21wb25lbnRXaWxsTW91bnQ9PSJmdW5jdGlvbiImJm4uY29tcG9uZW50V2lsbE1vdW50KCksdHlwZW9mIG4uVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudD09ImZ1bmN0aW9uIiYmbi5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCksZiE9PW4uc3RhdGUmJmFjLmVucXVldWVSZXBsYWNlU3RhdGUobixuLnN0YXRlLG51bGwpLHB1KHQsdSxuLGUpLFZ1KCksbi5zdGF0ZT10Lm1lbW9pemVkU3RhdGUpLHR5cGVvZiBuLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iJiYodC5mbGFnc3w9NDE5NDMwOCksdT0hMH1lbHNlIGlmKGw9PT1udWxsKXtuPXQuc3RhdGVOb2RlO3ZhciBjPXQubWVtb2l6ZWRQcm9wcyxpPU9hKGEsYyk7bi5wcm9wcz1pO3ZhciBoPW4uY29udGV4dCxnPWEuY29udGV4dFR5cGU7Zj1XYSx0eXBlb2YgZz09Im9iamVjdCImJmchPT1udWxsJiYoZj1zbChnKSk7dmFyIEE9YS5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM7Zz10eXBlb2YgQT09ImZ1bmN0aW9uInx8dHlwZW9mIG4uZ2V0U25hcHNob3RCZWZvcmVVcGRhdGU9PSJmdW5jdGlvbiIsYz10LnBlbmRpbmdQcm9wcyE9PWMsZ3x8dHlwZW9mIG4uVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMhPSJmdW5jdGlvbiImJnR5cGVvZiBuLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMhPSJmdW5jdGlvbiJ8fChjfHxoIT09ZikmJnl2KHQsbix1LGYpLHB0PSExO3ZhciBkPXQubWVtb2l6ZWRTdGF0ZTtuLnN0YXRlPWQscHUodCx1LG4sZSksVnUoKSxoPXQubWVtb2l6ZWRTdGF0ZSxjfHxkIT09aHx8cHQ/KHR5cGVvZiBBPT0iZnVuY3Rpb24iJiYodGModCxhLEEsdSksaD10Lm1lbW9pemVkU3RhdGUpLChpPXB0fHx2dih0LGEsaSx1LGQsaCxmKSk/KGd8fHR5cGVvZiBuLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQhPSJmdW5jdGlvbiImJnR5cGVvZiBuLmNvbXBvbmVudFdpbGxNb3VudCE9ImZ1bmN0aW9uInx8KHR5cGVvZiBuLmNvbXBvbmVudFdpbGxNb3VudD09ImZ1bmN0aW9uIiYmbi5jb21wb25lbnRXaWxsTW91bnQoKSx0eXBlb2Ygbi5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50PT0iZnVuY3Rpb24iJiZuLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQoKSksdHlwZW9mIG4uY29tcG9uZW50RGlkTW91bnQ9PSJmdW5jdGlvbiImJih0LmZsYWdzfD00MTk0MzA4KSk6KHR5cGVvZiBuLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iJiYodC5mbGFnc3w9NDE5NDMwOCksdC5tZW1vaXplZFByb3BzPXUsdC5tZW1vaXplZFN0YXRlPWgpLG4ucHJvcHM9dSxuLnN0YXRlPWgsbi5jb250ZXh0PWYsdT1pKToodHlwZW9mIG4uY29tcG9uZW50RGlkTW91bnQ9PSJmdW5jdGlvbiImJih0LmZsYWdzfD00MTk0MzA4KSx1PSExKX1lbHNle249dC5zdGF0ZU5vZGUsWWYobCx0KSxmPXQubWVtb2l6ZWRQcm9wcyxnPU9hKGEsZiksbi5wcm9wcz1nLEE9dC5wZW5kaW5nUHJvcHMsZD1uLmNvbnRleHQsaD1hLmNvbnRleHRUeXBlLGk9V2EsdHlwZW9mIGg9PSJvYmplY3QiJiZoIT09bnVsbCYmKGk9c2woaCkpLGM9YS5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMsKGg9dHlwZW9mIGM9PSJmdW5jdGlvbiJ8fHR5cGVvZiBuLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlPT0iZnVuY3Rpb24iKXx8dHlwZW9mIG4uVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMhPSJmdW5jdGlvbiImJnR5cGVvZiBuLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMhPSJmdW5jdGlvbiJ8fChmIT09QXx8ZCE9PWkpJiZ5dih0LG4sdSxpKSxwdD0hMSxkPXQubWVtb2l6ZWRTdGF0ZSxuLnN0YXRlPWQscHUodCx1LG4sZSksVnUoKTt2YXIgUz10Lm1lbW9pemVkU3RhdGU7ZiE9PUF8fGQhPT1TfHxwdHx8bCE9PW51bGwmJmwuZGVwZW5kZW5jaWVzIT09bnVsbCYmUmUobC5kZXBlbmRlbmNpZXMpPyh0eXBlb2YgYz09ImZ1bmN0aW9uIiYmKHRjKHQsYSxjLHUpLFM9dC5tZW1vaXplZFN0YXRlKSwoZz1wdHx8dnYodCxhLGcsdSxkLFMsaSl8fGwhPT1udWxsJiZsLmRlcGVuZGVuY2llcyE9PW51bGwmJlJlKGwuZGVwZW5kZW5jaWVzKSk/KGh8fHR5cGVvZiBuLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlIT0iZnVuY3Rpb24iJiZ0eXBlb2Ygbi5jb21wb25lbnRXaWxsVXBkYXRlIT0iZnVuY3Rpb24ifHwodHlwZW9mIG4uY29tcG9uZW50V2lsbFVwZGF0ZT09ImZ1bmN0aW9uIiYmbi5jb21wb25lbnRXaWxsVXBkYXRlKHUsUyxpKSx0eXBlb2Ygbi5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZT09ImZ1bmN0aW9uIiYmbi5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSh1LFMsaSkpLHR5cGVvZiBuLmNvbXBvbmVudERpZFVwZGF0ZT09ImZ1bmN0aW9uIiYmKHQuZmxhZ3N8PTQpLHR5cGVvZiBuLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlPT0iZnVuY3Rpb24iJiYodC5mbGFnc3w9MTAyNCkpOih0eXBlb2Ygbi5jb21wb25lbnREaWRVcGRhdGUhPSJmdW5jdGlvbiJ8fGY9PT1sLm1lbW9pemVkUHJvcHMmJmQ9PT1sLm1lbW9pemVkU3RhdGV8fCh0LmZsYWdzfD00KSx0eXBlb2Ygbi5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSE9ImZ1bmN0aW9uInx8Zj09PWwubWVtb2l6ZWRQcm9wcyYmZD09PWwubWVtb2l6ZWRTdGF0ZXx8KHQuZmxhZ3N8PTEwMjQpLHQubWVtb2l6ZWRQcm9wcz11LHQubWVtb2l6ZWRTdGF0ZT1TKSxuLnByb3BzPXUsbi5zdGF0ZT1TLG4uY29udGV4dD1pLHU9Zyk6KHR5cGVvZiBuLmNvbXBvbmVudERpZFVwZGF0ZSE9ImZ1bmN0aW9uInx8Zj09PWwubWVtb2l6ZWRQcm9wcyYmZD09PWwubWVtb2l6ZWRTdGF0ZXx8KHQuZmxhZ3N8PTQpLHR5cGVvZiBuLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlIT0iZnVuY3Rpb24ifHxmPT09bC5tZW1vaXplZFByb3BzJiZkPT09bC5tZW1vaXplZFN0YXRlfHwodC5mbGFnc3w9MTAyNCksdT0hMSl9cmV0dXJuIG49dSx1bihsLHQpLHU9KHQuZmxhZ3MmMTI4KSE9PTAsbnx8dT8obj10LnN0YXRlTm9kZSxhPXUmJnR5cGVvZiBhLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvciE9ImZ1bmN0aW9uIj9udWxsOm4ucmVuZGVyKCksdC5mbGFnc3w9MSxsIT09bnVsbCYmdT8odC5jaGlsZD1FYSh0LGwuY2hpbGQsbnVsbCxlKSx0LmNoaWxkPUVhKHQsbnVsbCxhLGUpKTpnbChsLHQsYSxlKSx0Lm1lbW9pemVkU3RhdGU9bi5zdGF0ZSxsPXQuY2hpbGQpOmw9RXQobCx0LGUpLGx9ZnVuY3Rpb24gRHYobCx0LGEsdSl7cmV0dXJuIGdhKCksdC5mbGFnc3w9MjU2LGdsKGwsdCxhLHUpLHQuY2hpbGR9dmFyIGZjPXtkZWh5ZHJhdGVkOm51bGwsdHJlZUNvbnRleHQ6bnVsbCxyZXRyeUxhbmU6MCxoeWRyYXRpb25FcnJvcnM6bnVsbH07ZnVuY3Rpb24gY2MobCl7cmV0dXJue2Jhc2VMYW5lczpsLGNhY2hlUG9vbDpTMCgpfX1mdW5jdGlvbiBpYyhsLHQsYSl7cmV0dXJuIGw9bCE9PW51bGw/bC5jaGlsZExhbmVzJn5hOjAsdCYmKGx8PVpsKSxsfWZ1bmN0aW9uIFV2KGwsdCxhKXt2YXIgdT10LnBlbmRpbmdQcm9wcyxlPSExLG49KHQuZmxhZ3MmMTI4KSE9PTAsZjtpZigoZj1uKXx8KGY9bCE9PW51bGwmJmwubWVtb2l6ZWRTdGF0ZT09PW51bGw/ITE6KGFsLmN1cnJlbnQmMikhPT0wKSxmJiYoZT0hMCx0LmZsYWdzJj0tMTI5KSxmPSh0LmZsYWdzJjMyKSE9PTAsdC5mbGFncyY9LTMzLGw9PT1udWxsKXtpZihHKXtpZihlP0x0KHQpOkp0KCksKGw9JCk/KGw9WDEobCxGbCksbD1sIT09bnVsbCYmbC5kYXRhIT09IiYiP2w6bnVsbCxsIT09bnVsbCYmKHQubWVtb2l6ZWRTdGF0ZT17ZGVoeWRyYXRlZDpsLHRyZWVDb250ZXh0Olp0IT09bnVsbD97aWQ6ZnQsb3ZlcmZsb3c6Y3R9Om51bGwscmV0cnlMYW5lOjUzNjg3MDkxMixoeWRyYXRpb25FcnJvcnM6bnVsbH0sYT1uMChsKSxhLnJldHVybj10LHQuY2hpbGQ9YSxTbD10LCQ9bnVsbCkpOmw9bnVsbCxsPT09bnVsbCl0aHJvdyBqdCh0KTtyZXR1cm4gTGMobCk/dC5sYW5lcz0zMjp0LmxhbmVzPTUzNjg3MDkxMixudWxsfXZhciBjPXUuY2hpbGRyZW47cmV0dXJuIHU9dS5mYWxsYmFjayxlPyhKdCgpLGU9dC5tb2RlLGM9ZW4oe21vZGU6ImhpZGRlbiIsY2hpbGRyZW46Y30sZSksdT1zYSh1LGUsYSxudWxsKSxjLnJldHVybj10LHUucmV0dXJuPXQsYy5zaWJsaW5nPXUsdC5jaGlsZD1jLHU9dC5jaGlsZCx1Lm1lbW9pemVkU3RhdGU9Y2MoYSksdS5jaGlsZExhbmVzPWljKGwsZixhKSx0Lm1lbW9pemVkU3RhdGU9ZmMsV3UobnVsbCx1KSk6KEx0KHQpLHZjKHQsYykpfXZhciBpPWwubWVtb2l6ZWRTdGF0ZTtpZihpIT09bnVsbCYmKGM9aS5kZWh5ZHJhdGVkLGMhPT1udWxsKSl7aWYobil0LmZsYWdzJjI1Nj8oTHQodCksdC5mbGFncyY9LTI1Nyx0PXljKGwsdCxhKSk6dC5tZW1vaXplZFN0YXRlIT09bnVsbD8oSnQoKSx0LmNoaWxkPWwuY2hpbGQsdC5mbGFnc3w9MTI4LHQ9bnVsbCk6KEp0KCksYz11LmZhbGxiYWNrLGU9dC5tb2RlLHU9ZW4oe21vZGU6InZpc2libGUiLGNoaWxkcmVuOnUuY2hpbGRyZW59LGUpLGM9c2EoYyxlLGEsbnVsbCksYy5mbGFnc3w9Mix1LnJldHVybj10LGMucmV0dXJuPXQsdS5zaWJsaW5nPWMsdC5jaGlsZD11LEVhKHQsbC5jaGlsZCxudWxsLGEpLHU9dC5jaGlsZCx1Lm1lbW9pemVkU3RhdGU9Y2MoYSksdS5jaGlsZExhbmVzPWljKGwsZixhKSx0Lm1lbW9pemVkU3RhdGU9ZmMsdD1XdShudWxsLHUpKTtlbHNlIGlmKEx0KHQpLExjKGMpKXtpZihmPWMubmV4dFNpYmxpbmcmJmMubmV4dFNpYmxpbmcuZGF0YXNldCxmKXZhciBoPWYuZGdzdDtmPWgsdT1FcnJvcihzKDQxOSkpLHUuc3RhY2s9IiIsdS5kaWdlc3Q9ZixYdSh7dmFsdWU6dSxzb3VyY2U6bnVsbCxzdGFjazpudWxsfSksdD15YyhsLHQsYSl9ZWxzZSBpZihmbHx8cmEobCx0LGEsITEpLGY9KGEmbC5jaGlsZExhbmVzKSE9PTAsZmx8fGYpe2lmKGY9SixmIT09bnVsbCYmKHU9aGkoZixhKSx1IT09MCYmdSE9PWkucmV0cnlMYW5lKSl0aHJvdyBpLnJldHJ5TGFuZT11LFNhKGwsdSksX2woZixsLHUpLGVjO3hjKGMpfHxTbigpLHQ9eWMobCx0LGEpfWVsc2UgeGMoYyk/KHQuZmxhZ3N8PTE5Mix0LmNoaWxkPWwuY2hpbGQsdD1udWxsKToobD1pLnRyZWVDb250ZXh0LCQ9a2woYy5uZXh0U2libGluZyksU2w9dCxHPSEwLFJ0PW51bGwsRmw9ITEsbCE9PW51bGwmJmkwKHQsbCksdD12Yyh0LHUuY2hpbGRyZW4pLHQuZmxhZ3N8PTQwOTYpO3JldHVybiB0fXJldHVybiBlPyhKdCgpLGM9dS5mYWxsYmFjayxlPXQubW9kZSxpPWwuY2hpbGQsaD1pLnNpYmxpbmcsdT1ndChpLHttb2RlOiJoaWRkZW4iLGNoaWxkcmVuOnUuY2hpbGRyZW59KSx1LnN1YnRyZWVGbGFncz1pLnN1YnRyZWVGbGFncyY2NTAxMTcxMixoIT09bnVsbD9jPWd0KGgsYyk6KGM9c2EoYyxlLGEsbnVsbCksYy5mbGFnc3w9MiksYy5yZXR1cm49dCx1LnJldHVybj10LHUuc2libGluZz1jLHQuY2hpbGQ9dSxXdShudWxsLHUpLHU9dC5jaGlsZCxjPWwuY2hpbGQubWVtb2l6ZWRTdGF0ZSxjPT09bnVsbD9jPWNjKGEpOihlPWMuY2FjaGVQb29sLGUhPT1udWxsPyhpPWVsLl9jdXJyZW50VmFsdWUsZT1lLnBhcmVudCE9PWk/e3BhcmVudDppLHBvb2w6aX06ZSk6ZT1TMCgpLGM9e2Jhc2VMYW5lczpjLmJhc2VMYW5lc3xhLGNhY2hlUG9vbDplfSksdS5tZW1vaXplZFN0YXRlPWMsdS5jaGlsZExhbmVzPWljKGwsZixhKSx0Lm1lbW9pemVkU3RhdGU9ZmMsV3UobC5jaGlsZCx1KSk6KEx0KHQpLGE9bC5jaGlsZCxsPWEuc2libGluZyxhPWd0KGEse21vZGU6InZpc2libGUiLGNoaWxkcmVuOnUuY2hpbGRyZW59KSxhLnJldHVybj10LGEuc2libGluZz1udWxsLGwhPT1udWxsJiYoZj10LmRlbGV0aW9ucyxmPT09bnVsbD8odC5kZWxldGlvbnM9W2xdLHQuZmxhZ3N8PTE2KTpmLnB1c2gobCkpLHQuY2hpbGQ9YSx0Lm1lbW9pemVkU3RhdGU9bnVsbCxhKX1mdW5jdGlvbiB2YyhsLHQpe3JldHVybiB0PWVuKHttb2RlOiJ2aXNpYmxlIixjaGlsZHJlbjp0fSxsLm1vZGUpLHQucmV0dXJuPWwsbC5jaGlsZD10fWZ1bmN0aW9uIGVuKGwsdCl7cmV0dXJuIGw9UWwoMjIsbCxudWxsLHQpLGwubGFuZXM9MCxsfWZ1bmN0aW9uIHljKGwsdCxhKXtyZXR1cm4gRWEodCxsLmNoaWxkLG51bGwsYSksbD12Yyh0LHQucGVuZGluZ1Byb3BzLmNoaWxkcmVuKSxsLmZsYWdzfD0yLHQubWVtb2l6ZWRTdGF0ZT1udWxsLGx9ZnVuY3Rpb24gX3YobCx0LGEpe2wubGFuZXN8PXQ7dmFyIHU9bC5hbHRlcm5hdGU7dSE9PW51bGwmJih1LmxhbmVzfD10KSxEZihsLnJldHVybix0LGEpfWZ1bmN0aW9uIG1jKGwsdCxhLHUsZSxuKXt2YXIgZj1sLm1lbW9pemVkU3RhdGU7Zj09PW51bGw/bC5tZW1vaXplZFN0YXRlPXtpc0JhY2t3YXJkczp0LHJlbmRlcmluZzpudWxsLHJlbmRlcmluZ1N0YXJ0VGltZTowLGxhc3Q6dSx0YWlsOmEsdGFpbE1vZGU6ZSx0cmVlRm9ya0NvdW50Om59OihmLmlzQmFja3dhcmRzPXQsZi5yZW5kZXJpbmc9bnVsbCxmLnJlbmRlcmluZ1N0YXJ0VGltZT0wLGYubGFzdD11LGYudGFpbD1hLGYudGFpbE1vZGU9ZSxmLnRyZWVGb3JrQ291bnQ9bil9ZnVuY3Rpb24gSHYobCx0LGEpe3ZhciB1PXQucGVuZGluZ1Byb3BzLGU9dS5yZXZlYWxPcmRlcixuPXUudGFpbDt1PXUuY2hpbGRyZW47dmFyIGY9YWwuY3VycmVudCxjPShmJjIpIT09MDtpZihjPyhmPWYmMXwyLHQuZmxhZ3N8PTEyOCk6ZiY9MSxqKGFsLGYpLGdsKGwsdCx1LGEpLHU9Rz9RdTowLCFjJiZsIT09bnVsbCYmKGwuZmxhZ3MmMTI4KSE9PTApbDpmb3IobD10LmNoaWxkO2whPT1udWxsOyl7aWYobC50YWc9PT0xMylsLm1lbW9pemVkU3RhdGUhPT1udWxsJiZfdihsLGEsdCk7ZWxzZSBpZihsLnRhZz09PTE5KV92KGwsYSx0KTtlbHNlIGlmKGwuY2hpbGQhPT1udWxsKXtsLmNoaWxkLnJldHVybj1sLGw9bC5jaGlsZDtjb250aW51ZX1pZihsPT09dClicmVhayBsO2Zvcig7bC5zaWJsaW5nPT09bnVsbDspe2lmKGwucmV0dXJuPT09bnVsbHx8bC5yZXR1cm49PT10KWJyZWFrIGw7bD1sLnJldHVybn1sLnNpYmxpbmcucmV0dXJuPWwucmV0dXJuLGw9bC5zaWJsaW5nfXN3aXRjaChlKXtjYXNlImZvcndhcmRzIjpmb3IoYT10LmNoaWxkLGU9bnVsbDthIT09bnVsbDspbD1hLmFsdGVybmF0ZSxsIT09bnVsbCYmV2UobCk9PT1udWxsJiYoZT1hKSxhPWEuc2libGluZzthPWUsYT09PW51bGw/KGU9dC5jaGlsZCx0LmNoaWxkPW51bGwpOihlPWEuc2libGluZyxhLnNpYmxpbmc9bnVsbCksbWModCwhMSxlLGEsbix1KTticmVhaztjYXNlImJhY2t3YXJkcyI6Y2FzZSJ1bnN0YWJsZV9sZWdhY3ktYmFja3dhcmRzIjpmb3IoYT1udWxsLGU9dC5jaGlsZCx0LmNoaWxkPW51bGw7ZSE9PW51bGw7KXtpZihsPWUuYWx0ZXJuYXRlLGwhPT1udWxsJiZXZShsKT09PW51bGwpe3QuY2hpbGQ9ZTticmVha31sPWUuc2libGluZyxlLnNpYmxpbmc9YSxhPWUsZT1sfW1jKHQsITAsYSxudWxsLG4sdSk7YnJlYWs7Y2FzZSJ0b2dldGhlciI6bWModCwhMSxudWxsLG51bGwsdm9pZCAwLHUpO2JyZWFrO2RlZmF1bHQ6dC5tZW1vaXplZFN0YXRlPW51bGx9cmV0dXJuIHQuY2hpbGR9ZnVuY3Rpb24gRXQobCx0LGEpe2lmKGwhPT1udWxsJiYodC5kZXBlbmRlbmNpZXM9bC5kZXBlbmRlbmNpZXMpLCR0fD10LmxhbmVzLChhJnQuY2hpbGRMYW5lcyk9PT0wKWlmKGwhPT1udWxsKXtpZihyYShsLHQsYSwhMSksKGEmdC5jaGlsZExhbmVzKT09PTApcmV0dXJuIG51bGx9ZWxzZSByZXR1cm4gbnVsbDtpZihsIT09bnVsbCYmdC5jaGlsZCE9PWwuY2hpbGQpdGhyb3cgRXJyb3IocygxNTMpKTtpZih0LmNoaWxkIT09bnVsbCl7Zm9yKGw9dC5jaGlsZCxhPWd0KGwsbC5wZW5kaW5nUHJvcHMpLHQuY2hpbGQ9YSxhLnJldHVybj10O2wuc2libGluZyE9PW51bGw7KWw9bC5zaWJsaW5nLGE9YS5zaWJsaW5nPWd0KGwsbC5wZW5kaW5nUHJvcHMpLGEucmV0dXJuPXQ7YS5zaWJsaW5nPW51bGx9cmV0dXJuIHQuY2hpbGR9ZnVuY3Rpb24gaGMobCx0KXtyZXR1cm4obC5sYW5lcyZ0KSE9PTA/ITA6KGw9bC5kZXBlbmRlbmNpZXMsISEobCE9PW51bGwmJlJlKGwpKSl9ZnVuY3Rpb24gWm0obCx0LGEpe3N3aXRjaCh0LnRhZyl7Y2FzZSAzOnNlKHQsdC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyksVnQodCxlbCxsLm1lbW9pemVkU3RhdGUuY2FjaGUpLGdhKCk7YnJlYWs7Y2FzZSAyNzpjYXNlIDU6R24odCk7YnJlYWs7Y2FzZSA0OnNlKHQsdC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyk7YnJlYWs7Y2FzZSAxMDpWdCh0LHQudHlwZSx0Lm1lbW9pemVkUHJvcHMudmFsdWUpO2JyZWFrO2Nhc2UgMzE6aWYodC5tZW1vaXplZFN0YXRlIT09bnVsbClyZXR1cm4gdC5mbGFnc3w9MTI4LFpmKHQpLG51bGw7YnJlYWs7Y2FzZSAxMzp2YXIgdT10Lm1lbW9pemVkU3RhdGU7aWYodSE9PW51bGwpcmV0dXJuIHUuZGVoeWRyYXRlZCE9PW51bGw/KEx0KHQpLHQuZmxhZ3N8PTEyOCxudWxsKTooYSZ0LmNoaWxkLmNoaWxkTGFuZXMpIT09MD9VdihsLHQsYSk6KEx0KHQpLGw9RXQobCx0LGEpLGwhPT1udWxsP2wuc2libGluZzpudWxsKTtMdCh0KTticmVhaztjYXNlIDE5OnZhciBlPShsLmZsYWdzJjEyOCkhPT0wO2lmKHU9KGEmdC5jaGlsZExhbmVzKSE9PTAsdXx8KHJhKGwsdCxhLCExKSx1PShhJnQuY2hpbGRMYW5lcykhPT0wKSxlKXtpZih1KXJldHVybiBIdihsLHQsYSk7dC5mbGFnc3w9MTI4fWlmKGU9dC5tZW1vaXplZFN0YXRlLGUhPT1udWxsJiYoZS5yZW5kZXJpbmc9bnVsbCxlLnRhaWw9bnVsbCxlLmxhc3RFZmZlY3Q9bnVsbCksaihhbCxhbC5jdXJyZW50KSx1KWJyZWFrO3JldHVybiBudWxsO2Nhc2UgMjI6cmV0dXJuIHQubGFuZXM9MCxUdihsLHQsYSx0LnBlbmRpbmdQcm9wcyk7Y2FzZSAyNDpWdCh0LGVsLGwubWVtb2l6ZWRTdGF0ZS5jYWNoZSl9cmV0dXJuIEV0KGwsdCxhKX1mdW5jdGlvbiBOdihsLHQsYSl7aWYobCE9PW51bGwpaWYobC5tZW1vaXplZFByb3BzIT09dC5wZW5kaW5nUHJvcHMpZmw9ITA7ZWxzZXtpZighaGMobCxhKSYmKHQuZmxhZ3MmMTI4KT09PTApcmV0dXJuIGZsPSExLFptKGwsdCxhKTtmbD0obC5mbGFncyYxMzEwNzIpIT09MH1lbHNlIGZsPSExLEcmJih0LmZsYWdzJjEwNDg1NzYpIT09MCYmYzAodCxRdSx0LmluZGV4KTtzd2l0Y2godC5sYW5lcz0wLHQudGFnKXtjYXNlIDE2Omw6e3ZhciB1PXQucGVuZGluZ1Byb3BzO2lmKGw9VGEodC5lbGVtZW50VHlwZSksdC50eXBlPWwsdHlwZW9mIGw9PSJmdW5jdGlvbiIpYmYobCk/KHU9T2EobCx1KSx0LnRhZz0xLHQ9T3YobnVsbCx0LGwsdSxhKSk6KHQudGFnPTAsdD1uYyhudWxsLHQsbCx1LGEpKTtlbHNle2lmKGwhPW51bGwpe3ZhciBlPWwuJCR0eXBlb2Y7aWYoZT09PVl0KXt0LnRhZz0xMSx0PWJ2KG51bGwsdCxsLHUsYSk7YnJlYWsgbH1lbHNlIGlmKGU9PT1tdCl7dC50YWc9MTQsdD16dihudWxsLHQsbCx1LGEpO2JyZWFrIGx9fXRocm93IHQ9enUobCl8fGwsRXJyb3IocygzMDYsdCwiIikpfX1yZXR1cm4gdDtjYXNlIDA6cmV0dXJuIG5jKGwsdCx0LnR5cGUsdC5wZW5kaW5nUHJvcHMsYSk7Y2FzZSAxOnJldHVybiB1PXQudHlwZSxlPU9hKHUsdC5wZW5kaW5nUHJvcHMpLE92KGwsdCx1LGUsYSk7Y2FzZSAzOmw6e2lmKHNlKHQsdC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyksbD09PW51bGwpdGhyb3cgRXJyb3IocygzODcpKTt1PXQucGVuZGluZ1Byb3BzO3ZhciBuPXQubWVtb2l6ZWRTdGF0ZTtlPW4uZWxlbWVudCxZZihsLHQpLHB1KHQsdSxudWxsLGEpO3ZhciBmPXQubWVtb2l6ZWRTdGF0ZTtpZih1PWYuY2FjaGUsVnQodCxlbCx1KSx1IT09bi5jYWNoZSYmVWYodCxbZWxdLGEsITApLFZ1KCksdT1mLmVsZW1lbnQsbi5pc0RlaHlkcmF0ZWQpaWYobj17ZWxlbWVudDp1LGlzRGVoeWRyYXRlZDohMSxjYWNoZTpmLmNhY2hlfSx0LnVwZGF0ZVF1ZXVlLmJhc2VTdGF0ZT1uLHQubWVtb2l6ZWRTdGF0ZT1uLHQuZmxhZ3MmMjU2KXt0PUR2KGwsdCx1LGEpO2JyZWFrIGx9ZWxzZSBpZih1IT09ZSl7ZT1XbChFcnJvcihzKDQyNCkpLHQpLFh1KGUpLHQ9RHYobCx0LHUsYSk7YnJlYWsgbH1lbHNle3N3aXRjaChsPXQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8sbC5ub2RlVHlwZSl7Y2FzZSA5Omw9bC5ib2R5O2JyZWFrO2RlZmF1bHQ6bD1sLm5vZGVOYW1lPT09IkhUTUwiP2wub3duZXJEb2N1bWVudC5ib2R5Omx9Zm9yKCQ9a2wobC5maXJzdENoaWxkKSxTbD10LEc9ITAsUnQ9bnVsbCxGbD0hMCxhPVQwKHQsbnVsbCx1LGEpLHQuY2hpbGQ9YTthOylhLmZsYWdzPWEuZmxhZ3MmLTN8NDA5NixhPWEuc2libGluZ31lbHNle2lmKGdhKCksdT09PWUpe3Q9RXQobCx0LGEpO2JyZWFrIGx9Z2wobCx0LHUsYSl9dD10LmNoaWxkfXJldHVybiB0O2Nhc2UgMjY6cmV0dXJuIHVuKGwsdCksbD09PW51bGw/KGE9VjEodC50eXBlLG51bGwsdC5wZW5kaW5nUHJvcHMsbnVsbCkpP3QubWVtb2l6ZWRTdGF0ZT1hOkd8fChhPXQudHlwZSxsPXQucGVuZGluZ1Byb3BzLHU9b24oUXQuY3VycmVudCkuY3JlYXRlRWxlbWVudChhKSx1W2RsXT10LHVbb2xdPWwsYmwodSxhLGwpLG1sKHUpLHQuc3RhdGVOb2RlPXUpOnQubWVtb2l6ZWRTdGF0ZT1WMSh0LnR5cGUsbC5tZW1vaXplZFByb3BzLHQucGVuZGluZ1Byb3BzLGwubWVtb2l6ZWRTdGF0ZSksbnVsbDtjYXNlIDI3OnJldHVybiBHbih0KSxsPT09bnVsbCYmRyYmKHU9dC5zdGF0ZU5vZGU9WjEodC50eXBlLHQucGVuZGluZ1Byb3BzLFF0LmN1cnJlbnQpLFNsPXQsRmw9ITAsZT0kLFB0KHQudHlwZSk/KEpjPWUsJD1rbCh1LmZpcnN0Q2hpbGQpKTokPWUpLGdsKGwsdCx0LnBlbmRpbmdQcm9wcy5jaGlsZHJlbixhKSx1bihsLHQpLGw9PT1udWxsJiYodC5mbGFnc3w9NDE5NDMwNCksdC5jaGlsZDtjYXNlIDU6cmV0dXJuIGw9PT1udWxsJiZHJiYoKGU9dT0kKSYmKHU9ZGgodSx0LnR5cGUsdC5wZW5kaW5nUHJvcHMsRmwpLHUhPT1udWxsPyh0LnN0YXRlTm9kZT11LFNsPXQsJD1rbCh1LmZpcnN0Q2hpbGQpLEZsPSExLGU9ITApOmU9ITEpLGV8fGp0KHQpKSxHbih0KSxlPXQudHlwZSxuPXQucGVuZGluZ1Byb3BzLGY9bCE9PW51bGw/bC5tZW1vaXplZFByb3BzOm51bGwsdT1uLmNoaWxkcmVuLFZjKGUsbik/dT1udWxsOmYhPT1udWxsJiZWYyhlLGYpJiYodC5mbGFnc3w9MzIpLHQubWVtb2l6ZWRTdGF0ZSE9PW51bGwmJihlPWpmKGwsdCxIbSxudWxsLG51bGwsYSksY2UuX2N1cnJlbnRWYWx1ZT1lKSx1bihsLHQpLGdsKGwsdCx1LGEpLHQuY2hpbGQ7Y2FzZSA2OnJldHVybiBsPT09bnVsbCYmRyYmKChsPWE9JCkmJihhPVNoKGEsdC5wZW5kaW5nUHJvcHMsRmwpLGEhPT1udWxsPyh0LnN0YXRlTm9kZT1hLFNsPXQsJD1udWxsLGw9ITApOmw9ITEpLGx8fGp0KHQpKSxudWxsO2Nhc2UgMTM6cmV0dXJuIFV2KGwsdCxhKTtjYXNlIDQ6cmV0dXJuIHNlKHQsdC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyksdT10LnBlbmRpbmdQcm9wcyxsPT09bnVsbD90LmNoaWxkPUVhKHQsbnVsbCx1LGEpOmdsKGwsdCx1LGEpLHQuY2hpbGQ7Y2FzZSAxMTpyZXR1cm4gYnYobCx0LHQudHlwZSx0LnBlbmRpbmdQcm9wcyxhKTtjYXNlIDc6cmV0dXJuIGdsKGwsdCx0LnBlbmRpbmdQcm9wcyxhKSx0LmNoaWxkO2Nhc2UgODpyZXR1cm4gZ2wobCx0LHQucGVuZGluZ1Byb3BzLmNoaWxkcmVuLGEpLHQuY2hpbGQ7Y2FzZSAxMjpyZXR1cm4gZ2wobCx0LHQucGVuZGluZ1Byb3BzLmNoaWxkcmVuLGEpLHQuY2hpbGQ7Y2FzZSAxMDpyZXR1cm4gdT10LnBlbmRpbmdQcm9wcyxWdCh0LHQudHlwZSx1LnZhbHVlKSxnbChsLHQsdS5jaGlsZHJlbixhKSx0LmNoaWxkO2Nhc2UgOTpyZXR1cm4gZT10LnR5cGUuX2NvbnRleHQsdT10LnBlbmRpbmdQcm9wcy5jaGlsZHJlbix6YSh0KSxlPXNsKGUpLHU9dShlKSx0LmZsYWdzfD0xLGdsKGwsdCx1LGEpLHQuY2hpbGQ7Y2FzZSAxNDpyZXR1cm4genYobCx0LHQudHlwZSx0LnBlbmRpbmdQcm9wcyxhKTtjYXNlIDE1OnJldHVybiBBdihsLHQsdC50eXBlLHQucGVuZGluZ1Byb3BzLGEpO2Nhc2UgMTk6cmV0dXJuIEh2KGwsdCxhKTtjYXNlIDMxOnJldHVybiBDbShsLHQsYSk7Y2FzZSAyMjpyZXR1cm4gVHYobCx0LGEsdC5wZW5kaW5nUHJvcHMpO2Nhc2UgMjQ6cmV0dXJuIHphKHQpLHU9c2woZWwpLGw9PT1udWxsPyhlPU5mKCksZT09PW51bGwmJihlPUosbj1fZigpLGUucG9vbGVkQ2FjaGU9bixuLnJlZkNvdW50KyssbiE9PW51bGwmJihlLnBvb2xlZENhY2hlTGFuZXN8PWEpLGU9biksdC5tZW1vaXplZFN0YXRlPXtwYXJlbnQ6dSxjYWNoZTplfSxCZih0KSxWdCh0LGVsLGUpKTooKGwubGFuZXMmYSkhPT0wJiYoWWYobCx0KSxwdSh0LG51bGwsbnVsbCxhKSxWdSgpKSxlPWwubWVtb2l6ZWRTdGF0ZSxuPXQubWVtb2l6ZWRTdGF0ZSxlLnBhcmVudCE9PXU/KGU9e3BhcmVudDp1LGNhY2hlOnV9LHQubWVtb2l6ZWRTdGF0ZT1lLHQubGFuZXM9PT0wJiYodC5tZW1vaXplZFN0YXRlPXQudXBkYXRlUXVldWUuYmFzZVN0YXRlPWUpLFZ0KHQsZWwsdSkpOih1PW4uY2FjaGUsVnQodCxlbCx1KSx1IT09ZS5jYWNoZSYmVWYodCxbZWxdLGEsITApKSksZ2wobCx0LHQucGVuZGluZ1Byb3BzLmNoaWxkcmVuLGEpLHQuY2hpbGQ7Y2FzZSAyOTp0aHJvdyB0LnBlbmRpbmdQcm9wc310aHJvdyBFcnJvcihzKDE1Nix0LnRhZykpfWZ1bmN0aW9uIE10KGwpe2wuZmxhZ3N8PTR9ZnVuY3Rpb24gZGMobCx0LGEsdSxlKXtpZigodD0obC5tb2RlJjMyKSE9PTApJiYodD0hMSksdCl7aWYobC5mbGFnc3w9MTY3NzcyMTYsKGUmMzM1NTQ0MTI4KT09PWUpaWYobC5zdGF0ZU5vZGUuY29tcGxldGUpbC5mbGFnc3w9ODE5MjtlbHNlIGlmKGExKCkpbC5mbGFnc3w9ODE5MjtlbHNlIHRocm93IG9hPUtlLHFmfWVsc2UgbC5mbGFncyY9LTE2Nzc3MjE3fWZ1bmN0aW9uIHF2KGwsdCl7aWYodC50eXBlIT09InN0eWxlc2hlZXQifHwodC5zdGF0ZS5sb2FkaW5nJjQpIT09MClsLmZsYWdzJj0tMTY3NzcyMTc7ZWxzZSBpZihsLmZsYWdzfD0xNjc3NzIxNiwhSjEodCkpaWYoYTEoKSlsLmZsYWdzfD04MTkyO2Vsc2UgdGhyb3cgb2E9S2UscWZ9ZnVuY3Rpb24gbm4obCx0KXt0IT09bnVsbCYmKGwuZmxhZ3N8PTQpLGwuZmxhZ3MmMTYzODQmJih0PWwudGFnIT09MjI/dmkoKTo1MzY4NzA5MTIsbC5sYW5lc3w9dCxpdXw9dCl9ZnVuY3Rpb24gd3UobCx0KXtpZighRylzd2l0Y2gobC50YWlsTW9kZSl7Y2FzZSJoaWRkZW4iOnQ9bC50YWlsO2Zvcih2YXIgYT1udWxsO3QhPT1udWxsOyl0LmFsdGVybmF0ZSE9PW51bGwmJihhPXQpLHQ9dC5zaWJsaW5nO2E9PT1udWxsP2wudGFpbD1udWxsOmEuc2libGluZz1udWxsO2JyZWFrO2Nhc2UiY29sbGFwc2VkIjphPWwudGFpbDtmb3IodmFyIHU9bnVsbDthIT09bnVsbDspYS5hbHRlcm5hdGUhPT1udWxsJiYodT1hKSxhPWEuc2libGluZzt1PT09bnVsbD90fHxsLnRhaWw9PT1udWxsP2wudGFpbD1udWxsOmwudGFpbC5zaWJsaW5nPW51bGw6dS5zaWJsaW5nPW51bGx9fWZ1bmN0aW9uIEYobCl7dmFyIHQ9bC5hbHRlcm5hdGUhPT1udWxsJiZsLmFsdGVybmF0ZS5jaGlsZD09PWwuY2hpbGQsYT0wLHU9MDtpZih0KWZvcih2YXIgZT1sLmNoaWxkO2UhPT1udWxsOylhfD1lLmxhbmVzfGUuY2hpbGRMYW5lcyx1fD1lLnN1YnRyZWVGbGFncyY2NTAxMTcxMix1fD1lLmZsYWdzJjY1MDExNzEyLGUucmV0dXJuPWwsZT1lLnNpYmxpbmc7ZWxzZSBmb3IoZT1sLmNoaWxkO2UhPT1udWxsOylhfD1lLmxhbmVzfGUuY2hpbGRMYW5lcyx1fD1lLnN1YnRyZWVGbGFncyx1fD1lLmZsYWdzLGUucmV0dXJuPWwsZT1lLnNpYmxpbmc7cmV0dXJuIGwuc3VidHJlZUZsYWdzfD11LGwuY2hpbGRMYW5lcz1hLHR9ZnVuY3Rpb24gUm0obCx0LGEpe3ZhciB1PXQucGVuZGluZ1Byb3BzO3N3aXRjaChvZih0KSx0LnRhZyl7Y2FzZSAxNjpjYXNlIDE1OmNhc2UgMDpjYXNlIDExOmNhc2UgNzpjYXNlIDg6Y2FzZSAxMjpjYXNlIDk6Y2FzZSAxNDpyZXR1cm4gRih0KSxudWxsO2Nhc2UgMTpyZXR1cm4gRih0KSxudWxsO2Nhc2UgMzpyZXR1cm4gYT10LnN0YXRlTm9kZSx1PW51bGwsbCE9PW51bGwmJih1PWwubWVtb2l6ZWRTdGF0ZS5jYWNoZSksdC5tZW1vaXplZFN0YXRlLmNhY2hlIT09dSYmKHQuZmxhZ3N8PTIwNDgpLEF0KGVsKSxZYSgpLGEucGVuZGluZ0NvbnRleHQmJihhLmNvbnRleHQ9YS5wZW5kaW5nQ29udGV4dCxhLnBlbmRpbmdDb250ZXh0PW51bGwpLChsPT09bnVsbHx8bC5jaGlsZD09PW51bGwpJiYoRmEodCk/TXQodCk6bD09PW51bGx8fGwubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQmJih0LmZsYWdzJjI1Nik9PT0wfHwodC5mbGFnc3w9MTAyNCxNZigpKSksRih0KSxudWxsO2Nhc2UgMjY6dmFyIGU9dC50eXBlLG49dC5tZW1vaXplZFN0YXRlO3JldHVybiBsPT09bnVsbD8oTXQodCksbiE9PW51bGw/KEYodCkscXYodCxuKSk6KEYodCksZGModCxlLG51bGwsdSxhKSkpOm4/biE9PWwubWVtb2l6ZWRTdGF0ZT8oTXQodCksRih0KSxxdih0LG4pKTooRih0KSx0LmZsYWdzJj0tMTY3NzcyMTcpOihsPWwubWVtb2l6ZWRQcm9wcyxsIT09dSYmTXQodCksRih0KSxkYyh0LGUsbCx1LGEpKSxudWxsO2Nhc2UgMjc6aWYoZ2UodCksYT1RdC5jdXJyZW50LGU9dC50eXBlLGwhPT1udWxsJiZ0LnN0YXRlTm9kZSE9bnVsbClsLm1lbW9pemVkUHJvcHMhPT11JiZNdCh0KTtlbHNle2lmKCF1KXtpZih0LnN0YXRlTm9kZT09PW51bGwpdGhyb3cgRXJyb3IocygxNjYpKTtyZXR1cm4gRih0KSxudWxsfWw9eWwuY3VycmVudCxGYSh0KT92MCh0KToobD1aMShlLHUsYSksdC5zdGF0ZU5vZGU9bCxNdCh0KSl9cmV0dXJuIEYodCksbnVsbDtjYXNlIDU6aWYoZ2UodCksZT10LnR5cGUsbCE9PW51bGwmJnQuc3RhdGVOb2RlIT1udWxsKWwubWVtb2l6ZWRQcm9wcyE9PXUmJk10KHQpO2Vsc2V7aWYoIXUpe2lmKHQuc3RhdGVOb2RlPT09bnVsbCl0aHJvdyBFcnJvcihzKDE2NikpO3JldHVybiBGKHQpLG51bGx9aWYobj15bC5jdXJyZW50LEZhKHQpKXYwKHQpO2Vsc2V7dmFyIGY9b24oUXQuY3VycmVudCk7c3dpdGNoKG4pe2Nhc2UgMTpuPWYuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsZSk7YnJlYWs7Y2FzZSAyOm49Zi5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiLGUpO2JyZWFrO2RlZmF1bHQ6c3dpdGNoKGUpe2Nhc2Uic3ZnIjpuPWYuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsZSk7YnJlYWs7Y2FzZSJtYXRoIjpuPWYuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MIixlKTticmVhaztjYXNlInNjcmlwdCI6bj1mLmNyZWF0ZUVsZW1lbnQoImRpdiIpLG4uaW5uZXJIVE1MPSI8c2NyaXB0PjxcL3NjcmlwdD4iLG49bi5yZW1vdmVDaGlsZChuLmZpcnN0Q2hpbGQpO2JyZWFrO2Nhc2Uic2VsZWN0IjpuPXR5cGVvZiB1LmlzPT0ic3RyaW5nIj9mLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIse2lzOnUuaXN9KTpmLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLHUubXVsdGlwbGU/bi5tdWx0aXBsZT0hMDp1LnNpemUmJihuLnNpemU9dS5zaXplKTticmVhaztkZWZhdWx0Om49dHlwZW9mIHUuaXM9PSJzdHJpbmciP2YuY3JlYXRlRWxlbWVudChlLHtpczp1LmlzfSk6Zi5jcmVhdGVFbGVtZW50KGUpfX1uW2RsXT10LG5bb2xdPXU7bDpmb3IoZj10LmNoaWxkO2YhPT1udWxsOyl7aWYoZi50YWc9PT01fHxmLnRhZz09PTYpbi5hcHBlbmRDaGlsZChmLnN0YXRlTm9kZSk7ZWxzZSBpZihmLnRhZyE9PTQmJmYudGFnIT09MjcmJmYuY2hpbGQhPT1udWxsKXtmLmNoaWxkLnJldHVybj1mLGY9Zi5jaGlsZDtjb250aW51ZX1pZihmPT09dClicmVhayBsO2Zvcig7Zi5zaWJsaW5nPT09bnVsbDspe2lmKGYucmV0dXJuPT09bnVsbHx8Zi5yZXR1cm49PT10KWJyZWFrIGw7Zj1mLnJldHVybn1mLnNpYmxpbmcucmV0dXJuPWYucmV0dXJuLGY9Zi5zaWJsaW5nfXQuc3RhdGVOb2RlPW47bDpzd2l0Y2goYmwobixlLHUpLGUpe2Nhc2UiYnV0dG9uIjpjYXNlImlucHV0IjpjYXNlInNlbGVjdCI6Y2FzZSJ0ZXh0YXJlYSI6dT0hIXUuYXV0b0ZvY3VzO2JyZWFrIGw7Y2FzZSJpbWciOnU9ITA7YnJlYWsgbDtkZWZhdWx0OnU9ITF9dSYmTXQodCl9fXJldHVybiBGKHQpLGRjKHQsdC50eXBlLGw9PT1udWxsP251bGw6bC5tZW1vaXplZFByb3BzLHQucGVuZGluZ1Byb3BzLGEpLG51bGw7Y2FzZSA2OmlmKGwmJnQuc3RhdGVOb2RlIT1udWxsKWwubWVtb2l6ZWRQcm9wcyE9PXUmJk10KHQpO2Vsc2V7aWYodHlwZW9mIHUhPSJzdHJpbmciJiZ0LnN0YXRlTm9kZT09PW51bGwpdGhyb3cgRXJyb3IocygxNjYpKTtpZihsPVF0LmN1cnJlbnQsRmEodCkpe2lmKGw9dC5zdGF0ZU5vZGUsYT10Lm1lbW9pemVkUHJvcHMsdT1udWxsLGU9U2wsZSE9PW51bGwpc3dpdGNoKGUudGFnKXtjYXNlIDI3OmNhc2UgNTp1PWUubWVtb2l6ZWRQcm9wc31sW2RsXT10LGw9ISEobC5ub2RlVmFsdWU9PT1hfHx1IT09bnVsbCYmdS5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmc9PT0hMHx8VTEobC5ub2RlVmFsdWUsYSkpLGx8fGp0KHQsITApfWVsc2UgbD1vbihsKS5jcmVhdGVUZXh0Tm9kZSh1KSxsW2RsXT10LHQuc3RhdGVOb2RlPWx9cmV0dXJuIEYodCksbnVsbDtjYXNlIDMxOmlmKGE9dC5tZW1vaXplZFN0YXRlLGw9PT1udWxsfHxsLm1lbW9pemVkU3RhdGUhPT1udWxsKXtpZih1PUZhKHQpLGEhPT1udWxsKXtpZihsPT09bnVsbCl7aWYoIXUpdGhyb3cgRXJyb3IocygzMTgpKTtpZihsPXQubWVtb2l6ZWRTdGF0ZSxsPWwhPT1udWxsP2wuZGVoeWRyYXRlZDpudWxsLCFsKXRocm93IEVycm9yKHMoNTU3KSk7bFtkbF09dH1lbHNlIGdhKCksKHQuZmxhZ3MmMTI4KT09PTAmJih0Lm1lbW9pemVkU3RhdGU9bnVsbCksdC5mbGFnc3w9NDtGKHQpLGw9ITF9ZWxzZSBhPU1mKCksbCE9PW51bGwmJmwubWVtb2l6ZWRTdGF0ZSE9PW51bGwmJihsLm1lbW9pemVkU3RhdGUuaHlkcmF0aW9uRXJyb3JzPWEpLGw9ITA7aWYoIWwpcmV0dXJuIHQuZmxhZ3MmMjU2PyhHbCh0KSx0KTooR2wodCksbnVsbCk7aWYoKHQuZmxhZ3MmMTI4KSE9PTApdGhyb3cgRXJyb3Iocyg1NTgpKX1yZXR1cm4gRih0KSxudWxsO2Nhc2UgMTM6aWYodT10Lm1lbW9pemVkU3RhdGUsbD09PW51bGx8fGwubWVtb2l6ZWRTdGF0ZSE9PW51bGwmJmwubWVtb2l6ZWRTdGF0ZS5kZWh5ZHJhdGVkIT09bnVsbCl7aWYoZT1GYSh0KSx1IT09bnVsbCYmdS5kZWh5ZHJhdGVkIT09bnVsbCl7aWYobD09PW51bGwpe2lmKCFlKXRocm93IEVycm9yKHMoMzE4KSk7aWYoZT10Lm1lbW9pemVkU3RhdGUsZT1lIT09bnVsbD9lLmRlaHlkcmF0ZWQ6bnVsbCwhZSl0aHJvdyBFcnJvcihzKDMxNykpO2VbZGxdPXR9ZWxzZSBnYSgpLCh0LmZsYWdzJjEyOCk9PT0wJiYodC5tZW1vaXplZFN0YXRlPW51bGwpLHQuZmxhZ3N8PTQ7Rih0KSxlPSExfWVsc2UgZT1NZigpLGwhPT1udWxsJiZsLm1lbW9pemVkU3RhdGUhPT1udWxsJiYobC5tZW1vaXplZFN0YXRlLmh5ZHJhdGlvbkVycm9ycz1lKSxlPSEwO2lmKCFlKXJldHVybiB0LmZsYWdzJjI1Nj8oR2wodCksdCk6KEdsKHQpLG51bGwpfXJldHVybiBHbCh0KSwodC5mbGFncyYxMjgpIT09MD8odC5sYW5lcz1hLHQpOihhPXUhPT1udWxsLGw9bCE9PW51bGwmJmwubWVtb2l6ZWRTdGF0ZSE9PW51bGwsYSYmKHU9dC5jaGlsZCxlPW51bGwsdS5hbHRlcm5hdGUhPT1udWxsJiZ1LmFsdGVybmF0ZS5tZW1vaXplZFN0YXRlIT09bnVsbCYmdS5hbHRlcm5hdGUubWVtb2l6ZWRTdGF0ZS5jYWNoZVBvb2whPT1udWxsJiYoZT11LmFsdGVybmF0ZS5tZW1vaXplZFN0YXRlLmNhY2hlUG9vbC5wb29sKSxuPW51bGwsdS5tZW1vaXplZFN0YXRlIT09bnVsbCYmdS5tZW1vaXplZFN0YXRlLmNhY2hlUG9vbCE9PW51bGwmJihuPXUubWVtb2l6ZWRTdGF0ZS5jYWNoZVBvb2wucG9vbCksbiE9PWUmJih1LmZsYWdzfD0yMDQ4KSksYSE9PWwmJmEmJih0LmNoaWxkLmZsYWdzfD04MTkyKSxubih0LHQudXBkYXRlUXVldWUpLEYodCksbnVsbCk7Y2FzZSA0OnJldHVybiBZYSgpLGw9PT1udWxsJiZHYyh0LnN0YXRlTm9kZS5jb250YWluZXJJbmZvKSxGKHQpLG51bGw7Y2FzZSAxMDpyZXR1cm4gQXQodC50eXBlKSxGKHQpLG51bGw7Y2FzZSAxOTppZihJKGFsKSx1PXQubWVtb2l6ZWRTdGF0ZSx1PT09bnVsbClyZXR1cm4gRih0KSxudWxsO2lmKGU9KHQuZmxhZ3MmMTI4KSE9PTAsbj11LnJlbmRlcmluZyxuPT09bnVsbClpZihlKXd1KHUsITEpO2Vsc2V7aWYobGwhPT0wfHxsIT09bnVsbCYmKGwuZmxhZ3MmMTI4KSE9PTApZm9yKGw9dC5jaGlsZDtsIT09bnVsbDspe2lmKG49V2UobCksbiE9PW51bGwpe2Zvcih0LmZsYWdzfD0xMjgsd3UodSwhMSksbD1uLnVwZGF0ZVF1ZXVlLHQudXBkYXRlUXVldWU9bCxubih0LGwpLHQuc3VidHJlZUZsYWdzPTAsbD1hLGE9dC5jaGlsZDthIT09bnVsbDspZTAoYSxsKSxhPWEuc2libGluZztyZXR1cm4gaihhbCxhbC5jdXJyZW50JjF8MiksRyYmYnQodCx1LnRyZWVGb3JrQ291bnQpLHQuY2hpbGR9bD1sLnNpYmxpbmd9dS50YWlsIT09bnVsbCYmTmwoKT5tbiYmKHQuZmxhZ3N8PTEyOCxlPSEwLHd1KHUsITEpLHQubGFuZXM9NDE5NDMwNCl9ZWxzZXtpZighZSlpZihsPVdlKG4pLGwhPT1udWxsKXtpZih0LmZsYWdzfD0xMjgsZT0hMCxsPWwudXBkYXRlUXVldWUsdC51cGRhdGVRdWV1ZT1sLG5uKHQsbCksd3UodSwhMCksdS50YWlsPT09bnVsbCYmdS50YWlsTW9kZT09PSJoaWRkZW4iJiYhbi5hbHRlcm5hdGUmJiFHKXJldHVybiBGKHQpLG51bGx9ZWxzZSAyKk5sKCktdS5yZW5kZXJpbmdTdGFydFRpbWU+bW4mJmEhPT01MzY4NzA5MTImJih0LmZsYWdzfD0xMjgsZT0hMCx3dSh1LCExKSx0LmxhbmVzPTQxOTQzMDQpO3UuaXNCYWNrd2FyZHM/KG4uc2libGluZz10LmNoaWxkLHQuY2hpbGQ9bik6KGw9dS5sYXN0LGwhPT1udWxsP2wuc2libGluZz1uOnQuY2hpbGQ9bix1Lmxhc3Q9bil9cmV0dXJuIHUudGFpbCE9PW51bGw/KGw9dS50YWlsLHUucmVuZGVyaW5nPWwsdS50YWlsPWwuc2libGluZyx1LnJlbmRlcmluZ1N0YXJ0VGltZT1ObCgpLGwuc2libGluZz1udWxsLGE9YWwuY3VycmVudCxqKGFsLGU/YSYxfDI6YSYxKSxHJiZidCh0LHUudHJlZUZvcmtDb3VudCksbCk6KEYodCksbnVsbCk7Y2FzZSAyMjpjYXNlIDIzOnJldHVybiBHbCh0KSxDZigpLHU9dC5tZW1vaXplZFN0YXRlIT09bnVsbCxsIT09bnVsbD9sLm1lbW9pemVkU3RhdGUhPT1udWxsIT09dSYmKHQuZmxhZ3N8PTgxOTIpOnUmJih0LmZsYWdzfD04MTkyKSx1PyhhJjUzNjg3MDkxMikhPT0wJiYodC5mbGFncyYxMjgpPT09MCYmKEYodCksdC5zdWJ0cmVlRmxhZ3MmNiYmKHQuZmxhZ3N8PTgxOTIpKTpGKHQpLGE9dC51cGRhdGVRdWV1ZSxhIT09bnVsbCYmbm4odCxhLnJldHJ5UXVldWUpLGE9bnVsbCxsIT09bnVsbCYmbC5tZW1vaXplZFN0YXRlIT09bnVsbCYmbC5tZW1vaXplZFN0YXRlLmNhY2hlUG9vbCE9PW51bGwmJihhPWwubWVtb2l6ZWRTdGF0ZS5jYWNoZVBvb2wucG9vbCksdT1udWxsLHQubWVtb2l6ZWRTdGF0ZSE9PW51bGwmJnQubWVtb2l6ZWRTdGF0ZS5jYWNoZVBvb2whPT1udWxsJiYodT10Lm1lbW9pemVkU3RhdGUuY2FjaGVQb29sLnBvb2wpLHUhPT1hJiYodC5mbGFnc3w9MjA0OCksbCE9PW51bGwmJkkoQWEpLG51bGw7Y2FzZSAyNDpyZXR1cm4gYT1udWxsLGwhPT1udWxsJiYoYT1sLm1lbW9pemVkU3RhdGUuY2FjaGUpLHQubWVtb2l6ZWRTdGF0ZS5jYWNoZSE9PWEmJih0LmZsYWdzfD0yMDQ4KSxBdChlbCksRih0KSxudWxsO2Nhc2UgMjU6cmV0dXJuIG51bGw7Y2FzZSAzMDpyZXR1cm4gbnVsbH10aHJvdyBFcnJvcihzKDE1Nix0LnRhZykpfWZ1bmN0aW9uIGptKGwsdCl7c3dpdGNoKG9mKHQpLHQudGFnKXtjYXNlIDE6cmV0dXJuIGw9dC5mbGFncyxsJjY1NTM2Pyh0LmZsYWdzPWwmLTY1NTM3fDEyOCx0KTpudWxsO2Nhc2UgMzpyZXR1cm4gQXQoZWwpLFlhKCksbD10LmZsYWdzLChsJjY1NTM2KSE9PTAmJihsJjEyOCk9PT0wPyh0LmZsYWdzPWwmLTY1NTM3fDEyOCx0KTpudWxsO2Nhc2UgMjY6Y2FzZSAyNzpjYXNlIDU6cmV0dXJuIGdlKHQpLG51bGw7Y2FzZSAzMTppZih0Lm1lbW9pemVkU3RhdGUhPT1udWxsKXtpZihHbCh0KSx0LmFsdGVybmF0ZT09PW51bGwpdGhyb3cgRXJyb3IocygzNDApKTtnYSgpfXJldHVybiBsPXQuZmxhZ3MsbCY2NTUzNj8odC5mbGFncz1sJi02NTUzN3wxMjgsdCk6bnVsbDtjYXNlIDEzOmlmKEdsKHQpLGw9dC5tZW1vaXplZFN0YXRlLGwhPT1udWxsJiZsLmRlaHlkcmF0ZWQhPT1udWxsKXtpZih0LmFsdGVybmF0ZT09PW51bGwpdGhyb3cgRXJyb3IocygzNDApKTtnYSgpfXJldHVybiBsPXQuZmxhZ3MsbCY2NTUzNj8odC5mbGFncz1sJi02NTUzN3wxMjgsdCk6bnVsbDtjYXNlIDE5OnJldHVybiBJKGFsKSxudWxsO2Nhc2UgNDpyZXR1cm4gWWEoKSxudWxsO2Nhc2UgMTA6cmV0dXJuIEF0KHQudHlwZSksbnVsbDtjYXNlIDIyOmNhc2UgMjM6cmV0dXJuIEdsKHQpLENmKCksbCE9PW51bGwmJkkoQWEpLGw9dC5mbGFncyxsJjY1NTM2Pyh0LmZsYWdzPWwmLTY1NTM3fDEyOCx0KTpudWxsO2Nhc2UgMjQ6cmV0dXJuIEF0KGVsKSxudWxsO2Nhc2UgMjU6cmV0dXJuIG51bGw7ZGVmYXVsdDpyZXR1cm4gbnVsbH19ZnVuY3Rpb24gQnYobCx0KXtzd2l0Y2gob2YodCksdC50YWcpe2Nhc2UgMzpBdChlbCksWWEoKTticmVhaztjYXNlIDI2OmNhc2UgMjc6Y2FzZSA1OmdlKHQpO2JyZWFrO2Nhc2UgNDpZYSgpO2JyZWFrO2Nhc2UgMzE6dC5tZW1vaXplZFN0YXRlIT09bnVsbCYmR2wodCk7YnJlYWs7Y2FzZSAxMzpHbCh0KTticmVhaztjYXNlIDE5OkkoYWwpO2JyZWFrO2Nhc2UgMTA6QXQodC50eXBlKTticmVhaztjYXNlIDIyOmNhc2UgMjM6R2wodCksQ2YoKSxsIT09bnVsbCYmSShBYSk7YnJlYWs7Y2FzZSAyNDpBdChlbCl9fWZ1bmN0aW9uICR1KGwsdCl7dHJ5e3ZhciBhPXQudXBkYXRlUXVldWUsdT1hIT09bnVsbD9hLmxhc3RFZmZlY3Q6bnVsbDtpZih1IT09bnVsbCl7dmFyIGU9dS5uZXh0O2E9ZTtkb3tpZigoYS50YWcmbCk9PT1sKXt1PXZvaWQgMDt2YXIgbj1hLmNyZWF0ZSxmPWEuaW5zdDt1PW4oKSxmLmRlc3Ryb3k9dX1hPWEubmV4dH13aGlsZShhIT09ZSl9fWNhdGNoKGMpe3AodCx0LnJldHVybixjKX19ZnVuY3Rpb24gV3QobCx0LGEpe3RyeXt2YXIgdT10LnVwZGF0ZVF1ZXVlLGU9dSE9PW51bGw/dS5sYXN0RWZmZWN0Om51bGw7aWYoZSE9PW51bGwpe3ZhciBuPWUubmV4dDt1PW47ZG97aWYoKHUudGFnJmwpPT09bCl7dmFyIGY9dS5pbnN0LGM9Zi5kZXN0cm95O2lmKGMhPT12b2lkIDApe2YuZGVzdHJveT12b2lkIDAsZT10O3ZhciBpPWEsaD1jO3RyeXtoKCl9Y2F0Y2goZyl7cChlLGksZyl9fX11PXUubmV4dH13aGlsZSh1IT09bil9fWNhdGNoKGcpe3AodCx0LnJldHVybixnKX19ZnVuY3Rpb24gWXYobCl7dmFyIHQ9bC51cGRhdGVRdWV1ZTtpZih0IT09bnVsbCl7dmFyIGE9bC5zdGF0ZU5vZGU7dHJ5e0UwKHQsYSl9Y2F0Y2godSl7cChsLGwucmV0dXJuLHUpfX19ZnVuY3Rpb24gUXYobCx0LGEpe2EucHJvcHM9T2EobC50eXBlLGwubWVtb2l6ZWRQcm9wcyksYS5zdGF0ZT1sLm1lbW9pemVkU3RhdGU7dHJ5e2EuY29tcG9uZW50V2lsbFVubW91bnQoKX1jYXRjaCh1KXtwKGwsdCx1KX19ZnVuY3Rpb24gRnUobCx0KXt0cnl7dmFyIGE9bC5yZWY7aWYoYSE9PW51bGwpe3N3aXRjaChsLnRhZyl7Y2FzZSAyNjpjYXNlIDI3OmNhc2UgNTp2YXIgdT1sLnN0YXRlTm9kZTticmVhaztjYXNlIDMwOnU9bC5zdGF0ZU5vZGU7YnJlYWs7ZGVmYXVsdDp1PWwuc3RhdGVOb2RlfXR5cGVvZiBhPT0iZnVuY3Rpb24iP2wucmVmQ2xlYW51cD1hKHUpOmEuY3VycmVudD11fX1jYXRjaChlKXtwKGwsdCxlKX19ZnVuY3Rpb24gaXQobCx0KXt2YXIgYT1sLnJlZix1PWwucmVmQ2xlYW51cDtpZihhIT09bnVsbClpZih0eXBlb2YgdT09ImZ1bmN0aW9uIil0cnl7dSgpfWNhdGNoKGUpe3AobCx0LGUpfWZpbmFsbHl7bC5yZWZDbGVhbnVwPW51bGwsbD1sLmFsdGVybmF0ZSxsIT1udWxsJiYobC5yZWZDbGVhbnVwPW51bGwpfWVsc2UgaWYodHlwZW9mIGE9PSJmdW5jdGlvbiIpdHJ5e2EobnVsbCl9Y2F0Y2goZSl7cChsLHQsZSl9ZWxzZSBhLmN1cnJlbnQ9bnVsbH1mdW5jdGlvbiBYdihsKXt2YXIgdD1sLnR5cGUsYT1sLm1lbW9pemVkUHJvcHMsdT1sLnN0YXRlTm9kZTt0cnl7bDpzd2l0Y2godCl7Y2FzZSJidXR0b24iOmNhc2UiaW5wdXQiOmNhc2Uic2VsZWN0IjpjYXNlInRleHRhcmVhIjphLmF1dG9Gb2N1cyYmdS5mb2N1cygpO2JyZWFrIGw7Y2FzZSJpbWciOmEuc3JjP3Uuc3JjPWEuc3JjOmEuc3JjU2V0JiYodS5zcmNzZXQ9YS5zcmNTZXQpfX1jYXRjaChlKXtwKGwsbC5yZXR1cm4sZSl9fWZ1bmN0aW9uIFNjKGwsdCxhKXt0cnl7dmFyIHU9bC5zdGF0ZU5vZGU7Y2godSxsLnR5cGUsYSx0KSx1W29sXT10fWNhdGNoKGUpe3AobCxsLnJldHVybixlKX19ZnVuY3Rpb24gR3YobCl7cmV0dXJuIGwudGFnPT09NXx8bC50YWc9PT0zfHxsLnRhZz09PTI2fHxsLnRhZz09PTI3JiZQdChsLnR5cGUpfHxsLnRhZz09PTR9ZnVuY3Rpb24gc2MobCl7bDpmb3IoOzspe2Zvcig7bC5zaWJsaW5nPT09bnVsbDspe2lmKGwucmV0dXJuPT09bnVsbHx8R3YobC5yZXR1cm4pKXJldHVybiBudWxsO2w9bC5yZXR1cm59Zm9yKGwuc2libGluZy5yZXR1cm49bC5yZXR1cm4sbD1sLnNpYmxpbmc7bC50YWchPT01JiZsLnRhZyE9PTYmJmwudGFnIT09MTg7KXtpZihsLnRhZz09PTI3JiZQdChsLnR5cGUpfHxsLmZsYWdzJjJ8fGwuY2hpbGQ9PT1udWxsfHxsLnRhZz09PTQpY29udGludWUgbDtsLmNoaWxkLnJldHVybj1sLGw9bC5jaGlsZH1pZighKGwuZmxhZ3MmMikpcmV0dXJuIGwuc3RhdGVOb2RlfX1mdW5jdGlvbiBnYyhsLHQsYSl7dmFyIHU9bC50YWc7aWYodT09PTV8fHU9PT02KWw9bC5zdGF0ZU5vZGUsdD8oYS5ub2RlVHlwZT09PTk/YS5ib2R5OmEubm9kZU5hbWU9PT0iSFRNTCI/YS5vd25lckRvY3VtZW50LmJvZHk6YSkuaW5zZXJ0QmVmb3JlKGwsdCk6KHQ9YS5ub2RlVHlwZT09PTk/YS5ib2R5OmEubm9kZU5hbWU9PT0iSFRNTCI/YS5vd25lckRvY3VtZW50LmJvZHk6YSx0LmFwcGVuZENoaWxkKGwpLGE9YS5fcmVhY3RSb290Q29udGFpbmVyLGEhPW51bGx8fHQub25jbGljayE9PW51bGx8fCh0Lm9uY2xpY2s9U3QpKTtlbHNlIGlmKHUhPT00JiYodT09PTI3JiZQdChsLnR5cGUpJiYoYT1sLnN0YXRlTm9kZSx0PW51bGwpLGw9bC5jaGlsZCxsIT09bnVsbCkpZm9yKGdjKGwsdCxhKSxsPWwuc2libGluZztsIT09bnVsbDspZ2MobCx0LGEpLGw9bC5zaWJsaW5nfWZ1bmN0aW9uIGZuKGwsdCxhKXt2YXIgdT1sLnRhZztpZih1PT09NXx8dT09PTYpbD1sLnN0YXRlTm9kZSx0P2EuaW5zZXJ0QmVmb3JlKGwsdCk6YS5hcHBlbmRDaGlsZChsKTtlbHNlIGlmKHUhPT00JiYodT09PTI3JiZQdChsLnR5cGUpJiYoYT1sLnN0YXRlTm9kZSksbD1sLmNoaWxkLGwhPT1udWxsKSlmb3IoZm4obCx0LGEpLGw9bC5zaWJsaW5nO2whPT1udWxsOylmbihsLHQsYSksbD1sLnNpYmxpbmd9ZnVuY3Rpb24gQ3YobCl7dmFyIHQ9bC5zdGF0ZU5vZGUsYT1sLm1lbW9pemVkUHJvcHM7dHJ5e2Zvcih2YXIgdT1sLnR5cGUsZT10LmF0dHJpYnV0ZXM7ZS5sZW5ndGg7KXQucmVtb3ZlQXR0cmlidXRlTm9kZShlWzBdKTtibCh0LHUsYSksdFtkbF09bCx0W29sXT1hfWNhdGNoKG4pe3AobCxsLnJldHVybixuKX19dmFyIE90PSExLGNsPSExLGJjPSExLFp2PXR5cGVvZiBXZWFrU2V0PT0iZnVuY3Rpb24iP1dlYWtTZXQ6U2V0LGhsPW51bGw7ZnVuY3Rpb24gVm0obCx0KXtpZihsPWwuY29udGFpbmVySW5mbyxSYz1IbixsPUZpKGwpLHlmKGwpKXtpZigic2VsZWN0aW9uU3RhcnQiaW4gbCl2YXIgYT17c3RhcnQ6bC5zZWxlY3Rpb25TdGFydCxlbmQ6bC5zZWxlY3Rpb25FbmR9O2Vsc2UgbDp7YT0oYT1sLm93bmVyRG9jdW1lbnQpJiZhLmRlZmF1bHRWaWV3fHx3aW5kb3c7dmFyIHU9YS5nZXRTZWxlY3Rpb24mJmEuZ2V0U2VsZWN0aW9uKCk7aWYodSYmdS5yYW5nZUNvdW50IT09MCl7YT11LmFuY2hvck5vZGU7dmFyIGU9dS5hbmNob3JPZmZzZXQsbj11LmZvY3VzTm9kZTt1PXUuZm9jdXNPZmZzZXQ7dHJ5e2Eubm9kZVR5cGUsbi5ub2RlVHlwZX1jYXRjaHthPW51bGw7YnJlYWsgbH12YXIgZj0wLGM9LTEsaT0tMSxoPTAsZz0wLEE9bCxkPW51bGw7dDpmb3IoOzspe2Zvcih2YXIgUztBIT09YXx8ZSE9PTAmJkEubm9kZVR5cGUhPT0zfHwoYz1mK2UpLEEhPT1ufHx1IT09MCYmQS5ub2RlVHlwZSE9PTN8fChpPWYrdSksQS5ub2RlVHlwZT09PTMmJihmKz1BLm5vZGVWYWx1ZS5sZW5ndGgpLChTPUEuZmlyc3RDaGlsZCkhPT1udWxsOylkPUEsQT1TO2Zvcig7Oyl7aWYoQT09PWwpYnJlYWsgdDtpZihkPT09YSYmKytoPT09ZSYmKGM9ZiksZD09PW4mJisrZz09PXUmJihpPWYpLChTPUEubmV4dFNpYmxpbmcpIT09bnVsbClicmVhaztBPWQsZD1BLnBhcmVudE5vZGV9QT1TfWE9Yz09PS0xfHxpPT09LTE/bnVsbDp7c3RhcnQ6YyxlbmQ6aX19ZWxzZSBhPW51bGx9YT1hfHx7c3RhcnQ6MCxlbmQ6MH19ZWxzZSBhPW51bGw7Zm9yKGpjPXtmb2N1c2VkRWxlbTpsLHNlbGVjdGlvblJhbmdlOmF9LEhuPSExLGhsPXQ7aGwhPT1udWxsOylpZih0PWhsLGw9dC5jaGlsZCwodC5zdWJ0cmVlRmxhZ3MmMTAyOCkhPT0wJiZsIT09bnVsbClsLnJldHVybj10LGhsPWw7ZWxzZSBmb3IoO2hsIT09bnVsbDspe3N3aXRjaCh0PWhsLG49dC5hbHRlcm5hdGUsbD10LmZsYWdzLHQudGFnKXtjYXNlIDA6aWYoKGwmNCkhPT0wJiYobD10LnVwZGF0ZVF1ZXVlLGw9bCE9PW51bGw/bC5ldmVudHM6bnVsbCxsIT09bnVsbCkpZm9yKGE9MDthPGwubGVuZ3RoO2ErKyllPWxbYV0sZS5yZWYuaW1wbD1lLm5leHRJbXBsO2JyZWFrO2Nhc2UgMTE6Y2FzZSAxNTpicmVhaztjYXNlIDE6aWYoKGwmMTAyNCkhPT0wJiZuIT09bnVsbCl7bD12b2lkIDAsYT10LGU9bi5tZW1vaXplZFByb3BzLG49bi5tZW1vaXplZFN0YXRlLHU9YS5zdGF0ZU5vZGU7dHJ5e3ZhciBFPU9hKGEudHlwZSxlKTtsPXUuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUoRSxuKSx1Ll9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlPWx9Y2F0Y2goRCl7cChhLGEucmV0dXJuLEQpfX1icmVhaztjYXNlIDM6aWYoKGwmMTAyNCkhPT0wKXtpZihsPXQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8sYT1sLm5vZGVUeXBlLGE9PT05KUtjKGwpO2Vsc2UgaWYoYT09PTEpc3dpdGNoKGwubm9kZU5hbWUpe2Nhc2UiSEVBRCI6Y2FzZSJIVE1MIjpjYXNlIkJPRFkiOktjKGwpO2JyZWFrO2RlZmF1bHQ6bC50ZXh0Q29udGVudD0iIn19YnJlYWs7Y2FzZSA1OmNhc2UgMjY6Y2FzZSAyNzpjYXNlIDY6Y2FzZSA0OmNhc2UgMTc6YnJlYWs7ZGVmYXVsdDppZigobCYxMDI0KSE9PTApdGhyb3cgRXJyb3IocygxNjMpKX1pZihsPXQuc2libGluZyxsIT09bnVsbCl7bC5yZXR1cm49dC5yZXR1cm4saGw9bDticmVha31obD10LnJldHVybn19ZnVuY3Rpb24gUnYobCx0LGEpe3ZhciB1PWEuZmxhZ3M7c3dpdGNoKGEudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OlV0KGwsYSksdSY0JiYkdSg1LGEpO2JyZWFrO2Nhc2UgMTppZihVdChsLGEpLHUmNClpZihsPWEuc3RhdGVOb2RlLHQ9PT1udWxsKXRyeXtsLmNvbXBvbmVudERpZE1vdW50KCl9Y2F0Y2goZil7cChhLGEucmV0dXJuLGYpfWVsc2V7dmFyIGU9T2EoYS50eXBlLHQubWVtb2l6ZWRQcm9wcyk7dD10Lm1lbW9pemVkU3RhdGU7dHJ5e2wuY29tcG9uZW50RGlkVXBkYXRlKGUsdCxsLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlKX1jYXRjaChmKXtwKGEsYS5yZXR1cm4sZil9fXUmNjQmJll2KGEpLHUmNTEyJiZGdShhLGEucmV0dXJuKTticmVhaztjYXNlIDM6aWYoVXQobCxhKSx1JjY0JiYobD1hLnVwZGF0ZVF1ZXVlLGwhPT1udWxsKSl7aWYodD1udWxsLGEuY2hpbGQhPT1udWxsKXN3aXRjaChhLmNoaWxkLnRhZyl7Y2FzZSAyNzpjYXNlIDU6dD1hLmNoaWxkLnN0YXRlTm9kZTticmVhaztjYXNlIDE6dD1hLmNoaWxkLnN0YXRlTm9kZX10cnl7RTAobCx0KX1jYXRjaChmKXtwKGEsYS5yZXR1cm4sZil9fWJyZWFrO2Nhc2UgMjc6dD09PW51bGwmJnUmNCYmQ3YoYSk7Y2FzZSAyNjpjYXNlIDU6VXQobCxhKSx0PT09bnVsbCYmdSY0JiZYdihhKSx1JjUxMiYmRnUoYSxhLnJldHVybik7YnJlYWs7Y2FzZSAxMjpVdChsLGEpO2JyZWFrO2Nhc2UgMzE6VXQobCxhKSx1JjQmJnB2KGwsYSk7YnJlYWs7Y2FzZSAxMzpVdChsLGEpLHUmNCYmS3YobCxhKSx1JjY0JiYobD1hLm1lbW9pemVkU3RhdGUsbCE9PW51bGwmJihsPWwuZGVoeWRyYXRlZCxsIT09bnVsbCYmKGE9Rm0uYmluZChudWxsLGEpLHNoKGwsYSkpKSk7YnJlYWs7Y2FzZSAyMjppZih1PWEubWVtb2l6ZWRTdGF0ZSE9PW51bGx8fE90LCF1KXt0PXQhPT1udWxsJiZ0Lm1lbW9pemVkU3RhdGUhPT1udWxsfHxjbCxlPU90O3ZhciBuPWNsO090PXUsKGNsPXQpJiYhbj9fdChsLGEsKGEuc3VidHJlZUZsYWdzJjg3NzIpIT09MCk6VXQobCxhKSxPdD1lLGNsPW59YnJlYWs7Y2FzZSAzMDpicmVhaztkZWZhdWx0OlV0KGwsYSl9fWZ1bmN0aW9uIGp2KGwpe3ZhciB0PWwuYWx0ZXJuYXRlO3QhPT1udWxsJiYobC5hbHRlcm5hdGU9bnVsbCxqdih0KSksbC5jaGlsZD1udWxsLGwuZGVsZXRpb25zPW51bGwsbC5zaWJsaW5nPW51bGwsbC50YWc9PT01JiYodD1sLnN0YXRlTm9kZSx0IT09bnVsbCYmV24odCkpLGwuc3RhdGVOb2RlPW51bGwsbC5yZXR1cm49bnVsbCxsLmRlcGVuZGVuY2llcz1udWxsLGwubWVtb2l6ZWRQcm9wcz1udWxsLGwubWVtb2l6ZWRTdGF0ZT1udWxsLGwucGVuZGluZ1Byb3BzPW51bGwsbC5zdGF0ZU5vZGU9bnVsbCxsLnVwZGF0ZVF1ZXVlPW51bGx9dmFyIHI9bnVsbCxNbD0hMTtmdW5jdGlvbiBEdChsLHQsYSl7Zm9yKGE9YS5jaGlsZDthIT09bnVsbDspVnYobCx0LGEpLGE9YS5zaWJsaW5nfWZ1bmN0aW9uIFZ2KGwsdCxhKXtpZihxbCYmdHlwZW9mIHFsLm9uQ29tbWl0RmliZXJVbm1vdW50PT0iZnVuY3Rpb24iKXRyeXtxbC5vbkNvbW1pdEZpYmVyVW5tb3VudChBdSxhKX1jYXRjaHt9c3dpdGNoKGEudGFnKXtjYXNlIDI2OmNsfHxpdChhLHQpLER0KGwsdCxhKSxhLm1lbW9pemVkU3RhdGU/YS5tZW1vaXplZFN0YXRlLmNvdW50LS06YS5zdGF0ZU5vZGUmJihhPWEuc3RhdGVOb2RlLGEucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhKSk7YnJlYWs7Y2FzZSAyNzpjbHx8aXQoYSx0KTt2YXIgdT1yLGU9TWw7UHQoYS50eXBlKSYmKHI9YS5zdGF0ZU5vZGUsTWw9ITEpLER0KGwsdCxhKSxlZShhLnN0YXRlTm9kZSkscj11LE1sPWU7YnJlYWs7Y2FzZSA1OmNsfHxpdChhLHQpO2Nhc2UgNjppZih1PXIsZT1NbCxyPW51bGwsRHQobCx0LGEpLHI9dSxNbD1lLHIhPT1udWxsKWlmKE1sKXRyeXsoci5ub2RlVHlwZT09PTk/ci5ib2R5OnIubm9kZU5hbWU9PT0iSFRNTCI/ci5vd25lckRvY3VtZW50LmJvZHk6cikucmVtb3ZlQ2hpbGQoYS5zdGF0ZU5vZGUpfWNhdGNoKG4pe3AoYSx0LG4pfWVsc2UgdHJ5e3IucmVtb3ZlQ2hpbGQoYS5zdGF0ZU5vZGUpfWNhdGNoKG4pe3AoYSx0LG4pfWJyZWFrO2Nhc2UgMTg6ciE9PW51bGwmJihNbD8obD1yLFkxKGwubm9kZVR5cGU9PT05P2wuYm9keTpsLm5vZGVOYW1lPT09IkhUTUwiP2wub3duZXJEb2N1bWVudC5ib2R5OmwsYS5zdGF0ZU5vZGUpLGd1KGwpKTpZMShyLGEuc3RhdGVOb2RlKSk7YnJlYWs7Y2FzZSA0OnU9cixlPU1sLHI9YS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxNbD0hMCxEdChsLHQsYSkscj11LE1sPWU7YnJlYWs7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1Old0KDIsYSx0KSxjbHx8V3QoNCxhLHQpLER0KGwsdCxhKTticmVhaztjYXNlIDE6Y2x8fChpdChhLHQpLHU9YS5zdGF0ZU5vZGUsdHlwZW9mIHUuY29tcG9uZW50V2lsbFVubW91bnQ9PSJmdW5jdGlvbiImJlF2KGEsdCx1KSksRHQobCx0LGEpO2JyZWFrO2Nhc2UgMjE6RHQobCx0LGEpO2JyZWFrO2Nhc2UgMjI6Y2w9KHU9Y2wpfHxhLm1lbW9pemVkU3RhdGUhPT1udWxsLER0KGwsdCxhKSxjbD11O2JyZWFrO2RlZmF1bHQ6RHQobCx0LGEpfX1mdW5jdGlvbiBwdihsLHQpe2lmKHQubWVtb2l6ZWRTdGF0ZT09PW51bGwmJihsPXQuYWx0ZXJuYXRlLGwhPT1udWxsJiYobD1sLm1lbW9pemVkU3RhdGUsbCE9PW51bGwpKSl7bD1sLmRlaHlkcmF0ZWQ7dHJ5e2d1KGwpfWNhdGNoKGEpe3AodCx0LnJldHVybixhKX19fWZ1bmN0aW9uIEt2KGwsdCl7aWYodC5tZW1vaXplZFN0YXRlPT09bnVsbCYmKGw9dC5hbHRlcm5hdGUsbCE9PW51bGwmJihsPWwubWVtb2l6ZWRTdGF0ZSxsIT09bnVsbCYmKGw9bC5kZWh5ZHJhdGVkLGwhPT1udWxsKSkpKXRyeXtndShsKX1jYXRjaChhKXtwKHQsdC5yZXR1cm4sYSl9fWZ1bmN0aW9uIHBtKGwpe3N3aXRjaChsLnRhZyl7Y2FzZSAzMTpjYXNlIDEzOmNhc2UgMTk6dmFyIHQ9bC5zdGF0ZU5vZGU7cmV0dXJuIHQ9PT1udWxsJiYodD1sLnN0YXRlTm9kZT1uZXcgWnYpLHQ7Y2FzZSAyMjpyZXR1cm4gbD1sLnN0YXRlTm9kZSx0PWwuX3JldHJ5Q2FjaGUsdD09PW51bGwmJih0PWwuX3JldHJ5Q2FjaGU9bmV3IFp2KSx0O2RlZmF1bHQ6dGhyb3cgRXJyb3Iocyg0MzUsbC50YWcpKX19ZnVuY3Rpb24gY24obCx0KXt2YXIgYT1wbShsKTt0LmZvckVhY2goZnVuY3Rpb24odSl7aWYoIWEuaGFzKHUpKXthLmFkZCh1KTt2YXIgZT1ybS5iaW5kKG51bGwsbCx1KTt1LnRoZW4oZSxlKX19KX1mdW5jdGlvbiBPbChsLHQpe3ZhciBhPXQuZGVsZXRpb25zO2lmKGEhPT1udWxsKWZvcih2YXIgdT0wO3U8YS5sZW5ndGg7dSsrKXt2YXIgZT1hW3VdLG49bCxmPXQsYz1mO2w6Zm9yKDtjIT09bnVsbDspe3N3aXRjaChjLnRhZyl7Y2FzZSAyNzppZihQdChjLnR5cGUpKXtyPWMuc3RhdGVOb2RlLE1sPSExO2JyZWFrIGx9YnJlYWs7Y2FzZSA1OnI9Yy5zdGF0ZU5vZGUsTWw9ITE7YnJlYWsgbDtjYXNlIDM6Y2FzZSA0OnI9Yy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxNbD0hMDticmVhayBsfWM9Yy5yZXR1cm59aWYocj09PW51bGwpdGhyb3cgRXJyb3IocygxNjApKTtWdihuLGYsZSkscj1udWxsLE1sPSExLG49ZS5hbHRlcm5hdGUsbiE9PW51bGwmJihuLnJldHVybj1udWxsKSxlLnJldHVybj1udWxsfWlmKHQuc3VidHJlZUZsYWdzJjEzODg2KWZvcih0PXQuY2hpbGQ7dCE9PW51bGw7KXh2KHQsbCksdD10LnNpYmxpbmd9dmFyIGF0PW51bGw7ZnVuY3Rpb24geHYobCx0KXt2YXIgYT1sLmFsdGVybmF0ZSx1PWwuZmxhZ3M7c3dpdGNoKGwudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE0OmNhc2UgMTU6T2wodCxsKSxEbChsKSx1JjQmJihXdCgzLGwsbC5yZXR1cm4pLCR1KDMsbCksV3QoNSxsLGwucmV0dXJuKSk7YnJlYWs7Y2FzZSAxOk9sKHQsbCksRGwobCksdSY1MTImJihjbHx8YT09PW51bGx8fGl0KGEsYS5yZXR1cm4pKSx1JjY0JiZPdCYmKGw9bC51cGRhdGVRdWV1ZSxsIT09bnVsbCYmKHU9bC5jYWxsYmFja3MsdSE9PW51bGwmJihhPWwuc2hhcmVkLmhpZGRlbkNhbGxiYWNrcyxsLnNoYXJlZC5oaWRkZW5DYWxsYmFja3M9YT09PW51bGw/dTphLmNvbmNhdCh1KSkpKTticmVhaztjYXNlIDI2OnZhciBlPWF0O2lmKE9sKHQsbCksRGwobCksdSY1MTImJihjbHx8YT09PW51bGx8fGl0KGEsYS5yZXR1cm4pKSx1JjQpe3ZhciBuPWEhPT1udWxsP2EubWVtb2l6ZWRTdGF0ZTpudWxsO2lmKHU9bC5tZW1vaXplZFN0YXRlLGE9PT1udWxsKWlmKHU9PT1udWxsKWlmKGwuc3RhdGVOb2RlPT09bnVsbCl7bDp7dT1sLnR5cGUsYT1sLm1lbW9pemVkUHJvcHMsZT1lLm93bmVyRG9jdW1lbnR8fGU7dDpzd2l0Y2godSl7Y2FzZSJ0aXRsZSI6bj1lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0aXRsZSIpWzBdLCghbnx8bltFdV18fG5bZGxdfHxuLm5hbWVzcGFjZVVSST09PSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyJ8fG4uaGFzQXR0cmlidXRlKCJpdGVtcHJvcCIpKSYmKG49ZS5jcmVhdGVFbGVtZW50KHUpLGUuaGVhZC5pbnNlcnRCZWZvcmUobixlLnF1ZXJ5U2VsZWN0b3IoImhlYWQgPiB0aXRsZSIpKSksYmwobix1LGEpLG5bZGxdPWwsbWwobiksdT1uO2JyZWFrIGw7Y2FzZSJsaW5rIjp2YXIgZj14MSgibGluayIsImhyZWYiLGUpLmdldCh1KyhhLmhyZWZ8fCIiKSk7aWYoZil7Zm9yKHZhciBjPTA7YzxmLmxlbmd0aDtjKyspaWYobj1mW2NdLG4uZ2V0QXR0cmlidXRlKCJocmVmIik9PT0oYS5ocmVmPT1udWxsfHxhLmhyZWY9PT0iIj9udWxsOmEuaHJlZikmJm4uZ2V0QXR0cmlidXRlKCJyZWwiKT09PShhLnJlbD09bnVsbD9udWxsOmEucmVsKSYmbi5nZXRBdHRyaWJ1dGUoInRpdGxlIik9PT0oYS50aXRsZT09bnVsbD9udWxsOmEudGl0bGUpJiZuLmdldEF0dHJpYnV0ZSgiY3Jvc3NvcmlnaW4iKT09PShhLmNyb3NzT3JpZ2luPT1udWxsP251bGw6YS5jcm9zc09yaWdpbikpe2Yuc3BsaWNlKGMsMSk7YnJlYWsgdH19bj1lLmNyZWF0ZUVsZW1lbnQodSksYmwobix1LGEpLGUuaGVhZC5hcHBlbmRDaGlsZChuKTticmVhaztjYXNlIm1ldGEiOmlmKGY9eDEoIm1ldGEiLCJjb250ZW50IixlKS5nZXQodSsoYS5jb250ZW50fHwiIikpKXtmb3IoYz0wO2M8Zi5sZW5ndGg7YysrKWlmKG49ZltjXSxuLmdldEF0dHJpYnV0ZSgiY29udGVudCIpPT09KGEuY29udGVudD09bnVsbD9udWxsOiIiK2EuY29udGVudCkmJm4uZ2V0QXR0cmlidXRlKCJuYW1lIik9PT0oYS5uYW1lPT1udWxsP251bGw6YS5uYW1lKSYmbi5nZXRBdHRyaWJ1dGUoInByb3BlcnR5Iik9PT0oYS5wcm9wZXJ0eT09bnVsbD9udWxsOmEucHJvcGVydHkpJiZuLmdldEF0dHJpYnV0ZSgiaHR0cC1lcXVpdiIpPT09KGEuaHR0cEVxdWl2PT1udWxsP251bGw6YS5odHRwRXF1aXYpJiZuLmdldEF0dHJpYnV0ZSgiY2hhcnNldCIpPT09KGEuY2hhclNldD09bnVsbD9udWxsOmEuY2hhclNldCkpe2Yuc3BsaWNlKGMsMSk7YnJlYWsgdH19bj1lLmNyZWF0ZUVsZW1lbnQodSksYmwobix1LGEpLGUuaGVhZC5hcHBlbmRDaGlsZChuKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKHMoNDY4LHUpKX1uW2RsXT1sLG1sKG4pLHU9bn1sLnN0YXRlTm9kZT11fWVsc2UgTDEoZSxsLnR5cGUsbC5zdGF0ZU5vZGUpO2Vsc2UgbC5zdGF0ZU5vZGU9SzEoZSx1LGwubWVtb2l6ZWRQcm9wcyk7ZWxzZSBuIT09dT8obj09PW51bGw/YS5zdGF0ZU5vZGUhPT1udWxsJiYoYT1hLnN0YXRlTm9kZSxhLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYSkpOm4uY291bnQtLSx1PT09bnVsbD9MMShlLGwudHlwZSxsLnN0YXRlTm9kZSk6SzEoZSx1LGwubWVtb2l6ZWRQcm9wcykpOnU9PT1udWxsJiZsLnN0YXRlTm9kZSE9PW51bGwmJlNjKGwsbC5tZW1vaXplZFByb3BzLGEubWVtb2l6ZWRQcm9wcyl9YnJlYWs7Y2FzZSAyNzpPbCh0LGwpLERsKGwpLHUmNTEyJiYoY2x8fGE9PT1udWxsfHxpdChhLGEucmV0dXJuKSksYSE9PW51bGwmJnUmNCYmU2MobCxsLm1lbW9pemVkUHJvcHMsYS5tZW1vaXplZFByb3BzKTticmVhaztjYXNlIDU6aWYoT2wodCxsKSxEbChsKSx1JjUxMiYmKGNsfHxhPT09bnVsbHx8aXQoYSxhLnJldHVybikpLGwuZmxhZ3MmMzIpe2U9bC5zdGF0ZU5vZGU7dHJ5e2phKGUsIiIpfWNhdGNoKEUpe3AobCxsLnJldHVybixFKX19dSY0JiZsLnN0YXRlTm9kZSE9bnVsbCYmKGU9bC5tZW1vaXplZFByb3BzLFNjKGwsZSxhIT09bnVsbD9hLm1lbW9pemVkUHJvcHM6ZSkpLHUmMTAyNCYmKGJjPSEwKTticmVhaztjYXNlIDY6aWYoT2wodCxsKSxEbChsKSx1JjQpe2lmKGwuc3RhdGVOb2RlPT09bnVsbCl0aHJvdyBFcnJvcihzKDE2MikpO3U9bC5tZW1vaXplZFByb3BzLGE9bC5zdGF0ZU5vZGU7dHJ5e2Eubm9kZVZhbHVlPXV9Y2F0Y2goRSl7cChsLGwucmV0dXJuLEUpfX1icmVhaztjYXNlIDM6aWYoT249bnVsbCxlPWF0LGF0PUVuKHQuY29udGFpbmVySW5mbyksT2wodCxsKSxhdD1lLERsKGwpLHUmNCYmYSE9PW51bGwmJmEubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQpdHJ5e2d1KHQuY29udGFpbmVySW5mbyl9Y2F0Y2goRSl7cChsLGwucmV0dXJuLEUpfWJjJiYoYmM9ITEsTHYobCkpO2JyZWFrO2Nhc2UgNDp1PWF0LGF0PUVuKGwuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pLE9sKHQsbCksRGwobCksYXQ9dTticmVhaztjYXNlIDEyOk9sKHQsbCksRGwobCk7YnJlYWs7Y2FzZSAzMTpPbCh0LGwpLERsKGwpLHUmNCYmKHU9bC51cGRhdGVRdWV1ZSx1IT09bnVsbCYmKGwudXBkYXRlUXVldWU9bnVsbCxjbihsLHUpKSk7YnJlYWs7Y2FzZSAxMzpPbCh0LGwpLERsKGwpLGwuY2hpbGQuZmxhZ3MmODE5MiYmbC5tZW1vaXplZFN0YXRlIT09bnVsbCE9KGEhPT1udWxsJiZhLm1lbW9pemVkU3RhdGUhPT1udWxsKSYmKHluPU5sKCkpLHUmNCYmKHU9bC51cGRhdGVRdWV1ZSx1IT09bnVsbCYmKGwudXBkYXRlUXVldWU9bnVsbCxjbihsLHUpKSk7YnJlYWs7Y2FzZSAyMjplPWwubWVtb2l6ZWRTdGF0ZSE9PW51bGw7dmFyIGk9YSE9PW51bGwmJmEubWVtb2l6ZWRTdGF0ZSE9PW51bGwsaD1PdCxnPWNsO2lmKE90PWh8fGUsY2w9Z3x8aSxPbCh0LGwpLGNsPWcsT3Q9aCxEbChsKSx1JjgxOTIpbDpmb3IodD1sLnN0YXRlTm9kZSx0Ll92aXNpYmlsaXR5PWU/dC5fdmlzaWJpbGl0eSYtMjp0Ll92aXNpYmlsaXR5fDEsZSYmKGE9PT1udWxsfHxpfHxPdHx8Y2x8fERhKGwpKSxhPW51bGwsdD1sOzspe2lmKHQudGFnPT09NXx8dC50YWc9PT0yNil7aWYoYT09PW51bGwpe2k9YT10O3RyeXtpZihuPWkuc3RhdGVOb2RlLGUpZj1uLnN0eWxlLHR5cGVvZiBmLnNldFByb3BlcnR5PT0iZnVuY3Rpb24iP2Yuc2V0UHJvcGVydHkoImRpc3BsYXkiLCJub25lIiwiaW1wb3J0YW50Iik6Zi5kaXNwbGF5PSJub25lIjtlbHNle2M9aS5zdGF0ZU5vZGU7dmFyIEE9aS5tZW1vaXplZFByb3BzLnN0eWxlLGQ9QSE9bnVsbCYmQS5oYXNPd25Qcm9wZXJ0eSgiZGlzcGxheSIpP0EuZGlzcGxheTpudWxsO2Muc3R5bGUuZGlzcGxheT1kPT1udWxsfHx0eXBlb2YgZD09ImJvb2xlYW4iPyIiOigiIitkKS50cmltKCl9fWNhdGNoKEUpe3AoaSxpLnJldHVybixFKX19fWVsc2UgaWYodC50YWc9PT02KXtpZihhPT09bnVsbCl7aT10O3RyeXtpLnN0YXRlTm9kZS5ub2RlVmFsdWU9ZT8iIjppLm1lbW9pemVkUHJvcHN9Y2F0Y2goRSl7cChpLGkucmV0dXJuLEUpfX19ZWxzZSBpZih0LnRhZz09PTE4KXtpZihhPT09bnVsbCl7aT10O3RyeXt2YXIgUz1pLnN0YXRlTm9kZTtlP1ExKFMsITApOlExKGkuc3RhdGVOb2RlLCExKX1jYXRjaChFKXtwKGksaS5yZXR1cm4sRSl9fX1lbHNlIGlmKCh0LnRhZyE9PTIyJiZ0LnRhZyE9PTIzfHx0Lm1lbW9pemVkU3RhdGU9PT1udWxsfHx0PT09bCkmJnQuY2hpbGQhPT1udWxsKXt0LmNoaWxkLnJldHVybj10LHQ9dC5jaGlsZDtjb250aW51ZX1pZih0PT09bClicmVhayBsO2Zvcig7dC5zaWJsaW5nPT09bnVsbDspe2lmKHQucmV0dXJuPT09bnVsbHx8dC5yZXR1cm49PT1sKWJyZWFrIGw7YT09PXQmJihhPW51bGwpLHQ9dC5yZXR1cm59YT09PXQmJihhPW51bGwpLHQuc2libGluZy5yZXR1cm49dC5yZXR1cm4sdD10LnNpYmxpbmd9dSY0JiYodT1sLnVwZGF0ZVF1ZXVlLHUhPT1udWxsJiYoYT11LnJldHJ5UXVldWUsYSE9PW51bGwmJih1LnJldHJ5UXVldWU9bnVsbCxjbihsLGEpKSkpO2JyZWFrO2Nhc2UgMTk6T2wodCxsKSxEbChsKSx1JjQmJih1PWwudXBkYXRlUXVldWUsdSE9PW51bGwmJihsLnVwZGF0ZVF1ZXVlPW51bGwsY24obCx1KSkpO2JyZWFrO2Nhc2UgMzA6YnJlYWs7Y2FzZSAyMTpicmVhaztkZWZhdWx0Ok9sKHQsbCksRGwobCl9fWZ1bmN0aW9uIERsKGwpe3ZhciB0PWwuZmxhZ3M7aWYodCYyKXt0cnl7Zm9yKHZhciBhLHU9bC5yZXR1cm47dSE9PW51bGw7KXtpZihHdih1KSl7YT11O2JyZWFrfXU9dS5yZXR1cm59aWYoYT09bnVsbCl0aHJvdyBFcnJvcihzKDE2MCkpO3N3aXRjaChhLnRhZyl7Y2FzZSAyNzp2YXIgZT1hLnN0YXRlTm9kZSxuPXNjKGwpO2ZuKGwsbixlKTticmVhaztjYXNlIDU6dmFyIGY9YS5zdGF0ZU5vZGU7YS5mbGFncyYzMiYmKGphKGYsIiIpLGEuZmxhZ3MmPS0zMyk7dmFyIGM9c2MobCk7Zm4obCxjLGYpO2JyZWFrO2Nhc2UgMzpjYXNlIDQ6dmFyIGk9YS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxoPXNjKGwpO2djKGwsaCxpKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKHMoMTYxKSl9fWNhdGNoKGcpe3AobCxsLnJldHVybixnKX1sLmZsYWdzJj0tM310JjQwOTYmJihsLmZsYWdzJj0tNDA5Nyl9ZnVuY3Rpb24gTHYobCl7aWYobC5zdWJ0cmVlRmxhZ3MmMTAyNClmb3IobD1sLmNoaWxkO2whPT1udWxsOyl7dmFyIHQ9bDtMdih0KSx0LnRhZz09PTUmJnQuZmxhZ3MmMTAyNCYmdC5zdGF0ZU5vZGUucmVzZXQoKSxsPWwuc2libGluZ319ZnVuY3Rpb24gVXQobCx0KXtpZih0LnN1YnRyZWVGbGFncyY4NzcyKWZvcih0PXQuY2hpbGQ7dCE9PW51bGw7KVJ2KGwsdC5hbHRlcm5hdGUsdCksdD10LnNpYmxpbmd9ZnVuY3Rpb24gRGEobCl7Zm9yKGw9bC5jaGlsZDtsIT09bnVsbDspe3ZhciB0PWw7c3dpdGNoKHQudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE0OmNhc2UgMTU6V3QoNCx0LHQucmV0dXJuKSxEYSh0KTticmVhaztjYXNlIDE6aXQodCx0LnJldHVybik7dmFyIGE9dC5zdGF0ZU5vZGU7dHlwZW9mIGEuY29tcG9uZW50V2lsbFVubW91bnQ9PSJmdW5jdGlvbiImJlF2KHQsdC5yZXR1cm4sYSksRGEodCk7YnJlYWs7Y2FzZSAyNzplZSh0LnN0YXRlTm9kZSk7Y2FzZSAyNjpjYXNlIDU6aXQodCx0LnJldHVybiksRGEodCk7YnJlYWs7Y2FzZSAyMjp0Lm1lbW9pemVkU3RhdGU9PT1udWxsJiZEYSh0KTticmVhaztjYXNlIDMwOkRhKHQpO2JyZWFrO2RlZmF1bHQ6RGEodCl9bD1sLnNpYmxpbmd9fWZ1bmN0aW9uIF90KGwsdCxhKXtmb3IoYT1hJiYodC5zdWJ0cmVlRmxhZ3MmODc3MikhPT0wLHQ9dC5jaGlsZDt0IT09bnVsbDspe3ZhciB1PXQuYWx0ZXJuYXRlLGU9bCxuPXQsZj1uLmZsYWdzO3N3aXRjaChuLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpfdChlLG4sYSksJHUoNCxuKTticmVhaztjYXNlIDE6aWYoX3QoZSxuLGEpLHU9bixlPXUuc3RhdGVOb2RlLHR5cGVvZiBlLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iKXRyeXtlLmNvbXBvbmVudERpZE1vdW50KCl9Y2F0Y2goaCl7cCh1LHUucmV0dXJuLGgpfWlmKHU9bixlPXUudXBkYXRlUXVldWUsZSE9PW51bGwpe3ZhciBjPXUuc3RhdGVOb2RlO3RyeXt2YXIgaT1lLnNoYXJlZC5oaWRkZW5DYWxsYmFja3M7aWYoaSE9PW51bGwpZm9yKGUuc2hhcmVkLmhpZGRlbkNhbGxiYWNrcz1udWxsLGU9MDtlPGkubGVuZ3RoO2UrKylvMChpW2VdLGMpfWNhdGNoKGgpe3AodSx1LnJldHVybixoKX19YSYmZiY2NCYmWXYobiksRnUobixuLnJldHVybik7YnJlYWs7Y2FzZSAyNzpDdihuKTtjYXNlIDI2OmNhc2UgNTpfdChlLG4sYSksYSYmdT09PW51bGwmJmYmNCYmWHYobiksRnUobixuLnJldHVybik7YnJlYWs7Y2FzZSAxMjpfdChlLG4sYSk7YnJlYWs7Y2FzZSAzMTpfdChlLG4sYSksYSYmZiY0JiZwdihlLG4pO2JyZWFrO2Nhc2UgMTM6X3QoZSxuLGEpLGEmJmYmNCYmS3YoZSxuKTticmVhaztjYXNlIDIyOm4ubWVtb2l6ZWRTdGF0ZT09PW51bGwmJl90KGUsbixhKSxGdShuLG4ucmV0dXJuKTticmVhaztjYXNlIDMwOmJyZWFrO2RlZmF1bHQ6X3QoZSxuLGEpfXQ9dC5zaWJsaW5nfX1mdW5jdGlvbiB6YyhsLHQpe3ZhciBhPW51bGw7bCE9PW51bGwmJmwubWVtb2l6ZWRTdGF0ZSE9PW51bGwmJmwubWVtb2l6ZWRTdGF0ZS5jYWNoZVBvb2whPT1udWxsJiYoYT1sLm1lbW9pemVkU3RhdGUuY2FjaGVQb29sLnBvb2wpLGw9bnVsbCx0Lm1lbW9pemVkU3RhdGUhPT1udWxsJiZ0Lm1lbW9pemVkU3RhdGUuY2FjaGVQb29sIT09bnVsbCYmKGw9dC5tZW1vaXplZFN0YXRlLmNhY2hlUG9vbC5wb29sKSxsIT09YSYmKGwhPW51bGwmJmwucmVmQ291bnQrKyxhIT1udWxsJiZHdShhKSl9ZnVuY3Rpb24gQWMobCx0KXtsPW51bGwsdC5hbHRlcm5hdGUhPT1udWxsJiYobD10LmFsdGVybmF0ZS5tZW1vaXplZFN0YXRlLmNhY2hlKSx0PXQubWVtb2l6ZWRTdGF0ZS5jYWNoZSx0IT09bCYmKHQucmVmQ291bnQrKyxsIT1udWxsJiZHdShsKSl9ZnVuY3Rpb24gdXQobCx0LGEsdSl7aWYodC5zdWJ0cmVlRmxhZ3MmMTAyNTYpZm9yKHQ9dC5jaGlsZDt0IT09bnVsbDspSnYobCx0LGEsdSksdD10LnNpYmxpbmd9ZnVuY3Rpb24gSnYobCx0LGEsdSl7dmFyIGU9dC5mbGFncztzd2l0Y2godC50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6dXQobCx0LGEsdSksZSYyMDQ4JiYkdSg5LHQpO2JyZWFrO2Nhc2UgMTp1dChsLHQsYSx1KTticmVhaztjYXNlIDM6dXQobCx0LGEsdSksZSYyMDQ4JiYobD1udWxsLHQuYWx0ZXJuYXRlIT09bnVsbCYmKGw9dC5hbHRlcm5hdGUubWVtb2l6ZWRTdGF0ZS5jYWNoZSksdD10Lm1lbW9pemVkU3RhdGUuY2FjaGUsdCE9PWwmJih0LnJlZkNvdW50KyssbCE9bnVsbCYmR3UobCkpKTticmVhaztjYXNlIDEyOmlmKGUmMjA0OCl7dXQobCx0LGEsdSksbD10LnN0YXRlTm9kZTt0cnl7dmFyIG49dC5tZW1vaXplZFByb3BzLGY9bi5pZCxjPW4ub25Qb3N0Q29tbWl0O3R5cGVvZiBjPT0iZnVuY3Rpb24iJiZjKGYsdC5hbHRlcm5hdGU9PT1udWxsPyJtb3VudCI6InVwZGF0ZSIsbC5wYXNzaXZlRWZmZWN0RHVyYXRpb24sLTApfWNhdGNoKGkpe3AodCx0LnJldHVybixpKX19ZWxzZSB1dChsLHQsYSx1KTticmVhaztjYXNlIDMxOnV0KGwsdCxhLHUpO2JyZWFrO2Nhc2UgMTM6dXQobCx0LGEsdSk7YnJlYWs7Y2FzZSAyMzpicmVhaztjYXNlIDIyOm49dC5zdGF0ZU5vZGUsZj10LmFsdGVybmF0ZSx0Lm1lbW9pemVkU3RhdGUhPT1udWxsP24uX3Zpc2liaWxpdHkmMj91dChsLHQsYSx1KTpydShsLHQpOm4uX3Zpc2liaWxpdHkmMj91dChsLHQsYSx1KToobi5fdmlzaWJpbGl0eXw9MixudShsLHQsYSx1LCh0LnN1YnRyZWVGbGFncyYxMDI1NikhPT0wfHwhMSkpLGUmMjA0OCYmemMoZix0KTticmVhaztjYXNlIDI0OnV0KGwsdCxhLHUpLGUmMjA0OCYmQWModC5hbHRlcm5hdGUsdCk7YnJlYWs7ZGVmYXVsdDp1dChsLHQsYSx1KX19ZnVuY3Rpb24gbnUobCx0LGEsdSxlKXtmb3IoZT1lJiYoKHQuc3VidHJlZUZsYWdzJjEwMjU2KSE9PTB8fCExKSx0PXQuY2hpbGQ7dCE9PW51bGw7KXt2YXIgbj1sLGY9dCxjPWEsaT11LGg9Zi5mbGFncztzd2l0Y2goZi50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6bnUobixmLGMsaSxlKSwkdSg4LGYpO2JyZWFrO2Nhc2UgMjM6YnJlYWs7Y2FzZSAyMjp2YXIgZz1mLnN0YXRlTm9kZTtmLm1lbW9pemVkU3RhdGUhPT1udWxsP2cuX3Zpc2liaWxpdHkmMj9udShuLGYsYyxpLGUpOnJ1KG4sZik6KGcuX3Zpc2liaWxpdHl8PTIsbnUobixmLGMsaSxlKSksZSYmaCYyMDQ4JiZ6YyhmLmFsdGVybmF0ZSxmKTticmVhaztjYXNlIDI0Om51KG4sZixjLGksZSksZSYmaCYyMDQ4JiZBYyhmLmFsdGVybmF0ZSxmKTticmVhaztkZWZhdWx0Om51KG4sZixjLGksZSl9dD10LnNpYmxpbmd9fWZ1bmN0aW9uIHJ1KGwsdCl7aWYodC5zdWJ0cmVlRmxhZ3MmMTAyNTYpZm9yKHQ9dC5jaGlsZDt0IT09bnVsbDspe3ZhciBhPWwsdT10LGU9dS5mbGFncztzd2l0Y2godS50YWcpe2Nhc2UgMjI6cnUoYSx1KSxlJjIwNDgmJnpjKHUuYWx0ZXJuYXRlLHUpO2JyZWFrO2Nhc2UgMjQ6cnUoYSx1KSxlJjIwNDgmJkFjKHUuYWx0ZXJuYXRlLHUpO2JyZWFrO2RlZmF1bHQ6cnUoYSx1KX10PXQuc2libGluZ319dmFyIGt1PTgxOTI7ZnVuY3Rpb24gZnUobCx0LGEpe2lmKGwuc3VidHJlZUZsYWdzJmt1KWZvcihsPWwuY2hpbGQ7bCE9PW51bGw7KVd2KGwsdCxhKSxsPWwuc2libGluZ31mdW5jdGlvbiBXdihsLHQsYSl7c3dpdGNoKGwudGFnKXtjYXNlIDI2OmZ1KGwsdCxhKSxsLmZsYWdzJmt1JiZsLm1lbW9pemVkU3RhdGUhPT1udWxsJiZfaChhLGF0LGwubWVtb2l6ZWRTdGF0ZSxsLm1lbW9pemVkUHJvcHMpO2JyZWFrO2Nhc2UgNTpmdShsLHQsYSk7YnJlYWs7Y2FzZSAzOmNhc2UgNDp2YXIgdT1hdDthdD1FbihsLnN0YXRlTm9kZS5jb250YWluZXJJbmZvKSxmdShsLHQsYSksYXQ9dTticmVhaztjYXNlIDIyOmwubWVtb2l6ZWRTdGF0ZT09PW51bGwmJih1PWwuYWx0ZXJuYXRlLHUhPT1udWxsJiZ1Lm1lbW9pemVkU3RhdGUhPT1udWxsPyh1PWt1LGt1PTE2Nzc3MjE2LGZ1KGwsdCxhKSxrdT11KTpmdShsLHQsYSkpO2JyZWFrO2RlZmF1bHQ6ZnUobCx0LGEpfX1mdW5jdGlvbiB3dihsKXt2YXIgdD1sLmFsdGVybmF0ZTtpZih0IT09bnVsbCYmKGw9dC5jaGlsZCxsIT09bnVsbCkpe3QuY2hpbGQ9bnVsbDtkbyB0PWwuc2libGluZyxsLnNpYmxpbmc9bnVsbCxsPXQ7d2hpbGUobCE9PW51bGwpfX1mdW5jdGlvbiBJdShsKXt2YXIgdD1sLmRlbGV0aW9ucztpZigobC5mbGFncyYxNikhPT0wKXtpZih0IT09bnVsbClmb3IodmFyIGE9MDthPHQubGVuZ3RoO2ErKyl7dmFyIHU9dFthXTtobD11LEZ2KHUsbCl9d3YobCl9aWYobC5zdWJ0cmVlRmxhZ3MmMTAyNTYpZm9yKGw9bC5jaGlsZDtsIT09bnVsbDspJHYobCksbD1sLnNpYmxpbmd9ZnVuY3Rpb24gJHYobCl7c3dpdGNoKGwudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1Okl1KGwpLGwuZmxhZ3MmMjA0OCYmV3QoOSxsLGwucmV0dXJuKTticmVhaztjYXNlIDM6SXUobCk7YnJlYWs7Y2FzZSAxMjpJdShsKTticmVhaztjYXNlIDIyOnZhciB0PWwuc3RhdGVOb2RlO2wubWVtb2l6ZWRTdGF0ZSE9PW51bGwmJnQuX3Zpc2liaWxpdHkmMiYmKGwucmV0dXJuPT09bnVsbHx8bC5yZXR1cm4udGFnIT09MTMpPyh0Ll92aXNpYmlsaXR5Jj0tMyx2bihsKSk6SXUobCk7YnJlYWs7ZGVmYXVsdDpJdShsKX19ZnVuY3Rpb24gdm4obCl7dmFyIHQ9bC5kZWxldGlvbnM7aWYoKGwuZmxhZ3MmMTYpIT09MCl7aWYodCE9PW51bGwpZm9yKHZhciBhPTA7YTx0Lmxlbmd0aDthKyspe3ZhciB1PXRbYV07aGw9dSxGdih1LGwpfXd2KGwpfWZvcihsPWwuY2hpbGQ7bCE9PW51bGw7KXtzd2l0Y2godD1sLHQudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1Old0KDgsdCx0LnJldHVybiksdm4odCk7YnJlYWs7Y2FzZSAyMjphPXQuc3RhdGVOb2RlLGEuX3Zpc2liaWxpdHkmMiYmKGEuX3Zpc2liaWxpdHkmPS0zLHZuKHQpKTticmVhaztkZWZhdWx0OnZuKHQpfWw9bC5zaWJsaW5nfX1mdW5jdGlvbiBGdihsLHQpe2Zvcig7aGwhPT1udWxsOyl7dmFyIGE9aGw7c3dpdGNoKGEudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1Old0KDgsYSx0KTticmVhaztjYXNlIDIzOmNhc2UgMjI6aWYoYS5tZW1vaXplZFN0YXRlIT09bnVsbCYmYS5tZW1vaXplZFN0YXRlLmNhY2hlUG9vbCE9PW51bGwpe3ZhciB1PWEubWVtb2l6ZWRTdGF0ZS5jYWNoZVBvb2wucG9vbDt1IT1udWxsJiZ1LnJlZkNvdW50Kyt9YnJlYWs7Y2FzZSAyNDpHdShhLm1lbW9pemVkU3RhdGUuY2FjaGUpfWlmKHU9YS5jaGlsZCx1IT09bnVsbCl1LnJldHVybj1hLGhsPXU7ZWxzZSBsOmZvcihhPWw7aGwhPT1udWxsOyl7dT1obDt2YXIgZT11LnNpYmxpbmcsbj11LnJldHVybjtpZihqdih1KSx1PT09YSl7aGw9bnVsbDticmVhayBsfWlmKGUhPT1udWxsKXtlLnJldHVybj1uLGhsPWU7YnJlYWsgbH1obD1ufX19dmFyIEttPXtnZXRDYWNoZUZvclR5cGU6ZnVuY3Rpb24obCl7dmFyIHQ9c2woZWwpLGE9dC5kYXRhLmdldChsKTtyZXR1cm4gYT09PXZvaWQgMCYmKGE9bCgpLHQuZGF0YS5zZXQobCxhKSksYX0sY2FjaGVTaWduYWw6ZnVuY3Rpb24oKXtyZXR1cm4gc2woZWwpLmNvbnRyb2xsZXIuc2lnbmFsfX0seG09dHlwZW9mIFdlYWtNYXA9PSJmdW5jdGlvbiI/V2Vha01hcDpNYXAsUj0wLEo9bnVsbCxxPW51bGwsWT0wLFY9MCxDbD1udWxsLHd0PSExLGN1PSExLFRjPSExLEh0PTAsbGw9MCwkdD0wLFVhPTAsb2M9MCxabD0wLGl1PTAsUHU9bnVsbCxVbD1udWxsLEVjPSExLHluPTAscnY9MCxtbj0xLzAsaG49bnVsbCxGdD1udWxsLHZsPTAscnQ9bnVsbCx2dT1udWxsLE50PTAsTWM9MCxPYz1udWxsLGt2PW51bGwsbGU9MCxEYz1udWxsO2Z1bmN0aW9uIFJsKCl7cmV0dXJuKFImMikhPT0wJiZZIT09MD9ZJi1ZOnouVCE9PW51bGw/QmMoKTpkaSgpfWZ1bmN0aW9uIEl2KCl7aWYoWmw9PT0wKWlmKChZJjUzNjg3MDkxMik9PT0wfHxHKXt2YXIgbD1BZTtBZTw8PTEsKEFlJjM5MzIxNjApPT09MCYmKEFlPTI2MjE0NCksWmw9bH1lbHNlIFpsPTUzNjg3MDkxMjtyZXR1cm4gbD1YbC5jdXJyZW50LGwhPT1udWxsJiYobC5mbGFnc3w9MzIpLFpsfWZ1bmN0aW9uIF9sKGwsdCxhKXsobD09PUomJihWPT09Mnx8Vj09PTkpfHxsLmNhbmNlbFBlbmRpbmdDb21taXQhPT1udWxsKSYmKHl1KGwsMCksa3QobCxZLFpsLCExKSksb3UobCxhKSwoKFImMik9PT0wfHxsIT09SikmJihsPT09SiYmKChSJjIpPT09MCYmKFVhfD1hKSxsbD09PTQmJmt0KGwsWSxabCwhMSkpLHZ0KGwpKX1mdW5jdGlvbiBQdihsLHQsYSl7aWYoKFImNikhPT0wKXRocm93IEVycm9yKHMoMzI3KSk7dmFyIHU9IWEmJih0JjEyNyk9PT0wJiYodCZsLmV4cGlyZWRMYW5lcyk9PT0wfHxUdShsLHQpLGU9dT9XbShsLHQpOl9jKGwsdCwhMCksbj11O2Rve2lmKGU9PT0wKXtjdSYmIXUmJmt0KGwsdCwwLCExKTticmVha31lbHNle2lmKGE9bC5jdXJyZW50LmFsdGVybmF0ZSxuJiYhTG0oYSkpe2U9X2MobCx0LCExKSxuPSExO2NvbnRpbnVlfWlmKGU9PT0yKXtpZihuPXQsbC5lcnJvclJlY292ZXJ5RGlzYWJsZWRMYW5lcyZuKXZhciBmPTA7ZWxzZSBmPWwucGVuZGluZ0xhbmVzJi01MzY4NzA5MTMsZj1mIT09MD9mOmYmNTM2ODcwOTEyPzUzNjg3MDkxMjowO2lmKGYhPT0wKXt0PWY7bDp7dmFyIGM9bDtlPVB1O3ZhciBpPWMuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZDtpZihpJiYoeXUoYyxmKS5mbGFnc3w9MjU2KSxmPV9jKGMsZiwhMSksZiE9PTIpe2lmKFRjJiYhaSl7Yy5lcnJvclJlY292ZXJ5RGlzYWJsZWRMYW5lc3w9bixVYXw9bixlPTQ7YnJlYWsgbH1uPVVsLFVsPWUsbiE9PW51bGwmJihVbD09PW51bGw/VWw9bjpVbC5wdXNoLmFwcGx5KFVsLG4pKX1lPWZ9aWYobj0hMSxlIT09Miljb250aW51ZX19aWYoZT09PTEpe3l1KGwsMCksa3QobCx0LDAsITApO2JyZWFrfWw6e3N3aXRjaCh1PWwsbj1lLG4pe2Nhc2UgMDpjYXNlIDE6dGhyb3cgRXJyb3IocygzNDUpKTtjYXNlIDQ6aWYoKHQmNDE5NDA0OCkhPT10KWJyZWFrO2Nhc2UgNjprdCh1LHQsWmwsIXd0KTticmVhayBsO2Nhc2UgMjpVbD1udWxsO2JyZWFrO2Nhc2UgMzpjYXNlIDU6YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihzKDMyOSkpfWlmKCh0JjYyOTE0NTYwKT09PXQmJihlPXluKzMwMC1ObCgpLDEwPGUpKXtpZihrdCh1LHQsWmwsIXd0KSxvZSh1LDAsITApIT09MClicmVhayBsO050PXQsdS50aW1lb3V0SGFuZGxlPXExKGwxLmJpbmQobnVsbCx1LGEsVWwsaG4sRWMsdCxabCxVYSxpdSx3dCxuLCJUaHJvdHRsZWQiLC0wLDApLGUpO2JyZWFrIGx9bDEodSxhLFVsLGhuLEVjLHQsWmwsVWEsaXUsd3QsbixudWxsLC0wLDApfX1icmVha313aGlsZSghMCk7dnQobCl9ZnVuY3Rpb24gbDEobCx0LGEsdSxlLG4sZixjLGksaCxnLEEsZCxTKXtpZihsLnRpbWVvdXRIYW5kbGU9LTEsQT10LnN1YnRyZWVGbGFncyxBJjgxOTJ8fChBJjE2Nzg1NDA4KT09PTE2Nzg1NDA4KXtBPXtzdHlsZXNoZWV0czpudWxsLGNvdW50OjAsaW1nQ291bnQ6MCxpbWdCeXRlczowLHN1c3BlbnNleUltYWdlczpbXSx3YWl0aW5nRm9ySW1hZ2VzOiEwLHdhaXRpbmdGb3JWaWV3VHJhbnNpdGlvbjohMSx1bnN1c3BlbmQ6U3R9LFd2KHQsbixBKTt2YXIgRT0obiY2MjkxNDU2MCk9PT1uP3luLU5sKCk6KG4mNDE5NDA0OCk9PT1uP3J2LU5sKCk6MDtpZihFPUhoKEEsRSksRSE9PW51bGwpe050PW4sbC5jYW5jZWxQZW5kaW5nQ29tbWl0PUUoaTEuYmluZChudWxsLGwsdCxuLGEsdSxlLGYsYyxpLGcsQSxudWxsLGQsUykpLGt0KGwsbixmLCFoKTtyZXR1cm59fWkxKGwsdCxuLGEsdSxlLGYsYyxpKX1mdW5jdGlvbiBMbShsKXtmb3IodmFyIHQ9bDs7KXt2YXIgYT10LnRhZztpZigoYT09PTB8fGE9PT0xMXx8YT09PTE1KSYmdC5mbGFncyYxNjM4NCYmKGE9dC51cGRhdGVRdWV1ZSxhIT09bnVsbCYmKGE9YS5zdG9yZXMsYSE9PW51bGwpKSlmb3IodmFyIHU9MDt1PGEubGVuZ3RoO3UrKyl7dmFyIGU9YVt1XSxuPWUuZ2V0U25hcHNob3Q7ZT1lLnZhbHVlO3RyeXtpZighWWwobigpLGUpKXJldHVybiExfWNhdGNoe3JldHVybiExfX1pZihhPXQuY2hpbGQsdC5zdWJ0cmVlRmxhZ3MmMTYzODQmJmEhPT1udWxsKWEucmV0dXJuPXQsdD1hO2Vsc2V7aWYodD09PWwpYnJlYWs7Zm9yKDt0LnNpYmxpbmc9PT1udWxsOyl7aWYodC5yZXR1cm49PT1udWxsfHx0LnJldHVybj09PWwpcmV0dXJuITA7dD10LnJldHVybn10LnNpYmxpbmcucmV0dXJuPXQucmV0dXJuLHQ9dC5zaWJsaW5nfX1yZXR1cm4hMH1mdW5jdGlvbiBrdChsLHQsYSx1KXt0Jj1+b2MsdCY9flVhLGwuc3VzcGVuZGVkTGFuZXN8PXQsbC5waW5nZWRMYW5lcyY9fnQsdSYmKGwud2FybUxhbmVzfD10KSx1PWwuZXhwaXJhdGlvblRpbWVzO2Zvcih2YXIgZT10OzA8ZTspe3ZhciBuPTMxLUJsKGUpLGY9MTw8bjt1W25dPS0xLGUmPX5mfWEhPT0wJiZ5aShsLGEsdCl9ZnVuY3Rpb24gZG4oKXtyZXR1cm4oUiY2KT09PTA/KHRlKDApLCExKTohMH1mdW5jdGlvbiBVYygpe2lmKHEhPT1udWxsKXtpZihWPT09MCl2YXIgbD1xLnJldHVybjtlbHNlIGw9cSx6dD1iYT1udWxsLEtmKGwpLGx1PW51bGwsWnU9MCxsPXE7Zm9yKDtsIT09bnVsbDspQnYobC5hbHRlcm5hdGUsbCksbD1sLnJldHVybjtxPW51bGx9fWZ1bmN0aW9uIHl1KGwsdCl7dmFyIGE9bC50aW1lb3V0SGFuZGxlO2EhPT0tMSYmKGwudGltZW91dEhhbmRsZT0tMSx5aChhKSksYT1sLmNhbmNlbFBlbmRpbmdDb21taXQsYSE9PW51bGwmJihsLmNhbmNlbFBlbmRpbmdDb21taXQ9bnVsbCxhKCkpLE50PTAsVWMoKSxKPWwscT1hPWd0KGwuY3VycmVudCxudWxsKSxZPXQsVj0wLENsPW51bGwsd3Q9ITEsY3U9VHUobCx0KSxUYz0hMSxpdT1abD1vYz1VYT0kdD1sbD0wLFVsPVB1PW51bGwsRWM9ITEsKHQmOCkhPT0wJiYodHw9dCYzMik7dmFyIHU9bC5lbnRhbmdsZWRMYW5lcztpZih1IT09MClmb3IobD1sLmVudGFuZ2xlbWVudHMsdSY9dDswPHU7KXt2YXIgZT0zMS1CbCh1KSxuPTE8PGU7dHw9bFtlXSx1Jj1+bn1yZXR1cm4gSHQ9dCxRZSgpLGF9ZnVuY3Rpb24gdDEobCx0KXtIPW51bGwsei5IPUp1LHQ9PT1QYXx8dD09PXBlPyh0PWIwKCksVj0zKTp0PT09cWY/KHQ9YjAoKSxWPTQpOlY9dD09PWVjPzg6dCE9PW51bGwmJnR5cGVvZiB0PT0ib2JqZWN0IiYmdHlwZW9mIHQudGhlbj09ImZ1bmN0aW9uIj82OjEsQ2w9dCxxPT09bnVsbCYmKGxsPTEsdG4obCxXbCh0LGwuY3VycmVudCkpKX1mdW5jdGlvbiBhMSgpe3ZhciBsPVhsLmN1cnJlbnQ7cmV0dXJuIGw9PT1udWxsPyEwOihZJjQxOTQwNDgpPT09WT9ybD09PW51bGw6KFkmNjI5MTQ1NjApPT09WXx8KFkmNTM2ODcwOTEyKSE9PTA/bD09PXJsOiExfWZ1bmN0aW9uIHUxKCl7dmFyIGw9ei5IO3JldHVybiB6Lkg9SnUsbD09PW51bGw/SnU6bH1mdW5jdGlvbiBlMSgpe3ZhciBsPXouQTtyZXR1cm4gei5BPUttLGx9ZnVuY3Rpb24gU24oKXtsbD00LHd0fHwoWSY0MTk0MDQ4KSE9PVkmJlhsLmN1cnJlbnQhPT1udWxsfHwoY3U9ITApLCgkdCYxMzQyMTc3MjcpPT09MCYmKFVhJjEzNDIxNzcyNyk9PT0wfHxKPT09bnVsbHx8a3QoSixZLFpsLCExKX1mdW5jdGlvbiBfYyhsLHQsYSl7dmFyIHU9UjtSfD0yO3ZhciBlPXUxKCksbj1lMSgpOyhKIT09bHx8WSE9PXQpJiYoaG49bnVsbCx5dShsLHQpKSx0PSExO3ZhciBmPWxsO2w6ZG8gdHJ5e2lmKFYhPT0wJiZxIT09bnVsbCl7dmFyIGM9cSxpPUNsO3N3aXRjaChWKXtjYXNlIDg6VWMoKSxmPTY7YnJlYWsgbDtjYXNlIDM6Y2FzZSAyOmNhc2UgOTpjYXNlIDY6WGwuY3VycmVudD09PW51bGwmJih0PSEwKTt2YXIgaD1WO2lmKFY9MCxDbD1udWxsLG11KGwsYyxpLGgpLGEmJmN1KXtmPTA7YnJlYWsgbH1icmVhaztkZWZhdWx0Omg9VixWPTAsQ2w9bnVsbCxtdShsLGMsaSxoKX19Sm0oKSxmPWxsO2JyZWFrfWNhdGNoKGcpe3QxKGwsZyl9d2hpbGUoITApO3JldHVybiB0JiZsLnNoZWxsU3VzcGVuZENvdW50ZXIrKyx6dD1iYT1udWxsLFI9dSx6Lkg9ZSx6LkE9bixxPT09bnVsbCYmKEo9bnVsbCxZPTAsUWUoKSksZn1mdW5jdGlvbiBKbSgpe2Zvcig7cSE9PW51bGw7KW4xKHEpfWZ1bmN0aW9uIFdtKGwsdCl7dmFyIGE9UjtSfD0yO3ZhciB1PXUxKCksZT1lMSgpO0ohPT1sfHxZIT09dD8oaG49bnVsbCxtbj1ObCgpKzUwMCx5dShsLHQpKTpjdT1UdShsLHQpO2w6ZG8gdHJ5e2lmKFYhPT0wJiZxIT09bnVsbCl7dD1xO3ZhciBuPUNsO3Q6c3dpdGNoKFYpe2Nhc2UgMTpWPTAsQ2w9bnVsbCxtdShsLHQsbiwxKTticmVhaztjYXNlIDI6Y2FzZSA5OmlmKHMwKG4pKXtWPTAsQ2w9bnVsbCxmMSh0KTticmVha310PWZ1bmN0aW9uKCl7ViE9PTImJlYhPT05fHxKIT09bHx8KFY9NyksdnQobCl9LG4udGhlbih0LHQpO2JyZWFrIGw7Y2FzZSAzOlY9NzticmVhayBsO2Nhc2UgNDpWPTU7YnJlYWsgbDtjYXNlIDc6czAobik/KFY9MCxDbD1udWxsLGYxKHQpKTooVj0wLENsPW51bGwsbXUobCx0LG4sNykpO2JyZWFrO2Nhc2UgNTp2YXIgZj1udWxsO3N3aXRjaChxLnRhZyl7Y2FzZSAyNjpmPXEubWVtb2l6ZWRTdGF0ZTtjYXNlIDU6Y2FzZSAyNzp2YXIgYz1xO2lmKGY/SjEoZik6Yy5zdGF0ZU5vZGUuY29tcGxldGUpe1Y9MCxDbD1udWxsO3ZhciBpPWMuc2libGluZztpZihpIT09bnVsbClxPWk7ZWxzZXt2YXIgaD1jLnJldHVybjtoIT09bnVsbD8ocT1oLHNuKGgpKTpxPW51bGx9YnJlYWsgdH19Vj0wLENsPW51bGwsbXUobCx0LG4sNSk7YnJlYWs7Y2FzZSA2OlY9MCxDbD1udWxsLG11KGwsdCxuLDYpO2JyZWFrO2Nhc2UgODpVYygpLGxsPTY7YnJlYWsgbDtkZWZhdWx0OnRocm93IEVycm9yKHMoNDYyKSl9fXdtKCk7YnJlYWt9Y2F0Y2goZyl7dDEobCxnKX13aGlsZSghMCk7cmV0dXJuIHp0PWJhPW51bGwsei5IPXUsei5BPWUsUj1hLHEhPT1udWxsPzA6KEo9bnVsbCxZPTAsUWUoKSxsbCl9ZnVuY3Rpb24gd20oKXtmb3IoO3EhPT1udWxsJiYhZ3koKTspbjEocSl9ZnVuY3Rpb24gbjEobCl7dmFyIHQ9TnYobC5hbHRlcm5hdGUsbCxIdCk7bC5tZW1vaXplZFByb3BzPWwucGVuZGluZ1Byb3BzLHQ9PT1udWxsP3NuKGwpOnE9dH1mdW5jdGlvbiBmMShsKXt2YXIgdD1sLGE9dC5hbHRlcm5hdGU7c3dpdGNoKHQudGFnKXtjYXNlIDE1OmNhc2UgMDp0PU12KGEsdCx0LnBlbmRpbmdQcm9wcyx0LnR5cGUsdm9pZCAwLFkpO2JyZWFrO2Nhc2UgMTE6dD1NdihhLHQsdC5wZW5kaW5nUHJvcHMsdC50eXBlLnJlbmRlcix0LnJlZixZKTticmVhaztjYXNlIDU6S2YodCk7ZGVmYXVsdDpCdihhLHQpLHQ9cT1lMCh0LEh0KSx0PU52KGEsdCxIdCl9bC5tZW1vaXplZFByb3BzPWwucGVuZGluZ1Byb3BzLHQ9PT1udWxsP3NuKGwpOnE9dH1mdW5jdGlvbiBtdShsLHQsYSx1KXt6dD1iYT1udWxsLEtmKHQpLGx1PW51bGwsWnU9MDt2YXIgZT10LnJldHVybjt0cnl7aWYoR20obCxlLHQsYSxZKSl7bGw9MSx0bihsLFdsKGEsbC5jdXJyZW50KSkscT1udWxsO3JldHVybn19Y2F0Y2gobil7aWYoZSE9PW51bGwpdGhyb3cgcT1lLG47bGw9MSx0bihsLFdsKGEsbC5jdXJyZW50KSkscT1udWxsO3JldHVybn10LmZsYWdzJjMyNzY4PyhHfHx1PT09MT9sPSEwOmN1fHwoWSY1MzY4NzA5MTIpIT09MD9sPSExOih3dD1sPSEwLCh1PT09Mnx8dT09PTl8fHU9PT0zfHx1PT09NikmJih1PVhsLmN1cnJlbnQsdSE9PW51bGwmJnUudGFnPT09MTMmJih1LmZsYWdzfD0xNjM4NCkpKSxjMSh0LGwpKTpzbih0KX1mdW5jdGlvbiBzbihsKXt2YXIgdD1sO2Rve2lmKCh0LmZsYWdzJjMyNzY4KSE9PTApe2MxKHQsd3QpO3JldHVybn1sPXQucmV0dXJuO3ZhciBhPVJtKHQuYWx0ZXJuYXRlLHQsSHQpO2lmKGEhPT1udWxsKXtxPWE7cmV0dXJufWlmKHQ9dC5zaWJsaW5nLHQhPT1udWxsKXtxPXQ7cmV0dXJufXE9dD1sfXdoaWxlKHQhPT1udWxsKTtsbD09PTAmJihsbD01KX1mdW5jdGlvbiBjMShsLHQpe2Rve3ZhciBhPWptKGwuYWx0ZXJuYXRlLGwpO2lmKGEhPT1udWxsKXthLmZsYWdzJj0zMjc2NyxxPWE7cmV0dXJufWlmKGE9bC5yZXR1cm4sYSE9PW51bGwmJihhLmZsYWdzfD0zMjc2OCxhLnN1YnRyZWVGbGFncz0wLGEuZGVsZXRpb25zPW51bGwpLCF0JiYobD1sLnNpYmxpbmcsbCE9PW51bGwpKXtxPWw7cmV0dXJufXE9bD1hfXdoaWxlKGwhPT1udWxsKTtsbD02LHE9bnVsbH1mdW5jdGlvbiBpMShsLHQsYSx1LGUsbixmLGMsaSl7bC5jYW5jZWxQZW5kaW5nQ29tbWl0PW51bGw7ZG8gZ24oKTt3aGlsZSh2bCE9PTApO2lmKChSJjYpIT09MCl0aHJvdyBFcnJvcihzKDMyNykpO2lmKHQhPT1udWxsKXtpZih0PT09bC5jdXJyZW50KXRocm93IEVycm9yKHMoMTc3KSk7aWYobj10LmxhbmVzfHQuY2hpbGRMYW5lcyxufD1zZixVeShsLGEsbixmLGMsaSksbD09PUomJihxPUo9bnVsbCxZPTApLHZ1PXQscnQ9bCxOdD1hLE1jPW4sT2M9ZSxrdj11LCh0LnN1YnRyZWVGbGFncyYxMDI1NikhPT0wfHwodC5mbGFncyYxMDI1NikhPT0wPyhsLmNhbGxiYWNrTm9kZT1udWxsLGwuY2FsbGJhY2tQcmlvcml0eT0wLGttKGJlLGZ1bmN0aW9uKCl7cmV0dXJuIGQxKCksbnVsbH0pKToobC5jYWxsYmFja05vZGU9bnVsbCxsLmNhbGxiYWNrUHJpb3JpdHk9MCksdT0odC5mbGFncyYxMzg3OCkhPT0wLCh0LnN1YnRyZWVGbGFncyYxMzg3OCkhPT0wfHx1KXt1PXouVCx6LlQ9bnVsbCxlPW8ucCxvLnA9MixmPVIsUnw9NDt0cnl7Vm0obCx0LGEpfWZpbmFsbHl7Uj1mLG8ucD1lLHouVD11fX12bD0xLHYxKCkseTEoKSxtMSgpfX1mdW5jdGlvbiB2MSgpe2lmKHZsPT09MSl7dmw9MDt2YXIgbD1ydCx0PXZ1LGE9KHQuZmxhZ3MmMTM4NzgpIT09MDtpZigodC5zdWJ0cmVlRmxhZ3MmMTM4NzgpIT09MHx8YSl7YT16LlQsei5UPW51bGw7dmFyIHU9by5wO28ucD0yO3ZhciBlPVI7Unw9NDt0cnl7eHYodCxsKTt2YXIgbj1qYyxmPUZpKGwuY29udGFpbmVySW5mbyksYz1uLmZvY3VzZWRFbGVtLGk9bi5zZWxlY3Rpb25SYW5nZTtpZihmIT09YyYmYyYmYy5vd25lckRvY3VtZW50JiYkaShjLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGMpKXtpZihpIT09bnVsbCYmeWYoYykpe3ZhciBoPWkuc3RhcnQsZz1pLmVuZDtpZihnPT09dm9pZCAwJiYoZz1oKSwic2VsZWN0aW9uU3RhcnQiaW4gYyljLnNlbGVjdGlvblN0YXJ0PWgsYy5zZWxlY3Rpb25FbmQ9TWF0aC5taW4oZyxjLnZhbHVlLmxlbmd0aCk7ZWxzZXt2YXIgQT1jLm93bmVyRG9jdW1lbnR8fGRvY3VtZW50LGQ9QSYmQS5kZWZhdWx0Vmlld3x8d2luZG93O2lmKGQuZ2V0U2VsZWN0aW9uKXt2YXIgUz1kLmdldFNlbGVjdGlvbigpLEU9Yy50ZXh0Q29udGVudC5sZW5ndGgsRD1NYXRoLm1pbihpLnN0YXJ0LEUpLEw9aS5lbmQ9PT12b2lkIDA/RDpNYXRoLm1pbihpLmVuZCxFKTshUy5leHRlbmQmJkQ+TCYmKGY9TCxMPUQsRD1mKTt2YXIgeT13aShjLEQpLHY9d2koYyxMKTtpZih5JiZ2JiYoUy5yYW5nZUNvdW50IT09MXx8Uy5hbmNob3JOb2RlIT09eS5ub2RlfHxTLmFuY2hvck9mZnNldCE9PXkub2Zmc2V0fHxTLmZvY3VzTm9kZSE9PXYubm9kZXx8Uy5mb2N1c09mZnNldCE9PXYub2Zmc2V0KSl7dmFyIG09QS5jcmVhdGVSYW5nZSgpO20uc2V0U3RhcnQoeS5ub2RlLHkub2Zmc2V0KSxTLnJlbW92ZUFsbFJhbmdlcygpLEQ+TD8oUy5hZGRSYW5nZShtKSxTLmV4dGVuZCh2Lm5vZGUsdi5vZmZzZXQpKToobS5zZXRFbmQodi5ub2RlLHYub2Zmc2V0KSxTLmFkZFJhbmdlKG0pKX19fX1mb3IoQT1bXSxTPWM7Uz1TLnBhcmVudE5vZGU7KVMubm9kZVR5cGU9PT0xJiZBLnB1c2goe2VsZW1lbnQ6UyxsZWZ0OlMuc2Nyb2xsTGVmdCx0b3A6Uy5zY3JvbGxUb3B9KTtmb3IodHlwZW9mIGMuZm9jdXM9PSJmdW5jdGlvbiImJmMuZm9jdXMoKSxjPTA7YzxBLmxlbmd0aDtjKyspe3ZhciBiPUFbY107Yi5lbGVtZW50LnNjcm9sbExlZnQ9Yi5sZWZ0LGIuZWxlbWVudC5zY3JvbGxUb3A9Yi50b3B9fUhuPSEhUmMsamM9UmM9bnVsbH1maW5hbGx5e1I9ZSxvLnA9dSx6LlQ9YX19bC5jdXJyZW50PXQsdmw9Mn19ZnVuY3Rpb24geTEoKXtpZih2bD09PTIpe3ZsPTA7dmFyIGw9cnQsdD12dSxhPSh0LmZsYWdzJjg3NzIpIT09MDtpZigodC5zdWJ0cmVlRmxhZ3MmODc3MikhPT0wfHxhKXthPXouVCx6LlQ9bnVsbDt2YXIgdT1vLnA7by5wPTI7dmFyIGU9UjtSfD00O3RyeXtSdihsLHQuYWx0ZXJuYXRlLHQpfWZpbmFsbHl7Uj1lLG8ucD11LHouVD1hfX12bD0zfX1mdW5jdGlvbiBtMSgpe2lmKHZsPT09NHx8dmw9PT0zKXt2bD0wLGJ5KCk7dmFyIGw9cnQsdD12dSxhPU50LHU9a3Y7KHQuc3VidHJlZUZsYWdzJjEwMjU2KSE9PTB8fCh0LmZsYWdzJjEwMjU2KSE9PTA/dmw9NToodmw9MCx2dT1ydD1udWxsLGgxKGwsbC5wZW5kaW5nTGFuZXMpKTt2YXIgZT1sLnBlbmRpbmdMYW5lcztpZihlPT09MCYmKEZ0PW51bGwpLExuKGEpLHQ9dC5zdGF0ZU5vZGUscWwmJnR5cGVvZiBxbC5vbkNvbW1pdEZpYmVyUm9vdD09ImZ1bmN0aW9uIil0cnl7cWwub25Db21taXRGaWJlclJvb3QoQXUsdCx2b2lkIDAsKHQuY3VycmVudC5mbGFncyYxMjgpPT09MTI4KX1jYXRjaHt9aWYodSE9PW51bGwpe3Q9ei5ULGU9by5wLG8ucD0yLHouVD1udWxsO3RyeXtmb3IodmFyIG49bC5vblJlY292ZXJhYmxlRXJyb3IsZj0wO2Y8dS5sZW5ndGg7ZisrKXt2YXIgYz11W2ZdO24oYy52YWx1ZSx7Y29tcG9uZW50U3RhY2s6Yy5zdGFja30pfX1maW5hbGx5e3ouVD10LG8ucD1lfX0oTnQmMykhPT0wJiZnbigpLHZ0KGwpLGU9bC5wZW5kaW5nTGFuZXMsKGEmMjYxOTMwKSE9PTAmJihlJjQyKSE9PTA/bD09PURjP2xlKys6KGxlPTAsRGM9bCk6bGU9MCx0ZSgwKX19ZnVuY3Rpb24gaDEobCx0KXsobC5wb29sZWRDYWNoZUxhbmVzJj10KT09PTAmJih0PWwucG9vbGVkQ2FjaGUsdCE9bnVsbCYmKGwucG9vbGVkQ2FjaGU9bnVsbCxHdSh0KSkpfWZ1bmN0aW9uIGduKCl7cmV0dXJuIHYxKCkseTEoKSxtMSgpLGQxKCl9ZnVuY3Rpb24gZDEoKXtpZih2bCE9PTUpcmV0dXJuITE7dmFyIGw9cnQsdD1NYztNYz0wO3ZhciBhPUxuKE50KSx1PXouVCxlPW8ucDt0cnl7by5wPTMyPmE/MzI6YSx6LlQ9bnVsbCxhPU9jLE9jPW51bGw7dmFyIG49cnQsZj1OdDtpZih2bD0wLHZ1PXJ0PW51bGwsTnQ9MCwoUiY2KSE9PTApdGhyb3cgRXJyb3IocygzMzEpKTt2YXIgYz1SO2lmKFJ8PTQsJHYobi5jdXJyZW50KSxKdihuLG4uY3VycmVudCxmLGEpLFI9Yyx0ZSgwLCExKSxxbCYmdHlwZW9mIHFsLm9uUG9zdENvbW1pdEZpYmVyUm9vdD09ImZ1bmN0aW9uIil0cnl7cWwub25Qb3N0Q29tbWl0RmliZXJSb290KEF1LG4pfWNhdGNoe31yZXR1cm4hMH1maW5hbGx5e28ucD1lLHouVD11LGgxKGwsdCl9fWZ1bmN0aW9uIFMxKGwsdCxhKXt0PVdsKGEsdCksdD11YyhsLnN0YXRlTm9kZSx0LDIpLGw9eHQobCx0LDIpLGwhPT1udWxsJiYob3UobCwyKSx2dChsKSl9ZnVuY3Rpb24gcChsLHQsYSl7aWYobC50YWc9PT0zKVMxKGwsbCxhKTtlbHNlIGZvcig7dCE9PW51bGw7KXtpZih0LnRhZz09PTMpe1MxKHQsbCxhKTticmVha31lbHNlIGlmKHQudGFnPT09MSl7dmFyIHU9dC5zdGF0ZU5vZGU7aWYodHlwZW9mIHQudHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I9PSJmdW5jdGlvbiJ8fHR5cGVvZiB1LmNvbXBvbmVudERpZENhdGNoPT0iZnVuY3Rpb24iJiYoRnQ9PT1udWxsfHwhRnQuaGFzKHUpKSl7bD1XbChhLGwpLGE9c3YoMiksdT14dCh0LGEsMiksdSE9PW51bGwmJihndihhLHUsdCxsKSxvdSh1LDIpLHZ0KHUpKTticmVha319dD10LnJldHVybn19ZnVuY3Rpb24gSGMobCx0LGEpe3ZhciB1PWwucGluZ0NhY2hlO2lmKHU9PT1udWxsKXt1PWwucGluZ0NhY2hlPW5ldyB4bTt2YXIgZT1uZXcgU2V0O3Uuc2V0KHQsZSl9ZWxzZSBlPXUuZ2V0KHQpLGU9PT12b2lkIDAmJihlPW5ldyBTZXQsdS5zZXQodCxlKSk7ZS5oYXMoYSl8fChUYz0hMCxlLmFkZChhKSxsPSRtLmJpbmQobnVsbCxsLHQsYSksdC50aGVuKGwsbCkpfWZ1bmN0aW9uICRtKGwsdCxhKXt2YXIgdT1sLnBpbmdDYWNoZTt1IT09bnVsbCYmdS5kZWxldGUodCksbC5waW5nZWRMYW5lc3w9bC5zdXNwZW5kZWRMYW5lcyZhLGwud2FybUxhbmVzJj1+YSxKPT09bCYmKFkmYSk9PT1hJiYobGw9PT00fHxsbD09PTMmJihZJjYyOTE0NTYwKT09PVkmJjMwMD5ObCgpLXluPyhSJjIpPT09MCYmeXUobCwwKTpvY3w9YSxpdT09PVkmJihpdT0wKSksdnQobCl9ZnVuY3Rpb24gczEobCx0KXt0PT09MCYmKHQ9dmkoKSksbD1TYShsLHQpLGwhPT1udWxsJiYob3UobCx0KSx2dChsKSl9ZnVuY3Rpb24gRm0obCl7dmFyIHQ9bC5tZW1vaXplZFN0YXRlLGE9MDt0IT09bnVsbCYmKGE9dC5yZXRyeUxhbmUpLHMxKGwsYSl9ZnVuY3Rpb24gcm0obCx0KXt2YXIgYT0wO3N3aXRjaChsLnRhZyl7Y2FzZSAzMTpjYXNlIDEzOnZhciB1PWwuc3RhdGVOb2RlLGU9bC5tZW1vaXplZFN0YXRlO2UhPT1udWxsJiYoYT1lLnJldHJ5TGFuZSk7YnJlYWs7Y2FzZSAxOTp1PWwuc3RhdGVOb2RlO2JyZWFrO2Nhc2UgMjI6dT1sLnN0YXRlTm9kZS5fcmV0cnlDYWNoZTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKHMoMzE0KSl9dSE9PW51bGwmJnUuZGVsZXRlKHQpLHMxKGwsYSl9ZnVuY3Rpb24ga20obCx0KXtyZXR1cm4gVm4obCx0KX12YXIgYm49bnVsbCxodT1udWxsLE5jPSExLHpuPSExLHFjPSExLEl0PTA7ZnVuY3Rpb24gdnQobCl7bCE9PWh1JiZsLm5leHQ9PT1udWxsJiYoaHU9PT1udWxsP2JuPWh1PWw6aHU9aHUubmV4dD1sKSx6bj0hMCxOY3x8KE5jPSEwLFBtKCkpfWZ1bmN0aW9uIHRlKGwsdCl7aWYoIXFjJiZ6bil7cWM9ITA7ZG8gZm9yKHZhciBhPSExLHU9Ym47dSE9PW51bGw7KXtpZihsIT09MCl7dmFyIGU9dS5wZW5kaW5nTGFuZXM7aWYoZT09PTApdmFyIG49MDtlbHNle3ZhciBmPXUuc3VzcGVuZGVkTGFuZXMsYz11LnBpbmdlZExhbmVzO249KDE8PDMxLUJsKDQyfGwpKzEpLTEsbiY9ZSZ+KGYmfmMpLG49biYyMDEzMjY3NDE/biYyMDEzMjY3NDF8MTpuP258MjowfW4hPT0wJiYoYT0hMCxBMSh1LG4pKX1lbHNlIG49WSxuPW9lKHUsdT09PUo/bjowLHUuY2FuY2VsUGVuZGluZ0NvbW1pdCE9PW51bGx8fHUudGltZW91dEhhbmRsZSE9PS0xKSwobiYzKT09PTB8fFR1KHUsbil8fChhPSEwLEExKHUsbikpO3U9dS5uZXh0fXdoaWxlKGEpO3FjPSExfX1mdW5jdGlvbiBJbSgpe2cxKCl9ZnVuY3Rpb24gZzEoKXt6bj1OYz0hMTt2YXIgbD0wO0l0IT09MCYmdmgoKSYmKGw9SXQpO2Zvcih2YXIgdD1ObCgpLGE9bnVsbCx1PWJuO3UhPT1udWxsOyl7dmFyIGU9dS5uZXh0LG49YjEodSx0KTtuPT09MD8odS5uZXh0PW51bGwsYT09PW51bGw/Ym49ZTphLm5leHQ9ZSxlPT09bnVsbCYmKGh1PWEpKTooYT11LChsIT09MHx8KG4mMykhPT0wKSYmKHpuPSEwKSksdT1lfXZsIT09MCYmdmwhPT01fHx0ZShsKSxJdCE9PTAmJihJdD0wKX1mdW5jdGlvbiBiMShsLHQpe2Zvcih2YXIgYT1sLnN1c3BlbmRlZExhbmVzLHU9bC5waW5nZWRMYW5lcyxlPWwuZXhwaXJhdGlvblRpbWVzLG49bC5wZW5kaW5nTGFuZXMmLTYyOTE0NTYxOzA8bjspe3ZhciBmPTMxLUJsKG4pLGM9MTw8ZixpPWVbZl07aT09PS0xPygoYyZhKT09PTB8fChjJnUpIT09MCkmJihlW2ZdPUR5KGMsdCkpOmk8PXQmJihsLmV4cGlyZWRMYW5lc3w9YyksbiY9fmN9aWYodD1KLGE9WSxhPW9lKGwsbD09PXQ/YTowLGwuY2FuY2VsUGVuZGluZ0NvbW1pdCE9PW51bGx8fGwudGltZW91dEhhbmRsZSE9PS0xKSx1PWwuY2FsbGJhY2tOb2RlLGE9PT0wfHxsPT09dCYmKFY9PT0yfHxWPT09OSl8fGwuY2FuY2VsUGVuZGluZ0NvbW1pdCE9PW51bGwpcmV0dXJuIHUhPT1udWxsJiZ1IT09bnVsbCYmcG4odSksbC5jYWxsYmFja05vZGU9bnVsbCxsLmNhbGxiYWNrUHJpb3JpdHk9MDtpZigoYSYzKT09PTB8fFR1KGwsYSkpe2lmKHQ9YSYtYSx0PT09bC5jYWxsYmFja1ByaW9yaXR5KXJldHVybiB0O3N3aXRjaCh1IT09bnVsbCYmcG4odSksTG4oYSkpe2Nhc2UgMjpjYXNlIDg6YT1jaTticmVhaztjYXNlIDMyOmE9YmU7YnJlYWs7Y2FzZSAyNjg0MzU0NTY6YT1paTticmVhaztkZWZhdWx0OmE9YmV9cmV0dXJuIHU9ejEuYmluZChudWxsLGwpLGE9Vm4oYSx1KSxsLmNhbGxiYWNrUHJpb3JpdHk9dCxsLmNhbGxiYWNrTm9kZT1hLHR9cmV0dXJuIHUhPT1udWxsJiZ1IT09bnVsbCYmcG4odSksbC5jYWxsYmFja1ByaW9yaXR5PTIsbC5jYWxsYmFja05vZGU9bnVsbCwyfWZ1bmN0aW9uIHoxKGwsdCl7aWYodmwhPT0wJiZ2bCE9PTUpcmV0dXJuIGwuY2FsbGJhY2tOb2RlPW51bGwsbC5jYWxsYmFja1ByaW9yaXR5PTAsbnVsbDt2YXIgYT1sLmNhbGxiYWNrTm9kZTtpZihnbigpJiZsLmNhbGxiYWNrTm9kZSE9PWEpcmV0dXJuIG51bGw7dmFyIHU9WTtyZXR1cm4gdT1vZShsLGw9PT1KP3U6MCxsLmNhbmNlbFBlbmRpbmdDb21taXQhPT1udWxsfHxsLnRpbWVvdXRIYW5kbGUhPT0tMSksdT09PTA/bnVsbDooUHYobCx1LHQpLGIxKGwsTmwoKSksbC5jYWxsYmFja05vZGUhPW51bGwmJmwuY2FsbGJhY2tOb2RlPT09YT96MS5iaW5kKG51bGwsbCk6bnVsbCl9ZnVuY3Rpb24gQTEobCx0KXtpZihnbigpKXJldHVybiBudWxsO1B2KGwsdCwhMCl9ZnVuY3Rpb24gUG0oKXttaChmdW5jdGlvbigpeyhSJjYpIT09MD9WbihmaSxJbSk6ZzEoKX0pfWZ1bmN0aW9uIEJjKCl7aWYoSXQ9PT0wKXt2YXIgbD1rYTtsPT09MCYmKGw9emUsemU8PD0xLCh6ZSYyNjE4ODgpPT09MCYmKHplPTI1NikpLEl0PWx9cmV0dXJuIEl0fWZ1bmN0aW9uIFQxKGwpe3JldHVybiBsPT1udWxsfHx0eXBlb2YgbD09InN5bWJvbCJ8fHR5cGVvZiBsPT0iYm9vbGVhbiI/bnVsbDp0eXBlb2YgbD09ImZ1bmN0aW9uIj9sOkRlKCIiK2wpfWZ1bmN0aW9uIG8xKGwsdCl7dmFyIGE9dC5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7cmV0dXJuIGEubmFtZT10Lm5hbWUsYS52YWx1ZT10LnZhbHVlLGwuaWQmJmEuc2V0QXR0cmlidXRlKCJmb3JtIixsLmlkKSx0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdCksbD1uZXcgRm9ybURhdGEobCksYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGEpLGx9ZnVuY3Rpb24gbGgobCx0LGEsdSxlKXtpZih0PT09InN1Ym1pdCImJmEmJmEuc3RhdGVOb2RlPT09ZSl7dmFyIG49VDEoKGVbb2xdfHxudWxsKS5hY3Rpb24pLGY9dS5zdWJtaXR0ZXI7ZiYmKHQ9KHQ9ZltvbF18fG51bGwpP1QxKHQuZm9ybUFjdGlvbik6Zi5nZXRBdHRyaWJ1dGUoImZvcm1BY3Rpb24iKSx0IT09bnVsbCYmKG49dCxmPW51bGwpKTt2YXIgYz1uZXcgTmUoImFjdGlvbiIsImFjdGlvbiIsbnVsbCx1LGUpO2wucHVzaCh7ZXZlbnQ6YyxsaXN0ZW5lcnM6W3tpbnN0YW5jZTpudWxsLGxpc3RlbmVyOmZ1bmN0aW9uKCl7aWYodS5kZWZhdWx0UHJldmVudGVkKXtpZihJdCE9PTApe3ZhciBpPWY/bzEoZSxmKTpuZXcgRm9ybURhdGEoZSk7a2YoYSx7cGVuZGluZzohMCxkYXRhOmksbWV0aG9kOmUubWV0aG9kLGFjdGlvbjpufSxudWxsLGkpfX1lbHNlIHR5cGVvZiBuPT0iZnVuY3Rpb24iJiYoYy5wcmV2ZW50RGVmYXVsdCgpLGk9Zj9vMShlLGYpOm5ldyBGb3JtRGF0YShlKSxrZihhLHtwZW5kaW5nOiEwLGRhdGE6aSxtZXRob2Q6ZS5tZXRob2QsYWN0aW9uOm59LG4saSkpfSxjdXJyZW50VGFyZ2V0OmV9XX0pfX1mb3IodmFyIFljPTA7WWM8U2YubGVuZ3RoO1ljKyspe3ZhciBRYz1TZltZY10sdGg9UWMudG9Mb3dlckNhc2UoKSxhaD1RY1swXS50b1VwcGVyQ2FzZSgpK1FjLnNsaWNlKDEpO3R0KHRoLCJvbiIrYWgpfXR0KElpLCJvbkFuaW1hdGlvbkVuZCIpLHR0KFBpLCJvbkFuaW1hdGlvbkl0ZXJhdGlvbiIpLHR0KGwwLCJvbkFuaW1hdGlvblN0YXJ0IiksdHQoImRibGNsaWNrIiwib25Eb3VibGVDbGljayIpLHR0KCJmb2N1c2luIiwib25Gb2N1cyIpLHR0KCJmb2N1c291dCIsIm9uQmx1ciIpLHR0KHptLCJvblRyYW5zaXRpb25SdW4iKSx0dChBbSwib25UcmFuc2l0aW9uU3RhcnQiKSx0dChUbSwib25UcmFuc2l0aW9uQ2FuY2VsIiksdHQodDAsIm9uVHJhbnNpdGlvbkVuZCIpLFphKCJvbk1vdXNlRW50ZXIiLFsibW91c2VvdXQiLCJtb3VzZW92ZXIiXSksWmEoIm9uTW91c2VMZWF2ZSIsWyJtb3VzZW91dCIsIm1vdXNlb3ZlciJdKSxaYSgib25Qb2ludGVyRW50ZXIiLFsicG9pbnRlcm91dCIsInBvaW50ZXJvdmVyIl0pLFphKCJvblBvaW50ZXJMZWF2ZSIsWyJwb2ludGVyb3V0IiwicG9pbnRlcm92ZXIiXSkseWEoIm9uQ2hhbmdlIiwiY2hhbmdlIGNsaWNrIGZvY3VzaW4gZm9jdXNvdXQgaW5wdXQga2V5ZG93biBrZXl1cCBzZWxlY3Rpb25jaGFuZ2UiLnNwbGl0KCIgIikpLHlhKCJvblNlbGVjdCIsImZvY3Vzb3V0IGNvbnRleHRtZW51IGRyYWdlbmQgZm9jdXNpbiBrZXlkb3duIGtleXVwIG1vdXNlZG93biBtb3VzZXVwIHNlbGVjdGlvbmNoYW5nZSIuc3BsaXQoIiAiKSkseWEoIm9uQmVmb3JlSW5wdXQiLFsiY29tcG9zaXRpb25lbmQiLCJrZXlwcmVzcyIsInRleHRJbnB1dCIsInBhc3RlIl0pLHlhKCJvbkNvbXBvc2l0aW9uRW5kIiwiY29tcG9zaXRpb25lbmQgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd24iLnNwbGl0KCIgIikpLHlhKCJvbkNvbXBvc2l0aW9uU3RhcnQiLCJjb21wb3NpdGlvbnN0YXJ0IGZvY3Vzb3V0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duIi5zcGxpdCgiICIpKSx5YSgib25Db21wb3NpdGlvblVwZGF0ZSIsImNvbXBvc2l0aW9udXBkYXRlIGZvY3Vzb3V0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duIi5zcGxpdCgiICIpKTt2YXIgYWU9ImFib3J0IGNhbnBsYXkgY2FucGxheXRocm91Z2ggZHVyYXRpb25jaGFuZ2UgZW1wdGllZCBlbmNyeXB0ZWQgZW5kZWQgZXJyb3IgbG9hZGVkZGF0YSBsb2FkZWRtZXRhZGF0YSBsb2Fkc3RhcnQgcGF1c2UgcGxheSBwbGF5aW5nIHByb2dyZXNzIHJhdGVjaGFuZ2UgcmVzaXplIHNlZWtlZCBzZWVraW5nIHN0YWxsZWQgc3VzcGVuZCB0aW1ldXBkYXRlIHZvbHVtZWNoYW5nZSB3YWl0aW5nIi5zcGxpdCgiICIpLHVoPW5ldyBTZXQoImJlZm9yZXRvZ2dsZSBjYW5jZWwgY2xvc2UgaW52YWxpZCBsb2FkIHNjcm9sbCBzY3JvbGxlbmQgdG9nZ2xlIi5zcGxpdCgiICIpLmNvbmNhdChhZSkpO2Z1bmN0aW9uIEUxKGwsdCl7dD0odCY0KSE9PTA7Zm9yKHZhciBhPTA7YTxsLmxlbmd0aDthKyspe3ZhciB1PWxbYV0sZT11LmV2ZW50O3U9dS5saXN0ZW5lcnM7bDp7dmFyIG49dm9pZCAwO2lmKHQpZm9yKHZhciBmPXUubGVuZ3RoLTE7MDw9ZjtmLS0pe3ZhciBjPXVbZl0saT1jLmluc3RhbmNlLGg9Yy5jdXJyZW50VGFyZ2V0O2lmKGM9Yy5saXN0ZW5lcixpIT09biYmZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWJyZWFrIGw7bj1jLGUuY3VycmVudFRhcmdldD1oO3RyeXtuKGUpfWNhdGNoKGcpe1llKGcpfWUuY3VycmVudFRhcmdldD1udWxsLG49aX1lbHNlIGZvcihmPTA7Zjx1Lmxlbmd0aDtmKyspe2lmKGM9dVtmXSxpPWMuaW5zdGFuY2UsaD1jLmN1cnJlbnRUYXJnZXQsYz1jLmxpc3RlbmVyLGkhPT1uJiZlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYnJlYWsgbDtuPWMsZS5jdXJyZW50VGFyZ2V0PWg7dHJ5e24oZSl9Y2F0Y2goZyl7WWUoZyl9ZS5jdXJyZW50VGFyZ2V0PW51bGwsbj1pfX19fWZ1bmN0aW9uIEIobCx0KXt2YXIgYT10W0puXTthPT09dm9pZCAwJiYoYT10W0puXT1uZXcgU2V0KTt2YXIgdT1sKyJfX2J1YmJsZSI7YS5oYXModSl8fChNMSh0LGwsMiwhMSksYS5hZGQodSkpfWZ1bmN0aW9uIFhjKGwsdCxhKXt2YXIgdT0wO3QmJih1fD00KSxNMShhLGwsdSx0KX12YXIgQW49Il9yZWFjdExpc3RlbmluZyIrTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMik7ZnVuY3Rpb24gR2MobCl7aWYoIWxbQW5dKXtsW0FuXT0hMCxnaS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EhPT0ic2VsZWN0aW9uY2hhbmdlIiYmKHVoLmhhcyhhKXx8WGMoYSwhMSxsKSxYYyhhLCEwLGwpKX0pO3ZhciB0PWwubm9kZVR5cGU9PT05P2w6bC5vd25lckRvY3VtZW50O3Q9PT1udWxsfHx0W0FuXXx8KHRbQW5dPSEwLFhjKCJzZWxlY3Rpb25jaGFuZ2UiLCExLHQpKX19ZnVuY3Rpb24gTTEobCx0LGEsdSl7c3dpdGNoKEkxKHQpKXtjYXNlIDI6dmFyIGU9Qmg7YnJlYWs7Y2FzZSA4OmU9WWg7YnJlYWs7ZGVmYXVsdDplPXJjfWE9ZS5iaW5kKG51bGwsdCxhLGwpLGU9dm9pZCAwLCFsZnx8dCE9PSJ0b3VjaHN0YXJ0IiYmdCE9PSJ0b3VjaG1vdmUiJiZ0IT09IndoZWVsInx8KGU9ITApLHU/ZSE9PXZvaWQgMD9sLmFkZEV2ZW50TGlzdGVuZXIodCxhLHtjYXB0dXJlOiEwLHBhc3NpdmU6ZX0pOmwuYWRkRXZlbnRMaXN0ZW5lcih0LGEsITApOmUhPT12b2lkIDA/bC5hZGRFdmVudExpc3RlbmVyKHQsYSx7cGFzc2l2ZTplfSk6bC5hZGRFdmVudExpc3RlbmVyKHQsYSwhMSl9ZnVuY3Rpb24gQ2MobCx0LGEsdSxlKXt2YXIgbj11O2lmKCh0JjEpPT09MCYmKHQmMik9PT0wJiZ1IT09bnVsbClsOmZvcig7Oyl7aWYodT09PW51bGwpcmV0dXJuO3ZhciBmPXUudGFnO2lmKGY9PT0zfHxmPT09NCl7dmFyIGM9dS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztpZihjPT09ZSlicmVhaztpZihmPT09NClmb3IoZj11LnJldHVybjtmIT09bnVsbDspe3ZhciBpPWYudGFnO2lmKChpPT09M3x8aT09PTQpJiZmLnN0YXRlTm9kZS5jb250YWluZXJJbmZvPT09ZSlyZXR1cm47Zj1mLnJldHVybn1mb3IoO2MhPT1udWxsOyl7aWYoZj1YYShjKSxmPT09bnVsbClyZXR1cm47aWYoaT1mLnRhZyxpPT09NXx8aT09PTZ8fGk9PT0yNnx8aT09PTI3KXt1PW49Zjtjb250aW51ZSBsfWM9Yy5wYXJlbnROb2RlfX11PXUucmV0dXJufUhpKGZ1bmN0aW9uKCl7dmFyIGg9bixnPUluKGEpLEE9W107bDp7dmFyIGQ9YTAuZ2V0KGwpO2lmKGQhPT12b2lkIDApe3ZhciBTPU5lLEU9bDtzd2l0Y2gobCl7Y2FzZSJrZXlwcmVzcyI6aWYoX2UoYSk9PT0wKWJyZWFrIGw7Y2FzZSJrZXlkb3duIjpjYXNlImtleXVwIjpTPXJ5O2JyZWFrO2Nhc2UiZm9jdXNpbiI6RT0iZm9jdXMiLFM9ZWY7YnJlYWs7Y2FzZSJmb2N1c291dCI6RT0iYmx1ciIsUz1lZjticmVhaztjYXNlImJlZm9yZWJsdXIiOmNhc2UiYWZ0ZXJibHVyIjpTPWVmO2JyZWFrO2Nhc2UiY2xpY2siOmlmKGEuYnV0dG9uPT09MilicmVhayBsO2Nhc2UiYXV4Y2xpY2siOmNhc2UiZGJsY2xpY2siOmNhc2UibW91c2Vkb3duIjpjYXNlIm1vdXNlbW92ZSI6Y2FzZSJtb3VzZXVwIjpjYXNlIm1vdXNlb3V0IjpjYXNlIm1vdXNlb3ZlciI6Y2FzZSJjb250ZXh0bWVudSI6Uz1CaTticmVhaztjYXNlImRyYWciOmNhc2UiZHJhZ2VuZCI6Y2FzZSJkcmFnZW50ZXIiOmNhc2UiZHJhZ2V4aXQiOmNhc2UiZHJhZ2xlYXZlIjpjYXNlImRyYWdvdmVyIjpjYXNlImRyYWdzdGFydCI6Y2FzZSJkcm9wIjpTPVJ5O2JyZWFrO2Nhc2UidG91Y2hjYW5jZWwiOmNhc2UidG91Y2hlbmQiOmNhc2UidG91Y2htb3ZlIjpjYXNlInRvdWNoc3RhcnQiOlM9UHk7YnJlYWs7Y2FzZSBJaTpjYXNlIFBpOmNhc2UgbDA6Uz1weTticmVhaztjYXNlIHQwOlM9dG07YnJlYWs7Y2FzZSJzY3JvbGwiOmNhc2Uic2Nyb2xsZW5kIjpTPUN5O2JyZWFrO2Nhc2Uid2hlZWwiOlM9dW07YnJlYWs7Y2FzZSJjb3B5IjpjYXNlImN1dCI6Y2FzZSJwYXN0ZSI6Uz14eTticmVhaztjYXNlImdvdHBvaW50ZXJjYXB0dXJlIjpjYXNlImxvc3Rwb2ludGVyY2FwdHVyZSI6Y2FzZSJwb2ludGVyY2FuY2VsIjpjYXNlInBvaW50ZXJkb3duIjpjYXNlInBvaW50ZXJtb3ZlIjpjYXNlInBvaW50ZXJvdXQiOmNhc2UicG9pbnRlcm92ZXIiOmNhc2UicG9pbnRlcnVwIjpTPVFpO2JyZWFrO2Nhc2UidG9nZ2xlIjpjYXNlImJlZm9yZXRvZ2dsZSI6Uz1ubX12YXIgRD0odCY0KSE9PTAsTD0hRCYmKGw9PT0ic2Nyb2xsInx8bD09PSJzY3JvbGxlbmQiKSx5PUQ/ZCE9PW51bGw/ZCsiQ2FwdHVyZSI6bnVsbDpkO0Q9W107Zm9yKHZhciB2PWgsbTt2IT09bnVsbDspe3ZhciBiPXY7aWYobT1iLnN0YXRlTm9kZSxiPWIudGFnLGIhPT01JiZiIT09MjYmJmIhPT0yN3x8bT09PW51bGx8fHk9PT1udWxsfHwoYj1PdSh2LHkpLGIhPW51bGwmJkQucHVzaCh1ZSh2LGIsbSkpKSxMKWJyZWFrO3Y9di5yZXR1cm59MDxELmxlbmd0aCYmKGQ9bmV3IFMoZCxFLG51bGwsYSxnKSxBLnB1c2goe2V2ZW50OmQsbGlzdGVuZXJzOkR9KSl9fWlmKCh0JjcpPT09MCl7bDp7aWYoZD1sPT09Im1vdXNlb3ZlciJ8fGw9PT0icG9pbnRlcm92ZXIiLFM9bD09PSJtb3VzZW91dCJ8fGw9PT0icG9pbnRlcm91dCIsZCYmYSE9PWtuJiYoRT1hLnJlbGF0ZWRUYXJnZXR8fGEuZnJvbUVsZW1lbnQpJiYoWGEoRSl8fEVbUWFdKSlicmVhayBsO2lmKChTfHxkKSYmKGQ9Zy53aW5kb3c9PT1nP2c6KGQ9Zy5vd25lckRvY3VtZW50KT9kLmRlZmF1bHRWaWV3fHxkLnBhcmVudFdpbmRvdzp3aW5kb3csUz8oRT1hLnJlbGF0ZWRUYXJnZXR8fGEudG9FbGVtZW50LFM9aCxFPUU/WGEoRSk6bnVsbCxFIT09bnVsbCYmKEw9eXQoRSksRD1FLnRhZyxFIT09THx8RCE9PTUmJkQhPT0yNyYmRCE9PTYpJiYoRT1udWxsKSk6KFM9bnVsbCxFPWgpLFMhPT1FKSl7aWYoRD1CaSxiPSJvbk1vdXNlTGVhdmUiLHk9Im9uTW91c2VFbnRlciIsdj0ibW91c2UiLChsPT09InBvaW50ZXJvdXQifHxsPT09InBvaW50ZXJvdmVyIikmJihEPVFpLGI9Im9uUG9pbnRlckxlYXZlIix5PSJvblBvaW50ZXJFbnRlciIsdj0icG9pbnRlciIpLEw9Uz09bnVsbD9kOk11KFMpLG09RT09bnVsbD9kOk11KEUpLGQ9bmV3IEQoYix2KyJsZWF2ZSIsUyxhLGcpLGQudGFyZ2V0PUwsZC5yZWxhdGVkVGFyZ2V0PW0sYj1udWxsLFhhKGcpPT09aCYmKEQ9bmV3IEQoeSx2KyJlbnRlciIsRSxhLGcpLEQudGFyZ2V0PW0sRC5yZWxhdGVkVGFyZ2V0PUwsYj1EKSxMPWIsUyYmRSl0Ontmb3IoRD1laCx5PVMsdj1FLG09MCxiPXk7YjtiPUQoYikpbSsrO2I9MDtmb3IodmFyIE89djtPO089RChPKSliKys7Zm9yKDswPG0tYjspeT1EKHkpLG0tLTtmb3IoOzA8Yi1tOyl2PUQodiksYi0tO2Zvcig7bS0tOyl7aWYoeT09PXZ8fHYhPT1udWxsJiZ5PT09di5hbHRlcm5hdGUpe0Q9eTticmVhayB0fXk9RCh5KSx2PUQodil9RD1udWxsfWVsc2UgRD1udWxsO1MhPT1udWxsJiZPMShBLGQsUyxELCExKSxFIT09bnVsbCYmTCE9PW51bGwmJk8xKEEsTCxFLEQsITApfX1sOntpZihkPWg/TXUoaCk6d2luZG93LFM9ZC5ub2RlTmFtZSYmZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLFM9PT0ic2VsZWN0Inx8Uz09PSJpbnB1dCImJmQudHlwZT09PSJmaWxlIil2YXIgQz1waTtlbHNlIGlmKGppKGQpKWlmKEtpKUM9c207ZWxzZXtDPWRtO3ZhciBNPWhtfWVsc2UgUz1kLm5vZGVOYW1lLCFTfHxTLnRvTG93ZXJDYXNlKCkhPT0iaW5wdXQifHxkLnR5cGUhPT0iY2hlY2tib3giJiZkLnR5cGUhPT0icmFkaW8iP2gmJnJuKGguZWxlbWVudFR5cGUpJiYoQz1waSk6Qz1TbTtpZihDJiYoQz1DKGwsaCkpKXtWaShBLEMsYSxnKTticmVhayBsfU0mJk0obCxkLGgpLGw9PT0iZm9jdXNvdXQiJiZoJiZkLnR5cGU9PT0ibnVtYmVyIiYmaC5tZW1vaXplZFByb3BzLnZhbHVlIT1udWxsJiZGbihkLCJudW1iZXIiLGQudmFsdWUpfXN3aXRjaChNPWg/TXUoaCk6d2luZG93LGwpe2Nhc2UiZm9jdXNpbiI6KGppKE0pfHxNLmNvbnRlbnRFZGl0YWJsZT09PSJ0cnVlIikmJih4YT1NLG1mPWgsWXU9bnVsbCk7YnJlYWs7Y2FzZSJmb2N1c291dCI6WXU9bWY9eGE9bnVsbDticmVhaztjYXNlIm1vdXNlZG93biI6aGY9ITA7YnJlYWs7Y2FzZSJjb250ZXh0bWVudSI6Y2FzZSJtb3VzZXVwIjpjYXNlImRyYWdlbmQiOmhmPSExLHJpKEEsYSxnKTticmVhaztjYXNlInNlbGVjdGlvbmNoYW5nZSI6aWYoYm0pYnJlYWs7Y2FzZSJrZXlkb3duIjpjYXNlImtleXVwIjpyaShBLGEsZyl9dmFyIE47aWYoZmYpbDp7c3dpdGNoKGwpe2Nhc2UiY29tcG9zaXRpb25zdGFydCI6dmFyIFE9Im9uQ29tcG9zaXRpb25TdGFydCI7YnJlYWsgbDtjYXNlImNvbXBvc2l0aW9uZW5kIjpRPSJvbkNvbXBvc2l0aW9uRW5kIjticmVhayBsO2Nhc2UiY29tcG9zaXRpb251cGRhdGUiOlE9Im9uQ29tcG9zaXRpb25VcGRhdGUiO2JyZWFrIGx9UT12b2lkIDB9ZWxzZSBLYT9aaShsLGEpJiYoUT0ib25Db21wb3NpdGlvbkVuZCIpOmw9PT0ia2V5ZG93biImJmEua2V5Q29kZT09PTIyOSYmKFE9Im9uQ29tcG9zaXRpb25TdGFydCIpO1EmJihYaSYmYS5sb2NhbGUhPT0ia28iJiYoS2F8fFEhPT0ib25Db21wb3NpdGlvblN0YXJ0Ij9RPT09Im9uQ29tcG9zaXRpb25FbmQiJiZLYSYmKE49TmkoKSk6KEN0PWcsdGY9InZhbHVlImluIEN0P0N0LnZhbHVlOkN0LnRleHRDb250ZW50LEthPSEwKSksTT1UbihoLFEpLDA8TS5sZW5ndGgmJihRPW5ldyBZaShRLGwsbnVsbCxhLGcpLEEucHVzaCh7ZXZlbnQ6USxsaXN0ZW5lcnM6TX0pLE4/US5kYXRhPU46KE49UmkoYSksTiE9PW51bGwmJihRLmRhdGE9TikpKSksKE49Y20/aW0obCxhKTp2bShsLGEpKSYmKFE9VG4oaCwib25CZWZvcmVJbnB1dCIpLDA8US5sZW5ndGgmJihNPW5ldyBZaSgib25CZWZvcmVJbnB1dCIsImJlZm9yZWlucHV0IixudWxsLGEsZyksQS5wdXNoKHtldmVudDpNLGxpc3RlbmVyczpRfSksTS5kYXRhPU4pKSxsaChBLGwsaCxhLGcpfUUxKEEsdCl9KX1mdW5jdGlvbiB1ZShsLHQsYSl7cmV0dXJue2luc3RhbmNlOmwsbGlzdGVuZXI6dCxjdXJyZW50VGFyZ2V0OmF9fWZ1bmN0aW9uIFRuKGwsdCl7Zm9yKHZhciBhPXQrIkNhcHR1cmUiLHU9W107bCE9PW51bGw7KXt2YXIgZT1sLG49ZS5zdGF0ZU5vZGU7aWYoZT1lLnRhZyxlIT09NSYmZSE9PTI2JiZlIT09Mjd8fG49PT1udWxsfHwoZT1PdShsLGEpLGUhPW51bGwmJnUudW5zaGlmdCh1ZShsLGUsbikpLGU9T3UobCx0KSxlIT1udWxsJiZ1LnB1c2godWUobCxlLG4pKSksbC50YWc9PT0zKXJldHVybiB1O2w9bC5yZXR1cm59cmV0dXJuW119ZnVuY3Rpb24gZWgobCl7aWYobD09PW51bGwpcmV0dXJuIG51bGw7ZG8gbD1sLnJldHVybjt3aGlsZShsJiZsLnRhZyE9PTUmJmwudGFnIT09MjcpO3JldHVybiBsfHxudWxsfWZ1bmN0aW9uIE8xKGwsdCxhLHUsZSl7Zm9yKHZhciBuPXQuX3JlYWN0TmFtZSxmPVtdO2EhPT1udWxsJiZhIT09dTspe3ZhciBjPWEsaT1jLmFsdGVybmF0ZSxoPWMuc3RhdGVOb2RlO2lmKGM9Yy50YWcsaSE9PW51bGwmJmk9PT11KWJyZWFrO2MhPT01JiZjIT09MjYmJmMhPT0yN3x8aD09PW51bGx8fChpPWgsZT8oaD1PdShhLG4pLGghPW51bGwmJmYudW5zaGlmdCh1ZShhLGgsaSkpKTplfHwoaD1PdShhLG4pLGghPW51bGwmJmYucHVzaCh1ZShhLGgsaSkpKSksYT1hLnJldHVybn1mLmxlbmd0aCE9PTAmJmwucHVzaCh7ZXZlbnQ6dCxsaXN0ZW5lcnM6Zn0pfXZhciBuaD0vXHJcbj8vZyxmaD0vXHUwMDAwfFx1RkZGRC9nO2Z1bmN0aW9uIEQxKGwpe3JldHVybih0eXBlb2YgbD09InN0cmluZyI/bDoiIitsKS5yZXBsYWNlKG5oLGAKYCkucmVwbGFjZShmaCwiIil9ZnVuY3Rpb24gVTEobCx0KXtyZXR1cm4gdD1EMSh0KSxEMShsKT09PXR9ZnVuY3Rpb24geChsLHQsYSx1LGUsbil7c3dpdGNoKGEpe2Nhc2UiY2hpbGRyZW4iOnR5cGVvZiB1PT0ic3RyaW5nIj90PT09ImJvZHkifHx0PT09InRleHRhcmVhIiYmdT09PSIifHxqYShsLHUpOih0eXBlb2YgdT09Im51bWJlciJ8fHR5cGVvZiB1PT0iYmlnaW50IikmJnQhPT0iYm9keSImJmphKGwsIiIrdSk7YnJlYWs7Y2FzZSJjbGFzc05hbWUiOk1lKGwsImNsYXNzIix1KTticmVhaztjYXNlInRhYkluZGV4IjpNZShsLCJ0YWJpbmRleCIsdSk7YnJlYWs7Y2FzZSJkaXIiOmNhc2Uicm9sZSI6Y2FzZSJ2aWV3Qm94IjpjYXNlIndpZHRoIjpjYXNlImhlaWdodCI6TWUobCxhLHUpO2JyZWFrO2Nhc2Uic3R5bGUiOlVpKGwsdSxuKTticmVhaztjYXNlImRhdGEiOmlmKHQhPT0ib2JqZWN0Iil7TWUobCwiZGF0YSIsdSk7YnJlYWt9Y2FzZSJzcmMiOmNhc2UiaHJlZiI6aWYodT09PSIiJiYodCE9PSJhInx8YSE9PSJocmVmIikpe2wucmVtb3ZlQXR0cmlidXRlKGEpO2JyZWFrfWlmKHU9PW51bGx8fHR5cGVvZiB1PT0iZnVuY3Rpb24ifHx0eXBlb2YgdT09InN5bWJvbCJ8fHR5cGVvZiB1PT0iYm9vbGVhbiIpe2wucmVtb3ZlQXR0cmlidXRlKGEpO2JyZWFrfXU9RGUoIiIrdSksbC5zZXRBdHRyaWJ1dGUoYSx1KTticmVhaztjYXNlImFjdGlvbiI6Y2FzZSJmb3JtQWN0aW9uIjppZih0eXBlb2YgdT09ImZ1bmN0aW9uIil7bC5zZXRBdHRyaWJ1dGUoYSwiamF2YXNjcmlwdDp0aHJvdyBuZXcgRXJyb3IoJ0EgUmVhY3QgZm9ybSB3YXMgdW5leHBlY3RlZGx5IHN1Ym1pdHRlZC4gSWYgeW91IGNhbGxlZCBmb3JtLnN1Ym1pdCgpIG1hbnVhbGx5LCBjb25zaWRlciB1c2luZyBmb3JtLnJlcXVlc3RTdWJtaXQoKSBpbnN0ZWFkLiBJZiB5b3VcXCdyZSB0cnlpbmcgdG8gdXNlIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpIGluIGEgc3VibWl0IGV2ZW50IGhhbmRsZXIsIGNvbnNpZGVyIGFsc28gY2FsbGluZyBldmVudC5wcmV2ZW50RGVmYXVsdCgpLicpIik7YnJlYWt9ZWxzZSB0eXBlb2Ygbj09ImZ1bmN0aW9uIiYmKGE9PT0iZm9ybUFjdGlvbiI/KHQhPT0iaW5wdXQiJiZ4KGwsdCwibmFtZSIsZS5uYW1lLGUsbnVsbCkseChsLHQsImZvcm1FbmNUeXBlIixlLmZvcm1FbmNUeXBlLGUsbnVsbCkseChsLHQsImZvcm1NZXRob2QiLGUuZm9ybU1ldGhvZCxlLG51bGwpLHgobCx0LCJmb3JtVGFyZ2V0IixlLmZvcm1UYXJnZXQsZSxudWxsKSk6KHgobCx0LCJlbmNUeXBlIixlLmVuY1R5cGUsZSxudWxsKSx4KGwsdCwibWV0aG9kIixlLm1ldGhvZCxlLG51bGwpLHgobCx0LCJ0YXJnZXQiLGUudGFyZ2V0LGUsbnVsbCkpKTtpZih1PT1udWxsfHx0eXBlb2YgdT09InN5bWJvbCJ8fHR5cGVvZiB1PT0iYm9vbGVhbiIpe2wucmVtb3ZlQXR0cmlidXRlKGEpO2JyZWFrfXU9RGUoIiIrdSksbC5zZXRBdHRyaWJ1dGUoYSx1KTticmVhaztjYXNlIm9uQ2xpY2siOnUhPW51bGwmJihsLm9uY2xpY2s9U3QpO2JyZWFrO2Nhc2Uib25TY3JvbGwiOnUhPW51bGwmJkIoInNjcm9sbCIsbCk7YnJlYWs7Y2FzZSJvblNjcm9sbEVuZCI6dSE9bnVsbCYmQigic2Nyb2xsZW5kIixsKTticmVhaztjYXNlImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIjppZih1IT1udWxsKXtpZih0eXBlb2YgdSE9Im9iamVjdCJ8fCEoIl9faHRtbCJpbiB1KSl0aHJvdyBFcnJvcihzKDYxKSk7aWYoYT11Ll9faHRtbCxhIT1udWxsKXtpZihlLmNoaWxkcmVuIT1udWxsKXRocm93IEVycm9yKHMoNjApKTtsLmlubmVySFRNTD1hfX1icmVhaztjYXNlIm11bHRpcGxlIjpsLm11bHRpcGxlPXUmJnR5cGVvZiB1IT0iZnVuY3Rpb24iJiZ0eXBlb2YgdSE9InN5bWJvbCI7YnJlYWs7Y2FzZSJtdXRlZCI6bC5tdXRlZD11JiZ0eXBlb2YgdSE9ImZ1bmN0aW9uIiYmdHlwZW9mIHUhPSJzeW1ib2wiO2JyZWFrO2Nhc2Uic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIjpjYXNlInN1cHByZXNzSHlkcmF0aW9uV2FybmluZyI6Y2FzZSJkZWZhdWx0VmFsdWUiOmNhc2UiZGVmYXVsdENoZWNrZWQiOmNhc2UiaW5uZXJIVE1MIjpjYXNlInJlZiI6YnJlYWs7Y2FzZSJhdXRvRm9jdXMiOmJyZWFrO2Nhc2UieGxpbmtIcmVmIjppZih1PT1udWxsfHx0eXBlb2YgdT09ImZ1bmN0aW9uInx8dHlwZW9mIHU9PSJib29sZWFuInx8dHlwZW9mIHU9PSJzeW1ib2wiKXtsLnJlbW92ZUF0dHJpYnV0ZSgieGxpbms6aHJlZiIpO2JyZWFrfWE9RGUoIiIrdSksbC5zZXRBdHRyaWJ1dGVOUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsInhsaW5rOmhyZWYiLGEpO2JyZWFrO2Nhc2UiY29udGVudEVkaXRhYmxlIjpjYXNlInNwZWxsQ2hlY2siOmNhc2UiZHJhZ2dhYmxlIjpjYXNlInZhbHVlIjpjYXNlImF1dG9SZXZlcnNlIjpjYXNlImV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQiOmNhc2UiZm9jdXNhYmxlIjpjYXNlInByZXNlcnZlQWxwaGEiOnUhPW51bGwmJnR5cGVvZiB1IT0iZnVuY3Rpb24iJiZ0eXBlb2YgdSE9InN5bWJvbCI/bC5zZXRBdHRyaWJ1dGUoYSwiIit1KTpsLnJlbW92ZUF0dHJpYnV0ZShhKTticmVhaztjYXNlImluZXJ0IjpjYXNlImFsbG93RnVsbFNjcmVlbiI6Y2FzZSJhc3luYyI6Y2FzZSJhdXRvUGxheSI6Y2FzZSJjb250cm9scyI6Y2FzZSJkZWZhdWx0IjpjYXNlImRlZmVyIjpjYXNlImRpc2FibGVkIjpjYXNlImRpc2FibGVQaWN0dXJlSW5QaWN0dXJlIjpjYXNlImRpc2FibGVSZW1vdGVQbGF5YmFjayI6Y2FzZSJmb3JtTm9WYWxpZGF0ZSI6Y2FzZSJoaWRkZW4iOmNhc2UibG9vcCI6Y2FzZSJub01vZHVsZSI6Y2FzZSJub1ZhbGlkYXRlIjpjYXNlIm9wZW4iOmNhc2UicGxheXNJbmxpbmUiOmNhc2UicmVhZE9ubHkiOmNhc2UicmVxdWlyZWQiOmNhc2UicmV2ZXJzZWQiOmNhc2Uic2NvcGVkIjpjYXNlInNlYW1sZXNzIjpjYXNlIml0ZW1TY29wZSI6dSYmdHlwZW9mIHUhPSJmdW5jdGlvbiImJnR5cGVvZiB1IT0ic3ltYm9sIj9sLnNldEF0dHJpYnV0ZShhLCIiKTpsLnJlbW92ZUF0dHJpYnV0ZShhKTticmVhaztjYXNlImNhcHR1cmUiOmNhc2UiZG93bmxvYWQiOnU9PT0hMD9sLnNldEF0dHJpYnV0ZShhLCIiKTp1IT09ITEmJnUhPW51bGwmJnR5cGVvZiB1IT0iZnVuY3Rpb24iJiZ0eXBlb2YgdSE9InN5bWJvbCI/bC5zZXRBdHRyaWJ1dGUoYSx1KTpsLnJlbW92ZUF0dHJpYnV0ZShhKTticmVhaztjYXNlImNvbHMiOmNhc2Uicm93cyI6Y2FzZSJzaXplIjpjYXNlInNwYW4iOnUhPW51bGwmJnR5cGVvZiB1IT0iZnVuY3Rpb24iJiZ0eXBlb2YgdSE9InN5bWJvbCImJiFpc05hTih1KSYmMTw9dT9sLnNldEF0dHJpYnV0ZShhLHUpOmwucmVtb3ZlQXR0cmlidXRlKGEpO2JyZWFrO2Nhc2Uicm93U3BhbiI6Y2FzZSJzdGFydCI6dT09bnVsbHx8dHlwZW9mIHU9PSJmdW5jdGlvbiJ8fHR5cGVvZiB1PT0ic3ltYm9sInx8aXNOYU4odSk/bC5yZW1vdmVBdHRyaWJ1dGUoYSk6bC5zZXRBdHRyaWJ1dGUoYSx1KTticmVhaztjYXNlInBvcG92ZXIiOkIoImJlZm9yZXRvZ2dsZSIsbCksQigidG9nZ2xlIixsKSxFZShsLCJwb3BvdmVyIix1KTticmVhaztjYXNlInhsaW5rQWN0dWF0ZSI6ZHQobCwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsInhsaW5rOmFjdHVhdGUiLHUpO2JyZWFrO2Nhc2UieGxpbmtBcmNyb2xlIjpkdChsLCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiwieGxpbms6YXJjcm9sZSIsdSk7YnJlYWs7Y2FzZSJ4bGlua1JvbGUiOmR0KGwsImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLCJ4bGluazpyb2xlIix1KTticmVhaztjYXNlInhsaW5rU2hvdyI6ZHQobCwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsInhsaW5rOnNob3ciLHUpO2JyZWFrO2Nhc2UieGxpbmtUaXRsZSI6ZHQobCwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsInhsaW5rOnRpdGxlIix1KTticmVhaztjYXNlInhsaW5rVHlwZSI6ZHQobCwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsInhsaW5rOnR5cGUiLHUpO2JyZWFrO2Nhc2UieG1sQmFzZSI6ZHQobCwiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiwieG1sOmJhc2UiLHUpO2JyZWFrO2Nhc2UieG1sTGFuZyI6ZHQobCwiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiwieG1sOmxhbmciLHUpO2JyZWFrO2Nhc2UieG1sU3BhY2UiOmR0KGwsImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsInhtbDpzcGFjZSIsdSk7YnJlYWs7Y2FzZSJpcyI6RWUobCwiaXMiLHUpO2JyZWFrO2Nhc2UiaW5uZXJUZXh0IjpjYXNlInRleHRDb250ZW50IjpicmVhaztkZWZhdWx0OighKDI8YS5sZW5ndGgpfHxhWzBdIT09Im8iJiZhWzBdIT09Ik8ifHxhWzFdIT09Im4iJiZhWzFdIT09Ik4iKSYmKGE9WHkuZ2V0KGEpfHxhLEVlKGwsYSx1KSl9fWZ1bmN0aW9uIFpjKGwsdCxhLHUsZSxuKXtzd2l0Y2goYSl7Y2FzZSJzdHlsZSI6VWkobCx1LG4pO2JyZWFrO2Nhc2UiZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiOmlmKHUhPW51bGwpe2lmKHR5cGVvZiB1IT0ib2JqZWN0Inx8ISgiX19odG1sImluIHUpKXRocm93IEVycm9yKHMoNjEpKTtpZihhPXUuX19odG1sLGEhPW51bGwpe2lmKGUuY2hpbGRyZW4hPW51bGwpdGhyb3cgRXJyb3Iocyg2MCkpO2wuaW5uZXJIVE1MPWF9fWJyZWFrO2Nhc2UiY2hpbGRyZW4iOnR5cGVvZiB1PT0ic3RyaW5nIj9qYShsLHUpOih0eXBlb2YgdT09Im51bWJlciJ8fHR5cGVvZiB1PT0iYmlnaW50IikmJmphKGwsIiIrdSk7YnJlYWs7Y2FzZSJvblNjcm9sbCI6dSE9bnVsbCYmQigic2Nyb2xsIixsKTticmVhaztjYXNlIm9uU2Nyb2xsRW5kIjp1IT1udWxsJiZCKCJzY3JvbGxlbmQiLGwpO2JyZWFrO2Nhc2Uib25DbGljayI6dSE9bnVsbCYmKGwub25jbGljaz1TdCk7YnJlYWs7Y2FzZSJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmciOmNhc2Uic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIjpjYXNlImlubmVySFRNTCI6Y2FzZSJyZWYiOmJyZWFrO2Nhc2UiaW5uZXJUZXh0IjpjYXNlInRleHRDb250ZW50IjpicmVhaztkZWZhdWx0OmlmKCFiaS5oYXNPd25Qcm9wZXJ0eShhKSlsOntpZihhWzBdPT09Im8iJiZhWzFdPT09Im4iJiYoZT1hLmVuZHNXaXRoKCJDYXB0dXJlIiksdD1hLnNsaWNlKDIsZT9hLmxlbmd0aC03OnZvaWQgMCksbj1sW29sXXx8bnVsbCxuPW4hPW51bGw/blthXTpudWxsLHR5cGVvZiBuPT0iZnVuY3Rpb24iJiZsLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuLGUpLHR5cGVvZiB1PT0iZnVuY3Rpb24iKSl7dHlwZW9mIG4hPSJmdW5jdGlvbiImJm4hPT1udWxsJiYoYSBpbiBsP2xbYV09bnVsbDpsLmhhc0F0dHJpYnV0ZShhKSYmbC5yZW1vdmVBdHRyaWJ1dGUoYSkpLGwuYWRkRXZlbnRMaXN0ZW5lcih0LHUsZSk7YnJlYWsgbH1hIGluIGw/bFthXT11OnU9PT0hMD9sLnNldEF0dHJpYnV0ZShhLCIiKTpFZShsLGEsdSl9fX1mdW5jdGlvbiBibChsLHQsYSl7c3dpdGNoKHQpe2Nhc2UiZGl2IjpjYXNlInNwYW4iOmNhc2Uic3ZnIjpjYXNlInBhdGgiOmNhc2UiYSI6Y2FzZSJnIjpjYXNlInAiOmNhc2UibGkiOmJyZWFrO2Nhc2UiaW1nIjpCKCJlcnJvciIsbCksQigibG9hZCIsbCk7dmFyIHU9ITEsZT0hMSxuO2ZvcihuIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShuKSl7dmFyIGY9YVtuXTtpZihmIT1udWxsKXN3aXRjaChuKXtjYXNlInNyYyI6dT0hMDticmVhaztjYXNlInNyY1NldCI6ZT0hMDticmVhaztjYXNlImNoaWxkcmVuIjpjYXNlImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIjp0aHJvdyBFcnJvcihzKDEzNyx0KSk7ZGVmYXVsdDp4KGwsdCxuLGYsYSxudWxsKX19ZSYmeChsLHQsInNyY1NldCIsYS5zcmNTZXQsYSxudWxsKSx1JiZ4KGwsdCwic3JjIixhLnNyYyxhLG51bGwpO3JldHVybjtjYXNlImlucHV0IjpCKCJpbnZhbGlkIixsKTt2YXIgYz1uPWY9ZT1udWxsLGk9bnVsbCxoPW51bGw7Zm9yKHUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KHUpKXt2YXIgZz1hW3VdO2lmKGchPW51bGwpc3dpdGNoKHUpe2Nhc2UibmFtZSI6ZT1nO2JyZWFrO2Nhc2UidHlwZSI6Zj1nO2JyZWFrO2Nhc2UiY2hlY2tlZCI6aT1nO2JyZWFrO2Nhc2UiZGVmYXVsdENoZWNrZWQiOmg9ZzticmVhaztjYXNlInZhbHVlIjpuPWc7YnJlYWs7Y2FzZSJkZWZhdWx0VmFsdWUiOmM9ZzticmVhaztjYXNlImNoaWxkcmVuIjpjYXNlImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIjppZihnIT1udWxsKXRocm93IEVycm9yKHMoMTM3LHQpKTticmVhaztkZWZhdWx0OngobCx0LHUsZyxhLG51bGwpfX1FaShsLG4sYyxpLGgsZixlLCExKTtyZXR1cm47Y2FzZSJzZWxlY3QiOkIoImludmFsaWQiLGwpLHU9Zj1uPW51bGw7Zm9yKGUgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGUpJiYoYz1hW2VdLGMhPW51bGwpKXN3aXRjaChlKXtjYXNlInZhbHVlIjpuPWM7YnJlYWs7Y2FzZSJkZWZhdWx0VmFsdWUiOmY9YzticmVhaztjYXNlIm11bHRpcGxlIjp1PWM7ZGVmYXVsdDp4KGwsdCxlLGMsYSxudWxsKX10PW4sYT1mLGwubXVsdGlwbGU9ISF1LHQhPW51bGw/UmEobCwhIXUsdCwhMSk6YSE9bnVsbCYmUmEobCwhIXUsYSwhMCk7cmV0dXJuO2Nhc2UidGV4dGFyZWEiOkIoImludmFsaWQiLGwpLG49ZT11PW51bGw7Zm9yKGYgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGYpJiYoYz1hW2ZdLGMhPW51bGwpKXN3aXRjaChmKXtjYXNlInZhbHVlIjp1PWM7YnJlYWs7Y2FzZSJkZWZhdWx0VmFsdWUiOmU9YzticmVhaztjYXNlImNoaWxkcmVuIjpuPWM7YnJlYWs7Y2FzZSJkYW5nZXJvdXNseVNldElubmVySFRNTCI6aWYoYyE9bnVsbCl0aHJvdyBFcnJvcihzKDkxKSk7YnJlYWs7ZGVmYXVsdDp4KGwsdCxmLGMsYSxudWxsKX1PaShsLHUsZSxuKTtyZXR1cm47Y2FzZSJvcHRpb24iOmZvcihpIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShpKSYmKHU9YVtpXSx1IT1udWxsKSlzd2l0Y2goaSl7Y2FzZSJzZWxlY3RlZCI6bC5zZWxlY3RlZD11JiZ0eXBlb2YgdSE9ImZ1bmN0aW9uIiYmdHlwZW9mIHUhPSJzeW1ib2wiO2JyZWFrO2RlZmF1bHQ6eChsLHQsaSx1LGEsbnVsbCl9cmV0dXJuO2Nhc2UiZGlhbG9nIjpCKCJiZWZvcmV0b2dnbGUiLGwpLEIoInRvZ2dsZSIsbCksQigiY2FuY2VsIixsKSxCKCJjbG9zZSIsbCk7YnJlYWs7Y2FzZSJpZnJhbWUiOmNhc2Uib2JqZWN0IjpCKCJsb2FkIixsKTticmVhaztjYXNlInZpZGVvIjpjYXNlImF1ZGlvIjpmb3IodT0wO3U8YWUubGVuZ3RoO3UrKylCKGFlW3VdLGwpO2JyZWFrO2Nhc2UiaW1hZ2UiOkIoImVycm9yIixsKSxCKCJsb2FkIixsKTticmVhaztjYXNlImRldGFpbHMiOkIoInRvZ2dsZSIsbCk7YnJlYWs7Y2FzZSJlbWJlZCI6Y2FzZSJzb3VyY2UiOmNhc2UibGluayI6QigiZXJyb3IiLGwpLEIoImxvYWQiLGwpO2Nhc2UiYXJlYSI6Y2FzZSJiYXNlIjpjYXNlImJyIjpjYXNlImNvbCI6Y2FzZSJociI6Y2FzZSJrZXlnZW4iOmNhc2UibWV0YSI6Y2FzZSJwYXJhbSI6Y2FzZSJ0cmFjayI6Y2FzZSJ3YnIiOmNhc2UibWVudWl0ZW0iOmZvcihoIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShoKSYmKHU9YVtoXSx1IT1udWxsKSlzd2l0Y2goaCl7Y2FzZSJjaGlsZHJlbiI6Y2FzZSJkYW5nZXJvdXNseVNldElubmVySFRNTCI6dGhyb3cgRXJyb3IocygxMzcsdCkpO2RlZmF1bHQ6eChsLHQsaCx1LGEsbnVsbCl9cmV0dXJuO2RlZmF1bHQ6aWYocm4odCkpe2ZvcihnIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShnKSYmKHU9YVtnXSx1IT09dm9pZCAwJiZaYyhsLHQsZyx1LGEsdm9pZCAwKSk7cmV0dXJufX1mb3IoYyBpbiBhKWEuaGFzT3duUHJvcGVydHkoYykmJih1PWFbY10sdSE9bnVsbCYmeChsLHQsYyx1LGEsbnVsbCkpfWZ1bmN0aW9uIGNoKGwsdCxhLHUpe3N3aXRjaCh0KXtjYXNlImRpdiI6Y2FzZSJzcGFuIjpjYXNlInN2ZyI6Y2FzZSJwYXRoIjpjYXNlImEiOmNhc2UiZyI6Y2FzZSJwIjpjYXNlImxpIjpicmVhaztjYXNlImlucHV0Ijp2YXIgZT1udWxsLG49bnVsbCxmPW51bGwsYz1udWxsLGk9bnVsbCxoPW51bGwsZz1udWxsO2ZvcihTIGluIGEpe3ZhciBBPWFbU107aWYoYS5oYXNPd25Qcm9wZXJ0eShTKSYmQSE9bnVsbClzd2l0Y2goUyl7Y2FzZSJjaGVja2VkIjpicmVhaztjYXNlInZhbHVlIjpicmVhaztjYXNlImRlZmF1bHRWYWx1ZSI6aT1BO2RlZmF1bHQ6dS5oYXNPd25Qcm9wZXJ0eShTKXx8eChsLHQsUyxudWxsLHUsQSl9fWZvcih2YXIgZCBpbiB1KXt2YXIgUz11W2RdO2lmKEE9YVtkXSx1Lmhhc093blByb3BlcnR5KGQpJiYoUyE9bnVsbHx8QSE9bnVsbCkpc3dpdGNoKGQpe2Nhc2UidHlwZSI6bj1TO2JyZWFrO2Nhc2UibmFtZSI6ZT1TO2JyZWFrO2Nhc2UiY2hlY2tlZCI6aD1TO2JyZWFrO2Nhc2UiZGVmYXVsdENoZWNrZWQiOmc9UzticmVhaztjYXNlInZhbHVlIjpmPVM7YnJlYWs7Y2FzZSJkZWZhdWx0VmFsdWUiOmM9UzticmVhaztjYXNlImNoaWxkcmVuIjpjYXNlImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIjppZihTIT1udWxsKXRocm93IEVycm9yKHMoMTM3LHQpKTticmVhaztkZWZhdWx0OlMhPT1BJiZ4KGwsdCxkLFMsdSxBKX19JG4obCxmLGMsaSxoLGcsbixlKTtyZXR1cm47Y2FzZSJzZWxlY3QiOlM9Zj1jPWQ9bnVsbDtmb3IobiBpbiBhKWlmKGk9YVtuXSxhLmhhc093blByb3BlcnR5KG4pJiZpIT1udWxsKXN3aXRjaChuKXtjYXNlInZhbHVlIjpicmVhaztjYXNlIm11bHRpcGxlIjpTPWk7ZGVmYXVsdDp1Lmhhc093blByb3BlcnR5KG4pfHx4KGwsdCxuLG51bGwsdSxpKX1mb3IoZSBpbiB1KWlmKG49dVtlXSxpPWFbZV0sdS5oYXNPd25Qcm9wZXJ0eShlKSYmKG4hPW51bGx8fGkhPW51bGwpKXN3aXRjaChlKXtjYXNlInZhbHVlIjpkPW47YnJlYWs7Y2FzZSJkZWZhdWx0VmFsdWUiOmM9bjticmVhaztjYXNlIm11bHRpcGxlIjpmPW47ZGVmYXVsdDpuIT09aSYmeChsLHQsZSxuLHUsaSl9dD1jLGE9Zix1PVMsZCE9bnVsbD9SYShsLCEhYSxkLCExKTohIXUhPSEhYSYmKHQhPW51bGw/UmEobCwhIWEsdCwhMCk6UmEobCwhIWEsYT9bXToiIiwhMSkpO3JldHVybjtjYXNlInRleHRhcmVhIjpTPWQ9bnVsbDtmb3IoYyBpbiBhKWlmKGU9YVtjXSxhLmhhc093blByb3BlcnR5KGMpJiZlIT1udWxsJiYhdS5oYXNPd25Qcm9wZXJ0eShjKSlzd2l0Y2goYyl7Y2FzZSJ2YWx1ZSI6YnJlYWs7Y2FzZSJjaGlsZHJlbiI6YnJlYWs7ZGVmYXVsdDp4KGwsdCxjLG51bGwsdSxlKX1mb3IoZiBpbiB1KWlmKGU9dVtmXSxuPWFbZl0sdS5oYXNPd25Qcm9wZXJ0eShmKSYmKGUhPW51bGx8fG4hPW51bGwpKXN3aXRjaChmKXtjYXNlInZhbHVlIjpkPWU7YnJlYWs7Y2FzZSJkZWZhdWx0VmFsdWUiOlM9ZTticmVhaztjYXNlImNoaWxkcmVuIjpicmVhaztjYXNlImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIjppZihlIT1udWxsKXRocm93IEVycm9yKHMoOTEpKTticmVhaztkZWZhdWx0OmUhPT1uJiZ4KGwsdCxmLGUsdSxuKX1NaShsLGQsUyk7cmV0dXJuO2Nhc2Uib3B0aW9uIjpmb3IodmFyIEUgaW4gYSlpZihkPWFbRV0sYS5oYXNPd25Qcm9wZXJ0eShFKSYmZCE9bnVsbCYmIXUuaGFzT3duUHJvcGVydHkoRSkpc3dpdGNoKEUpe2Nhc2Uic2VsZWN0ZWQiOmwuc2VsZWN0ZWQ9ITE7YnJlYWs7ZGVmYXVsdDp4KGwsdCxFLG51bGwsdSxkKX1mb3IoaSBpbiB1KWlmKGQ9dVtpXSxTPWFbaV0sdS5oYXNPd25Qcm9wZXJ0eShpKSYmZCE9PVMmJihkIT1udWxsfHxTIT1udWxsKSlzd2l0Y2goaSl7Y2FzZSJzZWxlY3RlZCI6bC5zZWxlY3RlZD1kJiZ0eXBlb2YgZCE9ImZ1bmN0aW9uIiYmdHlwZW9mIGQhPSJzeW1ib2wiO2JyZWFrO2RlZmF1bHQ6eChsLHQsaSxkLHUsUyl9cmV0dXJuO2Nhc2UiaW1nIjpjYXNlImxpbmsiOmNhc2UiYXJlYSI6Y2FzZSJiYXNlIjpjYXNlImJyIjpjYXNlImNvbCI6Y2FzZSJlbWJlZCI6Y2FzZSJociI6Y2FzZSJrZXlnZW4iOmNhc2UibWV0YSI6Y2FzZSJwYXJhbSI6Y2FzZSJzb3VyY2UiOmNhc2UidHJhY2siOmNhc2Uid2JyIjpjYXNlIm1lbnVpdGVtIjpmb3IodmFyIEQgaW4gYSlkPWFbRF0sYS5oYXNPd25Qcm9wZXJ0eShEKSYmZCE9bnVsbCYmIXUuaGFzT3duUHJvcGVydHkoRCkmJngobCx0LEQsbnVsbCx1LGQpO2ZvcihoIGluIHUpaWYoZD11W2hdLFM9YVtoXSx1Lmhhc093blByb3BlcnR5KGgpJiZkIT09UyYmKGQhPW51bGx8fFMhPW51bGwpKXN3aXRjaChoKXtjYXNlImNoaWxkcmVuIjpjYXNlImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIjppZihkIT1udWxsKXRocm93IEVycm9yKHMoMTM3LHQpKTticmVhaztkZWZhdWx0OngobCx0LGgsZCx1LFMpfXJldHVybjtkZWZhdWx0OmlmKHJuKHQpKXtmb3IodmFyIEwgaW4gYSlkPWFbTF0sYS5oYXNPd25Qcm9wZXJ0eShMKSYmZCE9PXZvaWQgMCYmIXUuaGFzT3duUHJvcGVydHkoTCkmJlpjKGwsdCxMLHZvaWQgMCx1LGQpO2ZvcihnIGluIHUpZD11W2ddLFM9YVtnXSwhdS5oYXNPd25Qcm9wZXJ0eShnKXx8ZD09PVN8fGQ9PT12b2lkIDAmJlM9PT12b2lkIDB8fFpjKGwsdCxnLGQsdSxTKTtyZXR1cm59fWZvcih2YXIgeSBpbiBhKWQ9YVt5XSxhLmhhc093blByb3BlcnR5KHkpJiZkIT1udWxsJiYhdS5oYXNPd25Qcm9wZXJ0eSh5KSYmeChsLHQseSxudWxsLHUsZCk7Zm9yKEEgaW4gdSlkPXVbQV0sUz1hW0FdLCF1Lmhhc093blByb3BlcnR5KEEpfHxkPT09U3x8ZD09bnVsbCYmUz09bnVsbHx8eChsLHQsQSxkLHUsUyl9ZnVuY3Rpb24gXzEobCl7c3dpdGNoKGwpe2Nhc2UiY3NzIjpjYXNlInNjcmlwdCI6Y2FzZSJmb250IjpjYXNlImltZyI6Y2FzZSJpbWFnZSI6Y2FzZSJpbnB1dCI6Y2FzZSJsaW5rIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBpaCgpe2lmKHR5cGVvZiBwZXJmb3JtYW5jZS5nZXRFbnRyaWVzQnlUeXBlPT0iZnVuY3Rpb24iKXtmb3IodmFyIGw9MCx0PTAsYT1wZXJmb3JtYW5jZS5nZXRFbnRyaWVzQnlUeXBlKCJyZXNvdXJjZSIpLHU9MDt1PGEubGVuZ3RoO3UrKyl7dmFyIGU9YVt1XSxuPWUudHJhbnNmZXJTaXplLGY9ZS5pbml0aWF0b3JUeXBlLGM9ZS5kdXJhdGlvbjtpZihuJiZjJiZfMShmKSl7Zm9yKGY9MCxjPWUucmVzcG9uc2VFbmQsdSs9MTt1PGEubGVuZ3RoO3UrKyl7dmFyIGk9YVt1XSxoPWkuc3RhcnRUaW1lO2lmKGg+YylicmVhazt2YXIgZz1pLnRyYW5zZmVyU2l6ZSxBPWkuaW5pdGlhdG9yVHlwZTtnJiZfMShBKSYmKGk9aS5yZXNwb25zZUVuZCxmKz1nKihpPGM/MTooYy1oKS8oaS1oKSkpfWlmKC0tdSx0Kz04KihuK2YpLyhlLmR1cmF0aW9uLzFlMyksbCsrLDEwPGwpYnJlYWt9fWlmKDA8bClyZXR1cm4gdC9sLzFlNn1yZXR1cm4gbmF2aWdhdG9yLmNvbm5lY3Rpb24mJihsPW5hdmlnYXRvci5jb25uZWN0aW9uLmRvd25saW5rLHR5cGVvZiBsPT0ibnVtYmVyIik/bDo1fXZhciBSYz1udWxsLGpjPW51bGw7ZnVuY3Rpb24gb24obCl7cmV0dXJuIGwubm9kZVR5cGU9PT05P2w6bC5vd25lckRvY3VtZW50fWZ1bmN0aW9uIEgxKGwpe3N3aXRjaChsKXtjYXNlImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIjpyZXR1cm4gMTtjYXNlImh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiOnJldHVybiAyO2RlZmF1bHQ6cmV0dXJuIDB9fWZ1bmN0aW9uIE4xKGwsdCl7aWYobD09PTApc3dpdGNoKHQpe2Nhc2Uic3ZnIjpyZXR1cm4gMTtjYXNlIm1hdGgiOnJldHVybiAyO2RlZmF1bHQ6cmV0dXJuIDB9cmV0dXJuIGw9PT0xJiZ0PT09ImZvcmVpZ25PYmplY3QiPzA6bH1mdW5jdGlvbiBWYyhsLHQpe3JldHVybiBsPT09InRleHRhcmVhInx8bD09PSJub3NjcmlwdCJ8fHR5cGVvZiB0LmNoaWxkcmVuPT0ic3RyaW5nInx8dHlwZW9mIHQuY2hpbGRyZW49PSJudW1iZXIifHx0eXBlb2YgdC5jaGlsZHJlbj09ImJpZ2ludCJ8fHR5cGVvZiB0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPT0ib2JqZWN0IiYmdC5kYW5nZXJvdXNseVNldElubmVySFRNTCE9PW51bGwmJnQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwuX19odG1sIT1udWxsfXZhciBwYz1udWxsO2Z1bmN0aW9uIHZoKCl7dmFyIGw9d2luZG93LmV2ZW50O3JldHVybiBsJiZsLnR5cGU9PT0icG9wc3RhdGUiP2w9PT1wYz8hMToocGM9bCwhMCk6KHBjPW51bGwsITEpfXZhciBxMT10eXBlb2Ygc2V0VGltZW91dD09ImZ1bmN0aW9uIj9zZXRUaW1lb3V0OnZvaWQgMCx5aD10eXBlb2YgY2xlYXJUaW1lb3V0PT0iZnVuY3Rpb24iP2NsZWFyVGltZW91dDp2b2lkIDAsQjE9dHlwZW9mIFByb21pc2U9PSJmdW5jdGlvbiI/UHJvbWlzZTp2b2lkIDAsbWg9dHlwZW9mIHF1ZXVlTWljcm90YXNrPT0iZnVuY3Rpb24iP3F1ZXVlTWljcm90YXNrOnR5cGVvZiBCMTwidSI/ZnVuY3Rpb24obCl7cmV0dXJuIEIxLnJlc29sdmUobnVsbCkudGhlbihsKS5jYXRjaChoaCl9OnExO2Z1bmN0aW9uIGhoKGwpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyBsfSl9ZnVuY3Rpb24gUHQobCl7cmV0dXJuIGw9PT0iaGVhZCJ9ZnVuY3Rpb24gWTEobCx0KXt2YXIgYT10LHU9MDtkb3t2YXIgZT1hLm5leHRTaWJsaW5nO2lmKGwucmVtb3ZlQ2hpbGQoYSksZSYmZS5ub2RlVHlwZT09PTgpaWYoYT1lLmRhdGEsYT09PSIvJCJ8fGE9PT0iLyYiKXtpZih1PT09MCl7bC5yZW1vdmVDaGlsZChlKSxndSh0KTtyZXR1cm59dS0tfWVsc2UgaWYoYT09PSIkInx8YT09PSIkPyJ8fGE9PT0iJH4ifHxhPT09IiQhInx8YT09PSImIil1Kys7ZWxzZSBpZihhPT09Imh0bWwiKWVlKGwub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO2Vsc2UgaWYoYT09PSJoZWFkIil7YT1sLm93bmVyRG9jdW1lbnQuaGVhZCxlZShhKTtmb3IodmFyIG49YS5maXJzdENoaWxkO247KXt2YXIgZj1uLm5leHRTaWJsaW5nLGM9bi5ub2RlTmFtZTtuW0V1XXx8Yz09PSJTQ1JJUFQifHxjPT09IlNUWUxFInx8Yz09PSJMSU5LIiYmbi5yZWwudG9Mb3dlckNhc2UoKT09PSJzdHlsZXNoZWV0Inx8YS5yZW1vdmVDaGlsZChuKSxuPWZ9fWVsc2UgYT09PSJib2R5IiYmZWUobC5vd25lckRvY3VtZW50LmJvZHkpO2E9ZX13aGlsZShhKTtndSh0KX1mdW5jdGlvbiBRMShsLHQpe3ZhciBhPWw7bD0wO2Rve3ZhciB1PWEubmV4dFNpYmxpbmc7aWYoYS5ub2RlVHlwZT09PTE/dD8oYS5fc3Rhc2hlZERpc3BsYXk9YS5zdHlsZS5kaXNwbGF5LGEuc3R5bGUuZGlzcGxheT0ibm9uZSIpOihhLnN0eWxlLmRpc3BsYXk9YS5fc3Rhc2hlZERpc3BsYXl8fCIiLGEuZ2V0QXR0cmlidXRlKCJzdHlsZSIpPT09IiImJmEucmVtb3ZlQXR0cmlidXRlKCJzdHlsZSIpKTphLm5vZGVUeXBlPT09MyYmKHQ/KGEuX3N0YXNoZWRUZXh0PWEubm9kZVZhbHVlLGEubm9kZVZhbHVlPSIiKTphLm5vZGVWYWx1ZT1hLl9zdGFzaGVkVGV4dHx8IiIpLHUmJnUubm9kZVR5cGU9PT04KWlmKGE9dS5kYXRhLGE9PT0iLyQiKXtpZihsPT09MClicmVhaztsLS19ZWxzZSBhIT09IiQiJiZhIT09IiQ/IiYmYSE9PSIkfiImJmEhPT0iJCEifHxsKys7YT11fXdoaWxlKGEpfWZ1bmN0aW9uIEtjKGwpe3ZhciB0PWwuZmlyc3RDaGlsZDtmb3IodCYmdC5ub2RlVHlwZT09PTEwJiYodD10Lm5leHRTaWJsaW5nKTt0Oyl7dmFyIGE9dDtzd2l0Y2godD10Lm5leHRTaWJsaW5nLGEubm9kZU5hbWUpe2Nhc2UiSFRNTCI6Y2FzZSJIRUFEIjpjYXNlIkJPRFkiOktjKGEpLFduKGEpO2NvbnRpbnVlO2Nhc2UiU0NSSVBUIjpjYXNlIlNUWUxFIjpjb250aW51ZTtjYXNlIkxJTksiOmlmKGEucmVsLnRvTG93ZXJDYXNlKCk9PT0ic3R5bGVzaGVldCIpY29udGludWV9bC5yZW1vdmVDaGlsZChhKX19ZnVuY3Rpb24gZGgobCx0LGEsdSl7Zm9yKDtsLm5vZGVUeXBlPT09MTspe3ZhciBlPWE7aWYobC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09dC50b0xvd2VyQ2FzZSgpKXtpZighdSYmKGwubm9kZU5hbWUhPT0iSU5QVVQifHxsLnR5cGUhPT0iaGlkZGVuIikpYnJlYWt9ZWxzZSBpZih1KXtpZighbFtFdV0pc3dpdGNoKHQpe2Nhc2UibWV0YSI6aWYoIWwuaGFzQXR0cmlidXRlKCJpdGVtcHJvcCIpKWJyZWFrO3JldHVybiBsO2Nhc2UibGluayI6aWYobj1sLmdldEF0dHJpYnV0ZSgicmVsIiksbj09PSJzdHlsZXNoZWV0IiYmbC5oYXNBdHRyaWJ1dGUoImRhdGEtcHJlY2VkZW5jZSIpKWJyZWFrO2lmKG4hPT1lLnJlbHx8bC5nZXRBdHRyaWJ1dGUoImhyZWYiKSE9PShlLmhyZWY9PW51bGx8fGUuaHJlZj09PSIiP251bGw6ZS5ocmVmKXx8bC5nZXRBdHRyaWJ1dGUoImNyb3Nzb3JpZ2luIikhPT0oZS5jcm9zc09yaWdpbj09bnVsbD9udWxsOmUuY3Jvc3NPcmlnaW4pfHxsLmdldEF0dHJpYnV0ZSgidGl0bGUiKSE9PShlLnRpdGxlPT1udWxsP251bGw6ZS50aXRsZSkpYnJlYWs7cmV0dXJuIGw7Y2FzZSJzdHlsZSI6aWYobC5oYXNBdHRyaWJ1dGUoImRhdGEtcHJlY2VkZW5jZSIpKWJyZWFrO3JldHVybiBsO2Nhc2Uic2NyaXB0IjppZihuPWwuZ2V0QXR0cmlidXRlKCJzcmMiKSwobiE9PShlLnNyYz09bnVsbD9udWxsOmUuc3JjKXx8bC5nZXRBdHRyaWJ1dGUoInR5cGUiKSE9PShlLnR5cGU9PW51bGw/bnVsbDplLnR5cGUpfHxsLmdldEF0dHJpYnV0ZSgiY3Jvc3NvcmlnaW4iKSE9PShlLmNyb3NzT3JpZ2luPT1udWxsP251bGw6ZS5jcm9zc09yaWdpbikpJiZuJiZsLmhhc0F0dHJpYnV0ZSgiYXN5bmMiKSYmIWwuaGFzQXR0cmlidXRlKCJpdGVtcHJvcCIpKWJyZWFrO3JldHVybiBsO2RlZmF1bHQ6cmV0dXJuIGx9fWVsc2UgaWYodD09PSJpbnB1dCImJmwudHlwZT09PSJoaWRkZW4iKXt2YXIgbj1lLm5hbWU9PW51bGw/bnVsbDoiIitlLm5hbWU7aWYoZS50eXBlPT09ImhpZGRlbiImJmwuZ2V0QXR0cmlidXRlKCJuYW1lIik9PT1uKXJldHVybiBsfWVsc2UgcmV0dXJuIGw7aWYobD1rbChsLm5leHRTaWJsaW5nKSxsPT09bnVsbClicmVha31yZXR1cm4gbnVsbH1mdW5jdGlvbiBTaChsLHQsYSl7aWYodD09PSIiKXJldHVybiBudWxsO2Zvcig7bC5ub2RlVHlwZSE9PTM7KWlmKChsLm5vZGVUeXBlIT09MXx8bC5ub2RlTmFtZSE9PSJJTlBVVCJ8fGwudHlwZSE9PSJoaWRkZW4iKSYmIWF8fChsPWtsKGwubmV4dFNpYmxpbmcpLGw9PT1udWxsKSlyZXR1cm4gbnVsbDtyZXR1cm4gbH1mdW5jdGlvbiBYMShsLHQpe2Zvcig7bC5ub2RlVHlwZSE9PTg7KWlmKChsLm5vZGVUeXBlIT09MXx8bC5ub2RlTmFtZSE9PSJJTlBVVCJ8fGwudHlwZSE9PSJoaWRkZW4iKSYmIXR8fChsPWtsKGwubmV4dFNpYmxpbmcpLGw9PT1udWxsKSlyZXR1cm4gbnVsbDtyZXR1cm4gbH1mdW5jdGlvbiB4YyhsKXtyZXR1cm4gbC5kYXRhPT09IiQ/Inx8bC5kYXRhPT09IiR+In1mdW5jdGlvbiBMYyhsKXtyZXR1cm4gbC5kYXRhPT09IiQhInx8bC5kYXRhPT09IiQ/IiYmbC5vd25lckRvY3VtZW50LnJlYWR5U3RhdGUhPT0ibG9hZGluZyJ9ZnVuY3Rpb24gc2gobCx0KXt2YXIgYT1sLm93bmVyRG9jdW1lbnQ7aWYobC5kYXRhPT09IiR+IilsLl9yZWFjdFJldHJ5PXQ7ZWxzZSBpZihsLmRhdGEhPT0iJD8ifHxhLnJlYWR5U3RhdGUhPT0ibG9hZGluZyIpdCgpO2Vsc2V7dmFyIHU9ZnVuY3Rpb24oKXt0KCksYS5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIix1KX07YS5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIix1KSxsLl9yZWFjdFJldHJ5PXV9fWZ1bmN0aW9uIGtsKGwpe2Zvcig7bCE9bnVsbDtsPWwubmV4dFNpYmxpbmcpe3ZhciB0PWwubm9kZVR5cGU7aWYodD09PTF8fHQ9PT0zKWJyZWFrO2lmKHQ9PT04KXtpZih0PWwuZGF0YSx0PT09IiQifHx0PT09IiQhInx8dD09PSIkPyJ8fHQ9PT0iJH4ifHx0PT09IiYifHx0PT09IkYhInx8dD09PSJGIilicmVhaztpZih0PT09Ii8kInx8dD09PSIvJiIpcmV0dXJuIG51bGx9fXJldHVybiBsfXZhciBKYz1udWxsO2Z1bmN0aW9uIEcxKGwpe2w9bC5uZXh0U2libGluZztmb3IodmFyIHQ9MDtsOyl7aWYobC5ub2RlVHlwZT09PTgpe3ZhciBhPWwuZGF0YTtpZihhPT09Ii8kInx8YT09PSIvJiIpe2lmKHQ9PT0wKXJldHVybiBrbChsLm5leHRTaWJsaW5nKTt0LS19ZWxzZSBhIT09IiQiJiZhIT09IiQhIiYmYSE9PSIkPyImJmEhPT0iJH4iJiZhIT09IiYifHx0Kyt9bD1sLm5leHRTaWJsaW5nfXJldHVybiBudWxsfWZ1bmN0aW9uIEMxKGwpe2w9bC5wcmV2aW91c1NpYmxpbmc7Zm9yKHZhciB0PTA7bDspe2lmKGwubm9kZVR5cGU9PT04KXt2YXIgYT1sLmRhdGE7aWYoYT09PSIkInx8YT09PSIkISJ8fGE9PT0iJD8ifHxhPT09IiR+Inx8YT09PSImIil7aWYodD09PTApcmV0dXJuIGw7dC0tfWVsc2UgYSE9PSIvJCImJmEhPT0iLyYifHx0Kyt9bD1sLnByZXZpb3VzU2libGluZ31yZXR1cm4gbnVsbH1mdW5jdGlvbiBaMShsLHQsYSl7c3dpdGNoKHQ9b24oYSksbCl7Y2FzZSJodG1sIjppZihsPXQuZG9jdW1lbnRFbGVtZW50LCFsKXRocm93IEVycm9yKHMoNDUyKSk7cmV0dXJuIGw7Y2FzZSJoZWFkIjppZihsPXQuaGVhZCwhbCl0aHJvdyBFcnJvcihzKDQ1MykpO3JldHVybiBsO2Nhc2UiYm9keSI6aWYobD10LmJvZHksIWwpdGhyb3cgRXJyb3Iocyg0NTQpKTtyZXR1cm4gbDtkZWZhdWx0OnRocm93IEVycm9yKHMoNDUxKSl9fWZ1bmN0aW9uIGVlKGwpe2Zvcih2YXIgdD1sLmF0dHJpYnV0ZXM7dC5sZW5ndGg7KWwucmVtb3ZlQXR0cmlidXRlTm9kZSh0WzBdKTtXbihsKX12YXIgSWw9bmV3IE1hcCxSMT1uZXcgU2V0O2Z1bmN0aW9uIEVuKGwpe3JldHVybiB0eXBlb2YgbC5nZXRSb290Tm9kZT09ImZ1bmN0aW9uIj9sLmdldFJvb3ROb2RlKCk6bC5ub2RlVHlwZT09PTk/bDpsLm93bmVyRG9jdW1lbnR9dmFyIHF0PW8uZDtvLmQ9e2Y6Z2gscjpiaCxEOnpoLEM6QWgsTDpUaCxtOm9oLFg6TWgsUzpFaCxNOk9ofTtmdW5jdGlvbiBnaCgpe3ZhciBsPXF0LmYoKSx0PWRuKCk7cmV0dXJuIGx8fHR9ZnVuY3Rpb24gYmgobCl7dmFyIHQ9R2EobCk7dCE9PW51bGwmJnQudGFnPT09NSYmdC50eXBlPT09ImZvcm0iP3R2KHQpOnF0LnIobCl9dmFyIGR1PXR5cGVvZiBkb2N1bWVudD4idSI/bnVsbDpkb2N1bWVudDtmdW5jdGlvbiBqMShsLHQsYSl7dmFyIHU9ZHU7aWYodSYmdHlwZW9mIHQ9PSJzdHJpbmciJiZ0KXt2YXIgZT1MbCh0KTtlPSdsaW5rW3JlbD0iJytsKyciXVtocmVmPSInK2UrJyJdJyx0eXBlb2YgYT09InN0cmluZyImJihlKz0nW2Nyb3Nzb3JpZ2luPSInK2ErJyJdJyksUjEuaGFzKGUpfHwoUjEuYWRkKGUpLGw9e3JlbDpsLGNyb3NzT3JpZ2luOmEsaHJlZjp0fSx1LnF1ZXJ5U2VsZWN0b3IoZSk9PT1udWxsJiYodD11LmNyZWF0ZUVsZW1lbnQoImxpbmsiKSxibCh0LCJsaW5rIixsKSxtbCh0KSx1LmhlYWQuYXBwZW5kQ2hpbGQodCkpKX19ZnVuY3Rpb24gemgobCl7cXQuRChsKSxqMSgiZG5zLXByZWZldGNoIixsLG51bGwpfWZ1bmN0aW9uIEFoKGwsdCl7cXQuQyhsLHQpLGoxKCJwcmVjb25uZWN0IixsLHQpfWZ1bmN0aW9uIFRoKGwsdCxhKXtxdC5MKGwsdCxhKTt2YXIgdT1kdTtpZih1JiZsJiZ0KXt2YXIgZT0nbGlua1tyZWw9InByZWxvYWQiXVthcz0iJytMbCh0KSsnIl0nO3Q9PT0iaW1hZ2UiJiZhJiZhLmltYWdlU3JjU2V0PyhlKz0nW2ltYWdlc3Jjc2V0PSInK0xsKGEuaW1hZ2VTcmNTZXQpKyciXScsdHlwZW9mIGEuaW1hZ2VTaXplcz09InN0cmluZyImJihlKz0nW2ltYWdlc2l6ZXM9IicrTGwoYS5pbWFnZVNpemVzKSsnIl0nKSk6ZSs9J1tocmVmPSInK0xsKGwpKyciXSc7dmFyIG49ZTtzd2l0Y2godCl7Y2FzZSJzdHlsZSI6bj1TdShsKTticmVhaztjYXNlInNjcmlwdCI6bj1zdShsKX1JbC5oYXMobil8fChsPV8oe3JlbDoicHJlbG9hZCIsaHJlZjp0PT09ImltYWdlIiYmYSYmYS5pbWFnZVNyY1NldD92b2lkIDA6bCxhczp0fSxhKSxJbC5zZXQobixsKSx1LnF1ZXJ5U2VsZWN0b3IoZSkhPT1udWxsfHx0PT09InN0eWxlIiYmdS5xdWVyeVNlbGVjdG9yKG5lKG4pKXx8dD09PSJzY3JpcHQiJiZ1LnF1ZXJ5U2VsZWN0b3IoZmUobikpfHwodD11LmNyZWF0ZUVsZW1lbnQoImxpbmsiKSxibCh0LCJsaW5rIixsKSxtbCh0KSx1LmhlYWQuYXBwZW5kQ2hpbGQodCkpKX19ZnVuY3Rpb24gb2gobCx0KXtxdC5tKGwsdCk7dmFyIGE9ZHU7aWYoYSYmbCl7dmFyIHU9dCYmdHlwZW9mIHQuYXM9PSJzdHJpbmciP3QuYXM6InNjcmlwdCIsZT0nbGlua1tyZWw9Im1vZHVsZXByZWxvYWQiXVthcz0iJytMbCh1KSsnIl1baHJlZj0iJytMbChsKSsnIl0nLG49ZTtzd2l0Y2godSl7Y2FzZSJhdWRpb3dvcmtsZXQiOmNhc2UicGFpbnR3b3JrbGV0IjpjYXNlInNlcnZpY2V3b3JrZXIiOmNhc2Uic2hhcmVkd29ya2VyIjpjYXNlIndvcmtlciI6Y2FzZSJzY3JpcHQiOm49c3UobCl9aWYoIUlsLmhhcyhuKSYmKGw9Xyh7cmVsOiJtb2R1bGVwcmVsb2FkIixocmVmOmx9LHQpLElsLnNldChuLGwpLGEucXVlcnlTZWxlY3RvcihlKT09PW51bGwpKXtzd2l0Y2godSl7Y2FzZSJhdWRpb3dvcmtsZXQiOmNhc2UicGFpbnR3b3JrbGV0IjpjYXNlInNlcnZpY2V3b3JrZXIiOmNhc2Uic2hhcmVkd29ya2VyIjpjYXNlIndvcmtlciI6Y2FzZSJzY3JpcHQiOmlmKGEucXVlcnlTZWxlY3RvcihmZShuKSkpcmV0dXJufXU9YS5jcmVhdGVFbGVtZW50KCJsaW5rIiksYmwodSwibGluayIsbCksbWwodSksYS5oZWFkLmFwcGVuZENoaWxkKHUpfX19ZnVuY3Rpb24gRWgobCx0LGEpe3F0LlMobCx0LGEpO3ZhciB1PWR1O2lmKHUmJmwpe3ZhciBlPUNhKHUpLmhvaXN0YWJsZVN0eWxlcyxuPVN1KGwpO3Q9dHx8ImRlZmF1bHQiO3ZhciBmPWUuZ2V0KG4pO2lmKCFmKXt2YXIgYz17bG9hZGluZzowLHByZWxvYWQ6bnVsbH07aWYoZj11LnF1ZXJ5U2VsZWN0b3IobmUobikpKWMubG9hZGluZz01O2Vsc2V7bD1fKHtyZWw6InN0eWxlc2hlZXQiLGhyZWY6bCwiZGF0YS1wcmVjZWRlbmNlIjp0fSxhKSwoYT1JbC5nZXQobikpJiZXYyhsLGEpO3ZhciBpPWY9dS5jcmVhdGVFbGVtZW50KCJsaW5rIik7bWwoaSksYmwoaSwibGluayIsbCksaS5fcD1uZXcgUHJvbWlzZShmdW5jdGlvbihoLGcpe2kub25sb2FkPWgsaS5vbmVycm9yPWd9KSxpLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGZ1bmN0aW9uKCl7Yy5sb2FkaW5nfD0xfSksaS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtjLmxvYWRpbmd8PTJ9KSxjLmxvYWRpbmd8PTQsTW4oZix0LHUpfWY9e3R5cGU6InN0eWxlc2hlZXQiLGluc3RhbmNlOmYsY291bnQ6MSxzdGF0ZTpjfSxlLnNldChuLGYpfX19ZnVuY3Rpb24gTWgobCx0KXtxdC5YKGwsdCk7dmFyIGE9ZHU7aWYoYSYmbCl7dmFyIHU9Q2EoYSkuaG9pc3RhYmxlU2NyaXB0cyxlPXN1KGwpLG49dS5nZXQoZSk7bnx8KG49YS5xdWVyeVNlbGVjdG9yKGZlKGUpKSxufHwobD1fKHtzcmM6bCxhc3luYzohMH0sdCksKHQ9SWwuZ2V0KGUpKSYmd2MobCx0KSxuPWEuY3JlYXRlRWxlbWVudCgic2NyaXB0IiksbWwobiksYmwobiwibGluayIsbCksYS5oZWFkLmFwcGVuZENoaWxkKG4pKSxuPXt0eXBlOiJzY3JpcHQiLGluc3RhbmNlOm4sY291bnQ6MSxzdGF0ZTpudWxsfSx1LnNldChlLG4pKX19ZnVuY3Rpb24gT2gobCx0KXtxdC5NKGwsdCk7dmFyIGE9ZHU7aWYoYSYmbCl7dmFyIHU9Q2EoYSkuaG9pc3RhYmxlU2NyaXB0cyxlPXN1KGwpLG49dS5nZXQoZSk7bnx8KG49YS5xdWVyeVNlbGVjdG9yKGZlKGUpKSxufHwobD1fKHtzcmM6bCxhc3luYzohMCx0eXBlOiJtb2R1bGUifSx0KSwodD1JbC5nZXQoZSkpJiZ3YyhsLHQpLG49YS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxtbChuKSxibChuLCJsaW5rIixsKSxhLmhlYWQuYXBwZW5kQ2hpbGQobikpLG49e3R5cGU6InNjcmlwdCIsaW5zdGFuY2U6bixjb3VudDoxLHN0YXRlOm51bGx9LHUuc2V0KGUsbikpfX1mdW5jdGlvbiBWMShsLHQsYSx1KXt2YXIgZT0oZT1RdC5jdXJyZW50KT9FbihlKTpudWxsO2lmKCFlKXRocm93IEVycm9yKHMoNDQ2KSk7c3dpdGNoKGwpe2Nhc2UibWV0YSI6Y2FzZSJ0aXRsZSI6cmV0dXJuIG51bGw7Y2FzZSJzdHlsZSI6cmV0dXJuIHR5cGVvZiBhLnByZWNlZGVuY2U9PSJzdHJpbmciJiZ0eXBlb2YgYS5ocmVmPT0ic3RyaW5nIj8odD1TdShhLmhyZWYpLGE9Q2EoZSkuaG9pc3RhYmxlU3R5bGVzLHU9YS5nZXQodCksdXx8KHU9e3R5cGU6InN0eWxlIixpbnN0YW5jZTpudWxsLGNvdW50OjAsc3RhdGU6bnVsbH0sYS5zZXQodCx1KSksdSk6e3R5cGU6InZvaWQiLGluc3RhbmNlOm51bGwsY291bnQ6MCxzdGF0ZTpudWxsfTtjYXNlImxpbmsiOmlmKGEucmVsPT09InN0eWxlc2hlZXQiJiZ0eXBlb2YgYS5ocmVmPT0ic3RyaW5nIiYmdHlwZW9mIGEucHJlY2VkZW5jZT09InN0cmluZyIpe2w9U3UoYS5ocmVmKTt2YXIgbj1DYShlKS5ob2lzdGFibGVTdHlsZXMsZj1uLmdldChsKTtpZihmfHwoZT1lLm93bmVyRG9jdW1lbnR8fGUsZj17dHlwZToic3R5bGVzaGVldCIsaW5zdGFuY2U6bnVsbCxjb3VudDowLHN0YXRlOntsb2FkaW5nOjAscHJlbG9hZDpudWxsfX0sbi5zZXQobCxmKSwobj1lLnF1ZXJ5U2VsZWN0b3IobmUobCkpKSYmIW4uX3AmJihmLmluc3RhbmNlPW4sZi5zdGF0ZS5sb2FkaW5nPTUpLElsLmhhcyhsKXx8KGE9e3JlbDoicHJlbG9hZCIsYXM6InN0eWxlIixocmVmOmEuaHJlZixjcm9zc09yaWdpbjphLmNyb3NzT3JpZ2luLGludGVncml0eTphLmludGVncml0eSxtZWRpYTphLm1lZGlhLGhyZWZMYW5nOmEuaHJlZkxhbmcscmVmZXJyZXJQb2xpY3k6YS5yZWZlcnJlclBvbGljeX0sSWwuc2V0KGwsYSksbnx8RGgoZSxsLGEsZi5zdGF0ZSkpKSx0JiZ1PT09bnVsbCl0aHJvdyBFcnJvcihzKDUyOCwiIikpO3JldHVybiBmfWlmKHQmJnUhPT1udWxsKXRocm93IEVycm9yKHMoNTI5LCIiKSk7cmV0dXJuIG51bGw7Y2FzZSJzY3JpcHQiOnJldHVybiB0PWEuYXN5bmMsYT1hLnNyYyx0eXBlb2YgYT09InN0cmluZyImJnQmJnR5cGVvZiB0IT0iZnVuY3Rpb24iJiZ0eXBlb2YgdCE9InN5bWJvbCI/KHQ9c3UoYSksYT1DYShlKS5ob2lzdGFibGVTY3JpcHRzLHU9YS5nZXQodCksdXx8KHU9e3R5cGU6InNjcmlwdCIsaW5zdGFuY2U6bnVsbCxjb3VudDowLHN0YXRlOm51bGx9LGEuc2V0KHQsdSkpLHUpOnt0eXBlOiJ2b2lkIixpbnN0YW5jZTpudWxsLGNvdW50OjAsc3RhdGU6bnVsbH07ZGVmYXVsdDp0aHJvdyBFcnJvcihzKDQ0NCxsKSl9fWZ1bmN0aW9uIFN1KGwpe3JldHVybidocmVmPSInK0xsKGwpKyciJ31mdW5jdGlvbiBuZShsKXtyZXR1cm4nbGlua1tyZWw9InN0eWxlc2hlZXQiXVsnK2wrIl0ifWZ1bmN0aW9uIHAxKGwpe3JldHVybiBfKHt9LGwseyJkYXRhLXByZWNlZGVuY2UiOmwucHJlY2VkZW5jZSxwcmVjZWRlbmNlOm51bGx9KX1mdW5jdGlvbiBEaChsLHQsYSx1KXtsLnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbcmVsPSJwcmVsb2FkIl1bYXM9InN0eWxlIl1bJyt0KyJdIik/dS5sb2FkaW5nPTE6KHQ9bC5jcmVhdGVFbGVtZW50KCJsaW5rIiksdS5wcmVsb2FkPXQsdC5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixmdW5jdGlvbigpe3JldHVybiB1LmxvYWRpbmd8PTF9KSx0LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe3JldHVybiB1LmxvYWRpbmd8PTJ9KSxibCh0LCJsaW5rIixhKSxtbCh0KSxsLmhlYWQuYXBwZW5kQ2hpbGQodCkpfWZ1bmN0aW9uIHN1KGwpe3JldHVybidbc3JjPSInK0xsKGwpKyciXSd9ZnVuY3Rpb24gZmUobCl7cmV0dXJuInNjcmlwdFthc3luY10iK2x9ZnVuY3Rpb24gSzEobCx0LGEpe2lmKHQuY291bnQrKyx0Lmluc3RhbmNlPT09bnVsbClzd2l0Y2godC50eXBlKXtjYXNlInN0eWxlIjp2YXIgdT1sLnF1ZXJ5U2VsZWN0b3IoJ3N0eWxlW2RhdGEtaHJlZn49IicrTGwoYS5ocmVmKSsnIl0nKTtpZih1KXJldHVybiB0Lmluc3RhbmNlPXUsbWwodSksdTt2YXIgZT1fKHt9LGEseyJkYXRhLWhyZWYiOmEuaHJlZiwiZGF0YS1wcmVjZWRlbmNlIjphLnByZWNlZGVuY2UsaHJlZjpudWxsLHByZWNlZGVuY2U6bnVsbH0pO3JldHVybiB1PShsLm93bmVyRG9jdW1lbnR8fGwpLmNyZWF0ZUVsZW1lbnQoInN0eWxlIiksbWwodSksYmwodSwic3R5bGUiLGUpLE1uKHUsYS5wcmVjZWRlbmNlLGwpLHQuaW5zdGFuY2U9dTtjYXNlInN0eWxlc2hlZXQiOmU9U3UoYS5ocmVmKTt2YXIgbj1sLnF1ZXJ5U2VsZWN0b3IobmUoZSkpO2lmKG4pcmV0dXJuIHQuc3RhdGUubG9hZGluZ3w9NCx0Lmluc3RhbmNlPW4sbWwobiksbjt1PXAxKGEpLChlPUlsLmdldChlKSkmJldjKHUsZSksbj0obC5vd25lckRvY3VtZW50fHxsKS5jcmVhdGVFbGVtZW50KCJsaW5rIiksbWwobik7dmFyIGY9bjtyZXR1cm4gZi5fcD1uZXcgUHJvbWlzZShmdW5jdGlvbihjLGkpe2Yub25sb2FkPWMsZi5vbmVycm9yPWl9KSxibChuLCJsaW5rIix1KSx0LnN0YXRlLmxvYWRpbmd8PTQsTW4obixhLnByZWNlZGVuY2UsbCksdC5pbnN0YW5jZT1uO2Nhc2Uic2NyaXB0IjpyZXR1cm4gbj1zdShhLnNyYyksKGU9bC5xdWVyeVNlbGVjdG9yKGZlKG4pKSk/KHQuaW5zdGFuY2U9ZSxtbChlKSxlKToodT1hLChlPUlsLmdldChuKSkmJih1PV8oe30sYSksd2ModSxlKSksbD1sLm93bmVyRG9jdW1lbnR8fGwsZT1sLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLG1sKGUpLGJsKGUsImxpbmsiLHUpLGwuaGVhZC5hcHBlbmRDaGlsZChlKSx0Lmluc3RhbmNlPWUpO2Nhc2Uidm9pZCI6cmV0dXJuIG51bGw7ZGVmYXVsdDp0aHJvdyBFcnJvcihzKDQ0Myx0LnR5cGUpKX1lbHNlIHQudHlwZT09PSJzdHlsZXNoZWV0IiYmKHQuc3RhdGUubG9hZGluZyY0KT09PTAmJih1PXQuaW5zdGFuY2UsdC5zdGF0ZS5sb2FkaW5nfD00LE1uKHUsYS5wcmVjZWRlbmNlLGwpKTtyZXR1cm4gdC5pbnN0YW5jZX1mdW5jdGlvbiBNbihsLHQsYSl7Zm9yKHZhciB1PWEucXVlcnlTZWxlY3RvckFsbCgnbGlua1tyZWw9InN0eWxlc2hlZXQiXVtkYXRhLXByZWNlZGVuY2VdLHN0eWxlW2RhdGEtcHJlY2VkZW5jZV0nKSxlPXUubGVuZ3RoP3VbdS5sZW5ndGgtMV06bnVsbCxuPWUsZj0wO2Y8dS5sZW5ndGg7ZisrKXt2YXIgYz11W2ZdO2lmKGMuZGF0YXNldC5wcmVjZWRlbmNlPT09dCluPWM7ZWxzZSBpZihuIT09ZSlicmVha31uP24ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobCxuLm5leHRTaWJsaW5nKToodD1hLm5vZGVUeXBlPT09OT9hLmhlYWQ6YSx0Lmluc2VydEJlZm9yZShsLHQuZmlyc3RDaGlsZCkpfWZ1bmN0aW9uIFdjKGwsdCl7bC5jcm9zc09yaWdpbj09bnVsbCYmKGwuY3Jvc3NPcmlnaW49dC5jcm9zc09yaWdpbiksbC5yZWZlcnJlclBvbGljeT09bnVsbCYmKGwucmVmZXJyZXJQb2xpY3k9dC5yZWZlcnJlclBvbGljeSksbC50aXRsZT09bnVsbCYmKGwudGl0bGU9dC50aXRsZSl9ZnVuY3Rpb24gd2MobCx0KXtsLmNyb3NzT3JpZ2luPT1udWxsJiYobC5jcm9zc09yaWdpbj10LmNyb3NzT3JpZ2luKSxsLnJlZmVycmVyUG9saWN5PT1udWxsJiYobC5yZWZlcnJlclBvbGljeT10LnJlZmVycmVyUG9saWN5KSxsLmludGVncml0eT09bnVsbCYmKGwuaW50ZWdyaXR5PXQuaW50ZWdyaXR5KX12YXIgT249bnVsbDtmdW5jdGlvbiB4MShsLHQsYSl7aWYoT249PT1udWxsKXt2YXIgdT1uZXcgTWFwLGU9T249bmV3IE1hcDtlLnNldChhLHUpfWVsc2UgZT1Pbix1PWUuZ2V0KGEpLHV8fCh1PW5ldyBNYXAsZS5zZXQoYSx1KSk7aWYodS5oYXMobCkpcmV0dXJuIHU7Zm9yKHUuc2V0KGwsbnVsbCksYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKGwpLGU9MDtlPGEubGVuZ3RoO2UrKyl7dmFyIG49YVtlXTtpZighKG5bRXVdfHxuW2RsXXx8bD09PSJsaW5rIiYmbi5nZXRBdHRyaWJ1dGUoInJlbCIpPT09InN0eWxlc2hlZXQiKSYmbi5uYW1lc3BhY2VVUkkhPT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciKXt2YXIgZj1uLmdldEF0dHJpYnV0ZSh0KXx8IiI7Zj1sK2Y7dmFyIGM9dS5nZXQoZik7Yz9jLnB1c2gobik6dS5zZXQoZixbbl0pfX1yZXR1cm4gdX1mdW5jdGlvbiBMMShsLHQsYSl7bD1sLm93bmVyRG9jdW1lbnR8fGwsbC5oZWFkLmluc2VydEJlZm9yZShhLHQ9PT0idGl0bGUiP2wucXVlcnlTZWxlY3RvcigiaGVhZCA+IHRpdGxlIik6bnVsbCl9ZnVuY3Rpb24gVWgobCx0LGEpe2lmKGE9PT0xfHx0Lml0ZW1Qcm9wIT1udWxsKXJldHVybiExO3N3aXRjaChsKXtjYXNlIm1ldGEiOmNhc2UidGl0bGUiOnJldHVybiEwO2Nhc2Uic3R5bGUiOmlmKHR5cGVvZiB0LnByZWNlZGVuY2UhPSJzdHJpbmcifHx0eXBlb2YgdC5ocmVmIT0ic3RyaW5nInx8dC5ocmVmPT09IiIpYnJlYWs7cmV0dXJuITA7Y2FzZSJsaW5rIjppZih0eXBlb2YgdC5yZWwhPSJzdHJpbmcifHx0eXBlb2YgdC5ocmVmIT0ic3RyaW5nInx8dC5ocmVmPT09IiJ8fHQub25Mb2FkfHx0Lm9uRXJyb3IpYnJlYWs7c3dpdGNoKHQucmVsKXtjYXNlInN0eWxlc2hlZXQiOnJldHVybiBsPXQuZGlzYWJsZWQsdHlwZW9mIHQucHJlY2VkZW5jZT09InN0cmluZyImJmw9PW51bGw7ZGVmYXVsdDpyZXR1cm4hMH1jYXNlInNjcmlwdCI6aWYodC5hc3luYyYmdHlwZW9mIHQuYXN5bmMhPSJmdW5jdGlvbiImJnR5cGVvZiB0LmFzeW5jIT0ic3ltYm9sIiYmIXQub25Mb2FkJiYhdC5vbkVycm9yJiZ0LnNyYyYmdHlwZW9mIHQuc3JjPT0ic3RyaW5nIilyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBKMShsKXtyZXR1cm4hKGwudHlwZT09PSJzdHlsZXNoZWV0IiYmKGwuc3RhdGUubG9hZGluZyYzKT09PTApfWZ1bmN0aW9uIF9oKGwsdCxhLHUpe2lmKGEudHlwZT09PSJzdHlsZXNoZWV0IiYmKHR5cGVvZiB1Lm1lZGlhIT0ic3RyaW5nInx8bWF0Y2hNZWRpYSh1Lm1lZGlhKS5tYXRjaGVzIT09ITEpJiYoYS5zdGF0ZS5sb2FkaW5nJjQpPT09MCl7aWYoYS5pbnN0YW5jZT09PW51bGwpe3ZhciBlPVN1KHUuaHJlZiksbj10LnF1ZXJ5U2VsZWN0b3IobmUoZSkpO2lmKG4pe3Q9bi5fcCx0IT09bnVsbCYmdHlwZW9mIHQ9PSJvYmplY3QiJiZ0eXBlb2YgdC50aGVuPT0iZnVuY3Rpb24iJiYobC5jb3VudCsrLGw9RG4uYmluZChsKSx0LnRoZW4obCxsKSksYS5zdGF0ZS5sb2FkaW5nfD00LGEuaW5zdGFuY2U9bixtbChuKTtyZXR1cm59bj10Lm93bmVyRG9jdW1lbnR8fHQsdT1wMSh1KSwoZT1JbC5nZXQoZSkpJiZXYyh1LGUpLG49bi5jcmVhdGVFbGVtZW50KCJsaW5rIiksbWwobik7dmFyIGY9bjtmLl9wPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGMsaSl7Zi5vbmxvYWQ9YyxmLm9uZXJyb3I9aX0pLGJsKG4sImxpbmsiLHUpLGEuaW5zdGFuY2U9bn1sLnN0eWxlc2hlZXRzPT09bnVsbCYmKGwuc3R5bGVzaGVldHM9bmV3IE1hcCksbC5zdHlsZXNoZWV0cy5zZXQoYSx0KSwodD1hLnN0YXRlLnByZWxvYWQpJiYoYS5zdGF0ZS5sb2FkaW5nJjMpPT09MCYmKGwuY291bnQrKyxhPURuLmJpbmQobCksdC5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixhKSx0LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixhKSl9fXZhciAkYz0wO2Z1bmN0aW9uIEhoKGwsdCl7cmV0dXJuIGwuc3R5bGVzaGVldHMmJmwuY291bnQ9PT0wJiZfbihsLGwuc3R5bGVzaGVldHMpLDA8bC5jb3VudHx8MDxsLmltZ0NvdW50P2Z1bmN0aW9uKGEpe3ZhciB1PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtpZihsLnN0eWxlc2hlZXRzJiZfbihsLGwuc3R5bGVzaGVldHMpLGwudW5zdXNwZW5kKXt2YXIgbj1sLnVuc3VzcGVuZDtsLnVuc3VzcGVuZD1udWxsLG4oKX19LDZlNCt0KTswPGwuaW1nQnl0ZXMmJiRjPT09MCYmKCRjPTYyNTAwKmloKCkpO3ZhciBlPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtpZihsLndhaXRpbmdGb3JJbWFnZXM9ITEsbC5jb3VudD09PTAmJihsLnN0eWxlc2hlZXRzJiZfbihsLGwuc3R5bGVzaGVldHMpLGwudW5zdXNwZW5kKSl7dmFyIG49bC51bnN1c3BlbmQ7bC51bnN1c3BlbmQ9bnVsbCxuKCl9fSwobC5pbWdCeXRlcz4kYz81MDo4MDApK3QpO3JldHVybiBsLnVuc3VzcGVuZD1hLGZ1bmN0aW9uKCl7bC51bnN1c3BlbmQ9bnVsbCxjbGVhclRpbWVvdXQodSksY2xlYXJUaW1lb3V0KGUpfX06bnVsbH1mdW5jdGlvbiBEbigpe2lmKHRoaXMuY291bnQtLSx0aGlzLmNvdW50PT09MCYmKHRoaXMuaW1nQ291bnQ9PT0wfHwhdGhpcy53YWl0aW5nRm9ySW1hZ2VzKSl7aWYodGhpcy5zdHlsZXNoZWV0cylfbih0aGlzLHRoaXMuc3R5bGVzaGVldHMpO2Vsc2UgaWYodGhpcy51bnN1c3BlbmQpe3ZhciBsPXRoaXMudW5zdXNwZW5kO3RoaXMudW5zdXNwZW5kPW51bGwsbCgpfX19dmFyIFVuPW51bGw7ZnVuY3Rpb24gX24obCx0KXtsLnN0eWxlc2hlZXRzPW51bGwsbC51bnN1c3BlbmQhPT1udWxsJiYobC5jb3VudCsrLFVuPW5ldyBNYXAsdC5mb3JFYWNoKE5oLGwpLFVuPW51bGwsRG4uY2FsbChsKSl9ZnVuY3Rpb24gTmgobCx0KXtpZighKHQuc3RhdGUubG9hZGluZyY0KSl7dmFyIGE9VW4uZ2V0KGwpO2lmKGEpdmFyIHU9YS5nZXQobnVsbCk7ZWxzZXthPW5ldyBNYXAsVW4uc2V0KGwsYSk7Zm9yKHZhciBlPWwucXVlcnlTZWxlY3RvckFsbCgibGlua1tkYXRhLXByZWNlZGVuY2VdLHN0eWxlW2RhdGEtcHJlY2VkZW5jZV0iKSxuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBmPWVbbl07KGYubm9kZU5hbWU9PT0iTElOSyJ8fGYuZ2V0QXR0cmlidXRlKCJtZWRpYSIpIT09Im5vdCBhbGwiKSYmKGEuc2V0KGYuZGF0YXNldC5wcmVjZWRlbmNlLGYpLHU9Zil9dSYmYS5zZXQobnVsbCx1KX1lPXQuaW5zdGFuY2UsZj1lLmdldEF0dHJpYnV0ZSgiZGF0YS1wcmVjZWRlbmNlIiksbj1hLmdldChmKXx8dSxuPT09dSYmYS5zZXQobnVsbCxlKSxhLnNldChmLGUpLHRoaXMuY291bnQrKyx1PURuLmJpbmQodGhpcyksZS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIix1KSxlLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix1KSxuP24ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSxuLm5leHRTaWJsaW5nKToobD1sLm5vZGVUeXBlPT09OT9sLmhlYWQ6bCxsLmluc2VydEJlZm9yZShlLGwuZmlyc3RDaGlsZCkpLHQuc3RhdGUubG9hZGluZ3w9NH19dmFyIGNlPXskJHR5cGVvZjpwbCxQcm92aWRlcjpudWxsLENvbnN1bWVyOm51bGwsX2N1cnJlbnRWYWx1ZTpVLF9jdXJyZW50VmFsdWUyOlUsX3RocmVhZENvdW50OjB9O2Z1bmN0aW9uIHFoKGwsdCxhLHUsZSxuLGYsYyxpKXt0aGlzLnRhZz0xLHRoaXMuY29udGFpbmVySW5mbz1sLHRoaXMucGluZ0NhY2hlPXRoaXMuY3VycmVudD10aGlzLnBlbmRpbmdDaGlsZHJlbj1udWxsLHRoaXMudGltZW91dEhhbmRsZT0tMSx0aGlzLmNhbGxiYWNrTm9kZT10aGlzLm5leHQ9dGhpcy5wZW5kaW5nQ29udGV4dD10aGlzLmNvbnRleHQ9dGhpcy5jYW5jZWxQZW5kaW5nQ29tbWl0PW51bGwsdGhpcy5jYWxsYmFja1ByaW9yaXR5PTAsdGhpcy5leHBpcmF0aW9uVGltZXM9S24oLTEpLHRoaXMuZW50YW5nbGVkTGFuZXM9dGhpcy5zaGVsbFN1c3BlbmRDb3VudGVyPXRoaXMuZXJyb3JSZWNvdmVyeURpc2FibGVkTGFuZXM9dGhpcy5leHBpcmVkTGFuZXM9dGhpcy53YXJtTGFuZXM9dGhpcy5waW5nZWRMYW5lcz10aGlzLnN1c3BlbmRlZExhbmVzPXRoaXMucGVuZGluZ0xhbmVzPTAsdGhpcy5lbnRhbmdsZW1lbnRzPUtuKDApLHRoaXMuaGlkZGVuVXBkYXRlcz1LbihudWxsKSx0aGlzLmlkZW50aWZpZXJQcmVmaXg9dSx0aGlzLm9uVW5jYXVnaHRFcnJvcj1lLHRoaXMub25DYXVnaHRFcnJvcj1uLHRoaXMub25SZWNvdmVyYWJsZUVycm9yPWYsdGhpcy5wb29sZWRDYWNoZT1udWxsLHRoaXMucG9vbGVkQ2FjaGVMYW5lcz0wLHRoaXMuZm9ybVN0YXRlPWksdGhpcy5pbmNvbXBsZXRlVHJhbnNpdGlvbnM9bmV3IE1hcH1mdW5jdGlvbiBXMShsLHQsYSx1LGUsbixmLGMsaSxoLGcsQSl7cmV0dXJuIGw9bmV3IHFoKGwsdCxhLGYsaSxoLGcsQSxjKSx0PTEsbj09PSEwJiYodHw9MjQpLG49UWwoMyxudWxsLG51bGwsdCksbC5jdXJyZW50PW4sbi5zdGF0ZU5vZGU9bCx0PV9mKCksdC5yZWZDb3VudCsrLGwucG9vbGVkQ2FjaGU9dCx0LnJlZkNvdW50Kyssbi5tZW1vaXplZFN0YXRlPXtlbGVtZW50OnUsaXNEZWh5ZHJhdGVkOmEsY2FjaGU6dH0sQmYobiksbH1mdW5jdGlvbiB3MShsKXtyZXR1cm4gbD8obD1XYSxsKTpXYX1mdW5jdGlvbiAkMShsLHQsYSx1LGUsbil7ZT13MShlKSx1LmNvbnRleHQ9PT1udWxsP3UuY29udGV4dD1lOnUucGVuZGluZ0NvbnRleHQ9ZSx1PUt0KHQpLHUucGF5bG9hZD17ZWxlbWVudDphfSxuPW49PT12b2lkIDA/bnVsbDpuLG4hPT1udWxsJiYodS5jYWxsYmFjaz1uKSxhPXh0KGwsdSx0KSxhIT09bnVsbCYmKF9sKGEsbCx0KSxqdShhLGwsdCkpfWZ1bmN0aW9uIEYxKGwsdCl7aWYobD1sLm1lbW9pemVkU3RhdGUsbCE9PW51bGwmJmwuZGVoeWRyYXRlZCE9PW51bGwpe3ZhciBhPWwucmV0cnlMYW5lO2wucmV0cnlMYW5lPWEhPT0wJiZhPHQ/YTp0fX1mdW5jdGlvbiBGYyhsLHQpe0YxKGwsdCksKGw9bC5hbHRlcm5hdGUpJiZGMShsLHQpfWZ1bmN0aW9uIHIxKGwpe2lmKGwudGFnPT09MTN8fGwudGFnPT09MzEpe3ZhciB0PVNhKGwsNjcxMDg4NjQpO3QhPT1udWxsJiZfbCh0LGwsNjcxMDg4NjQpLEZjKGwsNjcxMDg4NjQpfX1mdW5jdGlvbiBrMShsKXtpZihsLnRhZz09PTEzfHxsLnRhZz09PTMxKXt2YXIgdD1SbCgpO3Q9eG4odCk7dmFyIGE9U2EobCx0KTthIT09bnVsbCYmX2woYSxsLHQpLEZjKGwsdCl9fXZhciBIbj0hMDtmdW5jdGlvbiBCaChsLHQsYSx1KXt2YXIgZT16LlQ7ei5UPW51bGw7dmFyIG49by5wO3RyeXtvLnA9MixyYyhsLHQsYSx1KX1maW5hbGx5e28ucD1uLHouVD1lfX1mdW5jdGlvbiBZaChsLHQsYSx1KXt2YXIgZT16LlQ7ei5UPW51bGw7dmFyIG49by5wO3RyeXtvLnA9OCxyYyhsLHQsYSx1KX1maW5hbGx5e28ucD1uLHouVD1lfX1mdW5jdGlvbiByYyhsLHQsYSx1KXtpZihIbil7dmFyIGU9a2ModSk7aWYoZT09PW51bGwpQ2MobCx0LHUsTm4sYSksUDEobCx1KTtlbHNlIGlmKFhoKGUsbCx0LGEsdSkpdS5zdG9wUHJvcGFnYXRpb24oKTtlbHNlIGlmKFAxKGwsdSksdCY0JiYtMTxRaC5pbmRleE9mKGwpKXtmb3IoO2UhPT1udWxsOyl7dmFyIG49R2EoZSk7aWYobiE9PW51bGwpc3dpdGNoKG4udGFnKXtjYXNlIDM6aWYobj1uLnN0YXRlTm9kZSxuLmN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQpe3ZhciBmPXZhKG4ucGVuZGluZ0xhbmVzKTtpZihmIT09MCl7dmFyIGM9bjtmb3IoYy5wZW5kaW5nTGFuZXN8PTIsYy5lbnRhbmdsZWRMYW5lc3w9MjtmOyl7dmFyIGk9MTw8MzEtQmwoZik7Yy5lbnRhbmdsZW1lbnRzWzFdfD1pLGYmPX5pfXZ0KG4pLChSJjYpPT09MCYmKG1uPU5sKCkrNTAwLHRlKDApKX19YnJlYWs7Y2FzZSAzMTpjYXNlIDEzOmM9U2EobiwyKSxjIT09bnVsbCYmX2woYyxuLDIpLGRuKCksRmMobiwyKX1pZihuPWtjKHUpLG49PT1udWxsJiZDYyhsLHQsdSxObixhKSxuPT09ZSlicmVhaztlPW59ZSE9PW51bGwmJnUuc3RvcFByb3BhZ2F0aW9uKCl9ZWxzZSBDYyhsLHQsdSxudWxsLGEpfX1mdW5jdGlvbiBrYyhsKXtyZXR1cm4gbD1JbihsKSxJYyhsKX12YXIgTm49bnVsbDtmdW5jdGlvbiBJYyhsKXtpZihObj1udWxsLGw9WGEobCksbCE9PW51bGwpe3ZhciB0PXl0KGwpO2lmKHQ9PT1udWxsKWw9bnVsbDtlbHNle3ZhciBhPXQudGFnO2lmKGE9PT0xMyl7aWYobD1CdCh0KSxsIT09bnVsbClyZXR1cm4gbDtsPW51bGx9ZWxzZSBpZihhPT09MzEpe2lmKGw9ZmEodCksbCE9PW51bGwpcmV0dXJuIGw7bD1udWxsfWVsc2UgaWYoYT09PTMpe2lmKHQuc3RhdGVOb2RlLmN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQpcmV0dXJuIHQudGFnPT09Mz90LnN0YXRlTm9kZS5jb250YWluZXJJbmZvOm51bGw7bD1udWxsfWVsc2UgdCE9PWwmJihsPW51bGwpfX1yZXR1cm4gTm49bCxudWxsfWZ1bmN0aW9uIEkxKGwpe3N3aXRjaChsKXtjYXNlImJlZm9yZXRvZ2dsZSI6Y2FzZSJjYW5jZWwiOmNhc2UiY2xpY2siOmNhc2UiY2xvc2UiOmNhc2UiY29udGV4dG1lbnUiOmNhc2UiY29weSI6Y2FzZSJjdXQiOmNhc2UiYXV4Y2xpY2siOmNhc2UiZGJsY2xpY2siOmNhc2UiZHJhZ2VuZCI6Y2FzZSJkcmFnc3RhcnQiOmNhc2UiZHJvcCI6Y2FzZSJmb2N1c2luIjpjYXNlImZvY3Vzb3V0IjpjYXNlImlucHV0IjpjYXNlImludmFsaWQiOmNhc2Uia2V5ZG93biI6Y2FzZSJrZXlwcmVzcyI6Y2FzZSJrZXl1cCI6Y2FzZSJtb3VzZWRvd24iOmNhc2UibW91c2V1cCI6Y2FzZSJwYXN0ZSI6Y2FzZSJwYXVzZSI6Y2FzZSJwbGF5IjpjYXNlInBvaW50ZXJjYW5jZWwiOmNhc2UicG9pbnRlcmRvd24iOmNhc2UicG9pbnRlcnVwIjpjYXNlInJhdGVjaGFuZ2UiOmNhc2UicmVzZXQiOmNhc2UicmVzaXplIjpjYXNlInNlZWtlZCI6Y2FzZSJzdWJtaXQiOmNhc2UidG9nZ2xlIjpjYXNlInRvdWNoY2FuY2VsIjpjYXNlInRvdWNoZW5kIjpjYXNlInRvdWNoc3RhcnQiOmNhc2Uidm9sdW1lY2hhbmdlIjpjYXNlImNoYW5nZSI6Y2FzZSJzZWxlY3Rpb25jaGFuZ2UiOmNhc2UidGV4dElucHV0IjpjYXNlImNvbXBvc2l0aW9uc3RhcnQiOmNhc2UiY29tcG9zaXRpb25lbmQiOmNhc2UiY29tcG9zaXRpb251cGRhdGUiOmNhc2UiYmVmb3JlYmx1ciI6Y2FzZSJhZnRlcmJsdXIiOmNhc2UiYmVmb3JlaW5wdXQiOmNhc2UiYmx1ciI6Y2FzZSJmdWxsc2NyZWVuY2hhbmdlIjpjYXNlImZvY3VzIjpjYXNlImhhc2hjaGFuZ2UiOmNhc2UicG9wc3RhdGUiOmNhc2Uic2VsZWN0IjpjYXNlInNlbGVjdHN0YXJ0IjpyZXR1cm4gMjtjYXNlImRyYWciOmNhc2UiZHJhZ2VudGVyIjpjYXNlImRyYWdleGl0IjpjYXNlImRyYWdsZWF2ZSI6Y2FzZSJkcmFnb3ZlciI6Y2FzZSJtb3VzZW1vdmUiOmNhc2UibW91c2VvdXQiOmNhc2UibW91c2VvdmVyIjpjYXNlInBvaW50ZXJtb3ZlIjpjYXNlInBvaW50ZXJvdXQiOmNhc2UicG9pbnRlcm92ZXIiOmNhc2Uic2Nyb2xsIjpjYXNlInRvdWNobW92ZSI6Y2FzZSJ3aGVlbCI6Y2FzZSJtb3VzZWVudGVyIjpjYXNlIm1vdXNlbGVhdmUiOmNhc2UicG9pbnRlcmVudGVyIjpjYXNlInBvaW50ZXJsZWF2ZSI6cmV0dXJuIDg7Y2FzZSJtZXNzYWdlIjpzd2l0Y2goenkoKSl7Y2FzZSBmaTpyZXR1cm4gMjtjYXNlIGNpOnJldHVybiA4O2Nhc2UgYmU6Y2FzZSBBeTpyZXR1cm4gMzI7Y2FzZSBpaTpyZXR1cm4gMjY4NDM1NDU2O2RlZmF1bHQ6cmV0dXJuIDMyfWRlZmF1bHQ6cmV0dXJuIDMyfX12YXIgUGM9ITEsbGE9bnVsbCx0YT1udWxsLGFhPW51bGwsaWU9bmV3IE1hcCx2ZT1uZXcgTWFwLHVhPVtdLFFoPSJtb3VzZWRvd24gbW91c2V1cCB0b3VjaGNhbmNlbCB0b3VjaGVuZCB0b3VjaHN0YXJ0IGF1eGNsaWNrIGRibGNsaWNrIHBvaW50ZXJjYW5jZWwgcG9pbnRlcmRvd24gcG9pbnRlcnVwIGRyYWdlbmQgZHJhZ3N0YXJ0IGRyb3AgY29tcG9zaXRpb25lbmQgY29tcG9zaXRpb25zdGFydCBrZXlkb3duIGtleXByZXNzIGtleXVwIGlucHV0IHRleHRJbnB1dCBjb3B5IGN1dCBwYXN0ZSBjbGljayBjaGFuZ2UgY29udGV4dG1lbnUgcmVzZXQiLnNwbGl0KCIgIik7ZnVuY3Rpb24gUDEobCx0KXtzd2l0Y2gobCl7Y2FzZSJmb2N1c2luIjpjYXNlImZvY3Vzb3V0IjpsYT1udWxsO2JyZWFrO2Nhc2UiZHJhZ2VudGVyIjpjYXNlImRyYWdsZWF2ZSI6dGE9bnVsbDticmVhaztjYXNlIm1vdXNlb3ZlciI6Y2FzZSJtb3VzZW91dCI6YWE9bnVsbDticmVhaztjYXNlInBvaW50ZXJvdmVyIjpjYXNlInBvaW50ZXJvdXQiOmllLmRlbGV0ZSh0LnBvaW50ZXJJZCk7YnJlYWs7Y2FzZSJnb3Rwb2ludGVyY2FwdHVyZSI6Y2FzZSJsb3N0cG9pbnRlcmNhcHR1cmUiOnZlLmRlbGV0ZSh0LnBvaW50ZXJJZCl9fWZ1bmN0aW9uIHllKGwsdCxhLHUsZSxuKXtyZXR1cm4gbD09PW51bGx8fGwubmF0aXZlRXZlbnQhPT1uPyhsPXtibG9ja2VkT246dCxkb21FdmVudE5hbWU6YSxldmVudFN5c3RlbUZsYWdzOnUsbmF0aXZlRXZlbnQ6bix0YXJnZXRDb250YWluZXJzOltlXX0sdCE9PW51bGwmJih0PUdhKHQpLHQhPT1udWxsJiZyMSh0KSksbCk6KGwuZXZlbnRTeXN0ZW1GbGFnc3w9dSx0PWwudGFyZ2V0Q29udGFpbmVycyxlIT09bnVsbCYmdC5pbmRleE9mKGUpPT09LTEmJnQucHVzaChlKSxsKX1mdW5jdGlvbiBYaChsLHQsYSx1LGUpe3N3aXRjaCh0KXtjYXNlImZvY3VzaW4iOnJldHVybiBsYT15ZShsYSxsLHQsYSx1LGUpLCEwO2Nhc2UiZHJhZ2VudGVyIjpyZXR1cm4gdGE9eWUodGEsbCx0LGEsdSxlKSwhMDtjYXNlIm1vdXNlb3ZlciI6cmV0dXJuIGFhPXllKGFhLGwsdCxhLHUsZSksITA7Y2FzZSJwb2ludGVyb3ZlciI6dmFyIG49ZS5wb2ludGVySWQ7cmV0dXJuIGllLnNldChuLHllKGllLmdldChuKXx8bnVsbCxsLHQsYSx1LGUpKSwhMDtjYXNlImdvdHBvaW50ZXJjYXB0dXJlIjpyZXR1cm4gbj1lLnBvaW50ZXJJZCx2ZS5zZXQobix5ZSh2ZS5nZXQobil8fG51bGwsbCx0LGEsdSxlKSksITB9cmV0dXJuITF9ZnVuY3Rpb24gbHkobCl7dmFyIHQ9WGEobC50YXJnZXQpO2lmKHQhPT1udWxsKXt2YXIgYT15dCh0KTtpZihhIT09bnVsbCl7aWYodD1hLnRhZyx0PT09MTMpe2lmKHQ9QnQoYSksdCE9PW51bGwpe2wuYmxvY2tlZE9uPXQsU2kobC5wcmlvcml0eSxmdW5jdGlvbigpe2sxKGEpfSk7cmV0dXJufX1lbHNlIGlmKHQ9PT0zMSl7aWYodD1mYShhKSx0IT09bnVsbCl7bC5ibG9ja2VkT249dCxTaShsLnByaW9yaXR5LGZ1bmN0aW9uKCl7azEoYSl9KTtyZXR1cm59fWVsc2UgaWYodD09PTMmJmEuc3RhdGVOb2RlLmN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQpe2wuYmxvY2tlZE9uPWEudGFnPT09Mz9hLnN0YXRlTm9kZS5jb250YWluZXJJbmZvOm51bGw7cmV0dXJufX19bC5ibG9ja2VkT249bnVsbH1mdW5jdGlvbiBxbihsKXtpZihsLmJsb2NrZWRPbiE9PW51bGwpcmV0dXJuITE7Zm9yKHZhciB0PWwudGFyZ2V0Q29udGFpbmVyczswPHQubGVuZ3RoOyl7dmFyIGE9a2MobC5uYXRpdmVFdmVudCk7aWYoYT09PW51bGwpe2E9bC5uYXRpdmVFdmVudDt2YXIgdT1uZXcgYS5jb25zdHJ1Y3RvcihhLnR5cGUsYSk7a249dSxhLnRhcmdldC5kaXNwYXRjaEV2ZW50KHUpLGtuPW51bGx9ZWxzZSByZXR1cm4gdD1HYShhKSx0IT09bnVsbCYmcjEodCksbC5ibG9ja2VkT249YSwhMTt0LnNoaWZ0KCl9cmV0dXJuITB9ZnVuY3Rpb24gdHkobCx0LGEpe3FuKGwpJiZhLmRlbGV0ZSh0KX1mdW5jdGlvbiBHaCgpe1BjPSExLGxhIT09bnVsbCYmcW4obGEpJiYobGE9bnVsbCksdGEhPT1udWxsJiZxbih0YSkmJih0YT1udWxsKSxhYSE9PW51bGwmJnFuKGFhKSYmKGFhPW51bGwpLGllLmZvckVhY2godHkpLHZlLmZvckVhY2godHkpfWZ1bmN0aW9uIEJuKGwsdCl7bC5ibG9ja2VkT249PT10JiYobC5ibG9ja2VkT249bnVsbCxQY3x8KFBjPSEwLFQudW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayhULnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LEdoKSkpfXZhciBZbj1udWxsO2Z1bmN0aW9uIGF5KGwpe1luIT09bCYmKFluPWwsVC51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrKFQudW5zdGFibGVfTm9ybWFsUHJpb3JpdHksZnVuY3Rpb24oKXtZbj09PWwmJihZbj1udWxsKTtmb3IodmFyIHQ9MDt0PGwubGVuZ3RoO3QrPTMpe3ZhciBhPWxbdF0sdT1sW3QrMV0sZT1sW3QrMl07aWYodHlwZW9mIHUhPSJmdW5jdGlvbiIpe2lmKEljKHV8fGEpPT09bnVsbCljb250aW51ZTticmVha312YXIgbj1HYShhKTtuIT09bnVsbCYmKGwuc3BsaWNlKHQsMyksdC09MyxrZihuLHtwZW5kaW5nOiEwLGRhdGE6ZSxtZXRob2Q6YS5tZXRob2QsYWN0aW9uOnV9LHUsZSkpfX0pKX1mdW5jdGlvbiBndShsKXtmdW5jdGlvbiB0KGkpe3JldHVybiBCbihpLGwpfWxhIT09bnVsbCYmQm4obGEsbCksdGEhPT1udWxsJiZCbih0YSxsKSxhYSE9PW51bGwmJkJuKGFhLGwpLGllLmZvckVhY2godCksdmUuZm9yRWFjaCh0KTtmb3IodmFyIGE9MDthPHVhLmxlbmd0aDthKyspe3ZhciB1PXVhW2FdO3UuYmxvY2tlZE9uPT09bCYmKHUuYmxvY2tlZE9uPW51bGwpfWZvcig7MDx1YS5sZW5ndGgmJihhPXVhWzBdLGEuYmxvY2tlZE9uPT09bnVsbCk7KWx5KGEpLGEuYmxvY2tlZE9uPT09bnVsbCYmdWEuc2hpZnQoKTtpZihhPShsLm93bmVyRG9jdW1lbnR8fGwpLiQkcmVhY3RGb3JtUmVwbGF5LGEhPW51bGwpZm9yKHU9MDt1PGEubGVuZ3RoO3UrPTMpe3ZhciBlPWFbdV0sbj1hW3UrMV0sZj1lW29sXXx8bnVsbDtpZih0eXBlb2Ygbj09ImZ1bmN0aW9uIilmfHxheShhKTtlbHNlIGlmKGYpe3ZhciBjPW51bGw7aWYobiYmbi5oYXNBdHRyaWJ1dGUoImZvcm1BY3Rpb24iKSl7aWYoZT1uLGY9bltvbF18fG51bGwpYz1mLmZvcm1BY3Rpb247ZWxzZSBpZihJYyhlKSE9PW51bGwpY29udGludWV9ZWxzZSBjPWYuYWN0aW9uO3R5cGVvZiBjPT0iZnVuY3Rpb24iP2FbdSsxXT1jOihhLnNwbGljZSh1LDMpLHUtPTMpLGF5KGEpfX19ZnVuY3Rpb24gdXkoKXtmdW5jdGlvbiBsKG4pe24uY2FuSW50ZXJjZXB0JiZuLmluZm89PT0icmVhY3QtdHJhbnNpdGlvbiImJm4uaW50ZXJjZXB0KHtoYW5kbGVyOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGYpe3JldHVybiBlPWZ9KX0sZm9jdXNSZXNldDoibWFudWFsIixzY3JvbGw6Im1hbnVhbCJ9KX1mdW5jdGlvbiB0KCl7ZSE9PW51bGwmJihlKCksZT1udWxsKSx1fHxzZXRUaW1lb3V0KGEsMjApfWZ1bmN0aW9uIGEoKXtpZighdSYmIW5hdmlnYXRpb24udHJhbnNpdGlvbil7dmFyIG49bmF2aWdhdGlvbi5jdXJyZW50RW50cnk7biYmbi51cmwhPW51bGwmJm5hdmlnYXRpb24ubmF2aWdhdGUobi51cmwse3N0YXRlOm4uZ2V0U3RhdGUoKSxpbmZvOiJyZWFjdC10cmFuc2l0aW9uIixoaXN0b3J5OiJyZXBsYWNlIn0pfX1pZih0eXBlb2YgbmF2aWdhdGlvbj09Im9iamVjdCIpe3ZhciB1PSExLGU9bnVsbDtyZXR1cm4gbmF2aWdhdGlvbi5hZGRFdmVudExpc3RlbmVyKCJuYXZpZ2F0ZSIsbCksbmF2aWdhdGlvbi5hZGRFdmVudExpc3RlbmVyKCJuYXZpZ2F0ZXN1Y2Nlc3MiLHQpLG5hdmlnYXRpb24uYWRkRXZlbnRMaXN0ZW5lcigibmF2aWdhdGVlcnJvciIsdCksc2V0VGltZW91dChhLDEwMCksZnVuY3Rpb24oKXt1PSEwLG5hdmlnYXRpb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigibmF2aWdhdGUiLGwpLG5hdmlnYXRpb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigibmF2aWdhdGVzdWNjZXNzIix0KSxuYXZpZ2F0aW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm5hdmlnYXRlZXJyb3IiLHQpLGUhPT1udWxsJiYoZSgpLGU9bnVsbCl9fX1mdW5jdGlvbiBsaShsKXt0aGlzLl9pbnRlcm5hbFJvb3Q9bH1Rbi5wcm90b3R5cGUucmVuZGVyPWxpLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24obCl7dmFyIHQ9dGhpcy5faW50ZXJuYWxSb290O2lmKHQ9PT1udWxsKXRocm93IEVycm9yKHMoNDA5KSk7dmFyIGE9dC5jdXJyZW50LHU9UmwoKTskMShhLHUsbCx0LG51bGwsbnVsbCl9LFFuLnByb3RvdHlwZS51bm1vdW50PWxpLnByb3RvdHlwZS51bm1vdW50PWZ1bmN0aW9uKCl7dmFyIGw9dGhpcy5faW50ZXJuYWxSb290O2lmKGwhPT1udWxsKXt0aGlzLl9pbnRlcm5hbFJvb3Q9bnVsbDt2YXIgdD1sLmNvbnRhaW5lckluZm87JDEobC5jdXJyZW50LDIsbnVsbCxsLG51bGwsbnVsbCksZG4oKSx0W1FhXT1udWxsfX07ZnVuY3Rpb24gUW4obCl7dGhpcy5faW50ZXJuYWxSb290PWx9UW4ucHJvdG90eXBlLnVuc3RhYmxlX3NjaGVkdWxlSHlkcmF0aW9uPWZ1bmN0aW9uKGwpe2lmKGwpe3ZhciB0PWRpKCk7bD17YmxvY2tlZE9uOm51bGwsdGFyZ2V0OmwscHJpb3JpdHk6dH07Zm9yKHZhciBhPTA7YTx1YS5sZW5ndGgmJnQhPT0wJiZ0PHVhW2FdLnByaW9yaXR5O2ErKyk7dWEuc3BsaWNlKGEsMCxsKSxhPT09MCYmbHkobCl9fTt2YXIgZXk9ay52ZXJzaW9uO2lmKGV5IT09IjE5LjIuNSIpdGhyb3cgRXJyb3Iocyg1MjcsZXksIjE5LjIuNSIpKTtvLmZpbmRET01Ob2RlPWZ1bmN0aW9uKGwpe3ZhciB0PWwuX3JlYWN0SW50ZXJuYWxzO2lmKHQ9PT12b2lkIDApdGhyb3cgdHlwZW9mIGwucmVuZGVyPT0iZnVuY3Rpb24iP0Vycm9yKHMoMTg4KSk6KGw9T2JqZWN0LmtleXMobCkuam9pbigiLCIpLEVycm9yKHMoMjY4LGwpKSk7cmV0dXJuIGw9amwodCksbD1sIT09bnVsbD9fYShsKTpudWxsLGw9bD09PW51bGw/bnVsbDpsLnN0YXRlTm9kZSxsfTt2YXIgQ2g9e2J1bmRsZVR5cGU6MCx2ZXJzaW9uOiIxOS4yLjUiLHJlbmRlcmVyUGFja2FnZU5hbWU6InJlYWN0LWRvbSIsY3VycmVudERpc3BhdGNoZXJSZWY6eixyZWNvbmNpbGVyVmVyc2lvbjoiMTkuMi41In07aWYodHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXzwidSIpe3ZhciBYbj1fX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX187aWYoIVhuLmlzRGlzYWJsZWQmJlhuLnN1cHBvcnRzRmliZXIpdHJ5e0F1PVhuLmluamVjdChDaCkscWw9WG59Y2F0Y2h7fX1yZXR1cm4gbWUuY3JlYXRlUm9vdD1mdW5jdGlvbihsLHQpe2lmKCFQbChsKSl0aHJvdyBFcnJvcihzKDI5OSkpO3ZhciBhPSExLHU9IiIsZT1tdixuPWh2LGY9ZHY7cmV0dXJuIHQhPW51bGwmJih0LnVuc3RhYmxlX3N0cmljdE1vZGU9PT0hMCYmKGE9ITApLHQuaWRlbnRpZmllclByZWZpeCE9PXZvaWQgMCYmKHU9dC5pZGVudGlmaWVyUHJlZml4KSx0Lm9uVW5jYXVnaHRFcnJvciE9PXZvaWQgMCYmKGU9dC5vblVuY2F1Z2h0RXJyb3IpLHQub25DYXVnaHRFcnJvciE9PXZvaWQgMCYmKG49dC5vbkNhdWdodEVycm9yKSx0Lm9uUmVjb3ZlcmFibGVFcnJvciE9PXZvaWQgMCYmKGY9dC5vblJlY292ZXJhYmxlRXJyb3IpKSx0PVcxKGwsMSwhMSxudWxsLG51bGwsYSx1LG51bGwsZSxuLGYsdXkpLGxbUWFdPXQuY3VycmVudCxHYyhsKSxuZXcgbGkodCl9LG1lLmh5ZHJhdGVSb290PWZ1bmN0aW9uKGwsdCxhKXtpZighUGwobCkpdGhyb3cgRXJyb3IocygyOTkpKTt2YXIgdT0hMSxlPSIiLG49bXYsZj1odixjPWR2LGk9bnVsbDtyZXR1cm4gYSE9bnVsbCYmKGEudW5zdGFibGVfc3RyaWN0TW9kZT09PSEwJiYodT0hMCksYS5pZGVudGlmaWVyUHJlZml4IT09dm9pZCAwJiYoZT1hLmlkZW50aWZpZXJQcmVmaXgpLGEub25VbmNhdWdodEVycm9yIT09dm9pZCAwJiYobj1hLm9uVW5jYXVnaHRFcnJvciksYS5vbkNhdWdodEVycm9yIT09dm9pZCAwJiYoZj1hLm9uQ2F1Z2h0RXJyb3IpLGEub25SZWNvdmVyYWJsZUVycm9yIT09dm9pZCAwJiYoYz1hLm9uUmVjb3ZlcmFibGVFcnJvciksYS5mb3JtU3RhdGUhPT12b2lkIDAmJihpPWEuZm9ybVN0YXRlKSksdD1XMShsLDEsITAsdCxhPz9udWxsLHUsZSxpLG4sZixjLHV5KSx0LmNvbnRleHQ9dzEobnVsbCksYT10LmN1cnJlbnQsdT1SbCgpLHU9eG4odSksZT1LdCh1KSxlLmNhbGxiYWNrPW51bGwseHQoYSxlLHUpLGE9dSx0LmN1cnJlbnQubGFuZXM9YSxvdSh0LGEpLHZ0KHQpLGxbUWFdPXQuY3VycmVudCxHYyhsKSxuZXcgUW4odCl9LG1lLnZlcnNpb249IjE5LjIuNSIsbWV9dmFyIGl5O2Z1bmN0aW9uIHhoKCl7aWYoaXkpcmV0dXJuIHRpLmV4cG9ydHM7aXk9MTtmdW5jdGlvbiBUKCl7aWYoISh0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fPiJ1Inx8dHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRSE9ImZ1bmN0aW9uIikpdHJ5e19fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRShUKX1jYXRjaChrKXtjb25zb2xlLmVycm9yKGspfX1yZXR1cm4gVCgpLHRpLmV4cG9ydHM9S2goKSx0aS5leHBvcnRzfXZhciB2eT14aCgpO2NvbnN0IGh5PSh7dmFsdWU6VCxuYW1lOmssaHlkcmF0ZTpYPSEwfSk9PntpZighVClyZXR1cm4gbnVsbDtjb25zdCBzPVg/ImFzdHJvLXNsb3QiOiJhc3Ryby1zdGF0aWMtc2xvdCI7cmV0dXJuIG5hLmNyZWF0ZUVsZW1lbnQocyx7bmFtZTprLHN1cHByZXNzSHlkcmF0aW9uV2FybmluZzohMCxkYW5nZXJvdXNseVNldElubmVySFRNTDp7X19odG1sOlR9fSl9O2h5LnNob3VsZENvbXBvbmVudFVwZGF0ZT0oKT0+ITE7dmFyIGR5PWh5O2Z1bmN0aW9uIExoKFQpe2Zvcihjb25zdCBrIGluIFQpaWYoay5zdGFydHNXaXRoKCJfX3JlYWN0Q29udGFpbmVyIikpcmV0dXJuIGt9ZnVuY3Rpb24gU3koVCl7bGV0IGs9e307Zm9yKGNvbnN0IFggb2YgVC5hdHRyaWJ1dGVzKWtbWC5uYW1lXT1YLnZhbHVlO3JldHVybiBULmZpcnN0Q2hpbGQ9PT1udWxsP25hLmNyZWF0ZUVsZW1lbnQoVC5sb2NhbE5hbWUsayk6bmEuY3JlYXRlRWxlbWVudChULmxvY2FsTmFtZSxrLEFycmF5LmZyb20oVC5jaGlsZE5vZGVzKS5tYXAoWD0+WC5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFP1guZGF0YTpYLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREU/U3koWCk6dm9pZCAwKS5maWx0ZXIoWD0+ISFYKSl9ZnVuY3Rpb24gSmgoVCxrKXtpZihrJiZUKXtsZXQgWD1bXSxzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIik7cy5pbm5lckhUTUw9VDtmb3IobGV0IFBsIG9mIHMuY29udGVudC5jaGlsZHJlbilYLnB1c2goU3koUGwpKTtyZXR1cm4gWH1lbHNlIHJldHVybiBUP25hLmNyZWF0ZUVsZW1lbnQoZHkse3ZhbHVlOlR9KTp2b2lkIDB9bGV0IHl5PW5ldyBXZWFrTWFwO2NvbnN0IG15PShULGspPT57bGV0IFg9eXkuZ2V0KFQpO3JldHVybiBYfHwoWD1rKCkseXkuc2V0KFQsWCkpLFh9O3ZhciB3aD1UPT4oayxYLHtkZWZhdWx0OnMsLi4uUGx9LHtjbGllbnQ6eXR9KT0+e2lmKCFULmhhc0F0dHJpYnV0ZSgic3NyIikpcmV0dXJuO2NvbnN0IEJ0PVQuZ2V0QXR0cmlidXRlKCJkYXRhLWFjdGlvbi1rZXkiKSxmYT1ULmdldEF0dHJpYnV0ZSgiZGF0YS1hY3Rpb24tbmFtZSIpLHpsPVQuZ2V0QXR0cmlidXRlKCJkYXRhLWFjdGlvbi1yZXN1bHQiKSxqbD1CdCYmZmEmJnpsP1tKU09OLnBhcnNlKHpsKSxCdCxmYV06dm9pZCAwLF9hPXtpZGVudGlmaWVyUHJlZml4OlQuZ2V0QXR0cmlidXRlKCJwcmVmaXgiKSxmb3JtU3RhdGU6amx9O2Zvcihjb25zdFtIbCxpbF1vZiBPYmplY3QuZW50cmllcyhQbCkpWFtIbF09bmEuY3JlYXRlRWxlbWVudChkeSx7dmFsdWU6aWwsbmFtZTpIbH0pO2NvbnN0IF89bmEuY3JlYXRlRWxlbWVudChrLFgsSmgocyxULmhhc0F0dHJpYnV0ZSgiZGF0YS1yZWFjdC1jaGlsZHJlbiIpKSksdGw9TGgoVCk7aWYodGwmJmRlbGV0ZSBUW3RsXSx5dD09PSJvbmx5IilyZXR1cm4gbmEuc3RhcnRUcmFuc2l0aW9uKCgpPT57bXkoVCwoKT0+e2NvbnN0IGlsPXZ5LmNyZWF0ZVJvb3QoVCk7cmV0dXJuIFQuYWRkRXZlbnRMaXN0ZW5lcigiYXN0cm86dW5tb3VudCIsKCk9PmlsLnVubW91bnQoKSx7b25jZTohMH0pLGlsfSkucmVuZGVyKF8pfSk7bmEuc3RhcnRUcmFuc2l0aW9uKCgpPT57bXkoVCwoKT0+e2NvbnN0IGlsPXZ5Lmh5ZHJhdGVSb290KFQsXyxfYSk7cmV0dXJuIFQuYWRkRXZlbnRMaXN0ZW5lcigiYXN0cm86dW5tb3VudCIsKCk9PmlsLnVubW91bnQoKSx7b25jZTohMH0pLGlsfSkucmVuZGVyKF8pfSl9O2V4cG9ydHt3aCBhcyBkZWZhdWx0fTsK"
},
"/_astro/index.BInfTc5u.css": {
"content_type": "text/css; charset=utf-8",
"bytes": 226411,
"sha256": "a63fb3ba56c8290f355a8af5e7d5104eaf1b01115c01a17ad166a885cee11540",
"body_b64": "OnJvb3QsOmhvc3R7Y29sb3Itc2NoZW1lOnZhcigtLW1hbnRpbmUtY29sb3Itc2NoZW1lKX0qLCo6YmVmb3JlLCo6YWZ0ZXJ7Ym94LXNpemluZzpib3JkZXItYm94fWlucHV0LGJ1dHRvbix0ZXh0YXJlYSxzZWxlY3R7Zm9udDppbmhlcml0fWJ1dHRvbixzZWxlY3R7dGV4dC10cmFuc2Zvcm06bm9uZX1ib2R5LDpob3N0e21hcmdpbjowO2ZvbnQtZmFtaWx5OnZhcigtLW1hbnRpbmUtZm9udC1mYW1pbHkpO2ZvbnQtc2l6ZTp2YXIoLS1tYW50aW5lLWZvbnQtc2l6ZS1tZCk7bGluZS1oZWlnaHQ6dmFyKC0tbWFudGluZS1saW5lLWhlaWdodCk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWJvZHkpO2NvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItdGV4dCk7LXdlYmtpdC1mb250LXNtb290aGluZzp2YXIoLS1tYW50aW5lLXdlYmtpdC1mb250LXNtb290aGluZyk7LW1vei1vc3gtZm9udC1zbW9vdGhpbmc6dmFyKC0tbWFudGluZS1tb3otZm9udC1zbW9vdGhpbmcpfUBtZWRpYSBzY3JlZW4gYW5kIChtYXgtZGV2aWNlLXdpZHRoOjMxLjI1ZW0pe2JvZHksOmhvc3R7LXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OjEwMCV9fUBtZWRpYShwcmVmZXJzLXJlZHVjZWQtbW90aW9uOnJlZHVjZSl7W2RhdGEtcmVzcGVjdC1yZWR1Y2VkLW1vdGlvbl0gW2RhdGEtcmVkdWNlLW1vdGlvbl17dHJhbnNpdGlvbjpub25lO2FuaW1hdGlvbjpub25lfX1bZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1saWdodF0gLm1hbnRpbmUtbGlnaHQtaGlkZGVuLFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdIC5tYW50aW5lLWRhcmstaGlkZGVue2Rpc3BsYXk6bm9uZX0ubWFudGluZS1mb2N1cy1hdXRvOmZvY3VzLXZpc2libGV7b3V0bGluZToycHggc29saWQgdmFyKC0tbWFudGluZS1wcmltYXJ5LWNvbG9yLWZpbGxlZCk7b3V0bGluZS1vZmZzZXQ6Y2FsYyguMTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpfS5tYW50aW5lLWZvY3VzLWFsd2F5czpmb2N1c3tvdXRsaW5lOjJweCBzb2xpZCB2YXIoLS1tYW50aW5lLXByaW1hcnktY29sb3ItZmlsbGVkKTtvdXRsaW5lLW9mZnNldDpjYWxjKC4xMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSl9Lm1hbnRpbmUtZm9jdXMtbmV2ZXI6Zm9jdXN7b3V0bGluZTpub25lfS5tYW50aW5lLWFjdGl2ZTphY3RpdmV7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoY2FsYyguMDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSl9ZmllbGRzZXQ6ZGlzYWJsZWQgLm1hbnRpbmUtYWN0aXZlOmFjdGl2ZXt0cmFuc2Zvcm06bm9uZX06d2hlcmUoW2Rpcj1ydGxdKSAubWFudGluZS1yb3RhdGUtcnRse3RyYW5zZm9ybTpyb3RhdGUoMTgwZGVnKX06cm9vdCw6aG9zdHstLW1hbnRpbmUtei1pbmRleC1hcHA6IDEwMDstLW1hbnRpbmUtei1pbmRleC1tb2RhbDogMjAwOy0tbWFudGluZS16LWluZGV4LXBvcG92ZXI6IDMwMDstLW1hbnRpbmUtei1pbmRleC1vdmVybGF5OiA0MDA7LS1tYW50aW5lLXotaW5kZXgtbWF4OiA5OTk5Oy0tbWFudGluZS1zY2FsZTogMTstLW1hbnRpbmUtY3Vyc29yLXR5cGU6IGRlZmF1bHQ7LS1tYW50aW5lLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7LS1tYW50aW5lLW1vei1mb250LXNtb290aGluZzogZ3JheXNjYWxlOy0tbWFudGluZS1jb2xvci13aGl0ZTogI2ZmZjstLW1hbnRpbmUtY29sb3ItYmxhY2s6ICMwMDA7LS1tYW50aW5lLWxpbmUtaGVpZ2h0OiAxLjU1Oy0tbWFudGluZS1mb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCBTZWdvZSBVSSwgUm9ib3RvLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmLCBBcHBsZSBDb2xvciBFbW9qaSwgU2Vnb2UgVUkgRW1vamk7LS1tYW50aW5lLWZvbnQtZmFtaWx5LW1vbm9zcGFjZTogdWktbW9ub3NwYWNlLCBTRk1vbm8tUmVndWxhciwgTWVubG8sIE1vbmFjbywgQ29uc29sYXMsIExpYmVyYXRpb24gTW9ubywgQ291cmllciBOZXcsIG1vbm9zcGFjZTstLW1hbnRpbmUtZm9udC1mYW1pbHktaGVhZGluZ3M6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgU2Vnb2UgVUksIFJvYm90bywgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZiwgQXBwbGUgQ29sb3IgRW1vamksIFNlZ29lIFVJIEVtb2ppOy0tbWFudGluZS1oZWFkaW5nLWZvbnQtd2VpZ2h0OiA3MDA7LS1tYW50aW5lLWhlYWRpbmctdGV4dC13cmFwOiB3cmFwOy0tbWFudGluZS1yYWRpdXMtZGVmYXVsdDogY2FsYyguNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLW1hbnRpbmUtcHJpbWFyeS1jb2xvci1maWxsZWQ6IHZhcigtLW1hbnRpbmUtY29sb3ItYmx1ZS1maWxsZWQpOy0tbWFudGluZS1wcmltYXJ5LWNvbG9yLWZpbGxlZC1ob3ZlcjogdmFyKC0tbWFudGluZS1jb2xvci1ibHVlLWZpbGxlZC1ob3Zlcik7LS1tYW50aW5lLXByaW1hcnktY29sb3ItbGlnaHQ6IHZhcigtLW1hbnRpbmUtY29sb3ItYmx1ZS1saWdodCk7LS1tYW50aW5lLXByaW1hcnktY29sb3ItbGlnaHQtaG92ZXI6IHZhcigtLW1hbnRpbmUtY29sb3ItYmx1ZS1saWdodC1ob3Zlcik7LS1tYW50aW5lLXByaW1hcnktY29sb3ItbGlnaHQtY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItYmx1ZS1saWdodC1jb2xvcik7LS1tYW50aW5lLWJyZWFrcG9pbnQteHM6IDM2ZW07LS1tYW50aW5lLWJyZWFrcG9pbnQtc206IDQ4ZW07LS1tYW50aW5lLWJyZWFrcG9pbnQtbWQ6IDYyZW07LS1tYW50aW5lLWJyZWFrcG9pbnQtbGc6IDc1ZW07LS1tYW50aW5lLWJyZWFrcG9pbnQteGw6IDg4ZW07LS1tYW50aW5lLXNwYWNpbmcteHM6IGNhbGMoLjYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLW1hbnRpbmUtc3BhY2luZy1zbTogY2FsYyguNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1tYW50aW5lLXNwYWNpbmctbWQ6IGNhbGMoMXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLW1hbnRpbmUtc3BhY2luZy1sZzogY2FsYygxLjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tbWFudGluZS1zcGFjaW5nLXhsOiBjYWxjKDJyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1tYW50aW5lLWZvbnQtc2l6ZS14czogY2FsYyguNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1tYW50aW5lLWZvbnQtc2l6ZS1zbTogY2FsYyguODc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tbWFudGluZS1mb250LXNpemUtbWQ6IGNhbGMoMXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLW1hbnRpbmUtZm9udC1zaXplLWxnOiBjYWxjKDEuMTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tbWFudGluZS1mb250LXNpemUteGw6IGNhbGMoMS4yNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLW1hbnRpbmUtbGluZS1oZWlnaHQteHM6IDEuNDstLW1hbnRpbmUtbGluZS1oZWlnaHQtc206IDEuNDU7LS1tYW50aW5lLWxpbmUtaGVpZ2h0LW1kOiAxLjU1Oy0tbWFudGluZS1saW5lLWhlaWdodC1sZzogMS42Oy0tbWFudGluZS1saW5lLWhlaWdodC14bDogMS42NTstLW1hbnRpbmUtc2hhZG93LXhzOiAwIGNhbGMoLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkgY2FsYyguMTg3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSByZ2JhKDAsIDAsIDAsIC4wNSksIDAgY2FsYyguMDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSBjYWxjKC4xMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkgcmdiYSgwLCAwLCAwLCAuMSk7LS1tYW50aW5lLXNoYWRvdy1zbTogMCBjYWxjKC4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpIGNhbGMoLjE4NzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkgcmdiYSgwLCAwLCAwLCAuMDUpLCByZ2JhKDAsIDAsIDAsIC4wNSkgMCBjYWxjKC42MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkgY2FsYyguOTM3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSBjYWxjKC0uMzEyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSwgcmdiYSgwLCAwLCAwLCAuMDQpIDAgY2FsYyguNDM3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSBjYWxjKC40Mzc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpIGNhbGMoLS4zMTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tbWFudGluZS1zaGFkb3ctbWQ6IDAgY2FsYyguMDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSBjYWxjKC4xODc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpIHJnYmEoMCwgMCwgMCwgLjA1KSwgcmdiYSgwLCAwLCAwLCAuMDUpIDAgY2FsYygxLjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpIGNhbGMoMS41NjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpIGNhbGMoLS4zMTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpLCByZ2JhKDAsIDAsIDAsIC4wNCkgMCBjYWxjKC42MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkgY2FsYyguNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpIGNhbGMoLS4zMTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tbWFudGluZS1zaGFkb3ctbGc6IDAgY2FsYyguMDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSBjYWxjKC4xODc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpIHJnYmEoMCwgMCwgMCwgLjA1KSwgcmdiYSgwLCAwLCAwLCAuMDUpIDAgY2FsYygxLjc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpIGNhbGMoMS40Mzc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpIGNhbGMoLS40Mzc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpLCByZ2JhKDAsIDAsIDAsIC4wNCkgMCBjYWxjKC43NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSBjYWxjKC43NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSBjYWxjKC0uNDM3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLW1hbnRpbmUtc2hhZG93LXhsOiAwIGNhbGMoLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkgY2FsYyguMTg3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSByZ2JhKDAsIDAsIDAsIC4wNSksIHJnYmEoMCwgMCwgMCwgLjA1KSAwIGNhbGMoMi4yNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSBjYWxjKDEuNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkgY2FsYygtLjQzNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSksIHJnYmEoMCwgMCwgMCwgLjA0KSAwIGNhbGMoMS4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpIGNhbGMoMS4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpIGNhbGMoLS40Mzc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tbWFudGluZS1yYWRpdXMteHM6IGNhbGMoLjEyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLW1hbnRpbmUtcmFkaXVzLXNtOiBjYWxjKC4yNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLW1hbnRpbmUtcmFkaXVzLW1kOiBjYWxjKC41cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tbWFudGluZS1yYWRpdXMtbGc6IGNhbGMoMXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLW1hbnRpbmUtcmFkaXVzLXhsOiBjYWxjKDJyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1tYW50aW5lLWZvbnQtd2VpZ2h0LXJlZ3VsYXI6IDQwMDstLW1hbnRpbmUtZm9udC13ZWlnaHQtbWVkaXVtOiA2MDA7LS1tYW50aW5lLWZvbnQtd2VpZ2h0LWJvbGQ6IDcwMDstLW1hbnRpbmUtcHJpbWFyeS1jb2xvci0wOiB2YXIoLS1tYW50aW5lLWNvbG9yLWJsdWUtMCk7LS1tYW50aW5lLXByaW1hcnktY29sb3ItMTogdmFyKC0tbWFudGluZS1jb2xvci1ibHVlLTEpOy0tbWFudGluZS1wcmltYXJ5LWNvbG9yLTI6IHZhcigtLW1hbnRpbmUtY29sb3ItYmx1ZS0yKTstLW1hbnRpbmUtcHJpbWFyeS1jb2xvci0zOiB2YXIoLS1tYW50aW5lLWNvbG9yLWJsdWUtMyk7LS1tYW50aW5lLXByaW1hcnktY29sb3ItNDogdmFyKC0tbWFudGluZS1jb2xvci1ibHVlLTQpOy0tbWFudGluZS1wcmltYXJ5LWNvbG9yLTU6IHZhcigtLW1hbnRpbmUtY29sb3ItYmx1ZS01KTstLW1hbnRpbmUtcHJpbWFyeS1jb2xvci02OiB2YXIoLS1tYW50aW5lLWNvbG9yLWJsdWUtNik7LS1tYW50aW5lLXByaW1hcnktY29sb3ItNzogdmFyKC0tbWFudGluZS1jb2xvci1ibHVlLTcpOy0tbWFudGluZS1wcmltYXJ5LWNvbG9yLTg6IHZhcigtLW1hbnRpbmUtY29sb3ItYmx1ZS04KTstLW1hbnRpbmUtcHJpbWFyeS1jb2xvci05OiB2YXIoLS1tYW50aW5lLWNvbG9yLWJsdWUtOSk7LS1tYW50aW5lLWNvbG9yLWRhcmstMDogI2M5YzljOTstLW1hbnRpbmUtY29sb3ItZGFyay0xOiAjYjhiOGI4Oy0tbWFudGluZS1jb2xvci1kYXJrLTI6ICM4MjgyODI7LS1tYW50aW5lLWNvbG9yLWRhcmstMzogIzY5Njk2OTstLW1hbnRpbmUtY29sb3ItZGFyay00OiAjNDI0MjQyOy0tbWFudGluZS1jb2xvci1kYXJrLTU6ICMzYjNiM2I7LS1tYW50aW5lLWNvbG9yLWRhcmstNjogIzJlMmUyZTstLW1hbnRpbmUtY29sb3ItZGFyay03OiAjMjQyNDI0Oy0tbWFudGluZS1jb2xvci1kYXJrLTg6ICMxZjFmMWY7LS1tYW50aW5lLWNvbG9yLWRhcmstOTogIzE0MTQxNDstLW1hbnRpbmUtY29sb3ItZ3JheS0wOiAjZjhmOWZhOy0tbWFudGluZS1jb2xvci1ncmF5LTE6ICNmMWYzZjU7LS1tYW50aW5lLWNvbG9yLWdyYXktMjogI2U5ZWNlZjstLW1hbnRpbmUtY29sb3ItZ3JheS0zOiAjZGVlMmU2Oy0tbWFudGluZS1jb2xvci1ncmF5LTQ6ICNjZWQ0ZGE7LS1tYW50aW5lLWNvbG9yLWdyYXktNTogI2FkYjViZDstLW1hbnRpbmUtY29sb3ItZ3JheS02OiAjODY4ZTk2Oy0tbWFudGluZS1jb2xvci1ncmF5LTc6ICM0OTUwNTc7LS1tYW50aW5lLWNvbG9yLWdyYXktODogIzM0M2E0MDstLW1hbnRpbmUtY29sb3ItZ3JheS05OiAjMjEyNTI5Oy0tbWFudGluZS1jb2xvci1yZWQtMDogI2ZmZjVmNTstLW1hbnRpbmUtY29sb3ItcmVkLTE6ICNmZmUzZTM7LS1tYW50aW5lLWNvbG9yLXJlZC0yOiAjZmZjOWM5Oy0tbWFudGluZS1jb2xvci1yZWQtMzogI2ZmYThhODstLW1hbnRpbmUtY29sb3ItcmVkLTQ6ICNmZjg3ODc7LS1tYW50aW5lLWNvbG9yLXJlZC01OiAjZmY2YjZiOy0tbWFudGluZS1jb2xvci1yZWQtNjogI2ZhNTI1MjstLW1hbnRpbmUtY29sb3ItcmVkLTc6ICNmMDNlM2U7LS1tYW50aW5lLWNvbG9yLXJlZC04OiAjZTAzMTMxOy0tbWFudGluZS1jb2xvci1yZWQtOTogI2M5MmEyYTstLW1hbnRpbmUtY29sb3ItcGluay0wOiAjZmZmMGY2Oy0tbWFudGluZS1jb2xvci1waW5rLTE6ICNmZmRlZWI7LS1tYW50aW5lLWNvbG9yLXBpbmstMjogI2ZjYzJkNzstLW1hbnRpbmUtY29sb3ItcGluay0zOiAjZmFhMmMxOy0tbWFudGluZS1jb2xvci1waW5rLTQ6ICNmNzgzYWM7LS1tYW50aW5lLWNvbG9yLXBpbmstNTogI2YwNjU5NTstLW1hbnRpbmUtY29sb3ItcGluay02OiAjZTY0OTgwOy0tbWFudGluZS1jb2xvci1waW5rLTc6ICNkNjMzNmM7LS1tYW50aW5lLWNvbG9yLXBpbmstODogI2MyMjU1YzstLW1hbnRpbmUtY29sb3ItcGluay05OiAjYTYxZTRkOy0tbWFudGluZS1jb2xvci1ncmFwZS0wOiAjZjhmMGZjOy0tbWFudGluZS1jb2xvci1ncmFwZS0xOiAjZjNkOWZhOy0tbWFudGluZS1jb2xvci1ncmFwZS0yOiAjZWViZWZhOy0tbWFudGluZS1jb2xvci1ncmFwZS0zOiAjZTU5OWY3Oy0tbWFudGluZS1jb2xvci1ncmFwZS00OiAjZGE3N2YyOy0tbWFudGluZS1jb2xvci1ncmFwZS01OiAjY2M1ZGU4Oy0tbWFudGluZS1jb2xvci1ncmFwZS02OiAjYmU0YmRiOy0tbWFudGluZS1jb2xvci1ncmFwZS03OiAjYWUzZWM5Oy0tbWFudGluZS1jb2xvci1ncmFwZS04OiAjOWMzNmI1Oy0tbWFudGluZS1jb2xvci1ncmFwZS05OiAjODYyZTljOy0tbWFudGluZS1jb2xvci12aW9sZXQtMDogI2YzZjBmZjstLW1hbnRpbmUtY29sb3ItdmlvbGV0LTE6ICNlNWRiZmY7LS1tYW50aW5lLWNvbG9yLXZpb2xldC0yOiAjZDBiZmZmOy0tbWFudGluZS1jb2xvci12aW9sZXQtMzogI2IxOTdmYzstLW1hbnRpbmUtY29sb3ItdmlvbGV0LTQ6ICM5Nzc1ZmE7LS1tYW50aW5lLWNvbG9yLXZpb2xldC01OiAjODQ1ZWY3Oy0tbWFudGluZS1jb2xvci12aW9sZXQtNjogIzc5NTBmMjstLW1hbnRpbmUtY29sb3ItdmlvbGV0LTc6ICM3MDQ4ZTg7LS1tYW50aW5lLWNvbG9yLXZpb2xldC04OiAjNjc0MWQ5Oy0tbWFudGluZS1jb2xvci12aW9sZXQtOTogIzVmM2RjNDstLW1hbnRpbmUtY29sb3ItaW5kaWdvLTA6ICNlZGYyZmY7LS1tYW50aW5lLWNvbG9yLWluZGlnby0xOiAjZGJlNGZmOy0tbWFudGluZS1jb2xvci1pbmRpZ28tMjogI2JhYzhmZjstLW1hbnRpbmUtY29sb3ItaW5kaWdvLTM6ICM5MWE3ZmY7LS1tYW50aW5lLWNvbG9yLWluZGlnby00OiAjNzQ4ZmZjOy0tbWFudGluZS1jb2xvci1pbmRpZ28tNTogIzVjN2NmYTstLW1hbnRpbmUtY29sb3ItaW5kaWdvLTY6ICM0YzZlZjU7LS1tYW50aW5lLWNvbG9yLWluZGlnby03OiAjNDI2M2ViOy0tbWFudGluZS1jb2xvci1pbmRpZ28tODogIzNiNWJkYjstLW1hbnRpbmUtY29sb3ItaW5kaWdvLTk6ICMzNjRmYzc7LS1tYW50aW5lLWNvbG9yLWJsdWUtMDogI2U3ZjVmZjstLW1hbnRpbmUtY29sb3ItYmx1ZS0xOiAjZDBlYmZmOy0tbWFudGluZS1jb2xvci1ibHVlLTI6ICNhNWQ4ZmY7LS1tYW50aW5lLWNvbG9yLWJsdWUtMzogIzc0YzBmYzstLW1hbnRpbmUtY29sb3ItYmx1ZS00OiAjNGRhYmY3Oy0tbWFudGluZS1jb2xvci1ibHVlLTU6ICMzMzlhZjA7LS1tYW50aW5lLWNvbG9yLWJsdWUtNjogIzIyOGJlNjstLW1hbnRpbmUtY29sb3ItYmx1ZS03OiAjMWM3ZWQ2Oy0tbWFudGluZS1jb2xvci1ibHVlLTg6ICMxOTcxYzI7LS1tYW50aW5lLWNvbG9yLWJsdWUtOTogIzE4NjRhYjstLW1hbnRpbmUtY29sb3ItY3lhbi0wOiAjZTNmYWZjOy0tbWFudGluZS1jb2xvci1jeWFuLTE6ICNjNWY2ZmE7LS1tYW50aW5lLWNvbG9yLWN5YW4tMjogIzk5ZTlmMjstLW1hbnRpbmUtY29sb3ItY3lhbi0zOiAjNjZkOWU4Oy0tbWFudGluZS1jb2xvci1jeWFuLTQ6ICMzYmM5ZGI7LS1tYW50aW5lLWNvbG9yLWN5YW4tNTogIzIyYjhjZjstLW1hbnRpbmUtY29sb3ItY3lhbi02OiAjMTVhYWJmOy0tbWFudGluZS1jb2xvci1jeWFuLTc6ICMxMDk4YWQ7LS1tYW50aW5lLWNvbG9yLWN5YW4tODogIzBjODU5OTstLW1hbnRpbmUtY29sb3ItY3lhbi05OiAjMGI3Mjg1Oy0tbWFudGluZS1jb2xvci10ZWFsLTA6ICNlNmZjZjU7LS1tYW50aW5lLWNvbG9yLXRlYWwtMTogI2MzZmFlODstLW1hbnRpbmUtY29sb3ItdGVhbC0yOiAjOTZmMmQ3Oy0tbWFudGluZS1jb2xvci10ZWFsLTM6ICM2M2U2YmU7LS1tYW50aW5lLWNvbG9yLXRlYWwtNDogIzM4ZDlhOTstLW1hbnRpbmUtY29sb3ItdGVhbC01OiAjMjBjOTk3Oy0tbWFudGluZS1jb2xvci10ZWFsLTY6ICMxMmI4ODY7LS1tYW50aW5lLWNvbG9yLXRlYWwtNzogIzBjYTY3ODstLW1hbnRpbmUtY29sb3ItdGVhbC04OiAjMDk5MjY4Oy0tbWFudGluZS1jb2xvci10ZWFsLTk6ICMwODdmNWI7LS1tYW50aW5lLWNvbG9yLWdyZWVuLTA6ICNlYmZiZWU7LS1tYW50aW5lLWNvbG9yLWdyZWVuLTE6ICNkM2Y5ZDg7LS1tYW50aW5lLWNvbG9yLWdyZWVuLTI6ICNiMmYyYmI7LS1tYW50aW5lLWNvbG9yLWdyZWVuLTM6ICM4Y2U5OWE7LS1tYW50aW5lLWNvbG9yLWdyZWVuLTQ6ICM2OWRiN2M7LS1tYW50aW5lLWNvbG9yLWdyZWVuLTU6ICM1MWNmNjY7LS1tYW50aW5lLWNvbG9yLWdyZWVuLTY6ICM0MGMwNTc7LS1tYW50aW5lLWNvbG9yLWdyZWVuLTc6ICMzN2IyNGQ7LS1tYW50aW5lLWNvbG9yLWdyZWVuLTg6ICMyZjllNDQ7LS1tYW50aW5lLWNvbG9yLWdyZWVuLTk6ICMyYjhhM2U7LS1tYW50aW5lLWNvbG9yLWxpbWUtMDogI2Y0ZmNlMzstLW1hbnRpbmUtY29sb3ItbGltZS0xOiAjZTlmYWM4Oy0tbWFudGluZS1jb2xvci1saW1lLTI6ICNkOGY1YTI7LS1tYW50aW5lLWNvbG9yLWxpbWUtMzogI2MwZWI3NTstLW1hbnRpbmUtY29sb3ItbGltZS00OiAjYTllMzRiOy0tbWFudGluZS1jb2xvci1saW1lLTU6ICM5NGQ4MmQ7LS1tYW50aW5lLWNvbG9yLWxpbWUtNjogIzgyYzkxZTstLW1hbnRpbmUtY29sb3ItbGltZS03OiAjNzRiODE2Oy0tbWFudGluZS1jb2xvci1saW1lLTg6ICM2NmE4MGY7LS1tYW50aW5lLWNvbG9yLWxpbWUtOTogIzVjOTQwZDstLW1hbnRpbmUtY29sb3IteWVsbG93LTA6ICNmZmY5ZGI7LS1tYW50aW5lLWNvbG9yLXllbGxvdy0xOiAjZmZmM2JmOy0tbWFudGluZS1jb2xvci15ZWxsb3ctMjogI2ZmZWM5OTstLW1hbnRpbmUtY29sb3IteWVsbG93LTM6ICNmZmUwNjY7LS1tYW50aW5lLWNvbG9yLXllbGxvdy00OiAjZmZkNDNiOy0tbWFudGluZS1jb2xvci15ZWxsb3ctNTogI2ZjYzQxOTstLW1hbnRpbmUtY29sb3IteWVsbG93LTY6ICNmYWIwMDU7LS1tYW50aW5lLWNvbG9yLXllbGxvdy03OiAjZjU5ZjAwOy0tbWFudGluZS1jb2xvci15ZWxsb3ctODogI2YwOGMwMDstLW1hbnRpbmUtY29sb3IteWVsbG93LTk6ICNlNjc3MDA7LS1tYW50aW5lLWNvbG9yLW9yYW5nZS0wOiAjZmZmNGU2Oy0tbWFudGluZS1jb2xvci1vcmFuZ2UtMTogI2ZmZThjYzstLW1hbnRpbmUtY29sb3Itb3JhbmdlLTI6ICNmZmQ4YTg7LS1tYW50aW5lLWNvbG9yLW9yYW5nZS0zOiAjZmZjMDc4Oy0tbWFudGluZS1jb2xvci1vcmFuZ2UtNDogI2ZmYTk0ZDstLW1hbnRpbmUtY29sb3Itb3JhbmdlLTU6ICNmZjkyMmI7LS1tYW50aW5lLWNvbG9yLW9yYW5nZS02OiAjZmQ3ZTE0Oy0tbWFudGluZS1jb2xvci1vcmFuZ2UtNzogI2Y3NjcwNzstLW1hbnRpbmUtY29sb3Itb3JhbmdlLTg6ICNlODU5MGM7LS1tYW50aW5lLWNvbG9yLW9yYW5nZS05OiAjZDk0ODBmOy0tbWFudGluZS1oMS1mb250LXNpemU6IGNhbGMoMi4xMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1tYW50aW5lLWgxLWxpbmUtaGVpZ2h0OiAxLjM7LS1tYW50aW5lLWgxLWZvbnQtd2VpZ2h0OiA3MDA7LS1tYW50aW5lLWgyLWZvbnQtc2l6ZTogY2FsYygxLjYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLW1hbnRpbmUtaDItbGluZS1oZWlnaHQ6IDEuMzU7LS1tYW50aW5lLWgyLWZvbnQtd2VpZ2h0OiA3MDA7LS1tYW50aW5lLWgzLWZvbnQtc2l6ZTogY2FsYygxLjM3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLW1hbnRpbmUtaDMtbGluZS1oZWlnaHQ6IDEuNDstLW1hbnRpbmUtaDMtZm9udC13ZWlnaHQ6IDcwMDstLW1hbnRpbmUtaDQtZm9udC1zaXplOiBjYWxjKDEuMTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tbWFudGluZS1oNC1saW5lLWhlaWdodDogMS40NTstLW1hbnRpbmUtaDQtZm9udC13ZWlnaHQ6IDcwMDstLW1hbnRpbmUtaDUtZm9udC1zaXplOiBjYWxjKDFyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1tYW50aW5lLWg1LWxpbmUtaGVpZ2h0OiAxLjU7LS1tYW50aW5lLWg1LWZvbnQtd2VpZ2h0OiA3MDA7LS1tYW50aW5lLWg2LWZvbnQtc2l6ZTogY2FsYyguODc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tbWFudGluZS1oNi1saW5lLWhlaWdodDogMS41Oy0tbWFudGluZS1oNi1mb250LXdlaWdodDogNzAwfTpyb290W2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10sOmhvc3QoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ImRhcmsiXSl7LS1tYW50aW5lLWNvbG9yLXNjaGVtZTogZGFyazstLW1hbnRpbmUtcHJpbWFyeS1jb2xvci1jb250cmFzdDogdmFyKC0tbWFudGluZS1jb2xvci13aGl0ZSk7LS1tYW50aW5lLWNvbG9yLWJyaWdodDogdmFyKC0tbWFudGluZS1jb2xvci13aGl0ZSk7LS1tYW50aW5lLWNvbG9yLXRleHQ6IHZhcigtLW1hbnRpbmUtY29sb3ItZGFyay0wKTstLW1hbnRpbmUtY29sb3ItYm9keTogdmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTcpOy0tbWFudGluZS1jb2xvci1lcnJvcjogdmFyKC0tbWFudGluZS1jb2xvci1yZWQtOCk7LS1tYW50aW5lLWNvbG9yLXBsYWNlaG9sZGVyOiB2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstMyk7LS1tYW50aW5lLWNvbG9yLWFuY2hvcjogdmFyKC0tbWFudGluZS1jb2xvci1ibHVlLTQpOy0tbWFudGluZS1jb2xvci1kZWZhdWx0OiB2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNik7LS1tYW50aW5lLWNvbG9yLWRlZmF1bHQtaG92ZXI6IHZhcigtLW1hbnRpbmUtY29sb3ItZGFyay01KTstLW1hbnRpbmUtY29sb3ItZGVmYXVsdC1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci13aGl0ZSk7LS1tYW50aW5lLWNvbG9yLWRlZmF1bHQtYm9yZGVyOiB2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNCk7LS1tYW50aW5lLWNvbG9yLWRpbW1lZDogdmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTIpOy0tbWFudGluZS1jb2xvci1kaXNhYmxlZDogdmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTYpOy0tbWFudGluZS1jb2xvci1kaXNhYmxlZC1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTMpOy0tbWFudGluZS1jb2xvci1kaXNhYmxlZC1ib3JkZXI6IHZhcigtLW1hbnRpbmUtY29sb3ItZGFyay00KTstLW1hbnRpbmUtY29sb3ItZGFyay10ZXh0OiB2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNCk7LS1tYW50aW5lLWNvbG9yLWRhcmstZmlsbGVkOiB2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstOCk7LS1tYW50aW5lLWNvbG9yLWRhcmstZmlsbGVkLWhvdmVyOiB2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstOSk7LS1tYW50aW5lLWNvbG9yLWRhcmstbGlnaHQ6IHJnYmEoMTAsIDEwLCAxMCwgMSk7LS1tYW50aW5lLWNvbG9yLWRhcmstbGlnaHQtaG92ZXI6IHJnYmEoMTQsIDE0LCAxNCwgMSk7LS1tYW50aW5lLWNvbG9yLWRhcmstbGlnaHQtY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItZGFyay0wKTstLW1hbnRpbmUtY29sb3ItZGFyay1vdXRsaW5lOiB2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNCk7LS1tYW50aW5lLWNvbG9yLWRhcmstb3V0bGluZS1ob3ZlcjogcmdiYSg2NiwgNjYsIDY2LCAuMDUpOy0tbWFudGluZS1jb2xvci1ncmF5LXRleHQ6IHZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS00KTstLW1hbnRpbmUtY29sb3ItZ3JheS1maWxsZWQ6IHZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS04KTstLW1hbnRpbmUtY29sb3ItZ3JheS1maWxsZWQtaG92ZXI6IHZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS05KTstLW1hbnRpbmUtY29sb3ItZ3JheS1saWdodDogcmdiYSgxNywgMTksIDIxLCAxKTstLW1hbnRpbmUtY29sb3ItZ3JheS1saWdodC1ob3ZlcjogcmdiYSgyMywgMjYsIDI5LCAxKTstLW1hbnRpbmUtY29sb3ItZ3JheS1saWdodC1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTApOy0tbWFudGluZS1jb2xvci1ncmF5LW91dGxpbmU6IHZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS00KTstLW1hbnRpbmUtY29sb3ItZ3JheS1vdXRsaW5lLWhvdmVyOiByZ2JhKDIwNiwgMjEyLCAyMTgsIC4wNSk7LS1tYW50aW5lLWNvbG9yLXJlZC10ZXh0OiB2YXIoLS1tYW50aW5lLWNvbG9yLXJlZC00KTstLW1hbnRpbmUtY29sb3ItcmVkLWZpbGxlZDogdmFyKC0tbWFudGluZS1jb2xvci1yZWQtOCk7LS1tYW50aW5lLWNvbG9yLXJlZC1maWxsZWQtaG92ZXI6IHZhcigtLW1hbnRpbmUtY29sb3ItcmVkLTkpOy0tbWFudGluZS1jb2xvci1yZWQtbGlnaHQ6IHJnYmEoMTAxLCAyMSwgMjEsIDEpOy0tbWFudGluZS1jb2xvci1yZWQtbGlnaHQtaG92ZXI6IHJnYmEoMTQxLCAyOSwgMjksIDEpOy0tbWFudGluZS1jb2xvci1yZWQtbGlnaHQtY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItcmVkLTApOy0tbWFudGluZS1jb2xvci1yZWQtb3V0bGluZTogdmFyKC0tbWFudGluZS1jb2xvci1yZWQtNCk7LS1tYW50aW5lLWNvbG9yLXJlZC1vdXRsaW5lLWhvdmVyOiByZ2JhKDI1NSwgMTM1LCAxMzUsIC4wNSk7LS1tYW50aW5lLWNvbG9yLXBpbmstdGV4dDogdmFyKC0tbWFudGluZS1jb2xvci1waW5rLTQpOy0tbWFudGluZS1jb2xvci1waW5rLWZpbGxlZDogdmFyKC0tbWFudGluZS1jb2xvci1waW5rLTgpOy0tbWFudGluZS1jb2xvci1waW5rLWZpbGxlZC1ob3ZlcjogdmFyKC0tbWFudGluZS1jb2xvci1waW5rLTkpOy0tbWFudGluZS1jb2xvci1waW5rLWxpZ2h0OiByZ2JhKDgzLCAxNSwgMzksIDEpOy0tbWFudGluZS1jb2xvci1waW5rLWxpZ2h0LWhvdmVyOiByZ2JhKDExNiwgMjEsIDU0LCAxKTstLW1hbnRpbmUtY29sb3ItcGluay1saWdodC1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci1waW5rLTApOy0tbWFudGluZS1jb2xvci1waW5rLW91dGxpbmU6IHZhcigtLW1hbnRpbmUtY29sb3ItcGluay00KTstLW1hbnRpbmUtY29sb3ItcGluay1vdXRsaW5lLWhvdmVyOiByZ2JhKDI0NywgMTMxLCAxNzIsIC4wNSk7LS1tYW50aW5lLWNvbG9yLWdyYXBlLXRleHQ6IHZhcigtLW1hbnRpbmUtY29sb3ItZ3JhcGUtNCk7LS1tYW50aW5lLWNvbG9yLWdyYXBlLWZpbGxlZDogdmFyKC0tbWFudGluZS1jb2xvci1ncmFwZS04KTstLW1hbnRpbmUtY29sb3ItZ3JhcGUtZmlsbGVkLWhvdmVyOiB2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXBlLTkpOy0tbWFudGluZS1jb2xvci1ncmFwZS1saWdodDogcmdiYSg2NywgMjMsIDc4LCAxKTstLW1hbnRpbmUtY29sb3ItZ3JhcGUtbGlnaHQtaG92ZXI6IHJnYmEoOTQsIDMyLCAxMDksIDEpOy0tbWFudGluZS1jb2xvci1ncmFwZS1saWdodC1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci1ncmFwZS0wKTstLW1hbnRpbmUtY29sb3ItZ3JhcGUtb3V0bGluZTogdmFyKC0tbWFudGluZS1jb2xvci1ncmFwZS00KTstLW1hbnRpbmUtY29sb3ItZ3JhcGUtb3V0bGluZS1ob3ZlcjogcmdiYSgyMTgsIDExOSwgMjQyLCAuMDUpOy0tbWFudGluZS1jb2xvci12aW9sZXQtdGV4dDogdmFyKC0tbWFudGluZS1jb2xvci12aW9sZXQtNCk7LS1tYW50aW5lLWNvbG9yLXZpb2xldC1maWxsZWQ6IHZhcigtLW1hbnRpbmUtY29sb3ItdmlvbGV0LTgpOy0tbWFudGluZS1jb2xvci12aW9sZXQtZmlsbGVkLWhvdmVyOiB2YXIoLS1tYW50aW5lLWNvbG9yLXZpb2xldC05KTstLW1hbnRpbmUtY29sb3ItdmlvbGV0LWxpZ2h0OiByZ2JhKDQ4LCAzMSwgOTgsIDEpOy0tbWFudGluZS1jb2xvci12aW9sZXQtbGlnaHQtaG92ZXI6IHJnYmEoNjcsIDQzLCAxMzcsIDEpOy0tbWFudGluZS1jb2xvci12aW9sZXQtbGlnaHQtY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItdmlvbGV0LTApOy0tbWFudGluZS1jb2xvci12aW9sZXQtb3V0bGluZTogdmFyKC0tbWFudGluZS1jb2xvci12aW9sZXQtNCk7LS1tYW50aW5lLWNvbG9yLXZpb2xldC1vdXRsaW5lLWhvdmVyOiByZ2JhKDE1MSwgMTE3LCAyNTAsIC4wNSk7LS1tYW50aW5lLWNvbG9yLWluZGlnby10ZXh0OiB2YXIoLS1tYW50aW5lLWNvbG9yLWluZGlnby00KTstLW1hbnRpbmUtY29sb3ItaW5kaWdvLWZpbGxlZDogdmFyKC0tbWFudGluZS1jb2xvci1pbmRpZ28tOCk7LS1tYW50aW5lLWNvbG9yLWluZGlnby1maWxsZWQtaG92ZXI6IHZhcigtLW1hbnRpbmUtY29sb3ItaW5kaWdvLTkpOy0tbWFudGluZS1jb2xvci1pbmRpZ28tbGlnaHQ6IHJnYmEoMjcsIDQwLCAxMDAsIDEpOy0tbWFudGluZS1jb2xvci1pbmRpZ28tbGlnaHQtaG92ZXI6IHJnYmEoMzgsIDU1LCAxMzksIDEpOy0tbWFudGluZS1jb2xvci1pbmRpZ28tbGlnaHQtY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItaW5kaWdvLTApOy0tbWFudGluZS1jb2xvci1pbmRpZ28tb3V0bGluZTogdmFyKC0tbWFudGluZS1jb2xvci1pbmRpZ28tNCk7LS1tYW50aW5lLWNvbG9yLWluZGlnby1vdXRsaW5lLWhvdmVyOiByZ2JhKDExNiwgMTQzLCAyNTIsIC4wNSk7LS1tYW50aW5lLWNvbG9yLWJsdWUtdGV4dDogdmFyKC0tbWFudGluZS1jb2xvci1ibHVlLTQpOy0tbWFudGluZS1jb2xvci1ibHVlLWZpbGxlZDogdmFyKC0tbWFudGluZS1jb2xvci1ibHVlLTgpOy0tbWFudGluZS1jb2xvci1ibHVlLWZpbGxlZC1ob3ZlcjogdmFyKC0tbWFudGluZS1jb2xvci1ibHVlLTkpOy0tbWFudGluZS1jb2xvci1ibHVlLWxpZ2h0OiByZ2JhKDEyLCA1MCwgODYsIDEpOy0tbWFudGluZS1jb2xvci1ibHVlLWxpZ2h0LWhvdmVyOiByZ2JhKDE3LCA3MCwgMTIwLCAxKTstLW1hbnRpbmUtY29sb3ItYmx1ZS1saWdodC1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci1ibHVlLTApOy0tbWFudGluZS1jb2xvci1ibHVlLW91dGxpbmU6IHZhcigtLW1hbnRpbmUtY29sb3ItYmx1ZS00KTstLW1hbnRpbmUtY29sb3ItYmx1ZS1vdXRsaW5lLWhvdmVyOiByZ2JhKDc3LCAxNzEsIDI0NywgLjA1KTstLW1hbnRpbmUtY29sb3ItY3lhbi10ZXh0OiB2YXIoLS1tYW50aW5lLWNvbG9yLWN5YW4tNCk7LS1tYW50aW5lLWNvbG9yLWN5YW4tZmlsbGVkOiB2YXIoLS1tYW50aW5lLWNvbG9yLWN5YW4tOCk7LS1tYW50aW5lLWNvbG9yLWN5YW4tZmlsbGVkLWhvdmVyOiB2YXIoLS1tYW50aW5lLWNvbG9yLWN5YW4tOSk7LS1tYW50aW5lLWNvbG9yLWN5YW4tbGlnaHQ6IHJnYmEoNiwgNTcsIDY3LCAxKTstLW1hbnRpbmUtY29sb3ItY3lhbi1saWdodC1ob3ZlcjogcmdiYSg4LCA4MCwgOTMsIDEpOy0tbWFudGluZS1jb2xvci1jeWFuLWxpZ2h0LWNvbG9yOiB2YXIoLS1tYW50aW5lLWNvbG9yLWN5YW4tMCk7LS1tYW50aW5lLWNvbG9yLWN5YW4tb3V0bGluZTogdmFyKC0tbWFudGluZS1jb2xvci1jeWFuLTQpOy0tbWFudGluZS1jb2xvci1jeWFuLW91dGxpbmUtaG92ZXI6IHJnYmEoNTksIDIwMSwgMjE5LCAuMDUpOy0tbWFudGluZS1jb2xvci10ZWFsLXRleHQ6IHZhcigtLW1hbnRpbmUtY29sb3ItdGVhbC00KTstLW1hbnRpbmUtY29sb3ItdGVhbC1maWxsZWQ6IHZhcigtLW1hbnRpbmUtY29sb3ItdGVhbC04KTstLW1hbnRpbmUtY29sb3ItdGVhbC1maWxsZWQtaG92ZXI6IHZhcigtLW1hbnRpbmUtY29sb3ItdGVhbC05KTstLW1hbnRpbmUtY29sb3ItdGVhbC1saWdodDogcmdiYSg0LCA2NCwgNDYsIDEpOy0tbWFudGluZS1jb2xvci10ZWFsLWxpZ2h0LWhvdmVyOiByZ2JhKDYsIDg5LCA2NCwgMSk7LS1tYW50aW5lLWNvbG9yLXRlYWwtbGlnaHQtY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItdGVhbC0wKTstLW1hbnRpbmUtY29sb3ItdGVhbC1vdXRsaW5lOiB2YXIoLS1tYW50aW5lLWNvbG9yLXRlYWwtNCk7LS1tYW50aW5lLWNvbG9yLXRlYWwtb3V0bGluZS1ob3ZlcjogcmdiYSg1NiwgMjE3LCAxNjksIC4wNSk7LS1tYW50aW5lLWNvbG9yLWdyZWVuLXRleHQ6IHZhcigtLW1hbnRpbmUtY29sb3ItZ3JlZW4tNCk7LS1tYW50aW5lLWNvbG9yLWdyZWVuLWZpbGxlZDogdmFyKC0tbWFudGluZS1jb2xvci1ncmVlbi04KTstLW1hbnRpbmUtY29sb3ItZ3JlZW4tZmlsbGVkLWhvdmVyOiB2YXIoLS1tYW50aW5lLWNvbG9yLWdyZWVuLTkpOy0tbWFudGluZS1jb2xvci1ncmVlbi1saWdodDogcmdiYSgyMiwgNjksIDMxLCAxKTstLW1hbnRpbmUtY29sb3ItZ3JlZW4tbGlnaHQtaG92ZXI6IHJnYmEoMzAsIDk3LCA0MywgMSk7LS1tYW50aW5lLWNvbG9yLWdyZWVuLWxpZ2h0LWNvbG9yOiB2YXIoLS1tYW50aW5lLWNvbG9yLWdyZWVuLTApOy0tbWFudGluZS1jb2xvci1ncmVlbi1vdXRsaW5lOiB2YXIoLS1tYW50aW5lLWNvbG9yLWdyZWVuLTQpOy0tbWFudGluZS1jb2xvci1ncmVlbi1vdXRsaW5lLWhvdmVyOiByZ2JhKDEwNSwgMjE5LCAxMjQsIC4wNSk7LS1tYW50aW5lLWNvbG9yLWxpbWUtdGV4dDogdmFyKC0tbWFudGluZS1jb2xvci1saW1lLTQpOy0tbWFudGluZS1jb2xvci1saW1lLWZpbGxlZDogdmFyKC0tbWFudGluZS1jb2xvci1saW1lLTgpOy0tbWFudGluZS1jb2xvci1saW1lLWZpbGxlZC1ob3ZlcjogdmFyKC0tbWFudGluZS1jb2xvci1saW1lLTkpOy0tbWFudGluZS1jb2xvci1saW1lLWxpZ2h0OiByZ2JhKDQ2LCA3NCwgNywgMSk7LS1tYW50aW5lLWNvbG9yLWxpbWUtbGlnaHQtaG92ZXI6IHJnYmEoNjQsIDEwNCwgOSwgMSk7LS1tYW50aW5lLWNvbG9yLWxpbWUtbGlnaHQtY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItbGltZS0wKTstLW1hbnRpbmUtY29sb3ItbGltZS1vdXRsaW5lOiB2YXIoLS1tYW50aW5lLWNvbG9yLWxpbWUtNCk7LS1tYW50aW5lLWNvbG9yLWxpbWUtb3V0bGluZS1ob3ZlcjogcmdiYSgxNjksIDIyNywgNzUsIC4wNSk7LS1tYW50aW5lLWNvbG9yLXllbGxvdy10ZXh0OiB2YXIoLS1tYW50aW5lLWNvbG9yLXllbGxvdy00KTstLW1hbnRpbmUtY29sb3IteWVsbG93LWZpbGxlZDogdmFyKC0tbWFudGluZS1jb2xvci15ZWxsb3ctOCk7LS1tYW50aW5lLWNvbG9yLXllbGxvdy1maWxsZWQtaG92ZXI6IHZhcigtLW1hbnRpbmUtY29sb3IteWVsbG93LTkpOy0tbWFudGluZS1jb2xvci15ZWxsb3ctbGlnaHQ6IHJnYmEoMTE1LCA2MCwgMCwgMSk7LS1tYW50aW5lLWNvbG9yLXllbGxvdy1saWdodC1ob3ZlcjogcmdiYSgxNjEsIDgzLCAwLCAxKTstLW1hbnRpbmUtY29sb3IteWVsbG93LWxpZ2h0LWNvbG9yOiB2YXIoLS1tYW50aW5lLWNvbG9yLXllbGxvdy0wKTstLW1hbnRpbmUtY29sb3IteWVsbG93LW91dGxpbmU6IHZhcigtLW1hbnRpbmUtY29sb3IteWVsbG93LTQpOy0tbWFudGluZS1jb2xvci15ZWxsb3ctb3V0bGluZS1ob3ZlcjogcmdiYSgyNTUsIDIxMiwgNTksIC4wNSk7LS1tYW50aW5lLWNvbG9yLW9yYW5nZS10ZXh0OiB2YXIoLS1tYW50aW5lLWNvbG9yLW9yYW5nZS00KTstLW1hbnRpbmUtY29sb3Itb3JhbmdlLWZpbGxlZDogdmFyKC0tbWFudGluZS1jb2xvci1vcmFuZ2UtOCk7LS1tYW50aW5lLWNvbG9yLW9yYW5nZS1maWxsZWQtaG92ZXI6IHZhcigtLW1hbnRpbmUtY29sb3Itb3JhbmdlLTkpOy0tbWFudGluZS1jb2xvci1vcmFuZ2UtbGlnaHQ6IHJnYmEoMTA5LCAzNiwgOCwgMSk7LS1tYW50aW5lLWNvbG9yLW9yYW5nZS1saWdodC1ob3ZlcjogcmdiYSgxNTIsIDUwLCAxMSwgMSk7LS1tYW50aW5lLWNvbG9yLW9yYW5nZS1saWdodC1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci1vcmFuZ2UtMCk7LS1tYW50aW5lLWNvbG9yLW9yYW5nZS1vdXRsaW5lOiB2YXIoLS1tYW50aW5lLWNvbG9yLW9yYW5nZS00KTstLW1hbnRpbmUtY29sb3Itb3JhbmdlLW91dGxpbmUtaG92ZXI6IHJnYmEoMjU1LCAxNjksIDc3LCAuMDUpfTpyb290W2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdLDpob3N0KFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPSJsaWdodCJdKXstLW1hbnRpbmUtY29sb3Itc2NoZW1lOiBsaWdodDstLW1hbnRpbmUtcHJpbWFyeS1jb2xvci1jb250cmFzdDogdmFyKC0tbWFudGluZS1jb2xvci13aGl0ZSk7LS1tYW50aW5lLWNvbG9yLWJyaWdodDogdmFyKC0tbWFudGluZS1jb2xvci1ibGFjayk7LS1tYW50aW5lLWNvbG9yLXRleHQ6ICMwMDA7LS1tYW50aW5lLWNvbG9yLWJvZHk6ICNmZmY7LS1tYW50aW5lLWNvbG9yLWVycm9yOiB2YXIoLS1tYW50aW5lLWNvbG9yLXJlZC02KTstLW1hbnRpbmUtY29sb3ItcGxhY2Vob2xkZXI6IHZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS01KTstLW1hbnRpbmUtY29sb3ItYW5jaG9yOiB2YXIoLS1tYW50aW5lLWNvbG9yLWJsdWUtNik7LS1tYW50aW5lLWNvbG9yLWRlZmF1bHQ6IHZhcigtLW1hbnRpbmUtY29sb3Itd2hpdGUpOy0tbWFudGluZS1jb2xvci1kZWZhdWx0LWhvdmVyOiB2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMCk7LS1tYW50aW5lLWNvbG9yLWRlZmF1bHQtY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItYmxhY2spOy0tbWFudGluZS1jb2xvci1kZWZhdWx0LWJvcmRlcjogdmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTQpOy0tbWFudGluZS1jb2xvci1kaW1tZWQ6IHZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS02KTstLW1hbnRpbmUtY29sb3ItZGlzYWJsZWQ6IHZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS0yKTstLW1hbnRpbmUtY29sb3ItZGlzYWJsZWQtY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS01KTstLW1hbnRpbmUtY29sb3ItZGlzYWJsZWQtYm9yZGVyOiB2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMyk7LS1tYW50aW5lLWNvbG9yLWRhcmstdGV4dDogdmFyKC0tbWFudGluZS1jb2xvci1kYXJrLWZpbGxlZCk7LS1tYW50aW5lLWNvbG9yLWRhcmstZmlsbGVkOiB2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNik7LS1tYW50aW5lLWNvbG9yLWRhcmstZmlsbGVkLWhvdmVyOiB2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNyk7LS1tYW50aW5lLWNvbG9yLWRhcmstbGlnaHQ6IHZhcigtLW1hbnRpbmUtY29sb3ItZGFyay0xKTstLW1hbnRpbmUtY29sb3ItZGFyay1saWdodC1ob3ZlcjogdmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTIpOy0tbWFudGluZS1jb2xvci1kYXJrLWxpZ2h0LWNvbG9yOiB2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstOSk7LS1tYW50aW5lLWNvbG9yLWRhcmstb3V0bGluZTogdmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTYpOy0tbWFudGluZS1jb2xvci1kYXJrLW91dGxpbmUtaG92ZXI6IHJnYmEoNDYsIDQ2LCA0NiwgLjA1KTstLW1hbnRpbmUtY29sb3ItZ3JheS10ZXh0OiB2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktZmlsbGVkKTstLW1hbnRpbmUtY29sb3ItZ3JheS1maWxsZWQ6IHZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS02KTstLW1hbnRpbmUtY29sb3ItZ3JheS1maWxsZWQtaG92ZXI6IHZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS03KTstLW1hbnRpbmUtY29sb3ItZ3JheS1saWdodDogdmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTEpOy0tbWFudGluZS1jb2xvci1ncmF5LWxpZ2h0LWhvdmVyOiB2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMik7LS1tYW50aW5lLWNvbG9yLWdyYXktbGlnaHQtY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS05KTstLW1hbnRpbmUtY29sb3ItZ3JheS1vdXRsaW5lOiB2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktNik7LS1tYW50aW5lLWNvbG9yLWdyYXktb3V0bGluZS1ob3ZlcjogcmdiYSgxMzQsIDE0MiwgMTUwLCAuMDUpOy0tbWFudGluZS1jb2xvci1yZWQtdGV4dDogdmFyKC0tbWFudGluZS1jb2xvci1yZWQtZmlsbGVkKTstLW1hbnRpbmUtY29sb3ItcmVkLWZpbGxlZDogdmFyKC0tbWFudGluZS1jb2xvci1yZWQtNik7LS1tYW50aW5lLWNvbG9yLXJlZC1maWxsZWQtaG92ZXI6IHZhcigtLW1hbnRpbmUtY29sb3ItcmVkLTcpOy0tbWFudGluZS1jb2xvci1yZWQtbGlnaHQ6IHZhcigtLW1hbnRpbmUtY29sb3ItcmVkLTEpOy0tbWFudGluZS1jb2xvci1yZWQtbGlnaHQtaG92ZXI6IHZhcigtLW1hbnRpbmUtY29sb3ItcmVkLTIpOy0tbWFudGluZS1jb2xvci1yZWQtbGlnaHQtY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItcmVkLTkpOy0tbWFudGluZS1jb2xvci1yZWQtb3V0bGluZTogdmFyKC0tbWFudGluZS1jb2xvci1yZWQtNik7LS1tYW50aW5lLWNvbG9yLXJlZC1vdXRsaW5lLWhvdmVyOiByZ2JhKDI1MCwgODIsIDgyLCAuMDUpOy0tbWFudGluZS1jb2xvci1waW5rLXRleHQ6IHZhcigtLW1hbnRpbmUtY29sb3ItcGluay1maWxsZWQpOy0tbWFudGluZS1jb2xvci1waW5rLWZpbGxlZDogdmFyKC0tbWFudGluZS1jb2xvci1waW5rLTYpOy0tbWFudGluZS1jb2xvci1waW5rLWZpbGxlZC1ob3ZlcjogdmFyKC0tbWFudGluZS1jb2xvci1waW5rLTcpOy0tbWFudGluZS1jb2xvci1waW5rLWxpZ2h0OiB2YXIoLS1tYW50aW5lLWNvbG9yLXBpbmstMSk7LS1tYW50aW5lLWNvbG9yLXBpbmstbGlnaHQtaG92ZXI6IHZhcigtLW1hbnRpbmUtY29sb3ItcGluay0yKTstLW1hbnRpbmUtY29sb3ItcGluay1saWdodC1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci1waW5rLTkpOy0tbWFudGluZS1jb2xvci1waW5rLW91dGxpbmU6IHZhcigtLW1hbnRpbmUtY29sb3ItcGluay02KTstLW1hbnRpbmUtY29sb3ItcGluay1vdXRsaW5lLWhvdmVyOiByZ2JhKDIzMCwgNzMsIDEyOCwgLjA1KTstLW1hbnRpbmUtY29sb3ItZ3JhcGUtdGV4dDogdmFyKC0tbWFudGluZS1jb2xvci1ncmFwZS1maWxsZWQpOy0tbWFudGluZS1jb2xvci1ncmFwZS1maWxsZWQ6IHZhcigtLW1hbnRpbmUtY29sb3ItZ3JhcGUtNik7LS1tYW50aW5lLWNvbG9yLWdyYXBlLWZpbGxlZC1ob3ZlcjogdmFyKC0tbWFudGluZS1jb2xvci1ncmFwZS03KTstLW1hbnRpbmUtY29sb3ItZ3JhcGUtbGlnaHQ6IHZhcigtLW1hbnRpbmUtY29sb3ItZ3JhcGUtMSk7LS1tYW50aW5lLWNvbG9yLWdyYXBlLWxpZ2h0LWhvdmVyOiB2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXBlLTIpOy0tbWFudGluZS1jb2xvci1ncmFwZS1saWdodC1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci1ncmFwZS05KTstLW1hbnRpbmUtY29sb3ItZ3JhcGUtb3V0bGluZTogdmFyKC0tbWFudGluZS1jb2xvci1ncmFwZS02KTstLW1hbnRpbmUtY29sb3ItZ3JhcGUtb3V0bGluZS1ob3ZlcjogcmdiYSgxOTAsIDc1LCAyMTksIC4wNSk7LS1tYW50aW5lLWNvbG9yLXZpb2xldC10ZXh0OiB2YXIoLS1tYW50aW5lLWNvbG9yLXZpb2xldC1maWxsZWQpOy0tbWFudGluZS1jb2xvci12aW9sZXQtZmlsbGVkOiB2YXIoLS1tYW50aW5lLWNvbG9yLXZpb2xldC02KTstLW1hbnRpbmUtY29sb3ItdmlvbGV0LWZpbGxlZC1ob3ZlcjogdmFyKC0tbWFudGluZS1jb2xvci12aW9sZXQtNyk7LS1tYW50aW5lLWNvbG9yLXZpb2xldC1saWdodDogdmFyKC0tbWFudGluZS1jb2xvci12aW9sZXQtMSk7LS1tYW50aW5lLWNvbG9yLXZpb2xldC1saWdodC1ob3ZlcjogdmFyKC0tbWFudGluZS1jb2xvci12aW9sZXQtMik7LS1tYW50aW5lLWNvbG9yLXZpb2xldC1saWdodC1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci12aW9sZXQtOSk7LS1tYW50aW5lLWNvbG9yLXZpb2xldC1vdXRsaW5lOiB2YXIoLS1tYW50aW5lLWNvbG9yLXZpb2xldC02KTstLW1hbnRpbmUtY29sb3ItdmlvbGV0LW91dGxpbmUtaG92ZXI6IHJnYmEoMTIxLCA4MCwgMjQyLCAuMDUpOy0tbWFudGluZS1jb2xvci1pbmRpZ28tdGV4dDogdmFyKC0tbWFudGluZS1jb2xvci1pbmRpZ28tZmlsbGVkKTstLW1hbnRpbmUtY29sb3ItaW5kaWdvLWZpbGxlZDogdmFyKC0tbWFudGluZS1jb2xvci1pbmRpZ28tNik7LS1tYW50aW5lLWNvbG9yLWluZGlnby1maWxsZWQtaG92ZXI6IHZhcigtLW1hbnRpbmUtY29sb3ItaW5kaWdvLTcpOy0tbWFudGluZS1jb2xvci1pbmRpZ28tbGlnaHQ6IHZhcigtLW1hbnRpbmUtY29sb3ItaW5kaWdvLTEpOy0tbWFudGluZS1jb2xvci1pbmRpZ28tbGlnaHQtaG92ZXI6IHZhcigtLW1hbnRpbmUtY29sb3ItaW5kaWdvLTIpOy0tbWFudGluZS1jb2xvci1pbmRpZ28tbGlnaHQtY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItaW5kaWdvLTkpOy0tbWFudGluZS1jb2xvci1pbmRpZ28tb3V0bGluZTogdmFyKC0tbWFudGluZS1jb2xvci1pbmRpZ28tNik7LS1tYW50aW5lLWNvbG9yLWluZGlnby1vdXRsaW5lLWhvdmVyOiByZ2JhKDc2LCAxMTAsIDI0NSwgLjA1KTstLW1hbnRpbmUtY29sb3ItYmx1ZS10ZXh0OiB2YXIoLS1tYW50aW5lLWNvbG9yLWJsdWUtZmlsbGVkKTstLW1hbnRpbmUtY29sb3ItYmx1ZS1maWxsZWQ6IHZhcigtLW1hbnRpbmUtY29sb3ItYmx1ZS02KTstLW1hbnRpbmUtY29sb3ItYmx1ZS1maWxsZWQtaG92ZXI6IHZhcigtLW1hbnRpbmUtY29sb3ItYmx1ZS03KTstLW1hbnRpbmUtY29sb3ItYmx1ZS1saWdodDogdmFyKC0tbWFudGluZS1jb2xvci1ibHVlLTEpOy0tbWFudGluZS1jb2xvci1ibHVlLWxpZ2h0LWhvdmVyOiB2YXIoLS1tYW50aW5lLWNvbG9yLWJsdWUtMik7LS1tYW50aW5lLWNvbG9yLWJsdWUtbGlnaHQtY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItYmx1ZS05KTstLW1hbnRpbmUtY29sb3ItYmx1ZS1vdXRsaW5lOiB2YXIoLS1tYW50aW5lLWNvbG9yLWJsdWUtNik7LS1tYW50aW5lLWNvbG9yLWJsdWUtb3V0bGluZS1ob3ZlcjogcmdiYSgzNCwgMTM5LCAyMzAsIC4wNSk7LS1tYW50aW5lLWNvbG9yLWN5YW4tdGV4dDogdmFyKC0tbWFudGluZS1jb2xvci1jeWFuLWZpbGxlZCk7LS1tYW50aW5lLWNvbG9yLWN5YW4tZmlsbGVkOiB2YXIoLS1tYW50aW5lLWNvbG9yLWN5YW4tNik7LS1tYW50aW5lLWNvbG9yLWN5YW4tZmlsbGVkLWhvdmVyOiB2YXIoLS1tYW50aW5lLWNvbG9yLWN5YW4tNyk7LS1tYW50aW5lLWNvbG9yLWN5YW4tbGlnaHQ6IHZhcigtLW1hbnRpbmUtY29sb3ItY3lhbi0xKTstLW1hbnRpbmUtY29sb3ItY3lhbi1saWdodC1ob3ZlcjogdmFyKC0tbWFudGluZS1jb2xvci1jeWFuLTIpOy0tbWFudGluZS1jb2xvci1jeWFuLWxpZ2h0LWNvbG9yOiB2YXIoLS1tYW50aW5lLWNvbG9yLWN5YW4tOSk7LS1tYW50aW5lLWNvbG9yLWN5YW4tb3V0bGluZTogdmFyKC0tbWFudGluZS1jb2xvci1jeWFuLTYpOy0tbWFudGluZS1jb2xvci1jeWFuLW91dGxpbmUtaG92ZXI6IHJnYmEoMjEsIDE3MCwgMTkxLCAuMDUpOy0tbWFudGluZS1jb2xvci10ZWFsLXRleHQ6IHZhcigtLW1hbnRpbmUtY29sb3ItdGVhbC1maWxsZWQpOy0tbWFudGluZS1jb2xvci10ZWFsLWZpbGxlZDogdmFyKC0tbWFudGluZS1jb2xvci10ZWFsLTYpOy0tbWFudGluZS1jb2xvci10ZWFsLWZpbGxlZC1ob3ZlcjogdmFyKC0tbWFudGluZS1jb2xvci10ZWFsLTcpOy0tbWFudGluZS1jb2xvci10ZWFsLWxpZ2h0OiB2YXIoLS1tYW50aW5lLWNvbG9yLXRlYWwtMSk7LS1tYW50aW5lLWNvbG9yLXRlYWwtbGlnaHQtaG92ZXI6IHZhcigtLW1hbnRpbmUtY29sb3ItdGVhbC0yKTstLW1hbnRpbmUtY29sb3ItdGVhbC1saWdodC1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci10ZWFsLTkpOy0tbWFudGluZS1jb2xvci10ZWFsLW91dGxpbmU6IHZhcigtLW1hbnRpbmUtY29sb3ItdGVhbC02KTstLW1hbnRpbmUtY29sb3ItdGVhbC1vdXRsaW5lLWhvdmVyOiByZ2JhKDE4LCAxODQsIDEzNCwgLjA1KTstLW1hbnRpbmUtY29sb3ItZ3JlZW4tdGV4dDogdmFyKC0tbWFudGluZS1jb2xvci1ncmVlbi1maWxsZWQpOy0tbWFudGluZS1jb2xvci1ncmVlbi1maWxsZWQ6IHZhcigtLW1hbnRpbmUtY29sb3ItZ3JlZW4tNik7LS1tYW50aW5lLWNvbG9yLWdyZWVuLWZpbGxlZC1ob3ZlcjogdmFyKC0tbWFudGluZS1jb2xvci1ncmVlbi03KTstLW1hbnRpbmUtY29sb3ItZ3JlZW4tbGlnaHQ6IHZhcigtLW1hbnRpbmUtY29sb3ItZ3JlZW4tMSk7LS1tYW50aW5lLWNvbG9yLWdyZWVuLWxpZ2h0LWhvdmVyOiB2YXIoLS1tYW50aW5lLWNvbG9yLWdyZWVuLTIpOy0tbWFudGluZS1jb2xvci1ncmVlbi1saWdodC1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci1ncmVlbi05KTstLW1hbnRpbmUtY29sb3ItZ3JlZW4tb3V0bGluZTogdmFyKC0tbWFudGluZS1jb2xvci1ncmVlbi02KTstLW1hbnRpbmUtY29sb3ItZ3JlZW4tb3V0bGluZS1ob3ZlcjogcmdiYSg2NCwgMTkyLCA4NywgLjA1KTstLW1hbnRpbmUtY29sb3ItbGltZS10ZXh0OiB2YXIoLS1tYW50aW5lLWNvbG9yLWxpbWUtZmlsbGVkKTstLW1hbnRpbmUtY29sb3ItbGltZS1maWxsZWQ6IHZhcigtLW1hbnRpbmUtY29sb3ItbGltZS02KTstLW1hbnRpbmUtY29sb3ItbGltZS1maWxsZWQtaG92ZXI6IHZhcigtLW1hbnRpbmUtY29sb3ItbGltZS03KTstLW1hbnRpbmUtY29sb3ItbGltZS1saWdodDogdmFyKC0tbWFudGluZS1jb2xvci1saW1lLTEpOy0tbWFudGluZS1jb2xvci1saW1lLWxpZ2h0LWhvdmVyOiB2YXIoLS1tYW50aW5lLWNvbG9yLWxpbWUtMik7LS1tYW50aW5lLWNvbG9yLWxpbWUtbGlnaHQtY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItbGltZS05KTstLW1hbnRpbmUtY29sb3ItbGltZS1vdXRsaW5lOiB2YXIoLS1tYW50aW5lLWNvbG9yLWxpbWUtNik7LS1tYW50aW5lLWNvbG9yLWxpbWUtb3V0bGluZS1ob3ZlcjogcmdiYSgxMzAsIDIwMSwgMzAsIC4wNSk7LS1tYW50aW5lLWNvbG9yLXllbGxvdy10ZXh0OiB2YXIoLS1tYW50aW5lLWNvbG9yLXllbGxvdy1maWxsZWQpOy0tbWFudGluZS1jb2xvci15ZWxsb3ctZmlsbGVkOiB2YXIoLS1tYW50aW5lLWNvbG9yLXllbGxvdy02KTstLW1hbnRpbmUtY29sb3IteWVsbG93LWZpbGxlZC1ob3ZlcjogdmFyKC0tbWFudGluZS1jb2xvci15ZWxsb3ctNyk7LS1tYW50aW5lLWNvbG9yLXllbGxvdy1saWdodDogdmFyKC0tbWFudGluZS1jb2xvci15ZWxsb3ctMSk7LS1tYW50aW5lLWNvbG9yLXllbGxvdy1saWdodC1ob3ZlcjogdmFyKC0tbWFudGluZS1jb2xvci15ZWxsb3ctMik7LS1tYW50aW5lLWNvbG9yLXllbGxvdy1saWdodC1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci15ZWxsb3ctOSk7LS1tYW50aW5lLWNvbG9yLXllbGxvdy1vdXRsaW5lOiB2YXIoLS1tYW50aW5lLWNvbG9yLXllbGxvdy02KTstLW1hbnRpbmUtY29sb3IteWVsbG93LW91dGxpbmUtaG92ZXI6IHJnYmEoMjUwLCAxNzYsIDUsIC4wNSk7LS1tYW50aW5lLWNvbG9yLW9yYW5nZS10ZXh0OiB2YXIoLS1tYW50aW5lLWNvbG9yLW9yYW5nZS1maWxsZWQpOy0tbWFudGluZS1jb2xvci1vcmFuZ2UtZmlsbGVkOiB2YXIoLS1tYW50aW5lLWNvbG9yLW9yYW5nZS02KTstLW1hbnRpbmUtY29sb3Itb3JhbmdlLWZpbGxlZC1ob3ZlcjogdmFyKC0tbWFudGluZS1jb2xvci1vcmFuZ2UtNyk7LS1tYW50aW5lLWNvbG9yLW9yYW5nZS1saWdodDogdmFyKC0tbWFudGluZS1jb2xvci1vcmFuZ2UtMSk7LS1tYW50aW5lLWNvbG9yLW9yYW5nZS1saWdodC1ob3ZlcjogdmFyKC0tbWFudGluZS1jb2xvci1vcmFuZ2UtMik7LS1tYW50aW5lLWNvbG9yLW9yYW5nZS1saWdodC1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci1vcmFuZ2UtOSk7LS1tYW50aW5lLWNvbG9yLW9yYW5nZS1vdXRsaW5lOiB2YXIoLS1tYW50aW5lLWNvbG9yLW9yYW5nZS02KTstLW1hbnRpbmUtY29sb3Itb3JhbmdlLW91dGxpbmUtaG92ZXI6IHJnYmEoMjUzLCAxMjYsIDIwLCAuMDUpfS5tX2Q1NzA2OWI1ey0tc2Nyb2xsYXJlYS1zY3JvbGxiYXItc2l6ZTogY2FsYyguNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7cG9zaXRpb246cmVsYXRpdmU7b3ZlcmZsb3c6aGlkZGVufS5tX2Q1NzA2OWI1OndoZXJlKFtkYXRhLWF1dG9zaXplXSkgLm1fYjEzMzZjNnttaW4td2lkdGg6bWluLWNvbnRlbnR9Lm1fYzA3ODNmZjl7c2Nyb2xsYmFyLXdpZHRoOm5vbmU7b3ZlcnNjcm9sbC1iZWhhdmlvcjp2YXIoLS1zY3JvbGxhcmVhLW92ZXItc2Nyb2xsLWJlaGF2aW9yKTstbXMtb3ZlcmZsb3ctc3R5bGU6bm9uZTstd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzp0b3VjaDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlfS5tX2MwNzgzZmY5Ojotd2Via2l0LXNjcm9sbGJhcntkaXNwbGF5Om5vbmV9Lm1fYzA3ODNmZjk6d2hlcmUoW2RhdGEtc2Nyb2xsYmFycz14eV0sW2RhdGEtc2Nyb2xsYmFycz15XSk6d2hlcmUoW2RhdGEtb2Zmc2V0LXNjcm9sbGJhcnM9eHldLFtkYXRhLW9mZnNldC1zY3JvbGxiYXJzPXldLFtkYXRhLW9mZnNldC1zY3JvbGxiYXJzPXByZXNlbnRdKTp3aGVyZShbZGF0YS12ZXJ0aWNhbC1oaWRkZW5dKXtwYWRkaW5nLWlubGluZS1lbmQ6MDtwYWRkaW5nLWlubGluZS1zdGFydDowfS5tX2MwNzgzZmY5OndoZXJlKFtkYXRhLXNjcm9sbGJhcnM9eHldLFtkYXRhLXNjcm9sbGJhcnM9eV0pOndoZXJlKFtkYXRhLW9mZnNldC1zY3JvbGxiYXJzPXh5XSxbZGF0YS1vZmZzZXQtc2Nyb2xsYmFycz15XSxbZGF0YS1vZmZzZXQtc2Nyb2xsYmFycz1wcmVzZW50XSk6bm90KFtkYXRhLXZlcnRpY2FsLWhpZGRlbl0pe3BhZGRpbmctaW5saW5lLWVuZDp2YXIoLS1zY3JvbGxhcmVhLXNjcm9sbGJhci1zaXplKTtwYWRkaW5nLWlubGluZS1zdGFydDp1bnNldH0ubV9jMDc4M2ZmOTp3aGVyZShbZGF0YS1zY3JvbGxiYXJzPXh5XSxbZGF0YS1zY3JvbGxiYXJzPXhdKTp3aGVyZShbZGF0YS1vZmZzZXQtc2Nyb2xsYmFycz14eV0sW2RhdGEtb2Zmc2V0LXNjcm9sbGJhcnM9eF0sW2RhdGEtb2Zmc2V0LXNjcm9sbGJhcnM9cHJlc2VudF0pOndoZXJlKFtkYXRhLWhvcml6b250YWwtaGlkZGVuXSl7cGFkZGluZy1ib3R0b206MH0ubV9jMDc4M2ZmOTp3aGVyZShbZGF0YS1zY3JvbGxiYXJzPXh5XSxbZGF0YS1zY3JvbGxiYXJzPXhdKTp3aGVyZShbZGF0YS1vZmZzZXQtc2Nyb2xsYmFycz14eV0sW2RhdGEtb2Zmc2V0LXNjcm9sbGJhcnM9eF0sW2RhdGEtb2Zmc2V0LXNjcm9sbGJhcnM9cHJlc2VudF0pOm5vdChbZGF0YS1ob3Jpem9udGFsLWhpZGRlbl0pe3BhZGRpbmctYm90dG9tOnZhcigtLXNjcm9sbGFyZWEtc2Nyb2xsYmFyLXNpemUpfS5tX2Y4ZjYzMWRke21pbi13aWR0aDoxMDAlO2Rpc3BsYXk6dGFibGV9Lm1fYzQ0YmE5MzN7dXNlci1zZWxlY3Q6bm9uZTt0b3VjaC1hY3Rpb246bm9uZTtib3gtc2l6aW5nOmJvcmRlci1ib3g7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIC4xNXMgZWFzZSxvcGFjaXR5IC4xNXMgZWFzZTtwYWRkaW5nOmNhbGModmFyKC0tc2Nyb2xsYXJlYS1zY3JvbGxiYXItc2l6ZSkgLyA1KTtkaXNwbGF5OmZsZXg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtmbGV4LWRpcmVjdGlvbjpyb3d9QG1lZGlhKGhvdmVyOmhvdmVyKXs6d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV9jNDRiYTkzMzpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS0wKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV9jNDRiYTkzMzpob3Zlcj4ubV9kOGI1ZTM2M3tiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwMDA4MH06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tX2M0NGJhOTMzOmhvdmVye2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTgpfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1kYXJrXSkgLm1fYzQ0YmE5MzM6aG92ZXI+Lm1fZDhiNWUzNjN7YmFja2dyb3VuZC1jb2xvcjojZmZmZmZmODB9fUBtZWRpYShob3Zlcjpub25lKXs6d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV9jNDRiYTkzMzphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMCl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fYzQ0YmE5MzM6YWN0aXZlPi5tX2Q4YjVlMzYze2JhY2tncm91bmQtY29sb3I6IzAwMDAwMDgwfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1kYXJrXSkgLm1fYzQ0YmE5MzM6YWN0aXZle2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTgpfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1kYXJrXSkgLm1fYzQ0YmE5MzM6YWN0aXZlPi5tX2Q4YjVlMzYze2JhY2tncm91bmQtY29sb3I6I2ZmZmZmZjgwfX0ubV9jNDRiYTkzMzp3aGVyZShbZGF0YS1oaWRkZW5dLFtkYXRhLXN0YXRlPWhpZGRlbl0pe2Rpc3BsYXk6bm9uZX0ubV9jNDRiYTkzMzp3aGVyZShbZGF0YS1vcmllbnRhdGlvbj12ZXJ0aWNhbF0pe3dpZHRoOnZhcigtLXNjcm9sbGFyZWEtc2Nyb2xsYmFyLXNpemUpO3RvcDowO2JvdHRvbTp2YXIoLS1zYS1jb3JuZXItd2lkdGgpO2luc2V0LWlubGluZS1lbmQ6MH0ubV9jNDRiYTkzMzp3aGVyZShbZGF0YS1vcmllbnRhdGlvbj1ob3Jpem9udGFsXSl7aGVpZ2h0OnZhcigtLXNjcm9sbGFyZWEtc2Nyb2xsYmFyLXNpemUpO2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtib3R0b206MDtpbnNldC1pbmxpbmUtc3RhcnQ6MDtpbnNldC1pbmxpbmUtZW5kOnZhcigtLXNhLWNvcm5lci13aWR0aCl9Lm1fZDhiNWUzNjN7ZmxleDoxO2JvcmRlci1yYWRpdXM6dmFyKC0tc2Nyb2xsYXJlYS1zY3JvbGxiYXItc2l6ZSk7cG9zaXRpb246cmVsYXRpdmU7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIC4xNXMgZWFzZTtvdmVyZmxvdzpoaWRkZW47b3BhY2l0eTp2YXIoLS10aHVtYi1vcGFjaXR5KX0ubV9kOGI1ZTM2MzpiZWZvcmV7Y29udGVudDoiIjtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6NTAlO2xlZnQ6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGUoLTUwJSwtNTAlKTt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO21pbi13aWR0aDpjYWxjKDIuNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7bWluLWhlaWdodDpjYWxjKDIuNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fZDhiNWUzNjN7YmFja2dyb3VuZC1jb2xvcjojMDAwNn06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tX2Q4YjVlMzYze2JhY2tncm91bmQtY29sb3I6I2ZmZjZ9Lm1fMjE2NTcyNjh7cG9zaXRpb246YWJzb2x1dGU7b3BhY2l0eTowO3RyYW5zaXRpb246b3BhY2l0eSAuMTVzIGVhc2U7ZGlzcGxheTpibG9jaztpbnNldC1pbmxpbmUtZW5kOjA7Ym90dG9tOjB9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fMjE2NTcyNjh7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMCl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdKSAubV8yMTY1NzI2OHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGFyay04KX0ubV8yMTY1NzI2ODp3aGVyZShbZGF0YS1ob3ZlcmVkXSl7b3BhY2l0eToxfS5tXzIxNjU3MjY4OndoZXJlKFtkYXRhLWhpZGRlbl0pe2Rpc3BsYXk6bm9uZX0ubV9iMTMzNmM2e21pbi13aWR0aDoxMDAlfS5tXzg3Y2YyNjMxe2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Y3Vyc29yOnBvaW50ZXI7Ym9yZGVyOjA7cGFkZGluZzowO2FwcGVhcmFuY2U6bm9uZTtmb250LXNpemU6dmFyKC0tbWFudGluZS1mb250LXNpemUtbWQpO3RleHQtYWxpZ246bGVmdDt0ZXh0LWRlY29yYXRpb246bm9uZTtjb2xvcjppbmhlcml0O3RvdWNoLWFjdGlvbjptYW5pcHVsYXRpb247LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50fTp3aGVyZShbZGlyPXJ0bF0pIC5tXzg3Y2YyNjMxe3RleHQtYWxpZ246cmlnaHR9Lm1fNTE1YTk3Zjh7Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDpjYWxjKC4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpO3dpZHRoOmNhbGMoLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7bWFyZ2luOmNhbGMoLS4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpO292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2hpdGUtc3BhY2U6bm93cmFwfS5tXzFiNzI4NGEzey0tcGFwZXItcmFkaXVzOiB2YXIoLS1tYW50aW5lLXJhZGl1cy1kZWZhdWx0KTtvdXRsaW5lOjA7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O2Rpc3BsYXk6YmxvY2s7dG91Y2gtYWN0aW9uOm1hbmlwdWxhdGlvbjt0ZXh0LWRlY29yYXRpb246bm9uZTtib3JkZXItcmFkaXVzOnZhcigtLXBhcGVyLXJhZGl1cyk7Ym94LXNoYWRvdzp2YXIoLS1wYXBlci1zaGFkb3cpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1ib2R5KX1bZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1saWdodF0gLm1fMWI3Mjg0YTN7LS1wYXBlci1ib3JkZXItY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS0zKX1bZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1kYXJrXSAubV8xYjcyODRhM3stLXBhcGVyLWJvcmRlci1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTQpfS5tXzFiNzI4NGEzOndoZXJlKFtkYXRhLXdpdGgtYm9yZGVyXSl7Ym9yZGVyOmNhbGMoLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkgc29saWQgdmFyKC0tcGFwZXItYm9yZGVyLWNvbG9yKX0ubV85ODE0ZTQ1ZntpbnNldDowO3Bvc2l0aW9uOmFic29sdXRlO2JhY2tncm91bmQ6dmFyKC0tb3ZlcmxheS1iZywgcmdiYSgwLCAwLCAwLCAuNikpOy13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOnZhcigtLW92ZXJsYXktZmlsdGVyKTtiYWNrZHJvcC1maWx0ZXI6dmFyKC0tb3ZlcmxheS1maWx0ZXIpO2JvcmRlci1yYWRpdXM6dmFyKC0tb3ZlcmxheS1yYWRpdXMsIDApO3otaW5kZXg6dmFyKC0tb3ZlcmxheS16LWluZGV4KX0ubV85ODE0ZTQ1Zjp3aGVyZShbZGF0YS1maXhlZF0pe3Bvc2l0aW9uOmZpeGVkfS5tXzk4MTRlNDVmOndoZXJlKFtkYXRhLWNlbnRlcl0pe2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcn0ubV8zOGE4NTY1OXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLXBvcG92ZXItYm9yZGVyLWNvbG9yKTtwYWRkaW5nOnZhcigtLW1hbnRpbmUtc3BhY2luZy1zbSkgdmFyKC0tbWFudGluZS1zcGFjaW5nLW1kKTtib3gtc2hhZG93OnZhcigtLXBvcG92ZXItc2hhZG93LCBub25lKTtib3JkZXItcmFkaXVzOnZhcigtLXBvcG92ZXItcmFkaXVzLCB2YXIoLS1tYW50aW5lLXJhZGl1cy1kZWZhdWx0KSl9Lm1fMzhhODU2NTk6d2hlcmUoW2RhdGEtZml4ZWRdKXtwb3NpdGlvbjpmaXhlZH0ubV8zOGE4NTY1OTpmb2N1c3tvdXRsaW5lOm5vbmV9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fMzhhODU2NTl7LS1wb3BvdmVyLWJvcmRlci1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTIpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci13aGl0ZSl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdKSAubV8zOGE4NTY1OXstLXBvcG92ZXItYm9yZGVyLWNvbG9yOiB2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNCk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNil9Lm1fYTMxZGM2YzF7YmFja2dyb3VuZC1jb2xvcjppbmhlcml0O2JvcmRlcjoxcHggc29saWQgdmFyKC0tcG9wb3Zlci1ib3JkZXItY29sb3IpO3otaW5kZXg6MX0ubV8zZDdiYzkwOHtwb3NpdGlvbjpmaXhlZDtpbnNldDowfS5tXzVhZTJlM2N7LS1sb2FkZXItc2l6ZS14czogY2FsYygxLjEyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWxvYWRlci1zaXplLXNtOiBjYWxjKDEuMzc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tbG9hZGVyLXNpemUtbWQ6IGNhbGMoMi4yNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWxvYWRlci1zaXplLWxnOiBjYWxjKDIuNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1sb2FkZXItc2l6ZS14bDogY2FsYygzLjYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWxvYWRlci1zaXplOiB2YXIoLS1sb2FkZXItc2l6ZS1tZCk7LS1sb2FkZXItY29sb3I6IHZhcigtLW1hbnRpbmUtcHJpbWFyeS1jb2xvci1maWxsZWQpfUBrZXlmcmFtZXMgbV81ZDJiM2I5ZHswJXt0cmFuc2Zvcm06c2NhbGUoLjYpO29wYWNpdHk6MH01MCUsdG97dHJhbnNmb3JtOnNjYWxlKDEpfX0ubV83YTJiZDRjZHtwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDp2YXIoLS1sb2FkZXItc2l6ZSk7aGVpZ2h0OnZhcigtLWxvYWRlci1zaXplKTtkaXNwbGF5OmZsZXg7Z2FwOmNhbGModmFyKC0tbG9hZGVyLXNpemUpIC8gNSl9Lm1fODcwYmI3OXtmbGV4OjE7YmFja2dyb3VuZDp2YXIoLS1sb2FkZXItY29sb3IpO2FuaW1hdGlvbjptXzVkMmIzYjlkIDEuMnMgY3ViaWMtYmV6aWVyKDAsLjUsLjUsMSkgaW5maW5pdGU7Ym9yZGVyLXJhZGl1czpjYWxjKC4xMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSl9Lm1fODcwYmI3OTpudGgtb2YtdHlwZSgxKXthbmltYXRpb24tZGVsYXk6LS4yNHN9Lm1fODcwYmI3OTpudGgtb2YtdHlwZSgyKXthbmltYXRpb24tZGVsYXk6LS4xMnN9Lm1fODcwYmI3OTpudGgtb2YtdHlwZSgzKXthbmltYXRpb24tZGVsYXk6MH1Aa2V5ZnJhbWVzIG1fYWFjMzRhMXswJSx0b3t0cmFuc2Zvcm06c2NhbGUoMSk7b3BhY2l0eToxfTUwJXt0cmFuc2Zvcm06c2NhbGUoLjYpO29wYWNpdHk6LjV9fS5tXzRlM2YyMmQ3e2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6Y2FsYyh2YXIoLS1sb2FkZXItc2l6ZSkgLyAxMCk7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6dmFyKC0tbG9hZGVyLXNpemUpO2hlaWdodDp2YXIoLS1sb2FkZXItc2l6ZSl9Lm1fODcwYzRhZnt3aWR0aDpjYWxjKHZhcigtLWxvYWRlci1zaXplKSAvIDMgLSB2YXIoLS1sb2FkZXItc2l6ZSkgLyAxNSk7aGVpZ2h0OmNhbGModmFyKC0tbG9hZGVyLXNpemUpIC8gMyAtIHZhcigtLWxvYWRlci1zaXplKSAvIDE1KTtib3JkZXItcmFkaXVzOjUwJTtiYWNrZ3JvdW5kOnZhcigtLWxvYWRlci1jb2xvcik7YW5pbWF0aW9uOm1fYWFjMzRhMSAuOHMgaW5maW5pdGUgbGluZWFyfS5tXzg3MGM0YWY6bnRoLWNoaWxkKDIpe2FuaW1hdGlvbi1kZWxheTouNHN9QGtleWZyYW1lcyBtX2Y4ZTg5YzRiezAle3RyYW5zZm9ybTpyb3RhdGUoMCl9dG97dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX0ubV9iMzQ0MTRkZntkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDp2YXIoLS1sb2FkZXItc2l6ZSk7aGVpZ2h0OnZhcigtLWxvYWRlci1zaXplKX0ubV9iMzQ0MTRkZjphZnRlcntjb250ZW50OiIiO2Rpc3BsYXk6YmxvY2s7d2lkdGg6dmFyKC0tbG9hZGVyLXNpemUpO2hlaWdodDp2YXIoLS1sb2FkZXItc2l6ZSk7Ym9yZGVyLXJhZGl1czpjYWxjKDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTtib3JkZXItd2lkdGg6Y2FsYyh2YXIoLS1sb2FkZXItc2l6ZSkgLyA4KTtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLWNvbG9yOnZhcigtLWxvYWRlci1jb2xvcikgdmFyKC0tbG9hZGVyLWNvbG9yKSB2YXIoLS1sb2FkZXItY29sb3IpIHRyYW5zcGFyZW50O2FuaW1hdGlvbjptX2Y4ZTg5YzRiIDEuMnMgbGluZWFyIGluZmluaXRlfS5tXzhkM2Y0MDAwey0tYWktc2l6ZS14czogY2FsYygxLjEyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWFpLXNpemUtc206IGNhbGMoMS4zNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1haS1zaXplLW1kOiBjYWxjKDEuNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1haS1zaXplLWxnOiBjYWxjKDIuMTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tYWktc2l6ZS14bDogY2FsYygyLjc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tYWktc2l6ZS1pbnB1dC14czogY2FsYygxLjg3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWFpLXNpemUtaW5wdXQtc206IGNhbGMoMi4yNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWFpLXNpemUtaW5wdXQtbWQ6IGNhbGMoMi42MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1haS1zaXplLWlucHV0LWxnOiBjYWxjKDMuMTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tYWktc2l6ZS1pbnB1dC14bDogY2FsYygzLjc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tYWktc2l6ZTogdmFyKC0tYWktc2l6ZS1tZCk7LS1haS1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci13aGl0ZSk7bGluZS1oZWlnaHQ6MTtkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3Bvc2l0aW9uOnJlbGF0aXZlO3VzZXItc2VsZWN0Om5vbmU7b3ZlcmZsb3c6aGlkZGVuO3dpZHRoOnZhcigtLWFpLXNpemUpO2hlaWdodDp2YXIoLS1haS1zaXplKTttaW4td2lkdGg6dmFyKC0tYWktc2l6ZSk7bWluLWhlaWdodDp2YXIoLS1haS1zaXplKTtib3JkZXItcmFkaXVzOnZhcigtLWFpLXJhZGl1cywgdmFyKC0tbWFudGluZS1yYWRpdXMtZGVmYXVsdCkpO2JhY2tncm91bmQ6dmFyKC0tYWktYmcsIHZhcigtLW1hbnRpbmUtcHJpbWFyeS1jb2xvci1maWxsZWQpKTtjb2xvcjp2YXIoLS1haS1jb2xvciwgdmFyKC0tbWFudGluZS1jb2xvci13aGl0ZSkpO2JvcmRlcjp2YXIoLS1haS1iZCwgY2FsYyguMDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSBzb2xpZCB0cmFuc3BhcmVudCk7Y3Vyc29yOnBvaW50ZXJ9QG1lZGlhKGhvdmVyOmhvdmVyKXsubV84ZDNmNDAwMDpob3Zlcjp3aGVyZSg6bm90KFtkYXRhLWxvYWRpbmddLDpkaXNhYmxlZCxbZGF0YS1kaXNhYmxlZF0pKXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWFpLWhvdmVyLCB2YXIoLS1tYW50aW5lLXByaW1hcnktY29sb3ItZmlsbGVkLWhvdmVyKSk7Y29sb3I6dmFyKC0tYWktaG92ZXItY29sb3IsIHZhcigtLWFpLWNvbG9yKSl9fUBtZWRpYShob3Zlcjpub25lKXsubV84ZDNmNDAwMDphY3RpdmU6d2hlcmUoOm5vdChbZGF0YS1sb2FkaW5nXSw6ZGlzYWJsZWQsW2RhdGEtZGlzYWJsZWRdKSl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1haS1ob3ZlciwgdmFyKC0tbWFudGluZS1wcmltYXJ5LWNvbG9yLWZpbGxlZC1ob3ZlcikpO2NvbG9yOnZhcigtLWFpLWhvdmVyLWNvbG9yLCB2YXIoLS1haS1jb2xvcikpfX0ubV84ZDNmNDAwMFtkYXRhLWxvYWRpbmdde2N1cnNvcjpub3QtYWxsb3dlZH0ubV84ZDNmNDAwMFtkYXRhLWxvYWRpbmddIC5tXzhkM2FmYjk3e29wYWNpdHk6MDt0cmFuc2Zvcm06dHJhbnNsYXRlWSgxMDAlKX0ubV84ZDNmNDAwMDp3aGVyZSg6ZGlzYWJsZWQ6bm90KFtkYXRhLWxvYWRpbmddKSxbZGF0YS1kaXNhYmxlZF06bm90KFtkYXRhLWxvYWRpbmddKSl7Y3Vyc29yOm5vdC1hbGxvd2VkO2JvcmRlcjpjYWxjKC4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpIHNvbGlkIHRyYW5zcGFyZW50O2NvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGlzYWJsZWQtY29sb3IpO2JhY2tncm91bmQ6dmFyKC0tbWFudGluZS1jb2xvci1kaXNhYmxlZCl9Lm1fOGQzZjQwMDA6d2hlcmUoOmRpc2FibGVkOm5vdChbZGF0YS1sb2FkaW5nXSksW2RhdGEtZGlzYWJsZWRdOm5vdChbZGF0YS1sb2FkaW5nXSkpOmFjdGl2ZXt0cmFuc2Zvcm06bm9uZX0ubV8zMDJiOWZiMXtpbnNldDpjYWxjKC0uMDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOnZhcigtLWFpLXJhZGl1cywgdmFyKC0tbWFudGluZS1yYWRpdXMtZGVmYXVsdCkpO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcn06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV8zMDJiOWZiMXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZmZmYyNn06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tXzMwMmI5ZmIxe2JhY2tncm91bmQtY29sb3I6IzAwMDAwMDI2fS5tXzFhMGYxYjIxey0tYWktYm9yZGVyLXdpZHRoOiBjYWxjKC4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpO2Rpc3BsYXk6ZmxleH0ubV8xYTBmMWIyMSA6d2hlcmUoKik6Zm9jdXN7cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDoxfS5tXzFhMGYxYjIxW2RhdGEtb3JpZW50YXRpb249aG9yaXpvbnRhbF17ZmxleC1kaXJlY3Rpb246cm93fS5tXzFhMGYxYjIxW2RhdGEtb3JpZW50YXRpb249aG9yaXpvbnRhbF0gLm1fOGQzZjQwMDA6bm90KDpvbmx5LWNoaWxkKTpmaXJzdC1jaGlsZCwubV8xYTBmMWIyMVtkYXRhLW9yaWVudGF0aW9uPWhvcml6b250YWxdIC5tXzQzN2I2NDg0Om5vdCg6b25seS1jaGlsZCk6Zmlyc3QtY2hpbGR7Ym9yZGVyLWVuZC1lbmQtcmFkaXVzOjA7Ym9yZGVyLXN0YXJ0LWVuZC1yYWRpdXM6MDtib3JkZXItaW5saW5lLWVuZC13aWR0aDpjYWxjKHZhcigtLWFpLWJvcmRlci13aWR0aCkgLyAyKX0ubV8xYTBmMWIyMVtkYXRhLW9yaWVudGF0aW9uPWhvcml6b250YWxdIC5tXzhkM2Y0MDAwOm5vdCg6b25seS1jaGlsZCk6bGFzdC1jaGlsZCwubV8xYTBmMWIyMVtkYXRhLW9yaWVudGF0aW9uPWhvcml6b250YWxdIC5tXzQzN2I2NDg0Om5vdCg6b25seS1jaGlsZCk6bGFzdC1jaGlsZHtib3JkZXItZW5kLXN0YXJ0LXJhZGl1czowO2JvcmRlci1zdGFydC1zdGFydC1yYWRpdXM6MDtib3JkZXItaW5saW5lLXN0YXJ0LXdpZHRoOmNhbGModmFyKC0tYWktYm9yZGVyLXdpZHRoKSAvIDIpfS5tXzFhMGYxYjIxW2RhdGEtb3JpZW50YXRpb249aG9yaXpvbnRhbF0gLm1fOGQzZjQwMDA6bm90KDpvbmx5LWNoaWxkKTpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpLC5tXzFhMGYxYjIxW2RhdGEtb3JpZW50YXRpb249aG9yaXpvbnRhbF0gLm1fNDM3YjY0ODQ6bm90KDpvbmx5LWNoaWxkKTpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpe2JvcmRlci1yYWRpdXM6MDtib3JkZXItaW5saW5lLXdpZHRoOmNhbGModmFyKC0tYWktYm9yZGVyLXdpZHRoKSAvIDIpfS5tXzFhMGYxYjIxW2RhdGEtb3JpZW50YXRpb249dmVydGljYWxde2ZsZXgtZGlyZWN0aW9uOmNvbHVtbn0ubV8xYTBmMWIyMVtkYXRhLW9yaWVudGF0aW9uPXZlcnRpY2FsXSAubV84ZDNmNDAwMDpub3QoOm9ubHktY2hpbGQpOmZpcnN0LWNoaWxkLC5tXzFhMGYxYjIxW2RhdGEtb3JpZW50YXRpb249dmVydGljYWxdIC5tXzQzN2I2NDg0Om5vdCg6b25seS1jaGlsZCk6Zmlyc3QtY2hpbGR7Ym9yZGVyLWVuZC1zdGFydC1yYWRpdXM6MDtib3JkZXItZW5kLWVuZC1yYWRpdXM6MDtib3JkZXItYm90dG9tLXdpZHRoOmNhbGModmFyKC0tYWktYm9yZGVyLXdpZHRoKSAvIDIpfS5tXzFhMGYxYjIxW2RhdGEtb3JpZW50YXRpb249dmVydGljYWxdIC5tXzhkM2Y0MDAwOm5vdCg6b25seS1jaGlsZCk6bGFzdC1jaGlsZCwubV8xYTBmMWIyMVtkYXRhLW9yaWVudGF0aW9uPXZlcnRpY2FsXSAubV80MzdiNjQ4NDpub3QoOm9ubHktY2hpbGQpOmxhc3QtY2hpbGR7Ym9yZGVyLXN0YXJ0LXN0YXJ0LXJhZGl1czowO2JvcmRlci1zdGFydC1lbmQtcmFkaXVzOjA7Ym9yZGVyLXRvcC13aWR0aDpjYWxjKHZhcigtLWFpLWJvcmRlci13aWR0aCkgLyAyKX0ubV8xYTBmMWIyMVtkYXRhLW9yaWVudGF0aW9uPXZlcnRpY2FsXSAubV84ZDNmNDAwMDpub3QoOm9ubHktY2hpbGQpOm5vdCg6Zmlyc3QtY2hpbGQpOm5vdCg6bGFzdC1jaGlsZCksLm1fMWEwZjFiMjFbZGF0YS1vcmllbnRhdGlvbj12ZXJ0aWNhbF0gLm1fNDM3YjY0ODQ6bm90KDpvbmx5LWNoaWxkKTpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpe2JvcmRlci1yYWRpdXM6MDtib3JkZXItYm90dG9tLXdpZHRoOmNhbGModmFyKC0tYWktYm9yZGVyLXdpZHRoKSAvIDIpO2JvcmRlci10b3Atd2lkdGg6Y2FsYyh2YXIoLS1haS1ib3JkZXItd2lkdGgpIC8gMil9Lm1fOGQzYWZiOTd7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3RyYW5zaXRpb246dHJhbnNmb3JtIC4xNXMgZWFzZSxvcGFjaXR5IC4xcyBlYXNlO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCV9Lm1fNDM3YjY0ODR7LS1zZWN0aW9uLWhlaWdodC14czogY2FsYygxLjEyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXNlY3Rpb24taGVpZ2h0LXNtOiBjYWxjKDEuMzc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tc2VjdGlvbi1oZWlnaHQtbWQ6IGNhbGMoMS43NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXNlY3Rpb24taGVpZ2h0LWxnOiBjYWxjKDIuMTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tc2VjdGlvbi1oZWlnaHQteGw6IGNhbGMoMi43NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXNlY3Rpb24taGVpZ2h0LWlucHV0LXhzOiBjYWxjKDEuODc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tc2VjdGlvbi1oZWlnaHQtaW5wdXQtc206IGNhbGMoMi4yNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXNlY3Rpb24taGVpZ2h0LWlucHV0LW1kOiBjYWxjKDIuNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tc2VjdGlvbi1oZWlnaHQtaW5wdXQtbGc6IGNhbGMoMy4xMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1zZWN0aW9uLWhlaWdodC1pbnB1dC14bDogY2FsYygzLjc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tc2VjdGlvbi1wYWRkaW5nLXgteHM6IGNhbGMoLjM3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXNlY3Rpb24tcGFkZGluZy14LXNtOiBjYWxjKC41cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tc2VjdGlvbi1wYWRkaW5nLXgtbWQ6IGNhbGMoLjYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXNlY3Rpb24tcGFkZGluZy14LWxnOiBjYWxjKC43NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXNlY3Rpb24tcGFkZGluZy14LXhsOiBjYWxjKDFyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1zZWN0aW9uLWhlaWdodDogdmFyKC0tc2VjdGlvbi1oZWlnaHQtc20pOy0tc2VjdGlvbi1wYWRkaW5nLXg6IHZhcigtLXNlY3Rpb24tcGFkZGluZy14LXNtKTstLXNlY3Rpb24tY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3Itd2hpdGUpO2ZvbnQtd2VpZ2h0OnZhcigtLW1hbnRpbmUtZm9udC13ZWlnaHQtbWVkaXVtKTt3aWR0aDphdXRvO2JvcmRlci1yYWRpdXM6dmFyKC0tc2VjdGlvbi1yYWRpdXMsIHZhcigtLW1hbnRpbmUtcmFkaXVzLWRlZmF1bHQpKTtmb250LXNpemU6dmFyKC0tc2VjdGlvbi1meiwgdmFyKC0tbWFudGluZS1mb250LXNpemUtc20pKTtiYWNrZ3JvdW5kOnZhcigtLXNlY3Rpb24tYmcsIHZhcigtLW1hbnRpbmUtcHJpbWFyeS1jb2xvci1maWxsZWQpKTtib3JkZXI6dmFyKC0tc2VjdGlvbi1iZCwgY2FsYyguMDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSBzb2xpZCB0cmFuc3BhcmVudCk7Y29sb3I6dmFyKC0tc2VjdGlvbi1jb2xvciwgdmFyKC0tbWFudGluZS1jb2xvci13aGl0ZSkpO2hlaWdodDp2YXIoLS1zZWN0aW9uLWhlaWdodCwgdmFyKC0tc2VjdGlvbi1oZWlnaHQtc20pKTtwYWRkaW5nLWlubGluZTp2YXIoLS1zZWN0aW9uLXBhZGRpbmcteCwgdmFyKC0tc2VjdGlvbi1wYWRkaW5nLXgtc20pKTt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7bGluZS1oZWlnaHQ6MTtkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfS5tXzg2YTQ0ZGE1ey0tY2Itc2l6ZS14czogY2FsYygxLjEyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWNiLXNpemUtc206IGNhbGMoMS4zNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jYi1zaXplLW1kOiBjYWxjKDEuNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jYi1zaXplLWxnOiBjYWxjKDIuMTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY2Itc2l6ZS14bDogY2FsYygyLjc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY2Itc2l6ZTogdmFyKC0tY2Itc2l6ZS1tZCk7LS1jYi1pY29uLXNpemU6IDcwJTstLWNiLXJhZGl1czogdmFyKC0tbWFudGluZS1yYWRpdXMtZGVmYXVsdCk7bGluZS1oZWlnaHQ6MTtkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3Bvc2l0aW9uOnJlbGF0aXZlO3VzZXItc2VsZWN0Om5vbmU7d2lkdGg6dmFyKC0tY2Itc2l6ZSk7aGVpZ2h0OnZhcigtLWNiLXNpemUpO21pbi13aWR0aDp2YXIoLS1jYi1zaXplKTttaW4taGVpZ2h0OnZhcigtLWNiLXNpemUpO2JvcmRlci1yYWRpdXM6dmFyKC0tY2ItcmFkaXVzKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV84NmE0NGRhNXtjb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktNyl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdKSAubV84NmE0NGRhNXtjb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstMSl9Lm1fODZhNDRkYTVbZGF0YS1kaXNhYmxlZF0sLm1fODZhNDRkYTU6ZGlzYWJsZWR7Y3Vyc29yOm5vdC1hbGxvd2VkO29wYWNpdHk6LjZ9QG1lZGlhKGhvdmVyOmhvdmVyKXs6d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV8yMjBjODBmMjp3aGVyZSg6bm90KFtkYXRhLWRpc2FibGVkXSw6ZGlzYWJsZWQpKTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS0wKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tXzIyMGM4MGYyOndoZXJlKDpub3QoW2RhdGEtZGlzYWJsZWRdLDpkaXNhYmxlZCkpOmhvdmVye2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTYpfX1AbWVkaWEoaG92ZXI6bm9uZSl7OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fMjIwYzgwZjI6d2hlcmUoOm5vdChbZGF0YS1kaXNhYmxlZF0sOmRpc2FibGVkKSk6YWN0aXZle2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTApfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1kYXJrXSkgLm1fMjIwYzgwZjI6d2hlcmUoOm5vdChbZGF0YS1kaXNhYmxlZF0sOmRpc2FibGVkKSk6YWN0aXZle2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTYpfX0ubV80MDgxYmY5MHtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93O2ZsZXgtd3JhcDp2YXIoLS1ncm91cC13cmFwLCB3cmFwKTtqdXN0aWZ5LWNvbnRlbnQ6dmFyKC0tZ3JvdXAtanVzdGlmeSwgZmxleC1zdGFydCk7YWxpZ24taXRlbXM6dmFyKC0tZ3JvdXAtYWxpZ24sIGNlbnRlcik7Z2FwOnZhcigtLWdyb3VwLWdhcCwgdmFyKC0tbWFudGluZS1zcGFjaW5nLW1kKSl9Lm1fNDA4MWJmOTA6d2hlcmUoW2RhdGEtZ3Jvd10pPip7ZmxleC1ncm93OjE7bWF4LXdpZHRoOnZhcigtLWdyb3VwLWNoaWxkLXdpZHRoKX0ubV82MTVhZjZjOXtsaW5lLWhlaWdodDoxO3BhZGRpbmc6MDttYXJnaW46MDtmb250LXdlaWdodDp2YXIoLS1tYW50aW5lLWZvbnQtd2VpZ2h0LXJlZ3VsYXIpO2ZvbnQtc2l6ZTp2YXIoLS1tYW50aW5lLWZvbnQtc2l6ZS1tZCl9Lm1fYjU0ODljM2N7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNlbnRlcjtwYWRkaW5nOnZhcigtLW1iLXBhZGRpbmcsIHZhcigtLW1hbnRpbmUtc3BhY2luZy1tZCkpO3BhZGRpbmctaW5saW5lLWVuZDpjYWxjKHZhcigtLW1iLXBhZGRpbmcsIHZhcigtLW1hbnRpbmUtc3BhY2luZy1tZCkpIC0gY2FsYyguMzEyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSk7cG9zaXRpb246c3RpY2t5O3RvcDowO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1ib2R5KTt6LWluZGV4OjEwMDA7bWluLWhlaWdodDpjYWxjKDMuNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7dHJhbnNpdGlvbjpwYWRkaW5nLWlubGluZS1lbmQgLjFzfS5tXzYwYzIyMmM3e3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7dG9wOjA7Ym90dG9tOjA7ei1pbmRleDp2YXIoLS1tYi16LWluZGV4KTtwb2ludGVyLWV2ZW50czpub25lfS5tX2ZkMWFiMGFhe3BvaW50ZXItZXZlbnRzOmFsbDtib3gtc2hhZG93OnZhcigtLW1iLXNoYWRvdywgdmFyKC0tbWFudGluZS1zaGFkb3cteGwpKX0ubV9mZDFhYjBhYSBbZGF0YS1tYW50aW5lLXNjcm9sbGJhcl17ei1pbmRleDoxMDAxfVtkYXRhLW9mZnNldC1zY3JvbGxiYXJzXSAubV9mZDFhYjBhYTpoYXMoW2RhdGEtbWFudGluZS1zY3JvbGxiYXJdKSAubV9iNTQ4OWMzY3twYWRkaW5nLWlubGluZS1lbmQ6Y2FsYyh2YXIoLS1tYi1wYWRkaW5nLCB2YXIoLS1tYW50aW5lLXNwYWNpbmctbWQpKSArIGNhbGMoLjMxMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkpfS5tXzYwNmNiMjY5e21hcmdpbi1pbmxpbmUtc3RhcnQ6YXV0b30ubV81ZGYyOTMxMXtwYWRkaW5nOnZhcigtLW1iLXBhZGRpbmcsIHZhcigtLW1hbnRpbmUtc3BhY2luZy1tZCkpO3BhZGRpbmctdG9wOnZhcigtLW1iLXBhZGRpbmcsIHZhcigtLW1hbnRpbmUtc3BhY2luZy1tZCkpfS5tXzVkZjI5MzExOndoZXJlKDpub3QoOm9ubHktY2hpbGQpKXtwYWRkaW5nLXRvcDowfS5tXzZjMDE4NTcwe3Bvc2l0aW9uOnJlbGF0aXZlO21hcmdpbi10b3A6dmFyKC0taW5wdXQtbWFyZ2luLXRvcCwgMHJlbSk7bWFyZ2luLWJvdHRvbTp2YXIoLS1pbnB1dC1tYXJnaW4tYm90dG9tLCAwcmVtKTstLWlucHV0LWhlaWdodC14czogY2FsYygxLjg3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWlucHV0LWhlaWdodC1zbTogY2FsYygyLjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0taW5wdXQtaGVpZ2h0LW1kOiBjYWxjKDIuNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0taW5wdXQtaGVpZ2h0LWxnOiBjYWxjKDMuMTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0taW5wdXQtaGVpZ2h0LXhsOiBjYWxjKDMuNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1pbnB1dC1wYWRkaW5nLXkteHM6IGNhbGMoLjMxMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1pbnB1dC1wYWRkaW5nLXktc206IGNhbGMoLjM3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWlucHV0LXBhZGRpbmcteS1tZDogY2FsYyguNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWlucHV0LXBhZGRpbmcteS1sZzogY2FsYyguNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0taW5wdXQtcGFkZGluZy15LXhsOiBjYWxjKC44MTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0taW5wdXQtaGVpZ2h0OiB2YXIoLS1pbnB1dC1oZWlnaHQtc20pOy0taW5wdXQtcmFkaXVzOiB2YXIoLS1tYW50aW5lLXJhZGl1cy1kZWZhdWx0KTstLWlucHV0LWN1cnNvcjogdGV4dDstLWlucHV0LXRleHQtYWxpZ246IGxlZnQ7LS1pbnB1dC1saW5lLWhlaWdodDogY2FsYyh2YXIoLS1pbnB1dC1oZWlnaHQpIC0gY2FsYyguMTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpKTstLWlucHV0LXBhZGRpbmc6IGNhbGModmFyKC0taW5wdXQtaGVpZ2h0KSAvIDMpOy0taW5wdXQtcGFkZGluZy1pbmxpbmUtc3RhcnQ6IHZhcigtLWlucHV0LXBhZGRpbmcpOy0taW5wdXQtcGFkZGluZy1pbmxpbmUtZW5kOiB2YXIoLS1pbnB1dC1wYWRkaW5nKTstLWlucHV0LXBsYWNlaG9sZGVyLWNvbG9yOiB2YXIoLS1tYW50aW5lLWNvbG9yLXBsYWNlaG9sZGVyKTstLWlucHV0LWNvbG9yOiB2YXIoLS1tYW50aW5lLWNvbG9yLXRleHQpOy0taW5wdXQtZGlzYWJsZWQtYmc6IHZhcigtLW1hbnRpbmUtY29sb3ItZGlzYWJsZWQpOy0taW5wdXQtZGlzYWJsZWQtY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItZGlzYWJsZWQtY29sb3IpOy0taW5wdXQtbGVmdC1zZWN0aW9uLXNpemU6IHZhcigtLWlucHV0LWxlZnQtc2VjdGlvbi13aWR0aCwgY2FsYyh2YXIoLS1pbnB1dC1oZWlnaHQpIC0gY2FsYyguMTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpKSk7LS1pbnB1dC1yaWdodC1zZWN0aW9uLXNpemU6IHZhciggLS1pbnB1dC1yaWdodC1zZWN0aW9uLXdpZHRoLCBjYWxjKHZhcigtLWlucHV0LWhlaWdodCkgLSBjYWxjKC4xMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkpICk7LS1pbnB1dC1zaXplOiB2YXIoLS1pbnB1dC1oZWlnaHQpOy0tc2VjdGlvbi15OiBjYWxjKC4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tbGVmdC1zZWN0aW9uLXN0YXJ0OiBjYWxjKC4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tbGVmdC1zZWN0aW9uLWJvcmRlci1yYWRpdXM6IHZhcigtLWlucHV0LXJhZGl1cykgMCAwIHZhcigtLWlucHV0LXJhZGl1cyk7LS1yaWdodC1zZWN0aW9uLWVuZDogY2FsYyguMDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXJpZ2h0LXNlY3Rpb24tYm9yZGVyLXJhZGl1czogMCB2YXIoLS1pbnB1dC1yYWRpdXMpIHZhcigtLWlucHV0LXJhZGl1cykgMH0ubV82YzAxODU3MFtkYXRhLXZhcmlhbnQ9dW5zdHlsZWRdey0taW5wdXQtcGFkZGluZzogMDstLWlucHV0LXBhZGRpbmcteTogMDstLWlucHV0LXBhZGRpbmctaW5saW5lLXN0YXJ0OiAwOy0taW5wdXQtcGFkZGluZy1pbmxpbmUtZW5kOiAwfS5tXzZjMDE4NTcwW2RhdGEtcG9pbnRlcl17LS1pbnB1dC1jdXJzb3I6IHBvaW50ZXJ9Lm1fNmMwMTg1NzBbZGF0YS1tdWx0aWxpbmVdey0taW5wdXQtcGFkZGluZy15LXhzOiBjYWxjKC4yODEyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWlucHV0LXBhZGRpbmcteS1zbTogY2FsYyguMzQzNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1pbnB1dC1wYWRkaW5nLXktbWQ6IGNhbGMoLjQzNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1pbnB1dC1wYWRkaW5nLXktbGc6IGNhbGMoLjU5Mzc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0taW5wdXQtcGFkZGluZy15LXhsOiBjYWxjKC44MTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0taW5wdXQtc2l6ZTogYXV0bzstLWlucHV0LWxpbmUtaGVpZ2h0OiB2YXIoLS1tYW50aW5lLWxpbmUtaGVpZ2h0KX0ubV82YzAxODU3MFtkYXRhLXdpdGgtbGVmdC1zZWN0aW9uXXstLWlucHV0LXBhZGRpbmctaW5saW5lLXN0YXJ0OiB2YXIoLS1pbnB1dC1sZWZ0LXNlY3Rpb24tc2l6ZSl9Lm1fNmMwMTg1NzBbZGF0YS13aXRoLXJpZ2h0LXNlY3Rpb25dey0taW5wdXQtcGFkZGluZy1pbmxpbmUtZW5kOiB2YXIoLS1pbnB1dC1yaWdodC1zZWN0aW9uLXNpemUpfS5tXzZjMDE4NTcwW2RhdGEtc2l6ZT14c10gLm1fNmMwMTg1NzBbZGF0YS13aXRoLXJpZ2h0LXNlY3Rpb25dOmhhcyhbZGF0YS1jb21iaW5lZC1jbGVhci1zZWN0aW9uXSl7LS1pbnB1dC1wYWRkaW5nLWlubGluZS1lbmQ6IGNhbGMoMi41NjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpfS5tXzZjMDE4NTcwW2RhdGEtc2l6ZT1zbV0gLm1fNmMwMTg1NzBbZGF0YS13aXRoLXJpZ2h0LXNlY3Rpb25dOmhhcyhbZGF0YS1jb21iaW5lZC1jbGVhci1zZWN0aW9uXSl7LS1pbnB1dC1wYWRkaW5nLWlubGluZS1lbmQ6IGNhbGMoMy4xMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSl9Lm1fNmMwMTg1NzBbZGF0YS1zaXplPW1kXSAubV82YzAxODU3MFtkYXRhLXdpdGgtcmlnaHQtc2VjdGlvbl06aGFzKFtkYXRhLWNvbWJpbmVkLWNsZWFyLXNlY3Rpb25dKXstLWlucHV0LXBhZGRpbmctaW5saW5lLWVuZDogY2FsYygzLjc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpfS5tXzZjMDE4NTcwW2RhdGEtc2l6ZT1sZ10gLm1fNmMwMTg1NzBbZGF0YS13aXRoLXJpZ2h0LXNlY3Rpb25dOmhhcyhbZGF0YS1jb21iaW5lZC1jbGVhci1zZWN0aW9uXSl7LS1pbnB1dC1wYWRkaW5nLWlubGluZS1lbmQ6IGNhbGMoNC41cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpfS5tXzZjMDE4NTcwW2RhdGEtc2l6ZT14bF0gLm1fNmMwMTg1NzBbZGF0YS13aXRoLXJpZ2h0LXNlY3Rpb25dOmhhcyhbZGF0YS1jb21iaW5lZC1jbGVhci1zZWN0aW9uXSl7LS1pbnB1dC1wYWRkaW5nLWlubGluZS1lbmQ6IGNhbGMoNS41NjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpfVtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSAubV82YzAxODU3MFtkYXRhLXZhcmlhbnQ9ZGVmYXVsdF17LS1pbnB1dC1iZDogdmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTQpOy0taW5wdXQtYmc6IHZhcigtLW1hbnRpbmUtY29sb3Itd2hpdGUpOy0taW5wdXQtYmQtZm9jdXM6IHZhcigtLW1hbnRpbmUtcHJpbWFyeS1jb2xvci1maWxsZWQpfVtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSAubV82YzAxODU3MFtkYXRhLXZhcmlhbnQ9ZmlsbGVkXXstLWlucHV0LWJkOiB0cmFuc3BhcmVudDstLWlucHV0LWJnOiB2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMSk7LS1pbnB1dC1iZC1mb2N1czogdmFyKC0tbWFudGluZS1wcmltYXJ5LWNvbG9yLWZpbGxlZCl9W2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdIC5tXzZjMDE4NTcwW2RhdGEtdmFyaWFudD11bnN0eWxlZF17LS1pbnB1dC1iZDogdHJhbnNwYXJlbnQ7LS1pbnB1dC1iZzogdHJhbnNwYXJlbnQ7LS1pbnB1dC1iZC1mb2N1czogdHJhbnNwYXJlbnR9W2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10gLm1fNmMwMTg1NzBbZGF0YS12YXJpYW50PWRlZmF1bHRdey0taW5wdXQtYmQ6IHZhcigtLW1hbnRpbmUtY29sb3ItZGFyay00KTstLWlucHV0LWJnOiB2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNik7LS1pbnB1dC1iZC1mb2N1czogdmFyKC0tbWFudGluZS1wcmltYXJ5LWNvbG9yLWZpbGxlZCl9W2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10gLm1fNmMwMTg1NzBbZGF0YS12YXJpYW50PWZpbGxlZF17LS1pbnB1dC1iZDogdHJhbnNwYXJlbnQ7LS1pbnB1dC1iZzogdmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTUpOy0taW5wdXQtYmQtZm9jdXM6IHZhcigtLW1hbnRpbmUtcHJpbWFyeS1jb2xvci1maWxsZWQpfVtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdIC5tXzZjMDE4NTcwW2RhdGEtdmFyaWFudD11bnN0eWxlZF17LS1pbnB1dC1iZDogdHJhbnNwYXJlbnQ7LS1pbnB1dC1iZzogdHJhbnNwYXJlbnQ7LS1pbnB1dC1iZC1mb2N1czogdHJhbnNwYXJlbnR9W2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWVdIC5tXzZjMDE4NTcwW2RhdGEtZXJyb3JdOm5vdChbZGF0YS12YXJpYW50PXVuc3R5bGVkXSl7LS1pbnB1dC1iZDogdmFyKC0tbWFudGluZS1jb2xvci1lcnJvcil9W2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWVdIC5tXzZjMDE4NTcwW2RhdGEtZXJyb3Jdey0taW5wdXQtY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItZXJyb3IpOy0taW5wdXQtcGxhY2Vob2xkZXItY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItZXJyb3IpOy0taW5wdXQtc2VjdGlvbi1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci1lcnJvcil9OndoZXJlKFtkaXI9cnRsXSkgLm1fNmMwMTg1NzB7LS1pbnB1dC10ZXh0LWFsaWduOiByaWdodDstLWxlZnQtc2VjdGlvbi1ib3JkZXItcmFkaXVzOiAwIHZhcigtLWlucHV0LXJhZGl1cykgdmFyKC0taW5wdXQtcmFkaXVzKSAwOy0tcmlnaHQtc2VjdGlvbi1ib3JkZXItcmFkaXVzOiB2YXIoLS1pbnB1dC1yYWRpdXMpIDAgMCB2YXIoLS1pbnB1dC1yYWRpdXMpfS5tXzhmYjdlYmU3ey13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDthcHBlYXJhbmNlOm5vbmU7cmVzaXplOnZhcigtLWlucHV0LXJlc2l6ZSwgbm9uZSk7ZGlzcGxheTpibG9jazt3aWR0aDoxMDAlO3RyYW5zaXRpb246Ym9yZGVyLWNvbG9yIC4xcyBlYXNlO3RleHQtYWxpZ246dmFyKC0taW5wdXQtdGV4dC1hbGlnbik7Y29sb3I6dmFyKC0taW5wdXQtY29sb3IpO2JvcmRlcjpjYWxjKC4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpIHNvbGlkIHZhcigtLWlucHV0LWJkKTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWlucHV0LWJnKTtmb250LWZhbWlseTp2YXIoLS1pbnB1dC1mb250LWZhbWlseSwgdmFyKC0tbWFudGluZS1mb250LWZhbWlseSkpO2hlaWdodDp2YXIoLS1pbnB1dC1zaXplKTttaW4taGVpZ2h0OnZhcigtLWlucHV0LWhlaWdodCk7bGluZS1oZWlnaHQ6dmFyKC0taW5wdXQtbGluZS1oZWlnaHQpO2ZvbnQtc2l6ZTp2YXIoLS1faW5wdXQtZnosIHZhcigtLWlucHV0LWZ6LCB2YXIoLS1tYW50aW5lLWZvbnQtc2l6ZS1tZCkpKTtib3JkZXItcmFkaXVzOnZhcigtLWlucHV0LXJhZGl1cyk7cGFkZGluZy1pbmxpbmUtc3RhcnQ6dmFyKC0taW5wdXQtcGFkZGluZy1pbmxpbmUtc3RhcnQpO3BhZGRpbmctaW5saW5lLWVuZDp2YXIoLS1pbnB1dC1wYWRkaW5nLWlubGluZS1lbmQpO3BhZGRpbmctdG9wOnZhcigtLWlucHV0LXBhZGRpbmcteSwgMHJlbSk7cGFkZGluZy1ib3R0b206dmFyKC0taW5wdXQtcGFkZGluZy15LCAwcmVtKTtjdXJzb3I6dmFyKC0taW5wdXQtY3Vyc29yKTtvdmVyZmxvdzp2YXIoLS1pbnB1dC1vdmVyZmxvdyl9Lm1fOGZiN2ViZTdbZGF0YS1uby1vdmVyZmxvd117LS1pbnB1dC1vdmVyZmxvdzogaGlkZGVufS5tXzhmYjdlYmU3W2RhdGEtbW9ub3NwYWNlXXstLWlucHV0LWZvbnQtZmFtaWx5OiB2YXIoLS1tYW50aW5lLWZvbnQtZmFtaWx5LW1vbm9zcGFjZSk7LS1faW5wdXQtZno6IGNhbGModmFyKC0taW5wdXQtZnopIC0gY2FsYyguMTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpKX0ubV84ZmI3ZWJlNzpmb2N1cywubV84ZmI3ZWJlNzpmb2N1cy13aXRoaW57b3V0bGluZTpub25lOy0taW5wdXQtYmQ6IHZhcigtLWlucHV0LWJkLWZvY3VzKX1bZGF0YS1lcnJvcl0gLm1fOGZiN2ViZTc6Zm9jdXMsW2RhdGEtZXJyb3JdIC5tXzhmYjdlYmU3OmZvY3VzLXdpdGhpbnstLWlucHV0LWJkOiB2YXIoLS1tYW50aW5lLWNvbG9yLWVycm9yKX0ubV84ZmI3ZWJlNzo6cGxhY2Vob2xkZXJ7Y29sb3I6dmFyKC0taW5wdXQtcGxhY2Vob2xkZXItY29sb3IpO29wYWNpdHk6MX0ubV84ZmI3ZWJlNzo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiwubV84ZmI3ZWJlNzo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbiwubV84ZmI3ZWJlNzo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbiwubV84ZmI3ZWJlNzo6LXdlYmtpdC1zZWFyY2gtY2FuY2VsLWJ1dHRvbiwubV84ZmI3ZWJlNzo6LXdlYmtpdC1zZWFyY2gtcmVzdWx0cy1idXR0b24sLm1fOGZiN2ViZTc6Oi13ZWJraXQtc2VhcmNoLXJlc3VsdHMtZGVjb3JhdGlvbnthcHBlYXJhbmNlOm5vbmV9Lm1fOGZiN2ViZTdbdHlwZT1udW1iZXJdey1tb3otYXBwZWFyYW5jZTp0ZXh0ZmllbGR9Lm1fOGZiN2ViZTc6ZGlzYWJsZWQsLm1fOGZiN2ViZTdbZGF0YS1kaXNhYmxlZF17Y3Vyc29yOm5vdC1hbGxvd2VkO29wYWNpdHk6LjY7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1pbnB1dC1kaXNhYmxlZC1iZyk7Y29sb3I6dmFyKC0taW5wdXQtZGlzYWJsZWQtY29sb3IpfS5tXzhmYjdlYmU3OmhhcyhpbnB1dDpkaXNhYmxlZCl7Y3Vyc29yOm5vdC1hbGxvd2VkO29wYWNpdHk6LjY7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1pbnB1dC1kaXNhYmxlZC1iZyk7Y29sb3I6dmFyKC0taW5wdXQtZGlzYWJsZWQtY29sb3IpfS5tXzhmYjdlYmU3W3JlYWRvbmx5XXtjYXJldC1jb2xvcjp0cmFuc3BhcmVudH0ubV84MjU3N2ZjMntwb2ludGVyLWV2ZW50czp2YXIoLS1zZWN0aW9uLXBvaW50ZXItZXZlbnRzKTtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjE7aW5zZXQtaW5saW5lLXN0YXJ0OnZhcigtLXNlY3Rpb24tc3RhcnQpO2luc2V0LWlubGluZS1lbmQ6dmFyKC0tc2VjdGlvbi1lbmQpO2JvdHRvbTp2YXIoLS1zZWN0aW9uLXkpO3RvcDp2YXIoLS1zZWN0aW9uLXkpO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjt3aWR0aDp2YXIoLS1zZWN0aW9uLXNpemUpO2JvcmRlci1yYWRpdXM6dmFyKC0tc2VjdGlvbi1ib3JkZXItcmFkaXVzKTtjb2xvcjp2YXIoLS1pbnB1dC1zZWN0aW9uLWNvbG9yLCB2YXIoLS1tYW50aW5lLWNvbG9yLWRpbW1lZCkpfS5tXzgyNTc3ZmMyW2RhdGEtcG9zaXRpb249cmlnaHRdey0tc2VjdGlvbi1wb2ludGVyLWV2ZW50czogdmFyKC0taW5wdXQtcmlnaHQtc2VjdGlvbi1wb2ludGVyLWV2ZW50cyk7LS1zZWN0aW9uLWVuZDogdmFyKC0tcmlnaHQtc2VjdGlvbi1lbmQpOy0tc2VjdGlvbi1zaXplOiB2YXIoLS1pbnB1dC1yaWdodC1zZWN0aW9uLXNpemUpOy0tc2VjdGlvbi1ib3JkZXItcmFkaXVzOiB2YXIoLS1yaWdodC1zZWN0aW9uLWJvcmRlci1yYWRpdXMpfS5tXzZjMDE4NTcwW2RhdGEtc2l6ZT14c10gLm1fODI1NzdmYzJbZGF0YS1wb3NpdGlvbj1yaWdodF06aGFzKFtkYXRhLWNvbWJpbmVkLWNsZWFyLXNlY3Rpb25dKXstLXNlY3Rpb24tc2l6ZTogY2FsYygyLjU2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSl9Lm1fNmMwMTg1NzBbZGF0YS1zaXplPXNtXSAubV84MjU3N2ZjMltkYXRhLXBvc2l0aW9uPXJpZ2h0XTpoYXMoW2RhdGEtY29tYmluZWQtY2xlYXItc2VjdGlvbl0pey0tc2VjdGlvbi1zaXplOiBjYWxjKDMuMTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpfS5tXzZjMDE4NTcwW2RhdGEtc2l6ZT1tZF0gLm1fODI1NzdmYzJbZGF0YS1wb3NpdGlvbj1yaWdodF06aGFzKFtkYXRhLWNvbWJpbmVkLWNsZWFyLXNlY3Rpb25dKXstLXNlY3Rpb24tc2l6ZTogY2FsYygzLjc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpfS5tXzZjMDE4NTcwW2RhdGEtc2l6ZT1sZ10gLm1fODI1NzdmYzJbZGF0YS1wb3NpdGlvbj1yaWdodF06aGFzKFtkYXRhLWNvbWJpbmVkLWNsZWFyLXNlY3Rpb25dKXstLXNlY3Rpb24tc2l6ZTogY2FsYyg0LjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSl9Lm1fNmMwMTg1NzBbZGF0YS1zaXplPXhsXSAubV84MjU3N2ZjMltkYXRhLXBvc2l0aW9uPXJpZ2h0XTpoYXMoW2RhdGEtY29tYmluZWQtY2xlYXItc2VjdGlvbl0pey0tc2VjdGlvbi1zaXplOiBjYWxjKDUuNTYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKX0ubV84MjU3N2ZjMltkYXRhLXBvc2l0aW9uPWxlZnRdey0tc2VjdGlvbi1wb2ludGVyLWV2ZW50czogdmFyKC0taW5wdXQtbGVmdC1zZWN0aW9uLXBvaW50ZXItZXZlbnRzKTstLXNlY3Rpb24tc3RhcnQ6IHZhcigtLWxlZnQtc2VjdGlvbi1zdGFydCk7LS1zZWN0aW9uLXNpemU6IHZhcigtLWlucHV0LWxlZnQtc2VjdGlvbi1zaXplKTstLXNlY3Rpb24tYm9yZGVyLXJhZGl1czogdmFyKC0tbGVmdC1zZWN0aW9uLWJvcmRlci1yYWRpdXMpfS5tXzg4YmFjZmQwe2NvbG9yOnZhcigtLWlucHV0LXBsYWNlaG9sZGVyLWNvbG9yLCB2YXIoLS1tYW50aW5lLWNvbG9yLXBsYWNlaG9sZGVyKSl9W2RhdGEtZXJyb3JdIC5tXzg4YmFjZmQwey0taW5wdXQtcGxhY2Vob2xkZXItY29sb3I6IHZhcigtLWlucHV0LWNvbG9yLCB2YXIoLS1tYW50aW5lLWNvbG9yLXBsYWNlaG9sZGVyKSl9Lm1fNDZiNzc1MjV7bGluZS1oZWlnaHQ6dmFyKC0tbWFudGluZS1saW5lLWhlaWdodCl9Lm1fOGZkYzEzMTF7ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC13ZWlnaHQ6dmFyKC0tbWFudGluZS1mb250LXdlaWdodC1tZWRpdW0pO292ZXJmbG93LXdyYXA6YnJlYWstd29yZDtjdXJzb3I6ZGVmYXVsdDstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7Zm9udC1zaXplOnZhcigtLWlucHV0LWxhYmVsLXNpemUsIHZhcigtLW1hbnRpbmUtZm9udC1zaXplLXNtKSl9Lm1fNzhhOTQ2NjJ7Y29sb3I6dmFyKC0taW5wdXQtYXN0ZXJpc2stY29sb3IsIHZhcigtLW1hbnRpbmUtY29sb3ItZXJyb3IpKX0ubV84ZjgxNjYyNSwubV9mZTQ3Y2U1OXt3b3JkLXdyYXA6YnJlYWstd29yZDtsaW5lLWhlaWdodDoxLjI7ZGlzcGxheTpibG9jazttYXJnaW46MDtwYWRkaW5nOjB9Lm1fOGY4MTY2MjV7Y29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1lcnJvcik7Zm9udC1zaXplOnZhcigtLWlucHV0LWVycm9yLXNpemUsIGNhbGModmFyKC0tbWFudGluZS1mb250LXNpemUtc20pIC0gY2FsYyguMTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpKSl9Lm1fZmU0N2NlNTl7Y29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kaW1tZWQpO2ZvbnQtc2l6ZTp2YXIoLS1pbnB1dC1kZXNjcmlwdGlvbi1zaXplLCBjYWxjKHZhcigtLW1hbnRpbmUtZm9udC1zaXplLXNtKSAtIGNhbGMoLjEyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSkpfS5tXzhiZmZkNjE2e2Rpc3BsYXk6ZmxleH0ubV85NmI1NTNhNnstLXRyYW5zaXRpb24tZHVyYXRpb246IC4xNXM7dG9wOjA7bGVmdDowO3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MDt0cmFuc2l0aW9uLXByb3BlcnR5OnRyYW5zZm9ybSx3aWR0aCxoZWlnaHQ7dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZTt0cmFuc2l0aW9uLWR1cmF0aW9uOjBtc30ubV85NmI1NTNhNjp3aGVyZShbZGF0YS1pbml0aWFsaXplZF0pe3RyYW5zaXRpb24tZHVyYXRpb246dmFyKC0tdHJhbnNpdGlvbi1kdXJhdGlvbil9Lm1fOTZiNTUzYTY6d2hlcmUoW2RhdGEtaGlkZGVuXSl7ZGlzcGxheTpub25lfS5tXzliZGJiNjY3ey0tYWNjb3JkaW9uLXJhZGl1czogdmFyKC0tbWFudGluZS1yYWRpdXMtZGVmYXVsdCl9Lm1fZGY3ODg1MWZ7b3ZlcmZsb3ctd3JhcDpicmVhay13b3JkfS5tXzRiYTU1NGQ0e3BhZGRpbmc6dmFyKC0tbWFudGluZS1zcGFjaW5nLW1kKTtwYWRkaW5nLXRvcDpjYWxjKHZhcigtLW1hbnRpbmUtc3BhY2luZy14cykgLyAyKX0ubV84ZmE4MjBhMHttYXJnaW46MDtwYWRkaW5nOjA7d2lkdGg6MTAwJX0ubV80YmE1ODViOHt3aWR0aDoxMDAlO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7ZmxleC1kaXJlY3Rpb246cm93LXJldmVyc2U7cGFkZGluZy1pbmxpbmU6dmFyKC0tbWFudGluZS1zcGFjaW5nLW1kKTtvcGFjaXR5OjE7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtjb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWJyaWdodCl9Lm1fNGJhNTg1Yjg6d2hlcmUoW2RhdGEtY2hldnJvbi1wb3NpdGlvbj1sZWZ0XSl7ZmxleC1kaXJlY3Rpb246cm93O3BhZGRpbmctaW5saW5lLXN0YXJ0OjB9Lm1fNGJhNTg1Yjg6d2hlcmUoOmRpc2FibGVkLFtkYXRhLWRpc2FibGVkXSl7b3BhY2l0eTouNDtjdXJzb3I6bm90LWFsbG93ZWR9QG1lZGlhKGhvdmVyOmhvdmVyKXs6d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV82OTM5YTVlOTp3aGVyZSg6bm90KDpkaXNhYmxlZCxbZGF0YS1kaXNhYmxlZF0pKTpob3Zlciw6d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV80MjcxZDIxYjp3aGVyZSg6bm90KDpkaXNhYmxlZCxbZGF0YS1kaXNhYmxlZF0pKTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS0wKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tXzY5MzlhNWU5OndoZXJlKDpub3QoOmRpc2FibGVkLFtkYXRhLWRpc2FibGVkXSkpOmhvdmVyLDp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1kYXJrXSkgLm1fNDI3MWQyMWI6d2hlcmUoOm5vdCg6ZGlzYWJsZWQsW2RhdGEtZGlzYWJsZWRdKSk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNil9fUBtZWRpYShob3Zlcjpub25lKXs6d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV82OTM5YTVlOTp3aGVyZSg6bm90KDpkaXNhYmxlZCxbZGF0YS1kaXNhYmxlZF0pKTphY3RpdmUsOndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fNDI3MWQyMWI6d2hlcmUoOm5vdCg6ZGlzYWJsZWQsW2RhdGEtZGlzYWJsZWRdKSk6YWN0aXZle2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTApfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1kYXJrXSkgLm1fNjkzOWE1ZTk6d2hlcmUoOm5vdCg6ZGlzYWJsZWQsW2RhdGEtZGlzYWJsZWRdKSk6YWN0aXZlLDp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1kYXJrXSkgLm1fNDI3MWQyMWI6d2hlcmUoOm5vdCg6ZGlzYWJsZWQsW2RhdGEtZGlzYWJsZWRdKSk6YWN0aXZle2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTYpfX0ubV9kZjNmZmEwZntjb2xvcjppbmhlcml0O2ZvbnQtd2VpZ2h0OnZhcigtLW1hbnRpbmUtZm9udC13ZWlnaHQtcmVndWxhcik7ZmxleDoxO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3BhZGRpbmctdG9wOnZhcigtLW1hbnRpbmUtc3BhY2luZy1zbSk7cGFkZGluZy1ib3R0b206dmFyKC0tbWFudGluZS1zcGFjaW5nLXNtKX0ubV8zZjM1YWU5NntkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpmbGV4LXN0YXJ0O3RyYW5zaXRpb246dHJhbnNmb3JtIHZhcigtLWFjY29yZGlvbi10cmFuc2l0aW9uLWR1cmF0aW9uLCAuMnMpIGVhc2U7d2lkdGg6dmFyKC0tYWNjb3JkaW9uLWNoZXZyb24tc2l6ZSwgY2FsYyguOTM3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSk7bWluLXdpZHRoOnZhcigtLWFjY29yZGlvbi1jaGV2cm9uLXNpemUsIGNhbGMoLjkzNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkpO3RyYW5zZm9ybTpyb3RhdGUoMCl9Lm1fM2YzNWFlOTY6d2hlcmUoW2RhdGEtcm90YXRlXSl7dHJhbnNmb3JtOnJvdGF0ZSgxODBkZWcpfS5tXzNmMzVhZTk2OndoZXJlKFtkYXRhLXBvc2l0aW9uPWxlZnRdKXttYXJnaW4taW5saW5lLWVuZDp2YXIoLS1tYW50aW5lLXNwYWNpbmctbWQpO21hcmdpbi1pbmxpbmUtc3RhcnQ6dmFyKC0tbWFudGluZS1zcGFjaW5nLW1kKX0ubV85YmQ3NzFmZXtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7bWFyZ2luLWlubGluZS1lbmQ6dmFyKC0tbWFudGluZS1zcGFjaW5nLXNtKX0ubV85YmQ3NzFmZTp3aGVyZShbZGF0YS1jaGV2cm9uLXBvc2l0aW9uPWxlZnRdKXttYXJnaW4taW5saW5lLWVuZDowO21hcmdpbi1pbmxpbmUtc3RhcnQ6dmFyKC0tbWFudGluZS1zcGFjaW5nLWxnKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV85YmQ3YjA5OHstLWl0ZW0tYm9yZGVyLWNvbG9yOiB2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMyk7LS1pdGVtLWZpbGxlZC1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTApfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1kYXJrXSkgLm1fOWJkN2IwOTh7LS1pdGVtLWJvcmRlci1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTQpOy0taXRlbS1maWxsZWQtY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItZGFyay02KX0ubV9mZTE5YjcwOXtib3JkZXItYm90dG9tOjFweCBzb2xpZCB2YXIoLS1pdGVtLWJvcmRlci1jb2xvcil9Lm1fMWY5MjFiM2J7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1pdGVtLWJvcmRlci1jb2xvcik7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIC4xNXMgZWFzZX0ubV8xZjkyMWIzYjp3aGVyZShbZGF0YS1hY3RpdmVdKXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWl0ZW0tZmlsbGVkLWNvbG9yKX0ubV8xZjkyMWIzYjpmaXJzdC1vZi10eXBle2JvcmRlci1zdGFydC1zdGFydC1yYWRpdXM6dmFyKC0tYWNjb3JkaW9uLXJhZGl1cyk7Ym9yZGVyLXN0YXJ0LWVuZC1yYWRpdXM6dmFyKC0tYWNjb3JkaW9uLXJhZGl1cyl9Lm1fMWY5MjFiM2I6Zmlyc3Qtb2YtdHlwZT5bZGF0YS1hY2NvcmRpb24tY29udHJvbF17Ym9yZGVyLXN0YXJ0LXN0YXJ0LXJhZGl1czp2YXIoLS1hY2NvcmRpb24tcmFkaXVzKTtib3JkZXItc3RhcnQtZW5kLXJhZGl1czp2YXIoLS1hY2NvcmRpb24tcmFkaXVzKX0ubV8xZjkyMWIzYjpsYXN0LW9mLXR5cGV7Ym9yZGVyLWVuZC1zdGFydC1yYWRpdXM6dmFyKC0tYWNjb3JkaW9uLXJhZGl1cyk7Ym9yZGVyLWVuZC1lbmQtcmFkaXVzOnZhcigtLWFjY29yZGlvbi1yYWRpdXMpfS5tXzFmOTIxYjNiOmxhc3Qtb2YtdHlwZT5bZGF0YS1hY2NvcmRpb24tY29udHJvbF17Ym9yZGVyLWVuZC1zdGFydC1yYWRpdXM6dmFyKC0tYWNjb3JkaW9uLXJhZGl1cyk7Ym9yZGVyLWVuZC1lbmQtcmFkaXVzOnZhcigtLWFjY29yZGlvbi1yYWRpdXMpfS5tXzFmOTIxYjNiKy5tXzFmOTIxYjNie2JvcmRlci10b3A6MH0ubV8yY2RmOTM5YXtib3JkZXItcmFkaXVzOnZhcigtLWFjY29yZGlvbi1yYWRpdXMpfS5tXzJjZGY5MzlhOndoZXJlKFtkYXRhLWFjdGl2ZV0pe2JhY2tncm91bmQtY29sb3I6dmFyKC0taXRlbS1maWxsZWQtY29sb3IpfS5tXzlmNTliMDY5e2JhY2tncm91bmQtY29sb3I6dmFyKC0taXRlbS1maWxsZWQtY29sb3IpO2JvcmRlci1yYWRpdXM6dmFyKC0tYWNjb3JkaW9uLXJhZGl1cyk7Ym9yZGVyOmNhbGMoLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkgc29saWQgdHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIC4xNXMgZWFzZX0ubV85ZjU5YjA2OVtkYXRhLWFjdGl2ZV17Ym9yZGVyLWNvbG9yOnZhcigtLWl0ZW0tYm9yZGVyLWNvbG9yKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV85ZjU5YjA2OVtkYXRhLWFjdGl2ZV17YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLXdoaXRlKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tXzlmNTliMDY5W2RhdGEtYWN0aXZlXXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGFyay03KX0ubV85ZjU5YjA2OSsubV85ZjU5YjA2OXttYXJnaW4tdG9wOnZhcigtLW1hbnRpbmUtc3BhY2luZy1tZCl9Lm1fN2Y4NTRlZGZ7cG9zaXRpb246Zml4ZWQ7ei1pbmRleDp2YXIoLS1hZmZpeC16LWluZGV4KTtpbnNldC1pbmxpbmUtc3RhcnQ6dmFyKC0tYWZmaXgtbGVmdCk7aW5zZXQtaW5saW5lLWVuZDp2YXIoLS1hZmZpeC1yaWdodCk7dG9wOnZhcigtLWFmZml4LXRvcCk7Ym90dG9tOnZhcigtLWFmZml4LWJvdHRvbSl9Lm1fNjY4MzZlZDN7LS1hbGVydC1yYWRpdXM6IHZhcigtLW1hbnRpbmUtcmFkaXVzLWRlZmF1bHQpOy0tYWxlcnQtYmc6IHZhcigtLW1hbnRpbmUtcHJpbWFyeS1jb2xvci1saWdodCk7LS1hbGVydC1iZDogY2FsYyguMDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSBzb2xpZCB0cmFuc3BhcmVudDstLWFsZXJ0LWNvbG9yOiB2YXIoLS1tYW50aW5lLXByaW1hcnktY29sb3ItbGlnaHQtY29sb3IpO3BhZGRpbmc6dmFyKC0tbWFudGluZS1zcGFjaW5nLW1kKSB2YXIoLS1tYW50aW5lLXNwYWNpbmctbWQpO2JvcmRlci1yYWRpdXM6dmFyKC0tYWxlcnQtcmFkaXVzKTtwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzpoaWRkZW47YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1hbGVydC1iZyk7Ym9yZGVyOnZhcigtLWFsZXJ0LWJkKTtjb2xvcjp2YXIoLS1hbGVydC1jb2xvcil9Lm1fYTVkNjA1MDJ7ZGlzcGxheTpmbGV4fS5tXzY2N2MyNzkze2ZsZXg6MTtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDp2YXIoLS1tYW50aW5lLXNwYWNpbmcteHMpfS5tXzZhMDNmMjg3e2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47Zm9udC1zaXplOnZhcigtLW1hbnRpbmUtZm9udC1zaXplLXNtKTtmb250LXdlaWdodDp2YXIoLS1tYW50aW5lLWZvbnQtd2VpZ2h0LWJvbGQpfS5tXzZhMDNmMjg3OndoZXJlKFtkYXRhLXdpdGgtY2xvc2UtYnV0dG9uXSl7cGFkZGluZy1pbmxpbmUtZW5kOnZhcigtLW1hbnRpbmUtc3BhY2luZy1tZCl9Lm1fNjk4ZjRmMjN7ZGlzcGxheTpibG9jaztvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpc30ubV82NjdmMmE2YXtsaW5lLWhlaWdodDoxO3dpZHRoOmNhbGMoMS4yNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTtoZWlnaHQ6Y2FsYygxLjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmZsZXgtc3RhcnQ7bWFyZ2luLWlubGluZS1lbmQ6dmFyKC0tbWFudGluZS1zcGFjaW5nLW1kKTttYXJnaW4tdG9wOmNhbGMoLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSl9Lm1fN2ZhNzgwNzZ7dGV4dC1vdmVyZmxvdzplbGxpcHNpcztvdmVyZmxvdzpoaWRkZW47Zm9udC1zaXplOnZhcigtLW1hbnRpbmUtZm9udC1zaXplLXNtKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV83ZmE3ODA3Nntjb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWJsYWNrKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tXzdmYTc4MDc2e2NvbG9yOnZhcigtLW1hbnRpbmUtY29sb3Itd2hpdGUpfS5tXzdmYTc4MDc2OndoZXJlKFtkYXRhLXZhcmlhbnQ9ZmlsbGVkXSl7Y29sb3I6dmFyKC0tYWxlcnQtY29sb3IpfS5tXzdmYTc4MDc2OndoZXJlKFtkYXRhLXZhcmlhbnQ9d2hpdGVdKXtjb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWJsYWNrKX0ubV84N2Y1NDgzOXt3aWR0aDpjYWxjKDEuMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7aGVpZ2h0OmNhbGMoMS4yNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTtjb2xvcjp2YXIoLS1hbGVydC1jb2xvcil9Lm1fYjZkOGIxNjJ7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtc2l6ZTp2YXIoLS10ZXh0LWZ6LCB2YXIoLS1tYW50aW5lLWZvbnQtc2l6ZS1tZCkpO2xpbmUtaGVpZ2h0OnZhcigtLXRleHQtbGgsIHZhcigtLW1hbnRpbmUtbGluZS1oZWlnaHQtbWQpKTtmb250LXdlaWdodDp2YXIoLS1tYW50aW5lLWZvbnQtd2VpZ2h0LXJlZ3VsYXIpO21hcmdpbjowO3BhZGRpbmc6MH0ubV9iNmQ4YjE2Mjp3aGVyZShbZGF0YS10cnVuY2F0ZV0pe292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcH0ubV9iNmQ4YjE2Mjp3aGVyZShbZGF0YS10cnVuY2F0ZT1zdGFydF0pe2RpcmVjdGlvbjpydGw7dGV4dC1hbGlnbjpyaWdodH06d2hlcmUoW2Rpcj1ydGxdKSAubV9iNmQ4YjE2Mjp3aGVyZShbZGF0YS10cnVuY2F0ZT1zdGFydF0pe2RpcmVjdGlvbjpsdHI7dGV4dC1hbGlnbjpsZWZ0fS5tX2I2ZDhiMTYyOndoZXJlKFtkYXRhLXZhcmlhbnQ9Z3JhZGllbnRdKXtiYWNrZ3JvdW5kLWltYWdlOnZhcigtLXRleHQtZ3JhZGllbnQpO2JhY2tncm91bmQtY2xpcDp0ZXh0Oy13ZWJraXQtYmFja2dyb3VuZC1jbGlwOnRleHQ7LXdlYmtpdC10ZXh0LWZpbGwtY29sb3I6dHJhbnNwYXJlbnR9Lm1fYjZkOGIxNjI6d2hlcmUoW2RhdGEtbGluZS1jbGFtcF0pe292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6LXdlYmtpdC1ib3g7LXdlYmtpdC1saW5lLWNsYW1wOnZhcigtLXRleHQtbGluZS1jbGFtcCk7LXdlYmtpdC1ib3gtb3JpZW50OnZlcnRpY2FsfS5tX2I2ZDhiMTYyOndoZXJlKFtkYXRhLWluaGVyaXRdKXtsaW5lLWhlaWdodDppbmhlcml0O2ZvbnQtd2VpZ2h0OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXR9Lm1fYjZkOGIxNjI6d2hlcmUoW2RhdGEtaW5saW5lXSl7bGluZS1oZWlnaHQ6MX0ubV84NDljZjBkYXtjb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWFuY2hvcik7dGV4dC1kZWNvcmF0aW9uOm5vbmU7YXBwZWFyYW5jZTpub25lO2JvcmRlcjpub25lO2Rpc3BsYXk6aW5saW5lO3BhZGRpbmc6MDttYXJnaW46MDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2N1cnNvcjpwb2ludGVyfUBtZWRpYShob3Zlcjpob3Zlcil7Lm1fODQ5Y2YwZGE6d2hlcmUoW2RhdGEtdW5kZXJsaW5lPWhvdmVyXSk6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX19QG1lZGlhKGhvdmVyOm5vbmUpey5tXzg0OWNmMGRhOndoZXJlKFtkYXRhLXVuZGVybGluZT1ob3Zlcl0pOmFjdGl2ZXt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lfX0ubV84NDljZjBkYTp3aGVyZShbZGF0YS11bmRlcmxpbmU9bm90LWhvdmVyXSl7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX1AbWVkaWEoaG92ZXI6aG92ZXIpey5tXzg0OWNmMGRhOndoZXJlKFtkYXRhLXVuZGVybGluZT1ub3QtaG92ZXJdKTpob3Zlcnt0ZXh0LWRlY29yYXRpb246bm9uZX19QG1lZGlhKGhvdmVyOm5vbmUpey5tXzg0OWNmMGRhOndoZXJlKFtkYXRhLXVuZGVybGluZT1ub3QtaG92ZXJdKTphY3RpdmV7dGV4dC1kZWNvcmF0aW9uOm5vbmV9fS5tXzg0OWNmMGRhOndoZXJlKFtkYXRhLXVuZGVybGluZT1hbHdheXNdKXt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lfS5tXzg0OWNmMGRhOndoZXJlKFtkYXRhLXZhcmlhbnQ9Z3JhZGllbnRdKSwubV84NDljZjBkYTp3aGVyZShbZGF0YS12YXJpYW50PWdyYWRpZW50XSk6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOm5vbmV9Lm1fODQ5Y2YwZGE6d2hlcmUoW2RhdGEtbGluZS1jbGFtcF0pe2Rpc3BsYXk6LXdlYmtpdC1ib3h9Lm1fNDgyMDRmOWJ7d2lkdGg6dmFyKC0tc2xpZGVyLXNpemUpO2hlaWdodDp2YXIoLS1zbGlkZXItc2l6ZSk7cG9zaXRpb246cmVsYXRpdmU7Ym9yZGVyLXJhZGl1czoxMDAlO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjt1c2VyLXNlbGVjdDpub25lfS5tXzQ4MjA0ZjliOmZvY3VzLXdpdGhpbntvdXRsaW5lOjJweCBzb2xpZCB2YXIoLS1tYW50aW5lLXByaW1hcnktY29sb3ItZmlsbGVkKTtvdXRsaW5lLW9mZnNldDpjYWxjKC4xMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSl9Lm1fNDgyMDRmOWJ7LS1zbGlkZXItc2l6ZTogY2FsYygzLjc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tdGh1bWItc2l6ZTogY2FsYyh2YXIoLS1zbGlkZXItc2l6ZSkgLyA1KX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV80ODIwNGY5YntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS0xKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tXzQ4MjA0Zjlie2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTUpfS5tX2JiOWNkYmFke3Bvc2l0aW9uOmFic29sdXRlO2luc2V0OmNhbGMoLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7Ym9yZGVyLXJhZGl1czp2YXIoLS1zbGlkZXItc2l6ZSk7cG9pbnRlci1ldmVudHM6bm9uZX0ubV80ODFkZDU4Nnt3aWR0aDpjYWxjKC4xMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDpjYWxjKDUwJSAtIDFweCk7dHJhbnNmb3JtOnJvdGF0ZSh2YXIoLS1hbmdsZSkpfS5tXzQ4MWRkNTg2OmJlZm9yZXtjb250ZW50OiIiO3Bvc2l0aW9uOmFic29sdXRlO3RvcDpjYWxjKHZhcigtLXRodW1iLXNpemUpIC8gMyk7bGVmdDpjYWxjKC4wMzEyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTt3aWR0aDpjYWxjKC4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpO2hlaWdodDpjYWxjKHZhcigtLXRodW1iLXNpemUpIC8gMS41KTt0cmFuc2Zvcm06dHJhbnNsYXRlKC01MCUsLTUwJSl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fNDgxZGQ1ODY6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTQpfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1kYXJrXSkgLm1fNDgxZGQ1ODY6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTMpfS5tXzQ4MWRkNTg2W2RhdGEtbGFiZWxdOmFmdGVye21pbi13aWR0aDpjYWxjKDEuMTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpO3RleHQtYWxpZ246Y2VudGVyO2NvbnRlbnQ6YXR0cihkYXRhLWxhYmVsKTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6Y2FsYygtMS41cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpO2xlZnQ6Y2FsYygtLjQzNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7dHJhbnNmb3JtOnJvdGF0ZShjYWxjKDM2MGRlZyAtIHZhcigtLWFuZ2xlKSkpO2ZvbnQtc2l6ZTp2YXIoLS1tYW50aW5lLWZvbnQtc2l6ZS14cyl9Lm1fYmMwMmJhM2R7cG9zaXRpb246YWJzb2x1dGU7aW5zZXQtYmxvY2s6MDtpbnNldC1pbmxpbmUtc3RhcnQ6Y2FsYyg1MCUgLSAxLjVweCk7aW5zZXQtaW5saW5lLWVuZDowO2hlaWdodDoxMDAlO3dpZHRoOmNhbGMoLjE4NzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7b3V0bGluZTpub25lO3BvaW50ZXItZXZlbnRzOm5vbmV9Lm1fYmMwMmJhM2Q6YmVmb3Jle2NvbnRlbnQ6IiI7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MDt0b3A6MDtoZWlnaHQ6bWluKHZhcigtLXRodW1iLXNpemUpLGNhbGModmFyKC0tc2xpZGVyLXNpemUpIC8gMikpO3dpZHRoOmNhbGMoLjE4NzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fYmMwMmJhM2Q6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTcpfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1kYXJrXSkgLm1fYmMwMmJhM2Q6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTEpfS5tX2JiOGU4NzVie2ZvbnQtc2l6ZTp2YXIoLS1tYW50aW5lLWZvbnQtc2l6ZS14cyl9Lm1fODlhYjM0MFtkYXRhLXJlc2l6aW5nXXstLWFwcC1zaGVsbC10cmFuc2l0aW9uLWR1cmF0aW9uOiAwbXMgIWltcG9ydGFudH0ubV84OWFiMzQwW2RhdGEtZGlzYWJsZWRdey0tYXBwLXNoZWxsLWhlYWRlci1vZmZzZXQ6IDByZW0gIWltcG9ydGFudDstLWFwcC1zaGVsbC1uYXZiYXItb2Zmc2V0OiAwcmVtICFpbXBvcnRhbnQ7LS1hcHAtc2hlbGwtYXNpZGUtb2Zmc2V0OiAwcmVtICFpbXBvcnRhbnQ7LS1hcHAtc2hlbGwtZm9vdGVyLW9mZnNldDogMHJlbSAhaW1wb3J0YW50fS5tXzg5YWIzNDBbZGF0YS1tb2RlPXN0YXRpY117ZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczp2YXIoLS1hcHAtc2hlbGwtbmF2YmFyLXdpZHRoLCAwKSAxZnIgdmFyKC0tYXBwLXNoZWxsLWFzaWRlLXdpZHRoLCAwKTtncmlkLXRlbXBsYXRlLXJvd3M6YXV0byAxZnIgYXV0bztwb3NpdGlvbjpyZWxhdGl2ZTtoZWlnaHQ6MTAwJTtvdmVyZmxvdzphdXRvfVtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSAubV84OWFiMzQwey0tYXBwLXNoZWxsLWJvcmRlci1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTMpfVtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdIC5tXzg5YWIzNDB7LS1hcHAtc2hlbGwtYm9yZGVyLWNvbG9yOiB2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNCl9Lm1fNDUyNTJlZWUsLm1fOWNkZGU5YSwubV8zYjE2ZjU2YiwubV84OTgzODE3LC5tXzM4NDBjODc5e3RyYW5zaXRpb24tZHVyYXRpb246dmFyKC0tYXBwLXNoZWxsLXRyYW5zaXRpb24tZHVyYXRpb24pO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOnZhcigtLWFwcC1zaGVsbC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbil9Lm1fNDUyNTJlZWUsLm1fOWNkZGU5YXtwb3NpdGlvbjpmaXhlZDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO3RvcDp2YXIoLS1hcHAtc2hlbGwtaGVhZGVyLW9mZnNldCwgMHJlbSk7aGVpZ2h0OmNhbGMoMTAwZHZoIC0gdmFyKC0tYXBwLXNoZWxsLWhlYWRlci1vZmZzZXQsIDByZW0pIC0gdmFyKC0tYXBwLXNoZWxsLWZvb3Rlci1vZmZzZXQsIDByZW0pKTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItYm9keSk7dHJhbnNpdGlvbi1wcm9wZXJ0eTp0cmFuc2Zvcm0sdG9wLGhlaWdodH06d2hlcmUoW2RhdGEtbW9kZT1zdGF0aWNdKSAubV80NTI1MmVlZSw6d2hlcmUoW2RhdGEtbW9kZT1zdGF0aWNdKSAubV85Y2RkZTlhe3Bvc2l0aW9uOnZhcigtLWFwcC1zaGVsbC1uYXZiYXItcG9zaXRpb24sIGZpeGVkKTtncmlkLXJvdzp2YXIoLS1hcHAtc2hlbGwtbmF2YmFyLWdyaWQtcm93LCBhdXRvKTtoZWlnaHQ6MTAwJX06d2hlcmUoW2RhdGEtbGF5b3V0PWFsdF0pIC5tXzQ1MjUyZWVlLDp3aGVyZShbZGF0YS1sYXlvdXQ9YWx0XSkgLm1fOWNkZGU5YXt0b3A6MHJlbTtoZWlnaHQ6MTAwZHZofTp3aGVyZShbZGF0YS1tb2RlPXN0YXRpY11bZGF0YS1sYXlvdXQ9YWx0XSkgLm1fNDUyNTJlZWUsOndoZXJlKFtkYXRhLW1vZGU9c3RhdGljXVtkYXRhLWxheW91dD1hbHRdKSAubV85Y2RkZTlhe2dyaWQtcm93OjEgLyAtMTtoZWlnaHQ6MTAwJX0ubV80NTI1MmVlZXtpbnNldC1pbmxpbmUtc3RhcnQ6MDt3aWR0aDp2YXIoLS1hcHAtc2hlbGwtbmF2YmFyLXdpZHRoKTt0cmFuc2l0aW9uLXByb3BlcnR5OnRyYW5zZm9ybSx0b3AsaGVpZ2h0O3RyYW5zZm9ybTp2YXIoLS1hcHAtc2hlbGwtbmF2YmFyLXRyYW5zZm9ybSk7ei1pbmRleDp2YXIoLS1hcHAtc2hlbGwtbmF2YmFyLXotaW5kZXgpfTp3aGVyZShbZGF0YS1tb2RlPXN0YXRpY10pIC5tXzQ1MjUyZWVle2dyaWQtY29sdW1uOnZhcigtLWFwcC1zaGVsbC1uYXZiYXItZ3JpZC1jb2x1bW4sIGF1dG8pO2Rpc3BsYXk6dmFyKC0tYXBwLXNoZWxsLW5hdmJhci1kaXNwbGF5LCBmbGV4KX06d2hlcmUoW2Rpcj1ydGxdKSAubV80NTI1MmVlZXt0cmFuc2Zvcm06dmFyKC0tYXBwLXNoZWxsLW5hdmJhci10cmFuc2Zvcm0tcnRsKX0ubV80NTI1MmVlZTp3aGVyZShbZGF0YS13aXRoLWJvcmRlcl0pe2JvcmRlci1pbmxpbmUtZW5kOjFweCBzb2xpZCB2YXIoLS1hcHAtc2hlbGwtYm9yZGVyLWNvbG9yKX0ubV85Y2RkZTlhe2luc2V0LWlubGluZS1lbmQ6MDt3aWR0aDp2YXIoLS1hcHAtc2hlbGwtYXNpZGUtd2lkdGgpO3RyYW5zZm9ybTp2YXIoLS1hcHAtc2hlbGwtYXNpZGUtdHJhbnNmb3JtKTt6LWluZGV4OnZhcigtLWFwcC1zaGVsbC1hc2lkZS16LWluZGV4KX06d2hlcmUoW2RhdGEtbW9kZT1zdGF0aWNdKSAubV85Y2RkZTlhe3Bvc2l0aW9uOnZhcigtLWFwcC1zaGVsbC1hc2lkZS1wb3NpdGlvbiwgZml4ZWQpO2dyaWQtY29sdW1uOnZhcigtLWFwcC1zaGVsbC1hc2lkZS1ncmlkLWNvbHVtbiwgYXV0byk7Z3JpZC1yb3c6dmFyKC0tYXBwLXNoZWxsLWFzaWRlLWdyaWQtcm93LCBhdXRvKTtkaXNwbGF5OnZhcigtLWFwcC1zaGVsbC1hc2lkZS1kaXNwbGF5LCBmbGV4KX06d2hlcmUoW2Rpcj1ydGxdKSAubV85Y2RkZTlhe3RyYW5zZm9ybTp2YXIoLS1hcHAtc2hlbGwtYXNpZGUtdHJhbnNmb3JtLXJ0bCl9Lm1fOWNkZGU5YTp3aGVyZShbZGF0YS13aXRoLWJvcmRlcl0pe2JvcmRlci1pbmxpbmUtc3RhcnQ6MXB4IHNvbGlkIHZhcigtLWFwcC1zaGVsbC1ib3JkZXItY29sb3IpfTp3aGVyZShbZGF0YS1tb2RlPXN0YXRpY11bZGF0YS1sYXlvdXQ9YWx0XSkgLm1fOWNkZGU5YXtncmlkLXJvdzoxIC8gLTF9OndoZXJlKFtkYXRhLXNjcm9sbC1sb2NrZWRdKSAubV85Y2RkZTlhe3Zpc2liaWxpdHk6dmFyKC0tYXBwLXNoZWxsLWFzaWRlLXNjcm9sbC1sb2NrZWQtdmlzaWJpbGl0eSl9Lm1fODk4MzgxN3twYWRkaW5nLWlubGluZS1zdGFydDpjYWxjKHZhcigtLWFwcC1zaGVsbC1uYXZiYXItb2Zmc2V0LCAwcmVtKSArIHZhcigtLWFwcC1zaGVsbC1wYWRkaW5nKSk7cGFkZGluZy1pbmxpbmUtZW5kOmNhbGModmFyKC0tYXBwLXNoZWxsLWFzaWRlLW9mZnNldCwgMHJlbSkgKyB2YXIoLS1hcHAtc2hlbGwtcGFkZGluZykpO3BhZGRpbmctdG9wOmNhbGModmFyKC0tYXBwLXNoZWxsLWhlYWRlci1vZmZzZXQsIDByZW0pICsgdmFyKC0tYXBwLXNoZWxsLXBhZGRpbmcpKTtwYWRkaW5nLWJvdHRvbTpjYWxjKHZhcigtLWFwcC1zaGVsbC1mb290ZXItb2Zmc2V0LCAwcmVtKSArIHZhcigtLWFwcC1zaGVsbC1wYWRkaW5nKSk7bWluLWhlaWdodDoxMDBkdmg7dHJhbnNpdGlvbi1wcm9wZXJ0eTpwYWRkaW5nfTp3aGVyZShbZGF0YS1tb2RlPXN0YXRpY10pIC5tXzg5ODM4MTd7cGFkZGluZy1pbmxpbmUtc3RhcnQ6dmFyKC0tYXBwLXNoZWxsLXBhZGRpbmcpO3BhZGRpbmctaW5saW5lLWVuZDp2YXIoLS1hcHAtc2hlbGwtcGFkZGluZyk7cGFkZGluZy10b3A6dmFyKC0tYXBwLXNoZWxsLXBhZGRpbmcpO3BhZGRpbmctYm90dG9tOnZhcigtLWFwcC1zaGVsbC1wYWRkaW5nKTttaW4taGVpZ2h0OmF1dG87Z3JpZC1jb2x1bW46dmFyKC0tYXBwLXNoZWxsLW1haW4tY29sdW1uLXN0YXJ0LCAxKSAvIHZhcigtLWFwcC1zaGVsbC1tYWluLWNvbHVtbi1lbmQsIC0xKTtncmlkLXJvdzp2YXIoLS1hcHAtc2hlbGwtbWFpbi1ncmlkLXJvdywgMil9Lm1fM2IxNmY1NmIsLm1fMzg0MGM4Nzl7cG9zaXRpb246Zml4ZWQ7aW5zZXQtaW5saW5lOjA7dHJhbnNpdGlvbi1wcm9wZXJ0eTp0cmFuc2Zvcm0sbWFyZ2luLWlubGluZS1zdGFydCxtYXJnaW4taW5saW5lLWVuZDtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItYm9keSl9OndoZXJlKFtkYXRhLW1vZGU9c3RhdGljXSkgLm1fM2IxNmY1NmIsOndoZXJlKFtkYXRhLW1vZGU9c3RhdGljXSkgLm1fMzg0MGM4Nzl7cG9zaXRpb246dmFyKC0tYXBwLXNoZWxsLWhlYWRlci1wb3NpdGlvbiwgZml4ZWQpO2dyaWQtY29sdW1uOnZhcigtLWFwcC1zaGVsbC1oZWFkZXItZ3JpZC1jb2x1bW4sIGF1dG8pfTp3aGVyZShbZGF0YS1sYXlvdXQ9YWx0XSkgLm1fM2IxNmY1NmIsOndoZXJlKFtkYXRhLWxheW91dD1hbHRdKSAubV8zODQwYzg3OXttYXJnaW4taW5saW5lLXN0YXJ0OnZhcigtLWFwcC1zaGVsbC1uYXZiYXItb2Zmc2V0LCAwcmVtKTttYXJnaW4taW5saW5lLWVuZDp2YXIoLS1hcHAtc2hlbGwtYXNpZGUtb2Zmc2V0LCAwcmVtKX06d2hlcmUoW2RhdGEtbW9kZT1zdGF0aWNdW2RhdGEtbGF5b3V0PWFsdF0pIC5tXzNiMTZmNTZiLDp3aGVyZShbZGF0YS1tb2RlPXN0YXRpY11bZGF0YS1sYXlvdXQ9YWx0XSkgLm1fMzg0MGM4Nzl7Z3JpZC1jb2x1bW46dmFyKC0tYXBwLXNoZWxsLW1haW4tY29sdW1uLXN0YXJ0LCAxKSAvIHZhcigtLWFwcC1zaGVsbC1tYWluLWNvbHVtbi1lbmQsIC0xKTttYXJnaW4taW5saW5lLXN0YXJ0OjByZW07bWFyZ2luLWlubGluZS1lbmQ6MHJlbX0ubV8zYjE2ZjU2Ynt0b3A6MDtoZWlnaHQ6dmFyKC0tYXBwLXNoZWxsLWhlYWRlci1oZWlnaHQpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1ib2R5KTt0cmFuc2Zvcm06dmFyKC0tYXBwLXNoZWxsLWhlYWRlci10cmFuc2Zvcm0pO3otaW5kZXg6dmFyKC0tYXBwLXNoZWxsLWhlYWRlci16LWluZGV4KX06d2hlcmUoW2RhdGEtbW9kZT1zdGF0aWNdKSAubV8zYjE2ZjU2YntncmlkLXJvdzp2YXIoLS1hcHAtc2hlbGwtaGVhZGVyLWdyaWQtcm93LCBhdXRvKX0ubV8zYjE2ZjU2Yjp3aGVyZShbZGF0YS13aXRoLWJvcmRlcl0pe2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWFwcC1zaGVsbC1ib3JkZXItY29sb3IpfS5tXzM4NDBjODc5e2JvdHRvbTowO2hlaWdodDpjYWxjKHZhcigtLWFwcC1zaGVsbC1mb290ZXItaGVpZ2h0KSArIGVudihzYWZlLWFyZWEtaW5zZXQtYm90dG9tKSk7cGFkZGluZy1ib3R0b206ZW52KHNhZmUtYXJlYS1pbnNldC1ib3R0b20pO3RyYW5zZm9ybTp2YXIoLS1hcHAtc2hlbGwtZm9vdGVyLXRyYW5zZm9ybSk7ei1pbmRleDp2YXIoLS1hcHAtc2hlbGwtZm9vdGVyLXotaW5kZXgpfTp3aGVyZShbZGF0YS1tb2RlPXN0YXRpY10pIC5tXzM4NDBjODc5e3Bvc2l0aW9uOnZhcigtLWFwcC1zaGVsbC1mb290ZXItcG9zaXRpb24sIGZpeGVkKTtncmlkLWNvbHVtbjp2YXIoLS1hcHAtc2hlbGwtZm9vdGVyLWdyaWQtY29sdW1uLCBhdXRvKTtncmlkLXJvdzp2YXIoLS1hcHAtc2hlbGwtZm9vdGVyLWdyaWQtcm93LCBhdXRvKX06d2hlcmUoW2RhdGEtbW9kZT1zdGF0aWNdW2RhdGEtbGF5b3V0PWFsdF0pIC5tXzM4NDBjODc5e2dyaWQtY29sdW1uOnZhcigtLWFwcC1zaGVsbC1tYWluLWNvbHVtbi1zdGFydCwgMSkgLyB2YXIoLS1hcHAtc2hlbGwtbWFpbi1jb2x1bW4tZW5kLCAtMSl9Lm1fMzg0MGM4Nzk6d2hlcmUoW2RhdGEtd2l0aC1ib3JkZXJdKXtib3JkZXItdG9wOjFweCBzb2xpZCB2YXIoLS1hcHAtc2hlbGwtYm9yZGVyLWNvbG9yKX0ubV82ZGNmYzdjN3tmbGV4LWdyb3c6MH0ubV82ZGNmYzdjNzp3aGVyZShbZGF0YS1ncm93XSl7ZmxleC1ncm93OjF9Lm1fNzFhYzQ3ZmN7LS1hci1yYXRpbzogMTttYXgtd2lkdGg6MTAwJX0ubV83MWFjNDdmYz46d2hlcmUoKjpub3Qoc3R5bGUpKXthc3BlY3QtcmF0aW86dmFyKC0tYXItcmF0aW8pO3dpZHRoOjEwMCV9Lm1fNzFhYzQ3ZmM+OndoZXJlKGltZyx2aWRlbyl7b2JqZWN0LWZpdDpjb3Zlcn0ubV84OGI2MmE0MXstLWNvbWJvYm94LXBhZGRpbmc6IGNhbGMoLjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpO3BhZGRpbmc6dmFyKC0tY29tYm9ib3gtcGFkZGluZyl9Lm1fODhiNjJhNDE6aGFzKFtkYXRhLW1hbnRpbmUtc2Nyb2xsYmFyXSkgLm1fOTg1NTE3ZDh7bWF4LXdpZHRoOmNhbGMoMTAwJSArIHZhcigtLWNvbWJvYm94LXBhZGRpbmcpKX0ubV84OGI2MmE0MVtkYXRhLWNvbXBvc2VkXXtwYWRkaW5nLWlubGluZS1lbmQ6MH0ubV84OGI2MmE0MVtkYXRhLWhpZGRlbl17ZGlzcGxheTpub25lfS5tXzg4YjYyYTQxLC5tX2IyODIxYTZley0tY29tYm9ib3gtb3B0aW9uLXBhZGRpbmcteHM6IGNhbGMoLjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpIGNhbGMoLjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jb21ib2JveC1vcHRpb24tcGFkZGluZy1zbTogY2FsYyguMzc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpIGNhbGMoLjYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWNvbWJvYm94LW9wdGlvbi1wYWRkaW5nLW1kOiBjYWxjKC41cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpIGNhbGMoLjc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY29tYm9ib3gtb3B0aW9uLXBhZGRpbmctbGc6IGNhbGMoLjYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSBjYWxjKDFyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jb21ib2JveC1vcHRpb24tcGFkZGluZy14bDogY2FsYyguODc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpIGNhbGMoMS4yNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWNvbWJvYm94LW9wdGlvbi1wYWRkaW5nOiB2YXIoLS1jb21ib2JveC1vcHRpb24tcGFkZGluZy1zbSl9Lm1fOTIyNTNhYTV7cGFkZGluZzp2YXIoLS1jb21ib2JveC1vcHRpb24tcGFkZGluZyk7Zm9udC1zaXplOnZhcigtLWNvbWJvYm94LW9wdGlvbi1meiwgdmFyKC0tbWFudGluZS1mb250LXNpemUtc20pKTtib3JkZXItcmFkaXVzOnZhcigtLW1hbnRpbmUtcmFkaXVzLWRlZmF1bHQpO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Y29sb3I6aW5oZXJpdDtjdXJzb3I6cG9pbnRlcjtvdmVyZmxvdy13cmFwOmJyZWFrLXdvcmR9Lm1fOTIyNTNhYTU6d2hlcmUoW2RhdGEtY29tYm9ib3gtc2VsZWN0ZWRdKXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtcHJpbWFyeS1jb2xvci1maWxsZWQpO2NvbG9yOnZhcigtLW1hbnRpbmUtY29sb3Itd2hpdGUpfS5tXzkyMjUzYWE1OndoZXJlKFtkYXRhLWNvbWJvYm94LWRpc2FibGVkXSl7Y3Vyc29yOm5vdC1hbGxvd2VkO29wYWNpdHk6LjM1fUBtZWRpYShob3Zlcjpob3Zlcil7OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fOTIyNTNhYTU6aG92ZXI6d2hlcmUoOm5vdChbZGF0YS1jb21ib2JveC1zZWxlY3RlZF0sW2RhdGEtY29tYm9ib3gtZGlzYWJsZWRdKSl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMCl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdKSAubV85MjI1M2FhNTpob3Zlcjp3aGVyZSg6bm90KFtkYXRhLWNvbWJvYm94LXNlbGVjdGVkXSxbZGF0YS1jb21ib2JveC1kaXNhYmxlZF0pKXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGFyay03KX19QG1lZGlhKGhvdmVyOm5vbmUpezp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1saWdodF0pIC5tXzkyMjUzYWE1OmFjdGl2ZTp3aGVyZSg6bm90KFtkYXRhLWNvbWJvYm94LXNlbGVjdGVkXSxbZGF0YS1jb21ib2JveC1kaXNhYmxlZF0pKXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS0wKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tXzkyMjUzYWE1OmFjdGl2ZTp3aGVyZSg6bm90KFtkYXRhLWNvbWJvYm94LXNlbGVjdGVkXSxbZGF0YS1jb21ib2JveC1kaXNhYmxlZF0pKXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGFyay03KX19Lm1fOTg1NTE3ZDh7bWFyZ2luLWlubGluZTpjYWxjKHZhcigtLWNvbWJvYm94LXBhZGRpbmcpICogLTEpO21hcmdpbi10b3A6Y2FsYyh2YXIoLS1jb21ib2JveC1wYWRkaW5nKSAqIC0xKTt3aWR0aDpjYWxjKDEwMCUgKyB2YXIoLS1jb21ib2JveC1wYWRkaW5nKSAqIDIpO2JvcmRlci10b3Atd2lkdGg6MDtib3JkZXItaW5saW5lLXdpZHRoOjA7Ym9yZGVyLWVuZC1zdGFydC1yYWRpdXM6MDtib3JkZXItZW5kLWVuZC1yYWRpdXM6MDttYXJnaW4tYm90dG9tOnZhcigtLWNvbWJvYm94LXBhZGRpbmcpO3Bvc2l0aW9uOnJlbGF0aXZlfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1saWdodF0pIC5tXzk4NTUxN2Q4LDp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1saWdodF0pIC5tXzk4NTUxN2Q4OmZvY3Vze2JvcmRlci1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMil9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdKSAubV85ODU1MTdkOCw6d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tXzk4NTUxN2Q4OmZvY3Vze2JvcmRlci1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNCl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fOTg1NTE3ZDh7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLXdoaXRlKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tXzk4NTUxN2Q4e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTcpfS5tXzI1MzBjZDFke2ZvbnQtc2l6ZTp2YXIoLS1jb21ib2JveC1vcHRpb24tZnosIHZhcigtLW1hbnRpbmUtZm9udC1zaXplLXNtKSk7dGV4dC1hbGlnbjpjZW50ZXI7cGFkZGluZzp2YXIoLS1jb21ib2JveC1vcHRpb24tcGFkZGluZyk7Y29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kaW1tZWQpfS5tXzg1OGY5NGJkLC5tXzgyYjk2N2Nie2ZvbnQtc2l6ZTp2YXIoLS1jb21ib2JveC1vcHRpb24tZnosIHZhcigtLW1hbnRpbmUtZm9udC1zaXplLXNtKSk7Ym9yZGVyOjAgc29saWQgdHJhbnNwYXJlbnQ7bWFyZ2luLWlubGluZTpjYWxjKHZhcigtLWNvbWJvYm94LXBhZGRpbmcpICogLTEpO3BhZGRpbmc6dmFyKC0tY29tYm9ib3gtb3B0aW9uLXBhZGRpbmcpfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1saWdodF0pIC5tXzg1OGY5NGJkLDp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1saWdodF0pIC5tXzgyYjk2N2Nie2JvcmRlci1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMil9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdKSAubV84NThmOTRiZCw6d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tXzgyYjk2N2Nie2JvcmRlci1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNCl9Lm1fODJiOTY3Y2J7Ym9yZGVyLXRvcC13aWR0aDpjYWxjKC4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpO21hcmdpbi10b3A6dmFyKC0tY29tYm9ib3gtcGFkZGluZyk7bWFyZ2luLWJvdHRvbTpjYWxjKHZhcigtLWNvbWJvYm94LXBhZGRpbmcpICogLTEpfS5tXzg1OGY5NGJke2JvcmRlci1ib3R0b20td2lkdGg6Y2FsYyguMDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTttYXJnaW4tYm90dG9tOnZhcigtLWNvbWJvYm94LXBhZGRpbmcpO21hcmdpbi10b3A6Y2FsYyh2YXIoLS1jb21ib2JveC1wYWRkaW5nKSAqIC0xKX0ubV8yNTRmM2U0ZjpoYXMoLm1fMmJiMmU5ZTU6b25seS1jaGlsZCl7ZGlzcGxheTpub25lfS5tXzJiYjJlOWU1e2NvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGltbWVkKTtmb250LXNpemU6Y2FsYyh2YXIoLS1jb21ib2JveC1vcHRpb24tZnosIHZhcigtLW1hbnRpbmUtZm9udC1zaXplLXNtKSkgKiAuODUpO3BhZGRpbmc6dmFyKC0tY29tYm9ib3gtb3B0aW9uLXBhZGRpbmcpO2ZvbnQtd2VpZ2h0OnZhcigtLW1hbnRpbmUtZm9udC13ZWlnaHQtbWVkaXVtKTtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyfS5tXzJiYjJlOWU1OmFmdGVye2NvbnRlbnQ6IiI7ZmxleDoxO2luc2V0LWlubGluZTowO2hlaWdodDpjYWxjKC4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpO21hcmdpbi1pbmxpbmUtc3RhcnQ6dmFyKC0tbWFudGluZS1zcGFjaW5nLXhzKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV8yYmIyZTllNTphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS0yKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tXzJiYjJlOWU1OmFmdGVye2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTQpfS5tXzJiYjJlOWU1Om9ubHktY2hpbGR7ZGlzcGxheTpub25lfS5tXzI5NDMyMjBiey0tY29tYm9ib3gtY2hldnJvbi1zaXplLXhzOiBjYWxjKC44NzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jb21ib2JveC1jaGV2cm9uLXNpemUtc206IGNhbGMoMS4xMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jb21ib2JveC1jaGV2cm9uLXNpemUtbWQ6IGNhbGMoMS4yNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWNvbWJvYm94LWNoZXZyb24tc2l6ZS1sZzogY2FsYygxLjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jb21ib2JveC1jaGV2cm9uLXNpemUteGw6IGNhbGMoMS43NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWNvbWJvYm94LWNoZXZyb24tc2l6ZTogdmFyKC0tY29tYm9ib3gtY2hldnJvbi1zaXplLXNtKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV8yOTQzMjIwYnstLV9jb21ib2JveC1jaGV2cm9uLWNvbG9yOiB2YXIoLS1jb21ib2JveC1jaGV2cm9uLWNvbG9yLCB2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktNikpfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1kYXJrXSkgLm1fMjk0MzIyMGJ7LS1fY29tYm9ib3gtY2hldnJvbi1jb2xvcjogdmFyKC0tY29tYm9ib3gtY2hldnJvbi1jb2xvciwgdmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTMpKX0ubV8yOTQzMjIwYnt3aWR0aDp2YXIoLS1jb21ib2JveC1jaGV2cm9uLXNpemUpO2hlaWdodDp2YXIoLS1jb21ib2JveC1jaGV2cm9uLXNpemUpO2NvbG9yOnZhcigtLV9jb21ib2JveC1jaGV2cm9uLWNvbG9yKX0ubV8yOTQzMjIwYjp3aGVyZShbZGF0YS1lcnJvcl0pe2NvbG9yOnZhcigtLWNvbWJvYm94LWNoZXZyb24tY29sb3IsIHZhcigtLW1hbnRpbmUtY29sb3ItZXJyb3IpKX0ubV8zOTBiNWY0e2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOmNhbGMoLjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSl9Lm1fMzkwYjVmNDp3aGVyZShbZGF0YS1yZXZlcnNlXSl7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW59Lm1fOGVlNTNmYzJ7b3BhY2l0eTouNDt3aWR0aDouOGVtO21pbi13aWR0aDouOGVtO2hlaWdodDouOGVtfTp3aGVyZShbZGF0YS1jb21ib2JveC1zZWxlY3RlZF0pIC5tXzhlZTUzZmMye29wYWNpdHk6MX0ubV9hNTMwZWUwYXt3aWR0aDouOGVtO21pbi13aWR0aDouOGVtO2hlaWdodDouOGVtfS5tXzVmNzViMDlley0tbGFiZWwtbGgteHM6IGNhbGMoMXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWxhYmVsLWxoLXNtOiBjYWxjKDEuMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1sYWJlbC1saC1tZDogY2FsYygxLjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1sYWJlbC1saC1sZzogY2FsYygxLjg3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWxhYmVsLWxoLXhsOiBjYWxjKDIuMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1sYWJlbC1saDogdmFyKC0tbGFiZWwtbGgtc20pfS5tXzVmNzViMDllW2RhdGEtbGFiZWwtcG9zaXRpb249bGVmdF17LS1sYWJlbC1vcmRlcjogMTstLWxhYmVsLW9mZnNldC1lbmQ6IHZhcigtLW1hbnRpbmUtc3BhY2luZy1zbSk7LS1sYWJlbC1vZmZzZXQtc3RhcnQ6IDB9Lm1fNWY3NWIwOWVbZGF0YS1sYWJlbC1wb3NpdGlvbj1yaWdodF17LS1sYWJlbC1vcmRlcjogMjstLWxhYmVsLW9mZnNldC1lbmQ6IDA7LS1sYWJlbC1vZmZzZXQtc3RhcnQ6IHZhcigtLW1hbnRpbmUtc3BhY2luZy1zbSl9Lm1fNWY2ZTY5NWV7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O2Rpc3BsYXk6ZmxleH0ubV9kM2VhNTZiYnstLWxhYmVsLWN1cnNvcjogdmFyKC0tbWFudGluZS1jdXJzb3ItdHlwZSk7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O2Rpc3BsYXk6aW5saW5lLWZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2ZvbnQtc2l6ZTp2YXIoLS1sYWJlbC1meiwgdmFyKC0tbWFudGluZS1mb250LXNpemUtc20pKTtsaW5lLWhlaWdodDp2YXIoLS1sYWJlbC1saCk7Y3Vyc29yOnZhcigtLWxhYmVsLWN1cnNvcik7b3JkZXI6dmFyKC0tbGFiZWwtb3JkZXIpfWZpZWxkc2V0OmRpc2FibGVkIC5tX2QzZWE1NmJiLC5tX2QzZWE1NmJiW2RhdGEtZGlzYWJsZWRdey0tbGFiZWwtY3Vyc29yOiBub3QtYWxsb3dlZH0ubV84ZWU1NDZiOHtjdXJzb3I6dmFyKC0tbGFiZWwtY3Vyc29yKTtjb2xvcjppbmhlcml0O3BhZGRpbmctaW5saW5lLXN0YXJ0OnZhcigtLWxhYmVsLW9mZnNldC1zdGFydCk7cGFkZGluZy1pbmxpbmUtZW5kOnZhcigtLWxhYmVsLW9mZnNldC1lbmQpfWZpZWxkc2V0OmRpc2FibGVkIC5tXzhlZTU0NmI4LC5tXzhlZTU0NmI4OndoZXJlKFtkYXRhLWRpc2FibGVkXSl7Y29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kaXNhYmxlZC1jb2xvcil9Lm1fMzI4ZjY4YzB7bWFyZ2luLXRvcDpjYWxjKHZhcigtLW1hbnRpbmUtc3BhY2luZy14cykgLyAyKTtwYWRkaW5nLWlubGluZS1zdGFydDp2YXIoLS1sYWJlbC1vZmZzZXQtc3RhcnQpO3BhZGRpbmctaW5saW5lLWVuZDp2YXIoLS1sYWJlbC1vZmZzZXQtZW5kKTtjdXJzb3I6ZGVmYXVsdH0ubV84ZThhOTljY3ttYXJnaW4tdG9wOmNhbGModmFyKC0tbWFudGluZS1zcGFjaW5nLXhzKSAvIDIpO3BhZGRpbmctaW5saW5lLXN0YXJ0OnZhcigtLWxhYmVsLW9mZnNldC1zdGFydCk7cGFkZGluZy1pbmxpbmUtZW5kOnZhcigtLWxhYmVsLW9mZnNldC1lbmQpfS5tXzI2Nzc1YjBhey0tY2FyZC1yYWRpdXM6IHZhcigtLW1hbnRpbmUtcmFkaXVzLWRlZmF1bHQpO2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJTtib3JkZXItcmFkaXVzOnZhcigtLWNhcmQtcmFkaXVzKTtjdXJzb3I6cG9pbnRlcn0ubV8yNjc3NWIwYSA6d2hlcmUoKil7Y3Vyc29yOmluaGVyaXR9Lm1fMjY3NzViMGE6d2hlcmUoW2RhdGEtd2l0aC1ib3JkZXJdKXtib3JkZXI6Y2FsYyguMDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSBzb2xpZCB0cmFuc3BhcmVudH06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV8yNjc3NWIwYTp3aGVyZShbZGF0YS13aXRoLWJvcmRlcl0pe2JvcmRlci1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMyl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdKSAubV8yNjc3NWIwYTp3aGVyZShbZGF0YS13aXRoLWJvcmRlcl0pe2JvcmRlci1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNCl9Lm1fNWU1MjU2ZWV7LS1jaGVja2JveC1zaXplLXhzOiBjYWxjKDFyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jaGVja2JveC1zaXplLXNtOiBjYWxjKDEuMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jaGVja2JveC1zaXplLW1kOiBjYWxjKDEuNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWNoZWNrYm94LXNpemUtbGc6IGNhbGMoMS44NzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jaGVja2JveC1zaXplLXhsOiBjYWxjKDIuMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jaGVja2JveC1zaXplOiB2YXIoLS1jaGVja2JveC1zaXplLXNtKTstLWNoZWNrYm94LWNvbG9yOiB2YXIoLS1tYW50aW5lLXByaW1hcnktY29sb3ItZmlsbGVkKX0ubV81ZTUyNTZlZTp3aGVyZShbZGF0YS12YXJpYW50PWZpbGxlZF0pey0tY2hlY2tib3gtaWNvbi1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci13aGl0ZSl9Lm1fNWU1MjU2ZWU6d2hlcmUoW2RhdGEtdmFyaWFudD1vdXRsaW5lXSl7LS1jaGVja2JveC1pY29uLWNvbG9yOiB2YXIoLS1jaGVja2JveC1jb2xvcil9Lm1fNWU1MjU2ZWV7cG9zaXRpb246cmVsYXRpdmU7Ym9yZGVyOmNhbGMoLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkgc29saWQgdHJhbnNwYXJlbnQ7d2lkdGg6dmFyKC0tY2hlY2tib3gtc2l6ZSk7bWluLXdpZHRoOnZhcigtLWNoZWNrYm94LXNpemUpO2hlaWdodDp2YXIoLS1jaGVja2JveC1zaXplKTttaW4taGVpZ2h0OnZhcigtLWNoZWNrYm94LXNpemUpO2JvcmRlci1yYWRpdXM6dmFyKC0tY2hlY2tib3gtcmFkaXVzLCB2YXIoLS1tYW50aW5lLXJhZGl1cy1kZWZhdWx0KSk7dHJhbnNpdGlvbjpib3JkZXItY29sb3IgLjFzIGVhc2UsYmFja2dyb3VuZC1jb2xvciAuMXMgZWFzZTtjdXJzb3I6dmFyKC0tbWFudGluZS1jdXJzb3ItdHlwZSk7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcn06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV81ZTUyNTZlZXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3Itd2hpdGUpO2JvcmRlci1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktNCl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdKSAubV81ZTUyNTZlZXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGFyay02KTtib3JkZXItY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTQpfS5tXzVlNTI1NmVlW2RhdGEtaW5kZXRlcm1pbmF0ZV0sLm1fNWU1MjU2ZWVbZGF0YS1jaGVja2VkXXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWNoZWNrYm94LWNvbG9yKTtib3JkZXItY29sb3I6dmFyKC0tY2hlY2tib3gtY29sb3IpfS5tXzVlNTI1NmVlW2RhdGEtaW5kZXRlcm1pbmF0ZV0+Lm1fMWIxYzU0M2EsLm1fNWU1MjU2ZWVbZGF0YS1jaGVja2VkXT4ubV8xYjFjNTQzYXtvcGFjaXR5OjE7dHJhbnNmb3JtOm5vbmU7Y29sb3I6dmFyKC0tY2hlY2tib3gtaWNvbi1jb2xvcil9Lm1fNWU1MjU2ZWVbZGF0YS1kaXNhYmxlZF17Y3Vyc29yOm5vdC1hbGxvd2VkO2JvcmRlci1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRpc2FibGVkLWJvcmRlcik7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRpc2FibGVkKX1bZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1saWdodF0gLm1fNWU1MjU2ZWVbZGF0YS1kaXNhYmxlZF1bZGF0YS1jaGVja2VkXT4ubV8xYjFjNTQzYXtjb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktNSl9W2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10gLm1fNWU1MjU2ZWVbZGF0YS1kaXNhYmxlZF1bZGF0YS1jaGVja2VkXT4ubV8xYjFjNTQzYXtjb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstMyl9Lm1fNzZlMjAzNzRbZGF0YS1pbmRldGVybWluYXRlXTpub3QoW2RhdGEtZGlzYWJsZWRdKSwubV83NmUyMDM3NFtkYXRhLWNoZWNrZWRdOm5vdChbZGF0YS1kaXNhYmxlZF0pe2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLWNvbG9yOnZhcigtLWNoZWNrYm94LWNvbG9yKX0ubV83NmUyMDM3NFtkYXRhLWluZGV0ZXJtaW5hdGVdOm5vdChbZGF0YS1kaXNhYmxlZF0pPi5tXzFiMWM1NDNhLC5tXzc2ZTIwMzc0W2RhdGEtY2hlY2tlZF06bm90KFtkYXRhLWRpc2FibGVkXSk+Lm1fMWIxYzU0M2F7Y29sb3I6dmFyKC0tY2hlY2tib3gtaWNvbi1jb2xvcik7b3BhY2l0eToxO3RyYW5zZm9ybTpub25lfS5tXzFiMWM1NDNhe2Rpc3BsYXk6YmxvY2s7d2lkdGg6NjAlO2NvbG9yOnRyYW5zcGFyZW50O3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoY2FsYyguMzEyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSkgc2NhbGUoLjUpO29wYWNpdHk6MTt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuMXMgZWFzZSxvcGFjaXR5IC4xcyBlYXNlfS5tX2JmMmQ5ODhjey0tY2hlY2tib3gtc2l6ZS14czogY2FsYygxcmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY2hlY2tib3gtc2l6ZS1zbTogY2FsYygxLjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY2hlY2tib3gtc2l6ZS1tZDogY2FsYygxLjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jaGVja2JveC1zaXplLWxnOiBjYWxjKDEuODc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY2hlY2tib3gtc2l6ZS14bDogY2FsYygyLjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY2hlY2tib3gtc2l6ZTogdmFyKC0tY2hlY2tib3gtc2l6ZS1zbSk7LS1jaGVja2JveC1jb2xvcjogdmFyKC0tbWFudGluZS1wcmltYXJ5LWNvbG9yLWZpbGxlZCl9Lm1fYmYyZDk4OGM6d2hlcmUoW2RhdGEtdmFyaWFudD1maWxsZWRdKXstLWNoZWNrYm94LWljb24tY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3Itd2hpdGUpfS5tX2JmMmQ5ODhjOndoZXJlKFtkYXRhLXZhcmlhbnQ9b3V0bGluZV0pey0tY2hlY2tib3gtaWNvbi1jb2xvcjogdmFyKC0tY2hlY2tib3gtY29sb3IpfS5tXzI2MDYyYmVje3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOnZhcigtLWNoZWNrYm94LXNpemUpO2hlaWdodDp2YXIoLS1jaGVja2JveC1zaXplKTtvcmRlcjoxfS5tXzI2MDYyYmVjOndoZXJlKFtkYXRhLWxhYmVsLXBvc2l0aW9uPWxlZnRdKXtvcmRlcjoyfS5tXzI2MDYzNTYwe2FwcGVhcmFuY2U6bm9uZTtib3JkZXI6Y2FsYyguMDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSBzb2xpZCB0cmFuc3BhcmVudDt3aWR0aDp2YXIoLS1jaGVja2JveC1zaXplKTtoZWlnaHQ6dmFyKC0tY2hlY2tib3gtc2l6ZSk7Ym9yZGVyLXJhZGl1czp2YXIoLS1jaGVja2JveC1yYWRpdXMsIHZhcigtLW1hbnRpbmUtcmFkaXVzLWRlZmF1bHQpKTtwYWRkaW5nOjA7ZGlzcGxheTpibG9jazttYXJnaW46MDt0cmFuc2l0aW9uOmJvcmRlci1jb2xvciAuMXMgZWFzZSxiYWNrZ3JvdW5kLWNvbG9yIC4xcyBlYXNlO2N1cnNvcjp2YXIoLS1tYW50aW5lLWN1cnNvci10eXBlKTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnR9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fMjYwNjM1NjB7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLXdoaXRlKTtib3JkZXItY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTQpfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1kYXJrXSkgLm1fMjYwNjM1NjB7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNik7Ym9yZGVyLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGFyay00KX0ubV8yNjA2MzU2MDp3aGVyZShbZGF0YS13aXRoLWVycm9yLXN0eWxlc11bZGF0YS1lcnJvcl0pe2JvcmRlci1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWVycm9yKX0ubV8yNjA2MzU2MFtkYXRhLWluZGV0ZXJtaW5hdGVdLC5tXzI2MDYzNTYwOmNoZWNrZWR7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1jaGVja2JveC1jb2xvcik7Ym9yZGVyLWNvbG9yOnZhcigtLWNoZWNrYm94LWNvbG9yKX0ubV8yNjA2MzU2MFtkYXRhLWluZGV0ZXJtaW5hdGVdKy5tX2JmMjk1NDIzLC5tXzI2MDYzNTYwOmNoZWNrZWQrLm1fYmYyOTU0MjN7b3BhY2l0eToxO3RyYW5zZm9ybTpub25lfS5tXzI2MDYzNTYwOmRpc2FibGVke2N1cnNvcjpub3QtYWxsb3dlZDtib3JkZXItY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kaXNhYmxlZC1ib3JkZXIpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kaXNhYmxlZCl9Lm1fMjYwNjM1NjA6ZGlzYWJsZWQrLm1fYmYyOTU0MjN7Y29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kaXNhYmxlZC1jb2xvcil9Lm1fMjE1YzQ1NDIrLm1fYmYyOTU0MjN7Y29sb3I6dmFyKC0tY2hlY2tib3gtY29sb3IpfS5tXzIxNWM0NTQyW2RhdGEtaW5kZXRlcm1pbmF0ZV06bm90KDpkaXNhYmxlZCksLm1fMjE1YzQ1NDI6Y2hlY2tlZDpub3QoOmRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci1jb2xvcjp2YXIoLS1jaGVja2JveC1jb2xvcil9Lm1fMjE1YzQ1NDJbZGF0YS1pbmRldGVybWluYXRlXTpub3QoOmRpc2FibGVkKSsubV9iZjI5NTQyMywubV8yMTVjNDU0MjpjaGVja2VkOm5vdCg6ZGlzYWJsZWQpKy5tX2JmMjk1NDIze2NvbG9yOnZhcigtLWNoZWNrYm94LWljb24tY29sb3IpO29wYWNpdHk6MTt0cmFuc2Zvcm06bm9uZX0ubV9iZjI5NTQyM3twb3NpdGlvbjphYnNvbHV0ZTtpbnNldDowO3dpZHRoOjYwJTttYXJnaW46YXV0bztjb2xvcjp2YXIoLS1jaGVja2JveC1pY29uLWNvbG9yKTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zZm9ybTp0cmFuc2xhdGVZKGNhbGMoLjMxMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkpIHNjYWxlKC41KTtvcGFjaXR5OjA7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjFzIGVhc2Usb3BhY2l0eSAuMXMgZWFzZX0ubV8xMWRlZjkyYnstLWFnLXNwYWNpbmc6IHZhcigtLW1hbnRpbmUtc3BhY2luZy1zbSk7LS1hZy1vZmZzZXQ6IGNhbGModmFyKC0tYWctc3BhY2luZykgKiAtMSk7ZGlzcGxheTpmbGV4O3BhZGRpbmctaW5saW5lLXN0YXJ0OnZhcigtLWFnLXNwYWNpbmcpfS5tX2Y4NTY3OGI2ey0tYXZhdGFyLXNpemUteHM6IGNhbGMoMXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWF2YXRhci1zaXplLXNtOiBjYWxjKDEuNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tYXZhdGFyLXNpemUtbWQ6IGNhbGMoMi4zNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1hdmF0YXItc2l6ZS1sZzogY2FsYygzLjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1hdmF0YXItc2l6ZS14bDogY2FsYyg1LjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tYXZhdGFyLXNpemU6IHZhcigtLWF2YXRhci1zaXplLW1kKTstLWF2YXRhci1yYWRpdXM6IGNhbGMoNjIuNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWF2YXRhci1iZzogdmFyKC0tbWFudGluZS1jb2xvci1ncmF5LWxpZ2h0KTstLWF2YXRhci1iZDogY2FsYyguMDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSBzb2xpZCB0cmFuc3BhcmVudDstLWF2YXRhci1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci1ncmF5LWxpZ2h0LWNvbG9yKTstLWF2YXRhci1wbGFjZWhvbGRlci1mejogY2FsYyh2YXIoLS1hdmF0YXItc2l6ZSkgLyAyLjUpOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO3VzZXItc2VsZWN0Om5vbmU7b3ZlcmZsb3c6aGlkZGVuO2JvcmRlci1yYWRpdXM6dmFyKC0tYXZhdGFyLXJhZGl1cyk7dGV4dC1kZWNvcmF0aW9uOm5vbmU7cGFkZGluZzowO3dpZHRoOnZhcigtLWF2YXRhci1zaXplKTtoZWlnaHQ6dmFyKC0tYXZhdGFyLXNpemUpO21pbi13aWR0aDp2YXIoLS1hdmF0YXItc2l6ZSl9Lm1fZjg1Njc4YjY6d2hlcmUoW2RhdGEtd2l0aGluLWdyb3VwXSl7bWFyZ2luLWlubGluZS1zdGFydDp2YXIoLS1hZy1vZmZzZXQpO2JvcmRlcjoycHggc29saWQgdmFyKC0tbWFudGluZS1jb2xvci1ib2R5KTtiYWNrZ3JvdW5kOnZhcigtLW1hbnRpbmUtY29sb3ItYm9keSl9Lm1fMTFmOGFjMDd7b2JqZWN0LWZpdDpjb3Zlcjt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2Rpc3BsYXk6YmxvY2t9Lm1fMTA0Y2Q3MWZ7Zm9udC13ZWlnaHQ6dmFyKC0tbWFudGluZS1mb250LXdlaWdodC1ib2xkKTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTt1c2VyLXNlbGVjdDpub25lO2JvcmRlci1yYWRpdXM6dmFyKC0tYXZhdGFyLXJhZGl1cyk7Zm9udC1zaXplOnZhcigtLWF2YXRhci1wbGFjZWhvbGRlci1meik7YmFja2dyb3VuZDp2YXIoLS1hdmF0YXItYmcpO2JvcmRlcjp2YXIoLS1hdmF0YXItYmQpO2NvbG9yOnZhcigtLWF2YXRhci1jb2xvcil9Lm1fMTA0Y2Q3MWY+W2RhdGEtYXZhdGFyLXBsYWNlaG9sZGVyLWljb25de3dpZHRoOjcwJTtoZWlnaHQ6NzAlfS5tXzJjZTBkZTAye2JhY2tncm91bmQtc2l6ZTpjb3ZlcjtiYWNrZ3JvdW5kLXBvc2l0aW9uOmNlbnRlcjtkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCU7Ym9yZGVyOjA7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Ym9yZGVyLXJhZGl1czp2YXIoLS1iaS1yYWRpdXMsIDApfS5tXzM0N2RiMGVjey0tYmFkZ2UtaGVpZ2h0LXhzOiBjYWxjKDFyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1iYWRnZS1oZWlnaHQtc206IGNhbGMoMS4xMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1iYWRnZS1oZWlnaHQtbWQ6IGNhbGMoMS4yNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWJhZGdlLWhlaWdodC1sZzogY2FsYygxLjYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWJhZGdlLWhlaWdodC14bDogY2FsYygycmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tYmFkZ2UtZnoteHM6IGNhbGMoLjU2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1iYWRnZS1mei1zbTogY2FsYyguNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tYmFkZ2UtZnotbWQ6IGNhbGMoLjY4NzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1iYWRnZS1mei1sZzogY2FsYyguODEyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWJhZGdlLWZ6LXhsOiBjYWxjKDFyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1iYWRnZS1wYWRkaW5nLXgteHM6IGNhbGMoLjM3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWJhZGdlLXBhZGRpbmcteC1zbTogY2FsYyguNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWJhZGdlLXBhZGRpbmcteC1tZDogY2FsYyguNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tYmFkZ2UtcGFkZGluZy14LWxnOiBjYWxjKC43NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWJhZGdlLXBhZGRpbmcteC14bDogY2FsYygxcmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tYmFkZ2UtaGVpZ2h0OiB2YXIoLS1iYWRnZS1oZWlnaHQtbWQpOy0tYmFkZ2UtZno6IHZhcigtLWJhZGdlLWZ6LW1kKTstLWJhZGdlLXBhZGRpbmcteDogdmFyKC0tYmFkZ2UtcGFkZGluZy14LW1kKTstLWJhZGdlLXJhZGl1czogY2FsYyg2Mi41cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tYmFkZ2UtbGg6IGNhbGModmFyKC0tYmFkZ2UtaGVpZ2h0KSAtIGNhbGMoLjEyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSk7LS1iYWRnZS1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci13aGl0ZSk7LS1iYWRnZS1iZzogdmFyKC0tbWFudGluZS1wcmltYXJ5LWNvbG9yLWZpbGxlZCk7LS1iYWRnZS1ib3JkZXItd2lkdGg6IGNhbGMoLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1iYWRnZS1iZDogdmFyKC0tYmFkZ2UtYm9yZGVyLXdpZHRoKSBzb2xpZCB0cmFuc3BhcmVudDstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7Zm9udC1zaXplOnZhcigtLWJhZGdlLWZ6KTtib3JkZXItcmFkaXVzOnZhcigtLWJhZGdlLXJhZGl1cyk7aGVpZ2h0OnZhcigtLWJhZGdlLWhlaWdodCk7bGluZS1oZWlnaHQ6dmFyKC0tYmFkZ2UtbGgpO3RleHQtZGVjb3JhdGlvbjpub25lO3BhZGRpbmc6MCB2YXIoLS1iYWRnZS1wYWRkaW5nLXgpO2Rpc3BsYXk6aW5saW5lLWdyaWQ7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7d2lkdGg6Zml0LWNvbnRlbnQ7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2ZvbnQtd2VpZ2h0OnZhcigtLW1hbnRpbmUtZm9udC13ZWlnaHQtYm9sZCk7bGV0dGVyLXNwYWNpbmc6Y2FsYyguMDE1NjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpO2N1cnNvcjpkZWZhdWx0O3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7b3ZlcmZsb3c6aGlkZGVuO2NvbG9yOnZhcigtLWJhZGdlLWNvbG9yKTtiYWNrZ3JvdW5kOnZhcigtLWJhZGdlLWJnKTtib3JkZXI6dmFyKC0tYmFkZ2UtYmQpfS5tXzM0N2RiMGVjOndoZXJlKFtkYXRhLXdpdGgtbGVmdC1zZWN0aW9uXSxbZGF0YS12YXJpYW50PWRvdF0pe2dyaWQtdGVtcGxhdGUtY29sdW1uczphdXRvIDFmcn0ubV8zNDdkYjBlYzp3aGVyZShbZGF0YS13aXRoLXJpZ2h0LXNlY3Rpb25dKXtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIGF1dG99Lm1fMzQ3ZGIwZWM6d2hlcmUoW2RhdGEtd2l0aC1sZWZ0LXNlY3Rpb25dW2RhdGEtd2l0aC1yaWdodC1zZWN0aW9uXSxbZGF0YS12YXJpYW50PWRvdF1bZGF0YS13aXRoLXJpZ2h0LXNlY3Rpb25dKXtncmlkLXRlbXBsYXRlLWNvbHVtbnM6YXV0byAxZnIgYXV0b30ubV8zNDdkYjBlYzp3aGVyZShbZGF0YS1ibG9ja10pe2Rpc3BsYXk6ZmxleDt3aWR0aDoxMDAlfS5tXzM0N2RiMGVjOndoZXJlKFtkYXRhLWNpcmNsZV0pe3BhZGRpbmctaW5saW5lOmNhbGMoLjEyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTtkaXNwbGF5OmZsZXg7d2lkdGg6dmFyKC0tYmFkZ2UtaGVpZ2h0KX0ubV9mYmQ4MWUzZHstLWJhZGdlLWRvdC1zaXplOiBjYWxjKHZhcigtLWJhZGdlLWhlaWdodCkgLyAzLjQpfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1saWdodF0pIC5tX2ZiZDgxZTNke2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci13aGl0ZSk7Ym9yZGVyLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS00KTtjb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWJsYWNrKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tX2ZiZDgxZTNke2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTUpO2JvcmRlci1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNSk7Y29sb3I6dmFyKC0tbWFudGluZS1jb2xvci13aGl0ZSl9Lm1fZmJkODFlM2Q6YmVmb3Jle2NvbnRlbnQ6IiI7ZGlzcGxheTpibG9jazt3aWR0aDp2YXIoLS1iYWRnZS1kb3Qtc2l6ZSk7aGVpZ2h0OnZhcigtLWJhZGdlLWRvdC1zaXplKTtib3JkZXItcmFkaXVzOnZhcigtLWJhZGdlLWRvdC1zaXplKTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWJhZGdlLWRvdC1jb2xvcik7bWFyZ2luLWlubGluZS1lbmQ6dmFyKC0tYmFkZ2UtZG90LXNpemUpfS5tXzVhZGQ1MDJhe3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczt0ZXh0LWFsaWduOmNlbnRlcjtjdXJzb3I6aW5oZXJpdH0ubV85MWZkZGE5YnstLWJhZGdlLXNlY3Rpb24tbWFyZ2luOiBjYWxjKHZhcigtLW1hbnRpbmUtc3BhY2luZy14cykgLyAyKTtkaXNwbGF5OmlubGluZS1mbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO21heC1oZWlnaHQ6Y2FsYyh2YXIoLS1iYWRnZS1oZWlnaHQpIC0gdmFyKC0tYmFkZ2UtYm9yZGVyLXdpZHRoKSAqIDIpfS5tXzkxZmRkYTliOndoZXJlKFtkYXRhLXBvc2l0aW9uPWxlZnRdKXttYXJnaW4taW5saW5lLWVuZDp2YXIoLS1iYWRnZS1zZWN0aW9uLW1hcmdpbil9Lm1fOTFmZGRhOWI6d2hlcmUoW2RhdGEtcG9zaXRpb249cmlnaHRdKXttYXJnaW4taW5saW5lLXN0YXJ0OnZhcigtLWJhZGdlLXNlY3Rpb24tbWFyZ2luKX0ubV9kZGVjMDFjMHstLWJsb2NrcXVvdGUtYm9yZGVyOiAzcHggc29saWQgdmFyKC0tYnEtYmQpO3Bvc2l0aW9uOnJlbGF0aXZlO21hcmdpbjowO2JvcmRlci1pbmxpbmUtc3RhcnQ6dmFyKC0tYmxvY2txdW90ZS1ib3JkZXIpO2JvcmRlci1zdGFydC1lbmQtcmFkaXVzOnZhcigtLWJxLXJhZGl1cyk7Ym9yZGVyLWVuZC1lbmQtcmFkaXVzOnZhcigtLWJxLXJhZGl1cyk7cGFkZGluZzp2YXIoLS1tYW50aW5lLXNwYWNpbmcteGwpIGNhbGMoMi4zNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fZGRlYzAxYzB7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1icS1iZy1saWdodCl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdKSAubV9kZGVjMDFjMHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWJxLWJnLWRhcmspfS5tX2RkZTdiZDU3ey0tYmxvY2txdW90ZS1pY29uLW9mZnNldDogY2FsYyh2YXIoLS1icS1pY29uLXNpemUpIC8gLTIpO3Bvc2l0aW9uOmFic29sdXRlO2NvbG9yOnZhcigtLWJxLWJkKTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItYm9keSk7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3RvcDp2YXIoLS1ibG9ja3F1b3RlLWljb24tb2Zmc2V0KTtpbnNldC1pbmxpbmUtc3RhcnQ6dmFyKC0tYmxvY2txdW90ZS1pY29uLW9mZnNldCk7d2lkdGg6dmFyKC0tYnEtaWNvbi1zaXplKTtoZWlnaHQ6dmFyKC0tYnEtaWNvbi1zaXplKTtib3JkZXItcmFkaXVzOnZhcigtLWJxLWljb24tc2l6ZSl9Lm1fZGRlNTFhMzV7ZGlzcGxheTpibG9jazttYXJnaW4tdG9wOnZhcigtLW1hbnRpbmUtc3BhY2luZy1tZCk7b3BhY2l0eTouNjtmb250LXNpemU6ODUlfS5tXzhiMzcxN2Rme2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7ZmxleC13cmFwOndyYXB9Lm1fZjY3OGQ1NDB7bGluZS1oZWlnaHQ6MTt3aGl0ZS1zcGFjZTpub3dyYXA7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50fS5tXzNiOGYyMjA4e21hcmdpbi1pbmxpbmU6dmFyKC0tYmMtc2VwYXJhdG9yLW1hcmdpbiwgdmFyKC0tbWFudGluZS1zcGFjaW5nLXhzKSk7bGluZS1oZWlnaHQ6MTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXJ9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fM2I4ZjIyMDh7Y29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTcpfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1kYXJrXSkgLm1fM2I4ZjIyMDh7Y29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTIpfS5tX2ZlYTZiZjFhey0tYnVyZ2VyLXNpemUteHM6IGNhbGMoLjc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tYnVyZ2VyLXNpemUtc206IGNhbGMoMS4xMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1idXJnZXItc2l6ZS1tZDogY2FsYygxLjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1idXJnZXItc2l6ZS1sZzogY2FsYygyLjEyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWJ1cmdlci1zaXplLXhsOiBjYWxjKDIuNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tYnVyZ2VyLXNpemU6IHZhcigtLWJ1cmdlci1zaXplLW1kKTstLWJ1cmdlci1saW5lLXNpemU6IGNhbGModmFyKC0tYnVyZ2VyLXNpemUpIC8gMTIpO3dpZHRoOmNhbGModmFyKC0tYnVyZ2VyLXNpemUpICsgdmFyKC0tbWFudGluZS1zcGFjaW5nLXhzKSk7aGVpZ2h0OmNhbGModmFyKC0tYnVyZ2VyLXNpemUpICsgdmFyKC0tbWFudGluZS1zcGFjaW5nLXhzKSk7cGFkZGluZzpjYWxjKHZhcigtLW1hbnRpbmUtc3BhY2luZy14cykgLyAyKTtjdXJzb3I6cG9pbnRlcn06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV9mZWE2YmYxYXstLWJ1cmdlci1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci1ibGFjayl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdKSAubV9mZWE2YmYxYXstLWJ1cmdlci1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci13aGl0ZSl9Lm1fZDRmYjljYWR7cG9zaXRpb246cmVsYXRpdmU7dXNlci1zZWxlY3Q6bm9uZX0ubV9kNGZiOWNhZCwubV9kNGZiOWNhZDpiZWZvcmUsLm1fZDRmYjljYWQ6YWZ0ZXJ7ZGlzcGxheTpibG9jazt3aWR0aDp2YXIoLS1idXJnZXItc2l6ZSk7aGVpZ2h0OnZhcigtLWJ1cmdlci1saW5lLXNpemUpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tYnVyZ2VyLWNvbG9yKTtvdXRsaW5lOmNhbGMoLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkgc29saWQgdHJhbnNwYXJlbnQ7dHJhbnNpdGlvbi1wcm9wZXJ0eTpiYWNrZ3JvdW5kLWNvbG9yLHRyYW5zZm9ybTt0cmFuc2l0aW9uLWR1cmF0aW9uOnZhcigtLWJ1cmdlci10cmFuc2l0aW9uLWR1cmF0aW9uLCAuM3MpO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOnZhcigtLWJ1cmdlci10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbiwgZWFzZSl9Lm1fZDRmYjljYWQ6YmVmb3JlLC5tX2Q0ZmI5Y2FkOmFmdGVye3Bvc2l0aW9uOmFic29sdXRlO2NvbnRlbnQ6IiI7aW5zZXQtaW5saW5lLXN0YXJ0OjB9Lm1fZDRmYjljYWQ6YmVmb3Jle3RvcDpjYWxjKHZhcigtLWJ1cmdlci1zaXplKSAvIC0zKX0ubV9kNGZiOWNhZDphZnRlcnt0b3A6Y2FsYyh2YXIoLS1idXJnZXItc2l6ZSkgLyAzKX0ubV9kNGZiOWNhZFtkYXRhLW9wZW5lZF17YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubV9kNGZiOWNhZFtkYXRhLW9wZW5lZF06YmVmb3Jle3RyYW5zZm9ybTp0cmFuc2xhdGVZKGNhbGModmFyKC0tYnVyZ2VyLXNpemUpIC8gMykpIHJvdGF0ZSg0NWRlZyl9Lm1fZDRmYjljYWRbZGF0YS1vcGVuZWRdOmFmdGVye3RyYW5zZm9ybTp0cmFuc2xhdGVZKGNhbGModmFyKC0tYnVyZ2VyLXNpemUpIC8gLTMpKSByb3RhdGUoLTQ1ZGVnKX0ubV83N2M5ZDI3ZHstLWJ1dHRvbi1oZWlnaHQteHM6IGNhbGMoMS44NzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1idXR0b24taGVpZ2h0LXNtOiBjYWxjKDIuMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1idXR0b24taGVpZ2h0LW1kOiBjYWxjKDIuNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tYnV0dG9uLWhlaWdodC1sZzogY2FsYygzLjEyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWJ1dHRvbi1oZWlnaHQteGw6IGNhbGMoMy43NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWJ1dHRvbi1oZWlnaHQtY29tcGFjdC14czogY2FsYygxLjM3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWJ1dHRvbi1oZWlnaHQtY29tcGFjdC1zbTogY2FsYygxLjYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWJ1dHRvbi1oZWlnaHQtY29tcGFjdC1tZDogY2FsYygxLjg3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWJ1dHRvbi1oZWlnaHQtY29tcGFjdC1sZzogY2FsYygyLjEyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWJ1dHRvbi1oZWlnaHQtY29tcGFjdC14bDogY2FsYygyLjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1idXR0b24tcGFkZGluZy14LXhzOiBjYWxjKC44NzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1idXR0b24tcGFkZGluZy14LXNtOiBjYWxjKDEuMTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tYnV0dG9uLXBhZGRpbmcteC1tZDogY2FsYygxLjM3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWJ1dHRvbi1wYWRkaW5nLXgtbGc6IGNhbGMoMS42MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1idXR0b24tcGFkZGluZy14LXhsOiBjYWxjKDJyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1idXR0b24tcGFkZGluZy14LWNvbXBhY3QteHM6IGNhbGMoLjQzNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1idXR0b24tcGFkZGluZy14LWNvbXBhY3Qtc206IGNhbGMoLjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1idXR0b24tcGFkZGluZy14LWNvbXBhY3QtbWQ6IGNhbGMoLjYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWJ1dHRvbi1wYWRkaW5nLXgtY29tcGFjdC1sZzogY2FsYyguNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1idXR0b24tcGFkZGluZy14LWNvbXBhY3QteGw6IGNhbGMoLjg3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWJ1dHRvbi1oZWlnaHQ6IHZhcigtLWJ1dHRvbi1oZWlnaHQtc20pOy0tYnV0dG9uLXBhZGRpbmcteDogdmFyKC0tYnV0dG9uLXBhZGRpbmcteC1zbSk7LS1idXR0b24tY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3Itd2hpdGUpO3VzZXItc2VsZWN0Om5vbmU7Zm9udC13ZWlnaHQ6dmFyKC0tbWFudGluZS1mb250LXdlaWdodC1tZWRpdW0pO3Bvc2l0aW9uOnJlbGF0aXZlO2xpbmUtaGVpZ2h0OjE7dGV4dC1hbGlnbjpjZW50ZXI7b3ZlcmZsb3c6aGlkZGVuO3dpZHRoOmF1dG87Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTppbmxpbmUtYmxvY2s7Ym9yZGVyLXJhZGl1czp2YXIoLS1idXR0b24tcmFkaXVzLCB2YXIoLS1tYW50aW5lLXJhZGl1cy1kZWZhdWx0KSk7Zm9udC1zaXplOnZhcigtLWJ1dHRvbi1meiwgdmFyKC0tbWFudGluZS1mb250LXNpemUtc20pKTtiYWNrZ3JvdW5kOnZhcigtLWJ1dHRvbi1iZywgdmFyKC0tbWFudGluZS1wcmltYXJ5LWNvbG9yLWZpbGxlZCkpO2JvcmRlcjp2YXIoLS1idXR0b24tYmQsIGNhbGMoLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkgc29saWQgdHJhbnNwYXJlbnQpO2NvbG9yOnZhcigtLWJ1dHRvbi1jb2xvciwgdmFyKC0tbWFudGluZS1jb2xvci13aGl0ZSkpO2hlaWdodDp2YXIoLS1idXR0b24taGVpZ2h0LCB2YXIoLS1idXR0b24taGVpZ2h0LXNtKSk7cGFkZGluZy1pbmxpbmU6dmFyKC0tYnV0dG9uLXBhZGRpbmcteCwgdmFyKC0tYnV0dG9uLXBhZGRpbmcteC1zbSkpO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0ubV83N2M5ZDI3ZDp3aGVyZShbZGF0YS1ibG9ja10pe2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTAwJX0ubV83N2M5ZDI3ZDp3aGVyZShbZGF0YS13aXRoLWxlZnQtc2VjdGlvbl0pe3BhZGRpbmctaW5saW5lLXN0YXJ0OmNhbGModmFyKC0tYnV0dG9uLXBhZGRpbmcteCkgLyAxLjUpfS5tXzc3YzlkMjdkOndoZXJlKFtkYXRhLXdpdGgtcmlnaHQtc2VjdGlvbl0pe3BhZGRpbmctaW5saW5lLWVuZDpjYWxjKHZhcigtLWJ1dHRvbi1wYWRkaW5nLXgpIC8gMS41KX0ubV83N2M5ZDI3ZDp3aGVyZSg6ZGlzYWJsZWQ6bm90KFtkYXRhLWxvYWRpbmddKSxbZGF0YS1kaXNhYmxlZF06bm90KFtkYXRhLWxvYWRpbmddKSl7Y3Vyc29yOm5vdC1hbGxvd2VkO2JvcmRlcjpjYWxjKC4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpIHNvbGlkIHRyYW5zcGFyZW50O3RyYW5zZm9ybTpub25lO2NvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGlzYWJsZWQtY29sb3IpO2JhY2tncm91bmQ6dmFyKC0tbWFudGluZS1jb2xvci1kaXNhYmxlZCl9Lm1fNzdjOWQyN2Q6YmVmb3Jle2NvbnRlbnQ6IiI7cG9pbnRlci1ldmVudHM6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZTtpbnNldDpjYWxjKC0uMDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTtib3JkZXItcmFkaXVzOnZhcigtLWJ1dHRvbi1yYWRpdXMsIHZhcigtLW1hbnRpbmUtcmFkaXVzLWRlZmF1bHQpKTt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMTAwJSk7b3BhY2l0eTowO2ZpbHRlcjpibHVyKDEycHgpO3RyYW5zaXRpb246dHJhbnNmb3JtIC4xNXMgZWFzZSxvcGFjaXR5IC4xcyBlYXNlfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1saWdodF0pIC5tXzc3YzlkMjdkOmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZmZmYyNn06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tXzc3YzlkMjdkOmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDAwMDAyNn0ubV83N2M5ZDI3ZDp3aGVyZShbZGF0YS1sb2FkaW5nXSl7Y3Vyc29yOm5vdC1hbGxvd2VkO3RyYW5zZm9ybTpub25lfS5tXzc3YzlkMjdkOndoZXJlKFtkYXRhLWxvYWRpbmddKTpiZWZvcmV7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMCk7b3BhY2l0eToxfS5tXzc3YzlkMjdkOndoZXJlKFtkYXRhLWxvYWRpbmddKSAubV84MGYxMzAxYntvcGFjaXR5OjA7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMTAwJSl9QG1lZGlhKGhvdmVyOmhvdmVyKXsubV83N2M5ZDI3ZDpob3Zlcjp3aGVyZSg6bm90KFtkYXRhLWxvYWRpbmddLDpkaXNhYmxlZCxbZGF0YS1kaXNhYmxlZF0pKXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWJ1dHRvbi1ob3ZlciwgdmFyKC0tbWFudGluZS1wcmltYXJ5LWNvbG9yLWZpbGxlZC1ob3ZlcikpO2NvbG9yOnZhcigtLWJ1dHRvbi1ob3Zlci1jb2xvciwgdmFyKC0tYnV0dG9uLWNvbG9yKSl9fUBtZWRpYShob3Zlcjpub25lKXsubV83N2M5ZDI3ZDphY3RpdmU6d2hlcmUoOm5vdChbZGF0YS1sb2FkaW5nXSw6ZGlzYWJsZWQsW2RhdGEtZGlzYWJsZWRdKSl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1idXR0b24taG92ZXIsIHZhcigtLW1hbnRpbmUtcHJpbWFyeS1jb2xvci1maWxsZWQtaG92ZXIpKTtjb2xvcjp2YXIoLS1idXR0b24taG92ZXItY29sb3IsIHZhcigtLWJ1dHRvbi1jb2xvcikpfX0ubV84MGYxMzAxYntkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDp2YXIoLS1idXR0b24tanVzdGlmeSwgY2VudGVyKTtoZWlnaHQ6MTAwJTtvdmVyZmxvdzp2aXNpYmxlO3RyYW5zaXRpb246dHJhbnNmb3JtIC4xNXMgZWFzZSxvcGFjaXR5IC4xcyBlYXNlfS5tXzgxMTU2MGI5e3doaXRlLXNwYWNlOm5vd3JhcDtoZWlnaHQ6MTAwJTtvdmVyZmxvdzpoaWRkZW47ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtvcGFjaXR5OjE7dGV4dC1ib3gtdHJpbTp0cmltLWJvdGg7dGV4dC1ib3gtZWRnZTpjYXAgYWxwaGFiZXRpY30ubV84MTE1NjBiOTp3aGVyZShbZGF0YS1sb2FkaW5nXSl7b3BhY2l0eTouMn0ubV9hNzQwMzZhe2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXJ9Lm1fYTc0MDM2YTp3aGVyZShbZGF0YS1wb3NpdGlvbj1sZWZ0XSl7bWFyZ2luLWlubGluZS1lbmQ6dmFyKC0tbWFudGluZS1zcGFjaW5nLXhzKX0ubV9hNzQwMzZhOndoZXJlKFtkYXRhLXBvc2l0aW9uPXJpZ2h0XSl7bWFyZ2luLWlubGluZS1zdGFydDp2YXIoLS1tYW50aW5lLXNwYWNpbmcteHMpfS5tX2EyNWI4NmVle3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6NTAlO3RvcDo1MCV9Lm1fODBkNmQ4NDR7LS1idXR0b24tYm9yZGVyLXdpZHRoOiBjYWxjKC4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpO2Rpc3BsYXk6ZmxleH0ubV84MGQ2ZDg0NCA6d2hlcmUoLm1fNzdjOWQyN2QpOmZvY3Vze3Bvc2l0aW9uOnJlbGF0aXZlO3otaW5kZXg6MX0ubV84MGQ2ZDg0NFtkYXRhLW9yaWVudGF0aW9uPWhvcml6b250YWxde2ZsZXgtZGlyZWN0aW9uOnJvd30ubV84MGQ2ZDg0NFtkYXRhLW9yaWVudGF0aW9uPWhvcml6b250YWxdIC5tXzc3YzlkMjdkOm5vdCg6b25seS1jaGlsZCk6Zmlyc3QtY2hpbGQsLm1fODBkNmQ4NDRbZGF0YS1vcmllbnRhdGlvbj1ob3Jpem9udGFsXSAubV83MGJlMmEwMTpub3QoOm9ubHktY2hpbGQpOmZpcnN0LWNoaWxke2JvcmRlci1lbmQtZW5kLXJhZGl1czowO2JvcmRlci1zdGFydC1lbmQtcmFkaXVzOjA7Ym9yZGVyLWlubGluZS1lbmQtd2lkdGg6Y2FsYyh2YXIoLS1idXR0b24tYm9yZGVyLXdpZHRoKSAvIDIpfS5tXzgwZDZkODQ0W2RhdGEtb3JpZW50YXRpb249aG9yaXpvbnRhbF0gLm1fNzdjOWQyN2Q6bm90KDpvbmx5LWNoaWxkKTpsYXN0LWNoaWxkLC5tXzgwZDZkODQ0W2RhdGEtb3JpZW50YXRpb249aG9yaXpvbnRhbF0gLm1fNzBiZTJhMDE6bm90KDpvbmx5LWNoaWxkKTpsYXN0LWNoaWxke2JvcmRlci1lbmQtc3RhcnQtcmFkaXVzOjA7Ym9yZGVyLXN0YXJ0LXN0YXJ0LXJhZGl1czowO2JvcmRlci1pbmxpbmUtc3RhcnQtd2lkdGg6Y2FsYyh2YXIoLS1idXR0b24tYm9yZGVyLXdpZHRoKSAvIDIpfS5tXzgwZDZkODQ0W2RhdGEtb3JpZW50YXRpb249aG9yaXpvbnRhbF0gLm1fNzdjOWQyN2Q6bm90KDpvbmx5LWNoaWxkKTpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpLC5tXzgwZDZkODQ0W2RhdGEtb3JpZW50YXRpb249aG9yaXpvbnRhbF0gLm1fNzBiZTJhMDE6bm90KDpvbmx5LWNoaWxkKTpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpe2JvcmRlci1yYWRpdXM6MDtib3JkZXItaW5saW5lLXdpZHRoOmNhbGModmFyKC0tYnV0dG9uLWJvcmRlci13aWR0aCkgLyAyKX0ubV84MGQ2ZDg0NFtkYXRhLW9yaWVudGF0aW9uPXZlcnRpY2FsXXtmbGV4LWRpcmVjdGlvbjpjb2x1bW59Lm1fODBkNmQ4NDRbZGF0YS1vcmllbnRhdGlvbj12ZXJ0aWNhbF0gLm1fNzdjOWQyN2Q6bm90KDpvbmx5LWNoaWxkKTpmaXJzdC1jaGlsZCwubV84MGQ2ZDg0NFtkYXRhLW9yaWVudGF0aW9uPXZlcnRpY2FsXSAubV83MGJlMmEwMTpub3QoOm9ubHktY2hpbGQpOmZpcnN0LWNoaWxke2JvcmRlci1lbmQtc3RhcnQtcmFkaXVzOjA7Ym9yZGVyLWVuZC1lbmQtcmFkaXVzOjA7Ym9yZGVyLWJvdHRvbS13aWR0aDpjYWxjKHZhcigtLWJ1dHRvbi1ib3JkZXItd2lkdGgpIC8gMil9Lm1fODBkNmQ4NDRbZGF0YS1vcmllbnRhdGlvbj12ZXJ0aWNhbF0gLm1fNzdjOWQyN2Q6bm90KDpvbmx5LWNoaWxkKTpsYXN0LWNoaWxkLC5tXzgwZDZkODQ0W2RhdGEtb3JpZW50YXRpb249dmVydGljYWxdIC5tXzcwYmUyYTAxOm5vdCg6b25seS1jaGlsZCk6bGFzdC1jaGlsZHtib3JkZXItc3RhcnQtc3RhcnQtcmFkaXVzOjA7Ym9yZGVyLXN0YXJ0LWVuZC1yYWRpdXM6MDtib3JkZXItdG9wLXdpZHRoOmNhbGModmFyKC0tYnV0dG9uLWJvcmRlci13aWR0aCkgLyAyKX0ubV84MGQ2ZDg0NFtkYXRhLW9yaWVudGF0aW9uPXZlcnRpY2FsXSAubV83N2M5ZDI3ZDpub3QoOm9ubHktY2hpbGQpOm5vdCg6Zmlyc3QtY2hpbGQpOm5vdCg6bGFzdC1jaGlsZCksLm1fODBkNmQ4NDRbZGF0YS1vcmllbnRhdGlvbj12ZXJ0aWNhbF0gLm1fNzBiZTJhMDE6bm90KDpvbmx5LWNoaWxkKTpub3QoOmZpcnN0LWNoaWxkKTpub3QoOmxhc3QtY2hpbGQpe2JvcmRlci1yYWRpdXM6MDtib3JkZXItYm90dG9tLXdpZHRoOmNhbGModmFyKC0tYnV0dG9uLWJvcmRlci13aWR0aCkgLyAyKTtib3JkZXItdG9wLXdpZHRoOmNhbGModmFyKC0tYnV0dG9uLWJvcmRlci13aWR0aCkgLyAyKX0ubV83MGJlMmEwMXstLXNlY3Rpb24taGVpZ2h0LXhzOiBjYWxjKDEuODc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tc2VjdGlvbi1oZWlnaHQtc206IGNhbGMoMi4yNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXNlY3Rpb24taGVpZ2h0LW1kOiBjYWxjKDIuNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tc2VjdGlvbi1oZWlnaHQtbGc6IGNhbGMoMy4xMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1zZWN0aW9uLWhlaWdodC14bDogY2FsYygzLjc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tc2VjdGlvbi1oZWlnaHQtY29tcGFjdC14czogY2FsYygxLjM3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXNlY3Rpb24taGVpZ2h0LWNvbXBhY3Qtc206IGNhbGMoMS42MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1zZWN0aW9uLWhlaWdodC1jb21wYWN0LW1kOiBjYWxjKDEuODc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tc2VjdGlvbi1oZWlnaHQtY29tcGFjdC1sZzogY2FsYygyLjEyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXNlY3Rpb24taGVpZ2h0LWNvbXBhY3QteGw6IGNhbGMoMi41cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tc2VjdGlvbi1wYWRkaW5nLXgteHM6IGNhbGMoLjg3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXNlY3Rpb24tcGFkZGluZy14LXNtOiBjYWxjKDEuMTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tc2VjdGlvbi1wYWRkaW5nLXgtbWQ6IGNhbGMoMS4zNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1zZWN0aW9uLXBhZGRpbmcteC1sZzogY2FsYygxLjYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXNlY3Rpb24tcGFkZGluZy14LXhsOiBjYWxjKDJyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1zZWN0aW9uLXBhZGRpbmcteC1jb21wYWN0LXhzOiBjYWxjKC40Mzc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tc2VjdGlvbi1wYWRkaW5nLXgtY29tcGFjdC1zbTogY2FsYyguNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXNlY3Rpb24tcGFkZGluZy14LWNvbXBhY3QtbWQ6IGNhbGMoLjYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXNlY3Rpb24tcGFkZGluZy14LWNvbXBhY3QtbGc6IGNhbGMoLjc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tc2VjdGlvbi1wYWRkaW5nLXgtY29tcGFjdC14bDogY2FsYyguODc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tc2VjdGlvbi1oZWlnaHQ6IHZhcigtLXNlY3Rpb24taGVpZ2h0LXNtKTstLXNlY3Rpb24tcGFkZGluZy14OiB2YXIoLS1zZWN0aW9uLXBhZGRpbmcteC1zbSk7LS1zZWN0aW9uLWNvbG9yOiB2YXIoLS1tYW50aW5lLWNvbG9yLXdoaXRlKTtmb250LXdlaWdodDp2YXIoLS1tYW50aW5lLWZvbnQtd2VpZ2h0LW1lZGl1bSk7d2lkdGg6YXV0bztib3JkZXItcmFkaXVzOnZhcigtLXNlY3Rpb24tcmFkaXVzLCB2YXIoLS1tYW50aW5lLXJhZGl1cy1kZWZhdWx0KSk7Zm9udC1zaXplOnZhcigtLXNlY3Rpb24tZnosIHZhcigtLW1hbnRpbmUtZm9udC1zaXplLXNtKSk7YmFja2dyb3VuZDp2YXIoLS1zZWN0aW9uLWJnLCB2YXIoLS1tYW50aW5lLXByaW1hcnktY29sb3ItZmlsbGVkKSk7Ym9yZGVyOnZhcigtLXNlY3Rpb24tYmQsIGNhbGMoLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkgc29saWQgdHJhbnNwYXJlbnQpO2NvbG9yOnZhcigtLXNlY3Rpb24tY29sb3IsIHZhcigtLW1hbnRpbmUtY29sb3Itd2hpdGUpKTtoZWlnaHQ6dmFyKC0tc2VjdGlvbi1oZWlnaHQsIHZhcigtLXNlY3Rpb24taGVpZ2h0LXNtKSk7cGFkZGluZy1pbmxpbmU6dmFyKC0tc2VjdGlvbi1wYWRkaW5nLXgsIHZhcigtLXNlY3Rpb24tcGFkZGluZy14LXNtKSk7dmVydGljYWwtYWxpZ246bWlkZGxlO2xpbmUtaGVpZ2h0OjE7ZGlzcGxheTppbmxpbmUtZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcn0ubV9lNjE1YjE1ZnstLWNhcmQtcGFkZGluZzogdmFyKC0tbWFudGluZS1zcGFjaW5nLW1kKTtwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzpoaWRkZW47ZGlzcGxheTpmbGV4O3BhZGRpbmc6dmFyKC0tY2FyZC1wYWRkaW5nKTtjb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLXRleHQpfS5tX2U2MTViMTVmOndoZXJlKFtkYXRhLW9yaWVudGF0aW9uPWhvcml6b250YWxdKXtmbGV4LWRpcmVjdGlvbjpyb3d9Lm1fZTYxNWIxNWY6d2hlcmUoW2RhdGEtb3JpZW50YXRpb249dmVydGljYWxdKXtmbGV4LWRpcmVjdGlvbjpjb2x1bW59OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fZTYxNWIxNWZ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLXdoaXRlKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tX2U2MTViMTVme2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTYpfS5tXzU5OWEyMTQ4e2Rpc3BsYXk6YmxvY2s7bWFyZ2luLWlubGluZTpjYWxjKHZhcigtLWNhcmQtcGFkZGluZykgKiAtMSl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fNTk5YTIxNDh7LS1ib3JkZXItY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS0zKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tXzU5OWEyMTQ4ey0tYm9yZGVyLWNvbG9yOiB2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNCl9Lm1fNTk5YTIxNDg6d2hlcmUoW2RhdGEtb3JpZW50YXRpb249dmVydGljYWxdKTpmaXJzdC1jaGlsZHttYXJnaW4tdG9wOmNhbGModmFyKC0tY2FyZC1wYWRkaW5nKSAqIC0xKTtib3JkZXItdG9wOm5vbmUhaW1wb3J0YW50fS5tXzU5OWEyMTQ4OndoZXJlKFtkYXRhLW9yaWVudGF0aW9uPXZlcnRpY2FsXSk6bGFzdC1jaGlsZHttYXJnaW4tYm90dG9tOmNhbGModmFyKC0tY2FyZC1wYWRkaW5nKSAqIC0xKTtib3JkZXItYm90dG9tOm5vbmUhaW1wb3J0YW50fS5tXzU5OWEyMTQ4OndoZXJlKFtkYXRhLW9yaWVudGF0aW9uPXZlcnRpY2FsXSlbZGF0YS1pbmhlcml0LXBhZGRpbmdde3BhZGRpbmctaW5saW5lOnZhcigtLWNhcmQtcGFkZGluZyl9Lm1fNTk5YTIxNDg6d2hlcmUoW2RhdGEtb3JpZW50YXRpb249dmVydGljYWxdKVtkYXRhLXdpdGgtYm9yZGVyXXtib3JkZXItdG9wOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcil9Lm1fNTk5YTIxNDg6d2hlcmUoW2RhdGEtb3JpZW50YXRpb249dmVydGljYWxdKSsubV81OTlhMjE0ODp3aGVyZShbZGF0YS1vcmllbnRhdGlvbj12ZXJ0aWNhbF0pe2JvcmRlci10b3A6bm9uZSFpbXBvcnRhbnR9Lm1fNTk5YTIxNDg6d2hlcmUoW2RhdGEtb3JpZW50YXRpb249aG9yaXpvbnRhbF0pe21hcmdpbi1ibG9jazpjYWxjKHZhcigtLWNhcmQtcGFkZGluZykgKiAtMSk7bWFyZ2luLWlubGluZTowfS5tXzU5OWEyMTQ4OndoZXJlKFtkYXRhLW9yaWVudGF0aW9uPWhvcml6b250YWxdKTpmaXJzdC1jaGlsZHttYXJnaW4taW5saW5lLXN0YXJ0OmNhbGModmFyKC0tY2FyZC1wYWRkaW5nKSAqIC0xKTtib3JkZXItaW5saW5lLXN0YXJ0Om5vbmUhaW1wb3J0YW50fS5tXzU5OWEyMTQ4OndoZXJlKFtkYXRhLW9yaWVudGF0aW9uPWhvcml6b250YWxdKTpsYXN0LWNoaWxke21hcmdpbi1pbmxpbmUtZW5kOmNhbGModmFyKC0tY2FyZC1wYWRkaW5nKSAqIC0xKTtib3JkZXItaW5saW5lLWVuZDpub25lIWltcG9ydGFudH0ubV81OTlhMjE0ODp3aGVyZShbZGF0YS1vcmllbnRhdGlvbj1ob3Jpem9udGFsXSlbZGF0YS1pbmhlcml0LXBhZGRpbmdde3BhZGRpbmctYmxvY2s6dmFyKC0tY2FyZC1wYWRkaW5nKX0ubV81OTlhMjE0ODp3aGVyZShbZGF0YS1vcmllbnRhdGlvbj1ob3Jpem9udGFsXSlbZGF0YS13aXRoLWJvcmRlcl17Ym9yZGVyLWlubGluZS1zdGFydDoxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKTtib3JkZXItaW5saW5lLWVuZDoxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKX0ubV81OTlhMjE0ODp3aGVyZShbZGF0YS1vcmllbnRhdGlvbj1ob3Jpem9udGFsXSkrLm1fNTk5YTIxNDg6d2hlcmUoW2RhdGEtb3JpZW50YXRpb249aG9yaXpvbnRhbF0pe2JvcmRlci1pbmxpbmUtc3RhcnQ6bm9uZSFpbXBvcnRhbnR9Lm1fNDQ1MWViM2F7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfS5tXzQ0NTFlYjNhOndoZXJlKFtkYXRhLWlubGluZV0pe2Rpc3BsYXk6aW5saW5lLWZsZXh9Lm1fZjU5ZmZkYTN7LS1jaGlwLXNpemUteHM6IGNhbGMoMS40Mzc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY2hpcC1zaXplLXNtOiBjYWxjKDEuNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jaGlwLXNpemUtbWQ6IGNhbGMoMnJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWNoaXAtc2l6ZS1sZzogY2FsYygyLjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY2hpcC1zaXplLXhsOiBjYWxjKDIuNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWNoaXAtaWNvbi1zaXplLXhzOiBjYWxjKC41NjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY2hpcC1pY29uLXNpemUtc206IGNhbGMoLjc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY2hpcC1pY29uLXNpemUtbWQ6IGNhbGMoLjg3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWNoaXAtaWNvbi1zaXplLWxnOiBjYWxjKDFyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jaGlwLWljb24tc2l6ZS14bDogY2FsYygxLjEyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWNoaXAtcGFkZGluZy14czogY2FsYygxcmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY2hpcC1wYWRkaW5nLXNtOiBjYWxjKDEuMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jaGlwLXBhZGRpbmctbWQ6IGNhbGMoMS41cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY2hpcC1wYWRkaW5nLWxnOiBjYWxjKDEuNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jaGlwLXBhZGRpbmcteGw6IGNhbGMoMnJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWNoaXAtY2hlY2tlZC1wYWRkaW5nLXhzOiBjYWxjKC41MTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY2hpcC1jaGVja2VkLXBhZGRpbmctc206IGNhbGMoLjYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWNoaXAtY2hlY2tlZC1wYWRkaW5nLW1kOiBjYWxjKC43MzEyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWNoaXAtY2hlY2tlZC1wYWRkaW5nLWxnOiBjYWxjKC44NDM3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWNoaXAtY2hlY2tlZC1wYWRkaW5nLXhsOiBjYWxjKC45ODEyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWNoaXAtc3BhY2luZy14czogY2FsYyguNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY2hpcC1zcGFjaW5nLXNtOiBjYWxjKC43NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWNoaXAtc3BhY2luZy1tZDogY2FsYygxcmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY2hpcC1zcGFjaW5nLWxnOiBjYWxjKDEuMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jaGlwLXNwYWNpbmcteGw6IGNhbGMoMS4zNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jaGlwLXNpemU6IHZhcigtLWNoaXAtc2l6ZS1zbSk7LS1jaGlwLWljb24tc2l6ZTogdmFyKC0tY2hpcC1pY29uLXNpemUtc20pOy0tY2hpcC1wYWRkaW5nOiB2YXIoLS1jaGlwLXBhZGRpbmctc20pOy0tY2hpcC1zcGFjaW5nOiB2YXIoLS1jaGlwLXNwYWNpbmctc20pOy0tY2hpcC1jaGVja2VkLXBhZGRpbmc6IHZhcigtLWNoaXAtY2hlY2tlZC1wYWRkaW5nLXNtKTstLWNoaXAtYmc6IHZhcigtLW1hbnRpbmUtcHJpbWFyeS1jb2xvci1maWxsZWQpOy0tY2hpcC1ob3ZlcjogdmFyKC0tbWFudGluZS1wcmltYXJ5LWNvbG9yLWZpbGxlZC1ob3Zlcik7LS1jaGlwLWNvbG9yOiB2YXIoLS1tYW50aW5lLWNvbG9yLXdoaXRlKTstLWNoaXAtYmQ6IGNhbGMoLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkgc29saWQgdHJhbnNwYXJlbnR9Lm1fYmUwNDlhNTN7ZGlzcGxheTppbmxpbmUtZmxleDthbGlnbi1pdGVtczpjZW50ZXI7dXNlci1zZWxlY3Q6bm9uZTtib3JkZXItcmFkaXVzOnZhcigtLWNoaXAtcmFkaXVzLCAxMDAwcmVtKTtoZWlnaHQ6dmFyKC0tY2hpcC1zaXplKTtmb250LXNpemU6dmFyKC0tY2hpcC1meiwgdmFyKC0tbWFudGluZS1mb250LXNpemUtc20pKTtsaW5lLWhlaWdodDpjYWxjKHZhcigtLWNoaXAtc2l6ZSkgLSBjYWxjKC4xMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkpO3BhZGRpbmctaW5saW5lOnZhcigtLWNoaXAtcGFkZGluZyk7Y3Vyc29yOnBvaW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDtib3JkZXI6Y2FsYyguMDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSBzb2xpZCB0cmFuc3BhcmVudDtjb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLXRleHQpO3RleHQtYm94LXRyaW06dHJpbS1ib3RoO3RleHQtYm94LWVkZ2U6Y2FwIGFscGhhYmV0aWN9Lm1fYmUwNDlhNTM6d2hlcmUoW2RhdGEtY2hlY2tlZF0pe3BhZGRpbmctaW5saW5lOnZhcigtLWNoaXAtY2hlY2tlZC1wYWRkaW5nKX0ubV9iZTA0OWE1Mzp3aGVyZShbZGF0YS1kaXNhYmxlZF0pe2N1cnNvcjpub3QtYWxsb3dlZDtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGlzYWJsZWQpO2NvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGlzYWJsZWQtY29sb3IpfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1saWdodF0pIC5tXzM5MDRjMWFmOm5vdChbZGF0YS1kaXNhYmxlZF0pe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci13aGl0ZSk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMyl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdKSAubV8zOTA0YzFhZjpub3QoW2RhdGEtZGlzYWJsZWRdKXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGFyay02KTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLW1hbnRpbmUtY29sb3ItZGFyay00KX1AbWVkaWEoaG92ZXI6aG92ZXIpezp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1saWdodF0pIC5tXzM5MDRjMWFmOm5vdChbZGF0YS1kaXNhYmxlZF0pOmhvdmVye2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTApfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1kYXJrXSkgLm1fMzkwNGMxYWY6bm90KFtkYXRhLWRpc2FibGVkXSk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNSl9fUBtZWRpYShob3Zlcjpub25lKXs6d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV8zOTA0YzFhZjpub3QoW2RhdGEtZGlzYWJsZWRdKTphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMCl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdKSAubV8zOTA0YzFhZjpub3QoW2RhdGEtZGlzYWJsZWRdKTphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNSl9fS5tXzM5MDRjMWFmOm5vdChbZGF0YS1kaXNhYmxlZF0pOndoZXJlKFtkYXRhLWNoZWNrZWRdKXstLWNoaXAtaWNvbi1jb2xvcjogdmFyKC0tY2hpcC1jb2xvcik7Ym9yZGVyOnZhcigtLWNoaXAtYmQpfUBtZWRpYShob3Zlcjpob3Zlcil7Lm1fMzkwNGMxYWY6bm90KFtkYXRhLWRpc2FibGVkXSk6d2hlcmUoW2RhdGEtY2hlY2tlZF0pOmhvdmVye2JhY2tncm91bmQtY29sb3I6dmFyKC0tY2hpcC1ob3Zlcil9fUBtZWRpYShob3Zlcjpub25lKXsubV8zOTA0YzFhZjpub3QoW2RhdGEtZGlzYWJsZWRdKTp3aGVyZShbZGF0YS1jaGVja2VkXSk6YWN0aXZle2JhY2tncm91bmQtY29sb3I6dmFyKC0tY2hpcC1ob3Zlcil9fS5tX2ZhMTA5MjU1Om5vdChbZGF0YS1kaXNhYmxlZF0pLC5tX2Y3ZTE2NWMzOm5vdChbZGF0YS1kaXNhYmxlZF0pe2JvcmRlcjpjYWxjKC4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpIHNvbGlkIHRyYW5zcGFyZW50O2NvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItdGV4dCl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fZmExMDkyNTU6bm90KFtkYXRhLWRpc2FibGVkXSksOndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fZjdlMTY1YzM6bm90KFtkYXRhLWRpc2FibGVkXSl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMSl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdKSAubV9mYTEwOTI1NTpub3QoW2RhdGEtZGlzYWJsZWRdKSw6d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tX2Y3ZTE2NWMzOm5vdChbZGF0YS1kaXNhYmxlZF0pe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTUpfUBtZWRpYShob3Zlcjpob3Zlcil7OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fZmExMDkyNTU6bm90KFtkYXRhLWRpc2FibGVkXSk6aG92ZXIsOndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fZjdlMTY1YzM6bm90KFtkYXRhLWRpc2FibGVkXSk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMil9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdKSAubV9mYTEwOTI1NTpub3QoW2RhdGEtZGlzYWJsZWRdKTpob3Zlciw6d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tX2Y3ZTE2NWMzOm5vdChbZGF0YS1kaXNhYmxlZF0pOmhvdmVye2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTQpfX1AbWVkaWEoaG92ZXI6bm9uZSl7OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fZmExMDkyNTU6bm90KFtkYXRhLWRpc2FibGVkXSk6YWN0aXZlLDp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1saWdodF0pIC5tX2Y3ZTE2NWMzOm5vdChbZGF0YS1kaXNhYmxlZF0pOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS0yKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tX2ZhMTA5MjU1Om5vdChbZGF0YS1kaXNhYmxlZF0pOmFjdGl2ZSw6d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tX2Y3ZTE2NWMzOm5vdChbZGF0YS1kaXNhYmxlZF0pOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGFyay00KX19Lm1fZmExMDkyNTU6bm90KFtkYXRhLWRpc2FibGVkXSk6d2hlcmUoW2RhdGEtY2hlY2tlZF0pLC5tX2Y3ZTE2NWMzOm5vdChbZGF0YS1kaXNhYmxlZF0pOndoZXJlKFtkYXRhLWNoZWNrZWRdKXstLWNoaXAtaWNvbi1jb2xvcjogdmFyKC0tY2hpcC1jb2xvcik7Y29sb3I6dmFyKC0tY2hpcC1jb2xvcik7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1jaGlwLWJnKX1AbWVkaWEoaG92ZXI6aG92ZXIpey5tX2ZhMTA5MjU1Om5vdChbZGF0YS1kaXNhYmxlZF0pOndoZXJlKFtkYXRhLWNoZWNrZWRdKTpob3ZlciwubV9mN2UxNjVjMzpub3QoW2RhdGEtZGlzYWJsZWRdKTp3aGVyZShbZGF0YS1jaGVja2VkXSk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1jaGlwLWhvdmVyKX19QG1lZGlhKGhvdmVyOm5vbmUpey5tX2ZhMTA5MjU1Om5vdChbZGF0YS1kaXNhYmxlZF0pOndoZXJlKFtkYXRhLWNoZWNrZWRdKTphY3RpdmUsLm1fZjdlMTY1YzM6bm90KFtkYXRhLWRpc2FibGVkXSk6d2hlcmUoW2RhdGEtY2hlY2tlZF0pOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWNoaXAtaG92ZXIpfX0ubV85YWM4NmRmOXt3aWR0aDpjYWxjKHZhcigtLWNoaXAtaWNvbi1zaXplKSArICh2YXIoLS1jaGlwLXNwYWNpbmcpIC8gMS41KSk7bWF4LXdpZHRoOmNhbGModmFyKC0tY2hpcC1pY29uLXNpemUpICsgKHZhcigtLWNoaXAtc3BhY2luZykgLyAxLjUpKTtoZWlnaHQ6dmFyKC0tY2hpcC1pY29uLXNpemUpO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7b3ZlcmZsb3c6aGlkZGVufS5tX2Q2ZDcyNTgwe3dpZHRoOnZhcigtLWNoaXAtaWNvbi1zaXplKTtoZWlnaHQ6dmFyKC0tY2hpcC1pY29uLXNpemUpO2Rpc3BsYXk6YmxvY2s7Y29sb3I6dmFyKC0tY2hpcC1pY29uLWNvbG9yLCBpbmhlcml0KX0ubV9iZGUwNzMyOXt3aWR0aDowO2hlaWdodDowO3BhZGRpbmc6MDtvcGFjaXR5OjA7bWFyZ2luOjB9Lm1fYmRlMDczMjk6Zm9jdXMtdmlzaWJsZSsubV9iZTA0OWE1M3tvdXRsaW5lOjJweCBzb2xpZCB2YXIoLS1tYW50aW5lLXByaW1hcnktY29sb3ItZmlsbGVkKTtvdXRsaW5lLW9mZnNldDpjYWxjKC4xMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSl9Lm1fYjE4M2MwYTJ7Zm9udC1mYW1pbHk6dmFyKC0tbWFudGluZS1mb250LWZhbWlseS1tb25vc3BhY2UpO2xpbmUtaGVpZ2h0OnZhcigtLW1hbnRpbmUtbGluZS1oZWlnaHQpO3BhZGRpbmc6MnB4IGNhbGModmFyKC0tbWFudGluZS1zcGFjaW5nLXhzKSAvIDIpO2JvcmRlci1yYWRpdXM6dmFyKC0tbWFudGluZS1yYWRpdXMtc20pO2ZvbnQtc2l6ZTp2YXIoLS1tYW50aW5lLWZvbnQtc2l6ZS14cyk7bWFyZ2luOjA7b3ZlcmZsb3c6YXV0b306d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV9iMTgzYzBhMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWNvZGUtYmcsIHZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS0wKSl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdKSAubV9iMTgzYzBhMntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWNvZGUtYmcsIHZhcigtLW1hbnRpbmUtY29sb3ItZGFyay02KSl9Lm1fYjE4M2MwYTJbZGF0YS1ibG9ja117cGFkZGluZzp2YXIoLS1tYW50aW5lLXNwYWNpbmcteHMpfS5tX2RlM2QyNDkwey0tY3Mtc2l6ZTogY2FsYygxLjc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY3MtcmFkaXVzOiBjYWxjKDYyLjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlcjpub25lO2FwcGVhcmFuY2U6bm9uZTtkaXNwbGF5OmJsb2NrO2xpbmUtaGVpZ2h0OjE7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6dmFyKC0tY3Mtc2l6ZSk7aGVpZ2h0OnZhcigtLWNzLXNpemUpO21pbi13aWR0aDp2YXIoLS1jcy1zaXplKTttaW4taGVpZ2h0OnZhcigtLWNzLXNpemUpO2JvcmRlci1yYWRpdXM6dmFyKC0tY3MtcmFkaXVzKTtjb2xvcjppbmhlcml0O3RleHQtZGVjb3JhdGlvbjpub25lfVtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSAubV9kZTNkMjQ5MHstLWFscGhhLW92ZXJsYXktY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS0zKTstLWFscGhhLW92ZXJsYXktYmc6IHZhcigtLW1hbnRpbmUtY29sb3Itd2hpdGUpfVtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdIC5tX2RlM2QyNDkwey0tYWxwaGEtb3ZlcmxheS1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTQpOy0tYWxwaGEtb3ZlcmxheS1iZzogdmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTcpfS5tXzg2MmYzZDFie3Bvc2l0aW9uOmFic29sdXRlO2luc2V0OjA7Ym9yZGVyLXJhZGl1czp2YXIoLS1jcy1yYWRpdXMpfS5tXzk4YWU3ZjIye3Bvc2l0aW9uOmFic29sdXRlO2luc2V0OjA7Ym9yZGVyLXJhZGl1czp2YXIoLS1jcy1yYWRpdXMpO3otaW5kZXg6MTtib3gtc2hhZG93OiMwMDAwMDAxYSAwIDAgMCBjYWxjKC4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpIGluc2V0LCMwMDAwMDAyNiAwIDAgY2FsYyguMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkgaW5zZXR9Lm1fOTU3MDlhYzB7cG9zaXRpb246YWJzb2x1dGU7aW5zZXQ6MDtib3JkZXItcmFkaXVzOnZhcigtLWNzLXJhZGl1cyk7YmFja2dyb3VuZC1zaXplOmNhbGMoLjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkgY2FsYyguNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgMCwwIGNhbGMoLjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpLGNhbGMoLjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpIGNhbGMoLS4yNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSxjYWxjKC0uMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkgMDtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCg0NWRlZyx2YXIoLS1hbHBoYS1vdmVybGF5LWNvbG9yKSAyNSUsdHJhbnNwYXJlbnQgMjUlKSxsaW5lYXItZ3JhZGllbnQoLTQ1ZGVnLHZhcigtLWFscGhhLW92ZXJsYXktY29sb3IpIDI1JSx0cmFuc3BhcmVudCAyNSUpLGxpbmVhci1ncmFkaWVudCg0NWRlZyx0cmFuc3BhcmVudCA3NSUsdmFyKC0tYWxwaGEtb3ZlcmxheS1jb2xvcikgNzUlKSxsaW5lYXItZ3JhZGllbnQoLTQ1ZGVnLHZhcigtLWFscGhhLW92ZXJsYXktYmcpIDc1JSx2YXIoLS1hbHBoYS1vdmVybGF5LWNvbG9yKSA3NSUpfS5tXzkzZTc0ZTN7cG9zaXRpb246YWJzb2x1dGU7aW5zZXQ6MDtib3JkZXItcmFkaXVzOnZhcigtLWNzLXJhZGl1cyk7ei1pbmRleDoyO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcn0ubV9mZWU5Yzc3ey0tY3Atd2lkdGgteHM6IGNhbGMoMTEuMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jcC13aWR0aC1zbTogY2FsYygxMi41cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY3Atd2lkdGgtbWQ6IGNhbGMoMTVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jcC13aWR0aC1sZzogY2FsYygxNy41cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY3Atd2lkdGgteGw6IGNhbGMoMjByZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jcC1wcmV2aWV3LXNpemUteHM6IGNhbGMoMS42MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jcC1wcmV2aWV3LXNpemUtc206IGNhbGMoMi4xMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jcC1wcmV2aWV3LXNpemUtbWQ6IGNhbGMoMi42MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jcC1wcmV2aWV3LXNpemUtbGc6IGNhbGMoMy4xMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jcC1wcmV2aWV3LXNpemUteGw6IGNhbGMoMy4zNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jcC10aHVtYi1zaXplLXhzOiBjYWxjKC41cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY3AtdGh1bWItc2l6ZS1zbTogY2FsYyguNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jcC10aHVtYi1zaXplLW1kOiBjYWxjKDFyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jcC10aHVtYi1zaXplLWxnOiBjYWxjKDEuMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jcC10aHVtYi1zaXplLXhsOiBjYWxjKDEuMzc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY3Atc2F0dXJhdGlvbi1oZWlnaHQteHM6IGNhbGMoNi4yNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWNwLXNhdHVyYXRpb24taGVpZ2h0LXNtOiBjYWxjKDYuODc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY3Atc2F0dXJhdGlvbi1oZWlnaHQtbWQ6IGNhbGMoNy41cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY3Atc2F0dXJhdGlvbi1oZWlnaHQtbGc6IGNhbGMoOC43NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWNwLXNhdHVyYXRpb24taGVpZ2h0LXhsOiBjYWxjKDEwcmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY3AtcHJldmlldy1zaXplOiB2YXIoLS1jcC1wcmV2aWV3LXNpemUtc20pOy0tY3AtdGh1bWItc2l6ZTogdmFyKC0tY3AtdGh1bWItc2l6ZS1zbSk7LS1jcC1zYXR1cmF0aW9uLWhlaWdodDogdmFyKC0tY3Atc2F0dXJhdGlvbi1oZWlnaHQtc20pOy0tY3Atd2lkdGg6IHZhcigtLWNwLXdpZHRoLXNtKTstLWNwLWJvZHktc3BhY2luZzogdmFyKC0tbWFudGluZS1zcGFjaW5nLXNtKTt3aWR0aDp2YXIoLS1jcC13aWR0aCk7cGFkZGluZzpjYWxjKC4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpfS5tX2ZlZTljNzc6d2hlcmUoW2RhdGEtZnVsbC13aWR0aF0pe3dpZHRoOjEwMCV9Lm1fOWRkZGZiYWN7d2lkdGg6dmFyKC0tY3AtcHJldmlldy1zaXplKTtoZWlnaHQ6dmFyKC0tY3AtcHJldmlldy1zaXplKX0ubV9iZmZlY2MzZXtkaXNwbGF5OmZsZXg7cGFkZGluZy10b3A6Y2FsYyh2YXIoLS1jcC1ib2R5LXNwYWNpbmcpIC8gMil9Lm1fMzI4M2JiOTZ7ZmxleDoxfS5tXzMyODNiYjk2Om5vdCg6b25seS1jaGlsZCl7bWFyZ2luLWlubGluZS1lbmQ6dmFyKC0tbWFudGluZS1zcGFjaW5nLXhzKX0ubV80MGQ1NzJiYXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246YWJzb2x1dGU7Ym94LXNoYWRvdzowIDAgMXB4ICMwMDA5O2JvcmRlcjoycHggc29saWQgdmFyKC0tbWFudGluZS1jb2xvci13aGl0ZSk7d2lkdGg6dmFyKC0tY3AtdGh1bWItc2l6ZSk7aGVpZ2h0OnZhcigtLWNwLXRodW1iLXNpemUpO2JvcmRlci1yYWRpdXM6dmFyKC0tY3AtdGh1bWItc2l6ZSk7bGVmdDpjYWxjKHZhcigtLXRodW1iLXgtb2Zmc2V0KSAtIHZhcigtLWNwLXRodW1iLXNpemUpIC8gMik7dG9wOmNhbGModmFyKC0tdGh1bWIteS1vZmZzZXQpIC0gdmFyKC0tY3AtdGh1bWItc2l6ZSkgLyAyKX0ubV9kOGVlNmZkOHtoZWlnaHQ6dW5zZXQhaW1wb3J0YW50O3dpZHRoOnVuc2V0IWltcG9ydGFudDttaW4td2lkdGg6MCFpbXBvcnRhbnQ7bWluLWhlaWdodDowIWltcG9ydGFudDttYXJnaW46Y2FsYyguMTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpO2N1cnNvcjpwb2ludGVyO3BhZGRpbmctYm90dG9tOmNhbGModmFyKC0tY3Atc3dhdGNoLXNpemUpIC0gY2FsYyguMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkpO2ZsZXg6MCAwIGNhbGModmFyKC0tY3Atc3dhdGNoLXNpemUpIC0gY2FsYyguMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkpfS5tXzU3MTFlNjg2e21hcmdpbi10b3A6Y2FsYyguMzEyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTttYXJnaW4taW5saW5lOmNhbGMoLS4xMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7ZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwfS5tXzU3MTFlNjg2Om9ubHktY2hpbGR7bWFyZ2luLXRvcDowfS5tXzIwMmEyOTZley0tY3AtdGh1bWItc2l6ZS14czogY2FsYyguNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWNwLXRodW1iLXNpemUtc206IGNhbGMoLjc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY3AtdGh1bWItc2l6ZS1tZDogY2FsYygxcmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY3AtdGh1bWItc2l6ZS1sZzogY2FsYygxLjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY3AtdGh1bWItc2l6ZS14bDogY2FsYygxLjM3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7cG9zaXRpb246cmVsYXRpdmU7aGVpZ2h0OnZhcigtLWNwLXNhdHVyYXRpb24taGVpZ2h0KTtib3JkZXItcmFkaXVzOnZhcigtLW1hbnRpbmUtcmFkaXVzLXNtKTttYXJnaW46Y2FsYyh2YXIoLS1jcC10aHVtYi1zaXplKSAvIDIpfS5tXzIwMmEyOTZlOndoZXJlKFtkYXRhLWZvY3VzLXJpbmc9YXV0b10pOmZvY3VzOmZvY3VzLXZpc2libGUgLm1fNDBkNTcyYmF7b3V0bGluZToycHggc29saWQgdmFyKC0tbWFudGluZS1jb2xvci1ibHVlLWZpbGxlZCl9Lm1fMjAyYTI5NmU6d2hlcmUoW2RhdGEtZm9jdXMtcmluZz1hbHdheXNdKTpmb2N1cyAubV80MGQ1NzJiYXtvdXRsaW5lOjJweCBzb2xpZCB2YXIoLS1tYW50aW5lLWNvbG9yLWJsdWUtZmlsbGVkKX0ubV8xMWIzZGIwMntwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOnZhcigtLW1hbnRpbmUtcmFkaXVzLXNtKTtpbnNldDpjYWxjKHZhcigtLWNwLXRodW1iLXNpemUpICogLTEgLyAyIC0gY2FsYyguMDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSl9Lm1fZDg1NmQ0N2R7LS1jcC10aHVtYi1zaXplLXhzOiBjYWxjKC41cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY3AtdGh1bWItc2l6ZS1zbTogY2FsYyguNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jcC10aHVtYi1zaXplLW1kOiBjYWxjKDFyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jcC10aHVtYi1zaXplLWxnOiBjYWxjKDEuMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jcC10aHVtYi1zaXplLXhsOiBjYWxjKDEuMzc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY3AtdGh1bWItc2l6ZTogdmFyKC0tY3AtdGh1bWItc2l6ZSwgY2FsYyguNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkpO3Bvc2l0aW9uOnJlbGF0aXZlO2hlaWdodDpjYWxjKHZhcigtLWNwLXRodW1iLXNpemUpICsgY2FsYyguMTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpKTttYXJnaW4taW5saW5lOmNhbGModmFyKC0tY3AtdGh1bWItc2l6ZSkgLyAyKTtvdXRsaW5lOm5vbmV9Lm1fZDg1NmQ0N2QrLm1fZDg1NmQ0N2R7bWFyZ2luLXRvcDpjYWxjKC4zNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSl9Lm1fZDg1NmQ0N2Q6d2hlcmUoW2RhdGEtZm9jdXMtcmluZz1hdXRvXSk6Zm9jdXM6Zm9jdXMtdmlzaWJsZSAubV80MGQ1NzJiYXtvdXRsaW5lOjJweCBzb2xpZCB2YXIoLS1tYW50aW5lLWNvbG9yLWJsdWUtZmlsbGVkKX0ubV9kODU2ZDQ3ZDp3aGVyZShbZGF0YS1mb2N1cy1yaW5nPWFsd2F5c10pOmZvY3VzIC5tXzQwZDU3MmJhe291dGxpbmU6MnB4IHNvbGlkIHZhcigtLW1hbnRpbmUtY29sb3ItYmx1ZS1maWxsZWQpfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1saWdodF0pIC5tX2Q4NTZkNDdkey0tc2xpZGVyLWNoZWNrZXJzOiB2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMyl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdKSAubV9kODU2ZDQ3ZHstLXNsaWRlci1jaGVja2VyczogdmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTQpfS5tXzhmMzI3MTEze3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2luc2V0LWlubGluZTpjYWxjKHZhcigtLWNwLXRodW1iLXNpemUpICogLTEgLyAyIC0gY2FsYyguMDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSk7Ym9yZGVyLXJhZGl1czoxMDAwMHJlbX0ubV9iMDc3YzJiY3stLWNpLWV5ZS1kcm9wcGVyLWljb24tc2l6ZS14czogY2FsYyguODc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY2ktZXllLWRyb3BwZXItaWNvbi1zaXplLXNtOiBjYWxjKDFyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jaS1leWUtZHJvcHBlci1pY29uLXNpemUtbWQ6IGNhbGMoMS4xMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jaS1leWUtZHJvcHBlci1pY29uLXNpemUtbGc6IGNhbGMoMS4yNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWNpLWV5ZS1kcm9wcGVyLWljb24tc2l6ZS14bDogY2FsYygxLjM3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWNpLWV5ZS1kcm9wcGVyLWljb24tc2l6ZTogdmFyKC0tY2ktZXllLWRyb3BwZXItaWNvbi1zaXplLXNtKX0ubV82NmEwMjhiNXstLWNpLWJ1dHRvbi1zaXplLXhzOiBjYWxjKDEuMzc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY2ktYnV0dG9uLXNpemUtc206IGNhbGMoMS42MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jaS1idXR0b24tc2l6ZS1tZDogY2FsYygxLjc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY2ktYnV0dG9uLXNpemUtbGc6IGNhbGMoMnJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWNpLWJ1dHRvbi1zaXplLXhsOiBjYWxjKDIuNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWNpLWJ1dHRvbi1zaXplOiB2YXIoLS1jaS1idXR0b24tc2l6ZS1zbSk7d2lkdGg6dmFyKC0tY2ktYnV0dG9uLXNpemUpO2hlaWdodDp2YXIoLS1jaS1idXR0b24tc2l6ZSk7bWluLXdpZHRoOnZhcigtLWNpLWJ1dHRvbi1zaXplKTttaW4taGVpZ2h0OnZhcigtLWNpLWJ1dHRvbi1zaXplKX0ubV9jNWNjZGNhYnstLWNpLXByZXZpZXctc2l6ZS14czogY2FsYygxcmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY2ktcHJldmlldy1zaXplLXNtOiBjYWxjKDEuMTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY2ktcHJldmlldy1zaXplLW1kOiBjYWxjKDEuMzc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY2ktcHJldmlldy1zaXplLWxnOiBjYWxjKDEuNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jaS1wcmV2aWV3LXNpemUteGw6IGNhbGMoMi4yNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWNpLXByZXZpZXctc2l6ZTogdmFyKC0tY2ktcHJldmlldy1zaXplLXNtKX0ubV81ZWNlMmNkN3twYWRkaW5nOmNhbGMoLjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSl9Lm1fNzQ4NWNhY2V7LS1jb250YWluZXItc2l6ZS14czogY2FsYygzMy43NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWNvbnRhaW5lci1zaXplLXNtOiBjYWxjKDQ1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tY29udGFpbmVyLXNpemUtbWQ6IGNhbGMoNjByZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jb250YWluZXItc2l6ZS1sZzogY2FsYyg3MS4yNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWNvbnRhaW5lci1zaXplLXhsOiBjYWxjKDgyLjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1jb250YWluZXItc2l6ZTogdmFyKC0tY29udGFpbmVyLXNpemUtbWQpfS5tXzc0ODVjYWNlOndoZXJlKFtkYXRhLXN0cmF0ZWd5PWJsb2NrXSl7bWF4LXdpZHRoOnZhcigtLWNvbnRhaW5lci1zaXplKTtwYWRkaW5nLWlubGluZTp2YXIoLS1tYW50aW5lLXNwYWNpbmctbWQpO21hcmdpbi1pbmxpbmU6YXV0b30ubV83NDg1Y2FjZTp3aGVyZShbZGF0YS1zdHJhdGVneT1ibG9ja10pOndoZXJlKFtkYXRhLWZsdWlkXSl7bWF4LXdpZHRoOjEwMCV9Lm1fNzQ4NWNhY2U6d2hlcmUoW2RhdGEtc3RyYXRlZ3k9Z3JpZF0pe2Rpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIG1pbigxMDAlLHZhcigtLWNvbnRhaW5lci1zaXplKSkgMWZyO21hcmdpbi1pbmxpbmU6YXV0b30ubV83NDg1Y2FjZTp3aGVyZShbZGF0YS1zdHJhdGVneT1ncmlkXSk+KntncmlkLWNvbHVtbjoyfS5tXzc0ODVjYWNlOndoZXJlKFtkYXRhLXN0cmF0ZWd5PWdyaWRdKT5bZGF0YS1icmVha291dF17Z3JpZC1jb2x1bW46MSAvIC0xfS5tXzc0ODVjYWNlOndoZXJlKFtkYXRhLXN0cmF0ZWd5PWdyaWRdKT5bZGF0YS1icmVha291dF0+W2RhdGEtY29udGFpbmVyXXttYXgtd2lkdGg6dmFyKC0tY29udGFpbmVyLXNpemUpO21hcmdpbi1pbmxpbmU6YXV0b30ubV9lMjEyNWEyN3stLWRpYWxvZy1zaXplLXhzOiBjYWxjKDEwcmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tZGlhbG9nLXNpemUtc206IGNhbGMoMTIuNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWRpYWxvZy1zaXplLW1kOiBjYWxjKDIxLjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tZGlhbG9nLXNpemUtbGc6IGNhbGMoMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1kaWFsb2ctc2l6ZS14bDogY2FsYygzMS4yNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWRpYWxvZy1zaXplOiB2YXIoLS1kaWFsb2ctc2l6ZS1tZCk7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6dmFyKC0tZGlhbG9nLXNpemUpO21heC13aWR0aDpjYWxjKDEwMHZ3IC0gdmFyKC0tbWFudGluZS1zcGFjaW5nLXhsKSAqIDIpO21pbi1oZWlnaHQ6Y2FsYygzLjEyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKX0ubV81YWJhYjY2NXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6Y2FsYyh2YXIoLS1tYW50aW5lLXNwYWNpbmctbWQpIC8gMik7aW5zZXQtaW5saW5lLWVuZDpjYWxjKHZhcigtLW1hbnRpbmUtc3BhY2luZy1tZCkgLyAyKX0ubV8zZWViZWIzNnstLWRpdmlkZXItc2l6ZS14czogY2FsYyguMDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWRpdmlkZXItc2l6ZS1zbTogY2FsYyguMTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tZGl2aWRlci1zaXplLW1kOiBjYWxjKC4xODc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tZGl2aWRlci1zaXplLWxnOiBjYWxjKC4yNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWRpdmlkZXItc2l6ZS14bDogY2FsYyguMzEyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWRpdmlkZXItc2l6ZTogdmFyKC0tZGl2aWRlci1zaXplLXhzKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV8zZWViZWIzNnstLWRpdmlkZXItY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS0zKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tXzNlZWJlYjM2ey0tZGl2aWRlci1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTQpfS5tXzNlZWJlYjM2OndoZXJlKFtkYXRhLW9yaWVudGF0aW9uPWhvcml6b250YWxdKXtib3JkZXItdG9wOnZhcigtLWRpdmlkZXItc2l6ZSkgdmFyKC0tZGl2aWRlci1ib3JkZXItc3R5bGUsIHNvbGlkKSB2YXIoLS1kaXZpZGVyLWNvbG9yKX0ubV8zZWViZWIzNjp3aGVyZShbZGF0YS1vcmllbnRhdGlvbj12ZXJ0aWNhbF0pe2JvcmRlci1pbmxpbmUtc3RhcnQ6dmFyKC0tZGl2aWRlci1zaXplKSB2YXIoLS1kaXZpZGVyLWJvcmRlci1zdHlsZSwgc29saWQpIHZhcigtLWRpdmlkZXItY29sb3IpO2hlaWdodDphdXRvO2FsaWduLXNlbGY6c3RyZXRjaH0ubV8zZWViZWIzNjp3aGVyZShbZGF0YS13aXRoLWxhYmVsXSl7Ym9yZGVyOjB9Lm1fOWUzNjVmMjB7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtmb250LXNpemU6dmFyKC0tbWFudGluZS1mb250LXNpemUteHMpO2NvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGltbWVkKTt3aGl0ZS1zcGFjZTpub3dyYXB9Lm1fOWUzNjVmMjA6d2hlcmUoW2RhdGEtcG9zaXRpb249bGVmdF0pOmJlZm9yZXtkaXNwbGF5Om5vbmV9Lm1fOWUzNjVmMjA6d2hlcmUoW2RhdGEtcG9zaXRpb249cmlnaHRdKTphZnRlcntkaXNwbGF5Om5vbmV9Lm1fOWUzNjVmMjA6YmVmb3Jle2NvbnRlbnQ6IiI7ZmxleDoxO2hlaWdodDpjYWxjKC4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpO2JvcmRlci10b3A6dmFyKC0tZGl2aWRlci1zaXplKSB2YXIoLS1kaXZpZGVyLWJvcmRlci1zdHlsZSwgc29saWQpIHZhcigtLWRpdmlkZXItY29sb3IpO21hcmdpbi1pbmxpbmUtZW5kOnZhcigtLW1hbnRpbmUtc3BhY2luZy14cyl9Lm1fOWUzNjVmMjA6YWZ0ZXJ7Y29udGVudDoiIjtmbGV4OjE7aGVpZ2h0OmNhbGMoLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7Ym9yZGVyLXRvcDp2YXIoLS1kaXZpZGVyLXNpemUpIHZhcigtLWRpdmlkZXItYm9yZGVyLXN0eWxlLCBzb2xpZCkgdmFyKC0tZGl2aWRlci1jb2xvcik7bWFyZ2luLWlubGluZS1zdGFydDp2YXIoLS1tYW50aW5lLXNwYWNpbmcteHMpfS5tX2YxMWI0MDFley0tZHJhd2VyLXNpemUteHM6IGNhbGMoMjByZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1kcmF3ZXItc2l6ZS1zbTogY2FsYygyMy43NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWRyYXdlci1zaXplLW1kOiBjYWxjKDI3LjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1kcmF3ZXItc2l6ZS1sZzogY2FsYygzOC43NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWRyYXdlci1zaXplLXhsOiBjYWxjKDQ4Ljc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tZHJhd2VyLXNpemU6IHZhcigtLWRyYXdlci1zaXplLW1kKTstLWRyYXdlci1vZmZzZXQ6IDByZW19Lm1fNWE3YzJjOXt6LWluZGV4OjEwMDB9Lm1fYjhhMDViYmR7ZmxleDp2YXIoLS1kcmF3ZXItZmxleCwgMCAwIHZhcigtLWRyYXdlci1zaXplKSk7aGVpZ2h0OnZhcigtLWRyYXdlci1oZWlnaHQsIGNhbGMoMTAwJSAtIHZhcigtLWRyYXdlci1vZmZzZXQpICogMikpO21hcmdpbjp2YXIoLS1kcmF3ZXItb2Zmc2V0KTttYXgtd2lkdGg6Y2FsYygxMDAlIC0gdmFyKC0tZHJhd2VyLW9mZnNldCkgKiAyKTttYXgtaGVpZ2h0OmNhbGMoMTAwJSAtIHZhcigtLWRyYXdlci1vZmZzZXQpICogMik7b3ZlcmZsb3cteTphdXRvfS5tX2I4YTA1YmJkW2RhdGEtaGlkZGVuXXtvcGFjaXR5OjAhaW1wb3J0YW50O3BvaW50ZXItZXZlbnRzOm5vbmV9Lm1fMzFjZDc2OWF7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDp2YXIoLS1kcmF3ZXItanVzdGlmeSwgZmxleC1zdGFydCk7YWxpZ24taXRlbXM6dmFyKC0tZHJhd2VyLWFsaWduLCBmbGV4LXN0YXJ0KX0ubV9lOTQwOGE0N3twYWRkaW5nOnZhcigtLW1hbnRpbmUtc3BhY2luZy1sZyk7cGFkZGluZy10b3A6dmFyKC0tbWFudGluZS1zcGFjaW5nLXhzKTtib3JkZXItcmFkaXVzOnZhcigtLWZpZWxkc2V0LXJhZGl1cywgdmFyKC0tbWFudGluZS1yYWRpdXMtZGVmYXVsdCkpO21pbi1pbmxpbmUtc2l6ZTphdXRvfS5tXzg0Yzk1MjNhe2JvcmRlcjpjYWxjKC4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpIHNvbGlkfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1saWdodF0pIC5tXzg0Yzk1MjNhe2JvcmRlci1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMyk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLXdoaXRlKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tXzg0Yzk1MjNhe2JvcmRlci1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNCk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNyl9Lm1fZWYyNzRlNDl7Ym9yZGVyOmNhbGMoLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkgc29saWR9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fZWYyNzRlNDl7Ym9yZGVyLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS0zKTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS0wKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tX2VmMjc0ZTQ5e2JvcmRlci1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNCk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNil9Lm1fZWRhOTkzZDN7cGFkZGluZzowO2JvcmRlcjowO2JvcmRlci1yYWRpdXM6MH0ubV85MDc5NDgzMntmb250LXNpemU6dmFyKC0tbWFudGluZS1mb250LXNpemUtc20pfS5tXzc0Y2EyN2Zle3BhZGRpbmc6MDttYXJnaW4tYm90dG9tOnZhcigtLW1hbnRpbmUtc3BhY2luZy1zbSl9Lm1fZGYwMjA0OTl7cG9zaXRpb246Zml4ZWQ7ei1pbmRleDp2YXIoLS1mbG9hdGluZy13aW5kb3ctei1pbmRleCl9Lm1fODQ3OGE2ZGF7Y29udGFpbmVyOm1hbnRpbmUtZ3JpZCAvIGlubGluZS1zaXplfS5tXzQxMDM1MmU5ey0tZ3JpZC1vdmVyZmxvdzogdmlzaWJsZTstLWdyaWQtY29sdW1uLWdhcDogdmFyKC0tZ3JpZC1nYXApOy0tZ3JpZC1yb3ctZ2FwOiB2YXIoLS1ncmlkLWdhcCk7b3ZlcmZsb3c6dmFyKC0tZ3JpZC1vdmVyZmxvdyl9Lm1fZGVlN2JkMmZ7ZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwO2p1c3RpZnktY29udGVudDp2YXIoLS1ncmlkLWp1c3RpZnkpO2FsaWduLWl0ZW1zOnZhcigtLWdyaWQtYWxpZ24pO2dhcDp2YXIoLS1ncmlkLXJvdy1nYXApIHZhcigtLWdyaWQtY29sdW1uLWdhcCl9Lm1fOTZiZGQyOTl7LS1jb2wtZmxleC1ncm93OiAwOy0tY29sLW9mZnNldDogMHJlbTtmbGV4LXNocmluazowO29yZGVyOnZhcigtLWNvbC1vcmRlcik7ZmxleC1iYXNpczp2YXIoLS1jb2wtZmxleC1iYXNpcyk7d2lkdGg6dmFyKC0tY29sLXdpZHRoKTttYXgtd2lkdGg6dmFyKC0tY29sLW1heC13aWR0aCk7ZmxleC1ncm93OnZhcigtLWNvbC1mbGV4LWdyb3cpO21hcmdpbi1pbmxpbmUtc3RhcnQ6dmFyKC0tY29sLW9mZnNldCk7YWxpZ24tc2VsZjp2YXIoLS1jb2wtYWxpZ24tc2VsZil9Lm1fYmNiM2YzYzJ7Y29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1ibGFjayl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fYmNiM2YzYzJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYXJrLWJnLWxpZ2h0KX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tX2JjYjNmM2Mye2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFyay1iZy1kYXJrKX0ubV85ZTExNzYzNHtkaXNwbGF5OmJsb2NrO29iamVjdC1maXQ6dmFyKC0taW1hZ2Utb2JqZWN0LWZpdCwgY292ZXIpO3dpZHRoOjEwMCU7Ym9yZGVyLXJhZGl1czp2YXIoLS1pbWFnZS1yYWRpdXMsIDApfUBrZXlmcmFtZXMgbV84ODU5MDFiMXswJXtvcGFjaXR5Oi42O3RyYW5zZm9ybTpzY2FsZSgwKX10b3tvcGFjaXR5OjA7dHJhbnNmb3JtOnNjYWxlKDIuOCl9fS5tX2U1MjYyMjAwey0taW5kaWNhdG9yLXNpemU6IGNhbGMoLjYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWluZGljYXRvci1jb2xvcjogdmFyKC0tbWFudGluZS1wcmltYXJ5LWNvbG9yLWZpbGxlZCk7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9ja30ubV9lNTI2MjIwMDp3aGVyZShbZGF0YS1pbmxpbmVdKXtkaXNwbGF5OmlubGluZS1ibG9ja30ubV83NjBkMWZiMXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6dmFyKC0taW5kaWNhdG9yLXRvcCk7bGVmdDp2YXIoLS1pbmRpY2F0b3ItbGVmdCk7cmlnaHQ6dmFyKC0taW5kaWNhdG9yLXJpZ2h0KTtib3R0b206dmFyKC0taW5kaWNhdG9yLWJvdHRvbSk7dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS1pbmRpY2F0b3ItdHJhbnNsYXRlLXgpLHZhcigtLWluZGljYXRvci10cmFuc2xhdGUteSkpO21pbi13aWR0aDp2YXIoLS1pbmRpY2F0b3Itc2l6ZSk7aGVpZ2h0OnZhcigtLWluZGljYXRvci1zaXplKTtib3JkZXItcmFkaXVzOnZhcigtLWluZGljYXRvci1yYWRpdXMsIDEwMDByZW0pO3otaW5kZXg6dmFyKC0taW5kaWNhdG9yLXotaW5kZXgsIDIwMCk7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2ZvbnQtc2l6ZTp2YXIoLS1tYW50aW5lLWZvbnQtc2l6ZS14cyk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1pbmRpY2F0b3ItY29sb3IpO2NvbG9yOnZhcigtLWluZGljYXRvci10ZXh0LWNvbG9yLCB2YXIoLS1tYW50aW5lLWNvbG9yLXdoaXRlKSk7d2hpdGUtc3BhY2U6bm93cmFwfS5tXzc2MGQxZmIxOmJlZm9yZXtjb250ZW50OiIiO3Bvc2l0aW9uOmFic29sdXRlO2luc2V0OjA7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1pbmRpY2F0b3ItY29sb3IpO2JvcmRlci1yYWRpdXM6dmFyKC0taW5kaWNhdG9yLXJhZGl1cywgMTAwMHJlbSk7ei1pbmRleDotMX0ubV83NjBkMWZiMTp3aGVyZShbZGF0YS13aXRoLWxhYmVsXSl7cGFkZGluZy1pbmxpbmU6Y2FsYyh2YXIoLS1tYW50aW5lLXNwYWNpbmcteHMpIC8gMil9Lm1fNzYwZDFmYjE6d2hlcmUoW2RhdGEtd2l0aC1ib3JkZXJdKXtib3JkZXI6MnB4IHNvbGlkIHZhcigtLW1hbnRpbmUtY29sb3ItYm9keSl9Lm1fNzYwZDFmYjFbZGF0YS1wcm9jZXNzaW5nXTpiZWZvcmV7YW5pbWF0aW9uOm1fODg1OTAxYjEgMXMgbGluZWFyIGluZmluaXRlfS5tX2RjNmYxNGUyey0ta2JkLWZ6LXhzOiBjYWxjKC42MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1rYmQtZnotc206IGNhbGMoLjc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0ta2JkLWZ6LW1kOiBjYWxjKC44NzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1rYmQtZnotbGc6IGNhbGMoMXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLWtiZC1mei14bDogY2FsYygxLjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0ta2JkLWZ6OiB2YXIoLS1rYmQtZnotc20pO2ZvbnQtZmFtaWx5OnZhcigtLW1hbnRpbmUtZm9udC1mYW1pbHktbW9ub3NwYWNlKTtsaW5lLWhlaWdodDp2YXIoLS1tYW50aW5lLWxpbmUtaGVpZ2h0KTtmb250LXdlaWdodDp2YXIoLS1tYW50aW5lLWZvbnQtd2VpZ2h0LWJvbGQpO2ZvbnQtc2l6ZTp2YXIoLS1rYmQtZnopO2JvcmRlci1yYWRpdXM6dmFyKC0tbWFudGluZS1yYWRpdXMtc20pO2JvcmRlcjpjYWxjKC4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpIHNvbGlkO2JvcmRlci1ib3R0b20td2lkdGg6Y2FsYyguMTg3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTt1bmljb2RlLWJpZGk6ZW1iZWQ7dGV4dC1hbGlnbjpjZW50ZXI7cGFkZGluZzouMTJlbSAuNDVlbX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV9kYzZmMTRlMntib3JkZXItY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTMpO2NvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS03KTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS0wKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tX2RjNmYxNGUye2JvcmRlci1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNCk7Y29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTApO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTYpfS5tX2FiYmFjNDkxey0tbGlzdC1mejogdmFyKC0tbWFudGluZS1mb250LXNpemUtbWQpOy0tbGlzdC1saDogdmFyKC0tbWFudGluZS1saW5lLWhlaWdodC1tZCk7LS1saXN0LW1hcmtlci1nYXA6IHZhcigtLW1hbnRpbmUtc3BhY2luZy1sZyk7bGlzdC1zdHlsZS1wb3NpdGlvbjpvdXRzaWRlO2ZvbnQtc2l6ZTp2YXIoLS1saXN0LWZ6KTtsaW5lLWhlaWdodDp2YXIoLS1saXN0LWxoKTttYXJnaW46MDtwYWRkaW5nOjA7cGFkZGluZy1pbmxpbmUtc3RhcnQ6dmFyKC0tbGlzdC1tYXJrZXItZ2FwKX0ubV9hYmJhYzQ5MVtkYXRhLXR5cGU9bm9uZV17LS1saXN0LW1hcmtlci1nYXA6IDB9Lm1fYWJiYWM0OTE6d2hlcmUoW2RhdGEtd2l0aC1wYWRkaW5nXSl7cGFkZGluZy1pbmxpbmUtc3RhcnQ6Y2FsYyh2YXIoLS1saXN0LW1hcmtlci1nYXApICsgdmFyKC0tbWFudGluZS1zcGFjaW5nLW1kKSl9Lm1fYWJiNmJlYzJ7d2hpdGUtc3BhY2U6bm9ybWFsO2xpbmUtaGVpZ2h0OnZhcigtLWxpc3QtbGgpfS5tX2FiYjZiZWMyOndoZXJlKFtkYXRhLXdpdGgtaWNvbl0pe2xpc3Qtc3R5bGU6bm9uZX0ubV9hYmI2YmVjMjp3aGVyZShbZGF0YS13aXRoLWljb25dKSAubV83NWNkOWY3MXstLWxpLWRpcmVjdGlvbjogcm93Oy0tbGktYWxpZ246IGNlbnRlcn0ubV9hYmI2YmVjMjp3aGVyZSg6bm90KDpmaXJzdC1vZi10eXBlKSl7bWFyZ2luLXRvcDp2YXIoLS1saXN0LXNwYWNpbmcsIDApfS5tX2FiYjZiZWMyOndoZXJlKFtkYXRhLWNlbnRlcmVkXSl7bGluZS1oZWlnaHQ6MX0ubV83NWNkOWY3MXtkaXNwbGF5OmlubGluZS1mbGV4O2ZsZXgtZGlyZWN0aW9uOnZhcigtLWxpLWRpcmVjdGlvbiwgY29sdW1uKTthbGlnbi1pdGVtczp2YXIoLS1saS1hbGlnbiwgZmxleC1zdGFydCk7d2hpdGUtc3BhY2U6bm9ybWFsfS5tXzYwZjgzZTVie2Rpc3BsYXk6aW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTttYXJnaW4taW5saW5lLWVuZDp2YXIoLS1tYW50aW5lLXNwYWNpbmctc20pfS5tXzZlNDU5Mzdie3Bvc2l0aW9uOmFic29sdXRlO2luc2V0OjA7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO292ZXJmbG93OmhpZGRlbjt6LWluZGV4OnZhcigtLWxvLXotaW5kZXgpfS5tX2U4ZWIwMDZje3Bvc2l0aW9uOnJlbGF0aXZlO3otaW5kZXg6Y2FsYyh2YXIoLS1sby16LWluZGV4KSArIDEpfS5tX2RmNTg3ZjE3e3otaW5kZXg6dmFyKC0tbG8tei1pbmRleCl9QGtleWZyYW1lcyBtXzU1ZGM2MjVhezAle3RyYW5zZm9ybTp0cmFuc2xhdGUoMCl9dG97dHJhbnNmb3JtOnRyYW5zbGF0ZShjYWxjKC0xMDAlIC8gdmFyKC0tbWFycXVlZS1yZXBlYXQsIDQpIC0gdmFyKC0tbWFycXVlZS1nYXAsIHZhcigtLW1hbnRpbmUtc3BhY2luZy1tZCkpIC8gdmFyKC0tbWFycXVlZS1yZXBlYXQsIDQpKSl9fUBrZXlmcmFtZXMgbV9jZGVmNTMyY3swJXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgwKX10b3t0cmFuc2Zvcm06dHJhbnNsYXRlWShjYWxjKC0xMDAlIC8gdmFyKC0tbWFycXVlZS1yZXBlYXQsIDQpIC0gdmFyKC0tbWFycXVlZS1nYXAsIHZhcigtLW1hbnRpbmUtc3BhY2luZy1tZCkpIC8gdmFyKC0tbWFycXVlZS1yZXBlYXQsIDQpKSl9fS5tXzdkYzdkM2Nkey0tX2ZhZGUtY29sb3I6IHZhcigtLW1hcnF1ZWUtZmFkZS1jb2xvciwgdmFyKC0tbWFudGluZS1jb2xvci1ib2R5KSk7LS1fZmFkZS1zaXplOiB2YXIoLS1tYXJxdWVlLWZhZGUtc2l6ZSwgNSUpO3Bvc2l0aW9uOnJlbGF0aXZlO292ZXJmbG93OmhpZGRlbjtkaXNwbGF5OmZsZXg7bWF4LWhlaWdodDoxMDAlO21heC13aWR0aDoxMDAlfS5tXzdkYzdkM2NkOndoZXJlKFtkYXRhLW9yaWVudGF0aW9uPWhvcml6b250YWxdKXtmbGV4LWRpcmVjdGlvbjpyb3d9Lm1fN2RjN2QzY2Q6d2hlcmUoW2RhdGEtb3JpZW50YXRpb249dmVydGljYWxdKXtmbGV4LWRpcmVjdGlvbjpjb2x1bW59Lm1fN2RjN2QzY2RbZGF0YS1mYWRlLWVkZ2VzXTpiZWZvcmUsLm1fN2RjN2QzY2RbZGF0YS1mYWRlLWVkZ2VzXTphZnRlcntjb250ZW50OiIiO3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTtwb2ludGVyLWV2ZW50czpub25lfS5tXzdkYzdkM2NkW2RhdGEtb3JpZW50YXRpb249aG9yaXpvbnRhbF1bZGF0YS1mYWRlLWVkZ2VzXTpiZWZvcmUsLm1fN2RjN2QzY2RbZGF0YS1vcmllbnRhdGlvbj1ob3Jpem9udGFsXVtkYXRhLWZhZGUtZWRnZXNdOmFmdGVye3RvcDowO2JvdHRvbTowO3dpZHRoOnZhcigtLV9mYWRlLXNpemUpfS5tXzdkYzdkM2NkW2RhdGEtb3JpZW50YXRpb249aG9yaXpvbnRhbF1bZGF0YS1mYWRlLWVkZ2VzXTpiZWZvcmV7bGVmdDowO2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LHZhcigtLV9mYWRlLWNvbG9yKSx0cmFuc3BhcmVudCl9Lm1fN2RjN2QzY2RbZGF0YS1vcmllbnRhdGlvbj1ob3Jpem9udGFsXVtkYXRhLWZhZGUtZWRnZXNdOmFmdGVye3JpZ2h0OjA7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQodG8gbGVmdCx2YXIoLS1fZmFkZS1jb2xvciksdHJhbnNwYXJlbnQpfS5tXzdkYzdkM2NkW2RhdGEtb3JpZW50YXRpb249dmVydGljYWxdW2RhdGEtZmFkZS1lZGdlc106YmVmb3JlLC5tXzdkYzdkM2NkW2RhdGEtb3JpZW50YXRpb249dmVydGljYWxdW2RhdGEtZmFkZS1lZGdlc106YWZ0ZXJ7bGVmdDowO3JpZ2h0OjA7aGVpZ2h0OnZhcigtLV9mYWRlLXNpemUpfS5tXzdkYzdkM2NkW2RhdGEtb3JpZW50YXRpb249dmVydGljYWxdW2RhdGEtZmFkZS1lZGdlc106YmVmb3Jle3RvcDowO2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSx2YXIoLS1fZmFkZS1jb2xvciksdHJhbnNwYXJlbnQpfS5tXzdkYzdkM2NkW2RhdGEtb3JpZW50YXRpb249dmVydGljYWxdW2RhdGEtZmFkZS1lZGdlc106YWZ0ZXJ7Ym90dG9tOjA7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQodG8gdG9wLHZhcigtLV9mYWRlLWNvbG9yKSx0cmFuc3BhcmVudCl9Lm1fMWY5Njc1YWV7ZGlzcGxheTpmbGV4O2dhcDp2YXIoLS1tYXJxdWVlLWdhcCwgdmFyKC0tbWFudGluZS1zcGFjaW5nLW1kKSk7YW5pbWF0aW9uLWR1cmF0aW9uOnZhcigtLW1hcnF1ZWUtZHVyYXRpb24sIDQwcyk7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpsaW5lYXI7YW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDppbmZpbml0ZX0ubV83ZGM3ZDNjZFtkYXRhLW9yaWVudGF0aW9uPWhvcml6b250YWxdPi5tXzFmOTY3NWFle2ZsZXgtZGlyZWN0aW9uOnJvdzthbmltYXRpb24tbmFtZTptXzU1ZGM2MjVhfS5tXzdkYzdkM2NkW2RhdGEtb3JpZW50YXRpb249dmVydGljYWxdPi5tXzFmOTY3NWFle2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjthbmltYXRpb24tbmFtZTptX2NkZWY1MzJjfS5tXzdkYzdkM2NkW2RhdGEtcmV2ZXJzZV0+Lm1fMWY5Njc1YWV7YW5pbWF0aW9uLWRpcmVjdGlvbjpyZXZlcnNlfS5tXzdkYzdkM2NkW2RhdGEtcGF1c2Utb24taG92ZXJdOmhvdmVyPi5tXzFmOTY3NWFle2FuaW1hdGlvbi1wbGF5LXN0YXRlOnBhdXNlZH0ubV8zYTk5MDBmNHtkaXNwbGF5OmZsZXg7ZmxleC1zaHJpbms6MDtnYXA6dmFyKC0tbWFycXVlZS1nYXAsIHZhcigtLW1hbnRpbmUtc3BhY2luZy1tZCkpfS5tXzdkYzdkM2NkW2RhdGEtb3JpZW50YXRpb249aG9yaXpvbnRhbF0gLm1fM2E5OTAwZjR7ZmxleC1kaXJlY3Rpb246cm93fS5tXzdkYzdkM2NkW2RhdGEtb3JpZW50YXRpb249dmVydGljYWxdIC5tXzNhOTkwMGY0e2ZsZXgtZGlyZWN0aW9uOmNvbHVtbn0ubV9kYzliN2M5ZntwYWRkaW5nOmNhbGMoLjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpfS5tXzliZmFjMTI2e2NvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGltbWVkKTtmb250LXdlaWdodDp2YXIoLS1tYW50aW5lLWZvbnQtd2VpZ2h0LW1lZGl1bSk7Zm9udC1zaXplOnZhcigtLW1hbnRpbmUtZm9udC1zaXplLXhzKTtwYWRkaW5nOmNhbGModmFyKC0tbWFudGluZS1zcGFjaW5nLXhzKSAvIDIpIHZhcigtLW1hbnRpbmUtc3BhY2luZy1zbSk7Y3Vyc29yOmRlZmF1bHR9Lm1fZWZkZjkwY2J7bWFyZ2luLXRvcDpjYWxjKC4yNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTttYXJnaW4tYm90dG9tOmNhbGMoLjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpO2JvcmRlci10b3A6Y2FsYyguMDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSBzb2xpZH06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV9lZmRmOTBjYntib3JkZXItY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTIpfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1kYXJrXSkgLm1fZWZkZjkwY2J7Ym9yZGVyLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGFyay00KX0ubV85OWFjMmFhMXtmb250LXNpemU6dmFyKC0tbWFudGluZS1mb250LXNpemUtc20pO3dpZHRoOjEwMCU7cGFkZGluZzpjYWxjKHZhcigtLW1hbnRpbmUtc3BhY2luZy14cykgLyAxLjUpIHZhcigtLW1hbnRpbmUtc3BhY2luZy1zbSk7Ym9yZGVyLXJhZGl1czp2YXIoLS1wb3BvdmVyLXJhZGl1cywgdmFyKC0tbWFudGluZS1yYWRpdXMtZGVmYXVsdCkpO2NvbG9yOnZhcigtLW1lbnUtaXRlbS1jb2xvciwgdmFyKC0tbWFudGluZS1jb2xvci10ZXh0KSk7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjt1c2VyLXNlbGVjdDpub25lfS5tXzk5YWMyYWExOndoZXJlKFtkYXRhLWRpc2FibGVkXSw6ZGlzYWJsZWQpe2NvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGlzYWJsZWQtY29sb3IpO29wYWNpdHk6LjY7Y3Vyc29yOm5vdC1hbGxvd2VkfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1saWdodF0pIC5tXzk5YWMyYWExOndoZXJlKDpob3Zlciw6Zm9jdXMpOndoZXJlKDpub3QoOmRpc2FibGVkLFtkYXRhLWRpc2FibGVkXSkpe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWVudS1pdGVtLWhvdmVyLCB2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMSkpfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1kYXJrXSkgLm1fOTlhYzJhYTE6d2hlcmUoOmhvdmVyLDpmb2N1cyk6d2hlcmUoOm5vdCg6ZGlzYWJsZWQsW2RhdGEtZGlzYWJsZWRdKSl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tZW51LWl0ZW0taG92ZXIsIHZhcigtLW1hbnRpbmUtY29sb3ItZGFyay00KSl9Lm1fOTlhYzJhYTE6d2hlcmUoW2RhdGEtc3ViLW1lbnUtaXRlbV0pe3BhZGRpbmctaW5saW5lLWVuZDpjYWxjKC4zMTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpfS5tXzU0NzZlMGQze2ZsZXg6MX0ubV84Yjc1ZTUwNHtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXJ9Lm1fOGI3NWU1MDQ6d2hlcmUoW2RhdGEtcG9zaXRpb249bGVmdF0pe21hcmdpbi1pbmxpbmUtZW5kOnZhcigtLW1hbnRpbmUtc3BhY2luZy14cyl9Lm1fOGI3NWU1MDQ6d2hlcmUoW2RhdGEtcG9zaXRpb249cmlnaHRdKXttYXJnaW4taW5saW5lLXN0YXJ0OnZhcigtLW1hbnRpbmUtc3BhY2luZy14cyl9Lm1fYjg1YjBiZWR7dHJhbnNmb3JtOnJvdGF0ZSgtOTBkZWcpfTp3aGVyZShbZGlyPXJ0bF0pIC5tX2I4NWIwYmVke3RyYW5zZm9ybTpyb3RhdGUoOTBkZWcpfS5tXzlkZjAyODIyey0tbW9kYWwtc2l6ZS14czogY2FsYygyMHJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLW1vZGFsLXNpemUtc206IGNhbGMoMjMuNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1tb2RhbC1zaXplLW1kOiBjYWxjKDI3LjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1tb2RhbC1zaXplLWxnOiBjYWxjKDM4Ljc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tbW9kYWwtc2l6ZS14bDogY2FsYyg0OC43NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLW1vZGFsLXNpemU6IHZhcigtLW1vZGFsLXNpemUtbWQpOy0tbW9kYWwteS1vZmZzZXQ6IDVkdmg7LS1tb2RhbC14LW9mZnNldDogNXZ3fS5tXzlkZjAyODIyW2RhdGEtZnVsbC1zY3JlZW5dey0tbW9kYWwtYm9yZGVyLXJhZGl1czogMCAhaW1wb3J0YW50fS5tXzlkZjAyODIyW2RhdGEtZnVsbC1zY3JlZW5dIC5tXzU0YzQ0NTM5ey0tbW9kYWwtY29udGVudC1mbGV4OiAwIDAgMTAwJTstLW1vZGFsLWNvbnRlbnQtbWF4LWhlaWdodDogYXV0bzstLW1vZGFsLWNvbnRlbnQtaGVpZ2h0OiAxMDBkdmh9Lm1fOWRmMDI4MjJbZGF0YS1mdWxsLXNjcmVlbl0gLm1fMWY5NThmMTZ7LS1tb2RhbC1pbm5lci15LW9mZnNldDogMDstLW1vZGFsLWlubmVyLXgtb2Zmc2V0OiAwfS5tXzlkZjAyODIyW2RhdGEtY2VudGVyZWRdIC5tXzFmOTU4ZjE2ey0tbW9kYWwtaW5uZXItYWxpZ246IGNlbnRlcn0ubV9kMGUyYjljZHtib3JkZXItc3RhcnQtc3RhcnQtcmFkaXVzOnZhcigtLW1vZGFsLXJhZGl1cywgdmFyKC0tbWFudGluZS1yYWRpdXMtZGVmYXVsdCkpO2JvcmRlci1zdGFydC1lbmQtcmFkaXVzOnZhcigtLW1vZGFsLXJhZGl1cywgdmFyKC0tbWFudGluZS1yYWRpdXMtZGVmYXVsdCkpfS5tXzU0YzQ0NTM5e2ZsZXg6dmFyKC0tbW9kYWwtY29udGVudC1mbGV4LCAwIDAgdmFyKC0tbW9kYWwtc2l6ZSkpO21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6dmFyKC0tbW9kYWwtY29udGVudC1tYXgtaGVpZ2h0LCBjYWxjKDEwMGR2aCAtIHZhcigtLW1vZGFsLXktb2Zmc2V0KSAqIDIpKTtoZWlnaHQ6dmFyKC0tbW9kYWwtY29udGVudC1oZWlnaHQsIGF1dG8pO292ZXJmbG93LXk6YXV0b30ubV81NGM0NDUzOVtkYXRhLWZ1bGwtc2NyZWVuXXtib3JkZXItcmFkaXVzOjB9Lm1fNTRjNDQ1MzlbZGF0YS1oaWRkZW5de29wYWNpdHk6MCFpbXBvcnRhbnQ7cG9pbnRlci1ldmVudHM6bm9uZX0ubV8xZjk1OGYxNntkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczp2YXIoLS1tb2RhbC1pbm5lci1hbGlnbiwgZmxleC1zdGFydCk7cGFkZGluZy10b3A6dmFyKC0tbW9kYWwtaW5uZXIteS1vZmZzZXQsIHZhcigtLW1vZGFsLXktb2Zmc2V0KSk7cGFkZGluZy1ib3R0b206dmFyKC0tbW9kYWwtaW5uZXIteS1vZmZzZXQsIHZhcigtLW1vZGFsLXktb2Zmc2V0KSk7cGFkZGluZy1pbmxpbmU6dmFyKC0tbW9kYWwtaW5uZXIteC1vZmZzZXQsIHZhcigtLW1vZGFsLXgtb2Zmc2V0KSl9Lm1fN2NkYTFjZDZ7LS1waWxsLWZ6LXhzOiBjYWxjKC42MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1waWxsLWZ6LXNtOiBjYWxjKC43NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXBpbGwtZnotbWQ6IGNhbGMoLjg3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXBpbGwtZnotbGc6IGNhbGMoMXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXBpbGwtZnoteGw6IGNhbGMoMS4xMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1waWxsLWhlaWdodC14czogY2FsYygxLjEyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXBpbGwtaGVpZ2h0LXNtOiBjYWxjKDEuMzc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tcGlsbC1oZWlnaHQtbWQ6IGNhbGMoMS41NjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tcGlsbC1oZWlnaHQtbGc6IGNhbGMoMS43NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXBpbGwtaGVpZ2h0LXhsOiBjYWxjKDJyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1waWxsLWZ6OiB2YXIoLS1waWxsLWZ6LXNtKTstLXBpbGwtaGVpZ2h0OiB2YXIoLS1waWxsLWhlaWdodC1zbSk7Zm9udC1zaXplOnZhcigtLXBpbGwtZnopO2ZsZXg6MDtoZWlnaHQ6dmFyKC0tcGlsbC1oZWlnaHQpO3BhZGRpbmctaW5saW5lOi44ZW07ZGlzcGxheTppbmxpbmUtZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Ym9yZGVyLXJhZGl1czp2YXIoLS1waWxsLXJhZGl1cywgMTAwMHJlbSk7bGluZS1oZWlnaHQ6MTt3aGl0ZS1zcGFjZTpub3dyYXA7dXNlci1zZWxlY3Q6bm9uZTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7bWF4LXdpZHRoOjEwMCV9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdKSAubV83Y2RhMWNkNntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGFyay03KTtjb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstMCl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fN2NkYTFjZDZ7Y29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1ibGFjayl9Lm1fN2NkYTFjZDY6d2hlcmUoW2RhdGEtd2l0aC1yZW1vdmVdOm5vdCg6aGFzKGJ1dHRvbjpkaXNhYmxlZCkpKXtwYWRkaW5nLWlubGluZS1lbmQ6MH0ubV83Y2RhMWNkNjp3aGVyZShbZGF0YS1kaXNhYmxlZF0sOmhhcyhidXR0b246ZGlzYWJsZWQpKXtjdXJzb3I6bm90LWFsbG93ZWR9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fNDRkYTMwOGJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMSl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fNDRkYTMwOGI6d2hlcmUoW2RhdGEtZGlzYWJsZWRdLDpoYXMoYnV0dG9uOmRpc2FibGVkKSl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRpc2FibGVkKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV9lM2EwMWY4e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci13aGl0ZSl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fZTNhMDFmODp3aGVyZShbZGF0YS1kaXNhYmxlZF0sOmhhcyhidXR0b246ZGlzYWJsZWQpKXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGlzYWJsZWQpfS5tXzFlMGU2MTgwe2N1cnNvcjppbmhlcml0O292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7aGVpZ2h0OjEwMCU7dGV4dC1ib3gtdHJpbTp0cmltLWJvdGg7dGV4dC1ib3gtZWRnZTpjYXAgYWxwaGFiZXRpY30ubV9hZTM4Njc3OHtjb2xvcjppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2hlaWdodDoxMDAlO21pbi1oZWlnaHQ6dW5zZXQ7bWluLXdpZHRoOjJlbTt3aWR0aDp1bnNldDtib3JkZXItcmFkaXVzOjA7cGFkZGluZy1pbmxpbmUtc3RhcnQ6LjFlbTtwYWRkaW5nLWlubGluZS1lbmQ6LjNlbTtmbGV4OjA7Ym9yZGVyLWVuZC1lbmQtcmFkaXVzOnZhcigtLXBpbGwtcmFkaXVzLCA1MCUpO2JvcmRlci1zdGFydC1lbmQtcmFkaXVzOnZhcigtLXBpbGwtcmFkaXVzLCA1MCUpfS5tXzdjZGExY2Q2W2RhdGEtZGlzYWJsZWRdPi5tX2FlMzg2Nzc4LC5tX2FlMzg2Nzc4OmRpc2FibGVke2Rpc3BsYXk6bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3dpZHRoOi44ZW07bWluLXdpZHRoOi44ZW07cGFkZGluZzowO2N1cnNvcjpub3QtYWxsb3dlZH0ubV83Y2RhMWNkNltkYXRhLWRpc2FibGVkXT4ubV9hZTM4Njc3OD5zdmcsLm1fYWUzODY3Nzg6ZGlzYWJsZWQ+c3Zne2Rpc3BsYXk6bm9uZX0ubV9hZTM4Njc3OD5zdmd7cG9pbnRlci1ldmVudHM6bm9uZX0ubV8xZGNmZDkwYnstLXBnLWdhcC14czogY2FsYyguMzc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tcGctZ2FwLXNtOiBjYWxjKC41cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tcGctZ2FwLW1kOiBjYWxjKC42MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1wZy1nYXAtbGc6IGNhbGMoLjc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tcGctZ2FwLXhsOiBjYWxjKC43NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXBnLWdhcDogdmFyKC0tcGctZ2FwLXNtKTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2dhcDp2YXIoLS1wZy1nYXApO2ZsZXgtd3JhcDp3cmFwfS5tXzQ1YzQzNjlke2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7YXBwZWFyYW5jZTpub25lO21pbi13aWR0aDpjYWxjKDYuMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7ZmxleDoxO2JvcmRlcjowO2ZvbnQtc2l6ZTppbmhlcml0O2hlaWdodDoxLjZlbTtjb2xvcjppbmhlcml0O3BhZGRpbmc6MH0ubV80NWM0MzY5ZDo6cGxhY2Vob2xkZXJ7Y29sb3I6dmFyKC0taW5wdXQtcGxhY2Vob2xkZXItY29sb3IpO29wYWNpdHk6MX0ubV80NWM0MzY5ZDp3aGVyZShbZGF0YS10eXBlPWhpZGRlbl0sW2RhdGEtdHlwZT1hdXRvXSl7aGVpZ2h0OmNhbGMoLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7d2lkdGg6Y2FsYyguMDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTt0b3A6MDtsZWZ0OjA7cG9pbnRlci1ldmVudHM6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZTtvcGFjaXR5OjB9Lm1fNDVjNDM2OWQ6Zm9jdXN7b3V0bGluZTpub25lfS5tXzQ1YzQzNjlkOndoZXJlKFtkYXRhLXR5cGU9YXV0b106Zm9jdXMpe2hlaWdodDoxLjZlbTt2aXNpYmlsaXR5OnZpc2libGU7b3BhY2l0eToxO3Bvc2l0aW9uOnN0YXRpY30ubV80NWM0MzY5ZDp3aGVyZShbZGF0YS1wb2ludGVyXTpub3QoW2RhdGEtZGlzYWJsZWRdLDpkaXNhYmxlZCkpe2N1cnNvcjpwb2ludGVyfS5tXzQ1YzQzNjlkOndoZXJlKFtkYXRhLWRpc2FibGVkXSw6ZGlzYWJsZWQpe2N1cnNvcjpub3QtYWxsb3dlZH0ubV9mMDgyNDExMnstLW5sLWJnOiB2YXIoLS1tYW50aW5lLXByaW1hcnktY29sb3ItbGlnaHQpOy0tbmwtaG92ZXI6IHZhcigtLW1hbnRpbmUtcHJpbWFyeS1jb2xvci1saWdodC1ob3Zlcik7LS1ubC1jb2xvcjogdmFyKC0tbWFudGluZS1wcmltYXJ5LWNvbG9yLWxpZ2h0LWNvbG9yKTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO3dpZHRoOjEwMCU7cGFkZGluZzo4cHggdmFyKC0tbWFudGluZS1zcGFjaW5nLXNtKTt1c2VyLXNlbGVjdDpub25lfUBtZWRpYShob3Zlcjpob3Zlcil7OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fZjA4MjQxMTI6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMCl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdKSAubV9mMDgyNDExMjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGFyay02KX19QG1lZGlhKGhvdmVyOm5vbmUpezp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1saWdodF0pIC5tX2YwODI0MTEyOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS0wKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tX2YwODI0MTEyOmFjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGFyay02KX19Lm1fZjA4MjQxMTI6d2hlcmUoW2RhdGEtZGlzYWJsZWRdKXtvcGFjaXR5Oi40O3BvaW50ZXItZXZlbnRzOm5vbmV9Lm1fZjA4MjQxMTI6d2hlcmUoW2RhdGEtYWN0aXZlXSxbYXJpYS1jdXJyZW50PXBhZ2VdKXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW5sLWJnKTtjb2xvcjp2YXIoLS1ubC1jb2xvcil9QG1lZGlhKGhvdmVyOmhvdmVyKXsubV9mMDgyNDExMjp3aGVyZShbZGF0YS1hY3RpdmVdLFthcmlhLWN1cnJlbnQ9cGFnZV0pOmhvdmVye2JhY2tncm91bmQtY29sb3I6dmFyKC0tbmwtaG92ZXIpfX1AbWVkaWEoaG92ZXI6bm9uZSl7Lm1fZjA4MjQxMTI6d2hlcmUoW2RhdGEtYWN0aXZlXSxbYXJpYS1jdXJyZW50PXBhZ2VdKTphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1ubC1ob3Zlcil9fS5tX2YwODI0MTEyOndoZXJlKFtkYXRhLWFjdGl2ZV0sW2FyaWEtY3VycmVudD1wYWdlXSkgLm1fNTc0OTJkY2N7LS1kZXNjcmlwdGlvbi1vcGFjaXR5OiAuOTstLWRlc2NyaXB0aW9uLWNvbG9yOiB2YXIoLS1ubC1jb2xvcil9Lm1fNjkwMDkwYjV7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3RyYW5zaXRpb246dHJhbnNmb3JtIC4xNXMgZWFzZX0ubV82OTAwOTBiNT5zdmd7ZGlzcGxheTpibG9ja30ubV82OTAwOTBiNTp3aGVyZShbZGF0YS1wb3NpdGlvbj1sZWZ0XSl7bWFyZ2luLWlubGluZS1lbmQ6dmFyKC0tbWFudGluZS1zcGFjaW5nLXNtKX0ubV82OTAwOTBiNTp3aGVyZShbZGF0YS1wb3NpdGlvbj1yaWdodF0pe21hcmdpbi1pbmxpbmUtc3RhcnQ6dmFyKC0tbWFudGluZS1zcGFjaW5nLXNtKX0ubV82OTAwOTBiNTp3aGVyZShbZGF0YS1yb3RhdGVdKXt0cmFuc2Zvcm06cm90YXRlKDkwZGVnKX0ubV8xZjZhYzRjNHtmb250LXNpemU6dmFyKC0tbWFudGluZS1mb250LXNpemUtc20pfS5tX2YwN2FmOWQye2ZsZXg6MTtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpc30ubV9mMDdhZjlkMjp3aGVyZShbZGF0YS1uby13cmFwXSl7d2hpdGUtc3BhY2U6bm93cmFwfS5tXzU3NDkyZGNje2Rpc3BsYXk6YmxvY2s7Zm9udC1zaXplOnZhcigtLW1hbnRpbmUtZm9udC1zaXplLXhzKTtvcGFjaXR5OnZhcigtLWRlc2NyaXB0aW9uLW9wYWNpdHksIDEpO2NvbG9yOnZhcigtLWRlc2NyaXB0aW9uLWNvbG9yLCB2YXIoLS1tYW50aW5lLWNvbG9yLWRpbW1lZCkpO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzfTp3aGVyZShbZGF0YS1uby13cmFwXSkgLm1fNTc0OTJkY2N7d2hpdGUtc3BhY2U6bm93cmFwfS5tX2UxN2I4NjJme3BhZGRpbmctaW5saW5lLXN0YXJ0OnZhcigtLW5sLW9mZnNldCwgdmFyKC0tbWFudGluZS1zcGFjaW5nLWxnKSl9Lm1fMWZkOGEwMGJ7dHJhbnNmb3JtOnJvdGF0ZSgtOTBkZWcpfS5tX2E1MTM0NjR7LS1ub3RpZmljYXRpb24tcmFkaXVzOiB2YXIoLS1tYW50aW5lLXJhZGl1cy1kZWZhdWx0KTstLW5vdGlmaWNhdGlvbi1jb2xvcjogdmFyKC0tbWFudGluZS1wcmltYXJ5LWNvbG9yLWZpbGxlZCk7b3ZlcmZsb3c6aGlkZGVuO2JveC1zaXppbmc6Ym9yZGVyLWJveDtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO3BhZGRpbmctaW5saW5lLXN0YXJ0OmNhbGMoMS4zNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7cGFkZGluZy1pbmxpbmUtZW5kOnZhcigtLW1hbnRpbmUtc3BhY2luZy14cyk7cGFkZGluZy10b3A6dmFyKC0tbWFudGluZS1zcGFjaW5nLXhzKTtwYWRkaW5nLWJvdHRvbTp2YXIoLS1tYW50aW5lLXNwYWNpbmcteHMpO2JvcmRlci1yYWRpdXM6dmFyKC0tbm90aWZpY2F0aW9uLXJhZGl1cyk7Ym94LXNoYWRvdzp2YXIoLS1tYW50aW5lLXNoYWRvdy1sZyl9Lm1fYTUxMzQ2NDpiZWZvcmV7Y29udGVudDoiIjtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOmNhbGMoLjM3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTt0b3A6dmFyKC0tbm90aWZpY2F0aW9uLXJhZGl1cyk7Ym90dG9tOnZhcigtLW5vdGlmaWNhdGlvbi1yYWRpdXMpO2luc2V0LWlubGluZS1zdGFydDpjYWxjKC4yNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTtib3JkZXItcmFkaXVzOnZhcigtLW5vdGlmaWNhdGlvbi1yYWRpdXMpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbm90aWZpY2F0aW9uLWNvbG9yKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV9hNTEzNDY0e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci13aGl0ZSl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdKSAubV9hNTEzNDY0e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTYpfS5tX2E1MTM0NjQ6d2hlcmUoW2RhdGEtd2l0aC1pY29uXSk6YmVmb3Jle2Rpc3BsYXk6bm9uZX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV9hNTEzNDY0OndoZXJlKFtkYXRhLXdpdGgtYm9yZGVyXSl7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMyl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdKSAubV9hNTEzNDY0OndoZXJlKFtkYXRhLXdpdGgtYm9yZGVyXSl7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNCl9Lm1fYTRjZWZmYntib3gtc2l6aW5nOmJvcmRlci1ib3g7bWFyZ2luLWlubGluZS1lbmQ6dmFyKC0tbWFudGluZS1zcGFjaW5nLW1kKTt3aWR0aDpjYWxjKDEuNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7aGVpZ2h0OmNhbGMoMS43NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTtib3JkZXItcmFkaXVzOmNhbGMoMS43NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1ub3RpZmljYXRpb24tY29sb3IpO2NvbG9yOnZhcigtLW1hbnRpbmUtY29sb3Itd2hpdGUpfS5tX2IwOTIwYjE1e21hcmdpbi1pbmxpbmUtZW5kOnZhcigtLW1hbnRpbmUtc3BhY2luZy1tZCl9Lm1fYTQ5ZWQyNHtmbGV4OjE7b3ZlcmZsb3c6aGlkZGVuO21hcmdpbi1pbmxpbmUtZW5kOnZhcigtLW1hbnRpbmUtc3BhY2luZy14cyl9Lm1fM2ZlZWRmMTZ7bWFyZ2luLWJvdHRvbTpjYWxjKC4xMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7Zm9udC1zaXplOnZhcigtLW1hbnRpbmUtZm9udC1zaXplLXNtKTtsaW5lLWhlaWdodDp2YXIoLS1tYW50aW5lLWxpbmUtaGVpZ2h0LXNtKTtmb250LXdlaWdodDp2YXIoLS1tYW50aW5lLWZvbnQtd2VpZ2h0LW1lZGl1bSl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fM2ZlZWRmMTZ7Y29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTkpfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1kYXJrXSkgLm1fM2ZlZWRmMTZ7Y29sb3I6dmFyKC0tbWFudGluZS1jb2xvci13aGl0ZSl9Lm1fM2Q3MzNhM2F7Zm9udC1zaXplOnZhcigtLW1hbnRpbmUtZm9udC1zaXplLXNtKTtsaW5lLWhlaWdodDp2YXIoLS1tYW50aW5lLWxpbmUtaGVpZ2h0LXNtKTtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpc306d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV8zZDczM2EzYXtjb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWJsYWNrKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tXzNkNzMzYTNhe2NvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGFyay0wKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV8zZDczM2EzYTp3aGVyZShbZGF0YS13aXRoLXRpdGxlXSl7Y29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTYpfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1kYXJrXSkgLm1fM2Q3MzNhM2E6d2hlcmUoW2RhdGEtd2l0aC10aXRsZV0pe2NvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGFyay0yKX1AbWVkaWEoaG92ZXI6aG92ZXIpezp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1saWdodF0pIC5tXzkxOWE0ZDg4OmhvdmVye2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTApfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1kYXJrXSkgLm1fOTE5YTRkODg6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstOCl9fUBtZWRpYShob3Zlcjpub25lKXs6d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV85MTlhNGQ4ODphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMCl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdKSAubV85MTlhNGQ4ODphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstOCl9fS5tX2UyZjVjZDRley0tbmktcmlnaHQtc2VjdGlvbi13aWR0aC14czogY2FsYygxLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1uaS1yaWdodC1zZWN0aW9uLXdpZHRoLXNtOiBjYWxjKDEuNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLW5pLXJpZ2h0LXNlY3Rpb24td2lkdGgtbWQ6IGNhbGMoMS42ODc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tbmktcmlnaHQtc2VjdGlvbi13aWR0aC1sZzogY2FsYygxLjkzNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1uaS1yaWdodC1zZWN0aW9uLXdpZHRoLXhsOiBjYWxjKDIuMTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpfS5tXzk1ZTE3ZDIyey0tbmktY2hldnJvbi1zaXplLXhzOiBjYWxjKC42MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1uaS1jaGV2cm9uLXNpemUtc206IGNhbGMoLjg3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLW5pLWNoZXZyb24tc2l6ZS1tZDogY2FsYygxcmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tbmktY2hldnJvbi1zaXplLWxnOiBjYWxjKDEuMTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tbmktY2hldnJvbi1zaXplLXhsOiBjYWxjKDEuMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1uaS1jaGV2cm9uLXNpemU6IHZhcigtLW5pLWNoZXZyb24tc2l6ZS1zbSk7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjt3aWR0aDoxMDAlO2hlaWdodDpjYWxjKHZhcigtLWlucHV0LWhlaWdodCkgLSBjYWxjKC4xMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkpO21heC13aWR0aDpjYWxjKHZhcigtLW5pLWNoZXZyb24tc2l6ZSkgKiAxLjcpO21hcmdpbi1pbmxpbmUtc3RhcnQ6YXV0b30ubV84MGI0YjE3MXstLWNvbnRyb2wtYm9yZGVyOiAxcHggc29saWQgdmFyKC0taW5wdXQtYmQpOy0tY29udHJvbC1yYWRpdXM6IGNhbGModmFyKC0taW5wdXQtcmFkaXVzKSAtIGNhbGMoLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkpO2ZsZXg6MCAwIDUwJTt3aWR0aDoxMDAlO3BhZGRpbmc6MDtoZWlnaHQ6Y2FsYyh2YXIoLS1pbnB1dC1oZWlnaHQpIC8gMiAtIGNhbGMoLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkpO2JvcmRlci1pbmxpbmUtc3RhcnQ6dmFyKC0tY29udHJvbC1ib3JkZXIpO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtjb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLXRleHQpO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Y3Vyc29yOnBvaW50ZXJ9Lm1fODBiNGIxNzE6d2hlcmUoOmRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2N1cnNvcjpub3QtYWxsb3dlZDtvcGFjaXR5Oi42O2NvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGlzYWJsZWQtY29sb3IpfS5tX2UyZjVjZDRlW2RhdGEtZXJyb3JdIDp3aGVyZSgubV84MGI0YjE3MSl7Y29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1lcnJvcil9QG1lZGlhKGhvdmVyOmhvdmVyKXs6d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV84MGI0YjE3MTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS0wKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tXzgwYjRiMTcxOmhvdmVye2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTQpfX1AbWVkaWEoaG92ZXI6bm9uZSl7OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fODBiNGIxNzE6YWN0aXZle2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTApfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1kYXJrXSkgLm1fODBiNGIxNzE6YWN0aXZle2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTQpfX0ubV84MGI0YjE3MTp3aGVyZSg6Zmlyc3Qtb2YtdHlwZSl7Ym9yZGVyLXJhZGl1czowO2JvcmRlci1zdGFydC1lbmQtcmFkaXVzOnZhcigtLWNvbnRyb2wtcmFkaXVzKX0ubV84MGI0YjE3MTpsYXN0LW9mLXR5cGV7Ym9yZGVyLXJhZGl1czowO2JvcmRlci1lbmQtZW5kLXJhZGl1czp2YXIoLS1jb250cm9sLXJhZGl1cyl9Lm1fZjYyYWIyYWZ7ZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwO2NvbnRhaW46bGF5b3V0IHN0eWxlO2dhcDp2YXIoLS1vbC1nYXAsIHZhcigtLW1hbnRpbmUtc3BhY2luZy14cykpfS5tXzRhZGRkMzE1ey0tcGFnaW5hdGlvbi1jb250cm9sLXNpemUteHM6IGNhbGMoMS4zNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1wYWdpbmF0aW9uLWNvbnRyb2wtc2l6ZS1zbTogY2FsYygxLjYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXBhZ2luYXRpb24tY29udHJvbC1zaXplLW1kOiBjYWxjKDJyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1wYWdpbmF0aW9uLWNvbnRyb2wtc2l6ZS1sZzogY2FsYygyLjM3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXBhZ2luYXRpb24tY29udHJvbC1zaXplLXhsOiBjYWxjKDIuNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1wYWdpbmF0aW9uLWNvbnRyb2wtc2l6ZS1pbnB1dC14czogY2FsYygxLjg3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXBhZ2luYXRpb24tY29udHJvbC1zaXplLWlucHV0LXNtOiBjYWxjKDIuMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1wYWdpbmF0aW9uLWNvbnRyb2wtc2l6ZS1pbnB1dC1tZDogY2FsYygyLjYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXBhZ2luYXRpb24tY29udHJvbC1zaXplLWlucHV0LWxnOiBjYWxjKDMuMTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tcGFnaW5hdGlvbi1jb250cm9sLXNpemUtaW5wdXQteGw6IGNhbGMoMy43NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXBhZ2luYXRpb24tY29udHJvbC1zaXplOiB2YXIoLS1wYWdpbmF0aW9uLWNvbnRyb2wtc2l6ZS1tZCk7LS1wYWdpbmF0aW9uLWNvbnRyb2wtZno6IHZhcigtLW1hbnRpbmUtZm9udC1zaXplLW1kKTstLXBhZ2luYXRpb24tYWN0aXZlLWJnOiB2YXIoLS1tYW50aW5lLXByaW1hcnktY29sb3ItZmlsbGVkKX0ubV8zMjZkMDI0YXtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7Ym9yZGVyOmNhbGMoLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkgc29saWQ7Y3Vyc29yOnBvaW50ZXI7Y29sb3I6dmFyKC0tbWFudGluZS1jb2xvci10ZXh0KTtoZWlnaHQ6dmFyKC0tcGFnaW5hdGlvbi1jb250cm9sLXNpemUpO21pbi13aWR0aDp2YXIoLS1wYWdpbmF0aW9uLWNvbnRyb2wtc2l6ZSk7Zm9udC1zaXplOnZhcigtLXBhZ2luYXRpb24tY29udHJvbC1meik7bGluZS1oZWlnaHQ6MTtib3JkZXItcmFkaXVzOnZhcigtLXBhZ2luYXRpb24tY29udHJvbC1yYWRpdXMsIHZhcigtLW1hbnRpbmUtcmFkaXVzLWRlZmF1bHQpKX0ubV8zMjZkMDI0YTp3aGVyZShbZGF0YS13aXRoLXBhZGRpbmddKXtwYWRkaW5nOmNhbGModmFyKC0tcGFnaW5hdGlvbi1jb250cm9sLXNpemUpIC8gNCl9Lm1fMzI2ZDAyNGE6d2hlcmUoOmRpc2FibGVkLFtkYXRhLWRpc2FibGVkXSl7Y3Vyc29yOm5vdC1hbGxvd2VkO29wYWNpdHk6LjR9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fMzI2ZDAyNGF7Ym9yZGVyLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS00KTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3Itd2hpdGUpfUBtZWRpYShob3Zlcjpob3Zlcil7OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fMzI2ZDAyNGE6aG92ZXI6d2hlcmUoOm5vdCg6ZGlzYWJsZWQsW2RhdGEtZGlzYWJsZWRdKSl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMCl9fUBtZWRpYShob3Zlcjpub25lKXs6d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV8zMjZkMDI0YTphY3RpdmU6d2hlcmUoOm5vdCg6ZGlzYWJsZWQsW2RhdGEtZGlzYWJsZWRdKSl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMCl9fTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1kYXJrXSkgLm1fMzI2ZDAyNGF7Ym9yZGVyLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGFyay00KTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGFyay02KX1AbWVkaWEoaG92ZXI6aG92ZXIpezp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1kYXJrXSkgLm1fMzI2ZDAyNGE6aG92ZXI6d2hlcmUoOm5vdCg6ZGlzYWJsZWQsW2RhdGEtZGlzYWJsZWRdKSl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNSl9fUBtZWRpYShob3Zlcjpub25lKXs6d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tXzMyNmQwMjRhOmFjdGl2ZTp3aGVyZSg6bm90KDpkaXNhYmxlZCxbZGF0YS1kaXNhYmxlZF0pKXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGFyay01KX19Lm1fMzI2ZDAyNGE6d2hlcmUoW2RhdGEtYWN0aXZlXSl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1wYWdpbmF0aW9uLWFjdGl2ZS1iZyk7Ym9yZGVyLWNvbG9yOnZhcigtLXBhZ2luYXRpb24tYWN0aXZlLWJnKTtjb2xvcjp2YXIoLS1wYWdpbmF0aW9uLWFjdGl2ZS1jb2xvciwgdmFyKC0tbWFudGluZS1jb2xvci13aGl0ZSkpfUBtZWRpYShob3Zlcjpob3Zlcil7Lm1fMzI2ZDAyNGE6d2hlcmUoW2RhdGEtYWN0aXZlXSk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1wYWdpbmF0aW9uLWFjdGl2ZS1iZyl9fUBtZWRpYShob3Zlcjpub25lKXsubV8zMjZkMDI0YTp3aGVyZShbZGF0YS1hY3RpdmVdKTphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1wYWdpbmF0aW9uLWFjdGl2ZS1iZyl9fS5tXzRhZDc3Njdke2hlaWdodDp2YXIoLS1wYWdpbmF0aW9uLWNvbnRyb2wtc2l6ZSk7bWluLXdpZHRoOnZhcigtLXBhZ2luYXRpb24tY29udHJvbC1zaXplKTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7cG9pbnRlci1ldmVudHM6bm9uZX0ubV9mNjFjYTYyMHstLXBzaS1idXR0b24tc2l6ZS14czogY2FsYygxLjM3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXBzaS1idXR0b24tc2l6ZS1zbTogY2FsYygxLjYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXBzaS1idXR0b24tc2l6ZS1tZDogY2FsYygxLjc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tcHNpLWJ1dHRvbi1zaXplLWxnOiBjYWxjKDJyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1wc2ktYnV0dG9uLXNpemUteGw6IGNhbGMoMi41cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tcHNpLWljb24tc2l6ZS14czogY2FsYygxcmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tcHNpLWljb24tc2l6ZS1zbTogY2FsYygxLjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tcHNpLWljb24tc2l6ZS1tZDogY2FsYygxLjM3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXBzaS1pY29uLXNpemUtbGc6IGNhbGMoMS41cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tcHNpLWljb24tc2l6ZS14bDogY2FsYygxLjc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tcHNpLWJ1dHRvbi1zaXplOiB2YXIoLS1wc2ktYnV0dG9uLXNpemUtc20pOy0tcHNpLWljb24tc2l6ZTogdmFyKC0tcHNpLWljb24tc2l6ZS1zbSl9Lm1fY2NmOGRhNGN7cG9zaXRpb246cmVsYXRpdmU7b3ZlcmZsb3c6aGlkZGVufS5tX2YyZDg1ZGQye2ZvbnQtZmFtaWx5OnZhcigtLW1hbnRpbmUtZm9udC1mYW1pbHkpO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyOjA7cGFkZGluZy1pbmxpbmUtZW5kOnZhcigtLWlucHV0LXBhZGRpbmctaW5saW5lLWVuZCk7cGFkZGluZy1pbmxpbmUtc3RhcnQ6dmFyKC0taW5wdXQtcGFkZGluZy1pbmxpbmUtc3RhcnQpO3Bvc2l0aW9uOmFic29sdXRlO2luc2V0OjA7b3V0bGluZTowO2ZvbnQtc2l6ZTppbmhlcml0O2xpbmUtaGVpZ2h0OnZhcigtLW1hbnRpbmUtbGluZS1oZWlnaHQpO2hlaWdodDoxMDAlO3dpZHRoOjEwMCU7Y29sb3I6aW5oZXJpdH0ubV9jY2Y4ZGE0Y1tkYXRhLWRpc2FibGVkXSAubV9mMmQ4NWRkMiwubV9mMmQ4NWRkMjpkaXNhYmxlZHtjdXJzb3I6bm90LWFsbG93ZWR9Lm1fZjJkODVkZDI6OnBsYWNlaG9sZGVye2NvbG9yOnZhcigtLWlucHV0LXBsYWNlaG9sZGVyLWNvbG9yKTtvcGFjaXR5OjF9Lm1fZjJkODVkZDI6Oi1tcy1yZXZlYWx7ZGlzcGxheTpub25lfS5tX2IxMDcyZDQ0e3dpZHRoOnZhcigtLXBzaS1idXR0b24tc2l6ZSk7aGVpZ2h0OnZhcigtLXBzaS1idXR0b24tc2l6ZSk7bWluLXdpZHRoOnZhcigtLXBzaS1idXR0b24tc2l6ZSk7bWluLWhlaWdodDp2YXIoLS1wc2ktYnV0dG9uLXNpemUpfS5tX2IxMDcyZDQ0OmRpc2FibGVke2Rpc3BsYXk6bm9uZX0ubV9mMWNiMjA1YXstLXBpbi1pbnB1dC1zaXplLXhzOiBjYWxjKDEuODc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tcGluLWlucHV0LXNpemUtc206IGNhbGMoMi4yNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXBpbi1pbnB1dC1zaXplLW1kOiBjYWxjKDIuNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tcGluLWlucHV0LXNpemUtbGc6IGNhbGMoMy4xMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1waW4taW5wdXQtc2l6ZS14bDogY2FsYygzLjc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tcGluLWlucHV0LXNpemU6IHZhcigtLXBpbi1pbnB1dC1zaXplLXNtKX0ubV9jYjI4OGVhZHt3aWR0aDp2YXIoLS1waW4taW5wdXQtc2l6ZSk7aGVpZ2h0OnZhcigtLXBpbi1pbnB1dC1zaXplKX1Aa2V5ZnJhbWVzIG1fODFhMzc0YmR7MCV7YmFja2dyb3VuZC1wb3NpdGlvbjowIDB9dG97YmFja2dyb3VuZC1wb3NpdGlvbjpjYWxjKDIuNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSAwfX1Aa2V5ZnJhbWVzIG1fZTBmYjdhODZ7MCV7YmFja2dyb3VuZC1wb3NpdGlvbjowIDB9dG97YmFja2dyb3VuZC1wb3NpdGlvbjowIGNhbGMoMi41cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpfX0ubV9kYjZkNjQ2MnstLXByb2dyZXNzLXJhZGl1czogdmFyKC0tbWFudGluZS1yYWRpdXMtZGVmYXVsdCk7LS1wcm9ncmVzcy1zaXplOiB2YXIoLS1wcm9ncmVzcy1zaXplLW1kKTstLXByb2dyZXNzLXNpemUteHM6IGNhbGMoLjE4NzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1wcm9ncmVzcy1zaXplLXNtOiBjYWxjKC4zMTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tcHJvZ3Jlc3Mtc2l6ZS1tZDogY2FsYyguNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXByb2dyZXNzLXNpemUtbGc6IGNhbGMoLjc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tcHJvZ3Jlc3Mtc2l6ZS14bDogY2FsYygxcmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpO3Bvc2l0aW9uOnJlbGF0aXZlO2hlaWdodDp2YXIoLS1wcm9ncmVzcy1zaXplKTtib3JkZXItcmFkaXVzOnZhcigtLXByb2dyZXNzLXJhZGl1cyk7b3ZlcmZsb3c6aGlkZGVuO2Rpc3BsYXk6ZmxleH06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV9kYjZkNjQ2MntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS0yKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tX2RiNmQ2NDYye2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTQpfS5tX2RiNmQ2NDYyOndoZXJlKFtkYXRhLW9yaWVudGF0aW9uPXZlcnRpY2FsXSl7aGVpZ2h0OmF1dG87d2lkdGg6dmFyKC0tcHJvZ3Jlc3Mtc2l6ZSk7ZmxleC1kaXJlY3Rpb246Y29sdW1uLXJldmVyc2V9Lm1fMjI0MmViNjV7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1wcm9ncmVzcy1zZWN0aW9uLWNvbG9yKTtoZWlnaHQ6MTAwJTt3aWR0aDp2YXIoLS1wcm9ncmVzcy1zZWN0aW9uLXNpemUpO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtvdmVyZmxvdzpoaWRkZW47YmFja2dyb3VuZC1zaXplOmNhbGMoMS4yNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSBjYWxjKDEuMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7dHJhbnNpdGlvbjp3aWR0aCB2YXIoLS1wcm9ncmVzcy10cmFuc2l0aW9uLWR1cmF0aW9uLCAuMXMpIGVhc2V9Lm1fMjI0MmViNjU6d2hlcmUoW2RhdGEtc3RyaXBlZF0pe2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KDQ1ZGVnLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSAyNSUsdHJhbnNwYXJlbnQgMjUlLHRyYW5zcGFyZW50IDUwJSxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgNTAlLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSA3NSUsdHJhbnNwYXJlbnQgNzUlLHRyYW5zcGFyZW50KX0ubV8yMjQyZWI2NTp3aGVyZShbZGF0YS1hbmltYXRlZF0pe2FuaW1hdGlvbjptXzgxYTM3NGJkIDFzIGxpbmVhciBpbmZpbml0ZX0ubV8yMjQyZWI2NTp3aGVyZSg6bGFzdC1vZi10eXBlKXtib3JkZXItcmFkaXVzOjA7Ym9yZGVyLXN0YXJ0LWVuZC1yYWRpdXM6dmFyKC0tcHJvZ3Jlc3MtcmFkaXVzKTtib3JkZXItZW5kLWVuZC1yYWRpdXM6dmFyKC0tcHJvZ3Jlc3MtcmFkaXVzKX0ubV8yMjQyZWI2NTp3aGVyZSg6Zmlyc3Qtb2YtdHlwZSl7Ym9yZGVyLXJhZGl1czowO2JvcmRlci1zdGFydC1zdGFydC1yYWRpdXM6dmFyKC0tcHJvZ3Jlc3MtcmFkaXVzKTtib3JkZXItZW5kLXN0YXJ0LXJhZGl1czp2YXIoLS1wcm9ncmVzcy1yYWRpdXMpfS5tX2RiNmQ2NDYyOndoZXJlKFtkYXRhLW9yaWVudGF0aW9uPXZlcnRpY2FsXSkgLm1fMjI0MmViNjV7d2lkdGg6MTAwJTtoZWlnaHQ6dmFyKC0tcHJvZ3Jlc3Mtc2VjdGlvbi1zaXplKTt0cmFuc2l0aW9uOmhlaWdodCB2YXIoLS1wcm9ncmVzcy10cmFuc2l0aW9uLWR1cmF0aW9uLCAuMXMpIGVhc2V9Lm1fZGI2ZDY0NjI6d2hlcmUoW2RhdGEtb3JpZW50YXRpb249dmVydGljYWxdKSAubV8yMjQyZWI2NTp3aGVyZShbZGF0YS1zdHJpcGVkXSl7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSAyNSUsdHJhbnNwYXJlbnQgMjUlLHRyYW5zcGFyZW50IDUwJSxyZ2JhKDI1NSwyNTUsMjU1LC4xNSkgNTAlLHJnYmEoMjU1LDI1NSwyNTUsLjE1KSA3NSUsdHJhbnNwYXJlbnQgNzUlLHRyYW5zcGFyZW50KX0ubV9kYjZkNjQ2Mjp3aGVyZShbZGF0YS1vcmllbnRhdGlvbj12ZXJ0aWNhbF0pIC5tXzIyNDJlYjY1OndoZXJlKFtkYXRhLWFuaW1hdGVkXSl7YW5pbWF0aW9uOm1fZTBmYjdhODYgMXMgbGluZWFyIGluZmluaXRlfS5tX2RiNmQ2NDYyOndoZXJlKFtkYXRhLW9yaWVudGF0aW9uPXZlcnRpY2FsXSkgLm1fMjI0MmViNjU6d2hlcmUoOmxhc3Qtb2YtdHlwZSl7Ym9yZGVyLXJhZGl1czowO2JvcmRlci1zdGFydC1zdGFydC1yYWRpdXM6dmFyKC0tcHJvZ3Jlc3MtcmFkaXVzKTtib3JkZXItc3RhcnQtZW5kLXJhZGl1czp2YXIoLS1wcm9ncmVzcy1yYWRpdXMpfS5tX2RiNmQ2NDYyOndoZXJlKFtkYXRhLW9yaWVudGF0aW9uPXZlcnRpY2FsXSkgLm1fMjI0MmViNjU6d2hlcmUoOmZpcnN0LW9mLXR5cGUpe2JvcmRlci1yYWRpdXM6MDtib3JkZXItZW5kLXN0YXJ0LXJhZGl1czp2YXIoLS1wcm9ncmVzcy1yYWRpdXMpO2JvcmRlci1lbmQtZW5kLXJhZGl1czp2YXIoLS1wcm9ncmVzcy1yYWRpdXMpfS5tXzkxZTQwYjc0e2NvbG9yOnZhcigtLXByb2dyZXNzLWxhYmVsLWNvbG9yLCB2YXIoLS1tYW50aW5lLWNvbG9yLXdoaXRlKSk7Zm9udC13ZWlnaHQ6NzAwO3VzZXItc2VsZWN0Om5vbmU7b3ZlcmZsb3c6aGlkZGVuO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2ZvbnQtc2l6ZTptaW4oY2FsYyh2YXIoLS1wcm9ncmVzcy1zaXplKSAqIC42NSksY2FsYygxLjEyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSk7bGluZS1oZWlnaHQ6MTtwYWRkaW5nLWlubGluZTpjYWxjKC4yNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKX0ubV9kYjZkNjQ2Mjp3aGVyZShbZGF0YS1vcmllbnRhdGlvbj12ZXJ0aWNhbF0pIC5tXzkxZTQwYjc0e3dyaXRpbmctbW9kZTp2ZXJ0aWNhbC1ybH0ubV85ZGM4YWUxMnstLWNhcmQtcmFkaXVzOiB2YXIoLS1tYW50aW5lLXJhZGl1cy1kZWZhdWx0KTtkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCU7Ym9yZGVyLXJhZGl1czp2YXIoLS1jYXJkLXJhZGl1cyk7Y3Vyc29yOnBvaW50ZXJ9Lm1fOWRjOGFlMTIgOndoZXJlKCope2N1cnNvcjppbmhlcml0fS5tXzlkYzhhZTEyOndoZXJlKFtkYXRhLXdpdGgtYm9yZGVyXSl7Ym9yZGVyOmNhbGMoLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkgc29saWQgdHJhbnNwYXJlbnR9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fOWRjOGFlMTI6d2hlcmUoW2RhdGEtd2l0aC1ib3JkZXJdKXtib3JkZXItY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTMpfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1kYXJrXSkgLm1fOWRjOGFlMTI6d2hlcmUoW2RhdGEtd2l0aC1ib3JkZXJdKXtib3JkZXItY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTQpfS5tXzcxN2Q3ZmY2ey0tcmFkaW8tc2l6ZS14czogY2FsYygxcmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tcmFkaW8tc2l6ZS1zbTogY2FsYygxLjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tcmFkaW8tc2l6ZS1tZDogY2FsYygxLjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1yYWRpby1zaXplLWxnOiBjYWxjKDEuODc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tcmFkaW8tc2l6ZS14bDogY2FsYygyLjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tcmFkaW8taWNvbi1zaXplLXhzOiBjYWxjKC4zNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1yYWRpby1pY29uLXNpemUtc206IGNhbGMoLjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1yYWRpby1pY29uLXNpemUtbWQ6IGNhbGMoLjYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXJhZGlvLWljb24tc2l6ZS1sZzogY2FsYyguODc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tcmFkaW8taWNvbi1zaXplLXhsOiBjYWxjKDFyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1yYWRpby1pY29uLXNpemU6IHZhcigtLXJhZGlvLWljb24tc2l6ZS1zbSk7LS1yYWRpby1zaXplOiB2YXIoLS1yYWRpby1zaXplLXNtKTstLXJhZGlvLWNvbG9yOiB2YXIoLS1tYW50aW5lLXByaW1hcnktY29sb3ItZmlsbGVkKTstLXJhZGlvLWljb24tY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3Itd2hpdGUpO3Bvc2l0aW9uOnJlbGF0aXZlO2JvcmRlcjpjYWxjKC4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpIHNvbGlkIHRyYW5zcGFyZW50O3dpZHRoOnZhcigtLXJhZGlvLXNpemUpO21pbi13aWR0aDp2YXIoLS1yYWRpby1zaXplKTtoZWlnaHQ6dmFyKC0tcmFkaW8tc2l6ZSk7bWluLWhlaWdodDp2YXIoLS1yYWRpby1zaXplKTtib3JkZXItcmFkaXVzOnZhcigtLXJhZGlvLXJhZGl1cywgMTAwMDBweCk7dHJhbnNpdGlvbjpib3JkZXItY29sb3IgLjFzIGVhc2UsYmFja2dyb3VuZC1jb2xvciAuMXMgZWFzZTtjdXJzb3I6dmFyKC0tbWFudGluZS1jdXJzb3ItdHlwZSk7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcn06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV83MTdkN2ZmNntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3Itd2hpdGUpO2JvcmRlci1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktNCl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdKSAubV83MTdkN2ZmNntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGFyay02KTtib3JkZXItY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTQpfS5tXzcxN2Q3ZmY2W2RhdGEtY2hlY2tlZF17YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1yYWRpby1jb2xvcik7Ym9yZGVyLWNvbG9yOnZhcigtLXJhZGlvLWNvbG9yKX0ubV83MTdkN2ZmNltkYXRhLWNoZWNrZWRdPi5tXzNlNGRhNjMye29wYWNpdHk6MTt0cmFuc2Zvcm06bm9uZTtjb2xvcjp2YXIoLS1yYWRpby1pY29uLWNvbG9yKX0ubV83MTdkN2ZmNltkYXRhLWRpc2FibGVkXXtjdXJzb3I6bm90LWFsbG93ZWQ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRpc2FibGVkKTtib3JkZXItY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kaXNhYmxlZC1ib3JkZXIpfS5tXzcxN2Q3ZmY2W2RhdGEtZGlzYWJsZWRdW2RhdGEtY2hlY2tlZF0+Lm1fM2U0ZGE2MzJ7Y29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kaXNhYmxlZC1jb2xvcil9Lm1fMjk4MDgzNmNbZGF0YS1jaGVja2VkXTpub3QoW2RhdGEtZGlzYWJsZWRdKXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci1jb2xvcjp2YXIoLS1yYWRpby1jb2xvcil9Lm1fMjk4MDgzNmNbZGF0YS1jaGVja2VkXTpub3QoW2RhdGEtZGlzYWJsZWRdKT4ubV8zZTRkYTYzMntjb2xvcjp2YXIoLS1yYWRpby1jb2xvcik7b3BhY2l0eToxO3RyYW5zZm9ybTpub25lfS5tXzNlNGRhNjMye2Rpc3BsYXk6YmxvY2s7d2lkdGg6dmFyKC0tcmFkaW8taWNvbi1zaXplKTtoZWlnaHQ6dmFyKC0tcmFkaW8taWNvbi1zaXplKTtjb2xvcjp0cmFuc3BhcmVudDtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zZm9ybTp0cmFuc2xhdGVZKGNhbGMoLjMxMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkpIHNjYWxlKC41KTtvcGFjaXR5OjE7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjFzIGVhc2Usb3BhY2l0eSAuMXMgZWFzZX0ubV9mM2YxYWY5NHstLXJhZGlvLXNpemUteHM6IGNhbGMoMXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXJhZGlvLXNpemUtc206IGNhbGMoMS4yNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXJhZGlvLXNpemUtbWQ6IGNhbGMoMS41cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tcmFkaW8tc2l6ZS1sZzogY2FsYygxLjg3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXJhZGlvLXNpemUteGw6IGNhbGMoMi4yNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXJhZGlvLXNpemU6IHZhcigtLXJhZGlvLXNpemUtc20pOy0tcmFkaW8taWNvbi1zaXplLXhzOiBjYWxjKC4zNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1yYWRpby1pY29uLXNpemUtc206IGNhbGMoLjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1yYWRpby1pY29uLXNpemUtbWQ6IGNhbGMoLjYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXJhZGlvLWljb24tc2l6ZS1sZzogY2FsYyguODc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tcmFkaW8taWNvbi1zaXplLXhsOiBjYWxjKDFyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1yYWRpby1pY29uLXNpemU6IHZhcigtLXJhZGlvLWljb24tc2l6ZS1zbSk7LS1yYWRpby1pY29uLWNvbG9yOiB2YXIoLS1tYW50aW5lLWNvbG9yLXdoaXRlKX0ubV84OWM0ZjVlNHtwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDp2YXIoLS1yYWRpby1zaXplKTtoZWlnaHQ6dmFyKC0tcmFkaW8tc2l6ZSk7b3JkZXI6MX0ubV84OWM0ZjVlNDp3aGVyZShbZGF0YS1sYWJlbC1wb3NpdGlvbj1sZWZ0XSl7b3JkZXI6Mn0ubV9mM2VkNmIyYntjb2xvcjp2YXIoLS1yYWRpby1pY29uLWNvbG9yKTtvcGFjaXR5OnZhcigtLXJhZGlvLWljb24tb3BhY2l0eSwgMCk7dHJhbnNmb3JtOnZhcigtLXJhZGlvLWljb24tdHJhbnNmb3JtLCBzY2FsZSguMikgdHJhbnNsYXRlWShjYWxjKC42MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkpKTt0cmFuc2l0aW9uOm9wYWNpdHkgLjFzIGVhc2UsdHJhbnNmb3JtIC4ycyBlYXNlO3BvaW50ZXItZXZlbnRzOm5vbmU7d2lkdGg6dmFyKC0tcmFkaW8taWNvbi1zaXplKTtoZWlnaHQ6dmFyKC0tcmFkaW8taWNvbi1zaXplKTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6Y2FsYyg1MCUgLSB2YXIoLS1yYWRpby1pY29uLXNpemUpIC8gMik7bGVmdDpjYWxjKDUwJSAtIHZhcigtLXJhZGlvLWljb24tc2l6ZSkgLyAyKX0ubV84YTNkYmI4OXtib3JkZXI6Y2FsYyguMDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSBzb2xpZDtwb3NpdGlvbjpyZWxhdGl2ZTthcHBlYXJhbmNlOm5vbmU7d2lkdGg6dmFyKC0tcmFkaW8tc2l6ZSk7aGVpZ2h0OnZhcigtLXJhZGlvLXNpemUpO2JvcmRlci1yYWRpdXM6dmFyKC0tcmFkaW8tcmFkaXVzLCB2YXIoLS1yYWRpby1zaXplKSk7bWFyZ2luOjA7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3RyYW5zaXRpb24tcHJvcGVydHk6YmFja2dyb3VuZC1jb2xvcixib3JkZXItY29sb3I7dHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246ZWFzZTt0cmFuc2l0aW9uLWR1cmF0aW9uOi4xcztjdXJzb3I6dmFyKC0tbWFudGluZS1jdXJzb3ItdHlwZSk7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50fTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1saWdodF0pIC5tXzhhM2RiYjg5e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci13aGl0ZSk7Ym9yZGVyLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS00KX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tXzhhM2RiYjg5e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTYpO2JvcmRlci1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNCl9Lm1fOGEzZGJiODk6Y2hlY2tlZHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLXJhZGlvLWNvbG9yLCB2YXIoLS1tYW50aW5lLXByaW1hcnktY29sb3ItZmlsbGVkKSk7Ym9yZGVyLWNvbG9yOnZhcigtLXJhZGlvLWNvbG9yLCB2YXIoLS1tYW50aW5lLXByaW1hcnktY29sb3ItZmlsbGVkKSl9Lm1fOGEzZGJiODk6Y2hlY2tlZCsubV9mM2VkNmIyYnstLXJhZGlvLWljb24tb3BhY2l0eTogMTstLXJhZGlvLWljb24tdHJhbnNmb3JtOiBzY2FsZSgxKX0ubV84YTNkYmI4OTpkaXNhYmxlZHtjdXJzb3I6bm90LWFsbG93ZWQ7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRpc2FibGVkKTtib3JkZXItY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kaXNhYmxlZC1ib3JkZXIpfS5tXzhhM2RiYjg5OmRpc2FibGVkKy5tX2YzZWQ2YjJiey0tcmFkaW8taWNvbi1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci1kaXNhYmxlZC1jb2xvcil9Lm1fOGEzZGJiODk6d2hlcmUoW2RhdGEtd2l0aC1lcnJvci1zdHlsZXNdW2RhdGEtZXJyb3JdKXtib3JkZXItY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1lcnJvcil9Lm1fMWJmZTlkMzkrLm1fZjNlZDZiMmJ7LS1yYWRpby1pY29uLWNvbG9yOiB2YXIoLS1yYWRpby1jb2xvcil9Lm1fMWJmZTlkMzk6Y2hlY2tlZDpub3QoOmRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2JvcmRlci1jb2xvcjp2YXIoLS1yYWRpby1jb2xvcil9Lm1fMWJmZTlkMzk6Y2hlY2tlZDpub3QoOmRpc2FibGVkKSsubV9mM2VkNmIyYnstLXJhZGlvLWljb24tY29sb3I6IHZhcigtLXJhZGlvLWNvbG9yKTstLXJhZGlvLWljb24tb3BhY2l0eTogMTstLXJhZGlvLWljb24tdHJhbnNmb3JtOiBub25lfS5tX2Y4ZDMxMmYyey0tcmF0aW5nLXNpemUteHM6IGNhbGMoLjg3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXJhdGluZy1zaXplLXNtOiBjYWxjKDEuMTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tcmF0aW5nLXNpemUtbWQ6IGNhbGMoMS4yNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXJhdGluZy1zaXplLWxnOiBjYWxjKDEuNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1yYXRpbmctc2l6ZS14bDogY2FsYygycmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpO2Rpc3BsYXk6ZmxleDt3aWR0aDptYXgtY29udGVudH0ubV9mOGQzMTJmMjp3aGVyZSg6aGFzKGlucHV0OmRpc2FibGVkKSl7cG9pbnRlci1ldmVudHM6bm9uZX0ubV82MTczNGJiN3twb3NpdGlvbjpyZWxhdGl2ZTt0cmFuc2l0aW9uOnRyYW5zZm9ybSAuMXMgZWFzZX0ubV82MTczNGJiNzp3aGVyZShbZGF0YS1hY3RpdmVdKXt6LWluZGV4OjE7dHJhbnNmb3JtOnNjYWxlKDEuMSl9Lm1fNTY2MmE4OWF7d2lkdGg6dmFyKC0tcmF0aW5nLXNpemUpO2hlaWdodDp2YXIoLS1yYXRpbmctc2l6ZSk7ZGlzcGxheTpibG9ja306d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV81NjYyYTg5YXtmaWxsOnZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS0zKTtzdHJva2U6dmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTMpfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1kYXJrXSkgLm1fNTY2MmE4OWF7ZmlsbDp2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstMyk7c3Ryb2tlOnZhcigtLW1hbnRpbmUtY29sb3ItZGFyay0zKX0ubV81NjYyYTg5YTp3aGVyZShbZGF0YS1maWxsZWRdKXtmaWxsOnZhcigtLXJhdGluZy1jb2xvcik7c3Ryb2tlOnZhcigtLXJhdGluZy1jb2xvcil9Lm1fMjExMDA3YmF7aGVpZ2h0OjA7d2lkdGg6MDtwb3NpdGlvbjphYnNvbHV0ZTtvdmVyZmxvdzpoaWRkZW47d2hpdGUtc3BhY2U6bm93cmFwO29wYWNpdHk6MDstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnR9Lm1fMjExMDA3YmE6Zm9jdXMtdmlzaWJsZStsYWJlbHtvdXRsaW5lOjJweCBzb2xpZCB2YXIoLS1tYW50aW5lLXByaW1hcnktY29sb3ItZmlsbGVkKTtvdXRsaW5lLW9mZnNldDpjYWxjKC4xMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSl9Lm1fMjEzNDJlZTR7ZGlzcGxheTpibG9jaztjdXJzb3I6cG9pbnRlcjtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7ei1pbmRleDp2YXIoLS1yYXRpbmctaXRlbS16LWluZGV4LCAwKTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnR9Lm1fMjEzNDJlZTQ6d2hlcmUoW2RhdGEtcmVhZC1vbmx5XSl7Y3Vyc29yOmRlZmF1bHR9Lm1fMjEzNDJlZTQ6d2hlcmUoOmxhc3Qtb2YtdHlwZSl7cG9zaXRpb246cmVsYXRpdmV9Lm1fZmFlMDVkNmF7Y2xpcC1wYXRoOnZhcigtLXJhdGluZy1zeW1ib2wtY2xpcC1wYXRoKX0ubV8xYjNjODgxOXstLXRvb2x0aXAtcmFkaXVzOiB2YXIoLS1tYW50aW5lLXJhZGl1cy1kZWZhdWx0KTtwb3NpdGlvbjphYnNvbHV0ZTtwYWRkaW5nOmNhbGModmFyKC0tbWFudGluZS1zcGFjaW5nLXhzKSAvIDIpIHZhcigtLW1hbnRpbmUtc3BhY2luZy14cyk7cG9pbnRlci1ldmVudHM6bm9uZTtmb250LXNpemU6dmFyKC0tbWFudGluZS1mb250LXNpemUtc20pO3doaXRlLXNwYWNlOm5vd3JhcDtib3JkZXItcmFkaXVzOnZhcigtLXRvb2x0aXAtcmFkaXVzKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV8xYjNjODgxOXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLXRvb2x0aXAtYmcsIHZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS05KSk7Y29sb3I6dmFyKC0tdG9vbHRpcC1jb2xvciwgdmFyKC0tbWFudGluZS1jb2xvci13aGl0ZSkpfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1kYXJrXSkgLm1fMWIzYzg4MTl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS10b29sdGlwLWJnLCB2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMikpO2NvbG9yOnZhcigtLXRvb2x0aXAtY29sb3IsIHZhcigtLW1hbnRpbmUtY29sb3ItYmxhY2spKX0ubV8xYjNjODgxOTp3aGVyZShbZGF0YS1tdWx0aWxpbmVdKXt3aGl0ZS1zcGFjZTpub3JtYWx9Lm1fMWIzYzg4MTk6d2hlcmUoW2RhdGEtZml4ZWRdKXtwb3NpdGlvbjpmaXhlZH0ubV9mODk4Mzk5ZntiYWNrZ3JvdW5kLWNvbG9yOmluaGVyaXQ7Ym9yZGVyOjA7ei1pbmRleDoxfS5tX2IzMmU0ODEye3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOnZhcigtLXJwLXNpemUpO2hlaWdodDp2YXIoLS1ycC1zaXplKTttaW4td2lkdGg6dmFyKC0tcnAtc2l6ZSk7bWluLWhlaWdodDp2YXIoLS1ycC1zaXplKTstLXJwLXRyYW5zaXRpb24tZHVyYXRpb246IDBtc30ubV9kNDNiNTEzNHt3aWR0aDp2YXIoLS1ycC1zaXplKTtoZWlnaHQ6dmFyKC0tcnAtc2l6ZSk7bWluLXdpZHRoOnZhcigtLXJwLXNpemUpO21pbi1oZWlnaHQ6dmFyKC0tcnAtc2l6ZSk7dHJhbnNmb3JtOnJvdGF0ZShjYWxjKHZhcigtLXJwLXN0YXJ0LWFuZ2xlLCAyNzBkZWcpIC0gMzYwZGVnKSl9Lm1fYjFjYTFmYmZ7c3Ryb2tlOnZhcigtLWN1cnZlLWNvbG9yLCB2YXIoLS1ycC1jdXJ2ZS1yb290LWNvbG9yKSk7dHJhbnNpdGlvbjpzdHJva2UtZGFzaG9mZnNldCB2YXIoLS1ycC10cmFuc2l0aW9uLWR1cmF0aW9uKSBlYXNlLHN0cm9rZS1kYXNoYXJyYXkgdmFyKC0tcnAtdHJhbnNpdGlvbi1kdXJhdGlvbikgZWFzZSxzdHJva2UgdmFyKC0tcnAtdHJhbnNpdGlvbi1kdXJhdGlvbil9W2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdIC5tX2IxY2ExZmJmey0tcnAtY3VydmUtcm9vdC1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTIpfVtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdIC5tX2IxY2ExZmJmey0tcnAtY3VydmUtcm9vdC1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTQpfS5tX2IyM2Y5ZGM0e3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTUwJSk7aW5zZXQtaW5saW5lOnZhcigtLXJwLWxhYmVsLW9mZnNldCl9Lm1fYmM4ZjI3NXstLXNjcm9sbGVyLWNvbnRyb2wtc2l6ZTogY2FsYygzLjEyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXNjcm9sbGVyLWJhY2tncm91bmQtY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItYm9keSk7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzpoaWRkZW47bWF4LXdpZHRoOjEwMCV9Lm1fZWU0NGRlY2V7ZmxleDoxO292ZXJmbG93LXg6YXV0bztvdmVyZmxvdy15OmhpZGRlbjtzY3JvbGxiYXItd2lkdGg6bm9uZTstbXMtb3ZlcmZsb3ctc3R5bGU6bm9uZTt1c2VyLXNlbGVjdDpub25lfS5tX2VlNDRkZWNlOjotd2Via2l0LXNjcm9sbGJhcntkaXNwbGF5Om5vbmV9Lm1fZWU0NGRlY2VbZGF0YS1kcmFnZ2FibGVde2N1cnNvcjpncmFifS5tXzUzZTRmNjA2e2Rpc3BsYXk6aW5saW5lLWZsZXg7d2hpdGUtc3BhY2U6bm93cmFwfS5tXzQ3NzU0ZmM4e3dpZHRoOnZhcigtLXNjcm9sbGVyLWNvbnRyb2wtc2l6ZSk7aGVpZ2h0OnZhcigtLXNjcm9sbGVyLWNvbnRyb2wtc2l6ZSl9Lm1fNTNlNTI2ZWF7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDt3aWR0aDp2YXIoLS1zY3JvbGxlci1jb250cm9sLXNpemUpO3otaW5kZXg6MTtjb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRpbW1lZCk7b3BhY2l0eToxO3BvaW50ZXItZXZlbnRzOmF1dG87dHJhbnNpdGlvbjpvcGFjaXR5IC4ycyBlYXNlLGNvbG9yIC4xNXMgZWFzZX0ubV81M2U1MjZlYTpob3Zlcntjb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLXRleHQpfS5tXzUzZTUyNmVhOndoZXJlKFtkYXRhLXBvc2l0aW9uPXN0YXJ0XSl7aW5zZXQtaW5saW5lLXN0YXJ0OjA7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsdmFyKC0tc2Nyb2xsZXItYmFja2dyb3VuZC1jb2xvcikgNDAlLHRyYW5zcGFyZW50KTtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydH0ubV81M2U1MjZlYTp3aGVyZShbZGF0YS1wb3NpdGlvbj1zdGFydF0pIC5tXzQ3NzU0ZmM4e3RyYW5zZm9ybTpyb3RhdGUoOTBkZWcpfS5tXzUzZTUyNmVhOndoZXJlKFtkYXRhLXBvc2l0aW9uPWVuZF0pe2luc2V0LWlubGluZS1lbmQ6MDtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCh0byBsZWZ0LHZhcigtLXNjcm9sbGVyLWJhY2tncm91bmQtY29sb3IpIDQwJSx0cmFuc3BhcmVudCk7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kfS5tXzUzZTUyNmVhOndoZXJlKFtkYXRhLXBvc2l0aW9uPWVuZF0pIC5tXzQ3NzU0ZmM4e3RyYW5zZm9ybTpyb3RhdGUoLTkwZGVnKX0ubV81M2U1MjZlYTp3aGVyZShbZGF0YS1oaWRkZW5dKXtvcGFjaXR5OjA7cG9pbnRlci1ldmVudHM6bm9uZX0ubV9jZjM2NTM2NHstLXNjLXBhZGRpbmcteHM6IGNhbGMoLjEyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSBjYWxjKC4zNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1zYy1wYWRkaW5nLXNtOiBjYWxjKC4xODc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpIGNhbGMoLjYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXNjLXBhZGRpbmctbWQ6IGNhbGMoLjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpIGNhbGMoLjg3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXNjLXBhZGRpbmctbGc6IGNhbGMoLjQzNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkgY2FsYygxcmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tc2MtcGFkZGluZy14bDogY2FsYyguNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpIGNhbGMoMS4yNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXNjLXRyYW5zaXRpb24tZHVyYXRpb246IC4yczstLXNjLXBhZGRpbmc6IHZhcigtLXNjLXBhZGRpbmctc20pOy0tc2MtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2U7LS1zYy1mb250LXNpemU6IHZhcigtLW1hbnRpbmUtZm9udC1zaXplLXNtKTtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmlubGluZS1mbGV4O2ZsZXgtZGlyZWN0aW9uOnJvdzt3aWR0aDphdXRvO2JvcmRlci1yYWRpdXM6dmFyKC0tc2MtcmFkaXVzLCB2YXIoLS1tYW50aW5lLXJhZGl1cy1kZWZhdWx0KSk7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6Y2FsYyguMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSl9Lm1fY2YzNjUzNjQ6d2hlcmUoW2RhdGEtZnVsbC13aWR0aF0pe2Rpc3BsYXk6ZmxleH0ubV9jZjM2NTM2NDp3aGVyZShbZGF0YS1vcmllbnRhdGlvbj12ZXJ0aWNhbF0pe2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47d2lkdGg6bWF4LWNvbnRlbnR9Lm1fY2YzNjUzNjQ6d2hlcmUoW2RhdGEtb3JpZW50YXRpb249dmVydGljYWxdKTp3aGVyZShbZGF0YS1mdWxsLXdpZHRoXSl7d2lkdGg6YXV0b306d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV9jZjM2NTM2NHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS0xKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tX2NmMzY1MzY0e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTgpfS5tXzllMTgyY2Nke3Bvc2l0aW9uOmFic29sdXRlO2Rpc3BsYXk6YmxvY2s7ei1pbmRleDoxO2JvcmRlci1yYWRpdXM6Y2FsYyh2YXIoLS1zYy1yYWRpdXMsIHZhcigtLW1hbnRpbmUtcmFkaXVzLWRlZmF1bHQpKSAtIDRweCl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fOWUxODJjY2R7Ym94LXNoYWRvdzp2YXIoLS1zYy1zaGFkb3csIG5vbmUpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tc2MtY29sb3IsIHZhcigtLW1hbnRpbmUtY29sb3Itd2hpdGUpKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tXzllMTgyY2Nke2JveC1zaGFkb3c6bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLXNjLWNvbG9yLCB2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNSkpfS5tXzE3MzhmY2Iyey13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDtmb250LXdlaWdodDp2YXIoLS1tYW50aW5lLWZvbnQtd2VpZ2h0LW1lZGl1bSk7ZGlzcGxheTpibG9jazt0ZXh0LWFsaWduOmNlbnRlcjt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7dXNlci1zZWxlY3Q6bm9uZTtib3JkZXItcmFkaXVzOmNhbGModmFyKC0tc2MtcmFkaXVzLCB2YXIoLS1tYW50aW5lLXJhZGl1cy1kZWZhdWx0KSkgLSA0cHgpO2ZvbnQtc2l6ZTp2YXIoLS1zYy1mb250LXNpemUpO3BhZGRpbmc6dmFyKC0tc2MtcGFkZGluZyk7dHJhbnNpdGlvbjpjb2xvciB2YXIoLS1zYy10cmFuc2l0aW9uLWR1cmF0aW9uKSB2YXIoLS1zYy10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbik7Y3Vyc29yOnBvaW50ZXI7b3V0bGluZTp2YXIoLS1zZWdtZW50ZWQtY29udHJvbC1vdXRsaW5lLCBub25lKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV8xNzM4ZmNiMntjb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktNyl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdKSAubV8xNzM4ZmNiMntjb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstMSl9Lm1fMTczOGZjYjI6d2hlcmUoW2RhdGEtcmVhZC1vbmx5XSl7Y3Vyc29yOmRlZmF1bHR9ZmllbGRzZXQ6ZGlzYWJsZWQgLm1fMTczOGZjYjIsLm1fMTczOGZjYjI6d2hlcmUoW2RhdGEtZGlzYWJsZWRdKXtjdXJzb3I6bm90LWFsbG93ZWQ7Y29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kaXNhYmxlZC1jb2xvcil9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fMTczOGZjYjI6d2hlcmUoW2RhdGEtYWN0aXZlXSl7Y29sb3I6dmFyKC0tc2MtbGFiZWwtY29sb3IsIHZhcigtLW1hbnRpbmUtY29sb3ItYmxhY2spKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tXzE3MzhmY2IyOndoZXJlKFtkYXRhLWFjdGl2ZV0pe2NvbG9yOnZhcigtLXNjLWxhYmVsLWNvbG9yLCB2YXIoLS1tYW50aW5lLWNvbG9yLXdoaXRlKSl9Lm1fY2YzNjUzNjQ6d2hlcmUoW2RhdGEtaW5pdGlhbGl6ZWRdKSAubV8xNzM4ZmNiMjp3aGVyZShbZGF0YS1hY3RpdmVdKTpiZWZvcmV7ZGlzcGxheTpub25lfS5tXzE3MzhmY2IyOndoZXJlKFtkYXRhLWFjdGl2ZV0pOmJlZm9yZXtjb250ZW50OiIiO2luc2V0OjA7ei1pbmRleDowO3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6Y2FsYyh2YXIoLS1zYy1yYWRpdXMsIHZhcigtLW1hbnRpbmUtcmFkaXVzLWRlZmF1bHQpKSAtIDRweCl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fMTczOGZjYjI6d2hlcmUoW2RhdGEtYWN0aXZlXSk6YmVmb3Jle2JveC1zaGFkb3c6dmFyKC0tc2Mtc2hhZG93LCBub25lKTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLXNjLWNvbG9yLCB2YXIoLS1tYW50aW5lLWNvbG9yLXdoaXRlKSl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdKSAubV8xNzM4ZmNiMjp3aGVyZShbZGF0YS1hY3RpdmVdKTpiZWZvcmV7Ym94LXNoYWRvdzpub25lO2JhY2tncm91bmQtY29sb3I6dmFyKC0tc2MtY29sb3IsIHZhcigtLW1hbnRpbmUtY29sb3ItZGFyay01KSl9QG1lZGlhKGhvdmVyOmhvdmVyKXs6d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV8xNzM4ZmNiMjp3aGVyZSg6bm90KFtkYXRhLWRpc2FibGVkXSxbZGF0YS1hY3RpdmVdLFtkYXRhLXJlYWQtb25seV0pKTpob3Zlcntjb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWJsYWNrKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tXzE3MzhmY2IyOndoZXJlKDpub3QoW2RhdGEtZGlzYWJsZWRdLFtkYXRhLWFjdGl2ZV0sW2RhdGEtcmVhZC1vbmx5XSkpOmhvdmVye2NvbG9yOnZhcigtLW1hbnRpbmUtY29sb3Itd2hpdGUpfX1AbWVkaWEoaG92ZXI6bm9uZSl7OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fMTczOGZjYjI6d2hlcmUoOm5vdChbZGF0YS1kaXNhYmxlZF0sW2RhdGEtYWN0aXZlXSxbZGF0YS1yZWFkLW9ubHldKSk6YWN0aXZle2NvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItYmxhY2spfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1kYXJrXSkgLm1fMTczOGZjYjI6d2hlcmUoOm5vdChbZGF0YS1kaXNhYmxlZF0sW2RhdGEtYWN0aXZlXSxbZGF0YS1yZWFkLW9ubHldKSk6YWN0aXZle2NvbG9yOnZhcigtLW1hbnRpbmUtY29sb3Itd2hpdGUpfX1AbWVkaWEoaG92ZXI6aG92ZXIpe2ZpZWxkc2V0OmRpc2FibGVkIC5tXzE3MzhmY2IyOmhvdmVye2NvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGlzYWJsZWQtY29sb3IpIWltcG9ydGFudH19QG1lZGlhKGhvdmVyOm5vbmUpe2ZpZWxkc2V0OmRpc2FibGVkIC5tXzE3MzhmY2IyOmFjdGl2ZXtjb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRpc2FibGVkLWNvbG9yKSFpbXBvcnRhbnR9fS5tXzE3MTRkNTg4e2hlaWdodDowO3dpZHRoOjA7cG9zaXRpb246YWJzb2x1dGU7b3ZlcmZsb3c6aGlkZGVuO3doaXRlLXNwYWNlOm5vd3JhcDtvcGFjaXR5OjB9Lm1fMTcxNGQ1ODhbZGF0YS1mb2N1cy1yaW5nPWF1dG9dOmZvY3VzOmZvY3VzLXZpc2libGUrLm1fMTczOGZjYjJ7LS1zZWdtZW50ZWQtY29udHJvbC1vdXRsaW5lOiAycHggc29saWQgdmFyKC0tbWFudGluZS1wcmltYXJ5LWNvbG9yLWZpbGxlZCl9Lm1fMTcxNGQ1ODhbZGF0YS1mb2N1cy1yaW5nPWFsd2F5c106Zm9jdXMrLm1fMTczOGZjYjJ7LS1zZWdtZW50ZWQtY29udHJvbC1vdXRsaW5lOiAycHggc29saWQgdmFyKC0tbWFudGluZS1wcmltYXJ5LWNvbG9yLWZpbGxlZCl9Lm1fNjk2ODZiOWJ7cG9zaXRpb246cmVsYXRpdmU7ZmxleDoxO3otaW5kZXg6Mjt0cmFuc2l0aW9uOmJvcmRlci1jb2xvciB2YXIoLS1zYy10cmFuc2l0aW9uLWR1cmF0aW9uKSB2YXIoLS1zYy10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbil9Lm1fY2YzNjUzNjRbZGF0YS13aXRoLWl0ZW1zLWJvcmRlcnNdIDp3aGVyZSgubV82OTY4NmI5Yik6YmVmb3Jle2NvbnRlbnQ6IiI7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7aW5zZXQtaW5saW5lLXN0YXJ0OjA7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1zZXBhcmF0b3ItY29sb3IpO3dpZHRoOmNhbGMoLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIHZhcigtLXNjLXRyYW5zaXRpb24tZHVyYXRpb24pIHZhcigtLXNjLXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uKX0ubV82OTY4NmI5YltkYXRhLW9yaWVudGF0aW9uPXZlcnRpY2FsXTpiZWZvcmV7dG9wOjA7aW5zZXQtaW5saW5lOjA7Ym90dG9tOmF1dG87aGVpZ2h0OmNhbGMoLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7d2lkdGg6YXV0b306d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV82OTY4NmI5YnstLXNlcGFyYXRvci1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTMpfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1kYXJrXSkgLm1fNjk2ODZiOWJ7LS1zZXBhcmF0b3ItY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItZGFyay00KX0ubV82OTY4NmI5YjpmaXJzdC1vZi10eXBlOmJlZm9yZXstLXNlcGFyYXRvci1jb2xvcjogdHJhbnNwYXJlbnR9W2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWVdIC5tXzY5Njg2YjliW2RhdGEtYWN0aXZlXTpiZWZvcmUsW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWVdIC5tXzY5Njg2YjliW2RhdGEtYWN0aXZlXSsubV82OTY4NmI5YjpiZWZvcmV7LS1zZXBhcmF0b3ItY29sb3I6IHRyYW5zcGFyZW50fS5tXzc4ODgyZjQwe3Bvc2l0aW9uOnJlbGF0aXZlO3otaW5kZXg6Mn0ubV9mYTUyODcyNHstLXNjcC1maWxsZWQtc2VnbWVudC1jb2xvcjogdmFyKC0tbWFudGluZS1wcmltYXJ5LWNvbG9yLWZpbGxlZCk7LS1zY3AtdHJhbnNpdGlvbi1kdXJhdGlvbjogMG1zOy0tc2NwLXRoaWNrbmVzczogY2FsYyguNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fZmE1Mjg3MjR7LS1zY3AtZW1wdHktc2VnbWVudC1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTIpfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1kYXJrXSkgLm1fZmE1Mjg3MjR7LS1zY3AtZW1wdHktc2VnbWVudC1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTQpfS5tX2ZhNTI4NzI0e3Bvc2l0aW9uOnJlbGF0aXZlO3dpZHRoOmZpdC1jb250ZW50fS5tXzYyZTllN2Uye2Rpc3BsYXk6YmxvY2s7dHJhbnNmb3JtOnZhcigtLXNjcC1yb3RhdGlvbik7b3ZlcmZsb3c6aGlkZGVufS5tX2M1NzNmYjZme3RyYW5zaXRpb246c3Ryb2tlLWRhc2hvZmZzZXQgdmFyKC0tc2NwLXRyYW5zaXRpb24tZHVyYXRpb24pIGVhc2Usc3Ryb2tlLWRhc2hhcnJheSB2YXIoLS1zY3AtdHJhbnNpdGlvbi1kdXJhdGlvbikgZWFzZSxzdHJva2UgdmFyKC0tc2NwLXRyYW5zaXRpb24tZHVyYXRpb24pfS5tXzRmYTM0MGYye3Bvc2l0aW9uOmFic29sdXRlO21hcmdpbjowO3BhZGRpbmc6MDtpbnNldC1pbmxpbmU6MDt0ZXh0LWFsaWduOmNlbnRlcjt6LWluZGV4OjF9Lm1fNGZhMzQwZjI6d2hlcmUoW2RhdGEtcG9zaXRpb249Ym90dG9tXSl7Ym90dG9tOjA7cGFkZGluZy1pbmxpbmU6Y2FsYyh2YXIoLS1zY3AtdGhpY2tuZXNzKSAqIDIpfS5tXzRmYTM0MGYyOndoZXJlKFtkYXRhLXBvc2l0aW9uPWJvdHRvbV0pOndoZXJlKFtkYXRhLW9yaWVudGF0aW9uPWRvd25dKXtib3R0b206YXV0bzt0b3A6MH0ubV80ZmEzNDBmMjp3aGVyZShbZGF0YS1wb3NpdGlvbj1jZW50ZXJdKXt0b3A6NTAlO3RyYW5zZm9ybTp0cmFuc2xhdGVZKC01MCUpO3BhZGRpbmctaW5saW5lOmNhbGModmFyKC0tc2NwLXRoaWNrbmVzcykgKiAzKX0ubV85MjVjMmQyY3tjb250YWluZXI6c2ltcGxlLWdyaWQgLyBpbmxpbmUtc2l6ZX0ubV8yNDE1YTE1N3tkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOnJlcGVhdCh2YXIoLS1zZy1jb2xzKSxtaW5tYXgoMCwxZnIpKTtncmlkLWF1dG8tcm93czp2YXIoLS1zZy1hdXRvLXJvd3MsIGF1dG8pO2dhcDp2YXIoLS1zZy1zcGFjaW5nLXkpIHZhcigtLXNnLXNwYWNpbmcteCl9Lm1fMjQxNWExNTdbZGF0YS1hdXRvLWNvbHM9YXV0by1maWxsXXtncmlkLXRlbXBsYXRlLWNvbHVtbnM6cmVwZWF0KGF1dG8tZmlsbCxtaW5tYXgodmFyKC0tc2ctbWluLWNvbC13aWR0aCksMWZyKSl9Lm1fMjQxNWExNTdbZGF0YS1hdXRvLWNvbHM9YXV0by1maXRde2dyaWQtdGVtcGxhdGUtY29sdW1uczpyZXBlYXQoYXV0by1maXQsbWlubWF4KHZhcigtLXNnLW1pbi1jb2wtd2lkdGgpLDFmcikpfUBrZXlmcmFtZXMgbV8yOTljMzI5Y3swJSx0b3tvcGFjaXR5Oi40fTUwJXtvcGFjaXR5OjF9fS5tXzE4MzIwMjQye2hlaWdodDp2YXIoLS1za2VsZXRvbi1oZWlnaHQsIGF1dG8pO3dpZHRoOnZhcigtLXNrZWxldG9uLXdpZHRoLCAxMDAlKTtib3JkZXItcmFkaXVzOnZhcigtLXNrZWxldG9uLXJhZGl1cywgdmFyKC0tbWFudGluZS1yYWRpdXMtZGVmYXVsdCkpO3Bvc2l0aW9uOnJlbGF0aXZlO3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1fMTgzMjAyNDI6d2hlcmUoW2RhdGEtYW5pbWF0ZV0pOmFmdGVye2FuaW1hdGlvbjptXzI5OWMzMjljIDEuNXMgbGluZWFyIGluZmluaXRlfS5tXzE4MzIwMjQyOndoZXJlKFtkYXRhLXZpc2libGVdKXtvdmVyZmxvdzpoaWRkZW59Lm1fMTgzMjAyNDI6d2hlcmUoW2RhdGEtdmlzaWJsZV0pOmJlZm9yZXtwb3NpdGlvbjphYnNvbHV0ZTtjb250ZW50OiIiO2luc2V0OjA7ei1pbmRleDoxMDtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItYm9keSl9Lm1fMTgzMjAyNDI6d2hlcmUoW2RhdGEtdmlzaWJsZV0pOmFmdGVye3Bvc2l0aW9uOmFic29sdXRlO2NvbnRlbnQ6IiI7aW5zZXQ6MDt6LWluZGV4OjExfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1saWdodF0pIC5tXzE4MzIwMjQyOndoZXJlKFtkYXRhLXZpc2libGVdKTphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS0zKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tXzE4MzIwMjQyOndoZXJlKFtkYXRhLXZpc2libGVdKTphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGFyay00KX0ubV9kZDM2MzYyZXstLXNsaWRlci1zaXplLXhzOiBjYWxjKC4yNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXNsaWRlci1zaXplLXNtOiBjYWxjKC4zNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1zbGlkZXItc2l6ZS1tZDogY2FsYyguNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXNsaWRlci1zaXplLWxnOiBjYWxjKC42MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1zbGlkZXItc2l6ZS14bDogY2FsYyguNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1zbGlkZXItc2l6ZTogdmFyKC0tc2xpZGVyLXNpemUtbWQpOy0tc2xpZGVyLXJhZGl1czogY2FsYyg2Mi41cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tc2xpZGVyLWNvbG9yOiB2YXIoLS1tYW50aW5lLXByaW1hcnktY29sb3ItZmlsbGVkKTstLXNsaWRlci10cmFjay1kaXNhYmxlZC1iZzogdmFyKC0tbWFudGluZS1jb2xvci1kaXNhYmxlZCk7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O291dGxpbmU6bm9uZTtoZWlnaHQ6Y2FsYyh2YXIoLS1zbGlkZXItc2l6ZSkgKiAyKTtwYWRkaW5nLWlubGluZTp2YXIoLS1zbGlkZXItc2l6ZSk7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjthbGlnbi1pdGVtczpjZW50ZXI7dG91Y2gtYWN0aW9uOm5vbmU7cG9zaXRpb246cmVsYXRpdmV9W2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdIC5tX2RkMzYzNjJley0tc2xpZGVyLXRyYWNrLWJnOiB2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMil9W2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10gLm1fZGQzNjM2MmV7LS1zbGlkZXItdHJhY2stYmc6IHZhcigtLW1hbnRpbmUtY29sb3ItZGFyay00KX0ubV9kZDM2MzYyZVtkYXRhLW9yaWVudGF0aW9uPXZlcnRpY2FsXXt3aWR0aDpjYWxjKHZhcigtLXNsaWRlci1zaXplKSAqIDIpO2hlaWdodDpjYWxjKDEyLjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7cGFkZGluZy1pbmxpbmU6MDtwYWRkaW5nLWJsb2NrOnZhcigtLXNsaWRlci1zaXplKX0ubV9jOTM1NzMyOHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6Y2FsYygtMi4yNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTtmb250LXNpemU6dmFyKC0tbWFudGluZS1mb250LXNpemUteHMpO2NvbG9yOnZhcigtLW1hbnRpbmUtY29sb3Itd2hpdGUpO3BhZGRpbmc6Y2FsYyh2YXIoLS1tYW50aW5lLXNwYWNpbmcteHMpIC8gMik7Ym9yZGVyLXJhZGl1czp2YXIoLS1tYW50aW5lLXJhZGl1cy1zbSk7d2hpdGUtc3BhY2U6bm93cmFwO3BvaW50ZXItZXZlbnRzOm5vbmU7dXNlci1zZWxlY3Q6bm9uZTt0b3VjaC1hY3Rpb246bm9uZX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV9jOTM1NzMyOHtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS05KX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tX2M5MzU3MzI4e2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTQpfTp3aGVyZSgubV9kZDM2MzYyZVtkYXRhLW9yaWVudGF0aW9uPXZlcnRpY2FsXSkgLm1fYzkzNTczMjh7dG9wOmF1dG87aW5zZXQtaW5saW5lLXN0YXJ0OmNhbGMoMTAwJSArIDhweCl9Lm1fYzlhOWE2MGF7cG9zaXRpb246YWJzb2x1dGU7ZGlzcGxheTpmbGV4O2hlaWdodDp2YXIoLS1zbGlkZXItdGh1bWItc2l6ZSk7d2lkdGg6dmFyKC0tc2xpZGVyLXRodW1iLXNpemUpO2JvcmRlcjpjYWxjKC4yNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSBzb2xpZDt0cmFuc2Zvcm06dHJhbnNsYXRlKC01MCUsLTUwJSk7dG9wOjUwJTtjdXJzb3I6cG9pbnRlcjtib3JkZXItcmFkaXVzOnZhcigtLXNsaWRlci1yYWRpdXMpO2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3RyYW5zaXRpb246Ym94LXNoYWRvdyAuMXMgZWFzZSx0cmFuc2Zvcm0gLjFzIGVhc2U7ei1pbmRleDozO3VzZXItc2VsZWN0Om5vbmU7dG91Y2gtYWN0aW9uOm5vbmU7b3V0bGluZS1vZmZzZXQ6Y2FsYyguMTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpO2xlZnQ6dmFyKC0tc2xpZGVyLXRodW1iLW9mZnNldCl9OndoZXJlKFtkaXI9cnRsXSkgLm1fYzlhOWE2MGF7bGVmdDphdXRvO3JpZ2h0OmNhbGModmFyKC0tc2xpZGVyLXRodW1iLW9mZnNldCkgLSB2YXIoLS1zbGlkZXItdGh1bWItc2l6ZSkpfWZpZWxkc2V0OmRpc2FibGVkIC5tX2M5YTlhNjBhLC5tX2M5YTlhNjBhOndoZXJlKFtkYXRhLWRpc2FibGVkXSl7ZGlzcGxheTpub25lfS5tX2M5YTlhNjBhOndoZXJlKFtkYXRhLWRyYWdnaW5nXSl7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLC01MCUpIHNjYWxlKDEuMDUpO2JveC1zaGFkb3c6dmFyKC0tbWFudGluZS1zaGFkb3ctc20pfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1saWdodF0pIC5tX2M5YTlhNjBhe2NvbG9yOnZhcigtLXNsaWRlci1jb2xvcik7Ym9yZGVyLWNvbG9yOnZhcigtLXNsaWRlci1jb2xvcik7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLXdoaXRlKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tX2M5YTlhNjBhe2NvbG9yOnZhcigtLW1hbnRpbmUtY29sb3Itd2hpdGUpO2JvcmRlci1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLXdoaXRlKTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLXNsaWRlci1jb2xvcil9OndoZXJlKC5tX2RkMzYzNjJlW2RhdGEtb3JpZW50YXRpb249dmVydGljYWxdKSAubV9jOWE5YTYwYXtsZWZ0OjUwJTt0b3A6YXV0bztyaWdodDphdXRvO2JvdHRvbTp2YXIoLS1zbGlkZXItdGh1bWItb2Zmc2V0KTt0cmFuc2Zvcm06dHJhbnNsYXRlKC01MCUsNTAlKX06d2hlcmUoLm1fZGQzNjM2MmVbZGF0YS1vcmllbnRhdGlvbj12ZXJ0aWNhbF0pIC5tX2M5YTlhNjBhOndoZXJlKFtkYXRhLWRyYWdnaW5nXSl7dHJhbnNmb3JtOnRyYW5zbGF0ZSgtNTAlLDUwJSkgc2NhbGUoMS4wNSl9OndoZXJlKFtkaXI9cnRsXSkgOndoZXJlKC5tX2RkMzYzNjJlW2RhdGEtb3JpZW50YXRpb249dmVydGljYWxdKSAubV9jOWE5YTYwYXtsZWZ0OjUwJTtyaWdodDphdXRvfS5tX2E4NjQ1YzJ7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjt3aWR0aDoxMDAlO2hlaWdodDpjYWxjKHZhcigtLXNsaWRlci1zaXplKSAqIDIpO2N1cnNvcjpwb2ludGVyfWZpZWxkc2V0OmRpc2FibGVkIC5tX2E4NjQ1YzIsLm1fYTg2NDVjMjp3aGVyZShbZGF0YS1kaXNhYmxlZF0pe2N1cnNvcjpub3QtYWxsb3dlZH06d2hlcmUoLm1fZGQzNjM2MmVbZGF0YS1vcmllbnRhdGlvbj12ZXJ0aWNhbF0pIC5tX2E4NjQ1YzJ7ZmxleC1kaXJlY3Rpb246Y29sdW1uO3dpZHRoOmNhbGModmFyKC0tc2xpZGVyLXNpemUpICogMik7aGVpZ2h0OjEwMCV9Lm1fYzlhZGU1N2Z7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MTAwJTtoZWlnaHQ6dmFyKC0tc2xpZGVyLXNpemUpfS5tX2M5YWRlNTdmOndoZXJlKFtkYXRhLWludmVydGVkXTpub3QoW2RhdGEtZGlzYWJsZWRdKSl7LS10cmFjay1iZzogdmFyKC0tc2xpZGVyLWNvbG9yKX1maWVsZHNldDpkaXNhYmxlZCAubV9jOWFkZTU3Zjp3aGVyZShbZGF0YS1pbnZlcnRlZF0pLC5tX2M5YWRlNTdmOndoZXJlKFtkYXRhLWludmVydGVkXVtkYXRhLWRpc2FibGVkXSl7LS10cmFjay1iZzogdmFyKC0tc2xpZGVyLXRyYWNrLWRpc2FibGVkLWJnKX0ubV9jOWFkZTU3ZjpiZWZvcmV7Y29udGVudDoiIjtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtib3JkZXItcmFkaXVzOnZhcigtLXNsaWRlci1yYWRpdXMpO2luc2V0LWlubGluZTpjYWxjKHZhcigtLXNsaWRlci1zaXplKSAqIC0xKTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLXRyYWNrLWJnLCB2YXIoLS1zbGlkZXItdHJhY2stYmcpKTt6LWluZGV4OjB9OndoZXJlKC5tX2RkMzYzNjJlW2RhdGEtb3JpZW50YXRpb249dmVydGljYWxdKSAubV9jOWFkZTU3Znt3aWR0aDp2YXIoLS1zbGlkZXItc2l6ZSk7aGVpZ2h0OjEwMCV9OndoZXJlKC5tX2RkMzYzNjJlW2RhdGEtb3JpZW50YXRpb249dmVydGljYWxdKSAubV9jOWFkZTU3ZjpiZWZvcmV7aW5zZXQtaW5saW5lOjA7dG9wOmNhbGModmFyKC0tc2xpZGVyLXNpemUpICogLTEpO2JvdHRvbTpjYWxjKHZhcigtLXNsaWRlci1zaXplKSAqIC0xKX0ubV8zOGFlZWQ0N3twb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjE7dG9wOjA7Ym90dG9tOjA7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1zbGlkZXItY29sb3IpO2JvcmRlci1yYWRpdXM6dmFyKC0tc2xpZGVyLXJhZGl1cyk7d2lkdGg6dmFyKC0tc2xpZGVyLWJhci13aWR0aCk7aW5zZXQtaW5saW5lLXN0YXJ0OnZhcigtLXNsaWRlci1iYXItb2Zmc2V0KX0ubV8zOGFlZWQ0Nzp3aGVyZShbZGF0YS1pbnZlcnRlZF0pe2JhY2tncm91bmQtY29sb3I6dmFyKC0tc2xpZGVyLXRyYWNrLWJnKX1maWVsZHNldDpkaXNhYmxlZCAubV8zOGFlZWQ0Nzp3aGVyZSg6bm90KFtkYXRhLWludmVydGVkXSkpLC5tXzM4YWVlZDQ3OndoZXJlKFtkYXRhLWRpc2FibGVkXTpub3QoW2RhdGEtaW52ZXJ0ZWRdKSl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRpc2FibGVkLWNvbG9yKX06d2hlcmUoLm1fZGQzNjM2MmVbZGF0YS1vcmllbnRhdGlvbj12ZXJ0aWNhbF0pIC5tXzM4YWVlZDQ3e3RvcDphdXRvO2JvdHRvbTp2YXIoLS1zbGlkZXItYmFyLW9mZnNldCk7aW5zZXQtaW5saW5lLXN0YXJ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6dmFyKC0tc2xpZGVyLWJhci13aWR0aCl9Lm1fYjdiMDQyM2F7cG9zaXRpb246YWJzb2x1dGU7aW5zZXQtaW5saW5lLXN0YXJ0OmNhbGModmFyKC0tbWFyay1vZmZzZXQpIC0gdmFyKC0tc2xpZGVyLXNpemUpIC8gMik7dG9wOjA7ei1pbmRleDoyO2hlaWdodDowO3BvaW50ZXItZXZlbnRzOm5vbmV9OndoZXJlKC5tX2RkMzYzNjJlW2RhdGEtb3JpZW50YXRpb249dmVydGljYWxdKSAubV9iN2IwNDIzYXtpbnNldC1pbmxpbmUtc3RhcnQ6MDt0b3A6YXV0bztib3R0b206Y2FsYyh2YXIoLS1tYXJrLW9mZnNldCkgKyB2YXIoLS1zbGlkZXItc2l6ZSkgLyAyKTtoZWlnaHQ6MDt3aWR0aDowfS5tX2RkMzNiYzE5e2JvcmRlcjpjYWxjKC4xMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkgc29saWQ7aGVpZ2h0OnZhcigtLXNsaWRlci1zaXplKTt3aWR0aDp2YXIoLS1zbGlkZXItc2l6ZSk7Ym9yZGVyLXJhZGl1czpjYWxjKDYyLjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLXdoaXRlKTtwb2ludGVyLWV2ZW50czpub25lfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1saWdodF0pIC5tX2RkMzNiYzE5e2JvcmRlci1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMil9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdKSAubV9kZDMzYmMxOXtib3JkZXItY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTQpfS5tX2RkMzNiYzE5OndoZXJlKFtkYXRhLWZpbGxlZF0pe2JvcmRlci1jb2xvcjp2YXIoLS1zbGlkZXItY29sb3IpfS5tX2RkMzNiYzE5OndoZXJlKFtkYXRhLWZpbGxlZF0pOndoZXJlKFtkYXRhLWRpc2FibGVkXSl7Ym9yZGVyLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGlzYWJsZWQtYm9yZGVyKX0ubV82OGM3N2E1Ynt0cmFuc2Zvcm06dHJhbnNsYXRlKGNhbGMoLTUwJSArIHZhcigtLXNsaWRlci1zaXplKSAvIDIpLGNhbGModmFyKC0tbWFudGluZS1zcGFjaW5nLXhzKSAvIDIpKTtmb250LXNpemU6dmFyKC0tbWFudGluZS1mb250LXNpemUtc20pO3doaXRlLXNwYWNlOm5vd3JhcDtjdXJzb3I6cG9pbnRlcjt1c2VyLXNlbGVjdDpub25lfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1saWdodF0pIC5tXzY4Yzc3YTVie2NvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS02KX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tXzY4Yzc3YTVie2NvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGFyay0yKX06d2hlcmUoLm1fZGQzNjM2MmVbZGF0YS1vcmllbnRhdGlvbj12ZXJ0aWNhbF0pIC5tXzY4Yzc3YTVie3RyYW5zZm9ybTp0cmFuc2xhdGUoY2FsYyh2YXIoLS1zbGlkZXItc2l6ZSkgKyB2YXIoLS1tYW50aW5lLXNwYWNpbmcteHMpIC8gMiksY2FsYygtNTAlIC0gdmFyKC0tc2xpZGVyLXNpemUpIC8gMikpfS5tXzU1OWNjZTJke3Bvc2l0aW9uOnJlbGF0aXZlfS5tXzU1OWNjZTJkOndoZXJlKFtkYXRhLWhhcy1zcG9pbGVyXSl7bWFyZ2luLWJvdHRvbTpjYWxjKDEuNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKX0ubV9iOTEyZGY0ZXtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO292ZXJmbG93OmhpZGRlbjt0cmFuc2l0aW9uOm1heC1oZWlnaHQgdmFyKC0tc3BvaWxlci10cmFuc2l0aW9uLWR1cmF0aW9uLCAuMnMpIGVhc2V9Lm1fYjkxMzEwMzJ7cG9zaXRpb246YWJzb2x1dGU7aW5zZXQtaW5saW5lLXN0YXJ0OjA7dG9wOjEwMCU7aGVpZ2h0OmNhbGMoMS41cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpfS5tXzZkNzMxMTI3e2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47YWxpZ24taXRlbXM6dmFyKC0tc3RhY2stYWxpZ24sIHN0cmV0Y2gpO2p1c3RpZnktY29udGVudDp2YXIoLS1zdGFjay1qdXN0aWZ5LCBmbGV4LXN0YXJ0KTtnYXA6dmFyKC0tc3RhY2stZ2FwLCB2YXIoLS1tYW50aW5lLXNwYWNpbmctbWQpKX0ubV9jYmI0ZWE3ZXstLXN0ZXBwZXItaWNvbi1zaXplLXhzOiBjYWxjKDIuMTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tc3RlcHBlci1pY29uLXNpemUtc206IGNhbGMoMi4yNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXN0ZXBwZXItaWNvbi1zaXplLW1kOiBjYWxjKDIuNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tc3RlcHBlci1pY29uLXNpemUtbGc6IGNhbGMoM3JlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXN0ZXBwZXItaWNvbi1zaXplLXhsOiBjYWxjKDMuMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1zdGVwcGVyLWljb24tc2l6ZTogdmFyKC0tc3RlcHBlci1pY29uLXNpemUtbWQpOy0tc3RlcHBlci1jb2xvcjogdmFyKC0tbWFudGluZS1wcmltYXJ5LWNvbG9yLWZpbGxlZCk7LS1zdGVwcGVyLWNvbnRlbnQtcGFkZGluZzogdmFyKC0tbWFudGluZS1zcGFjaW5nLW1kKTstLXN0ZXBwZXItc3BhY2luZzogdmFyKC0tbWFudGluZS1zcGFjaW5nLW1kKTstLXN0ZXBwZXItcmFkaXVzOiBjYWxjKDYyLjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1zdGVwcGVyLWZ6OiB2YXIoLS1tYW50aW5lLWZvbnQtc2l6ZS1tZCk7LS1zdGVwcGVyLW91dGxpbmUtdGhpY2tuZXNzOiBjYWxjKC4xMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSl9W2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdIC5tX2NiYjRlYTdley0tc3RlcHBlci1vdXRsaW5lLWNvbG9yOiB2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMil9W2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10gLm1fY2JiNGVhN2V7LS1zdGVwcGVyLW91dGxpbmUtY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItZGFyay01KX0ubV9hYWY4OWQwYntkaXNwbGF5OmZsZXg7ZmxleC13cmFwOm5vd3JhcDthbGlnbi1pdGVtczpjZW50ZXJ9Lm1fYWFmODlkMGI6d2hlcmUoW2RhdGEtd3JhcF0pe2ZsZXgtd3JhcDp3cmFwO2dhcDp2YXIoLS1tYW50aW5lLXNwYWNpbmctbWQpIDB9Lm1fYWFmODlkMGI6d2hlcmUoW2RhdGEtb3JpZW50YXRpb249dmVydGljYWxdKXtmbGV4LWRpcmVjdGlvbjpjb2x1bW59Lm1fYWFmODlkMGI6d2hlcmUoW2RhdGEtb3JpZW50YXRpb249dmVydGljYWxdKTp3aGVyZShbZGF0YS1pY29uLXBvc2l0aW9uPWxlZnRdKXthbGlnbi1pdGVtczpmbGV4LXN0YXJ0fS5tX2FhZjg5ZDBiOndoZXJlKFtkYXRhLW9yaWVudGF0aW9uPXZlcnRpY2FsXSk6d2hlcmUoW2RhdGEtaWNvbi1wb3NpdGlvbj1yaWdodF0pe2FsaWduLWl0ZW1zOmZsZXgtZW5kfS5tX2FhZjg5ZDBiOndoZXJlKFtkYXRhLW9yaWVudGF0aW9uPWhvcml6b250YWxdKXtmbGV4LWRpcmVjdGlvbjpyb3d9Lm1fMmEzNzFhYzl7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIC4xNXMgZWFzZTtmbGV4OjE7aGVpZ2h0OnZhcigtLXN0ZXBwZXItb3V0bGluZS10aGlja25lc3MpO21hcmdpbi1pbmxpbmU6dmFyKC0tbWFudGluZS1zcGFjaW5nLW1kKTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLXN0ZXBwZXItb3V0bGluZS1jb2xvcil9Lm1fMmEzNzFhYzk6d2hlcmUoW2RhdGEtYWN0aXZlXSl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1zdGVwcGVyLWNvbG9yKX0ubV83OGRhMTU1ZHtwYWRkaW5nLXRvcDp2YXIoLS1zdGVwcGVyLWNvbnRlbnQtcGFkZGluZyl9Lm1fY2JiNTcwNjh7LS1zdGVwLWNvbG9yOiB2YXIoLS1zdGVwcGVyLWNvbG9yKTtkaXNwbGF5OmZsZXg7Y3Vyc29yOmRlZmF1bHR9Lm1fY2JiNTcwNjg6d2hlcmUoW2RhdGEtYWxsb3ctY2xpY2tdKXtjdXJzb3I6cG9pbnRlcn0ubV9jYmI1NzA2ODp3aGVyZShbZGF0YS1pY29uLXBvc2l0aW9uPWxlZnRdKXtmbGV4LWRpcmVjdGlvbjpyb3d9Lm1fY2JiNTcwNjg6d2hlcmUoW2RhdGEtaWNvbi1wb3NpdGlvbj1yaWdodF0pe2ZsZXgtZGlyZWN0aW9uOnJvdy1yZXZlcnNlfS5tX2Y1NmIxZTJje2FsaWduLWl0ZW1zOmNlbnRlcn0ubV84MzNlZGI3ZXstLXNlcGFyYXRvci1zcGFjaW5nOiBjYWxjKHZhcigtLW1hbnRpbmUtc3BhY2luZy14cykgLyAyKTtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydDttaW4taGVpZ2h0OmNhbGModmFyKC0tc3RlcHBlci1pY29uLXNpemUpICsgdmFyKC0tbWFudGluZS1zcGFjaW5nLXhsKSArIHZhcigtLXNlcGFyYXRvci1zcGFjaW5nKSk7bWFyZ2luLXRvcDp2YXIoLS1zZXBhcmF0b3Itc3BhY2luZyk7b3ZlcmZsb3c6aGlkZGVufS5tXzgzM2VkYjdlOndoZXJlKDpmaXJzdC1vZi10eXBlKXttYXJnaW4tdG9wOjB9Lm1fODMzZWRiN2U6d2hlcmUoOmxhc3Qtb2YtdHlwZSl7bWluLWhlaWdodDphdXRvfS5tXzgzM2VkYjdlOndoZXJlKDpsYXN0LW9mLXR5cGUpIC5tXzY0OTZiM2Yze2Rpc3BsYXk6bm9uZX0ubV84MThlNzBie3Bvc2l0aW9uOnJlbGF0aXZlfS5tXzY0OTZiM2Yze3RvcDpjYWxjKHZhcigtLXN0ZXBwZXItaWNvbi1zaXplKSArIHZhcigtLXNlcGFyYXRvci1zcGFjaW5nKSk7aW5zZXQtaW5saW5lLXN0YXJ0OmNhbGModmFyKC0tc3RlcHBlci1pY29uLXNpemUpIC8gMik7aGVpZ2h0OjEwMHZoO3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1pbmxpbmUtc3RhcnQ6dmFyKC0tc3RlcHBlci1vdXRsaW5lLXRoaWNrbmVzcykgc29saWQgdmFyKC0tc3RlcHBlci1vdXRsaW5lLWNvbG9yKX0ubV82NDk2YjNmMzp3aGVyZShbZGF0YS1hY3RpdmVdKXtib3JkZXItY29sb3I6dmFyKC0tc3RlcHBlci1jb2xvcil9Lm1fMTk1OWFkMDF7aGVpZ2h0OnZhcigtLXN0ZXBwZXItaWNvbi1zaXplKTt3aWR0aDp2YXIoLS1zdGVwcGVyLWljb24tc2l6ZSk7bWluLWhlaWdodDp2YXIoLS1zdGVwcGVyLWljb24tc2l6ZSk7bWluLXdpZHRoOnZhcigtLXN0ZXBwZXItaWNvbi1zaXplKTtib3JkZXItcmFkaXVzOnZhcigtLXN0ZXBwZXItcmFkaXVzKTtmb250LXNpemU6dmFyKC0tc3RlcHBlci1meik7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3Bvc2l0aW9uOnJlbGF0aXZlO2ZvbnQtd2VpZ2h0OjcwMDt0cmFuc2l0aW9uOmJhY2tncm91bmQtY29sb3IgLjE1cyBlYXNlLGJvcmRlci1jb2xvciAuMTVzIGVhc2U7Ym9yZGVyOnZhcigtLXN0ZXBwZXItb3V0bGluZS10aGlja25lc3MpIHNvbGlkIHZhcigtLXN0ZXBwZXItb3V0bGluZS1jb2xvcik7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1zdGVwcGVyLW91dGxpbmUtY29sb3IpfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1saWdodF0pIC5tXzE5NTlhZDAxe2NvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS03KX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tXzE5NTlhZDAxe2NvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGFyay0xKX0ubV8xOTU5YWQwMTp3aGVyZShbZGF0YS1wcm9ncmVzc10pe2JvcmRlci1jb2xvcjp2YXIoLS1zdGVwLWNvbG9yKX0ubV8xOTU5YWQwMTp3aGVyZShbZGF0YS1jb21wbGV0ZWRdKXtjb2xvcjp2YXIoLS1zdGVwcGVyLWljb24tY29sb3IsIHZhcigtLW1hbnRpbmUtY29sb3Itd2hpdGUpKTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLXN0ZXAtY29sb3IpO2JvcmRlci1jb2xvcjp2YXIoLS1zdGVwLWNvbG9yKX0ubV84ZmFhYWMzOHtkaXNwbGF5OmZsZXh9Lm1fYTc5MzMxZGN7cG9zaXRpb246YWJzb2x1dGU7aW5zZXQ6MDtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7Y29sb3I6dmFyKC0tc3RlcHBlci1pY29uLWNvbG9yLCB2YXIoLS1tYW50aW5lLWNvbG9yLXdoaXRlKSl9Lm1fMTk1NmFhMmF7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbn0ubV8xOTU2YWEyYTp3aGVyZShbZGF0YS1pY29uLXBvc2l0aW9uPWxlZnRdKXttYXJnaW4taW5saW5lLXN0YXJ0OnZhcigtLW1hbnRpbmUtc3BhY2luZy1zbSl9Lm1fMTk1NmFhMmE6d2hlcmUoW2RhdGEtaWNvbi1wb3NpdGlvbj1yaWdodF0pe3RleHQtYWxpZ246cmlnaHQ7bWFyZ2luLWlubGluZS1lbmQ6dmFyKC0tbWFudGluZS1zcGFjaW5nLXNtKX06d2hlcmUoW2Rpcj1ydGxdKSAubV8xOTU2YWEyYTp3aGVyZShbZGF0YS1pY29uLXBvc2l0aW9uPXJpZ2h0XSl7dGV4dC1hbGlnbjpsZWZ0fS5tXzEyMDUxZjZje2ZvbnQtd2VpZ2h0OnZhcigtLW1hbnRpbmUtZm9udC13ZWlnaHQtbWVkaXVtKTtmb250LXNpemU6dmFyKC0tc3RlcHBlci1meik7bGluZS1oZWlnaHQ6MX0ubV8xNjRlZWE3NHttYXJnaW4tdG9wOmNhbGModmFyKC0tc3RlcHBlci1zcGFjaW5nKSAvIDMpO21hcmdpbi1ib3R0b206Y2FsYyh2YXIoLS1zdGVwcGVyLXNwYWNpbmcpIC8gMyk7Zm9udC1zaXplOmNhbGModmFyKC0tc3RlcHBlci1meikgLSBjYWxjKC4xMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkpO2xpbmUtaGVpZ2h0OjE7Y29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kaW1tZWQpfS5tXzVmOTNmM2Jiey0tc3dpdGNoLWhlaWdodC14czogY2FsYygxcmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tc3dpdGNoLWhlaWdodC1zbTogY2FsYygxLjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tc3dpdGNoLWhlaWdodC1tZDogY2FsYygxLjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1zd2l0Y2gtaGVpZ2h0LWxnOiBjYWxjKDEuODc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tc3dpdGNoLWhlaWdodC14bDogY2FsYygyLjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tc3dpdGNoLXdpZHRoLXhzOiBjYWxjKDJyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1zd2l0Y2gtd2lkdGgtc206IGNhbGMoMi4zNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1zd2l0Y2gtd2lkdGgtbWQ6IGNhbGMoMi44NzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1zd2l0Y2gtd2lkdGgtbGc6IGNhbGMoMy41cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tc3dpdGNoLXdpZHRoLXhsOiBjYWxjKDQuNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXN3aXRjaC10aHVtYi1zaXplLXhzOiBjYWxjKC43NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXN3aXRjaC10aHVtYi1zaXplLXNtOiBjYWxjKC44NzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1zd2l0Y2gtdGh1bWItc2l6ZS1tZDogY2FsYygxLjEyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXN3aXRjaC10aHVtYi1zaXplLWxnOiBjYWxjKDEuMzc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tc3dpdGNoLXRodW1iLXNpemUteGw6IGNhbGMoMS43NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXN3aXRjaC1sYWJlbC1mb250LXNpemUteHM6IGNhbGMoLjMxMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1zd2l0Y2gtbGFiZWwtZm9udC1zaXplLXNtOiBjYWxjKC4zNzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1zd2l0Y2gtbGFiZWwtZm9udC1zaXplLW1kOiBjYWxjKC40Mzc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tc3dpdGNoLWxhYmVsLWZvbnQtc2l6ZS1sZzogY2FsYyguNTYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXN3aXRjaC1sYWJlbC1mb250LXNpemUteGw6IGNhbGMoLjY4NzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1zd2l0Y2gtdHJhY2stbGFiZWwtcGFkZGluZy14czogY2FsYyguMTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tc3dpdGNoLXRyYWNrLWxhYmVsLXBhZGRpbmctc206IGNhbGMoLjE1NjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tc3dpdGNoLXRyYWNrLWxhYmVsLXBhZGRpbmctbWQ6IGNhbGMoLjE4NzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS1zd2l0Y2gtdHJhY2stbGFiZWwtcGFkZGluZy1sZzogY2FsYyguMTg3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXN3aXRjaC10cmFjay1sYWJlbC1wYWRkaW5nLXhsOiBjYWxjKC4yMTg3NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXN3aXRjaC1oZWlnaHQ6IHZhcigtLXN3aXRjaC1oZWlnaHQtc20pOy0tc3dpdGNoLXdpZHRoOiB2YXIoLS1zd2l0Y2gtd2lkdGgtc20pOy0tc3dpdGNoLXRodW1iLXNpemU6IHZhcigtLXN3aXRjaC10aHVtYi1zaXplLXNtKTstLXN3aXRjaC1sYWJlbC1mb250LXNpemU6IHZhcigtLXN3aXRjaC1sYWJlbC1mb250LXNpemUtc20pOy0tc3dpdGNoLXRyYWNrLWxhYmVsLXBhZGRpbmc6IHZhcigtLXN3aXRjaC10cmFjay1sYWJlbC1wYWRkaW5nLXNtKTstLXN3aXRjaC1yYWRpdXM6IGNhbGMoNjIuNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXN3aXRjaC1jb2xvcjogdmFyKC0tbWFudGluZS1wcmltYXJ5LWNvbG9yLWZpbGxlZCk7LS1zd2l0Y2gtZGlzYWJsZWQtY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItZGlzYWJsZWQpO3Bvc2l0aW9uOnJlbGF0aXZlfS5tXzkyNmI0MDExe2hlaWdodDoxMDAlO3dpZHRoOjEwMCU7b3BhY2l0eTowO21hcmdpbjowO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTtvdmVyZmxvdzpoaWRkZW47d2hpdGUtc3BhY2U6bm93cmFwfS5tXzkzMDdkOTkyey13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDtjdXJzb3I6dmFyKC0tc3dpdGNoLWN1cnNvciwgdmFyKC0tbWFudGluZS1jdXJzb3ItdHlwZSkpO292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZTtib3JkZXItcmFkaXVzOnZhcigtLXN3aXRjaC1yYWRpdXMpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tc3dpdGNoLWJnKTtoZWlnaHQ6dmFyKC0tc3dpdGNoLWhlaWdodCk7bWluLXdpZHRoOnZhcigtLXN3aXRjaC13aWR0aCk7bWFyZ2luOjA7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIC4xNXMgZWFzZSxib3JkZXItY29sb3IgLjE1cyBlYXNlO2FwcGVhcmFuY2U6bm9uZTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2ZvbnQtc2l6ZTp2YXIoLS1zd2l0Y2gtbGFiZWwtZm9udC1zaXplKTtmb250LXdlaWdodDp2YXIoLS1tYW50aW5lLWZvbnQtd2VpZ2h0LW1lZGl1bSk7b3JkZXI6dmFyKC0tc3dpdGNoLW9yZGVyLCAxKTt1c2VyLXNlbGVjdDpub25lO3otaW5kZXg6MDtsaW5lLWhlaWdodDowO2NvbG9yOnZhcigtLXN3aXRjaC10ZXh0LWNvbG9yKX0ubV85MzA3ZDk5Mjp3aGVyZShbZGF0YS13aXRob3V0LWxhYmVsc10pe3dpZHRoOnZhcigtLXN3aXRjaC13aWR0aCl9Lm1fOTI2YjQwMTE6Zm9jdXMtdmlzaWJsZSsubV85MzA3ZDk5MntvdXRsaW5lOjJweCBzb2xpZCB2YXIoLS1tYW50aW5lLXByaW1hcnktY29sb3ItZmlsbGVkKTtvdXRsaW5lLW9mZnNldDpjYWxjKC4xMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSl9Lm1fOTI2YjQwMTE6Y2hlY2tlZCsubV85MzA3ZDk5MnstLXN3aXRjaC1iZzogdmFyKC0tc3dpdGNoLWNvbG9yKTstLXN3aXRjaC10ZXh0LWNvbG9yOiB2YXIoLS1tYW50aW5lLWNvbG9yLXdoaXRlKX0ubV85MjZiNDAxMTpkaXNhYmxlZCsubV85MzA3ZDk5MiwubV85MjZiNDAxMVtkYXRhLWRpc2FibGVkXSsubV85MzA3ZDk5MnstLXN3aXRjaC1iZzogdmFyKC0tc3dpdGNoLWRpc2FibGVkLWNvbG9yKTstLXN3aXRjaC1jdXJzb3I6IG5vdC1hbGxvd2VkfVtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSAubV85MzA3ZDk5MnstLXN3aXRjaC1iZzogdmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTMpOy0tc3dpdGNoLXRleHQtY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS02KX1bZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1kYXJrXSAubV85MzA3ZDk5MnstLXN3aXRjaC1iZzogdmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTUpOy0tc3dpdGNoLXRleHQtY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItZGFyay0xKX0ubV85MzA3ZDk5MltkYXRhLWxhYmVsLXBvc2l0aW9uPWxlZnRdey0tc3dpdGNoLW9yZGVyOiAyfS5tXzkzMDM5YTFke3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTtib3JkZXItcmFkaXVzOnZhcigtLXN3aXRjaC1yYWRpdXMpO2Rpc3BsYXk6ZmxleDtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLXN3aXRjaC10aHVtYi1iZywgdmFyKC0tbWFudGluZS1jb2xvci13aGl0ZSkpO2hlaWdodDp2YXIoLS1zd2l0Y2gtdGh1bWItc2l6ZSk7d2lkdGg6dmFyKC0tc3dpdGNoLXRodW1iLXNpemUpO2luc2V0LWlubGluZS1zdGFydDp2YXIoLS1zd2l0Y2gtdGh1bWItc3RhcnQsIHZhcigtLXN3aXRjaC10cmFjay1sYWJlbC1wYWRkaW5nKSk7dHJhbnNpdGlvbjppbnNldC1pbmxpbmUtc3RhcnQgLjE1cyBlYXNlfS5tXzkzMDM5YTFkOndoZXJlKFtkYXRhLXdpdGgtdGh1bWItaW5kaWNhdG9yXSk6YmVmb3Jle2NvbnRlbnQ6IiI7d2lkdGg6NDAlO2hlaWdodDo0MCU7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1zd2l0Y2gtYmcpO3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6dmFyKC0tc3dpdGNoLXJhZGl1cyk7dG9wOjUwJTtsZWZ0OjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlKC01MCUsLTUwJSl9Lm1fOTMwMzlhMWQ+KnttYXJnaW46YXV0b30ubV85MjZiNDAxMTpjaGVja2VkKyo+Lm1fOTMwMzlhMWR7LS1zd2l0Y2gtdGh1bWItc3RhcnQ6IGNhbGMoMTAwJSAtIHZhcigtLXN3aXRjaC10aHVtYi1zaXplKSAtIHZhcigtLXN3aXRjaC10cmFjay1sYWJlbC1wYWRkaW5nKSl9Lm1fOTI2YjQwMTE6ZGlzYWJsZWQrKj4ubV85MzAzOWExZCwubV85MjZiNDAxMVtkYXRhLWRpc2FibGVkXSsqPi5tXzkzMDM5YTFkey0tc3dpdGNoLXRodW1iLWJnOiB2YXIoLS1zd2l0Y2gtdGh1bWItYmctZGlzYWJsZWQpfVtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSAubV85MzAzOWExZHstLXN3aXRjaC10aHVtYi1iZy1kaXNhYmxlZDogdmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTApfVtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdIC5tXzkzMDM5YTFkey0tc3dpdGNoLXRodW1iLWJnLWRpc2FibGVkOiB2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstMyl9Lm1fODI3N2UwODJ7aGVpZ2h0OjEwMCU7ZGlzcGxheTpncmlkO3BsYWNlLWNvbnRlbnQ6Y2VudGVyO21pbi13aWR0aDpjYWxjKHZhcigtLXN3aXRjaC13aWR0aCkgLSB2YXIoLS1zd2l0Y2gtdGh1bWItc2l6ZSkpO3BhZGRpbmctaW5saW5lOnZhcigtLXN3aXRjaC10cmFjay1sYWJlbC1wYWRkaW5nKTttYXJnaW4taW5saW5lLXN0YXJ0OmNhbGModmFyKC0tc3dpdGNoLXRodW1iLXNpemUpICsgdmFyKC0tc3dpdGNoLXRyYWNrLWxhYmVsLXBhZGRpbmcpKTt0cmFuc2l0aW9uOm1hcmdpbiAuMTVzIGVhc2V9Lm1fOTI2YjQwMTE6Y2hlY2tlZCsqPi5tXzgyNzdlMDgye21hcmdpbi1pbmxpbmUtZW5kOmNhbGModmFyKC0tc3dpdGNoLXRodW1iLXNpemUpICsgdmFyKC0tc3dpdGNoLXRyYWNrLWxhYmVsLXBhZGRpbmcpKTttYXJnaW4taW5saW5lLXN0YXJ0OjB9Lm1fYjIzZmEwZWZ7d2lkdGg6MTAwJTtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Ym9yZGVyLXNwYWNpbmc6MDtsaW5lLWhlaWdodDp2YXIoLS1tYW50aW5lLWxpbmUtaGVpZ2h0KTtmb250LXNpemU6dmFyKC0tbWFudGluZS1mb250LXNpemUtc20pO3RhYmxlLWxheW91dDp2YXIoLS10YWJsZS1sYXlvdXQsIGF1dG8pO2NhcHRpb24tc2lkZTp2YXIoLS10YWJsZS1jYXB0aW9uLXNpZGUsIGJvdHRvbSk7Ym9yZGVyOm5vbmV9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fYjIzZmEwZWZ7LS10YWJsZS1ob3Zlci1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTEpOy0tdGFibGUtc3RyaXBlZC1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTApOy0tdGFibGUtYm9yZGVyLWNvbG9yOiB2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMyl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdKSAubV9iMjNmYTBlZnstLXRhYmxlLWhvdmVyLWNvbG9yOiB2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNSk7LS10YWJsZS1zdHJpcGVkLWNvbG9yOiB2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNik7LS10YWJsZS1ib3JkZXItY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItZGFyay00KX0ubV9iMjNmYTBlZjp3aGVyZShbZGF0YS13aXRoLXRhYmxlLWJvcmRlcl0pe2JvcmRlcjpjYWxjKC4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpIHNvbGlkIHZhcigtLXRhYmxlLWJvcmRlci1jb2xvcil9Lm1fYjIzZmEwZWY6d2hlcmUoW2RhdGEtdGFidWxhci1udW1zXSl7Zm9udC12YXJpYW50LW51bWVyaWM6dGFidWxhci1udW1zfS5tX2IyM2ZhMGVmOndoZXJlKFtkYXRhLXZhcmlhbnQ9dmVydGljYWxdKSA6d2hlcmUoLm1fNGU3YWE0ZjMpe2ZvbnQtd2VpZ2h0OnZhcigtLW1hbnRpbmUtZm9udC13ZWlnaHQtbWVkaXVtKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV9iMjNmYTBlZjp3aGVyZShbZGF0YS12YXJpYW50PXZlcnRpY2FsXSkgOndoZXJlKC5tXzRlN2FhNGYzKXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS0wKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tX2IyM2ZhMGVmOndoZXJlKFtkYXRhLXZhcmlhbnQ9dmVydGljYWxdKSA6d2hlcmUoLm1fNGU3YWE0ZjMpe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTYpfS5tXzRlN2FhNGYze3RleHQtYWxpZ246bGVmdH06d2hlcmUoW2Rpcj1ydGxdKSAubV80ZTdhYTRmM3t0ZXh0LWFsaWduOnJpZ2h0fS5tXzRlN2FhNGZke2JvcmRlci1ib3R0b206bm9uZTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fUBtZWRpYShob3Zlcjpob3Zlcil7Lm1fNGU3YWE0ZmQ6aG92ZXI6d2hlcmUoW2RhdGEtaG92ZXJdKXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLXRyLWhvdmVyLWJnKX19QG1lZGlhKGhvdmVyOm5vbmUpey5tXzRlN2FhNGZkOmFjdGl2ZTp3aGVyZShbZGF0YS1ob3Zlcl0pe2JhY2tncm91bmQtY29sb3I6dmFyKC0tdHItaG92ZXItYmcpfX0ubV80ZTdhYTRmZDp3aGVyZShbZGF0YS13aXRoLXJvdy1ib3JkZXJdKXtib3JkZXItYm90dG9tOmNhbGMoLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkgc29saWQgdmFyKC0tdGFibGUtYm9yZGVyLWNvbG9yKX0ubV80ZTdhYTRlZiwubV80ZTdhYTRmM3twYWRkaW5nOnZhcigtLXRhYmxlLXZlcnRpY2FsLXNwYWNpbmcpIHZhcigtLXRhYmxlLWhvcml6b250YWwtc3BhY2luZywgdmFyKC0tbWFudGluZS1zcGFjaW5nLXhzKSl9Lm1fNGU3YWE0ZWY6d2hlcmUoW2RhdGEtd2l0aC1jb2x1bW4tYm9yZGVyXTpub3QoOmZpcnN0LWNoaWxkKSksLm1fNGU3YWE0ZjM6d2hlcmUoW2RhdGEtd2l0aC1jb2x1bW4tYm9yZGVyXTpub3QoOmZpcnN0LWNoaWxkKSl7Ym9yZGVyLWlubGluZS1zdGFydDpjYWxjKC4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpIHNvbGlkIHZhcigtLXRhYmxlLWJvcmRlci1jb2xvcil9Lm1fNGU3YWE0ZWY6d2hlcmUoW2RhdGEtd2l0aC1jb2x1bW4tYm9yZGVyXTpub3QoOmxhc3QtY2hpbGQpKSwubV80ZTdhYTRmMzp3aGVyZShbZGF0YS13aXRoLWNvbHVtbi1ib3JkZXJdOm5vdCg6bGFzdC1jaGlsZCkpe2JvcmRlci1pbmxpbmUtZW5kOmNhbGMoLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkgc29saWQgdmFyKC0tdGFibGUtYm9yZGVyLWNvbG9yKX0ubV9iMjQwNDUzNz46d2hlcmUodHIpOndoZXJlKFtkYXRhLXdpdGgtcm93LWJvcmRlcl06bGFzdC1vZi10eXBlKXtib3JkZXItYm90dG9tOm5vbmV9Lm1fYjI0MDQ1Mzc+OndoZXJlKHRyKTp3aGVyZShbZGF0YS1zdHJpcGVkPW9kZF06bnRoLW9mLXR5cGUob2RkKSl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS10YWJsZS1zdHJpcGVkLWNvbG9yKX0ubV9iMjQwNDUzNz46d2hlcmUodHIpOndoZXJlKFtkYXRhLXN0cmlwZWQ9ZXZlbl06bnRoLW9mLXR5cGUoMm4pKXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLXRhYmxlLXN0cmlwZWQtY29sb3IpfS5tX2IyNDA0NTM3Pjp3aGVyZSh0cilbZGF0YS1ob3Zlcl17LS10ci1ob3Zlci1iZzogdmFyKC0tdGFibGUtaGlnaGxpZ2h0LW9uLWhvdmVyLWNvbG9yLCB2YXIoLS10YWJsZS1ob3Zlci1jb2xvcikpfS5tX2IyNDJkOTc1e3RvcDp2YXIoLS10YWJsZS1zdGlja3ktaGVhZGVyLW9mZnNldCwgMCk7ei1pbmRleDozfS5tX2IyNDJkOTc1OndoZXJlKFtkYXRhLXN0aWNreV0pe3Bvc2l0aW9uOnN0aWNreX0ubV9iMjQyZDk3NTp3aGVyZShbZGF0YS1zdGlja3ldKSA6d2hlcmUoLm1fNGU3YWE0ZjMpe3Bvc2l0aW9uOnN0aWNreTt0b3A6dmFyKC0tdGFibGUtc3RpY2t5LWhlYWRlci1vZmZzZXQsIDApO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1ib2R5KX06d2hlcmUoW2RhdGEtd2l0aC10YWJsZS1ib3JkZXJdKSAubV9iMjQyZDk3NVtkYXRhLXN0aWNreV17cG9zaXRpb246c3RpY2t5O3RvcDp2YXIoLS10YWJsZS1zdGlja3ktaGVhZGVyLW9mZnNldCwgMCk7ei1pbmRleDo0O2JvcmRlci10b3A6bm9uZX06d2hlcmUoW2RhdGEtd2l0aC10YWJsZS1ib3JkZXJdKSAubV9iMjQyZDk3NVtkYXRhLXN0aWNreV06YmVmb3Jle2NvbnRlbnQ6IiI7ZGlzcGxheTpibG9jaztwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7dG9wOmNhbGMoLS4wMzEyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTt3aWR0aDoxMDAlO2hlaWdodDpjYWxjKC4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tdGFibGUtYm9yZGVyLWNvbG9yKTt6LWluZGV4OjV9OndoZXJlKFtkYXRhLXdpdGgtdGFibGUtYm9yZGVyXSkgLm1fYjI0MmQ5NzVbZGF0YS1zdGlja3ldIC5tXzRlN2FhNGYzOmZpcnN0LWNoaWxke2JvcmRlci10b3A6bm9uZX0ubV85ZTVhM2FjN3tjb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRpbW1lZCl9Lm1fOWU1YTNhYzc6d2hlcmUoW2RhdGEtc2lkZT10b3BdKXttYXJnaW4tYm90dG9tOnZhcigtLW1hbnRpbmUtc3BhY2luZy14cyl9Lm1fOWU1YTNhYzc6d2hlcmUoW2RhdGEtc2lkZT1ib3R0b21dKXttYXJnaW4tdG9wOnZhcigtLW1hbnRpbmUtc3BhY2luZy14cyl9Lm1fYTEwMGMxNXtvdmVyZmxvdy14OnZhcigtLXRhYmxlLW92ZXJmbG93KX0ubV82MjI1OTc0MXttaW4td2lkdGg6dmFyKC0tdGFibGUtbWluLXdpZHRoKTttYXgtaGVpZ2h0OnZhcigtLXRhYmxlLW1heC1oZWlnaHQpfS5tX2JjYWE5OTkwe2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47LS10b2MtZGVwdGgtb2Zmc2V0OiAuOGVtfS5tXzM3NWE2NWVme2Rpc3BsYXk6YmxvY2s7cGFkZGluZzouM2VtIC44ZW07Zm9udC1zaXplOnZhcigtLXRvYy1zaXplLCB2YXIoLS1tYW50aW5lLWZvbnQtc2l6ZS1tZCkpO2JvcmRlci1yYWRpdXM6dmFyKC0tdG9jLXJhZGl1cywgdmFyKC0tbWFudGluZS1yYWRpdXMtZGVmYXVsdCkpO3BhZGRpbmctbGVmdDptYXgoY2FsYyh2YXIoLS1kZXB0aC1vZmZzZXQpICogdmFyKC0tdG9jLWRlcHRoLW9mZnNldCkpLC44ZW0pfUBtZWRpYShob3Zlcjpob3Zlcil7OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fMzc1YTY1ZWY6d2hlcmUoOmhvdmVyKTp3aGVyZSg6bm90KFtkYXRhLXZhcmlhbnQ9bm9uZV0pKXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS0xKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tXzM3NWE2NWVmOndoZXJlKDpob3Zlcik6d2hlcmUoOm5vdChbZGF0YS12YXJpYW50PW5vbmVdKSl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNSl9fUBtZWRpYShob3Zlcjpub25lKXs6d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV8zNzVhNjVlZjp3aGVyZSg6YWN0aXZlKTp3aGVyZSg6bm90KFtkYXRhLXZhcmlhbnQ9bm9uZV0pKXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS0xKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tXzM3NWE2NWVmOndoZXJlKDphY3RpdmUpOndoZXJlKDpub3QoW2RhdGEtdmFyaWFudD1ub25lXSkpe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTUpfX0ubV8zNzVhNjVlZjp3aGVyZShbZGF0YS1hY3RpdmVdKXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLXRvYy1iZyk7Y29sb3I6dmFyKC0tdG9jLWNvbG9yKX1bZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1saWdodF0gLm1fODlkNjBkYjF7LS10YWItYm9yZGVyLWNvbG9yOiB2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMyl9W2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10gLm1fODlkNjBkYjF7LS10YWItYm9yZGVyLWNvbG9yOiB2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNCl9Lm1fODlkNjBkYjF7ZGlzcGxheTp2YXIoLS10YWJzLWRpc3BsYXkpO2ZsZXgtZGlyZWN0aW9uOnZhcigtLXRhYnMtZmxleC1kaXJlY3Rpb24pOy0tdGFicy1saXN0LWRpcmVjdGlvbjogcm93Oy0tdGFicy1wYW5lbC1ncm93OiB1bnNldDstLXRhYnMtZGlzcGxheTogYmxvY2s7LS10YWJzLWZsZXgtZGlyZWN0aW9uOiByb3c7LS10YWJzLWxpc3QtYm9yZGVyLXdpZHRoOiAwOy0tdGFicy1saXN0LWJvcmRlci1zaXplOiAwIDAgdmFyKC0tdGFicy1saXN0LWJvcmRlci13aWR0aCkgMDstLXRhYnMtbGlzdC1nYXA6IHVuc2V0Oy0tdGFicy1saXN0LWxpbmUtYm90dG9tOiAwOy0tdGFicy1saXN0LWxpbmUtdG9wOiB1bnNldDstLXRhYnMtbGlzdC1saW5lLXN0YXJ0OiAwOy0tdGFicy1saXN0LWxpbmUtZW5kOiAwOy0tdGFiLXJhZGl1czogdmFyKC0tdGFicy1yYWRpdXMpIHZhcigtLXRhYnMtcmFkaXVzKSAwIDA7LS10YWItYm9yZGVyLXdpZHRoOiAwIDAgdmFyKC0tdGFicy1saXN0LWJvcmRlci13aWR0aCkgMH0ubV84OWQ2MGRiMVtkYXRhLWludmVydGVkXXstLXRhYnMtbGlzdC1saW5lLWJvdHRvbTogdW5zZXQ7LS10YWJzLWxpc3QtbGluZS10b3A6IDA7LS10YWItcmFkaXVzOiAwIDAgdmFyKC0tdGFicy1yYWRpdXMpIHZhcigtLXRhYnMtcmFkaXVzKTstLXRhYi1ib3JkZXItd2lkdGg6IHZhcigtLXRhYnMtbGlzdC1ib3JkZXItd2lkdGgpIDAgMCAwfS5tXzg5ZDYwZGIxW2RhdGEtaW52ZXJ0ZWRdIC5tXzU3NmM5ZDQ6YmVmb3Jle3RvcDowO2JvdHRvbTp1bnNldH0ubV84OWQ2MGRiMVtkYXRhLW9yaWVudGF0aW9uPXZlcnRpY2FsXXstLXRhYnMtbGlzdC1saW5lLXN0YXJ0OiB1bnNldDstLXRhYnMtbGlzdC1saW5lLWVuZDogMDstLXRhYnMtbGlzdC1saW5lLXRvcDogMDstLXRhYnMtbGlzdC1saW5lLWJvdHRvbTogMDstLXRhYnMtbGlzdC1ib3JkZXItc2l6ZTogMCB2YXIoLS10YWJzLWxpc3QtYm9yZGVyLXdpZHRoKSAwIDA7LS10YWItYm9yZGVyLXdpZHRoOiAwIHZhcigtLXRhYnMtbGlzdC1ib3JkZXItd2lkdGgpIDAgMDstLXRhYi1yYWRpdXM6IHZhcigtLXRhYnMtcmFkaXVzKSAwIDAgdmFyKC0tdGFicy1yYWRpdXMpOy0tdGFicy1saXN0LWRpcmVjdGlvbjogY29sdW1uOy0tdGFicy1wYW5lbC1ncm93OiAxOy0tdGFicy1kaXNwbGF5OiBmbGV4fVtkaXI9cnRsXSAubV84OWQ2MGRiMVtkYXRhLW9yaWVudGF0aW9uPXZlcnRpY2FsXXstLXRhYnMtbGlzdC1ib3JkZXItc2l6ZTogMCAwIDAgdmFyKC0tdGFicy1saXN0LWJvcmRlci13aWR0aCk7LS10YWItYm9yZGVyLXdpZHRoOiAwIDAgMCB2YXIoLS10YWJzLWxpc3QtYm9yZGVyLXdpZHRoKTstLXRhYi1yYWRpdXM6IDAgdmFyKC0tdGFicy1yYWRpdXMpIHZhcigtLXRhYnMtcmFkaXVzKSAwfS5tXzg5ZDYwZGIxW2RhdGEtb3JpZW50YXRpb249dmVydGljYWxdW2RhdGEtcGxhY2VtZW50PXJpZ2h0XXstLXRhYnMtZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOy0tdGFicy1saXN0LWxpbmUtc3RhcnQ6IDA7LS10YWJzLWxpc3QtbGluZS1lbmQ6IHVuc2V0Oy0tdGFicy1saXN0LWJvcmRlci1zaXplOiAwIDAgMCB2YXIoLS10YWJzLWxpc3QtYm9yZGVyLXdpZHRoKTstLXRhYi1ib3JkZXItd2lkdGg6IDAgMCAwIHZhcigtLXRhYnMtbGlzdC1ib3JkZXItd2lkdGgpOy0tdGFiLXJhZGl1czogMCB2YXIoLS10YWJzLXJhZGl1cykgdmFyKC0tdGFicy1yYWRpdXMpIDB9W2Rpcj1ydGxdIC5tXzg5ZDYwZGIxW2RhdGEtb3JpZW50YXRpb249dmVydGljYWxdW2RhdGEtcGxhY2VtZW50PXJpZ2h0XXstLXRhYnMtbGlzdC1ib3JkZXItc2l6ZTogMCB2YXIoLS10YWJzLWxpc3QtYm9yZGVyLXdpZHRoKSAwIDA7LS10YWItYm9yZGVyLXdpZHRoOiAwIHZhcigtLXRhYnMtbGlzdC1ib3JkZXItd2lkdGgpIDAgMDstLXRhYi1yYWRpdXM6IHZhcigtLXRhYnMtcmFkaXVzKSAwIDAgdmFyKC0tdGFicy1yYWRpdXMpfS5tXzg5ZDYwZGIxW2RhdGEtdmFyaWFudD1kZWZhdWx0XXstLXRhYnMtbGlzdC1ib3JkZXItd2lkdGg6IGNhbGMoLjEyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKX1bZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1saWdodF0gLm1fODlkNjBkYjFbZGF0YS12YXJpYW50PWRlZmF1bHRdey0tdGFiLWhvdmVyLWNvbG9yOiB2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMCl9W2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10gLm1fODlkNjBkYjFbZGF0YS12YXJpYW50PWRlZmF1bHRdey0tdGFiLWhvdmVyLWNvbG9yOiB2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNil9Lm1fODlkNjBkYjFbZGF0YS12YXJpYW50PW91dGxpbmVdey0tdGFicy1saXN0LWJvcmRlci13aWR0aDogY2FsYyguMDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKX0ubV84OWQ2MGRiMVtkYXRhLXZhcmlhbnQ9cGlsbHNdey0tdGFicy1saXN0LWdhcDogY2FsYyh2YXIoLS1tYW50aW5lLXNwYWNpbmctc20pIC8gMil9W2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdIC5tXzg5ZDYwZGIxW2RhdGEtdmFyaWFudD1waWxsc117LS10YWItaG92ZXItY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS0wKX1bZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1kYXJrXSAubV84OWQ2MGRiMVtkYXRhLXZhcmlhbnQ9cGlsbHNdey0tdGFiLWhvdmVyLWNvbG9yOiB2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNil9Lm1fODlkMzNkNmR7ZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDp3cmFwO2p1c3RpZnktY29udGVudDp2YXIoLS10YWJzLWp1c3RpZnksIGZsZXgtc3RhcnQpO2ZsZXgtZGlyZWN0aW9uOnZhcigtLXRhYnMtbGlzdC1kaXJlY3Rpb24pO2dhcDp2YXIoLS10YWJzLWxpc3QtZ2FwKX0ubV84OWQzM2Q2ZDp3aGVyZShbZGF0YS1ncm93XSkgLm1fNGVjNGRjZTZ7ZmxleDoxfS5tX2IwYzkxNzE1e2ZsZXgtZ3Jvdzp2YXIoLS10YWJzLXBhbmVsLWdyb3cpfS5tXzRlYzRkY2U2e3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6dmFyKC0tbWFudGluZS1zcGFjaW5nLXhzKSB2YXIoLS1tYW50aW5lLXNwYWNpbmctbWQpO2ZvbnQtc2l6ZTp2YXIoLS1tYW50aW5lLWZvbnQtc2l6ZS1zbSk7d2hpdGUtc3BhY2U6bm93cmFwO3otaW5kZXg6MDtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2xpbmUtaGVpZ2h0OjE7dXNlci1zZWxlY3Q6bm9uZX0ubV80ZWM0ZGNlNjp3aGVyZSg6ZGlzYWJsZWQsW2RhdGEtZGlzYWJsZWRdKXtvcGFjaXR5Oi41O2N1cnNvcjpub3QtYWxsb3dlZH0ubV80ZWM0ZGNlNjpmb2N1c3t6LWluZGV4OjF9Lm1fZmM0MjBiMWZ7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfS5tX2ZjNDIwYjFmOndoZXJlKFtkYXRhLXBvc2l0aW9uPWxlZnRdOm5vdCg6b25seS1jaGlsZCkpe21hcmdpbi1pbmxpbmUtZW5kOnZhcigtLW1hbnRpbmUtc3BhY2luZy14cyl9Lm1fZmM0MjBiMWY6d2hlcmUoW2RhdGEtcG9zaXRpb249cmlnaHRdOm5vdCg6b25seS1jaGlsZCkpe21hcmdpbi1pbmxpbmUtc3RhcnQ6dmFyKC0tbWFudGluZS1zcGFjaW5nLXhzKX0ubV80MmJiZDFhZXtmbGV4OjE7dGV4dC1hbGlnbjpjZW50ZXJ9Lm1fNTc2YzlkNHtwb3NpdGlvbjpyZWxhdGl2ZX0ubV81NzZjOWQ0OmJlZm9yZXtjb250ZW50OiIiO3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlcjoxcHggc29saWQgdmFyKC0tdGFiLWJvcmRlci1jb2xvcik7Ym90dG9tOnZhcigtLXRhYnMtbGlzdC1saW5lLWJvdHRvbSk7aW5zZXQtaW5saW5lLXN0YXJ0OnZhcigtLXRhYnMtbGlzdC1saW5lLXN0YXJ0KTtpbnNldC1pbmxpbmUtZW5kOnZhcigtLXRhYnMtbGlzdC1saW5lLWVuZCk7dG9wOnZhcigtLXRhYnMtbGlzdC1saW5lLXRvcCl9Lm1fNTM5ZTgyN2J7Ym9yZGVyLXJhZGl1czp2YXIoLS10YWItcmFkaXVzKTtib3JkZXItd2lkdGg6dmFyKC0tdGFiLWJvcmRlci13aWR0aCk7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tXzUzOWU4MjdiOndoZXJlKFtkYXRhLWFjdGl2ZV0pe2JvcmRlci1jb2xvcjp2YXIoLS10YWJzLWNvbG9yKX1AbWVkaWEoaG92ZXI6aG92ZXIpey5tXzUzOWU4MjdiOmhvdmVye2JhY2tncm91bmQtY29sb3I6dmFyKC0tdGFiLWhvdmVyLWNvbG9yKX0ubV81MzllODI3Yjpob3Zlcjp3aGVyZSg6bm90KFtkYXRhLWFjdGl2ZV0pKXtib3JkZXItY29sb3I6dmFyKC0tdGFiLWJvcmRlci1jb2xvcil9fUBtZWRpYShob3Zlcjpub25lKXsubV81MzllODI3YjphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS10YWItaG92ZXItY29sb3IpfS5tXzUzOWU4MjdiOmFjdGl2ZTp3aGVyZSg6bm90KFtkYXRhLWFjdGl2ZV0pKXtib3JkZXItY29sb3I6dmFyKC0tdGFiLWJvcmRlci1jb2xvcil9fUBtZWRpYShob3Zlcjpob3Zlcil7Lm1fNTM5ZTgyN2I6ZGlzYWJsZWQ6aG92ZXIsLm1fNTM5ZTgyN2JbZGF0YS1kaXNhYmxlZF06aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH19QG1lZGlhKGhvdmVyOm5vbmUpey5tXzUzOWU4MjdiOmRpc2FibGVkOmFjdGl2ZSwubV81MzllODI3YltkYXRhLWRpc2FibGVkXTphY3RpdmV7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH19Lm1fNjc3MmZiZDV7cG9zaXRpb246cmVsYXRpdmV9Lm1fNjc3MmZiZDU6YmVmb3Jle2NvbnRlbnQ6IiI7cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLWNvbG9yOnZhcigtLXRhYi1ib3JkZXItY29sb3IpO2JvcmRlci13aWR0aDp2YXIoLS10YWJzLWxpc3QtYm9yZGVyLXNpemUpO2JvcmRlci1zdHlsZTpzb2xpZDtib3R0b206dmFyKC0tdGFicy1saXN0LWxpbmUtYm90dG9tKTtpbnNldC1pbmxpbmUtc3RhcnQ6dmFyKC0tdGFicy1saXN0LWxpbmUtc3RhcnQpO2luc2V0LWlubGluZS1lbmQ6dmFyKC0tdGFicy1saXN0LWxpbmUtZW5kKTt0b3A6dmFyKC0tdGFicy1saXN0LWxpbmUtdG9wKX0ubV9iNTlhYjQ3Y3tib3JkZXItdG9wOmNhbGMoLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkgc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLWJvdHRvbTpjYWxjKC4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpIHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yaWdodDpjYWxjKC4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpIHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1sZWZ0OmNhbGMoLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkgc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXRvcC1jb2xvcjp2YXIoLS10YWItYm9yZGVyLXRvcC1jb2xvcik7Ym9yZGVyLWJvdHRvbS1jb2xvcjp2YXIoLS10YWItYm9yZGVyLWJvdHRvbS1jb2xvcik7Ym9yZGVyLXJhZGl1czp2YXIoLS10YWItcmFkaXVzKTtwb3NpdGlvbjpyZWxhdGl2ZTstLXRhYi1ib3JkZXItYm90dG9tLWNvbG9yOiB0cmFuc3BhcmVudDstLXRhYi1ib3JkZXItdG9wLWNvbG9yOiB0cmFuc3BhcmVudDstLXRhYi1ib3JkZXItaW5saW5lLWVuZC1jb2xvcjogdHJhbnNwYXJlbnQ7LS10YWItYm9yZGVyLWlubGluZS1zdGFydC1jb2xvcjogdHJhbnNwYXJlbnR9Lm1fYjU5YWI0N2M6d2hlcmUoW2RhdGEtYWN0aXZlXSk6YmVmb3Jle2NvbnRlbnQ6IiI7cG9zaXRpb246YWJzb2x1dGU7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS10YWItYm9yZGVyLWNvbG9yKTtib3R0b206dmFyKC0tdGFiLWJlZm9yZS1ib3R0b20sIGNhbGMoLS4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpKTtsZWZ0OnZhcigtLXRhYi1iZWZvcmUtbGVmdCwgY2FsYygtLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkpO3JpZ2h0OnZhcigtLXRhYi1iZWZvcmUtcmlnaHQsIGF1dG8pO3RvcDp2YXIoLS10YWItYmVmb3JlLXRvcCwgYXV0byk7d2lkdGg6Y2FsYyguMDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTtoZWlnaHQ6Y2FsYyguMDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKX0ubV9iNTlhYjQ3Yzp3aGVyZShbZGF0YS1hY3RpdmVdKTphZnRlcntjb250ZW50OiIiO3Bvc2l0aW9uOmFic29sdXRlO2JhY2tncm91bmQtY29sb3I6dmFyKC0tdGFiLWJvcmRlci1jb2xvcik7Ym90dG9tOnZhcigtLXRhYi1hZnRlci1ib3R0b20sIGNhbGMoLS4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpKTtyaWdodDp2YXIoLS10YWItYWZ0ZXItcmlnaHQsIGNhbGMoLS4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpKTtsZWZ0OnZhcigtLXRhYi1hZnRlci1sZWZ0LCBhdXRvKTt0b3A6dmFyKC0tdGFiLWFmdGVyLXRvcCwgYXV0byk7d2lkdGg6Y2FsYyguMDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTtoZWlnaHQ6Y2FsYyguMDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKX0ubV9iNTlhYjQ3Yzp3aGVyZShbZGF0YS1hY3RpdmVdKXtib3JkZXItdG9wLWNvbG9yOnZhcigtLXRhYi1ib3JkZXItdG9wLWNvbG9yKTtib3JkZXItYm90dG9tLWNvbG9yOnZhcigtLXRhYi1ib3JkZXItYm90dG9tLWNvbG9yKTtib3JkZXItaW5saW5lLXN0YXJ0LWNvbG9yOnZhcigtLXRhYi1ib3JkZXItaW5saW5lLXN0YXJ0LWNvbG9yKTtib3JkZXItaW5saW5lLWVuZC1jb2xvcjp2YXIoLS10YWItYm9yZGVyLWlubGluZS1lbmQtY29sb3IpOy0tdGFiLWJvcmRlci10b3AtY29sb3I6IHZhcigtLXRhYi1ib3JkZXItY29sb3IpOy0tdGFiLWJvcmRlci1pbmxpbmUtc3RhcnQtY29sb3I6IHZhcigtLXRhYi1ib3JkZXItY29sb3IpOy0tdGFiLWJvcmRlci1pbmxpbmUtZW5kLWNvbG9yOiB2YXIoLS10YWItYm9yZGVyLWNvbG9yKTstLXRhYi1ib3JkZXItYm90dG9tLWNvbG9yOiB2YXIoLS1tYW50aW5lLWNvbG9yLWJvZHkpfS5tX2I1OWFiNDdjOndoZXJlKFtkYXRhLWFjdGl2ZV0pW2RhdGEtaW52ZXJ0ZWRdey0tdGFiLWJvcmRlci1ib3R0b20tY29sb3I6IHZhcigtLXRhYi1ib3JkZXItY29sb3IpOy0tdGFiLWJvcmRlci10b3AtY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItYm9keSk7LS10YWItYmVmb3JlLWJvdHRvbTogYXV0bzstLXRhYi1iZWZvcmUtdG9wOiBjYWxjKC0uMDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXRhYi1hZnRlci1ib3R0b206IGF1dG87LS10YWItYWZ0ZXItdG9wOiBjYWxjKC0uMDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKX0ubV9iNTlhYjQ3Yzp3aGVyZShbZGF0YS1hY3RpdmVdKVtkYXRhLW9yaWVudGF0aW9uPXZlcnRpY2FsXVtkYXRhLXBsYWNlbWVudD1sZWZ0XXstLXRhYi1ib3JkZXItaW5saW5lLWVuZC1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci1ib2R5KTstLXRhYi1ib3JkZXItaW5saW5lLXN0YXJ0LWNvbG9yOiB2YXIoLS10YWItYm9yZGVyLWNvbG9yKTstLXRhYi1ib3JkZXItYm90dG9tLWNvbG9yOiB2YXIoLS10YWItYm9yZGVyLWNvbG9yKTstLXRhYi1iZWZvcmUtcmlnaHQ6IGNhbGMoLS4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tdGFiLWJlZm9yZS1sZWZ0OiBhdXRvOy0tdGFiLWJlZm9yZS1ib3R0b206IGF1dG87LS10YWItYmVmb3JlLXRvcDogY2FsYygtLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS10YWItYWZ0ZXItbGVmdDogYXV0bzstLXRhYi1hZnRlci1yaWdodDogY2FsYygtLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSl9W2Rpcj1ydGxdIC5tX2I1OWFiNDdjOndoZXJlKFtkYXRhLWFjdGl2ZV0pW2RhdGEtb3JpZW50YXRpb249dmVydGljYWxdW2RhdGEtcGxhY2VtZW50PWxlZnRdey0tdGFiLWJlZm9yZS1yaWdodDogYXV0bzstLXRhYi1iZWZvcmUtbGVmdDogY2FsYygtLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS10YWItYWZ0ZXItbGVmdDogY2FsYygtLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS10YWItYWZ0ZXItcmlnaHQ6IGF1dG99Lm1fYjU5YWI0N2M6d2hlcmUoW2RhdGEtYWN0aXZlXSlbZGF0YS1vcmllbnRhdGlvbj12ZXJ0aWNhbF1bZGF0YS1wbGFjZW1lbnQ9cmlnaHRdey0tdGFiLWJvcmRlci1pbmxpbmUtc3RhcnQtY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItYm9keSk7LS10YWItYm9yZGVyLWlubGluZS1lbmQtY29sb3I6IHZhcigtLXRhYi1ib3JkZXItY29sb3IpOy0tdGFiLWJvcmRlci1ib3R0b20tY29sb3I6IHZhcigtLXRhYi1ib3JkZXItY29sb3IpOy0tdGFiLWJlZm9yZS1sZWZ0OiBjYWxjKC0uMDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXRhYi1iZWZvcmUtcmlnaHQ6IGF1dG87LS10YWItYmVmb3JlLWJvdHRvbTogYXV0bzstLXRhYi1iZWZvcmUtdG9wOiBjYWxjKC0uMDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXRhYi1hZnRlci1yaWdodDogYXV0bzstLXRhYi1hZnRlci1sZWZ0OiBjYWxjKC0uMDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKX1bZGlyPXJ0bF0gLm1fYjU5YWI0N2M6d2hlcmUoW2RhdGEtYWN0aXZlXSlbZGF0YS1vcmllbnRhdGlvbj12ZXJ0aWNhbF1bZGF0YS1wbGFjZW1lbnQ9cmlnaHRdey0tdGFiLWJlZm9yZS1sZWZ0OiBhdXRvOy0tdGFiLWJlZm9yZS1yaWdodDogY2FsYygtLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS10YWItYWZ0ZXItcmlnaHQ6IGNhbGMoLS4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tdGFiLWFmdGVyLWxlZnQ6IGF1dG99Lm1fYzMzODE5MTR7Ym9yZGVyLXJhZGl1czp2YXIoLS10YWJzLXJhZGl1cyk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS10YWItYmcpO2NvbG9yOnZhcigtLXRhYi1jb2xvcik7LS10YWItYmc6IHRyYW5zcGFyZW50Oy0tdGFiLWNvbG9yOiBpbmhlcml0fUBtZWRpYShob3Zlcjpob3Zlcil7Lm1fYzMzODE5MTQ6bm90KFtkYXRhLWRpc2FibGVkXSk6aG92ZXJ7LS10YWItYmc6IHZhcigtLXRhYi1ob3Zlci1jb2xvcil9fUBtZWRpYShob3Zlcjpub25lKXsubV9jMzM4MTkxNDpub3QoW2RhdGEtZGlzYWJsZWRdKTphY3RpdmV7LS10YWItYmc6IHZhcigtLXRhYi1ob3Zlci1jb2xvcil9fS5tX2MzMzgxOTE0W2RhdGEtYWN0aXZlXVtkYXRhLWFjdGl2ZV17LS10YWItYmc6IHZhcigtLXRhYnMtY29sb3IpOy0tdGFiLWNvbG9yOiB2YXIoLS10YWJzLXRleHQtY29sb3IsIHZhcigtLW1hbnRpbmUtY29sb3Itd2hpdGUpKX1AbWVkaWEoaG92ZXI6aG92ZXIpey5tX2MzMzgxOTE0W2RhdGEtYWN0aXZlXVtkYXRhLWFjdGl2ZV06aG92ZXJ7LS10YWItYmc6IHZhcigtLXRhYnMtY29sb3IpfX1AbWVkaWEoaG92ZXI6bm9uZSl7Lm1fYzMzODE5MTRbZGF0YS1hY3RpdmVdW2RhdGEtYWN0aXZlXTphY3RpdmV7LS10YWItYmc6IHZhcigtLXRhYnMtY29sb3IpfX0ubV83MzQxMzIwZHstLXRpLXNpemUteHM6IGNhbGMoMS4xMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS10aS1zaXplLXNtOiBjYWxjKDEuMzc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tdGktc2l6ZS1tZDogY2FsYygxLjc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tdGktc2l6ZS1sZzogY2FsYygyLjEyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXRpLXNpemUteGw6IGNhbGMoMi43NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXRpLXNpemU6IHZhcigtLXRpLXNpemUtbWQpO2xpbmUtaGVpZ2h0OjE7ZGlzcGxheTppbmxpbmUtZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcjtwb3NpdGlvbjpyZWxhdGl2ZTt1c2VyLXNlbGVjdDpub25lO3dpZHRoOnZhcigtLXRpLXNpemUpO2hlaWdodDp2YXIoLS10aS1zaXplKTttaW4td2lkdGg6dmFyKC0tdGktc2l6ZSk7bWluLWhlaWdodDp2YXIoLS10aS1zaXplKTtib3JkZXItcmFkaXVzOnZhcigtLXRpLXJhZGl1cywgdmFyKC0tbWFudGluZS1yYWRpdXMtZGVmYXVsdCkpO2JhY2tncm91bmQ6dmFyKC0tdGktYmcsIHZhcigtLW1hbnRpbmUtcHJpbWFyeS1jb2xvci1maWxsZWQpKTtjb2xvcjp2YXIoLS10aS1jb2xvciwgdmFyKC0tbWFudGluZS1jb2xvci13aGl0ZSkpO2JvcmRlcjp2YXIoLS10aS1iZCwgMXB4IHNvbGlkIHRyYW5zcGFyZW50KX0ubV80MzY1N2VjZXstLW9mZnNldDogY2FsYyh2YXIoLS10bC1idWxsZXQtc2l6ZSkgLyAyICsgdmFyKC0tdGwtbGluZS13aWR0aCkgLyAyKTstLXRsLWJ1bGxldC1zaXplOiBjYWxjKDEuMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7LS10bC1saW5lLXdpZHRoOiBjYWxjKC4yNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTstLXRsLXJhZGl1czogY2FsYyg2Mi41cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tdGwtY29sb3I6IHZhcigtLW1hbnRpbmUtcHJpbWFyeS1jb2xvci1maWxsZWQpfS5tXzQzNjU3ZWNlOndoZXJlKFtkYXRhLWFsaWduPWxlZnRdKXtwYWRkaW5nLWlubGluZS1zdGFydDp2YXIoLS1vZmZzZXQpfS5tXzQzNjU3ZWNlOndoZXJlKFtkYXRhLWFsaWduPXJpZ2h0XSl7cGFkZGluZy1pbmxpbmUtZW5kOnZhcigtLW9mZnNldCl9Lm1fMmViZTgwOTl7Zm9udC13ZWlnaHQ6dmFyKC0tbWFudGluZS1mb250LXdlaWdodC1tZWRpdW0pO2xpbmUtaGVpZ2h0OjE7bWFyZ2luLWJvdHRvbTpjYWxjKHZhcigtLW1hbnRpbmUtc3BhY2luZy14cykgLyAyKX0ubV80MzYxNzhmZnstLWl0ZW0tYm9yZGVyOiB2YXIoLS10bC1saW5lLXdpZHRoKSB2YXIoLS10bGktYm9yZGVyLXN0eWxlLCBzb2xpZCkgdmFyKC0taXRlbS1ib3JkZXItY29sb3IpO3Bvc2l0aW9uOnJlbGF0aXZlO2NvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItdGV4dCl9Lm1fNDM2MTc4ZmY6YmVmb3Jle2NvbnRlbnQ6IiI7cG9pbnRlci1ldmVudHM6bm9uZTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OnZhcigtLXRpbWVsaW5lLWxpbmUtbGVmdCwgMCk7cmlnaHQ6dmFyKC0tdGltZWxpbmUtbGluZS1yaWdodCwgMCk7Ym90dG9tOmNhbGModmFyKC0tbWFudGluZS1zcGFjaW5nLXhsKSAqIC0xKTtib3JkZXItaW5saW5lLXN0YXJ0OnZhcigtLWl0ZW0tYm9yZGVyKTtkaXNwbGF5OnZhcigtLXRpbWVsaW5lLWxpbmUtZGlzcGxheSwgbm9uZSl9Lm1fNDM2NTdlY2VbZGF0YS1hbGlnbj1sZWZ0XSAubV80MzYxNzhmZjpiZWZvcmV7LS10aW1lbGluZS1saW5lLWxlZnQ6IGNhbGModmFyKC0tdGwtbGluZS13aWR0aCkgKiAtMSk7LS10aW1lbGluZS1saW5lLXJpZ2h0OiBhdXRvfVtkaXI9cnRsXSAubV80MzY1N2VjZVtkYXRhLWFsaWduPWxlZnRdIC5tXzQzNjE3OGZmOmJlZm9yZXstLXRpbWVsaW5lLWxpbmUtbGVmdDogYXV0bzstLXRpbWVsaW5lLWxpbmUtcmlnaHQ6IGNhbGModmFyKC0tdGwtbGluZS13aWR0aCkgKiAtMSl9Lm1fNDM2NTdlY2VbZGF0YS1hbGlnbj1yaWdodF0gLm1fNDM2MTc4ZmY6YmVmb3Jley0tdGltZWxpbmUtbGluZS1sZWZ0OiBhdXRvOy0tdGltZWxpbmUtbGluZS1yaWdodDogY2FsYyh2YXIoLS10bC1saW5lLXdpZHRoKSAqIC0xKX1bZGlyPXJ0bF0gLm1fNDM2NTdlY2VbZGF0YS1hbGlnbj1yaWdodF0gLm1fNDM2MTc4ZmY6YmVmb3Jley0tdGltZWxpbmUtbGluZS1sZWZ0OiBjYWxjKHZhcigtLXRsLWxpbmUtd2lkdGgpICogLTEpOy0tdGltZWxpbmUtbGluZS1yaWdodDogYXV0b30ubV80MzY1N2VjZTp3aGVyZShbZGF0YS1hbGlnbj1sZWZ0XSkgLm1fNDM2MTc4ZmZ7cGFkZGluZy1pbmxpbmUtc3RhcnQ6dmFyKC0tb2Zmc2V0KTt0ZXh0LWFsaWduOmxlZnR9Lm1fNDM2NTdlY2U6d2hlcmUoW2RhdGEtYWxpZ249cmlnaHRdKSAubV80MzYxNzhmZntwYWRkaW5nLWlubGluZS1lbmQ6dmFyKC0tb2Zmc2V0KTt0ZXh0LWFsaWduOnJpZ2h0fTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1saWdodF0pIC5tXzQzNjE3OGZmey0taXRlbS1ib3JkZXItY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS0zKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tXzQzNjE3OGZmey0taXRlbS1ib3JkZXItY29sb3I6IHZhcigtLW1hbnRpbmUtY29sb3ItZGFyay00KX0ubV80MzYxNzhmZjp3aGVyZShbZGF0YS1saW5lLWFjdGl2ZV0pOmJlZm9yZXtib3JkZXItY29sb3I6dmFyKC0tdGxpLWNvbG9yLCB2YXIoLS10bC1jb2xvcikpfS5tXzQzNjE3OGZmOndoZXJlKDpub3QoOmxhc3Qtb2YtdHlwZSkpey0tdGltZWxpbmUtbGluZS1kaXNwbGF5OiBibG9ja30ubV80MzYxNzhmZjp3aGVyZSg6bm90KDpmaXJzdC1vZi10eXBlKSl7bWFyZ2luLXRvcDp2YXIoLS1tYW50aW5lLXNwYWNpbmcteGwpfS5tXzhhZmZjZWUxe3dpZHRoOnZhcigtLXRsLWJ1bGxldC1zaXplKTtoZWlnaHQ6dmFyKC0tdGwtYnVsbGV0LXNpemUpO2JvcmRlci1yYWRpdXM6dmFyKC0tdGxpLXJhZGl1cywgdmFyKC0tdGwtcmFkaXVzKSk7Ym9yZGVyOnZhcigtLXRsLWxpbmUtd2lkdGgpIHNvbGlkO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1ib2R5KTtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7Y29sb3I6dmFyKC0tbWFudGluZS1jb2xvci10ZXh0KX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV84YWZmY2VlMXtib3JkZXItY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTMpfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1kYXJrXSkgLm1fOGFmZmNlZTF7Ym9yZGVyLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGFyay00KX0ubV80MzY1N2VjZTp3aGVyZShbZGF0YS1hbGlnbj1sZWZ0XSkgLm1fOGFmZmNlZTF7bGVmdDpjYWxjKCh2YXIoLS10bC1idWxsZXQtc2l6ZSkgLyAyICsgdmFyKC0tdGwtbGluZS13aWR0aCkgLyAyKSAqIC0xKTtyaWdodDphdXRvfTp3aGVyZShbZGlyPXJ0bF0pIC5tXzQzNjU3ZWNlOndoZXJlKFtkYXRhLWFsaWduPWxlZnRdKSAubV84YWZmY2VlMXtsZWZ0OmF1dG87cmlnaHQ6Y2FsYygodmFyKC0tdGwtYnVsbGV0LXNpemUpIC8gMiArIHZhcigtLXRsLWxpbmUtd2lkdGgpIC8gMikgKiAtMSl9Lm1fNDM2NTdlY2U6d2hlcmUoW2RhdGEtYWxpZ249cmlnaHRdKSAubV84YWZmY2VlMXtsZWZ0OmF1dG87cmlnaHQ6Y2FsYygodmFyKC0tdGwtYnVsbGV0LXNpemUpIC8gMiArIHZhcigtLXRsLWxpbmUtd2lkdGgpIC8gMikgKiAtMSl9OndoZXJlKFtkaXI9cnRsXSkgLm1fNDM2NTdlY2U6d2hlcmUoW2RhdGEtYWxpZ249cmlnaHRdKSAubV84YWZmY2VlMXtsZWZ0OmNhbGMoKHZhcigtLXRsLWJ1bGxldC1zaXplKSAvIDIgKyB2YXIoLS10bC1saW5lLXdpZHRoKSAvIDIpICogLTEpO3JpZ2h0OmF1dG99Lm1fOGFmZmNlZTE6d2hlcmUoW2RhdGEtd2l0aC1jaGlsZF0pe2JvcmRlci13aWR0aDp2YXIoLS10bC1saW5lLXdpZHRoKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV84YWZmY2VlMTp3aGVyZShbZGF0YS13aXRoLWNoaWxkXSl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMyl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdKSAubV84YWZmY2VlMTp3aGVyZShbZGF0YS13aXRoLWNoaWxkXSl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNCl9Lm1fOGFmZmNlZTE6d2hlcmUoW2RhdGEtYWN0aXZlXSl7Ym9yZGVyLWNvbG9yOnZhcigtLXRsaS1jb2xvciwgdmFyKC0tdGwtY29sb3IpKTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3Itd2hpdGUpO2NvbG9yOnZhcigtLXRsLWljb24tY29sb3IsIHZhcigtLW1hbnRpbmUtY29sb3Itd2hpdGUpKX0ubV84YWZmY2VlMTp3aGVyZShbZGF0YS1hY3RpdmVdKTp3aGVyZShbZGF0YS13aXRoLWNoaWxkXSl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS10bGktY29sb3IsIHZhcigtLXRsLWNvbG9yKSk7Y29sb3I6dmFyKC0tdGwtaWNvbi1jb2xvciwgdmFyKC0tbWFudGluZS1jb2xvci13aGl0ZSkpfS5tXzQzNjU3ZWNlOndoZXJlKFtkYXRhLWFsaWduPWxlZnRdKSAubV81NDBlOGY0MXtwYWRkaW5nLWlubGluZS1zdGFydDp2YXIoLS1vZmZzZXQpO3RleHQtYWxpZ246bGVmdH06d2hlcmUoW2Rpcj1ydGxdKSAubV80MzY1N2VjZTp3aGVyZShbZGF0YS1hbGlnbj1sZWZ0XSkgLm1fNTQwZThmNDF7dGV4dC1hbGlnbjpyaWdodH0ubV80MzY1N2VjZTp3aGVyZShbZGF0YS1hbGlnbj1yaWdodF0pIC5tXzU0MGU4ZjQxe3BhZGRpbmctaW5saW5lLWVuZDp2YXIoLS1vZmZzZXQpO3RleHQtYWxpZ246cmlnaHR9OndoZXJlKFtkaXI9cnRsXSkgLm1fNDM2NTdlY2U6d2hlcmUoW2RhdGEtYWxpZ249cmlnaHRdKSAubV81NDBlOGY0MXt0ZXh0LWFsaWduOmxlZnR9Lm1fOGE1ZDEzNTd7bWFyZ2luOjA7Zm9udC13ZWlnaHQ6dmFyKC0tdGl0bGUtZncpO2ZvbnQtc2l6ZTp2YXIoLS10aXRsZS1meik7bGluZS1oZWlnaHQ6dmFyKC0tdGl0bGUtbGgpO2ZvbnQtZmFtaWx5OnZhcigtLW1hbnRpbmUtZm9udC1mYW1pbHktaGVhZGluZ3MpO3RleHQtd3JhcDp2YXIoLS10aXRsZS10ZXh0LXdyYXAsIHZhcigtLW1hbnRpbmUtaGVhZGluZy10ZXh0LXdyYXApKX0ubV84YTVkMTM1Nzp3aGVyZShbZGF0YS1saW5lLWNsYW1wXSl7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTotd2Via2l0LWJveDstd2Via2l0LWxpbmUtY2xhbXA6dmFyKC0tdGl0bGUtbGluZS1jbGFtcCk7LXdlYmtpdC1ib3gtb3JpZW50OnZlcnRpY2FsfS5tX2Y2OThlMTkxey0tbGV2ZWwtb2Zmc2V0OiB2YXIoLS1tYW50aW5lLXNwYWNpbmctbGcpOy0tdHJlZS1saW5lLXdpZHRoOiBjYWxjKC4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0tdHJlZS1saW5lLWNvbG9yOiB2YXIoLS1tYW50aW5lLWNvbG9yLWRlZmF1bHQtYm9yZGVyKTttYXJnaW46MDtwYWRkaW5nOjA7dXNlci1zZWxlY3Q6bm9uZX0ubV83NWYzZWNme21hcmdpbjowO3BhZGRpbmc6MH0ubV9mNjk3MGViMXtjdXJzb3I6cG9pbnRlcjtsaXN0LXN0eWxlOm5vbmU7bWFyZ2luOjA7cGFkZGluZzowO291dGxpbmU6MH0ubV9mNjk3MGViMTpmb2N1cy12aXNpYmxlPi5tX2RjMjgzNDI1e291dGxpbmU6MnB4IHNvbGlkIHZhcigtLW1hbnRpbmUtcHJpbWFyeS1jb2xvci1maWxsZWQpO291dGxpbmUtb2Zmc2V0OmNhbGMoLjEyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKX0ubV9kYzI4MzQyNXtwb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nLWlubGluZS1zdGFydDp2YXIoLS1sYWJlbC1vZmZzZXQpfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1saWdodF0pIC5tX2RjMjgzNDI1OndoZXJlKFtkYXRhLXNlbGVjdGVkXSl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMSl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdKSAubV9kYzI4MzQyNTp3aGVyZShbZGF0YS1zZWxlY3RlZF0pe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTUpfS5tX2RjMjgzNDI1OndoZXJlKFtkYXRhLWRyYWdnaW5nXSl7b3BhY2l0eTouNH0ubV9kYzI4MzQyNTp3aGVyZShbZGF0YS1kcmFnLW92ZXI9YmVmb3JlXSk6YmVmb3Jle2NvbnRlbnQ6IiI7cG9zaXRpb246YWJzb2x1dGU7dG9wOmNhbGMoLS4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpO2luc2V0LWlubGluZS1zdGFydDp2YXIoLS1sYWJlbC1vZmZzZXQsIDApO2luc2V0LWlubGluZS1lbmQ6MDtoZWlnaHQ6Y2FsYyguMTI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpO2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1wcmltYXJ5LWNvbG9yLWZpbGxlZCk7cG9pbnRlci1ldmVudHM6bm9uZTt6LWluZGV4OjF9Lm1fZGMyODM0MjU6d2hlcmUoW2RhdGEtZHJhZy1vdmVyPWFmdGVyXSk6YWZ0ZXJ7Y29udGVudDoiIjtwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206Y2FsYygtLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7aW5zZXQtaW5saW5lLXN0YXJ0OnZhcigtLWxhYmVsLW9mZnNldCwgMCk7aW5zZXQtaW5saW5lLWVuZDowO2hlaWdodDpjYWxjKC4xMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLXByaW1hcnktY29sb3ItZmlsbGVkKTtwb2ludGVyLWV2ZW50czpub25lO3otaW5kZXg6MX0ubV9kYzI4MzQyNTp3aGVyZShbZGF0YS1kcmFnLW92ZXI9aW5zaWRlXSl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLXByaW1hcnktY29sb3ItbGlnaHQpfTp3aGVyZShbZGF0YS13aXRoLWxpbmVzXSkgLm1fZjY5NzBlYjF7cG9zaXRpb246cmVsYXRpdmV9OndoZXJlKFtkYXRhLXdpdGgtbGluZXNdKSAubV83NWYzZWNmPi5tX2Y2OTcwZWIxOmJlZm9yZXtjb250ZW50OiIiO3Bvc2l0aW9uOmFic29sdXRlO3RvcDpjYWxjKC43NXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTtpbnNldC1pbmxpbmUtc3RhcnQ6Y2FsYyh2YXIoLS1sYWJlbC1vZmZzZXQpIC0gdmFyKC0tbGV2ZWwtb2Zmc2V0KSAvIDIpO3dpZHRoOmNhbGModmFyKC0tbGV2ZWwtb2Zmc2V0KSAvIDIpO2hlaWdodDowO2JvcmRlci10b3A6dmFyKC0tdHJlZS1saW5lLXdpZHRoKSBzb2xpZCB2YXIoLS10cmVlLWxpbmUtY29sb3IpO3BvaW50ZXItZXZlbnRzOm5vbmV9OndoZXJlKFtkYXRhLXdpdGgtbGluZXNdKSAubV83NWYzZWNmPi5tX2Y2OTcwZWIxOmFmdGVye2NvbnRlbnQ6IiI7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7aW5zZXQtaW5saW5lLXN0YXJ0OmNhbGModmFyKC0tbGFiZWwtb2Zmc2V0KSAtIHZhcigtLWxldmVsLW9mZnNldCkgLyAyKTt3aWR0aDowO2JvcmRlci1pbmxpbmUtc3RhcnQ6dmFyKC0tdHJlZS1saW5lLXdpZHRoKSBzb2xpZCB2YXIoLS10cmVlLWxpbmUtY29sb3IpO3BvaW50ZXItZXZlbnRzOm5vbmV9OndoZXJlKFtkYXRhLXdpdGgtbGluZXNdKSAubV83NWYzZWNmPi5tX2Y2OTcwZWIxOmxhc3QtY2hpbGQ6YWZ0ZXJ7Ym90dG9tOmF1dG87aGVpZ2h0OmNhbGMoLjc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpfS5tX2QwOGNhYTAgOmZpcnN0LWNoaWxke21hcmdpbi10b3A6MH0ubV9kMDhjYWEwIDpsYXN0LWNoaWxke21hcmdpbi1ib3R0b206MH0ubV9kMDhjYWEwIDp3aGVyZShoMSxoMixoMyxoNCxoNSxoNil7bWFyZ2luLWJvdHRvbTp2YXIoLS1tYW50aW5lLXNwYWNpbmcteHMpO3RleHQtd3JhcDp2YXIoLS1tYW50aW5lLWhlYWRpbmctdGV4dC13cmFwKTtmb250LWZhbWlseTp2YXIoLS1tYW50aW5lLWZvbnQtZmFtaWx5LWhlYWRpbmdzKX0ubV9kMDhjYWEwIDp3aGVyZShoMSl7bWFyZ2luLXRvcDpjYWxjKDEuNSAqIHZhcigtLW1hbnRpbmUtc3BhY2luZy14bCkpO2ZvbnQtc2l6ZTp2YXIoLS1tYW50aW5lLWgxLWZvbnQtc2l6ZSk7bGluZS1oZWlnaHQ6dmFyKC0tbWFudGluZS1oMS1saW5lLWhlaWdodCk7Zm9udC13ZWlnaHQ6dmFyKC0tbWFudGluZS1oMS1mb250LXdlaWdodCl9Lm1fZDA4Y2FhMCA6d2hlcmUoaDIpe21hcmdpbi10b3A6dmFyKC0tbWFudGluZS1zcGFjaW5nLXhsKTtmb250LXNpemU6dmFyKC0tbWFudGluZS1oMi1mb250LXNpemUpO2xpbmUtaGVpZ2h0OnZhcigtLW1hbnRpbmUtaDItbGluZS1oZWlnaHQpO2ZvbnQtd2VpZ2h0OnZhcigtLW1hbnRpbmUtaDItZm9udC13ZWlnaHQpfS5tX2QwOGNhYTAgOndoZXJlKGgzKXttYXJnaW4tdG9wOmNhbGMoLjggKiB2YXIoLS1tYW50aW5lLXNwYWNpbmcteGwpKTtmb250LXNpemU6dmFyKC0tbWFudGluZS1oMy1mb250LXNpemUpO2xpbmUtaGVpZ2h0OnZhcigtLW1hbnRpbmUtaDMtbGluZS1oZWlnaHQpO2ZvbnQtd2VpZ2h0OnZhcigtLW1hbnRpbmUtaDMtZm9udC13ZWlnaHQpfS5tX2QwOGNhYTAgOndoZXJlKGg0KXttYXJnaW4tdG9wOmNhbGMoLjggKiB2YXIoLS1tYW50aW5lLXNwYWNpbmcteGwpKTtmb250LXNpemU6dmFyKC0tbWFudGluZS1oNC1mb250LXNpemUpO2xpbmUtaGVpZ2h0OnZhcigtLW1hbnRpbmUtaDQtbGluZS1oZWlnaHQpO2ZvbnQtd2VpZ2h0OnZhcigtLW1hbnRpbmUtaDQtZm9udC13ZWlnaHQpfS5tX2QwOGNhYTAgOndoZXJlKGg1KXttYXJnaW4tdG9wOmNhbGMoLjUgKiB2YXIoLS1tYW50aW5lLXNwYWNpbmcteGwpKTtmb250LXNpemU6dmFyKC0tbWFudGluZS1oNS1mb250LXNpemUpO2xpbmUtaGVpZ2h0OnZhcigtLW1hbnRpbmUtaDUtbGluZS1oZWlnaHQpO2ZvbnQtd2VpZ2h0OnZhcigtLW1hbnRpbmUtaDUtZm9udC13ZWlnaHQpfS5tX2QwOGNhYTAgOndoZXJlKGg2KXttYXJnaW4tdG9wOmNhbGMoLjUgKiB2YXIoLS1tYW50aW5lLXNwYWNpbmcteGwpKTtmb250LXNpemU6dmFyKC0tbWFudGluZS1oNi1mb250LXNpemUpO2xpbmUtaGVpZ2h0OnZhcigtLW1hbnRpbmUtaDYtbGluZS1oZWlnaHQpO2ZvbnQtd2VpZ2h0OnZhcigtLW1hbnRpbmUtaDYtZm9udC13ZWlnaHQpfS5tX2QwOGNhYTAgOndoZXJlKGltZyl7bWF4LXdpZHRoOjEwMCU7bWFyZ2luLWJvdHRvbTp2YXIoLS1tYW50aW5lLXNwYWNpbmcteHMpfS5tX2QwOGNhYTAgOndoZXJlKHApe21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOnZhcigtLW1hbnRpbmUtc3BhY2luZy1sZyl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fZDA4Y2FhMCA6d2hlcmUobWFyayl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLXllbGxvdy0yKTtjb2xvcjppbmhlcml0fTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1kYXJrXSkgLm1fZDA4Y2FhMCA6d2hlcmUobWFyayl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLXllbGxvdy01KTtjb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWJsYWNrKX0ubV9kMDhjYWEwIDp3aGVyZShhKXtjb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWFuY2hvcik7dGV4dC1kZWNvcmF0aW9uOm5vbmV9QG1lZGlhKGhvdmVyOmhvdmVyKXsubV9kMDhjYWEwIDp3aGVyZShhKTpob3Zlcnt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lfX1AbWVkaWEoaG92ZXI6bm9uZSl7Lm1fZDA4Y2FhMCA6d2hlcmUoYSk6YWN0aXZle3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmV9fS5tX2QwOGNhYTAgOndoZXJlKGhyKXttYXJnaW4tdG9wOnZhcigtLW1hbnRpbmUtc3BhY2luZy1tZCk7bWFyZ2luLWJvdHRvbTp2YXIoLS1tYW50aW5lLXNwYWNpbmctbWQpO2JvcmRlcjowO2JvcmRlci10b3A6Y2FsYyguMDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSBzb2xpZH06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9bGlnaHRdKSAubV9kMDhjYWEwIDp3aGVyZShocil7Ym9yZGVyLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS0zKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tX2QwOGNhYTAgOndoZXJlKGhyKXtib3JkZXItY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTMpfS5tX2QwOGNhYTAgOndoZXJlKHByZSl7cGFkZGluZzp2YXIoLS1tYW50aW5lLXNwYWNpbmcteHMpO2xpbmUtaGVpZ2h0OnZhcigtLW1hbnRpbmUtbGluZS1oZWlnaHQpO21hcmdpbjowO21hcmdpbi10b3A6dmFyKC0tbWFudGluZS1zcGFjaW5nLW1kKTttYXJnaW4tYm90dG9tOnZhcigtLW1hbnRpbmUtc3BhY2luZy1tZCk7b3ZlcmZsb3cteDphdXRvO2ZvbnQtZmFtaWx5OnZhcigtLW1hbnRpbmUtZm9udC1mYW1pbHktbW9ub3NwYWNlKTtmb250LXNpemU6dmFyKC0tbWFudGluZS1mb250LXNpemUteHMpO2JvcmRlci1yYWRpdXM6dmFyKC0tbWFudGluZS1yYWRpdXMtc20pfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1saWdodF0pIC5tX2QwOGNhYTAgOndoZXJlKHByZSl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMCl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdKSAubV9kMDhjYWEwIDp3aGVyZShwcmUpe2JhY2tncm91bmQtY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1kYXJrLTgpfS5tX2QwOGNhYTAgOndoZXJlKHByZSkgOndoZXJlKGNvZGUpe2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7cGFkZGluZzowO2JvcmRlci1yYWRpdXM6MDtjb2xvcjppbmhlcml0O2JvcmRlcjowfS5tX2QwOGNhYTAgOndoZXJlKGtiZCl7LS1rYmQtZno6IGNhbGMoLjc1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpOy0ta2JkLXBhZGRpbmc6IGNhbGMoLjE4NzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkgY2FsYyguMzEyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKTtmb250LWZhbWlseTp2YXIoLS1tYW50aW5lLWZvbnQtZmFtaWx5LW1vbm9zcGFjZSk7bGluZS1oZWlnaHQ6dmFyKC0tbWFudGluZS1saW5lLWhlaWdodCk7Zm9udC13ZWlnaHQ6dmFyKC0tbWFudGluZS1mb250LXdlaWdodC1ib2xkKTtwYWRkaW5nOnZhcigtLWtiZC1wYWRkaW5nKTtmb250LXNpemU6dmFyKC0ta2JkLWZ6KTtib3JkZXItcmFkaXVzOnZhcigtLW1hbnRpbmUtcmFkaXVzLXNtKTtib3JkZXI6Y2FsYyguMDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSBzb2xpZDtib3JkZXItYm90dG9tLXdpZHRoOmNhbGMoLjE4NzVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fZDA4Y2FhMCA6d2hlcmUoa2JkKXtib3JkZXItY29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTMpO2NvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS03KTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZ3JheS0wKX06d2hlcmUoW2RhdGEtbWFudGluZS1jb2xvci1zY2hlbWU9ZGFya10pIC5tX2QwOGNhYTAgOndoZXJlKGtiZCl7Ym9yZGVyLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGFyay0zKTtjb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstMCk7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNSl9Lm1fZDA4Y2FhMCA6d2hlcmUoY29kZSl7bGluZS1oZWlnaHQ6dmFyKC0tbWFudGluZS1saW5lLWhlaWdodCk7cGFkZGluZzpjYWxjKC4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpIGNhbGMoLjMxMjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSk7Ym9yZGVyLXJhZGl1czp2YXIoLS1tYW50aW5lLXJhZGl1cy1zbSk7Zm9udC1mYW1pbHk6dmFyKC0tbWFudGluZS1mb250LWZhbWlseS1tb25vc3BhY2UpO2ZvbnQtc2l6ZTp2YXIoLS1tYW50aW5lLWZvbnQtc2l6ZS14cyl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fZDA4Y2FhMCA6d2hlcmUoY29kZSl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMCk7Y29sb3I6dmFyKC0tbWFudGluZS1jb2xvci1ibGFjayl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdKSAubV9kMDhjYWEwIDp3aGVyZShjb2RlKXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGFyay01KTtjb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLXdoaXRlKX0ubV9kMDhjYWEwIDp3aGVyZSh1bCxvbCk6bm90KFtkYXRhLXR5cGU9dGFza0xpc3RdKXttYXJnaW4tYm90dG9tOnZhcigtLW1hbnRpbmUtc3BhY2luZy1tZCk7cGFkZGluZy1pbmxpbmUtc3RhcnQ6dmFyKC0tbWFudGluZS1zcGFjaW5nLXhsKTtsaXN0LXN0eWxlLXBvc2l0aW9uOm91dHNpZGV9Lm1fZDA4Y2FhMCA6d2hlcmUodGFibGUpe3dpZHRoOjEwMCU7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO2NhcHRpb24tc2lkZTpib3R0b207bWFyZ2luLWJvdHRvbTp2YXIoLS1tYW50aW5lLXNwYWNpbmctbWQpfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1saWdodF0pIC5tX2QwOGNhYTAgOndoZXJlKHRhYmxlKXstLXRhYmxlLWJvcmRlci1jb2xvcjogdmFyKC0tbWFudGluZS1jb2xvci1ncmF5LTMpfTp3aGVyZShbZGF0YS1tYW50aW5lLWNvbG9yLXNjaGVtZT1kYXJrXSkgLm1fZDA4Y2FhMCA6d2hlcmUodGFibGUpey0tdGFibGUtYm9yZGVyLWNvbG9yOiB2YXIoLS1tYW50aW5lLWNvbG9yLWRhcmstNCl9Lm1fZDA4Y2FhMCA6d2hlcmUodGFibGUpIDp3aGVyZShjYXB0aW9uKXttYXJnaW4tdG9wOnZhcigtLW1hbnRpbmUtc3BhY2luZy14cyk7Zm9udC1zaXplOnZhcigtLW1hbnRpbmUtZm9udC1zaXplLXNtKTtjb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWRpbW1lZCl9Lm1fZDA4Y2FhMCA6d2hlcmUodGFibGUpIDp3aGVyZSh0aCl7dGV4dC1hbGlnbjpsZWZ0O2ZvbnQtd2VpZ2h0OjcwMDtmb250LXNpemU6dmFyKC0tbWFudGluZS1mb250LXNpemUtc20pO3BhZGRpbmc6dmFyKC0tbWFudGluZS1zcGFjaW5nLXhzKSB2YXIoLS1tYW50aW5lLXNwYWNpbmctc20pfS5tX2QwOGNhYTAgOndoZXJlKHRhYmxlKSA6d2hlcmUodGhlYWQgdGgpe2JvcmRlci1ib3R0b206Y2FsYyguMDYyNXJlbSAqIHZhcigtLW1hbnRpbmUtc2NhbGUpKSBzb2xpZDtib3JkZXItY29sb3I6dmFyKC0tdGFibGUtYm9yZGVyLWNvbG9yKX0ubV9kMDhjYWEwIDp3aGVyZSh0YWJsZSkgOndoZXJlKHRmb290IHRoKXtib3JkZXItdG9wOmNhbGMoLjA2MjVyZW0gKiB2YXIoLS1tYW50aW5lLXNjYWxlKSkgc29saWQ7Ym9yZGVyLWNvbG9yOnZhcigtLXRhYmxlLWJvcmRlci1jb2xvcil9Lm1fZDA4Y2FhMCA6d2hlcmUodGFibGUpIDp3aGVyZSh0ZCl7cGFkZGluZzp2YXIoLS1tYW50aW5lLXNwYWNpbmcteHMpIHZhcigtLW1hbnRpbmUtc3BhY2luZy1zbSk7Ym9yZGVyLWJvdHRvbTpjYWxjKC4wNjI1cmVtICogdmFyKC0tbWFudGluZS1zY2FsZSkpIHNvbGlkO2JvcmRlci1jb2xvcjp2YXIoLS10YWJsZS1ib3JkZXItY29sb3IpO2ZvbnQtc2l6ZTp2YXIoLS1tYW50aW5lLWZvbnQtc2l6ZS1zbSl9Lm1fZDA4Y2FhMCA6d2hlcmUodGFibGUpIDp3aGVyZSh0cjpsYXN0LW9mLXR5cGUgdGQpe2JvcmRlci1ib3R0b206MH0ubV9kMDhjYWEwIDp3aGVyZShibG9ja3F1b3RlKXtmb250LXNpemU6dmFyKC0tbWFudGluZS1mb250LXNpemUtbGcpO2xpbmUtaGVpZ2h0OnZhcigtLW1hbnRpbmUtbGluZS1oZWlnaHQpO21hcmdpbjp2YXIoLS1tYW50aW5lLXNwYWNpbmctbWQpIDA7Ym9yZGVyLXJhZGl1czp2YXIoLS1tYW50aW5lLXJhZGl1cy1zbSk7cGFkZGluZzp2YXIoLS1tYW50aW5lLXNwYWNpbmctbWQpIHZhcigtLW1hbnRpbmUtc3BhY2luZy1sZyl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWxpZ2h0XSkgLm1fZDA4Y2FhMCA6d2hlcmUoYmxvY2txdW90ZSl7YmFja2dyb3VuZC1jb2xvcjp2YXIoLS1tYW50aW5lLWNvbG9yLWdyYXktMCl9OndoZXJlKFtkYXRhLW1hbnRpbmUtY29sb3Itc2NoZW1lPWRhcmtdKSAubV9kMDhjYWEwIDp3aGVyZShibG9ja3F1b3RlKXtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLW1hbnRpbmUtY29sb3ItZGFyay04KX06cm9vdHstLWJnOiAjZWVmM2VmOy0tcGFuZWw6ICNmYmZkZmI7LS1wYW5lbC1zdHJvbmc6ICNmM2Y3ZjM7LS10ZXh0OiAjMTAxMzEyOy0tbXV0ZWQ6ICM1ZDY2NjE7LS1mYWludDogIzg3OTI4YjstLWxpbmU6ICNkN2RlZDg7LS1saW5lLXN0cm9uZzogIzlhYTlhMDstLWFjY2VudDogIzBmNzY2ZTstLWFjY2VudC1kYXJrOiAjMDczZjNiOy0tc2lnbmFsOiAjYTE2MjA3Oy0tZGFuZ2VyOiAjYjQyMzE4Oy0tc2hhZG93OiAwIDFweCAycHggY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLXRleHQpIDYlLCB0cmFuc3BhcmVudCk7LS10cmVlLXJhaWw6ICNjZGQ4ZDF9Kntib3gtc2l6aW5nOmJvcmRlci1ib3h9Ym9keXttYXJnaW46MDtiYWNrZ3JvdW5kOnZhcigtLWJnKTtjb2xvcjp2YXIoLS10ZXh0KTtmb250LWZhbWlseTpHZWlzdCxTb2huZSxJQk0gUGxleCBTYW5zLHVpLXNhbnMtc2VyaWYsc3lzdGVtLXVpLHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9aHRtbCxib2R5e21pbi1oZWlnaHQ6MTAwJX1tYWlue3dpZHRoOjEwMCU7bWluLWhlaWdodDoxMDB2aDttYXJnaW46MDtwYWRkaW5nOjE0cHh9LmxvY2stc2hlbGx7bWF4LXdpZHRoOjkyMHB4O21hcmdpbjowIGF1dG87ZGlzcGxheTpncmlkO2FsaWduLWNvbnRlbnQ6c3RhcnQ7Z2FwOjEwcHh9LmxvY2stcGFuZWx7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1saW5lKTtib3JkZXItcmFkaXVzOjhweDtiYWNrZ3JvdW5kOnZhcigtLXBhbmVsKTtwYWRkaW5nOjE4cHg7Ym94LXNoYWRvdzp2YXIoLS1zaGFkb3cpfS51bmxvY2stZm9ybXtkaXNwbGF5OmdyaWQ7Z2FwOjEycHg7bWF4LXdpZHRoOjUyMHB4O21hcmdpbi10b3A6MTZweH1he2NvbG9yOmluaGVyaXR9LnRvcGJhciwuc2VjdGlvbi1oZWFkLC5zaWRlLWhlYWQsLmRldGFpbC1oZWFke2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47Z2FwOjEycHh9LnRvcGJhcnttYXJnaW4tYm90dG9tOjEwcHh9LmJyYW5ke2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjEwcHg7Zm9udC13ZWlnaHQ6NzIwO2xldHRlci1zcGFjaW5nOjB9Lm1hcmt7d2lkdGg6MjZweDtoZWlnaHQ6MjZweDtib3JkZXItcmFkaXVzOjdweDtiYWNrZ3JvdW5kOnZhcigtLWFjY2VudC1kYXJrKTtjb2xvcjojZmZmO2Rpc3BsYXk6Z3JpZDtwbGFjZS1pdGVtczpjZW50ZXI7Zm9udC1zaXplOjEycHh9bmF2e2Rpc3BsYXk6ZmxleDtnYXA6NHB4O2JhY2tncm91bmQ6dmFyKC0tcGFuZWwpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tbGluZSk7Ym9yZGVyLXJhZGl1czo4cHg7cGFkZGluZzo0cHg7Ym94LXNoYWRvdzp2YXIoLS1zaGFkb3cpfW5hdiBhLC50YWJ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7cGFkZGluZzo3cHggMTFweDtib3JkZXItcmFkaXVzOjZweDtjb2xvcjp2YXIoLS1tdXRlZCk7Zm9udC1zaXplOjEzcHh9bmF2IGE6aG92ZXIsLnRhYjpob3ZlcntiYWNrZ3JvdW5kOnZhcigtLXBhbmVsLXN0cm9uZyk7Y29sb3I6dmFyKC0tdGV4dCl9Lmhlcm97Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1saW5lKTtiYWNrZ3JvdW5kOnZhcigtLXBhbmVsKTtib3JkZXItcmFkaXVzOjhweDtib3gtc2hhZG93OnZhcigtLXNoYWRvdyk7cGFkZGluZzoxMnB4O21hcmdpbi1ib3R0b206MTBweH1oMXtmb250LXNpemU6MjRweDtsaW5lLWhlaWdodDoxLjE7bWFyZ2luOjAgMCA2cHg7bGV0dGVyLXNwYWNpbmc6MH1oMntmb250LXNpemU6MTVweDttYXJnaW46MCAwIDhweDtsZXR0ZXItc3BhY2luZzowfWgze2ZvbnQtc2l6ZToxM3B4O21hcmdpbjowIDAgMTBweDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7bGV0dGVyLXNwYWNpbmc6MDtjb2xvcjp2YXIoLS1tdXRlZCl9cHttYXJnaW46MCAwIDEwcHh9Lm11dGVke2NvbG9yOnZhcigtLW11dGVkKX0ubW9ubyxjb2Rle2ZvbnQtZmFtaWx5OkdlaXN0IE1vbm8sU0ZNb25vLVJlZ3VsYXIsQ29uc29sYXMsbW9ub3NwYWNlO2ZvbnQtc2l6ZToxMnB4fWNvZGV7YmFja2dyb3VuZDojZTVlY2U3O2JvcmRlcjoxcHggc29saWQgdmFyKC0tbGluZSk7Ym9yZGVyLXJhZGl1czo2cHg7cGFkZGluZzoycHggNXB4fS5zdGF0c3tkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOnJlcGVhdCg1LG1pbm1heCgwLDFmcikpO2dhcDo4cHh9LnN0YXQsc2VjdGlvbntib3JkZXI6MXB4IHNvbGlkIHZhcigtLWxpbmUpO2JhY2tncm91bmQ6dmFyKC0tcGFuZWwpfS5zdGF0e2JvcmRlci1yYWRpdXM6OHB4O3BhZGRpbmc6MTNweDttaW4td2lkdGg6MH0uc3RhdCBie2Rpc3BsYXk6YmxvY2s7Zm9udC1zaXplOjEycHg7Y29sb3I6dmFyKC0tbXV0ZWQpO21hcmdpbi1ib3R0b206OHB4fS5zdGF0IHNwYW57ZGlzcGxheTpibG9jaztvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczt3aGl0ZS1zcGFjZTpub3dyYXB9c2VjdGlvbntib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjEycHg7bWFyZ2luOjEwcHggMDtib3gtc2hhZG93OnZhcigtLXNoYWRvdyl9LndvcmtzcGFjZXtkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOm1pbm1heCgyNjBweCwyMnZ3KSBtaW5tYXgoMCwxZnIpO2dhcDoxMHB4O2FsaWduLWl0ZW1zOnN0YXJ0fS5zaWRlLC5kZXRhaWx7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1saW5lKTtib3JkZXItcmFkaXVzOjhweDtiYWNrZ3JvdW5kOnZhcigtLXBhbmVsKTttaW4td2lkdGg6MH0uc2lkZXtvdmVyZmxvdzpoaWRkZW59LnNpZGUtaGVhZCwuZGV0YWlsLWhlYWR7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tbGluZSk7cGFkZGluZzoxMnB4fS50cmVle3BhZGRpbmc6OHB4IDEwcHggMTJweDttYXgtaGVpZ2h0OmNhbGMoMTAwdmggLSAzMzBweCk7b3ZlcmZsb3c6YXV0b30uZm9sZGVye21hcmdpbjoxcHggMH1zdW1tYXJ5e2N1cnNvcjpwb2ludGVyO2NvbG9yOnZhcigtLW11dGVkKTtmb250LXdlaWdodDo2NTA7Ym9yZGVyLXJhZGl1czo2cHg7bGlzdC1zdHlsZTpub25lfXN1bW1hcnk6Oi13ZWJraXQtZGV0YWlscy1tYXJrZXJ7ZGlzcGxheTpub25lfS50cmVlLXJvdzpob3ZlcntiYWNrZ3JvdW5kOnZhcigtLXBhbmVsLXN0cm9uZyl9LnRyZWUtcm93e3dpZHRoOjEwMCU7ZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczoxNHB4IDI4cHggbWlubWF4KDAsMWZyKSBhdXRvO2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NnB4O21pbi1oZWlnaHQ6MzFweDtwYWRkaW5nOjVweCA3cHg7Ym9yZGVyLXJhZGl1czo2cHh9LnRyZWUtY2hpbGRyZW57bWFyZ2luLWxlZnQ6MTNweDtwYWRkaW5nLWxlZnQ6MTJweDtib3JkZXItbGVmdDoxcHggc29saWQgdmFyKC0tdHJlZS1yYWlsKX0uZm9sZGVyLm9wZW4+c3VtbWFyeXtjb2xvcjp2YXIoLS10ZXh0KX0udHJlZS1jYXJldHtjb2xvcjp2YXIoLS1mYWludCk7Zm9udC1mYW1pbHk6R2Vpc3QgTW9ubyxtb25vc3BhY2U7Zm9udC1zaXplOjEwcHg7dGV4dC1hbGlnbjpjZW50ZXJ9LmZvbGRlci1pY29uLC5maWxlLWljb257ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MjhweDtjb2xvcjp2YXIoLS1mYWludCk7Zm9udC1mYW1pbHk6R2Vpc3QgTW9ubyxtb25vc3BhY2U7Zm9udC1zaXplOjExcHh9LmZpbGV7Ym9yZGVyOjA7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjp2YXIoLS10ZXh0KTt0ZXh0LWFsaWduOmxlZnR9LmZvbGRlci1uYW1lLC5maWxlLW5hbWV7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7d2hpdGUtc3BhY2U6bm93cmFwfS5maWxlIHNtYWxse2NvbG9yOnZhcigtLW11dGVkKTtmb250LXNpemU6MTFweH0uZmlsZS5hY3RpdmV7YmFja2dyb3VuZDp2YXIoLS1hY2NlbnQtZGFyayk7Y29sb3I6I2ZmZn0uZmlsZS5hY3RpdmUgc21hbGwsLmZpbGUuYWN0aXZlIC5maWxlLWljb257Y29sb3I6I2Q3ZGVkOH0udHJlZS1jb3VudHttaW4td2lkdGg6MjRweDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWxpbmUpO2JvcmRlci1yYWRpdXM6NXB4O3BhZGRpbmc6MXB4IDZweDtiYWNrZ3JvdW5kOnZhcigtLXBhbmVsKTtjb2xvcjp2YXIoLS1tdXRlZCk7Zm9udC1mYW1pbHk6R2Vpc3QgTW9ubyxtb25vc3BhY2U7Zm9udC1zaXplOjEwcHg7dGV4dC1hbGlnbjpjZW50ZXJ9LnRhYnN7ZGlzcGxheTpmbGV4O2dhcDo2cHg7YWxpZ24taXRlbXM6Y2VudGVyfS5oZWFkZXItYWN0aW9uc3tkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpmbGV4LWVuZDtnYXA6OHB4O2ZsZXgtd3JhcDp3cmFwfS50YWJ7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1saW5lKTtiYWNrZ3JvdW5kOnZhcigtLXBhbmVsKTtjdXJzb3I6cG9pbnRlcn0udGFiLmFjdGl2ZXtiYWNrZ3JvdW5kOnZhcigtLWFjY2VudC1kYXJrKTtjb2xvcjojZmZmO2JvcmRlci1jb2xvcjp2YXIoLS1hY2NlbnQtZGFyayl9LnNlYXJjaHtkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciBhdXRvO2dhcDo4cHg7bWFyZ2luOjEwcHggMH0uZ3JpZHtkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOnJlcGVhdChhdXRvLWZpdCxtaW5tYXgoMjYwcHgsMWZyKSk7Z2FwOjEycHh9bGFiZWx7ZGlzcGxheTpncmlkO2dhcDo2cHg7bWFyZ2luOjEwcHggMDtmb250LXdlaWdodDo2NTA7Y29sb3I6dmFyKC0tbXV0ZWQpO2ZvbnQtc2l6ZToxMnB4fWlucHV0LHRleHRhcmVhLHNlbGVjdHt3aWR0aDoxMDAlO2ZvbnQ6aW5oZXJpdDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWxpbmUtc3Ryb25nKTtib3JkZXItcmFkaXVzOjZweDtiYWNrZ3JvdW5kOnZhcigtLXBhbmVsKTtwYWRkaW5nOjEwcHg7b3V0bGluZTpub25lfWlucHV0OmZvY3VzLHRleHRhcmVhOmZvY3VzLHNlbGVjdDpmb2N1c3tib3JkZXItY29sb3I6dmFyKC0tYWNjZW50KTtib3gtc2hhZG93OjAgMCAwIDNweCBjb2xvci1taXgoaW4gc3JnYix2YXIoLS1hY2NlbnQpIDE4JSx0cmFuc3BhcmVudCl9dGV4dGFyZWF7bWluLWhlaWdodDoxMjBweDtyZXNpemU6dmVydGljYWx9YnV0dG9ue2Rpc3BsYXk6aW5saW5lLWZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1hY2NlbnQtZGFyayk7Ym9yZGVyLXJhZGl1czo2cHg7YmFja2dyb3VuZDp2YXIoLS1hY2NlbnQtZGFyayk7Y29sb3I6I2ZmZjtmb250LXdlaWdodDo3MDA7cGFkZGluZzo5cHggMTJweDtjdXJzb3I6cG9pbnRlcn1idXR0b24uZ2hvc3R7YmFja2dyb3VuZDp2YXIoLS1wYW5lbCk7Y29sb3I6dmFyKC0tYWNjZW50LWRhcmspO2JvcmRlci1jb2xvcjp2YXIoLS1saW5lLXN0cm9uZyl9YnV0dG9uLmRhbmdlcntiYWNrZ3JvdW5kOnZhcigtLWRhbmdlcik7Ym9yZGVyLWNvbG9yOnZhcigtLWRhbmdlcil9YnV0dG9uOmRpc2FibGVke2N1cnNvcjp3YWl0O29wYWNpdHk6LjYyfS5hY3Rpb25ze2Rpc3BsYXk6ZmxleDtnYXA6OHB4O2ZsZXgtd3JhcDp3cmFwO2FsaWduLWl0ZW1zOmNlbnRlcn10YWJsZXt3aWR0aDoxMDAlO2JvcmRlci1jb2xsYXBzZTpzZXBhcmF0ZTtib3JkZXItc3BhY2luZzowfXRkLHRoe2JvcmRlci10b3A6MXB4IHNvbGlkIHZhcigtLWxpbmUpO3BhZGRpbmc6OXB4O3RleHQtYWxpZ246bGVmdDt2ZXJ0aWNhbC1hbGlnbjp0b3B9dGh7Zm9udC1zaXplOjExcHg7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlO2xldHRlci1zcGFjaW5nOjA7Y29sb3I6dmFyKC0tbXV0ZWQpO2JhY2tncm91bmQ6dmFyKC0tcGFuZWwtc3Ryb25nKX0udGFnLC5zdGF0dXN7ZGlzcGxheTppbmxpbmUtZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1saW5lKTtib3JkZXItcmFkaXVzOjk5OXB4O3BhZGRpbmc6M3B4IDdweDttYXJnaW46MCA0cHggNHB4IDA7Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NjUwO2JhY2tncm91bmQ6dmFyKC0tcGFuZWwtc3Ryb25nKTtjb2xvcjp2YXIoLS1tdXRlZCl9LnN0YXR1cy5vbntiYWNrZ3JvdW5kOiNlOGYzZWU7Y29sb3I6dmFyKC0tYWNjZW50LWRhcmspO2JvcmRlci1jb2xvcjojYjlkOGNjfS5zdGF0dXMub2Zme2JhY2tncm91bmQ6I2VkZjFlZTtjb2xvcjp2YXIoLS1tdXRlZCl9LmRldGFpbC1ib2R5e3BhZGRpbmc6MTRweH0ucmVjb3JkLWhlYWR7YWxpZ24taXRlbXM6ZmxleC1zdGFydH0ucmVjb3JkLXRpdGxle2Rpc3BsYXk6Z3JpZDtnYXA6NXB4O21pbi13aWR0aDowfS5yZWNvcmQtdGl0bGUgc3Ryb25ne2Rpc3BsYXk6YmxvY2s7b3ZlcmZsb3c6aGlkZGVuO2ZvbnQtc2l6ZToxOHB4O2xpbmUtaGVpZ2h0OjEuMjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcH0ucmVjb3JkLWtpY2tlcntjb2xvcjp2YXIoLS1tdXRlZCk7Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NzUwO2xldHRlci1zcGFjaW5nOjA7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlfS5yZWNvcmQtbWV0YXtkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOm1pbm1heCgwLDFmcikgcmVwZWF0KDMsbWlubWF4KDc2cHgsYXV0bykpO2dhcDowO2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWxpbmUpO2JhY2tncm91bmQ6dmFyKC0tcGFuZWwtc3Ryb25nKX0ucmVjb3JkLW1ldGEgc3BhbnttaW4td2lkdGg6MDtib3JkZXItcmlnaHQ6MXB4IHNvbGlkIHZhcigtLWxpbmUpO3BhZGRpbmc6OXB4IDEycHg7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7d2hpdGUtc3BhY2U6bm93cmFwfS5yZWNvcmQtbWV0YSBzcGFuOmxhc3QtY2hpbGR7Ym9yZGVyLXJpZ2h0OjB9LnJlY29yZC1tZXRhIGJ7ZGlzcGxheTpibG9jazttYXJnaW4tYm90dG9tOjNweDtjb2xvcjp2YXIoLS1tdXRlZCk7Zm9udC1zaXplOjEwcHg7Zm9udC13ZWlnaHQ6NzUwO2xldHRlci1zcGFjaW5nOjA7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlfS5yZWNvcmQtYm9keXtiYWNrZ3JvdW5kOnZhcigtLXBhbmVsKX0ucmVjb3JkLXJlYWR7ZGlzcGxheTpncmlkO2dhcDoxMnB4fS5yZWFkLXNlY3Rpb257bWluLXdpZHRoOjA7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1saW5lKTtib3JkZXItcmFkaXVzOjhweDtiYWNrZ3JvdW5kOnZhcigtLXBhbmVsKTtwYWRkaW5nOjE0cHh9LnJlYWQtc2VjdGlvbiBwe21hcmdpbjowO2xpbmUtaGVpZ2h0OjEuNTU7d2hpdGUtc3BhY2U6cHJlLXdyYXB9LnJlY29yZC1jb250ZW50e2NvbG9yOnZhcigtLXRleHQpO2ZvbnQtc2l6ZToxNHB4fS5tYXJrZG93bi12aWV3e2Rpc3BsYXk6Z3JpZDtnYXA6MTBweDtjb2xvcjp2YXIoLS10ZXh0KTtsaW5lLWhlaWdodDoxLjU4fS5tYXJrZG93bi12aWV3IGgyLC5tYXJrZG93bi12aWV3IGgzLC5tYXJrZG93bi12aWV3IGg0LC5tYXJrZG93bi12aWV3IHAsLm1hcmtkb3duLXZpZXcgdWwsLm1hcmtkb3duLXZpZXcgb2wsLm1hcmtkb3duLXZpZXcgYmxvY2txdW90ZXttYXJnaW46MH0ubWFya2Rvd24tdmlldyBwe3doaXRlLXNwYWNlOm5vcm1hbH0ubWFya2Rvd24tdmlldyBoMntmb250LXNpemU6MjBweH0ubWFya2Rvd24tdmlldyBoM3tmb250LXNpemU6MTVweDtjb2xvcjp2YXIoLS10ZXh0KTt0ZXh0LXRyYW5zZm9ybTpub25lfS5tYXJrZG93bi12aWV3IHVsLC5tYXJrZG93bi12aWV3IG9se3BhZGRpbmctbGVmdDoyMHB4fS5tYXJrZG93bi12aWV3IGxpe21hcmdpbjo0cHggMH0ubWFya2Rvd24tdmlldyBsaSBpbnB1dHt3aWR0aDphdXRvO21hcmdpbjowIDdweCAwIDB9Lm1hcmtkb3duLXZpZXcgYmxvY2txdW90ZXtib3JkZXItbGVmdDozcHggc29saWQgdmFyKC0tYWNjZW50KTtjb2xvcjp2YXIoLS1tdXRlZCk7cGFkZGluZy1sZWZ0OjEycHh9Lm1hcmtkb3duLXZpZXcgYXtjb2xvcjp2YXIoLS1hY2NlbnQtZGFyayk7Zm9udC13ZWlnaHQ6NzAwfS5tZC1jb2RlLWJsb2Nre2Rpc3BsYXk6Z3JpZDtnYXA6NnB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tbGluZSk7YmFja2dyb3VuZDojMTAxMzEyO2NvbG9yOiNlZWYzZWY7cGFkZGluZzoxMnB4fS5tZC1jb2RlLWJsb2NrIHNwYW57Y29sb3I6IzlhYTlhMDtmb250LXNpemU6MTFweDt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2V9Lm1kLWNvZGUtYmxvY2sgY29kZXtib3JkZXI6MDtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2NvbG9yOmluaGVyaXQ7cGFkZGluZzowfS5tZC10YWJsZXt3aWR0aDoxMDAlO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZX0ubWQtdGFibGUgdGgsLm1kLXRhYmxlIHRke2JvcmRlcjoxcHggc29saWQgdmFyKC0tbGluZSk7cGFkZGluZzo3cHg7dmVydGljYWwtYWxpZ246dG9wfS5jb25uZWN0ZWQtYWdlbnRzLXBhbmVse21hcmdpbi1ib3R0b206MTBweH0uYWdlbnQtY29ubmVjdGlvbi1saXN0e2Rpc3BsYXk6Z3JpZDtnYXA6MH0uYWdlbnQtY29ubmVjdGlvbi1yb3d7ZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczptaW5tYXgoMCwxLjFmcikgYXV0byBtaW5tYXgoMTUwcHgsLjhmcikgbWlubWF4KDAsMWZyKTtnYXA6MTBweDthbGlnbi1pdGVtczpjZW50ZXI7Ym9yZGVyLXRvcDoxcHggc29saWQgdmFyKC0tbGluZSk7cGFkZGluZzoxMHB4IDEycHg7Y29sb3I6dmFyKC0tbXV0ZWQpO2ZvbnQtc2l6ZToxM3B4fS5hZ2VudC1jb25uZWN0aW9uLXJvdz5kaXZ7ZGlzcGxheTpncmlkO2dhcDo0cHg7bWluLXdpZHRoOjB9LmFnZW50LWNvbm5lY3Rpb24tcm93IHN0cm9uZ3tjb2xvcjp2YXIoLS10ZXh0KX0uYWdlbnQtY29ubmVjdGlvbi1yb3cgc21hbGx7b3ZlcmZsb3ctd3JhcDphbnl3aGVyZX0ucmVjb3JkLXN0cnVjdHVyZXtkaXNwbGF5OmdyaWQ7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOnJlcGVhdCgyLG1pbm1heCgwLDFmcikpO2dhcDoxMnB4O2FsaWduLWl0ZW1zOnN0YXJ0fS5yZWFkLXNlY3Rpb24gcHJle21hcmdpbjowO292ZXJmbG93OnZpc2libGU7Y29sb3I6dmFyKC0tbXV0ZWQpO2ZvbnQtZmFtaWx5OkdlaXN0IE1vbm8sU0ZNb25vLVJlZ3VsYXIsQ29uc29sYXMsbW9ub3NwYWNlO2ZvbnQtc2l6ZToxMnB4O2xpbmUtaGVpZ2h0OjEuNDU7b3ZlcmZsb3ctd3JhcDphbnl3aGVyZTt3aGl0ZS1zcGFjZTpwcmUtd3JhcH0ucmVjb3JkLXNlY3Rpb257Ym9yZGVyOjA7Ym9yZGVyLWxlZnQ6MnB4IHNvbGlkIHZhcigtLXRyZWUtcmFpbCk7Ym9yZGVyLXJhZGl1czowO2JveC1zaGFkb3c6bm9uZTttYXJnaW46MDtwYWRkaW5nOjAgMCAycHggMTJweH0ucmVjb3JkLXNlY3Rpb24rLnJlY29yZC1zZWN0aW9ue21hcmdpbi10b3A6OHB4O3BhZGRpbmctdG9wOjEwcHg7Ym9yZGVyLXRvcDoxcHggc29saWQgdmFyKC0tbGluZSl9LnJlbGF0aW9uLWVkaXRvcntiYWNrZ3JvdW5kOnZhcigtLXBhbmVsLXN0cm9uZyl9Lm1vZGFsLWZvcm17cGFkZGluZy10b3A6NHB4fS5lZGl0b3ItbW9kYWwtY29udGVudHt3aWR0aDptaW4oMTQ0MHB4LGNhbGMoMTAwdncgLSAzMnB4KSk7bWF4LWhlaWdodDpjYWxjKDEwMGR2aCAtIDMycHgpfS5lZGl0b3ItbW9kYWwtYm9keXtwYWRkaW5nOjE0cHh9Lm1hcmtkb3duLWVkaXRvcntkaXNwbGF5OmdyaWQ7Z2FwOjEwcHh9Lm1hcmtkb3duLWVkaXRvci1oZWFke2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47Z2FwOjEwcHg7Y29sb3I6dmFyKC0tbXV0ZWQpO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjY1MH0uZWRpdG9yLW1vZGUtdG9nZ2xle2Rpc3BsYXk6aW5saW5lLWZsZXg7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1saW5lKTtib3JkZXItcmFkaXVzOjZweDtvdmVyZmxvdzpoaWRkZW47YmFja2dyb3VuZDp2YXIoLS1wYW5lbCl9LmVkaXRvci1tb2RlLXRvZ2dsZSBidXR0b257bWluLXdpZHRoOjc0cHg7Ym9yZGVyOjA7Ym9yZGVyLXJhZGl1czowO2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6dmFyKC0tbXV0ZWQpO3BhZGRpbmc6N3B4IDEwcHg7Zm9udC1zaXplOjEycHh9LmVkaXRvci1tb2RlLXRvZ2dsZSBidXR0b24rYnV0dG9ue2JvcmRlci1sZWZ0OjFweCBzb2xpZCB2YXIoLS1saW5lKX0uZWRpdG9yLW1vZGUtdG9nZ2xlIGJ1dHRvbi5hY3RpdmV7YmFja2dyb3VuZDp2YXIoLS1hY2NlbnQtZGFyayk7Y29sb3I6I2ZmZn0ubWFya2Rvd24tdG9vbGJhcntkaXNwbGF5OmZsZXg7ZmxleC13cmFwOndyYXA7Z2FwOjZweH0ubWFya2Rvd24tdG9vbGJhciBidXR0b257bWluLXdpZHRoOjQwcHg7Y3Vyc29yOnBvaW50ZXJ9Lm1hcmtkb3duLWVkaXRvci1ib2R5e2Rpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6bWlubWF4KDAsMS4xNWZyKSBtaW5tYXgoMzIwcHgsLjg1ZnIpO2dhcDoxMnB4O21pbi1oZWlnaHQ6MH0ubWFya2Rvd24tZWRpdG9yLWJvZHkubW9kZS13cml0ZSwubWFya2Rvd24tZWRpdG9yLWJvZHkubW9kZS1wcmV2aWV3e2dyaWQtdGVtcGxhdGUtY29sdW1uczptaW5tYXgoMCwxZnIpfS5tYXJrZG93bi10ZXh0YXJlYSB0ZXh0YXJlYXttaW4taGVpZ2h0Om1pbig2NDBweCxjYWxjKDEwMGR2aCAtIDM2MHB4KSk7bWF4LWhlaWdodDo3NnZoO3Jlc2l6ZTp2ZXJ0aWNhbDtvdmVyZmxvdzphdXRvO2ZvbnQtZmFtaWx5OkdlaXN0IE1vbm8sU0ZNb25vLVJlZ3VsYXIsQ29uc29sYXMsbW9ub3NwYWNlO2ZvbnQtc2l6ZToxNHB4O2xpbmUtaGVpZ2h0OjEuNn0ubWFya2Rvd24tcHJldmlld3ttaW4taGVpZ2h0Om1pbig2NDBweCxjYWxjKDEwMGR2aCAtIDM2MHB4KSk7bWF4LWhlaWdodDo3NnZoO292ZXJmbG93OmF1dG87Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1saW5lKTtib3JkZXItcmFkaXVzOjhweDtiYWNrZ3JvdW5kOnZhcigtLXBhbmVsKTtwYWRkaW5nOjE0cHh9LnN0cnVjdHVyZS1zZWN0aW9ue3BhZGRpbmc6MH0uc3RydWN0dXJlLXNlY3Rpb24gc3VtbWFyeXtjdXJzb3I6cG9pbnRlcjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo3NjA7cGFkZGluZzoxMHB4IDEycHh9LnN0cnVjdHVyZS1zZWN0aW9uW29wZW5de3BhZGRpbmc6MCAxMnB4IDEycHh9LnN0cnVjdHVyZS1zZWN0aW9uW29wZW5dIHN1bW1hcnl7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tbGluZSk7bWFyZ2luOjAgLTEycHggMTJweH0ubW9ubyB0ZXh0YXJlYXttaW4taGVpZ2h0OjE1MHB4O3Jlc2l6ZTp2ZXJ0aWNhbDtmb250LWZhbWlseTpHZWlzdCBNb25vLFNGTW9uby1SZWd1bGFyLENvbnNvbGFzLG1vbm9zcGFjZTtmb250LXNpemU6MTJweDtsaW5lLWhlaWdodDoxLjQ1fS50YWJsZS1wYW5lbHtvdmVyZmxvdzphdXRvfS5kaXZpZGVye2JvcmRlci10b3A6MXB4IHNvbGlkIHZhcigtLWxpbmUpfS5ub3RpY2UsLmVtcHR5e2JvcmRlcjoxcHggZGFzaGVkIHZhcigtLWxpbmUtc3Ryb25nKTtib3JkZXItcmFkaXVzOjhweDtwYWRkaW5nOjE0cHg7Y29sb3I6dmFyKC0tbXV0ZWQpO2JhY2tncm91bmQ6dmFyKC0tcGFuZWwtc3Ryb25nKX0ubGluay1idXR0b24sLnJlY29yZC1saW5re2JvcmRlcjowO2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6dmFyKC0tdGV4dCk7cGFkZGluZzowfS5yZWNvcmQtbGlua3tkaXNwbGF5OmdyaWQ7anVzdGlmeS1pdGVtczpzdGFydDtnYXA6NHB4O2ZvbnQtd2VpZ2h0OjcwMH0ubm9kZS10YWJsZSB0ZHt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9LnByZXZpZXctY2VsbHttYXgtd2lkdGg6MzYwcHg7Y29sb3I6dmFyKC0tbXV0ZWQpO2ZvbnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0OjEuMzV9LnByb2plY3QtZGFzaGJvYXJkLWxpc3R7ZGlzcGxheTpncmlkO2dhcDoxMnB4fS5sb2NhbC1wcm9qZWN0LWNhcmR7ZGlzcGxheTpncmlkO2dhcDo4cHg7d2lkdGg6bWluKDUyMHB4LDEwMCUpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tbGluZSk7Ym9yZGVyLXJhZGl1czo4cHg7YmFja2dyb3VuZDp2YXIoLS1wYW5lbCk7Y29sb3I6dmFyKC0tdGV4dCk7cGFkZGluZzoxNHB4O3RleHQtYWxpZ246bGVmdDtjdXJzb3I6cG9pbnRlcn0ubG9jYWwtcHJvamVjdC1jYXJkIHN0cm9uZ3tmb250LXNpemU6MjBweH0ubG9jYWwtcHJvamVjdC1jYXJkIHB7Y29sb3I6dmFyKC0tbXV0ZWQpfS5yZWNvcmQtdmlld3tkaXNwbGF5OmdyaWQ7Z2FwOjEycHh9LnJlY29yZC12aWV3IC5yZWNvcmQtbWV0YXtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWxpbmUpfS50ZXJtaW5hbC1vdXRwdXR7bWluLWhlaWdodDoyNjBweDttYXJnaW46MDtvdmVyZmxvdzphdXRvO3doaXRlLXNwYWNlOnByZS13cmFwO292ZXJmbG93LXdyYXA6YW55d2hlcmU7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1saW5lKTtib3JkZXItcmFkaXVzOjhweDtiYWNrZ3JvdW5kOiMxMDEzMTI7Y29sb3I6I2VlZjNlZjtwYWRkaW5nOjEycHg7Zm9udC1mYW1pbHk6R2Vpc3QgTW9ubyxTRk1vbm8tUmVndWxhcixDb25zb2xhcyxtb25vc3BhY2U7Zm9udC1zaXplOjEycHh9LmFnZW50LWNvbnNvbGUtc2hlbGx7cGFkZGluZzoxMnB4O2JvcmRlcjoxcHggc29saWQgIzI3MzEyYztiYWNrZ3JvdW5kOiMwZDExMTA7Y29sb3I6I2U4ZjFlY30uYWdlbnQtY29uc29sZS1jb25uZWN0e3BhZGRpbmc6MTRweDtib3JkZXI6MXB4IHNvbGlkICMyNzMxMmM7YmFja2dyb3VuZDojMTIxODE2fS5hZ2VudC1jb25zb2xlLXNoZWxsIC50ZXJtaW5hbC1vdXRwdXR7bWluLWhlaWdodDppbmhlcml0O2hlaWdodDoxMDAlO21heC1oZWlnaHQ6bm9uZTtib3JkZXI6MDtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2NvbG9yOiNkN2ZmZTk7Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6MS42fS50ZXJtaW5hbC1jb25zb2xle3Bvc2l0aW9uOnJlbGF0aXZlO21pbi1oZWlnaHQ6Y2xhbXAoNTIwcHgsNjhkdmgsNzYwcHgpO2JvcmRlcjoxcHggc29saWQgIzJkM2EzNDtib3JkZXItcmFkaXVzOjhweDtiYWNrZ3JvdW5kOiMwODBiMGE7Y3Vyc29yOnRleHQ7b3ZlcmZsb3c6aGlkZGVufS50ZXJtaW5hbC1jb25zb2xlLmZvY3VzZWR7Ym9yZGVyLWNvbG9yOiM1MmQ2ODE7Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggIzUyZDY4MTZifS50ZXJtaW5hbC1jb25zb2xlLmRpc2FibGVke2N1cnNvcjp3YWl0O29wYWNpdHk6LjgyfS50ZXJtaW5hbC1jb25zb2xlOmZvY3Vze291dGxpbmU6bm9uZX0udGVybWluYWwtY29uc29sZSAudGVybWluYWwtb3V0cHV0e21hcmdpbjowO292ZXJmbG93OmF1dG87d2hpdGUtc3BhY2U6cHJlLXdyYXA7b3ZlcmZsb3ctd3JhcDphbnl3aGVyZTtwYWRkaW5nOjE0cHg7Zm9udC1mYW1pbHk6R2Vpc3QgTW9ubyxTRk1vbm8tUmVndWxhcixDb25zb2xhcyxtb25vc3BhY2V9LmNvbnRleHQtbWVudXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDA7ZGlzcGxheTpncmlkO21pbi13aWR0aDoxNzBweDtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWxpbmUpO2JvcmRlci1yYWRpdXM6OHB4O2JhY2tncm91bmQ6dmFyKC0tcGFuZWwpO2JveC1zaGFkb3c6MCAxMnB4IDI4cHggIzEwMTMxMjI0O292ZXJmbG93OmhpZGRlbn0uY29udGV4dC1tZW51IGJ1dHRvbntqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydDtib3JkZXI6MDtib3JkZXItYm90dG9tOjFweCBzb2xpZCB2YXIoLS1saW5lKTtib3JkZXItcmFkaXVzOjA7YmFja2dyb3VuZDp2YXIoLS1wYW5lbCk7Y29sb3I6dmFyKC0tdGV4dCk7cGFkZGluZzo5cHggMTFweH0uY29udGV4dC1tZW51IGJ1dHRvbjpob3ZlcntiYWNrZ3JvdW5kOnZhcigtLXBhbmVsLXN0cm9uZyl9QG1lZGlhKG1heC13aWR0aDo5MDBweCl7bWFpbntwYWRkaW5nOjEwcHh9LnRvcGJhcnthbGlnbi1pdGVtczpmbGV4LXN0YXJ0O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbn1uYXZ7d2lkdGg6MTAwJTtvdmVyZmxvdzphdXRvfS5zdGF0cywud29ya3NwYWNlLC5tYXJrZG93bi1lZGl0b3ItYm9keSwucmVjb3JkLXN0cnVjdHVyZSwuYWdlbnQtY29ubmVjdGlvbi1yb3d7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmcn0uZWRpdG9yLW1vZGFsLWNvbnRlbnR7d2lkdGg6Y2FsYygxMDB2dyAtIDEycHgpO21heC1oZWlnaHQ6Y2FsYygxMDBkdmggLSAxMnB4KX0uZWRpdG9yLW1vZGFsLWJvZHl7cGFkZGluZzoxMHB4fS5tYXJrZG93bi1lZGl0b3ItaGVhZHthbGlnbi1pdGVtczpmbGV4LXN0YXJ0O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbn0ubWFya2Rvd24tdGV4dGFyZWEgdGV4dGFyZWEsLm1hcmtkb3duLXByZXZpZXd7bWluLWhlaWdodDpjYWxjKDEwMGR2aCAtIDM5MHB4KX19Cg=="
},
"/_astro/index.CGoUh5RR.js": {
"content_type": "text/javascript; charset=utf-8",
"bytes": 12225,
"sha256": "1c1e7f26828ffee8a29162becd74d1182f91e2b3f8c2d58217a7b3b34014d675",
"body_b64": "ZnVuY3Rpb24gbmUoXyxFKXtmb3IodmFyIGc9MDtnPEUubGVuZ3RoO2crKyl7Y29uc3QgeT1FW2ddO2lmKHR5cGVvZiB5IT0ic3RyaW5nIiYmIUFycmF5LmlzQXJyYXkoeSkpe2Zvcihjb25zdCBtIGluIHkpaWYobSE9PSJkZWZhdWx0IiYmIShtIGluIF8pKXtjb25zdCBUPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoeSxtKTtUJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoXyxtLFQuZ2V0P1Q6e2VudW1lcmFibGU6ITAsZ2V0OigpPT55W21dfSl9fX1yZXR1cm4gT2JqZWN0LmZyZWV6ZShPYmplY3QuZGVmaW5lUHJvcGVydHkoXyxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOiJNb2R1bGUifSkpfWZ1bmN0aW9uIHVlKF8pe3JldHVybiBfJiZfLl9fZXNNb2R1bGUmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChfLCJkZWZhdWx0Iik/Xy5kZWZhdWx0Ol99dmFyIEk9e2V4cG9ydHM6e319LG49e307LyoqCiAqIEBsaWNlbnNlIFJlYWN0CiAqIHJlYWN0LnByb2R1Y3Rpb24uanMKICoKICogQ29weXJpZ2h0IChjKSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy4KICoKICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlCiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4KICovdmFyIEs7ZnVuY3Rpb24gb2UoKXtpZihLKXJldHVybiBuO0s9MTt2YXIgXz1TeW1ib2wuZm9yKCJyZWFjdC50cmFuc2l0aW9uYWwuZWxlbWVudCIpLEU9U3ltYm9sLmZvcigicmVhY3QucG9ydGFsIiksZz1TeW1ib2wuZm9yKCJyZWFjdC5mcmFnbWVudCIpLHk9U3ltYm9sLmZvcigicmVhY3Quc3RyaWN0X21vZGUiKSxtPVN5bWJvbC5mb3IoInJlYWN0LnByb2ZpbGVyIiksVD1TeW1ib2wuZm9yKCJyZWFjdC5jb25zdW1lciIpLE89U3ltYm9sLmZvcigicmVhY3QuY29udGV4dCIpLFM9U3ltYm9sLmZvcigicmVhY3QuZm9yd2FyZF9yZWYiKSxpPVN5bWJvbC5mb3IoInJlYWN0LnN1c3BlbnNlIiksdD1TeW1ib2wuZm9yKCJyZWFjdC5tZW1vIiksYz1TeW1ib2wuZm9yKCJyZWFjdC5sYXp5IiksUj1TeW1ib2wuZm9yKCJyZWFjdC5hY3Rpdml0eSIpLGg9U3ltYm9sLml0ZXJhdG9yO2Z1bmN0aW9uIFAoZSl7cmV0dXJuIGU9PT1udWxsfHx0eXBlb2YgZSE9Im9iamVjdCI/bnVsbDooZT1oJiZlW2hdfHxlWyJAQGl0ZXJhdG9yIl0sdHlwZW9mIGU9PSJmdW5jdGlvbiI/ZTpudWxsKX12YXIgYj17aXNNb3VudGVkOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGVucXVldWVGb3JjZVVwZGF0ZTpmdW5jdGlvbigpe30sZW5xdWV1ZVJlcGxhY2VTdGF0ZTpmdW5jdGlvbigpe30sZW5xdWV1ZVNldFN0YXRlOmZ1bmN0aW9uKCl7fX0sVT1PYmplY3QuYXNzaWduLFk9e307ZnVuY3Rpb24gQyhlLHIsbyl7dGhpcy5wcm9wcz1lLHRoaXMuY29udGV4dD1yLHRoaXMucmVmcz1ZLHRoaXMudXBkYXRlcj1vfHxifUMucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ9e30sQy5wcm90b3R5cGUuc2V0U3RhdGU9ZnVuY3Rpb24oZSxyKXtpZih0eXBlb2YgZSE9Im9iamVjdCImJnR5cGVvZiBlIT0iZnVuY3Rpb24iJiZlIT1udWxsKXRocm93IEVycm9yKCJ0YWtlcyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzIHRvIHVwZGF0ZSBvciBhIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYW4gb2JqZWN0IG9mIHN0YXRlIHZhcmlhYmxlcy4iKTt0aGlzLnVwZGF0ZXIuZW5xdWV1ZVNldFN0YXRlKHRoaXMsZSxyLCJzZXRTdGF0ZSIpfSxDLnByb3RvdHlwZS5mb3JjZVVwZGF0ZT1mdW5jdGlvbihlKXt0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMsZSwiZm9yY2VVcGRhdGUiKX07ZnVuY3Rpb24gaygpe31rLnByb3RvdHlwZT1DLnByb3RvdHlwZTtmdW5jdGlvbiBOKGUscixvKXt0aGlzLnByb3BzPWUsdGhpcy5jb250ZXh0PXIsdGhpcy5yZWZzPVksdGhpcy51cGRhdGVyPW98fGJ9dmFyIEg9Ti5wcm90b3R5cGU9bmV3IGs7SC5jb25zdHJ1Y3Rvcj1OLFUoSCxDLnByb3RvdHlwZSksSC5pc1B1cmVSZWFjdENvbXBvbmVudD0hMDt2YXIgeD1BcnJheS5pc0FycmF5O2Z1bmN0aW9uIEQoKXt9dmFyIGE9e0g6bnVsbCxBOm51bGwsVDpudWxsLFM6bnVsbH0scT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIGooZSxyLG8pe3ZhciB1PW8ucmVmO3JldHVybnskJHR5cGVvZjpfLHR5cGU6ZSxrZXk6cixyZWY6dSE9PXZvaWQgMD91Om51bGwscHJvcHM6b319ZnVuY3Rpb24gSihlLHIpe3JldHVybiBqKGUudHlwZSxyLGUucHJvcHMpfWZ1bmN0aW9uIEwoZSl7cmV0dXJuIHR5cGVvZiBlPT0ib2JqZWN0IiYmZSE9PW51bGwmJmUuJCR0eXBlb2Y9PT1ffWZ1bmN0aW9uIFYoZSl7dmFyIHI9eyI9IjoiPTAiLCI6IjoiPTIifTtyZXR1cm4iJCIrZS5yZXBsYWNlKC9bPTpdL2csZnVuY3Rpb24obyl7cmV0dXJuIHJbb119KX12YXIgej0vXC8rL2c7ZnVuY3Rpb24gTShlLHIpe3JldHVybiB0eXBlb2YgZT09Im9iamVjdCImJmUhPT1udWxsJiZlLmtleSE9bnVsbD9WKCIiK2Uua2V5KTpyLnRvU3RyaW5nKDM2KX1mdW5jdGlvbiBGKGUpe3N3aXRjaChlLnN0YXR1cyl7Y2FzZSJmdWxmaWxsZWQiOnJldHVybiBlLnZhbHVlO2Nhc2UicmVqZWN0ZWQiOnRocm93IGUucmVhc29uO2RlZmF1bHQ6c3dpdGNoKHR5cGVvZiBlLnN0YXR1cz09InN0cmluZyI/ZS50aGVuKEQsRCk6KGUuc3RhdHVzPSJwZW5kaW5nIixlLnRoZW4oZnVuY3Rpb24ocil7ZS5zdGF0dXM9PT0icGVuZGluZyImJihlLnN0YXR1cz0iZnVsZmlsbGVkIixlLnZhbHVlPXIpfSxmdW5jdGlvbihyKXtlLnN0YXR1cz09PSJwZW5kaW5nIiYmKGUuc3RhdHVzPSJyZWplY3RlZCIsZS5yZWFzb249cil9KSksZS5zdGF0dXMpe2Nhc2UiZnVsZmlsbGVkIjpyZXR1cm4gZS52YWx1ZTtjYXNlInJlamVjdGVkIjp0aHJvdyBlLnJlYXNvbn19dGhyb3cgZX1mdW5jdGlvbiBBKGUscixvLHUscyl7dmFyIGY9dHlwZW9mIGU7KGY9PT0idW5kZWZpbmVkInx8Zj09PSJib29sZWFuIikmJihlPW51bGwpO3ZhciBsPSExO2lmKGU9PT1udWxsKWw9ITA7ZWxzZSBzd2l0Y2goZil7Y2FzZSJiaWdpbnQiOmNhc2Uic3RyaW5nIjpjYXNlIm51bWJlciI6bD0hMDticmVhaztjYXNlIm9iamVjdCI6c3dpdGNoKGUuJCR0eXBlb2Ype2Nhc2UgXzpjYXNlIEU6bD0hMDticmVhaztjYXNlIGM6cmV0dXJuIGw9ZS5faW5pdCxBKGwoZS5fcGF5bG9hZCkscixvLHUscyl9fWlmKGwpcmV0dXJuIHM9cyhlKSxsPXU9PT0iIj8iLiIrTShlLDApOnUseChzKT8obz0iIixsIT1udWxsJiYobz1sLnJlcGxhY2UoeiwiJCYvIikrIi8iKSxBKHMscixvLCIiLGZ1bmN0aW9uKHJlKXtyZXR1cm4gcmV9KSk6cyE9bnVsbCYmKEwocykmJihzPUoocyxvKyhzLmtleT09bnVsbHx8ZSYmZS5rZXk9PT1zLmtleT8iIjooIiIrcy5rZXkpLnJlcGxhY2UoeiwiJCYvIikrIi8iKStsKSksci5wdXNoKHMpKSwxO2w9MDt2YXIgdj11PT09IiI/Ii4iOnUrIjoiO2lmKHgoZSkpZm9yKHZhciBkPTA7ZDxlLmxlbmd0aDtkKyspdT1lW2RdLGY9ditNKHUsZCksbCs9QSh1LHIsbyxmLHMpO2Vsc2UgaWYoZD1QKGUpLHR5cGVvZiBkPT0iZnVuY3Rpb24iKWZvcihlPWQuY2FsbChlKSxkPTA7ISh1PWUubmV4dCgpKS5kb25lOyl1PXUudmFsdWUsZj12K00odSxkKyspLGwrPUEodSxyLG8sZixzKTtlbHNlIGlmKGY9PT0ib2JqZWN0Iil7aWYodHlwZW9mIGUudGhlbj09ImZ1bmN0aW9uIilyZXR1cm4gQShGKGUpLHIsbyx1LHMpO3Rocm93IHI9U3RyaW5nKGUpLEVycm9yKCJPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6ICIrKHI9PT0iW29iamVjdCBPYmplY3RdIj8ib2JqZWN0IHdpdGgga2V5cyB7IitPYmplY3Qua2V5cyhlKS5qb2luKCIsICIpKyJ9IjpyKSsiKS4gSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4sIHVzZSBhbiBhcnJheSBpbnN0ZWFkLiIpfXJldHVybiBsfWZ1bmN0aW9uIHcoZSxyLG8pe2lmKGU9PW51bGwpcmV0dXJuIGU7dmFyIHU9W10scz0wO3JldHVybiBBKGUsdSwiIiwiIixmdW5jdGlvbihmKXtyZXR1cm4gci5jYWxsKG8sZixzKyspfSksdX1mdW5jdGlvbiBlZShlKXtpZihlLl9zdGF0dXM9PT0tMSl7dmFyIHI9ZS5fcmVzdWx0O3I9cigpLHIudGhlbihmdW5jdGlvbihvKXsoZS5fc3RhdHVzPT09MHx8ZS5fc3RhdHVzPT09LTEpJiYoZS5fc3RhdHVzPTEsZS5fcmVzdWx0PW8pfSxmdW5jdGlvbihvKXsoZS5fc3RhdHVzPT09MHx8ZS5fc3RhdHVzPT09LTEpJiYoZS5fc3RhdHVzPTIsZS5fcmVzdWx0PW8pfSksZS5fc3RhdHVzPT09LTEmJihlLl9zdGF0dXM9MCxlLl9yZXN1bHQ9cil9aWYoZS5fc3RhdHVzPT09MSlyZXR1cm4gZS5fcmVzdWx0LmRlZmF1bHQ7dGhyb3cgZS5fcmVzdWx0fXZhciBHPXR5cGVvZiByZXBvcnRFcnJvcj09ImZ1bmN0aW9uIj9yZXBvcnRFcnJvcjpmdW5jdGlvbihlKXtpZih0eXBlb2Ygd2luZG93PT0ib2JqZWN0IiYmdHlwZW9mIHdpbmRvdy5FcnJvckV2ZW50PT0iZnVuY3Rpb24iKXt2YXIgcj1uZXcgd2luZG93LkVycm9yRXZlbnQoImVycm9yIix7YnViYmxlczohMCxjYW5jZWxhYmxlOiEwLG1lc3NhZ2U6dHlwZW9mIGU9PSJvYmplY3QiJiZlIT09bnVsbCYmdHlwZW9mIGUubWVzc2FnZT09InN0cmluZyI/U3RyaW5nKGUubWVzc2FnZSk6U3RyaW5nKGUpLGVycm9yOmV9KTtpZighd2luZG93LmRpc3BhdGNoRXZlbnQocikpcmV0dXJufWVsc2UgaWYodHlwZW9mIHByb2Nlc3M9PSJvYmplY3QiJiZ0eXBlb2YgcHJvY2Vzcy5lbWl0PT0iZnVuY3Rpb24iKXtwcm9jZXNzLmVtaXQoInVuY2F1Z2h0RXhjZXB0aW9uIixlKTtyZXR1cm59Y29uc29sZS5lcnJvcihlKX0sdGU9e21hcDp3LGZvckVhY2g6ZnVuY3Rpb24oZSxyLG8pe3coZSxmdW5jdGlvbigpe3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxvKX0sY291bnQ6ZnVuY3Rpb24oZSl7dmFyIHI9MDtyZXR1cm4gdyhlLGZ1bmN0aW9uKCl7cisrfSkscn0sdG9BcnJheTpmdW5jdGlvbihlKXtyZXR1cm4gdyhlLGZ1bmN0aW9uKHIpe3JldHVybiByfSl8fFtdfSxvbmx5OmZ1bmN0aW9uKGUpe2lmKCFMKGUpKXRocm93IEVycm9yKCJSZWFjdC5DaGlsZHJlbi5vbmx5IGV4cGVjdGVkIHRvIHJlY2VpdmUgYSBzaW5nbGUgUmVhY3QgZWxlbWVudCBjaGlsZC4iKTtyZXR1cm4gZX19O3JldHVybiBuLkFjdGl2aXR5PVIsbi5DaGlsZHJlbj10ZSxuLkNvbXBvbmVudD1DLG4uRnJhZ21lbnQ9ZyxuLlByb2ZpbGVyPW0sbi5QdXJlQ29tcG9uZW50PU4sbi5TdHJpY3RNb2RlPXksbi5TdXNwZW5zZT1pLG4uX19DTElFTlRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfV0FSTl9VU0VSU19USEVZX0NBTk5PVF9VUEdSQURFPWEsbi5fX0NPTVBJTEVSX1JVTlRJTUU9e19fcHJvdG9fXzpudWxsLGM6ZnVuY3Rpb24oZSl7cmV0dXJuIGEuSC51c2VNZW1vQ2FjaGUoZSl9fSxuLmNhY2hlPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KG51bGwsYXJndW1lbnRzKX19LG4uY2FjaGVTaWduYWw9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sbi5jbG9uZUVsZW1lbnQ9ZnVuY3Rpb24oZSxyLG8pe2lmKGU9PW51bGwpdGhyb3cgRXJyb3IoIlRoZSBhcmd1bWVudCBtdXN0IGJlIGEgUmVhY3QgZWxlbWVudCwgYnV0IHlvdSBwYXNzZWQgIitlKyIuIik7dmFyIHU9VSh7fSxlLnByb3BzKSxzPWUua2V5O2lmKHIhPW51bGwpZm9yKGYgaW4gci5rZXkhPT12b2lkIDAmJihzPSIiK3Iua2V5KSxyKSFxLmNhbGwocixmKXx8Zj09PSJrZXkifHxmPT09Il9fc2VsZiJ8fGY9PT0iX19zb3VyY2UifHxmPT09InJlZiImJnIucmVmPT09dm9pZCAwfHwodVtmXT1yW2ZdKTt2YXIgZj1hcmd1bWVudHMubGVuZ3RoLTI7aWYoZj09PTEpdS5jaGlsZHJlbj1vO2Vsc2UgaWYoMTxmKXtmb3IodmFyIGw9QXJyYXkoZiksdj0wO3Y8Zjt2KyspbFt2XT1hcmd1bWVudHNbdisyXTt1LmNoaWxkcmVuPWx9cmV0dXJuIGooZS50eXBlLHMsdSl9LG4uY3JlYXRlQ29udGV4dD1mdW5jdGlvbihlKXtyZXR1cm4gZT17JCR0eXBlb2Y6TyxfY3VycmVudFZhbHVlOmUsX2N1cnJlbnRWYWx1ZTI6ZSxfdGhyZWFkQ291bnQ6MCxQcm92aWRlcjpudWxsLENvbnN1bWVyOm51bGx9LGUuUHJvdmlkZXI9ZSxlLkNvbnN1bWVyPXskJHR5cGVvZjpULF9jb250ZXh0OmV9LGV9LG4uY3JlYXRlRWxlbWVudD1mdW5jdGlvbihlLHIsbyl7dmFyIHUscz17fSxmPW51bGw7aWYociE9bnVsbClmb3IodSBpbiByLmtleSE9PXZvaWQgMCYmKGY9IiIrci5rZXkpLHIpcS5jYWxsKHIsdSkmJnUhPT0ia2V5IiYmdSE9PSJfX3NlbGYiJiZ1IT09Il9fc291cmNlIiYmKHNbdV09clt1XSk7dmFyIGw9YXJndW1lbnRzLmxlbmd0aC0yO2lmKGw9PT0xKXMuY2hpbGRyZW49bztlbHNlIGlmKDE8bCl7Zm9yKHZhciB2PUFycmF5KGwpLGQ9MDtkPGw7ZCsrKXZbZF09YXJndW1lbnRzW2QrMl07cy5jaGlsZHJlbj12fWlmKGUmJmUuZGVmYXVsdFByb3BzKWZvcih1IGluIGw9ZS5kZWZhdWx0UHJvcHMsbClzW3VdPT09dm9pZCAwJiYoc1t1XT1sW3VdKTtyZXR1cm4gaihlLGYscyl9LG4uY3JlYXRlUmVmPWZ1bmN0aW9uKCl7cmV0dXJue2N1cnJlbnQ6bnVsbH19LG4uZm9yd2FyZFJlZj1mdW5jdGlvbihlKXtyZXR1cm57JCR0eXBlb2Y6UyxyZW5kZXI6ZX19LG4uaXNWYWxpZEVsZW1lbnQ9TCxuLmxhenk9ZnVuY3Rpb24oZSl7cmV0dXJueyQkdHlwZW9mOmMsX3BheWxvYWQ6e19zdGF0dXM6LTEsX3Jlc3VsdDplfSxfaW5pdDplZX19LG4ubWVtbz1mdW5jdGlvbihlLHIpe3JldHVybnskJHR5cGVvZjp0LHR5cGU6ZSxjb21wYXJlOnI9PT12b2lkIDA/bnVsbDpyfX0sbi5zdGFydFRyYW5zaXRpb249ZnVuY3Rpb24oZSl7dmFyIHI9YS5ULG89e307YS5UPW87dHJ5e3ZhciB1PWUoKSxzPWEuUztzIT09bnVsbCYmcyhvLHUpLHR5cGVvZiB1PT0ib2JqZWN0IiYmdSE9PW51bGwmJnR5cGVvZiB1LnRoZW49PSJmdW5jdGlvbiImJnUudGhlbihELEcpfWNhdGNoKGYpe0coZil9ZmluYWxseXtyIT09bnVsbCYmby50eXBlcyE9PW51bGwmJihyLnR5cGVzPW8udHlwZXMpLGEuVD1yfX0sbi51bnN0YWJsZV91c2VDYWNoZVJlZnJlc2g9ZnVuY3Rpb24oKXtyZXR1cm4gYS5ILnVzZUNhY2hlUmVmcmVzaCgpfSxuLnVzZT1mdW5jdGlvbihlKXtyZXR1cm4gYS5ILnVzZShlKX0sbi51c2VBY3Rpb25TdGF0ZT1mdW5jdGlvbihlLHIsbyl7cmV0dXJuIGEuSC51c2VBY3Rpb25TdGF0ZShlLHIsbyl9LG4udXNlQ2FsbGJhY2s9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gYS5ILnVzZUNhbGxiYWNrKGUscil9LG4udXNlQ29udGV4dD1mdW5jdGlvbihlKXtyZXR1cm4gYS5ILnVzZUNvbnRleHQoZSl9LG4udXNlRGVidWdWYWx1ZT1mdW5jdGlvbigpe30sbi51c2VEZWZlcnJlZFZhbHVlPWZ1bmN0aW9uKGUscil7cmV0dXJuIGEuSC51c2VEZWZlcnJlZFZhbHVlKGUscil9LG4udXNlRWZmZWN0PWZ1bmN0aW9uKGUscil7cmV0dXJuIGEuSC51c2VFZmZlY3QoZSxyKX0sbi51c2VFZmZlY3RFdmVudD1mdW5jdGlvbihlKXtyZXR1cm4gYS5ILnVzZUVmZmVjdEV2ZW50KGUpfSxuLnVzZUlkPWZ1bmN0aW9uKCl7cmV0dXJuIGEuSC51c2VJZCgpfSxuLnVzZUltcGVyYXRpdmVIYW5kbGU9ZnVuY3Rpb24oZSxyLG8pe3JldHVybiBhLkgudXNlSW1wZXJhdGl2ZUhhbmRsZShlLHIsbyl9LG4udXNlSW5zZXJ0aW9uRWZmZWN0PWZ1bmN0aW9uKGUscil7cmV0dXJuIGEuSC51c2VJbnNlcnRpb25FZmZlY3QoZSxyKX0sbi51c2VMYXlvdXRFZmZlY3Q9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gYS5ILnVzZUxheW91dEVmZmVjdChlLHIpfSxuLnVzZU1lbW89ZnVuY3Rpb24oZSxyKXtyZXR1cm4gYS5ILnVzZU1lbW8oZSxyKX0sbi51c2VPcHRpbWlzdGljPWZ1bmN0aW9uKGUscil7cmV0dXJuIGEuSC51c2VPcHRpbWlzdGljKGUscil9LG4udXNlUmVkdWNlcj1mdW5jdGlvbihlLHIsbyl7cmV0dXJuIGEuSC51c2VSZWR1Y2VyKGUscixvKX0sbi51c2VSZWY9ZnVuY3Rpb24oZSl7cmV0dXJuIGEuSC51c2VSZWYoZSl9LG4udXNlU3RhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGEuSC51c2VTdGF0ZShlKX0sbi51c2VTeW5jRXh0ZXJuYWxTdG9yZT1mdW5jdGlvbihlLHIsbyl7cmV0dXJuIGEuSC51c2VTeW5jRXh0ZXJuYWxTdG9yZShlLHIsbyl9LG4udXNlVHJhbnNpdGlvbj1mdW5jdGlvbigpe3JldHVybiBhLkgudXNlVHJhbnNpdGlvbigpfSxuLnZlcnNpb249IjE5LjIuNSIsbn12YXIgQjtmdW5jdGlvbiBRKCl7cmV0dXJuIEJ8fChCPTEsSS5leHBvcnRzPW9lKCkpLEkuZXhwb3J0c312YXIgWj1RKCk7Y29uc3QgaWU9dWUoWiksZmU9bmUoe19fcHJvdG9fXzpudWxsLGRlZmF1bHQ6aWV9LFtaXSk7dmFyICQ9e2V4cG9ydHM6e319LHA9e307LyoqCiAqIEBsaWNlbnNlIFJlYWN0CiAqIHJlYWN0LWRvbS5wcm9kdWN0aW9uLmpzCiAqCiAqIENvcHlyaWdodCAoYykgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuCiAqCiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAqL3ZhciBXO2Z1bmN0aW9uIHNlKCl7aWYoVylyZXR1cm4gcDtXPTE7dmFyIF89USgpO2Z1bmN0aW9uIEUoaSl7dmFyIHQ9Imh0dHBzOi8vcmVhY3QuZGV2L2Vycm9ycy8iK2k7aWYoMTxhcmd1bWVudHMubGVuZ3RoKXt0Kz0iP2FyZ3NbXT0iK2VuY29kZVVSSUNvbXBvbmVudChhcmd1bWVudHNbMV0pO2Zvcih2YXIgYz0yO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspdCs9IiZhcmdzW109IitlbmNvZGVVUklDb21wb25lbnQoYXJndW1lbnRzW2NdKX1yZXR1cm4iTWluaWZpZWQgUmVhY3QgZXJyb3IgIyIraSsiOyB2aXNpdCAiK3QrIiBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuIn1mdW5jdGlvbiBnKCl7fXZhciB5PXtkOntmOmcscjpmdW5jdGlvbigpe3Rocm93IEVycm9yKEUoNTIyKSl9LEQ6ZyxDOmcsTDpnLG06ZyxYOmcsUzpnLE06Z30scDowLGZpbmRET01Ob2RlOm51bGx9LG09U3ltYm9sLmZvcigicmVhY3QucG9ydGFsIik7ZnVuY3Rpb24gVChpLHQsYyl7dmFyIFI9Mzxhcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOm51bGw7cmV0dXJueyQkdHlwZW9mOm0sa2V5OlI9PW51bGw/bnVsbDoiIitSLGNoaWxkcmVuOmksY29udGFpbmVySW5mbzp0LGltcGxlbWVudGF0aW9uOmN9fXZhciBPPV8uX19DTElFTlRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfV0FSTl9VU0VSU19USEVZX0NBTk5PVF9VUEdSQURFO2Z1bmN0aW9uIFMoaSx0KXtpZihpPT09ImZvbnQiKXJldHVybiIiO2lmKHR5cGVvZiB0PT0ic3RyaW5nIilyZXR1cm4gdD09PSJ1c2UtY3JlZGVudGlhbHMiP3Q6IiJ9cmV0dXJuIHAuX19ET01fSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfV0FSTl9VU0VSU19USEVZX0NBTk5PVF9VUEdSQURFPXkscC5jcmVhdGVQb3J0YWw9ZnVuY3Rpb24oaSx0KXt2YXIgYz0yPGFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06bnVsbDtpZighdHx8dC5ub2RlVHlwZSE9PTEmJnQubm9kZVR5cGUhPT05JiZ0Lm5vZGVUeXBlIT09MTEpdGhyb3cgRXJyb3IoRSgyOTkpKTtyZXR1cm4gVChpLHQsbnVsbCxjKX0scC5mbHVzaFN5bmM9ZnVuY3Rpb24oaSl7dmFyIHQ9Ty5ULGM9eS5wO3RyeXtpZihPLlQ9bnVsbCx5LnA9MixpKXJldHVybiBpKCl9ZmluYWxseXtPLlQ9dCx5LnA9Yyx5LmQuZigpfX0scC5wcmVjb25uZWN0PWZ1bmN0aW9uKGksdCl7dHlwZW9mIGk9PSJzdHJpbmciJiYodD8odD10LmNyb3NzT3JpZ2luLHQ9dHlwZW9mIHQ9PSJzdHJpbmciP3Q9PT0idXNlLWNyZWRlbnRpYWxzIj90OiIiOnZvaWQgMCk6dD1udWxsLHkuZC5DKGksdCkpfSxwLnByZWZldGNoRE5TPWZ1bmN0aW9uKGkpe3R5cGVvZiBpPT0ic3RyaW5nIiYmeS5kLkQoaSl9LHAucHJlaW5pdD1mdW5jdGlvbihpLHQpe2lmKHR5cGVvZiBpPT0ic3RyaW5nIiYmdCYmdHlwZW9mIHQuYXM9PSJzdHJpbmciKXt2YXIgYz10LmFzLFI9UyhjLHQuY3Jvc3NPcmlnaW4pLGg9dHlwZW9mIHQuaW50ZWdyaXR5PT0ic3RyaW5nIj90LmludGVncml0eTp2b2lkIDAsUD10eXBlb2YgdC5mZXRjaFByaW9yaXR5PT0ic3RyaW5nIj90LmZldGNoUHJpb3JpdHk6dm9pZCAwO2M9PT0ic3R5bGUiP3kuZC5TKGksdHlwZW9mIHQucHJlY2VkZW5jZT09InN0cmluZyI/dC5wcmVjZWRlbmNlOnZvaWQgMCx7Y3Jvc3NPcmlnaW46UixpbnRlZ3JpdHk6aCxmZXRjaFByaW9yaXR5OlB9KTpjPT09InNjcmlwdCImJnkuZC5YKGkse2Nyb3NzT3JpZ2luOlIsaW50ZWdyaXR5OmgsZmV0Y2hQcmlvcml0eTpQLG5vbmNlOnR5cGVvZiB0Lm5vbmNlPT0ic3RyaW5nIj90Lm5vbmNlOnZvaWQgMH0pfX0scC5wcmVpbml0TW9kdWxlPWZ1bmN0aW9uKGksdCl7aWYodHlwZW9mIGk9PSJzdHJpbmciKWlmKHR5cGVvZiB0PT0ib2JqZWN0IiYmdCE9PW51bGwpe2lmKHQuYXM9PW51bGx8fHQuYXM9PT0ic2NyaXB0Iil7dmFyIGM9Uyh0LmFzLHQuY3Jvc3NPcmlnaW4pO3kuZC5NKGkse2Nyb3NzT3JpZ2luOmMsaW50ZWdyaXR5OnR5cGVvZiB0LmludGVncml0eT09InN0cmluZyI/dC5pbnRlZ3JpdHk6dm9pZCAwLG5vbmNlOnR5cGVvZiB0Lm5vbmNlPT0ic3RyaW5nIj90Lm5vbmNlOnZvaWQgMH0pfX1lbHNlIHQ9PW51bGwmJnkuZC5NKGkpfSxwLnByZWxvYWQ9ZnVuY3Rpb24oaSx0KXtpZih0eXBlb2YgaT09InN0cmluZyImJnR5cGVvZiB0PT0ib2JqZWN0IiYmdCE9PW51bGwmJnR5cGVvZiB0LmFzPT0ic3RyaW5nIil7dmFyIGM9dC5hcyxSPVMoYyx0LmNyb3NzT3JpZ2luKTt5LmQuTChpLGMse2Nyb3NzT3JpZ2luOlIsaW50ZWdyaXR5OnR5cGVvZiB0LmludGVncml0eT09InN0cmluZyI/dC5pbnRlZ3JpdHk6dm9pZCAwLG5vbmNlOnR5cGVvZiB0Lm5vbmNlPT0ic3RyaW5nIj90Lm5vbmNlOnZvaWQgMCx0eXBlOnR5cGVvZiB0LnR5cGU9PSJzdHJpbmciP3QudHlwZTp2b2lkIDAsZmV0Y2hQcmlvcml0eTp0eXBlb2YgdC5mZXRjaFByaW9yaXR5PT0ic3RyaW5nIj90LmZldGNoUHJpb3JpdHk6dm9pZCAwLHJlZmVycmVyUG9saWN5OnR5cGVvZiB0LnJlZmVycmVyUG9saWN5PT0ic3RyaW5nIj90LnJlZmVycmVyUG9saWN5OnZvaWQgMCxpbWFnZVNyY1NldDp0eXBlb2YgdC5pbWFnZVNyY1NldD09InN0cmluZyI/dC5pbWFnZVNyY1NldDp2b2lkIDAsaW1hZ2VTaXplczp0eXBlb2YgdC5pbWFnZVNpemVzPT0ic3RyaW5nIj90LmltYWdlU2l6ZXM6dm9pZCAwLG1lZGlhOnR5cGVvZiB0Lm1lZGlhPT0ic3RyaW5nIj90Lm1lZGlhOnZvaWQgMH0pfX0scC5wcmVsb2FkTW9kdWxlPWZ1bmN0aW9uKGksdCl7aWYodHlwZW9mIGk9PSJzdHJpbmciKWlmKHQpe3ZhciBjPVModC5hcyx0LmNyb3NzT3JpZ2luKTt5LmQubShpLHthczp0eXBlb2YgdC5hcz09InN0cmluZyImJnQuYXMhPT0ic2NyaXB0Ij90LmFzOnZvaWQgMCxjcm9zc09yaWdpbjpjLGludGVncml0eTp0eXBlb2YgdC5pbnRlZ3JpdHk9PSJzdHJpbmciP3QuaW50ZWdyaXR5OnZvaWQgMH0pfWVsc2UgeS5kLm0oaSl9LHAucmVxdWVzdEZvcm1SZXNldD1mdW5jdGlvbihpKXt5LmQucihpKX0scC51bnN0YWJsZV9iYXRjaGVkVXBkYXRlcz1mdW5jdGlvbihpLHQpe3JldHVybiBpKHQpfSxwLnVzZUZvcm1TdGF0ZT1mdW5jdGlvbihpLHQsYyl7cmV0dXJuIE8uSC51c2VGb3JtU3RhdGUoaSx0LGMpfSxwLnVzZUZvcm1TdGF0dXM9ZnVuY3Rpb24oKXtyZXR1cm4gTy5ILnVzZUhvc3RUcmFuc2l0aW9uU3RhdHVzKCl9LHAudmVyc2lvbj0iMTkuMi41IixwfXZhciBYO2Z1bmN0aW9uIGNlKCl7aWYoWClyZXR1cm4gJC5leHBvcnRzO1g9MTtmdW5jdGlvbiBfKCl7aWYoISh0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fPiJ1Inx8dHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRSE9ImZ1bmN0aW9uIikpdHJ5e19fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRShfKX1jYXRjaChFKXtjb25zb2xlLmVycm9yKEUpfX1yZXR1cm4gXygpLCQuZXhwb3J0cz1zZSgpLCQuZXhwb3J0c31leHBvcnR7aWUgYXMgUixjZSBhcyBhLGZlIGFzIGIsUSBhcyBjLHVlIGFzIGcsWiBhcyByfTsK"
},
"/content-assets.mjs": {
"content_type": "application/octet-stream",
"bytes": 25,
"sha256": "6eec27650a023e5d1805c36b527913e976d473c2b4e5d659cbe1587643209e83",
"body_b64": "ZXhwb3J0IGRlZmF1bHQgbmV3IE1hcCgpOw=="
},
"/content-modules.mjs": {
"content_type": "application/octet-stream",
"bytes": 25,
"sha256": "6eec27650a023e5d1805c36b527913e976d473c2b4e5d659cbe1587643209e83",
"body_b64": "ZXhwb3J0IGRlZmF1bHQgbmV3IE1hcCgpOw=="
},
"/data-store.json": {
"content_type": "application/json; charset=utf-8",
"bytes": 1770,
"sha256": "0f8c41045ba9d7a27baa0ca811815c32a7ba13a1d1f8038383fce5f889b11d1d",
"body_b64": "W1siTWFwIiwxLDJdLCJtZXRhOjptZXRhIixbIk1hcCIsMyw0LDUsNl0sImFzdHJvLXZlcnNpb24iLCI1LjE4LjEiLCJhc3Ryby1jb25maWctZGlnZXN0Iiwie1wicm9vdFwiOnt9LFwic3JjRGlyXCI6e30sXCJwdWJsaWNEaXJcIjp7fSxcIm91dERpclwiOnt9LFwiY2FjaGVEaXJcIjp7fSxcImNvbXByZXNzSFRNTFwiOnRydWUsXCJiYXNlXCI6XCIvXCIsXCJ0cmFpbGluZ1NsYXNoXCI6XCJpZ25vcmVcIixcIm91dHB1dFwiOlwic2VydmVyXCIsXCJzY29wZWRTdHlsZVN0cmF0ZWd5XCI6XCJhdHRyaWJ1dGVcIixcImJ1aWxkXCI6e1wiZm9ybWF0XCI6XCJkaXJlY3RvcnlcIixcImNsaWVudFwiOnt9LFwic2VydmVyXCI6e30sXCJhc3NldHNcIjpcIl9hc3Ryb1wiLFwic2VydmVyRW50cnlcIjpcImVudHJ5Lm1qc1wiLFwicmVkaXJlY3RzXCI6ZmFsc2UsXCJpbmxpbmVTdHlsZXNoZWV0c1wiOlwiYXV0b1wiLFwiY29uY3VycmVuY3lcIjoxfSxcInNlcnZlclwiOntcIm9wZW5cIjpmYWxzZSxcImhvc3RcIjpmYWxzZSxcInBvcnRcIjo0MzIyLFwic3RyZWFtaW5nXCI6dHJ1ZSxcImFsbG93ZWRIb3N0c1wiOltdfSxcInJlZGlyZWN0c1wiOnt9LFwiaW1hZ2VcIjp7XCJlbmRwb2ludFwiOntcInJvdXRlXCI6XCIvX2ltYWdlXCIsXCJlbnRyeXBvaW50XCI6XCJhc3Ryby9hc3NldHMvZW5kcG9pbnQvZGV2XCJ9LFwic2VydmljZVwiOntcImVudHJ5cG9pbnRcIjpcImFzdHJvL2Fzc2V0cy9zZXJ2aWNlcy9zaGFycFwiLFwiY29uZmlnXCI6e319LFwiZG9tYWluc1wiOltdLFwicmVtb3RlUGF0dGVybnNcIjpbXSxcInJlc3BvbnNpdmVTdHlsZXNcIjpmYWxzZX0sXCJkZXZUb29sYmFyXCI6e1wiZW5hYmxlZFwiOnRydWV9LFwibWFya2Rvd25cIjp7XCJzeW50YXhIaWdobGlnaHRcIjp7XCJ0eXBlXCI6XCJzaGlraVwiLFwiZXhjbHVkZUxhbmdzXCI6W1wibWF0aFwiXX0sXCJzaGlraUNvbmZpZ1wiOntcImxhbmdzXCI6W10sXCJsYW5nQWxpYXNcIjp7fSxcInRoZW1lXCI6XCJnaXRodWItZGFya1wiLFwidGhlbWVzXCI6e30sXCJ3cmFwXCI6ZmFsc2UsXCJ0cmFuc2Zvcm1lcnNcIjpbXX0sXCJyZW1hcmtQbHVnaW5zXCI6W10sXCJyZWh5cGVQbHVnaW5zXCI6W10sXCJyZW1hcmtSZWh5cGVcIjp7fSxcImdmbVwiOnRydWUsXCJzbWFydHlwYW50c1wiOnRydWV9LFwic2VjdXJpdHlcIjp7XCJjaGVja09yaWdpblwiOnRydWUsXCJhbGxvd2VkRG9tYWluc1wiOltdLFwiYWN0aW9uQm9keVNpemVMaW1pdFwiOjEwNDg1NzZ9LFwiZW52XCI6e1wic2NoZW1hXCI6e30sXCJ2YWxpZGF0ZVNlY3JldHNcIjpmYWxzZX0sXCJleHBlcmltZW50YWxcIjp7XCJjbGllbnRQcmVyZW5kZXJcIjpmYWxzZSxcImNvbnRlbnRJbnRlbGxpc2Vuc2VcIjpmYWxzZSxcImhlYWRpbmdJZENvbXBhdFwiOmZhbHNlLFwicHJlc2VydmVTY3JpcHRPcmRlclwiOmZhbHNlLFwibGl2ZUNvbnRlbnRDb2xsZWN0aW9uc1wiOmZhbHNlLFwiY3NwXCI6ZmFsc2UsXCJzdGF0aWNJbXBvcnRNZXRhRW52XCI6ZmFsc2UsXCJjaHJvbWVEZXZ0b29sc1dvcmtzcGFjZVwiOmZhbHNlLFwiZmFpbE9uUHJlcmVuZGVyQ29uZmxpY3RcIjpmYWxzZSxcInN2Z29cIjpmYWxzZX0sXCJsZWdhY3lcIjp7XCJjb2xsZWN0aW9uc1wiOmZhbHNlfSxcInNlc3Npb25cIjp7XCJkcml2ZXJcIjpcImZzLWxpdGVcIixcIm9wdGlvbnNcIjp7XCJiYXNlXCI6XCIvaG9tZS9tYXRpYXMvRG9jdW1lbnRzL3Byb3llY3Rvcy9uYXBzZWVyL2Zyb250ZW5kL25vZGVfbW9kdWxlcy8uYXN0cm8vc2Vzc2lvbnNcIn19fSJd"
},
"/": {
"content_type": "text/html; charset=utf-8",
"bytes": 5687,
"sha256": "c36cc5d057453f966d73bedaada9e99c9b62872ea590b09df0a6a5575bac9f37",
"body_b64": "PCFET0NUWVBFIGh0bWw+PGh0bWwgbGFuZz0iZW4iPiA8aGVhZD48bWV0YSBjaGFyc2V0PSJ1dGYtOCI+PG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIj48dGl0bGU+TmFwc2VlciBsb2NhbCBtYW5hZ2VyPC90aXRsZT48bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii9fYXN0cm8vaW5kZXguQkluZlRjNXUuY3NzIj48L2hlYWQ+IDxib2R5PiA8c3R5bGU+YXN0cm8taXNsYW5kLGFzdHJvLXNsb3QsYXN0cm8tc3RhdGljLXNsb3R7ZGlzcGxheTpjb250ZW50c308L3N0eWxlPjxzY3JpcHQ+KCgpPT57dmFyIGU9YXN5bmMgdD0+e2F3YWl0KGF3YWl0IHQoKSkoKX07KHNlbGYuQXN0cm98fChzZWxmLkFzdHJvPXt9KSkubG9hZD1lO3dpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgiYXN0cm86bG9hZCIpKTt9KSgpOzwvc2NyaXB0PjxzY3JpcHQ+KCgpPT57dmFyIEE9T2JqZWN0LmRlZmluZVByb3BlcnR5O3ZhciBnPShpLG8sYSk9Pm8gaW4gaT9BKGksbyx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6YX0pOmlbb109YTt2YXIgZD0oaSxvLGEpPT5nKGksdHlwZW9mIG8hPSJzeW1ib2wiP28rIiI6byxhKTt7bGV0IGk9ezA6dD0+bSh0KSwxOnQ9PmEodCksMjp0PT5uZXcgUmVnRXhwKHQpLDM6dD0+bmV3IERhdGUodCksNDp0PT5uZXcgTWFwKGEodCkpLDU6dD0+bmV3IFNldChhKHQpKSw2OnQ9PkJpZ0ludCh0KSw3OnQ9Pm5ldyBVUkwodCksODp0PT5uZXcgVWludDhBcnJheSh0KSw5OnQ9Pm5ldyBVaW50MTZBcnJheSh0KSwxMDp0PT5uZXcgVWludDMyQXJyYXkodCksMTE6dD0+MS8wKnR9LG89dD0+e2xldFtsLGVdPXQ7cmV0dXJuIGwgaW4gaT9pW2xdKGUpOnZvaWQgMH0sYT10PT50Lm1hcChvKSxtPXQ9PnR5cGVvZiB0IT0ib2JqZWN0Inx8dD09PW51bGw/dDpPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXModCkubWFwKChbbCxlXSk9PltsLG8oZSldKSk7Y2xhc3MgeSBleHRlbmRzIEhUTUxFbGVtZW50e2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTtkKHRoaXMsIkNvbXBvbmVudCIpO2QodGhpcywiaHlkcmF0b3IiKTtkKHRoaXMsImh5ZHJhdGUiLGFzeW5jKCk9Pnt2YXIgYjtpZighdGhpcy5oeWRyYXRvcnx8IXRoaXMuaXNDb25uZWN0ZWQpcmV0dXJuO2xldCBlPShiPXRoaXMucGFyZW50RWxlbWVudCk9PW51bGw/dm9pZCAwOmIuY2xvc2VzdCgiYXN0cm8taXNsYW5kW3Nzcl0iKTtpZihlKXtlLmFkZEV2ZW50TGlzdGVuZXIoImFzdHJvOmh5ZHJhdGUiLHRoaXMuaHlkcmF0ZSx7b25jZTohMH0pO3JldHVybn1sZXQgYz10aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoImFzdHJvLXNsb3QiKSxuPXt9LGg9dGhpcy5xdWVyeVNlbGVjdG9yQWxsKCJ0ZW1wbGF0ZVtkYXRhLWFzdHJvLXRlbXBsYXRlXSIpO2ZvcihsZXQgciBvZiBoKXtsZXQgcz1yLmNsb3Nlc3QodGhpcy50YWdOYW1lKTtzIT1udWxsJiZzLmlzU2FtZU5vZGUodGhpcykmJihuW3IuZ2V0QXR0cmlidXRlKCJkYXRhLWFzdHJvLXRlbXBsYXRlIil8fCJkZWZhdWx0Il09ci5pbm5lckhUTUwsci5yZW1vdmUoKSl9Zm9yKGxldCByIG9mIGMpe2xldCBzPXIuY2xvc2VzdCh0aGlzLnRhZ05hbWUpO3MhPW51bGwmJnMuaXNTYW1lTm9kZSh0aGlzKSYmKG5bci5nZXRBdHRyaWJ1dGUoIm5hbWUiKXx8ImRlZmF1bHQiXT1yLmlubmVySFRNTCl9bGV0IHA7dHJ5e3A9dGhpcy5oYXNBdHRyaWJ1dGUoInByb3BzIik/bShKU09OLnBhcnNlKHRoaXMuZ2V0QXR0cmlidXRlKCJwcm9wcyIpKSk6e319Y2F0Y2gocil7bGV0IHM9dGhpcy5nZXRBdHRyaWJ1dGUoImNvbXBvbmVudC11cmwiKXx8Ijx1bmtub3duPiIsdj10aGlzLmdldEF0dHJpYnV0ZSgiY29tcG9uZW50LWV4cG9ydCIpO3Rocm93IHYmJihzKz1gIChleHBvcnQgJHt2fSlgKSxjb25zb2xlLmVycm9yKGBbaHlkcmF0ZV0gRXJyb3IgcGFyc2luZyBwcm9wcyBmb3IgY29tcG9uZW50ICR7c31gLHRoaXMuZ2V0QXR0cmlidXRlKCJwcm9wcyIpLHIpLHJ9bGV0IHU7YXdhaXQgdGhpcy5oeWRyYXRvcih0aGlzKSh0aGlzLkNvbXBvbmVudCxwLG4se2NsaWVudDp0aGlzLmdldEF0dHJpYnV0ZSgiY2xpZW50Iil9KSx0aGlzLnJlbW92ZUF0dHJpYnV0ZSgic3NyIiksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiYXN0cm86aHlkcmF0ZSIpKX0pO2QodGhpcywidW5tb3VudCIsKCk9Pnt0aGlzLmlzQ29ubmVjdGVkfHx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJhc3Rybzp1bm1vdW50IikpfSl9ZGlzY29ubmVjdGVkQ2FsbGJhY2soKXtkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJhc3RybzphZnRlci1zd2FwIix0aGlzLnVubW91bnQpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImFzdHJvOmFmdGVyLXN3YXAiLHRoaXMudW5tb3VudCx7b25jZTohMH0pfWNvbm5lY3RlZENhbGxiYWNrKCl7aWYoIXRoaXMuaGFzQXR0cmlidXRlKCJhd2FpdC1jaGlsZHJlbiIpfHxkb2N1bWVudC5yZWFkeVN0YXRlPT09ImludGVyYWN0aXZlInx8ZG9jdW1lbnQucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpdGhpcy5jaGlsZHJlbkNvbm5lY3RlZENhbGxiYWNrKCk7ZWxzZXtsZXQgZT0oKT0+e2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLGUpLGMuZGlzY29ubmVjdCgpLHRoaXMuY2hpbGRyZW5Db25uZWN0ZWRDYWxsYmFjaygpfSxjPW5ldyBNdXRhdGlvbk9ic2VydmVyKCgpPT57dmFyIG47KChuPXRoaXMubGFzdENoaWxkKT09bnVsbD92b2lkIDA6bi5ub2RlVHlwZSk9PT1Ob2RlLkNPTU1FTlRfTk9ERSYmdGhpcy5sYXN0Q2hpbGQubm9kZVZhbHVlPT09ImFzdHJvOmVuZCImJih0aGlzLmxhc3RDaGlsZC5yZW1vdmUoKSxlKCkpfSk7Yy5vYnNlcnZlKHRoaXMse2NoaWxkTGlzdDohMH0pLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLGUpfX1hc3luYyBjaGlsZHJlbkNvbm5lY3RlZENhbGxiYWNrKCl7bGV0IGU9dGhpcy5nZXRBdHRyaWJ1dGUoImJlZm9yZS1oeWRyYXRpb24tdXJsIik7ZSYmYXdhaXQgaW1wb3J0KGUpLHRoaXMuc3RhcnQoKX1hc3luYyBzdGFydCgpe2xldCBlPUpTT04ucGFyc2UodGhpcy5nZXRBdHRyaWJ1dGUoIm9wdHMiKSksYz10aGlzLmdldEF0dHJpYnV0ZSgiY2xpZW50Iik7aWYoQXN0cm9bY109PT12b2lkIDApe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKGBhc3Rybzoke2N9YCwoKT0+dGhpcy5zdGFydCgpLHtvbmNlOiEwfSk7cmV0dXJufXRyeXthd2FpdCBBc3Ryb1tjXShhc3luYygpPT57bGV0IG49dGhpcy5nZXRBdHRyaWJ1dGUoInJlbmRlcmVyLXVybCIpLFtoLHtkZWZhdWx0OnB9XT1hd2FpdCBQcm9taXNlLmFsbChbaW1wb3J0KHRoaXMuZ2V0QXR0cmlidXRlKCJjb21wb25lbnQtdXJsIikpLG4/aW1wb3J0KG4pOigpPT4oKT0+e31dKSx1PXRoaXMuZ2V0QXR0cmlidXRlKCJjb21wb25lbnQtZXhwb3J0Iil8fCJkZWZhdWx0IjtpZighdS5pbmNsdWRlcygiLiIpKXRoaXMuQ29tcG9uZW50PWhbdV07ZWxzZXt0aGlzLkNvbXBvbmVudD1oO2ZvcihsZXQgZiBvZiB1LnNwbGl0KCIuIikpdGhpcy5Db21wb25lbnQ9dGhpcy5Db21wb25lbnRbZl19cmV0dXJuIHRoaXMuaHlkcmF0b3I9cCx0aGlzLmh5ZHJhdGV9LGUsdGhpcyl9Y2F0Y2gobil7Y29uc29sZS5lcnJvcihgW2FzdHJvLWlzbGFuZF0gRXJyb3IgaHlkcmF0aW5nICR7dGhpcy5nZXRBdHRyaWJ1dGUoImNvbXBvbmVudC11cmwiKX1gLG4pfX1hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soKXt0aGlzLmh5ZHJhdGUoKX19ZCh5LCJvYnNlcnZlZEF0dHJpYnV0ZXMiLFsicHJvcHMiXSksY3VzdG9tRWxlbWVudHMuZ2V0KCJhc3Ryby1pc2xhbmQiKXx8Y3VzdG9tRWxlbWVudHMuZGVmaW5lKCJhc3Ryby1pc2xhbmQiLHkpfX0pKCk7PC9zY3JpcHQ+PGFzdHJvLWlzbGFuZCB1aWQ9IjJnRGl0diIgcHJlZml4PSJyMSIgY29tcG9uZW50LXVybD0iL19hc3Ryby9Mb2NhbE1hbmFnZXJBcHAuQzgxUHJZaGEuanMiIGNvbXBvbmVudC1leHBvcnQ9ImRlZmF1bHQiIHJlbmRlcmVyLXVybD0iL19hc3Ryby9jbGllbnQuQ3hZbHIzdl8uanMiIHByb3BzPSJ7fSIgc3NyIGNsaWVudD0ibG9hZCIgb3B0cz0ieyZxdW90O25hbWUmcXVvdDs6JnF1b3Q7TG9jYWxNYW5hZ2VyQXBwJnF1b3Q7LCZxdW90O3ZhbHVlJnF1b3Q7OnRydWV9IiBhd2FpdC1jaGlsZHJlbj48c3R5bGUgZGF0YS1tYW50aW5lLXN0eWxlcz0idHJ1ZSI+CgoKCjwvc3R5bGU+PHN0eWxlIGRhdGEtbWFudGluZS1zdHlsZXM9ImNsYXNzZXMiPkBtZWRpYSAobWF4LXdpZHRoOiAzNS45OTM3NWVtKSB7Lm1hbnRpbmUtdmlzaWJsZS1mcm9tLXhzIHtkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7fX1AbWVkaWEgKG1pbi13aWR0aDogMzZlbSkgey5tYW50aW5lLWhpZGRlbi1mcm9tLXhzIHtkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7fX1AbWVkaWEgKG1heC13aWR0aDogNDcuOTkzNzVlbSkgey5tYW50aW5lLXZpc2libGUtZnJvbS1zbSB7ZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O319QG1lZGlhIChtaW4td2lkdGg6IDQ4ZW0pIHsubWFudGluZS1oaWRkZW4tZnJvbS1zbSB7ZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O319QG1lZGlhIChtYXgtd2lkdGg6IDYxLjk5Mzc1ZW0pIHsubWFudGluZS12aXNpYmxlLWZyb20tbWQge2Rpc3BsYXk6IG5vbmUgIWltcG9ydGFudDt9fUBtZWRpYSAobWluLXdpZHRoOiA2MmVtKSB7Lm1hbnRpbmUtaGlkZGVuLWZyb20tbWQge2Rpc3BsYXk6IG5vbmUgIWltcG9ydGFudDt9fUBtZWRpYSAobWF4LXdpZHRoOiA3NC45OTM3NWVtKSB7Lm1hbnRpbmUtdmlzaWJsZS1mcm9tLWxnIHtkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7fX1AbWVkaWEgKG1pbi13aWR0aDogNzVlbSkgey5tYW50aW5lLWhpZGRlbi1mcm9tLWxnIHtkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7fX1AbWVkaWEgKG1heC13aWR0aDogODcuOTkzNzVlbSkgey5tYW50aW5lLXZpc2libGUtZnJvbS14bCB7ZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O319QG1lZGlhIChtaW4td2lkdGg6IDg4ZW0pIHsubWFudGluZS1oaWRkZW4tZnJvbS14bCB7ZGlzcGxheTogbm9uZSAhaW1wb3J0YW50O319PC9zdHlsZT48bWFpbj48ZGl2IGNsYXNzPSJ0b3BiYXIiPjxkaXYgY2xhc3M9ImJyYW5kIj48c3BhbiBjbGFzcz0ibWFyayI+Tjwvc3Bhbj48c3Bhbj5OYXBzZWVyIGxvY2FsIG1hbmFnZXI8L3NwYW4+PC9kaXY+PC9kaXY+PHNlY3Rpb24gY2xhc3M9InByb2plY3QtZGFzaGJvYXJkLWxpc3QiPjxkaXYgY2xhc3M9InNlY3Rpb24taGVhZCI+PGRpdj48aDE+UHJvamVjdHM8L2gxPjxwIGNsYXNzPSJtdXRlZCI+TG9jYWwgbWFuYWdlciBpcyBzY29wZWQgdG8gdGhlIHByb2plY3QgY29uZmlndXJlZCBpbiB0aGlzIHJlcG9zaXRvcnkuPC9wPjwvZGl2PjwvZGl2PjxidXR0b24gY2xhc3M9ImxvY2FsLXByb2plY3QtY2FyZCIgdHlwZT0iYnV0dG9uIj48c3BhbiBjbGFzcz0icmVjb3JkLWtpY2tlciI+cGxhaW50ZXh0PC9zcGFuPjxzdHJvbmc+TG9jYWwgcHJvamVjdDwvc3Ryb25nPjxwPk5vIHByb2plY3QgZGVzY3JpcHRpb24geWV0LjwvcD48Y29kZT5ub3QgY29uZmlndXJlZDwvY29kZT48L2J1dHRvbj48L3NlY3Rpb24+PC9tYWluPjwhLS1hc3RybzplbmQtLT48L2FzdHJvLWlzbGFuZD4gPC9ib2R5PjwvaHRtbD4="
}
}
# END GENERATED LOCAL UI ASSETS
PUBLIC_AUTH_KEYS = {
"base_url",
"project_id",
"project_slug",
"project_name",
"project_signing_key_fingerprint",
"worker_id",
"agent_id",
"worker_name",
"device_fingerprint",
"root_path",
"worker_capabilities",
"account_mode",
"claimed_account_id",
"claimed_at",
"vault_path",
"gateway_auth_required",
"service_registration_id",
}
SECRET_AUTH_KEYS = {
"token",
"access_token",
"token_expires_at",
"ssh_key_path",
"ssh_private_key",
"ssh_public_key",
"gateway_encryption_key",
"account_claim_url",
"account_claim_expires_at",
"claim_result",
"service_activation_token",
}
GATEWAY_VAULT_KEYS = {
"gateway_encryption_key",
"gateway_tmux_target",
"gateway_default_command",
"gateway_managed_session",
"gateway_managed_window",
"gateway_remote_enabled",
"gateway_relay_url",
"service_activation_token",
}
AUTH_FILE_KEYS = (PUBLIC_AUTH_KEYS | SECRET_AUTH_KEYS) - GATEWAY_VAULT_KEYS
PROTECTED_TOOLS = set()
PUBLIC_TOOLS = {
"napseer_auth_status",
"napseer_gateway_status",
"napseer_gateway_setup",
"napseer_gateway_unlock",
"napseer_gateway_lock",
"napseer_gateway_configure",
"napseer_gateway_restart",
"napseer_gateway_kill",
"napseer_renew_auth",
"napseer_update_status",
"napseer_update_self",
"napseer_explore_tools",
"napseer_contract_profile",
"napseer_acquire_lock",
"napseer_renew_lock",
"napseer_release_lock",
"napseer_list_locks",
"napseer_reindex_project",
"napseer_search_local",
"napseer_index_status",
"napseer_clear_local_index",
"napseer_search_memory",
"napseer_get_memory_context",
"napseer_find_related_nodes",
"napseer_recent_memory",
"napseer_list_folders",
"napseer_list_tags",
"napseer_move_node",
"napseer_move_folder",
"napseer_bulk_upsert_nodes",
"napseer_open_ui",
"napseer_create_project",
"napseer_create_node",
"napseer_upsert_node",
"napseer_update_node_by_path",
"napseer_archive_node_by_path",
"napseer_get_node_by_path",
"napseer_link_nodes",
"napseer_get_backlinks",
"napseer_list_nodes",
"napseer_list_agent_nodes",
"napseer_get_agent_node",
"napseer_upsert_agent_node",
"napseer_update_agent_node",
"napseer_archive_agent_node",
"napseer_link_agent_node",
"napseer_list_feedback",
"napseer_update_feedback_status",
"napseer_submit_feedback",
"napseer_claim_account",
"napseer_register_project_signing_key",
"napseer_create_signed_schedule",
}
VAULT_SCHEMA = "napseer.vault.v1"
GATEWAY_RELAY_SECRET_SCHEMA = "napseer.gateway-relay-secret.v1"
GATEWAY_RELAY_STATE_SCHEMA = "napseer.gateway-relay-state.v1"
GATEWAY_SCHEDULES_SCHEMA = "napseer.gateway-schedules.v1"
GATEWAY_RELAY_SECRET_ITERATIONS = int(os.environ.get("NAPSEER_GATEWAY_RELAY_SECRET_ITERATIONS", "210000"))
VAULT_KDF_ITERATIONS = int(os.environ.get("NAPSEER_VAULT_KDF_ITERATIONS", "390000"))
GATEWAY_IDLE_TIMEOUT_SECONDS = int(os.environ.get("NAPSEER_GATEWAY_IDLE_TIMEOUT_SECONDS", "900"))
GATEWAY_MAX_LOG_BYTES = int(os.environ.get("NAPSEER_GATEWAY_MAX_LOG_BYTES", str(5 * 1024 * 1024)))
VAULT_SECRETS = {}
VAULT_KEY = None
GATEWAY_UNLOCKED = False
GATEWAY_LAST_USED_AT = None
GATEWAY_LOCK = threading.RLock()
GATEWAY_SCHEDULE_LOCK = threading.RLock()
GATEWAY_RELAY_THREADS = set()
GATEWAY_LISTENER_SEND_LOCK = threading.Lock()
GATEWAY_LISTENER_CONNECTED = False
GATEWAY_LISTENER_LAST_CONNECTED_AT = None
GATEWAY_LISTENER_LAST_ERROR = ""
GATEWAY_LISTENER_LAST_ERROR_AT = None
GATEWAY_PERIODIC_LOG_STATE = {}
WS_CLOSE_DETAILS = {}
def gateway_log(event, level="info", **fields):
payload = {
"ts": iso_now(),
"level": level,
"component": "gateway",
"event": event,
}
for key, value in fields.items():
if value is None:
continue
if isinstance(value, pathlib.Path):
payload[key] = str(value)
elif isinstance(value, (str, bool, int, float, list, dict)):
payload[key] = value
else:
payload[key] = str(value)
print(json.dumps(payload, separators=(",", ":"), sort_keys=True), file=sys.stderr, flush=True)
def gateway_periodic_log(key, interval_seconds, event, level="info", **fields):
now = time.monotonic()
fingerprint = json.dumps(fields, sort_keys=True, default=str)
last = GATEWAY_PERIODIC_LOG_STATE.get(key)
if last and (now - float(last.get("at", 0))) < interval_seconds and last.get("fingerprint") == fingerprint:
return
GATEWAY_PERIODIC_LOG_STATE[key] = {"at": now, "fingerprint": fingerprint}
gateway_log(event, level=level, **fields)
def compact_log_file(path, max_bytes):
if max_bytes <= 0:
return
file_path = pathlib.Path(path)
try:
size = file_path.stat().st_size
except FileNotFoundError:
return
except OSError:
return
if size <= max_bytes:
return
try:
with file_path.open("rb") as handle:
handle.seek(-max_bytes, os.SEEK_END)
chunk = handle.read(max_bytes)
except OSError:
return
newline_index = chunk.find(b"\n")
if newline_index >= 0 and newline_index + 1 < len(chunk):
chunk = chunk[newline_index + 1 :]
tmp_path = file_path.with_suffix(file_path.suffix + ".tmp")
try:
tmp_path.write_bytes(chunk)
tmp_path.replace(file_path)
except OSError:
try:
tmp_path.unlink(missing_ok=True)
except OSError:
pass
def start_gateway_log_compactor_thread():
def loop():
while True:
try:
compact_log_file(AUTH_DIR / "gateway.log", GATEWAY_MAX_LOG_BYTES)
except Exception:
pass
time.sleep(30)
threading.Thread(target=loop, name="napseer-gateway-log-compactor", daemon=True).start()
def _rotl32(value, shift):
return ((value << shift) & 0xFFFFFFFF) | (value >> (32 - shift))
def _quarter_round(state, a, b, c, d):
state[a] = (state[a] + state[b]) & 0xFFFFFFFF
state[d] ^= state[a]
state[d] = _rotl32(state[d], 16)
state[c] = (state[c] + state[d]) & 0xFFFFFFFF
state[b] ^= state[c]
state[b] = _rotl32(state[b], 12)
state[a] = (state[a] + state[b]) & 0xFFFFFFFF
state[d] ^= state[a]
state[d] = _rotl32(state[d], 8)
state[c] = (state[c] + state[d]) & 0xFFFFFFFF
state[b] ^= state[c]
state[b] = _rotl32(state[b], 7)
def _chacha20_block(key, counter, nonce):
constants = b"expand 32-byte k"
state = list(struct.unpack("<4I", constants))
state.extend(struct.unpack("<8I", key))
state.append(counter & 0xFFFFFFFF)
state.extend(struct.unpack("<3I", nonce))
working = state[:]
for _ in range(10):
_quarter_round(working, 0, 4, 8, 12)
_quarter_round(working, 1, 5, 9, 13)
_quarter_round(working, 2, 6, 10, 14)
_quarter_round(working, 3, 7, 11, 15)
_quarter_round(working, 0, 5, 10, 15)
_quarter_round(working, 1, 6, 11, 12)
_quarter_round(working, 2, 7, 8, 13)
_quarter_round(working, 3, 4, 9, 14)
return struct.pack("<16I", *[((working[i] + state[i]) & 0xFFFFFFFF) for i in range(16)])
def _chacha20_xor(key, nonce, data):
output = bytearray()
counter = 1
for offset in range(0, len(data), 64):
block = _chacha20_block(key, counter, nonce)
chunk = data[offset : offset + 64]
output.extend(bytes(left ^ right for left, right in zip(chunk, block)))
counter = (counter + 1) & 0xFFFFFFFF
return bytes(output)
def _poly1305_mac(message, key):
r = int.from_bytes(key[:16], "little")
r &= 0x0FFFFFFC0FFFFFFC0FFFFFFC0FFFFFFF
s = int.from_bytes(key[16:], "little")
p = (1 << 130) - 5
acc = 0
for offset in range(0, len(message), 16):
block = message[offset : offset + 16]
acc = (acc + int.from_bytes(block + b"\x01", "little")) % p
acc = (acc * r) % p
return ((acc + s) % (1 << 128)).to_bytes(16, "little")
def _aead_mac_data(aad, ciphertext):
def pad16(data):
remainder = len(data) % 16
return b"" if remainder == 0 else b"\x00" * (16 - remainder)
return aad + pad16(aad) + ciphertext + pad16(ciphertext) + struct.pack("<QQ", len(aad), len(ciphertext))
def _encrypt_vault_payload(key, plaintext, aad=b""):
nonce = secrets.token_bytes(12)
one_time_key = _chacha20_block(key, 0, nonce)[:32]
ciphertext = _chacha20_xor(key, nonce, plaintext)
tag = _poly1305_mac(_aead_mac_data(aad, ciphertext), one_time_key)
return nonce, ciphertext, tag
def _decrypt_vault_payload(key, nonce, ciphertext, tag, aad=b""):
one_time_key = _chacha20_block(key, 0, nonce)[:32]
expected = _poly1305_mac(_aead_mac_data(aad, ciphertext), one_time_key)
if not hmac.compare_digest(expected, tag):
raise ValueError("gateway unlock failed")
return _chacha20_xor(key, nonce, ciphertext)
def _derive_vault_key(passphrase, salt, iterations):
if not isinstance(passphrase, str) or not passphrase:
raise ValueError("master passphrase is required")
return hashlib.pbkdf2_hmac("sha256", passphrase.encode("utf-8"), salt, iterations, dklen=32)
def read_master_passphrase(create=False):
value = os.environ.get("NAPSEER_MASTER_PASSPHRASE")
if value:
return value
if not sys.stdin.isatty():
raise RuntimeError("NAPSEER_MASTER_PASSPHRASE is required in non-interactive mode")
first = getpass.getpass("Create master passphrase: " if create else "Master passphrase: ")
if create:
second = getpass.getpass("Confirm master passphrase: ")
if first != second:
raise RuntimeError("master passphrases did not match")
return first
def vault_exists():
return VAULT_PATH.exists()
def load_public_auth_file():
if not AUTH_PATH.exists():
return {}
try:
data = json.loads(AUTH_PATH.read_text(encoding="utf-8"))
except Exception as exc:
raise RuntimeError(f"failed to read {AUTH_PATH}: {exc}") from exc
if not isinstance(data, dict):
raise RuntimeError(f"{AUTH_PATH} must contain a JSON object")
return data
def write_public_auth(data):
public = {key: value for key, value in data.items() if key in AUTH_FILE_KEYS and value is not None}
if vault_exists() or data.get("gateway_auth_required"):
public["gateway_auth_required"] = True
public["vault_path"] = str(VAULT_PATH)
AUTH_PATH.parent.mkdir(exist_ok=True)
chmod_best_effort(AUTH_PATH.parent, 0o700)
AUTH_PATH.write_text(json.dumps(public, indent=2) + "\n", encoding="utf-8")
chmod_best_effort(AUTH_PATH, 0o600)
def read_vault(passphrase, return_key=False):
envelope = json.loads(VAULT_PATH.read_text(encoding="utf-8"))
if envelope.get("schema") != VAULT_SCHEMA:
raise ValueError("gateway unlock failed")
kdf = envelope.get("kdf") or {}
cipher = envelope.get("cipher") or {}
if kdf.get("name") != "pbkdf2-sha256" or cipher.get("name") != "chacha20-poly1305":
raise ValueError("gateway unlock failed")
salt = base64.b64decode(kdf["salt"])
iterations = int(kdf["iterations"])
nonce = base64.b64decode(cipher["nonce"])
ciphertext = base64.b64decode(cipher["ciphertext"])
tag = base64.b64decode(cipher["tag"])
key = _derive_vault_key(passphrase, salt, iterations)
plaintext = _decrypt_vault_payload(key, nonce, ciphertext, tag, VAULT_SCHEMA.encode("utf-8"))
data = json.loads(plaintext.decode("utf-8"))
if not isinstance(data, dict):
raise ValueError("gateway unlock failed")
return (data, key) if return_key else data
def write_vault(passphrase, payload):
salt = secrets.token_bytes(16)
key = _derive_vault_key(passphrase, salt, VAULT_KDF_ITERATIONS)
plaintext = json.dumps(payload, sort_keys=True, separators=(",", ":")).encode("utf-8")
nonce, ciphertext, tag = _encrypt_vault_payload(key, plaintext, VAULT_SCHEMA.encode("utf-8"))
AUTH_DIR.mkdir(exist_ok=True)
chmod_best_effort(AUTH_DIR, 0o700)
VAULT_PATH.write_text(
json.dumps(
{
"schema": VAULT_SCHEMA,
"created_at": iso_now(),
"kdf": {
"name": "pbkdf2-sha256",
"iterations": VAULT_KDF_ITERATIONS,
"salt": base64.b64encode(salt).decode("ascii"),
},
"cipher": {
"name": "chacha20-poly1305",
"nonce": base64.b64encode(nonce).decode("ascii"),
"ciphertext": base64.b64encode(ciphertext).decode("ascii"),
"tag": base64.b64encode(tag).decode("ascii"),
},
},
indent=2,
)
+ "\n",
encoding="utf-8",
)
chmod_best_effort(VAULT_PATH, 0o600)
def write_vault_with_key(key, payload):
if not key:
raise RuntimeError("gateway is locked; unlock before updating vault secrets")
plaintext = json.dumps(payload, sort_keys=True, separators=(",", ":")).encode("utf-8")
nonce, ciphertext, tag = _encrypt_vault_payload(key, plaintext, VAULT_SCHEMA.encode("utf-8"))
envelope = json.loads(VAULT_PATH.read_text(encoding="utf-8"))
envelope["cipher"] = {
"name": "chacha20-poly1305",
"nonce": base64.b64encode(nonce).decode("ascii"),
"ciphertext": base64.b64encode(ciphertext).decode("ascii"),
"tag": base64.b64encode(tag).decode("ascii"),
}
VAULT_PATH.write_text(json.dumps(envelope, indent=2) + "\n", encoding="utf-8")
chmod_best_effort(VAULT_PATH, 0o600)
def persist_vault_secrets():
write_vault_with_key(VAULT_KEY, {"version": 1, "updated_at": iso_now(), "secrets": VAULT_SECRETS})
chmod_best_effort(VAULT_PATH, 0o600)
def derive_gateway_relay_secret(passphrase):
return hashlib.pbkdf2_hmac(
"sha256",
str(passphrase).encode("utf-8"),
b"napseer-gateway-relay-secret:v1",
GATEWAY_RELAY_SECRET_ITERATIONS,
dklen=32,
)
def write_gateway_relay_secret(passphrase):
AUTH_DIR.mkdir(exist_ok=True)
chmod_best_effort(AUTH_DIR, 0o700)
GATEWAY_RELAY_SECRET_PATH.write_text(
json.dumps(
{
"schema": GATEWAY_RELAY_SECRET_SCHEMA,
"kdf": {
"name": "pbkdf2-sha256",
"iterations": GATEWAY_RELAY_SECRET_ITERATIONS,
"salt": "napseer-gateway-relay-secret:v1",
},
"secret": base64.b64encode(derive_gateway_relay_secret(passphrase)).decode("ascii"),
},
indent=2,
)
+ "\n",
encoding="utf-8",
)
chmod_best_effort(GATEWAY_RELAY_SECRET_PATH, 0o600)
def read_gateway_relay_secret():
if not GATEWAY_RELAY_SECRET_PATH.exists():
return None
try:
payload = json.loads(GATEWAY_RELAY_SECRET_PATH.read_text(encoding="utf-8"))
if payload.get("schema") != GATEWAY_RELAY_SECRET_SCHEMA:
return None
return base64.b64decode(payload["secret"])
except Exception:
return None
def read_gateway_relay_state():
if not GATEWAY_RELAY_STATE_PATH.exists():
return {}
try:
payload = json.loads(GATEWAY_RELAY_STATE_PATH.read_text(encoding="utf-8"))
if payload.get("schema") != GATEWAY_RELAY_STATE_SCHEMA:
return {}
return payload if isinstance(payload, dict) else {}
except Exception:
return {}
def write_gateway_relay_state(**updates):
current = read_gateway_relay_state()
current.update({key: value for key, value in updates.items() if value is not None})
current["schema"] = GATEWAY_RELAY_STATE_SCHEMA
current["updated_at"] = iso_now()
AUTH_DIR.mkdir(exist_ok=True)
chmod_best_effort(AUTH_DIR, 0o700)
GATEWAY_RELAY_STATE_PATH.write_text(json.dumps(current, indent=2) + "\n", encoding="utf-8")
chmod_best_effort(GATEWAY_RELAY_STATE_PATH, 0o600)
def gateway_remote_enabled_value(unlocked=None):
state = read_gateway_relay_state()
if isinstance(state.get("remote_enabled"), bool):
return state["remote_enabled"]
if unlocked is None:
unlocked = gateway_is_unlocked()
if unlocked:
return bool(VAULT_SECRETS.get("gateway_remote_enabled", True))
return bool(read_gateway_relay_secret())
def gateway_vault_secret_subset(secrets_map):
return {key: value for key, value in secrets_map.items() if key in GATEWAY_VAULT_KEYS and value is not None}
def auth_file_secret_subset(secrets_map):
return {key: value for key, value in secrets_map.items() if key in AUTH_FILE_KEYS and value is not None}
def gateway_locked_reason():
if not vault_exists():
return "vault_not_configured"
if not GATEWAY_UNLOCKED:
return "locked"
if GATEWAY_LAST_USED_AT and datetime.now(timezone.utc) - GATEWAY_LAST_USED_AT > timedelta(seconds=GATEWAY_IDLE_TIMEOUT_SECONDS):
gateway_lock()
return "idle_timeout"
return None
def gateway_is_unlocked():
return gateway_locked_reason() is None
def touch_gateway():
global GATEWAY_LAST_USED_AT
GATEWAY_LAST_USED_AT = datetime.now(timezone.utc)
def gateway_lock():
global VAULT_SECRETS, VAULT_KEY, GATEWAY_UNLOCKED, GATEWAY_LAST_USED_AT, AUTH, TOKEN, TOKEN_EXPIRES_AT
with GATEWAY_LOCK:
VAULT_SECRETS = {}
VAULT_KEY = None
GATEWAY_UNLOCKED = False
GATEWAY_LAST_USED_AT = None
AUTH = load_auth()
TOKEN = AUTH["token"]
TOKEN_EXPIRES_AT = AUTH["token_expires_at"]
return {"status": "locked", "vault_configured": vault_exists()}
def gateway_status():
unlocked = gateway_is_unlocked()
remote_enabled = gateway_remote_enabled_value(unlocked)
listener_ready = bool(remote_enabled and GATEWAY_LISTENER_CONNECTED)
if not DEFAULT_PROJECT_ID or not TOKEN:
status = "not_configured"
message = "No project/token is configured for this directory."
elif not vault_exists():
status = "vault_not_configured"
message = "Gateway vault is not configured; run nap gateway configure."
elif remote_enabled and listener_ready:
status = "relay_ready"
message = "Gateway relay listener is connected."
elif remote_enabled:
status = "relay_not_ready"
message = "Gateway is configured but the relay listener is not connected."
else:
status = "remote_disabled"
message = "Gateway remote relay is disabled."
return {
"status": status,
"message": message,
**state_dir_status_payload(),
"auth_path": str(AUTH_PATH),
"log_path": str(AUTH_DIR / "gateway.log"),
"vault_path": str(VAULT_PATH),
"vault_configured": vault_exists(),
"locked": not unlocked,
"lock_reason": gateway_locked_reason(),
"idle_timeout_seconds": GATEWAY_IDLE_TIMEOUT_SECONDS,
"cwd": str(pathlib.Path.cwd()),
"base_url": BASE_URL,
"project_id": DEFAULT_PROJECT_ID,
"project_slug": AUTH.get("project_slug"),
"project_name": AUTH.get("project_name"),
"project_configured": bool(DEFAULT_PROJECT_ID),
"agent_id": AUTH.get("agent_id"),
"worker_id": AUTH.get("worker_id"),
"token_expires_at": TOKEN_EXPIRES_AT,
"has_token": bool(TOKEN),
"has_ssh_key": bool(AUTH.get("ssh_private_key")) or pathlib.Path(AUTH["ssh_key_path"]).expanduser().exists(),
"tmux_target": VAULT_SECRETS.get("gateway_tmux_target") if unlocked else None,
"default_command": VAULT_SECRETS.get("gateway_default_command") if unlocked else None,
"managed_session": VAULT_SECRETS.get("gateway_managed_session") if unlocked else None,
"managed_window": VAULT_SECRETS.get("gateway_managed_window") if unlocked else None,
"remote_enabled": remote_enabled,
"relay_listener_connected": GATEWAY_LISTENER_CONNECTED,
"relay_listener_ready": listener_ready,
"relay_listener_last_connected_at": GATEWAY_LISTENER_LAST_CONNECTED_AT,
"relay_listener_last_error": GATEWAY_LISTENER_LAST_ERROR,
"relay_listener_last_error_at": GATEWAY_LISTENER_LAST_ERROR_AT,
"relay_secret_configured": bool(read_gateway_relay_secret()),
"relay_connections": len(GATEWAY_RELAY_THREADS),
}
def apply_vault_secrets(secrets_payload):
if not isinstance(secrets_payload, dict):
raise ValueError("gateway unlock failed")
secrets_map = secrets_payload.get("secrets", secrets_payload)
if not isinstance(secrets_map, dict):
raise ValueError("gateway unlock failed")
return {key: value for key, value in secrets_map.items() if value is not None}
def gateway_unlock(passphrase):
global VAULT_SECRETS, VAULT_KEY, GATEWAY_UNLOCKED, AUTH, BASE_URL, TOKEN, DEFAULT_PROJECT_ID, TOKEN_EXPIRES_AT
if not vault_exists():
raise RuntimeError("gateway vault is not configured")
try:
vault_payload, vault_key = read_vault(passphrase, return_key=True)
secrets_map = apply_vault_secrets(vault_payload)
except Exception as exc:
raise RuntimeError("gateway unlock failed") from exc
with GATEWAY_LOCK:
public = load_public_auth_file()
recovered_auth = auth_file_secret_subset(secrets_map)
if recovered_auth:
public = {**public, **recovered_auth}
write_public_auth(public)
VAULT_SECRETS = gateway_vault_secret_subset(secrets_map)
VAULT_SECRETS.setdefault("gateway_encryption_key", base64.b64encode(secrets.token_bytes(32)).decode("ascii"))
VAULT_SECRETS.setdefault("gateway_remote_enabled", True)
relay_state = read_gateway_relay_state()
target_mode = "manual" if VAULT_SECRETS.get("gateway_tmux_target") else "managed"
if "remote_enabled" not in relay_state:
write_gateway_relay_state(
remote_enabled=bool(VAULT_SECRETS.get("gateway_remote_enabled", True)),
tmux_target=VAULT_SECRETS.get("gateway_tmux_target") or {},
tmux_target_mode=target_mode,
managed_session=VAULT_SECRETS.get("gateway_managed_session"),
managed_window=VAULT_SECRETS.get("gateway_managed_window"),
default_command=VAULT_SECRETS.get("gateway_default_command"),
)
elif "tmux_target_mode" not in relay_state:
write_gateway_relay_state(tmux_target_mode=target_mode)
VAULT_KEY = vault_key
GATEWAY_UNLOCKED = True
AUTH = load_auth(public_override=public)
BASE_URL = AUTH["base_url"].rstrip("/")
TOKEN = AUTH["token"]
DEFAULT_PROJECT_ID = AUTH["project_id"]
TOKEN_EXPIRES_AT = AUTH["token_expires_at"]
write_gateway_relay_secret(passphrase)
persist_vault_secrets()
touch_gateway()
return {
"status": "unlocked",
"message": "Gateway vault unlocked.",
"project_id": DEFAULT_PROJECT_ID,
"idle_timeout_seconds": GATEWAY_IDLE_TIMEOUT_SECONDS,
}
def require_unlocked(operation="operation"):
reason = gateway_locked_reason()
if reason:
raise RuntimeError(f"gateway is locked; unlock with the master passphrase before {operation}")
touch_gateway()
def clean_tmux_name(value, fallback):
cleaned = "".join(ch if ch.isalnum() or ch in "-_" else "-" for ch in str(value or "").strip().lower())
cleaned = "-".join(part for part in cleaned.split("-") if part)
return cleaned[:48] or fallback
def clean_terminal_name(value, fallback="terminal"):
cleaned = clean_tmux_name(value, fallback)
if cleaned in {"", ".", ".."}:
return fallback
return cleaned
def default_gateway_session_name():
source = AUTH.get("project_slug") or AUTH.get("project_name") or pathlib.Path.cwd().name or "project"
return f"napseer-{clean_tmux_name(source, 'project')}"
def normalize_gateway_command(value=None):
command = str(value or "").strip()
return command or os.environ.get("NAPSEER_GATEWAY_COMMAND", "bash -l")
def gateway_setup(args):
passphrase = args.get("passphrase") or read_master_passphrase(create=True)
if vault_exists() and not args.get("overwrite"):
result = gateway_unlock(passphrase)
if args.get("default_command"):
gateway_tmux_configure({"default_command": args.get("default_command")})
result = gateway_status()
return {**result, "resolved_existing_vault": True}
public = load_public_auth_file()
default_command = normalize_gateway_command(args.get("default_command"))
secrets_map = {
"gateway_encryption_key": base64.b64encode(secrets.token_bytes(32)).decode("ascii"),
"gateway_default_command": default_command,
"gateway_managed_session": default_gateway_session_name(),
"gateway_managed_window": "agent",
"gateway_remote_enabled": True,
}
payload = {"version": 1, "created_at": iso_now(), "secrets": secrets_map}
write_vault(passphrase, payload)
write_public_auth({**public, "gateway_auth_required": True, "vault_path": str(VAULT_PATH)})
result = gateway_unlock(passphrase)
write_gateway_relay_state(
remote_enabled=True,
tmux_target={},
tmux_target_mode="managed",
managed_session=secrets_map.get("gateway_managed_session"),
managed_window=secrets_map.get("gateway_managed_window"),
default_command=secrets_map.get("gateway_default_command"),
)
write_gateway_relay_secret(passphrase)
return {**gateway_status(), "status": result.get("status", "unlocked"), "message": "Gateway vault configured and unlocked."}
def gateway_tmux_configure(args):
require_unlocked("configuring gateway tmux target")
default_command = normalize_gateway_command(args.get("default_command"))
session = str(args.get("session") or "").strip()
window = str(args.get("window") or "").strip()
pane = str(args.get("pane") or "").strip()
if default_command:
VAULT_SECRETS["gateway_default_command"] = default_command
VAULT_SECRETS["gateway_remote_enabled"] = True
write_gateway_relay_state(remote_enabled=True)
if session:
target = {"session": session}
target_mode = "manual"
if window:
target["window"] = window
if pane:
target["pane"] = pane
VAULT_SECRETS["gateway_tmux_target"] = target
else:
target_mode = "managed"
VAULT_SECRETS.pop("gateway_tmux_target", None)
VAULT_SECRETS.setdefault("gateway_managed_session", default_gateway_session_name())
VAULT_SECRETS.setdefault("gateway_managed_window", "agent")
VAULT_SECRETS.setdefault("gateway_default_command", default_command)
target = {}
write_gateway_relay_state(
remote_enabled=True,
tmux_target=target,
tmux_target_mode=target_mode,
managed_session=VAULT_SECRETS.get("gateway_managed_session"),
managed_window=VAULT_SECRETS.get("gateway_managed_window"),
default_command=VAULT_SECRETS.get("gateway_default_command"),
)
persist_vault_secrets()
return {
"status": "configured",
"message": "Gateway tmux target/default command configured.",
"tmux_target": VAULT_SECRETS.get("gateway_tmux_target"),
"default_command": VAULT_SECRETS.get("gateway_default_command"),
"managed_session": VAULT_SECRETS.get("gateway_managed_session"),
"managed_window": VAULT_SECRETS.get("gateway_managed_window"),
}
def format_tmux_target(target):
value = str(target["session"])
if target.get("window"):
value += f":{target['window']}"
if target.get("pane"):
value += f".{target['pane']}"
return value
def gateway_public_tmux_target():
state = read_gateway_relay_state()
target = state.get("tmux_target")
if isinstance(target, dict) and target.get("session"):
return format_tmux_target(target)
session = str(state.get("managed_session") or default_gateway_session_name()).strip()
window = str(state.get("managed_window") or "agent").strip()
return f"{session}:{window}"
def gateway_tmux_target(remote_authenticated=False):
if not remote_authenticated:
require_unlocked("reading gateway terminal")
if gateway_is_unlocked():
target = VAULT_SECRETS.get("gateway_tmux_target")
if not isinstance(target, dict) or not target.get("session"):
target = ensure_gateway_tmux()
return format_tmux_target(target)
if remote_authenticated:
return gateway_public_tmux_target()
require_unlocked("reading gateway terminal")
def tmux_run(args, timeout=10):
return subprocess.run(
["tmux", *args],
check=False,
capture_output=True,
text=True,
timeout=timeout,
)
def ensure_gateway_tmux():
command = normalize_gateway_command(VAULT_SECRETS.get("gateway_default_command"))
session = str(VAULT_SECRETS.get("gateway_managed_session") or default_gateway_session_name()).strip()
window = str(VAULT_SECRETS.get("gateway_managed_window") or "agent").strip()
VAULT_SECRETS["gateway_default_command"] = command
VAULT_SECRETS["gateway_managed_session"] = session
VAULT_SECRETS["gateway_managed_window"] = window
cwd = str(pathlib.Path.cwd())
if tmux_run(["has-session", "-t", session]).returncode != 0:
result = tmux_run(["new-session", "-d", "-s", session, "-n", window, "-c", cwd, command], timeout=15)
if result.returncode != 0:
raise RuntimeError((result.stderr or "tmux new-session failed").strip())
else:
listed = tmux_run(["list-windows", "-t", session, "-F", "#{window_name}"])
if listed.returncode != 0:
raise RuntimeError((listed.stderr or "tmux list-windows failed").strip())
windows = {line.strip() for line in listed.stdout.splitlines() if line.strip()}
if window not in windows:
result = tmux_run(["new-window", "-d", "-t", session, "-n", window, "-c", cwd, command], timeout=15)
if result.returncode != 0:
raise RuntimeError((result.stderr or "tmux new-window failed").strip())
target = {"session": session, "window": window, "pane": "0"}
write_gateway_relay_state(
tmux_target=target,
tmux_target_mode="managed",
managed_session=session,
managed_window=window,
default_command=command,
)
persist_vault_secrets()
return target
def gateway_manual_tmux_target(remote_authenticated=False):
if gateway_is_unlocked():
target = VAULT_SECRETS.get("gateway_tmux_target")
elif remote_authenticated:
state = read_gateway_relay_state()
target = state.get("tmux_target") if state.get("tmux_target_mode") == "manual" else None
else:
target = None
return target if isinstance(target, dict) and target.get("session") else None
def gateway_managed_config(remote_authenticated=False):
state = read_gateway_relay_state()
if gateway_is_unlocked():
return {
"session": str(VAULT_SECRETS.get("gateway_managed_session") or state.get("managed_session") or default_gateway_session_name()).strip(),
"window": str(VAULT_SECRETS.get("gateway_managed_window") or state.get("managed_window") or "agent").strip(),
"command": normalize_gateway_command(VAULT_SECRETS.get("gateway_default_command") or state.get("default_command")),
}
if remote_authenticated:
return {
"session": str(state.get("managed_session") or default_gateway_session_name()).strip(),
"window": str(state.get("managed_window") or "agent").strip(),
"command": normalize_gateway_command(state.get("default_command")),
}
require_unlocked("reading gateway terminal")
def ensure_gateway_public_tmux(remote_authenticated=False):
if gateway_is_unlocked():
return ensure_gateway_tmux()
if not remote_authenticated:
require_unlocked("reading gateway terminal")
config = gateway_managed_config(remote_authenticated=True)
session = config["session"]
window = config["window"]
command = config["command"]
cwd = str(pathlib.Path.cwd())
if tmux_run(["has-session", "-t", session]).returncode != 0:
result = tmux_run(["new-session", "-d", "-s", session, "-n", window, "-c", cwd, command], timeout=15)
if result.returncode != 0:
raise RuntimeError((result.stderr or "tmux new-session failed").strip())
else:
listed = tmux_run(["list-windows", "-t", session, "-F", "#{window_name}"])
if listed.returncode != 0:
raise RuntimeError((listed.stderr or "tmux list-windows failed").strip())
windows = {line.strip() for line in listed.stdout.splitlines() if line.strip()}
if window not in windows:
result = tmux_run(["new-window", "-d", "-t", session, "-n", window, "-c", cwd, command], timeout=15)
if result.returncode != 0:
raise RuntimeError((result.stderr or "tmux new-window failed").strip())
target = {"session": session, "window": window, "pane": "0"}
write_gateway_relay_state(
tmux_target=target,
tmux_target_mode="managed",
managed_session=session,
managed_window=window,
default_command=command,
)
return target
def gateway_tmux_windows(remote_authenticated=False):
manual = gateway_manual_tmux_target(remote_authenticated=remote_authenticated)
if manual:
target = format_tmux_target(manual)
return [{
"id": "manual",
"name": target,
"index": None,
"target": target,
"active": True,
"managed": False,
"protected": True,
"command": "",
}]
config = gateway_managed_config(remote_authenticated=remote_authenticated)
ensure_gateway_public_tmux(remote_authenticated=remote_authenticated)
result = tmux_run([
"list-windows",
"-t",
config["session"],
"-F",
"#{window_id}\t#{window_index}\t#{window_name}\t#{window_active}\t#{pane_current_command}",
])
if result.returncode != 0:
raise RuntimeError((result.stderr or "tmux list-windows failed").strip())
items = []
for line in result.stdout.splitlines():
parts = line.split("\t")
if len(parts) < 5:
continue
window_id, index, name, active, command = parts[:5]
target = f"{config['session']}:{index}.0"
items.append({
"id": window_id,
"name": name,
"index": index,
"target": target,
"active": active == "1",
"managed": True,
"protected": False,
"command": command,
})
return items
def gateway_terminal_sessions(args=None):
args = args or {}
selected_id = str(args.get("terminal_id") or args.get("selected_terminal_id") or "").strip()
remote_authenticated = bool(args.get("remote_authenticated"))
items = gateway_tmux_windows(remote_authenticated=remote_authenticated)
if selected_id:
for item in items:
item["active"] = item["id"] == selected_id or item["name"] == selected_id or str(item.get("index")) == selected_id
selected = next((item for item in items if item.get("active")), items[0] if items else None)
return {
"status": "listed",
"message": "Gateway terminal sessions listed.",
"sessions": items,
"selected_terminal_id": selected.get("id") if selected else None,
"selected_terminal": selected,
}
def gateway_terminal_target_from_id(terminal_id=None, remote_authenticated=False):
items = gateway_tmux_windows(remote_authenticated=remote_authenticated)
wanted = str(terminal_id or "").strip()
if wanted:
for item in items:
if wanted in {str(item.get("id")), str(item.get("name")), str(item.get("index"))}:
return item["target"], item
raise RuntimeError("gateway terminal session not found")
selected = next((item for item in items if item.get("active")), items[0] if items else None)
if not selected:
raise RuntimeError("no gateway terminal sessions are available")
return selected["target"], selected
def gateway_terminal_unique_name(base_name, windows):
existing = {str(item.get("name")) for item in windows}
base = clean_terminal_name(base_name, "terminal")
if base not in existing:
return base
for index in range(2, 100):
candidate = clean_terminal_name(f"{base}-{index}", "terminal")
if candidate not in existing:
return candidate
raise RuntimeError("could not allocate a unique terminal name")
def gateway_terminal_create(args=None):
args = args or {}
remote_authenticated = bool(args.get("remote_authenticated"))
if gateway_manual_tmux_target(remote_authenticated=remote_authenticated):
raise RuntimeError("cannot create terminals for a manually configured tmux target")
config = gateway_managed_config(remote_authenticated=remote_authenticated)
ensure_gateway_public_tmux(remote_authenticated=remote_authenticated)
windows = gateway_tmux_windows(remote_authenticated=remote_authenticated)
max_terminals = max(1, min(int(os.environ.get("NAPSEER_GATEWAY_MAX_TERMINALS", "8")), 32))
if len(windows) >= max_terminals:
raise RuntimeError(f"gateway terminal limit reached ({max_terminals})")
name = gateway_terminal_unique_name(args.get("name") or f"terminal-{len(windows) + 1}", windows)
command = normalize_gateway_command(args.get("command") or config["command"])
result = tmux_run(["new-window", "-d", "-t", config["session"], "-n", name, "-c", str(pathlib.Path.cwd()), command], timeout=15)
if result.returncode != 0:
raise RuntimeError((result.stderr or "tmux new-window failed").strip())
sessions = gateway_terminal_sessions({"terminal_id": name, "remote_authenticated": remote_authenticated})
return {
**sessions,
"status": "created",
"message": "Gateway terminal session created.",
}
def gateway_terminal_close(args=None):
args = args or {}
remote_authenticated = bool(args.get("remote_authenticated"))
if gateway_manual_tmux_target(remote_authenticated=remote_authenticated):
raise RuntimeError("cannot close a manually configured tmux target")
terminal_id = str(args.get("terminal_id") or "").strip()
current_id = str(args.get("selected_terminal_id") or args.get("current_terminal_id") or "").strip()
if not terminal_id:
raise RuntimeError("terminal_id is required")
windows = gateway_tmux_windows(remote_authenticated=remote_authenticated)
if len(windows) <= 1:
raise RuntimeError("cannot close the last gateway terminal")
target, closing = gateway_terminal_target_from_id(terminal_id, remote_authenticated=remote_authenticated)
result = tmux_run(["kill-window", "-t", target])
stderr = (result.stderr or "").lower()
if result.returncode != 0 and "can't find" not in stderr and "no server running" not in stderr:
raise RuntimeError((result.stderr or "tmux kill-window failed").strip())
remaining = gateway_tmux_windows(remote_authenticated=remote_authenticated)
selected = None
if current_id and current_id not in {str(closing.get("id")), str(closing.get("name")), str(closing.get("index"))}:
selected = next(
(
item
for item in remaining
if current_id in {str(item.get("id")), str(item.get("name")), str(item.get("index"))}
),
None,
)
if selected is None:
selected = remaining[0] if remaining else None
selected_id = selected.get("id") if selected else None
sessions = gateway_terminal_sessions({"terminal_id": selected_id, "remote_authenticated": remote_authenticated})
return {
**sessions,
"status": "closed",
"message": "Gateway terminal session closed.",
"closed_terminal_id": closing.get("id"),
}
def parse_iso_datetime(value):
if not value:
return None
try:
text = str(value)
if text.endswith("Z"):
text = text[:-1] + "+00:00"
parsed = datetime.fromisoformat(text)
if parsed.tzinfo is None:
parsed = parsed.replace(tzinfo=timezone.utc)
return parsed.astimezone(timezone.utc)
except Exception:
return None
def gateway_schedule_default_state():
return {"schema": GATEWAY_SCHEDULES_SCHEMA, "version": 1, "schedules": []}
def read_gateway_schedules_state():
if not GATEWAY_SCHEDULES_PATH.exists():
return gateway_schedule_default_state()
try:
payload = json.loads(GATEWAY_SCHEDULES_PATH.read_text(encoding="utf-8"))
if payload.get("schema") != GATEWAY_SCHEDULES_SCHEMA or not isinstance(payload.get("schedules"), list):
return gateway_schedule_default_state()
return payload
except Exception:
return gateway_schedule_default_state()
def write_gateway_schedules_state(state):
state["schema"] = GATEWAY_SCHEDULES_SCHEMA
state["version"] = 1
state["updated_at"] = iso_now()
AUTH_DIR.mkdir(exist_ok=True)
chmod_best_effort(AUTH_DIR, 0o700)
GATEWAY_SCHEDULES_PATH.write_text(json.dumps(state, indent=2, sort_keys=True) + "\n", encoding="utf-8")
chmod_best_effort(GATEWAY_SCHEDULES_PATH, 0o600)
def cron_field_matches(field, value, minimum, maximum):
text = str(field or "").strip()
if not text:
return False
for part in text.split(","):
part = part.strip()
if not part:
return False
step = 1
if "/" in part:
part, step_text = part.split("/", 1)
if not step_text.isdigit() or int(step_text) <= 0:
return False
step = int(step_text)
if part in {"", "*"}:
start, end = minimum, maximum
elif "-" in part:
left, right = part.split("-", 1)
if not left.isdigit() or not right.isdigit():
return False
start, end = int(left), int(right)
elif part.isdigit():
start = end = int(part)
else:
return False
if start < minimum or end > maximum or start > end:
return False
if start <= value <= end and (value - start) % step == 0:
return True
return False
def cron_expr_matches(cron_expr, moment):
fields = str(cron_expr or "").split()
if len(fields) != 5:
return False
weekday = (moment.weekday() + 1) % 7
return (
cron_field_matches(fields[0], moment.minute, 0, 59)
and cron_field_matches(fields[1], moment.hour, 0, 23)
and cron_field_matches(fields[2], moment.day, 1, 31)
and cron_field_matches(fields[3], moment.month, 1, 12)
and cron_field_matches(fields[4], weekday, 0, 6)
)
def validate_gateway_cron_expr(cron_expr):
now = datetime.now(timezone.utc).replace(second=0, microsecond=0)
fields = str(cron_expr or "").split()
if len(fields) != 5:
raise RuntimeError("cron_expr must use five fields")
for offset in range(0, 366 * 24 * 60):
if cron_expr_matches(cron_expr, now + timedelta(minutes=offset)):
return True
raise RuntimeError("cron_expr does not match any time in the next year")
def next_gateway_schedule_run(cron_expr, after=None):
validate_gateway_cron_expr(cron_expr)
cursor = (after or datetime.now(timezone.utc)).astimezone(timezone.utc)
cursor = cursor.replace(second=0, microsecond=0) + timedelta(minutes=1)
for offset in range(0, 366 * 24 * 60):
candidate = cursor + timedelta(minutes=offset)
if cron_expr_matches(cron_expr, candidate):
return candidate.isoformat().replace("+00:00", "Z")
return None
def gateway_terminal_public_lookup(remote_authenticated=True):
lookup = {}
for item in gateway_terminal_sessions({"remote_authenticated": remote_authenticated}).get("sessions") or []:
public = {key: value for key, value in item.items() if key != "target"}
for key in {str(item.get("id") or ""), str(item.get("name") or ""), str(item.get("index") or "")}:
if key:
lookup[key] = public
return lookup
def gateway_schedule_projection(schedule, terminal_lookup):
terminal = terminal_lookup.get(str(schedule.get("terminal_id") or ""))
item = dict(schedule)
item["missing_target"] = terminal is None
item["terminal_name"] = terminal.get("name") if terminal else None
if terminal is None:
item["last_error"] = item.get("last_error") or "Target terminal no longer exists."
return item
def gateway_schedule_list(args=None):
args = args or {}
remote_authenticated = bool(args.get("remote_authenticated"))
with GATEWAY_SCHEDULE_LOCK:
state = read_gateway_schedules_state()
schedules = list(state.get("schedules") or [])
terminal_lookup = gateway_terminal_public_lookup(remote_authenticated=remote_authenticated)
projected = [gateway_schedule_projection(item, terminal_lookup) for item in schedules]
projected.sort(key=lambda item: (str(item.get("next_run_at") or ""), str(item.get("name") or "")))
return {
"status": "listed",
"message": "Gateway terminal schedules listed.",
"schedules": projected,
}
def normalize_gateway_schedule_payload(args, existing=None):
existing = existing or {}
name = str(args.get("name") if args.get("name") is not None else existing.get("name") or "Scheduled terminal message").strip()
terminal_id = str(args.get("terminal_id") if args.get("terminal_id") is not None else existing.get("terminal_id") or "").strip()
message = str(args.get("message") if args.get("message") is not None else args.get("text") if args.get("text") is not None else existing.get("message") or "")
cron_expr = str(args.get("cron_expr") if args.get("cron_expr") is not None else existing.get("cron_expr") or "*/15 * * * *").strip()
if not terminal_id:
raise RuntimeError("terminal_id is required")
if not message.strip():
raise RuntimeError("schedule message is required")
validate_gateway_cron_expr(cron_expr)
terminal_lookup = gateway_terminal_public_lookup(remote_authenticated=bool(args.get("remote_authenticated")))
missing_target = terminal_id not in terminal_lookup
now = iso_now()
enabled = args.get("enabled", existing.get("enabled", True))
if isinstance(enabled, str):
enabled = enabled.lower() not in {"0", "false", "no", "off"}
return {
**existing,
"id": existing.get("id") or f"sch_{secrets.token_hex(12)}",
"name": name[:120] or "Scheduled terminal message",
"terminal_id": terminal_id,
"message": message,
"cron_expr": cron_expr,
"enabled": bool(enabled),
"created_at": existing.get("created_at") or now,
"updated_at": now,
"last_run_at": existing.get("last_run_at"),
"last_error": "Target terminal no longer exists." if missing_target else existing.get("last_error"),
"next_run_at": next_gateway_schedule_run(cron_expr),
}
def gateway_schedule_create(args=None):
args = args or {}
with GATEWAY_SCHEDULE_LOCK:
state = read_gateway_schedules_state()
schedules = list(state.get("schedules") or [])
schedule = normalize_gateway_schedule_payload(args)
schedules.append(schedule)
state["schedules"] = schedules
write_gateway_schedules_state(state)
return {**gateway_schedule_list(args), "status": "created", "schedule": schedule}
def gateway_schedule_update(args=None):
args = args or {}
schedule_id = str(args.get("schedule_id") or args.get("id") or "").strip()
if not schedule_id:
raise RuntimeError("schedule_id is required")
with GATEWAY_SCHEDULE_LOCK:
state = read_gateway_schedules_state()
schedules = list(state.get("schedules") or [])
for index, item in enumerate(schedules):
if str(item.get("id")) == schedule_id:
schedules[index] = normalize_gateway_schedule_payload(args, existing=item)
state["schedules"] = schedules
write_gateway_schedules_state(state)
return {**gateway_schedule_list(args), "status": "updated", "schedule": schedules[index]}
raise RuntimeError("gateway schedule not found")
def gateway_schedule_delete(args=None):
args = args or {}
schedule_id = str(args.get("schedule_id") or args.get("id") or "").strip()
if not schedule_id:
raise RuntimeError("schedule_id is required")
with GATEWAY_SCHEDULE_LOCK:
state = read_gateway_schedules_state()
schedules = list(state.get("schedules") or [])
next_schedules = [item for item in schedules if str(item.get("id")) != schedule_id]
if len(next_schedules) == len(schedules):
raise RuntimeError("gateway schedule not found")
state["schedules"] = next_schedules
write_gateway_schedules_state(state)
return {**gateway_schedule_list(args), "status": "deleted", "deleted_schedule_id": schedule_id}
def gateway_schedule_execute(schedule, remote_authenticated=True):
gateway_terminal_target_from_id(schedule.get("terminal_id"), remote_authenticated=remote_authenticated)
gateway_terminal_input({
"terminal_id": schedule.get("terminal_id"),
"input": schedule.get("message") or "",
"enter": True,
"remote_authenticated": remote_authenticated,
"stream": True,
})
def gateway_schedule_run_now(args=None):
args = args or {}
schedule_id = str(args.get("schedule_id") or args.get("id") or "").strip()
if not schedule_id:
raise RuntimeError("schedule_id is required")
with GATEWAY_SCHEDULE_LOCK:
state = read_gateway_schedules_state()
schedules = list(state.get("schedules") or [])
for item in schedules:
if str(item.get("id")) != schedule_id:
continue
try:
gateway_schedule_execute(item, remote_authenticated=bool(args.get("remote_authenticated")))
item["last_run_at"] = iso_now()
item["last_error"] = None
item["next_run_at"] = next_gateway_schedule_run(item.get("cron_expr"))
status = "ran"
except Exception as exc:
item["last_error"] = str(exc)
item["next_run_at"] = next_gateway_schedule_run(item.get("cron_expr"))
status = "error"
item["updated_at"] = iso_now()
state["schedules"] = schedules
write_gateway_schedules_state(state)
if status == "error":
raise RuntimeError(item["last_error"])
return {**gateway_schedule_list(args), "status": status, "schedule": item}
raise RuntimeError("gateway schedule not found")
def gateway_schedule_run_due_once():
now = datetime.now(timezone.utc)
changed = False
with GATEWAY_SCHEDULE_LOCK:
state = read_gateway_schedules_state()
schedules = list(state.get("schedules") or [])
for item in schedules:
if not item.get("enabled", True):
continue
next_run = parse_iso_datetime(item.get("next_run_at"))
if next_run is None:
item["next_run_at"] = next_gateway_schedule_run(item.get("cron_expr"), now - timedelta(minutes=1))
changed = True
continue
if next_run > now:
continue
try:
gateway_schedule_execute(item, remote_authenticated=True)
item["last_run_at"] = iso_now()
item["last_error"] = None
gateway_log("gateway_schedule_ran", schedule_id=item.get("id"), terminal_id=item.get("terminal_id"))
except Exception as exc:
item["last_error"] = str(exc)
gateway_log("gateway_schedule_error", level="warn", schedule_id=item.get("id"), terminal_id=item.get("terminal_id"), error=str(exc))
item["next_run_at"] = next_gateway_schedule_run(item.get("cron_expr"), now)
item["updated_at"] = iso_now()
changed = True
if changed:
state["schedules"] = schedules
write_gateway_schedules_state(state)
return {"status": "checked", "changed": changed}
def gateway_schedule_loop():
interval = max(5, min(int(os.environ.get("NAPSEER_GATEWAY_SCHEDULE_POLL_SECONDS", "20")), 300))
gateway_log("gateway_schedule_thread_started", schedule_path=GATEWAY_SCHEDULES_PATH)
while True:
try:
gateway_schedule_run_due_once()
except Exception as exc:
gateway_periodic_log("gateway_schedule_loop_error", 60, "gateway_schedule_loop_error", level="warn", error=str(exc))
time.sleep(interval)
def start_gateway_schedule_thread():
threading.Thread(target=gateway_schedule_loop, name="napseer-gateway-schedules", daemon=True).start()
def gateway_terminal_kill(args=None):
require_unlocked("killing gateway terminal")
target = VAULT_SECRETS.get("gateway_tmux_target")
if isinstance(target, dict) and target.get("session"):
tmux_target = gateway_tmux_target()
else:
tmux_target = f"{VAULT_SECRETS.get('gateway_managed_session') or default_gateway_session_name()}:{VAULT_SECRETS.get('gateway_managed_window') or 'agent'}"
result = tmux_run(["kill-window", "-t", tmux_target])
stderr = (result.stderr or "").lower()
if result.returncode != 0 and "can't find" not in stderr and "no server running" not in stderr:
raise RuntimeError((result.stderr or "tmux kill-window failed").strip())
return {"status": "killed", "message": "Gateway tmux window killed.", "tmux_target": tmux_target}
def gateway_terminal_restart(args=None):
require_unlocked("restarting gateway terminal")
gateway_terminal_kill(args or {})
target = ensure_gateway_tmux()
output = gateway_terminal_capture({"start": "-80"})["output"]
return {"status": "restarted", "message": "Gateway tmux window restarted.", "tmux_target": target, "output": output}
def gateway_terminal_capture(args=None):
args = args or {}
if args.get("_internal_target") and (args.get("tmux_target") or args.get("target")):
target = str(args.get("tmux_target") or args.get("target"))
elif args.get("terminal_id"):
target, _selected = gateway_terminal_target_from_id(
args.get("terminal_id"),
remote_authenticated=bool(args.get("remote_authenticated")),
)
else:
target = gateway_tmux_target(remote_authenticated=bool(args.get("remote_authenticated")))
start = str((args or {}).get("start") or "-200")
output = gateway_terminal_capture_target(target, start)
return {"status": "captured", "message": "Gateway terminal output captured.", "tmux_target": target, "output": output}
def gateway_terminal_capture_target(target, start="-200"):
command = ["tmux", "capture-pane", "-p", "-t", target]
if start not in (None, "", "visible"):
command.extend(["-S", str(start)])
result = subprocess.run(
command,
check=False,
capture_output=True,
text=True,
timeout=10,
)
if result.returncode != 0:
raise RuntimeError((result.stderr or "tmux capture-pane failed").strip())
return result.stdout
def gateway_terminal_bound_output(output):
max_chars = max(2000, min(int(os.environ.get("NAPSEER_GATEWAY_STREAM_MAX_CHARS", "24000")), 48000))
if len(output) <= max_chars:
return output
return output[-max_chars:]
def gateway_terminal_route_args(frame, stream_state):
terminal_id = str((frame or {}).get("terminal_id") or "").strip()
if terminal_id:
return {"terminal_id": terminal_id, "remote_authenticated": True}
target = (stream_state or {}).get("target")
return {
"tmux_target": target,
"_internal_target": True,
"remote_authenticated": True,
}
def gateway_terminal_output_payload(payload, terminal_id):
terminal_id = str(terminal_id or "").strip()
if not terminal_id or (payload or {}).get("type") != "terminal.output":
return payload
return {
**payload,
"terminal_id": terminal_id,
"selected_terminal_id": terminal_id,
}
def gateway_terminal_output_delta(previous, current):
if previous is None or current == previous:
return ""
if current.startswith(previous):
return current[len(previous):]
max_overlap = min(len(previous), len(current), 12000)
for size in range(max_overlap, 0, -1):
if previous[-size:] == current[:size]:
return current[size:]
return ""
def gateway_wait_for_terminal_output(target, before_output, start="-200", max_wait_ms=None, settle_ms=None):
max_wait_ms = max(0, min(int(max_wait_ms if max_wait_ms is not None else os.environ.get("NAPSEER_GATEWAY_OUTPUT_WAIT_MS", "12000")), 30000))
settle_ms = max(0, min(int(settle_ms if settle_ms is not None else os.environ.get("NAPSEER_GATEWAY_OUTPUT_SETTLE_MS", "700")), 5000))
interval_ms = max(50, min(int(os.environ.get("NAPSEER_GATEWAY_OUTPUT_POLL_MS", "250")), 2000))
if max_wait_ms <= 0:
return {
"output": gateway_terminal_capture_target(target, start),
"waited_ms": 0,
"changed": False,
"settled": False,
}
deadline = time.monotonic() + (max_wait_ms / 1000)
latest = before_output
changed = False
last_change_at = None
started_at = time.monotonic()
while time.monotonic() < deadline:
time.sleep(interval_ms / 1000)
captured = gateway_terminal_capture_target(target, start)
now = time.monotonic()
if captured != latest:
latest = captured
if captured != before_output:
changed = True
last_change_at = now
if changed and last_change_at is not None and (now - last_change_at) * 1000 >= settle_ms:
return {
"output": latest,
"waited_ms": int((now - started_at) * 1000),
"changed": True,
"settled": True,
}
return {
"output": latest if changed else gateway_terminal_capture_target(target, start),
"waited_ms": int((time.monotonic() - started_at) * 1000),
"changed": changed,
"settled": False,
}
def gateway_terminal_input(args):
if args.get("_internal_target") and (args.get("tmux_target") or args.get("target")):
target = str(args.get("tmux_target") or args.get("target"))
elif args.get("terminal_id"):
target, _selected = gateway_terminal_target_from_id(
args.get("terminal_id"),
remote_authenticated=bool(args.get("remote_authenticated")),
)
else:
target = gateway_tmux_target(remote_authenticated=bool(args.get("remote_authenticated")))
text = str(args.get("input") or args.get("text") or "")
if not text:
raise RuntimeError("terminal input is required")
submit = bool(args.get("enter", True))
submit_delay_ms = max(0, min(int(args.get("enter_delay_ms", os.environ.get("NAPSEER_GATEWAY_ENTER_DELAY_MS", "150"))), 2000))
capture_start = str(args.get("start") or "-200")
stream_mode = bool(args.get("stream"))
before_output = None if stream_mode else gateway_terminal_capture_target(target, capture_start)
lines = text.splitlines()
if not lines:
lines = [text]
for index, line in enumerate(lines):
if line:
result = subprocess.run(
["tmux", "send-keys", "-t", target, "-l", line],
check=False,
capture_output=True,
text=True,
timeout=10,
)
if result.returncode != 0:
raise RuntimeError((result.stderr or "tmux send-keys failed").strip())
if submit or index < len(lines) - 1:
if submit_delay_ms:
time.sleep(submit_delay_ms / 1000)
result = subprocess.run(
["tmux", "send-keys", "-t", target, "Enter"],
check=False,
capture_output=True,
text=True,
timeout=10,
)
if result.returncode != 0:
raise RuntimeError((result.stderr or "tmux send-keys failed").strip())
if stream_mode:
return {
"status": "sent",
"message": "Gateway terminal input sent.",
"tmux_target": target,
"output": "",
"output_waited_ms": 0,
"output_changed": False,
"output_settled": False,
}
waited = gateway_wait_for_terminal_output(
target,
before_output,
start=capture_start,
max_wait_ms=args.get("output_wait_ms"),
settle_ms=args.get("output_settle_ms"),
)
return {
"status": "sent",
"message": "Gateway terminal input sent.",
"tmux_target": target,
"output": waited["output"],
"output_waited_ms": waited["waited_ms"],
"output_changed": waited["changed"],
"output_settled": waited["settled"],
}
def gateway_terminal_key(args):
if args.get("_internal_target") and (args.get("tmux_target") or args.get("target")):
target = str(args.get("tmux_target") or args.get("target"))
elif args.get("terminal_id"):
target, _selected = gateway_terminal_target_from_id(
args.get("terminal_id"),
remote_authenticated=bool(args.get("remote_authenticated")),
)
else:
target = gateway_tmux_target(remote_authenticated=bool(args.get("remote_authenticated")))
text = args.get("text")
if isinstance(text, str) and text:
if len(text) > 256:
raise RuntimeError("terminal key text is too large")
result = tmux_run(["send-keys", "-t", target, "-l", text])
if result.returncode != 0:
raise RuntimeError((result.stderr or "tmux send-keys failed").strip())
return {"status": "sent", "message": "Gateway terminal key sent.", "tmux_target": target}
key = str(args.get("key") or "").strip()
key_map = {
"Enter": "Enter",
"Escape": "Escape",
"Esc": "Escape",
"Tab": "Tab",
"BTab": "BTab",
"Backspace": "BSpace",
"Delete": "DC",
"ArrowUp": "Up",
"ArrowDown": "Down",
"ArrowLeft": "Left",
"ArrowRight": "Right",
"PageUp": "PageUp",
"PageDown": "PageDown",
"Home": "Home",
"End": "End",
"Insert": "IC",
"Space": "Space",
}
key_parts = key.split("-")
modifiers = []
while key_parts and key_parts[0] in {"C", "M"}:
modifiers.append(key_parts.pop(0))
base_key = "-".join(key_parts)
if base_key == "\\\\":
base_key = "\\"
base_tmux_key = key_map.get(base_key, base_key)
allowed_base_keys = {
"Enter", "Escape", "Tab", "BTab", "BSpace", "DC", "Up", "Down",
"Left", "Right", "PageUp", "PageDown", "Home", "End", "IC", "Space",
}
if re.fullmatch(r"F([1-9]|1[0-2])", base_tmux_key):
allowed = True
elif re.fullmatch(r"[a-zA-Z0-9]", base_tmux_key):
allowed = True
elif base_tmux_key in {"[", "\\", "]", "^", "_", "?"}:
allowed = True
else:
allowed = base_tmux_key in allowed_base_keys
tmux_key = "-".join([*modifiers, base_tmux_key]) if allowed else None
if not tmux_key:
raise RuntimeError("terminal key is not allowed")
result = tmux_run(["send-keys", "-t", target, tmux_key])
if result.returncode != 0:
raise RuntimeError((result.stderr or "tmux send-keys failed").strip())
return {"status": "sent", "message": "Gateway terminal key sent.", "tmux_target": target}
def gateway_terminal_stream_loop(stop_event, send_payload, project_id, session_id, request_id, target, start="-200"):
interval_ms = max(100, min(int(os.environ.get("NAPSEER_GATEWAY_STREAM_POLL_MS", "350")), 5000))
send_initial_snapshot = os.environ.get("NAPSEER_GATEWAY_STREAM_INITIAL_SNAPSHOT", "true").lower() in {"1", "true", "yes"}
output_mode = os.environ.get("NAPSEER_GATEWAY_STREAM_MODE", "snapshot").strip().lower()
use_delta_stream = output_mode in {"delta", "stream"}
latest = None
while not stop_event.is_set():
try:
captured = gateway_terminal_bound_output(gateway_terminal_capture_target(target, start))
if latest is None:
latest = captured
if send_initial_snapshot:
send_payload({
"type": "terminal.output",
"source": "gateway",
"mode": "snapshot",
"data": captured,
"sent_at": iso_now(),
})
stop_event.wait(interval_ms / 1000)
continue
if captured == latest:
stop_event.wait(interval_ms / 1000)
continue
if use_delta_stream:
delta = gateway_terminal_output_delta(latest, captured)
if delta:
send_payload({
"type": "terminal.output",
"source": "gateway",
"mode": "stream",
"data": gateway_terminal_bound_output(delta),
"sent_at": iso_now(),
})
latest = captured
stop_event.wait(interval_ms / 1000)
continue
send_payload({
"type": "terminal.output",
"source": "gateway",
"mode": "snapshot",
"data": captured,
"sent_at": iso_now(),
})
if use_delta_stream:
gateway_log(
"relay_terminal_stream_resync",
project_id=project_id,
session_id=session_id,
request_id=request_id,
reason="tmux capture changed without append-only delta",
)
latest = captured
except Exception as exc:
gateway_log(
"relay_terminal_stream_error",
level="error",
project_id=project_id,
session_id=session_id,
request_id=request_id,
error=str(exc),
)
try:
send_payload({
"type": "terminal.status",
"source": "gateway",
"status": "terminal stream stopped",
"sent_at": iso_now(),
})
except Exception:
pass
break
stop_event.wait(interval_ms / 1000)
def gateway_remote_enable(args):
unlocked = gateway_is_unlocked()
if unlocked:
touch_gateway()
VAULT_SECRETS["gateway_remote_enabled"] = True
write_gateway_relay_state(remote_enabled=True)
if args.get("relay_url"):
if unlocked:
VAULT_SECRETS["gateway_relay_url"] = str(args["relay_url"])
write_gateway_relay_state(relay_url=str(args["relay_url"]))
if unlocked:
persist_vault_secrets()
return {
"status": "enabled",
"message": "Gateway remote relay enabled.",
"remote_enabled": True,
"tmux_target": VAULT_SECRETS.get("gateway_tmux_target"),
}
def gateway_remote_disable():
unlocked = gateway_is_unlocked()
if unlocked:
touch_gateway()
VAULT_SECRETS["gateway_remote_enabled"] = False
write_gateway_relay_state(remote_enabled=False)
if unlocked:
persist_vault_secrets()
return {"status": "disabled", "message": "Gateway remote relay disabled.", "remote_enabled": False}
def gateway_remote_readiness():
return {
"has_token": bool(TOKEN),
"project_id": current_project_id(),
"agent_id": AUTH.get("agent_id"),
"remote_enabled": gateway_remote_enabled_value(),
"relay_secret_configured": bool(read_gateway_relay_secret()),
}
def gateway_remote_blockers(readiness):
blockers = []
if not readiness.get("has_token"):
blockers.append("missing_token")
if not readiness.get("project_id"):
blockers.append("missing_project")
if not readiness.get("agent_id"):
blockers.append("missing_agent_id")
if not readiness.get("remote_enabled"):
blockers.append("remote_disabled")
return blockers
def gateway_remote_should_run():
readiness = gateway_remote_readiness()
if not readiness["has_token"] or not readiness["project_id"] or not readiness["agent_id"]:
return False
return bool(readiness["remote_enabled"])
def relay_base_url():
state = read_gateway_relay_state()
return str(state.get("relay_url") or VAULT_SECRETS.get("gateway_relay_url") or BASE_URL).rstrip("/")
def relay_ws_url(project_id, session_id, ticket):
parsed = urllib.parse.urlparse(relay_base_url())
scheme = "wss" if parsed.scheme == "https" else "ws"
netloc = parsed.netloc
return f"{scheme}://{netloc}/v1/projects/{project_id}/gateway-sessions/{session_id}/relay?{urllib.parse.urlencode({'ticket': ticket})}"
def gateway_listener_ws_url(project_id, agent_id):
parsed = urllib.parse.urlparse(relay_base_url())
scheme = "wss" if parsed.scheme == "https" else "ws"
netloc = parsed.netloc
quoted_agent = urllib.parse.quote(str(agent_id), safe="")
return f"{scheme}://{netloc}/v1/projects/{project_id}/gateways/{quoted_agent}/listener"
def websocket_proxy_url(parsed):
host = parsed.hostname or ""
if host and urllib.request.proxy_bypass(host):
return None
explicit = (
os.environ.get("NAPSEER_GATEWAY_PROXY_URL")
or os.environ.get("NAPSEER_RELAY_PROXY_URL")
or os.environ.get("NAPSEER_PROXY_URL")
)
if explicit:
return explicit
proxies = urllib.request.getproxies_environment()
proxy_key = "https" if parsed.scheme == "wss" else "http"
return proxies.get(proxy_key) or proxies.get("all")
def normalize_proxy_url(value):
if not value:
return None
proxy_url = str(value).strip()
if not proxy_url:
return None
if "://" not in proxy_url:
proxy_url = f"http://{proxy_url}"
return urllib.parse.urlparse(proxy_url)
def api_proxy_url(parsed):
host = parsed.hostname or ""
if host and urllib.request.proxy_bypass(host):
return None
explicit = (
os.environ.get("NAPSEER_API_PROXY_URL")
or os.environ.get("NAPSEER_HTTP_PROXY_URL")
or os.environ.get("NAPSEER_PROXY_URL")
or os.environ.get("NAPSEER_RELAY_PROXY_URL")
or os.environ.get("NAPSEER_GATEWAY_PROXY_URL")
)
if explicit:
return explicit
proxies = urllib.request.getproxies_environment()
return proxies.get(parsed.scheme) or proxies.get("all")
def api_urlopen(request, timeout):
parsed = urllib.parse.urlparse(request.full_url)
proxy = normalize_proxy_url(api_proxy_url(parsed))
if not proxy:
return urllib.request.urlopen(request, timeout=timeout)
proxy_url = urllib.parse.urlunparse(proxy)
opener = urllib.request.build_opener(urllib.request.ProxyHandler({parsed.scheme: proxy_url}))
return opener.open(request, timeout=timeout)
def read_http_response_head(sock, description):
response = b""
while b"\r\n\r\n" not in response:
chunk = sock.recv(4096)
if not chunk:
raise RuntimeError(f"{description} closed during handshake")
response += chunk
if len(response) > 16384:
raise RuntimeError(f"{description} handshake too large")
return response
def connect_proxy_tunnel(proxy, target_host, target_port, timeout=20):
proxy_host = proxy.hostname or ""
if not proxy_host:
raise RuntimeError("websocket proxy URL is missing a host")
proxy_port = proxy.port or (443 if proxy.scheme == "https" else 80)
if proxy.scheme not in {"http", "https"}:
raise RuntimeError("websocket proxy must use http:// or https://")
raw = socket.create_connection((proxy_host, proxy_port), timeout=timeout)
sock = ssl.create_default_context().wrap_socket(raw, server_hostname=proxy_host) if proxy.scheme == "https" else raw
target = f"{target_host}:{target_port}"
request = (
f"CONNECT {target} HTTP/1.1\r\n"
f"Host: {target}\r\n"
"Proxy-Connection: keep-alive\r\n"
"User-Agent: napseer-gateway\r\n"
)
if proxy.username:
username = urllib.parse.unquote(proxy.username)
password = urllib.parse.unquote(proxy.password or "")
credentials = base64.b64encode(f"{username}:{password}".encode("utf-8")).decode("ascii")
request += f"Proxy-Authorization: Basic {credentials}\r\n"
request += "\r\n"
sock.sendall(request.encode("ascii"))
response = read_http_response_head(sock, "websocket proxy")
status_line = response.split(b"\r\n", 1)[0]
if b" 200 " not in status_line:
raise RuntimeError(status_line.decode("utf-8", errors="replace"))
return sock
def ws_connect(url, extra_headers=None):
parsed = urllib.parse.urlparse(url)
host = parsed.hostname or ""
port = parsed.port or (443 if parsed.scheme == "wss" else 80)
path = parsed.path + (f"?{parsed.query}" if parsed.query else "")
proxy = normalize_proxy_url(websocket_proxy_url(parsed))
raw = connect_proxy_tunnel(proxy, host, port, timeout=20) if proxy else socket.create_connection((host, port), timeout=20)
sock = ssl.create_default_context().wrap_socket(raw, server_hostname=host) if parsed.scheme == "wss" else raw
key = base64.b64encode(secrets.token_bytes(16)).decode("ascii")
request = (
f"GET {path} HTTP/1.1\r\n"
f"Host: {parsed.netloc}\r\n"
"Upgrade: websocket\r\n"
"Connection: Upgrade\r\n"
f"Sec-WebSocket-Key: {key}\r\n"
"Sec-WebSocket-Version: 13\r\n"
)
for header, value in (extra_headers or {}).items():
request += f"{header}: {value}\r\n"
request += "\r\n"
sock.sendall(request.encode("ascii"))
response = read_http_response_head(sock, "relay websocket")
if b" 101 " not in response.split(b"\r\n", 1)[0]:
raise RuntimeError(response.decode("utf-8", errors="replace").split("\r\n\r\n", 1)[0])
sock.settimeout(None)
return sock
def ws_recv_exact(sock, length):
data = b""
while len(data) < length:
chunk = sock.recv(length - len(data))
if not chunk:
return data
data += chunk
return data
def ws_send_frame(sock, opcode, payload=b""):
data = payload if isinstance(payload, bytes) else bytes(payload)
header = bytearray([0x80 | (opcode & 0x0F)])
if len(data) < 126:
header.append(0x80 | len(data))
elif len(data) < 65536:
header.extend([0x80 | 126, (len(data) >> 8) & 0xff, len(data) & 0xff])
else:
header.extend([0x80 | 127])
header.extend(len(data).to_bytes(8, "big"))
mask = secrets.token_bytes(4)
sock.sendall(bytes(header) + mask + bytes(byte ^ mask[index % 4] for index, byte in enumerate(data)))
def ws_send_text(sock, text):
ws_send_frame(sock, 0x1, text.encode("utf-8"))
def ws_read_text(sock):
WS_CLOSE_DETAILS.pop(sock.fileno(), None)
header = ws_recv_exact(sock, 2)
if len(header) < 2:
WS_CLOSE_DETAILS[sock.fileno()] = {"reason": "socket closed before websocket frame header completed"}
return None
first, second = header
opcode = first & 0x0F
length = second & 0x7F
if length == 126:
length_bytes = ws_recv_exact(sock, 2)
if len(length_bytes) < 2:
WS_CLOSE_DETAILS[sock.fileno()] = {"reason": "socket closed before websocket extended length completed"}
return None
length = int.from_bytes(length_bytes, "big")
elif length == 127:
length_bytes = ws_recv_exact(sock, 8)
if len(length_bytes) < 8:
WS_CLOSE_DETAILS[sock.fileno()] = {"reason": "socket closed before websocket extended length completed"}
return None
length = int.from_bytes(length_bytes, "big")
mask = ws_recv_exact(sock, 4) if second & 0x80 else b""
if second & 0x80 and len(mask) < 4:
WS_CLOSE_DETAILS[sock.fileno()] = {"reason": "socket closed before websocket mask completed"}
return None
payload = ws_recv_exact(sock, length)
if len(payload) < length:
WS_CLOSE_DETAILS[sock.fileno()] = {"reason": "socket closed before websocket frame payload completed"}
return None
if mask:
payload = bytes(byte ^ mask[index % 4] for index, byte in enumerate(payload))
if opcode == 0x8:
close_code = None
close_reason = ""
if len(payload) >= 2:
close_code = int.from_bytes(payload[:2], "big")
close_reason = payload[2:].decode("utf-8", errors="replace")
elif payload:
close_reason = payload.decode("utf-8", errors="replace")
WS_CLOSE_DETAILS[sock.fileno()] = {"code": close_code, "reason": close_reason}
try:
ws_send_frame(sock, 0x8, payload)
except OSError:
pass
return None
if opcode == 0x9:
ws_send_frame(sock, 0xA, payload)
return ""
if opcode != 0x1:
return ""
return payload.decode("utf-8", errors="replace")
def relay_node_crypto(operation, key, aad, nonce, ciphertext=None, payload=None):
script = r"""
const crypto = require('crypto');
const op = process.argv[1];
const key = Buffer.from(process.argv[2], 'base64');
const aad = Buffer.from(process.argv[3], 'base64');
const nonce = Buffer.from(process.argv[4], 'base64');
if (op === 'decrypt') {
const packed = Buffer.from(process.argv[5], 'base64');
const body = packed.subarray(0, packed.length - 16);
const tag = packed.subarray(packed.length - 16);
const decipher = crypto.createDecipheriv('aes-256-gcm', key, nonce);
decipher.setAAD(aad);
decipher.setAuthTag(tag);
process.stdout.write(Buffer.concat([decipher.update(body), decipher.final()]).toString('utf8'));
} else {
const cipher = crypto.createCipheriv('aes-256-gcm', key, nonce);
cipher.setAAD(aad);
const body = Buffer.concat([cipher.update(Buffer.from(process.argv[5], 'utf8')), cipher.final()]);
process.stdout.write(Buffer.concat([body, cipher.getAuthTag()]).toString('base64'));
}
"""
args = [
"node",
"-e",
script,
operation,
base64.b64encode(key).decode("ascii"),
base64.b64encode(aad).decode("ascii"),
base64.b64encode(nonce).decode("ascii"),
base64.b64encode(ciphertext).decode("ascii") if operation == "decrypt" else json.dumps(payload, separators=(",", ":")),
]
result = subprocess.run(args, check=False, capture_output=True, text=True, timeout=20)
if result.returncode != 0:
raise RuntimeError((result.stderr or "relay crypto failed").strip())
return result.stdout
def decrypt_relay_frame(key, frame_text, context_hash, expected_direction, expected_seq):
envelope = json.loads(frame_text)
if (
envelope.get("context_hash") != context_hash
or envelope.get("direction") != expected_direction
or envelope.get("seq") != expected_seq
):
raise RuntimeError("invalid relay frame context")
plaintext = relay_node_crypto(
"decrypt",
key,
relay_aad(envelope["session_id"], context_hash, expected_direction, expected_seq),
base64.b64decode(envelope["nonce"]),
ciphertext=base64.b64decode(envelope["ciphertext"]),
)
return json.loads(plaintext)
def encrypt_relay_frame(key, session_id, payload, context_hash, direction, seq):
nonce = secrets.token_bytes(12)
ciphertext = relay_node_crypto("encrypt", key, relay_aad(session_id, context_hash, direction, seq), nonce, payload=payload)
return json.dumps({
"type": "encrypted",
"alg": "AES-GCM-256",
"session_id": session_id,
"context_hash": context_hash,
"direction": direction,
"seq": seq,
"nonce": base64.b64encode(nonce).decode("ascii"),
"ciphertext": ciphertext,
}, separators=(",", ":"))
def handle_gateway_relay_session(connect_request, listener_sock=None):
project_id = str(connect_request.get("project_id") or current_project_id())
session_id = str(connect_request["session_id"])
request_id = connect_request.get("request_id")
sock = None
stream_stop = threading.Event()
try:
gateway_log(
"relay_session_starting",
project_id=project_id,
agent_id=AUTH.get("agent_id"),
session_id=session_id,
request_id=request_id,
client_account_id=connect_request.get("client_account_id"),
)
secret = read_gateway_relay_secret()
if not secret:
gateway_log(
"relay_session_rejected",
level="error",
project_id=project_id,
agent_id=AUTH.get("agent_id"),
session_id=session_id,
request_id=request_id,
reason="missing_gateway_relay_secret",
)
raise RuntimeError("gateway relay secret is missing; run nap gateway configure or nap gateway unlock once")
spake2_context = connect_request.get("spake2_context") or {}
sock = ws_connect(relay_ws_url(project_id, session_id, connect_request["relay_ticket"]))
gateway_log("relay_session_socket_connected", project_id=project_id, session_id=session_id, request_id=request_id)
if listener_sock is not None:
with GATEWAY_LISTENER_SEND_LOCK:
ws_send_text(listener_sock, json.dumps({
"type": "connect.accept",
"request_id": request_id,
"session_id": session_id,
}, separators=(",", ":")))
gateway_log("relay_session_accepted", project_id=project_id, session_id=session_id, request_id=request_id)
while True:
frame_text = ws_read_text(sock)
if frame_text is None:
raise RuntimeError("relay closed before gateway authentication")
if not frame_text:
continue
try:
frame = json.loads(frame_text)
except Exception:
continue
if frame.get("source") == "gateway":
continue
if frame.get("type") != "spake2.message":
continue
browser_message = str(frame.get("message") or "")
try:
spake2_finished = spake2_gateway_finish(secret, spake2_context, browser_message)
except Exception:
ws_send_text(sock, json.dumps({
"type": "spake2.result",
"session_id": session_id,
"source": "gateway",
"ok": False,
}, separators=(",", ":")))
gateway_log(
"relay_session_authentication_failed",
level="warn",
project_id=project_id,
session_id=session_id,
request_id=request_id,
reason="gateway_key_confirmation_failed",
)
raise RuntimeError("gateway SPAKE2 key confirmation failed")
ws_send_text(sock, json.dumps({
"type": "spake2.confirm",
"session_id": session_id,
"source": "gateway",
"gateway_message": spake2_finished["message"],
}, separators=(",", ":")))
break
while True:
frame_text = ws_read_text(sock)
if frame_text is None:
raise RuntimeError("relay closed before gateway authentication completed")
if not frame_text:
continue
try:
frame = json.loads(frame_text)
except Exception:
continue
if frame.get("source") == "gateway":
continue
if (
frame.get("type") == "spake2.result"
and frame.get("ok") is True
):
if hmac.compare_digest(
str(frame.get("client_confirmation") or ""),
spake2_finished["expected_client_confirmation"],
):
break
ws_send_text(sock, json.dumps({
"type": "spake2.result",
"session_id": session_id,
"source": "gateway",
"ok": False,
}, separators=(",", ":")))
gateway_log(
"relay_session_authentication_failed",
level="warn",
project_id=project_id,
session_id=session_id,
request_id=request_id,
reason="browser_key_confirmation_failed",
)
raise RuntimeError("browser SPAKE2 key confirmation failed")
if frame.get("type") == "spake2.result" and frame.get("ok") is False:
gateway_log(
"relay_session_authentication_failed",
level="warn",
project_id=project_id,
session_id=session_id,
request_id=request_id,
reason="browser_rejected_gateway",
)
raise RuntimeError("browser rejected gateway authentication")
ws_send_text(sock, json.dumps({
"type": "spake2.result",
"session_id": session_id,
"source": "gateway",
"ok": True,
"gateway_confirmation": spake2_finished["confirmation"],
}, separators=(",", ":")))
gateway_log("relay_session_authenticated", project_id=project_id, session_id=session_id, request_id=request_id)
send_key = relay_key_from_secret(spake2_finished["secret"], spake2_context, "gateway_to_client")
receive_key = relay_key_from_secret(spake2_finished["secret"], spake2_context, "client_to_gateway")
context_hash = relay_context_hash(spake2_context)
send_seq = {"value": 0}
receive_seq = 0
relay_send_lock = threading.Lock()
def send_gateway_payload(payload):
with relay_send_lock:
seq = send_seq["value"]
ws_send_text(sock, encrypt_relay_frame(send_key, session_id, payload, context_hash, "gateway_to_client", seq))
send_seq["value"] = seq + 1
stream_state = {"stop": None, "terminal_id": None, "target": None}
def stop_terminal_stream():
current = stream_state.get("stop")
if current is not None:
current.set()
stream_state["stop"] = None
def start_terminal_stream(target):
stop_terminal_stream()
next_stop = threading.Event()
stream_state["stop"] = next_stop
def send_terminal_payload(payload):
send_gateway_payload(gateway_terminal_output_payload(payload, stream_state.get("terminal_id")))
stream_thread = threading.Thread(
target=gateway_terminal_stream_loop,
args=(next_stop, send_terminal_payload, project_id, session_id, request_id, target),
name=f"napseer-terminal-stream-{session_id}",
daemon=True,
)
stream_thread.start()
def send_terminal_sessions():
sessions = gateway_terminal_sessions({
"terminal_id": stream_state.get("terminal_id"),
"remote_authenticated": True,
})
selected = sessions.get("selected_terminal") or {}
stream_state["terminal_id"] = sessions.get("selected_terminal_id")
if selected.get("target"):
stream_state["target"] = selected.get("target")
public_sessions = []
for item in sessions.get("sessions") or []:
public_sessions.append({key: value for key, value in item.items() if key != "target"})
send_gateway_payload({
"type": "terminal.session_list",
"source": "gateway",
"sessions": public_sessions,
"selected_terminal_id": sessions.get("selected_terminal_id"),
"sent_at": iso_now(),
})
return sessions
def send_empty_terminal_sessions(message):
stream_state["terminal_id"] = None
stream_state["target"] = None
send_gateway_payload({
"type": "terminal.session_list",
"source": "gateway",
"sessions": [],
"selected_terminal_id": None,
"message": str(message),
"sent_at": iso_now(),
})
def switch_terminal(terminal_id=None):
target, selected = gateway_terminal_target_from_id(terminal_id, remote_authenticated=True)
stream_state["terminal_id"] = selected.get("id")
stream_state["target"] = target
send_terminal_sessions()
start_terminal_stream(target)
return selected
def send_terminal_error(message):
send_gateway_payload({
"type": "terminal.status",
"source": "gateway",
"status": "error",
"message": str(message),
"sent_at": iso_now(),
})
def send_gateway_schedules():
schedules = gateway_schedule_list({"remote_authenticated": True}).get("schedules") or []
send_gateway_payload({
"type": "schedule.list",
"source": "gateway",
"schedules": schedules,
"sent_at": iso_now(),
})
return schedules
def send_schedule_status(status, message=None):
send_gateway_payload({
"type": "schedule.status",
"source": "gateway",
"status": status,
"message": message or "",
"sent_at": iso_now(),
})
def send_schedule_error(message):
send_gateway_payload({
"type": "schedule.error",
"source": "gateway",
"message": str(message),
"sent_at": iso_now(),
})
send_gateway_payload({
"type": "terminal.status",
"source": "gateway",
"status": "connected",
"sent_at": iso_now(),
})
try:
switch_terminal(None)
except Exception as startup_exc:
gateway_log(
"relay_terminal_startup_error",
level="warn",
project_id=project_id,
session_id=session_id,
request_id=request_id,
error=str(startup_exc),
)
send_terminal_error(startup_exc)
send_empty_terminal_sessions(startup_exc)
send_gateway_schedules()
gateway_log("relay_session_open", project_id=project_id, session_id=session_id, request_id=request_id)
while True:
frame_text = ws_read_text(sock)
if frame_text is None:
break
if not frame_text:
continue
try:
parsed = json.loads(frame_text)
except Exception:
continue
if parsed.get("type") != "encrypted":
continue
if parsed.get("direction") != "client_to_gateway":
continue
frame = decrypt_relay_frame(receive_key, frame_text, context_hash, "client_to_gateway", receive_seq)
receive_seq += 1
if frame.get("source") == "gateway":
continue
try:
frame_type = frame.get("type")
if frame_type == "terminal.input":
gateway_log("relay_terminal_input_received", project_id=project_id, session_id=session_id, request_id=request_id)
terminal_args = {
**gateway_terminal_route_args(frame, stream_state),
"input": frame.get("data") or frame.get("input") or "",
"enter": frame.get("enter", True),
"enter_delay_ms": frame.get("enter_delay_ms", 150),
"stream": True,
}
gateway_terminal_input(terminal_args)
elif frame_type == "terminal.key":
gateway_log("relay_terminal_key_received", project_id=project_id, session_id=session_id, request_id=request_id)
terminal_args = {
**gateway_terminal_route_args(frame, stream_state),
"key": frame.get("key"),
"text": frame.get("text"),
}
gateway_terminal_key(terminal_args)
elif frame_type == "terminal.capture":
gateway_log("relay_terminal_capture_requested", project_id=project_id, session_id=session_id, request_id=request_id)
terminal_args = {
**gateway_terminal_route_args(frame, stream_state),
"start": frame.get("start", "-200"),
}
result = gateway_terminal_capture(terminal_args)
send_gateway_payload(gateway_terminal_output_payload({
"type": "terminal.output",
"source": "gateway",
"mode": "snapshot",
"data": gateway_terminal_bound_output(result.get("output", "")),
"sent_at": iso_now(),
}, stream_state.get("terminal_id")))
elif frame_type == "terminal.list":
gateway_log("relay_terminal_list_requested", project_id=project_id, session_id=session_id, request_id=request_id)
send_terminal_sessions()
elif frame_type == "terminal.select":
gateway_log(
"relay_terminal_select_requested",
project_id=project_id,
session_id=session_id,
request_id=request_id,
terminal_id=frame.get("terminal_id"),
)
switch_terminal(frame.get("terminal_id"))
elif frame_type == "terminal.create":
gateway_log("relay_terminal_create_requested", project_id=project_id, session_id=session_id, request_id=request_id)
created = gateway_terminal_create({
"name": frame.get("name"),
"remote_authenticated": True,
})
selected = created.get("selected_terminal") or {}
stream_state["terminal_id"] = created.get("selected_terminal_id")
stream_state["target"] = selected.get("target") or stream_state.get("target")
send_terminal_sessions()
if stream_state.get("target"):
start_terminal_stream(stream_state["target"])
elif frame_type == "terminal.close":
gateway_log(
"relay_terminal_close_requested",
project_id=project_id,
session_id=session_id,
request_id=request_id,
terminal_id=frame.get("terminal_id"),
)
closed = gateway_terminal_close({
"terminal_id": frame.get("terminal_id"),
"selected_terminal_id": stream_state.get("terminal_id"),
"remote_authenticated": True,
})
selected = closed.get("selected_terminal") or {}
stream_state["terminal_id"] = closed.get("selected_terminal_id")
stream_state["target"] = selected.get("target") or stream_state.get("target")
send_terminal_sessions()
if stream_state.get("target"):
start_terminal_stream(stream_state["target"])
elif frame_type == "terminal.resize":
gateway_log("relay_terminal_resize_received", project_id=project_id, session_id=session_id, request_id=request_id)
send_gateway_payload({
"type": "terminal.status",
"source": "gateway",
"status": "resize ignored",
"sent_at": iso_now(),
})
elif frame_type == "schedule.list":
gateway_log("relay_schedule_list_requested", project_id=project_id, session_id=session_id, request_id=request_id)
send_gateway_schedules()
elif frame_type == "schedule.create":
gateway_log("relay_schedule_create_requested", project_id=project_id, session_id=session_id, request_id=request_id)
gateway_schedule_create({
"name": frame.get("name"),
"terminal_id": frame.get("terminal_id"),
"message": frame.get("message") or frame.get("text"),
"cron_expr": frame.get("cron_expr"),
"enabled": frame.get("enabled", True),
"remote_authenticated": True,
})
send_schedule_status("created")
send_gateway_schedules()
elif frame_type == "schedule.update":
gateway_log("relay_schedule_update_requested", project_id=project_id, session_id=session_id, request_id=request_id, schedule_id=frame.get("schedule_id") or frame.get("id"))
schedule_payload = {
"schedule_id": frame.get("schedule_id") or frame.get("id"),
"name": frame.get("name"),
"terminal_id": frame.get("terminal_id"),
"message": frame.get("message") or frame.get("text"),
"cron_expr": frame.get("cron_expr"),
"remote_authenticated": True,
}
if "enabled" in frame:
schedule_payload["enabled"] = frame.get("enabled")
gateway_schedule_update(schedule_payload)
send_schedule_status("updated")
send_gateway_schedules()
elif frame_type == "schedule.delete":
gateway_log("relay_schedule_delete_requested", project_id=project_id, session_id=session_id, request_id=request_id, schedule_id=frame.get("schedule_id") or frame.get("id"))
gateway_schedule_delete({
"schedule_id": frame.get("schedule_id") or frame.get("id"),
"remote_authenticated": True,
})
send_schedule_status("deleted")
send_gateway_schedules()
elif frame_type == "schedule.run_now":
gateway_log("relay_schedule_run_now_requested", project_id=project_id, session_id=session_id, request_id=request_id, schedule_id=frame.get("schedule_id") or frame.get("id"))
gateway_schedule_run_now({
"schedule_id": frame.get("schedule_id") or frame.get("id"),
"remote_authenticated": True,
})
send_schedule_status("ran")
send_gateway_schedules()
except Exception as frame_exc:
gateway_log(
"relay_terminal_control_error",
level="warn",
project_id=project_id,
session_id=session_id,
request_id=request_id,
error=str(frame_exc),
frame_type=frame.get("type"),
)
if str(frame.get("type") or "").startswith("schedule."):
send_schedule_error(frame_exc)
try:
send_gateway_schedules()
except Exception:
pass
else:
send_terminal_error(frame_exc)
except Exception as exc:
if listener_sock is not None:
try:
with GATEWAY_LISTENER_SEND_LOCK:
ws_send_text(listener_sock, json.dumps({
"type": "connect.reject",
"request_id": request_id,
"session_id": session_id,
"error": str(exc),
}, separators=(",", ":")))
except OSError:
pass
gateway_log(
"relay_session_error",
level="error",
project_id=project_id,
agent_id=AUTH.get("agent_id"),
session_id=session_id,
request_id=request_id,
error=str(exc),
)
raise
finally:
try:
stop_terminal_stream()
except Exception:
stream_stop.set()
GATEWAY_RELAY_THREADS.discard(session_id)
if sock:
try:
sock.close()
except OSError:
pass
gateway_log(
"relay_session_closed",
project_id=project_id,
agent_id=AUTH.get("agent_id"),
session_id=session_id,
request_id=request_id,
)
def gateway_relay_loop():
global GATEWAY_LISTENER_CONNECTED, GATEWAY_LISTENER_LAST_CONNECTED_AT, GATEWAY_LISTENER_LAST_ERROR, GATEWAY_LISTENER_LAST_ERROR_AT
closed_by_relay_streak = 0
gateway_log(
"relay_listener_thread_started",
project_id=current_project_id(),
agent_id=AUTH.get("agent_id"),
base_url=relay_base_url(),
)
while True:
closed_by_relay = False
try:
if gateway_remote_should_run():
project_id = current_project_id()
agent_id = AUTH.get("agent_id")
gateway_periodic_log(
"relay_listener_connecting",
30,
"relay_listener_connecting",
project_id=project_id,
agent_id=agent_id,
base_url=relay_base_url(),
)
listener = ws_connect(
gateway_listener_ws_url(project_id, agent_id),
extra_headers={"Authorization": f"Bearer {TOKEN}"},
)
GATEWAY_LISTENER_CONNECTED = True
GATEWAY_LISTENER_LAST_CONNECTED_AT = iso_now()
GATEWAY_LISTENER_LAST_ERROR = ""
GATEWAY_LISTENER_LAST_ERROR_AT = None
gateway_log("relay_listener_connected", project_id=project_id, agent_id=agent_id, base_url=relay_base_url())
try:
while gateway_remote_should_run():
message = ws_read_text(listener)
if message is None:
close_details = WS_CLOSE_DETAILS.pop(listener.fileno(), {})
gateway_log(
"relay_listener_closed_by_relay",
project_id=project_id,
agent_id=agent_id,
close_code=close_details.get("code"),
close_reason=close_details.get("reason"),
)
closed_by_relay = True
break
if not message:
continue
payload = json.loads(message)
if payload.get("type") != "connect.request":
gateway_log(
"relay_listener_message_ignored",
level="warn",
project_id=project_id,
agent_id=agent_id,
message_type=payload.get("type"),
)
continue
session_id = payload.get("session_id")
if session_id and session_id not in GATEWAY_RELAY_THREADS:
gateway_log(
"relay_session_requested",
project_id=payload.get("project_id") or project_id,
agent_id=agent_id,
session_id=session_id,
request_id=payload.get("request_id"),
client_account_id=payload.get("client_account_id"),
)
GATEWAY_RELAY_THREADS.add(session_id)
threading.Thread(
target=lambda item=payload: handle_gateway_relay_session(item, listener),
name=f"napseer-relay-{session_id}",
daemon=True,
).start()
gateway_log(
"relay_session_thread_started",
project_id=payload.get("project_id") or project_id,
agent_id=agent_id,
session_id=session_id,
request_id=payload.get("request_id"),
)
elif session_id:
gateway_log(
"relay_session_duplicate_ignored",
level="warn",
project_id=payload.get("project_id") or project_id,
agent_id=agent_id,
session_id=session_id,
request_id=payload.get("request_id"),
)
finally:
GATEWAY_LISTENER_CONNECTED = False
try:
listener.close()
except OSError:
pass
gateway_log("relay_listener_disconnected", project_id=project_id, agent_id=agent_id)
if closed_by_relay:
closed_by_relay_streak += 1
delay = min(30.0, 2.0 + (closed_by_relay_streak * 2.0)) + random.uniform(0.0, 1.5)
gateway_periodic_log(
"relay_listener_backoff",
30,
"relay_listener_backoff",
level="warn",
project_id=project_id,
agent_id=agent_id,
reconnect_delay_seconds=round(delay, 2),
closed_by_relay_streak=closed_by_relay_streak,
)
time.sleep(delay)
continue
closed_by_relay_streak = 0
else:
closed_by_relay_streak = 0
readiness = gateway_remote_readiness()
blockers = gateway_remote_blockers(readiness)
gateway_periodic_log(
"relay_listener_waiting",
60,
"relay_listener_waiting",
level="warn",
project_id=readiness.get("project_id"),
agent_id=readiness.get("agent_id"),
has_token=readiness.get("has_token"),
remote_enabled=readiness.get("remote_enabled"),
relay_secret_configured=readiness.get("relay_secret_configured"),
blockers=blockers,
reason=",".join(blockers) if blockers else "waiting",
)
except Exception as exc:
closed_by_relay_streak = 0
GATEWAY_LISTENER_CONNECTED = False
GATEWAY_LISTENER_LAST_ERROR = str(exc)
GATEWAY_LISTENER_LAST_ERROR_AT = iso_now()
gateway_periodic_log(
"relay_listener_error",
30,
"relay_listener_error",
level="error",
project_id=current_project_id(),
agent_id=AUTH.get("agent_id"),
base_url=relay_base_url(),
error=str(exc),
)
time.sleep(2)
def start_gateway_relay_thread():
threading.Thread(target=gateway_relay_loop, name="napseer-gateway-relay", daemon=True).start()
def load_auth(public_override=None, secret_override=None):
data = public_override if public_override is not None else load_public_auth_file()
secrets_map = secret_override or {}
merged = {**data, **secrets_map}
return {
"base_url": os.environ.get("NAPSEER_BASE_URL") or merged.get("base_url") or "https://api.napseer.com",
"token": os.environ.get("NAPSEER_TOKEN") or merged.get("token") or merged.get("access_token"),
"token_expires_at": merged.get("token_expires_at"),
"project_id": os.environ.get("NAPSEER_PROJECT_ID") or merged.get("project_id"),
"project_slug": merged.get("project_slug"),
"project_name": merged.get("project_name"),
"project_signing_key_fingerprint": merged.get("project_signing_key_fingerprint"),
"worker_id": merged.get("worker_id"),
"agent_id": merged.get("agent_id"),
"worker_name": merged.get("worker_name") or "napseer-agent",
"device_fingerprint": merged.get("device_fingerprint") or socket.gethostname(),
"root_path": merged.get("root_path") or str(pathlib.Path.cwd()),
"ssh_key_path": merged.get("ssh_key_path") or str(DEFAULT_KEY_PATH),
"ssh_private_key": merged.get("ssh_private_key"),
"ssh_public_key": merged.get("ssh_public_key"),
"worker_capabilities": merged.get("worker_capabilities") or {"local_mcp": True, "mcp_wrapper": SCRIPT_NAME},
"account_mode": merged.get("account_mode"),
"service_registration_id": merged.get("service_registration_id"),
}
AUTH = load_auth()
BASE_URL = AUTH["base_url"].rstrip("/")
TOKEN = AUTH["token"]
DEFAULT_PROJECT_ID = AUTH["project_id"]
TOKEN_EXPIRES_AT = AUTH["token_expires_at"]
PROTOCOL_VERSION = "2025-11-25"
SCHEDULE_SIGNATURE_NAMESPACE = "napseer-schedule-v1"
HTTP_TIMEOUT_SECONDS = int(os.environ.get("NAPSEER_HTTP_TIMEOUT_SECONDS", "30"))
def send(message):
sys.stdout.write(json.dumps(message, separators=(",", ":")) + "\n")
sys.stdout.flush()
def rpc_result(request_id, result):
return {"jsonrpc": "2.0", "id": request_id, "result": result}
def rpc_error(request_id, code, message, details=None):
error = {"code": code, "message": message}
if details is not None:
error["data"] = {"details": details}
return {"jsonrpc": "2.0", "id": request_id, "error": error}
def tool_result(value, is_error=False):
return {
"content": [{"type": "text", "text": json.dumps(value, indent=2)}],
"structuredContent": value,
"isError": is_error,
}
def path_parts(full_path):
normalized = normalize_node_path(full_path)
if normalized == "/":
raise RuntimeError("path must point to a node")
folder, name = normalized.rsplit("/", 1)
return {"folder_path": folder or "/", "name": name}
def normalize_node_path(value):
return "/" + str(value or "").strip().strip("/")
def is_agent_namespace_path(value):
normalized = normalize_node_path(value)
return normalized == AGENT_NAMESPACE or normalized.startswith(f"{AGENT_NAMESPACE}/")
def reject_agent_namespace_path(value, label="path"):
if is_agent_namespace_path(value):
raise RuntimeError(
f"{label} is inside {AGENT_NAMESPACE}; use the explicit napseer_*_agent_node tools with agent_slug"
)
def filter_project_nodes(nodes):
return [node for node in (nodes or []) if not is_agent_namespace_path(node.get("full_path") or "")]
def agent_slug_from_args(args):
slug = str(args.get("agent_slug") or "").strip().strip("/")
if not slug:
raise RuntimeError("agent_slug is required")
if "/" in slug or slug in {".", ".."} or slug.startswith("."):
raise RuntimeError("agent_slug must be a single path segment")
allowed = set("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789._-")
if any(ch not in allowed for ch in slug):
raise RuntimeError("agent_slug may contain only letters, numbers, '.', '_', and '-'")
return slug
def agent_root_path(agent_slug):
return f"{AGENT_NAMESPACE}/{agent_slug}"
def agent_scoped_path(args, key="path"):
slug = agent_slug_from_args(args)
root = agent_root_path(slug)
raw_path = str(args.get(key) or "").strip()
if not raw_path:
raise RuntimeError(f"{key} is required")
normalized = normalize_node_path(raw_path)
if normalized == root:
raise RuntimeError(f"{key} must point to a node inside {root}")
if normalized.startswith(f"{root}/"):
return normalized
if normalized == AGENT_NAMESPACE or normalized.startswith(f"{AGENT_NAMESPACE}/"):
raise RuntimeError(f"{key} must stay inside {root}")
return f"{root}/{normalized.strip('/')}"
def agent_scoped_folder(args):
slug = agent_slug_from_args(args)
root = agent_root_path(slug)
raw_folder = str(args.get("folder_path") or "").strip()
if not raw_folder:
return root
normalized = normalize_node_path(raw_folder)
if normalized == root or normalized.startswith(f"{root}/"):
return normalized
if normalized == AGENT_NAMESPACE or normalized.startswith(f"{AGENT_NAMESPACE}/"):
raise RuntimeError(f"folder_path must stay inside {root}")
return f"{root}/{normalized.strip('/')}"
def request_json(method, path, payload=None, token_required=True, retry_auth=True, extra_headers=None):
if token_required and not TOKEN:
raise RuntimeError("NAPSEER_TOKEN is required")
body = None if payload is None else json.dumps(payload).encode("utf-8")
headers = {"Content-Type": "application/json", "User-Agent": "napseer-mcp-python/0.1"}
if token_required:
headers["Authorization"] = f"Bearer {TOKEN}"
if extra_headers:
headers.update(extra_headers)
request = urllib.request.Request(f"{BASE_URL}{path}", data=body, headers=headers, method=method)
try:
with api_urlopen(request, timeout=HTTP_TIMEOUT_SECONDS) as response:
text = response.read().decode("utf-8")
return json.loads(text) if text else {}
except (TimeoutError, socket.timeout) as exc:
raise RuntimeError(f"{method} {path} timed out after {HTTP_TIMEOUT_SECONDS}s") from exc
except urllib.error.HTTPError as exc:
body_text = exc.read().decode("utf-8")
if exc.code == 401 and token_required and retry_auth:
renew_auth()
return request_json(method, path, payload, token_required=True, retry_auth=False, extra_headers=extra_headers)
raise RuntimeError(f"{method} {path} failed: HTTP {exc.code}: {body_text}") from exc
def lock_headers(lock):
return {
"X-Napseer-Lock-Id": lock["id"],
"X-Napseer-Lock-Token": lock["lease_token"],
}
def acquire_project_lock(args=None):
args = args or {}
project_id = resolve_project_id(args)
payload = {
"scope_type": args.get("scope_type", "project"),
"scope_key": args.get("scope_key", "*"),
"purpose": args.get("purpose", "mcp write"),
"holder_label": args.get("holder_label") or AUTH.get("worker_name") or "local MCP",
"ttl_seconds": int(args.get("ttl_seconds", 600)),
}
return request_json("POST", f"/v1/projects/{project_id}/locks", payload)
def renew_project_lock(args):
project_id = resolve_project_id(args)
lock_id = args.get("lock_id")
lease_token = args.get("lease_token")
if not lock_id or not lease_token:
raise RuntimeError("lock_id and lease_token are required")
return request_json(
"POST",
f"/v1/projects/{project_id}/locks/{lock_id}",
{"lease_token": lease_token, "ttl_seconds": int(args.get("ttl_seconds", 600))},
extra_headers={"X-Napseer-Lock-Token": lease_token},
)
def release_project_lock(args):
project_id = resolve_project_id(args)
lock_id = args.get("lock_id")
lease_token = args.get("lease_token")
if not lock_id or not lease_token:
raise RuntimeError("lock_id and lease_token are required")
return request_json(
"DELETE",
f"/v1/projects/{project_id}/locks/{lock_id}",
payload=None,
extra_headers={"X-Napseer-Lock-Token": lease_token},
)
def list_project_locks(args):
project_id = resolve_project_id(args)
return request_json("GET", f"/v1/projects/{project_id}/locks")
def with_project_lock(args, operation):
lock = acquire_project_lock(args)
try:
return operation(lock_headers(lock))
finally:
try:
release_project_lock({"lock_id": lock["id"], "lease_token": lock["lease_token"], "project_id": args.get("project_id")})
except Exception:
pass
def request_project_write(method, path, payload, project_id, purpose, scope_type="project", scope_key="*"):
return with_project_lock(
{"project_id": project_id, "scope_type": scope_type, "scope_key": scope_key, "purpose": purpose},
lambda headers: request_json(method, path, payload, extra_headers=headers),
)
def index_file_lock():
AUTH_DIR.mkdir(exist_ok=True)
chmod_best_effort(AUTH_DIR, 0o700)
handle = INDEX_LOCK_PATH.open("a+b")
chmod_best_effort(INDEX_LOCK_PATH, 0o600)
if fcntl is not None:
fcntl.flock(handle.fileno(), fcntl.LOCK_EX)
return handle
def release_index_file_lock(handle):
try:
if fcntl is not None:
fcntl.flock(handle.fileno(), fcntl.LOCK_UN)
finally:
handle.close()
def index_connect():
AUTH_DIR.mkdir(exist_ok=True)
chmod_best_effort(AUTH_DIR, 0o700)
conn = sqlite3.connect(str(INDEX_PATH), timeout=30)
conn.row_factory = sqlite3.Row
conn.execute("PRAGMA busy_timeout = 5000")
conn.execute("PRAGMA journal_mode = WAL")
conn.execute(
"""
CREATE TABLE IF NOT EXISTS local_index_nodes (
node_id TEXT PRIMARY KEY,
project_id TEXT NOT NULL,
full_path TEXT NOT NULL,
name TEXT NOT NULL,
folder_path TEXT,
node_type TEXT NOT NULL,
tags_json TEXT NOT NULL,
updated_at TEXT NOT NULL,
indexed_at TEXT NOT NULL
)
"""
)
conn.execute(
"""
CREATE VIRTUAL TABLE IF NOT EXISTS local_index_fts USING fts5(
node_id UNINDEXED,
project_id UNINDEXED,
full_path,
name,
folder_path,
node_type,
tags,
aliases,
links,
metadata_text,
content_text
)
"""
)
chmod_best_effort(INDEX_PATH, 0o600)
return conn
def flatten_index_values(value):
if value is None:
return []
if isinstance(value, str):
return [value]
if isinstance(value, (int, float, bool)):
return [str(value)]
if isinstance(value, list):
items = []
for item in value:
items.extend(flatten_index_values(item))
return items
if isinstance(value, dict):
items = []
for key, item in value.items():
items.append(str(key))
items.extend(flatten_index_values(item))
return items
return [str(value)]
def compact_json_text(value):
return json.dumps(value or [], ensure_ascii=False, sort_keys=True, separators=(",", ":"))
def index_node(node):
if not node or not node.get("id"):
return
lock = index_file_lock()
try:
with index_connect() as conn:
tags = node.get("tags") or []
aliases = node.get("aliases") or []
links = node.get("links") or []
metadata = node.get("metadata") or {}
conn.execute(
"""
INSERT INTO local_index_nodes (
node_id, project_id, full_path, name, folder_path, node_type,
tags_json, updated_at, indexed_at
)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
ON CONFLICT(node_id) DO UPDATE SET
project_id = excluded.project_id,
full_path = excluded.full_path,
name = excluded.name,
folder_path = excluded.folder_path,
node_type = excluded.node_type,
tags_json = excluded.tags_json,
updated_at = excluded.updated_at,
indexed_at = excluded.indexed_at
""",
(
node["id"],
node.get("project_id") or DEFAULT_PROJECT_ID or "",
node.get("full_path") or "",
node.get("name") or "",
node.get("folder_path"),
node.get("type") or "note",
compact_json_text(tags),
node.get("updated_at") or "",
iso_now(),
),
)
conn.execute("DELETE FROM local_index_fts WHERE node_id = ?", (node["id"],))
conn.execute(
"""
INSERT INTO local_index_fts (
node_id, project_id, full_path, name, folder_path, node_type,
tags, aliases, links, metadata_text, content_text
)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
""",
(
node["id"],
node.get("project_id") or DEFAULT_PROJECT_ID or "",
node.get("full_path") or "",
node.get("name") or "",
node.get("folder_path") or "",
node.get("type") or "note",
" ".join(tags),
" ".join(aliases),
" ".join(flatten_index_values(links)),
" ".join(flatten_index_values(metadata)),
node.get("content_text") or "",
),
)
finally:
release_index_file_lock(lock)
def remove_indexed_node(node_id):
lock = index_file_lock()
try:
with index_connect() as conn:
conn.execute("DELETE FROM local_index_fts WHERE node_id = ?", (node_id,))
conn.execute("DELETE FROM local_index_nodes WHERE node_id = ?", (node_id,))
finally:
release_index_file_lock(lock)
SEARCH_STOP_WORDS = {
"about",
"again",
"also",
"and",
"are",
"because",
"been",
"before",
"being",
"between",
"but",
"can",
"could",
"decide",
"decided",
"did",
"does",
"done",
"for",
"from",
"had",
"has",
"have",
"how",
"into",
"its",
"just",
"like",
"long",
"need",
"not",
"our",
"out",
"over",
"plan",
"please",
"should",
"that",
"the",
"then",
"there",
"they",
"this",
"was",
"we",
"were",
"what",
"when",
"where",
"which",
"who",
"why",
"with",
"work",
"you",
}
def unique_preserve_order(values):
seen = set()
items = []
for value in values:
if value in seen:
continue
seen.add(value)
items.append(value)
return items
def search_tokens(value):
raw_tokens = re.findall(r"[A-Za-z0-9][A-Za-z0-9_.:/-]*", value.lower())
tokens = []
for token in raw_tokens:
cleaned = token.strip("._:/-")
if len(cleaned) < 3 or cleaned in SEARCH_STOP_WORDS:
continue
tokens.append(cleaned)
if cleaned.endswith("s") and len(cleaned) > 3:
singular = cleaned[:-1]
if singular not in SEARCH_STOP_WORDS:
tokens.append(singular)
return unique_preserve_order(tokens)
def quote_fts(value):
return f'"{str(value).replace(chr(34), chr(34) + chr(34))}"'
def fts_prefix_term(value):
term = re.sub(r"[^a-z0-9_]", "", str(value).lower())
if not term:
return ""
return f"{term}*"
def analyze_search_query(value):
raw = str(value or "").strip()
if not raw:
raise RuntimeError("q is required")
phrases = [item.strip() for item in re.findall(r'"([^"]+)"', raw) if item.strip()]
terms = search_tokens(raw)
simplified_terms = terms[:8]
return {
"raw": raw,
"is_long_query": len(raw.split()) > 6,
"phrases": unique_preserve_order(phrases)[:5],
"terms": terms[:20],
"simplified_query": " ".join(simplified_terms) if simplified_terms else raw,
}
def fts_query(value):
analysis = analyze_search_query(value)
terms = analysis["terms"]
if terms:
return " ".join(quote_fts(term) for term in terms[:6])
return quote_fts(analysis["raw"])
def fts_query_variants(value):
analysis = analyze_search_query(value)
variants = []
for phrase in analysis["phrases"]:
variants.append({"strategy": "quoted_phrase", "query": quote_fts(phrase)})
terms = analysis["terms"]
if terms:
prefix_terms = [fts_prefix_term(term) for term in terms[:12]]
prefix_terms = [term for term in prefix_terms if term]
if prefix_terms:
variants.append({"strategy": "important_terms_prefix_any", "query": " OR ".join(prefix_terms)})
variants.append({"strategy": "important_terms_any", "query": " OR ".join(quote_fts(term) for term in terms[:12])})
variants.append({"strategy": "important_terms_all", "query": " ".join(quote_fts(term) for term in terms[:6])})
if len(terms) > 2:
variants.append({"strategy": "top_terms_all", "query": " ".join(quote_fts(term) for term in terms[:3])})
variants.append({"strategy": "raw_phrase", "query": quote_fts(analysis["raw"])})
deduped = []
seen = set()
for variant in variants:
query = variant["query"]
if query in seen:
continue
seen.add(query)
deduped.append(variant)
return analysis, deduped
def local_index_diagnostics(project_id, conn=None):
diagnostics = {"project_id": project_id, "exists": INDEX_PATH.exists(), "index_path": str(INDEX_PATH)}
if not INDEX_PATH.exists():
diagnostics.update({"count": 0, "used": False, "reindex_recommended": True})
return diagnostics
def read(connection):
count = connection.execute("SELECT COUNT(*) AS count FROM local_index_nodes WHERE project_id = ?", (project_id,)).fetchone()["count"]
latest = connection.execute("SELECT MAX(indexed_at) AS latest FROM local_index_nodes WHERE project_id = ?", (project_id,)).fetchone()["latest"]
diagnostics.update(
{
"count": count,
"latest_indexed_at": latest,
"used": False,
"reindex_recommended": count == 0,
}
)
return diagnostics
if conn is not None:
return read(conn)
lock = index_file_lock()
try:
with index_connect() as connection:
return read(connection)
finally:
release_index_file_lock(lock)
def search_local_index(args):
project_id = resolve_project_id(args)
query_analysis, variants = fts_query_variants(args.get("q"))
limit = max(1, min(int(args.get("limit", 25)), 100))
attempts = []
seen = set()
items = []
lock = index_file_lock()
try:
with index_connect() as conn:
diagnostics = local_index_diagnostics(project_id, conn)
for variant in variants:
if len(items) >= limit:
break
try:
rows = conn.execute(
"""
SELECT n.node_id, n.project_id, n.full_path, n.name, n.folder_path, n.node_type,
n.tags_json, n.updated_at, n.indexed_at,
bm25(local_index_fts) AS rank
FROM local_index_fts
JOIN local_index_nodes n ON n.node_id = local_index_fts.node_id
WHERE local_index_fts MATCH ? AND n.project_id = ?
ORDER BY rank ASC, n.updated_at DESC
LIMIT ?
""",
(variant["query"], project_id, limit),
).fetchall()
except sqlite3.Error as exc:
attempts.append({"strategy": variant["strategy"], "matched": 0, "error": str(exc)})
continue
matched = 0
for row in rows:
key = row["node_id"]
if key in seen:
continue
seen.add(key)
matched += 1
items.append(
{
"id": row["node_id"],
"project_id": row["project_id"],
"full_path": row["full_path"],
"name": row["name"],
"folder_path": row["folder_path"],
"type": row["node_type"],
"tags": json.loads(row["tags_json"] or "[]"),
"updated_at": row["updated_at"],
"indexed_at": row["indexed_at"],
"rank": row["rank"],
"matched_strategy": variant["strategy"],
}
)
attempts.append({"strategy": variant["strategy"], "matched": matched})
diagnostics["used"] = True
diagnostics["returned"] = len(items[:limit])
return {
"items": items[:limit],
"query": query_analysis,
"search_strategies": attempts,
"index": diagnostics,
}
finally:
release_index_file_lock(lock)
def reindex_project(args):
project_id = resolve_project_id(args)
limit = max(1, min(int(args.get("limit", 200)), 200))
nodes = []
cursor = None
while True:
query = {"limit": limit}
if cursor:
query["cursor"] = cursor
page = request_json("GET", f"/v1/projects/{project_id}/nodes?{urllib.parse.urlencode(query)}")
nodes.extend(filter_project_nodes(page.get("items", [])))
cursor = page.get("next_cursor")
if not cursor:
break
lock = index_file_lock()
try:
with index_connect() as conn:
conn.execute("DELETE FROM local_index_fts WHERE project_id = ?", (project_id,))
conn.execute("DELETE FROM local_index_nodes WHERE project_id = ?", (project_id,))
finally:
release_index_file_lock(lock)
for node in nodes:
index_node(node)
return {"project_id": project_id, "indexed": len(nodes), "index_path": str(INDEX_PATH)}
def index_status(args):
project_id = resolve_project_id(args)
return local_index_diagnostics(project_id)
def clear_local_index(args):
project_id = resolve_project_id(args)
lock = index_file_lock()
try:
with index_connect() as conn:
conn.execute("DELETE FROM local_index_fts WHERE project_id = ?", (project_id,))
conn.execute("DELETE FROM local_index_nodes WHERE project_id = ?", (project_id,))
finally:
release_index_file_lock(lock)
return {"project_id": project_id, "cleared": True}
def public_json(path):
request = urllib.request.Request(
f"{BASE_URL}{path}",
headers={"Content-Type": "application/json", "User-Agent": "napseer-mcp-python/0.1"},
)
try:
with api_urlopen(request, timeout=HTTP_TIMEOUT_SECONDS) as response:
return json.loads(response.read().decode("utf-8"))
except (TimeoutError, socket.timeout) as exc:
raise RuntimeError(f"GET {path} timed out after {HTTP_TIMEOUT_SECONDS}s") from exc
def fetch_remote_script(script_name=SCRIPT_NAME):
if SCRIPT_NAME != "napseer_mcp_server.py":
raise RuntimeError(f"unsupported wrapper filename for self-update: {SCRIPT_NAME}")
remote = public_json(f"/v1/scripts/{script_name}")
content = remote.get("content")
if not isinstance(content, str) or not content.strip():
raise RuntimeError("remote script response did not include content")
return remote
def sha256_bytes(content):
return hashlib.sha256(content).hexdigest()
def is_sha256_hex(value):
return (
isinstance(value, str)
and len(value) == 64
and all(ch in "0123456789abcdefABCDEF" for ch in value)
)
def validate_remote_script(remote):
content = remote.get("content")
if not isinstance(content, str) or not content.strip():
raise RuntimeError("remote script response did not include content")
content_bytes = content.encode("utf-8")
content_sha256 = sha256_bytes(content_bytes)
declared_sha256 = remote.get("sha256")
if not is_sha256_hex(declared_sha256):
raise RuntimeError("remote script response did not include a valid sha256")
declared_sha256 = declared_sha256.lower()
errors = []
if declared_sha256 != content_sha256:
errors.append("content sha256 does not match declared sha256")
declared_bytes = remote.get("bytes")
if declared_bytes is not None:
if isinstance(declared_bytes, bool) or not isinstance(declared_bytes, int):
errors.append("declared byte count is not an integer")
elif declared_bytes != len(content_bytes):
errors.append("content byte count does not match declared byte count")
if errors:
raise RuntimeError(f"remote script integrity mismatch: {', '.join(errors)}")
return {
"content": content,
"content_bytes": content_bytes,
"content_bytes_len": len(content_bytes),
"content_sha256": content_sha256,
"declared_sha256": declared_sha256,
"declared_bytes": declared_bytes,
}
def update_status(remote=None):
if remote is None:
remote = fetch_remote_script(SCRIPT_NAME)
integrity = validate_remote_script(remote)
local_content = SCRIPT_PATH.read_bytes()
local_sha256 = sha256_bytes(local_content)
up_to_date = local_sha256 == integrity["declared_sha256"]
return {
"script_path": str(SCRIPT_PATH),
"script_name": SCRIPT_NAME,
"remote_url": f"{BASE_URL}/v1/scripts/{SCRIPT_NAME}",
"remote_version": remote.get("version"),
"remote_build_commit": remote.get("build_commit"),
"remote_published_at": remote.get("published_at"),
"remote_changelog_url": remote.get("changelog_url"),
"up_to_date": up_to_date,
"update_required": not up_to_date,
"verification": "sha256",
"remote_integrity_ok": True,
"local_bytes": len(local_content),
"remote_bytes": integrity["content_bytes_len"],
"local_sha256": local_sha256,
"remote_sha256": integrity["declared_sha256"],
"remote_declared_sha256": integrity["declared_sha256"],
"remote_content_sha256": integrity["content_sha256"],
"remote_declared_bytes": integrity["declared_bytes"],
}
def update_script_dependencies():
results = []
for name in SCRIPT_DEPENDENCY_NAMES:
remote = fetch_remote_script(name)
integrity = validate_remote_script(remote)
target = SCRIPT_PATH.with_name(name)
local_bytes = target.read_bytes() if target.exists() else b""
local_sha256 = sha256_bytes(local_bytes)
updated = local_sha256 != integrity["declared_sha256"]
if updated:
temp_path = target.with_name(f".{target.name}.tmp")
try:
temp_path.unlink()
except FileNotFoundError:
pass
temp_path.write_bytes(integrity["content_bytes"])
if sha256_bytes(temp_path.read_bytes()) != integrity["declared_sha256"]:
raise RuntimeError(f"downloaded {name} failed temp-file sha256 verification")
temp_path.replace(target)
try:
target.chmod(0o755)
except OSError:
pass
results.append({
"name": name,
"path": str(target),
"updated": updated,
"local_sha256": sha256_bytes(target.read_bytes()) if target.exists() else "",
"remote_sha256": integrity["declared_sha256"],
})
return results
def update_self(args):
if args.get("confirm") != "update":
raise RuntimeError("napseer_update_self requires confirm='update'")
remote = fetch_remote_script(SCRIPT_NAME)
status = update_status(remote)
dependency_results = update_script_dependencies()
if status["up_to_date"]:
return {**status, "updated": any(item["updated"] for item in dependency_results), "dependencies": dependency_results}
integrity = validate_remote_script(remote)
backup_path = SCRIPT_PATH.with_suffix(SCRIPT_PATH.suffix + ".bak")
temp_path = SCRIPT_PATH.with_name(f".{SCRIPT_PATH.name}.tmp")
original_mode = SCRIPT_PATH.stat().st_mode
backup_path.write_bytes(SCRIPT_PATH.read_bytes())
try:
try:
temp_path.unlink()
except FileNotFoundError:
pass
temp_path.write_bytes(integrity["content_bytes"])
temp_sha256 = sha256_bytes(temp_path.read_bytes())
if temp_sha256 != integrity["declared_sha256"]:
raise RuntimeError("downloaded script failed temp-file sha256 verification")
temp_path.replace(SCRIPT_PATH)
except Exception:
try:
temp_path.unlink()
except OSError:
pass
raise
try:
SCRIPT_PATH.chmod(original_mode | 0o700)
except OSError:
pass
final_sha256 = sha256_bytes(SCRIPT_PATH.read_bytes())
if final_sha256 != integrity["declared_sha256"]:
SCRIPT_PATH.write_bytes(backup_path.read_bytes())
raise RuntimeError("updated script failed final sha256 verification; restored backup")
final_status = update_status(remote)
return {
**final_status,
"updated": True,
"dependencies": dependency_results,
"backup_path": str(backup_path),
"previous_local_sha256": status["local_sha256"],
}
def sign_text(namespace, key_path, text):
with tempfile.TemporaryDirectory() as tmp:
data_path = pathlib.Path(tmp) / "data.txt"
data_path.write_text(text, encoding="utf-8")
subprocess.run(
["ssh-keygen", "-Y", "sign", "-q", "-n", namespace, "-f", str(key_path), str(data_path)],
check=True,
stdout=subprocess.DEVNULL,
)
return pathlib.Path(str(data_path) + ".sig").read_text(encoding="utf-8")
def auth_public_key():
ensure_local_files()
if AUTH.get("ssh_public_key"):
return AUTH["ssh_public_key"].strip()
key_path = pathlib.Path(AUTH["ssh_key_path"]).expanduser()
public_key_path = pathlib.Path(str(key_path) + ".pub")
if not public_key_path.exists():
raise RuntimeError(f"missing public key at {public_key_path}")
return public_key_path.read_text(encoding="utf-8").strip()
def sign_with_auth_key(namespace, text):
if AUTH.get("ssh_private_key"):
with tempfile.TemporaryDirectory() as tmp:
key_path = pathlib.Path(tmp) / "id_ed25519"
key_path.write_text(AUTH["ssh_private_key"], encoding="utf-8")
chmod_best_effort(key_path, 0o600)
public_key = AUTH.get("ssh_public_key")
if public_key:
pathlib.Path(str(key_path) + ".pub").write_text(public_key.strip() + "\n", encoding="utf-8")
return sign_text(namespace, key_path, text)
return sign_text(namespace, pathlib.Path(AUTH["ssh_key_path"]).expanduser(), text)
def renew_auth():
public_key = auth_public_key()
challenge = request_json(
"POST",
"/v1/enrollment/challenges",
{
"public_key": public_key,
"worker_name": AUTH["worker_name"],
"device_fingerprint": AUTH["device_fingerprint"],
"root_path": AUTH["root_path"],
"worker_capabilities": AUTH["worker_capabilities"],
},
token_required=False,
)
signature = sign_with_auth_key("napseer", challenge["challenge_text"])
verified = request_json(
"POST",
"/v1/enrollment/verify",
{"challenge_id": challenge["challenge_id"], "signature": signature},
token_required=False,
)
save_auth(
{
"base_url": BASE_URL,
"token": verified["token"]["access_token"],
"token_expires_at": verified["token"].get("expires_at"),
"worker_id": verified["worker"]["id"],
"agent_id": verified["worker"]["agent_id"],
"worker_name": verified["worker"]["name"],
"device_fingerprint": verified["worker"]["device_fingerprint"],
"root_path": verified["worker"]["root_path"],
}
)
return {
"status": "renewed",
"token_expires_at": verified["token"].get("expires_at"),
"worker_id": verified["worker"]["id"],
"agent_id": verified["worker"]["agent_id"],
}
def save_auth(updates):
global AUTH, BASE_URL, TOKEN, DEFAULT_PROJECT_ID, TOKEN_EXPIRES_AT, VAULT_SECRETS
current_public = load_public_auth_file()
cleaned = {key: value for key, value in updates.items() if value is not None}
if vault_exists():
public_updates = {key: value for key, value in cleaned.items() if key in AUTH_FILE_KEYS}
secret_updates = {key: value for key, value in cleaned.items() if key in GATEWAY_VAULT_KEYS}
current_public.update(public_updates)
write_public_auth(current_public)
if secret_updates:
require_unlocked("updating gateway vault")
VAULT_SECRETS.update(secret_updates)
write_vault_with_key(VAULT_KEY, {"version": 1, "updated_at": iso_now(), "secrets": VAULT_SECRETS})
AUTH = load_auth(public_override=current_public)
else:
current_public.update(cleaned)
AUTH_PATH.parent.mkdir(exist_ok=True)
chmod_best_effort(AUTH_PATH.parent, 0o700)
AUTH_PATH.write_text(json.dumps(current_public, indent=2) + "\n", encoding="utf-8")
chmod_best_effort(AUTH_PATH, 0o600)
AUTH = load_auth()
BASE_URL = AUTH["base_url"].rstrip("/")
TOKEN = AUTH["token"]
DEFAULT_PROJECT_ID = AUTH["project_id"]
TOKEN_EXPIRES_AT = AUTH["token_expires_at"]
def ensure_local_files():
AUTH_DIR.mkdir(exist_ok=True)
chmod_best_effort(AUTH_DIR, 0o700)
gitignore = AUTH_DIR / ".gitignore"
if not gitignore.exists():
gitignore.write_text("*\n!.gitignore\n", encoding="utf-8")
key_path = pathlib.Path(AUTH["ssh_key_path"] or DEFAULT_KEY_PATH).expanduser()
public_key_path = pathlib.Path(str(key_path) + ".pub")
if not key_path.exists():
key_path.parent.mkdir(exist_ok=True)
chmod_best_effort(key_path.parent, 0o700)
subprocess.run(
["ssh-keygen", "-q", "-t", "ed25519", "-N", "", "-f", str(key_path)],
check=True,
)
chmod_best_effort(key_path, 0o600)
if public_key_path.exists():
chmod_best_effort(public_key_path, 0o644)
return key_path
def ensure_enrolled(args=None):
if TOKEN:
return {"status": "already_enrolled", "token_expires_at": TOKEN_EXPIRES_AT}
args = args or {}
key_path = ensure_local_files()
public_key = pathlib.Path(str(key_path) + ".pub").read_text(encoding="utf-8").strip()
slug = str(args.get("slug") or pathlib.Path.cwd().name or "napseer-project")
worker_name = str(args.get("worker_name") or AUTH.get("worker_name") or f"{slug}-agent")
device_fingerprint = str(args.get("device_fingerprint") or AUTH.get("device_fingerprint") or socket.gethostname())
root_path = str(args.get("root_path") or AUTH.get("root_path") or pathlib.Path.cwd())
worker_capabilities = AUTH.get("worker_capabilities") or {"local_mcp": True, "mcp_wrapper": SCRIPT_NAME}
challenge = request_json(
"POST",
"/v1/enrollment/challenges",
{
"public_key": public_key,
"worker_name": worker_name,
"device_fingerprint": device_fingerprint,
"root_path": root_path,
"worker_capabilities": worker_capabilities,
},
token_required=False,
)
signature = sign_text("napseer", key_path, challenge["challenge_text"])
verified = request_json(
"POST",
"/v1/enrollment/verify",
{"challenge_id": challenge["challenge_id"], "signature": signature},
token_required=False,
)
save_auth(
{
"base_url": BASE_URL,
"token": verified["token"]["access_token"],
"token_expires_at": verified["token"].get("expires_at"),
"worker_id": verified["worker"]["id"],
"agent_id": verified["worker"]["agent_id"],
"worker_name": worker_name,
"device_fingerprint": device_fingerprint,
"root_path": root_path,
"ssh_key_path": str(key_path),
"ssh_public_key": public_key,
"worker_capabilities": worker_capabilities,
"account_mode": AUTH.get("account_mode") or "anonymous",
}
)
return {"status": "enrolled", "token_expires_at": verified["token"].get("expires_at")}
def gateway_service_preregister(args=None):
args = args or {}
bootstrap_token = (
args.get("bootstrap_token")
or os.environ.get("NAPSEER_SERVICE_BOOTSTRAP_TOKEN")
or os.environ.get("NAPSEER_GATEWAY_BOOTSTRAP_TOKEN")
)
if not bootstrap_token:
raise RuntimeError("service bootstrap token is required")
passphrase = (
args.get("passphrase")
or os.environ.get("NAPSEER_GATEWAY_PASSPHRASE")
or os.environ.get("NAPSEER_GATEWAY_PASSKEY")
)
if not vault_exists():
if not passphrase:
raise RuntimeError("gateway passphrase is required to create the gateway vault")
gateway_setup({
"passphrase": passphrase,
"default_command": args.get("default_command") or os.environ.get("NAPSEER_GATEWAY_COMMAND"),
})
elif passphrase and not gateway_is_unlocked():
gateway_unlock(passphrase)
key_path = ensure_local_files()
public_key = pathlib.Path(str(key_path) + ".pub").read_text(encoding="utf-8").strip()
display_name = (
args.get("display_name")
or os.environ.get("NAPSEER_SERVICE_DISPLAY_NAME")
or os.environ.get("NAPSEER_GATEWAY_NAME")
or AUTH.get("worker_name")
or f"{pathlib.Path.cwd().name}-gateway"
)
root_path = args.get("root_path") or os.environ.get("NAPSEER_SERVICE_ROOT_PATH") or AUTH.get("root_path") or str(pathlib.Path.cwd())
device_fingerprint = args.get("device_fingerprint") or os.environ.get("NAPSEER_SERVICE_DEVICE_FINGERPRINT") or AUTH.get("device_fingerprint") or socket.gethostname()
default_command = args.get("default_command") or os.environ.get("NAPSEER_GATEWAY_COMMAND") or normalize_gateway_command()
image_ref = args.get("image_ref") or os.environ.get("NAPSEER_SERVICE_IMAGE_REF")
result = request_json(
"POST",
"/v1/service-registrations",
{
"bootstrap_token": bootstrap_token,
"public_key": public_key,
"display_name": display_name,
"device_fingerprint": device_fingerprint,
"root_path": root_path,
"default_command": default_command,
"image_ref": image_ref,
"labels": {
"source": "napseer-gateway-container",
"hostname": socket.gethostname(),
},
"metadata": {
"cwd": str(pathlib.Path.cwd()),
"base_url": BASE_URL,
},
},
token_required=False,
)
registration = result.get("registration") or result
activation_token = result.get("activation_token")
save_auth({
"base_url": BASE_URL,
"project_id": registration.get("project_id") or DEFAULT_PROJECT_ID,
"service_registration_id": registration.get("id"),
"service_activation_token": activation_token,
"agent_id": registration.get("agent_id"),
"worker_name": registration.get("display_name") or display_name,
"device_fingerprint": registration.get("device_fingerprint") or device_fingerprint,
"root_path": registration.get("root_path") or root_path,
"ssh_key_path": str(key_path),
"ssh_public_key": public_key,
"worker_capabilities": {
"gateway": True,
"service_registration_id": registration.get("id"),
"container": True,
},
})
return {
"status": "pending_review",
"message": "Gateway service preregistered. Open the cloud UI to accept or deny it.",
"registration": registration,
}
def gateway_service_activate(args=None):
args = args or {}
registration_id = args.get("registration_id") or AUTH.get("service_registration_id") or load_public_auth_file().get("service_registration_id")
activation_token = (
args.get("activation_token")
or os.environ.get("NAPSEER_SERVICE_ACTIVATION_TOKEN")
or VAULT_SECRETS.get("service_activation_token")
or load_public_auth_file().get("service_activation_token")
)
if not registration_id:
raise RuntimeError("service registration id is required")
if not activation_token:
raise RuntimeError("service activation token is required")
payload = {"activation_token": activation_token}
if args.get("token_expires_in_hours"):
payload["token_expires_in_hours"] = int(args["token_expires_in_hours"])
activation = request_json(
"POST",
f"/v1/service-registrations/{registration_id}/activate",
payload,
token_required=False,
)
token = activation.get("token") or activation
worker = activation.get("worker") or {}
save_auth({
"base_url": BASE_URL,
"token": token.get("access_token"),
"token_expires_at": token.get("expires_at"),
"project_id": worker.get("project_id") or DEFAULT_PROJECT_ID,
"worker_id": worker.get("id") or AUTH.get("worker_id"),
"agent_id": worker.get("agent_id") or AUTH.get("agent_id"),
"worker_name": worker.get("name") or AUTH.get("worker_name"),
"device_fingerprint": worker.get("device_fingerprint") or AUTH.get("device_fingerprint"),
"root_path": worker.get("root_path") or AUTH.get("root_path"),
})
return {
"status": "activated",
"message": "Gateway service accepted and worker token stored locally.",
"token_expires_at": token.get("expires_at"),
"registration_id": registration_id,
"agent_id": worker.get("agent_id") or AUTH.get("agent_id"),
"project_id": worker.get("project_id") or DEFAULT_PROJECT_ID,
}
def gateway_service_run(args=None):
args = args or {}
if not AUTH.get("service_registration_id") and (
os.environ.get("NAPSEER_SERVICE_BOOTSTRAP_TOKEN") or os.environ.get("NAPSEER_GATEWAY_BOOTSTRAP_TOKEN")
):
gateway_service_preregister(args)
deadline = time.time() + int(args.get("timeout_seconds") or os.environ.get("NAPSEER_SERVICE_ACTIVATION_TIMEOUT_SECONDS", "900"))
activated = False
while not TOKEN and time.time() < deadline:
try:
gateway_service_activate(args)
activated = True
break
except RuntimeError as exc:
if "401" not in str(exc) and "not accepted" not in str(exc) and "already activated" not in str(exc):
raise
gateway_log("service_activation_waiting", registration_id=AUTH.get("service_registration_id"), error=str(exc))
time.sleep(5)
if not TOKEN and not activated:
raise RuntimeError("gateway service was not accepted before activation timeout")
if not gateway_is_unlocked():
passphrase = os.environ.get("NAPSEER_GATEWAY_PASSPHRASE") or os.environ.get("NAPSEER_GATEWAY_PASSKEY")
if passphrase:
gateway_unlock(passphrase)
result = start_local_ui({"open_browser": False, "port": int(args.get("port") or os.environ.get("NAPSEER_GATEWAY_PORT", "0"))})
print(json.dumps(result, indent=2))
try:
threading.Event().wait()
except KeyboardInterrupt:
return result
def chmod_best_effort(path, mode):
try:
path.chmod(mode)
except OSError:
pass
def resolve_project_id(args):
project_id = DEFAULT_PROJECT_ID
if not project_id:
raise RuntimeError("No project configured. Run nap project create or call napseer_create_project first.")
return project_id
def current_project_id():
return DEFAULT_PROJECT_ID or ""
def create_project_with_state(args):
ensure_enrolled(args)
payload = {
"slug": args["slug"],
"name": args["name"],
"description": args.get("description", ""),
}
status = "created"
try:
project = request_json("POST", "/v1/projects", payload)
except RuntimeError as exc:
if "HTTP 409" not in str(exc):
raise
project = find_project_by_slug(args["slug"])
if not project:
raise
status = "existing"
save_auth(
{
"base_url": BASE_URL,
"token": TOKEN,
"project_id": project["id"],
"project_slug": project["slug"],
"project_name": project["name"],
}
)
try:
register_project_signing_key({"label": "local-project-key"})
except Exception:
pass
message = (
f"Project '{project['slug']}' created and configured for this directory."
if status == "created"
else f"Project '{project['slug']}' already exists; configured this directory to use it."
)
return project, status, message
def create_project_from_args(args):
project, _, _ = create_project_with_state(args)
return project
def find_project_by_slug(slug):
target = str(slug or "").strip().lower()
projects = request_json("GET", "/v1/projects").get("items", [])
for project in projects:
if str(project.get("slug") or "").lower() == target:
return project
return None
def bootstrap_project(args):
encryption = str(args.get("encryption") or "plaintext").strip().lower()
if encryption not in {"plaintext", "encrypted"}:
raise RuntimeError("encryption must be plaintext or encrypted")
if encryption == "encrypted" and not str(args.get("passphrase") or "").strip():
raise RuntimeError("project passphrase is required when encryption is enabled")
project, project_status, message = create_project_with_state(args)
encryption_state = "plaintext"
if encryption == "encrypted":
status = request_project_write(
"POST",
f"/v1/projects/{project['id']}/encryption/enable",
{"state": "encrypted"},
project["id"],
"enable project encryption",
)
encryption_state = status.get("state") or "encrypted"
return {
"status": project_status,
"message": message,
"project": project,
"project_id": project["id"],
"encryption_state": encryption_state,
"project_unlocked": True,
}
def project_encryption_status(args=None):
args = args or {}
project_id = resolve_project_id(args)
status = request_json("GET", f"/v1/projects/{project_id}/encryption/status")
return {
**status,
"status": "ok",
"message": f"Project encryption is {status.get('state') or 'unknown'}.",
}
def project_encryption_transition(args=None):
args = args or {}
requested = str(args.get("state") or args.get("mode") or "").strip().lower()
aliases = {
"on": "encrypted",
"enable": "encrypted",
"enabled": "encrypted",
"encrypt": "encrypted",
"encrypted": "encrypted",
"off": "plaintext",
"disable": "plaintext",
"disabled": "plaintext",
"decrypt": "plaintext",
"decrypted": "plaintext",
"plain": "plaintext",
"plaintext": "plaintext",
}
desired = aliases.get(requested)
if desired is None:
raise RuntimeError("project encryption mode must be plaintext or encrypted")
project_id = resolve_project_id(args)
operation = "enable" if desired == "encrypted" else "disable"
payload = {"state": desired}
result = request_project_write(
"POST",
f"/v1/projects/{project_id}/encryption/{operation}",
payload,
project_id,
f"set project encryption {desired}",
scope_type="encryption",
)
save_auth({"project_encryption_state": result.get("state") or desired})
return {
**result,
"status": "updated",
"message": f"Project encryption is now {result.get('state') or desired}.",
"requested_state": desired,
}
def default_project_slug():
base = pathlib.Path.cwd().name.lower()
slug = []
previous_dash = False
for char in base:
if char.isalnum():
slug.append(char)
previous_dash = False
elif not previous_dash:
slug.append("-")
previous_dash = True
normalized = "".join(slug).strip("-")
return normalized or "local-project"
def default_project_name(slug):
return " ".join(part.capitalize() for part in slug.split("-") if part) or "Local project"
def cli_option(args, *names, default=None):
for name in names:
if name in args:
index = args.index(name)
if index + 1 >= len(args):
raise RuntimeError(f"{name} requires a value")
return args[index + 1]
return default
def cli_flag(args, *names):
return any(name in args for name in names)
def cli_positionals(args):
values = []
skip_next = False
options_with_values = {
"--slug",
"--name",
"--description",
"--encryption",
"--passphrase",
}
for index, value in enumerate(args):
if skip_next:
skip_next = False
continue
if value in options_with_values:
skip_next = True
continue
if value.startswith("-"):
continue
values.append(value)
return values
def cli_project_create(args):
positionals = cli_positionals(args)
slug = cli_option(args, "--slug", default=positionals[0] if positionals else default_project_slug())
name = cli_option(args, "--name", default=default_project_name(slug))
encryption = cli_option(args, "--encryption", default="encrypted" if cli_flag(args, "--encrypted") else "plaintext")
payload = {
"slug": slug,
"name": name,
"description": cli_option(args, "--description", default=""),
"encryption": encryption,
}
passphrase = cli_option(args, "--passphrase", default=os.environ.get("NAPSEER_PROJECT_PASSPHRASE"))
if passphrase:
payload["passphrase"] = passphrase
return bootstrap_project(payload)
def parse_tmux_target(value):
value = str(value or "").strip()
if not value:
return {}
session = value
window = ""
pane = ""
if ":" in session:
session, rest = session.split(":", 1)
if "." in rest:
window, pane = rest.split(".", 1)
else:
window = rest
return {"session": session, "window": window, "pane": pane}
def current_tmux_target():
if not os.environ.get("TMUX"):
return {}
try:
result = subprocess.run(
["tmux", "display-message", "-p", "#{session_name}:#{window_index}.#{pane_index}"],
check=True,
capture_output=True,
text=True,
timeout=5,
)
return parse_tmux_target(result.stdout.strip())
except Exception:
return {}
def cli_gateway_configure(args):
if not vault_exists():
gateway_setup({"passphrase": cli_option(args, "--passphrase", default=None)})
if not gateway_is_unlocked():
gateway_unlock(cli_option(args, "--passphrase", default=None) or getpass.getpass("Gateway passphrase: "))
target = parse_tmux_target(cli_option(args, "--target", default=""))
command = cli_option(args, "--command", default=cli_option(args, "--default-command", default=""))
if not command and sys.stdin.isatty():
value = input(f"Default terminal command [{normalize_gateway_command()}]: ").strip()
command = value or normalize_gateway_command()
if not command:
command = normalize_gateway_command()
payload = {
"session": cli_option(args, "--session", default=target.get("session", "")),
"window": cli_option(args, "--window", default=target.get("window", "")),
"pane": cli_option(args, "--pane", default=target.get("pane", "")),
"default_command": command,
}
if "--target" not in args and "--session" not in args:
payload["session"] = ""
elif not payload["session"]:
payload.update(current_tmux_target())
if "--target" in args or "--session" in args:
if not payload.get("session"):
payload["session"] = input("tmux session: ").strip()
if not payload.get("window"):
value = input("tmux window, optional: ").strip()
if value:
payload["window"] = value
if not payload.get("pane"):
value = input("tmux pane, optional: ").strip()
if value:
payload["pane"] = value
return gateway_tmux_configure(payload)
def cli_gateway_require_unlocked(args, operation="gateway operation"):
if not vault_exists():
raise RuntimeError("gateway vault is not configured; run nap gateway configure first")
if not gateway_is_unlocked():
gateway_unlock(cli_option(args, "--passphrase", default=None) or getpass.getpass("Gateway passphrase: "))
require_unlocked(operation)
def cli_project_claim(args):
result = claim_account({
"open_browser": not cli_flag(args, "--no-browser"),
"timeout_seconds": int(cli_option(args, "--timeout", "--timeout-seconds", default="300")),
"return_url": cli_option(args, "--return-url", default=None),
})
if result.get("status") == "already_claimed":
return result
claim_result = result.get("result") if isinstance(result.get("result"), dict) else None
if claim_result and claim_result.get("status") == "claimed":
status = "claimed"
message = "Project/account claim completed and local auth was updated."
else:
status = "claim_pending"
message = "Claim link created. Complete it in the browser to attach this project/account."
return {**result, "status": status, "message": message}
def cli_configure_status():
project_configured = bool(DEFAULT_PROJECT_ID)
encryption = {"state": "plaintext", "updated_at": ""}
if project_configured:
try:
encryption = project_encryption_status({})
except Exception:
encryption = {"state": AUTH.get("project_encryption_state") or "unknown", "updated_at": ""}
return {
"status": "configured" if project_configured else "not_configured",
"message": "Project is configured for this directory." if project_configured else "No project is configured for this directory.",
"cwd": str(pathlib.Path.cwd()),
**state_dir_status_payload(),
"auth_path": str(AUTH_PATH),
"auth_configured": bool(TOKEN),
"account_mode": AUTH.get("account_mode"),
"project_configured": project_configured,
"project_id": DEFAULT_PROJECT_ID or "",
"project_slug": load_public_auth_file().get("project_slug", ""),
"encryption_state": encryption.get("state") or "unknown",
"encryption_updated_at": encryption.get("updated_at") or "",
"token_expires_at": TOKEN_EXPIRES_AT,
"next": {
"gateway_start": "nap gateway start",
"gateway_configure": "nap gateway configure",
"gateway_logs": "nap gateway logs",
"create_project": "nap project create",
"project_encryption": "nap project encryption status",
"update": "nap update",
},
}
def iso_now():
return datetime.now(timezone.utc).replace(microsecond=0).isoformat().replace("+00:00", "Z")
def iso_after_days(days):
return (datetime.now(timezone.utc) + timedelta(days=days)).replace(microsecond=0).isoformat().replace("+00:00", "Z")
def get_project_signing_key(project_id):
key = request_json("GET", f"/v1/projects/{project_id}/signing-key")
save_auth({"project_signing_key_fingerprint": key.get("fingerprint")})
return key
def register_project_signing_key(args):
project_id = resolve_project_id(args)
key = request_project_write(
"PUT",
f"/v1/projects/{project_id}/signing-key",
{"public_key": auth_public_key(), "label": args.get("label", "local-project-key")},
project_id,
"register project signing key",
)
save_auth({"project_signing_key_fingerprint": key.get("fingerprint")})
return key
def canonical_schedule_payload(args):
project_id = resolve_project_id(args)
fingerprint = AUTH.get("project_signing_key_fingerprint")
if not fingerprint:
try:
fingerprint = get_project_signing_key(project_id).get("fingerprint")
except Exception:
fingerprint = register_project_signing_key({}).get("fingerprint")
payload = {
"schema": "napseer.schedule.v1",
"project_id": project_id,
"schedule_id": args.get("schedule_id") or str(uuid.uuid4()),
"version": int(args.get("version", 1)),
"action": args.get("action", "upsert"),
"name": args["name"],
"cron_expr": args["cron_expr"],
"timezone": args.get("timezone", "UTC"),
"target_worker_id": args.get("target_worker_id"),
"target_agent_id": args.get("target_agent_id") or AUTH.get("agent_id"),
"instruction_text": args["instruction_text"],
"enabled": bool(args.get("enabled", True)),
"created_at": args.get("created_at") or iso_now(),
"expires_at": args.get("expires_at") or iso_after_days(int(args.get("expires_in_days", 30))),
"key_fingerprint": fingerprint,
"payload": args.get("payload") or {},
}
return json.dumps(payload, separators=(",", ":"), sort_keys=True)
def create_signed_schedule(args):
project_id = resolve_project_id(args)
signed_payload = canonical_schedule_payload(args)
signature = sign_with_auth_key(SCHEDULE_SIGNATURE_NAMESPACE, signed_payload)
return request_project_write(
"POST",
f"/v1/projects/{project_id}/schedules",
{"signed_payload": signed_payload, "signature": signature},
project_id,
"create signed schedule",
)
def get_node_by_path(args, allow_agent=False):
project_id = resolve_project_id(args)
path = args["path"]
if not allow_agent:
reject_agent_namespace_path(path)
return request_json(
"GET",
f"/v1/projects/{project_id}/nodes/by-path?{urllib.parse.urlencode({'path': path})}",
)
def try_get_node_by_path(path, allow_agent=False):
try:
return get_node_by_path({"path": path}, allow_agent=allow_agent)
except RuntimeError as exc:
if "HTTP 404" in str(exc):
return None
raise
def node_payload_from_args(args, existing=None):
parts = path_parts(args["path"])
payload = {}
if not existing or "path" in args:
payload["folder_path"] = parts["folder_path"]
payload["name"] = parts["name"]
for source, target in [
("type", "type"),
("content_text", "content_text"),
("tags", "tags"),
("aliases", "aliases"),
("links", "links"),
("metadata", "metadata"),
]:
if source in args:
payload[target] = args[source]
if "type" not in payload and not existing:
payload["type"] = "note"
if "content_text" not in payload and not existing:
payload["content_text"] = ""
if "tags" not in payload and not existing:
payload["tags"] = []
if "aliases" not in payload and not existing:
payload["aliases"] = []
if "links" not in payload and not existing:
payload["links"] = []
if "metadata" not in payload and not existing:
payload["metadata"] = {}
return payload
def upsert_node(args):
reject_agent_namespace_path(args["path"])
project_id = resolve_project_id(args)
existing = try_get_node_by_path(args["path"])
if existing:
updated = request_project_write(
"PATCH",
f"/v1/projects/{project_id}/nodes/{existing['id']}",
node_payload_from_args(args, existing=existing),
project_id,
f"update node {existing['full_path']}",
"path",
existing["full_path"],
)
index_node(updated)
return {"created": False, "node": updated}
write_path = normalize_node_path(args["path"])
created = request_project_write(
"POST",
f"/v1/projects/{project_id}/nodes",
node_payload_from_args(args),
project_id,
f"create node {args['path']}",
"path",
write_path,
)
index_node(created)
return {"created": True, "node": created}
def update_node_by_path(args):
reject_agent_namespace_path(args["path"])
project_id = resolve_project_id(args)
existing = get_node_by_path({"path": args["path"]})
updated = request_project_write(
"PATCH",
f"/v1/projects/{project_id}/nodes/{existing['id']}",
node_payload_from_args(args, existing=existing),
project_id,
f"update node {existing['full_path']}",
"path",
existing["full_path"],
)
index_node(updated)
return {"updated": True, "node": updated}
def archive_node_by_path(args):
reject_agent_namespace_path(args["path"])
project_id = resolve_project_id(args)
existing = get_node_by_path({"path": args["path"]})
request_project_write(
"DELETE",
f"/v1/projects/{project_id}/nodes/{existing['id']}",
None,
project_id,
f"archive node {existing['full_path']}",
"path",
existing["full_path"],
)
remove_indexed_node(existing["id"])
return {"archived": True, "path": existing["full_path"], "id": existing["id"]}
def link_nodes(args):
reject_agent_namespace_path(args["source_path"], "source_path")
reject_agent_namespace_path(args["target_path"], "target_path")
project_id = resolve_project_id(args)
source = get_node_by_path({"path": args["source_path"]})
target = get_node_by_path({"path": args["target_path"]})
relation = args.get("relation", "references")
links = source.get("links") or []
if not isinstance(links, list):
links = []
link = {"path": target["full_path"], "relation": relation}
created = not any(
item.get("path") == link["path"] and item.get("relation", "references") == relation
for item in links
if isinstance(item, dict)
)
if created:
links.append(link)
updated = request_project_write(
"PATCH",
f"/v1/projects/{project_id}/nodes/{source['id']}",
{"links": links},
project_id,
f"link node {source['full_path']}",
"path",
source["full_path"],
)
index_node(updated)
else:
updated = source
return {
"created": created,
"relation": relation,
"source": {"id": source["id"], "full_path": source["full_path"]},
"target": {"id": target["id"], "full_path": target["full_path"]},
"updated_node": updated,
}
def get_backlinks_by_path(args):
reject_agent_namespace_path(args["path"])
project_id = resolve_project_id(args)
target = get_node_by_path({"path": args["path"]})
backlinks = request_json("GET", f"/v1/projects/{project_id}/nodes/{target['id']}/backlinks")
return {"target": {"id": target["id"], "full_path": target["full_path"]}, **backlinks}
def list_project_nodes(args):
project_id = resolve_project_id(args)
allowed = {"tag", "folder_path", "q", "limit", "cursor", "updated_before", "updated_after", "type"}
base_query = {key: value for key, value in args.items() if key in allowed and value not in (None, "")}
raw_q = str(base_query.get("q") or "").strip()
if raw_q and not base_query.get("cursor"):
query_analysis = analyze_search_query(raw_q)
limit = max(1, min(int(base_query.get("limit", 50)), 200))
collected = []
diagnostics = {"server_queries": []}
for server_query in server_search_queries(query_analysis):
if len(unique_nodes(collected)) >= limit:
break
query = dict(base_query)
query["q"] = server_query
query["limit"] = max(1, limit - len(unique_nodes(collected)))
suffix = f"?{urllib.parse.urlencode(query)}"
page = request_json("GET", f"/v1/projects/{project_id}/nodes{suffix}")
items = filter_project_nodes(page.get("items", []))
diagnostics["server_queries"].append({"q": server_query, "matched": len(items)})
for node in items:
node = dict(node)
node["matched_query"] = server_query
collected.append(node)
return {
"items": unique_nodes(collected)[:limit],
"query_analysis": query_analysis,
"diagnostics": diagnostics,
}
query = urllib.parse.urlencode(base_query)
suffix = f"?{query}" if query else ""
result = request_json("GET", f"/v1/projects/{project_id}/nodes{suffix}")
result["items"] = filter_project_nodes(result.get("items", []))
return result
def list_folders(args):
project_id = resolve_project_id(args)
return request_json("GET", f"/v1/projects/{project_id}/folders")
def list_tags(args):
project_id = resolve_project_id(args)
return request_json("GET", f"/v1/projects/{project_id}/tags")
def list_connected_agents(args=None):
args = args or {}
project_id = resolve_project_id(args)
return request_json("GET", f"/v1/projects/{project_id}/agents").get("items", [])
def list_feedback_reports(args=None):
args = args or {}
query = {}
for key in ("project_id", "kind", "severity", "status", "limit"):
value = args.get(key)
if value not in (None, ""):
query[key] = value
suffix = f"?{urllib.parse.urlencode(query)}" if query else ""
return request_json("GET", f"/v1/feedback{suffix}")
def update_feedback_status(args):
feedback_id = str(args.get("feedback_id") or args.get("id") or "").strip()
if not feedback_id:
raise RuntimeError("feedback_id is required")
status = str(args.get("status") or "").strip()
if not status:
raise RuntimeError("status is required")
payload = {"status": status}
if args.get("resolution"):
payload["resolution"] = args.get("resolution")
if args.get("notes"):
payload["notes"] = args.get("notes")
return request_json("PATCH", f"/v1/feedback/{urllib.parse.quote(feedback_id, safe='')}", payload)
def list_registered_agents(args=None):
args = args or {}
project_id = resolve_project_id(args)
items = request_json("GET", f"/v1/projects/{project_id}/agents").get("items", [])
local_agent_id = AUTH.get("agent_id")
local_registered = bool(local_agent_id) and any(item.get("agent_id") == local_agent_id for item in items)
message = f"{len(items)} registered project agent{'s' if len(items) != 1 else ''} found."
if local_agent_id and not local_registered:
message = "Local agent identity is not registered on this project."
return {
"status": "ok",
"message": message,
"project_id": project_id,
"local_agent_id": local_agent_id,
"local_worker_id": AUTH.get("worker_id"),
"local_registered": local_registered,
"items": items,
}
def list_agent_workspaces(args=None):
args = args or {}
project_id = resolve_project_id(args)
result = request_json("GET", f"/v1/projects/{project_id}/nodes?limit=200")
slugs = sorted(
{
normalize_node_path(node.get("full_path") or "").split("/")[2]
for node in result.get("items", [])
if normalize_node_path(node.get("full_path") or "").startswith(f"{AGENT_NAMESPACE}/")
and len(normalize_node_path(node.get("full_path") or "").split("/")) > 2
}
)
return {
"status": "ok",
"message": f"{len(slugs)} agent workspace{'s' if len(slugs) != 1 else ''} found.",
"project_id": project_id,
"items": slugs,
}
def touch_project_agent(args=None):
args = args or {}
project_id = current_project_id()
if not project_id or not TOKEN:
return {"status": "skipped", "reason": "project_or_token_missing"}
request_json("GET", f"/v1/projects/{project_id}")
return {
"status": "touched",
"project_id": project_id,
"agent_id": AUTH.get("agent_id"),
"worker_id": AUTH.get("worker_id"),
}
def start_project_heartbeat_thread():
if not current_project_id() or not TOKEN:
return
def heartbeat_loop():
while True:
try:
touch_project_agent()
except Exception:
pass
time.sleep(45)
thread = threading.Thread(target=heartbeat_loop, name="napseer-project-heartbeat", daemon=True)
thread.start()
def project_encryption_state(project_id):
try:
return request_json("GET", f"/v1/projects/{project_id}/encryption/status").get("state") or "plaintext"
except Exception:
return "plaintext"
def strip_node_content(node, include_content=False):
if include_content:
return node
slim = dict(node)
content = slim.pop("content_text", "")
if content:
slim["snippet"] = content[:240]
return slim
def unique_nodes(nodes):
seen = set()
items = []
for node in nodes:
key = node.get("id") or node.get("full_path")
if not key or key in seen:
continue
seen.add(key)
items.append(node)
return items
def server_search_queries(query_analysis):
values = [query_analysis["raw"]]
if query_analysis["simplified_query"] and query_analysis["simplified_query"] != query_analysis["raw"]:
values.append(query_analysis["simplified_query"])
values.extend(query_analysis["phrases"])
if query_analysis["terms"]:
values.extend(query_analysis["terms"][:5])
return unique_preserve_order([value for value in values if value])[:6]
def search_memory(args):
project_id = resolve_project_id(args)
q = str(args.get("q") or "").strip()
if not q:
raise RuntimeError("q is required")
query_analysis = analyze_search_query(q)
limit = max(1, min(int(args.get("limit", 25)), 100))
mode = str(args.get("mode") or "hybrid").strip().lower()
if mode not in {"hybrid", "server", "local"}:
raise RuntimeError("mode must be hybrid, server, or local")
include_content = bool(args.get("include_content", False))
encryption_state = project_encryption_state(project_id)
collected = []
sources = []
diagnostics = {
"query": query_analysis,
"local_index": local_index_diagnostics(project_id),
"server_queries": [],
}
if mode in {"hybrid", "local"} and INDEX_PATH.exists():
try:
local_result = search_local_index({"q": q, "limit": limit})
diagnostics["local_index"] = local_result.get("index", diagnostics["local_index"])
diagnostics["local_strategies"] = local_result.get("search_strategies", [])
local = local_result.get("items", [])
for item in local:
node = item
if include_content:
try:
node = get_node_by_path({"path": item["full_path"]})
except Exception:
pass
node = dict(node)
node["search_source"] = "local"
collected.append(node)
if local:
sources.append("local")
except Exception as exc:
if mode == "local":
raise
sources.append(f"local_error:{exc}")
diagnostics["local_error"] = str(exc)
elif mode in {"hybrid", "local"}:
diagnostics["local_index"]["skipped_reason"] = "index_missing"
if mode in {"hybrid", "server"} and (mode == "server" or encryption_state == "plaintext" or len(collected) < limit):
remaining = limit
for server_query in server_search_queries(query_analysis):
if len(unique_nodes(collected)) >= limit:
break
server = list_project_nodes({"q": server_query, "limit": remaining}).get("items", [])
diagnostics["server_queries"].append({"q": server_query, "matched": len(server)})
for node in server:
node = strip_node_content(node, include_content=include_content)
node["search_source"] = "server"
node["matched_query"] = server_query
collected.append(node)
if server and "server" not in sources:
sources.append("server")
remaining = max(1, limit - len(unique_nodes(collected)))
items = unique_nodes(collected)[:limit]
if not items and query_analysis["is_long_query"]:
diagnostics["hint"] = "Long natural-language query produced no matches; retry with quoted exact phrases or 2-5 distinctive nouns if the target memory exists."
return {
"project_id": project_id,
"query": q,
"query_analysis": query_analysis,
"mode": mode,
"encryption_state": encryption_state,
"sources": sources,
"diagnostics": diagnostics,
"items": items,
}
def recent_memory(args):
limit = max(1, min(int(args.get("limit", 25)), 100))
query = {"limit": limit}
for key in ["folder_path", "tag", "updated_before", "updated_after", "cursor"]:
if args.get(key):
query[key] = args[key]
result = list_project_nodes(query)
result["items"] = [strip_node_content(node, include_content=bool(args.get("include_content", False))) for node in result.get("items", [])]
return result
def get_memory_context(args):
raw_paths = args.get("paths") or ([args["path"]] if args.get("path") else [])
if not raw_paths:
raise RuntimeError("path or paths is required")
max_nodes = max(1, min(int(args.get("max_nodes", 20)), 100))
depth = max(0, min(int(args.get("depth", 1)), 2))
include_content = bool(args.get("include_content", True))
queue_paths = [normalize_node_path(path) for path in raw_paths]
nodes = []
edges = []
seen_paths = set()
current_depth = 0
while queue_paths and len(nodes) < max_nodes and current_depth <= depth:
next_paths = []
for path in queue_paths:
if path in seen_paths or len(nodes) >= max_nodes:
continue
seen_paths.add(path)
try:
node = get_node_by_path({"path": path}, allow_agent=is_agent_namespace_path(path))
except Exception:
continue
nodes.append(strip_node_content(node, include_content=include_content))
links = node.get("links") if isinstance(node.get("links"), list) else []
for link in links:
target_path = link.get("path") if isinstance(link, dict) else None
if target_path:
edges.append({"source": node["full_path"], "target": target_path, "relation": link.get("relation", "references")})
if current_depth < depth:
next_paths.append(target_path)
if current_depth < depth:
try:
backlinks = get_backlinks_by_path({"path": node["full_path"]}).get("items", [])
for backlink in backlinks:
source_path = backlink.get("full_path")
if source_path:
edges.append({"source": source_path, "target": node["full_path"], "relation": "backlink"})
next_paths.append(source_path)
except Exception:
pass
queue_paths = next_paths
current_depth += 1
return {"items": unique_nodes(nodes), "edges": edges[: max_nodes * 4]}
def find_related_nodes(args):
path = args["path"]
include_content = bool(args.get("include_content", False))
limit = max(1, min(int(args.get("limit", 25)), 100))
target = get_node_by_path({"path": path}, allow_agent=is_agent_namespace_path(path))
related = []
try:
related.extend(get_backlinks_by_path({"path": target["full_path"]}).get("items", []))
except Exception:
pass
links = target.get("links") if isinstance(target.get("links"), list) else []
for link in links:
if isinstance(link, dict) and link.get("path"):
try:
related.append(get_node_by_path({"path": link["path"]}, allow_agent=is_agent_namespace_path(link["path"])))
except Exception:
pass
for tag in target.get("tags") or []:
related.extend(list_project_nodes({"tag": tag, "limit": limit}).get("items", []))
folder = target.get("folder_path")
if folder:
related.extend(list_project_nodes({"folder_path": folder, "limit": limit}).get("items", []))
items = [strip_node_content(node, include_content=include_content) for node in unique_nodes(related) if node.get("full_path") != target.get("full_path")]
return {"target": strip_node_content(target, include_content=include_content), "items": items[:limit]}
def move_node(args):
old_path = args.get("path") or args.get("source_path")
new_path = args.get("new_path") or args.get("target_path")
if not old_path or not new_path:
raise RuntimeError("path and new_path are required")
reject_agent_namespace_path(old_path)
reject_agent_namespace_path(new_path)
project_id = resolve_project_id(args)
existing = get_node_by_path({"path": old_path})
payload = node_payload_from_args({"path": new_path}, existing=existing)
updated = request_project_write("PATCH", f"/v1/projects/{project_id}/nodes/{existing['id']}", payload, project_id, f"move node {old_path} to {new_path}")
remove_indexed_node(existing["id"])
index_node(updated)
return {"moved": True, "from": existing["full_path"], "to": updated["full_path"], "node": updated}
def move_folder(args):
from_folder = normalize_node_path(args["from_folder"])
to_folder = normalize_node_path(args["to_folder"])
if from_folder == "/" or to_folder == "/":
raise RuntimeError("from_folder and to_folder must not be root")
project_id = resolve_project_id(args)
all_nodes = []
cursor = None
while True:
query = {"limit": 200}
if cursor:
query["cursor"] = cursor
page = list_project_nodes(query)
all_nodes.extend(page.get("items", []))
cursor = page.get("next_cursor")
if not cursor:
break
targets = [
node for node in all_nodes
if (node.get("folder_path") == from_folder or str(node.get("folder_path") or "").startswith(f"{from_folder}/"))
]
lock = acquire_project_lock({"scope_type": "project", "scope_key": "*", "purpose": f"move folder {from_folder} to {to_folder}"})
updated = []
try:
headers = lock_headers(lock)
for node in targets:
current_folder = node.get("folder_path") or "/"
next_folder = to_folder if current_folder == from_folder else current_folder.replace(f"{from_folder}/", f"{to_folder}/", 1)
payload = {"folder_path": None if next_folder == "/" else next_folder}
saved = request_json("PATCH", f"/v1/projects/{project_id}/nodes/{node['id']}", payload, extra_headers=headers)
index_node(saved)
updated.append(saved)
finally:
try:
release_project_lock({"lock_id": lock["id"], "lease_token": lock["lease_token"]})
except Exception:
pass
return {"moved": len(updated), "from_folder": from_folder, "to_folder": to_folder, "items": updated}
def bulk_upsert_nodes(args):
nodes = args.get("nodes") or []
if not isinstance(nodes, list) or not nodes:
raise RuntimeError("nodes must be a non-empty array")
project_id = resolve_project_id(args)
lock = acquire_project_lock({"scope_type": "project", "scope_key": "*", "purpose": args.get("purpose", "bulk upsert nodes")})
results = []
try:
headers = lock_headers(lock)
for item in nodes:
path = item.get("path")
if not path:
raise RuntimeError("each node requires path")
reject_agent_namespace_path(path)
existing = try_get_node_by_path(path)
payload = node_payload_from_args(item, existing=existing)
if existing:
saved = request_json("PATCH", f"/v1/projects/{project_id}/nodes/{existing['id']}", payload, extra_headers=headers)
created = False
else:
saved = request_json("POST", f"/v1/projects/{project_id}/nodes", payload, extra_headers=headers)
created = True
index_node(saved)
results.append({"created": created, "node": saved})
finally:
try:
release_project_lock({"lock_id": lock["id"], "lease_token": lock["lease_token"]})
except Exception:
pass
return {"count": len(results), "items": results}
def agent_node_args(args, key="path"):
scoped = dict(args)
scoped["path"] = agent_scoped_path(args, key=key)
return scoped
def list_agent_nodes(args):
project_id = resolve_project_id(args)
root = agent_root_path(agent_slug_from_args(args))
query = {"limit": args.get("limit", 200)}
if args.get("q"):
query["q"] = args["q"]
if args.get("tag"):
query["tag"] = args["tag"]
if args.get("folder_path"):
query["folder_path"] = agent_scoped_folder(args)
suffix = urllib.parse.urlencode(query)
nodes = request_json("GET", f"/v1/projects/{project_id}/nodes?{suffix}").get("items", [])
return {
"agent_slug": args["agent_slug"],
"root_path": root,
"items": [node for node in nodes if (node.get("full_path") or "").startswith(f"{root}/")],
}
def get_agent_node(args):
return get_node_by_path({"path": agent_scoped_path(args)}, allow_agent=True)
def upsert_agent_node(args):
scoped = agent_node_args(args)
project_id = resolve_project_id(args)
existing = try_get_node_by_path(scoped["path"], allow_agent=True)
if existing:
updated = request_project_write(
"PATCH",
f"/v1/projects/{project_id}/nodes/{existing['id']}",
node_payload_from_args(scoped, existing=existing),
project_id,
f"update agent node {existing['full_path']}",
)
index_node(updated)
return {"created": False, "node": updated}
created = request_project_write(
"POST",
f"/v1/projects/{project_id}/nodes",
node_payload_from_args(scoped),
project_id,
f"create agent node {scoped['path']}",
)
index_node(created)
return {"created": True, "node": created}
def update_agent_node(args):
scoped = agent_node_args(args)
project_id = resolve_project_id(args)
existing = get_node_by_path({"path": scoped["path"]}, allow_agent=True)
updated = request_project_write(
"PATCH",
f"/v1/projects/{project_id}/nodes/{existing['id']}",
node_payload_from_args(scoped, existing=existing),
project_id,
f"update agent node {existing['full_path']}",
)
index_node(updated)
return {"updated": True, "node": updated}
def archive_agent_node(args):
scoped = agent_node_args(args)
project_id = resolve_project_id(args)
existing = get_node_by_path({"path": scoped["path"]}, allow_agent=True)
request_project_write(
"DELETE",
f"/v1/projects/{project_id}/nodes/{existing['id']}",
None,
project_id,
f"archive agent node {existing['full_path']}",
)
remove_indexed_node(existing["id"])
return {"archived": True, "path": existing["full_path"], "id": existing["id"]}
def link_agent_node(args):
slug = agent_slug_from_args(args)
project_id = resolve_project_id(args)
source_path = agent_scoped_path({"agent_slug": slug, "path": args["source_path"]})
target_raw = str(args.get("target_path") or "").strip()
target_path = agent_scoped_path({"agent_slug": slug, "path": target_raw}) if is_agent_namespace_path(target_raw) or not target_raw.startswith("/") else normalize_node_path(target_raw)
source = get_node_by_path({"path": source_path}, allow_agent=True)
target = get_node_by_path({"path": target_path}, allow_agent=is_agent_namespace_path(target_path))
relation = args.get("relation", "references")
links = source.get("links") or []
if not isinstance(links, list):
links = []
link = {"path": target["full_path"], "relation": relation}
created = not any(
item.get("path") == link["path"] and item.get("relation", "references") == relation
for item in links
if isinstance(item, dict)
)
if created:
links.append(link)
updated = request_project_write(
"PATCH",
f"/v1/projects/{project_id}/nodes/{source['id']}",
{"links": links},
project_id,
f"link agent node {source['full_path']}",
)
index_node(updated)
else:
updated = source
return {
"created": created,
"relation": relation,
"source": {"id": source["id"], "full_path": source["full_path"]},
"target": {"id": target["id"], "full_path": target["full_path"]},
"updated_node": updated,
}
def create_agent(args):
slug = agent_slug_from_args(args)
created = []
for name, content in AGENT_STARTER_NODES.items():
result = upsert_agent_node(
{
"agent_slug": slug,
"path": name,
"type": "agent-file",
"tags": ["agent", f"agent:{slug}", name],
"content_text": content,
"metadata": {"agent_slug": slug, "agent_file": name},
"links": [],
}
)
created.append(result["node"])
return {"agent_slug": slug, "root_path": agent_root_path(slug), "nodes": created}
def show_agent(args):
nodes = list_agent_nodes({"agent_slug": args["agent_slug"], "limit": 200}).get("items", [])
ordered = {path_parts(node["full_path"])["name"]: node for node in nodes}
return {
"agent_slug": args["agent_slug"],
"root_path": agent_root_path(args["agent_slug"]),
"files": sorted(node["full_path"] for node in nodes),
"profile": (ordered.get("profile") or {}).get("content_text", ""),
"role": (ordered.get("role") or {}).get("content_text", ""),
"personality": (ordered.get("personality") or {}).get("content_text", ""),
"rules": (ordered.get("rules") or {}).get("content_text", ""),
}
def claim_account(args):
receiver = None
return_url = args.get("return_url")
if not return_url:
receiver = start_claim_receiver()
return_url = receiver["return_url"]
try:
claim = request_json("POST", "/v1/account/claim-links", {"return_url": return_url})
except RuntimeError as exc:
if receiver:
receiver["server"].shutdown()
if "project_not_anonymous" in str(exc):
save_auth({"account_mode": "claimed"})
return {
"status": "already_claimed",
"message": "This project/account is already attached to an account. Claim is only needed for anonymous projects.",
"error_code": "project_not_anonymous",
"result": {"status": "already_claimed"},
}
raise
if args.get("open_browser", True):
webbrowser.open(claim["claim_url"])
result = None
if receiver:
result = wait_for_claim_result(receiver, int(args.get("timeout_seconds", 300)))
if result and result.get("status") == "claimed":
save_auth(
{
"account_mode": "claimed",
"claimed_account_id": result.get("account_id"),
"claim_result": result.get("verified", result),
"claimed_at": iso_now(),
}
)
save_auth(
{
"account_claim_url": claim.get("claim_url"),
"account_claim_expires_at": claim.get("expires_at"),
"account_mode": "claim_pending" if not result else AUTH.get("account_mode"),
}
)
return {"claim_url": claim["claim_url"], "expires_at": claim["expires_at"], "result": result}
def start_claim_receiver():
result_queue = queue.Queue(maxsize=1)
class Handler(BaseHTTPRequestHandler):
def log_message(self, format, *args):
return
def do_GET(self):
parsed = urllib.parse.urlparse(self.path)
if parsed.path != "/napseer/claim-callback":
self.send_response(404)
self.end_headers()
return
params = urllib.parse.parse_qs(parsed.query)
result = {
"status": params.get("status", [""])[0],
"account_id": params.get("account_id", [""])[0],
"claim_result_token": params.get("claim_result_token", [""])[0],
}
try:
result_queue.put_nowait(result)
except queue.Full:
pass
self.send_response(200)
self.send_header("Content-Type", "text/html; charset=utf-8")
self.end_headers()
self.wfile.write(b"<html><body><h1>Napseer account connected.</h1><p>You can return to the local UI.</p></body></html>")
server = ReusableThreadingHTTPServer(("127.0.0.1", 0), Handler)
threading.Thread(target=server.serve_forever, daemon=True).start()
return {
"server": server,
"queue": result_queue,
"return_url": f"http://127.0.0.1:{server.server_address[1]}/napseer/claim-callback",
}
def wait_for_claim_result(receiver, timeout_seconds):
try:
result = receiver["queue"].get(timeout=timeout_seconds)
except queue.Empty:
return None
finally:
receiver["server"].shutdown()
token = result.get("claim_result_token")
if token:
result["verified"] = request_json("GET", f"/v1/account/claim-results/{urllib.parse.quote(token)}")
return result
def ui_json(value):
return html.escape(json.dumps(value or {}, indent=2, sort_keys=True))
def ui_json_list(value):
return html.escape(json.dumps(value or [], indent=2, sort_keys=True))
def ui_tags(tags):
return "".join(f"<span class='tag'>{html.escape(tag)}</span>" for tag in (tags or []))
def ui_tree_insert(root, node):
full_path = node.get("full_path") or "/"
parts = [part for part in full_path.strip("/").split("/") if part]
if not parts:
return
cursor = root
for folder in parts[:-1]:
cursor = cursor.setdefault("folders", {}).setdefault(folder, {"folders": {}, "nodes": []})
cursor.setdefault("nodes", []).append(node)
def ui_render_tree_branch(branch, selected_path, mode, search, prefix=""):
folders = branch.get("folders", {})
nodes = branch.get("nodes", [])
output = []
for name in sorted(folders):
child = folders[name]
folder_path = f"{prefix}/{name}" if prefix else f"/{name}"
should_open = selected_path.startswith(folder_path + "/") or selected_path == folder_path
output.append(
f"<details class='folder' {'open' if should_open else ''}>"
f"<summary><span class='folder-icon'>dir</span>{html.escape(name)}</summary>"
f"{ui_render_tree_branch(child, selected_path, mode, search, folder_path)}"
"</details>"
)
for node in sorted(nodes, key=lambda item: item.get("full_path") or ""):
full_path = node.get("full_path") or ""
name = full_path.rstrip("/").split("/")[-1] or full_path
params = urllib.parse.urlencode({"mode": mode, "q": search, "path": full_path})
active = " active" if full_path == selected_path else ""
output.append(
f"<a class='file{active}' href='/?{params}'><span class='file-icon'>node</span>"
f"<span>{html.escape(name)}</span><small>{html.escape(node.get('type') or 'note')}</small></a>"
)
return "".join(output)
def ui_build_tree(nodes):
root = {"folders": {}, "nodes": []}
for node in nodes:
ui_tree_insert(root, node)
return root
def ui_safe_return(value):
if not value or not value.startswith("/") or value.startswith("//"):
return "/"
return value
def start_local_ui(args):
csrf_token = secrets.token_urlsafe(32)
cloud_gateway_tokens = set()
gateway_log(
"local_service_starting",
requested_port=args.get("port", 0),
cwd=pathlib.Path.cwd(),
project_id=current_project_id(),
agent_id=AUTH.get("agent_id"),
base_url=BASE_URL,
remote_enabled=gateway_remote_enabled_value(),
relay_secret_configured=bool(read_gateway_relay_secret()),
log_path=AUTH_DIR / "gateway.log",
)
try:
touch_project_agent()
except Exception as exc:
gateway_log(
"project_agent_touch_failed",
level="warn",
project_id=current_project_id(),
agent_id=AUTH.get("agent_id"),
error=str(exc),
)
start_project_heartbeat_thread()
start_gateway_log_compactor_thread()
start_gateway_relay_thread()
start_gateway_schedule_thread()
class Handler(BaseHTTPRequestHandler):
def log_message(self, format, *args):
return
def cloud_gateway_route(self):
return urllib.parse.urlparse(self.path).path.startswith("/gateway/cloud/")
def cloud_gateway_ws_route(self):
return urllib.parse.urlparse(self.path).path == "/gateway/cloud/ws"
def cloud_origin_allowed(self):
origin = self.headers.get("Origin", "")
if not origin:
return False
parsed = urllib.parse.urlparse(origin)
host = (parsed.hostname or "").lower()
return parsed.scheme in {"http", "https"} and (
host in {"napseer.com", "www.napseer.com", "localhost", "127.0.0.1"}
or host.endswith(".napseer.com")
)
def send_cors_headers(self):
origin = self.headers.get("Origin", "")
if self.cloud_origin_allowed():
self.send_header("Access-Control-Allow-Origin", origin)
self.send_header("Access-Control-Allow-Methods", "GET, POST, OPTIONS")
self.send_header("Access-Control-Allow-Headers", "Content-Type, X-Napseer-CSRF")
self.send_header("Access-Control-Max-Age", "600")
self.send_header("Vary", "Origin")
def validate_local_request(self):
host = self.headers.get("Host", "")
allowed_hosts = {
f"127.0.0.1:{self.server.server_address[1]}",
f"localhost:{self.server.server_address[1]}",
}
if host not in allowed_hosts:
raise RuntimeError("invalid Host header")
if self.command == "POST":
origin = self.headers.get("Origin")
allowed_origins = {f"http://{host}" for host in allowed_hosts}
if self.cloud_gateway_route() and self.cloud_origin_allowed():
return
if origin and origin not in allowed_origins:
raise RuntimeError("invalid Origin header")
def validate_cloud_ws_request(self):
self.validate_local_request()
if not self.cloud_origin_allowed():
raise RuntimeError("invalid Origin header")
if self.headers.get("Upgrade", "").lower() != "websocket":
raise RuntimeError("expected websocket upgrade")
def validate_csrf(self, payload=None, form=None):
header_token = self.headers.get("X-Napseer-CSRF", "")
payload_token = ""
if isinstance(payload, dict):
payload_token = str(payload.get("csrf_token") or "")
if isinstance(form, dict):
payload_token = payload_token or (form.get("csrf_token", [""])[0] if form.get("csrf_token") else "")
if not hmac.compare_digest(header_token or payload_token, csrf_token):
raise RuntimeError("invalid CSRF token")
def send_html(self, status, body):
self.send_response(status)
self.send_header("Content-Type", "text/html; charset=utf-8")
self.end_headers()
self.wfile.write(body.encode("utf-8"))
def send_json(self, status, payload):
self.send_response(status)
self.send_header("Content-Type", "application/json; charset=utf-8")
self.send_header("Cache-Control", "no-store")
self.send_cors_headers()
self.end_headers()
self.wfile.write(json.dumps(payload).encode("utf-8"))
def send_asset(self, route):
asset = LOCAL_UI_ASSETS.get(route)
if not asset:
self.send_response(404)
self.end_headers()
return False
body = base64.b64decode(asset.get("body_b64", ""), validate=True)
expected_sha256 = asset.get("sha256")
if expected_sha256 and hashlib.sha256(body).hexdigest() != expected_sha256:
self.send_response(500)
self.end_headers()
self.wfile.write(b"embedded asset integrity check failed")
return False
self.send_response(200)
self.send_header("Content-Type", asset.get("content_type") or "text/plain; charset=utf-8")
self.send_header("Content-Length", str(len(body)))
self.send_header("Cache-Control", "no-store" if route == "/" else "public, max-age=31536000, immutable")
self.send_cors_headers()
self.end_headers()
self.wfile.write(body)
return True
def do_OPTIONS(self):
try:
self.validate_local_request()
if not self.cloud_gateway_route():
self.send_response(404)
self.end_headers()
return
self.send_response(204)
self.send_cors_headers()
self.end_headers()
except Exception as exc:
self.send_json(400, {"error": str(exc)})
def redirect_home(self, location="/"):
self.send_response(303)
self.send_header("Location", ui_safe_return(location))
self.end_headers()
def read_form(self):
length = int(self.headers.get("Content-Length", "0"))
return urllib.parse.parse_qs(self.rfile.read(length).decode("utf-8"))
def read_json(self):
length = int(self.headers.get("Content-Length", "0"))
if length == 0:
return {}
return json.loads(self.rfile.read(length).decode("utf-8"))
def local_state_payload(self, query):
project_id = current_project_id()
gateway = gateway_status()
status = update_status()
if not project_id:
return {
"bootstrap_required": True,
"locked": bool(gateway.get("locked")),
"lock_reason": gateway.get("lock_reason"),
"vault_configured": bool(gateway.get("vault_configured")),
"vault_path": gateway.get("vault_path") or str(VAULT_PATH),
"gateway_default_command": gateway.get("default_command"),
"gateway_managed_session": gateway.get("managed_session"),
"gateway_managed_window": gateway.get("managed_window"),
"project_id": "",
"project_slug": "",
"project_name": "",
"project_description": "",
"encryption_state": "plaintext",
"csrf_token": csrf_token,
"agent_id": AUTH.get("agent_id"),
"token_expires_at": TOKEN_EXPIRES_AT,
"auth_path": str(AUTH_PATH),
"account_mode": AUTH.get("account_mode"),
"auth_configured": bool(TOKEN),
"wrapper": {
"up_to_date": bool(status.get("up_to_date")),
"update_required": bool(status.get("update_required")),
"verification": status.get("verification", "sha256"),
"remote_integrity_ok": bool(status.get("remote_integrity_ok")),
"local_sha256": status.get("local_sha256", ""),
"remote_sha256": status.get("remote_sha256", ""),
"remote_version": status.get("remote_version", ""),
"remote_build_commit": status.get("remote_build_commit", ""),
"local_bytes": status.get("local_bytes", 0),
"remote_bytes": status.get("remote_bytes", 0),
},
"nodes": [],
"agent_nodes": [],
"connected_agents": [],
"selected_path": "",
"selected_node": None,
"schedules": [],
"feedback": [],
}
search = query.get("q", [""])[0]
selected_path = query.get("path", [""])[0]
nodes_query = {"limit": 200}
if search:
nodes_query["q"] = search
nodes_suffix = urllib.parse.urlencode(nodes_query)
all_nodes = request_json("GET", f"/v1/projects/{project_id}/nodes?{nodes_suffix}").get("items", [])
nodes = filter_project_nodes(all_nodes)
agent_nodes = [node for node in all_nodes if is_agent_namespace_path(node.get("full_path") or "")]
if is_agent_namespace_path(selected_path):
selected_path = ""
if not selected_path and nodes:
selected_path = nodes[0].get("full_path") or ""
selected_node = None
if selected_path:
try:
selected_node = get_node_by_path({"path": selected_path})
except Exception:
selected_node = None
schedules = request_json("GET", f"/v1/projects/{project_id}/schedules").get("items", [])
try:
feedback = request_json("GET", "/v1/feedback?limit=50").get("items", [])
except Exception:
feedback = []
try:
connected_agents = list_connected_agents({"project_id": project_id})
except Exception:
connected_agents = []
project = {}
encryption = {"state": "plaintext"}
try:
project = request_json("GET", f"/v1/projects/{project_id}")
except Exception:
project = {}
try:
encryption = request_json("GET", f"/v1/projects/{project_id}/encryption/status")
except Exception:
encryption = {"state": project.get("encryption_state") or "plaintext"}
return {
"locked": bool(gateway.get("locked")),
"bootstrap_required": False,
"lock_reason": gateway.get("lock_reason"),
"vault_configured": bool(gateway.get("vault_configured")),
"vault_path": gateway.get("vault_path") or str(VAULT_PATH),
"gateway_default_command": gateway.get("default_command"),
"gateway_managed_session": gateway.get("managed_session"),
"gateway_managed_window": gateway.get("managed_window"),
"project_id": project_id,
"project_slug": project.get("slug") or AUTH.get("project_slug") or "local-project",
"project_name": project.get("name") or AUTH.get("project_name") or "Local project",
"project_description": project.get("description") or "",
"encryption_state": encryption.get("state") or "plaintext",
"csrf_token": csrf_token,
"agent_id": AUTH.get("agent_id"),
"token_expires_at": TOKEN_EXPIRES_AT,
"auth_path": str(AUTH_PATH),
"account_mode": AUTH.get("account_mode"),
"auth_configured": bool(TOKEN),
"wrapper": {
"up_to_date": bool(status.get("up_to_date")),
"update_required": bool(status.get("update_required")),
"verification": status.get("verification", "sha256"),
"remote_integrity_ok": bool(status.get("remote_integrity_ok")),
"local_sha256": status.get("local_sha256", ""),
"remote_sha256": status.get("remote_sha256", ""),
"remote_version": status.get("remote_version", ""),
"remote_build_commit": status.get("remote_build_commit", ""),
"local_bytes": status.get("local_bytes", 0),
"remote_bytes": status.get("remote_bytes", 0),
},
"nodes": nodes,
"agent_nodes": agent_nodes,
"connected_agents": connected_agents,
"selected_path": selected_path,
"selected_node": selected_node,
"schedules": schedules,
"feedback": feedback,
}
def handle_local_api_post(self, route, payload):
project_id = current_project_id()
if route == "/local-api/gateway/unlock":
return gateway_unlock(payload.get("passphrase", ""))
if route == "/local-api/gateway/lock":
return gateway_lock()
if route == "/local-api/gateway/setup":
return gateway_setup(payload)
if route == "/local-api/gateway/configure":
return gateway_tmux_configure(payload)
if route == "/local-api/gateway/terminal/input":
return gateway_terminal_input(payload)
if route == "/local-api/gateway/terminal/key":
return gateway_terminal_key(payload)
if route == "/local-api/gateway/terminal/capture":
return gateway_terminal_capture(payload)
if route == "/local-api/gateway/terminal/list":
return gateway_terminal_sessions(payload)
if route == "/local-api/gateway/terminal/create":
return gateway_terminal_create(payload)
if route == "/local-api/gateway/terminal/close":
return gateway_terminal_close(payload)
if route == "/local-api/gateway/terminal/restart":
return gateway_terminal_restart(payload)
if route == "/local-api/gateway/terminal/kill":
return gateway_terminal_kill(payload)
if route == "/local-api/gateway/schedule/list":
return gateway_schedule_list(payload)
if route == "/local-api/gateway/schedule/create":
return gateway_schedule_create(payload)
if route == "/local-api/gateway/schedule/update":
return gateway_schedule_update(payload)
if route == "/local-api/gateway/schedule/delete":
return gateway_schedule_delete(payload)
if route == "/local-api/gateway/schedule/run":
return gateway_schedule_run_now(payload)
if route == "/local-api/bootstrap-project":
return bootstrap_project(payload)
if route == "/local-api/schedules":
return create_signed_schedule(payload)
if route == "/local-api/nodes/upsert":
return upsert_node(payload)
if route == "/local-api/nodes/archive":
return archive_node_by_path(payload)
if route == "/local-api/nodes/link":
return link_nodes(payload)
if route == "/local-api/agents/create":
return create_agent(payload)
if route == "/local-api/agents/nodes/upsert":
return upsert_agent_node(payload)
if route == "/local-api/agents/nodes/archive":
return archive_agent_node(payload)
if route == "/local-api/agents/nodes/link":
return link_agent_node(payload)
if route == "/local-api/auth/renew":
return renew_auth()
if route == "/local-api/auth/claim":
return claim_account({"open_browser": True, "timeout_seconds": 300})
if route == "/local-api/feedback":
return request_json("POST", "/v1/feedback", {
"kind": payload.get("kind", "suggestion"),
"severity": payload.get("severity", "info"),
"title": payload.get("title", ""),
"body": payload.get("body", ""),
"project_id": project_id,
"context": {"source": "napseer_open_ui"},
})
if route == "/local-api/update":
return update_self({"confirm": payload.get("confirm", "")})
raise ValueError(f"unknown local api route: {route}")
def validate_cloud_gateway_token(self, payload):
token = str((payload or {}).get("token") or "")
if not token or token not in cloud_gateway_tokens:
raise RuntimeError("gateway cloud console is not connected")
return token
def validate_cloud_gateway_project(self, payload):
expected_project_id = str((payload or {}).get("project_id") or "").strip()
if not expected_project_id:
return
actual_project_id = current_project_id()
if actual_project_id == expected_project_id:
return
status = gateway_status()
configured = actual_project_id or "no project"
raise RuntimeError(
"local gateway is running for a different project "
f"({configured}) from {status.get('cwd')}. "
"Stop that gateway and start nap gateway from the selected project."
)
def cloud_gateway_connect(self, payload):
self.validate_cloud_gateway_project(payload)
passphrase = str((payload or {}).get("passphrase") or "")
if not passphrase:
raise RuntimeError("gateway passphrase is required")
if not gateway_is_unlocked():
gateway_unlock(passphrase)
default_command = str((payload or {}).get("default_command") or "").strip()
if default_command:
gateway_tmux_configure({"default_command": default_command})
try:
touch_project_agent()
except Exception:
pass
captured = gateway_terminal_capture({})
token = secrets.token_urlsafe(32)
cloud_gateway_tokens.add(token)
return {
"status": "connected",
"token": token,
"gateway": gateway_status(),
"tmux_target": captured.get("tmux_target"),
"output": captured.get("output") or "",
}
def handle_cloud_gateway_post(self, route, payload):
if route == "/gateway/cloud/connect":
return self.cloud_gateway_connect(payload)
if route == "/gateway/cloud/input":
self.validate_cloud_gateway_token(payload)
return gateway_terminal_input(payload or {})
if route == "/gateway/cloud/capture":
self.validate_cloud_gateway_token(payload)
return gateway_terminal_capture(payload or {})
if route == "/gateway/cloud/disconnect":
token = self.validate_cloud_gateway_token(payload)
cloud_gateway_tokens.discard(token)
return {"status": "disconnected"}
raise ValueError(f"unknown gateway cloud route: {route}")
def ws_send_json(self, payload):
self.ws_send_text(json.dumps(payload, separators=(",", ":")))
def ws_send_text(self, text):
data = text.encode("utf-8")
header = bytearray([0x81])
if len(data) < 126:
header.append(len(data))
elif len(data) < 65536:
header.extend([126, (len(data) >> 8) & 0xff, len(data) & 0xff])
else:
header.append(127)
header.extend(len(data).to_bytes(8, "big"))
self.wfile.write(bytes(header) + data)
self.wfile.flush()
def ws_read_frame(self):
header = self.rfile.read(2)
if len(header) < 2:
return None, None
first, second = header
opcode = first & 0x0F
masked = bool(second & 0x80)
length = second & 0x7F
if length == 126:
length = int.from_bytes(self.rfile.read(2), "big")
elif length == 127:
length = int.from_bytes(self.rfile.read(8), "big")
mask = self.rfile.read(4) if masked else b""
payload = self.rfile.read(length) if length else b""
if masked:
payload = bytes(byte ^ mask[index % 4] for index, byte in enumerate(payload))
return opcode, payload
def handle_cloud_gateway_ws(self):
self.validate_cloud_ws_request()
key = self.headers.get("Sec-WebSocket-Key", "")
if not key:
raise RuntimeError("missing websocket key")
accept = base64.b64encode(hashlib.sha1((key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11").encode("ascii")).digest()).decode("ascii")
self.send_response(101)
self.send_header("Upgrade", "websocket")
self.send_header("Connection", "Upgrade")
self.send_header("Sec-WebSocket-Accept", accept)
self.send_cors_headers()
self.end_headers()
connected = False
token = ""
try:
while True:
opcode, payload = self.ws_read_frame()
if opcode is None or opcode == 0x8:
break
if opcode == 0x9:
self.wfile.write(b"\x8a\x00")
self.wfile.flush()
continue
if opcode != 0x1:
continue
try:
message = json.loads(payload.decode("utf-8"))
message_type = str(message.get("type") or "")
if message_type == "connect":
result = self.cloud_gateway_connect(message)
token = str(result.get("token") or "")
connected = True
self.ws_send_json({"type": "terminal.status", **result})
continue
if not connected:
raise RuntimeError("gateway cloud websocket is not connected")
if message_type == "terminal.input":
result = gateway_terminal_input({**message, "token": token})
self.ws_send_json({"type": "terminal.output", **result})
continue
if message_type == "terminal.capture":
result = gateway_terminal_capture(message)
self.ws_send_json({"type": "terminal.output", **result})
continue
if message_type == "heartbeat":
self.ws_send_json({"type": "heartbeat", "status": "ok"})
continue
raise RuntimeError(f"unknown gateway websocket message: {message_type}")
except Exception as exc:
self.ws_send_json({"type": "terminal.error", "error": str(exc)})
finally:
if token:
cloud_gateway_tokens.discard(token)
self.close_connection = True
def do_GET(self):
try:
self.validate_local_request()
parsed_path = urllib.parse.urlparse(self.path)
if parsed_path.path == "/gateway/cloud/ws":
self.handle_cloud_gateway_ws()
return
if parsed_path.path == "/gateway/status":
self.send_json(200, gateway_status())
return
if parsed_path.path == "/local-api/state":
self.send_json(200, self.local_state_payload(urllib.parse.parse_qs(parsed_path.query)))
return
if LOCAL_UI_ASSETS and parsed_path.path in {"/", ""}:
self.send_asset("/")
return
if LOCAL_UI_ASSETS and parsed_path.path in LOCAL_UI_ASSETS:
self.send_asset(parsed_path.path)
return
if LOCAL_UI_ASSETS:
self.send_response(404)
self.end_headers()
self.wfile.write(b"not found")
return
query = urllib.parse.parse_qs(parsed_path.query)
project_id = current_project_id()
if not project_id:
self.send_html(200, f"""<!doctype html>
<html><head><meta charset="utf-8"><title>Napseer local manager</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<style>body{{font-family:ui-sans-serif,system-ui;margin:0;background:#eef3ef;color:#101312}}main{{max-width:720px;margin:0 auto;padding:28px}}section{{border:1px solid #d7ded8;background:#fbfdfb;padding:20px}}label{{display:grid;gap:6px;margin:12px 0;color:#5d6661;font-weight:700}}input,textarea,select{{font:inherit;border:1px solid #9aa9a0;background:#fff;padding:10px}}button{{border:1px solid #073f3b;background:#073f3b;color:#fff;font-weight:800;padding:10px 14px}}code{{background:#e5ece7;padding:2px 5px}}</style></head>
<body><main><section><h1>Create this Napseer project</h1><p>This localhost UI is running before a project is configured for <code>{html.escape(str(AUTH_PATH))}</code>.</p>
<form method="post" action="/bootstrap-project"><input type="hidden" name="csrf_token" value="{html.escape(csrf_token)}">
<label>Project name<input name="name" required placeholder="{html.escape(default_project_name(default_project_slug()))}"></label>
<label>Project slug<input name="slug" required value="{html.escape(default_project_slug())}"></label>
<label>Description<textarea name="description"></textarea></label>
<label>Initial privacy<select name="encryption"><option value="plaintext">Plaintext project</option><option value="encrypted">Encrypted project</option></select></label>
<label>Project passphrase, only for encrypted projects<input name="passphrase" type="password"></label>
<button type="submit">Create project</button></form></section></main></body></html>""")
return
search = query.get("q", [""])[0]
mode = query.get("mode", ["filesystem"])[0]
if mode not in {"filesystem", "path-list"}:
mode = "filesystem"
selected_path = query.get("path", [""])[0]
nodes_query = {"limit": 200}
if search:
nodes_query["q"] = search
nodes_suffix = urllib.parse.urlencode(nodes_query)
nodes = request_json("GET", f"/v1/projects/{project_id}/nodes?{nodes_suffix}").get("items", [])
if not selected_path and nodes:
selected_path = nodes[0].get("full_path") or ""
selected_node = None
if selected_path:
try:
selected_node = get_node_by_path({"path": selected_path})
except Exception:
selected_node = None
schedules = request_json("GET", f"/v1/projects/{project_id}/schedules").get("items", [])
feedback = request_json("GET", "/v1/feedback?limit=50").get("items", [])
status = update_status()
current_url = "/" + (f"?{parsed_path.query}" if parsed_path.query else "")
filesystem_url = "/?" + urllib.parse.urlencode({"mode": "filesystem", "q": search, "path": selected_path})
path_list_url = "/?" + urllib.parse.urlencode({"mode": "path-list", "q": search, "path": selected_path})
tree = ui_build_tree(nodes)
tree_html = ui_render_tree_branch(tree, selected_path, mode, search)
selected_links = ui_json_list((selected_node or {}).get("links") or [])
selected_metadata = ui_json((selected_node or {}).get("metadata") or {})
selected_tags = ", ".join((selected_node or {}).get("tags") or [])
selected_content = html.escape((selected_node or {}).get("content_text") or "")
selected_type = html.escape((selected_node or {}).get("type") or "note")
selected_path_value = html.escape(selected_path or "")
selected_title = html.escape(selected_path or "New node")
selected_badges = ui_tags((selected_node or {}).get("tags") or [])
node_rows = "".join(
f"<tr><td><a class='path-link' href='/?{urllib.parse.urlencode({'mode': 'filesystem', 'path': item['full_path'], 'q': search})}'><code>{html.escape(item['full_path'])}</code></a></td><td>{ui_tags(item.get('tags') or [])}</td><td>{html.escape(item.get('type') or 'note')}</td><td><form method='post' action='/nodes/archive'><input type='hidden' name='return_to' value='/?{urllib.parse.urlencode({'mode': mode, 'q': search})}'><input type='hidden' name='path' value='{html.escape(item['full_path'])}'><button class='ghost'>Archive</button></form></td></tr>"
for item in nodes
)
schedule_rows = "".join(
f"<tr><td>{html.escape(item['name'])}</td><td><code>{html.escape(item['cron_expr'])}</code></td><td>{html.escape(item.get('target_agent_id') or 'all')}</td><td>{html.escape(str(item.get('version')))}</td><td><span class='status {'on' if item.get('enabled') else 'off'}'>{'on' if item.get('enabled') else 'off'}</span></td></tr>"
for item in schedules
)
feedback_rows = "".join(
f"<tr><td>{html.escape(item['kind'])}</td><td>{html.escape(item['severity'])}</td><td>{html.escape(item['title'])}</td><td>{html.escape(item['status'])}</td></tr>"
for item in feedback
)
self.send_html(200, f"""<!doctype html>
<html><head><meta charset="utf-8"><title>Napseer local manager</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<style>
:root{{--bg:#fafafa;--panel:#fff;--panel-2:#f5f5f5;--text:#09090b;--muted:#71717a;--line:#e4e4e7;--line-strong:#d4d4d8;--accent:#0070f3;--accent-soft:#eff6ff;--danger:#dc2626;--ok:#16a34a;--shadow:0 16px 50px rgba(0,0,0,.08);}}
*{{box-sizing:border-box}}body{{font-family:"Geist","Sohne","IBM Plex Sans",ui-sans-serif,system-ui,sans-serif;margin:0;background:radial-gradient(circle at 30% -10%,#eaf2ff 0,#fafafa 34%,#fafafa 100%);color:var(--text);font-size:14px}}a{{color:inherit;text-decoration:none}}main{{max-width:1680px;margin:0 auto;padding:22px}}.topbar{{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:18px}}.brand{{display:flex;align-items:center;gap:10px;font-weight:700;letter-spacing:-.02em}}.mark{{width:26px;height:26px;border-radius:7px;background:#000;color:#fff;display:grid;place-items:center;font-size:12px}}nav{{display:flex;gap:4px;background:rgba(255,255,255,.72);border:1px solid var(--line);border-radius:999px;padding:4px;box-shadow:0 1px 2px rgba(0,0,0,.04)}}nav a{{padding:7px 11px;border-radius:999px;color:#52525b;font-size:13px}}nav a:hover{{background:#f4f4f5;color:#000}}.hero{{border:1px solid var(--line);background:rgba(255,255,255,.82);border-radius:18px;box-shadow:var(--shadow);padding:18px;margin-bottom:14px;backdrop-filter:blur(14px)}}h1{{font-size:24px;line-height:1.1;margin:0 0 6px;letter-spacing:-.04em}}h2{{font-size:15px;margin:0 0 12px;letter-spacing:-.02em}}h3{{font-size:13px;margin:0 0 10px;text-transform:uppercase;letter-spacing:.08em;color:#71717a}}p{{margin:0 0 10px}}.muted{{color:var(--muted)}}.mono,code{{font-family:"Geist Mono","SFMono-Regular",Consolas,monospace;font-size:12px}}code{{background:#f4f4f5;border:1px solid var(--line);border-radius:6px;padding:2px 5px}}.stats{{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px}}.stat{{border:1px solid var(--line);background:var(--panel);border-radius:14px;padding:13px;min-width:0}}.stat b{{display:block;font-size:12px;color:#71717a;margin-bottom:8px}}.stat span{{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}section{{border:1px solid var(--line);background:var(--panel);border-radius:16px;padding:16px;margin:14px 0;box-shadow:0 1px 2px rgba(0,0,0,.04)}}.workspace{{display:grid;grid-template-columns:300px minmax(0,1fr);gap:14px;align-items:start}}.side,.detail{{border:1px solid var(--line);border-radius:14px;background:#fff;min-width:0}}.side{{overflow:hidden}}.side-head,.detail-head{{display:flex;align-items:center;justify-content:space-between;gap:10px;border-bottom:1px solid var(--line);padding:12px}}.tree{{padding:10px;max-height:640px;overflow:auto}}.folder{{margin:2px 0}}summary{{cursor:pointer;color:#3f3f46;font-weight:650;padding:6px 7px;border-radius:8px;list-style:none}}summary::-webkit-details-marker{{display:none}}summary:hover,.file:hover{{background:#f4f4f5}}.folder-icon,.file-icon{{display:inline-block;width:34px;color:#a1a1aa;font-family:"Geist Mono",monospace;font-size:11px}}.file{{display:grid;grid-template-columns:34px minmax(0,1fr) auto;align-items:center;gap:6px;padding:7px;border-radius:8px;color:#27272a}}.file span{{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}.file small{{color:#a1a1aa;font-size:11px}}.file.active{{background:#000;color:#fff}}.file.active small,.file.active .file-icon{{color:#d4d4d8}}.tabs{{display:flex;gap:6px;align-items:center}}.tab{{border:1px solid var(--line);border-radius:999px;padding:7px 10px;color:#52525b;background:#fff}}.tab.active{{background:#000;color:#fff;border-color:#000}}.search{{display:grid;grid-template-columns:1fr auto;gap:8px;margin-bottom:10px}}.grid{{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:12px}}label{{display:grid;gap:6px;margin:10px 0;font-weight:650;color:#3f3f46;font-size:12px}}input,textarea,select{{width:100%;font:inherit;border:1px solid var(--line-strong);border-radius:10px;background:#fff;padding:10px;outline:none}}input:focus,textarea:focus,select:focus{{border-color:#000;box-shadow:0 0 0 3px rgba(0,0,0,.06)}}textarea{{min-height:120px;resize:vertical}}button,.button{{display:inline-flex;align-items:center;justify-content:center;border:1px solid #000;border-radius:10px;background:#000;color:#fff;font-weight:700;padding:9px 12px;cursor:pointer}}button.ghost,.button.ghost{{background:#fff;color:#000;border-color:var(--line-strong)}}button.danger{{background:var(--danger);border-color:var(--danger)}}.actions{{display:flex;gap:8px;flex-wrap:wrap;align-items:center}}table{{width:100%;border-collapse:separate;border-spacing:0}}td,th{{border-top:1px solid var(--line);padding:9px;text-align:left;vertical-align:top}}th{{font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:#71717a;background:#fafafa}}.tag,.status{{display:inline-flex;align-items:center;border:1px solid var(--line);border-radius:999px;padding:3px 7px;margin:0 4px 4px 0;font-size:11px;font-weight:650;background:#fafafa;color:#3f3f46}}.status.on{{background:#ecfdf5;color:#047857;border-color:#bbf7d0}}.status.off{{background:#f4f4f5;color:#71717a}}.path-link code{{color:#000}}.detail-body{{padding:14px}}.selected-title{{display:flex;align-items:center;gap:8px;min-width:0}}.selected-title strong{{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}}.empty{{border:1px dashed var(--line-strong);border-radius:12px;padding:18px;text-align:center;color:#71717a;background:#fafafa}}@media(max-width:900px){{main{{padding:14px}}.topbar{{align-items:flex-start;flex-direction:column}}nav{{width:100%;overflow:auto}}.stats{{grid-template-columns:1fr}}.workspace{{grid-template-columns:1fr}}}}
</style></head>
<body><main>
<div class="topbar"><div class="brand"><span class="mark">N</span><span>Napseer local manager</span></div><nav><a href="#memory">Memory</a><a href="#schedules">Schedules</a><a href="#auth">Auth</a><a href="#feedback">Feedback</a><a href="#update">Update</a></nav></div>
<section class="hero" id="overview"><h1>Project memory, local authority.</h1><p class="muted">This UI runs on <code>127.0.0.1</code>, reads <code>{html.escape(str(AUTH_PATH))}</code>, and signs executable schedules locally.</p><div class="stats">
<div class="stat"><b>Project</b><span class="mono">{html.escape(project_id)}</span></div>
<div class="stat"><b>Agent</b><span class="mono">{html.escape(str(AUTH.get('agent_id') or 'unknown'))}</span></div>
<div class="stat"><b>Token expires</b><span>{html.escape(str(TOKEN_EXPIRES_AT or 'unknown'))}</span></div>
<div class="stat"><b>Wrapper</b><span>{'Up to date' if status.get('up_to_date') else 'Update available'}</span></div>
</div></section>
<section id="memory"><div class="side-head"><div><h2>Memory</h2><p class="muted">Filesystem mode is default. Path-list mode keeps the previous flat table.</p></div><div class="tabs"><a class="tab {'active' if mode == 'filesystem' else ''}" href="{filesystem_url}">Filesystem</a><a class="tab {'active' if mode == 'path-list' else ''}" href="{path_list_url}">Path list</a></div></div>
<form class="search" method="get"><input type="hidden" name="mode" value="{html.escape(mode)}"><input name="q" value="{html.escape(search)}" placeholder="Search paths, tags, or content"><button>Search</button></form>
{f'''
<div class="workspace"><aside class="side"><div class="side-head"><strong>Files</strong><span class="muted">{len(nodes)} nodes</span></div><div class="tree">{tree_html or '<div class="empty">No nodes found.</div>'}</div></aside>
<div class="detail"><div class="detail-head"><div class="selected-title"><strong>{selected_title}</strong></div><div>{selected_badges}</div></div><div class="detail-body">
<form method="post" action="/nodes/upsert"><input type="hidden" name="return_to" value="{html.escape(current_url)}"><h3>{'Edit node' if selected_node else 'Create node'}</h3>
<label>Full path<input name="path" required value="{selected_path_value}" placeholder="/decisions/auth-model"></label>
<div class="grid"><label>Type<input name="type" value="{selected_type}"></label><label>Tags CSV<input name="tags" value="{html.escape(selected_tags)}" placeholder="decision, auth"></label></div>
<label>Content<textarea name="content_text">{selected_content}</textarea></label>
<div class="grid"><label>Links JSON<textarea class="mono" name="links">{selected_links}</textarea></label><label>Metadata JSON<textarea class="mono" name="metadata">{selected_metadata}</textarea></label></div>
<div class="actions"><button>Save node</button><a class="button ghost" href="/?mode=filesystem&q={urllib.parse.quote(search)}">New node</a></div></form>
<form method="post" action="/nodes/link"><input type="hidden" name="return_to" value="{html.escape(current_url)}"><h3>Link nodes</h3><div class="grid"><label>Source path<input name="source_path" value="{selected_path_value}" required></label><label>Target path<input name="target_path" required></label><label>Relation<input name="relation" value="references"></label></div><button class="ghost">Create link</button></form>
</div></div></div>''' if mode == 'filesystem' else f'''
<div class="detail"><table><thead><tr><th>Path</th><th>Tags</th><th>Type</th><th>Action</th></tr></thead><tbody>{node_rows or '<tr><td colspan="4" class="muted">No nodes.</td></tr>'}</tbody></table></div>'''}
</section>
<section id="schedules"><div class="side-head"><div><h2>Signed schedules</h2><p class="muted">Executable cron changes are signed locally before publish.</p></div></div><div class="grid"><form method="post" action="/schedules"><input type="hidden" name="return_to" value="{html.escape(current_url)}">
<label>Name<input name="name" required placeholder="hourly-summary"></label><label>Cron expression<input name="cron_expr" required placeholder="0 * * * *"></label><label>Timezone<input name="timezone" value="UTC"></label><label>Target agent id<input name="target_agent_id" value="{AUTH.get('agent_id') or ''}"></label><label>Instruction<textarea name="instruction_text" required placeholder="Summarize recent nodes."></textarea></label><label>Payload JSON<textarea class="mono" name="payload">{{}}</textarea></label><button type="submit">Sign and publish</button></form><div><table><thead><tr><th>Name</th><th>Cron</th><th>Target</th><th>Version</th><th>Status</th></tr></thead><tbody>{schedule_rows or '<tr><td colspan="5" class="muted">No schedules.</td></tr>'}</tbody></table></div></div></section>
<section id="auth"><h2>Auth</h2><p class="muted">Account mode: <code>{html.escape(str(AUTH.get('account_mode') or 'unknown'))}</code></p><div class="actions"><form method="post" action="/auth/renew"><input type="hidden" name="return_to" value="{html.escape(current_url)}"><button>Renew token</button></form><form method="post" action="/auth/claim"><input type="hidden" name="return_to" value="{html.escape(current_url)}"><button class="ghost">Login / claim account</button></form></div></section>
<section id="feedback"><h2>Feedback</h2><div class="grid"><form method="post" action="/feedback"><input type="hidden" name="return_to" value="{html.escape(current_url)}"><label>Kind<select name="kind"><option>suggestion</option><option>problem</option></select></label><label>Severity<select name="severity"><option>info</option><option>low</option><option>medium</option><option>high</option><option>critical</option></select></label><label>Title<input name="title" required></label><label>Body<textarea name="body" required></textarea></label><button>Submit feedback</button></form><table><thead><tr><th>Kind</th><th>Severity</th><th>Title</th><th>Status</th></tr></thead><tbody>{feedback_rows or '<tr><td colspan="4" class="muted">No feedback.</td></tr>'}</tbody></table></div></section>
<section id="update"><h2>Wrapper update</h2><p class="muted">Version: {html.escape(str(status.get('remote_version') or 'unknown'))} · Verification: {html.escape(str(status.get('verification') or 'sha256'))} {'OK' if status.get('remote_integrity_ok') else 'unverified'}</p><p class="muted">Local SHA: <code>{html.escape(status.get('local_sha256', ''))}</code></p><p class="muted">Remote SHA: <code>{html.escape(status.get('remote_sha256', ''))}</code></p><form method="post" action="/update"><input type="hidden" name="return_to" value="{html.escape(current_url)}"><input type="hidden" name="confirm" value="update"><button class="danger">Update wrapper from server</button></form></section>
</main></body></html>""")
except Exception as exc:
self.send_html(500, f"<h1>Napseer local manager error</h1><pre>{html.escape(str(exc))}</pre>")
def do_POST(self):
try:
self.validate_local_request()
parsed_path = urllib.parse.urlparse(self.path)
if parsed_path.path.startswith("/gateway/cloud/"):
try:
payload = self.read_json()
result = self.handle_cloud_gateway_post(parsed_path.path, payload)
self.send_json(200, result or {"ok": True})
except Exception as exc:
self.send_json(400, {"error": str(exc)})
return
if parsed_path.path.startswith("/local-api/"):
try:
payload = self.read_json()
self.validate_csrf(payload=payload)
result = self.handle_local_api_post(parsed_path.path, payload)
self.send_json(200, result or {"ok": True})
except Exception as exc:
self.send_json(400, {"error": str(exc)})
return
if parsed_path.path.startswith("/gateway/"):
try:
payload = self.read_json()
self.validate_csrf(payload=payload)
route = parsed_path.path
if route == "/gateway/setup":
result = gateway_setup(payload)
elif route == "/gateway/unlock":
result = gateway_unlock(payload.get("passphrase", ""))
elif route == "/gateway/lock":
result = gateway_lock()
elif route == "/gateway/tmux/configure":
result = gateway_tmux_configure(payload)
elif route == "/gateway/terminal/restart":
result = gateway_terminal_restart(payload)
elif route == "/gateway/terminal/kill":
result = gateway_terminal_kill(payload)
elif route == "/gateway/remote/enable":
result = gateway_remote_enable(payload)
elif route == "/gateway/remote/disable":
result = gateway_remote_disable()
else:
raise ValueError(f"unknown gateway route: {route}")
self.send_json(200, result or {"ok": True})
except Exception as exc:
self.send_json(400, {"error": str(exc)})
return
if LOCAL_UI_ASSETS:
self.send_response(404)
self.end_headers()
self.wfile.write(b"not found")
return
form = self.read_form()
self.validate_csrf(form=form)
return_to = form.get("return_to", ["/"])[0]
if self.path == "/schedules":
create_signed_schedule({
"name": form.get("name", [""])[0],
"cron_expr": form.get("cron_expr", [""])[0],
"timezone": form.get("timezone", ["UTC"])[0],
"target_agent_id": form.get("target_agent_id", [""])[0] or None,
"instruction_text": form.get("instruction_text", [""])[0],
"payload": json.loads((form.get("payload", ["{}"])[0] or "{}")),
})
elif self.path == "/nodes/upsert":
upsert_node({
"path": form.get("path", [""])[0],
"type": form.get("type", ["note"])[0],
"tags": [tag.strip() for tag in form.get("tags", [""])[0].split(",") if tag.strip()],
"links": json.loads(form.get("links", ["[]"])[0] or "[]"),
"metadata": json.loads(form.get("metadata", ["{}"])[0] or "{}"),
"content_text": form.get("content_text", [""])[0],
})
elif self.path == "/nodes/archive":
archive_node_by_path({"path": form.get("path", [""])[0]})
elif self.path == "/nodes/link":
link_nodes({
"source_path": form.get("source_path", [""])[0],
"target_path": form.get("target_path", [""])[0],
"relation": form.get("relation", ["references"])[0],
})
elif self.path == "/auth/renew":
renew_auth()
elif self.path == "/auth/claim":
claim_account({"open_browser": True, "timeout_seconds": 300})
elif self.path == "/bootstrap-project":
bootstrap_project({
"slug": form.get("slug", [""])[0],
"name": form.get("name", [""])[0],
"description": form.get("description", [""])[0],
"encryption": form.get("encryption", ["plaintext"])[0],
"passphrase": form.get("passphrase", [""])[0],
})
elif self.path == "/feedback":
request_json("POST", "/v1/feedback", {
"kind": form.get("kind", ["suggestion"])[0],
"severity": form.get("severity", ["info"])[0],
"title": form.get("title", [""])[0],
"body": form.get("body", [""])[0],
"project_id": current_project_id() or None,
"context": {"source": "napseer_open_ui"},
})
elif self.path == "/update":
update_self({"confirm": form.get("confirm", [""])[0]})
else:
self.send_html(404, "not found")
return
self.redirect_home(return_to)
except Exception as exc:
self.send_html(400, f"<h1>Napseer action failed</h1><p><a href='/'>Back</a></p><pre>{html.escape(str(exc))}</pre>")
server = ReusableThreadingHTTPServer(("127.0.0.1", int(args.get("port", 0))), Handler)
port = server.server_address[1]
threading.Thread(target=server.serve_forever, daemon=True).start()
url = f"http://127.0.0.1:{port}/"
gateway_log(
"local_service_started",
url=url,
port=port,
project_id=current_project_id(),
agent_id=AUTH.get("agent_id"),
log_path=AUTH_DIR / "gateway.log",
)
if args.get("open_browser", True):
webbrowser.open(url)
return {"status": "running", "url": url, "project_id": current_project_id()}
def raw_tools():
return [
{
"name": "napseer_auth_status",
"description": "Show safe local gateway, vault, and project status. Does not reveal secrets.",
"inputSchema": {
"type": "object",
"properties": {},
"additionalProperties": False,
},
},
{
"name": "napseer_gateway_status",
"description": "Show whether the local gateway vault is configured and unlocked. Does not reveal secrets.",
"inputSchema": {"type": "object", "properties": {}, "additionalProperties": False},
},
{
"name": "napseer_gateway_setup",
"description": "Create or migrate the encrypted local gateway vault using a master passphrase and default managed agent command.",
"inputSchema": {
"type": "object",
"required": ["passphrase"],
"properties": {
"passphrase": {"type": "string", "description": "Master passphrase used only locally to encrypt the gateway vault."},
"default_command": {"type": "string", "description": "Command Napseer should launch in its managed tmux window, for example bash -l."},
"overwrite": {"type": "boolean"},
},
"additionalProperties": False,
},
},
{
"name": "napseer_gateway_configure",
"description": "Configure the managed tmux command for the local gateway. Without a manual target, Napseer creates and manages the tmux session/window.",
"inputSchema": {
"type": "object",
"properties": {
"default_command": {"type": "string"},
"session": {"type": "string"},
"window": {"type": "string"},
"pane": {"type": "string"},
},
"additionalProperties": False,
},
},
{
"name": "napseer_gateway_unlock",
"description": "Unlock the encrypted local gateway vault with the master passphrase.",
"inputSchema": {
"type": "object",
"required": ["passphrase"],
"properties": {"passphrase": {"type": "string"}},
"additionalProperties": False,
},
},
{
"name": "napseer_gateway_lock",
"description": "Lock the local gateway and clear decrypted secrets from memory.",
"inputSchema": {"type": "object", "properties": {}, "additionalProperties": False},
},
{
"name": "napseer_gateway_restart",
"description": "Kill and relaunch the managed gateway tmux window using the configured default command.",
"inputSchema": {"type": "object", "properties": {}, "additionalProperties": False},
},
{
"name": "napseer_gateway_kill",
"description": "Kill the configured gateway tmux window.",
"inputSchema": {"type": "object", "properties": {}, "additionalProperties": False},
},
{
"name": "napseer_renew_auth",
"description": "Renew the local bearer token by signing a fresh enrollment challenge with the project SSH key.",
"inputSchema": {
"type": "object",
"properties": {},
"additionalProperties": False,
},
},
{
"name": "napseer_update_status",
"description": "Check whether this local MCP wrapper matches the hosted Napseer version.",
"inputSchema": {
"type": "object",
"properties": {},
"additionalProperties": False,
},
},
{
"name": "napseer_update_self",
"description": "Update this local MCP wrapper file from Napseer's hosted script directory. Requires confirm='update'. Does not modify ./.napseer/auth.json.",
"inputSchema": {
"type": "object",
"required": ["confirm"],
"properties": {
"confirm": {
"type": "string",
"enum": ["update"],
"description": "Must be exactly 'update' to allow overwriting the wrapper file.",
}
},
"additionalProperties": False,
},
},
{
"name": "napseer_explore_tools",
"description": "Explore available MCP tools grouped by category without loading every schema into context.",
"inputSchema": {
"type": "object",
"properties": {
"category": {"type": "string"},
"q": {"type": "string"},
"include_schemas": {"type": "boolean", "default": False},
"limit": {"type": "integer", "minimum": 1, "maximum": 200},
},
"additionalProperties": False,
},
},
{
"name": "napseer_contract_profile",
"description": "Return the machine-readable Napseer MCP contract profile, local/public boundary, and per-tool metadata fields.",
"inputSchema": {
"type": "object",
"properties": {
"include_tools": {"type": "boolean", "default": True},
"include_schemas": {"type": "boolean", "default": False},
},
"additionalProperties": False,
},
},
{
"name": "napseer_acquire_lock",
"description": "Acquire a renewable project write lease. All project mutations require lock headers.",
"inputSchema": {
"type": "object",
"properties": {
"scope_type": {"type": "string", "enum": ["project", "folder", "path", "node", "encryption", "schedule", "gateway"], "default": "project"},
"scope_key": {"type": "string", "default": "*"},
"purpose": {"type": "string"},
"holder_label": {"type": "string"},
"ttl_seconds": {"type": "integer", "minimum": 30, "maximum": 3600},
},
"additionalProperties": False,
},
},
{
"name": "napseer_renew_lock",
"description": "Renew an active project write lease.",
"inputSchema": {
"type": "object",
"required": ["lock_id", "lease_token"],
"properties": {
"lock_id": {"type": "string"},
"lease_token": {"type": "string"},
"ttl_seconds": {"type": "integer", "minimum": 30, "maximum": 3600},
},
"additionalProperties": False,
},
},
{
"name": "napseer_release_lock",
"description": "Release an active project write lease.",
"inputSchema": {
"type": "object",
"required": ["lock_id", "lease_token"],
"properties": {"lock_id": {"type": "string"}, "lease_token": {"type": "string"}},
"additionalProperties": False,
},
},
{
"name": "napseer_list_locks",
"description": "List active project write leases.",
"inputSchema": {"type": "object", "properties": {}, "additionalProperties": False},
},
{
"name": "napseer_reindex_project",
"description": "Rebuild the local SQLite FTS index from readable project nodes.",
"inputSchema": {
"type": "object",
"properties": {"limit": {"type": "integer", "minimum": 1, "maximum": 200}},
"additionalProperties": False,
},
},
{
"name": "napseer_search_local",
"description": "Search the local SQLite FTS index, including decrypted private fields that only exist on this machine.",
"inputSchema": {
"type": "object",
"required": ["q"],
"properties": {
"q": {"type": "string", "description": "Search text. Natural language is accepted; distinctive nouns, paths, tags, or quoted phrases produce better matches than full instructions."},
"limit": {"type": "integer", "minimum": 1, "maximum": 100},
},
"additionalProperties": False,
},
},
{
"name": "napseer_index_status",
"description": "Show local search index path, node count, and latest indexed timestamp.",
"inputSchema": {"type": "object", "properties": {}, "additionalProperties": False},
},
{
"name": "napseer_clear_local_index",
"description": "Clear this project's local SQLite search index.",
"inputSchema": {"type": "object", "properties": {}, "additionalProperties": False},
},
{
"name": "napseer_search_memory",
"description": "Preferred search tool. Hybrid search over server-indexed fields and local SQLite FTS private-content index.",
"inputSchema": {
"type": "object",
"required": ["q"],
"properties": {
"q": {"type": "string", "description": "Search text. Natural language is accepted; distinctive nouns, paths, tags, or quoted phrases produce better matches than full instructions."},
"mode": {"type": "string", "enum": ["hybrid", "server", "local"], "default": "hybrid"},
"limit": {"type": "integer", "minimum": 1, "maximum": 100},
"include_content": {"type": "boolean", "default": False},
},
"additionalProperties": False,
},
},
{
"name": "napseer_get_memory_context",
"description": "Fetch one or more nodes plus bounded outgoing links and backlinks for surrounding context.",
"inputSchema": {
"type": "object",
"properties": {
"path": {"type": "string"},
"paths": {"type": "array", "items": {"type": "string"}},
"depth": {"type": "integer", "minimum": 0, "maximum": 2},
"max_nodes": {"type": "integer", "minimum": 1, "maximum": 100},
"include_content": {"type": "boolean", "default": True},
},
"additionalProperties": False,
},
},
{
"name": "napseer_find_related_nodes",
"description": "Find related memory by outgoing links, backlinks, shared tags, and folder.",
"inputSchema": {
"type": "object",
"required": ["path"],
"properties": {
"path": {"type": "string"},
"limit": {"type": "integer", "minimum": 1, "maximum": 100},
"include_content": {"type": "boolean", "default": False},
},
"additionalProperties": False,
},
},
{
"name": "napseer_recent_memory",
"description": "List recently updated project memory with optional folder, tag, and cursor filters.",
"inputSchema": {
"type": "object",
"properties": {
"folder_path": {"type": "string"},
"tag": {"type": "string"},
"cursor": {"type": "string"},
"updated_before": {"type": "string"},
"updated_after": {"type": "string"},
"limit": {"type": "integer", "minimum": 1, "maximum": 100},
"include_content": {"type": "boolean", "default": False},
},
"additionalProperties": False,
},
},
{
"name": "napseer_list_folders",
"description": "List project folders with node counts.",
"inputSchema": {"type": "object", "properties": {}, "additionalProperties": False},
},
{
"name": "napseer_list_tags",
"description": "List project tags with node counts.",
"inputSchema": {"type": "object", "properties": {}, "additionalProperties": False},
},
{
"name": "napseer_move_node",
"description": "Move or rename one node by path.",
"inputSchema": {
"type": "object",
"required": ["path", "new_path"],
"properties": {"path": {"type": "string"}, "new_path": {"type": "string"}},
"additionalProperties": False,
},
},
{
"name": "napseer_move_folder",
"description": "Move or rename all nodes under a folder using one project lock.",
"inputSchema": {
"type": "object",
"required": ["from_folder", "to_folder"],
"properties": {"from_folder": {"type": "string"}, "to_folder": {"type": "string"}},
"additionalProperties": False,
},
},
{
"name": "napseer_bulk_upsert_nodes",
"description": "Create or update multiple path-addressed nodes using one auto-acquired project lock. Prefer this over raw REST writes when operating through the local wrapper.",
"inputSchema": {
"type": "object",
"required": ["nodes"],
"properties": {
"purpose": {"type": "string"},
"nodes": {
"type": "array",
"items": {
"type": "object",
"required": ["path"],
"properties": {
"path": {"type": "string"},
"content_text": {"type": "string"},
"type": {"type": "string"},
"tags": {"type": "array", "items": {"type": "string"}},
"aliases": {"type": "array", "items": {"type": "string"}},
"links": {"type": "array", "items": {"type": "object"}},
"metadata": {"type": "object"},
},
"additionalProperties": False,
},
},
},
"additionalProperties": False,
},
},
{
"name": "napseer_create_project",
"description": "Create a Napseer project and store it as the current project in ./.napseer/auth.json.",
"inputSchema": {
"type": "object",
"required": ["slug", "name"],
"properties": {
"slug": {"type": "string"},
"name": {"type": "string"},
"description": {"type": "string"},
},
"additionalProperties": False,
},
},
{
"name": "napseer_create_node",
"description": "Create a path-addressed memory node. If this node depends on, summarizes, updates, or mentions another node, include links: [{path:'/target/full-path', relation:'references'}].",
"inputSchema": {
"type": "object",
"required": ["name", "content_text"],
"properties": {
"folder_path": {"type": "string", "description": "Folder part of the canonical node path, for example /decisions or /incidents/2026-04-26."},
"name": {"type": "string", "description": "Human-readable node name. The server normalizes it into full_path."},
"content_text": {"type": "string"},
"tags": {"type": "array", "items": {"type": "string"}},
"links": {
"type": "array",
"description": "First-class node references. Use this whenever the new node depends on or mentions existing nodes.",
"items": {
"type": "object",
"required": ["path"],
"properties": {
"path": {"type": "string", "description": "Target node full_path, for example /decisions/auth-model."},
"relation": {"type": "string", "description": "Short relation slug such as references, depends-on, supersedes, implements, explains."},
},
"additionalProperties": False,
},
},
"metadata": {"type": "object"},
},
"additionalProperties": True,
},
},
{
"name": "napseer_upsert_node",
"description": "Create or update a node by full path using an auto-acquired project lock. Use this for canonical task lists, current state, and durable project memory.",
"inputSchema": {
"type": "object",
"required": ["path"],
"properties": {
"path": {"type": "string"},
"content_text": {"type": "string"},
"type": {"type": "string"},
"tags": {"type": "array", "items": {"type": "string"}},
"aliases": {"type": "array", "items": {"type": "string"}},
"links": {"type": "array", "items": {"type": "object"}},
"metadata": {"type": "object"},
},
"additionalProperties": False,
},
},
{
"name": "napseer_update_node_by_path",
"description": "Update an existing node by full path using an auto-acquired project lock. Fails if the node does not exist.",
"inputSchema": {
"type": "object",
"required": ["path"],
"properties": {
"path": {"type": "string"},
"content_text": {"type": "string"},
"type": {"type": "string"},
"tags": {"type": "array", "items": {"type": "string"}},
"aliases": {"type": "array", "items": {"type": "string"}},
"links": {"type": "array", "items": {"type": "object"}},
"metadata": {"type": "object"},
},
"additionalProperties": False,
},
},
{
"name": "napseer_archive_node_by_path",
"description": "Archive an existing node by full path using an auto-acquired project lock.",
"inputSchema": {
"type": "object",
"required": ["path"],
"properties": {"path": {"type": "string"}},
"additionalProperties": False,
},
},
{
"name": "napseer_get_node_by_path",
"description": "Read one node by canonical full_path. Use this before linking if you know the path but need the node id or normalized path.",
"inputSchema": {
"type": "object",
"required": ["path"],
"properties": {"path": {"type": "string", "description": "Canonical node path such as /decisions/auth-model."}},
"additionalProperties": False,
},
},
{
"name": "napseer_link_nodes",
"description": "Create a first-class graph link from source_path to target_path. Use this instead of burying references in prose or metadata.",
"inputSchema": {
"type": "object",
"required": ["source_path", "target_path"],
"properties": {
"source_path": {"type": "string", "description": "Node that should hold the outgoing link."},
"target_path": {"type": "string", "description": "Node being referenced."},
"relation": {"type": "string", "default": "references", "description": "Short relation slug, for example references, depends-on, supersedes, implements, explains."},
},
"additionalProperties": False,
},
},
{
"name": "napseer_get_backlinks",
"description": "List nodes that link to or mention a target node path. Use this to recover graph context before editing or summarizing.",
"inputSchema": {
"type": "object",
"required": ["path"],
"properties": {"path": {"type": "string", "description": "Target node full_path."}},
"additionalProperties": False,
},
},
{
"name": "napseer_list_nodes",
"description": "List project memory nodes or run a lightweight decomposed search over paths/tags/content. Use distinctive nouns or filters; long prose is decomposed into query terms. The /agents namespace is hidden; use agent-specific tools for agent files.",
"inputSchema": {
"type": "object",
"properties": {
"tag": {"type": "string"},
"folder_path": {"type": "string"},
"q": {"type": "string", "description": "Search phrase. Distinctive nouns, paths, tags, and quoted phrases work best; long sentences are decomposed automatically."},
"limit": {"type": "integer", "minimum": 1, "maximum": 200},
},
"additionalProperties": False,
},
},
{
"name": "napseer_list_agent_nodes",
"description": "List or search files inside one explicit agent workspace under /agents/{agent_slug}.",
"inputSchema": {
"type": "object",
"required": ["agent_slug"],
"properties": {
"agent_slug": {"type": "string"},
"tag": {"type": "string"},
"folder_path": {"type": "string", "description": "Folder inside the agent workspace, for example /memory."},
"q": {"type": "string"},
"limit": {"type": "integer", "minimum": 1, "maximum": 200},
},
"additionalProperties": False,
},
},
{
"name": "napseer_get_agent_node",
"description": "Read one file inside /agents/{agent_slug}. Path may be relative to the agent root.",
"inputSchema": {
"type": "object",
"required": ["agent_slug", "path"],
"properties": {"agent_slug": {"type": "string"}, "path": {"type": "string"}},
"additionalProperties": False,
},
},
{
"name": "napseer_upsert_agent_node",
"description": "Create or update a file inside /agents/{agent_slug} using an auto-acquired project lock. Use this for agent profile, role, personality, rules, and memory.",
"inputSchema": {
"type": "object",
"required": ["agent_slug", "path"],
"properties": {
"agent_slug": {"type": "string"},
"path": {"type": "string"},
"content_text": {"type": "string"},
"type": {"type": "string"},
"tags": {"type": "array", "items": {"type": "string"}},
"aliases": {"type": "array", "items": {"type": "string"}},
"links": {"type": "array", "items": {"type": "object"}},
"metadata": {"type": "object"},
},
"additionalProperties": False,
},
},
{
"name": "napseer_update_agent_node",
"description": "Update an existing file inside /agents/{agent_slug}.",
"inputSchema": {
"type": "object",
"required": ["agent_slug", "path"],
"properties": {
"agent_slug": {"type": "string"},
"path": {"type": "string"},
"content_text": {"type": "string"},
"type": {"type": "string"},
"tags": {"type": "array", "items": {"type": "string"}},
"aliases": {"type": "array", "items": {"type": "string"}},
"links": {"type": "array", "items": {"type": "object"}},
"metadata": {"type": "object"},
},
"additionalProperties": False,
},
},
{
"name": "napseer_archive_agent_node",
"description": "Archive a file inside /agents/{agent_slug}.",
"inputSchema": {
"type": "object",
"required": ["agent_slug", "path"],
"properties": {"agent_slug": {"type": "string"}, "path": {"type": "string"}},
"additionalProperties": False,
},
},
{
"name": "napseer_link_agent_node",
"description": "Create a graph link from an agent file to another node. Agent source is scoped by agent_slug.",
"inputSchema": {
"type": "object",
"required": ["agent_slug", "source_path", "target_path"],
"properties": {
"agent_slug": {"type": "string"},
"source_path": {"type": "string"},
"target_path": {"type": "string"},
"relation": {"type": "string", "default": "references"},
},
"additionalProperties": False,
},
},
{
"name": "napseer_submit_feedback",
"description": "Submit a Napseer suggestion or problem report.",
"inputSchema": {
"type": "object",
"required": ["kind", "title", "body"],
"properties": {
"kind": {"type": "string", "enum": ["suggestion", "problem"]},
"severity": {"type": "string", "enum": ["info", "low", "medium", "high", "critical"]},
"title": {"type": "string"},
"body": {"type": "string"},
"context": {"type": "object"},
},
"additionalProperties": False,
},
},
{
"name": "napseer_list_feedback",
"description": "List Napseer feedback reports. Operator sessions receive full reports; worker tokens only receive redacted status rows for their own submissions.",
"inputSchema": {
"type": "object",
"properties": {
"project_id": {"type": "string"},
"kind": {"type": "string", "enum": ["suggestion", "problem"]},
"severity": {"type": "string", "enum": ["info", "low", "medium", "high", "critical"]},
"status": {"type": "string", "enum": ["open", "planned", "in_progress", "resolved", "wontfix", "duplicate", "triaged", "closed"]},
"limit": {"type": "integer", "minimum": 1, "maximum": 200},
},
"additionalProperties": False,
},
},
{
"name": "napseer_update_feedback_status",
"description": "Operator-only: update feedback status and optional resolution notes.",
"inputSchema": {
"type": "object",
"required": ["feedback_id", "status"],
"properties": {
"feedback_id": {"type": "string"},
"status": {"type": "string", "enum": ["open", "planned", "in_progress", "resolved", "wontfix", "duplicate"]},
"resolution": {"type": "string"},
"notes": {"type": "string"},
},
"additionalProperties": False,
},
},
{
"name": "napseer_claim_account",
"description": "Start the login/claim flow for the current anonymous account and update ./.napseer/auth.json when the loopback callback completes.",
"inputSchema": {
"type": "object",
"properties": {
"open_browser": {"type": "boolean"},
"timeout_seconds": {"type": "integer", "minimum": 1},
"return_url": {"type": "string"},
},
"additionalProperties": False,
},
},
{
"name": "napseer_register_project_signing_key",
"description": "Register the local SSH public key as the active project signing key for signed crons.",
"inputSchema": {
"type": "object",
"properties": {"label": {"type": "string"}},
"additionalProperties": False,
},
},
{
"name": "napseer_create_signed_schedule",
"description": "Create or update a signed cron schedule using the local project SSH private key. Workers must verify the returned signed_payload and signature before execution.",
"inputSchema": {
"type": "object",
"required": ["name", "cron_expr", "instruction_text"],
"properties": {
"schedule_id": {"type": "string"},
"version": {"type": "integer", "minimum": 1},
"action": {"type": "string", "enum": ["upsert", "delete"]},
"name": {"type": "string"},
"cron_expr": {"type": "string"},
"timezone": {"type": "string"},
"target_agent_id": {"type": "string"},
"instruction_text": {"type": "string"},
"enabled": {"type": "boolean"},
"expires_in_days": {"type": "integer", "minimum": 1},
"payload": {"type": "object"},
},
"additionalProperties": False,
},
},
{
"name": "napseer_open_ui",
"description": "Launch a localhost UI for operator-managed project memory and signed cron creation. The UI signs schedules locally before publishing.",
"inputSchema": {
"type": "object",
"properties": {
"port": {"type": "integer", "minimum": 0, "maximum": 65535},
"open_browser": {"type": "boolean"},
},
"additionalProperties": False,
},
},
]
TOOL_CATEGORIES = {
"explore": [
"napseer_explore_tools",
"napseer_contract_profile",
"napseer_search_memory",
"napseer_get_memory_context",
"napseer_find_related_nodes",
"napseer_recent_memory",
"napseer_list_folders",
"napseer_list_tags",
"napseer_get_node_by_path",
"napseer_get_backlinks",
"napseer_list_nodes",
"napseer_search_local",
],
"update": [
"napseer_upsert_node",
"napseer_update_node_by_path",
"napseer_archive_node_by_path",
"napseer_link_nodes",
"napseer_move_node",
"napseer_move_folder",
"napseer_bulk_upsert_nodes",
"napseer_create_node",
],
"coordination": ["napseer_acquire_lock", "napseer_renew_lock", "napseer_release_lock", "napseer_list_locks"],
"agent": [
"napseer_list_agent_nodes",
"napseer_get_agent_node",
"napseer_upsert_agent_node",
"napseer_update_agent_node",
"napseer_archive_agent_node",
"napseer_link_agent_node",
],
"project": ["napseer_auth_status", "napseer_renew_auth", "napseer_create_project", "napseer_claim_account"],
"schedules": ["napseer_register_project_signing_key", "napseer_create_signed_schedule"],
"gateway": [
"napseer_gateway_status",
"napseer_gateway_setup",
"napseer_gateway_configure",
"napseer_gateway_unlock",
"napseer_gateway_restart",
"napseer_gateway_kill",
"napseer_gateway_lock",
"napseer_open_ui",
],
"maintenance": [
"napseer_reindex_project",
"napseer_index_status",
"napseer_clear_local_index",
"napseer_update_status",
"napseer_update_self",
"napseer_list_feedback",
"napseer_update_feedback_status",
"napseer_submit_feedback",
],
}
def tool_category(name):
for category, names in TOOL_CATEGORIES.items():
if name in names:
return category
return "other"
READ_ONLY_TOOLS = {
"napseer_auth_status",
"napseer_gateway_status",
"napseer_update_status",
"napseer_explore_tools",
"napseer_contract_profile",
"napseer_search_local",
"napseer_index_status",
"napseer_search_memory",
"napseer_get_memory_context",
"napseer_find_related_nodes",
"napseer_recent_memory",
"napseer_list_folders",
"napseer_list_tags",
"napseer_get_node_by_path",
"napseer_get_backlinks",
"napseer_list_nodes",
"napseer_list_agent_nodes",
"napseer_get_agent_node",
}
LOCAL_FILE_TOOLS = {
"napseer_update_self",
"napseer_reindex_project",
"napseer_clear_local_index",
"napseer_gateway_setup",
"napseer_gateway_configure",
"napseer_gateway_unlock",
"napseer_gateway_lock",
}
PROCESS_CONTROL_TOOLS = {"napseer_open_ui"}
TERMINAL_CONTROL_TOOLS = {"napseer_gateway_restart", "napseer_gateway_kill"}
SECRET_ACCEPTING_TOOLS = {"napseer_gateway_setup", "napseer_gateway_unlock"}
AUTO_LOCK_TOOLS = {
"napseer_create_node",
"napseer_upsert_node",
"napseer_update_node_by_path",
"napseer_archive_node_by_path",
"napseer_link_nodes",
"napseer_move_node",
"napseer_move_folder",
"napseer_bulk_upsert_nodes",
"napseer_upsert_agent_node",
"napseer_update_agent_node",
"napseer_archive_agent_node",
"napseer_link_agent_node",
}
def tool_side_effect(name):
if name in READ_ONLY_TOOLS:
return "none"
if name in LOCAL_FILE_TOOLS:
return "local-file"
if name in PROCESS_CONTROL_TOOLS:
return "process-control"
if name in TERMINAL_CONTROL_TOOLS:
return "terminal-control"
return "remote-write"
def tool_auth_mode(name):
category = tool_category(name)
if name in {"napseer_explore_tools", "napseer_contract_profile", "napseer_update_status"}:
return "public"
if category == "gateway":
return "gateway-vault" if name in SECRET_ACCEPTING_TOOLS or name.startswith("napseer_gateway_") else "local-only"
if name in {"napseer_search_local", "napseer_index_status", "napseer_clear_local_index", "napseer_reindex_project", "napseer_open_ui", "napseer_update_self"}:
return "local-only"
if category in {"explore", "update", "coordination", "agent", "project", "schedules", "maintenance"}:
return "project-auth"
return "local-auth"
def tool_contract_metadata(name):
side_effect = tool_side_effect(name)
return {
"contract_version": CONTRACT_VERSION,
"category": tool_category(name),
"auth_mode": tool_auth_mode(name),
"side_effect": side_effect,
"lock_policy": "auto-project" if name in AUTO_LOCK_TOOLS else "none",
"secret_policy": "accepts-local-secret" if name in SECRET_ACCEPTING_TOOLS else "accepts-no-secrets",
"returns_secrets": False,
"idempotency": "safe" if side_effect == "none" else "not-idempotent",
"dangerous": side_effect in {"process-control", "terminal-control"} or name in SECRET_ACCEPTING_TOOLS,
"requires_local": tool_auth_mode(name) != "public",
}
def tool_card(tool, include_schema=False):
name = tool["name"]
card = {
"name": name,
"category": tool_category(name),
"description": tool.get("description", ""),
"metadata": tool_contract_metadata(name),
}
if include_schema:
card["inputSchema"] = tool.get("inputSchema", {})
return card
def contract_profile(args=None):
args = args or {}
include_tools = bool(args.get("include_tools", True))
include_schemas = bool(args.get("include_schemas", False))
tool_items = tools()
profile = {
"contract_version": CONTRACT_VERSION,
"wrapper": {
"name": SCRIPT_NAME,
"path": str(SCRIPT_PATH),
"dependencies": list(SCRIPT_DEPENDENCY_NAMES),
},
"project_id": DEFAULT_PROJECT_ID,
"auth": {
"base_url": BASE_URL,
"has_token": bool(TOKEN),
"token_expires_at": TOKEN_EXPIRES_AT,
"default_auth_mode": "project-auth" if TOKEN else "local-only",
},
"tool_count": len(tool_items),
"categories": list(TOOL_CATEGORIES.keys()),
"metadata_fields": [
"contract_version",
"category",
"auth_mode",
"side_effect",
"lock_policy",
"secret_policy",
"returns_secrets",
"idempotency",
"dangerous",
"requires_local",
],
"public_vs_local_boundary": {
"public_mcp": "Discovery only. Do not send bearer tokens, private keys, gateway passphrases, project-private content, terminal plaintext, or derived keys.",
"local_mcp": "Authenticated wrapper that keeps tokens, project id, vault material, and local index state on this machine.",
"relay": "Relay authorizes communication between pairs and authenticates requests; peer secrets and terminal plaintext stay outside relay/backend.",
},
"limits": {
"explore_tools_default_limit": 50,
"explore_tools_max_limit": 200,
"include_schemas_default": False,
"content_is_bounded_by_tool": True,
},
}
if include_tools:
profile["tools"] = [tool_card(tool, include_schemas) for tool in tool_items]
return profile
def tools():
items = []
for tool in raw_tools():
item = dict(tool)
category = tool_category(item["name"])
if not item.get("description", "").startswith("["):
item["description"] = f"[{category}] {item.get('description', '')}"
item["napseer"] = tool_contract_metadata(item["name"])
items.append(item)
return items
def explore_tools(args):
category = str(args.get("category") or "").strip().lower()
query = str(args.get("q") or "").strip().lower()
include_schemas = bool(args.get("include_schemas", False))
limit = max(1, min(int(args.get("limit", 50)), 200))
grouped = {key: [] for key in TOOL_CATEGORIES}
grouped["other"] = []
tool_by_name = {tool["name"]: tool for tool in tools()}
ordered_names = []
for names in TOOL_CATEGORIES.values():
ordered_names.extend(names)
ordered_names.extend(name for name in tool_by_name if name not in ordered_names)
for name in ordered_names:
tool = tool_by_name.get(name)
if not tool:
continue
tool_category_name = tool_category(name)
if category and category != tool_category_name:
continue
haystack = f"{name} {tool.get('description', '')}".lower()
if query and query not in haystack:
continue
card = tool_card(tool, include_schemas)
grouped.setdefault(tool_category_name, []).append(card)
grouped = {key: value[:limit] for key, value in grouped.items() if value}
return {
"contract_version": CONTRACT_VERSION,
"categories": list(TOOL_CATEGORIES.keys()),
"tools_are_flat_in_mcp": True,
"include_schemas": include_schemas,
"metadata_fields": contract_profile({"include_tools": False})["metadata_fields"],
"groups": grouped,
}
def call_tool(name, args):
args = args or {}
if name not in PUBLIC_TOOLS and name in PROTECTED_TOOLS:
require_unlocked(name)
if name == "napseer_auth_status":
return gateway_status()
if name == "napseer_gateway_status":
return gateway_status()
if name == "napseer_gateway_setup":
return gateway_setup(args)
if name == "napseer_gateway_configure":
return gateway_tmux_configure(args)
if name == "napseer_gateway_unlock":
return gateway_unlock(args.get("passphrase", ""))
if name == "napseer_gateway_restart":
return gateway_terminal_restart(args)
if name == "napseer_gateway_kill":
return gateway_terminal_kill(args)
if name == "napseer_gateway_lock":
return gateway_lock()
if name == "napseer_renew_auth":
return renew_auth()
if name == "napseer_update_status":
return update_status()
if name == "napseer_update_self":
return update_self(args)
if name == "napseer_explore_tools":
return explore_tools(args)
if name == "napseer_contract_profile":
return contract_profile(args)
if name == "napseer_acquire_lock":
return acquire_project_lock(args)
if name == "napseer_renew_lock":
return renew_project_lock(args)
if name == "napseer_release_lock":
return release_project_lock(args)
if name == "napseer_list_locks":
return list_project_locks(args)
if name == "napseer_reindex_project":
return reindex_project(args)
if name == "napseer_search_local":
return search_local_index(args)
if name == "napseer_index_status":
return index_status(args)
if name == "napseer_clear_local_index":
return clear_local_index(args)
if name == "napseer_search_memory":
return search_memory(args)
if name == "napseer_get_memory_context":
return get_memory_context(args)
if name == "napseer_find_related_nodes":
return find_related_nodes(args)
if name == "napseer_recent_memory":
return recent_memory(args)
if name == "napseer_list_folders":
return list_folders(args)
if name == "napseer_list_tags":
return list_tags(args)
if name == "napseer_move_node":
return move_node(args)
if name == "napseer_move_folder":
return move_folder(args)
if name == "napseer_bulk_upsert_nodes":
return bulk_upsert_nodes(args)
if name == "napseer_create_project":
return create_project_from_args(args)
if name == "napseer_create_node":
project_id = resolve_project_id(args)
folder_path = args.get("folder_path", "/agent/memory")
reject_agent_namespace_path(f"{folder_path}/{args['name']}")
node = request_project_write(
"POST",
f"/v1/projects/{project_id}/nodes",
{
"folder_path": folder_path,
"name": args["name"],
"type": args.get("type", "note"),
"tags": args.get("tags", []),
"aliases": args.get("aliases", []),
"links": args.get("links", []),
"metadata": args.get("metadata", {}),
"content_text": args["content_text"],
},
project_id,
f"create node {folder_path}/{args['name']}",
)
index_node(node)
return node
if name == "napseer_upsert_node":
return upsert_node(args)
if name == "napseer_update_node_by_path":
return update_node_by_path(args)
if name == "napseer_archive_node_by_path":
return archive_node_by_path(args)
if name == "napseer_get_node_by_path":
return get_node_by_path(args)
if name == "napseer_link_nodes":
return link_nodes(args)
if name == "napseer_get_backlinks":
return get_backlinks_by_path(args)
if name == "napseer_list_nodes":
return list_project_nodes(args)
if name == "napseer_list_agent_nodes":
return list_agent_nodes(args)
if name == "napseer_get_agent_node":
return get_agent_node(args)
if name == "napseer_upsert_agent_node":
return upsert_agent_node(args)
if name == "napseer_update_agent_node":
return update_agent_node(args)
if name == "napseer_archive_agent_node":
return archive_agent_node(args)
if name == "napseer_link_agent_node":
return link_agent_node(args)
if name == "napseer_list_feedback":
return list_feedback_reports(args)
if name == "napseer_update_feedback_status":
return update_feedback_status(args)
if name == "napseer_submit_feedback":
payload = {
"kind": args["kind"],
"severity": args.get("severity", "info"),
"title": args["title"],
"body": args["body"],
"context": args.get("context", {"source": "napseer_mcp_server.py"}),
}
if DEFAULT_PROJECT_ID:
payload["project_id"] = DEFAULT_PROJECT_ID
return request_json("POST", "/v1/feedback", payload)
if name == "napseer_claim_account":
return claim_account(args)
if name == "napseer_register_project_signing_key":
return register_project_signing_key(args)
if name == "napseer_create_signed_schedule":
return create_signed_schedule(args)
if name == "napseer_open_ui":
return start_local_ui(args)
raise RuntimeError(f"unknown tool: {name}")
def handle(message):
request_id = message.get("id")
method = message.get("method")
if method == "initialize":
return rpc_result(
request_id,
{
"protocolVersion": PROTOCOL_VERSION,
"capabilities": {"tools": {"listChanged": False}},
"serverInfo": {"name": "napseer-local", "version": "0.1.6"},
"instructions": "Local authenticated MCP wrapper. It manages token and project_id from ./.napseer/auth.json; agents should not handle secrets or pass project ids for normal tools.",
"napseer": {
"auth_path": str(AUTH_PATH),
"base_url": BASE_URL,
"has_token": bool(TOKEN),
"project_id": DEFAULT_PROJECT_ID,
"token_expires_at": TOKEN_EXPIRES_AT,
},
},
)
if method == "notifications/initialized":
return None
if method == "tools/list":
return rpc_result(request_id, {"tools": tools()})
if method == "tools/call":
params = message.get("params") or {}
try:
result = call_tool(params.get("name"), params.get("arguments") or {})
return rpc_result(request_id, tool_result(result))
except Exception as exc:
return rpc_result(request_id, tool_result({"error": str(exc)}, is_error=True))
return rpc_error(request_id, -32601, "Method not found", method)
def cli_main(argv):
command = argv[1] if len(argv) > 1 else ""
if command in {"configure", "config"}:
print(json.dumps(cli_configure_status(), indent=2))
return
if command in {"open-ui", "ui"}:
port = 0
open_browser = "--no-browser" not in argv
if "--port" in argv:
index = argv.index("--port")
if index + 1 >= len(argv):
raise RuntimeError("--port requires a value")
port = int(argv[index + 1])
result = start_local_ui({"open_browser": open_browser, "port": port})
print(json.dumps(result, indent=2))
if "--once" in argv:
return
try:
threading.Event().wait()
except KeyboardInterrupt:
return
return
if command == "update-status":
print(json.dumps(update_status(), indent=2))
return
if command == "update":
print(json.dumps(update_self({"confirm": "update"}), indent=2))
return
if command == "project":
subcommand = argv[2] if len(argv) > 2 else "help"
if subcommand == "create":
print(json.dumps(cli_project_create(argv[3:]), indent=2))
return
if subcommand in {"claim", "login"}:
print(json.dumps(cli_project_claim(argv[3:]), indent=2))
return
if subcommand == "bootstrap":
raise RuntimeError("project bootstrap was removed; use nap project create")
if subcommand in {"status", "current"}:
print(json.dumps(cli_configure_status(), indent=2))
return
if subcommand in {"encryption", "privacy"}:
action = argv[3] if len(argv) > 3 else "status"
if action in {"status", "state", "show"}:
print(json.dumps(project_encryption_status({}), indent=2))
return
if action == "set":
if len(argv) <= 4:
raise RuntimeError("nap project encryption set requires plaintext or encrypted")
print(json.dumps(project_encryption_transition({"state": argv[4]}), indent=2))
return
print(json.dumps(project_encryption_transition({"state": action}), indent=2))
return
if subcommand in {"plaintext", "plain", "unencrypt", "decrypt", "disable-encryption"}:
print(json.dumps(project_encryption_transition({"state": "plaintext"}), indent=2))
return
if subcommand in {"encrypted", "encrypt", "enable-encryption"}:
print(json.dumps(project_encryption_transition({"state": "encrypted"}), indent=2))
return
print("Usage: napseer_mcp_server.py project [create [slug] [--name NAME] [--description TEXT] [--encrypted|--encryption plaintext|encrypted] [--passphrase TEXT]|claim [--no-browser] [--timeout SECONDS] [--return-url URL]|status|encryption [status|set plaintext|set encrypted|plaintext|encrypted]|plaintext|encrypted]")
return
if command == "gateway":
subcommand = argv[2] if len(argv) > 2 else "status"
args = argv[3:]
if subcommand in {"status", "ls", "list"}:
print(json.dumps(gateway_status(), indent=2))
return
if subcommand == "configure":
print(json.dumps(cli_gateway_configure(args), indent=2))
return
if subcommand == "restart":
cli_gateway_require_unlocked(args, "restarting gateway terminal")
print(json.dumps(gateway_terminal_restart({}), indent=2))
return
if subcommand == "kill":
cli_gateway_require_unlocked(args, "killing gateway terminal")
print(json.dumps(gateway_terminal_kill({}), indent=2))
return
if subcommand in {"terminal", "terminals"}:
action = args[0] if args else "list"
terminal_args = args[1:] if args else []
if subcommand == "terminals" and action not in {"create", "new", "close", "rm", "remove", "capture", "input", "send"}:
action = "list"
terminal_args = args
cli_gateway_require_unlocked(terminal_args, "managing gateway terminals")
terminal_id = cli_option(terminal_args, "--terminal", "--terminal-id", "--id", default=None)
if action in {"list", "ls", "status"}:
print(json.dumps(gateway_terminal_sessions({"terminal_id": terminal_id}), indent=2))
return
if action in {"create", "new"}:
print(json.dumps(gateway_terminal_create({
"name": cli_option(terminal_args, "--name", default=None),
"command": cli_option(terminal_args, "--command", "--default-command", default=None),
}), indent=2))
return
if action in {"close", "rm", "remove"}:
target_id = terminal_id or (terminal_args[0] if terminal_args and not terminal_args[0].startswith("-") else None)
print(json.dumps(gateway_terminal_close({"terminal_id": target_id}), indent=2))
return
if action == "capture":
print(json.dumps(gateway_terminal_capture({"terminal_id": terminal_id, "start": cli_option(terminal_args, "--start", default="-200")}), indent=2))
return
if action == "key":
print(json.dumps(gateway_terminal_key({
"terminal_id": terminal_id,
"key": cli_option(terminal_args, "--key", default=None),
"text": cli_option(terminal_args, "--text", default=None),
}), indent=2))
return
if action in {"input", "send"}:
text = cli_option(terminal_args, "--text", "--input", default=None)
if text is None:
text_parts = []
skip_next = False
for value in terminal_args:
if skip_next:
skip_next = False
continue
if value in {"--terminal", "--terminal-id", "--id", "--text", "--input", "--passphrase", "--start"}:
skip_next = True
continue
if value.startswith("-"):
continue
text_parts.append(value)
text = " ".join(text_parts)
print(json.dumps(gateway_terminal_input({"terminal_id": terminal_id, "input": text}), indent=2))
return
raise RuntimeError("unknown gateway terminal action")
if subcommand in {"schedule", "schedules", "cron", "crons"}:
action = args[0] if args else "list"
schedule_args = args[1:] if args else []
if subcommand in {"schedules", "crons"} and action not in {"create", "new", "update", "edit", "delete", "rm", "remove", "run", "run-now", "now"}:
action = "list"
schedule_args = args
cli_gateway_require_unlocked(schedule_args, "managing gateway schedules")
schedule_id = cli_option(schedule_args, "--schedule", "--schedule-id", "--id", default=None)
payload = {
"schedule_id": schedule_id,
"name": cli_option(schedule_args, "--name", default=None),
"terminal_id": cli_option(schedule_args, "--terminal", "--terminal-id", default=None),
"message": cli_option(schedule_args, "--message", "--text", "--input", default=None),
"cron_expr": cli_option(schedule_args, "--cron", "--cron-expr", default=None),
}
if cli_flag(schedule_args, "--disabled", "--off"):
payload["enabled"] = False
if cli_flag(schedule_args, "--enabled", "--on"):
payload["enabled"] = True
if action in {"list", "ls", "status"}:
print(json.dumps(gateway_schedule_list({}), indent=2))
return
if action in {"create", "new"}:
print(json.dumps(gateway_schedule_create(payload), indent=2))
return
if action in {"update", "edit"}:
if not payload.get("schedule_id"):
payload["schedule_id"] = schedule_args[0] if schedule_args and not schedule_args[0].startswith("-") else None
print(json.dumps(gateway_schedule_update(payload), indent=2))
return
if action in {"delete", "rm", "remove"}:
if not payload.get("schedule_id"):
payload["schedule_id"] = schedule_args[0] if schedule_args and not schedule_args[0].startswith("-") else None
print(json.dumps(gateway_schedule_delete(payload), indent=2))
return
if action in {"run", "run-now", "now"}:
if not payload.get("schedule_id"):
payload["schedule_id"] = schedule_args[0] if schedule_args and not schedule_args[0].startswith("-") else None
print(json.dumps(gateway_schedule_run_now(payload), indent=2))
return
raise RuntimeError("unknown gateway schedule action")
if subcommand in {"service", "preregister"}:
service_action = args[0] if args and subcommand == "service" else "preregister"
service_args = args[1:] if args and subcommand == "service" else args
payload = {
"bootstrap_token": cli_option(service_args, "--bootstrap-token", default=None),
"activation_token": cli_option(service_args, "--activation-token", default=None),
"registration_id": cli_option(service_args, "--registration-id", default=None),
"passphrase": cli_option(service_args, "--passphrase", default=None),
"display_name": cli_option(service_args, "--name", "--display-name", default=None),
"default_command": cli_option(service_args, "--command", "--default-command", default=None),
"image_ref": cli_option(service_args, "--image", "--image-ref", default=None),
"token_expires_in_hours": cli_option(service_args, "--token-expires-in-hours", default=None),
}
if service_action in {"preregister", "register", "bootstrap"}:
print(json.dumps(gateway_service_preregister(payload), indent=2))
return
if service_action in {"activate", "claim"}:
print(json.dumps(gateway_service_activate(payload), indent=2))
return
if service_action in {"run", "start"}:
gateway_service_run(payload)
return
raise RuntimeError("unknown gateway service action; use preregister|activate|run")
if subcommand == "setup":
print(json.dumps(gateway_setup({
"passphrase": cli_option(args, "--passphrase", default=None),
"default_command": cli_option(args, "--command", default=cli_option(args, "--default-command", default=None)),
}), indent=2))
return
if subcommand == "unlock":
print(json.dumps(gateway_unlock(cli_option(args, "--passphrase", default=None) or getpass.getpass("Gateway passphrase: ")), indent=2))
return
if subcommand == "lock":
print(json.dumps(gateway_lock(), indent=2))
return
print("Usage: napseer_mcp_server.py gateway [status|configure [--command CMD] [--target session:window.pane]|terminal [list|create|close|capture|input]|schedule [list|create|update|delete|run]|restart [--passphrase TEXT]|kill [--passphrase TEXT]|setup|unlock|lock]")
return
if command == "feedback":
subcommand = argv[2] if len(argv) > 2 else "list"
args = argv[3:]
if subcommand in {"list", "ls"}:
query = {
"status": cli_option(args, "--status", default=None),
"kind": cli_option(args, "--kind", default=None),
"severity": cli_option(args, "--severity", default=None),
"project_id": cli_option(args, "--project-id", default=None),
"limit": cli_option(args, "--limit", default=None),
}
if "--all" not in args and not query["status"]:
query["status"] = "open"
print(json.dumps(list_feedback_reports(query), indent=2))
return
if subcommand in {"status", "set-status", "update"}:
if len(args) < 2:
raise RuntimeError("nap feedback status requires <feedback_id> <status>")
print(json.dumps(update_feedback_status({
"feedback_id": args[0],
"status": args[1],
"resolution": cli_option(args, "--resolution", default=None),
"notes": cli_option(args, "--notes", default=None),
}), indent=2))
return
if subcommand in {"resolve", "resolved"}:
if not args:
raise RuntimeError("nap feedback resolve requires <feedback_id>")
print(json.dumps(update_feedback_status({
"feedback_id": args[0],
"status": "resolved",
"resolution": cli_option(args, "--resolution", default="resolved"),
"notes": cli_option(args, "--notes", default=None),
}), indent=2))
return
print("Usage: napseer_mcp_server.py feedback [list [--status STATUS|--all]|status <id> <status>|resolve <id> [--notes TEXT]]")
return
if command == "agent":
subcommand = argv[2] if len(argv) > 2 else "help"
slug = argv[3] if len(argv) > 3 else ""
if subcommand in {"list", "ls", "registered"}:
print(json.dumps(list_registered_agents({}), indent=2))
return
if subcommand in {"workspaces", "workspace-list"}:
print(json.dumps(list_agent_workspaces({}), indent=2))
return
if subcommand == "create" and slug:
print(json.dumps(create_agent({"agent_slug": slug}), indent=2))
return
if subcommand == "show" and slug:
print(json.dumps(show_agent({"agent_slug": slug}), indent=2))
return
if subcommand == "edit" and slug:
result = start_local_ui({"open_browser": "--no-browser" not in argv, "port": 0, "agent_slug": slug})
print(json.dumps(result, indent=2))
if "--once" not in argv:
try:
threading.Event().wait()
except KeyboardInterrupt:
return
return
print("Usage: napseer_mcp_server.py agent [list|workspaces|create <slug>|show <slug>|edit <slug>]")
return
if command in {"help", "-h", "--help"}:
print("Usage: napseer_mcp_server.py [configure|open-ui|ui|update-status|update|project|gateway|feedback|agent]")
return
main()
def main():
for line in sys.stdin:
if not line.strip():
continue
try:
response = handle(json.loads(line))
except Exception as exc:
response = rpc_error(None, -32700, "Parse error", str(exc))
if response is not None:
send(response)
if __name__ == "__main__":
cli_main(sys.argv)