Created
April 1, 2026 15:03
-
-
Save Techbrunch/1d3b484e4b28771b4596cbf79b089d8a to your computer and use it in GitHub Desktop.
Script used to fingerprint a Redmine version
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import urllib.request | |
| import urllib.error | |
| import json | |
| import subprocess | |
| import time | |
| import re | |
| import hashlib | |
| import base64 | |
| import os | |
| import argparse | |
| import platform | |
| # --- Configuration --- | |
| TIMEOUT_SECONDS = 60 | |
| CACHE_FILE = "redmine_fingerprints_v2.json" | |
| EMPTY_FILE_HASH = "d41d8cd98f00b204e9800998ecf8427e" | |
| REPOSITORY = "library/redmine" | |
| FILE_TARGETS = { | |
| "application.js": [ | |
| "/usr/src/redmine/public/assets/application-legacy-*.js", | |
| "/usr/src/redmine/public/assets/application*.js", | |
| "/usr/src/redmine/public/javascripts/application.js" | |
| ], | |
| "attachments.js": [ | |
| "/usr/src/redmine/public/assets/attachments-legacy-*.js", | |
| "/usr/src/redmine/public/assets/attachments*.js", | |
| "/usr/src/redmine/public/javascripts/attachments.js" | |
| ] | |
| } | |
| TAG_PATTERN = re.compile(r'^\d+\.\d+\.\d+-alpine$') | |
| def get_host_arch(): | |
| """Detects the host's architecture and maps it to Docker's naming convention.""" | |
| arch = platform.machine().lower() | |
| if arch in ['x86_64', 'amd64']: | |
| return 'amd64' | |
| if arch in ['aarch64', 'arm64']: | |
| return 'arm64' | |
| if arch.startswith('arm'): | |
| return 'arm' | |
| return 'amd64' # Fallback default | |
| def get_supported_architectures(repository, tag): | |
| """Queries Docker Hub to see which architectures are available for a specific tag.""" | |
| url = f"https://hub.docker.com/v2/repositories/{repository}/tags/{tag}" | |
| try: | |
| req = urllib.request.Request(url) | |
| with urllib.request.urlopen(req) as response: | |
| data = json.loads(response.read().decode()) | |
| # Extract architectures from the 'images' array in the manifest | |
| return [img.get('architecture') for img in data.get('images', []) if img.get('architecture')] | |
| except urllib.error.HTTPError as e: | |
| if e.code == 404: | |
| return None # Tag doesn't exist | |
| return [] | |
| except Exception: | |
| return [] | |
| def load_cache(filepath): | |
| if os.path.exists(filepath): | |
| try: | |
| with open(filepath, 'r') as f: | |
| return json.load(f) | |
| except json.JSONDecodeError: | |
| print("Warning: Cache file is corrupted. Starting fresh.") | |
| return {} | |
| return {} | |
| def get_filtered_docker_tags(repository): | |
| print(f"Fetching tags for '{repository}' from Docker Hub...") | |
| all_tags = [] | |
| url = f"https://hub.docker.com/v2/repositories/{repository}/tags/?page_size=100" | |
| while url: | |
| req = urllib.request.Request(url) | |
| try: | |
| with urllib.request.urlopen(req) as response: | |
| data = json.loads(response.read().decode()) | |
| for result in data.get('results', []): | |
| all_tags.append(result['name']) | |
| url = data.get('next') | |
| except Exception as e: | |
| print(f"Error fetching tags: {e}") | |
| break | |
| filtered_tags = [tag for tag in all_tags if TAG_PATTERN.match(tag)] | |
| def semver_key(tag): | |
| version_str = tag.replace('-alpine', '') | |
| return tuple(map(int, version_str.split('.'))) | |
| filtered_tags.sort(key=semver_key, reverse=True) | |
| print(f"Found {len(all_tags)} total tags. Filtered down to {len(filtered_tags)} strict Alpine versions.") | |
| return filtered_tags | |
| def process_tag(tag, host_arch, manual_platform=None): | |
| image_name = f"redmine:{tag}" | |
| tag_results = {name: {"hash": "[Timeout or Error]", "path": None, "base64": None} for name in FILE_TARGETS.keys()} | |
| # Architecture Negotiation | |
| target_platform = None | |
| if manual_platform: | |
| target_platform = manual_platform | |
| else: | |
| supported_arches = get_supported_architectures(REPOSITORY, tag) | |
| if supported_arches is None: | |
| for name in FILE_TARGETS.keys(): tag_results[name]["hash"] = "[Tag Not Found on Hub]" | |
| return tag_results | |
| # If host arch isn't supported, we must fallback and emulate | |
| if supported_arches and host_arch not in supported_arches: | |
| fallback = 'amd64' if 'amd64' in supported_arches else supported_arches[0] | |
| print(f"\n ⚠️ Warning: Native '{host_arch}' not found for {tag}. Auto-switching to '{fallback}' via emulation.", end=" ") | |
| target_platform = f"linux/{fallback}" | |
| # 1. Pull the image | |
| pull_cmd = ["docker", "pull", "-q"] | |
| if target_platform: | |
| pull_cmd.extend(["--platform", target_platform]) | |
| pull_cmd.append(image_name) | |
| subprocess.run(pull_cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) | |
| # 2. Start container | |
| run_cmd = ["docker", "run", "-d", "--rm"] | |
| if target_platform: | |
| run_cmd.extend(["--platform", target_platform]) | |
| run_cmd.append(image_name) | |
| try: | |
| container_id = subprocess.check_output(run_cmd, stderr=subprocess.DEVNULL).decode('utf-8').strip() | |
| except subprocess.CalledProcessError: | |
| for name in FILE_TARGETS.keys(): tag_results[name]["hash"] = "[Failed to start container]" | |
| return tag_results | |
| # 3. Poll for files | |
| elapsed = 0 | |
| targets_found = {name: False for name in FILE_TARGETS.keys()} | |
| while elapsed < TIMEOUT_SECONDS and not all(targets_found.values()): | |
| for target_name, patterns in FILE_TARGETS.items(): | |
| if targets_found[target_name]: continue | |
| exact_path = "" | |
| for pattern in patterns: | |
| try: | |
| find_cmd = f"ls {pattern} 2>/dev/null | head -n 1" | |
| exact_path = subprocess.check_output( | |
| ["docker", "exec", container_id, "sh", "-c", find_cmd], | |
| stderr=subprocess.DEVNULL | |
| ).decode('utf-8').strip() | |
| if exact_path: break | |
| except subprocess.CalledProcessError: continue | |
| if exact_path: | |
| try: | |
| raw_content = subprocess.check_output( | |
| ["docker", "exec", container_id, "cat", exact_path], | |
| stderr=subprocess.DEVNULL | |
| ) | |
| if raw_content: | |
| file_hash = hashlib.md5(raw_content).hexdigest() | |
| if file_hash != EMPTY_FILE_HASH: | |
| tag_results[target_name]["hash"] = file_hash | |
| tag_results[target_name]["path"] = exact_path | |
| tag_results[target_name]["base64"] = base64.b64encode(raw_content).decode('utf-8') | |
| targets_found[target_name] = True | |
| except subprocess.CalledProcessError: pass | |
| time.sleep(2) | |
| elapsed += 2 | |
| subprocess.run(["docker", "rm", "-f", container_id], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) | |
| return tag_results | |
| def main(): | |
| parser = argparse.ArgumentParser(description="Fingerprint Redmine Docker images by extracting static assets.") | |
| parser.add_argument('-v', '--versions', nargs='+', help="Specific versions to check (e.g., 5.0.6 4.2.11)") | |
| parser.add_argument('-m', '--max', type=int, default=10, help="Max tags to test if fetching from Docker Hub (default: 10)") | |
| parser.add_argument('-f', '--force', action='store_true', help="Force recalculation, ignoring existing cache") | |
| parser.add_argument('-p', '--platform', type=str, help="Manually force a specific architecture (e.g., linux/amd64)") | |
| args = parser.parse_args() | |
| host_arch = get_host_arch() | |
| print(f"Detected Host Architecture: {host_arch}") | |
| if args.versions: | |
| tags = [f"{v}-alpine" if not v.endswith("-alpine") else v for v in args.versions] | |
| print(f"Targeting specific versions: {', '.join(tags)}") | |
| else: | |
| tags = get_filtered_docker_tags(REPOSITORY) | |
| if args.max > 0: | |
| tags = tags[:args.max] | |
| print(f"Limiting run to the first {args.max} tags (starting from newest)...") | |
| results = load_cache(CACHE_FILE) | |
| if args.force: | |
| print("FORCE MODE ACTIVE: Existing cache will be overwritten for targeted versions.") | |
| print("-" * 80) | |
| print(f"{'TAG':<15} | {'FILE TARGETS AND HASHES'}") | |
| print("-" * 80) | |
| for tag in tags: | |
| clean_version = tag.replace('-alpine', '') | |
| print(f"{clean_version:<15} | ", end="", flush=True) | |
| if clean_version in results and not args.force: | |
| print("[CACHED] ", end="") | |
| for name, data in results[clean_version].items(): | |
| short_hash = data['hash'][:8] + "..." if len(data['hash']) > 20 else data['hash'] | |
| print(f"{name}: {short_hash} ", end="") | |
| print() | |
| continue | |
| extracted_data = process_tag(tag, host_arch, manual_platform=args.platform) | |
| results[clean_version] = extracted_data | |
| # If the script printed a warning during process_tag, it messed up our line formatting. | |
| # We print a clean prefix again to keep the console output pretty. | |
| if "\n" in str(extracted_data): | |
| print(f" | ", end="") | |
| if args.force and clean_version in results: | |
| print("[RECALCULATED] ", end="") | |
| for name, data in extracted_data.items(): | |
| short_hash = data['hash'][:8] + "..." if len(data['hash']) > 20 else data['hash'] | |
| print(f"{name}: {short_hash} ", end="") | |
| print() | |
| with open(CACHE_FILE, "w") as f: | |
| json.dump(results, f, indent=4) | |
| print("-" * 80) | |
| print(f"Finished. All results saved to {CACHE_FILE}") | |
| if __name__ == "__main__": | |
| main() |
This file has been truncated, but you can view the full file.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "5.0.9": { | |
| "application.js": { | |
| "hash": "fd4f20b096e2e6cc46cfc29518146ccd", | |
| "path": "/usr/src/redmine/public/javascripts/application.js", | |
| "base64": "LyogUmVkbWluZSAtIHByb2plY3QgbWFuYWdlbWVudCBzb2Z0d2FyZQogICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAyMyAgSmVhbi1QaGlsaXBwZSBMYW5nICovCgpmdW5jdGlvbiBzYW5pdGl6ZUhUTUwoc3RyaW5nKSB7CiAgdmFyIHRlbXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgdGVtcC50ZXh0Q29udGVudCA9IHN0cmluZzsKICByZXR1cm4gdGVtcC5pbm5lckhUTUw7Cn0KCmZ1bmN0aW9uIGNoZWNrQWxsKGlkLCBjaGVja2VkKSB7CiAgJCgnIycraWQpLmZpbmQoJ2lucHV0W3R5cGU9Y2hlY2tib3hdOmVuYWJsZWQnKS5wcm9wKCdjaGVja2VkJywgY2hlY2tlZCk7Cn0KCmZ1bmN0aW9uIHRvZ2dsZUNoZWNrYm94ZXNCeVNlbGVjdG9yKHNlbGVjdG9yKSB7CiAgdmFyIGFsbF9jaGVja2VkID0gdHJ1ZTsKICAkKHNlbGVjdG9yKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICBpZiAoISQodGhpcykuaXMoJzpjaGVja2VkJykpIHsgYWxsX2NoZWNrZWQgPSBmYWxzZTsgfQogIH0pOwogICQoc2VsZWN0b3IpLnByb3AoJ2NoZWNrZWQnLCAhYWxsX2NoZWNrZWQpLnRyaWdnZXIoJ2NoYW5nZScpOwp9CgpmdW5jdGlvbiBzaG93QW5kU2Nyb2xsVG8oaWQsIGZvY3VzKSB7CiAgJCgnIycraWQpLnNob3coKTsKICBpZiAoZm9jdXMgIT09IG51bGwpIHsKICAgICQoJyMnK2ZvY3VzKS5mb2N1cygpOwogIH0KICAkKCdodG1sLCBib2R5JykuYW5pbWF0ZSh7c2Nyb2xsVG9wOiAkKCcjJytpZCkub2Zmc2V0KCkudG9wfSwgMTAwKTsKfQoKZnVuY3Rpb24gdG9nZ2xlUm93R3JvdXAoZWwpIHsKICB2YXIgdHIgPSAkKGVsKS5wYXJlbnRzKCd0cicpLmZpcnN0KCk7CiAgdmFyIG4gPSB0ci5uZXh0KCk7CiAgdHIudG9nZ2xlQ2xhc3MoJ29wZW4nKTsKICAkKGVsKS50b2dnbGVDbGFzcygnaWNvbi1leHBhbmRlZCBpY29uLWNvbGxhcHNlZCcpOwogIHdoaWxlIChuLmxlbmd0aCAmJiAhbi5oYXNDbGFzcygnZ3JvdXAnKSkgewogICAgbi50b2dnbGUoKTsKICAgIG4gPSBuLm5leHQoJ3RyJyk7CiAgfQp9CgpmdW5jdGlvbiBjb2xsYXBzZUFsbFJvd0dyb3VwcyhlbCkgewogIHZhciB0Ym9keSA9ICQoZWwpLnBhcmVudHMoJ3Rib2R5JykuZmlyc3QoKTsKICB0Ym9keS5jaGlsZHJlbigndHInKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnZ3JvdXAnKSkgewogICAgICAkKHRoaXMpLnJlbW92ZUNsYXNzKCdvcGVuJyk7CiAgICAgICQodGhpcykuZmluZCgnLmV4cGFuZGVyJykuc3dpdGNoQ2xhc3MoJ2ljb24tZXhwYW5kZWQnLCAnaWNvbi1jb2xsYXBzZWQnKTsKICAgIH0gZWxzZSB7CiAgICAgICQodGhpcykuaGlkZSgpOwogICAgfQogIH0pOwp9CgpmdW5jdGlvbiBleHBhbmRBbGxSb3dHcm91cHMoZWwpIHsKICB2YXIgdGJvZHkgPSAkKGVsKS5wYXJlbnRzKCd0Ym9keScpLmZpcnN0KCk7CiAgdGJvZHkuY2hpbGRyZW4oJ3RyJykuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ2dyb3VwJykpIHsKICAgICAgJCh0aGlzKS5hZGRDbGFzcygnb3BlbicpOwogICAgICAkKHRoaXMpLmZpbmQoJy5leHBhbmRlcicpLnN3aXRjaENsYXNzKCdpY29uLWNvbGxhcHNlZCcsICdpY29uLWV4cGFuZGVkJyk7CiAgICB9IGVsc2UgewogICAgICAkKHRoaXMpLnNob3coKTsKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gdG9nZ2xlQWxsUm93R3JvdXBzKGVsKSB7CiAgdmFyIHRyID0gJChlbCkucGFyZW50cygndHInKS5maXJzdCgpOwogIGlmICh0ci5oYXNDbGFzcygnb3BlbicpKSB7CiAgICBjb2xsYXBzZUFsbFJvd0dyb3VwcyhlbCk7CiAgfSBlbHNlIHsKICAgIGV4cGFuZEFsbFJvd0dyb3VwcyhlbCk7CiAgfQp9CgpmdW5jdGlvbiB0b2dnbGVGaWVsZHNldChlbCkgewogIHZhciBmaWVsZHNldCA9ICQoZWwpLnBhcmVudHMoJ2ZpZWxkc2V0JykuZmlyc3QoKTsKICBmaWVsZHNldC50b2dnbGVDbGFzcygnY29sbGFwc2VkJyk7CiAgZmllbGRzZXQuY2hpbGRyZW4oJ2xlZ2VuZCcpLnRvZ2dsZUNsYXNzKCdpY29uLWV4cGFuZGVkIGljb24tY29sbGFwc2VkJyk7CiAgZmllbGRzZXQuY2hpbGRyZW4oJ2RpdicpLnRvZ2dsZSgpOwp9CgpmdW5jdGlvbiBoaWRlRmllbGRzZXQoZWwpIHsKICB2YXIgZmllbGRzZXQgPSAkKGVsKS5wYXJlbnRzKCdmaWVsZHNldCcpLmZpcnN0KCk7CiAgZmllbGRzZXQudG9nZ2xlQ2xhc3MoJ2NvbGxhcHNlZCcpOwogIGZpZWxkc2V0LmNoaWxkcmVuKCdkaXYnKS5oaWRlKCk7Cn0KCi8vIGNvbHVtbnMgc2VsZWN0aW9uCmZ1bmN0aW9uIG1vdmVPcHRpb25zKHRoZVNlbEZyb20sIHRoZVNlbFRvKSB7CiAgJCh0aGVTZWxGcm9tKS5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS5kZXRhY2goKS5wcm9wKCJzZWxlY3RlZCIsIGZhbHNlKS5hcHBlbmRUbygkKHRoZVNlbFRvKSk7Cn0KCmZ1bmN0aW9uIG1vdmVPcHRpb25VcCh0aGVTZWwpIHsKICAkKHRoZVNlbCkuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykuZWFjaChmdW5jdGlvbigpewogICAgJCh0aGlzKS5wcmV2KCc6bm90KDpzZWxlY3RlZCknKS5kZXRhY2goKS5pbnNlcnRBZnRlcigkKHRoaXMpKTsKICB9KTsKfQoKZnVuY3Rpb24gbW92ZU9wdGlvblRvcCh0aGVTZWwpIHsKICAkKHRoZVNlbCkuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykuZGV0YWNoKCkucHJlcGVuZFRvKCQodGhlU2VsKSk7Cn0KCmZ1bmN0aW9uIG1vdmVPcHRpb25Eb3duKHRoZVNlbCkgewogICQoJCh0aGVTZWwpLmZpbmQoJ29wdGlvbjpzZWxlY3RlZCcpLmdldCgpLnJldmVyc2UoKSkuZWFjaChmdW5jdGlvbigpewogICAgJCh0aGlzKS5uZXh0KCc6bm90KDpzZWxlY3RlZCknKS5kZXRhY2goKS5pbnNlcnRCZWZvcmUoJCh0aGlzKSk7CiAgfSk7Cn0KCmZ1bmN0aW9uIG1vdmVPcHRpb25Cb3R0b20odGhlU2VsKSB7CiAgJCh0aGVTZWwpLmZpbmQoJ29wdGlvbjpzZWxlY3RlZCcpLmRldGFjaCgpLmFwcGVuZFRvKCQodGhlU2VsKSk7Cn0KCmZ1bmN0aW9uIGluaXRGaWx0ZXJzKCkgewogICQoJyNhZGRfZmlsdGVyX3NlbGVjdCcpLmNoYW5nZShmdW5jdGlvbigpIHsKICAgIGFkZEZpbHRlcigkKHRoaXMpLnZhbCgpLCAnJywgW10pOwogIH0pOwogICQoJyNmaWx0ZXJzLXRhYmxlIHRkLmZpZWxkIGlucHV0W3R5cGU9Y2hlY2tib3hdJykuZWFjaChmdW5jdGlvbigpIHsKICAgIHRvZ2dsZUZpbHRlcigkKHRoaXMpLnZhbCgpKTsKICB9KTsKICAkKCcjZmlsdGVycy10YWJsZScpLm9uKCdjbGljaycsICd0ZC5maWVsZCBpbnB1dFt0eXBlPWNoZWNrYm94XScsIGZ1bmN0aW9uKCkgewogICAgdG9nZ2xlRmlsdGVyKCQodGhpcykudmFsKCkpOwogIH0pOwogICQoJyNmaWx0ZXJzLXRhYmxlJykub24oJ2tleXByZXNzJywgJ2lucHV0W3R5cGU9dGV4dF0nLCBmdW5jdGlvbihlKSB7CiAgICBpZiAoZS5rZXlDb2RlID09IDEzKSAkKHRoaXMpLmNsb3Nlc3QoJ2Zvcm0nKS5zdWJtaXQoKTsKICB9KTsKfQoKZnVuY3Rpb24gYWRkRmlsdGVyKGZpZWxkLCBvcGVyYXRvciwgdmFsdWVzKSB7CiAgdmFyIGZpZWxkSWQgPSBmaWVsZC5yZXBsYWNlKCcuJywgJ18nKTsKICB2YXIgdHIgPSAkKCcjdHJfJytmaWVsZElkKTsKCiAgdmFyIGZpbHRlck9wdGlvbnMgPSBhdmFpbGFibGVGaWx0ZXJzW2ZpZWxkXTsKICBpZiAoIWZpbHRlck9wdGlvbnMpIHJldHVybjsKCiAgaWYgKGZpbHRlck9wdGlvbnNbJ3JlbW90ZSddICYmIGZpbHRlck9wdGlvbnNbJ3ZhbHVlcyddID09IG51bGwpIHsKICAgICQuZ2V0SlNPTihmaWx0ZXJzVXJsLCB7J25hbWUnOiBmaWVsZH0pLmRvbmUoZnVuY3Rpb24oZGF0YSkgewogICAgICBmaWx0ZXJPcHRpb25zWyd2YWx1ZXMnXSA9IGRhdGE7CiAgICAgIGFkZEZpbHRlcihmaWVsZCwgb3BlcmF0b3IsIHZhbHVlcykgOwogICAgfSk7CiAgICByZXR1cm47CiAgfQoKICBpZiAodHIubGVuZ3RoID4gMCkgewogICAgdHIuc2hvdygpOwogIH0gZWxzZSB7CiAgICBidWlsZEZpbHRlclJvdyhmaWVsZCwgb3BlcmF0b3IsIHZhbHVlcyk7CiAgfQogICQoJyNjYl8nK2ZpZWxkSWQpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTsKICB0b2dnbGVGaWx0ZXIoZmllbGQpOwogIHRvZ2dsZU11bHRpU2VsZWN0SWNvbkluaXQoKTsKICAkKCcjYWRkX2ZpbHRlcl9zZWxlY3QnKS52YWwoJycpLmZpbmQoJ29wdGlvbicpLmVhY2goZnVuY3Rpb24oKSB7CiAgICBpZiAoJCh0aGlzKS5hdHRyKCd2YWx1ZScpID09IGZpZWxkKSB7CiAgICAgICQodGhpcykuYXR0cignZGlzYWJsZWQnLCB0cnVlKTsKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gYnVpbGRGaWx0ZXJSb3coZmllbGQsIG9wZXJhdG9yLCB2YWx1ZXMpIHsKICB2YXIgZmllbGRJZCA9IGZpZWxkLnJlcGxhY2UoJy4nLCAnXycpOwogIHZhciBmaWx0ZXJUYWJsZSA9ICQoIiNmaWx0ZXJzLXRhYmxlIik7CiAgdmFyIGZpbHRlck9wdGlvbnMgPSBhdmFpbGFibGVGaWx0ZXJzW2ZpZWxkXTsKICBpZiAoIWZpbHRlck9wdGlvbnMpIHJldHVybjsKICB2YXIgb3BlcmF0b3JzID0gb3BlcmF0b3JCeVR5cGVbZmlsdGVyT3B0aW9uc1sndHlwZSddXTsKICB2YXIgZmlsdGVyVmFsdWVzID0gZmlsdGVyT3B0aW9uc1sndmFsdWVzJ107CiAgdmFyIGksIHNlbGVjdDsKCiAgdmFyIHRyID0gJCgnPHRyIGNsYXNzPSJmaWx0ZXIiPicpLmF0dHIoJ2lkJywgJ3RyXycrZmllbGRJZCkuaHRtbCgKICAgICc8dGQgY2xhc3M9ImZpZWxkIj48aW5wdXQgY2hlY2tlZD0iY2hlY2tlZCIgaWQ9ImNiXycrZmllbGRJZCsnIiBuYW1lPSJmW10iIHZhbHVlPSInK2ZpZWxkKyciIHR5cGU9ImNoZWNrYm94Ij48bGFiZWwgZm9yPSJjYl8nK2ZpZWxkSWQrJyI+ICcrZmlsdGVyT3B0aW9uc1snbmFtZSddKyc8L2xhYmVsPjwvdGQ+JyArCiAgICAnPHRkIGNsYXNzPSJvcGVyYXRvciI+PHNlbGVjdCBpZD0ib3BlcmF0b3JzXycrZmllbGRJZCsnIiBuYW1lPSJvcFsnK2ZpZWxkKyddIj48L3RkPicgKwogICAgJzx0ZCBjbGFzcz0idmFsdWVzIj48L3RkPicKICApOwogIGZpbHRlclRhYmxlLmFwcGVuZCh0cik7CgogIHNlbGVjdCA9IHRyLmZpbmQoJ3RkLm9wZXJhdG9yIHNlbGVjdCcpOwogIGZvciAoaSA9IDA7IGkgPCBvcGVyYXRvcnMubGVuZ3RoOyBpKyspIHsKICAgIHZhciBvcHRpb24gPSAkKCc8b3B0aW9uPicpLnZhbChvcGVyYXRvcnNbaV0pLnRleHQob3BlcmF0b3JMYWJlbHNbb3BlcmF0b3JzW2ldXSk7CiAgICBpZiAob3BlcmF0b3JzW2ldID09IG9wZXJhdG9yKSB7IG9wdGlvbi5wcm9wKCdzZWxlY3RlZCcsIHRydWUpOyB9CiAgICBzZWxlY3QuYXBwZW5kKG9wdGlvbik7CiAgfQogIHNlbGVjdC5jaGFuZ2UoZnVuY3Rpb24oKXsgdG9nZ2xlT3BlcmF0b3IoZmllbGQpOyB9KTsKCiAgc3dpdGNoIChmaWx0ZXJPcHRpb25zWyd0eXBlJ10pIHsKICBjYXNlICJsaXN0IjoKICBjYXNlICJsaXN0X29wdGlvbmFsIjoKICBjYXNlICJsaXN0X3N0YXR1cyI6CiAgY2FzZSAibGlzdF9zdWJwcm9qZWN0cyI6CiAgICB0ci5maW5kKCd0ZC52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PHNlbGVjdCBjbGFzcz0idmFsdWUiIGlkPSJ2YWx1ZXNfJytmaWVsZElkKydfMSIgbmFtZT0idlsnK2ZpZWxkKyddW10iPjwvc2VsZWN0PicgKwogICAgICAnIDxzcGFuIGNsYXNzPSJ0b2dnbGUtbXVsdGlzZWxlY3QgaWNvbi1vbmx5ICcrKHZhbHVlcy5sZW5ndGggPiAxID8gJ2ljb24tdG9nZ2xlLW1pbnVzJyA6ICdpY29uLXRvZ2dsZS1wbHVzJykrJyI+Jm5ic3A7PC9zcGFuPjwvc3Bhbj4nCiAgICApOwogICAgc2VsZWN0ID0gdHIuZmluZCgndGQudmFsdWVzIHNlbGVjdCcpOwogICAgaWYgKHZhbHVlcy5sZW5ndGggPiAxKSB7IHNlbGVjdC5hdHRyKCdtdWx0aXBsZScsIHRydWUpOyB9CiAgICBmb3IgKGkgPSAwOyBpIDwgZmlsdGVyVmFsdWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBmaWx0ZXJWYWx1ZSA9IGZpbHRlclZhbHVlc1tpXTsKICAgICAgdmFyIG9wdGlvbiA9ICQoJzxvcHRpb24+Jyk7CiAgICAgIGlmICgkLmlzQXJyYXkoZmlsdGVyVmFsdWUpKSB7CiAgICAgICAgb3B0aW9uLnZhbChmaWx0ZXJWYWx1ZVsxXSkudGV4dChmaWx0ZXJWYWx1ZVswXSk7CiAgICAgICAgaWYgKCQuaW5BcnJheShmaWx0ZXJWYWx1ZVsxXSwgdmFsdWVzKSA+IC0xKSB7b3B0aW9uLnByb3AoJ3NlbGVjdGVkJywgdHJ1ZSk7fQogICAgICAgIGlmIChmaWx0ZXJWYWx1ZS5sZW5ndGggPT0gMykgewogICAgICAgICAgdmFyIG9wdGdyb3VwID0gc2VsZWN0LmZpbmQoJ29wdGdyb3VwJykuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuICQodGhpcykuYXR0cignbGFiZWwnKSA9PSBmaWx0ZXJWYWx1ZVsyXX0pOwogICAgICAgICAgaWYgKCFvcHRncm91cC5sZW5ndGgpIHtvcHRncm91cCA9ICQoJzxvcHRncm91cD4nKS5hdHRyKCdsYWJlbCcsIGZpbHRlclZhbHVlWzJdKTt9CiAgICAgICAgICBvcHRpb24gPSBvcHRncm91cC5hcHBlbmQob3B0aW9uKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb3B0aW9uLnZhbChmaWx0ZXJWYWx1ZSkudGV4dChmaWx0ZXJWYWx1ZSk7CiAgICAgICAgaWYgKCQuaW5BcnJheShmaWx0ZXJWYWx1ZSwgdmFsdWVzKSA+IC0xKSB7b3B0aW9uLnByb3AoJ3NlbGVjdGVkJywgdHJ1ZSk7fQogICAgICB9CiAgICAgIHNlbGVjdC5hcHBlbmQob3B0aW9uKTsKICAgIH0KICAgIGJyZWFrOwogIGNhc2UgImRhdGUiOgogIGNhc2UgImRhdGVfcGFzdCI6CiAgICB0ci5maW5kKCd0ZC52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9ImRhdGUiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnXzEiIHNpemU9IjEwIiBjbGFzcz0idmFsdWUgZGF0ZV92YWx1ZSIgLz48L3NwYW4+JyArCiAgICAgICcgPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZTsiPjxpbnB1dCB0eXBlPSJkYXRlIiBuYW1lPSJ2WycrZmllbGQrJ11bXSIgaWQ9InZhbHVlc18nK2ZpZWxkSWQrJ18yIiBzaXplPSIxMCIgY2xhc3M9InZhbHVlIGRhdGVfdmFsdWUiIC8+PC9zcGFuPicgKwogICAgICAnIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKyciIHNpemU9IjMiIGNsYXNzPSJ2YWx1ZSIgLz4gJytsYWJlbERheVBsdXJhbCsnPC9zcGFuPicKICAgICk7CiAgICAkKCcjdmFsdWVzXycrZmllbGRJZCsnXzEnKS52YWwodmFsdWVzWzBdKS5kYXRlcGlja2VyRmFsbGJhY2soZGF0ZXBpY2tlck9wdGlvbnMpOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQrJ18yJykudmFsKHZhbHVlc1sxXSkuZGF0ZXBpY2tlckZhbGxiYWNrKGRhdGVwaWNrZXJPcHRpb25zKTsKICAgICQoJyN2YWx1ZXNfJytmaWVsZElkKS52YWwodmFsdWVzWzBdKTsKICAgIGJyZWFrOwogIGNhc2UgInN0cmluZyI6CiAgY2FzZSAidGV4dCI6CiAgICB0ci5maW5kKCd0ZC52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnIiBzaXplPSIzMCIgY2xhc3M9InZhbHVlIiAvPjwvc3Bhbj4nCiAgICApOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQpLnZhbCh2YWx1ZXNbMF0pOwogICAgYnJlYWs7CiAgY2FzZSAicmVsYXRpb24iOgogICAgdHIuZmluZCgndGQudmFsdWVzJykuYXBwZW5kKAogICAgICAnPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZTsiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ2WycrZmllbGQrJ11bXSIgaWQ9InZhbHVlc18nK2ZpZWxkSWQrJyIgc2l6ZT0iNiIgY2xhc3M9InZhbHVlIiAvPjwvc3Bhbj4nICsKICAgICAgJzxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48c2VsZWN0IGNsYXNzPSJ2YWx1ZSIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKydfMSI+PC9zZWxlY3Q+PC9zcGFuPicKICAgICk7CiAgICAkKCcjdmFsdWVzXycrZmllbGRJZCkudmFsKHZhbHVlc1swXSk7CiAgICBzZWxlY3QgPSB0ci5maW5kKCd0ZC52YWx1ZXMgc2VsZWN0Jyk7CiAgICBmb3IgKGkgPSAwOyBpIDwgZmlsdGVyVmFsdWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBmaWx0ZXJWYWx1ZSA9IGZpbHRlclZhbHVlc1tpXTsKICAgICAgdmFyIG9wdGlvbiA9ICQoJzxvcHRpb24+Jyk7CiAgICAgIG9wdGlvbi52YWwoZmlsdGVyVmFsdWVbMV0pLnRleHQoZmlsdGVyVmFsdWVbMF0pOwogICAgICBpZiAodmFsdWVzWzBdID09IGZpbHRlclZhbHVlWzFdKSB7IG9wdGlvbi5wcm9wKCdzZWxlY3RlZCcsIHRydWUpOyB9CiAgICAgIHNlbGVjdC5hcHBlbmQob3B0aW9uKTsKICAgIH0KICAgIGJyZWFrOwogIGNhc2UgImludGVnZXIiOgogIGNhc2UgImZsb2F0IjoKICBjYXNlICJ0cmVlIjoKICAgIHRyLmZpbmQoJ3RkLnZhbHVlcycpLmFwcGVuZCgKICAgICAgJzxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKydfMSIgc2l6ZT0iMTQiIGNsYXNzPSJ2YWx1ZSIgLz48L3NwYW4+JyArCiAgICAgICcgPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZTsiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ2WycrZmllbGQrJ11bXSIgaWQ9InZhbHVlc18nK2ZpZWxkSWQrJ18yIiBzaXplPSIxNCIgY2xhc3M9InZhbHVlIiAvPjwvc3Bhbj4nCiAgICApOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQrJ18xJykudmFsKHZhbHVlc1swXSk7CiAgICAkKCcjdmFsdWVzXycrZmllbGRJZCsnXzInKS52YWwodmFsdWVzWzFdKTsKICAgIGJyZWFrOwogIH0KfQoKZnVuY3Rpb24gdG9nZ2xlRmlsdGVyKGZpZWxkKSB7CiAgdmFyIGZpZWxkSWQgPSBmaWVsZC5yZXBsYWNlKCcuJywgJ18nKTsKICBpZiAoJCgnI2NiXycgKyBmaWVsZElkKS5pcygnOmNoZWNrZWQnKSkgewogICAgJCgiI29wZXJhdG9yc18iICsgZmllbGRJZCkuc2hvdygpLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7CiAgICB0b2dnbGVPcGVyYXRvcihmaWVsZCk7CiAgfSBlbHNlIHsKICAgICQoIiNvcGVyYXRvcnNfIiArIGZpZWxkSWQpLmhpZGUoKS5hdHRyKCdkaXNhYmxlZCcsIHRydWUpOwogICAgZW5hYmxlVmFsdWVzKGZpZWxkLCBbXSk7CiAgfQp9CgpmdW5jdGlvbiBlbmFibGVWYWx1ZXMoZmllbGQsIGluZGV4ZXMpIHsKICB2YXIgZmllbGRJZCA9IGZpZWxkLnJlcGxhY2UoJy4nLCAnXycpOwogICQoJyN0cl8nK2ZpZWxkSWQrJyB0ZC52YWx1ZXMgLnZhbHVlJykuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgaWYgKCQuaW5BcnJheShpbmRleCwgaW5kZXhlcykgPj0gMCkgewogICAgICAkKHRoaXMpLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7CiAgICAgICQodGhpcykucGFyZW50cygnc3BhbicpLmZpcnN0KCkuc2hvdygpOwogICAgfSBlbHNlIHsKICAgICAgJCh0aGlzKS52YWwoJycpOwogICAgICAkKHRoaXMpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICQodGhpcykucGFyZW50cygnc3BhbicpLmZpcnN0KCkuaGlkZSgpOwogICAgfQoKICAgIGlmICgkKHRoaXMpLmhhc0NsYXNzKCdncm91cCcpKSB7CiAgICAgICQodGhpcykuYWRkQ2xhc3MoJ29wZW4nKTsKICAgIH0gZWxzZSB7CiAgICAgICQodGhpcykuc2hvdygpOwogICAgfQogIH0pOwp9CgpmdW5jdGlvbiB0b2dnbGVPcGVyYXRvcihmaWVsZCkgewogIHZhciBmaWVsZElkID0gZmllbGQucmVwbGFjZSgnLicsICdfJyk7CiAgdmFyIG9wZXJhdG9yID0gJCgiI29wZXJhdG9yc18iICsgZmllbGRJZCk7CiAgc3dpdGNoIChvcGVyYXRvci52YWwoKSkgewogICAgY2FzZSAiISoiOgogICAgY2FzZSAiKiI6CiAgICBjYXNlICJuZCI6CiAgICBjYXNlICJ0IjoKICAgIGNhc2UgImxkIjoKICAgIGNhc2UgIm53IjoKICAgIGNhc2UgInciOgogICAgY2FzZSAibHciOgogICAgY2FzZSAibDJ3IjoKICAgIGNhc2UgIm5tIjoKICAgIGNhc2UgIm0iOgogICAgY2FzZSAibG0iOgogICAgY2FzZSAieSI6CiAgICBjYXNlICJvIjoKICAgIGNhc2UgImMiOgogICAgY2FzZSAiKm8iOgogICAgY2FzZSAiIW8iOgogICAgICBlbmFibGVWYWx1ZXMoZmllbGQsIFtdKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICI+PCI6CiAgICAgIGVuYWJsZVZhbHVlcyhmaWVsZCwgWzAsMV0pOwogICAgICBicmVhazsKICAgIGNhc2UgIjx0KyI6CiAgICBjYXNlICI+dCsiOgogICAgY2FzZSAiPjx0KyI6CiAgICBjYXNlICJ0KyI6CiAgICBjYXNlICI+dC0iOgogICAgY2FzZSAiPHQtIjoKICAgIGNhc2UgIj48dC0iOgogICAgY2FzZSAidC0iOgogICAgICBlbmFibGVWYWx1ZXMoZmllbGQsIFsyXSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAiPXAiOgogICAgY2FzZSAiPSFwIjoKICAgIGNhc2UgIiFwIjoKICAgICAgZW5hYmxlVmFsdWVzKGZpZWxkLCBbMV0pOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIGVuYWJsZVZhbHVlcyhmaWVsZCwgWzBdKTsKICAgICAgYnJlYWs7CiAgfQp9CgpmdW5jdGlvbiB0b2dnbGVNdWx0aVNlbGVjdChlbCkgewogIHZhciBpc1dvcmtmbG93ID0gZWwuY2xvc2VzdCgnLmNvbnRyb2xsZXItd29ya2Zsb3dzJyk7CiAgaWYgKGVsLmF0dHIoJ211bHRpcGxlJykpIHsKICAgIGVsLnJlbW92ZUF0dHIoJ211bHRpcGxlJyk7CiAgICBpZiAoaXNXb3JrZmxvdykgeyBlbC5maW5kKCJvcHRpb25bdmFsdWU9YWxsXSIpLnNob3coKTsgfQogICAgZWwuYXR0cignc2l6ZScsIDEpOwogIH0gZWxzZSB7CiAgICBlbC5hdHRyKCdtdWx0aXBsZScsIHRydWUpOwogICAgaWYgKGlzV29ya2Zsb3cpIHsgZWwuZmluZCgib3B0aW9uW3ZhbHVlPWFsbF0iKS5hdHRyKCJzZWxlY3RlZCIsIGZhbHNlKS5oaWRlKCk7IH0KICAgIGlmIChlbC5jaGlsZHJlbigpLmxlbmd0aCA+IDEwKQogICAgICBlbC5hdHRyKCdzaXplJywgMTApOwogICAgZWxzZQogICAgICBlbC5hdHRyKCdzaXplJywgNCk7CiAgfQp9CgpmdW5jdGlvbiBzaG93VGFiKG5hbWUsIHVybCkgewogICQoJyN0YWItY29udGVudC0nICsgbmFtZSkucGFyZW50KCkuZmluZCgnLnRhYi1jb250ZW50JykuaGlkZSgpOwogICQoJyN0YWItY29udGVudC0nICsgbmFtZSkuc2hvdygpOwogICQoJyN0YWItJyArIG5hbWUpLmNsb3Nlc3QoJy50YWJzJykuZmluZCgnYScpLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpOwogICQoJyN0YWItJyArIG5hbWUpLmFkZENsYXNzKCdzZWxlY3RlZCcpOwoKICByZXBsYWNlSW5IaXN0b3J5KHVybCkKCiAgcmV0dXJuIGZhbHNlOwp9CgpmdW5jdGlvbiBzaG93SXNzdWVIaXN0b3J5KGpvdXJuYWwsIHVybCkgewogIHRhYl9jb250ZW50ID0gJCgnI3RhYi1jb250ZW50LWhpc3RvcnknKTsKICB0YWJfY29udGVudC5wYXJlbnQoKS5maW5kKCcudGFiLWNvbnRlbnQnKS5oaWRlKCk7CiAgdGFiX2NvbnRlbnQuc2hvdygpOwogIHRhYl9jb250ZW50LnBhcmVudCgpLmNoaWxkcmVuKCdkaXYudGFicycpLmZpbmQoJ2EnKS5yZW1vdmVDbGFzcygnc2VsZWN0ZWQnKTsKCiAgJCgnI3RhYi0nICsgam91cm5hbCkuYWRkQ2xhc3MoJ3NlbGVjdGVkJyk7CgogIHJlcGxhY2VJbkhpc3RvcnkodXJsKQoKICBzd2l0Y2goam91cm5hbCkgewogICAgY2FzZSAnbm90ZXMnOgogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCcpLnNob3coKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWw6bm90KC5oYXMtbm90ZXMpJykuaGlkZSgpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAud2lraScpLnNob3coKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwgLmNvbnRleHR1YWwgLmpvdXJuYWwtYWN0aW9ucycpLnNob3coKTsKCiAgICAgIC8vIGFsd2F5cyBzaG93IHRodW1ibmFpbHMgaW4gbm90ZXMgdGFiCiAgICAgIHZhciB0aHVtYm5haWxzID0gdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwgLnRodW1ibmFpbHMnKTsKICAgICAgdGh1bWJuYWlscy5zaG93KCk7CiAgICAgIC8vIHNob3cgam91cm5hbHMgd2l0aG91dCBub3RlcywgYnV0IHdpdGggdGh1bWJuYWlscwogICAgICB0aHVtYm5haWxzLnBhcmVudHMoJy5qb3VybmFsJykuc2hvdygpOwogICAgICBicmVhazsKICAgIGNhc2UgJ3Byb3BlcnRpZXMnOgogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCcpLnNob3coKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWw6bm90KC5oYXMtZGV0YWlscyknKS5oaWRlKCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC53aWtpJykuaGlkZSgpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAudGh1bWJuYWlscycpLmhpZGUoKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwgLmNvbnRleHR1YWwgLmpvdXJuYWwtYWN0aW9ucycpLmhpZGUoKTsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCcpLnNob3coKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwgLndpa2knKS5zaG93KCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC50aHVtYm5haWxzJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAuY29udGV4dHVhbCAuam91cm5hbC1hY3Rpb25zJykuc2hvdygpOwogIH0KCiAgcmV0dXJuIGZhbHNlOwp9CgpmdW5jdGlvbiBnZXRSZW1vdGVUYWIobmFtZSwgcmVtb3RlX3VybCwgdXJsLCBsb2FkX2Fsd2F5cykgewogIGxvYWRfYWx3YXlzID0gbG9hZF9hbHdheXMgfHwgZmFsc2U7CiAgdmFyIHRhYl9jb250ZW50ID0gJCgnI3RhYi1jb250ZW50LScgKyBuYW1lKTsKCiAgdGFiX2NvbnRlbnQucGFyZW50KCkuZmluZCgnLnRhYi1jb250ZW50JykuaGlkZSgpOwogIHRhYl9jb250ZW50LnBhcmVudCgpLmNoaWxkcmVuKCdkaXYudGFicycpLmZpbmQoJ2EnKS5yZW1vdmVDbGFzcygnc2VsZWN0ZWQnKTsKICAkKCcjdGFiLScgKyBuYW1lKS5hZGRDbGFzcygnc2VsZWN0ZWQnKTsKCiAgcmVwbGFjZUluSGlzdG9yeSh1cmwpOwoKICBpZiAodGFiX2NvbnRlbnQuY2hpbGRyZW4oKS5sZW5ndGggPT0gMCAmJiBsb2FkX2Fsd2F5cyA9PSBmYWxzZSkgewogICAgJC5hamF4KHsKICAgICAgdXJsOiByZW1vdGVfdXJsLAogICAgICB0eXBlOiAnZ2V0JywKICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSl7CiAgICAgICAgdGFiX2NvbnRlbnQuaHRtbChkYXRhKQogICAgICB9CiAgICB9KTsKICB9CgogIHRhYl9jb250ZW50LnNob3coKTsKICByZXR1cm4gZmFsc2U7Cn0KCi8vcmVwbGFjZXMgY3VycmVudCBVUkwgd2l0aCB0aGUgImhyZWYiIGF0dHJpYnV0ZSBvZiB0aGUgY3VycmVudCBsaW5rCi8vKG9ubHkgdHJpZ2dlcmVkIGlmIHN1cHBvcnRlZCBieSBicm93c2VyKQpmdW5jdGlvbiByZXBsYWNlSW5IaXN0b3J5KHVybCkgewogIGlmICgicmVwbGFjZVN0YXRlIiBpbiB3aW5kb3cuaGlzdG9yeSAmJiB1cmwgIT09IHVuZGVmaW5lZCkgewogICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKG51bGwsIGRvY3VtZW50LnRpdGxlLCB1cmwpOwogIH0KfQoKZnVuY3Rpb24gbW92ZVRhYlJpZ2h0KGVsKSB7CiAgdmFyIGxpcyA9ICQoZWwpLnBhcmVudHMoJ2Rpdi50YWJzJykuZmlyc3QoKS5maW5kKCd1bCcpLmNoaWxkcmVuKCk7CiAgdmFyIGJ3ID0gJChlbCkucGFyZW50cygnZGl2LnRhYnMtYnV0dG9ucycpLm91dGVyV2lkdGgodHJ1ZSk7CiAgdmFyIHRhYnNXaWR0aCA9IDA7CiAgdmFyIGkgPSAwOwogIGxpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgaWYgKCQodGhpcykuaXMoJzp2aXNpYmxlJykpIHsKICAgICAgdGFic1dpZHRoICs9ICQodGhpcykub3V0ZXJXaWR0aCh0cnVlKTsKICAgIH0KICB9KTsKICBpZiAodGFic1dpZHRoIDwgJChlbCkucGFyZW50cygnZGl2LnRhYnMnKS5maXJzdCgpLndpZHRoKCkgLSBidykgeyByZXR1cm47IH0KICAkKGVsKS5zaWJsaW5ncygnLnRhYi1sZWZ0JykucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7CiAgd2hpbGUgKGk8bGlzLmxlbmd0aCAmJiAhbGlzLmVxKGkpLmlzKCc6dmlzaWJsZScpKSB7IGkrKzsgfQogIHZhciB3ID0gbGlzLmVxKGkpLndpZHRoKCk7CiAgbGlzLmVxKGkpLmhpZGUoKTsKICBpZiAodGFic1dpZHRoIC0gdyA8ICQoZWwpLnBhcmVudHMoJ2Rpdi50YWJzJykuZmlyc3QoKS53aWR0aCgpIC0gYncpIHsKICAgICQoZWwpLmFkZENsYXNzKCdkaXNhYmxlZCcpOwogIH0KfQoKZnVuY3Rpb24gbW92ZVRhYkxlZnQoZWwpIHsKICB2YXIgbGlzID0gJChlbCkucGFyZW50cygnZGl2LnRhYnMnKS5maXJzdCgpLmZpbmQoJ3VsJykuY2hpbGRyZW4oKTsKICB2YXIgaSA9IDA7CiAgd2hpbGUgKGkgPCBsaXMubGVuZ3RoICYmICFsaXMuZXEoaSkuaXMoJzp2aXNpYmxlJykpIHsgaSsrOyB9CiAgaWYgKGkgPiAwKSB7CiAgICBsaXMuZXEoaS0xKS5zaG93KCk7CiAgICAkKGVsKS5zaWJsaW5ncygnLnRhYi1yaWdodCcpLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOwogIH0KICBpZiAoaSA8PSAxKSB7CiAgICAkKGVsKS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKICB9Cn0KCmZ1bmN0aW9uIGRpc3BsYXlUYWJzQnV0dG9ucygpIHsKICB2YXIgbGlzOwogIHZhciB0YWJzV2lkdGg7CiAgdmFyIGVsOwogIHZhciBudW1IaWRkZW47CiAgJCgnZGl2LnRhYnMnKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgZWwgPSAkKHRoaXMpOwogICAgbGlzID0gZWwuZmluZCgndWwnKS5jaGlsZHJlbigpOwogICAgdGFic1dpZHRoID0gMDsKICAgIG51bUhpZGRlbiA9IDA7CiAgICBsaXMuZWFjaChmdW5jdGlvbigpewogICAgICBpZiAoJCh0aGlzKS5pcygnOnZpc2libGUnKSkgewogICAgICAgIHRhYnNXaWR0aCArPSAkKHRoaXMpLm91dGVyV2lkdGgodHJ1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbnVtSGlkZGVuKys7CiAgICAgIH0KICAgIH0pOwogICAgdmFyIGJ3ID0gJChlbCkuZmluZCgnZGl2LnRhYnMtYnV0dG9ucycpLm91dGVyV2lkdGgodHJ1ZSk7CiAgICBpZiAoKHRhYnNXaWR0aCA8IGVsLndpZHRoKCkgLSBidykgJiYgKGxpcy5sZW5ndGggPT09IDAgfHwgbGlzLmZpcnN0KCkuaXMoJzp2aXNpYmxlJykpKSB7CiAgICAgIGVsLmZpbmQoJ2Rpdi50YWJzLWJ1dHRvbnMnKS5oaWRlKCk7CiAgICB9IGVsc2UgewogICAgICBlbC5maW5kKCdkaXYudGFicy1idXR0b25zJykuc2hvdygpLmNoaWxkcmVuKCdidXR0b24udGFiLWxlZnQnKS50b2dnbGVDbGFzcygnZGlzYWJsZWQnLCBudW1IaWRkZW4gPT0gMCk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIHNldFByZWRlY2Vzc29yRmllbGRzVmlzaWJpbGl0eSgpIHsKICB2YXIgcmVsYXRpb25UeXBlID0gJCgnI3JlbGF0aW9uX3JlbGF0aW9uX3R5cGUnKTsKICBpZiAocmVsYXRpb25UeXBlLnZhbCgpID09ICJwcmVjZWRlcyIgfHwgcmVsYXRpb25UeXBlLnZhbCgpID09ICJmb2xsb3dzIikgewogICAgJCgnI3ByZWRlY2Vzc29yX2ZpZWxkcycpLnNob3coKTsKICB9IGVsc2UgewogICAgJCgnI3ByZWRlY2Vzc29yX2ZpZWxkcycpLmhpZGUoKTsKICB9Cn0KCmZ1bmN0aW9uIHNob3dNb2RhbChpZCwgd2lkdGgsIHRpdGxlKSB7CiAgdmFyIGVsID0gJCgnIycraWQpLmZpcnN0KCk7CiAgaWYgKGVsLmxlbmd0aCA9PT0gMCB8fCBlbC5pcygnOnZpc2libGUnKSkge3JldHVybjt9CiAgaWYgKCF0aXRsZSkgdGl0bGUgPSBlbC5maW5kKCdoMy50aXRsZScpLnRleHQoKTsKICAvLyBtb3ZlcyBleGlzdGluZyBtb2RhbHMgYmVoaW5kIHRoZSB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kCiAgJCgiLm1vZGFsIikuY3NzKCd6SW5kZXgnLDk5KTsKICBlbC5kaWFsb2coewogICAgd2lkdGg6IHdpZHRoLAogICAgbW9kYWw6IHRydWUsCiAgICByZXNpemFibGU6IGZhbHNlLAogICAgZGlhbG9nQ2xhc3M6ICdtb2RhbCcsCiAgICB0aXRsZTogdGl0bGUKICB9KS5vbignZGlhbG9nY2xvc2UnLCBmdW5jdGlvbigpewogICAgJCgiLm1vZGFsIikuY3NzKCd6SW5kZXgnLDEwMSk7CiAgfSk7CiAgZWwuZmluZCgiaW5wdXRbdHlwZT10ZXh0XSwgaW5wdXRbdHlwZT1zdWJtaXRdIikuZmlyc3QoKS5mb2N1cygpOwp9CgpmdW5jdGlvbiBoaWRlTW9kYWwoZWwpIHsKICB2YXIgbW9kYWw7CiAgaWYgKGVsKSB7CiAgICBtb2RhbCA9ICQoZWwpLnBhcmVudHMoJy51aS1kaWFsb2ctY29udGVudCcpOwogIH0gZWxzZSB7CiAgICBtb2RhbCA9ICQoJyNhamF4LW1vZGFsJyk7CiAgfQogIG1vZGFsLmRpYWxvZygiY2xvc2UiKTsKfQoKZnVuY3Rpb24gY29sbGFwc2VTY21FbnRyeShpZCkgewogICQoJy4nK2lkKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ29wZW4nKSkgewogICAgICBjb2xsYXBzZVNjbUVudHJ5KCQodGhpcykuYXR0cignaWQnKSk7CiAgICB9CiAgICAkKHRoaXMpLmhpZGUoKTsKICB9KTsKICAkKCcjJytpZCkucmVtb3ZlQ2xhc3MoJ29wZW4nKTsKfQoKZnVuY3Rpb24gZXhwYW5kU2NtRW50cnkoaWQpIHsKICAkKCcuJytpZCkuZWFjaChmdW5jdGlvbigpIHsKICAgICQodGhpcykuc2hvdygpOwogICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ2xvYWRlZCcpICYmICEkKHRoaXMpLmhhc0NsYXNzKCdjb2xsYXBzZWQnKSkgewogICAgICBleHBhbmRTY21FbnRyeSgkKHRoaXMpLmF0dHIoJ2lkJykpOwogICAgfQogIH0pOwogICQoJyMnK2lkKS5hZGRDbGFzcygnb3BlbicpOwp9CgpmdW5jdGlvbiBzY21FbnRyeUNsaWNrKGlkLCB1cmwpIHsKICAgIHZhciBlbCA9ICQoJyMnK2lkKTsKICAgIGlmIChlbC5oYXNDbGFzcygnb3BlbicpKSB7CiAgICAgICAgY29sbGFwc2VTY21FbnRyeShpZCk7CiAgICAgICAgZWwuZmluZCgnLmV4cGFuZGVyJykuc3dpdGNoQ2xhc3MoJ2ljb24tZXhwYW5kZWQnLCAnaWNvbi1jb2xsYXBzZWQnKTsKICAgICAgICBlbC5hZGRDbGFzcygnY29sbGFwc2VkJyk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSBlbHNlIGlmIChlbC5oYXNDbGFzcygnbG9hZGVkJykpIHsKICAgICAgICBleHBhbmRTY21FbnRyeShpZCk7CiAgICAgICAgZWwuZmluZCgnLmV4cGFuZGVyJykuc3dpdGNoQ2xhc3MoJ2ljb24tY29sbGFwc2VkJywgJ2ljb24tZXhwYW5kZWQnKTsKICAgICAgICBlbC5yZW1vdmVDbGFzcygnY29sbGFwc2VkJyk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKGVsLmhhc0NsYXNzKCdsb2FkaW5nJykpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBlbC5hZGRDbGFzcygnbG9hZGluZycpOwogICAgJC5hamF4KHsKICAgICAgdXJsOiB1cmwsCiAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICBlbC5hZnRlcihkYXRhKTsKICAgICAgICBlbC5hZGRDbGFzcygnb3BlbicpLmFkZENsYXNzKCdsb2FkZWQnKS5yZW1vdmVDbGFzcygnbG9hZGluZycpOwogICAgICAgIGVsLmZpbmQoJy5leHBhbmRlcicpLnN3aXRjaENsYXNzKCdpY29uLWNvbGxhcHNlZCcsICdpY29uLWV4cGFuZGVkJyk7CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIHRydWU7Cn0KCmZ1bmN0aW9uIHJhbmRvbUtleShzaXplKSB7CiAgdmFyIGNoYXJzID0gJzAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JzsKICB2YXIga2V5ID0gJyc7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKICAgIGtleSArPSBjaGFycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcnMubGVuZ3RoKSk7CiAgfQogIHJldHVybiBrZXk7Cn0KCmZ1bmN0aW9uIGNvcHlUZXh0VG9DbGlwYm9hcmQodGFyZ2V0KSB7CiAgaWYgKHRhcmdldCkgewogICAgdmFyIHRlbXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpOwogICAgdGVtcC52YWx1ZSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY2xpcGJvYXJkLXRleHQnKTsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGVtcCk7CiAgICB0ZW1wLnNlbGVjdCgpOwogICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTsKICAgIGlmICh0ZW1wLnBhcmVudE5vZGUpIHsKICAgICAgdGVtcC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRlbXApOwogICAgfQogICAgaWYgKCQodGFyZ2V0KS5jbG9zZXN0KCcuZHJkbi5leHBhbmRlZCcpLmxlbmd0aCkgewogICAgICAkKHRhcmdldCkuY2xvc2VzdCgnLmRyZG4uZXhwYW5kZWQnKS5yZW1vdmVDbGFzcygiZXhwYW5kZWQiKTsKICAgIH0KICB9CiAgcmV0dXJuIGZhbHNlOwp9CgpmdW5jdGlvbiB1cGRhdGVJc3N1ZUZyb20odXJsLCBlbCkgewogICQoJyNhbGxfYXR0cmlidXRlcyBpbnB1dCwgI2FsbF9hdHRyaWJ1dGVzIHRleHRhcmVhLCAjYWxsX2F0dHJpYnV0ZXMgc2VsZWN0JykuZWFjaChmdW5jdGlvbigpewogICAgJCh0aGlzKS5kYXRhKCd2YWx1ZWJlZm9yZXVwZGF0ZScsICQodGhpcykudmFsKCkpOwogIH0pOwogIGlmIChlbCkgewogICAgJCgiI2Zvcm1fdXBkYXRlX3RyaWdnZXJlZF9ieSIpLnZhbCgkKGVsKS5hdHRyKCdpZCcpKTsKICB9CiAgcmV0dXJuICQuYWpheCh7CiAgICB1cmw6IHVybCwKICAgIHR5cGU6ICdwb3N0JywKICAgIGRhdGE6ICQoJyNpc3N1ZS1mb3JtJykuc2VyaWFsaXplKCkKICB9KTsKfQoKZnVuY3Rpb24gcmVwbGFjZUlzc3VlRm9ybVdpdGgoaHRtbCl7CiAgdmFyIHJlcGxhY2VtZW50ID0gJChodG1sKTsKICAkKCcjYWxsX2F0dHJpYnV0ZXMgaW5wdXQsICNhbGxfYXR0cmlidXRlcyB0ZXh0YXJlYSwgI2FsbF9hdHRyaWJ1dGVzIHNlbGVjdCcpLmVhY2goZnVuY3Rpb24oKXsKICAgIHZhciBvYmplY3RfaWQgPSAkKHRoaXMpLmF0dHIoJ2lkJyk7CiAgICBpZiAob2JqZWN0X2lkICYmICQodGhpcykuZGF0YSgndmFsdWViZWZvcmV1cGRhdGUnKSE9JCh0aGlzKS52YWwoKSkgewogICAgICByZXBsYWNlbWVudC5maW5kKCcjJytvYmplY3RfaWQpLnZhbCgkKHRoaXMpLnZhbCgpKTsKICAgIH0KICB9KTsKICAkKCcjYWxsX2F0dHJpYnV0ZXMnKS5lbXB0eSgpOwogICQoJyNhbGxfYXR0cmlidXRlcycpLnByZXBlbmQocmVwbGFjZW1lbnQpOwp9CgpmdW5jdGlvbiB1cGRhdGVCdWxrRWRpdEZyb20odXJsKSB7CiAgJC5hamF4KHsKICAgIHVybDogdXJsLAogICAgdHlwZTogJ3Bvc3QnLAogICAgZGF0YTogJCgnI2J1bGtfZWRpdF9mb3JtJykuc2VyaWFsaXplKCkKICB9KTsKfQoKZnVuY3Rpb24gb2JzZXJ2ZUF1dG9jb21wbGV0ZUZpZWxkKGZpZWxkSWQsIHVybCwgb3B0aW9ucykgewogICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewogICAgJCgnIycrZmllbGRJZCkuYXV0b2NvbXBsZXRlKCQuZXh0ZW5kKHsKICAgICAgc291cmNlOiB1cmwsCiAgICAgIG1pbkxlbmd0aDogMiwKICAgICAgcG9zaXRpb246IHtjb2xsaXNpb246ICJmbGlwZml0In0sCiAgICAgIHNlYXJjaDogZnVuY3Rpb24oKXskKCcjJytmaWVsZElkKS5hZGRDbGFzcygnYWpheC1sb2FkaW5nJyk7fSwKICAgICAgcmVzcG9uc2U6IGZ1bmN0aW9uKCl7JCgnIycrZmllbGRJZCkucmVtb3ZlQ2xhc3MoJ2FqYXgtbG9hZGluZycpO30KICAgIH0sIG9wdGlvbnMpKTsKICAgICQoJyMnK2ZpZWxkSWQpLmFkZENsYXNzKCdhdXRvY29tcGxldGUnKTsKICB9KTsKfQoKZnVuY3Rpb24gbXVsdGlwbGVBdXRvY29tcGxldGVGaWVsZChmaWVsZElkLCB1cmwsIG9wdGlvbnMpIHsKICBmdW5jdGlvbiBzcGxpdCh2YWwpIHsKICAgIHJldHVybiB2YWwuc3BsaXQoLyxccyovKTsKICB9CgogIGZ1bmN0aW9uIGV4dHJhY3RMYXN0KHRlcm0pIHsKICAgIHJldHVybiBzcGxpdCh0ZXJtKS5wb3AoKTsKICB9CgogICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHsKICAgICQoJyMnICsgZmllbGRJZCkuYXV0b2NvbXBsZXRlKCQuZXh0ZW5kKHsKICAgICAgc291cmNlOiBmdW5jdGlvbiAocmVxdWVzdCwgcmVzcG9uc2UpIHsKICAgICAgICAkLmdldEpTT04odXJsLCB7CiAgICAgICAgICB0ZXJtOiBleHRyYWN0TGFzdChyZXF1ZXN0LnRlcm0pCiAgICAgICAgfSwgcmVzcG9uc2UpOwogICAgICB9LAogICAgICBtaW5MZW5ndGg6IDIsCiAgICAgIHBvc2l0aW9uOiB7Y29sbGlzaW9uOiAiZmxpcGZpdCJ9LAogICAgICBzZWFyY2g6IGZ1bmN0aW9uICgpIHsKICAgICAgICAkKCcjJyArIGZpZWxkSWQpLmFkZENsYXNzKCdhamF4LWxvYWRpbmcnKTsKICAgICAgfSwKICAgICAgcmVzcG9uc2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAkKCcjJyArIGZpZWxkSWQpLnJlbW92ZUNsYXNzKCdhamF4LWxvYWRpbmcnKTsKICAgICAgfSwKICAgICAgc2VsZWN0OiBmdW5jdGlvbiAoZXZlbnQsIHVpKSB7CiAgICAgICAgdmFyIHRlcm1zID0gc3BsaXQodGhpcy52YWx1ZSk7CiAgICAgICAgLy8gcmVtb3ZlIHRoZSBjdXJyZW50IGlucHV0CiAgICAgICAgdGVybXMucG9wKCk7CiAgICAgICAgLy8gYWRkIHRoZSBzZWxlY3RlZCBpdGVtCiAgICAgICAgdGVybXMucHVzaCh1aS5pdGVtLnZhbHVlKTsKICAgICAgICAvLyBhZGQgcGxhY2Vob2xkZXIgdG8gZ2V0IHRoZSBjb21tYS1hbmQtc3BhY2UgYXQgdGhlIGVuZAogICAgICAgIHRlcm1zLnB1c2goIiIpOwogICAgICAgIHRoaXMudmFsdWUgPSB0ZXJtcy5qb2luKCIsICIpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfSwgb3B0aW9ucykpOwogICAgJCgnIycgKyBmaWVsZElkKS5hZGRDbGFzcygnYXV0b2NvbXBsZXRlJyk7CiAgfSk7Cn0KCmZ1bmN0aW9uIG9ic2VydmVTZWFyY2hmaWVsZChmaWVsZElkLCB0YXJnZXRJZCwgdXJsKSB7CiAgJCgnIycrZmllbGRJZCkuZWFjaChmdW5jdGlvbigpIHsKICAgIHZhciAkdGhpcyA9ICQodGhpcyk7CiAgICAkdGhpcy5hZGRDbGFzcygnYXV0b2NvbXBsZXRlJyk7CiAgICAkdGhpcy5hdHRyKCdkYXRhLXZhbHVlLXdhcycsICR0aGlzLnZhbCgpKTsKICAgIHZhciBjaGVjayA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdmFsID0gJHRoaXMudmFsKCk7CiAgICAgIGlmICgkdGhpcy5hdHRyKCdkYXRhLXZhbHVlLXdhcycpICE9IHZhbCl7CiAgICAgICAgJHRoaXMuYXR0cignZGF0YS12YWx1ZS13YXMnLCB2YWwpOwogICAgICAgICQuYWpheCh7CiAgICAgICAgICB1cmw6IHVybCwKICAgICAgICAgIHR5cGU6ICdnZXQnLAogICAgICAgICAgZGF0YToge3E6ICR0aGlzLnZhbCgpfSwKICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpeyBpZih0YXJnZXRJZCkgJCgnIycrdGFyZ2V0SWQpLmh0bWwoZGF0YSk7IH0sCiAgICAgICAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbigpeyAkdGhpcy5hZGRDbGFzcygnYWpheC1sb2FkaW5nJyk7IH0sCiAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24oKXsgJHRoaXMucmVtb3ZlQ2xhc3MoJ2FqYXgtbG9hZGluZycpOyB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgcmVzZXQgPSBmdW5jdGlvbigpIHsKICAgICAgaWYgKHRpbWVyKSB7CiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7CiAgICAgICAgdGltZXIgPSBzZXRJbnRlcnZhbChjaGVjaywgMzAwKTsKICAgICAgfQogICAgfTsKICAgIHZhciB0aW1lciA9IHNldEludGVydmFsKGNoZWNrLCAzMDApOwogICAgJHRoaXMuYmluZCgna2V5dXAgY2xpY2sgbW91c2Vtb3ZlJywgcmVzZXQpOwogIH0pOwp9CgokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICQoIi5kcmRuIC5hdXRvY29tcGxldGUiKS52YWwoJycpOwoKICAvLyBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgdG8gZm9jdXMgc2VsZWN0ZWQgcHJvamVjdAogIHZhciBzZWxlY3RlZDsKICAkKGRvY3VtZW50KS5vbignY2xpY2snLCAnLmRyZG4tdHJpZ2dlcicsIGZ1bmN0aW9uKGUpewogICAgdmFyIGRyZG4gPSAkKHRoaXMpLmNsb3Nlc3QoIi5kcmRuIik7CiAgICBpZiAoZHJkbi5oYXNDbGFzcygiZXhwYW5kZWQiKSkgewogICAgICBkcmRuLnJlbW92ZUNsYXNzKCJleHBhbmRlZCIpOwogICAgfSBlbHNlIHsKICAgICAgJCgiLmRyZG4iKS5yZW1vdmVDbGFzcygiZXhwYW5kZWQiKTsKICAgICAgZHJkbi5hZGRDbGFzcygiZXhwYW5kZWQiKTsKICAgICAgc2VsZWN0ZWQgPSAkKCcuZHJkbi1pdGVtcyBhLnNlbGVjdGVkJyk7IC8vIFN0b3JlIHNlbGVjdGVkIHByb2plY3QKICAgICAgc2VsZWN0ZWQuZm9jdXMoKTsgLy8gQ2FsbGluZyBmb2N1cyB0byBzY3JvbGwgdG8gc2VsZWN0ZWQgcHJvamVjdAogICAgICBpZiAoIWlzTW9iaWxlKCkpIHsKICAgICAgICBkcmRuLmZpbmQoIi5hdXRvY29tcGxldGUiKS5mb2N1cygpOwogICAgICB9CiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICB9CiAgfSk7CiAgJChkb2N1bWVudCkuY2xpY2soZnVuY3Rpb24oZSl7CiAgICBpZiAoJChlLnRhcmdldCkuY2xvc2VzdCgiLmRyZG4iKS5sZW5ndGggPCAxKSB7CiAgICAgICQoIi5kcmRuLmV4cGFuZGVkIikucmVtb3ZlQ2xhc3MoImV4cGFuZGVkIik7CiAgICB9CiAgfSk7CgogIG9ic2VydmVTZWFyY2hmaWVsZCgncHJvamVjdHMtcXVpY2stc2VhcmNoJywgbnVsbCwgJCgnI3Byb2plY3RzLXF1aWNrLXNlYXJjaCcpLmRhdGEoJ2F1dG9tY29tcGxldGUtdXJsJykpOwoKICAkKCIuZHJkbi1jb250ZW50Iikua2V5ZG93bihmdW5jdGlvbihldmVudCl7CiAgICB2YXIgaXRlbXMgPSAkKHRoaXMpLmZpbmQoIi5kcmRuLWl0ZW1zIik7CgogICAgLy8gSWYgYSBwcm9qZWN0IGlzIHNlbGVjdGVkIHNldCBmb2N1c2VkIHRvIHNlbGVjdGVkIG9ubHkgb25jZQogICAgaWYgKHNlbGVjdGVkICYmIHNlbGVjdGVkLmxlbmd0aCA+IDApIHsKICAgICAgdmFyIGZvY3VzZWQgPSBzZWxlY3RlZDsKICAgICAgc2VsZWN0ZWQgPSB1bmRlZmluZWQ7CiAgICB9CiAgICBlbHNlIHsKICAgICAgdmFyIGZvY3VzZWQgPSBpdGVtcy5maW5kKCJhOmZvY3VzIik7CiAgICB9CiAgICBzd2l0Y2ggKGV2ZW50LndoaWNoKSB7CiAgICBjYXNlIDQwOiAvL2Rvd24KICAgICAgaWYgKGZvY3VzZWQubGVuZ3RoID4gMCkgewogICAgICAgIGZvY3VzZWQubmV4dEFsbCgiYSIpLmZpcnN0KCkuZm9jdXMoKTs7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaXRlbXMuZmluZCgiYSIpLmZpcnN0KCkuZm9jdXMoKTs7CiAgICAgIH0KICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDM4OiAvL3VwCiAgICAgIGlmIChmb2N1c2VkLmxlbmd0aCA+IDApIHsKICAgICAgICB2YXIgcHJldiA9IGZvY3VzZWQucHJldkFsbCgiYSIpOwogICAgICAgIGlmIChwcmV2Lmxlbmd0aCA+IDApIHsKICAgICAgICAgIHByZXYuZmlyc3QoKS5mb2N1cygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAkKHRoaXMpLmZpbmQoIi5hdXRvY29tcGxldGUiKS5mb2N1cygpOwogICAgICAgIH0KICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSAzNTogLy9lbmQKICAgICAgaWYgKGZvY3VzZWQubGVuZ3RoID4gMCkgewogICAgICAgIGZvY3VzZWQubmV4dEFsbCgiYSIpLmxhc3QoKS5mb2N1cygpOwogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlIDM2OiAvL2hvbWUKICAgICAgaWYgKGZvY3VzZWQubGVuZ3RoID4gMCkgewogICAgICAgIGZvY3VzZWQucHJldkFsbCgiYSIpLmxhc3QoKS5mb2N1cygpOwogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICB9CiAgfSk7Cn0pOwoKZnVuY3Rpb24gYmVmb3JlU2hvd0RhdGVQaWNrZXIoaW5wdXQsIGluc3QpIHsKICB2YXIgZGVmYXVsdF9kYXRlID0gbnVsbDsKICBzd2l0Y2ggKCQoaW5wdXQpLmF0dHIoImlkIikpIHsKICAgIGNhc2UgImlzc3VlX3N0YXJ0X2RhdGUiIDoKICAgICAgaWYgKCQoIiNpc3N1ZV9kdWVfZGF0ZSIpLmxlbmd0aCA+IDApIHsKICAgICAgICBkZWZhdWx0X2RhdGUgPSAkKCIjaXNzdWVfZHVlX2RhdGUiKS52YWwoKTsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgImlzc3VlX2R1ZV9kYXRlIiA6CiAgICAgIGlmICgkKCIjaXNzdWVfc3RhcnRfZGF0ZSIpLmxlbmd0aCA+IDApIHsKICAgICAgICB2YXIgc3RhcnRfZGF0ZSA9ICQoIiNpc3N1ZV9zdGFydF9kYXRlIikudmFsKCk7CiAgICAgICAgaWYgKHN0YXJ0X2RhdGUgIT0gIiIpIHsKICAgICAgICAgIHN0YXJ0X2RhdGUgPSBuZXcgRGF0ZShEYXRlLnBhcnNlKHN0YXJ0X2RhdGUpKTsKICAgICAgICAgIGlmIChzdGFydF9kYXRlID4gbmV3IERhdGUoKSkgewogICAgICAgICAgICBkZWZhdWx0X2RhdGUgPSAkKCIjaXNzdWVfc3RhcnRfZGF0ZSIpLnZhbCgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBicmVhazsKICB9CiAgJChpbnB1dCkuZGF0ZXBpY2tlckZhbGxiYWNrKCJvcHRpb24iLCAiZGVmYXVsdERhdGUiLCBkZWZhdWx0X2RhdGUpOwp9CgooZnVuY3Rpb24oJCl7CiAgJC5mbi5wb3NpdGlvbmVkSXRlbXMgPSBmdW5jdGlvbihzb3J0YWJsZU9wdGlvbnMsIG9wdGlvbnMpewogICAgdmFyIHNldHRpbmdzID0gJC5leHRlbmQoewogICAgICBmaXJzdFBvc2l0aW9uOiAxCiAgICB9LCBvcHRpb25zICk7CgogICAgcmV0dXJuIHRoaXMuc29ydGFibGUoJC5leHRlbmQoewogICAgICBheGlzOiAneScsCiAgICAgIGhhbmRsZTogIi5zb3J0LWhhbmRsZSIsCiAgICAgIGhlbHBlcjogZnVuY3Rpb24oZXZlbnQsIHVpKXsKICAgICAgICB1aS5jaGlsZHJlbigndGQnKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgICAgICAkKHRoaXMpLndpZHRoKCQodGhpcykud2lkdGgoKSk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHVpOwogICAgICB9LAogICAgICB1cGRhdGU6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgewogICAgICAgIHZhciBzb3J0YWJsZSA9ICQodGhpcyk7CiAgICAgICAgdmFyIGhhbmRsZSA9IHVpLml0ZW0uZmluZCgiLnNvcnQtaGFuZGxlIikuYWRkQ2xhc3MoImFqYXgtbG9hZGluZyIpOwogICAgICAgIHZhciB1cmwgPSBoYW5kbGUuZGF0YSgicmVvcmRlci11cmwiKTsKICAgICAgICB2YXIgcGFyYW0gPSBoYW5kbGUuZGF0YSgicmVvcmRlci1wYXJhbSIpOwogICAgICAgIHZhciBkYXRhID0ge307CiAgICAgICAgZGF0YVtwYXJhbV0gPSB7cG9zaXRpb246IHVpLml0ZW0uaW5kZXgoKSArIHNldHRpbmdzWydmaXJzdFBvc2l0aW9uJ119OwogICAgICAgICQuYWpheCh7CiAgICAgICAgICB1cmw6IHVybCwKICAgICAgICAgIHR5cGU6ICdwdXQnLAogICAgICAgICAgZGF0YVR5cGU6ICdzY3JpcHQnLAogICAgICAgICAgZGF0YTogZGF0YSwKICAgICAgICAgIGVycm9yOiBmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pewogICAgICAgICAgICBhbGVydChqcVhIUi5zdGF0dXMpOwogICAgICAgICAgICBzb3J0YWJsZS5zb3J0YWJsZSgiY2FuY2VsIik7CiAgICAgICAgICB9LAogICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bil7CiAgICAgICAgICAgIGhhbmRsZS5yZW1vdmVDbGFzcygiYWpheC1sb2FkaW5nIik7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0sCiAgICB9LCBzb3J0YWJsZU9wdGlvbnMpKTsKICB9Cn0oIGpRdWVyeSApKTsKCnZhciB3YXJuTGVhdmluZ1Vuc2F2ZWRNZXNzYWdlOwpmdW5jdGlvbiB3YXJuTGVhdmluZ1Vuc2F2ZWQobWVzc2FnZSkgewogIHdhcm5MZWF2aW5nVW5zYXZlZE1lc3NhZ2UgPSBtZXNzYWdlOwogICQoZG9jdW1lbnQpLm9uKCdzdWJtaXQnLCAnZm9ybScsIGZ1bmN0aW9uKCl7CiAgICAkKCd0ZXh0YXJlYScpLnJlbW92ZURhdGEoJ2NoYW5nZWQnKTsKICB9KTsKICAkKGRvY3VtZW50KS5vbignY2hhbmdlJywgJ3RleHRhcmVhJywgZnVuY3Rpb24oKXsKICAgICQodGhpcykuZGF0YSgnY2hhbmdlZCcsICdjaGFuZ2VkJyk7CiAgfSk7CiAgd2luZG93Lm9uYmVmb3JldW5sb2FkID0gZnVuY3Rpb24oKXsKICAgIHZhciB3YXJuID0gZmFsc2U7CiAgICAkKCd0ZXh0YXJlYScpLmJsdXIoKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgIGlmICgkKHRoaXMpLmRhdGEoJ2NoYW5nZWQnKSkgewogICAgICAgIHdhcm4gPSB0cnVlOwogICAgICB9CiAgICB9KTsKICAgIGlmICh3YXJuKSB7cmV0dXJuIHdhcm5MZWF2aW5nVW5zYXZlZE1lc3NhZ2U7fQogIH07Cn0KCmZ1bmN0aW9uIHNldHVwQWpheEluZGljYXRvcigpIHsKICAkKGRvY3VtZW50KS5iaW5kKCdhamF4U2VuZCcsIGZ1bmN0aW9uKGV2ZW50LCB4aHIsIHNldHRpbmdzKSB7CiAgICBpZiAoJCgnLmFqYXgtbG9hZGluZycpLmxlbmd0aCA9PT0gMCAmJiBzZXR0aW5ncy5jb250ZW50VHlwZSAhPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJykgewogICAgICAkKCcjYWpheC1pbmRpY2F0b3InKS5zaG93KCk7CiAgICB9CiAgfSk7CiAgJChkb2N1bWVudCkuYmluZCgnYWpheFN0b3AnLCBmdW5jdGlvbigpIHsKICAgICQoJyNhamF4LWluZGljYXRvcicpLmhpZGUoKTsKICB9KTsKfQoKZnVuY3Rpb24gc2V0dXBUYWJzKCkgewogIGlmKCQoJy50YWJzJykubGVuZ3RoID4gMCkgewogICAgZGlzcGxheVRhYnNCdXR0b25zKCk7CiAgICAkKHdpbmRvdykucmVzaXplKGRpc3BsYXlUYWJzQnV0dG9ucyk7CiAgfQp9CgpmdW5jdGlvbiBzZXR1cEZpbGVQcmV2aWV3TmF2aWdhdGlvbigpIHsKICAvLyBvbmx5IGJpbmQgYXJyb3cga2V5cyB3aGVuIHByZXZpZXcgbmF2aWdhdGlvbiBpcyBwcmVzZW50CiAgY29uc3QgZWxlbWVudCA9ICQoJy5wYWdpbmF0aW9uLmZpbGVwcmV2aWV3JykuZmlyc3QoKTsKICBpZiAoZWxlbWVudCkgewoKICAgIGNvbnN0IGhhbmRsZUFycm93S2V5ID0gZnVuY3Rpb24oc2VsZWN0b3IsIGUpewogICAgICBjb25zdCBocmVmID0gJChlbGVtZW50KS5maW5kKHNlbGVjdG9yKS5hdHRyKCdocmVmJyk7CiAgICAgIGlmIChocmVmKSB7CiAgICAgICAgd2luZG93LmxvY2F0aW9uID0gaHJlZjsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIH0KICAgIH07CgogICAgJChkb2N1bWVudCkua2V5ZG93bihmdW5jdGlvbihlKSB7CiAgICAgIGlmKGUuc2hpZnRLZXkgfHwgZS5tZXRhS2V5IHx8IGUuY3RybEtleSB8fCBlLmFsdEtleSkgcmV0dXJuOwogICAgICBzd2l0Y2goZS5rZXkpIHsKICAgICAgICBjYXNlICdBcnJvd0xlZnQnOgogICAgICAgICAgaGFuZGxlQXJyb3dLZXkoJy5wcmV2aW91cyBhJywgZSk7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnQXJyb3dSaWdodCc6CiAgICAgICAgICBoYW5kbGVBcnJvd0tleSgnLm5leHQgYScsIGUpOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0pOwogIH0KfQoKJChkb2N1bWVudCkub24oJ2tleWRvd24nLCAnZm9ybSB0ZXh0YXJlYScsIGZ1bmN0aW9uKGUpIHsKICAvLyBTdWJtaXQgdGhlIGZvcm0gd2l0aCBDdHJsICsgRW50ZXIgb3IgQ29tbWFuZCArIFJldHVybgogIHZhciB0YXJnZXRGb3JtID0gJChlLnRhcmdldCkuY2xvc2VzdCgnZm9ybScpOwogIGlmKGUua2V5Q29kZSA9PSAxMyAmJiAoKGUuY3RybEtleSAmJiAhZS5tZXRhS2V5KSB8fCAoIWUuY3RybEtleSAmJiBlLm1ldGFLZXkpICYmIHRhcmdldEZvcm0ubGVuZ3RoKSkgewogICAgLy8gRm9yIGFqYXgsIHVzZSBjbGljaygpIGluc3RlYWQgb2Ygc3VibWl0KCkgdG8gcHJldmVudCAiSW52YWxpZCBmb3JtIGF1dGhlbnRpY2l0eSB0b2tlbiIgZXJyb3IKICAgIGlmICh0YXJnZXRGb3JtLmF0dHIoJ2RhdGEtcmVtb3RlJykgPT0gJ3RydWUnKSB7CiAgICAgIGlmICh0YXJnZXRGb3JtLmZpbmQoJ2lucHV0W3R5cGU9c3VibWl0XScpLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gZmFsc2U7IH0KICAgICAgdGFyZ2V0Rm9ybS5maW5kKCd0ZXh0YXJlYScpLmJsdXIoKS5yZW1vdmVEYXRhKCdjaGFuZ2VkJyk7CiAgICAgIHRhcmdldEZvcm0uZmluZCgnaW5wdXRbdHlwZT1zdWJtaXRdJykuZmlyc3QoKS5jbGljaygpOwogICAgfSBlbHNlIHsKICAgICAgdGFyZ2V0Rm9ybS5maW5kKCd0ZXh0YXJlYScpLmJsdXIoKS5yZW1vdmVEYXRhKCdjaGFuZ2VkJyk7CiAgICAgIHRhcmdldEZvcm0uc3VibWl0KCk7CiAgICB9CiAgfQp9KTsKCgpmdW5jdGlvbiBoaWRlT25Mb2FkKCkgewogICQoJy5ob2wnKS5oaWRlKCk7Cn0KCmZ1bmN0aW9uIGFkZEZvcm1PYnNlcnZlcnNGb3JEb3VibGVTdWJtaXQoKSB7CiAgJCgnZm9ybVttZXRob2Q9cG9zdF0nKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgaWYgKCEkKHRoaXMpLmhhc0NsYXNzKCdtdWx0aXBsZS1zdWJtaXQnKSkgewogICAgICAkKHRoaXMpLnN1Ym1pdChmdW5jdGlvbihmb3JtX3N1Ym1pc3Npb24pIHsKICAgICAgICBpZiAoJChmb3JtX3N1Ym1pc3Npb24udGFyZ2V0KS5hdHRyKCdkYXRhLXN1Ym1pdHRlZCcpKSB7CiAgICAgICAgICBmb3JtX3N1Ym1pc3Npb24ucHJldmVudERlZmF1bHQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgJChmb3JtX3N1Ym1pc3Npb24udGFyZ2V0KS5hdHRyKCdkYXRhLXN1Ym1pdHRlZCcsIHRydWUpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIGRlZmF1bHRGb2N1cygpewogIGlmICgoJCgnI2NvbnRlbnQgOmZvY3VzJykubGVuZ3RoID09IDApICYmICh3aW5kb3cubG9jYXRpb24uaGFzaCA9PSAnJykpIHsKICAgICQoJyNjb250ZW50IGlucHV0W3R5cGU9dGV4dF06dmlzaWJsZSwgI2NvbnRlbnQgdGV4dGFyZWE6dmlzaWJsZScpLmZpcnN0KCkuZm9jdXMoKTsKICB9Cn0KCmZ1bmN0aW9uIGJsb2NrRXZlbnRQcm9wYWdhdGlvbihldmVudCkgewogIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7Cn0KCmZ1bmN0aW9uIHRvZ2dsZURpc2FibGVkT25DaGFuZ2UoKSB7CiAgdmFyIGNoZWNrZWQgPSAkKHRoaXMpLmlzKCc6Y2hlY2tlZCcpOwogICQoJCh0aGlzKS5kYXRhKCdkaXNhYmxlcycpKS5hdHRyKCdkaXNhYmxlZCcsIGNoZWNrZWQpOwogICQoJCh0aGlzKS5kYXRhKCdlbmFibGVzJykpLmF0dHIoJ2Rpc2FibGVkJywgIWNoZWNrZWQpOwogICQoJCh0aGlzKS5kYXRhKCdzaG93cycpKS50b2dnbGUoY2hlY2tlZCk7Cn0KZnVuY3Rpb24gdG9nZ2xlRGlzYWJsZWRJbml0KCkgewogICQoJ2lucHV0W2RhdGEtZGlzYWJsZXNdLCBpbnB1dFtkYXRhLWVuYWJsZXNdLCBpbnB1dFtkYXRhLXNob3dzXScpLmVhY2godG9nZ2xlRGlzYWJsZWRPbkNoYW5nZSk7Cn0KZnVuY3Rpb24gdG9nZ2xlTXVsdGlTZWxlY3RJY29uSW5pdCgpIHsKICAkKCcudG9nZ2xlLW11bHRpc2VsZWN0Om5vdCguaWNvbi10b2dnbGUtbWludXMpLCAudG9nZ2xlLW11bHRpc2VsZWN0Om5vdCguaWNvbi10b2dnbGUtcGx1cyknKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICBpZiAoJCh0aGlzKS5zaWJsaW5ncygnc2VsZWN0JykuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykubGVuZ3RoID4gMSl7CiAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2ljb24tdG9nZ2xlLW1pbnVzJyk7CiAgICB9IGVsc2UgewogICAgICAkKHRoaXMpLmFkZENsYXNzKCdpY29uLXRvZ2dsZS1wbHVzJyk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIHRvZ2dsZU5ld09iamVjdERyb3Bkb3duKCkgewogIHZhciBkcm9wZG93biA9ICQoJyNuZXctb2JqZWN0ICsgdWwubWVudS1jaGlsZHJlbicpOwogIGlmKGRyb3Bkb3duLmhhc0NsYXNzKCd2aXNpYmxlJykpewogICAgZHJvcGRvd24ucmVtb3ZlQ2xhc3MoJ3Zpc2libGUnKTsKICB9ZWxzZXsKICAgIGRyb3Bkb3duLmFkZENsYXNzKCd2aXNpYmxlJyk7CiAgfQp9CgooZnVuY3Rpb24gKCAkICkgewoKICAvLyBkZXRlY3QgaWYgbmF0aXZlIGRhdGUgaW5wdXQgaXMgc3VwcG9ydGVkCiAgdmFyIG5hdGl2ZURhdGVJbnB1dFN1cHBvcnRlZCA9IHRydWU7CgogIHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7CiAgaW5wdXQuc2V0QXR0cmlidXRlKCd0eXBlJywnZGF0ZScpOwogIGlmIChpbnB1dC50eXBlID09PSAndGV4dCcpIHsKICAgIG5hdGl2ZURhdGVJbnB1dFN1cHBvcnRlZCA9IGZhbHNlOwogIH0KCiAgdmFyIG5vdEFEYXRlVmFsdWUgPSAnbm90LWEtZGF0ZSc7CiAgaW5wdXQuc2V0QXR0cmlidXRlKCd2YWx1ZScsIG5vdEFEYXRlVmFsdWUpOwogIGlmIChpbnB1dC52YWx1ZSA9PT0gbm90QURhdGVWYWx1ZSkgewogICAgbmF0aXZlRGF0ZUlucHV0U3VwcG9ydGVkID0gZmFsc2U7CiAgfQoKICAkLmZuLmRhdGVwaWNrZXJGYWxsYmFjayA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewogICAgaWYgKG5hdGl2ZURhdGVJbnB1dFN1cHBvcnRlZCkgewogICAgICByZXR1cm4gdGhpczsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0aGlzLmRhdGVwaWNrZXIoIG9wdGlvbnMgKTsKICAgIH0KICB9Owp9KCBqUXVlcnkgKSk7CgokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICQoJyNjb250ZW50Jykub24oJ2NoYW5nZScsICdpbnB1dFtkYXRhLWRpc2FibGVzXSwgaW5wdXRbZGF0YS1lbmFibGVzXSwgaW5wdXRbZGF0YS1zaG93c10nLCB0b2dnbGVEaXNhYmxlZE9uQ2hhbmdlKTsKICB0b2dnbGVEaXNhYmxlZEluaXQoKTsKCiAgJCgnI2NvbnRlbnQnKS5vbignY2xpY2snLCAnLnRvZ2dsZS1tdWx0aXNlbGVjdCcsIGZ1bmN0aW9uKCkgewogICAgdG9nZ2xlTXVsdGlTZWxlY3QoJCh0aGlzKS5zaWJsaW5ncygnc2VsZWN0JykpOwogICAgJCh0aGlzKS50b2dnbGVDbGFzcygnaWNvbi10b2dnbGUtcGx1cyBpY29uLXRvZ2dsZS1taW51cycpOwogIH0pOwogIHRvZ2dsZU11bHRpU2VsZWN0SWNvbkluaXQoKTsKCiAgJCgnI2hpc3RvcnkgLnRhYnMnKS5vbignY2xpY2snLCAnYScsIGZ1bmN0aW9uKGUpewogICAgdmFyIHRhYiA9ICQoZS50YXJnZXQpLmF0dHIoJ2lkJykucmVwbGFjZSgndGFiLScsJycpOwogICAgZG9jdW1lbnQuY29va2llID0gJ2hpc3RvcnlfbGFzdF90YWI9JyArIHRhYiArICc7IFNhbWVTaXRlPUxheCcKICB9KTsKfSk7CgokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICQoJyNjb250ZW50Jykub24oJ2NsaWNrJywgJ2Rpdi5qc3RUYWJzIGEudGFiLXByZXZpZXcnLCBmdW5jdGlvbihldmVudCl7CiAgICB2YXIgdGFiID0gJChldmVudC50YXJnZXQpOwoKICAgIHZhciB1cmwgPSB0YWIuZGF0YSgndXJsJyk7CiAgICB2YXIgZm9ybSA9IHRhYi5wYXJlbnRzKCdmb3JtJyk7CiAgICB2YXIganN0QmxvY2sgPSB0YWIucGFyZW50cygnLmpzdEJsb2NrJyk7CgogICAgdmFyIGVsZW1lbnQgPSBlbmNvZGVVUklDb21wb25lbnQoanN0QmxvY2suZmluZCgnLndpa2ktZWRpdCcpLnZhbCgpKTsKICAgIHZhciBhdHRhY2htZW50cyA9IGZvcm0uZmluZCgnLmF0dGFjaG1lbnRzX2ZpZWxkcyBpbnB1dCcpLnNlcmlhbGl6ZSgpOwoKICAgICQuYWpheCh7CiAgICAgIHVybDogdXJsLAogICAgICB0eXBlOiAncG9zdCcsCiAgICAgIGRhdGE6ICJ0ZXh0PSIgKyBlbGVtZW50ICsgJyYnICsgYXR0YWNobWVudHMsCiAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpewogICAgICAgIGpzdEJsb2NrLmZpbmQoJy53aWtpLXByZXZpZXcnKS5odG1sKGRhdGEpOwogICAgICAgIHNldHVwV2lraVRhYmxlU29ydGFibGVIZWFkZXIoKTsKICAgICAgfQogICAgfSk7CiAgfSk7Cn0pOwoKZnVuY3Rpb24ga2VlcEFuY2hvck9uU2lnbkluKGZvcm0pewogIHZhciBoYXNoID0gZGVjb2RlVVJJQ29tcG9uZW50KHNlbGYuZG9jdW1lbnQubG9jYXRpb24uaGFzaCk7CiAgaWYgKGhhc2gpIHsKICAgIGlmIChoYXNoLmluZGV4T2YoIiMiKSA9PT0gLTEpIHsKICAgICAgaGFzaCA9ICIjIiArIGhhc2g7CiAgICB9CiAgICBmb3JtLmFjdGlvbiA9IGZvcm0uYWN0aW9uICsgaGFzaDsKICB9CiAgcmV0dXJuIHRydWU7Cn0KCiQoZnVuY3Rpb24gKCQpIHsKICAkKCcjYXV0aF9zb3VyY2VfbGRhcF9tb2RlJykuY2hhbmdlKGZ1bmN0aW9uICgpIHsKICAgICQoJy5sZGFwc193YXJuaW5nJykudG9nZ2xlKCQodGhpcykudmFsKCkgIT0gJ2xkYXBzX3ZlcmlmeV9wZWVyJyk7CiAgfSkuY2hhbmdlKCk7Cn0pOwoKZnVuY3Rpb24gc2V0RmlsZWNvbnRlbnRDb250YWluZXJIZWlnaHQoKSB7CiAgdmFyICRmaWxlY29udGFpbmVyID0gJCgnLmZpbGVjb250ZW50LWNvbnRhaW5lcicpOwogIHZhciBmaWxlVHlwZVNlbGVjdG9ycyA9IFsnLmltYWdlJywgJ3ZpZGVvJ107CgogIGlmKCRmaWxlY29udGFpbmVyLmxlbmd0aCA+IDAgJiYgJGZpbGVjb250YWluZXIuZmluZChmaWxlVHlwZVNlbGVjdG9ycy5qb2luKCcsJykpLmxlbmd0aCA9PT0gMSkgewogICAgdmFyIGNvbnRhaW5lck9mZnNldFRvcCA9ICRmaWxlY29udGFpbmVyLm9mZnNldCgpLnRvcDsKICAgIHZhciBjb250YWluZXJNYXJnaW5Cb3R0b20gPSBwYXJzZUludCgkZmlsZWNvbnRhaW5lci5jc3MoJ21hcmdpbkJvdHRvbScpKTsKICAgIHZhciBwYWdpbmF0aW9uSGVpZ2h0ID0gJGZpbGVjb250YWluZXIubmV4dCgnLnBhZ2luYXRpb24nKS5oZWlnaHQoKTsKICAgIHZhciBkaWZmID0gY29udGFpbmVyT2Zmc2V0VG9wICsgY29udGFpbmVyTWFyZ2luQm90dG9tICsgcGFnaW5hdGlvbkhlaWdodDsKCiAgICAkZmlsZWNvbnRhaW5lci5jc3MoJ2hlaWdodCcsICdjYWxjKDEwMHZoIC0gJyArIGRpZmYgKyAncHgpJykKICB9Cn0KCmZ1bmN0aW9uIHNldHVwQXR0YWNobWVudERldGFpbCgpIHsKICBzZXRGaWxlY29udGVudENvbnRhaW5lckhlaWdodCgpOwogICQod2luZG93KS5yZXNpemUoc2V0RmlsZWNvbnRlbnRDb250YWluZXJIZWlnaHQpOwp9CgpmdW5jdGlvbiBzZXR1cFdpa2lUYWJsZVNvcnRhYmxlSGVhZGVyKCkgewogICQoJ2Rpdi53aWtpIHRhYmxlJykuZWFjaChmdW5jdGlvbihpLCB0YWJsZSl7CiAgICBpZiAodGFibGUucm93cy5sZW5ndGggPCAzKSByZXR1cm4gdHJ1ZTsKICAgIHZhciB0ciA9ICQodGFibGUucm93cykuZmlyc3QoKTsKICAgIGlmICh0ci5maW5kKCJUSCIpLmxlbmd0aCA+IDApIHsKICAgICAgdHIuYXR0cignZGF0YS1zb3J0LW1ldGhvZCcsICdub25lJyk7CiAgICAgIHRyLmZpbmQoIlREIikuYXR0cignZGF0YS1zb3J0LW1ldGhvZCcsICdub25lJyk7CiAgICAgIG5ldyBUYWJsZXNvcnQodGFibGUpOwogICAgfQogIH0pOwp9CgokKGZ1bmN0aW9uICgpIHsKICAkKCJbdGl0bGVdOm5vdCgubm8tdG9vbHRpcCkiKS50b29sdGlwKHsKICAgIHNob3c6IHsKICAgICAgZGVsYXk6IDQwMAogICAgfSwKICAgIHBvc2l0aW9uOiB7CiAgICAgIG15OiAiY2VudGVyIGJvdHRvbS01IiwKICAgICAgYXQ6ICJjZW50ZXIgdG9wIgogICAgfQogIH0pOwp9KTsKCmZ1bmN0aW9uIGlubGluZUF1dG9Db21wbGV0ZShlbGVtZW50KSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gZG8gbm90IGF0dGFjaCBpZiBUcmlidXRlIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQKICAgIGlmIChlbGVtZW50LmRhdGFzZXQudHJpYnV0ZSA9PT0gJ3RydWUnKSB7cmV0dXJufTsKCiAgICBjb25zdCBnZXREYXRhU291cmNlID0gZnVuY3Rpb24oZW50aXR5KSB7CiAgICAgIGNvbnN0IGRhdGFTb3VyY2VzID0gcm0uQXV0b0NvbXBsZXRlLmRhdGFTb3VyY2VzOwoKICAgICAgaWYgKGRhdGFTb3VyY2VzW2VudGl0eV0pIHsKICAgICAgICByZXR1cm4gZGF0YVNvdXJjZXNbZW50aXR5XTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KCiAgICBjb25zdCByZW1vdGVTZWFyY2ggPSBmdW5jdGlvbih1cmwsIGNiKSB7CiAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkKICAgICAgewogICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkgewogICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7CiAgICAgICAgICAgIGNiKGRhdGEpOwogICAgICAgICAgfSBlbHNlIGlmICh4aHIuc3RhdHVzID09PSA0MDMpIHsKICAgICAgICAgICAgY2IoW10pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfTsKICAgICAgeGhyLm9wZW4oIkdFVCIsIHVybCwgdHJ1ZSk7CiAgICAgIHhoci5zZW5kKCk7CiAgICB9OwoKICAgIGNvbnN0IHRyaWJ1dGUgPSBuZXcgVHJpYnV0ZSh7CiAgICAgIGNvbGxlY3Rpb246IFsKICAgICAgICB7CiAgICAgICAgICB0cmlnZ2VyOiAnIycsCiAgICAgICAgICB2YWx1ZXM6IGZ1bmN0aW9uICh0ZXh0LCBjYikgewogICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0LnR5cGUgPT09ICd0ZXh0JyAmJiAkKGVsZW1lbnQpLmF0dHIoJ2F1dG9jb21wbGV0ZScpICE9ICdvZmYnKSB7CiAgICAgICAgICAgICAgJChlbGVtZW50KS5hdHRyKCdhdXRvY29tcGxldGUnLCAnb2ZmJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVtb3RlU2VhcmNoKGdldERhdGFTb3VyY2UoJ2lzc3VlcycpICsgZW5jb2RlVVJJQ29tcG9uZW50KHRleHQpLCBmdW5jdGlvbiAoaXNzdWVzKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGNiKGlzc3Vlcyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIGxvb2t1cDogJ2xhYmVsJywKICAgICAgICAgIGZpbGxBdHRyOiAnbGFiZWwnLAogICAgICAgICAgcmVxdWlyZUxlYWRpbmdTcGFjZTogdHJ1ZSwKICAgICAgICAgIHNlbGVjdFRlbXBsYXRlOiBmdW5jdGlvbiAoaXNzdWUpIHsKICAgICAgICAgICAgbGV0IGxlYWRpbmdIYXNoID0gIiMiCiAgICAgICAgICAgIC8vIGtlZXAgIyMgc3ludGF4IHdoaWNoIGlzIGEgdmFsaWQgaXNzdWUgc3ludGF4IHRvIHNob3cgaXNzdWUgd2l0aCB0aXRsZS4KICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudE1lbnRpb25UZXh0U25hcHNob3QuY2hhckF0KDApID09PSAiIyIpIHsKICAgICAgICAgICAgICBsZWFkaW5nSGFzaCA9ICIjIyIKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbGVhZGluZ0hhc2ggKyBpc3N1ZS5vcmlnaW5hbC5pZDsKICAgICAgICAgIH0sCiAgICAgICAgICBtZW51SXRlbVRlbXBsYXRlOiBmdW5jdGlvbiAoaXNzdWUpIHsKICAgICAgICAgICAgcmV0dXJuIHNhbml0aXplSFRNTChpc3N1ZS5vcmlnaW5hbC5sYWJlbCk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICB0cmlnZ2VyOiAnW1snLAogICAgICAgICAgdmFsdWVzOiBmdW5jdGlvbiAodGV4dCwgY2IpIHsKICAgICAgICAgICAgcmVtb3RlU2VhcmNoKGdldERhdGFTb3VyY2UoJ3dpa2lfcGFnZXMnKSArIGVuY29kZVVSSUNvbXBvbmVudCh0ZXh0KSwgZnVuY3Rpb24gKHdpa2lQYWdlcykgewogICAgICAgICAgICAgIHJldHVybiBjYih3aWtpUGFnZXMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICBsb29rdXA6ICdsYWJlbCcsCiAgICAgICAgICBmaWxsQXR0cjogJ2xhYmVsJywKICAgICAgICAgIHJlcXVpcmVMZWFkaW5nU3BhY2U6IHRydWUsCiAgICAgICAgICBzZWxlY3RUZW1wbGF0ZTogZnVuY3Rpb24gKHdpa2lQYWdlKSB7CiAgICAgICAgICAgIHJldHVybiAnW1snICsgd2lraVBhZ2Uub3JpZ2luYWwudmFsdWUgKyAnXV0nOwogICAgICAgICAgfSwKICAgICAgICAgIG1lbnVJdGVtVGVtcGxhdGU6IGZ1bmN0aW9uICh3aWtpUGFnZSkgewogICAgICAgICAgICByZXR1cm4gc2FuaXRpemVIVE1MKHdpa2lQYWdlLm9yaWdpbmFsLmxhYmVsKTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIHRyaWdnZXI6ICdAJywKICAgICAgICAgIGxvb2t1cDogZnVuY3Rpb24gKHVzZXIsIG1lbnRpb25UZXh0KSB7CiAgICAgICAgICAgIHJldHVybiB1c2VyLm5hbWUgKyB1c2VyLmZpcnN0bmFtZSArIHVzZXIubGFzdG5hbWUgKyB1c2VyLmxvZ2luOwogICAgICAgICAgfSwKICAgICAgICAgIHZhbHVlczogZnVuY3Rpb24gKHRleHQsIGNiKSB7CiAgICAgICAgICAgIGNvbnN0IHVybCA9IGdldERhdGFTb3VyY2UoJ3VzZXJzJyk7CiAgICAgICAgICAgIGlmICh1cmwpIHsKICAgICAgICAgICAgICByZW1vdGVTZWFyY2godXJsICsgZW5jb2RlVVJJQ29tcG9uZW50KHRleHQpLCBmdW5jdGlvbiAodXNlcnMpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjYih1c2Vycyk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICBtZW51SXRlbVRlbXBsYXRlOiBmdW5jdGlvbiAodXNlcikgewogICAgICAgICAgICByZXR1cm4gdXNlci5vcmlnaW5hbC5uYW1lOwogICAgICAgICAgfSwKICAgICAgICAgIHNlbGVjdFRlbXBsYXRlOiBmdW5jdGlvbiAodXNlcikgewogICAgICAgICAgICByZXR1cm4gJ0AnICsgdXNlci5vcmlnaW5hbC5sb2dpbjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIF0sCiAgICAgIG5vTWF0Y2hUZW1wbGF0ZTogIiIKICAgIH0pOwoKICAgIHRyaWJ1dGUuYXR0YWNoKGVsZW1lbnQpOwp9CgoKJChkb2N1bWVudCkucmVhZHkoc2V0dXBBamF4SW5kaWNhdG9yKTsKJChkb2N1bWVudCkucmVhZHkoaGlkZU9uTG9hZCk7CiQoZG9jdW1lbnQpLnJlYWR5KGFkZEZvcm1PYnNlcnZlcnNGb3JEb3VibGVTdWJtaXQpOwokKGRvY3VtZW50KS5yZWFkeShkZWZhdWx0Rm9jdXMpOwokKGRvY3VtZW50KS5yZWFkeShzZXR1cEF0dGFjaG1lbnREZXRhaWwpOwokKGRvY3VtZW50KS5yZWFkeShzZXR1cFRhYnMpOwokKGRvY3VtZW50KS5yZWFkeShzZXR1cEZpbGVQcmV2aWV3TmF2aWdhdGlvbik7CiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwV2lraVRhYmxlU29ydGFibGVIZWFkZXIpOwokKGRvY3VtZW50KS5vbignZm9jdXMnLCAnW2RhdGEtYXV0by1jb21wbGV0ZT10cnVlXScsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgaW5saW5lQXV0b0NvbXBsZXRlKGV2ZW50LnRhcmdldCk7Cn0pOwo=" | |
| }, | |
| "attachments.js": { | |
| "hash": "4afd9cae5021cc34bad5a9c0ad6313e8", | |
| "path": "/usr/src/redmine/public/javascripts/attachments.js", | |
| "base64": "LyogUmVkbWluZSAtIHByb2plY3QgbWFuYWdlbWVudCBzb2Z0d2FyZQogICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAyMyAgSmVhbi1QaGlsaXBwZSBMYW5nICovCgpmdW5jdGlvbiBhZGRGaWxlKGlucHV0RWwsIGZpbGUsIGVhZ2VyVXBsb2FkKSB7CiAgdmFyIGF0dGFjaG1lbnRzRmllbGRzID0gJChpbnB1dEVsKS5jbG9zZXN0KCcuYXR0YWNobWVudHNfZm9ybScpLmZpbmQoJy5hdHRhY2htZW50c19maWVsZHMnKTsKICB2YXIgYWRkQXR0YWNobWVudCA9ICQoaW5wdXRFbCkuY2xvc2VzdCgnLmF0dGFjaG1lbnRzX2Zvcm0nKS5maW5kKCcuYWRkX2F0dGFjaG1lbnQnKTsKICB2YXIgbWF4RmlsZXMgPSAoJChpbnB1dEVsKS5hdHRyKCdtdWx0aXBsZScpID09ICdtdWx0aXBsZScgPyAxMCA6IDEpOwoKICBpZiAoYXR0YWNobWVudHNGaWVsZHMuY2hpbGRyZW4oKS5sZW5ndGggPCBtYXhGaWxlcykgewogICAgdmFyIGF0dGFjaG1lbnRJZCA9IGFkZEZpbGUubmV4dEF0dGFjaG1lbnRJZCsrOwogICAgdmFyIGZpbGVTcGFuID0gJCgnPHNwYW4+JywgeyBpZDogJ2F0dGFjaG1lbnRzXycgKyBhdHRhY2htZW50SWQgfSk7CiAgICB2YXIgcGFyYW0gPSAkKGlucHV0RWwpLmRhdGEoJ3BhcmFtJyk7CiAgICBpZiAoIXBhcmFtKSB7cGFyYW0gPSAnYXR0YWNobWVudHMnfTsKCiAgICBmaWxlU3Bhbi5hcHBlbmQoCiAgICAgICAgJCgnPGlucHV0PicsIHsgdHlwZTogJ3RleHQnLCAnY2xhc3MnOiAnaWNvbiBpY29uLWF0dGFjaG1lbnQgZmlsZW5hbWUgcmVhZG9ubHknLCBuYW1lOiBwYXJhbSArJ1snICsgYXR0YWNobWVudElkICsgJ11bZmlsZW5hbWVdJywgcmVhZG9ubHk6ICdyZWFkb25seSd9ICkudmFsKGZpbGUubmFtZSksCiAgICAgICAgJCgnPGlucHV0PicsIHsgdHlwZTogJ3RleHQnLCAnY2xhc3MnOiAnZGVzY3JpcHRpb24nLCBuYW1lOiBwYXJhbSArICdbJyArIGF0dGFjaG1lbnRJZCArICddW2Rlc2NyaXB0aW9uXScsIG1heGxlbmd0aDogMjU1LCBwbGFjZWhvbGRlcjogJChpbnB1dEVsKS5kYXRhKCdkZXNjcmlwdGlvbi1wbGFjZWhvbGRlcicpIH0gKS50b2dnbGUoIWVhZ2VyVXBsb2FkKSwKICAgICAgICAkKCc8aW5wdXQ+JywgeyB0eXBlOiAnaGlkZGVuJywgJ2NsYXNzJzogJ3Rva2VuJywgbmFtZTogcGFyYW0gKyAnWycgKyBhdHRhY2htZW50SWQgKyAnXVt0b2tlbl0nfSApLAogICAgICAgICQoJzxhPiZuYnNwPC9hPicpLmF0dHIoeyBocmVmOiAiIyIsICdjbGFzcyc6ICdpY29uLW9ubHkgaWNvbi1kZWwgcmVtb3ZlLXVwbG9hZCcgfSkuY2xpY2socmVtb3ZlRmlsZSkudG9nZ2xlKCFlYWdlclVwbG9hZCkKICAgICkuYXBwZW5kVG8oYXR0YWNobWVudHNGaWVsZHMpOwoKICAgIGlmICgkKGlucHV0RWwpLmRhdGEoJ2Rlc2NyaXB0aW9uJykgPT0gMCkgewogICAgICBmaWxlU3Bhbi5maW5kKCdpbnB1dC5kZXNjcmlwdGlvbicpLnJlbW92ZSgpOwogICAgfQoKICAgIGlmKGVhZ2VyVXBsb2FkKSB7CiAgICAgIGFqYXhVcGxvYWQoZmlsZSwgYXR0YWNobWVudElkLCBmaWxlU3BhbiwgaW5wdXRFbCk7CiAgICB9CgogICAgYWRkQXR0YWNobWVudC50b2dnbGUoYXR0YWNobWVudHNGaWVsZHMuY2hpbGRyZW4oKS5sZW5ndGggPCBtYXhGaWxlcyk7CiAgICByZXR1cm4gYXR0YWNobWVudElkOwogIH0KICByZXR1cm4gbnVsbDsKfQoKYWRkRmlsZS5uZXh0QXR0YWNobWVudElkID0gMTsKCmZ1bmN0aW9uIGFqYXhVcGxvYWQoZmlsZSwgYXR0YWNobWVudElkLCBmaWxlU3BhbiwgaW5wdXRFbCkgewoKICBmdW5jdGlvbiBvbkxvYWRzdGFydChlKSB7CiAgICBmaWxlU3Bhbi5yZW1vdmVDbGFzcygnYWpheC13YWl0aW5nJyk7CiAgICBmaWxlU3Bhbi5hZGRDbGFzcygnYWpheC1sb2FkaW5nJyk7CiAgICAkKCdpbnB1dDpzdWJtaXQnLCAkKHRoaXMpLnBhcmVudHMoJ2Zvcm0nKSkuYXR0cignZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTsKICB9CgogIGZ1bmN0aW9uIG9uUHJvZ3Jlc3MoZSkgewogICAgaWYoZS5sZW5ndGhDb21wdXRhYmxlKSB7CiAgICAgIHRoaXMucHJvZ3Jlc3NiYXIoICd2YWx1ZScsIGUubG9hZGVkICogMTAwIC8gZS50b3RhbCApOwogICAgfQogIH0KCiAgZnVuY3Rpb24gYWN0dWFsVXBsb2FkKGZpbGUsIGF0dGFjaG1lbnRJZCwgZmlsZVNwYW4sIGlucHV0RWwpIHsKCiAgICBhamF4VXBsb2FkLnVwbG9hZGluZysrOwoKICAgIHVwbG9hZEJsb2IoZmlsZSwgJChpbnB1dEVsKS5kYXRhKCd1cGxvYWQtcGF0aCcpLCBhdHRhY2htZW50SWQsIHsKICAgICAgICBsb2Fkc3RhcnRFdmVudEhhbmRsZXI6IG9uTG9hZHN0YXJ0LmJpbmQocHJvZ3Jlc3NTcGFuKSwKICAgICAgICBwcm9ncmVzc0V2ZW50SGFuZGxlcjogb25Qcm9ncmVzcy5iaW5kKHByb2dyZXNzU3BhbikKICAgICAgfSkKICAgICAgLmRvbmUoZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgYWRkSW5saW5lQXR0YWNobWVudE1hcmt1cChmaWxlKTsKICAgICAgICBwcm9ncmVzc1NwYW4ucHJvZ3Jlc3NiYXIoICd2YWx1ZScsIDEwMCApLnJlbW92ZSgpOwogICAgICAgIGZpbGVTcGFuLmZpbmQoJ2lucHV0LmRlc2NyaXB0aW9uLCBhJykuY3NzKCdkaXNwbGF5JywgJ2lubGluZS1ibG9jaycpOwogICAgICB9KQogICAgICAuZmFpbChmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICBwcm9ncmVzc1NwYW4udGV4dChyZXN1bHQuc3RhdHVzVGV4dCk7CiAgICAgIH0pLmFsd2F5cyhmdW5jdGlvbigpIHsKICAgICAgICBhamF4VXBsb2FkLnVwbG9hZGluZy0tOwogICAgICAgIGZpbGVTcGFuLnJlbW92ZUNsYXNzKCdhamF4LWxvYWRpbmcnKTsKICAgICAgICB2YXIgZm9ybSA9IGZpbGVTcGFuLnBhcmVudHMoJ2Zvcm0nKTsKICAgICAgICBpZiAoZm9ybS5xdWV1ZSgndXBsb2FkJykubGVuZ3RoID09IDAgJiYgYWpheFVwbG9hZC51cGxvYWRpbmcgPT0gMCkgewogICAgICAgICAgJCgnaW5wdXQ6c3VibWl0JywgZm9ybSkucmVtb3ZlQXR0cignZGlzYWJsZWQnKTsKICAgICAgICB9CiAgICAgICAgZm9ybS5kZXF1ZXVlKCd1cGxvYWQnKTsKICAgICAgfSk7CiAgfQoKICB2YXIgcHJvZ3Jlc3NTcGFuID0gJCgnPGRpdj4nKS5pbnNlcnRBZnRlcihmaWxlU3Bhbi5maW5kKCdpbnB1dC5maWxlbmFtZScpKTsKICBwcm9ncmVzc1NwYW4ucHJvZ3Jlc3NiYXIoKTsKICBmaWxlU3Bhbi5hZGRDbGFzcygnYWpheC13YWl0aW5nJyk7CgogIHZhciBtYXhTeW5jVXBsb2FkID0gJChpbnB1dEVsKS5kYXRhKCdtYXgtY29uY3VycmVudC11cGxvYWRzJyk7CgogIGlmKG1heFN5bmNVcGxvYWQgPT0gbnVsbCB8fCBtYXhTeW5jVXBsb2FkIDw9IDAgfHwgYWpheFVwbG9hZC51cGxvYWRpbmcgPCBtYXhTeW5jVXBsb2FkKQogICAgYWN0dWFsVXBsb2FkKGZpbGUsIGF0dGFjaG1lbnRJZCwgZmlsZVNwYW4sIGlucHV0RWwpOwogIGVsc2UKICAgICQoaW5wdXRFbCkucGFyZW50cygnZm9ybScpLnF1ZXVlKCd1cGxvYWQnLCBhY3R1YWxVcGxvYWQuYmluZCh0aGlzLCBmaWxlLCBhdHRhY2htZW50SWQsIGZpbGVTcGFuLCBpbnB1dEVsKSk7Cn0KCmFqYXhVcGxvYWQudXBsb2FkaW5nID0gMDsKCmZ1bmN0aW9uIHJlbW92ZUZpbGUoKSB7CiAgJCh0aGlzKS5jbG9zZXN0KCcuYXR0YWNobWVudHNfZm9ybScpLmZpbmQoJy5hZGRfYXR0YWNobWVudCcpLnNob3coKTsKICAkKHRoaXMpLnBhcmVudCgnc3BhbicpLnJlbW92ZSgpOwogIHJldHVybiBmYWxzZTsKfQoKZnVuY3Rpb24gdXBsb2FkQmxvYihibG9iLCB1cGxvYWRVcmwsIGF0dGFjaG1lbnRJZCwgb3B0aW9ucykgewoKICB2YXIgYWN0dWFsT3B0aW9ucyA9ICQuZXh0ZW5kKHsKICAgIGxvYWRzdGFydEV2ZW50SGFuZGxlcjogJC5ub29wLAogICAgcHJvZ3Jlc3NFdmVudEhhbmRsZXI6ICQubm9vcAogIH0sIG9wdGlvbnMpOwoKICB1cGxvYWRVcmwgPSB1cGxvYWRVcmwgKyAnP2F0dGFjaG1lbnRfaWQ9JyArIGF0dGFjaG1lbnRJZDsKICBpZiAoYmxvYiBpbnN0YW5jZW9mIHdpbmRvdy5CbG9iKSB7CiAgICB1cGxvYWRVcmwgKz0gJyZmaWxlbmFtZT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGJsb2IubmFtZSk7CiAgICB1cGxvYWRVcmwgKz0gJyZjb250ZW50X3R5cGU9JyArIGVuY29kZVVSSUNvbXBvbmVudChibG9iLnR5cGUpOwogIH0KCiAgcmV0dXJuICQuYWpheCh1cGxvYWRVcmwsIHsKICAgIHR5cGU6ICdQT1NUJywKICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgIGJlZm9yZVNlbmQ6IGZ1bmN0aW9uKGpxWGhyLCBzZXR0aW5ncykgewogICAgICBqcVhoci5zZXRSZXF1ZXN0SGVhZGVyKCdBY2NlcHQnLCAnYXBwbGljYXRpb24vanMnKTsKICAgICAgLy8gYXR0YWNoIHByb3BlciBGaWxlIG9iamVjdAogICAgICBzZXR0aW5ncy5kYXRhID0gYmxvYjsKICAgIH0sCiAgICB4aHI6IGZ1bmN0aW9uKCkgewogICAgICB2YXIgeGhyID0gJC5hamF4U2V0dGluZ3MueGhyKCk7CiAgICAgIHhoci51cGxvYWQub25sb2Fkc3RhcnQgPSBhY3R1YWxPcHRpb25zLmxvYWRzdGFydEV2ZW50SGFuZGxlcjsKICAgICAgeGhyLnVwbG9hZC5vbnByb2dyZXNzID0gYWN0dWFsT3B0aW9ucy5wcm9ncmVzc0V2ZW50SGFuZGxlcjsKICAgICAgcmV0dXJuIHhocjsKICAgIH0sCiAgICBkYXRhOiBibG9iLAogICAgY2FjaGU6IGZhbHNlLAogICAgcHJvY2Vzc0RhdGE6IGZhbHNlCiAgfSk7Cn0KCmZ1bmN0aW9uIGFkZElucHV0RmlsZXMoaW5wdXRFbCkgewogIHZhciBhdHRhY2htZW50c0ZpZWxkcyA9ICQoaW5wdXRFbCkuY2xvc2VzdCgnLmF0dGFjaG1lbnRzX2Zvcm0nKS5maW5kKCcuYXR0YWNobWVudHNfZmllbGRzJyk7CiAgdmFyIGFkZEF0dGFjaG1lbnQgPSAkKGlucHV0RWwpLmNsb3Nlc3QoJy5hdHRhY2htZW50c19mb3JtJykuZmluZCgnLmFkZF9hdHRhY2htZW50Jyk7CiAgdmFyIGNsZWFyZWRGaWxlSW5wdXQgPSAkKGlucHV0RWwpLmNsb25lKCkudmFsKCcnKTsKICB2YXIgc2l6ZUV4Y2VlZGVkID0gZmFsc2U7CiAgdmFyIHBhcmFtID0gJChpbnB1dEVsKS5kYXRhKCdwYXJhbScpOwogIGlmICghcGFyYW0pIHtwYXJhbSA9ICdhdHRhY2htZW50cyd9OwoKICBpZiAoJC5hamF4U2V0dGluZ3MueGhyKCkudXBsb2FkICYmIGlucHV0RWwuZmlsZXMpIHsKICAgIC8vIHVwbG9hZCBmaWxlcyB1c2luZyBhamF4CiAgICBzaXplRXhjZWVkZWQgPSB1cGxvYWRBbmRBdHRhY2hGaWxlcyhpbnB1dEVsLmZpbGVzLCBpbnB1dEVsKTsKICAgICQoaW5wdXRFbCkucmVtb3ZlKCk7CiAgfSBlbHNlIHsKICAgIC8vIGJyb3dzZXIgbm90IHN1cHBvcnRpbmcgdGhlIGZpbGUgQVBJLCB1cGxvYWQgb24gZm9ybSBzdWJtaXNzaW9uCiAgICB2YXIgYXR0YWNobWVudElkOwogICAgdmFyIGFGaWxlbmFtZSA9IGlucHV0RWwudmFsdWUuc3BsaXQoL1wvfFxcLyk7CiAgICBhdHRhY2htZW50SWQgPSBhZGRGaWxlKGlucHV0RWwsIHsgbmFtZTogYUZpbGVuYW1lWyBhRmlsZW5hbWUubGVuZ3RoIC0gMSBdIH0sIGZhbHNlKTsKICAgIGlmIChhdHRhY2htZW50SWQpIHsKICAgICAgJChpbnB1dEVsKS5hdHRyKHsgbmFtZTogcGFyYW0gKyAnWycgKyBhdHRhY2htZW50SWQgKyAnXVtmaWxlXScsIHN0eWxlOiAnZGlzcGxheTpub25lOycgfSkuYXBwZW5kVG8oJyNhdHRhY2htZW50c18nICsgYXR0YWNobWVudElkKTsKICAgIH0KICB9CgogIGNsZWFyZWRGaWxlSW5wdXQucHJlcGVuZFRvKGFkZEF0dGFjaG1lbnQpOwp9CgpmdW5jdGlvbiB1cGxvYWRBbmRBdHRhY2hGaWxlcyhmaWxlcywgaW5wdXRFbCkgewoKICB2YXIgbWF4RmlsZVNpemUgPSAkKGlucHV0RWwpLmRhdGEoJ21heC1maWxlLXNpemUnKTsKICB2YXIgbWF4RmlsZVNpemVFeGNlZWRlZCA9ICQoaW5wdXRFbCkuZGF0YSgnbWF4LWZpbGUtc2l6ZS1tZXNzYWdlJyk7CgogIHZhciBzaXplRXhjZWVkZWQgPSBmYWxzZTsKICB2YXIgZmlsZXNMZW5ndGggPSAkKGlucHV0RWwpLmNsb3Nlc3QoJy5hdHRhY2htZW50c19mb3JtJykuZmluZCgnLmF0dGFjaG1lbnRzX2ZpZWxkcycpLmNoaWxkcmVuKCkubGVuZ3RoICsgZmlsZXMubGVuZ3RoCiAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLnNpemUgJiYgbWF4RmlsZVNpemUgIT0gbnVsbCAmJiB0aGlzLnNpemUgPiBwYXJzZUludChtYXhGaWxlU2l6ZSkpIHtzaXplRXhjZWVkZWQ9dHJ1ZTt9CiAgfSk7CiAgaWYgKHNpemVFeGNlZWRlZCkgewogICAgd2luZG93LmFsZXJ0KG1heEZpbGVTaXplRXhjZWVkZWQpOwogIH0gZWxzZSB7CiAgICAkLmVhY2goZmlsZXMsIGZ1bmN0aW9uKCkge2FkZEZpbGUoaW5wdXRFbCwgdGhpcywgdHJ1ZSk7fSk7CiAgfQoKICBpZiAoZmlsZXNMZW5ndGggPiAoJChpbnB1dEVsKS5hdHRyKCdtdWx0aXBsZScpID09ICdtdWx0aXBsZScgPyAxMCA6IDEpKSB7CiAgICB3aW5kb3cuYWxlcnQoJChpbnB1dEVsKS5kYXRhKCdtYXgtbnVtYmVyLW9mLWZpbGVzLW1lc3NhZ2UnKSk7CiAgfQogIHJldHVybiBzaXplRXhjZWVkZWQ7Cn0KCmZ1bmN0aW9uIGhhbmRsZUZpbGVEcm9wRXZlbnQoZSkgewoKICAkKHRoaXMpLnJlbW92ZUNsYXNzKCdmaWxlb3ZlcicpOwogIGJsb2NrRXZlbnRQcm9wYWdhdGlvbihlKTsKCiAgaWYgKCQuaW5BcnJheSgnRmlsZXMnLCBlLmRhdGFUcmFuc2Zlci50eXBlcykgPiAtMSkgewogICAgaGFuZGxlRmlsZURyb3BFdmVudC50YXJnZXQgPSBlLnRhcmdldDsKICAgIGlmICgkKHRoaXMpLmhhc0NsYXNzKCdjdXN0b20tZmllbGQtZmlsZWRyb3BsaXN0bmVyJykpewogICAgICB1cGxvYWRBbmRBdHRhY2hGaWxlcyhlLmRhdGFUcmFuc2Zlci5maWxlcywgJCh0aGlzKS5maW5kKCdpbnB1dDpmaWxlLmN1c3RvbS1maWVsZC1maWxlZHJvcCcpLmZpcnN0KCkpOwogICAgfSBlbHNlIHsKICAgICAgdXBsb2FkQW5kQXR0YWNoRmlsZXMoZS5kYXRhVHJhbnNmZXIuZmlsZXMsICQodGhpcykuZmluZCgnaW5wdXQ6ZmlsZS5maWxlZHJvcCcpLmZpcnN0KCkpOwogICAgfQogIH0KfQpoYW5kbGVGaWxlRHJvcEV2ZW50LnRhcmdldCA9ICcnOwoKZnVuY3Rpb24gZHJhZ092ZXJIYW5kbGVyKGUpIHsKICAkKHRoaXMpLmFkZENsYXNzKCdmaWxlb3ZlcicpOwogIGJsb2NrRXZlbnRQcm9wYWdhdGlvbihlKTsKICBlLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ2NvcHknOwp9CgpmdW5jdGlvbiBkcmFnT3V0SGFuZGxlcihlKSB7CiAgJCh0aGlzKS5yZW1vdmVDbGFzcygnZmlsZW92ZXInKTsKICBibG9ja0V2ZW50UHJvcGFnYXRpb24oZSk7Cn0KCmZ1bmN0aW9uIHNldHVwRmlsZURyb3AoKSB7CiAgaWYgKHdpbmRvdy5GaWxlICYmIHdpbmRvdy5GaWxlTGlzdCAmJiB3aW5kb3cuUHJvZ3Jlc3NFdmVudCAmJiB3aW5kb3cuRm9ybURhdGEpIHsKCiAgICAkLmV2ZW50LmFkZFByb3AoJ2RhdGFUcmFuc2ZlcicpOwoKICAgICQoJ2Zvcm0gZGl2LmJveDpub3QoLmZpbGVkcm9wbGlzdG5lciknKS5oYXMoJ2lucHV0OmZpbGUuZmlsZWRyb3AnKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAkKHRoaXMpLm9uKHsKICAgICAgICAgIGRyYWdvdmVyOiBkcmFnT3ZlckhhbmRsZXIsCiAgICAgICAgICBkcmFnbGVhdmU6IGRyYWdPdXRIYW5kbGVyLAogICAgICAgICAgZHJvcDogaGFuZGxlRmlsZURyb3BFdmVudCwKICAgICAgICAgIHBhc3RlOiBjb3B5SW1hZ2VGcm9tQ2xpcGJvYXJkCiAgICAgIH0pLmFkZENsYXNzKCdmaWxlZHJvcGxpc3RuZXInKTsKICAgIH0pOwoKICAgICQoJ2Zvcm0gZGl2LmJveCBpbnB1dDpmaWxlLmN1c3RvbS1maWVsZC1maWxlZHJvcCcpLmNsb3Nlc3QoJ3AnKS5ub3QoJy5jdXN0b20tZmllbGQtZmlsZWRyb3BsaXN0bmVyJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgJCh0aGlzKS5vbih7CiAgICAgICAgICBkcmFnb3ZlcjogZHJhZ092ZXJIYW5kbGVyLAogICAgICAgICAgZHJhZ2xlYXZlOiBkcmFnT3V0SGFuZGxlciwKICAgICAgICAgIGRyb3A6IGhhbmRsZUZpbGVEcm9wRXZlbnQKICAgICAgfSkuYWRkQ2xhc3MoJ2N1c3RvbS1maWVsZC1maWxlZHJvcGxpc3RuZXInKTsKICAgIH0pOwogIH0KfQoKZnVuY3Rpb24gYWRkSW5saW5lQXR0YWNobWVudE1hcmt1cChmaWxlKSB7CiAgLy8gaW5zZXJ0IHVwbG9hZGVkIGltYWdlIGlubGluZSBpZiBkcm9wcGVkIGFyZWEgaXMgY3VycmVudGx5IGZvY3VzZWQgdGV4dGFyZWEKICBpZigkKGhhbmRsZUZpbGVEcm9wRXZlbnQudGFyZ2V0KS5oYXNDbGFzcygnd2lraS1lZGl0JykgJiYgJC5pbkFycmF5KGZpbGUudHlwZSwgd2luZG93Lndpa2lJbWFnZU1pbWVUeXBlcykgPiAtMSkgewogICAgdmFyICR0ZXh0YXJlYSA9ICQoaGFuZGxlRmlsZURyb3BFdmVudC50YXJnZXQpOwogICAgdmFyIGN1cnNvclBvc2l0aW9uID0gJHRleHRhcmVhLnByb3AoJ3NlbGVjdGlvblN0YXJ0Jyk7CiAgICB2YXIgZGVzY3JpcHRpb24gPSAkdGV4dGFyZWEudmFsKCk7CiAgICB2YXIgc2FuaXRpemVkRmlsZW5hbWUgPSBmaWxlLm5hbWUucmVwbGFjZSgvW1wvXD9cJVwqXDpcfFwiXCc8PlxuXHJdKy8sICdfJyk7CiAgICB2YXIgaW5saW5lRmlsZW5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQoc2FuaXRpemVkRmlsZW5hbWUpCiAgICAgIC5yZXBsYWNlKC9bISgpXS9nLCBmdW5jdGlvbihtYXRjaCkgeyByZXR1cm4gIiUiICsgbWF0Y2guY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikgfSk7CiAgICB2YXIgbmV3TGluZUJlZm9yZSA9IHRydWU7CiAgICB2YXIgbmV3TGluZUFmdGVyID0gdHJ1ZTsKICAgIGlmKGN1cnNvclBvc2l0aW9uID09PSAwIHx8IGRlc2NyaXB0aW9uLnN1YnN0cihjdXJzb3JQb3NpdGlvbi0xLDEpLm1hdGNoKC9ccnxcbi8pKSB7CiAgICAgIG5ld0xpbmVCZWZvcmUgPSBmYWxzZTsKICAgIH0KICAgIGlmKGRlc2NyaXB0aW9uLnN1YnN0cihjdXJzb3JQb3NpdGlvbiwxKS5tYXRjaCgvXHJ8XG4vKSkgewogICAgICBuZXdMaW5lQWZ0ZXIgPSBmYWxzZTsKICAgIH0KCiAgICAkdGV4dGFyZWEudmFsKAogICAgICBkZXNjcmlwdGlvbi5zdWJzdHJpbmcoMCwgY3Vyc29yUG9zaXRpb24pCiAgICAgICsgKG5ld0xpbmVCZWZvcmUgPyAnXG4nIDogJycpCiAgICAgICsgaW5saW5lRmlsZW5hbWUKICAgICAgKyAobmV3TGluZUFmdGVyID8gJ1xuJyA6ICcnKQogICAgICArIGRlc2NyaXB0aW9uLnN1YnN0cmluZyhjdXJzb3JQb3NpdGlvbiwgZGVzY3JpcHRpb24ubGVuZ3RoKQogICAgKTsKCiAgICAkdGV4dGFyZWEucHJvcCh7CiAgICAgICdzZWxlY3Rpb25TdGFydCc6IGN1cnNvclBvc2l0aW9uICsgbmV3TGluZUJlZm9yZSwKICAgICAgJ3NlbGVjdGlvbkVuZCc6IGN1cnNvclBvc2l0aW9uICsgaW5saW5lRmlsZW5hbWUubGVuZ3RoICsgbmV3TGluZUJlZm9yZQogICAgfSk7CiAgICAkdGV4dGFyZWEucGFyZW50cygnLmpzdEJsb2NrJykKICAgICAgLmZpbmQoJy5qc3RiX2ltZycpLmNsaWNrKCk7CgogICAgLy8gbW92ZSBjdXJzb3IgaW50byBuZXh0IGxpbmUKICAgIGN1cnNvclBvc2l0aW9uID0gJHRleHRhcmVhLnByb3AoJ3NlbGVjdGlvblN0YXJ0Jyk7CiAgICAkdGV4dGFyZWEucHJvcCh7CiAgICAgICdzZWxlY3Rpb25TdGFydCc6IGN1cnNvclBvc2l0aW9uICsgMSwKICAgICAgJ3NlbGVjdGlvbkVuZCc6IGN1cnNvclBvc2l0aW9uICsgMQogICAgfSk7CgogIH0KfQoKZnVuY3Rpb24gY29weUltYWdlRnJvbUNsaXBib2FyZChlKSB7CiAgaWYgKCEkKGUudGFyZ2V0KS5oYXNDbGFzcygnd2lraS1lZGl0JykpIHsgcmV0dXJuOyB9CiAgdmFyIGNsaXBib2FyZERhdGEgPSBlLmNsaXBib2FyZERhdGEgfHwgZS5vcmlnaW5hbEV2ZW50LmNsaXBib2FyZERhdGEKICBpZiAoIWNsaXBib2FyZERhdGEpIHsgcmV0dXJuOyB9CiAgaWYgKGNsaXBib2FyZERhdGEudHlwZXMuc29tZShmdW5jdGlvbih0KXsgcmV0dXJuIC9edGV4dFwvcGxhaW4kLy50ZXN0KHQpOyB9KSkgeyByZXR1cm47IH0KCiAgdmFyIGZpbGVzID0gY2xpcGJvYXJkRGF0YS5maWxlcwogIGZvciAodmFyIGkgPSAwIDsgaSA8IGZpbGVzLmxlbmd0aCA7IGkrKykgewogICAgdmFyIGZpbGUgPSBmaWxlc1tpXTsKICAgIGlmIChmaWxlLnR5cGUuaW5kZXhPZigiaW1hZ2UiKSAhPSAtMSkgewogICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKCk7CiAgICAgIHZhciBmaWxlbmFtZSA9ICdjbGlwYm9hcmQtJwogICAgICAgICsgZGF0ZS5nZXRGdWxsWWVhcigpCiAgICAgICAgKyAoJzAnKyhkYXRlLmdldE1vbnRoKCkrMSkpLnNsaWNlKC0yKQogICAgICAgICsgKCcwJytkYXRlLmdldERhdGUoKSkuc2xpY2UoLTIpCiAgICAgICAgKyAoJzAnK2RhdGUuZ2V0SG91cnMoKSkuc2xpY2UoLTIpCiAgICAgICAgKyAoJzAnK2RhdGUuZ2V0TWludXRlcygpKS5zbGljZSgtMikKICAgICAgICArICctJyArIHJhbmRvbUtleSg1KS50b0xvY2FsZUxvd2VyQ2FzZSgpCiAgICAgICAgKyAnLicgKyBmaWxlLm5hbWUuc3BsaXQoJy4nKS5wb3AoKTsKCiAgICAgIC8vIGdldCBpbnB1dCBmaWxlIGluIHRoZSBjbG9zZXN0IGZvcm0KICAgICAgdmFyIGlucHV0RWwgPSAkKHRoaXMpLmNsb3Nlc3QoImZvcm0iKS5maW5kKCdpbnB1dDpmaWxlLmZpbGVkcm9wJyk7CiAgICAgIGhhbmRsZUZpbGVEcm9wRXZlbnQudGFyZ2V0ID0gZS50YXJnZXQ7CiAgICAgIGFkZEZpbGUoaW5wdXRFbCwgbmV3IEZpbGUoW2ZpbGVdLCBmaWxlbmFtZSwgeyB0eXBlOiBmaWxlLnR5cGUgfSksIHRydWUpOwogICAgfQogIH0KfQoKJChkb2N1bWVudCkucmVhZHkoc2V0dXBGaWxlRHJvcCk7CiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCl7CiAgJCgiaW5wdXQuZGVsZXRlZF9hdHRhY2htZW50IikuY2hhbmdlKGZ1bmN0aW9uKCl7CiAgICAkKHRoaXMpLnBhcmVudHMoJy5leGlzdGluZy1hdHRhY2htZW50JykudG9nZ2xlQ2xhc3MoJ2RlbGV0ZWQnLCAkKHRoaXMpLmlzKCI6Y2hlY2tlZCIpKTsKICB9KS5jaGFuZ2UoKTsKfSk7Cg==" | |
| } | |
| }, | |
| "5.0.8": { | |
| "application.js": { | |
| "hash": "fd4f20b096e2e6cc46cfc29518146ccd", | |
| "path": "/usr/src/redmine/public/javascripts/application.js", | |
| "base64": "LyogUmVkbWluZSAtIHByb2plY3QgbWFuYWdlbWVudCBzb2Z0d2FyZQogICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAyMyAgSmVhbi1QaGlsaXBwZSBMYW5nICovCgpmdW5jdGlvbiBzYW5pdGl6ZUhUTUwoc3RyaW5nKSB7CiAgdmFyIHRlbXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CiAgdGVtcC50ZXh0Q29udGVudCA9IHN0cmluZzsKICByZXR1cm4gdGVtcC5pbm5lckhUTUw7Cn0KCmZ1bmN0aW9uIGNoZWNrQWxsKGlkLCBjaGVja2VkKSB7CiAgJCgnIycraWQpLmZpbmQoJ2lucHV0W3R5cGU9Y2hlY2tib3hdOmVuYWJsZWQnKS5wcm9wKCdjaGVja2VkJywgY2hlY2tlZCk7Cn0KCmZ1bmN0aW9uIHRvZ2dsZUNoZWNrYm94ZXNCeVNlbGVjdG9yKHNlbGVjdG9yKSB7CiAgdmFyIGFsbF9jaGVja2VkID0gdHJ1ZTsKICAkKHNlbGVjdG9yKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICBpZiAoISQodGhpcykuaXMoJzpjaGVja2VkJykpIHsgYWxsX2NoZWNrZWQgPSBmYWxzZTsgfQogIH0pOwogICQoc2VsZWN0b3IpLnByb3AoJ2NoZWNrZWQnLCAhYWxsX2NoZWNrZWQpLnRyaWdnZXIoJ2NoYW5nZScpOwp9CgpmdW5jdGlvbiBzaG93QW5kU2Nyb2xsVG8oaWQsIGZvY3VzKSB7CiAgJCgnIycraWQpLnNob3coKTsKICBpZiAoZm9jdXMgIT09IG51bGwpIHsKICAgICQoJyMnK2ZvY3VzKS5mb2N1cygpOwogIH0KICAkKCdodG1sLCBib2R5JykuYW5pbWF0ZSh7c2Nyb2xsVG9wOiAkKCcjJytpZCkub2Zmc2V0KCkudG9wfSwgMTAwKTsKfQoKZnVuY3Rpb24gdG9nZ2xlUm93R3JvdXAoZWwpIHsKICB2YXIgdHIgPSAkKGVsKS5wYXJlbnRzKCd0cicpLmZpcnN0KCk7CiAgdmFyIG4gPSB0ci5uZXh0KCk7CiAgdHIudG9nZ2xlQ2xhc3MoJ29wZW4nKTsKICAkKGVsKS50b2dnbGVDbGFzcygnaWNvbi1leHBhbmRlZCBpY29uLWNvbGxhcHNlZCcpOwogIHdoaWxlIChuLmxlbmd0aCAmJiAhbi5oYXNDbGFzcygnZ3JvdXAnKSkgewogICAgbi50b2dnbGUoKTsKICAgIG4gPSBuLm5leHQoJ3RyJyk7CiAgfQp9CgpmdW5jdGlvbiBjb2xsYXBzZUFsbFJvd0dyb3VwcyhlbCkgewogIHZhciB0Ym9keSA9ICQoZWwpLnBhcmVudHMoJ3Rib2R5JykuZmlyc3QoKTsKICB0Ym9keS5jaGlsZHJlbigndHInKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnZ3JvdXAnKSkgewogICAgICAkKHRoaXMpLnJlbW92ZUNsYXNzKCdvcGVuJyk7CiAgICAgICQodGhpcykuZmluZCgnLmV4cGFuZGVyJykuc3dpdGNoQ2xhc3MoJ2ljb24tZXhwYW5kZWQnLCAnaWNvbi1jb2xsYXBzZWQnKTsKICAgIH0gZWxzZSB7CiAgICAgICQodGhpcykuaGlkZSgpOwogICAgfQogIH0pOwp9CgpmdW5jdGlvbiBleHBhbmRBbGxSb3dHcm91cHMoZWwpIHsKICB2YXIgdGJvZHkgPSAkKGVsKS5wYXJlbnRzKCd0Ym9keScpLmZpcnN0KCk7CiAgdGJvZHkuY2hpbGRyZW4oJ3RyJykuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ2dyb3VwJykpIHsKICAgICAgJCh0aGlzKS5hZGRDbGFzcygnb3BlbicpOwogICAgICAkKHRoaXMpLmZpbmQoJy5leHBhbmRlcicpLnN3aXRjaENsYXNzKCdpY29uLWNvbGxhcHNlZCcsICdpY29uLWV4cGFuZGVkJyk7CiAgICB9IGVsc2UgewogICAgICAkKHRoaXMpLnNob3coKTsKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gdG9nZ2xlQWxsUm93R3JvdXBzKGVsKSB7CiAgdmFyIHRyID0gJChlbCkucGFyZW50cygndHInKS5maXJzdCgpOwogIGlmICh0ci5oYXNDbGFzcygnb3BlbicpKSB7CiAgICBjb2xsYXBzZUFsbFJvd0dyb3VwcyhlbCk7CiAgfSBlbHNlIHsKICAgIGV4cGFuZEFsbFJvd0dyb3VwcyhlbCk7CiAgfQp9CgpmdW5jdGlvbiB0b2dnbGVGaWVsZHNldChlbCkgewogIHZhciBmaWVsZHNldCA9ICQoZWwpLnBhcmVudHMoJ2ZpZWxkc2V0JykuZmlyc3QoKTsKICBmaWVsZHNldC50b2dnbGVDbGFzcygnY29sbGFwc2VkJyk7CiAgZmllbGRzZXQuY2hpbGRyZW4oJ2xlZ2VuZCcpLnRvZ2dsZUNsYXNzKCdpY29uLWV4cGFuZGVkIGljb24tY29sbGFwc2VkJyk7CiAgZmllbGRzZXQuY2hpbGRyZW4oJ2RpdicpLnRvZ2dsZSgpOwp9CgpmdW5jdGlvbiBoaWRlRmllbGRzZXQoZWwpIHsKICB2YXIgZmllbGRzZXQgPSAkKGVsKS5wYXJlbnRzKCdmaWVsZHNldCcpLmZpcnN0KCk7CiAgZmllbGRzZXQudG9nZ2xlQ2xhc3MoJ2NvbGxhcHNlZCcpOwogIGZpZWxkc2V0LmNoaWxkcmVuKCdkaXYnKS5oaWRlKCk7Cn0KCi8vIGNvbHVtbnMgc2VsZWN0aW9uCmZ1bmN0aW9uIG1vdmVPcHRpb25zKHRoZVNlbEZyb20sIHRoZVNlbFRvKSB7CiAgJCh0aGVTZWxGcm9tKS5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS5kZXRhY2goKS5wcm9wKCJzZWxlY3RlZCIsIGZhbHNlKS5hcHBlbmRUbygkKHRoZVNlbFRvKSk7Cn0KCmZ1bmN0aW9uIG1vdmVPcHRpb25VcCh0aGVTZWwpIHsKICAkKHRoZVNlbCkuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykuZWFjaChmdW5jdGlvbigpewogICAgJCh0aGlzKS5wcmV2KCc6bm90KDpzZWxlY3RlZCknKS5kZXRhY2goKS5pbnNlcnRBZnRlcigkKHRoaXMpKTsKICB9KTsKfQoKZnVuY3Rpb24gbW92ZU9wdGlvblRvcCh0aGVTZWwpIHsKICAkKHRoZVNlbCkuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykuZGV0YWNoKCkucHJlcGVuZFRvKCQodGhlU2VsKSk7Cn0KCmZ1bmN0aW9uIG1vdmVPcHRpb25Eb3duKHRoZVNlbCkgewogICQoJCh0aGVTZWwpLmZpbmQoJ29wdGlvbjpzZWxlY3RlZCcpLmdldCgpLnJldmVyc2UoKSkuZWFjaChmdW5jdGlvbigpewogICAgJCh0aGlzKS5uZXh0KCc6bm90KDpzZWxlY3RlZCknKS5kZXRhY2goKS5pbnNlcnRCZWZvcmUoJCh0aGlzKSk7CiAgfSk7Cn0KCmZ1bmN0aW9uIG1vdmVPcHRpb25Cb3R0b20odGhlU2VsKSB7CiAgJCh0aGVTZWwpLmZpbmQoJ29wdGlvbjpzZWxlY3RlZCcpLmRldGFjaCgpLmFwcGVuZFRvKCQodGhlU2VsKSk7Cn0KCmZ1bmN0aW9uIGluaXRGaWx0ZXJzKCkgewogICQoJyNhZGRfZmlsdGVyX3NlbGVjdCcpLmNoYW5nZShmdW5jdGlvbigpIHsKICAgIGFkZEZpbHRlcigkKHRoaXMpLnZhbCgpLCAnJywgW10pOwogIH0pOwogICQoJyNmaWx0ZXJzLXRhYmxlIHRkLmZpZWxkIGlucHV0W3R5cGU9Y2hlY2tib3hdJykuZWFjaChmdW5jdGlvbigpIHsKICAgIHRvZ2dsZUZpbHRlcigkKHRoaXMpLnZhbCgpKTsKICB9KTsKICAkKCcjZmlsdGVycy10YWJsZScpLm9uKCdjbGljaycsICd0ZC5maWVsZCBpbnB1dFt0eXBlPWNoZWNrYm94XScsIGZ1bmN0aW9uKCkgewogICAgdG9nZ2xlRmlsdGVyKCQodGhpcykudmFsKCkpOwogIH0pOwogICQoJyNmaWx0ZXJzLXRhYmxlJykub24oJ2tleXByZXNzJywgJ2lucHV0W3R5cGU9dGV4dF0nLCBmdW5jdGlvbihlKSB7CiAgICBpZiAoZS5rZXlDb2RlID09IDEzKSAkKHRoaXMpLmNsb3Nlc3QoJ2Zvcm0nKS5zdWJtaXQoKTsKICB9KTsKfQoKZnVuY3Rpb24gYWRkRmlsdGVyKGZpZWxkLCBvcGVyYXRvciwgdmFsdWVzKSB7CiAgdmFyIGZpZWxkSWQgPSBmaWVsZC5yZXBsYWNlKCcuJywgJ18nKTsKICB2YXIgdHIgPSAkKCcjdHJfJytmaWVsZElkKTsKCiAgdmFyIGZpbHRlck9wdGlvbnMgPSBhdmFpbGFibGVGaWx0ZXJzW2ZpZWxkXTsKICBpZiAoIWZpbHRlck9wdGlvbnMpIHJldHVybjsKCiAgaWYgKGZpbHRlck9wdGlvbnNbJ3JlbW90ZSddICYmIGZpbHRlck9wdGlvbnNbJ3ZhbHVlcyddID09IG51bGwpIHsKICAgICQuZ2V0SlNPTihmaWx0ZXJzVXJsLCB7J25hbWUnOiBmaWVsZH0pLmRvbmUoZnVuY3Rpb24oZGF0YSkgewogICAgICBmaWx0ZXJPcHRpb25zWyd2YWx1ZXMnXSA9IGRhdGE7CiAgICAgIGFkZEZpbHRlcihmaWVsZCwgb3BlcmF0b3IsIHZhbHVlcykgOwogICAgfSk7CiAgICByZXR1cm47CiAgfQoKICBpZiAodHIubGVuZ3RoID4gMCkgewogICAgdHIuc2hvdygpOwogIH0gZWxzZSB7CiAgICBidWlsZEZpbHRlclJvdyhmaWVsZCwgb3BlcmF0b3IsIHZhbHVlcyk7CiAgfQogICQoJyNjYl8nK2ZpZWxkSWQpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTsKICB0b2dnbGVGaWx0ZXIoZmllbGQpOwogIHRvZ2dsZU11bHRpU2VsZWN0SWNvbkluaXQoKTsKICAkKCcjYWRkX2ZpbHRlcl9zZWxlY3QnKS52YWwoJycpLmZpbmQoJ29wdGlvbicpLmVhY2goZnVuY3Rpb24oKSB7CiAgICBpZiAoJCh0aGlzKS5hdHRyKCd2YWx1ZScpID09IGZpZWxkKSB7CiAgICAgICQodGhpcykuYXR0cignZGlzYWJsZWQnLCB0cnVlKTsKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gYnVpbGRGaWx0ZXJSb3coZmllbGQsIG9wZXJhdG9yLCB2YWx1ZXMpIHsKICB2YXIgZmllbGRJZCA9IGZpZWxkLnJlcGxhY2UoJy4nLCAnXycpOwogIHZhciBmaWx0ZXJUYWJsZSA9ICQoIiNmaWx0ZXJzLXRhYmxlIik7CiAgdmFyIGZpbHRlck9wdGlvbnMgPSBhdmFpbGFibGVGaWx0ZXJzW2ZpZWxkXTsKICBpZiAoIWZpbHRlck9wdGlvbnMpIHJldHVybjsKICB2YXIgb3BlcmF0b3JzID0gb3BlcmF0b3JCeVR5cGVbZmlsdGVyT3B0aW9uc1sndHlwZSddXTsKICB2YXIgZmlsdGVyVmFsdWVzID0gZmlsdGVyT3B0aW9uc1sndmFsdWVzJ107CiAgdmFyIGksIHNlbGVjdDsKCiAgdmFyIHRyID0gJCgnPHRyIGNsYXNzPSJmaWx0ZXIiPicpLmF0dHIoJ2lkJywgJ3RyXycrZmllbGRJZCkuaHRtbCgKICAgICc8dGQgY2xhc3M9ImZpZWxkIj48aW5wdXQgY2hlY2tlZD0iY2hlY2tlZCIgaWQ9ImNiXycrZmllbGRJZCsnIiBuYW1lPSJmW10iIHZhbHVlPSInK2ZpZWxkKyciIHR5cGU9ImNoZWNrYm94Ij48bGFiZWwgZm9yPSJjYl8nK2ZpZWxkSWQrJyI+ICcrZmlsdGVyT3B0aW9uc1snbmFtZSddKyc8L2xhYmVsPjwvdGQ+JyArCiAgICAnPHRkIGNsYXNzPSJvcGVyYXRvciI+PHNlbGVjdCBpZD0ib3BlcmF0b3JzXycrZmllbGRJZCsnIiBuYW1lPSJvcFsnK2ZpZWxkKyddIj48L3RkPicgKwogICAgJzx0ZCBjbGFzcz0idmFsdWVzIj48L3RkPicKICApOwogIGZpbHRlclRhYmxlLmFwcGVuZCh0cik7CgogIHNlbGVjdCA9IHRyLmZpbmQoJ3RkLm9wZXJhdG9yIHNlbGVjdCcpOwogIGZvciAoaSA9IDA7IGkgPCBvcGVyYXRvcnMubGVuZ3RoOyBpKyspIHsKICAgIHZhciBvcHRpb24gPSAkKCc8b3B0aW9uPicpLnZhbChvcGVyYXRvcnNbaV0pLnRleHQob3BlcmF0b3JMYWJlbHNbb3BlcmF0b3JzW2ldXSk7CiAgICBpZiAob3BlcmF0b3JzW2ldID09IG9wZXJhdG9yKSB7IG9wdGlvbi5wcm9wKCdzZWxlY3RlZCcsIHRydWUpOyB9CiAgICBzZWxlY3QuYXBwZW5kKG9wdGlvbik7CiAgfQogIHNlbGVjdC5jaGFuZ2UoZnVuY3Rpb24oKXsgdG9nZ2xlT3BlcmF0b3IoZmllbGQpOyB9KTsKCiAgc3dpdGNoIChmaWx0ZXJPcHRpb25zWyd0eXBlJ10pIHsKICBjYXNlICJsaXN0IjoKICBjYXNlICJsaXN0X29wdGlvbmFsIjoKICBjYXNlICJsaXN0X3N0YXR1cyI6CiAgY2FzZSAibGlzdF9zdWJwcm9qZWN0cyI6CiAgICB0ci5maW5kKCd0ZC52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PHNlbGVjdCBjbGFzcz0idmFsdWUiIGlkPSJ2YWx1ZXNfJytmaWVsZElkKydfMSIgbmFtZT0idlsnK2ZpZWxkKyddW10iPjwvc2VsZWN0PicgKwogICAgICAnIDxzcGFuIGNsYXNzPSJ0b2dnbGUtbXVsdGlzZWxlY3QgaWNvbi1vbmx5ICcrKHZhbHVlcy5sZW5ndGggPiAxID8gJ2ljb24tdG9nZ2xlLW1pbnVzJyA6ICdpY29uLXRvZ2dsZS1wbHVzJykrJyI+Jm5ic3A7PC9zcGFuPjwvc3Bhbj4nCiAgICApOwogICAgc2VsZWN0ID0gdHIuZmluZCgndGQudmFsdWVzIHNlbGVjdCcpOwogICAgaWYgKHZhbHVlcy5sZW5ndGggPiAxKSB7IHNlbGVjdC5hdHRyKCdtdWx0aXBsZScsIHRydWUpOyB9CiAgICBmb3IgKGkgPSAwOyBpIDwgZmlsdGVyVmFsdWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBmaWx0ZXJWYWx1ZSA9IGZpbHRlclZhbHVlc1tpXTsKICAgICAgdmFyIG9wdGlvbiA9ICQoJzxvcHRpb24+Jyk7CiAgICAgIGlmICgkLmlzQXJyYXkoZmlsdGVyVmFsdWUpKSB7CiAgICAgICAgb3B0aW9uLnZhbChmaWx0ZXJWYWx1ZVsxXSkudGV4dChmaWx0ZXJWYWx1ZVswXSk7CiAgICAgICAgaWYgKCQuaW5BcnJheShmaWx0ZXJWYWx1ZVsxXSwgdmFsdWVzKSA+IC0xKSB7b3B0aW9uLnByb3AoJ3NlbGVjdGVkJywgdHJ1ZSk7fQogICAgICAgIGlmIChmaWx0ZXJWYWx1ZS5sZW5ndGggPT0gMykgewogICAgICAgICAgdmFyIG9wdGdyb3VwID0gc2VsZWN0LmZpbmQoJ29wdGdyb3VwJykuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuICQodGhpcykuYXR0cignbGFiZWwnKSA9PSBmaWx0ZXJWYWx1ZVsyXX0pOwogICAgICAgICAgaWYgKCFvcHRncm91cC5sZW5ndGgpIHtvcHRncm91cCA9ICQoJzxvcHRncm91cD4nKS5hdHRyKCdsYWJlbCcsIGZpbHRlclZhbHVlWzJdKTt9CiAgICAgICAgICBvcHRpb24gPSBvcHRncm91cC5hcHBlbmQob3B0aW9uKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb3B0aW9uLnZhbChmaWx0ZXJWYWx1ZSkudGV4dChmaWx0ZXJWYWx1ZSk7CiAgICAgICAgaWYgKCQuaW5BcnJheShmaWx0ZXJWYWx1ZSwgdmFsdWVzKSA+IC0xKSB7b3B0aW9uLnByb3AoJ3NlbGVjdGVkJywgdHJ1ZSk7fQogICAgICB9CiAgICAgIHNlbGVjdC5hcHBlbmQob3B0aW9uKTsKICAgIH0KICAgIGJyZWFrOwogIGNhc2UgImRhdGUiOgogIGNhc2UgImRhdGVfcGFzdCI6CiAgICB0ci5maW5kKCd0ZC52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9ImRhdGUiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnXzEiIHNpemU9IjEwIiBjbGFzcz0idmFsdWUgZGF0ZV92YWx1ZSIgLz48L3NwYW4+JyArCiAgICAgICcgPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZTsiPjxpbnB1dCB0eXBlPSJkYXRlIiBuYW1lPSJ2WycrZmllbGQrJ11bXSIgaWQ9InZhbHVlc18nK2ZpZWxkSWQrJ18yIiBzaXplPSIxMCIgY2xhc3M9InZhbHVlIGRhdGVfdmFsdWUiIC8+PC9zcGFuPicgKwogICAgICAnIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKyciIHNpemU9IjMiIGNsYXNzPSJ2YWx1ZSIgLz4gJytsYWJlbERheVBsdXJhbCsnPC9zcGFuPicKICAgICk7CiAgICAkKCcjdmFsdWVzXycrZmllbGRJZCsnXzEnKS52YWwodmFsdWVzWzBdKS5kYXRlcGlja2VyRmFsbGJhY2soZGF0ZXBpY2tlck9wdGlvbnMpOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQrJ18yJykudmFsKHZhbHVlc1sxXSkuZGF0ZXBpY2tlckZhbGxiYWNrKGRhdGVwaWNrZXJPcHRpb25zKTsKICAgICQoJyN2YWx1ZXNfJytmaWVsZElkKS52YWwodmFsdWVzWzBdKTsKICAgIGJyZWFrOwogIGNhc2UgInN0cmluZyI6CiAgY2FzZSAidGV4dCI6CiAgICB0ci5maW5kKCd0ZC52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnIiBzaXplPSIzMCIgY2xhc3M9InZhbHVlIiAvPjwvc3Bhbj4nCiAgICApOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQpLnZhbCh2YWx1ZXNbMF0pOwogICAgYnJlYWs7CiAgY2FzZSAicmVsYXRpb24iOgogICAgdHIuZmluZCgndGQudmFsdWVzJykuYXBwZW5kKAogICAgICAnPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZTsiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ2WycrZmllbGQrJ11bXSIgaWQ9InZhbHVlc18nK2ZpZWxkSWQrJyIgc2l6ZT0iNiIgY2xhc3M9InZhbHVlIiAvPjwvc3Bhbj4nICsKICAgICAgJzxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48c2VsZWN0IGNsYXNzPSJ2YWx1ZSIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKydfMSI+PC9zZWxlY3Q+PC9zcGFuPicKICAgICk7CiAgICAkKCcjdmFsdWVzXycrZmllbGRJZCkudmFsKHZhbHVlc1swXSk7CiAgICBzZWxlY3QgPSB0ci5maW5kKCd0ZC52YWx1ZXMgc2VsZWN0Jyk7CiAgICBmb3IgKGkgPSAwOyBpIDwgZmlsdGVyVmFsdWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBmaWx0ZXJWYWx1ZSA9IGZpbHRlclZhbHVlc1tpXTsKICAgICAgdmFyIG9wdGlvbiA9ICQoJzxvcHRpb24+Jyk7CiAgICAgIG9wdGlvbi52YWwoZmlsdGVyVmFsdWVbMV0pLnRleHQoZmlsdGVyVmFsdWVbMF0pOwogICAgICBpZiAodmFsdWVzWzBdID09IGZpbHRlclZhbHVlWzFdKSB7IG9wdGlvbi5wcm9wKCdzZWxlY3RlZCcsIHRydWUpOyB9CiAgICAgIHNlbGVjdC5hcHBlbmQob3B0aW9uKTsKICAgIH0KICAgIGJyZWFrOwogIGNhc2UgImludGVnZXIiOgogIGNhc2UgImZsb2F0IjoKICBjYXNlICJ0cmVlIjoKICAgIHRyLmZpbmQoJ3RkLnZhbHVlcycpLmFwcGVuZCgKICAgICAgJzxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKydfMSIgc2l6ZT0iMTQiIGNsYXNzPSJ2YWx1ZSIgLz48L3NwYW4+JyArCiAgICAgICcgPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZTsiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ2WycrZmllbGQrJ11bXSIgaWQ9InZhbHVlc18nK2ZpZWxkSWQrJ18yIiBzaXplPSIxNCIgY2xhc3M9InZhbHVlIiAvPjwvc3Bhbj4nCiAgICApOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQrJ18xJykudmFsKHZhbHVlc1swXSk7CiAgICAkKCcjdmFsdWVzXycrZmllbGRJZCsnXzInKS52YWwodmFsdWVzWzFdKTsKICAgIGJyZWFrOwogIH0KfQoKZnVuY3Rpb24gdG9nZ2xlRmlsdGVyKGZpZWxkKSB7CiAgdmFyIGZpZWxkSWQgPSBmaWVsZC5yZXBsYWNlKCcuJywgJ18nKTsKICBpZiAoJCgnI2NiXycgKyBmaWVsZElkKS5pcygnOmNoZWNrZWQnKSkgewogICAgJCgiI29wZXJhdG9yc18iICsgZmllbGRJZCkuc2hvdygpLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7CiAgICB0b2dnbGVPcGVyYXRvcihmaWVsZCk7CiAgfSBlbHNlIHsKICAgICQoIiNvcGVyYXRvcnNfIiArIGZpZWxkSWQpLmhpZGUoKS5hdHRyKCdkaXNhYmxlZCcsIHRydWUpOwogICAgZW5hYmxlVmFsdWVzKGZpZWxkLCBbXSk7CiAgfQp9CgpmdW5jdGlvbiBlbmFibGVWYWx1ZXMoZmllbGQsIGluZGV4ZXMpIHsKICB2YXIgZmllbGRJZCA9IGZpZWxkLnJlcGxhY2UoJy4nLCAnXycpOwogICQoJyN0cl8nK2ZpZWxkSWQrJyB0ZC52YWx1ZXMgLnZhbHVlJykuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgaWYgKCQuaW5BcnJheShpbmRleCwgaW5kZXhlcykgPj0gMCkgewogICAgICAkKHRoaXMpLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7CiAgICAgICQodGhpcykucGFyZW50cygnc3BhbicpLmZpcnN0KCkuc2hvdygpOwogICAgfSBlbHNlIHsKICAgICAgJCh0aGlzKS52YWwoJycpOwogICAgICAkKHRoaXMpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICQodGhpcykucGFyZW50cygnc3BhbicpLmZpcnN0KCkuaGlkZSgpOwogICAgfQoKICAgIGlmICgkKHRoaXMpLmhhc0NsYXNzKCdncm91cCcpKSB7CiAgICAgICQodGhpcykuYWRkQ2xhc3MoJ29wZW4nKTsKICAgIH0gZWxzZSB7CiAgICAgICQodGhpcykuc2hvdygpOwogICAgfQogIH0pOwp9CgpmdW5jdGlvbiB0b2dnbGVPcGVyYXRvcihmaWVsZCkgewogIHZhciBmaWVsZElkID0gZmllbGQucmVwbGFjZSgnLicsICdfJyk7CiAgdmFyIG9wZXJhdG9yID0gJCgiI29wZXJhdG9yc18iICsgZmllbGRJZCk7CiAgc3dpdGNoIChvcGVyYXRvci52YWwoKSkgewogICAgY2FzZSAiISoiOgogICAgY2FzZSAiKiI6CiAgICBjYXNlICJuZCI6CiAgICBjYXNlICJ0IjoKICAgIGNhc2UgImxkIjoKICAgIGNhc2UgIm53IjoKICAgIGNhc2UgInciOgogICAgY2FzZSAibHciOgogICAgY2FzZSAibDJ3IjoKICAgIGNhc2UgIm5tIjoKICAgIGNhc2UgIm0iOgogICAgY2FzZSAibG0iOgogICAgY2FzZSAieSI6CiAgICBjYXNlICJvIjoKICAgIGNhc2UgImMiOgogICAgY2FzZSAiKm8iOgogICAgY2FzZSAiIW8iOgogICAgICBlbmFibGVWYWx1ZXMoZmllbGQsIFtdKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICI+PCI6CiAgICAgIGVuYWJsZVZhbHVlcyhmaWVsZCwgWzAsMV0pOwogICAgICBicmVhazsKICAgIGNhc2UgIjx0KyI6CiAgICBjYXNlICI+dCsiOgogICAgY2FzZSAiPjx0KyI6CiAgICBjYXNlICJ0KyI6CiAgICBjYXNlICI+dC0iOgogICAgY2FzZSAiPHQtIjoKICAgIGNhc2UgIj48dC0iOgogICAgY2FzZSAidC0iOgogICAgICBlbmFibGVWYWx1ZXMoZmllbGQsIFsyXSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAiPXAiOgogICAgY2FzZSAiPSFwIjoKICAgIGNhc2UgIiFwIjoKICAgICAgZW5hYmxlVmFsdWVzKGZpZWxkLCBbMV0pOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIGVuYWJsZVZhbHVlcyhmaWVsZCwgWzBdKTsKICAgICAgYnJlYWs7CiAgfQp9CgpmdW5jdGlvbiB0b2dnbGVNdWx0aVNlbGVjdChlbCkgewogIHZhciBpc1dvcmtmbG93ID0gZWwuY2xvc2VzdCgnLmNvbnRyb2xsZXItd29ya2Zsb3dzJyk7CiAgaWYgKGVsLmF0dHIoJ211bHRpcGxlJykpIHsKICAgIGVsLnJlbW92ZUF0dHIoJ211bHRpcGxlJyk7CiAgICBpZiAoaXNXb3JrZmxvdykgeyBlbC5maW5kKCJvcHRpb25bdmFsdWU9YWxsXSIpLnNob3coKTsgfQogICAgZWwuYXR0cignc2l6ZScsIDEpOwogIH0gZWxzZSB7CiAgICBlbC5hdHRyKCdtdWx0aXBsZScsIHRydWUpOwogICAgaWYgKGlzV29ya2Zsb3cpIHsgZWwuZmluZCgib3B0aW9uW3ZhbHVlPWFsbF0iKS5hdHRyKCJzZWxlY3RlZCIsIGZhbHNlKS5oaWRlKCk7IH0KICAgIGlmIChlbC5jaGlsZHJlbigpLmxlbmd0aCA+IDEwKQogICAgICBlbC5hdHRyKCdzaXplJywgMTApOwogICAgZWxzZQogICAgICBlbC5hdHRyKCdzaXplJywgNCk7CiAgfQp9CgpmdW5jdGlvbiBzaG93VGFiKG5hbWUsIHVybCkgewogICQoJyN0YWItY29udGVudC0nICsgbmFtZSkucGFyZW50KCkuZmluZCgnLnRhYi1jb250ZW50JykuaGlkZSgpOwogICQoJyN0YWItY29udGVudC0nICsgbmFtZSkuc2hvdygpOwogICQoJyN0YWItJyArIG5hbWUpLmNsb3Nlc3QoJy50YWJzJykuZmluZCgnYScpLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpOwogICQoJyN0YWItJyArIG5hbWUpLmFkZENsYXNzKCdzZWxlY3RlZCcpOwoKICByZXBsYWNlSW5IaXN0b3J5KHVybCkKCiAgcmV0dXJuIGZhbHNlOwp9CgpmdW5jdGlvbiBzaG93SXNzdWVIaXN0b3J5KGpvdXJuYWwsIHVybCkgewogIHRhYl9jb250ZW50ID0gJCgnI3RhYi1jb250ZW50LWhpc3RvcnknKTsKICB0YWJfY29udGVudC5wYXJlbnQoKS5maW5kKCcudGFiLWNvbnRlbnQnKS5oaWRlKCk7CiAgdGFiX2NvbnRlbnQuc2hvdygpOwogIHRhYl9jb250ZW50LnBhcmVudCgpLmNoaWxkcmVuKCdkaXYudGFicycpLmZpbmQoJ2EnKS5yZW1vdmVDbGFzcygnc2VsZWN0ZWQnKTsKCiAgJCgnI3RhYi0nICsgam91cm5hbCkuYWRkQ2xhc3MoJ3NlbGVjdGVkJyk7CgogIHJlcGxhY2VJbkhpc3RvcnkodXJsKQoKICBzd2l0Y2goam91cm5hbCkgewogICAgY2FzZSAnbm90ZXMnOgogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCcpLnNob3coKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWw6bm90KC5oYXMtbm90ZXMpJykuaGlkZSgpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAud2lraScpLnNob3coKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwgLmNvbnRleHR1YWwgLmpvdXJuYWwtYWN0aW9ucycpLnNob3coKTsKCiAgICAgIC8vIGFsd2F5cyBzaG93IHRodW1ibmFpbHMgaW4gbm90ZXMgdGFiCiAgICAgIHZhciB0aHVtYm5haWxzID0gdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwgLnRodW1ibmFpbHMnKTsKICAgICAgdGh1bWJuYWlscy5zaG93KCk7CiAgICAgIC8vIHNob3cgam91cm5hbHMgd2l0aG91dCBub3RlcywgYnV0IHdpdGggdGh1bWJuYWlscwogICAgICB0aHVtYm5haWxzLnBhcmVudHMoJy5qb3VybmFsJykuc2hvdygpOwogICAgICBicmVhazsKICAgIGNhc2UgJ3Byb3BlcnRpZXMnOgogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCcpLnNob3coKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWw6bm90KC5oYXMtZGV0YWlscyknKS5oaWRlKCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC53aWtpJykuaGlkZSgpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAudGh1bWJuYWlscycpLmhpZGUoKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwgLmNvbnRleHR1YWwgLmpvdXJuYWwtYWN0aW9ucycpLmhpZGUoKTsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCcpLnNob3coKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwgLndpa2knKS5zaG93KCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC50aHVtYm5haWxzJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAuY29udGV4dHVhbCAuam91cm5hbC1hY3Rpb25zJykuc2hvdygpOwogIH0KCiAgcmV0dXJuIGZhbHNlOwp9CgpmdW5jdGlvbiBnZXRSZW1vdGVUYWIobmFtZSwgcmVtb3RlX3VybCwgdXJsLCBsb2FkX2Fsd2F5cykgewogIGxvYWRfYWx3YXlzID0gbG9hZF9hbHdheXMgfHwgZmFsc2U7CiAgdmFyIHRhYl9jb250ZW50ID0gJCgnI3RhYi1jb250ZW50LScgKyBuYW1lKTsKCiAgdGFiX2NvbnRlbnQucGFyZW50KCkuZmluZCgnLnRhYi1jb250ZW50JykuaGlkZSgpOwogIHRhYl9jb250ZW50LnBhcmVudCgpLmNoaWxkcmVuKCdkaXYudGFicycpLmZpbmQoJ2EnKS5yZW1vdmVDbGFzcygnc2VsZWN0ZWQnKTsKICAkKCcjdGFiLScgKyBuYW1lKS5hZGRDbGFzcygnc2VsZWN0ZWQnKTsKCiAgcmVwbGFjZUluSGlzdG9yeSh1cmwpOwoKICBpZiAodGFiX2NvbnRlbnQuY2hpbGRyZW4oKS5sZW5ndGggPT0gMCAmJiBsb2FkX2Fsd2F5cyA9PSBmYWxzZSkgewogICAgJC5hamF4KHsKICAgICAgdXJsOiByZW1vdGVfdXJsLAogICAgICB0eXBlOiAnZ2V0JywKICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSl7CiAgICAgICAgdGFiX2NvbnRlbnQuaHRtbChkYXRhKQogICAgICB9CiAgICB9KTsKICB9CgogIHRhYl9jb250ZW50LnNob3coKTsKICByZXR1cm4gZmFsc2U7Cn0KCi8vcmVwbGFjZXMgY3VycmVudCBVUkwgd2l0aCB0aGUgImhyZWYiIGF0dHJpYnV0ZSBvZiB0aGUgY3VycmVudCBsaW5rCi8vKG9ubHkgdHJpZ2dlcmVkIGlmIHN1cHBvcnRlZCBieSBicm93c2VyKQpmdW5jdGlvbiByZXBsYWNlSW5IaXN0b3J5KHVybCkgewogIGlmICgicmVwbGFjZVN0YXRlIiBpbiB3aW5kb3cuaGlzdG9yeSAmJiB1cmwgIT09IHVuZGVmaW5lZCkgewogICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKG51bGwsIGRvY3VtZW50LnRpdGxlLCB1cmwpOwogIH0KfQoKZnVuY3Rpb24gbW92ZVRhYlJpZ2h0KGVsKSB7CiAgdmFyIGxpcyA9ICQoZWwpLnBhcmVudHMoJ2Rpdi50YWJzJykuZmlyc3QoKS5maW5kKCd1bCcpLmNoaWxkcmVuKCk7CiAgdmFyIGJ3ID0gJChlbCkucGFyZW50cygnZGl2LnRhYnMtYnV0dG9ucycpLm91dGVyV2lkdGgodHJ1ZSk7CiAgdmFyIHRhYnNXaWR0aCA9IDA7CiAgdmFyIGkgPSAwOwogIGxpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgaWYgKCQodGhpcykuaXMoJzp2aXNpYmxlJykpIHsKICAgICAgdGFic1dpZHRoICs9ICQodGhpcykub3V0ZXJXaWR0aCh0cnVlKTsKICAgIH0KICB9KTsKICBpZiAodGFic1dpZHRoIDwgJChlbCkucGFyZW50cygnZGl2LnRhYnMnKS5maXJzdCgpLndpZHRoKCkgLSBidykgeyByZXR1cm47IH0KICAkKGVsKS5zaWJsaW5ncygnLnRhYi1sZWZ0JykucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7CiAgd2hpbGUgKGk8bGlzLmxlbmd0aCAmJiAhbGlzLmVxKGkpLmlzKCc6dmlzaWJsZScpKSB7IGkrKzsgfQogIHZhciB3ID0gbGlzLmVxKGkpLndpZHRoKCk7CiAgbGlzLmVxKGkpLmhpZGUoKTsKICBpZiAodGFic1dpZHRoIC0gdyA8ICQoZWwpLnBhcmVudHMoJ2Rpdi50YWJzJykuZmlyc3QoKS53aWR0aCgpIC0gYncpIHsKICAgICQoZWwpLmFkZENsYXNzKCdkaXNhYmxlZCcpOwogIH0KfQoKZnVuY3Rpb24gbW92ZVRhYkxlZnQoZWwpIHsKICB2YXIgbGlzID0gJChlbCkucGFyZW50cygnZGl2LnRhYnMnKS5maXJzdCgpLmZpbmQoJ3VsJykuY2hpbGRyZW4oKTsKICB2YXIgaSA9IDA7CiAgd2hpbGUgKGkgPCBsaXMubGVuZ3RoICYmICFsaXMuZXEoaSkuaXMoJzp2aXNpYmxlJykpIHsgaSsrOyB9CiAgaWYgKGkgPiAwKSB7CiAgICBsaXMuZXEoaS0xKS5zaG93KCk7CiAgICAkKGVsKS5zaWJsaW5ncygnLnRhYi1yaWdodCcpLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOwogIH0KICBpZiAoaSA8PSAxKSB7CiAgICAkKGVsKS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKICB9Cn0KCmZ1bmN0aW9uIGRpc3BsYXlUYWJzQnV0dG9ucygpIHsKICB2YXIgbGlzOwogIHZhciB0YWJzV2lkdGg7CiAgdmFyIGVsOwogIHZhciBudW1IaWRkZW47CiAgJCgnZGl2LnRhYnMnKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgZWwgPSAkKHRoaXMpOwogICAgbGlzID0gZWwuZmluZCgndWwnKS5jaGlsZHJlbigpOwogICAgdGFic1dpZHRoID0gMDsKICAgIG51bUhpZGRlbiA9IDA7CiAgICBsaXMuZWFjaChmdW5jdGlvbigpewogICAgICBpZiAoJCh0aGlzKS5pcygnOnZpc2libGUnKSkgewogICAgICAgIHRhYnNXaWR0aCArPSAkKHRoaXMpLm91dGVyV2lkdGgodHJ1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbnVtSGlkZGVuKys7CiAgICAgIH0KICAgIH0pOwogICAgdmFyIGJ3ID0gJChlbCkuZmluZCgnZGl2LnRhYnMtYnV0dG9ucycpLm91dGVyV2lkdGgodHJ1ZSk7CiAgICBpZiAoKHRhYnNXaWR0aCA8IGVsLndpZHRoKCkgLSBidykgJiYgKGxpcy5sZW5ndGggPT09IDAgfHwgbGlzLmZpcnN0KCkuaXMoJzp2aXNpYmxlJykpKSB7CiAgICAgIGVsLmZpbmQoJ2Rpdi50YWJzLWJ1dHRvbnMnKS5oaWRlKCk7CiAgICB9IGVsc2UgewogICAgICBlbC5maW5kKCdkaXYudGFicy1idXR0b25zJykuc2hvdygpLmNoaWxkcmVuKCdidXR0b24udGFiLWxlZnQnKS50b2dnbGVDbGFzcygnZGlzYWJsZWQnLCBudW1IaWRkZW4gPT0gMCk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIHNldFByZWRlY2Vzc29yRmllbGRzVmlzaWJpbGl0eSgpIHsKICB2YXIgcmVsYXRpb25UeXBlID0gJCgnI3JlbGF0aW9uX3JlbGF0aW9uX3R5cGUnKTsKICBpZiAocmVsYXRpb25UeXBlLnZhbCgpID09ICJwcmVjZWRlcyIgfHwgcmVsYXRpb25UeXBlLnZhbCgpID09ICJmb2xsb3dzIikgewogICAgJCgnI3ByZWRlY2Vzc29yX2ZpZWxkcycpLnNob3coKTsKICB9IGVsc2UgewogICAgJCgnI3ByZWRlY2Vzc29yX2ZpZWxkcycpLmhpZGUoKTsKICB9Cn0KCmZ1bmN0aW9uIHNob3dNb2RhbChpZCwgd2lkdGgsIHRpdGxlKSB7CiAgdmFyIGVsID0gJCgnIycraWQpLmZpcnN0KCk7CiAgaWYgKGVsLmxlbmd0aCA9PT0gMCB8fCBlbC5pcygnOnZpc2libGUnKSkge3JldHVybjt9CiAgaWYgKCF0aXRsZSkgdGl0bGUgPSBlbC5maW5kKCdoMy50aXRsZScpLnRleHQoKTsKICAvLyBtb3ZlcyBleGlzdGluZyBtb2RhbHMgYmVoaW5kIHRoZSB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kCiAgJCgiLm1vZGFsIikuY3NzKCd6SW5kZXgnLDk5KTsKICBlbC5kaWFsb2coewogICAgd2lkdGg6IHdpZHRoLAogICAgbW9kYWw6IHRydWUsCiAgICByZXNpemFibGU6IGZhbHNlLAogICAgZGlhbG9nQ2xhc3M6ICdtb2RhbCcsCiAgICB0aXRsZTogdGl0bGUKICB9KS5vbignZGlhbG9nY2xvc2UnLCBmdW5jdGlvbigpewogICAgJCgiLm1vZGFsIikuY3NzKCd6SW5kZXgnLDEwMSk7CiAgfSk7CiAgZWwuZmluZCgiaW5wdXRbdHlwZT10ZXh0XSwgaW5wdXRbdHlwZT1zdWJtaXRdIikuZmlyc3QoKS5mb2N1cygpOwp9CgpmdW5jdGlvbiBoaWRlTW9kYWwoZWwpIHsKICB2YXIgbW9kYWw7CiAgaWYgKGVsKSB7CiAgICBtb2RhbCA9ICQoZWwpLnBhcmVudHMoJy51aS1kaWFsb2ctY29udGVudCcpOwogIH0gZWxzZSB7CiAgICBtb2RhbCA9ICQoJyNhamF4LW1vZGFsJyk7CiAgfQogIG1vZGFsLmRpYWxvZygiY2xvc2UiKTsKfQoKZnVuY3Rpb24gY29sbGFwc2VTY21FbnRyeShpZCkgewogICQoJy4nK2lkKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ29wZW4nKSkgewogICAgICBjb2xsYXBzZVNjbUVudHJ5KCQodGhpcykuYXR0cignaWQnKSk7CiAgICB9CiAgICAkKHRoaXMpLmhpZGUoKTsKICB9KTsKICAkKCcjJytpZCkucmVtb3ZlQ2xhc3MoJ29wZW4nKTsKfQoKZnVuY3Rpb24gZXhwYW5kU2NtRW50cnkoaWQpIHsKICAkKCcuJytpZCkuZWFjaChmdW5jdGlvbigpIHsKICAgICQodGhpcykuc2hvdygpOwogICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ2xvYWRlZCcpICYmICEkKHRoaXMpLmhhc0NsYXNzKCdjb2xsYXBzZWQnKSkgewogICAgICBleHBhbmRTY21FbnRyeSgkKHRoaXMpLmF0dHIoJ2lkJykpOwogICAgfQogIH0pOwogICQoJyMnK2lkKS5hZGRDbGFzcygnb3BlbicpOwp9CgpmdW5jdGlvbiBzY21FbnRyeUNsaWNrKGlkLCB1cmwpIHsKICAgIHZhciBlbCA9ICQoJyMnK2lkKTsKICAgIGlmIChlbC5oYXNDbGFzcygnb3BlbicpKSB7CiAgICAgICAgY29sbGFwc2VTY21FbnRyeShpZCk7CiAgICAgICAgZWwuZmluZCgnLmV4cGFuZGVyJykuc3dpdGNoQ2xhc3MoJ2ljb24tZXhwYW5kZWQnLCAnaWNvbi1jb2xsYXBzZWQnKTsKICAgICAgICBlbC5hZGRDbGFzcygnY29sbGFwc2VkJyk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSBlbHNlIGlmIChlbC5oYXNDbGFzcygnbG9hZGVkJykpIHsKICAgICAgICBleHBhbmRTY21FbnRyeShpZCk7CiAgICAgICAgZWwuZmluZCgnLmV4cGFuZGVyJykuc3dpdGNoQ2xhc3MoJ2ljb24tY29sbGFwc2VkJywgJ2ljb24tZXhwYW5kZWQnKTsKICAgICAgICBlbC5yZW1vdmVDbGFzcygnY29sbGFwc2VkJyk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKGVsLmhhc0NsYXNzKCdsb2FkaW5nJykpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBlbC5hZGRDbGFzcygnbG9hZGluZycpOwogICAgJC5hamF4KHsKICAgICAgdXJsOiB1cmwsCiAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICBlbC5hZnRlcihkYXRhKTsKICAgICAgICBlbC5hZGRDbGFzcygnb3BlbicpLmFkZENsYXNzKCdsb2FkZWQnKS5yZW1vdmVDbGFzcygnbG9hZGluZycpOwogICAgICAgIGVsLmZpbmQoJy5leHBhbmRlcicpLnN3aXRjaENsYXNzKCdpY29uLWNvbGxhcHNlZCcsICdpY29uLWV4cGFuZGVkJyk7CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIHRydWU7Cn0KCmZ1bmN0aW9uIHJhbmRvbUtleShzaXplKSB7CiAgdmFyIGNoYXJzID0gJzAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JzsKICB2YXIga2V5ID0gJyc7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKICAgIGtleSArPSBjaGFycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcnMubGVuZ3RoKSk7CiAgfQogIHJldHVybiBrZXk7Cn0KCmZ1bmN0aW9uIGNvcHlUZXh0VG9DbGlwYm9hcmQodGFyZ2V0KSB7CiAgaWYgKHRhcmdldCkgewogICAgdmFyIHRlbXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpOwogICAgdGVtcC52YWx1ZSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY2xpcGJvYXJkLXRleHQnKTsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGVtcCk7CiAgICB0ZW1wLnNlbGVjdCgpOwogICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTsKICAgIGlmICh0ZW1wLnBhcmVudE5vZGUpIHsKICAgICAgdGVtcC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRlbXApOwogICAgfQogICAgaWYgKCQodGFyZ2V0KS5jbG9zZXN0KCcuZHJkbi5leHBhbmRlZCcpLmxlbmd0aCkgewogICAgICAkKHRhcmdldCkuY2xvc2VzdCgnLmRyZG4uZXhwYW5kZWQnKS5yZW1vdmVDbGFzcygiZXhwYW5kZWQiKTsKICAgIH0KICB9CiAgcmV0dXJuIGZhbHNlOwp9CgpmdW5jdGlvbiB1cGRhdGVJc3N1ZUZyb20odXJsLCBlbCkgewogICQoJyNhbGxfYXR0cmlidXRlcyBpbnB1dCwgI2FsbF9hdHRyaWJ1dGVzIHRleHRhcmVhLCAjYWxsX2F0dHJpYnV0ZXMgc2VsZWN0JykuZWFjaChmdW5jdGlvbigpewogICAgJCh0aGlzKS5kYXRhKCd2YWx1ZWJlZm9yZXVwZGF0ZScsICQodGhpcykudmFsKCkpOwogIH0pOwogIGlmIChlbCkgewogICAgJCgiI2Zvcm1fdXBkYXRlX3RyaWdnZXJlZF9ieSIpLnZhbCgkKGVsKS5hdHRyKCdpZCcpKTsKICB9CiAgcmV0dXJuICQuYWpheCh7CiAgICB1cmw6IHVybCwKICAgIHR5cGU6ICdwb3N0JywKICAgIGRhdGE6ICQoJyNpc3N1ZS1mb3JtJykuc2VyaWFsaXplKCkKICB9KTsKfQoKZnVuY3Rpb24gcmVwbGFjZUlzc3VlRm9ybVdpdGgoaHRtbCl7CiAgdmFyIHJlcGxhY2VtZW50ID0gJChodG1sKTsKICAkKCcjYWxsX2F0dHJpYnV0ZXMgaW5wdXQsICNhbGxfYXR0cmlidXRlcyB0ZXh0YXJlYSwgI2FsbF9hdHRyaWJ1dGVzIHNlbGVjdCcpLmVhY2goZnVuY3Rpb24oKXsKICAgIHZhciBvYmplY3RfaWQgPSAkKHRoaXMpLmF0dHIoJ2lkJyk7CiAgICBpZiAob2JqZWN0X2lkICYmICQodGhpcykuZGF0YSgndmFsdWViZWZvcmV1cGRhdGUnKSE9JCh0aGlzKS52YWwoKSkgewogICAgICByZXBsYWNlbWVudC5maW5kKCcjJytvYmplY3RfaWQpLnZhbCgkKHRoaXMpLnZhbCgpKTsKICAgIH0KICB9KTsKICAkKCcjYWxsX2F0dHJpYnV0ZXMnKS5lbXB0eSgpOwogICQoJyNhbGxfYXR0cmlidXRlcycpLnByZXBlbmQocmVwbGFjZW1lbnQpOwp9CgpmdW5jdGlvbiB1cGRhdGVCdWxrRWRpdEZyb20odXJsKSB7CiAgJC5hamF4KHsKICAgIHVybDogdXJsLAogICAgdHlwZTogJ3Bvc3QnLAogICAgZGF0YTogJCgnI2J1bGtfZWRpdF9mb3JtJykuc2VyaWFsaXplKCkKICB9KTsKfQoKZnVuY3Rpb24gb2JzZXJ2ZUF1dG9jb21wbGV0ZUZpZWxkKGZpZWxkSWQsIHVybCwgb3B0aW9ucykgewogICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewogICAgJCgnIycrZmllbGRJZCkuYXV0b2NvbXBsZXRlKCQuZXh0ZW5kKHsKICAgICAgc291cmNlOiB1cmwsCiAgICAgIG1pbkxlbmd0aDogMiwKICAgICAgcG9zaXRpb246IHtjb2xsaXNpb246ICJmbGlwZml0In0sCiAgICAgIHNlYXJjaDogZnVuY3Rpb24oKXskKCcjJytmaWVsZElkKS5hZGRDbGFzcygnYWpheC1sb2FkaW5nJyk7fSwKICAgICAgcmVzcG9uc2U6IGZ1bmN0aW9uKCl7JCgnIycrZmllbGRJZCkucmVtb3ZlQ2xhc3MoJ2FqYXgtbG9hZGluZycpO30KICAgIH0sIG9wdGlvbnMpKTsKICAgICQoJyMnK2ZpZWxkSWQpLmFkZENsYXNzKCdhdXRvY29tcGxldGUnKTsKICB9KTsKfQoKZnVuY3Rpb24gbXVsdGlwbGVBdXRvY29tcGxldGVGaWVsZChmaWVsZElkLCB1cmwsIG9wdGlvbnMpIHsKICBmdW5jdGlvbiBzcGxpdCh2YWwpIHsKICAgIHJldHVybiB2YWwuc3BsaXQoLyxccyovKTsKICB9CgogIGZ1bmN0aW9uIGV4dHJhY3RMYXN0KHRlcm0pIHsKICAgIHJldHVybiBzcGxpdCh0ZXJtKS5wb3AoKTsKICB9CgogICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHsKICAgICQoJyMnICsgZmllbGRJZCkuYXV0b2NvbXBsZXRlKCQuZXh0ZW5kKHsKICAgICAgc291cmNlOiBmdW5jdGlvbiAocmVxdWVzdCwgcmVzcG9uc2UpIHsKICAgICAgICAkLmdldEpTT04odXJsLCB7CiAgICAgICAgICB0ZXJtOiBleHRyYWN0TGFzdChyZXF1ZXN0LnRlcm0pCiAgICAgICAgfSwgcmVzcG9uc2UpOwogICAgICB9LAogICAgICBtaW5MZW5ndGg6IDIsCiAgICAgIHBvc2l0aW9uOiB7Y29sbGlzaW9uOiAiZmxpcGZpdCJ9LAogICAgICBzZWFyY2g6IGZ1bmN0aW9uICgpIHsKICAgICAgICAkKCcjJyArIGZpZWxkSWQpLmFkZENsYXNzKCdhamF4LWxvYWRpbmcnKTsKICAgICAgfSwKICAgICAgcmVzcG9uc2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAkKCcjJyArIGZpZWxkSWQpLnJlbW92ZUNsYXNzKCdhamF4LWxvYWRpbmcnKTsKICAgICAgfSwKICAgICAgc2VsZWN0OiBmdW5jdGlvbiAoZXZlbnQsIHVpKSB7CiAgICAgICAgdmFyIHRlcm1zID0gc3BsaXQodGhpcy52YWx1ZSk7CiAgICAgICAgLy8gcmVtb3ZlIHRoZSBjdXJyZW50IGlucHV0CiAgICAgICAgdGVybXMucG9wKCk7CiAgICAgICAgLy8gYWRkIHRoZSBzZWxlY3RlZCBpdGVtCiAgICAgICAgdGVybXMucHVzaCh1aS5pdGVtLnZhbHVlKTsKICAgICAgICAvLyBhZGQgcGxhY2Vob2xkZXIgdG8gZ2V0IHRoZSBjb21tYS1hbmQtc3BhY2UgYXQgdGhlIGVuZAogICAgICAgIHRlcm1zLnB1c2goIiIpOwogICAgICAgIHRoaXMudmFsdWUgPSB0ZXJtcy5qb2luKCIsICIpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfSwgb3B0aW9ucykpOwogICAgJCgnIycgKyBmaWVsZElkKS5hZGRDbGFzcygnYXV0b2NvbXBsZXRlJyk7CiAgfSk7Cn0KCmZ1bmN0aW9uIG9ic2VydmVTZWFyY2hmaWVsZChmaWVsZElkLCB0YXJnZXRJZCwgdXJsKSB7CiAgJCgnIycrZmllbGRJZCkuZWFjaChmdW5jdGlvbigpIHsKICAgIHZhciAkdGhpcyA9ICQodGhpcyk7CiAgICAkdGhpcy5hZGRDbGFzcygnYXV0b2NvbXBsZXRlJyk7CiAgICAkdGhpcy5hdHRyKCdkYXRhLXZhbHVlLXdhcycsICR0aGlzLnZhbCgpKTsKICAgIHZhciBjaGVjayA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdmFsID0gJHRoaXMudmFsKCk7CiAgICAgIGlmICgkdGhpcy5hdHRyKCdkYXRhLXZhbHVlLXdhcycpICE9IHZhbCl7CiAgICAgICAgJHRoaXMuYXR0cignZGF0YS12YWx1ZS13YXMnLCB2YWwpOwogICAgICAgICQuYWpheCh7CiAgICAgICAgICB1cmw6IHVybCwKICAgICAgICAgIHR5cGU6ICdnZXQnLAogICAgICAgICAgZGF0YToge3E6ICR0aGlzLnZhbCgpfSwKICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpeyBpZih0YXJnZXRJZCkgJCgnIycrdGFyZ2V0SWQpLmh0bWwoZGF0YSk7IH0sCiAgICAgICAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbigpeyAkdGhpcy5hZGRDbGFzcygnYWpheC1sb2FkaW5nJyk7IH0sCiAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24oKXsgJHRoaXMucmVtb3ZlQ2xhc3MoJ2FqYXgtbG9hZGluZycpOyB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgcmVzZXQgPSBmdW5jdGlvbigpIHsKICAgICAgaWYgKHRpbWVyKSB7CiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7CiAgICAgICAgdGltZXIgPSBzZXRJbnRlcnZhbChjaGVjaywgMzAwKTsKICAgICAgfQogICAgfTsKICAgIHZhciB0aW1lciA9IHNldEludGVydmFsKGNoZWNrLCAzMDApOwogICAgJHRoaXMuYmluZCgna2V5dXAgY2xpY2sgbW91c2Vtb3ZlJywgcmVzZXQpOwogIH0pOwp9CgokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICQoIi5kcmRuIC5hdXRvY29tcGxldGUiKS52YWwoJycpOwoKICAvLyBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgdG8gZm9jdXMgc2VsZWN0ZWQgcHJvamVjdAogIHZhciBzZWxlY3RlZDsKICAkKGRvY3VtZW50KS5vbignY2xpY2snLCAnLmRyZG4tdHJpZ2dlcicsIGZ1bmN0aW9uKGUpewogICAgdmFyIGRyZG4gPSAkKHRoaXMpLmNsb3Nlc3QoIi5kcmRuIik7CiAgICBpZiAoZHJkbi5oYXNDbGFzcygiZXhwYW5kZWQiKSkgewogICAgICBkcmRuLnJlbW92ZUNsYXNzKCJleHBhbmRlZCIpOwogICAgfSBlbHNlIHsKICAgICAgJCgiLmRyZG4iKS5yZW1vdmVDbGFzcygiZXhwYW5kZWQiKTsKICAgICAgZHJkbi5hZGRDbGFzcygiZXhwYW5kZWQiKTsKICAgICAgc2VsZWN0ZWQgPSAkKCcuZHJkbi1pdGVtcyBhLnNlbGVjdGVkJyk7IC8vIFN0b3JlIHNlbGVjdGVkIHByb2plY3QKICAgICAgc2VsZWN0ZWQuZm9jdXMoKTsgLy8gQ2FsbGluZyBmb2N1cyB0byBzY3JvbGwgdG8gc2VsZWN0ZWQgcHJvamVjdAogICAgICBpZiAoIWlzTW9iaWxlKCkpIHsKICAgICAgICBkcmRuLmZpbmQoIi5hdXRvY29tcGxldGUiKS5mb2N1cygpOwogICAgICB9CiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICB9CiAgfSk7CiAgJChkb2N1bWVudCkuY2xpY2soZnVuY3Rpb24oZSl7CiAgICBpZiAoJChlLnRhcmdldCkuY2xvc2VzdCgiLmRyZG4iKS5sZW5ndGggPCAxKSB7CiAgICAgICQoIi5kcmRuLmV4cGFuZGVkIikucmVtb3ZlQ2xhc3MoImV4cGFuZGVkIik7CiAgICB9CiAgfSk7CgogIG9ic2VydmVTZWFyY2hmaWVsZCgncHJvamVjdHMtcXVpY2stc2VhcmNoJywgbnVsbCwgJCgnI3Byb2plY3RzLXF1aWNrLXNlYXJjaCcpLmRhdGEoJ2F1dG9tY29tcGxldGUtdXJsJykpOwoKICAkKCIuZHJkbi1jb250ZW50Iikua2V5ZG93bihmdW5jdGlvbihldmVudCl7CiAgICB2YXIgaXRlbXMgPSAkKHRoaXMpLmZpbmQoIi5kcmRuLWl0ZW1zIik7CgogICAgLy8gSWYgYSBwcm9qZWN0IGlzIHNlbGVjdGVkIHNldCBmb2N1c2VkIHRvIHNlbGVjdGVkIG9ubHkgb25jZQogICAgaWYgKHNlbGVjdGVkICYmIHNlbGVjdGVkLmxlbmd0aCA+IDApIHsKICAgICAgdmFyIGZvY3VzZWQgPSBzZWxlY3RlZDsKICAgICAgc2VsZWN0ZWQgPSB1bmRlZmluZWQ7CiAgICB9CiAgICBlbHNlIHsKICAgICAgdmFyIGZvY3VzZWQgPSBpdGVtcy5maW5kKCJhOmZvY3VzIik7CiAgICB9CiAgICBzd2l0Y2ggKGV2ZW50LndoaWNoKSB7CiAgICBjYXNlIDQwOiAvL2Rvd24KICAgICAgaWYgKGZvY3VzZWQubGVuZ3RoID4gMCkgewogICAgICAgIGZvY3VzZWQubmV4dEFsbCgiYSIpLmZpcnN0KCkuZm9jdXMoKTs7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaXRlbXMuZmluZCgiYSIpLmZpcnN0KCkuZm9jdXMoKTs7CiAgICAgIH0KICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDM4OiAvL3VwCiAgICAgIGlmIChmb2N1c2VkLmxlbmd0aCA+IDApIHsKICAgICAgICB2YXIgcHJldiA9IGZvY3VzZWQucHJldkFsbCgiYSIpOwogICAgICAgIGlmIChwcmV2Lmxlbmd0aCA+IDApIHsKICAgICAgICAgIHByZXYuZmlyc3QoKS5mb2N1cygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAkKHRoaXMpLmZpbmQoIi5hdXRvY29tcGxldGUiKS5mb2N1cygpOwogICAgICAgIH0KICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSAzNTogLy9lbmQKICAgICAgaWYgKGZvY3VzZWQubGVuZ3RoID4gMCkgewogICAgICAgIGZvY3VzZWQubmV4dEFsbCgiYSIpLmxhc3QoKS5mb2N1cygpOwogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlIDM2OiAvL2hvbWUKICAgICAgaWYgKGZvY3VzZWQubGVuZ3RoID4gMCkgewogICAgICAgIGZvY3VzZWQucHJldkFsbCgiYSIpLmxhc3QoKS5mb2N1cygpOwogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICB9CiAgfSk7Cn0pOwoKZnVuY3Rpb24gYmVmb3JlU2hvd0RhdGVQaWNrZXIoaW5wdXQsIGluc3QpIHsKICB2YXIgZGVmYXVsdF9kYXRlID0gbnVsbDsKICBzd2l0Y2ggKCQoaW5wdXQpLmF0dHIoImlkIikpIHsKICAgIGNhc2UgImlzc3VlX3N0YXJ0X2RhdGUiIDoKICAgICAgaWYgKCQoIiNpc3N1ZV9kdWVfZGF0ZSIpLmxlbmd0aCA+IDApIHsKICAgICAgICBkZWZhdWx0X2RhdGUgPSAkKCIjaXNzdWVfZHVlX2RhdGUiKS52YWwoKTsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgImlzc3VlX2R1ZV9kYXRlIiA6CiAgICAgIGlmICgkKCIjaXNzdWVfc3RhcnRfZGF0ZSIpLmxlbmd0aCA+IDApIHsKICAgICAgICB2YXIgc3RhcnRfZGF0ZSA9ICQoIiNpc3N1ZV9zdGFydF9kYXRlIikudmFsKCk7CiAgICAgICAgaWYgKHN0YXJ0X2RhdGUgIT0gIiIpIHsKICAgICAgICAgIHN0YXJ0X2RhdGUgPSBuZXcgRGF0ZShEYXRlLnBhcnNlKHN0YXJ0X2RhdGUpKTsKICAgICAgICAgIGlmIChzdGFydF9kYXRlID4gbmV3IERhdGUoKSkgewogICAgICAgICAgICBkZWZhdWx0X2RhdGUgPSAkKCIjaXNzdWVfc3RhcnRfZGF0ZSIpLnZhbCgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBicmVhazsKICB9CiAgJChpbnB1dCkuZGF0ZXBpY2tlckZhbGxiYWNrKCJvcHRpb24iLCAiZGVmYXVsdERhdGUiLCBkZWZhdWx0X2RhdGUpOwp9CgooZnVuY3Rpb24oJCl7CiAgJC5mbi5wb3NpdGlvbmVkSXRlbXMgPSBmdW5jdGlvbihzb3J0YWJsZU9wdGlvbnMsIG9wdGlvbnMpewogICAgdmFyIHNldHRpbmdzID0gJC5leHRlbmQoewogICAgICBmaXJzdFBvc2l0aW9uOiAxCiAgICB9LCBvcHRpb25zICk7CgogICAgcmV0dXJuIHRoaXMuc29ydGFibGUoJC5leHRlbmQoewogICAgICBheGlzOiAneScsCiAgICAgIGhhbmRsZTogIi5zb3J0LWhhbmRsZSIsCiAgICAgIGhlbHBlcjogZnVuY3Rpb24oZXZlbnQsIHVpKXsKICAgICAgICB1aS5jaGlsZHJlbigndGQnKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgICAgICAkKHRoaXMpLndpZHRoKCQodGhpcykud2lkdGgoKSk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHVpOwogICAgICB9LAogICAgICB1cGRhdGU6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgewogICAgICAgIHZhciBzb3J0YWJsZSA9ICQodGhpcyk7CiAgICAgICAgdmFyIGhhbmRsZSA9IHVpLml0ZW0uZmluZCgiLnNvcnQtaGFuZGxlIikuYWRkQ2xhc3MoImFqYXgtbG9hZGluZyIpOwogICAgICAgIHZhciB1cmwgPSBoYW5kbGUuZGF0YSgicmVvcmRlci11cmwiKTsKICAgICAgICB2YXIgcGFyYW0gPSBoYW5kbGUuZGF0YSgicmVvcmRlci1wYXJhbSIpOwogICAgICAgIHZhciBkYXRhID0ge307CiAgICAgICAgZGF0YVtwYXJhbV0gPSB7cG9zaXRpb246IHVpLml0ZW0uaW5kZXgoKSArIHNldHRpbmdzWydmaXJzdFBvc2l0aW9uJ119OwogICAgICAgICQuYWpheCh7CiAgICAgICAgICB1cmw6IHVybCwKICAgICAgICAgIHR5cGU6ICdwdXQnLAogICAgICAgICAgZGF0YVR5cGU6ICdzY3JpcHQnLAogICAgICAgICAgZGF0YTogZGF0YSwKICAgICAgICAgIGVycm9yOiBmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pewogICAgICAgICAgICBhbGVydChqcVhIUi5zdGF0dXMpOwogICAgICAgICAgICBzb3J0YWJsZS5zb3J0YWJsZSgiY2FuY2VsIik7CiAgICAgICAgICB9LAogICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bil7CiAgICAgICAgICAgIGhhbmRsZS5yZW1vdmVDbGFzcygiYWpheC1sb2FkaW5nIik7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0sCiAgICB9LCBzb3J0YWJsZU9wdGlvbnMpKTsKICB9Cn0oIGpRdWVyeSApKTsKCnZhciB3YXJuTGVhdmluZ1Vuc2F2ZWRNZXNzYWdlOwpmdW5jdGlvbiB3YXJuTGVhdmluZ1Vuc2F2ZWQobWVzc2FnZSkgewogIHdhcm5MZWF2aW5nVW5zYXZlZE1lc3NhZ2UgPSBtZXNzYWdlOwogICQoZG9jdW1lbnQpLm9uKCdzdWJtaXQnLCAnZm9ybScsIGZ1bmN0aW9uKCl7CiAgICAkKCd0ZXh0YXJlYScpLnJlbW92ZURhdGEoJ2NoYW5nZWQnKTsKICB9KTsKICAkKGRvY3VtZW50KS5vbignY2hhbmdlJywgJ3RleHRhcmVhJywgZnVuY3Rpb24oKXsKICAgICQodGhpcykuZGF0YSgnY2hhbmdlZCcsICdjaGFuZ2VkJyk7CiAgfSk7CiAgd2luZG93Lm9uYmVmb3JldW5sb2FkID0gZnVuY3Rpb24oKXsKICAgIHZhciB3YXJuID0gZmFsc2U7CiAgICAkKCd0ZXh0YXJlYScpLmJsdXIoKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgIGlmICgkKHRoaXMpLmRhdGEoJ2NoYW5nZWQnKSkgewogICAgICAgIHdhcm4gPSB0cnVlOwogICAgICB9CiAgICB9KTsKICAgIGlmICh3YXJuKSB7cmV0dXJuIHdhcm5MZWF2aW5nVW5zYXZlZE1lc3NhZ2U7fQogIH07Cn0KCmZ1bmN0aW9uIHNldHVwQWpheEluZGljYXRvcigpIHsKICAkKGRvY3VtZW50KS5iaW5kKCdhamF4U2VuZCcsIGZ1bmN0aW9uKGV2ZW50LCB4aHIsIHNldHRpbmdzKSB7CiAgICBpZiAoJCgnLmFqYXgtbG9hZGluZycpLmxlbmd0aCA9PT0gMCAmJiBzZXR0aW5ncy5jb250ZW50VHlwZSAhPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJykgewogICAgICAkKCcjYWpheC1pbmRpY2F0b3InKS5zaG93KCk7CiAgICB9CiAgfSk7CiAgJChkb2N1bWVudCkuYmluZCgnYWpheFN0b3AnLCBmdW5jdGlvbigpIHsKICAgICQoJyNhamF4LWluZGljYXRvcicpLmhpZGUoKTsKICB9KTsKfQoKZnVuY3Rpb24gc2V0dXBUYWJzKCkgewogIGlmKCQoJy50YWJzJykubGVuZ3RoID4gMCkgewogICAgZGlzcGxheVRhYnNCdXR0b25zKCk7CiAgICAkKHdpbmRvdykucmVzaXplKGRpc3BsYXlUYWJzQnV0dG9ucyk7CiAgfQp9CgpmdW5jdGlvbiBzZXR1cEZpbGVQcmV2aWV3TmF2aWdhdGlvbigpIHsKICAvLyBvbmx5IGJpbmQgYXJyb3cga2V5cyB3aGVuIHByZXZpZXcgbmF2aWdhdGlvbiBpcyBwcmVzZW50CiAgY29uc3QgZWxlbWVudCA9ICQoJy5wYWdpbmF0aW9uLmZpbGVwcmV2aWV3JykuZmlyc3QoKTsKICBpZiAoZWxlbWVudCkgewoKICAgIGNvbnN0IGhhbmRsZUFycm93S2V5ID0gZnVuY3Rpb24oc2VsZWN0b3IsIGUpewogICAgICBjb25zdCBocmVmID0gJChlbGVtZW50KS5maW5kKHNlbGVjdG9yKS5hdHRyKCdocmVmJyk7CiAgICAgIGlmIChocmVmKSB7CiAgICAgICAgd2luZG93LmxvY2F0aW9uID0gaHJlZjsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIH0KICAgIH07CgogICAgJChkb2N1bWVudCkua2V5ZG93bihmdW5jdGlvbihlKSB7CiAgICAgIGlmKGUuc2hpZnRLZXkgfHwgZS5tZXRhS2V5IHx8IGUuY3RybEtleSB8fCBlLmFsdEtleSkgcmV0dXJuOwogICAgICBzd2l0Y2goZS5rZXkpIHsKICAgICAgICBjYXNlICdBcnJvd0xlZnQnOgogICAgICAgICAgaGFuZGxlQXJyb3dLZXkoJy5wcmV2aW91cyBhJywgZSk7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnQXJyb3dSaWdodCc6CiAgICAgICAgICBoYW5kbGVBcnJvd0tleSgnLm5leHQgYScsIGUpOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0pOwogIH0KfQoKJChkb2N1bWVudCkub24oJ2tleWRvd24nLCAnZm9ybSB0ZXh0YXJlYScsIGZ1bmN0aW9uKGUpIHsKICAvLyBTdWJtaXQgdGhlIGZvcm0gd2l0aCBDdHJsICsgRW50ZXIgb3IgQ29tbWFuZCArIFJldHVybgogIHZhciB0YXJnZXRGb3JtID0gJChlLnRhcmdldCkuY2xvc2VzdCgnZm9ybScpOwogIGlmKGUua2V5Q29kZSA9PSAxMyAmJiAoKGUuY3RybEtleSAmJiAhZS5tZXRhS2V5KSB8fCAoIWUuY3RybEtleSAmJiBlLm1ldGFLZXkpICYmIHRhcmdldEZvcm0ubGVuZ3RoKSkgewogICAgLy8gRm9yIGFqYXgsIHVzZSBjbGljaygpIGluc3RlYWQgb2Ygc3VibWl0KCkgdG8gcHJldmVudCAiSW52YWxpZCBmb3JtIGF1dGhlbnRpY2l0eSB0b2tlbiIgZXJyb3IKICAgIGlmICh0YXJnZXRGb3JtLmF0dHIoJ2RhdGEtcmVtb3RlJykgPT0gJ3RydWUnKSB7CiAgICAgIGlmICh0YXJnZXRGb3JtLmZpbmQoJ2lucHV0W3R5cGU9c3VibWl0XScpLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gZmFsc2U7IH0KICAgICAgdGFyZ2V0Rm9ybS5maW5kKCd0ZXh0YXJlYScpLmJsdXIoKS5yZW1vdmVEYXRhKCdjaGFuZ2VkJyk7CiAgICAgIHRhcmdldEZvcm0uZmluZCgnaW5wdXRbdHlwZT1zdWJtaXRdJykuZmlyc3QoKS5jbGljaygpOwogICAgfSBlbHNlIHsKICAgICAgdGFyZ2V0Rm9ybS5maW5kKCd0ZXh0YXJlYScpLmJsdXIoKS5yZW1vdmVEYXRhKCdjaGFuZ2VkJyk7CiAgICAgIHRhcmdldEZvcm0uc3VibWl0KCk7CiAgICB9CiAgfQp9KTsKCgpmdW5jdGlvbiBoaWRlT25Mb2FkKCkgewogICQoJy5ob2wnKS5oaWRlKCk7Cn0KCmZ1bmN0aW9uIGFkZEZvcm1PYnNlcnZlcnNGb3JEb3VibGVTdWJtaXQoKSB7CiAgJCgnZm9ybVttZXRob2Q9cG9zdF0nKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgaWYgKCEkKHRoaXMpLmhhc0NsYXNzKCdtdWx0aXBsZS1zdWJtaXQnKSkgewogICAgICAkKHRoaXMpLnN1Ym1pdChmdW5jdGlvbihmb3JtX3N1Ym1pc3Npb24pIHsKICAgICAgICBpZiAoJChmb3JtX3N1Ym1pc3Npb24udGFyZ2V0KS5hdHRyKCdkYXRhLXN1Ym1pdHRlZCcpKSB7CiAgICAgICAgICBmb3JtX3N1Ym1pc3Npb24ucHJldmVudERlZmF1bHQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgJChmb3JtX3N1Ym1pc3Npb24udGFyZ2V0KS5hdHRyKCdkYXRhLXN1Ym1pdHRlZCcsIHRydWUpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIGRlZmF1bHRGb2N1cygpewogIGlmICgoJCgnI2NvbnRlbnQgOmZvY3VzJykubGVuZ3RoID09IDApICYmICh3aW5kb3cubG9jYXRpb24uaGFzaCA9PSAnJykpIHsKICAgICQoJyNjb250ZW50IGlucHV0W3R5cGU9dGV4dF06dmlzaWJsZSwgI2NvbnRlbnQgdGV4dGFyZWE6dmlzaWJsZScpLmZpcnN0KCkuZm9jdXMoKTsKICB9Cn0KCmZ1bmN0aW9uIGJsb2NrRXZlbnRQcm9wYWdhdGlvbihldmVudCkgewogIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7Cn0KCmZ1bmN0aW9uIHRvZ2dsZURpc2FibGVkT25DaGFuZ2UoKSB7CiAgdmFyIGNoZWNrZWQgPSAkKHRoaXMpLmlzKCc6Y2hlY2tlZCcpOwogICQoJCh0aGlzKS5kYXRhKCdkaXNhYmxlcycpKS5hdHRyKCdkaXNhYmxlZCcsIGNoZWNrZWQpOwogICQoJCh0aGlzKS5kYXRhKCdlbmFibGVzJykpLmF0dHIoJ2Rpc2FibGVkJywgIWNoZWNrZWQpOwogICQoJCh0aGlzKS5kYXRhKCdzaG93cycpKS50b2dnbGUoY2hlY2tlZCk7Cn0KZnVuY3Rpb24gdG9nZ2xlRGlzYWJsZWRJbml0KCkgewogICQoJ2lucHV0W2RhdGEtZGlzYWJsZXNdLCBpbnB1dFtkYXRhLWVuYWJsZXNdLCBpbnB1dFtkYXRhLXNob3dzXScpLmVhY2godG9nZ2xlRGlzYWJsZWRPbkNoYW5nZSk7Cn0KZnVuY3Rpb24gdG9nZ2xlTXVsdGlTZWxlY3RJY29uSW5pdCgpIHsKICAkKCcudG9nZ2xlLW11bHRpc2VsZWN0Om5vdCguaWNvbi10b2dnbGUtbWludXMpLCAudG9nZ2xlLW11bHRpc2VsZWN0Om5vdCguaWNvbi10b2dnbGUtcGx1cyknKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICBpZiAoJCh0aGlzKS5zaWJsaW5ncygnc2VsZWN0JykuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykubGVuZ3RoID4gMSl7CiAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2ljb24tdG9nZ2xlLW1pbnVzJyk7CiAgICB9IGVsc2UgewogICAgICAkKHRoaXMpLmFkZENsYXNzKCdpY29uLXRvZ2dsZS1wbHVzJyk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIHRvZ2dsZU5ld09iamVjdERyb3Bkb3duKCkgewogIHZhciBkcm9wZG93biA9ICQoJyNuZXctb2JqZWN0ICsgdWwubWVudS1jaGlsZHJlbicpOwogIGlmKGRyb3Bkb3duLmhhc0NsYXNzKCd2aXNpYmxlJykpewogICAgZHJvcGRvd24ucmVtb3ZlQ2xhc3MoJ3Zpc2libGUnKTsKICB9ZWxzZXsKICAgIGRyb3Bkb3duLmFkZENsYXNzKCd2aXNpYmxlJyk7CiAgfQp9CgooZnVuY3Rpb24gKCAkICkgewoKICAvLyBkZXRlY3QgaWYgbmF0aXZlIGRhdGUgaW5wdXQgaXMgc3VwcG9ydGVkCiAgdmFyIG5hdGl2ZURhdGVJbnB1dFN1cHBvcnRlZCA9IHRydWU7CgogIHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7CiAgaW5wdXQuc2V0QXR0cmlidXRlKCd0eXBlJywnZGF0ZScpOwogIGlmIChpbnB1dC50eXBlID09PSAndGV4dCcpIHsKICAgIG5hdGl2ZURhdGVJbnB1dFN1cHBvcnRlZCA9IGZhbHNlOwogIH0KCiAgdmFyIG5vdEFEYXRlVmFsdWUgPSAnbm90LWEtZGF0ZSc7CiAgaW5wdXQuc2V0QXR0cmlidXRlKCd2YWx1ZScsIG5vdEFEYXRlVmFsdWUpOwogIGlmIChpbnB1dC52YWx1ZSA9PT0gbm90QURhdGVWYWx1ZSkgewogICAgbmF0aXZlRGF0ZUlucHV0U3VwcG9ydGVkID0gZmFsc2U7CiAgfQoKICAkLmZuLmRhdGVwaWNrZXJGYWxsYmFjayA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewogICAgaWYgKG5hdGl2ZURhdGVJbnB1dFN1cHBvcnRlZCkgewogICAgICByZXR1cm4gdGhpczsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0aGlzLmRhdGVwaWNrZXIoIG9wdGlvbnMgKTsKICAgIH0KICB9Owp9KCBqUXVlcnkgKSk7CgokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICQoJyNjb250ZW50Jykub24oJ2NoYW5nZScsICdpbnB1dFtkYXRhLWRpc2FibGVzXSwgaW5wdXRbZGF0YS1lbmFibGVzXSwgaW5wdXRbZGF0YS1zaG93c10nLCB0b2dnbGVEaXNhYmxlZE9uQ2hhbmdlKTsKICB0b2dnbGVEaXNhYmxlZEluaXQoKTsKCiAgJCgnI2NvbnRlbnQnKS5vbignY2xpY2snLCAnLnRvZ2dsZS1tdWx0aXNlbGVjdCcsIGZ1bmN0aW9uKCkgewogICAgdG9nZ2xlTXVsdGlTZWxlY3QoJCh0aGlzKS5zaWJsaW5ncygnc2VsZWN0JykpOwogICAgJCh0aGlzKS50b2dnbGVDbGFzcygnaWNvbi10b2dnbGUtcGx1cyBpY29uLXRvZ2dsZS1taW51cycpOwogIH0pOwogIHRvZ2dsZU11bHRpU2VsZWN0SWNvbkluaXQoKTsKCiAgJCgnI2hpc3RvcnkgLnRhYnMnKS5vbignY2xpY2snLCAnYScsIGZ1bmN0aW9uKGUpewogICAgdmFyIHRhYiA9ICQoZS50YXJnZXQpLmF0dHIoJ2lkJykucmVwbGFjZSgndGFiLScsJycpOwogICAgZG9jdW1lbnQuY29va2llID0gJ2hpc3RvcnlfbGFzdF90YWI9JyArIHRhYiArICc7IFNhbWVTaXRlPUxheCcKICB9KTsKfSk7CgokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICQoJyNjb250ZW50Jykub24oJ2NsaWNrJywgJ2Rpdi5qc3RUYWJzIGEudGFiLXByZXZpZXcnLCBmdW5jdGlvbihldmVudCl7CiAgICB2YXIgdGFiID0gJChldmVudC50YXJnZXQpOwoKICAgIHZhciB1cmwgPSB0YWIuZGF0YSgndXJsJyk7CiAgICB2YXIgZm9ybSA9IHRhYi5wYXJlbnRzKCdmb3JtJyk7CiAgICB2YXIganN0QmxvY2sgPSB0YWIucGFyZW50cygnLmpzdEJsb2NrJyk7CgogICAgdmFyIGVsZW1lbnQgPSBlbmNvZGVVUklDb21wb25lbnQoanN0QmxvY2suZmluZCgnLndpa2ktZWRpdCcpLnZhbCgpKTsKICAgIHZhciBhdHRhY2htZW50cyA9IGZvcm0uZmluZCgnLmF0dGFjaG1lbnRzX2ZpZWxkcyBpbnB1dCcpLnNlcmlhbGl6ZSgpOwoKICAgICQuYWpheCh7CiAgICAgIHVybDogdXJsLAogICAgICB0eXBlOiAncG9zdCcsCiAgICAgIGRhdGE6ICJ0ZXh0PSIgKyBlbGVtZW50ICsgJyYnICsgYXR0YWNobWVudHMsCiAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpewogICAgICAgIGpzdEJsb2NrLmZpbmQoJy53aWtpLXByZXZpZXcnKS5odG1sKGRhdGEpOwogICAgICAgIHNldHVwV2lraVRhYmxlU29ydGFibGVIZWFkZXIoKTsKICAgICAgfQogICAgfSk7CiAgfSk7Cn0pOwoKZnVuY3Rpb24ga2VlcEFuY2hvck9uU2lnbkluKGZvcm0pewogIHZhciBoYXNoID0gZGVjb2RlVVJJQ29tcG9uZW50KHNlbGYuZG9jdW1lbnQubG9jYXRpb24uaGFzaCk7CiAgaWYgKGhhc2gpIHsKICAgIGlmIChoYXNoLmluZGV4T2YoIiMiKSA9PT0gLTEpIHsKICAgICAgaGFzaCA9ICIjIiArIGhhc2g7CiAgICB9CiAgICBmb3JtLmFjdGlvbiA9IGZvcm0uYWN0aW9uICsgaGFzaDsKICB9CiAgcmV0dXJuIHRydWU7Cn0KCiQoZnVuY3Rpb24gKCQpIHsKICAkKCcjYXV0aF9zb3VyY2VfbGRhcF9tb2RlJykuY2hhbmdlKGZ1bmN0aW9uICgpIHsKICAgICQoJy5sZGFwc193YXJuaW5nJykudG9nZ2xlKCQodGhpcykudmFsKCkgIT0gJ2xkYXBzX3ZlcmlmeV9wZWVyJyk7CiAgfSkuY2hhbmdlKCk7Cn0pOwoKZnVuY3Rpb24gc2V0RmlsZWNvbnRlbnRDb250YWluZXJIZWlnaHQoKSB7CiAgdmFyICRmaWxlY29udGFpbmVyID0gJCgnLmZpbGVjb250ZW50LWNvbnRhaW5lcicpOwogIHZhciBmaWxlVHlwZVNlbGVjdG9ycyA9IFsnLmltYWdlJywgJ3ZpZGVvJ107CgogIGlmKCRmaWxlY29udGFpbmVyLmxlbmd0aCA+IDAgJiYgJGZpbGVjb250YWluZXIuZmluZChmaWxlVHlwZVNlbGVjdG9ycy5qb2luKCcsJykpLmxlbmd0aCA9PT0gMSkgewogICAgdmFyIGNvbnRhaW5lck9mZnNldFRvcCA9ICRmaWxlY29udGFpbmVyLm9mZnNldCgpLnRvcDsKICAgIHZhciBjb250YWluZXJNYXJnaW5Cb3R0b20gPSBwYXJzZUludCgkZmlsZWNvbnRhaW5lci5jc3MoJ21hcmdpbkJvdHRvbScpKTsKICAgIHZhciBwYWdpbmF0aW9uSGVpZ2h0ID0gJGZpbGVjb250YWluZXIubmV4dCgnLnBhZ2luYXRpb24nKS5oZWlnaHQoKTsKICAgIHZhciBkaWZmID0gY29udGFpbmVyT2Zmc2V0VG9wICsgY29udGFpbmVyTWFyZ2luQm90dG9tICsgcGFnaW5hdGlvbkhlaWdodDsKCiAgICAkZmlsZWNvbnRhaW5lci5jc3MoJ2hlaWdodCcsICdjYWxjKDEwMHZoIC0gJyArIGRpZmYgKyAncHgpJykKICB9Cn0KCmZ1bmN0aW9uIHNldHVwQXR0YWNobWVudERldGFpbCgpIHsKICBzZXRGaWxlY29udGVudENvbnRhaW5lckhlaWdodCgpOwogICQod2luZG93KS5yZXNpemUoc2V0RmlsZWNvbnRlbnRDb250YWluZXJIZWlnaHQpOwp9CgpmdW5jdGlvbiBzZXR1cFdpa2lUYWJsZVNvcnRhYmxlSGVhZGVyKCkgewogICQoJ2Rpdi53aWtpIHRhYmxlJykuZWFjaChmdW5jdGlvbihpLCB0YWJsZSl7CiAgICBpZiAodGFibGUucm93cy5sZW5ndGggPCAzKSByZXR1cm4gdHJ1ZTsKICAgIHZhciB0ciA9ICQodGFibGUucm93cykuZmlyc3QoKTsKICAgIGlmICh0ci5maW5kKCJUSCIpLmxlbmd0aCA+IDApIHsKICAgICAgdHIuYXR0cignZGF0YS1zb3J0LW1ldGhvZCcsICdub25lJyk7CiAgICAgIHRyLmZpbmQoIlREIikuYXR0cignZGF0YS1zb3J0LW1ldGhvZCcsICdub25lJyk7CiAgICAgIG5ldyBUYWJsZXNvcnQodGFibGUpOwogICAgfQogIH0pOwp9CgokKGZ1bmN0aW9uICgpIHsKICAkKCJbdGl0bGVdOm5vdCgubm8tdG9vbHRpcCkiKS50b29sdGlwKHsKICAgIHNob3c6IHsKICAgICAgZGVsYXk6IDQwMAogICAgfSwKICAgIHBvc2l0aW9uOiB7CiAgICAgIG15OiAiY2VudGVyIGJvdHRvbS01IiwKICAgICAgYXQ6ICJjZW50ZXIgdG9wIgogICAgfQogIH0pOwp9KTsKCmZ1bmN0aW9uIGlubGluZUF1dG9Db21wbGV0ZShlbGVtZW50KSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gZG8gbm90IGF0dGFjaCBpZiBUcmlidXRlIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQKICAgIGlmIChlbGVtZW50LmRhdGFzZXQudHJpYnV0ZSA9PT0gJ3RydWUnKSB7cmV0dXJufTsKCiAgICBjb25zdCBnZXREYXRhU291cmNlID0gZnVuY3Rpb24oZW50aXR5KSB7CiAgICAgIGNvbnN0IGRhdGFTb3VyY2VzID0gcm0uQXV0b0NvbXBsZXRlLmRhdGFTb3VyY2VzOwoKICAgICAgaWYgKGRhdGFTb3VyY2VzW2VudGl0eV0pIHsKICAgICAgICByZXR1cm4gZGF0YVNvdXJjZXNbZW50aXR5XTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KCiAgICBjb25zdCByZW1vdGVTZWFyY2ggPSBmdW5jdGlvbih1cmwsIGNiKSB7CiAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkKICAgICAgewogICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkgewogICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7CiAgICAgICAgICAgIGNiKGRhdGEpOwogICAgICAgICAgfSBlbHNlIGlmICh4aHIuc3RhdHVzID09PSA0MDMpIHsKICAgICAgICAgICAgY2IoW10pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfTsKICAgICAgeGhyLm9wZW4oIkdFVCIsIHVybCwgdHJ1ZSk7CiAgICAgIHhoci5zZW5kKCk7CiAgICB9OwoKICAgIGNvbnN0IHRyaWJ1dGUgPSBuZXcgVHJpYnV0ZSh7CiAgICAgIGNvbGxlY3Rpb246IFsKICAgICAgICB7CiAgICAgICAgICB0cmlnZ2VyOiAnIycsCiAgICAgICAgICB2YWx1ZXM6IGZ1bmN0aW9uICh0ZXh0LCBjYikgewogICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0LnR5cGUgPT09ICd0ZXh0JyAmJiAkKGVsZW1lbnQpLmF0dHIoJ2F1dG9jb21wbGV0ZScpICE9ICdvZmYnKSB7CiAgICAgICAgICAgICAgJChlbGVtZW50KS5hdHRyKCdhdXRvY29tcGxldGUnLCAnb2ZmJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVtb3RlU2VhcmNoKGdldERhdGFTb3VyY2UoJ2lzc3VlcycpICsgZW5jb2RlVVJJQ29tcG9uZW50KHRleHQpLCBmdW5jdGlvbiAoaXNzdWVzKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGNiKGlzc3Vlcyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIGxvb2t1cDogJ2xhYmVsJywKICAgICAgICAgIGZpbGxBdHRyOiAnbGFiZWwnLAogICAgICAgICAgcmVxdWlyZUxlYWRpbmdTcGFjZTogdHJ1ZSwKICAgICAgICAgIHNlbGVjdFRlbXBsYXRlOiBmdW5jdGlvbiAoaXNzdWUpIHsKICAgICAgICAgICAgbGV0IGxlYWRpbmdIYXNoID0gIiMiCiAgICAgICAgICAgIC8vIGtlZXAgIyMgc3ludGF4IHdoaWNoIGlzIGEgdmFsaWQgaXNzdWUgc3ludGF4IHRvIHNob3cgaXNzdWUgd2l0aCB0aXRsZS4KICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudE1lbnRpb25UZXh0U25hcHNob3QuY2hhckF0KDApID09PSAiIyIpIHsKICAgICAgICAgICAgICBsZWFkaW5nSGFzaCA9ICIjIyIKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbGVhZGluZ0hhc2ggKyBpc3N1ZS5vcmlnaW5hbC5pZDsKICAgICAgICAgIH0sCiAgICAgICAgICBtZW51SXRlbVRlbXBsYXRlOiBmdW5jdGlvbiAoaXNzdWUpIHsKICAgICAgICAgICAgcmV0dXJuIHNhbml0aXplSFRNTChpc3N1ZS5vcmlnaW5hbC5sYWJlbCk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICB0cmlnZ2VyOiAnW1snLAogICAgICAgICAgdmFsdWVzOiBmdW5jdGlvbiAodGV4dCwgY2IpIHsKICAgICAgICAgICAgcmVtb3RlU2VhcmNoKGdldERhdGFTb3VyY2UoJ3dpa2lfcGFnZXMnKSArIGVuY29kZVVSSUNvbXBvbmVudCh0ZXh0KSwgZnVuY3Rpb24gKHdpa2lQYWdlcykgewogICAgICAgICAgICAgIHJldHVybiBjYih3aWtpUGFnZXMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICBsb29rdXA6ICdsYWJlbCcsCiAgICAgICAgICBmaWxsQXR0cjogJ2xhYmVsJywKICAgICAgICAgIHJlcXVpcmVMZWFkaW5nU3BhY2U6IHRydWUsCiAgICAgICAgICBzZWxlY3RUZW1wbGF0ZTogZnVuY3Rpb24gKHdpa2lQYWdlKSB7CiAgICAgICAgICAgIHJldHVybiAnW1snICsgd2lraVBhZ2Uub3JpZ2luYWwudmFsdWUgKyAnXV0nOwogICAgICAgICAgfSwKICAgICAgICAgIG1lbnVJdGVtVGVtcGxhdGU6IGZ1bmN0aW9uICh3aWtpUGFnZSkgewogICAgICAgICAgICByZXR1cm4gc2FuaXRpemVIVE1MKHdpa2lQYWdlLm9yaWdpbmFsLmxhYmVsKTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIHRyaWdnZXI6ICdAJywKICAgICAgICAgIGxvb2t1cDogZnVuY3Rpb24gKHVzZXIsIG1lbnRpb25UZXh0KSB7CiAgICAgICAgICAgIHJldHVybiB1c2VyLm5hbWUgKyB1c2VyLmZpcnN0bmFtZSArIHVzZXIubGFzdG5hbWUgKyB1c2VyLmxvZ2luOwogICAgICAgICAgfSwKICAgICAgICAgIHZhbHVlczogZnVuY3Rpb24gKHRleHQsIGNiKSB7CiAgICAgICAgICAgIGNvbnN0IHVybCA9IGdldERhdGFTb3VyY2UoJ3VzZXJzJyk7CiAgICAgICAgICAgIGlmICh1cmwpIHsKICAgICAgICAgICAgICByZW1vdGVTZWFyY2godXJsICsgZW5jb2RlVVJJQ29tcG9uZW50KHRleHQpLCBmdW5jdGlvbiAodXNlcnMpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjYih1c2Vycyk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICBtZW51SXRlbVRlbXBsYXRlOiBmdW5jdGlvbiAodXNlcikgewogICAgICAgICAgICByZXR1cm4gdXNlci5vcmlnaW5hbC5uYW1lOwogICAgICAgICAgfSwKICAgICAgICAgIHNlbGVjdFRlbXBsYXRlOiBmdW5jdGlvbiAodXNlcikgewogICAgICAgICAgICByZXR1cm4gJ0AnICsgdXNlci5vcmlnaW5hbC5sb2dpbjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIF0sCiAgICAgIG5vTWF0Y2hUZW1wbGF0ZTogIiIKICAgIH0pOwoKICAgIHRyaWJ1dGUuYXR0YWNoKGVsZW1lbnQpOwp9CgoKJChkb2N1bWVudCkucmVhZHkoc2V0dXBBamF4SW5kaWNhdG9yKTsKJChkb2N1bWVudCkucmVhZHkoaGlkZU9uTG9hZCk7CiQoZG9jdW1lbnQpLnJlYWR5KGFkZEZvcm1PYnNlcnZlcnNGb3JEb3VibGVTdWJtaXQpOwokKGRvY3VtZW50KS5yZWFkeShkZWZhdWx0Rm9jdXMpOwokKGRvY3VtZW50KS5yZWFkeShzZXR1cEF0dGFjaG1lbnREZXRhaWwpOwokKGRvY3VtZW50KS5yZWFkeShzZXR1cFRhYnMpOwokKGRvY3VtZW50KS5yZWFkeShzZXR1cEZpbGVQcmV2aWV3TmF2aWdhdGlvbik7CiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwV2lraVRhYmxlU29ydGFibGVIZWFkZXIpOwokKGRvY3VtZW50KS5vbignZm9jdXMnLCAnW2RhdGEtYXV0by1jb21wbGV0ZT10cnVlXScsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgaW5saW5lQXV0b0NvbXBsZXRlKGV2ZW50LnRhcmdldCk7Cn0pOwo=" | |
| }, | |
| "attachments.js": { | |
| "hash": "4afd9cae5021cc34bad5a9c0ad6313e8", | |
| "path": "/usr/src/redmine/public/javascripts/attachments.js", | |
| "base64": "LyogUmVkbWluZSAtIHByb2plY3QgbWFuYWdlbWVudCBzb2Z0d2FyZQogICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAyMyAgSmVhbi1QaGlsaXBwZSBMYW5nICovCgpmdW5jdGlvbiBhZGRGaWxlKGlucHV0RWwsIGZpbGUsIGVhZ2VyVXBsb2FkKSB7CiAgdmFyIGF0dGFjaG1lbnRzRmllbGRzID0gJChpbnB1dEVsKS5jbG9zZXN0KCcuYXR0YWNobWVudHNfZm9ybScpLmZpbmQoJy5hdHRhY2htZW50c19maWVsZHMnKTsKICB2YXIgYWRkQXR0YWNobWVudCA9ICQoaW5wdXRFbCkuY2xvc2VzdCgnLmF0dGFjaG1lbnRzX2Zvcm0nKS5maW5kKCcuYWRkX2F0dGFjaG1lbnQnKTsKICB2YXIgbWF4RmlsZXMgPSAoJChpbnB1dEVsKS5hdHRyKCdtdWx0aXBsZScpID09ICdtdWx0aXBsZScgPyAxMCA6IDEpOwoKICBpZiAoYXR0YWNobWVudHNGaWVsZHMuY2hpbGRyZW4oKS5sZW5ndGggPCBtYXhGaWxlcykgewogICAgdmFyIGF0dGFjaG1lbnRJZCA9IGFkZEZpbGUubmV4dEF0dGFjaG1lbnRJZCsrOwogICAgdmFyIGZpbGVTcGFuID0gJCgnPHNwYW4+JywgeyBpZDogJ2F0dGFjaG1lbnRzXycgKyBhdHRhY2htZW50SWQgfSk7CiAgICB2YXIgcGFyYW0gPSAkKGlucHV0RWwpLmRhdGEoJ3BhcmFtJyk7CiAgICBpZiAoIXBhcmFtKSB7cGFyYW0gPSAnYXR0YWNobWVudHMnfTsKCiAgICBmaWxlU3Bhbi5hcHBlbmQoCiAgICAgICAgJCgnPGlucHV0PicsIHsgdHlwZTogJ3RleHQnLCAnY2xhc3MnOiAnaWNvbiBpY29uLWF0dGFjaG1lbnQgZmlsZW5hbWUgcmVhZG9ubHknLCBuYW1lOiBwYXJhbSArJ1snICsgYXR0YWNobWVudElkICsgJ11bZmlsZW5hbWVdJywgcmVhZG9ubHk6ICdyZWFkb25seSd9ICkudmFsKGZpbGUubmFtZSksCiAgICAgICAgJCgnPGlucHV0PicsIHsgdHlwZTogJ3RleHQnLCAnY2xhc3MnOiAnZGVzY3JpcHRpb24nLCBuYW1lOiBwYXJhbSArICdbJyArIGF0dGFjaG1lbnRJZCArICddW2Rlc2NyaXB0aW9uXScsIG1heGxlbmd0aDogMjU1LCBwbGFjZWhvbGRlcjogJChpbnB1dEVsKS5kYXRhKCdkZXNjcmlwdGlvbi1wbGFjZWhvbGRlcicpIH0gKS50b2dnbGUoIWVhZ2VyVXBsb2FkKSwKICAgICAgICAkKCc8aW5wdXQ+JywgeyB0eXBlOiAnaGlkZGVuJywgJ2NsYXNzJzogJ3Rva2VuJywgbmFtZTogcGFyYW0gKyAnWycgKyBhdHRhY2htZW50SWQgKyAnXVt0b2tlbl0nfSApLAogICAgICAgICQoJzxhPiZuYnNwPC9hPicpLmF0dHIoeyBocmVmOiAiIyIsICdjbGFzcyc6ICdpY29uLW9ubHkgaWNvbi1kZWwgcmVtb3ZlLXVwbG9hZCcgfSkuY2xpY2socmVtb3ZlRmlsZSkudG9nZ2xlKCFlYWdlclVwbG9hZCkKICAgICkuYXBwZW5kVG8oYXR0YWNobWVudHNGaWVsZHMpOwoKICAgIGlmICgkKGlucHV0RWwpLmRhdGEoJ2Rlc2NyaXB0aW9uJykgPT0gMCkgewogICAgICBmaWxlU3Bhbi5maW5kKCdpbnB1dC5kZXNjcmlwdGlvbicpLnJlbW92ZSgpOwogICAgfQoKICAgIGlmKGVhZ2VyVXBsb2FkKSB7CiAgICAgIGFqYXhVcGxvYWQoZmlsZSwgYXR0YWNobWVudElkLCBmaWxlU3BhbiwgaW5wdXRFbCk7CiAgICB9CgogICAgYWRkQXR0YWNobWVudC50b2dnbGUoYXR0YWNobWVudHNGaWVsZHMuY2hpbGRyZW4oKS5sZW5ndGggPCBtYXhGaWxlcyk7CiAgICByZXR1cm4gYXR0YWNobWVudElkOwogIH0KICByZXR1cm4gbnVsbDsKfQoKYWRkRmlsZS5uZXh0QXR0YWNobWVudElkID0gMTsKCmZ1bmN0aW9uIGFqYXhVcGxvYWQoZmlsZSwgYXR0YWNobWVudElkLCBmaWxlU3BhbiwgaW5wdXRFbCkgewoKICBmdW5jdGlvbiBvbkxvYWRzdGFydChlKSB7CiAgICBmaWxlU3Bhbi5yZW1vdmVDbGFzcygnYWpheC13YWl0aW5nJyk7CiAgICBmaWxlU3Bhbi5hZGRDbGFzcygnYWpheC1sb2FkaW5nJyk7CiAgICAkKCdpbnB1dDpzdWJtaXQnLCAkKHRoaXMpLnBhcmVudHMoJ2Zvcm0nKSkuYXR0cignZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTsKICB9CgogIGZ1bmN0aW9uIG9uUHJvZ3Jlc3MoZSkgewogICAgaWYoZS5sZW5ndGhDb21wdXRhYmxlKSB7CiAgICAgIHRoaXMucHJvZ3Jlc3NiYXIoICd2YWx1ZScsIGUubG9hZGVkICogMTAwIC8gZS50b3RhbCApOwogICAgfQogIH0KCiAgZnVuY3Rpb24gYWN0dWFsVXBsb2FkKGZpbGUsIGF0dGFjaG1lbnRJZCwgZmlsZVNwYW4sIGlucHV0RWwpIHsKCiAgICBhamF4VXBsb2FkLnVwbG9hZGluZysrOwoKICAgIHVwbG9hZEJsb2IoZmlsZSwgJChpbnB1dEVsKS5kYXRhKCd1cGxvYWQtcGF0aCcpLCBhdHRhY2htZW50SWQsIHsKICAgICAgICBsb2Fkc3RhcnRFdmVudEhhbmRsZXI6IG9uTG9hZHN0YXJ0LmJpbmQocHJvZ3Jlc3NTcGFuKSwKICAgICAgICBwcm9ncmVzc0V2ZW50SGFuZGxlcjogb25Qcm9ncmVzcy5iaW5kKHByb2dyZXNzU3BhbikKICAgICAgfSkKICAgICAgLmRvbmUoZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgYWRkSW5saW5lQXR0YWNobWVudE1hcmt1cChmaWxlKTsKICAgICAgICBwcm9ncmVzc1NwYW4ucHJvZ3Jlc3NiYXIoICd2YWx1ZScsIDEwMCApLnJlbW92ZSgpOwogICAgICAgIGZpbGVTcGFuLmZpbmQoJ2lucHV0LmRlc2NyaXB0aW9uLCBhJykuY3NzKCdkaXNwbGF5JywgJ2lubGluZS1ibG9jaycpOwogICAgICB9KQogICAgICAuZmFpbChmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICBwcm9ncmVzc1NwYW4udGV4dChyZXN1bHQuc3RhdHVzVGV4dCk7CiAgICAgIH0pLmFsd2F5cyhmdW5jdGlvbigpIHsKICAgICAgICBhamF4VXBsb2FkLnVwbG9hZGluZy0tOwogICAgICAgIGZpbGVTcGFuLnJlbW92ZUNsYXNzKCdhamF4LWxvYWRpbmcnKTsKICAgICAgICB2YXIgZm9ybSA9IGZpbGVTcGFuLnBhcmVudHMoJ2Zvcm0nKTsKICAgICAgICBpZiAoZm9ybS5xdWV1ZSgndXBsb2FkJykubGVuZ3RoID09IDAgJiYgYWpheFVwbG9hZC51cGxvYWRpbmcgPT0gMCkgewogICAgICAgICAgJCgnaW5wdXQ6c3VibWl0JywgZm9ybSkucmVtb3ZlQXR0cignZGlzYWJsZWQnKTsKICAgICAgICB9CiAgICAgICAgZm9ybS5kZXF1ZXVlKCd1cGxvYWQnKTsKICAgICAgfSk7CiAgfQoKICB2YXIgcHJvZ3Jlc3NTcGFuID0gJCgnPGRpdj4nKS5pbnNlcnRBZnRlcihmaWxlU3Bhbi5maW5kKCdpbnB1dC5maWxlbmFtZScpKTsKICBwcm9ncmVzc1NwYW4ucHJvZ3Jlc3NiYXIoKTsKICBmaWxlU3Bhbi5hZGRDbGFzcygnYWpheC13YWl0aW5nJyk7CgogIHZhciBtYXhTeW5jVXBsb2FkID0gJChpbnB1dEVsKS5kYXRhKCdtYXgtY29uY3VycmVudC11cGxvYWRzJyk7CgogIGlmKG1heFN5bmNVcGxvYWQgPT0gbnVsbCB8fCBtYXhTeW5jVXBsb2FkIDw9IDAgfHwgYWpheFVwbG9hZC51cGxvYWRpbmcgPCBtYXhTeW5jVXBsb2FkKQogICAgYWN0dWFsVXBsb2FkKGZpbGUsIGF0dGFjaG1lbnRJZCwgZmlsZVNwYW4sIGlucHV0RWwpOwogIGVsc2UKICAgICQoaW5wdXRFbCkucGFyZW50cygnZm9ybScpLnF1ZXVlKCd1cGxvYWQnLCBhY3R1YWxVcGxvYWQuYmluZCh0aGlzLCBmaWxlLCBhdHRhY2htZW50SWQsIGZpbGVTcGFuLCBpbnB1dEVsKSk7Cn0KCmFqYXhVcGxvYWQudXBsb2FkaW5nID0gMDsKCmZ1bmN0aW9uIHJlbW92ZUZpbGUoKSB7CiAgJCh0aGlzKS5jbG9zZXN0KCcuYXR0YWNobWVudHNfZm9ybScpLmZpbmQoJy5hZGRfYXR0YWNobWVudCcpLnNob3coKTsKICAkKHRoaXMpLnBhcmVudCgnc3BhbicpLnJlbW92ZSgpOwogIHJldHVybiBmYWxzZTsKfQoKZnVuY3Rpb24gdXBsb2FkQmxvYihibG9iLCB1cGxvYWRVcmwsIGF0dGFjaG1lbnRJZCwgb3B0aW9ucykgewoKICB2YXIgYWN0dWFsT3B0aW9ucyA9ICQuZXh0ZW5kKHsKICAgIGxvYWRzdGFydEV2ZW50SGFuZGxlcjogJC5ub29wLAogICAgcHJvZ3Jlc3NFdmVudEhhbmRsZXI6ICQubm9vcAogIH0sIG9wdGlvbnMpOwoKICB1cGxvYWRVcmwgPSB1cGxvYWRVcmwgKyAnP2F0dGFjaG1lbnRfaWQ9JyArIGF0dGFjaG1lbnRJZDsKICBpZiAoYmxvYiBpbnN0YW5jZW9mIHdpbmRvdy5CbG9iKSB7CiAgICB1cGxvYWRVcmwgKz0gJyZmaWxlbmFtZT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGJsb2IubmFtZSk7CiAgICB1cGxvYWRVcmwgKz0gJyZjb250ZW50X3R5cGU9JyArIGVuY29kZVVSSUNvbXBvbmVudChibG9iLnR5cGUpOwogIH0KCiAgcmV0dXJuICQuYWpheCh1cGxvYWRVcmwsIHsKICAgIHR5cGU6ICdQT1NUJywKICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgIGJlZm9yZVNlbmQ6IGZ1bmN0aW9uKGpxWGhyLCBzZXR0aW5ncykgewogICAgICBqcVhoci5zZXRSZXF1ZXN0SGVhZGVyKCdBY2NlcHQnLCAnYXBwbGljYXRpb24vanMnKTsKICAgICAgLy8gYXR0YWNoIHByb3BlciBGaWxlIG9iamVjdAogICAgICBzZXR0aW5ncy5kYXRhID0gYmxvYjsKICAgIH0sCiAgICB4aHI6IGZ1bmN0aW9uKCkgewogICAgICB2YXIgeGhyID0gJC5hamF4U2V0dGluZ3MueGhyKCk7CiAgICAgIHhoci51cGxvYWQub25sb2Fkc3RhcnQgPSBhY3R1YWxPcHRpb25zLmxvYWRzdGFydEV2ZW50SGFuZGxlcjsKICAgICAgeGhyLnVwbG9hZC5vbnByb2dyZXNzID0gYWN0dWFsT3B0aW9ucy5wcm9ncmVzc0V2ZW50SGFuZGxlcjsKICAgICAgcmV0dXJuIHhocjsKICAgIH0sCiAgICBkYXRhOiBibG9iLAogICAgY2FjaGU6IGZhbHNlLAogICAgcHJvY2Vzc0RhdGE6IGZhbHNlCiAgfSk7Cn0KCmZ1bmN0aW9uIGFkZElucHV0RmlsZXMoaW5wdXRFbCkgewogIHZhciBhdHRhY2htZW50c0ZpZWxkcyA9ICQoaW5wdXRFbCkuY2xvc2VzdCgnLmF0dGFjaG1lbnRzX2Zvcm0nKS5maW5kKCcuYXR0YWNobWVudHNfZmllbGRzJyk7CiAgdmFyIGFkZEF0dGFjaG1lbnQgPSAkKGlucHV0RWwpLmNsb3Nlc3QoJy5hdHRhY2htZW50c19mb3JtJykuZmluZCgnLmFkZF9hdHRhY2htZW50Jyk7CiAgdmFyIGNsZWFyZWRGaWxlSW5wdXQgPSAkKGlucHV0RWwpLmNsb25lKCkudmFsKCcnKTsKICB2YXIgc2l6ZUV4Y2VlZGVkID0gZmFsc2U7CiAgdmFyIHBhcmFtID0gJChpbnB1dEVsKS5kYXRhKCdwYXJhbScpOwogIGlmICghcGFyYW0pIHtwYXJhbSA9ICdhdHRhY2htZW50cyd9OwoKICBpZiAoJC5hamF4U2V0dGluZ3MueGhyKCkudXBsb2FkICYmIGlucHV0RWwuZmlsZXMpIHsKICAgIC8vIHVwbG9hZCBmaWxlcyB1c2luZyBhamF4CiAgICBzaXplRXhjZWVkZWQgPSB1cGxvYWRBbmRBdHRhY2hGaWxlcyhpbnB1dEVsLmZpbGVzLCBpbnB1dEVsKTsKICAgICQoaW5wdXRFbCkucmVtb3ZlKCk7CiAgfSBlbHNlIHsKICAgIC8vIGJyb3dzZXIgbm90IHN1cHBvcnRpbmcgdGhlIGZpbGUgQVBJLCB1cGxvYWQgb24gZm9ybSBzdWJtaXNzaW9uCiAgICB2YXIgYXR0YWNobWVudElkOwogICAgdmFyIGFGaWxlbmFtZSA9IGlucHV0RWwudmFsdWUuc3BsaXQoL1wvfFxcLyk7CiAgICBhdHRhY2htZW50SWQgPSBhZGRGaWxlKGlucHV0RWwsIHsgbmFtZTogYUZpbGVuYW1lWyBhRmlsZW5hbWUubGVuZ3RoIC0gMSBdIH0sIGZhbHNlKTsKICAgIGlmIChhdHRhY2htZW50SWQpIHsKICAgICAgJChpbnB1dEVsKS5hdHRyKHsgbmFtZTogcGFyYW0gKyAnWycgKyBhdHRhY2htZW50SWQgKyAnXVtmaWxlXScsIHN0eWxlOiAnZGlzcGxheTpub25lOycgfSkuYXBwZW5kVG8oJyNhdHRhY2htZW50c18nICsgYXR0YWNobWVudElkKTsKICAgIH0KICB9CgogIGNsZWFyZWRGaWxlSW5wdXQucHJlcGVuZFRvKGFkZEF0dGFjaG1lbnQpOwp9CgpmdW5jdGlvbiB1cGxvYWRBbmRBdHRhY2hGaWxlcyhmaWxlcywgaW5wdXRFbCkgewoKICB2YXIgbWF4RmlsZVNpemUgPSAkKGlucHV0RWwpLmRhdGEoJ21heC1maWxlLXNpemUnKTsKICB2YXIgbWF4RmlsZVNpemVFeGNlZWRlZCA9ICQoaW5wdXRFbCkuZGF0YSgnbWF4LWZpbGUtc2l6ZS1tZXNzYWdlJyk7CgogIHZhciBzaXplRXhjZWVkZWQgPSBmYWxzZTsKICB2YXIgZmlsZXNMZW5ndGggPSAkKGlucHV0RWwpLmNsb3Nlc3QoJy5hdHRhY2htZW50c19mb3JtJykuZmluZCgnLmF0dGFjaG1lbnRzX2ZpZWxkcycpLmNoaWxkcmVuKCkubGVuZ3RoICsgZmlsZXMubGVuZ3RoCiAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLnNpemUgJiYgbWF4RmlsZVNpemUgIT0gbnVsbCAmJiB0aGlzLnNpemUgPiBwYXJzZUludChtYXhGaWxlU2l6ZSkpIHtzaXplRXhjZWVkZWQ9dHJ1ZTt9CiAgfSk7CiAgaWYgKHNpemVFeGNlZWRlZCkgewogICAgd2luZG93LmFsZXJ0KG1heEZpbGVTaXplRXhjZWVkZWQpOwogIH0gZWxzZSB7CiAgICAkLmVhY2goZmlsZXMsIGZ1bmN0aW9uKCkge2FkZEZpbGUoaW5wdXRFbCwgdGhpcywgdHJ1ZSk7fSk7CiAgfQoKICBpZiAoZmlsZXNMZW5ndGggPiAoJChpbnB1dEVsKS5hdHRyKCdtdWx0aXBsZScpID09ICdtdWx0aXBsZScgPyAxMCA6IDEpKSB7CiAgICB3aW5kb3cuYWxlcnQoJChpbnB1dEVsKS5kYXRhKCdtYXgtbnVtYmVyLW9mLWZpbGVzLW1lc3NhZ2UnKSk7CiAgfQogIHJldHVybiBzaXplRXhjZWVkZWQ7Cn0KCmZ1bmN0aW9uIGhhbmRsZUZpbGVEcm9wRXZlbnQoZSkgewoKICAkKHRoaXMpLnJlbW92ZUNsYXNzKCdmaWxlb3ZlcicpOwogIGJsb2NrRXZlbnRQcm9wYWdhdGlvbihlKTsKCiAgaWYgKCQuaW5BcnJheSgnRmlsZXMnLCBlLmRhdGFUcmFuc2Zlci50eXBlcykgPiAtMSkgewogICAgaGFuZGxlRmlsZURyb3BFdmVudC50YXJnZXQgPSBlLnRhcmdldDsKICAgIGlmICgkKHRoaXMpLmhhc0NsYXNzKCdjdXN0b20tZmllbGQtZmlsZWRyb3BsaXN0bmVyJykpewogICAgICB1cGxvYWRBbmRBdHRhY2hGaWxlcyhlLmRhdGFUcmFuc2Zlci5maWxlcywgJCh0aGlzKS5maW5kKCdpbnB1dDpmaWxlLmN1c3RvbS1maWVsZC1maWxlZHJvcCcpLmZpcnN0KCkpOwogICAgfSBlbHNlIHsKICAgICAgdXBsb2FkQW5kQXR0YWNoRmlsZXMoZS5kYXRhVHJhbnNmZXIuZmlsZXMsICQodGhpcykuZmluZCgnaW5wdXQ6ZmlsZS5maWxlZHJvcCcpLmZpcnN0KCkpOwogICAgfQogIH0KfQpoYW5kbGVGaWxlRHJvcEV2ZW50LnRhcmdldCA9ICcnOwoKZnVuY3Rpb24gZHJhZ092ZXJIYW5kbGVyKGUpIHsKICAkKHRoaXMpLmFkZENsYXNzKCdmaWxlb3ZlcicpOwogIGJsb2NrRXZlbnRQcm9wYWdhdGlvbihlKTsKICBlLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ2NvcHknOwp9CgpmdW5jdGlvbiBkcmFnT3V0SGFuZGxlcihlKSB7CiAgJCh0aGlzKS5yZW1vdmVDbGFzcygnZmlsZW92ZXInKTsKICBibG9ja0V2ZW50UHJvcGFnYXRpb24oZSk7Cn0KCmZ1bmN0aW9uIHNldHVwRmlsZURyb3AoKSB7CiAgaWYgKHdpbmRvdy5GaWxlICYmIHdpbmRvdy5GaWxlTGlzdCAmJiB3aW5kb3cuUHJvZ3Jlc3NFdmVudCAmJiB3aW5kb3cuRm9ybURhdGEpIHsKCiAgICAkLmV2ZW50LmFkZFByb3AoJ2RhdGFUcmFuc2ZlcicpOwoKICAgICQoJ2Zvcm0gZGl2LmJveDpub3QoLmZpbGVkcm9wbGlzdG5lciknKS5oYXMoJ2lucHV0OmZpbGUuZmlsZWRyb3AnKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAkKHRoaXMpLm9uKHsKICAgICAgICAgIGRyYWdvdmVyOiBkcmFnT3ZlckhhbmRsZXIsCiAgICAgICAgICBkcmFnbGVhdmU6IGRyYWdPdXRIYW5kbGVyLAogICAgICAgICAgZHJvcDogaGFuZGxlRmlsZURyb3BFdmVudCwKICAgICAgICAgIHBhc3RlOiBjb3B5SW1hZ2VGcm9tQ2xpcGJvYXJkCiAgICAgIH0pLmFkZENsYXNzKCdmaWxlZHJvcGxpc3RuZXInKTsKICAgIH0pOwoKICAgICQoJ2Zvcm0gZGl2LmJveCBpbnB1dDpmaWxlLmN1c3RvbS1maWVsZC1maWxlZHJvcCcpLmNsb3Nlc3QoJ3AnKS5ub3QoJy5jdXN0b20tZmllbGQtZmlsZWRyb3BsaXN0bmVyJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgJCh0aGlzKS5vbih7CiAgICAgICAgICBkcmFnb3ZlcjogZHJhZ092ZXJIYW5kbGVyLAogICAgICAgICAgZHJhZ2xlYXZlOiBkcmFnT3V0SGFuZGxlciwKICAgICAgICAgIGRyb3A6IGhhbmRsZUZpbGVEcm9wRXZlbnQKICAgICAgfSkuYWRkQ2xhc3MoJ2N1c3RvbS1maWVsZC1maWxlZHJvcGxpc3RuZXInKTsKICAgIH0pOwogIH0KfQoKZnVuY3Rpb24gYWRkSW5saW5lQXR0YWNobWVudE1hcmt1cChmaWxlKSB7CiAgLy8gaW5zZXJ0IHVwbG9hZGVkIGltYWdlIGlubGluZSBpZiBkcm9wcGVkIGFyZWEgaXMgY3VycmVudGx5IGZvY3VzZWQgdGV4dGFyZWEKICBpZigkKGhhbmRsZUZpbGVEcm9wRXZlbnQudGFyZ2V0KS5oYXNDbGFzcygnd2lraS1lZGl0JykgJiYgJC5pbkFycmF5KGZpbGUudHlwZSwgd2luZG93Lndpa2lJbWFnZU1pbWVUeXBlcykgPiAtMSkgewogICAgdmFyICR0ZXh0YXJlYSA9ICQoaGFuZGxlRmlsZURyb3BFdmVudC50YXJnZXQpOwogICAgdmFyIGN1cnNvclBvc2l0aW9uID0gJHRleHRhcmVhLnByb3AoJ3NlbGVjdGlvblN0YXJ0Jyk7CiAgICB2YXIgZGVzY3JpcHRpb24gPSAkdGV4dGFyZWEudmFsKCk7CiAgICB2YXIgc2FuaXRpemVkRmlsZW5hbWUgPSBmaWxlLm5hbWUucmVwbGFjZSgvW1wvXD9cJVwqXDpcfFwiXCc8PlxuXHJdKy8sICdfJyk7CiAgICB2YXIgaW5saW5lRmlsZW5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQoc2FuaXRpemVkRmlsZW5hbWUpCiAgICAgIC5yZXBsYWNlKC9bISgpXS9nLCBmdW5jdGlvbihtYXRjaCkgeyByZXR1cm4gIiUiICsgbWF0Y2guY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikgfSk7CiAgICB2YXIgbmV3TGluZUJlZm9yZSA9IHRydWU7CiAgICB2YXIgbmV3TGluZUFmdGVyID0gdHJ1ZTsKICAgIGlmKGN1cnNvclBvc2l0aW9uID09PSAwIHx8IGRlc2NyaXB0aW9uLnN1YnN0cihjdXJzb3JQb3NpdGlvbi0xLDEpLm1hdGNoKC9ccnxcbi8pKSB7CiAgICAgIG5ld0xpbmVCZWZvcmUgPSBmYWxzZTsKICAgIH0KICAgIGlmKGRlc2NyaXB0aW9uLnN1YnN0cihjdXJzb3JQb3NpdGlvbiwxKS5tYXRjaCgvXHJ8XG4vKSkgewogICAgICBuZXdMaW5lQWZ0ZXIgPSBmYWxzZTsKICAgIH0KCiAgICAkdGV4dGFyZWEudmFsKAogICAgICBkZXNjcmlwdGlvbi5zdWJzdHJpbmcoMCwgY3Vyc29yUG9zaXRpb24pCiAgICAgICsgKG5ld0xpbmVCZWZvcmUgPyAnXG4nIDogJycpCiAgICAgICsgaW5saW5lRmlsZW5hbWUKICAgICAgKyAobmV3TGluZUFmdGVyID8gJ1xuJyA6ICcnKQogICAgICArIGRlc2NyaXB0aW9uLnN1YnN0cmluZyhjdXJzb3JQb3NpdGlvbiwgZGVzY3JpcHRpb24ubGVuZ3RoKQogICAgKTsKCiAgICAkdGV4dGFyZWEucHJvcCh7CiAgICAgICdzZWxlY3Rpb25TdGFydCc6IGN1cnNvclBvc2l0aW9uICsgbmV3TGluZUJlZm9yZSwKICAgICAgJ3NlbGVjdGlvbkVuZCc6IGN1cnNvclBvc2l0aW9uICsgaW5saW5lRmlsZW5hbWUubGVuZ3RoICsgbmV3TGluZUJlZm9yZQogICAgfSk7CiAgICAkdGV4dGFyZWEucGFyZW50cygnLmpzdEJsb2NrJykKICAgICAgLmZpbmQoJy5qc3RiX2ltZycpLmNsaWNrKCk7CgogICAgLy8gbW92ZSBjdXJzb3IgaW50byBuZXh0IGxpbmUKICAgIGN1cnNvclBvc2l0aW9uID0gJHRleHRhcmVhLnByb3AoJ3NlbGVjdGlvblN0YXJ0Jyk7CiAgICAkdGV4dGFyZWEucHJvcCh7CiAgICAgICdzZWxlY3Rpb25TdGFydCc6IGN1cnNvclBvc2l0aW9uICsgMSwKICAgICAgJ3NlbGVjdGlvbkVuZCc6IGN1cnNvclBvc2l0aW9uICsgMQogICAgfSk7CgogIH0KfQoKZnVuY3Rpb24gY29weUltYWdlRnJvbUNsaXBib2FyZChlKSB7CiAgaWYgKCEkKGUudGFyZ2V0KS5oYXNDbGFzcygnd2lraS1lZGl0JykpIHsgcmV0dXJuOyB9CiAgdmFyIGNsaXBib2FyZERhdGEgPSBlLmNsaXBib2FyZERhdGEgfHwgZS5vcmlnaW5hbEV2ZW50LmNsaXBib2FyZERhdGEKICBpZiAoIWNsaXBib2FyZERhdGEpIHsgcmV0dXJuOyB9CiAgaWYgKGNsaXBib2FyZERhdGEudHlwZXMuc29tZShmdW5jdGlvbih0KXsgcmV0dXJuIC9edGV4dFwvcGxhaW4kLy50ZXN0KHQpOyB9KSkgeyByZXR1cm47IH0KCiAgdmFyIGZpbGVzID0gY2xpcGJvYXJkRGF0YS5maWxlcwogIGZvciAodmFyIGkgPSAwIDsgaSA8IGZpbGVzLmxlbmd0aCA7IGkrKykgewogICAgdmFyIGZpbGUgPSBmaWxlc1tpXTsKICAgIGlmIChmaWxlLnR5cGUuaW5kZXhPZigiaW1hZ2UiKSAhPSAtMSkgewogICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKCk7CiAgICAgIHZhciBmaWxlbmFtZSA9ICdjbGlwYm9hcmQtJwogICAgICAgICsgZGF0ZS5nZXRGdWxsWWVhcigpCiAgICAgICAgKyAoJzAnKyhkYXRlLmdldE1vbnRoKCkrMSkpLnNsaWNlKC0yKQogICAgICAgICsgKCcwJytkYXRlLmdldERhdGUoKSkuc2xpY2UoLTIpCiAgICAgICAgKyAoJzAnK2RhdGUuZ2V0SG91cnMoKSkuc2xpY2UoLTIpCiAgICAgICAgKyAoJzAnK2RhdGUuZ2V0TWludXRlcygpKS5zbGljZSgtMikKICAgICAgICArICctJyArIHJhbmRvbUtleSg1KS50b0xvY2FsZUxvd2VyQ2FzZSgpCiAgICAgICAgKyAnLicgKyBmaWxlLm5hbWUuc3BsaXQoJy4nKS5wb3AoKTsKCiAgICAgIC8vIGdldCBpbnB1dCBmaWxlIGluIHRoZSBjbG9zZXN0IGZvcm0KICAgICAgdmFyIGlucHV0RWwgPSAkKHRoaXMpLmNsb3Nlc3QoImZvcm0iKS5maW5kKCdpbnB1dDpmaWxlLmZpbGVkcm9wJyk7CiAgICAgIGhhbmRsZUZpbGVEcm9wRXZlbnQudGFyZ2V0ID0gZS50YXJnZXQ7CiAgICAgIGFkZEZpbGUoaW5wdXRFbCwgbmV3IEZpbGUoW2ZpbGVdLCBmaWxlbmFtZSwgeyB0eXBlOiBmaWxlLnR5cGUgfSksIHRydWUpOwogICAgfQogIH0KfQoKJChkb2N1bWVudCkucmVhZHkoc2V0dXBGaWxlRHJvcCk7CiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCl7CiAgJCgiaW5wdXQuZGVsZXRlZF9hdHRhY2htZW50IikuY2hhbmdlKGZ1bmN0aW9uKCl7CiAgICAkKHRoaXMpLnBhcmVudHMoJy5leGlzdGluZy1hdHRhY2htZW50JykudG9nZ2xlQ2xhc3MoJ2RlbGV0ZWQnLCAkKHRoaXMpLmlzKCI6Y2hlY2tlZCIpKTsKICB9KS5jaGFuZ2UoKTsKfSk7Cg==" | |
| } | |
| }, | |
| "6.1.2": { | |
| "application.js": { | |
| "hash": "56ba96447d01ffda9ae4932a39064e1f", | |
| "path": "/usr/src/redmine/public/assets/application-legacy-54b0807d.js", | |
| "base64": "LyoqCiAqIFJlZG1pbmUgLSBwcm9qZWN0IG1hbmFnZW1lbnQgc29mdHdhcmUKICogQ29weXJpZ2h0IChDKSAyMDA2LSAgSmVhbi1QaGlsaXBwZSBMYW5nCiAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCiAqLwoKZnVuY3Rpb24gc2FuaXRpemVIVE1MKHN0cmluZykgewogIHZhciB0ZW1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIHRlbXAudGV4dENvbnRlbnQgPSBzdHJpbmc7CiAgcmV0dXJuIHRlbXAuaW5uZXJIVE1MOwp9CgpmdW5jdGlvbiBjaGVja0FsbChpZCwgY2hlY2tlZCkgewogICQoJyMnK2lkKS5maW5kKCdpbnB1dFt0eXBlPWNoZWNrYm94XTplbmFibGVkJykucHJvcCgnY2hlY2tlZCcsIGNoZWNrZWQpOwp9CgpmdW5jdGlvbiB0b2dnbGVDaGVja2JveGVzQnlTZWxlY3RvcihzZWxlY3RvcikgewogIHZhciBhbGxfY2hlY2tlZCA9IHRydWU7CiAgJChzZWxlY3RvcikuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgaWYgKCEkKHRoaXMpLmlzKCc6Y2hlY2tlZCcpKSB7IGFsbF9jaGVja2VkID0gZmFsc2U7IH0KICB9KTsKICAkKHNlbGVjdG9yKS5wcm9wKCdjaGVja2VkJywgIWFsbF9jaGVja2VkKS50cmlnZ2VyKCdjaGFuZ2UnKTsKfQoKZnVuY3Rpb24gc2hvd0FuZFNjcm9sbFRvKGlkLCBmb2N1cykgewogIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOwogIGlmIChlbCkgewogICAgZWwuc3R5bGUuZGlzcGxheSA9ICcnOyAvLyBzaG93KCkKICAgIGlmIChmb2N1cykgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZm9jdXMpPy5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7CiAgICBlbC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnaW5zdGFudCcgfSk7CiAgfQp9CgpmdW5jdGlvbiB0b2dnbGVSb3dHcm91cChlbCkgewogIHZhciB0ciA9ICQoZWwpLnBhcmVudHMoJ3RyJykuZmlyc3QoKTsKICB2YXIgbiA9IHRyLm5leHQoKTsKICB0ci50b2dnbGVDbGFzcygnb3BlbicpOwogICQoZWwpLnRvZ2dsZUNsYXNzKCdpY29uLWV4cGFuZGVkIGljb24tY29sbGFwc2VkJyk7CiAgdG9nZ2xlRXhwZW5kQ29sbGFwc2VJY29uKGVsKQogIHdoaWxlIChuLmxlbmd0aCAmJiAhbi5oYXNDbGFzcygnZ3JvdXAnKSkgewogICAgbi50b2dnbGUoKTsKICAgIG4gPSBuLm5leHQoJ3RyJyk7CiAgfQp9CgpmdW5jdGlvbiB0b2dnbGVFeHBlbmRDb2xsYXBzZUljb24oZWwpIHsKICBjb25zdCBzdmcgPSBlbC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc3ZnJykuaXRlbSgwKQoKICBpZiAoc3ZnID09PSBudWxsKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBpZiAoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdpY29uLWV4cGFuZGVkJykpIHsKICAgIHVwZGF0ZVNWR0ljb24oc3ZnLCAnYW5nbGUtZG93bicpCiAgICBzdmcuY2xhc3NMaXN0LnJlbW92ZSgnaWNvbi1ydGwnKQogIH0gZWxzZSB7CiAgICB1cGRhdGVTVkdJY29uKHN2ZywgJ2FuZ2xlLXJpZ2h0JykKICAgIHN2Zy5jbGFzc0xpc3QuYWRkKCdpY29uLXJ0bCcpCiAgfQp9CgpmdW5jdGlvbiB1cGRhdGVTVkdJY29uKGVsZW1lbnQsIGljb24pIHsKICBjb25zdCBpY29uRWxlbWVudCA9IGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInVzZSIpLml0ZW0oMCkKCiAgaWYgKGljb25FbGVtZW50ID09PSBudWxsKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBjb25zdCBpY29uUGF0aCA9IGljb25FbGVtZW50LmdldEF0dHJpYnV0ZSgnaHJlZicpOwogIGljb25FbGVtZW50LnNldEF0dHJpYnV0ZSgnaHJlZicsIGljb25QYXRoLnJlcGxhY2UoLyMuKiQvZywgIiNpY29uLS0iICsgaWNvbikpCn0KCmZ1bmN0aW9uIGNyZWF0ZVNWR0ljb24oaWNvbikgewogIGNvbnN0IGNsb25lZEljb24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjaWNvbi1jb3B5LXNvdXJjZSBzdmcnKS5jbG9uZU5vZGUodHJ1ZSk7CiAgdXBkYXRlU1ZHSWNvbihjbG9uZWRJY29uLCBpY29uKTsKICByZXR1cm4gY2xvbmVkSWNvbgp9CgpmdW5jdGlvbiBjb2xsYXBzZUFsbFJvd0dyb3VwcyhlbCkgewogIHZhciB0Ym9keSA9ICQoZWwpLnBhcmVudHMoJ3Rib2R5JykuZmlyc3QoKTsKICB0Ym9keS5jaGlsZHJlbigndHInKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnZ3JvdXAnKSkgewogICAgICAkKHRoaXMpLnJlbW92ZUNsYXNzKCdvcGVuJyk7CiAgICAgIHZhciBleHBhbmRlciA9ICQodGhpcykuZmluZCgnLmV4cGFuZGVyJyk7CiAgICAgIGV4cGFuZGVyLnN3aXRjaENsYXNzKCdpY29uLWV4cGFuZGVkJywgJ2ljb24tY29sbGFwc2VkJyk7CiAgICAgIHRvZ2dsZUV4cGVuZENvbGxhcHNlSWNvbihleHBhbmRlclswXSk7CiAgICB9IGVsc2UgewogICAgICAkKHRoaXMpLmhpZGUoKTsKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gZXhwYW5kQWxsUm93R3JvdXBzKGVsKSB7CiAgdmFyIHRib2R5ID0gJChlbCkucGFyZW50cygndGJvZHknKS5maXJzdCgpOwogIHRib2R5LmNoaWxkcmVuKCd0cicpLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgIGlmICgkKHRoaXMpLmhhc0NsYXNzKCdncm91cCcpKSB7CiAgICAgICQodGhpcykuYWRkQ2xhc3MoJ29wZW4nKTsKICAgICAgdmFyIGV4cGFuZGVyID0gJCh0aGlzKS5maW5kKCcuZXhwYW5kZXInKTsKICAgICAgZXhwYW5kZXIuc3dpdGNoQ2xhc3MoJ2ljb24tY29sbGFwc2VkJywgJ2ljb24tZXhwYW5kZWQnKTsKICAgICAgdG9nZ2xlRXhwZW5kQ29sbGFwc2VJY29uKGV4cGFuZGVyWzBdKTsKICAgIH0gZWxzZSB7CiAgICAgICQodGhpcykuc2hvdygpOwogICAgfQogIH0pOwp9CgpmdW5jdGlvbiB0b2dnbGVBbGxSb3dHcm91cHMoZWwpIHsKICB2YXIgdHIgPSAkKGVsKS5wYXJlbnRzKCd0cicpLmZpcnN0KCk7CiAgaWYgKHRyLmhhc0NsYXNzKCdvcGVuJykpIHsKICAgIGNvbGxhcHNlQWxsUm93R3JvdXBzKGVsKTsKICB9IGVsc2UgewogICAgZXhwYW5kQWxsUm93R3JvdXBzKGVsKTsKICB9Cn0KCmZ1bmN0aW9uIHRvZ2dsZUZpZWxkc2V0KGVsKSB7CiAgdmFyIGZpZWxkc2V0ID0gJChlbCkucGFyZW50cygnZmllbGRzZXQnKS5maXJzdCgpOwogIGZpZWxkc2V0LnRvZ2dsZUNsYXNzKCdjb2xsYXBzZWQnKTsKICBmaWVsZHNldC5jaGlsZHJlbignbGVnZW5kJykudG9nZ2xlQ2xhc3MoJ2ljb24tZXhwYW5kZWQgaWNvbi1jb2xsYXBzZWQnKTsKICB0b2dnbGVFeHBlbmRDb2xsYXBzZUljb24oZmllbGRzZXQuY2hpbGRyZW4oJ2xlZ2VuZCcpWzBdKQogIGZpZWxkc2V0LmNoaWxkcmVuKCdkaXYnKS50b2dnbGUoKTsKfQoKZnVuY3Rpb24gaGlkZUZpZWxkc2V0KGVsKSB7CiAgdmFyIGZpZWxkc2V0ID0gJChlbCkucGFyZW50cygnZmllbGRzZXQnKS5maXJzdCgpOwogIGZpZWxkc2V0LnRvZ2dsZUNsYXNzKCdjb2xsYXBzZWQnKTsKICBmaWVsZHNldC5jaGlsZHJlbignZGl2JykuaGlkZSgpOwp9CgovLyBjb2x1bW5zIHNlbGVjdGlvbgpmdW5jdGlvbiBtb3ZlT3B0aW9ucyh0aGVTZWxGcm9tLCB0aGVTZWxUbykgewogICQodGhlU2VsRnJvbSkuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykuZGV0YWNoKCkucHJvcCgic2VsZWN0ZWQiLCBmYWxzZSkuYXBwZW5kVG8oJCh0aGVTZWxUbykpOwp9CgpmdW5jdGlvbiBtb3ZlT3B0aW9uVXAodGhlU2VsKSB7CiAgJCh0aGVTZWwpLmZpbmQoJ29wdGlvbjpzZWxlY3RlZCcpLmVhY2goZnVuY3Rpb24oKXsKICAgICQodGhpcykucHJldignOm5vdCg6c2VsZWN0ZWQpJykuZGV0YWNoKCkuaW5zZXJ0QWZ0ZXIoJCh0aGlzKSk7CiAgfSk7Cn0KCmZ1bmN0aW9uIG1vdmVPcHRpb25Ub3AodGhlU2VsKSB7CiAgJCh0aGVTZWwpLmZpbmQoJ29wdGlvbjpzZWxlY3RlZCcpLmRldGFjaCgpLnByZXBlbmRUbygkKHRoZVNlbCkpOwp9CgpmdW5jdGlvbiBtb3ZlT3B0aW9uRG93bih0aGVTZWwpIHsKICAkKCQodGhlU2VsKS5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS5nZXQoKS5yZXZlcnNlKCkpLmVhY2goZnVuY3Rpb24oKXsKICAgICQodGhpcykubmV4dCgnOm5vdCg6c2VsZWN0ZWQpJykuZGV0YWNoKCkuaW5zZXJ0QmVmb3JlKCQodGhpcykpOwogIH0pOwp9CgpmdW5jdGlvbiBtb3ZlT3B0aW9uQm90dG9tKHRoZVNlbCkgewogICQodGhlU2VsKS5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS5kZXRhY2goKS5hcHBlbmRUbygkKHRoZVNlbCkpOwp9CgpmdW5jdGlvbiBpbml0RmlsdGVycygpIHsKICAkKCcjYWRkX2ZpbHRlcl9zZWxlY3QnKS5jaGFuZ2UoZnVuY3Rpb24oKSB7CiAgICBhZGRGaWx0ZXIoJCh0aGlzKS52YWwoKSwgJycsIFtdKTsKICB9KTsKICAkKCcjZmlsdGVycy10YWJsZSAuZmllbGQgaW5wdXRbdHlwZT1jaGVja2JveF0nKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgdG9nZ2xlRmlsdGVyKCQodGhpcykudmFsKCkpOwogIH0pOwogICQoJyNmaWx0ZXJzLXRhYmxlJykub24oJ2NsaWNrJywgJy5maWVsZCBpbnB1dFt0eXBlPWNoZWNrYm94XScsIGZ1bmN0aW9uKCkgewogICAgdG9nZ2xlRmlsdGVyKCQodGhpcykudmFsKCkpOwogIH0pOwogICQoJyNmaWx0ZXJzLXRhYmxlJykub24oJ2tleXByZXNzJywgJ2lucHV0W3R5cGU9dGV4dF0nLCBmdW5jdGlvbihlKSB7CiAgICBpZiAoZS5rZXlDb2RlID09IDEzKSAkKHRoaXMpLmNsb3Nlc3QoJ2Zvcm0nKS5zdWJtaXQoKTsKICB9KTsKfQoKZnVuY3Rpb24gYWRkRmlsdGVyKGZpZWxkLCBvcGVyYXRvciwgdmFsdWVzKSB7CiAgdmFyIGZpZWxkSWQgPSBmaWVsZC5yZXBsYWNlKCcuJywgJ18nKTsKICB2YXIgdHIgPSAkKCcjdHJfJytmaWVsZElkKTsKCiAgdmFyIGZpbHRlck9wdGlvbnMgPSBhdmFpbGFibGVGaWx0ZXJzW2ZpZWxkXTsKICBpZiAoIWZpbHRlck9wdGlvbnMpIHJldHVybjsKCiAgaWYgKGZpbHRlck9wdGlvbnNbJ3JlbW90ZSddICYmIGZpbHRlck9wdGlvbnNbJ3ZhbHVlcyddID09IG51bGwpIHsKICAgICQuZ2V0SlNPTihmaWx0ZXJzVXJsLCB7J25hbWUnOiBmaWVsZH0pLmRvbmUoZnVuY3Rpb24oZGF0YSkgewogICAgICBmaWx0ZXJPcHRpb25zWyd2YWx1ZXMnXSA9IGRhdGE7CiAgICAgIGFkZEZpbHRlcihmaWVsZCwgb3BlcmF0b3IsIHZhbHVlcykgOwogICAgfSk7CiAgICByZXR1cm47CiAgfQoKICBpZiAodHIubGVuZ3RoID4gMCkgewogICAgdHIuc2hvdygpOwogIH0gZWxzZSB7CiAgICBidWlsZEZpbHRlclJvdyhmaWVsZCwgb3BlcmF0b3IsIHZhbHVlcyk7CiAgfQogICQoJyNjYl8nK2ZpZWxkSWQpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTsKICB0b2dnbGVGaWx0ZXIoZmllbGQpOwogIHRvZ2dsZU11bHRpU2VsZWN0SWNvbkluaXQoKTsKICAkKCcjYWRkX2ZpbHRlcl9zZWxlY3QnKS52YWwoJycpLmZpbmQoJ29wdGlvbicpLmVhY2goZnVuY3Rpb24oKSB7CiAgICBpZiAoJCh0aGlzKS5hdHRyKCd2YWx1ZScpID09IGZpZWxkKSB7CiAgICAgICQodGhpcykuYXR0cignZGlzYWJsZWQnLCB0cnVlKTsKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gYnVpbGRGaWx0ZXJSb3coZmllbGQsIG9wZXJhdG9yLCB2YWx1ZXMpIHsKICB2YXIgZmllbGRJZCA9IGZpZWxkLnJlcGxhY2UoJy4nLCAnXycpOwogIHZhciBmaWx0ZXJUYWJsZSA9ICQoIiNmaWx0ZXJzLXRhYmxlIik7CiAgdmFyIGZpbHRlck9wdGlvbnMgPSBhdmFpbGFibGVGaWx0ZXJzW2ZpZWxkXTsKICBpZiAoIWZpbHRlck9wdGlvbnMpIHJldHVybjsKICB2YXIgb3BlcmF0b3JzID0gb3BlcmF0b3JCeVR5cGVbZmlsdGVyT3B0aW9uc1sndHlwZSddXTsKICB2YXIgZmlsdGVyVmFsdWVzID0gZmlsdGVyT3B0aW9uc1sndmFsdWVzJ107CiAgdmFyIHNlbGVjdDsKCiAgdmFyIHRyID0gJCgnPGRpdiBjbGFzcz0iZmlsdGVyIj4nKS5hdHRyKCdpZCcsICd0cl8nK2ZpZWxkSWQpLmh0bWwoCiAgICAnPGRpdiBjbGFzcz0iZmllbGQiPjxpbnB1dCBjaGVja2VkPSJjaGVja2VkIiBpZD0iY2JfJytmaWVsZElkKyciIG5hbWU9ImZbXSIgdmFsdWU9IicrZmllbGQrJyIgdHlwZT0iY2hlY2tib3giPjxsYWJlbCBmb3I9ImNiXycrZmllbGRJZCsnIj4gJytzYW5pdGl6ZUhUTUwoZmlsdGVyT3B0aW9uc1snbmFtZSddKSsnPC9sYWJlbD48L2Rpdj4nICsKICAgICc8ZGl2IGNsYXNzPSJvcGVyYXRvciI+PHNlbGVjdCBpZD0ib3BlcmF0b3JzXycrZmllbGRJZCsnIiBuYW1lPSJvcFsnK2ZpZWxkKyddIj48L3NlbGVjdD48L2Rpdj4nICsKICAgICc8ZGl2IGNsYXNzPSJ2YWx1ZXMiPjwvZGl2PicKICApOwogIGZpbHRlclRhYmxlLmFwcGVuZCh0cik7CgogIHNlbGVjdCA9IHRyLmZpbmQoJy5vcGVyYXRvciBzZWxlY3QnKTsKICBvcGVyYXRvcnMuZm9yRWFjaChmdW5jdGlvbihvcCkgewogICAgdmFyIG9wdGlvbiA9ICQoJzxvcHRpb24+JykudmFsKG9wKS50ZXh0KG9wZXJhdG9yTGFiZWxzW29wXSk7CiAgICBpZiAob3AgPT0gb3BlcmF0b3IpIHsgb3B0aW9uLnByb3AoJ3NlbGVjdGVkJywgdHJ1ZSk7IH0KICAgIHNlbGVjdC5hcHBlbmQob3B0aW9uKTsKICB9KTsKICBzZWxlY3QuY2hhbmdlKGZ1bmN0aW9uKCl7IHRvZ2dsZU9wZXJhdG9yKGZpZWxkKTsgfSk7CgogIHN3aXRjaCAoZmlsdGVyT3B0aW9uc1sndHlwZSddKSB7CiAgY2FzZSAibGlzdCI6CiAgY2FzZSAibGlzdF93aXRoX2hpc3RvcnkiOgogIGNhc2UgImxpc3Rfb3B0aW9uYWwiOgogIGNhc2UgImxpc3Rfb3B0aW9uYWxfd2l0aF9oaXN0b3J5IjoKICBjYXNlICJsaXN0X3N0YXR1cyI6CiAgY2FzZSAibGlzdF9zdWJwcm9qZWN0cyI6CiAgICBjb25zdCBpY29uVHlwZSA9IHZhbHVlcy5sZW5ndGggPiAxID8gJ3RvZ2dsZS1taW51cycgOiAndG9nZ2xlLXBsdXMnOwogICAgY29uc3QgaWNvblN2ZyA9IGNyZWF0ZVNWR0ljb24oaWNvblR5cGUpCgogICAgdHIuZmluZCgnLnZhbHVlcycpLmFwcGVuZCgKICAgICAgJCgnPHNwYW4+JywgeyBzdHlsZTogJ2Rpc3BsYXk6bm9uZTsnIH0pLmFwcGVuZCgKICAgICAgICAkKCc8c2VsZWN0PicsIHsKICAgICAgICAgIGNsYXNzOiAndmFsdWUnLAogICAgICAgICAgaWQ6IGB2YWx1ZXNfJHtmaWVsZElkfV8xYCwKICAgICAgICAgIG5hbWU6IGB2WyR7ZmllbGR9XVtdYCwKICAgICAgICB9KSwKICAgICAgICAnXG4nLAogICAgICAgICQoJzxzcGFuPicsIHsgY2xhc3M6IGB0b2dnbGUtbXVsdGlzZWxlY3QgaWNvbi1vbmx5IGljb24tJHtpY29uVHlwZX1gIH0pLmFwcGVuZChpY29uU3ZnKQogICAgICApCiAgICApOwogICAgc2VsZWN0ID0gdHIuZmluZCgnLnZhbHVlcyBzZWxlY3QnKTsKICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMSkgeyBzZWxlY3QuYXR0cignbXVsdGlwbGUnLCB0cnVlKTsgfQogICAgZmlsdGVyVmFsdWVzLmZvckVhY2goZnVuY3Rpb24oZmlsdGVyVmFsdWUpIHsKICAgICAgdmFyIG9wdGlvbiA9ICQoJzxvcHRpb24+Jyk7CiAgICAgIGlmICgkLmlzQXJyYXkoZmlsdGVyVmFsdWUpKSB7CiAgICAgICAgb3B0aW9uLnZhbChmaWx0ZXJWYWx1ZVsxXSkudGV4dChmaWx0ZXJWYWx1ZVswXSk7CiAgICAgICAgaWYgKCQuaW5BcnJheShmaWx0ZXJWYWx1ZVsxXSwgdmFsdWVzKSA+IC0xKSB7b3B0aW9uLnByb3AoJ3NlbGVjdGVkJywgdHJ1ZSk7fQogICAgICAgIGlmIChmaWx0ZXJWYWx1ZS5sZW5ndGggPT0gMykgewogICAgICAgICAgdmFyIG9wdGdyb3VwID0gc2VsZWN0LmZpbmQoJ29wdGdyb3VwJykuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuICQodGhpcykuYXR0cignbGFiZWwnKSA9PSBmaWx0ZXJWYWx1ZVsyXX0pOwogICAgICAgICAgaWYgKCFvcHRncm91cC5sZW5ndGgpIHtvcHRncm91cCA9ICQoJzxvcHRncm91cD4nKS5hdHRyKCdsYWJlbCcsIGZpbHRlclZhbHVlWzJdKTt9CiAgICAgICAgICBvcHRpb24gPSBvcHRncm91cC5hcHBlbmQob3B0aW9uKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb3B0aW9uLnZhbChmaWx0ZXJWYWx1ZSkudGV4dChmaWx0ZXJWYWx1ZSk7CiAgICAgICAgaWYgKCQuaW5BcnJheShmaWx0ZXJWYWx1ZSwgdmFsdWVzKSA+IC0xKSB7b3B0aW9uLnByb3AoJ3NlbGVjdGVkJywgdHJ1ZSk7fQogICAgICB9CiAgICAgIHNlbGVjdC5hcHBlbmQob3B0aW9uKTsKICAgIH0pOwogICAgYnJlYWs7CiAgY2FzZSAiZGF0ZSI6CiAgY2FzZSAiZGF0ZV9wYXN0IjoKICAgIHRyLmZpbmQoJy52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9ImRhdGUiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnXzEiIHNpemU9IjEwIiBjbGFzcz0idmFsdWUgZGF0ZV92YWx1ZSIgLz48L3NwYW4+JyArCiAgICAgICcgPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZTsiPjxpbnB1dCB0eXBlPSJkYXRlIiBuYW1lPSJ2WycrZmllbGQrJ11bXSIgaWQ9InZhbHVlc18nK2ZpZWxkSWQrJ18yIiBzaXplPSIxMCIgY2xhc3M9InZhbHVlIGRhdGVfdmFsdWUiIC8+PC9zcGFuPicgKwogICAgICAnIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKyciIHNpemU9IjMiIGNsYXNzPSJ2YWx1ZSIgLz4gJytsYWJlbERheVBsdXJhbCsnPC9zcGFuPicKICAgICk7CiAgICAkKCcjdmFsdWVzXycrZmllbGRJZCsnXzEnKS52YWwodmFsdWVzWzBdKS5kYXRlcGlja2VyRmFsbGJhY2soZGF0ZXBpY2tlck9wdGlvbnMpOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQrJ18yJykudmFsKHZhbHVlc1sxXSkuZGF0ZXBpY2tlckZhbGxiYWNrKGRhdGVwaWNrZXJPcHRpb25zKTsKICAgICQoJyN2YWx1ZXNfJytmaWVsZElkKS52YWwodmFsdWVzWzBdKTsKICAgIGJyZWFrOwogIGNhc2UgInN0cmluZyI6CiAgY2FzZSAidGV4dCI6CiAgY2FzZSAic2VhcmNoIjoKICAgIHRyLmZpbmQoJy52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnIiBzaXplPSIzMCIgY2xhc3M9InZhbHVlIiAvPjwvc3Bhbj4nCiAgICApOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQpLnZhbCh2YWx1ZXNbMF0pOwogICAgYnJlYWs7CiAgY2FzZSAicmVsYXRpb24iOgogICAgdHIuZmluZCgnLnZhbHVlcycpLmFwcGVuZCgKICAgICAgJzxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKyciIHNpemU9IjYiIGNsYXNzPSJ2YWx1ZSIgLz48L3NwYW4+JyArCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PHNlbGVjdCBjbGFzcz0idmFsdWUiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnXzEiPjwvc2VsZWN0Pjwvc3Bhbj4nCiAgICApOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQpLnZhbCh2YWx1ZXNbMF0pOwogICAgc2VsZWN0ID0gdHIuZmluZCgnLnZhbHVlcyBzZWxlY3QnKTsKICAgIGZpbHRlclZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKGZpbHRlclZhbHVlKSB7CiAgICAgIHZhciBvcHRpb24gPSAkKCc8b3B0aW9uPicpOwogICAgICBvcHRpb24udmFsKGZpbHRlclZhbHVlWzFdKS50ZXh0KGZpbHRlclZhbHVlWzBdKTsKICAgICAgaWYgKHZhbHVlc1swXSA9PSBmaWx0ZXJWYWx1ZVsxXSkgeyBvcHRpb24ucHJvcCgnc2VsZWN0ZWQnLCB0cnVlKTsgfQogICAgICBzZWxlY3QuYXBwZW5kKG9wdGlvbik7CiAgICB9KTsKICAgIGJyZWFrOwogIGNhc2UgImludGVnZXIiOgogIGNhc2UgImZsb2F0IjoKICBjYXNlICJ0cmVlIjoKICAgIHRyLmZpbmQoJy52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnXzEiIHNpemU9IjE0IiBjbGFzcz0idmFsdWUiIC8+PC9zcGFuPicgKwogICAgICAnIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKydfMiIgc2l6ZT0iMTQiIGNsYXNzPSJ2YWx1ZSIgLz48L3NwYW4+JwogICAgKTsKICAgICQoJyN2YWx1ZXNfJytmaWVsZElkKydfMScpLnZhbCh2YWx1ZXNbMF0pOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQrJ18yJykudmFsKHZhbHVlc1sxXSk7CiAgICBicmVhazsKICB9Cn0KCmZ1bmN0aW9uIHRvZ2dsZUZpbHRlcihmaWVsZCkgewogIHZhciBmaWVsZElkID0gZmllbGQucmVwbGFjZSgnLicsICdfJyk7CiAgaWYgKCQoJyNjYl8nICsgZmllbGRJZCkuaXMoJzpjaGVja2VkJykpIHsKICAgICQoIiNvcGVyYXRvcnNfIiArIGZpZWxkSWQpLnNob3coKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpOwogICAgdG9nZ2xlT3BlcmF0b3IoZmllbGQpOwogIH0gZWxzZSB7CiAgICAkKCIjb3BlcmF0b3JzXyIgKyBmaWVsZElkKS5oaWRlKCkuYXR0cignZGlzYWJsZWQnLCB0cnVlKTsKICAgIGVuYWJsZVZhbHVlcyhmaWVsZCwgW10pOwogIH0KfQoKZnVuY3Rpb24gZW5hYmxlVmFsdWVzKGZpZWxkLCBpbmRleGVzKSB7CiAgdmFyIGZpZWxkSWQgPSBmaWVsZC5yZXBsYWNlKCcuJywgJ18nKTsKICAkKCcjdHJfJytmaWVsZElkKycgLnZhbHVlcyAudmFsdWUnKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICBpZiAoJC5pbkFycmF5KGluZGV4LCBpbmRleGVzKSA+PSAwKSB7CiAgICAgICQodGhpcykucmVtb3ZlQXR0cignZGlzYWJsZWQnKTsKICAgICAgJCh0aGlzKS5wYXJlbnRzKCdzcGFuJykuZmlyc3QoKS5zaG93KCk7CiAgICB9IGVsc2UgewogICAgICAkKHRoaXMpLnZhbCgnJyk7CiAgICAgICQodGhpcykuYXR0cignZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgJCh0aGlzKS5wYXJlbnRzKCdzcGFuJykuZmlyc3QoKS5oaWRlKCk7CiAgICB9CgogICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ2dyb3VwJykpIHsKICAgICAgJCh0aGlzKS5hZGRDbGFzcygnb3BlbicpOwogICAgfSBlbHNlIHsKICAgICAgJCh0aGlzKS5zaG93KCk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIHRvZ2dsZU9wZXJhdG9yKGZpZWxkKSB7CiAgdmFyIGZpZWxkSWQgPSBmaWVsZC5yZXBsYWNlKCcuJywgJ18nKTsKICB2YXIgb3BlcmF0b3IgPSAkKCIjb3BlcmF0b3JzXyIgKyBmaWVsZElkKTsKICBzd2l0Y2ggKG9wZXJhdG9yLnZhbCgpKSB7CiAgICBjYXNlICIhKiI6CiAgICBjYXNlICIqIjoKICAgIGNhc2UgIm5kIjoKICAgIGNhc2UgInQiOgogICAgY2FzZSAibGQiOgogICAgY2FzZSAibnciOgogICAgY2FzZSAidyI6CiAgICBjYXNlICJsdyI6CiAgICBjYXNlICJsMnciOgogICAgY2FzZSAibm0iOgogICAgY2FzZSAibSI6CiAgICBjYXNlICJsbSI6CiAgICBjYXNlICJ5IjoKICAgIGNhc2UgIm8iOgogICAgY2FzZSAiYyI6CiAgICBjYXNlICIqbyI6CiAgICBjYXNlICIhbyI6CiAgICAgIGVuYWJsZVZhbHVlcyhmaWVsZCwgW10pOwogICAgICBicmVhazsKICAgIGNhc2UgIj48IjoKICAgICAgZW5hYmxlVmFsdWVzKGZpZWxkLCBbMCwxXSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAiPHQrIjoKICAgIGNhc2UgIj50KyI6CiAgICBjYXNlICI+PHQrIjoKICAgIGNhc2UgInQrIjoKICAgIGNhc2UgIj50LSI6CiAgICBjYXNlICI8dC0iOgogICAgY2FzZSAiPjx0LSI6CiAgICBjYXNlICJ0LSI6CiAgICAgIGVuYWJsZVZhbHVlcyhmaWVsZCwgWzJdKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICI9cCI6CiAgICBjYXNlICI9IXAiOgogICAgY2FzZSAiIXAiOgogICAgICBlbmFibGVWYWx1ZXMoZmllbGQsIFsxXSk7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgZW5hYmxlVmFsdWVzKGZpZWxkLCBbMF0pOwogICAgICBicmVhazsKICB9Cn0KCmZ1bmN0aW9uIHRvZ2dsZU11bHRpU2VsZWN0KGVsKSB7CiAgdmFyIGlzV29ya2Zsb3cgPSBlbC5jbG9zZXN0KCcuY29udHJvbGxlci13b3JrZmxvd3MnKTsKICBpZiAoZWwuYXR0cignbXVsdGlwbGUnKSkgewogICAgZWwucmVtb3ZlQXR0cignbXVsdGlwbGUnKTsKICAgIGlmIChpc1dvcmtmbG93KSB7IGVsLmZpbmQoIm9wdGlvblt2YWx1ZT1hbGxdIikuc2hvdygpOyB9CiAgICBlbC5hdHRyKCdzaXplJywgMSk7CiAgfSBlbHNlIHsKICAgIGVsLmF0dHIoJ211bHRpcGxlJywgdHJ1ZSk7CiAgICBpZiAoaXNXb3JrZmxvdykgeyBlbC5maW5kKCJvcHRpb25bdmFsdWU9YWxsXSIpLmF0dHIoInNlbGVjdGVkIiwgZmFsc2UpLmhpZGUoKTsgfQogICAgaWYgKGVsLmNoaWxkcmVuKCkubGVuZ3RoID4gMTApCiAgICAgIGVsLmF0dHIoJ3NpemUnLCAxMCk7CiAgICBlbHNlCiAgICAgIGVsLmF0dHIoJ3NpemUnLCA0KTsKICB9Cn0KCmZ1bmN0aW9uIHNob3dUYWIobmFtZSwgdXJsKSB7CiAgJCgnI3RhYi1jb250ZW50LScgKyBuYW1lKS5wYXJlbnQoKS5maW5kKCcudGFiLWNvbnRlbnQnKS5oaWRlKCk7CiAgJCgnI3RhYi1jb250ZW50LScgKyBuYW1lKS5zaG93KCk7CiAgJCgnI3RhYi0nICsgbmFtZSkuY2xvc2VzdCgnLnRhYnMnKS5maW5kKCdhJykucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkJyk7CiAgJCgnI3RhYi0nICsgbmFtZSkuYWRkQ2xhc3MoJ3NlbGVjdGVkJyk7CgogIHJlcGxhY2VJbkhpc3RvcnkodXJsKQoKICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIHNob3dJc3N1ZUhpc3Rvcnkoam91cm5hbCwgdXJsKSB7CiAgdGFiX2NvbnRlbnQgPSAkKCcjdGFiLWNvbnRlbnQtaGlzdG9yeScpOwogIHRhYl9jb250ZW50LnBhcmVudCgpLmZpbmQoJy50YWItY29udGVudCcpLmhpZGUoKTsKICB0YWJfY29udGVudC5zaG93KCk7CiAgdGFiX2NvbnRlbnQucGFyZW50KCkuY2hpbGRyZW4oJ2Rpdi50YWJzJykuZmluZCgnYScpLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpOwoKICAkKCcjdGFiLScgKyBqb3VybmFsKS5hZGRDbGFzcygnc2VsZWN0ZWQnKTsKCiAgcmVwbGFjZUluSGlzdG9yeSh1cmwpCgogIHN3aXRjaChqb3VybmFsKSB7CiAgICBjYXNlICdub3Rlcyc6CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbDpub3QoLmhhcy1ub3RlcyknKS5oaWRlKCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC53aWtpJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAuam91cm5hbC1hY3Rpb25zID4gKicpLnNob3coKTsKCiAgICAgIC8vIGFsd2F5cyBzaG93IHRodW1ibmFpbHMgaW4gbm90ZXMgdGFiCiAgICAgIHZhciB0aHVtYm5haWxzID0gdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwgLnRodW1ibmFpbHMnKTsKICAgICAgdGh1bWJuYWlscy5zaG93KCk7CiAgICAgIC8vIHNob3cgam91cm5hbHMgd2l0aG91dCBub3RlcywgYnV0IHdpdGggdGh1bWJuYWlscwogICAgICB0aHVtYm5haWxzLnBhcmVudHMoJy5qb3VybmFsJykuc2hvdygpOwogICAgICBicmVhazsKICAgIGNhc2UgJ3Byb3BlcnRpZXMnOgogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCcpLnNob3coKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWw6bm90KC5oYXMtZGV0YWlscyknKS5oaWRlKCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC53aWtpJykuaGlkZSgpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAudGh1bWJuYWlscycpLmhpZGUoKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwgLmpvdXJuYWwtYWN0aW9ucyA+IConKS5oaWRlKCk7CiAgICAgIC8vIFNob3cgcmVhY3Rpb24gYnV0dG9uIGluIHByb3BlcnRpZXMgdGFiCiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC5qb3VybmFsLWFjdGlvbnMgLnJlYWN0aW9uLWJ1dHRvbi13cmFwcGVyJykuc2hvdygpOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAud2lraScpLnNob3coKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwgLnRodW1ibmFpbHMnKS5zaG93KCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC5qb3VybmFsLWFjdGlvbnMgPiAqJykuc2hvdygpOwogIH0KCiAgcmV0dXJuIGZhbHNlOwp9CgpmdW5jdGlvbiBnZXRSZW1vdGVUYWIobmFtZSwgcmVtb3RlX3VybCwgdXJsLCBsb2FkX2Fsd2F5cykgewogIGxvYWRfYWx3YXlzID0gbG9hZF9hbHdheXMgfHwgZmFsc2U7CiAgdmFyIHRhYl9jb250ZW50ID0gJCgnI3RhYi1jb250ZW50LScgKyBuYW1lKTsKCiAgdGFiX2NvbnRlbnQucGFyZW50KCkuZmluZCgnLnRhYi1jb250ZW50JykuaGlkZSgpOwogIHRhYl9jb250ZW50LnBhcmVudCgpLmNoaWxkcmVuKCdkaXYudGFicycpLmZpbmQoJ2EnKS5yZW1vdmVDbGFzcygnc2VsZWN0ZWQnKTsKICAkKCcjdGFiLScgKyBuYW1lKS5hZGRDbGFzcygnc2VsZWN0ZWQnKTsKCiAgcmVwbGFjZUluSGlzdG9yeSh1cmwpOwoKICBpZiAodGFiX2NvbnRlbnQuY2hpbGRyZW4oKS5sZW5ndGggPT0gMCAmJiBsb2FkX2Fsd2F5cyA9PSBmYWxzZSkgewogICAgJC5hamF4KHsKICAgICAgdXJsOiByZW1vdGVfdXJsLAogICAgICB0eXBlOiAnZ2V0JywKICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSl7CiAgICAgICAgdGFiX2NvbnRlbnQuaHRtbChkYXRhKQogICAgICB9CiAgICB9KTsKICB9CgogIHRhYl9jb250ZW50LnNob3coKTsKICByZXR1cm4gZmFsc2U7Cn0KCi8vcmVwbGFjZXMgY3VycmVudCBVUkwgd2l0aCB0aGUgImhyZWYiIGF0dHJpYnV0ZSBvZiB0aGUgY3VycmVudCBsaW5rCi8vKG9ubHkgdHJpZ2dlcmVkIGlmIHN1cHBvcnRlZCBieSBicm93c2VyKQpmdW5jdGlvbiByZXBsYWNlSW5IaXN0b3J5KHVybCkgewogIGlmICgicmVwbGFjZVN0YXRlIiBpbiB3aW5kb3cuaGlzdG9yeSAmJiB1cmwgIT09IHVuZGVmaW5lZCkgewogICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKG51bGwsIGRvY3VtZW50LnRpdGxlLCB1cmwpOwogIH0KfQoKZnVuY3Rpb24gbW92ZVRhYlJpZ2h0KGVsKSB7CiAgdmFyIGxpcyA9ICQoZWwpLnBhcmVudHMoJ2Rpdi50YWJzJykuZmlyc3QoKS5maW5kKCd1bCcpLmNoaWxkcmVuKCk7CiAgdmFyIGJ3ID0gJChlbCkucGFyZW50cygnZGl2LnRhYnMtYnV0dG9ucycpLm91dGVyV2lkdGgodHJ1ZSk7CiAgdmFyIHRhYnNXaWR0aCA9IDA7CiAgdmFyIGkgPSAwOwogIGxpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgaWYgKCQodGhpcykuaXMoJzp2aXNpYmxlJykpIHsKICAgICAgdGFic1dpZHRoICs9ICQodGhpcykub3V0ZXJXaWR0aCh0cnVlKTsKICAgIH0KICB9KTsKICBpZiAodGFic1dpZHRoIDwgJChlbCkucGFyZW50cygnZGl2LnRhYnMnKS5maXJzdCgpLndpZHRoKCkgLSBidykgeyByZXR1cm47IH0KICAkKGVsKS5zaWJsaW5ncygnLnRhYi1sZWZ0JykucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7CiAgd2hpbGUgKGk8bGlzLmxlbmd0aCAmJiAhbGlzLmVxKGkpLmlzKCc6dmlzaWJsZScpKSB7IGkrKzsgfQogIHZhciB3ID0gbGlzLmVxKGkpLndpZHRoKCk7CiAgbGlzLmVxKGkpLmhpZGUoKTsKICBpZiAodGFic1dpZHRoIC0gdyA8ICQoZWwpLnBhcmVudHMoJ2Rpdi50YWJzJykuZmlyc3QoKS53aWR0aCgpIC0gYncpIHsKICAgICQoZWwpLmFkZENsYXNzKCdkaXNhYmxlZCcpOwogIH0KfQoKZnVuY3Rpb24gbW92ZVRhYkxlZnQoZWwpIHsKICB2YXIgbGlzID0gJChlbCkucGFyZW50cygnZGl2LnRhYnMnKS5maXJzdCgpLmZpbmQoJ3VsJykuY2hpbGRyZW4oKTsKICB2YXIgaSA9IDA7CiAgd2hpbGUgKGkgPCBsaXMubGVuZ3RoICYmICFsaXMuZXEoaSkuaXMoJzp2aXNpYmxlJykpIHsgaSsrOyB9CiAgaWYgKGkgPiAwKSB7CiAgICBsaXMuZXEoaS0xKS5zaG93KCk7CiAgICAkKGVsKS5zaWJsaW5ncygnLnRhYi1yaWdodCcpLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOwogIH0KICBpZiAoaSA8PSAxKSB7CiAgICAkKGVsKS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKICB9Cn0KCmZ1bmN0aW9uIGRpc3BsYXlUYWJzQnV0dG9ucygpIHsKICB2YXIgbGlzOwogIHZhciB0YWJzV2lkdGg7CiAgdmFyIGVsOwogIHZhciBudW1IaWRkZW47CiAgJCgnZGl2LnRhYnMnKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgZWwgPSAkKHRoaXMpOwogICAgbGlzID0gZWwuZmluZCgndWwnKS5jaGlsZHJlbigpOwogICAgdGFic1dpZHRoID0gMDsKICAgIG51bUhpZGRlbiA9IDA7CiAgICBsaXMuZWFjaChmdW5jdGlvbigpewogICAgICBpZiAoJCh0aGlzKS5pcygnOnZpc2libGUnKSkgewogICAgICAgIHRhYnNXaWR0aCArPSAkKHRoaXMpLm91dGVyV2lkdGgodHJ1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbnVtSGlkZGVuKys7CiAgICAgIH0KICAgIH0pOwogICAgdmFyIGJ3ID0gJChlbCkuZmluZCgnZGl2LnRhYnMtYnV0dG9ucycpLm91dGVyV2lkdGgodHJ1ZSk7CiAgICBpZiAoKHRhYnNXaWR0aCA8IGVsLndpZHRoKCkgLSBidykgJiYgKGxpcy5sZW5ndGggPT09IDAgfHwgbGlzLmZpcnN0KCkuaXMoJzp2aXNpYmxlJykpKSB7CiAgICAgIGVsLmZpbmQoJ2Rpdi50YWJzLWJ1dHRvbnMnKS5oaWRlKCk7CiAgICB9IGVsc2UgewogICAgICBlbC5maW5kKCdkaXYudGFicy1idXR0b25zJykuc2hvdygpLmNoaWxkcmVuKCdidXR0b24udGFiLWxlZnQnKS50b2dnbGVDbGFzcygnZGlzYWJsZWQnLCBudW1IaWRkZW4gPT0gMCk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIHNldFByZWRlY2Vzc29yRmllbGRzVmlzaWJpbGl0eSgpIHsKICB2YXIgcmVsYXRpb25UeXBlID0gJCgnI3JlbGF0aW9uX3JlbGF0aW9uX3R5cGUnKTsKICBpZiAocmVsYXRpb25UeXBlLnZhbCgpID09ICJwcmVjZWRlcyIgfHwgcmVsYXRpb25UeXBlLnZhbCgpID09ICJmb2xsb3dzIikgewogICAgJCgnI3ByZWRlY2Vzc29yX2ZpZWxkcycpLnNob3coKTsKICB9IGVsc2UgewogICAgJCgnI3ByZWRlY2Vzc29yX2ZpZWxkcycpLmhpZGUoKTsKICB9Cn0KCmZ1bmN0aW9uIHNob3dNb2RhbChpZCwgd2lkdGgsIHRpdGxlKSB7CiAgdmFyIGVsID0gJCgnIycraWQpLmZpcnN0KCk7CiAgaWYgKGVsLmxlbmd0aCA9PT0gMCB8fCBlbC5pcygnOnZpc2libGUnKSkge3JldHVybjt9CiAgaWYgKCF0aXRsZSkgdGl0bGUgPSBlbC5maW5kKCdoMy50aXRsZScpLnRleHQoKTsKICAvLyBtb3ZlcyBleGlzdGluZyBtb2RhbHMgYmVoaW5kIHRoZSB0cmFuc3BhcmVudCBiYWNrZ3JvdW5kCiAgJCgiLm1vZGFsIikuY3NzKCd6SW5kZXgnLDk5KTsKICBlbC5kaWFsb2coewogICAgd2lkdGg6IHdpZHRoLAogICAgbW9kYWw6IHRydWUsCiAgICByZXNpemFibGU6IGZhbHNlLAogICAgZGlhbG9nQ2xhc3M6ICdtb2RhbCcsCiAgICB0aXRsZTogdGl0bGUKICB9KS5vbignZGlhbG9nY2xvc2UnLCBmdW5jdGlvbigpewogICAgJCgiLm1vZGFsIikuY3NzKCd6SW5kZXgnLDEwMSk7CiAgfSk7CiAgZWwuZmluZCgiaW5wdXRbdHlwZT10ZXh0XSwgaW5wdXRbdHlwZT1zdWJtaXRdIikuZmlyc3QoKS5mb2N1cygpOwp9CgpmdW5jdGlvbiBoaWRlTW9kYWwoZWwpIHsKICB2YXIgbW9kYWw7CiAgaWYgKGVsKSB7CiAgICBtb2RhbCA9ICQoZWwpLnBhcmVudHMoJy51aS1kaWFsb2ctY29udGVudCcpOwogIH0gZWxzZSB7CiAgICBtb2RhbCA9ICQoJyNhamF4LW1vZGFsJyk7CiAgfQogIG1vZGFsLmRpYWxvZygiY2xvc2UiKTsKfQoKZnVuY3Rpb24gY29sbGFwc2VTY21FbnRyeShpZCkgewogICQoJy4nK2lkKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ29wZW4nKSkgewogICAgICBjb2xsYXBzZVNjbUVudHJ5KCQodGhpcykuYXR0cignaWQnKSk7CiAgICB9CiAgICAkKHRoaXMpLmhpZGUoKTsKICB9KTsKICAkKCcjJytpZCkucmVtb3ZlQ2xhc3MoJ29wZW4nKTsKfQoKZnVuY3Rpb24gZXhwYW5kU2NtRW50cnkoaWQpIHsKICAkKCcuJytpZCkuZWFjaChmdW5jdGlvbigpIHsKICAgICQodGhpcykuc2hvdygpOwogICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ2xvYWRlZCcpICYmICEkKHRoaXMpLmhhc0NsYXNzKCdjb2xsYXBzZWQnKSkgewogICAgICBleHBhbmRTY21FbnRyeSgkKHRoaXMpLmF0dHIoJ2lkJykpOwogICAgfQogIH0pOwogICQoJyMnK2lkKS5hZGRDbGFzcygnb3BlbicpOwp9CgpmdW5jdGlvbiBzY21FbnRyeUNsaWNrKGlkLCB1cmwpIHsKICAgIHZhciBlbCA9ICQoJyMnK2lkKTsKICAgIHZhciBleHBhbmRlciA9IGVsLmZpbmQoJy5leHBhbmRlcicpOwogICAgdmFyIGZvbGRlciA9IGVsLmZpbmQoJy5pY29uLWZvbGRlcicpOwoKICAgIGlmIChlbC5oYXNDbGFzcygnb3BlbicpKSB7CiAgICAgICAgY29sbGFwc2VTY21FbnRyeShpZCk7CiAgICAgICAgZWwuZmluZCgnLmV4cGFuZGVyJykuc3dpdGNoQ2xhc3MoJ2ljb24tZXhwYW5kZWQnLCAnaWNvbi1jb2xsYXBzZWQnKTsKICAgICAgICBlbC5hZGRDbGFzcygnY29sbGFwc2VkJyk7CiAgICAgICAgdXBkYXRlU1ZHSWNvbihmb2xkZXJbMF0sICdmb2xkZXInKQogICAgICAgIHRvZ2dsZUV4cGVuZENvbGxhcHNlSWNvbihleHBhbmRlclswXSk7CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0gZWxzZSBpZiAoZWwuaGFzQ2xhc3MoJ2xvYWRlZCcpKSB7CiAgICAgICAgZXhwYW5kU2NtRW50cnkoaWQpOwogICAgICAgIGVsLmZpbmQoJy5leHBhbmRlcicpLnN3aXRjaENsYXNzKCdpY29uLWNvbGxhcHNlZCcsICdpY29uLWV4cGFuZGVkJyk7CiAgICAgICAgZWwucmVtb3ZlQ2xhc3MoJ2NvbGxhcHNlZCcpOwogICAgICAgIHVwZGF0ZVNWR0ljb24oZm9sZGVyWzBdLCAnZm9sZGVyLW9wZW4nKQogICAgICAgIHRvZ2dsZUV4cGVuZENvbGxhcHNlSWNvbihleHBhbmRlclswXSk7CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmIChlbC5oYXNDbGFzcygnbG9hZGluZycpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZWwuYWRkQ2xhc3MoJ2xvYWRpbmcnKTsKICAgICQuYWpheCh7CiAgICAgIHVybDogdXJsLAogICAgICBzdWNjZXNzOiBmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgZWwuYWZ0ZXIoZGF0YSk7CiAgICAgICAgZWwuYWRkQ2xhc3MoJ29wZW4nKS5hZGRDbGFzcygnbG9hZGVkJykucmVtb3ZlQ2xhc3MoJ2xvYWRpbmcnKTsKICAgICAgICBlbC5maW5kKCcuZXhwYW5kZXInKS5zd2l0Y2hDbGFzcygnaWNvbi1jb2xsYXBzZWQnLCAnaWNvbi1leHBhbmRlZCcpOwogICAgICAgIHVwZGF0ZVNWR0ljb24oZm9sZGVyWzBdLCAnZm9sZGVyLW9wZW4nKQogICAgICAgIHRvZ2dsZUV4cGVuZENvbGxhcHNlSWNvbihleHBhbmRlclswXSk7CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIHRydWU7Cn0KCmZ1bmN0aW9uIHJhbmRvbUtleShzaXplKSB7CiAgdmFyIGNoYXJzID0gJzAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JzsKICB2YXIga2V5ID0gJyc7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKICAgIGtleSArPSBjaGFycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcnMubGVuZ3RoKSk7CiAgfQogIHJldHVybiBrZXk7Cn0KCmZ1bmN0aW9uIGNvcHlUb0NsaXBib2FyZCh0ZXh0KSB7CiAgaWYgKG5hdmlnYXRvci5jbGlwYm9hcmQpIHsKICAgIHJldHVybiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0ZXh0KS5jYXRjaCgoKSA9PiB7CiAgICAgIHJldHVybiBmYWxsYmFja0NsaXBib2FyZENvcHkodGV4dCk7CiAgICB9KTsKICB9IGVsc2UgewogICAgcmV0dXJuIGZhbGxiYWNrQ2xpcGJvYXJkQ29weSh0ZXh0KTsKICB9Cn0KCmZ1bmN0aW9uIGZhbGxiYWNrQ2xpcGJvYXJkQ29weSh0ZXh0KSB7CiAgY29uc3QgdGVtcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7CiAgdGVtcC52YWx1ZSA9IHRleHQ7CiAgdGVtcC5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7CiAgdGVtcC5zdHlsZS5sZWZ0ID0gJy05OTk5cHgnOwogIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGVtcCk7CiAgdGVtcC5zZWxlY3QoKTsKICBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpOwogIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGVtcCk7CiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwp9CgpmdW5jdGlvbiBjb3B5RGF0YUNsaXBib2FyZFRleHRUb0NsaXBib2FyZCh0YXJnZXQpIHsKICBjb3B5VG9DbGlwYm9hcmQodGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1jbGlwYm9hcmQtdGV4dCcpKTsKCiAgaWYgKCQodGFyZ2V0KS5jbG9zZXN0KCcuZHJkbi5leHBhbmRlZCcpLmxlbmd0aCkgewogICAgJCh0YXJnZXQpLmNsb3Nlc3QoJy5kcmRuLmV4cGFuZGVkJykucmVtb3ZlQ2xhc3MoImV4cGFuZGVkIik7CiAgfQogIHJldHVybiBmYWxzZTsKfQoKZnVuY3Rpb24gc2V0dXBDb3B5QnV0dG9uc1RvUHJlRWxlbWVudHMoKSB7CiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLndpa2kgcHJlOm5vdCgucHJlLXdyYXBwZXIgcHJlKScpLmZvckVhY2goKHByZSkgPT4gewogICAgLy8gV3JhcCB0aGUgPHByZT4gZWxlbWVudCB3aXRoIGEgY29udGFpbmVyIGFuZCBhZGQgYSBjb3B5IGJ1dHRvbgogICAgY29uc3Qgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgd3JhcHBlci5jbGFzc0xpc3QuYWRkKCJwcmUtd3JhcHBlciIpOwoKICAgIGNvbnN0IGNvcHlCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7CiAgICBjb3B5QnV0dG9uLnRpdGxlID0gcm0uSTE4bi5idXR0b25Db3B5OwogICAgY29weUJ1dHRvbi5jbGFzc0xpc3QuYWRkKCJjb3B5LXByZS1jb250ZW50LWxpbmsiLCAiaWNvbi1vbmx5Iik7CiAgICBjb3B5QnV0dG9uLmFwcGVuZChjcmVhdGVTVkdJY29uKCJjb3B5LXByZS1jb250ZW50IikpOwoKICAgIHdyYXBwZXIuYXBwZW5kQ2hpbGQoY29weUJ1dHRvbik7CiAgICB3cmFwcGVyLmFwcGVuZChwcmUuY2xvbmVOb2RlKHRydWUpKTsKICAgIHByZS5yZXBsYWNlV2l0aCh3cmFwcGVyKTsKCiAgICAvLyBDb3B5IHRoZSBjb250ZW50cyBvZiB0aGUgcHJlIHRhZyB3aGVuIGNvcHlCdXR0b24gaXMgY2xpY2tlZAogICAgY29weUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIChldmVudCkgPT4gewogICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBsZXQgdGV4dFRvQ29weSA9IChwcmUucXVlcnlTZWxlY3RvcigiY29kZSIpIHx8IHByZSkudGV4dENvbnRlbnQucmVwbGFjZSgvXG4kLywgJycpOwogICAgICBpZiAocHJlLnF1ZXJ5U2VsZWN0b3IoImNvZGUuc3ludGF4aGwiKSkgeyB0ZXh0VG9Db3B5ID0gdGV4dFRvQ29weS5yZXBsYWNlKC8gJC8sICcnKTsgfSAvLyBXb3JrYXJvdW5kIGZvciBoYWxmLXdpZHRoIHNwYWNlIGlzc3VlIGluIFRleHRpbGUncyBoaWdobGlnaHRlZCBjb2RlCiAgICAgIGNvcHlUb0NsaXBib2FyZCh0ZXh0VG9Db3B5KS50aGVuKCgpID0+IHsKICAgICAgICB1cGRhdGVTVkdJY29uKGNvcHlCdXR0b24sICJjaGVja2VkIik7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB1cGRhdGVTVkdJY29uKGNvcHlCdXR0b24sICJjb3B5LXByZS1jb250ZW50IiksIDIwMDApOwogICAgICB9KTsKICAgIH0pOwogIH0pOwp9CgpmdW5jdGlvbiB1cGRhdGVJc3N1ZUZyb20odXJsLCBlbCkgewogICQoJyNhbGxfYXR0cmlidXRlcyBpbnB1dCwgI2FsbF9hdHRyaWJ1dGVzIHRleHRhcmVhLCAjYWxsX2F0dHJpYnV0ZXMgc2VsZWN0JykuZWFjaChmdW5jdGlvbigpewogICAgJCh0aGlzKS5kYXRhKCd2YWx1ZWJlZm9yZXVwZGF0ZScsICQodGhpcykudmFsKCkpOwogIH0pOwogIGlmIChlbCkgewogICAgJCgiI2Zvcm1fdXBkYXRlX3RyaWdnZXJlZF9ieSIpLnZhbCgkKGVsKS5hdHRyKCdpZCcpKTsKICB9CiAgcmV0dXJuICQuYWpheCh7CiAgICB1cmw6IHVybCwKICAgIHR5cGU6ICdwb3N0JywKICAgIGRhdGE6ICQoJyNpc3N1ZS1mb3JtJykuc2VyaWFsaXplKCkKICB9KTsKfQoKZnVuY3Rpb24gcmVwbGFjZUlzc3VlRm9ybVdpdGgoaHRtbCl7CiAgdmFyIHJlcGxhY2VtZW50ID0gJChodG1sKTsKICAkKCcjYWxsX2F0dHJpYnV0ZXMgaW5wdXQsICNhbGxfYXR0cmlidXRlcyB0ZXh0YXJlYSwgI2FsbF9hdHRyaWJ1dGVzIHNlbGVjdCcpLmVhY2goZnVuY3Rpb24oKXsKICAgIHZhciBvYmplY3RfaWQgPSAkKHRoaXMpLmF0dHIoJ2lkJyk7CiAgICBpZiAob2JqZWN0X2lkICYmICQodGhpcykuZGF0YSgndmFsdWViZWZvcmV1cGRhdGUnKSE9JCh0aGlzKS52YWwoKSkgewogICAgICByZXBsYWNlbWVudC5maW5kKCcjJytvYmplY3RfaWQpLnZhbCgkKHRoaXMpLnZhbCgpKTsKICAgIH0KICB9KTsKICAkKCcjYWxsX2F0dHJpYnV0ZXMnKS5lbXB0eSgpOwogICQoJyNhbGxfYXR0cmlidXRlcycpLnByZXBlbmQocmVwbGFjZW1lbnQpOwp9CgpmdW5jdGlvbiB1cGRhdGVCdWxrRWRpdEZyb20odXJsKSB7CiAgJC5hamF4KHsKICAgIHVybDogdXJsLAogICAgdHlwZTogJ3Bvc3QnLAogICAgZGF0YTogJCgnI2J1bGtfZWRpdF9mb3JtJykuc2VyaWFsaXplKCkKICB9KTsKfQoKZnVuY3Rpb24gb2JzZXJ2ZUF1dG9jb21wbGV0ZUZpZWxkKGZpZWxkSWQsIHVybCwgb3B0aW9ucykgewogICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewogICAgJCgnIycrZmllbGRJZCkuYXV0b2NvbXBsZXRlKCQuZXh0ZW5kKHsKICAgICAgc291cmNlOiB1cmwsCiAgICAgIG1pbkxlbmd0aDogMiwKICAgICAgcG9zaXRpb246IHtjb2xsaXNpb246ICJmbGlwZml0In0sCiAgICAgIHNlYXJjaDogZnVuY3Rpb24oKXskKCcjJytmaWVsZElkKS5hZGRDbGFzcygnYWpheC1sb2FkaW5nJyk7fSwKICAgICAgcmVzcG9uc2U6IGZ1bmN0aW9uKCl7JCgnIycrZmllbGRJZCkucmVtb3ZlQ2xhc3MoJ2FqYXgtbG9hZGluZycpO30KICAgIH0sIG9wdGlvbnMpKTsKICAgICQoJyMnK2ZpZWxkSWQpLmFkZENsYXNzKCdhdXRvY29tcGxldGUnKTsKICB9KTsKfQoKZnVuY3Rpb24gbXVsdGlwbGVBdXRvY29tcGxldGVGaWVsZChmaWVsZElkLCB1cmwsIG9wdGlvbnMpIHsKICBmdW5jdGlvbiBzcGxpdCh2YWwpIHsKICAgIHJldHVybiB2YWwuc3BsaXQoLyxccyovKTsKICB9CgogIGZ1bmN0aW9uIGV4dHJhY3RMYXN0KHRlcm0pIHsKICAgIHJldHVybiBzcGxpdCh0ZXJtKS5wb3AoKTsKICB9CgogICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHsKICAgICQoJyMnICsgZmllbGRJZCkuYXV0b2NvbXBsZXRlKCQuZXh0ZW5kKHsKICAgICAgc291cmNlOiBmdW5jdGlvbiAocmVxdWVzdCwgcmVzcG9uc2UpIHsKICAgICAgICAkLmdldEpTT04odXJsLCB7CiAgICAgICAgICB0ZXJtOiBleHRyYWN0TGFzdChyZXF1ZXN0LnRlcm0pCiAgICAgICAgfSwgcmVzcG9uc2UpOwogICAgICB9LAogICAgICBtaW5MZW5ndGg6IDIsCiAgICAgIHBvc2l0aW9uOiB7Y29sbGlzaW9uOiAiZmxpcGZpdCJ9LAogICAgICBzZWFyY2g6IGZ1bmN0aW9uICgpIHsKICAgICAgICAkKCcjJyArIGZpZWxkSWQpLmFkZENsYXNzKCdhamF4LWxvYWRpbmcnKTsKICAgICAgfSwKICAgICAgcmVzcG9uc2U6IGZ1bmN0aW9uICgpIHsKICAgICAgICAkKCcjJyArIGZpZWxkSWQpLnJlbW92ZUNsYXNzKCdhamF4LWxvYWRpbmcnKTsKICAgICAgfSwKICAgICAgc2VsZWN0OiBmdW5jdGlvbiAoZXZlbnQsIHVpKSB7CiAgICAgICAgdmFyIHRlcm1zID0gc3BsaXQodGhpcy52YWx1ZSk7CiAgICAgICAgLy8gcmVtb3ZlIHRoZSBjdXJyZW50IGlucHV0CiAgICAgICAgdGVybXMucG9wKCk7CiAgICAgICAgLy8gYWRkIHRoZSBzZWxlY3RlZCBpdGVtCiAgICAgICAgdGVybXMucHVzaCh1aS5pdGVtLnZhbHVlKTsKICAgICAgICAvLyBhZGQgcGxhY2Vob2xkZXIgdG8gZ2V0IHRoZSBjb21tYS1hbmQtc3BhY2UgYXQgdGhlIGVuZAogICAgICAgIHRlcm1zLnB1c2goIiIpOwogICAgICAgIHRoaXMudmFsdWUgPSB0ZXJtcy5qb2luKCIsICIpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfSwgb3B0aW9ucykpOwogICAgJCgnIycgKyBmaWVsZElkKS5hZGRDbGFzcygnYXV0b2NvbXBsZXRlJyk7CiAgfSk7Cn0KCmZ1bmN0aW9uIG9ic2VydmVTZWFyY2hmaWVsZChmaWVsZElkLCB0YXJnZXRJZCwgdXJsKSB7CiAgJCgnIycrZmllbGRJZCkuZWFjaChmdW5jdGlvbigpIHsKICAgIHZhciAkdGhpcyA9ICQodGhpcyk7CiAgICAkdGhpcy5hZGRDbGFzcygnYXV0b2NvbXBsZXRlJyk7CiAgICAkdGhpcy5hdHRyKCdkYXRhLXZhbHVlLXdhcycsICR0aGlzLnZhbCgpKTsKICAgIHZhciBjaGVjayA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdmFsID0gJHRoaXMudmFsKCk7CiAgICAgIGlmICgkdGhpcy5hdHRyKCdkYXRhLXZhbHVlLXdhcycpICE9IHZhbCl7CiAgICAgICAgJHRoaXMuYXR0cignZGF0YS12YWx1ZS13YXMnLCB2YWwpOwogICAgICAgICQuYWpheCh7CiAgICAgICAgICB1cmw6IHVybCwKICAgICAgICAgIHR5cGU6ICdnZXQnLAogICAgICAgICAgZGF0YToge3E6ICR0aGlzLnZhbCgpfSwKICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpeyBpZih0YXJnZXRJZCkgJCgnIycrdGFyZ2V0SWQpLmh0bWwoZGF0YSk7IH0sCiAgICAgICAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbigpeyAkdGhpcy5hZGRDbGFzcygnYWpheC1sb2FkaW5nJyk7IH0sCiAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24oKXsgJHRoaXMucmVtb3ZlQ2xhc3MoJ2FqYXgtbG9hZGluZycpOyB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgcmVzZXQgPSBmdW5jdGlvbigpIHsKICAgICAgaWYgKHRpbWVyKSB7CiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aW1lcik7CiAgICAgICAgdGltZXIgPSBzZXRJbnRlcnZhbChjaGVjaywgMzAwKTsKICAgICAgfQogICAgfTsKICAgIHZhciB0aW1lciA9IHNldEludGVydmFsKGNoZWNrLCAzMDApOwogICAgJHRoaXMuYmluZCgna2V5dXAgY2xpY2sgbW91c2Vtb3ZlJywgcmVzZXQpOwogIH0pOwp9CgokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICQoIi5kcmRuIC5hdXRvY29tcGxldGUiKS52YWwoJycpOwoKICAvLyBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgdG8gZm9jdXMgc2VsZWN0ZWQgcHJvamVjdAogIHZhciBzZWxlY3RlZDsKICAkKGRvY3VtZW50KS5vbignY2xpY2snLCAnLmRyZG4tdHJpZ2dlcicsIGZ1bmN0aW9uKGUpewogICAgdmFyIGRyZG4gPSAkKHRoaXMpLmNsb3Nlc3QoIi5kcmRuIik7CiAgICBpZiAoZHJkbi5oYXNDbGFzcygiZXhwYW5kZWQiKSkgewogICAgICBkcmRuLnJlbW92ZUNsYXNzKCJleHBhbmRlZCIpOwogICAgfSBlbHNlIHsKICAgICAgJCgiLmRyZG4iKS5yZW1vdmVDbGFzcygiZXhwYW5kZWQiKTsKICAgICAgZHJkbi5hZGRDbGFzcygiZXhwYW5kZWQiKTsKICAgICAgaWYgKCQodGhpcykucGFyZW50KCcjcHJvamVjdC1qdW1wJykubGVuZ3RoKSB7CiAgICAgICAgc2VsZWN0ZWQgPSAkKCcuZHJkbi1pdGVtcyBhLnNlbGVjdGVkJyk7IC8vIFN0b3JlIHNlbGVjdGVkIHByb2plY3QKICAgICAgICBzZWxlY3RlZC5maXJzdCgpLmZvY3VzKCk7IC8vIENhbGxpbmcgZm9jdXMgdG8gc2Nyb2xsIHRvIHNlbGVjdGVkIHByb2plY3QKICAgICAgfQogICAgICBpZiAoIWlzTW9iaWxlKCkpIHsKICAgICAgICBkcmRuLmZpbmQoIi5hdXRvY29tcGxldGUiKS5mb2N1cygpOwogICAgICB9CiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICB9CiAgfSk7CiAgJChkb2N1bWVudCkuY2xpY2soZnVuY3Rpb24oZSl7CiAgICBpZiAoJChlLnRhcmdldCkuY2xvc2VzdCgiLmRyZG4iKS5sZW5ndGggPCAxKSB7CiAgICAgICQoIi5kcmRuLmV4cGFuZGVkIikucmVtb3ZlQ2xhc3MoImV4cGFuZGVkIik7CiAgICB9CiAgfSk7CgogIG9ic2VydmVTZWFyY2hmaWVsZCgncHJvamVjdHMtcXVpY2stc2VhcmNoJywgbnVsbCwgJCgnI3Byb2plY3RzLXF1aWNrLXNlYXJjaCcpLmRhdGEoJ2F1dG9tY29tcGxldGUtdXJsJykpOwoKICAkKCIuZHJkbi1jb250ZW50Iikua2V5ZG93bihmdW5jdGlvbihldmVudCl7CiAgICB2YXIgaXRlbXMgPSAkKHRoaXMpLmZpbmQoIi5kcmRuLWl0ZW1zIik7CgogICAgLy8gSWYgYSBwcm9qZWN0IGlzIHNlbGVjdGVkIHNldCBmb2N1c2VkIHRvIHNlbGVjdGVkIG9ubHkgb25jZQogICAgaWYgKHNlbGVjdGVkICYmIHNlbGVjdGVkLmxlbmd0aCA+IDApIHsKICAgICAgdmFyIGZvY3VzZWQgPSBzZWxlY3RlZDsKICAgICAgc2VsZWN0ZWQgPSB1bmRlZmluZWQ7CiAgICB9CiAgICBlbHNlIHsKICAgICAgdmFyIGZvY3VzZWQgPSBpdGVtcy5maW5kKCJhOmZvY3VzIik7CiAgICB9CiAgICBzd2l0Y2ggKGV2ZW50LndoaWNoKSB7CiAgICBjYXNlIDQwOiAvL2Rvd24KICAgICAgaWYgKGZvY3VzZWQubGVuZ3RoID4gMCkgewogICAgICAgIGZvY3VzZWQubmV4dEFsbCgiYSIpLmZpcnN0KCkuZm9jdXMoKTs7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaXRlbXMuZmluZCgiYSIpLmZpcnN0KCkuZm9jdXMoKTs7CiAgICAgIH0KICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDM4OiAvL3VwCiAgICAgIGlmIChmb2N1c2VkLmxlbmd0aCA+IDApIHsKICAgICAgICB2YXIgcHJldiA9IGZvY3VzZWQucHJldkFsbCgiYSIpOwogICAgICAgIGlmIChwcmV2Lmxlbmd0aCA+IDApIHsKICAgICAgICAgIHByZXYuZmlyc3QoKS5mb2N1cygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAkKHRoaXMpLmZpbmQoIi5hdXRvY29tcGxldGUiKS5mb2N1cygpOwogICAgICAgIH0KICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSAzNTogLy9lbmQKICAgICAgaWYgKGZvY3VzZWQubGVuZ3RoID4gMCkgewogICAgICAgIGZvY3VzZWQubmV4dEFsbCgiYSIpLmxhc3QoKS5mb2N1cygpOwogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlIDM2OiAvL2hvbWUKICAgICAgaWYgKGZvY3VzZWQubGVuZ3RoID4gMCkgewogICAgICAgIGZvY3VzZWQucHJldkFsbCgiYSIpLmxhc3QoKS5mb2N1cygpOwogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICB9CiAgfSk7Cn0pOwoKZnVuY3Rpb24gYmVmb3JlU2hvd0RhdGVQaWNrZXIoaW5wdXQsIGluc3QpIHsKICB2YXIgZGVmYXVsdF9kYXRlID0gbnVsbDsKICBzd2l0Y2ggKCQoaW5wdXQpLmF0dHIoImlkIikpIHsKICAgIGNhc2UgImlzc3VlX3N0YXJ0X2RhdGUiIDoKICAgICAgaWYgKCQoIiNpc3N1ZV9kdWVfZGF0ZSIpLmxlbmd0aCA+IDApIHsKICAgICAgICBkZWZhdWx0X2RhdGUgPSAkKCIjaXNzdWVfZHVlX2RhdGUiKS52YWwoKTsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgImlzc3VlX2R1ZV9kYXRlIiA6CiAgICAgIGlmICgkKCIjaXNzdWVfc3RhcnRfZGF0ZSIpLmxlbmd0aCA+IDApIHsKICAgICAgICB2YXIgc3RhcnRfZGF0ZSA9ICQoIiNpc3N1ZV9zdGFydF9kYXRlIikudmFsKCk7CiAgICAgICAgaWYgKHN0YXJ0X2RhdGUgIT0gIiIpIHsKICAgICAgICAgIHN0YXJ0X2RhdGUgPSBuZXcgRGF0ZShEYXRlLnBhcnNlKHN0YXJ0X2RhdGUpKTsKICAgICAgICAgIGlmIChzdGFydF9kYXRlID4gbmV3IERhdGUoKSkgewogICAgICAgICAgICBkZWZhdWx0X2RhdGUgPSAkKCIjaXNzdWVfc3RhcnRfZGF0ZSIpLnZhbCgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBicmVhazsKICB9CiAgJChpbnB1dCkuZGF0ZXBpY2tlckZhbGxiYWNrKCJvcHRpb24iLCAiZGVmYXVsdERhdGUiLCBkZWZhdWx0X2RhdGUpOwp9CgooZnVuY3Rpb24oJCl7CiAgJC5mbi5wb3NpdGlvbmVkSXRlbXMgPSBmdW5jdGlvbihzb3J0YWJsZU9wdGlvbnMsIG9wdGlvbnMpewogICAgdmFyIHNldHRpbmdzID0gJC5leHRlbmQoewogICAgICBmaXJzdFBvc2l0aW9uOiAxCiAgICB9LCBvcHRpb25zICk7CgogICAgcmV0dXJuIHRoaXMuc29ydGFibGUoJC5leHRlbmQoewogICAgICBheGlzOiAneScsCiAgICAgIGhhbmRsZTogIi5zb3J0LWhhbmRsZSIsCiAgICAgIGhlbHBlcjogZnVuY3Rpb24oZXZlbnQsIHVpKXsKICAgICAgICB1aS5jaGlsZHJlbigndGQnKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgICAgICAkKHRoaXMpLndpZHRoKCQodGhpcykud2lkdGgoKSk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHVpOwogICAgICB9LAogICAgICB1cGRhdGU6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgewogICAgICAgIHZhciBzb3J0YWJsZSA9ICQodGhpcyk7CiAgICAgICAgdmFyIGhhbmRsZSA9IHVpLml0ZW0uZmluZCgiLnNvcnQtaGFuZGxlIikuYWRkQ2xhc3MoImFqYXgtbG9hZGluZyIpOwogICAgICAgIHZhciB1cmwgPSBoYW5kbGUuZGF0YSgicmVvcmRlci11cmwiKTsKICAgICAgICB2YXIgcGFyYW0gPSBoYW5kbGUuZGF0YSgicmVvcmRlci1wYXJhbSIpOwogICAgICAgIHZhciBkYXRhID0ge307CiAgICAgICAgZGF0YVtwYXJhbV0gPSB7cG9zaXRpb246IHVpLml0ZW0uaW5kZXgoKSArIHNldHRpbmdzWydmaXJzdFBvc2l0aW9uJ119OwogICAgICAgICQuYWpheCh7CiAgICAgICAgICB1cmw6IHVybCwKICAgICAgICAgIHR5cGU6ICdwdXQnLAogICAgICAgICAgZGF0YVR5cGU6ICdzY3JpcHQnLAogICAgICAgICAgZGF0YTogZGF0YSwKICAgICAgICAgIGVycm9yOiBmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pewogICAgICAgICAgICBhbGVydChqcVhIUi5zdGF0dXMpOwogICAgICAgICAgICBzb3J0YWJsZS5zb3J0YWJsZSgiY2FuY2VsIik7CiAgICAgICAgICB9LAogICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bil7CiAgICAgICAgICAgIGhhbmRsZS5yZW1vdmVDbGFzcygiYWpheC1sb2FkaW5nIik7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0sCiAgICB9LCBzb3J0YWJsZU9wdGlvbnMpKTsKICB9Cn0oIGpRdWVyeSApKTsKCnZhciB3YXJuTGVhdmluZ1Vuc2F2ZWRNZXNzYWdlOwpmdW5jdGlvbiB3YXJuTGVhdmluZ1Vuc2F2ZWQobWVzc2FnZSkgewogIHdhcm5MZWF2aW5nVW5zYXZlZE1lc3NhZ2UgPSBtZXNzYWdlOwogICQoZG9jdW1lbnQpLm9uKCdzdWJtaXQnLCAnZm9ybScsIGZ1bmN0aW9uKCl7CiAgICAkKCd0ZXh0YXJlYScpLnJlbW92ZURhdGEoJ2NoYW5nZWQnKTsKICB9KTsKICAkKGRvY3VtZW50KS5vbignY2hhbmdlJywgJ3RleHRhcmVhJywgZnVuY3Rpb24oKXsKICAgICQodGhpcykuZGF0YSgnY2hhbmdlZCcsICdjaGFuZ2VkJyk7CiAgfSk7CiAgd2luZG93Lm9uYmVmb3JldW5sb2FkID0gZnVuY3Rpb24oKXsKICAgIHZhciB3YXJuID0gZmFsc2U7CiAgICAkKCd0ZXh0YXJlYScpLmJsdXIoKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgIGlmICgkKHRoaXMpLmRhdGEoJ2NoYW5nZWQnKSkgewogICAgICAgIHdhcm4gPSB0cnVlOwogICAgICB9CiAgICB9KTsKICAgIGlmICh3YXJuKSB7cmV0dXJuIHdhcm5MZWF2aW5nVW5zYXZlZE1lc3NhZ2U7fQogIH07Cn0KCmZ1bmN0aW9uIHNldHVwQWpheEluZGljYXRvcigpIHsKICAkKGRvY3VtZW50KS5iaW5kKCdhamF4U2VuZCcsIGZ1bmN0aW9uKGV2ZW50LCB4aHIsIHNldHRpbmdzKSB7CiAgICBpZiAoJCgnLmFqYXgtbG9hZGluZycpLmxlbmd0aCA9PT0gMCAmJiBzZXR0aW5ncy5jb250ZW50VHlwZSAhPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJykgewogICAgICAkKCcjYWpheC1pbmRpY2F0b3InKS5zaG93KCk7CiAgICB9CiAgfSk7CiAgJChkb2N1bWVudCkuYmluZCgnYWpheFN0b3AnLCBmdW5jdGlvbigpIHsKICAgICQoJyNhamF4LWluZGljYXRvcicpLmhpZGUoKTsKICB9KTsKfQoKZnVuY3Rpb24gc2V0dXBUYWJzKCkgewogIGlmKCQoJy50YWJzJykubGVuZ3RoID4gMCkgewogICAgZGlzcGxheVRhYnNCdXR0b25zKCk7CiAgICAkKHdpbmRvdykucmVzaXplKGRpc3BsYXlUYWJzQnV0dG9ucyk7CiAgfQp9CgpmdW5jdGlvbiBzZXR1cEZpbGVQcmV2aWV3TmF2aWdhdGlvbigpIHsKICAvLyBvbmx5IGJpbmQgYXJyb3cga2V5cyB3aGVuIHByZXZpZXcgbmF2aWdhdGlvbiBpcyBwcmVzZW50CiAgY29uc3QgZWxlbWVudCA9ICQoJy5wYWdpbmF0aW9uLmZpbGVwcmV2aWV3JykuZmlyc3QoKTsKICBpZiAoZWxlbWVudCkgewoKICAgIGNvbnN0IGhhbmRsZUFycm93S2V5ID0gZnVuY3Rpb24oc2VsZWN0b3IsIGUpewogICAgICBjb25zdCBocmVmID0gJChlbGVtZW50KS5maW5kKHNlbGVjdG9yKS5hdHRyKCdocmVmJyk7CiAgICAgIGlmIChocmVmKSB7CiAgICAgICAgd2luZG93LmxvY2F0aW9uID0gaHJlZjsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIH0KICAgIH07CgogICAgJChkb2N1bWVudCkua2V5ZG93bihmdW5jdGlvbihlKSB7CiAgICAgIGlmKGUuc2hpZnRLZXkgfHwgZS5tZXRhS2V5IHx8IGUuY3RybEtleSB8fCBlLmFsdEtleSkgcmV0dXJuOwogICAgICBzd2l0Y2goZS5rZXkpIHsKICAgICAgICBjYXNlICdBcnJvd0xlZnQnOgogICAgICAgICAgaGFuZGxlQXJyb3dLZXkoJy5wcmV2aW91cyBhJywgZSk7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnQXJyb3dSaWdodCc6CiAgICAgICAgICBoYW5kbGVBcnJvd0tleSgnLm5leHQgYScsIGUpOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0pOwogIH0KfQoKJChkb2N1bWVudCkub24oJ2tleWRvd24nLCAnZm9ybSB0ZXh0YXJlYScsIGZ1bmN0aW9uKGUpIHsKICAvLyBTdWJtaXQgdGhlIGZvcm0gd2l0aCBDdHJsICsgRW50ZXIgb3IgQ29tbWFuZCArIFJldHVybgogIHZhciB0YXJnZXRGb3JtID0gJChlLnRhcmdldCkuY2xvc2VzdCgnZm9ybScpOwogIGlmKGUua2V5Q29kZSA9PSAxMyAmJiAoKGUuY3RybEtleSAmJiAhZS5tZXRhS2V5KSB8fCAoIWUuY3RybEtleSAmJiBlLm1ldGFLZXkpICYmIHRhcmdldEZvcm0ubGVuZ3RoKSkgewogICAgLy8gRm9yIGFqYXgsIHVzZSBjbGljaygpIGluc3RlYWQgb2Ygc3VibWl0KCkgdG8gcHJldmVudCAiSW52YWxpZCBmb3JtIGF1dGhlbnRpY2l0eSB0b2tlbiIgZXJyb3IKICAgIGlmICh0YXJnZXRGb3JtLmF0dHIoJ2RhdGEtcmVtb3RlJykgPT0gJ3RydWUnKSB7CiAgICAgIGlmICh0YXJnZXRGb3JtLmZpbmQoJ2lucHV0W3R5cGU9c3VibWl0XScpLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gZmFsc2U7IH0KICAgICAgdGFyZ2V0Rm9ybS5maW5kKCd0ZXh0YXJlYScpLmJsdXIoKS5yZW1vdmVEYXRhKCdjaGFuZ2VkJyk7CiAgICAgIHRhcmdldEZvcm0uZmluZCgnaW5wdXRbdHlwZT1zdWJtaXRdJykuZmlyc3QoKS5jbGljaygpOwogICAgfSBlbHNlIHsKICAgICAgdGFyZ2V0Rm9ybS5maW5kKCd0ZXh0YXJlYScpLmJsdXIoKS5yZW1vdmVEYXRhKCdjaGFuZ2VkJyk7CiAgICAgIHRhcmdldEZvcm0uc3VibWl0KCk7CiAgICB9CiAgfQp9KTsKCgpmdW5jdGlvbiBoaWRlT25Mb2FkKCkgewogICQoJy5ob2wnKS5oaWRlKCk7Cn0KCmZ1bmN0aW9uIGFkZEZvcm1PYnNlcnZlcnNGb3JEb3VibGVTdWJtaXQoKSB7CiAgJCgnZm9ybVttZXRob2Q9cG9zdF0nKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgaWYgKCEkKHRoaXMpLmhhc0NsYXNzKCdtdWx0aXBsZS1zdWJtaXQnKSkgewogICAgICAkKHRoaXMpLnN1Ym1pdChmdW5jdGlvbihmb3JtX3N1Ym1pc3Npb24pIHsKICAgICAgICBpZiAoJChmb3JtX3N1Ym1pc3Npb24udGFyZ2V0KS5hdHRyKCdkYXRhLXN1Ym1pdHRlZCcpKSB7CiAgICAgICAgICBmb3JtX3N1Ym1pc3Npb24ucHJldmVudERlZmF1bHQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgJChmb3JtX3N1Ym1pc3Npb24udGFyZ2V0KS5hdHRyKCdkYXRhLXN1Ym1pdHRlZCcsIHRydWUpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIGRlZmF1bHRGb2N1cygpewogIGlmICgoJCgnI2NvbnRlbnQgOmZvY3VzJykubGVuZ3RoID09IDApICYmICh3aW5kb3cubG9jYXRpb24uaGFzaCA9PSAnJykpIHsKICAgICQoJyNjb250ZW50IGlucHV0W3R5cGU9dGV4dF06dmlzaWJsZSwgI2NvbnRlbnQgdGV4dGFyZWE6dmlzaWJsZScpLmZpcnN0KCkuZm9jdXMoKTsKICB9Cn0KCmZ1bmN0aW9uIGJsb2NrRXZlbnRQcm9wYWdhdGlvbihldmVudCkgewogIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7Cn0KCmZ1bmN0aW9uIHRvZ2dsZURpc2FibGVkT25DaGFuZ2UoKSB7CiAgdmFyIGNoZWNrZWQgPSAkKHRoaXMpLmlzKCc6Y2hlY2tlZCcpOwogICQoJCh0aGlzKS5kYXRhKCdkaXNhYmxlcycpKS5hdHRyKCdkaXNhYmxlZCcsIGNoZWNrZWQpOwogICQoJCh0aGlzKS5kYXRhKCdlbmFibGVzJykpLmF0dHIoJ2Rpc2FibGVkJywgIWNoZWNrZWQpOwogICQoJCh0aGlzKS5kYXRhKCdzaG93cycpKS50b2dnbGUoY2hlY2tlZCk7Cn0KZnVuY3Rpb24gdG9nZ2xlRGlzYWJsZWRJbml0KCkgewogICQoJ2lucHV0W2RhdGEtZGlzYWJsZXNdLCBpbnB1dFtkYXRhLWVuYWJsZXNdLCBpbnB1dFtkYXRhLXNob3dzXScpLmVhY2godG9nZ2xlRGlzYWJsZWRPbkNoYW5nZSk7Cn0KZnVuY3Rpb24gdG9nZ2xlTXVsdGlTZWxlY3RJY29uSW5pdCgpIHsKICAkKCcudG9nZ2xlLW11bHRpc2VsZWN0Om5vdCguaWNvbi10b2dnbGUtbWludXMpOm5vdCguaWNvbi10b2dnbGUtcGx1cyknKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICBsZXQgaWNvblR5cGU7CiAgICBpZiAoJCh0aGlzKS5zaWJsaW5ncygnc2VsZWN0JykuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykubGVuZ3RoID4gMSkgewogICAgICBpY29uVHlwZSA9ICd0b2dnbGUtbWludXMnOwogICAgfSBlbHNlIHsKICAgICAgaWNvblR5cGUgPSAndG9nZ2xlLXBsdXMnOwogICAgfQoKICAgICQodGhpcykuYWRkQ2xhc3MoYGljb24tJHtpY29uVHlwZX1gKTsKICAgIHVwZGF0ZVNWR0ljb24oJCh0aGlzKS5maW5kKCdzdmcnKVswXSwgaWNvblR5cGUpOwogIH0pOwp9CgpmdW5jdGlvbiB0b2dnbGVOZXdPYmplY3REcm9wZG93bigpIHsKICB2YXIgZHJvcGRvd24gPSAkKCcjbmV3LW9iamVjdCArIHVsLm1lbnUtY2hpbGRyZW4nKTsKICBpZihkcm9wZG93bi5oYXNDbGFzcygndmlzaWJsZScpKXsKICAgIGRyb3Bkb3duLnJlbW92ZUNsYXNzKCd2aXNpYmxlJyk7CiAgfWVsc2V7CiAgICBkcm9wZG93bi5hZGRDbGFzcygndmlzaWJsZScpOwogIH0KfQoKKGZ1bmN0aW9uICggJCApIHsKCiAgLy8gZGV0ZWN0IGlmIG5hdGl2ZSBkYXRlIGlucHV0IGlzIHN1cHBvcnRlZAogIHZhciBuYXRpdmVEYXRlSW5wdXRTdXBwb3J0ZWQgPSB0cnVlOwoKICB2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpOwogIGlucHV0LnNldEF0dHJpYnV0ZSgndHlwZScsJ2RhdGUnKTsKICBpZiAoaW5wdXQudHlwZSA9PT0gJ3RleHQnKSB7CiAgICBuYXRpdmVEYXRlSW5wdXRTdXBwb3J0ZWQgPSBmYWxzZTsKICB9CgogIHZhciBub3RBRGF0ZVZhbHVlID0gJ25vdC1hLWRhdGUnOwogIGlucHV0LnNldEF0dHJpYnV0ZSgndmFsdWUnLCBub3RBRGF0ZVZhbHVlKTsKICBpZiAoaW5wdXQudmFsdWUgPT09IG5vdEFEYXRlVmFsdWUpIHsKICAgIG5hdGl2ZURhdGVJbnB1dFN1cHBvcnRlZCA9IGZhbHNlOwogIH0KCiAgJC5mbi5kYXRlcGlja2VyRmFsbGJhY2sgPSBmdW5jdGlvbiggb3B0aW9ucyApIHsKICAgIGlmIChuYXRpdmVEYXRlSW5wdXRTdXBwb3J0ZWQpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gdGhpcy5kYXRlcGlja2VyKCBvcHRpb25zICk7CiAgICB9CiAgfTsKfSggalF1ZXJ5ICkpOwoKJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKXsKICAkKCcjY29udGVudCcpLm9uKCdjaGFuZ2UnLCAnaW5wdXRbZGF0YS1kaXNhYmxlc10sIGlucHV0W2RhdGEtZW5hYmxlc10sIGlucHV0W2RhdGEtc2hvd3NdJywgdG9nZ2xlRGlzYWJsZWRPbkNoYW5nZSk7CiAgdG9nZ2xlRGlzYWJsZWRJbml0KCk7CgogICQoJyNjb250ZW50Jykub24oJ2NsaWNrJywgJy50b2dnbGUtbXVsdGlzZWxlY3QnLCBmdW5jdGlvbigpIHsKICAgIHRvZ2dsZU11bHRpU2VsZWN0KCQodGhpcykuc2libGluZ3MoJ3NlbGVjdCcpKTsKICAgICQodGhpcykudG9nZ2xlQ2xhc3MoJ2ljb24tdG9nZ2xlLXBsdXMgaWNvbi10b2dnbGUtbWludXMnKTsKICAgIHVwZGF0ZVNWR0ljb24oJCh0aGlzKS5maW5kKCdzdmcnKVswXSwgJCh0aGlzKS5oYXNDbGFzcygnaWNvbi10b2dnbGUtcGx1cycpID8gJ3RvZ2dsZS1wbHVzJyA6ICd0b2dnbGUtbWludXMnKTsKICB9KTsKICB0b2dnbGVNdWx0aVNlbGVjdEljb25Jbml0KCk7CgogICQoJyNoaXN0b3J5IC50YWJzJykub24oJ2NsaWNrJywgJ2EnLCBmdW5jdGlvbihlKXsKICAgIHZhciB0YWIgPSAkKGUudGFyZ2V0KS5hdHRyKCdpZCcpLnJlcGxhY2UoJ3RhYi0nLCcnKTsKICAgIGRvY3VtZW50LmNvb2tpZSA9ICdoaXN0b3J5X2xhc3RfdGFiPScgKyB0YWIgKyAnOyBTYW1lU2l0ZT1MYXgnCiAgfSk7Cn0pOwoKJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKXsKICAkKCcjY29udGVudCcpLm9uKCdjbGljaycsICdkaXYuanN0VGFicyBhLnRhYi1wcmV2aWV3JywgZnVuY3Rpb24oZXZlbnQpewogICAgdmFyIHRhYiA9ICQoZXZlbnQudGFyZ2V0KTsKCiAgICB2YXIgdXJsID0gdGFiLmRhdGEoJ3VybCcpOwogICAgdmFyIGZvcm0gPSB0YWIucGFyZW50cygnZm9ybScpOwogICAgdmFyIGpzdEJsb2NrID0gdGFiLnBhcmVudHMoJy5qc3RCbG9jaycpOwoKICAgIHZhciBlbGVtZW50ID0gZW5jb2RlVVJJQ29tcG9uZW50KGpzdEJsb2NrLmZpbmQoJy53aWtpLWVkaXQnKS52YWwoKSk7CiAgICB2YXIgYXR0YWNobWVudHMgPSBmb3JtLmZpbmQoJy5hdHRhY2htZW50c19maWVsZHMgaW5wdXQnKS5zZXJpYWxpemUoKTsKCiAgICAkLmFqYXgoewogICAgICB1cmw6IHVybCwKICAgICAgdHlwZTogJ3Bvc3QnLAogICAgICBkYXRhOiAidGV4dD0iICsgZWxlbWVudCArICcmJyArIGF0dGFjaG1lbnRzLAogICAgICBzdWNjZXNzOiBmdW5jdGlvbihkYXRhKXsKICAgICAgICBqc3RCbG9jay5maW5kKCcud2lraS1wcmV2aWV3JykuaHRtbChkYXRhKTsKICAgICAgICBzZXR1cFdpa2lUYWJsZVNvcnRhYmxlSGVhZGVyKCk7CiAgICAgIH0KICAgIH0pOwogIH0pOwp9KTsKCmZ1bmN0aW9uIGtlZXBBbmNob3JPblNpZ25Jbihmb3JtKXsKICB2YXIgaGFzaCA9IGRlY29kZVVSSUNvbXBvbmVudChzZWxmLmRvY3VtZW50LmxvY2F0aW9uLmhhc2gpOwogIGlmIChoYXNoKSB7CiAgICBpZiAoaGFzaC5pbmRleE9mKCIjIikgPT09IC0xKSB7CiAgICAgIGhhc2ggPSAiIyIgKyBoYXNoOwogICAgfQogICAgZm9ybS5hY3Rpb24gPSBmb3JtLmFjdGlvbiArIGhhc2g7CiAgfQogIHJldHVybiB0cnVlOwp9CgokKGZ1bmN0aW9uICgkKSB7CiAgJCgnI2F1dGhfc291cmNlX2xkYXBfbW9kZScpLmNoYW5nZShmdW5jdGlvbiAoKSB7CiAgICAkKCcubGRhcHNfd2FybmluZycpLnRvZ2dsZSgkKHRoaXMpLnZhbCgpICE9ICdsZGFwc192ZXJpZnlfcGVlcicpOwogIH0pLmNoYW5nZSgpOwp9KTsKCmZ1bmN0aW9uIHNldEZpbGVjb250ZW50Q29udGFpbmVySGVpZ2h0KCkgewogIHZhciAkZmlsZWNvbnRhaW5lciA9ICQoJy5maWxlY29udGVudC1jb250YWluZXInKTsKICB2YXIgZmlsZVR5cGVTZWxlY3RvcnMgPSBbJy5pbWFnZScsICd2aWRlbyddOwoKICBpZigkZmlsZWNvbnRhaW5lci5sZW5ndGggPiAwICYmICRmaWxlY29udGFpbmVyLmZpbmQoZmlsZVR5cGVTZWxlY3RvcnMuam9pbignLCcpKS5sZW5ndGggPT09IDEpIHsKICAgIHZhciBjb250YWluZXJPZmZzZXRUb3AgPSAkZmlsZWNvbnRhaW5lci5vZmZzZXQoKS50b3A7CiAgICB2YXIgY29udGFpbmVyTWFyZ2luQm90dG9tID0gcGFyc2VJbnQoJGZpbGVjb250YWluZXIuY3NzKCdtYXJnaW5Cb3R0b20nKSk7CiAgICB2YXIgcGFnaW5hdGlvbkhlaWdodCA9ICRmaWxlY29udGFpbmVyLm5leHQoJy5wYWdpbmF0aW9uJykuaGVpZ2h0KCk7CiAgICB2YXIgZGlmZiA9IGNvbnRhaW5lck9mZnNldFRvcCArIGNvbnRhaW5lck1hcmdpbkJvdHRvbSArIHBhZ2luYXRpb25IZWlnaHQ7CgogICAgJGZpbGVjb250YWluZXIuY3NzKCdoZWlnaHQnLCAnY2FsYygxMDB2aCAtICcgKyBkaWZmICsgJ3B4KScpCiAgfQp9CgpmdW5jdGlvbiBzZXR1cEF0dGFjaG1lbnREZXRhaWwoKSB7CiAgc2V0RmlsZWNvbnRlbnRDb250YWluZXJIZWlnaHQoKTsKICAkKHdpbmRvdykucmVzaXplKHNldEZpbGVjb250ZW50Q29udGFpbmVySGVpZ2h0KTsKfQoKZnVuY3Rpb24gc2V0dXBXaWtpVGFibGVTb3J0YWJsZUhlYWRlcigpIHsKICBpZiAodHlwZW9mIFRhYmxlc29ydCA9PT0gJ3VuZGVmaW5lZCcpIHsgcmV0dXJuOyB9CiAgJCgnZGl2Lndpa2kgdGFibGUnKS5lYWNoKGZ1bmN0aW9uKGksIHRhYmxlKXsKICAgIGlmICh0YWJsZS5yb3dzLmxlbmd0aCA8IDMpIHJldHVybiB0cnVlOwogICAgdmFyIHRyID0gJCh0YWJsZS5yb3dzKS5maXJzdCgpOwogICAgaWYgKHRyLmZpbmQoIlRIIikubGVuZ3RoID4gMCkgewogICAgICB0ci5hdHRyKCdkYXRhLXNvcnQtbWV0aG9kJywgJ25vbmUnKTsKICAgICAgdHIuZmluZCgiVEQiKS5hdHRyKCdkYXRhLXNvcnQtbWV0aG9kJywgJ25vbmUnKTsKICAgICAgbmV3IFRhYmxlc29ydCh0YWJsZSk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIHNldHVwSG92ZXJUb29sdGlwcyhjb250YWluZXIpIHsKICAkKGNvbnRhaW5lciB8fCAnYm9keScpLmZpbmQoIlt0aXRsZV06bm90KC5uby10b29sdGlwKSIpLnRvb2x0aXAoewogICAgc2hvdzogewogICAgICBkZWxheTogNDAwCiAgICB9LAogICAgcG9zaXRpb246IHsKICAgICAgbXk6ICJjZW50ZXIgYm90dG9tLTUiLAogICAgICBhdDogImNlbnRlciB0b3AiCiAgICB9CiAgfSk7Cn0KZnVuY3Rpb24gcmVtb3ZlSG92ZXJUb29sdGlwcyhjb250YWluZXIpIHsKICAkKGNvbnRhaW5lciB8fCAnYm9keScpLmZpbmQoIlt0aXRsZV06bm90KC5uby10b29sdGlwKSIpLnRvb2x0aXAoJ2Rlc3Ryb3knKQp9CiQoZnVuY3Rpb24oKSB7IHNldHVwSG92ZXJUb29sdGlwcygpOyB9KTsKCmZ1bmN0aW9uIGlubGluZUF1dG9Db21wbGV0ZShlbGVtZW50KSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gZG8gbm90IGF0dGFjaCBpZiBUcmlidXRlIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQKICAgIGlmIChlbGVtZW50LmRhdGFzZXQudHJpYnV0ZSA9PT0gJ3RydWUnKSB7cmV0dXJufTsKCiAgICBjb25zdCBnZXREYXRhU291cmNlID0gZnVuY3Rpb24oZW50aXR5KSB7CiAgICAgIGNvbnN0IGRhdGFTb3VyY2VzID0gcm0uQXV0b0NvbXBsZXRlLmRhdGFTb3VyY2VzOwoKICAgICAgaWYgKGRhdGFTb3VyY2VzW2VudGl0eV0pIHsKICAgICAgICByZXR1cm4gZGF0YVNvdXJjZXNbZW50aXR5XTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KCiAgICBjb25zdCBkZWJvdW5jZSA9IGZ1bmN0aW9uKGZ1bmMsIGRlbGF5KSB7CiAgICAgIGxldCB0aW1lb3V0OwoKICAgICAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3MpIHsKICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpczsKICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7CiAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKSwgZGVsYXkpOwogICAgICB9OwogICAgfQoKICAgIGNvbnN0IHJlbW90ZVNlYXJjaCA9IGRlYm91bmNlKCh1cmwsIGNiKSA9PiB7CiAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkKICAgICAgewogICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkgewogICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7CiAgICAgICAgICAgIGNiKGRhdGEpOwogICAgICAgICAgfSBlbHNlIGlmICh4aHIuc3RhdHVzID09PSA0MDMpIHsKICAgICAgICAgICAgY2IoW10pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfTsKICAgICAgeGhyLm9wZW4oIkdFVCIsIHVybCwgdHJ1ZSk7CiAgICAgIHhoci5zZW5kKCk7CiAgICB9LCAyMDApOwoKICAgIGNvbnN0IHRyaWJ1dGUgPSBuZXcgVHJpYnV0ZSh7CiAgICAgIGNvbGxlY3Rpb246IFsKICAgICAgICB7CiAgICAgICAgICB0cmlnZ2VyOiAnIycsCiAgICAgICAgICB2YWx1ZXM6IGZ1bmN0aW9uICh0ZXh0LCBjYikgewogICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0LnR5cGUgPT09ICd0ZXh0JyAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZSgnYXV0b2NvbXBsZXRlJykgIT0gJ29mZicpIHsKICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXV0b2NvbXBsZXRlJywgJ29mZicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFdoZW4gdHJpZ2dlcmVkIHdpdGggdGV4dCBzdGFydGluZyB3aXRoICIjIyIsIGxpa2UgIiMjYSIsIHRoZSBzZWFyY2ggdGVybSB3aWxsIGJlY29tZSAiI2EiLAogICAgICAgICAgICAvLyBjYXVzaW5nIHRoZSBTUUwgcXVlcnkgdG8gZmFpbCBpbiBmaW5kaW5nIGlzc3VlcyB3aXRoICJhIiBpbiB0aGUgc3ViamVjdC4KICAgICAgICAgICAgLy8gVG8gYXZvaWQgdGhpcywgcmVtb3ZlIHRoZSBmaXJzdCAiIyIgZnJvbSB0aGUgc2VhcmNoIHRlcm0uCiAgICAgICAgICAgIGlmICh0ZXh0KSB7CiAgICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXiMvLCAnJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVtb3RlU2VhcmNoKGdldERhdGFTb3VyY2UoJ2lzc3VlcycpICsgZW5jb2RlVVJJQ29tcG9uZW50KHRleHQpLCBmdW5jdGlvbiAoaXNzdWVzKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGNiKGlzc3Vlcyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIGxvb2t1cDogJ2xhYmVsJywKICAgICAgICAgIGZpbGxBdHRyOiAnbGFiZWwnLAogICAgICAgICAgcmVxdWlyZUxlYWRpbmdTcGFjZTogdHJ1ZSwKICAgICAgICAgIHNlbGVjdFRlbXBsYXRlOiBmdW5jdGlvbiAoaXNzdWUpIHsKICAgICAgICAgICAgbGV0IGxlYWRpbmdIYXNoID0gIiMiCiAgICAgICAgICAgIC8vIGtlZXAgIyMgc3ludGF4IHdoaWNoIGlzIGEgdmFsaWQgaXNzdWUgc3ludGF4IHRvIHNob3cgaXNzdWUgd2l0aCB0aXRsZS4KICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudE1lbnRpb25UZXh0U25hcHNob3QuY2hhckF0KDApID09PSAiIyIpIHsKICAgICAgICAgICAgICBsZWFkaW5nSGFzaCA9ICIjIyIKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbGVhZGluZ0hhc2ggKyBpc3N1ZS5vcmlnaW5hbC5pZDsKICAgICAgICAgIH0sCiAgICAgICAgICBtZW51SXRlbVRlbXBsYXRlOiBmdW5jdGlvbiAoaXNzdWUpIHsKICAgICAgICAgICAgcmV0dXJuIHNhbml0aXplSFRNTChpc3N1ZS5vcmlnaW5hbC5sYWJlbCk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICB0cmlnZ2VyOiAnW1snLAogICAgICAgICAgdmFsdWVzOiBmdW5jdGlvbiAodGV4dCwgY2IpIHsKICAgICAgICAgICAgcmVtb3RlU2VhcmNoKGdldERhdGFTb3VyY2UoJ3dpa2lfcGFnZXMnKSArIGVuY29kZVVSSUNvbXBvbmVudCh0ZXh0KSwgZnVuY3Rpb24gKHdpa2lQYWdlcykgewogICAgICAgICAgICAgIHJldHVybiBjYih3aWtpUGFnZXMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICBsb29rdXA6ICdsYWJlbCcsCiAgICAgICAgICBmaWxsQXR0cjogJ2xhYmVsJywKICAgICAgICAgIHJlcXVpcmVMZWFkaW5nU3BhY2U6IHRydWUsCiAgICAgICAgICBzZWxlY3RUZW1wbGF0ZTogZnVuY3Rpb24gKHdpa2lQYWdlKSB7CiAgICAgICAgICAgIHJldHVybiAnW1snICsgd2lraVBhZ2Uub3JpZ2luYWwudmFsdWUgKyAnXV0nOwogICAgICAgICAgfSwKICAgICAgICAgIG1lbnVJdGVtVGVtcGxhdGU6IGZ1bmN0aW9uICh3aWtpUGFnZSkgewogICAgICAgICAgICByZXR1cm4gc2FuaXRpemVIVE1MKHdpa2lQYWdlLm9yaWdpbmFsLmxhYmVsKTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIHRyaWdnZXI6ICdAJywKICAgICAgICAgIGxvb2t1cDogZnVuY3Rpb24gKHVzZXIsIG1lbnRpb25UZXh0KSB7CiAgICAgICAgICAgIHJldHVybiB1c2VyLm5hbWUgKyB1c2VyLmZpcnN0bmFtZSArIHVzZXIubGFzdG5hbWUgKyB1c2VyLmxvZ2luOwogICAgICAgICAgfSwKICAgICAgICAgIHZhbHVlczogZnVuY3Rpb24gKHRleHQsIGNiKSB7CiAgICAgICAgICAgIGNvbnN0IHVybCA9IGdldERhdGFTb3VyY2UoJ3VzZXJzJyk7CiAgICAgICAgICAgIGlmICh1cmwpIHsKICAgICAgICAgICAgICByZW1vdGVTZWFyY2godXJsICsgZW5jb2RlVVJJQ29tcG9uZW50KHRleHQpLCBmdW5jdGlvbiAodXNlcnMpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjYih1c2Vycyk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICBtZW51SXRlbVRlbXBsYXRlOiBmdW5jdGlvbiAodXNlcikgewogICAgICAgICAgICByZXR1cm4gc2FuaXRpemVIVE1MKHVzZXIub3JpZ2luYWwubmFtZSk7CiAgICAgICAgICB9LAogICAgICAgICAgc2VsZWN0VGVtcGxhdGU6IGZ1bmN0aW9uICh1c2VyKSB7CiAgICAgICAgICAgIHJldHVybiAnQCcgKyB1c2VyLm9yaWdpbmFsLmxvZ2luOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgXSwKICAgICAgbm9NYXRjaFRlbXBsYXRlOiAiIgogICAgfSk7CgogICAgdHJpYnV0ZS5hdHRhY2goZWxlbWVudCk7Cn0KCi8vIGNvbGxhcHNpYmxlIHNpZGViYXIgalF1ZXJ5IHBsdWdpbgooZnVuY3Rpb24oJCkgewogIC8vIG1haW4gY29udGFpbmVyIHRoaXMgaXMgYXBwbGllZCB0bwogIHZhciBtYWluOwogIC8vIHRyaWdnZXJzIHNob3cvaGlkZQogIHZhciBidXR0b247CiAgLy8gdGhlIGtleSB0byB1c2UgaW4gbG9jYWwgc3RvcmFnZQogIC8vIHRoaXMgd2lsbCBsYXRlciBiZSBleHBhbmRlZCB1c2luZyB0aGUgY3VycmVudCBjb250cm9sbGVyIGFuZCBhY3Rpb24gdG8KICAvLyBhbGxvdyBmb3IgZGlmZmVyZW50IHNpZGViYXIgc3RhdGVzIGZvciBkaWZmZXJlbnQgcGFnZXMKICB2YXIgbG9jYWxTdG9yYWdlS2V5ID0gJ3JlZG1pbmUtc2lkZWJhci1zdGF0ZSc7CiAgLy8gdHJ1ZSBpZiBsb2NhbCBzdG9yYWdlIGlzIGF2YWlsYWJsZQogIHZhciBjYW5Vc2VMb2NhbFN0b3JhZ2UgPSBmdW5jdGlvbigpewogICAgdHJ5IHsKICAgICAgaWYoJ2xvY2FsU3RvcmFnZScgaW4gd2luZG93KXsKICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncmVkbWluZS50ZXN0LnN0b3JhZ2UnLCAnb2snKTsKICAgICAgICB2YXIgaXRlbSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdyZWRtaW5lLnRlc3Quc3RvcmFnZScpOwogICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdyZWRtaW5lLnRlc3Quc3RvcmFnZScpOwogICAgICAgIGlmKGl0ZW0gPT09ICdvaycpIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9IGNhdGNoIChlcnIpIHt9CiAgICByZXR1cm4gZmFsc2U7CiAgfSgpOwogIC8vIGZ1bmN0aW9uIHRvIHNldCBjdXJyZW50IHNpZGViYXIgc3RhdGUKICB2YXIgc2V0U3RhdGUgPSBmdW5jdGlvbihzdGF0ZSl7CiAgICBpZihjYW5Vc2VMb2NhbFN0b3JhZ2UpewogICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShsb2NhbFN0b3JhZ2VLZXksIHN0YXRlKTsKICAgIH0KICB9OwogIHZhciBhcHBseVN0YXRlID0gZnVuY3Rpb24oKXsKICAgIGlmKG1haW4uaGFzQ2xhc3MoJ2NvbGxhcHNlZHNpZGViYXInKSl7CiAgICAgIHVwZGF0ZVNWR0ljb24oZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NpZGViYXItc3dpdGNoLWJ1dHRvbicpLCAnY2hldnJvbnMtbGVmdCcpCiAgICAgIHNldFN0YXRlKCdoaWRkZW4nKTsKICAgIH0gZWxzZSB7CiAgICAgIHVwZGF0ZVNWR0ljb24oZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NpZGViYXItc3dpdGNoLWJ1dHRvbicpLCAnY2hldnJvbnMtcmlnaHQnKQogICAgICBzZXRTdGF0ZSgndmlzaWJsZScpOwogICAgfQogIH07CiAgdmFyIHNldHVwVG9nZ2xlQnV0dG9uID0gZnVuY3Rpb24oKXsKICAgIGJ1dHRvbiA9ICQoJyNzaWRlYmFyLXN3aXRjaC1idXR0b24nKTsKICAgIGJ1dHRvbi5jbGljayhmdW5jdGlvbihlKXsKICAgICAgbWFpbi5hZGRDbGFzcygiYW5pbWF0ZSIpOwogICAgICBtYWluLnRvZ2dsZUNsYXNzKCdjb2xsYXBzZWRzaWRlYmFyJyk7CiAgICAgIGFwcGx5U3RhdGUoKTsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9KTsKICAgIGFwcGx5U3RhdGUoKTsKICB9OwogICQuZm4uY29sbGFwc2libGVTaWRlYmFyID0gZnVuY3Rpb24oKSB7CiAgICBtYWluID0gdGhpczsKICAgIC8vIGRldGVybWluZSBwcmV2aW91c2x5IHN0b3JlZCBzaWRlYmFyIHN0YXRlIGZvciB0aGlzIHBhZ2UKICAgIGlmKGNhblVzZUxvY2FsU3RvcmFnZSkgewogICAgICAvLyBkZXRlcm1pbmUgY3VycmVudCBjb250cm9sbGVyL2FjdGlvbiBwYWlyIGFuZCB1c2UgdGhlbSBhcyBzdG9yYWdlIGtleQogICAgICB2YXIgYm9keUNsYXNzID0gJCgnYm9keScpLmF0dHIoJ2NsYXNzJyk7CiAgICAgIGlmKGJvZHlDbGFzcyl7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGxvY2FsU3RvcmFnZUtleSArPSAnLScgKyBib2R5Q2xhc3Muc3BsaXQoL1xzKy8pLmZpbHRlcihmdW5jdGlvbihzKXsKICAgICAgICAgICAgcmV0dXJuIHMubWF0Y2goLyhhY3Rpb258Y29udHJvbGxlciktLiovKTsKICAgICAgICAgIH0pLnNvcnQoKS5qb2luKCctJyk7CiAgICAgICAgfSBjYXRjaChlKSB7CiAgICAgICAgICAvLyBpbiBjYXNlIG9mIGVycm9yIChwcm9iYWJseSBJRTgpLCBjb250aW51ZSB3aXRoIHRoZSB1bm1vZGlmaWVkIGtleQogICAgICAgIH0KICAgICAgfQogICAgICB2YXIgc3RvcmVkU3RhdGUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShsb2NhbFN0b3JhZ2VLZXkpOwogICAgICBtYWluLnRvZ2dsZUNsYXNzKCdjb2xsYXBzZWRzaWRlYmFyJywgc3RvcmVkU3RhdGUgPT09ICdoaWRkZW4nKTsKICAgIH0KICAgIC8vIGRyYXcgdGhlIHRvZ2dsZSBidXR0b24gb25jZSB0aGUgRE9NIGlzIGNvbXBsZXRlCiAgICAkKGRvY3VtZW50KS5yZWFkeShzZXR1cFRvZ2dsZUJ1dHRvbik7CiAgfTsKfShqUXVlcnkpKTsKCiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwQWpheEluZGljYXRvcik7CiQoZG9jdW1lbnQpLnJlYWR5KGhpZGVPbkxvYWQpOwokKGRvY3VtZW50KS5yZWFkeShhZGRGb3JtT2JzZXJ2ZXJzRm9yRG91YmxlU3VibWl0KTsKJChkb2N1bWVudCkucmVhZHkoZGVmYXVsdEZvY3VzKTsKJChkb2N1bWVudCkucmVhZHkoc2V0dXBBdHRhY2htZW50RGV0YWlsKTsKJChkb2N1bWVudCkucmVhZHkoc2V0dXBUYWJzKTsKJChkb2N1bWVudCkucmVhZHkoc2V0dXBGaWxlUHJldmlld05hdmlnYXRpb24pOwokKGRvY3VtZW50KS5yZWFkeShzZXR1cFdpa2lUYWJsZVNvcnRhYmxlSGVhZGVyKTsKJChkb2N1bWVudCkub24oJ2ZvY3VzJywgJ1tkYXRhLWF1dG8tY29tcGxldGU9dHJ1ZV0nLCBmdW5jdGlvbihldmVudCkgewogIGlubGluZUF1dG9Db21wbGV0ZShldmVudC50YXJnZXQpOwp9KTsKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsICgpID0+IHsgc2V0dXBDb3B5QnV0dG9uc1RvUHJlRWxlbWVudHMoKTsgfSk7Cg==" | |
| }, | |
| "attachments.js": { | |
| "hash": "cbb5bf1f3ac681083b5e0c953ac18f3b", | |
| "path": "/usr/src/redmine/public/assets/attachments-16bdcfc0.js", | |
| "base64": "LyoqCiAqIFJlZG1pbmUgLSBwcm9qZWN0IG1hbmFnZW1lbnQgc29mdHdhcmUKICogQ29weXJpZ2h0IChDKSAyMDA2LSAgSmVhbi1QaGlsaXBwZSBMYW5nCiAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCiAqLwoKZnVuY3Rpb24gYWRkRmlsZShpbnB1dEVsLCBmaWxlLCBlYWdlclVwbG9hZCkgewogIHZhciBhdHRhY2htZW50c0Zvcm0gPSAkKGlucHV0RWwpLmNsb3Nlc3QoJy5hdHRhY2htZW50c19mb3JtJykKICB2YXIgYXR0YWNobWVudHNGaWVsZHMgPSBhdHRhY2htZW50c0Zvcm0uZmluZCgnLmF0dGFjaG1lbnRzX2ZpZWxkcycpOwogIHZhciBhdHRhY2htZW50c0ljb25zID0gYXR0YWNobWVudHNGb3JtLmZpbmQoJy5hdHRhY2htZW50c19pY29ucycpOwogIHZhciBhZGRBdHRhY2htZW50ID0gYXR0YWNobWVudHNGb3JtLmZpbmQoJy5hZGRfYXR0YWNobWVudCcpOwogIHZhciBtYXhGaWxlcyA9ICgkKGlucHV0RWwpLmF0dHIoJ211bHRpcGxlJykgPT0gJ211bHRpcGxlJyA/IDEwIDogMSk7CiAgdmFyIGRlbEljb24gPSBhdHRhY2htZW50c0ljb25zLmZpbmQoJ3N2Zy5zdmctZGVsJykuY2xvbmUoKTsKICB2YXIgYXR0YWNobWVudEljb24gPSBhdHRhY2htZW50c0ljb25zLmZpbmQoJ3N2Zy5zdmctYXR0YWNobWVudCcpLmNsb25lKCk7CgogIGlmIChhdHRhY2htZW50c0ZpZWxkcy5jaGlsZHJlbigpLmxlbmd0aCA8IG1heEZpbGVzKSB7CiAgICB2YXIgYXR0YWNobWVudElkID0gYWRkRmlsZS5uZXh0QXR0YWNobWVudElkKys7CiAgICB2YXIgZmlsZVNwYW4gPSAkKCc8c3Bhbj4nLCB7IGlkOiAnYXR0YWNobWVudHNfJyArIGF0dGFjaG1lbnRJZCB9KTsKICAgIHZhciBwYXJhbSA9ICQoaW5wdXRFbCkuZGF0YSgncGFyYW0nKTsKICAgIGlmICghcGFyYW0pIHtwYXJhbSA9ICdhdHRhY2htZW50cyd9OwoKICAgIGZpbGVTcGFuLmFwcGVuZCgKICAgICAgICBhdHRhY2htZW50SWNvbiwKICAgICAgICAkKCc8aW5wdXQ+JywgeyB0eXBlOiAndGV4dCcsICdjbGFzcyc6ICdpY29uIGljb24tYXR0YWNobWVudCBmaWxlbmFtZSByZWFkb25seScsIG5hbWU6IHBhcmFtICsnWycgKyBhdHRhY2htZW50SWQgKyAnXVtmaWxlbmFtZV0nLCByZWFkb25seTogJ3JlYWRvbmx5J30gKS52YWwoZmlsZS5uYW1lKSwKICAgICAgICAkKCc8aW5wdXQ+JywgeyB0eXBlOiAndGV4dCcsICdjbGFzcyc6ICdkZXNjcmlwdGlvbicsIG5hbWU6IHBhcmFtICsgJ1snICsgYXR0YWNobWVudElkICsgJ11bZGVzY3JpcHRpb25dJywgbWF4bGVuZ3RoOiAyNTUsIHBsYWNlaG9sZGVyOiAkKGlucHV0RWwpLmRhdGEoJ2Rlc2NyaXB0aW9uLXBsYWNlaG9sZGVyJykgfSApLnRvZ2dsZSghZWFnZXJVcGxvYWQpLAogICAgICAgICQoJzxpbnB1dD4nLCB7IHR5cGU6ICdoaWRkZW4nLCAnY2xhc3MnOiAndG9rZW4nLCBuYW1lOiBwYXJhbSArICdbJyArIGF0dGFjaG1lbnRJZCArICddW3Rva2VuXSd9ICksCiAgICAgICAgJCgnPGE+JywgeyBocmVmOiAiIyIsICdjbGFzcyc6ICdpY29uLW9ubHkgaWNvbi1kZWwgcmVtb3ZlLXVwbG9hZCcgfSkuYXBwZW5kKGRlbEljb24pLmNsaWNrKHJlbW92ZUZpbGUpLnRvZ2dsZSghZWFnZXJVcGxvYWQpCiAgICApLmFwcGVuZFRvKGF0dGFjaG1lbnRzRmllbGRzKTsKCgogICAgaWYgKCQoaW5wdXRFbCkuZGF0YSgnZGVzY3JpcHRpb24nKSA9PSAwKSB7CiAgICAgIGZpbGVTcGFuLmZpbmQoJ2lucHV0LmRlc2NyaXB0aW9uJykucmVtb3ZlKCk7CiAgICB9CgogICAgaWYoZWFnZXJVcGxvYWQpIHsKICAgICAgYWpheFVwbG9hZChmaWxlLCBhdHRhY2htZW50SWQsIGZpbGVTcGFuLCBpbnB1dEVsKTsKICAgIH0KCiAgICBhZGRBdHRhY2htZW50LnRvZ2dsZShhdHRhY2htZW50c0ZpZWxkcy5jaGlsZHJlbigpLmxlbmd0aCA8IG1heEZpbGVzKTsKICAgIHJldHVybiBhdHRhY2htZW50SWQ7CiAgfQogIHJldHVybiBudWxsOwp9CgphZGRGaWxlLm5leHRBdHRhY2htZW50SWQgPSAxOwoKZnVuY3Rpb24gYWpheFVwbG9hZChmaWxlLCBhdHRhY2htZW50SWQsIGZpbGVTcGFuLCBpbnB1dEVsKSB7CiAgbGV0IGF0dGFjaG1lbnRJY29uID0gJChmaWxlU3BhbikuZmluZCgnc3ZnLnN2Zy1hdHRhY2htZW50Jyk7CgogIGZ1bmN0aW9uIG9uTG9hZHN0YXJ0KGUpIHsKICAgIGZpbGVTcGFuLnJlbW92ZUNsYXNzKCdhamF4LXdhaXRpbmcnKTsKICAgIGZpbGVTcGFuLmFkZENsYXNzKCdhamF4LWxvYWRpbmcnKTsKICAgIGF0dGFjaG1lbnRJY29uLmFkZENsYXNzKCdzdmctbG9hZGVyJyk7CiAgICB1cGRhdGVTVkdJY29uKGF0dGFjaG1lbnRJY29uWzBdLCAnbG9hZGVyJykKICAgICQoJ2lucHV0OnN1Ym1pdCcsICQodGhpcykucGFyZW50cygnZm9ybScpKS5hdHRyKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpOwogIH0KCiAgZnVuY3Rpb24gb25Qcm9ncmVzcyhlKSB7CiAgICBpZihlLmxlbmd0aENvbXB1dGFibGUpIHsKICAgICAgdGhpcy5wcm9ncmVzc2JhciggJ3ZhbHVlJywgZS5sb2FkZWQgKiAxMDAgLyBlLnRvdGFsICk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhY3R1YWxVcGxvYWQoZmlsZSwgYXR0YWNobWVudElkLCBmaWxlU3BhbiwgaW5wdXRFbCkgewoKICAgIGFqYXhVcGxvYWQudXBsb2FkaW5nKys7CgogICAgdXBsb2FkQmxvYihmaWxlLCAkKGlucHV0RWwpLmRhdGEoJ3VwbG9hZC1wYXRoJyksIGF0dGFjaG1lbnRJZCwgewogICAgICAgIGxvYWRzdGFydEV2ZW50SGFuZGxlcjogb25Mb2Fkc3RhcnQuYmluZChwcm9ncmVzc1NwYW4pLAogICAgICAgIHByb2dyZXNzRXZlbnRIYW5kbGVyOiBvblByb2dyZXNzLmJpbmQocHJvZ3Jlc3NTcGFuKQogICAgICB9KQogICAgICAuZG9uZShmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICBhZGRJbmxpbmVBdHRhY2htZW50TWFya3VwKGZpbGUpOwogICAgICAgIHByb2dyZXNzU3Bhbi5wcm9ncmVzc2JhciggJ3ZhbHVlJywgMTAwICkucmVtb3ZlKCk7CiAgICAgICAgZmlsZVNwYW4uZmluZCgnaW5wdXQuZGVzY3JpcHRpb24sIGEnKS5jc3MoJ2Rpc3BsYXknLCAnaW5saW5lLWZsZXgnKTsKICAgICAgfSkKICAgICAgLmZhaWwoZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgcHJvZ3Jlc3NTcGFuLnRleHQocmVzdWx0LnN0YXR1c1RleHQpOwogICAgICB9KS5hbHdheXMoZnVuY3Rpb24oKSB7CiAgICAgICAgYWpheFVwbG9hZC51cGxvYWRpbmctLTsKICAgICAgICBmaWxlU3Bhbi5yZW1vdmVDbGFzcygnYWpheC1sb2FkaW5nJyk7CiAgICAgICAgYXR0YWNobWVudEljb24ucmVtb3ZlQ2xhc3MoJ3N2Zy1sb2FkZXInKTsKICAgICAgICB1cGRhdGVTVkdJY29uKGF0dGFjaG1lbnRJY29uWzBdLCAnYXR0YWNobWVudCcpOwogICAgICAgIHZhciBmb3JtID0gZmlsZVNwYW4ucGFyZW50cygnZm9ybScpOwogICAgICAgIGlmIChmb3JtLnF1ZXVlKCd1cGxvYWQnKS5sZW5ndGggPT0gMCAmJiBhamF4VXBsb2FkLnVwbG9hZGluZyA9PSAwKSB7CiAgICAgICAgICAkKCdpbnB1dDpzdWJtaXQnLCBmb3JtKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpOwogICAgICAgIH0KICAgICAgICBmb3JtLmRlcXVldWUoJ3VwbG9hZCcpOwogICAgICB9KTsKICB9CgogIHZhciBwcm9ncmVzc1NwYW4gPSAkKCc8ZGl2PicpLmluc2VydEFmdGVyKGZpbGVTcGFuLmZpbmQoJ2lucHV0LmZpbGVuYW1lJykpOwogIHByb2dyZXNzU3Bhbi5wcm9ncmVzc2JhcigpOwogIGZpbGVTcGFuLmFkZENsYXNzKCdhamF4LXdhaXRpbmcnKTsKICB1cGRhdGVTVkdJY29uKGF0dGFjaG1lbnRJY29uWzBdLCAnaG91cmdsYXNzJyk7CgogIHZhciBtYXhTeW5jVXBsb2FkID0gJChpbnB1dEVsKS5kYXRhKCdtYXgtY29uY3VycmVudC11cGxvYWRzJyk7CgogIGlmKG1heFN5bmNVcGxvYWQgPT0gbnVsbCB8fCBtYXhTeW5jVXBsb2FkIDw9IDAgfHwgYWpheFVwbG9hZC51cGxvYWRpbmcgPCBtYXhTeW5jVXBsb2FkKQogICAgYWN0dWFsVXBsb2FkKGZpbGUsIGF0dGFjaG1lbnRJZCwgZmlsZVNwYW4sIGlucHV0RWwpOwogIGVsc2UKICAgICQoaW5wdXRFbCkucGFyZW50cygnZm9ybScpLnF1ZXVlKCd1cGxvYWQnLCBhY3R1YWxVcGxvYWQuYmluZCh0aGlzLCBmaWxlLCBhdHRhY2htZW50SWQsIGZpbGVTcGFuLCBpbnB1dEVsKSk7Cn0KCmFqYXhVcGxvYWQudXBsb2FkaW5nID0gMDsKCmZ1bmN0aW9uIHJlbW92ZUZpbGUoKSB7CiAgJCh0aGlzKS5jbG9zZXN0KCcuYXR0YWNobWVudHNfZm9ybScpLmZpbmQoJy5hZGRfYXR0YWNobWVudCcpLnNob3coKTsKICAkKHRoaXMpLnBhcmVudCgnc3BhbicpLnJlbW92ZSgpOwogIHJldHVybiBmYWxzZTsKfQoKZnVuY3Rpb24gdXBsb2FkQmxvYihibG9iLCB1cGxvYWRVcmwsIGF0dGFjaG1lbnRJZCwgb3B0aW9ucykgewoKICB2YXIgYWN0dWFsT3B0aW9ucyA9ICQuZXh0ZW5kKHsKICAgIGxvYWRzdGFydEV2ZW50SGFuZGxlcjogJC5ub29wLAogICAgcHJvZ3Jlc3NFdmVudEhhbmRsZXI6ICQubm9vcAogIH0sIG9wdGlvbnMpOwoKICB1cGxvYWRVcmwgPSB1cGxvYWRVcmwgKyAnP2F0dGFjaG1lbnRfaWQ9JyArIGF0dGFjaG1lbnRJZDsKICBpZiAoYmxvYiBpbnN0YW5jZW9mIHdpbmRvdy5CbG9iKSB7CiAgICB1cGxvYWRVcmwgKz0gJyZmaWxlbmFtZT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGJsb2IubmFtZSk7CiAgICB1cGxvYWRVcmwgKz0gJyZjb250ZW50X3R5cGU9JyArIGVuY29kZVVSSUNvbXBvbmVudChibG9iLnR5cGUpOwogIH0KCiAgcmV0dXJuICQuYWpheCh1cGxvYWRVcmwsIHsKICAgIHR5cGU6ICdQT1NUJywKICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgIGJlZm9yZVNlbmQ6IGZ1bmN0aW9uKGpxWGhyLCBzZXR0aW5ncykgewogICAgICBqcVhoci5zZXRSZXF1ZXN0SGVhZGVyKCdBY2NlcHQnLCAnYXBwbGljYXRpb24vanMnKTsKICAgICAgLy8gYXR0YWNoIHByb3BlciBGaWxlIG9iamVjdAogICAgICBzZXR0aW5ncy5kYXRhID0gYmxvYjsKICAgIH0sCiAgICB4aHI6IGZ1bmN0aW9uKCkgewogICAgICB2YXIgeGhyID0gJC5hamF4U2V0dGluZ3MueGhyKCk7CiAgICAgIHhoci51cGxvYWQub25sb2Fkc3RhcnQgPSBhY3R1YWxPcHRpb25zLmxvYWRzdGFydEV2ZW50SGFuZGxlcjsKICAgICAgeGhyLnVwbG9hZC5vbnByb2dyZXNzID0gYWN0dWFsT3B0aW9ucy5wcm9ncmVzc0V2ZW50SGFuZGxlcjsKICAgICAgcmV0dXJuIHhocjsKICAgIH0sCiAgICBkYXRhOiBibG9iLAogICAgY2FjaGU6IGZhbHNlLAogICAgcHJvY2Vzc0RhdGE6IGZhbHNlCiAgfSk7Cn0KCmZ1bmN0aW9uIGFkZElucHV0RmlsZXMoaW5wdXRFbCkgewogIHZhciBhdHRhY2htZW50c0ZpZWxkcyA9ICQoaW5wdXRFbCkuY2xvc2VzdCgnLmF0dGFjaG1lbnRzX2Zvcm0nKS5maW5kKCcuYXR0YWNobWVudHNfZmllbGRzJyk7CiAgdmFyIGFkZEF0dGFjaG1lbnQgPSAkKGlucHV0RWwpLmNsb3Nlc3QoJy5hdHRhY2htZW50c19mb3JtJykuZmluZCgnLmFkZF9hdHRhY2htZW50Jyk7CiAgdmFyIGNsZWFyZWRGaWxlSW5wdXQgPSAkKGlucHV0RWwpLmNsb25lKCkudmFsKCcnKTsKICB2YXIgc2l6ZUV4Y2VlZGVkID0gZmFsc2U7CiAgdmFyIHBhcmFtID0gJChpbnB1dEVsKS5kYXRhKCdwYXJhbScpOwogIGlmICghcGFyYW0pIHtwYXJhbSA9ICdhdHRhY2htZW50cyd9OwoKICBpZiAoJC5hamF4U2V0dGluZ3MueGhyKCkudXBsb2FkICYmIGlucHV0RWwuZmlsZXMpIHsKICAgIC8vIHVwbG9hZCBmaWxlcyB1c2luZyBhamF4CiAgICBzaXplRXhjZWVkZWQgPSB1cGxvYWRBbmRBdHRhY2hGaWxlcyhpbnB1dEVsLmZpbGVzLCBpbnB1dEVsKTsKICAgICQoaW5wdXRFbCkucmVtb3ZlKCk7CiAgfSBlbHNlIHsKICAgIC8vIGJyb3dzZXIgbm90IHN1cHBvcnRpbmcgdGhlIGZpbGUgQVBJLCB1cGxvYWQgb24gZm9ybSBzdWJtaXNzaW9uCiAgICB2YXIgYXR0YWNobWVudElkOwogICAgdmFyIGFGaWxlbmFtZSA9IGlucHV0RWwudmFsdWUuc3BsaXQoL1wvfFxcLyk7CiAgICBhdHRhY2htZW50SWQgPSBhZGRGaWxlKGlucHV0RWwsIHsgbmFtZTogYUZpbGVuYW1lWyBhRmlsZW5hbWUubGVuZ3RoIC0gMSBdIH0sIGZhbHNlKTsKICAgIGlmIChhdHRhY2htZW50SWQpIHsKICAgICAgJChpbnB1dEVsKS5hdHRyKHsgbmFtZTogcGFyYW0gKyAnWycgKyBhdHRhY2htZW50SWQgKyAnXVtmaWxlXScsIHN0eWxlOiAnZGlzcGxheTpub25lOycgfSkuYXBwZW5kVG8oJyNhdHRhY2htZW50c18nICsgYXR0YWNobWVudElkKTsKICAgIH0KICB9CgogIGNsZWFyZWRGaWxlSW5wdXQucHJlcGVuZFRvKGFkZEF0dGFjaG1lbnQpOwp9CgpmdW5jdGlvbiB1cGxvYWRBbmRBdHRhY2hGaWxlcyhmaWxlcywgaW5wdXRFbCkgewoKICB2YXIgbWF4RmlsZVNpemUgPSAkKGlucHV0RWwpLmRhdGEoJ21heC1maWxlLXNpemUnKTsKICB2YXIgbWF4RmlsZVNpemVFeGNlZWRlZCA9ICQoaW5wdXRFbCkuZGF0YSgnbWF4LWZpbGUtc2l6ZS1tZXNzYWdlJyk7CgogIHZhciBzaXplRXhjZWVkZWQgPSBmYWxzZTsKICB2YXIgZmlsZXNMZW5ndGggPSAkKGlucHV0RWwpLmNsb3Nlc3QoJy5hdHRhY2htZW50c19mb3JtJykuZmluZCgnLmF0dGFjaG1lbnRzX2ZpZWxkcycpLmNoaWxkcmVuKCkubGVuZ3RoICsgZmlsZXMubGVuZ3RoCiAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLnNpemUgJiYgbWF4RmlsZVNpemUgIT0gbnVsbCAmJiB0aGlzLnNpemUgPiBwYXJzZUludChtYXhGaWxlU2l6ZSkpIHtzaXplRXhjZWVkZWQ9dHJ1ZTt9CiAgfSk7CiAgaWYgKHNpemVFeGNlZWRlZCkgewogICAgd2luZG93LmFsZXJ0KG1heEZpbGVTaXplRXhjZWVkZWQpOwogIH0gZWxzZSB7CiAgICAkLmVhY2goZmlsZXMsIGZ1bmN0aW9uKCkge2FkZEZpbGUoaW5wdXRFbCwgdGhpcywgdHJ1ZSk7fSk7CiAgfQoKICBpZiAoZmlsZXNMZW5ndGggPiAoJChpbnB1dEVsKS5hdHRyKCdtdWx0aXBsZScpID09ICdtdWx0aXBsZScgPyAxMCA6IDEpKSB7CiAgICB3aW5kb3cuYWxlcnQoJChpbnB1dEVsKS5kYXRhKCdtYXgtbnVtYmVyLW9mLWZpbGVzLW1lc3NhZ2UnKSk7CiAgfQogIHJldHVybiBzaXplRXhjZWVkZWQ7Cn0KCmZ1bmN0aW9uIGhhbmRsZUZpbGVEcm9wRXZlbnQoZSkgewoKICAkKHRoaXMpLnJlbW92ZUNsYXNzKCdmaWxlb3ZlcicpOwogIGJsb2NrRXZlbnRQcm9wYWdhdGlvbihlKTsKCiAgaWYgKCQuaW5BcnJheSgnRmlsZXMnLCBlLmRhdGFUcmFuc2Zlci50eXBlcykgPiAtMSkgewogICAgaGFuZGxlRmlsZURyb3BFdmVudC50YXJnZXQgPSBlLnRhcmdldDsKICAgIGlmICgkKHRoaXMpLmhhc0NsYXNzKCdjdXN0b20tZmllbGQtZmlsZWRyb3BsaXN0bmVyJykpewogICAgICB1cGxvYWRBbmRBdHRhY2hGaWxlcyhlLmRhdGFUcmFuc2Zlci5maWxlcywgJCh0aGlzKS5maW5kKCdpbnB1dDpmaWxlLmN1c3RvbS1maWVsZC1maWxlZHJvcCcpLmZpcnN0KCkpOwogICAgfSBlbHNlIHsKICAgICAgdXBsb2FkQW5kQXR0YWNoRmlsZXMoZS5kYXRhVHJhbnNmZXIuZmlsZXMsICQodGhpcykuZmluZCgnaW5wdXQ6ZmlsZS5maWxlZHJvcCcpLmZpcnN0KCkpOwogICAgfQogIH0KfQpoYW5kbGVGaWxlRHJvcEV2ZW50LnRhcmdldCA9ICcnOwoKZnVuY3Rpb24gZHJhZ092ZXJIYW5kbGVyKGUpIHsKICAkKHRoaXMpLmFkZENsYXNzKCdmaWxlb3ZlcicpOwogIGJsb2NrRXZlbnRQcm9wYWdhdGlvbihlKTsKICBlLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ2NvcHknOwp9CgpmdW5jdGlvbiBkcmFnT3V0SGFuZGxlcihlKSB7CiAgJCh0aGlzKS5yZW1vdmVDbGFzcygnZmlsZW92ZXInKTsKICBibG9ja0V2ZW50UHJvcGFnYXRpb24oZSk7Cn0KCmZ1bmN0aW9uIHNldHVwRmlsZURyb3AoKSB7CiAgaWYgKHdpbmRvdy5GaWxlICYmIHdpbmRvdy5GaWxlTGlzdCAmJiB3aW5kb3cuUHJvZ3Jlc3NFdmVudCAmJiB3aW5kb3cuRm9ybURhdGEpIHsKCiAgICAkLmV2ZW50LmFkZFByb3AoJ2RhdGFUcmFuc2ZlcicpOwoKICAgICQoJ2Zvcm0gZGl2LmJveDpub3QoLmZpbGVkcm9wbGlzdG5lciknKS5oYXMoJ2lucHV0OmZpbGUuZmlsZWRyb3AnKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAkKHRoaXMpLm9uKHsKICAgICAgICAgIGRyYWdvdmVyOiBkcmFnT3ZlckhhbmRsZXIsCiAgICAgICAgICBkcmFnbGVhdmU6IGRyYWdPdXRIYW5kbGVyLAogICAgICAgICAgZHJvcDogaGFuZGxlRmlsZURyb3BFdmVudCwKICAgICAgICAgIHBhc3RlOiBjb3B5SW1hZ2VGcm9tQ2xpcGJvYXJkCiAgICAgIH0pLmFkZENsYXNzKCdmaWxlZHJvcGxpc3RuZXInKTsKICAgIH0pOwoKICAgICQoJ2Zvcm0gZGl2LmJveCBpbnB1dDpmaWxlLmN1c3RvbS1maWVsZC1maWxlZHJvcCcpLmNsb3Nlc3QoJ3AnKS5ub3QoJy5jdXN0b20tZmllbGQtZmlsZWRyb3BsaXN0bmVyJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgJCh0aGlzKS5vbih7CiAgICAgICAgICBkcmFnb3ZlcjogZHJhZ092ZXJIYW5kbGVyLAogICAgICAgICAgZHJhZ2xlYXZlOiBkcmFnT3V0SGFuZGxlciwKICAgICAgICAgIGRyb3A6IGhhbmRsZUZpbGVEcm9wRXZlbnQKICAgICAgfSkuYWRkQ2xhc3MoJ2N1c3RvbS1maWVsZC1maWxlZHJvcGxpc3RuZXInKTsKICAgIH0pOwogIH0KfQoKZnVuY3Rpb24gZ2V0SW1hZ2VXaWR0aChmaWxlKSB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgIGlmIChmaWxlLnR5cGUuc3RhcnRzV2l0aCgiaW1hZ2UvIikpIHsKICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7CiAgICAgICAgaW1nLm9ubG9hZCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmVzb2x2ZShpbWcud2lkdGgpOwogICAgICAgIH07CiAgICAgICAgaW1nLm9uZXJyb3IgPSByZWplY3Q7CiAgICAgICAgaW1nLnNyYyA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7CiAgICAgIH07CiAgICAgIHJlYWRlci5vbmVycm9yID0gcmVqZWN0OwogICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJlc29sdmUoMCk7CiAgICB9CiAgfSk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGdldElubGluZUF0dGFjaG1lbnRNYXJrdXAoZmlsZSkgewogIGNvbnN0IHNhbml0aXplZEZpbGVuYW1lID0gZmlsZS5uYW1lLnJlcGxhY2UoL1tcL1w/XCVcKlw6XHxcIlwnPD5cblxyXSsvZywgJ18nKTsKICBjb25zdCBpbmxpbmVGaWxlbmFtZSA9IGVuY29kZVVSSUNvbXBvbmVudChzYW5pdGl6ZWRGaWxlbmFtZSkKICAgIC5yZXBsYWNlKC9bISgpXS9nLCBmdW5jdGlvbihtYXRjaCkgeyByZXR1cm4gIiUiICsgbWF0Y2guY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikgfSk7CgogIGNvbnN0IGlzRnJvbUNsaXBib2FyZCA9IC9eY2xpcGJvYXJkLVxkezEyfS1bYS16MC05XXs1fVwuXHcrJC8udGVzdChmaWxlLm5hbWUpOwogIGxldCBpbWFnZURpc3BsYXlXaWR0aDsKICBpZiAoaXNGcm9tQ2xpcGJvYXJkKSB7CiAgICBjb25zdCBpbWFnZVdpZHRoID0gYXdhaXQgZ2V0SW1hZ2VXaWR0aChmaWxlKS5jYXRjaCgoKSA9PiAwKTsKICAgIGltYWdlRGlzcGxheVdpZHRoID0gTWF0aC5yb3VuZChpbWFnZVdpZHRoIC8gd2luZG93LmRldmljZVBpeGVsUmF0aW8pOwogIH0KICBjb25zdCBoYXNWYWxpZFdpZHRoID0gaXNGcm9tQ2xpcGJvYXJkICYmIGltYWdlRGlzcGxheVdpZHRoID4gMDsKCiAgc3dpdGNoIChkb2N1bWVudC5ib2R5LmdldEF0dHJpYnV0ZSgnZGF0YS10ZXh0LWZvcm1hdHRpbmcnKSkgewogICAgY2FzZSAndGV4dGlsZSc6CiAgICAgIHJldHVybiBoYXNWYWxpZFdpZHRoCiAgICAgICAgPyBgIXt3aWR0aDogJHtpbWFnZURpc3BsYXlXaWR0aH1weH0uJHtpbmxpbmVGaWxlbmFtZX0hYAogICAgICAgIDogYCEke2lubGluZUZpbGVuYW1lfSFgOwogICAgY2FzZSAnY29tbW9uX21hcmsnOgogICAgICByZXR1cm4gaGFzVmFsaWRXaWR0aAogICAgICAgID8gYDxpbWcgc3R5bGU9IndpZHRoOiAke2ltYWdlRGlzcGxheVdpZHRofXB4OyIgc3JjPSIke2lubGluZUZpbGVuYW1lfSI+PGJyPmAKICAgICAgICA6IGAhW10oJHtpbmxpbmVGaWxlbmFtZX0pYDsKICAgIGRlZmF1bHQ6CiAgICAgIC8vIFRleHQgZm9ybWF0dGluZyBpcyAibm9uZSIgb3IgdW5rbm93bgogICAgICByZXR1cm4gJyc7CiAgfQp9CgpmdW5jdGlvbiBhZGRJbmxpbmVBdHRhY2htZW50TWFya3VwKGZpbGUpIHsKICAvLyBpbnNlcnQgdXBsb2FkZWQgaW1hZ2UgaW5saW5lIGlmIGRyb3BwZWQgYXJlYSBpcyBjdXJyZW50bHkgZm9jdXNlZCB0ZXh0YXJlYQogIGlmKCQoaGFuZGxlRmlsZURyb3BFdmVudC50YXJnZXQpLmhhc0NsYXNzKCd3aWtpLWVkaXQnKSAmJiAkLmluQXJyYXkoZmlsZS50eXBlLCB3aW5kb3cud2lraUltYWdlTWltZVR5cGVzKSA+IC0xKSB7CiAgICB2YXIgJHRleHRhcmVhID0gJChoYW5kbGVGaWxlRHJvcEV2ZW50LnRhcmdldCk7CiAgICB2YXIgY3Vyc29yUG9zaXRpb24gPSAkdGV4dGFyZWEucHJvcCgnc2VsZWN0aW9uU3RhcnQnKTsKICAgIHZhciBkZXNjcmlwdGlvbiA9ICR0ZXh0YXJlYS52YWwoKTsKICAgIHZhciBuZXdMaW5lQmVmb3JlID0gdHJ1ZTsKICAgIHZhciBuZXdMaW5lQWZ0ZXIgPSB0cnVlOwogICAgaWYoY3Vyc29yUG9zaXRpb24gPT09IDAgfHwgZGVzY3JpcHRpb24uc3Vic3RyKGN1cnNvclBvc2l0aW9uLTEsMSkubWF0Y2goL1xyfFxuLykpIHsKICAgICAgbmV3TGluZUJlZm9yZSA9IGZhbHNlOwogICAgfQogICAgaWYoZGVzY3JpcHRpb24uc3Vic3RyKGN1cnNvclBvc2l0aW9uLDEpLm1hdGNoKC9ccnxcbi8pKSB7CiAgICAgIG5ld0xpbmVBZnRlciA9IGZhbHNlOwogICAgfQoKICAgIGdldElubGluZUF0dGFjaG1lbnRNYXJrdXAoZmlsZSkKICAgICAgLnRoZW4oaW1hZ2VNYXJrdXAgPT4gewogICAgICAgICR0ZXh0YXJlYS52YWwoCiAgICAgICAgICBkZXNjcmlwdGlvbi5zdWJzdHJpbmcoMCwgY3Vyc29yUG9zaXRpb24pCiAgICAgICAgICArIChuZXdMaW5lQmVmb3JlID8gJ1xuJyA6ICcnKQogICAgICAgICAgKyBpbWFnZU1hcmt1cAogICAgICAgICAgKyAobmV3TGluZUFmdGVyID8gJ1xuJyA6ICcnKQogICAgICAgICAgKyBkZXNjcmlwdGlvbi5zdWJzdHJpbmcoY3Vyc29yUG9zaXRpb24sIGRlc2NyaXB0aW9uLmxlbmd0aCkKICAgICAgICApOwoKICAgICAgICAvLyBNb3ZlIGN1cnNvciBhZnRlciB0aGUgaW5zZXJ0ZWQgbWFya3VwCiAgICAgICAgdmFyIG5ld0N1cnNvclBvc2l0aW9uID0gY3Vyc29yUG9zaXRpb24gKyAobmV3TGluZUJlZm9yZSA/IDEgOiAwKSArIGltYWdlTWFya3VwLmxlbmd0aDsKICAgICAgICAkdGV4dGFyZWEucHJvcCh7CiAgICAgICAgICAnc2VsZWN0aW9uU3RhcnQnOiBuZXdDdXJzb3JQb3NpdGlvbiArIDEsCiAgICAgICAgICAnc2VsZWN0aW9uRW5kJzogbmV3Q3Vyc29yUG9zaXRpb24gKyAxCiAgICAgICAgfSk7CiAgICAgIH0pOwoKICB9Cn0KCmZ1bmN0aW9uIGNvcHlJbWFnZUZyb21DbGlwYm9hcmQoZSkgewogIGlmICghJChlLnRhcmdldCkuaGFzQ2xhc3MoJ3dpa2ktZWRpdCcpKSB7IHJldHVybjsgfQogIHZhciBjbGlwYm9hcmREYXRhID0gZS5jbGlwYm9hcmREYXRhIHx8IGUub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhCiAgaWYgKCFjbGlwYm9hcmREYXRhKSB7IHJldHVybjsgfQogIGlmIChjbGlwYm9hcmREYXRhLnR5cGVzLnNvbWUoZnVuY3Rpb24odCl7IHJldHVybiAvXnRleHRcL3BsYWluJC8udGVzdCh0KTsgfSkpIHsgcmV0dXJuOyB9CgogIHZhciBmaWxlcyA9IGNsaXBib2FyZERhdGEuZmlsZXMKICBmb3IgKHZhciBpID0gMCA7IGkgPCBmaWxlcy5sZW5ndGggOyBpKyspIHsKICAgIHZhciBmaWxlID0gZmlsZXNbaV07CiAgICBpZiAoZmlsZS50eXBlLmluZGV4T2YoImltYWdlIikgIT0gLTEpIHsKICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgpOwogICAgICB2YXIgZmlsZW5hbWUgPSAnY2xpcGJvYXJkLScKICAgICAgICArIGRhdGUuZ2V0RnVsbFllYXIoKQogICAgICAgICsgKCcwJysoZGF0ZS5nZXRNb250aCgpKzEpKS5zbGljZSgtMikKICAgICAgICArICgnMCcrZGF0ZS5nZXREYXRlKCkpLnNsaWNlKC0yKQogICAgICAgICsgKCcwJytkYXRlLmdldEhvdXJzKCkpLnNsaWNlKC0yKQogICAgICAgICsgKCcwJytkYXRlLmdldE1pbnV0ZXMoKSkuc2xpY2UoLTIpCiAgICAgICAgKyAnLScgKyByYW5kb21LZXkoNSkudG9Mb2NhbGVMb3dlckNhc2UoKQogICAgICAgICsgJy4nICsgZmlsZS5uYW1lLnNwbGl0KCcuJykucG9wKCk7CgogICAgICAvLyBnZXQgaW5wdXQgZmlsZSBpbiB0aGUgY2xvc2VzdCBmb3JtCiAgICAgIHZhciBpbnB1dEVsID0gJCh0aGlzKS5jbG9zZXN0KCJmb3JtIikuZmluZCgnaW5wdXQ6ZmlsZS5maWxlZHJvcCcpOwogICAgICBoYW5kbGVGaWxlRHJvcEV2ZW50LnRhcmdldCA9IGUudGFyZ2V0OwogICAgICBhZGRGaWxlKGlucHV0RWwsIG5ldyBGaWxlKFtmaWxlXSwgZmlsZW5hbWUsIHsgdHlwZTogZmlsZS50eXBlIH0pLCB0cnVlKTsKICAgIH0KICB9Cn0KCiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwRmlsZURyb3ApOwokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICQoImlucHV0LmRlbGV0ZWRfYXR0YWNobWVudCIpLmNoYW5nZShmdW5jdGlvbigpewogICAgJCh0aGlzKS5wYXJlbnRzKCcuZXhpc3RpbmctYXR0YWNobWVudCcpLnRvZ2dsZUNsYXNzKCdkZWxldGVkJywgJCh0aGlzKS5pcygiOmNoZWNrZWQiKSk7CiAgfSkuY2hhbmdlKCk7Cn0pOwo=" | |
| } | |
| }, | |
| "6.1.1": { | |
| "application.js": { | |
| "hash": "c8a83c2e17a6d7c44dbda4672d23e54d", | |
| "path": "/usr/src/redmine/public/assets/application-legacy-d7c89bc3.js", | |
| "base64": "LyoqCiAqIFJlZG1pbmUgLSBwcm9qZWN0IG1hbmFnZW1lbnQgc29mdHdhcmUKICogQ29weXJpZ2h0IChDKSAyMDA2LSAgSmVhbi1QaGlsaXBwZSBMYW5nCiAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCiAqLwoKZnVuY3Rpb24gc2FuaXRpemVIVE1MKHN0cmluZykgewogIHZhciB0ZW1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIHRlbXAudGV4dENvbnRlbnQgPSBzdHJpbmc7CiAgcmV0dXJuIHRlbXAuaW5uZXJIVE1MOwp9CgpmdW5jdGlvbiBjaGVja0FsbChpZCwgY2hlY2tlZCkgewogICQoJyMnK2lkKS5maW5kKCdpbnB1dFt0eXBlPWNoZWNrYm94XTplbmFibGVkJykucHJvcCgnY2hlY2tlZCcsIGNoZWNrZWQpOwp9CgpmdW5jdGlvbiB0b2dnbGVDaGVja2JveGVzQnlTZWxlY3RvcihzZWxlY3RvcikgewogIHZhciBhbGxfY2hlY2tlZCA9IHRydWU7CiAgJChzZWxlY3RvcikuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgaWYgKCEkKHRoaXMpLmlzKCc6Y2hlY2tlZCcpKSB7IGFsbF9jaGVja2VkID0gZmFsc2U7IH0KICB9KTsKICAkKHNlbGVjdG9yKS5wcm9wKCdjaGVja2VkJywgIWFsbF9jaGVja2VkKS50cmlnZ2VyKCdjaGFuZ2UnKTsKfQoKZnVuY3Rpb24gc2hvd0FuZFNjcm9sbFRvKGlkLCBmb2N1cykgewogIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOwogIGlmIChlbCkgewogICAgZWwuc3R5bGUuZGlzcGxheSA9ICcnOyAvLyBzaG93KCkKICAgIGlmIChmb2N1cykgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZm9jdXMpPy5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7CiAgICBlbC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnaW5zdGFudCcgfSk7CiAgfQp9CgpmdW5jdGlvbiB0b2dnbGVSb3dHcm91cChlbCkgewogIHZhciB0ciA9ICQoZWwpLnBhcmVudHMoJ3RyJykuZmlyc3QoKTsKICB2YXIgbiA9IHRyLm5leHQoKTsKICB0ci50b2dnbGVDbGFzcygnb3BlbicpOwogICQoZWwpLnRvZ2dsZUNsYXNzKCdpY29uLWV4cGFuZGVkIGljb24tY29sbGFwc2VkJyk7CiAgdG9nZ2xlRXhwZW5kQ29sbGFwc2VJY29uKGVsKQogIHdoaWxlIChuLmxlbmd0aCAmJiAhbi5oYXNDbGFzcygnZ3JvdXAnKSkgewogICAgbi50b2dnbGUoKTsKICAgIG4gPSBuLm5leHQoJ3RyJyk7CiAgfQp9CgpmdW5jdGlvbiB0b2dnbGVFeHBlbmRDb2xsYXBzZUljb24oZWwpIHsKICBjb25zdCBzdmcgPSBlbC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc3ZnJykuaXRlbSgwKQoKICBpZiAoc3ZnID09PSBudWxsKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBpZiAoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdpY29uLWV4cGFuZGVkJykpIHsKICAgIHVwZGF0ZVNWR0ljb24oc3ZnLCAnYW5nbGUtZG93bicpCiAgICBzdmcuY2xhc3NMaXN0LnJlbW92ZSgnaWNvbi1ydGwnKQogIH0gZWxzZSB7CiAgICB1cGRhdGVTVkdJY29uKHN2ZywgJ2FuZ2xlLXJpZ2h0JykKICAgIHN2Zy5jbGFzc0xpc3QuYWRkKCdpY29uLXJ0bCcpCiAgfQp9CgpmdW5jdGlvbiB1cGRhdGVTVkdJY29uKGVsZW1lbnQsIGljb24pIHsKICBjb25zdCBpY29uRWxlbWVudCA9IGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInVzZSIpLml0ZW0oMCkKCiAgaWYgKGljb25FbGVtZW50ID09PSBudWxsKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBjb25zdCBpY29uUGF0aCA9IGljb25FbGVtZW50LmdldEF0dHJpYnV0ZSgnaHJlZicpOwogIGljb25FbGVtZW50LnNldEF0dHJpYnV0ZSgnaHJlZicsIGljb25QYXRoLnJlcGxhY2UoLyMuKiQvZywgIiNpY29uLS0iICsgaWNvbikpCn0KCmZ1bmN0aW9uIGNyZWF0ZVNWR0ljb24oaWNvbikgewogIGNvbnN0IGNsb25lZEljb24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjaWNvbi1jb3B5LXNvdXJjZSBzdmcnKS5jbG9uZU5vZGUodHJ1ZSk7CiAgdXBkYXRlU1ZHSWNvbihjbG9uZWRJY29uLCBpY29uKTsKICByZXR1cm4gY2xvbmVkSWNvbgp9CgpmdW5jdGlvbiBjb2xsYXBzZUFsbFJvd0dyb3VwcyhlbCkgewogIHZhciB0Ym9keSA9ICQoZWwpLnBhcmVudHMoJ3Rib2R5JykuZmlyc3QoKTsKICB0Ym9keS5jaGlsZHJlbigndHInKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnZ3JvdXAnKSkgewogICAgICAkKHRoaXMpLnJlbW92ZUNsYXNzKCdvcGVuJyk7CiAgICAgIHZhciBleHBhbmRlciA9ICQodGhpcykuZmluZCgnLmV4cGFuZGVyJyk7CiAgICAgIGV4cGFuZGVyLnN3aXRjaENsYXNzKCdpY29uLWV4cGFuZGVkJywgJ2ljb24tY29sbGFwc2VkJyk7CiAgICAgIHRvZ2dsZUV4cGVuZENvbGxhcHNlSWNvbihleHBhbmRlclswXSk7CiAgICB9IGVsc2UgewogICAgICAkKHRoaXMpLmhpZGUoKTsKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gZXhwYW5kQWxsUm93R3JvdXBzKGVsKSB7CiAgdmFyIHRib2R5ID0gJChlbCkucGFyZW50cygndGJvZHknKS5maXJzdCgpOwogIHRib2R5LmNoaWxkcmVuKCd0cicpLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgIGlmICgkKHRoaXMpLmhhc0NsYXNzKCdncm91cCcpKSB7CiAgICAgICQodGhpcykuYWRkQ2xhc3MoJ29wZW4nKTsKICAgICAgdmFyIGV4cGFuZGVyID0gJCh0aGlzKS5maW5kKCcuZXhwYW5kZXInKTsKICAgICAgZXhwYW5kZXIuc3dpdGNoQ2xhc3MoJ2ljb24tY29sbGFwc2VkJywgJ2ljb24tZXhwYW5kZWQnKTsKICAgICAgdG9nZ2xlRXhwZW5kQ29sbGFwc2VJY29uKGV4cGFuZGVyWzBdKTsKICAgIH0gZWxzZSB7CiAgICAgICQodGhpcykuc2hvdygpOwogICAgfQogIH0pOwp9CgpmdW5jdGlvbiB0b2dnbGVBbGxSb3dHcm91cHMoZWwpIHsKICB2YXIgdHIgPSAkKGVsKS5wYXJlbnRzKCd0cicpLmZpcnN0KCk7CiAgaWYgKHRyLmhhc0NsYXNzKCdvcGVuJykpIHsKICAgIGNvbGxhcHNlQWxsUm93R3JvdXBzKGVsKTsKICB9IGVsc2UgewogICAgZXhwYW5kQWxsUm93R3JvdXBzKGVsKTsKICB9Cn0KCmZ1bmN0aW9uIHRvZ2dsZUZpZWxkc2V0KGVsKSB7CiAgdmFyIGZpZWxkc2V0ID0gJChlbCkucGFyZW50cygnZmllbGRzZXQnKS5maXJzdCgpOwogIGZpZWxkc2V0LnRvZ2dsZUNsYXNzKCdjb2xsYXBzZWQnKTsKICBmaWVsZHNldC5jaGlsZHJlbignbGVnZW5kJykudG9nZ2xlQ2xhc3MoJ2ljb24tZXhwYW5kZWQgaWNvbi1jb2xsYXBzZWQnKTsKICB0b2dnbGVFeHBlbmRDb2xsYXBzZUljb24oZmllbGRzZXQuY2hpbGRyZW4oJ2xlZ2VuZCcpWzBdKQogIGZpZWxkc2V0LmNoaWxkcmVuKCdkaXYnKS50b2dnbGUoKTsKfQoKZnVuY3Rpb24gaGlkZUZpZWxkc2V0KGVsKSB7CiAgdmFyIGZpZWxkc2V0ID0gJChlbCkucGFyZW50cygnZmllbGRzZXQnKS5maXJzdCgpOwogIGZpZWxkc2V0LnRvZ2dsZUNsYXNzKCdjb2xsYXBzZWQnKTsKICBmaWVsZHNldC5jaGlsZHJlbignZGl2JykuaGlkZSgpOwp9CgovLyBjb2x1bW5zIHNlbGVjdGlvbgpmdW5jdGlvbiBtb3ZlT3B0aW9ucyh0aGVTZWxGcm9tLCB0aGVTZWxUbykgewogICQodGhlU2VsRnJvbSkuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykuZGV0YWNoKCkucHJvcCgic2VsZWN0ZWQiLCBmYWxzZSkuYXBwZW5kVG8oJCh0aGVTZWxUbykpOwp9CgpmdW5jdGlvbiBtb3ZlT3B0aW9uVXAodGhlU2VsKSB7CiAgJCh0aGVTZWwpLmZpbmQoJ29wdGlvbjpzZWxlY3RlZCcpLmVhY2goZnVuY3Rpb24oKXsKICAgICQodGhpcykucHJldignOm5vdCg6c2VsZWN0ZWQpJykuZGV0YWNoKCkuaW5zZXJ0QWZ0ZXIoJCh0aGlzKSk7CiAgfSk7Cn0KCmZ1bmN0aW9uIG1vdmVPcHRpb25Ub3AodGhlU2VsKSB7CiAgJCh0aGVTZWwpLmZpbmQoJ29wdGlvbjpzZWxlY3RlZCcpLmRldGFjaCgpLnByZXBlbmRUbygkKHRoZVNlbCkpOwp9CgpmdW5jdGlvbiBtb3ZlT3B0aW9uRG93bih0aGVTZWwpIHsKICAkKCQodGhlU2VsKS5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS5nZXQoKS5yZXZlcnNlKCkpLmVhY2goZnVuY3Rpb24oKXsKICAgICQodGhpcykubmV4dCgnOm5vdCg6c2VsZWN0ZWQpJykuZGV0YWNoKCkuaW5zZXJ0QmVmb3JlKCQodGhpcykpOwogIH0pOwp9CgpmdW5jdGlvbiBtb3ZlT3B0aW9uQm90dG9tKHRoZVNlbCkgewogICQodGhlU2VsKS5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS5kZXRhY2goKS5hcHBlbmRUbygkKHRoZVNlbCkpOwp9CgpmdW5jdGlvbiBpbml0RmlsdGVycygpIHsKICAkKCcjYWRkX2ZpbHRlcl9zZWxlY3QnKS5jaGFuZ2UoZnVuY3Rpb24oKSB7CiAgICBhZGRGaWx0ZXIoJCh0aGlzKS52YWwoKSwgJycsIFtdKTsKICB9KTsKICAkKCcjZmlsdGVycy10YWJsZSAuZmllbGQgaW5wdXRbdHlwZT1jaGVja2JveF0nKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgdG9nZ2xlRmlsdGVyKCQodGhpcykudmFsKCkpOwogIH0pOwogICQoJyNmaWx0ZXJzLXRhYmxlJykub24oJ2NsaWNrJywgJy5maWVsZCBpbnB1dFt0eXBlPWNoZWNrYm94XScsIGZ1bmN0aW9uKCkgewogICAgdG9nZ2xlRmlsdGVyKCQodGhpcykudmFsKCkpOwogIH0pOwogICQoJyNmaWx0ZXJzLXRhYmxlJykub24oJ2tleXByZXNzJywgJ2lucHV0W3R5cGU9dGV4dF0nLCBmdW5jdGlvbihlKSB7CiAgICBpZiAoZS5rZXlDb2RlID09IDEzKSAkKHRoaXMpLmNsb3Nlc3QoJ2Zvcm0nKS5zdWJtaXQoKTsKICB9KTsKfQoKZnVuY3Rpb24gYWRkRmlsdGVyKGZpZWxkLCBvcGVyYXRvciwgdmFsdWVzKSB7CiAgdmFyIGZpZWxkSWQgPSBmaWVsZC5yZXBsYWNlKCcuJywgJ18nKTsKICB2YXIgdHIgPSAkKCcjdHJfJytmaWVsZElkKTsKCiAgdmFyIGZpbHRlck9wdGlvbnMgPSBhdmFpbGFibGVGaWx0ZXJzW2ZpZWxkXTsKICBpZiAoIWZpbHRlck9wdGlvbnMpIHJldHVybjsKCiAgaWYgKGZpbHRlck9wdGlvbnNbJ3JlbW90ZSddICYmIGZpbHRlck9wdGlvbnNbJ3ZhbHVlcyddID09IG51bGwpIHsKICAgICQuZ2V0SlNPTihmaWx0ZXJzVXJsLCB7J25hbWUnOiBmaWVsZH0pLmRvbmUoZnVuY3Rpb24oZGF0YSkgewogICAgICBmaWx0ZXJPcHRpb25zWyd2YWx1ZXMnXSA9IGRhdGE7CiAgICAgIGFkZEZpbHRlcihmaWVsZCwgb3BlcmF0b3IsIHZhbHVlcykgOwogICAgfSk7CiAgICByZXR1cm47CiAgfQoKICBpZiAodHIubGVuZ3RoID4gMCkgewogICAgdHIuc2hvdygpOwogIH0gZWxzZSB7CiAgICBidWlsZEZpbHRlclJvdyhmaWVsZCwgb3BlcmF0b3IsIHZhbHVlcyk7CiAgfQogICQoJyNjYl8nK2ZpZWxkSWQpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTsKICB0b2dnbGVGaWx0ZXIoZmllbGQpOwogIHRvZ2dsZU11bHRpU2VsZWN0SWNvbkluaXQoKTsKICAkKCcjYWRkX2ZpbHRlcl9zZWxlY3QnKS52YWwoJycpLmZpbmQoJ29wdGlvbicpLmVhY2goZnVuY3Rpb24oKSB7CiAgICBpZiAoJCh0aGlzKS5hdHRyKCd2YWx1ZScpID09IGZpZWxkKSB7CiAgICAgICQodGhpcykuYXR0cignZGlzYWJsZWQnLCB0cnVlKTsKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gYnVpbGRGaWx0ZXJSb3coZmllbGQsIG9wZXJhdG9yLCB2YWx1ZXMpIHsKICB2YXIgZmllbGRJZCA9IGZpZWxkLnJlcGxhY2UoJy4nLCAnXycpOwogIHZhciBmaWx0ZXJUYWJsZSA9ICQoIiNmaWx0ZXJzLXRhYmxlIik7CiAgdmFyIGZpbHRlck9wdGlvbnMgPSBhdmFpbGFibGVGaWx0ZXJzW2ZpZWxkXTsKICBpZiAoIWZpbHRlck9wdGlvbnMpIHJldHVybjsKICB2YXIgb3BlcmF0b3JzID0gb3BlcmF0b3JCeVR5cGVbZmlsdGVyT3B0aW9uc1sndHlwZSddXTsKICB2YXIgZmlsdGVyVmFsdWVzID0gZmlsdGVyT3B0aW9uc1sndmFsdWVzJ107CiAgdmFyIHNlbGVjdDsKCiAgdmFyIHRyID0gJCgnPGRpdiBjbGFzcz0iZmlsdGVyIj4nKS5hdHRyKCdpZCcsICd0cl8nK2ZpZWxkSWQpLmh0bWwoCiAgICAnPGRpdiBjbGFzcz0iZmllbGQiPjxpbnB1dCBjaGVja2VkPSJjaGVja2VkIiBpZD0iY2JfJytmaWVsZElkKyciIG5hbWU9ImZbXSIgdmFsdWU9IicrZmllbGQrJyIgdHlwZT0iY2hlY2tib3giPjxsYWJlbCBmb3I9ImNiXycrZmllbGRJZCsnIj4gJytmaWx0ZXJPcHRpb25zWyduYW1lJ10rJzwvbGFiZWw+PC9kaXY+JyArCiAgICAnPGRpdiBjbGFzcz0ib3BlcmF0b3IiPjxzZWxlY3QgaWQ9Im9wZXJhdG9yc18nK2ZpZWxkSWQrJyIgbmFtZT0ib3BbJytmaWVsZCsnXSI+PC9zZWxlY3Q+PC9kaXY+JyArCiAgICAnPGRpdiBjbGFzcz0idmFsdWVzIj48L2Rpdj4nCiAgKTsKICBmaWx0ZXJUYWJsZS5hcHBlbmQodHIpOwoKICBzZWxlY3QgPSB0ci5maW5kKCcub3BlcmF0b3Igc2VsZWN0Jyk7CiAgb3BlcmF0b3JzLmZvckVhY2goZnVuY3Rpb24ob3ApIHsKICAgIHZhciBvcHRpb24gPSAkKCc8b3B0aW9uPicpLnZhbChvcCkudGV4dChvcGVyYXRvckxhYmVsc1tvcF0pOwogICAgaWYgKG9wID09IG9wZXJhdG9yKSB7IG9wdGlvbi5wcm9wKCdzZWxlY3RlZCcsIHRydWUpOyB9CiAgICBzZWxlY3QuYXBwZW5kKG9wdGlvbik7CiAgfSk7CiAgc2VsZWN0LmNoYW5nZShmdW5jdGlvbigpeyB0b2dnbGVPcGVyYXRvcihmaWVsZCk7IH0pOwoKICBzd2l0Y2ggKGZpbHRlck9wdGlvbnNbJ3R5cGUnXSkgewogIGNhc2UgImxpc3QiOgogIGNhc2UgImxpc3Rfd2l0aF9oaXN0b3J5IjoKICBjYXNlICJsaXN0X29wdGlvbmFsIjoKICBjYXNlICJsaXN0X29wdGlvbmFsX3dpdGhfaGlzdG9yeSI6CiAgY2FzZSAibGlzdF9zdGF0dXMiOgogIGNhc2UgImxpc3Rfc3VicHJvamVjdHMiOgogICAgY29uc3QgaWNvblR5cGUgPSB2YWx1ZXMubGVuZ3RoID4gMSA/ICd0b2dnbGUtbWludXMnIDogJ3RvZ2dsZS1wbHVzJzsKICAgIGNvbnN0IGljb25TdmcgPSBjcmVhdGVTVkdJY29uKGljb25UeXBlKQoKICAgIHRyLmZpbmQoJy52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICQoJzxzcGFuPicsIHsgc3R5bGU6ICdkaXNwbGF5Om5vbmU7JyB9KS5hcHBlbmQoCiAgICAgICAgJCgnPHNlbGVjdD4nLCB7CiAgICAgICAgICBjbGFzczogJ3ZhbHVlJywKICAgICAgICAgIGlkOiBgdmFsdWVzXyR7ZmllbGRJZH1fMWAsCiAgICAgICAgICBuYW1lOiBgdlske2ZpZWxkfV1bXWAsCiAgICAgICAgfSksCiAgICAgICAgJ1xuJywKICAgICAgICAkKCc8c3Bhbj4nLCB7IGNsYXNzOiBgdG9nZ2xlLW11bHRpc2VsZWN0IGljb24tb25seSBpY29uLSR7aWNvblR5cGV9YCB9KS5hcHBlbmQoaWNvblN2ZykKICAgICAgKQogICAgKTsKICAgIHNlbGVjdCA9IHRyLmZpbmQoJy52YWx1ZXMgc2VsZWN0Jyk7CiAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDEpIHsgc2VsZWN0LmF0dHIoJ211bHRpcGxlJywgdHJ1ZSk7IH0KICAgIGZpbHRlclZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKGZpbHRlclZhbHVlKSB7CiAgICAgIHZhciBvcHRpb24gPSAkKCc8b3B0aW9uPicpOwogICAgICBpZiAoJC5pc0FycmF5KGZpbHRlclZhbHVlKSkgewogICAgICAgIG9wdGlvbi52YWwoZmlsdGVyVmFsdWVbMV0pLnRleHQoZmlsdGVyVmFsdWVbMF0pOwogICAgICAgIGlmICgkLmluQXJyYXkoZmlsdGVyVmFsdWVbMV0sIHZhbHVlcykgPiAtMSkge29wdGlvbi5wcm9wKCdzZWxlY3RlZCcsIHRydWUpO30KICAgICAgICBpZiAoZmlsdGVyVmFsdWUubGVuZ3RoID09IDMpIHsKICAgICAgICAgIHZhciBvcHRncm91cCA9IHNlbGVjdC5maW5kKCdvcHRncm91cCcpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiAkKHRoaXMpLmF0dHIoJ2xhYmVsJykgPT0gZmlsdGVyVmFsdWVbMl19KTsKICAgICAgICAgIGlmICghb3B0Z3JvdXAubGVuZ3RoKSB7b3B0Z3JvdXAgPSAkKCc8b3B0Z3JvdXA+JykuYXR0cignbGFiZWwnLCBmaWx0ZXJWYWx1ZVsyXSk7fQogICAgICAgICAgb3B0aW9uID0gb3B0Z3JvdXAuYXBwZW5kKG9wdGlvbik7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIG9wdGlvbi52YWwoZmlsdGVyVmFsdWUpLnRleHQoZmlsdGVyVmFsdWUpOwogICAgICAgIGlmICgkLmluQXJyYXkoZmlsdGVyVmFsdWUsIHZhbHVlcykgPiAtMSkge29wdGlvbi5wcm9wKCdzZWxlY3RlZCcsIHRydWUpO30KICAgICAgfQogICAgICBzZWxlY3QuYXBwZW5kKG9wdGlvbik7CiAgICB9KTsKICAgIGJyZWFrOwogIGNhc2UgImRhdGUiOgogIGNhc2UgImRhdGVfcGFzdCI6CiAgICB0ci5maW5kKCcudmFsdWVzJykuYXBwZW5kKAogICAgICAnPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZTsiPjxpbnB1dCB0eXBlPSJkYXRlIiBuYW1lPSJ2WycrZmllbGQrJ11bXSIgaWQ9InZhbHVlc18nK2ZpZWxkSWQrJ18xIiBzaXplPSIxMCIgY2xhc3M9InZhbHVlIGRhdGVfdmFsdWUiIC8+PC9zcGFuPicgKwogICAgICAnIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW5wdXQgdHlwZT0iZGF0ZSIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKydfMiIgc2l6ZT0iMTAiIGNsYXNzPSJ2YWx1ZSBkYXRlX3ZhbHVlIiAvPjwvc3Bhbj4nICsKICAgICAgJyA8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnIiBzaXplPSIzIiBjbGFzcz0idmFsdWUiIC8+ICcrbGFiZWxEYXlQbHVyYWwrJzwvc3Bhbj4nCiAgICApOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQrJ18xJykudmFsKHZhbHVlc1swXSkuZGF0ZXBpY2tlckZhbGxiYWNrKGRhdGVwaWNrZXJPcHRpb25zKTsKICAgICQoJyN2YWx1ZXNfJytmaWVsZElkKydfMicpLnZhbCh2YWx1ZXNbMV0pLmRhdGVwaWNrZXJGYWxsYmFjayhkYXRlcGlja2VyT3B0aW9ucyk7CiAgICAkKCcjdmFsdWVzXycrZmllbGRJZCkudmFsKHZhbHVlc1swXSk7CiAgICBicmVhazsKICBjYXNlICJzdHJpbmciOgogIGNhc2UgInRleHQiOgogIGNhc2UgInNlYXJjaCI6CiAgICB0ci5maW5kKCcudmFsdWVzJykuYXBwZW5kKAogICAgICAnPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZTsiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ2WycrZmllbGQrJ11bXSIgaWQ9InZhbHVlc18nK2ZpZWxkSWQrJyIgc2l6ZT0iMzAiIGNsYXNzPSJ2YWx1ZSIgLz48L3NwYW4+JwogICAgKTsKICAgICQoJyN2YWx1ZXNfJytmaWVsZElkKS52YWwodmFsdWVzWzBdKTsKICAgIGJyZWFrOwogIGNhc2UgInJlbGF0aW9uIjoKICAgIHRyLmZpbmQoJy52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnIiBzaXplPSI2IiBjbGFzcz0idmFsdWUiIC8+PC9zcGFuPicgKwogICAgICAnPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZTsiPjxzZWxlY3QgY2xhc3M9InZhbHVlIiBuYW1lPSJ2WycrZmllbGQrJ11bXSIgaWQ9InZhbHVlc18nK2ZpZWxkSWQrJ18xIj48L3NlbGVjdD48L3NwYW4+JwogICAgKTsKICAgICQoJyN2YWx1ZXNfJytmaWVsZElkKS52YWwodmFsdWVzWzBdKTsKICAgIHNlbGVjdCA9IHRyLmZpbmQoJy52YWx1ZXMgc2VsZWN0Jyk7CiAgICBmaWx0ZXJWYWx1ZXMuZm9yRWFjaChmdW5jdGlvbihmaWx0ZXJWYWx1ZSkgewogICAgICB2YXIgb3B0aW9uID0gJCgnPG9wdGlvbj4nKTsKICAgICAgb3B0aW9uLnZhbChmaWx0ZXJWYWx1ZVsxXSkudGV4dChmaWx0ZXJWYWx1ZVswXSk7CiAgICAgIGlmICh2YWx1ZXNbMF0gPT0gZmlsdGVyVmFsdWVbMV0pIHsgb3B0aW9uLnByb3AoJ3NlbGVjdGVkJywgdHJ1ZSk7IH0KICAgICAgc2VsZWN0LmFwcGVuZChvcHRpb24pOwogICAgfSk7CiAgICBicmVhazsKICBjYXNlICJpbnRlZ2VyIjoKICBjYXNlICJmbG9hdCI6CiAgY2FzZSAidHJlZSI6CiAgICB0ci5maW5kKCcudmFsdWVzJykuYXBwZW5kKAogICAgICAnPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZTsiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ2WycrZmllbGQrJ11bXSIgaWQ9InZhbHVlc18nK2ZpZWxkSWQrJ18xIiBzaXplPSIxNCIgY2xhc3M9InZhbHVlIiAvPjwvc3Bhbj4nICsKICAgICAgJyA8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnXzIiIHNpemU9IjE0IiBjbGFzcz0idmFsdWUiIC8+PC9zcGFuPicKICAgICk7CiAgICAkKCcjdmFsdWVzXycrZmllbGRJZCsnXzEnKS52YWwodmFsdWVzWzBdKTsKICAgICQoJyN2YWx1ZXNfJytmaWVsZElkKydfMicpLnZhbCh2YWx1ZXNbMV0pOwogICAgYnJlYWs7CiAgfQp9CgpmdW5jdGlvbiB0b2dnbGVGaWx0ZXIoZmllbGQpIHsKICB2YXIgZmllbGRJZCA9IGZpZWxkLnJlcGxhY2UoJy4nLCAnXycpOwogIGlmICgkKCcjY2JfJyArIGZpZWxkSWQpLmlzKCc6Y2hlY2tlZCcpKSB7CiAgICAkKCIjb3BlcmF0b3JzXyIgKyBmaWVsZElkKS5zaG93KCkucmVtb3ZlQXR0cignZGlzYWJsZWQnKTsKICAgIHRvZ2dsZU9wZXJhdG9yKGZpZWxkKTsKICB9IGVsc2UgewogICAgJCgiI29wZXJhdG9yc18iICsgZmllbGRJZCkuaGlkZSgpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICBlbmFibGVWYWx1ZXMoZmllbGQsIFtdKTsKICB9Cn0KCmZ1bmN0aW9uIGVuYWJsZVZhbHVlcyhmaWVsZCwgaW5kZXhlcykgewogIHZhciBmaWVsZElkID0gZmllbGQucmVwbGFjZSgnLicsICdfJyk7CiAgJCgnI3RyXycrZmllbGRJZCsnIC52YWx1ZXMgLnZhbHVlJykuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgaWYgKCQuaW5BcnJheShpbmRleCwgaW5kZXhlcykgPj0gMCkgewogICAgICAkKHRoaXMpLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7CiAgICAgICQodGhpcykucGFyZW50cygnc3BhbicpLmZpcnN0KCkuc2hvdygpOwogICAgfSBlbHNlIHsKICAgICAgJCh0aGlzKS52YWwoJycpOwogICAgICAkKHRoaXMpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICQodGhpcykucGFyZW50cygnc3BhbicpLmZpcnN0KCkuaGlkZSgpOwogICAgfQoKICAgIGlmICgkKHRoaXMpLmhhc0NsYXNzKCdncm91cCcpKSB7CiAgICAgICQodGhpcykuYWRkQ2xhc3MoJ29wZW4nKTsKICAgIH0gZWxzZSB7CiAgICAgICQodGhpcykuc2hvdygpOwogICAgfQogIH0pOwp9CgpmdW5jdGlvbiB0b2dnbGVPcGVyYXRvcihmaWVsZCkgewogIHZhciBmaWVsZElkID0gZmllbGQucmVwbGFjZSgnLicsICdfJyk7CiAgdmFyIG9wZXJhdG9yID0gJCgiI29wZXJhdG9yc18iICsgZmllbGRJZCk7CiAgc3dpdGNoIChvcGVyYXRvci52YWwoKSkgewogICAgY2FzZSAiISoiOgogICAgY2FzZSAiKiI6CiAgICBjYXNlICJuZCI6CiAgICBjYXNlICJ0IjoKICAgIGNhc2UgImxkIjoKICAgIGNhc2UgIm53IjoKICAgIGNhc2UgInciOgogICAgY2FzZSAibHciOgogICAgY2FzZSAibDJ3IjoKICAgIGNhc2UgIm5tIjoKICAgIGNhc2UgIm0iOgogICAgY2FzZSAibG0iOgogICAgY2FzZSAieSI6CiAgICBjYXNlICJvIjoKICAgIGNhc2UgImMiOgogICAgY2FzZSAiKm8iOgogICAgY2FzZSAiIW8iOgogICAgICBlbmFibGVWYWx1ZXMoZmllbGQsIFtdKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICI+PCI6CiAgICAgIGVuYWJsZVZhbHVlcyhmaWVsZCwgWzAsMV0pOwogICAgICBicmVhazsKICAgIGNhc2UgIjx0KyI6CiAgICBjYXNlICI+dCsiOgogICAgY2FzZSAiPjx0KyI6CiAgICBjYXNlICJ0KyI6CiAgICBjYXNlICI+dC0iOgogICAgY2FzZSAiPHQtIjoKICAgIGNhc2UgIj48dC0iOgogICAgY2FzZSAidC0iOgogICAgICBlbmFibGVWYWx1ZXMoZmllbGQsIFsyXSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAiPXAiOgogICAgY2FzZSAiPSFwIjoKICAgIGNhc2UgIiFwIjoKICAgICAgZW5hYmxlVmFsdWVzKGZpZWxkLCBbMV0pOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIGVuYWJsZVZhbHVlcyhmaWVsZCwgWzBdKTsKICAgICAgYnJlYWs7CiAgfQp9CgpmdW5jdGlvbiB0b2dnbGVNdWx0aVNlbGVjdChlbCkgewogIHZhciBpc1dvcmtmbG93ID0gZWwuY2xvc2VzdCgnLmNvbnRyb2xsZXItd29ya2Zsb3dzJyk7CiAgaWYgKGVsLmF0dHIoJ211bHRpcGxlJykpIHsKICAgIGVsLnJlbW92ZUF0dHIoJ211bHRpcGxlJyk7CiAgICBpZiAoaXNXb3JrZmxvdykgeyBlbC5maW5kKCJvcHRpb25bdmFsdWU9YWxsXSIpLnNob3coKTsgfQogICAgZWwuYXR0cignc2l6ZScsIDEpOwogIH0gZWxzZSB7CiAgICBlbC5hdHRyKCdtdWx0aXBsZScsIHRydWUpOwogICAgaWYgKGlzV29ya2Zsb3cpIHsgZWwuZmluZCgib3B0aW9uW3ZhbHVlPWFsbF0iKS5hdHRyKCJzZWxlY3RlZCIsIGZhbHNlKS5oaWRlKCk7IH0KICAgIGlmIChlbC5jaGlsZHJlbigpLmxlbmd0aCA+IDEwKQogICAgICBlbC5hdHRyKCdzaXplJywgMTApOwogICAgZWxzZQogICAgICBlbC5hdHRyKCdzaXplJywgNCk7CiAgfQp9CgpmdW5jdGlvbiBzaG93VGFiKG5hbWUsIHVybCkgewogICQoJyN0YWItY29udGVudC0nICsgbmFtZSkucGFyZW50KCkuZmluZCgnLnRhYi1jb250ZW50JykuaGlkZSgpOwogICQoJyN0YWItY29udGVudC0nICsgbmFtZSkuc2hvdygpOwogICQoJyN0YWItJyArIG5hbWUpLmNsb3Nlc3QoJy50YWJzJykuZmluZCgnYScpLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpOwogICQoJyN0YWItJyArIG5hbWUpLmFkZENsYXNzKCdzZWxlY3RlZCcpOwoKICByZXBsYWNlSW5IaXN0b3J5KHVybCkKCiAgcmV0dXJuIGZhbHNlOwp9CgpmdW5jdGlvbiBzaG93SXNzdWVIaXN0b3J5KGpvdXJuYWwsIHVybCkgewogIHRhYl9jb250ZW50ID0gJCgnI3RhYi1jb250ZW50LWhpc3RvcnknKTsKICB0YWJfY29udGVudC5wYXJlbnQoKS5maW5kKCcudGFiLWNvbnRlbnQnKS5oaWRlKCk7CiAgdGFiX2NvbnRlbnQuc2hvdygpOwogIHRhYl9jb250ZW50LnBhcmVudCgpLmNoaWxkcmVuKCdkaXYudGFicycpLmZpbmQoJ2EnKS5yZW1vdmVDbGFzcygnc2VsZWN0ZWQnKTsKCiAgJCgnI3RhYi0nICsgam91cm5hbCkuYWRkQ2xhc3MoJ3NlbGVjdGVkJyk7CgogIHJlcGxhY2VJbkhpc3RvcnkodXJsKQoKICBzd2l0Y2goam91cm5hbCkgewogICAgY2FzZSAnbm90ZXMnOgogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCcpLnNob3coKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWw6bm90KC5oYXMtbm90ZXMpJykuaGlkZSgpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAud2lraScpLnNob3coKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwgLmpvdXJuYWwtYWN0aW9ucyA+IConKS5zaG93KCk7CgogICAgICAvLyBhbHdheXMgc2hvdyB0aHVtYm5haWxzIGluIG5vdGVzIHRhYgogICAgICB2YXIgdGh1bWJuYWlscyA9IHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC50aHVtYm5haWxzJyk7CiAgICAgIHRodW1ibmFpbHMuc2hvdygpOwogICAgICAvLyBzaG93IGpvdXJuYWxzIHdpdGhvdXQgbm90ZXMsIGJ1dCB3aXRoIHRodW1ibmFpbHMKICAgICAgdGh1bWJuYWlscy5wYXJlbnRzKCcuam91cm5hbCcpLnNob3coKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICdwcm9wZXJ0aWVzJzoKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwnKS5zaG93KCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsOm5vdCguaGFzLWRldGFpbHMpJykuaGlkZSgpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAud2lraScpLmhpZGUoKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwgLnRodW1ibmFpbHMnKS5oaWRlKCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC5qb3VybmFsLWFjdGlvbnMgPiAqJykuaGlkZSgpOwogICAgICAvLyBTaG93IHJlYWN0aW9uIGJ1dHRvbiBpbiBwcm9wZXJ0aWVzIHRhYgogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAuam91cm5hbC1hY3Rpb25zIC5yZWFjdGlvbi1idXR0b24td3JhcHBlcicpLnNob3coKTsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCcpLnNob3coKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwgLndpa2knKS5zaG93KCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC50aHVtYm5haWxzJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAuam91cm5hbC1hY3Rpb25zID4gKicpLnNob3coKTsKICB9CgogIHJldHVybiBmYWxzZTsKfQoKZnVuY3Rpb24gZ2V0UmVtb3RlVGFiKG5hbWUsIHJlbW90ZV91cmwsIHVybCwgbG9hZF9hbHdheXMpIHsKICBsb2FkX2Fsd2F5cyA9IGxvYWRfYWx3YXlzIHx8IGZhbHNlOwogIHZhciB0YWJfY29udGVudCA9ICQoJyN0YWItY29udGVudC0nICsgbmFtZSk7CgogIHRhYl9jb250ZW50LnBhcmVudCgpLmZpbmQoJy50YWItY29udGVudCcpLmhpZGUoKTsKICB0YWJfY29udGVudC5wYXJlbnQoKS5jaGlsZHJlbignZGl2LnRhYnMnKS5maW5kKCdhJykucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkJyk7CiAgJCgnI3RhYi0nICsgbmFtZSkuYWRkQ2xhc3MoJ3NlbGVjdGVkJyk7CgogIHJlcGxhY2VJbkhpc3RvcnkodXJsKTsKCiAgaWYgKHRhYl9jb250ZW50LmNoaWxkcmVuKCkubGVuZ3RoID09IDAgJiYgbG9hZF9hbHdheXMgPT0gZmFsc2UpIHsKICAgICQuYWpheCh7CiAgICAgIHVybDogcmVtb3RlX3VybCwKICAgICAgdHlwZTogJ2dldCcsCiAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpewogICAgICAgIHRhYl9jb250ZW50Lmh0bWwoZGF0YSkKICAgICAgfQogICAgfSk7CiAgfQoKICB0YWJfY29udGVudC5zaG93KCk7CiAgcmV0dXJuIGZhbHNlOwp9CgovL3JlcGxhY2VzIGN1cnJlbnQgVVJMIHdpdGggdGhlICJocmVmIiBhdHRyaWJ1dGUgb2YgdGhlIGN1cnJlbnQgbGluawovLyhvbmx5IHRyaWdnZXJlZCBpZiBzdXBwb3J0ZWQgYnkgYnJvd3NlcikKZnVuY3Rpb24gcmVwbGFjZUluSGlzdG9yeSh1cmwpIHsKICBpZiAoInJlcGxhY2VTdGF0ZSIgaW4gd2luZG93Lmhpc3RvcnkgJiYgdXJsICE9PSB1bmRlZmluZWQpIHsKICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCBkb2N1bWVudC50aXRsZSwgdXJsKTsKICB9Cn0KCmZ1bmN0aW9uIG1vdmVUYWJSaWdodChlbCkgewogIHZhciBsaXMgPSAkKGVsKS5wYXJlbnRzKCdkaXYudGFicycpLmZpcnN0KCkuZmluZCgndWwnKS5jaGlsZHJlbigpOwogIHZhciBidyA9ICQoZWwpLnBhcmVudHMoJ2Rpdi50YWJzLWJ1dHRvbnMnKS5vdXRlcldpZHRoKHRydWUpOwogIHZhciB0YWJzV2lkdGggPSAwOwogIHZhciBpID0gMDsKICBsaXMuZWFjaChmdW5jdGlvbigpIHsKICAgIGlmICgkKHRoaXMpLmlzKCc6dmlzaWJsZScpKSB7CiAgICAgIHRhYnNXaWR0aCArPSAkKHRoaXMpLm91dGVyV2lkdGgodHJ1ZSk7CiAgICB9CiAgfSk7CiAgaWYgKHRhYnNXaWR0aCA8ICQoZWwpLnBhcmVudHMoJ2Rpdi50YWJzJykuZmlyc3QoKS53aWR0aCgpIC0gYncpIHsgcmV0dXJuOyB9CiAgJChlbCkuc2libGluZ3MoJy50YWItbGVmdCcpLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOwogIHdoaWxlIChpPGxpcy5sZW5ndGggJiYgIWxpcy5lcShpKS5pcygnOnZpc2libGUnKSkgeyBpKys7IH0KICB2YXIgdyA9IGxpcy5lcShpKS53aWR0aCgpOwogIGxpcy5lcShpKS5oaWRlKCk7CiAgaWYgKHRhYnNXaWR0aCAtIHcgPCAkKGVsKS5wYXJlbnRzKCdkaXYudGFicycpLmZpcnN0KCkud2lkdGgoKSAtIGJ3KSB7CiAgICAkKGVsKS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKICB9Cn0KCmZ1bmN0aW9uIG1vdmVUYWJMZWZ0KGVsKSB7CiAgdmFyIGxpcyA9ICQoZWwpLnBhcmVudHMoJ2Rpdi50YWJzJykuZmlyc3QoKS5maW5kKCd1bCcpLmNoaWxkcmVuKCk7CiAgdmFyIGkgPSAwOwogIHdoaWxlIChpIDwgbGlzLmxlbmd0aCAmJiAhbGlzLmVxKGkpLmlzKCc6dmlzaWJsZScpKSB7IGkrKzsgfQogIGlmIChpID4gMCkgewogICAgbGlzLmVxKGktMSkuc2hvdygpOwogICAgJChlbCkuc2libGluZ3MoJy50YWItcmlnaHQnKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICB9CiAgaWYgKGkgPD0gMSkgewogICAgJChlbCkuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7CiAgfQp9CgpmdW5jdGlvbiBkaXNwbGF5VGFic0J1dHRvbnMoKSB7CiAgdmFyIGxpczsKICB2YXIgdGFic1dpZHRoOwogIHZhciBlbDsKICB2YXIgbnVtSGlkZGVuOwogICQoJ2Rpdi50YWJzJykuZWFjaChmdW5jdGlvbigpIHsKICAgIGVsID0gJCh0aGlzKTsKICAgIGxpcyA9IGVsLmZpbmQoJ3VsJykuY2hpbGRyZW4oKTsKICAgIHRhYnNXaWR0aCA9IDA7CiAgICBudW1IaWRkZW4gPSAwOwogICAgbGlzLmVhY2goZnVuY3Rpb24oKXsKICAgICAgaWYgKCQodGhpcykuaXMoJzp2aXNpYmxlJykpIHsKICAgICAgICB0YWJzV2lkdGggKz0gJCh0aGlzKS5vdXRlcldpZHRoKHRydWUpOwogICAgICB9IGVsc2UgewogICAgICAgIG51bUhpZGRlbisrOwogICAgICB9CiAgICB9KTsKICAgIHZhciBidyA9ICQoZWwpLmZpbmQoJ2Rpdi50YWJzLWJ1dHRvbnMnKS5vdXRlcldpZHRoKHRydWUpOwogICAgaWYgKCh0YWJzV2lkdGggPCBlbC53aWR0aCgpIC0gYncpICYmIChsaXMubGVuZ3RoID09PSAwIHx8IGxpcy5maXJzdCgpLmlzKCc6dmlzaWJsZScpKSkgewogICAgICBlbC5maW5kKCdkaXYudGFicy1idXR0b25zJykuaGlkZSgpOwogICAgfSBlbHNlIHsKICAgICAgZWwuZmluZCgnZGl2LnRhYnMtYnV0dG9ucycpLnNob3coKS5jaGlsZHJlbignYnV0dG9uLnRhYi1sZWZ0JykudG9nZ2xlQ2xhc3MoJ2Rpc2FibGVkJywgbnVtSGlkZGVuID09IDApOwogICAgfQogIH0pOwp9CgpmdW5jdGlvbiBzZXRQcmVkZWNlc3NvckZpZWxkc1Zpc2liaWxpdHkoKSB7CiAgdmFyIHJlbGF0aW9uVHlwZSA9ICQoJyNyZWxhdGlvbl9yZWxhdGlvbl90eXBlJyk7CiAgaWYgKHJlbGF0aW9uVHlwZS52YWwoKSA9PSAicHJlY2VkZXMiIHx8IHJlbGF0aW9uVHlwZS52YWwoKSA9PSAiZm9sbG93cyIpIHsKICAgICQoJyNwcmVkZWNlc3Nvcl9maWVsZHMnKS5zaG93KCk7CiAgfSBlbHNlIHsKICAgICQoJyNwcmVkZWNlc3Nvcl9maWVsZHMnKS5oaWRlKCk7CiAgfQp9CgpmdW5jdGlvbiBzaG93TW9kYWwoaWQsIHdpZHRoLCB0aXRsZSkgewogIHZhciBlbCA9ICQoJyMnK2lkKS5maXJzdCgpOwogIGlmIChlbC5sZW5ndGggPT09IDAgfHwgZWwuaXMoJzp2aXNpYmxlJykpIHtyZXR1cm47fQogIGlmICghdGl0bGUpIHRpdGxlID0gZWwuZmluZCgnaDMudGl0bGUnKS50ZXh0KCk7CiAgLy8gbW92ZXMgZXhpc3RpbmcgbW9kYWxzIGJlaGluZCB0aGUgdHJhbnNwYXJlbnQgYmFja2dyb3VuZAogICQoIi5tb2RhbCIpLmNzcygnekluZGV4Jyw5OSk7CiAgZWwuZGlhbG9nKHsKICAgIHdpZHRoOiB3aWR0aCwKICAgIG1vZGFsOiB0cnVlLAogICAgcmVzaXphYmxlOiBmYWxzZSwKICAgIGRpYWxvZ0NsYXNzOiAnbW9kYWwnLAogICAgdGl0bGU6IHRpdGxlCiAgfSkub24oJ2RpYWxvZ2Nsb3NlJywgZnVuY3Rpb24oKXsKICAgICQoIi5tb2RhbCIpLmNzcygnekluZGV4JywxMDEpOwogIH0pOwogIGVsLmZpbmQoImlucHV0W3R5cGU9dGV4dF0sIGlucHV0W3R5cGU9c3VibWl0XSIpLmZpcnN0KCkuZm9jdXMoKTsKfQoKZnVuY3Rpb24gaGlkZU1vZGFsKGVsKSB7CiAgdmFyIG1vZGFsOwogIGlmIChlbCkgewogICAgbW9kYWwgPSAkKGVsKS5wYXJlbnRzKCcudWktZGlhbG9nLWNvbnRlbnQnKTsKICB9IGVsc2UgewogICAgbW9kYWwgPSAkKCcjYWpheC1tb2RhbCcpOwogIH0KICBtb2RhbC5kaWFsb2coImNsb3NlIik7Cn0KCmZ1bmN0aW9uIGNvbGxhcHNlU2NtRW50cnkoaWQpIHsKICAkKCcuJytpZCkuZWFjaChmdW5jdGlvbigpIHsKICAgIGlmICgkKHRoaXMpLmhhc0NsYXNzKCdvcGVuJykpIHsKICAgICAgY29sbGFwc2VTY21FbnRyeSgkKHRoaXMpLmF0dHIoJ2lkJykpOwogICAgfQogICAgJCh0aGlzKS5oaWRlKCk7CiAgfSk7CiAgJCgnIycraWQpLnJlbW92ZUNsYXNzKCdvcGVuJyk7Cn0KCmZ1bmN0aW9uIGV4cGFuZFNjbUVudHJ5KGlkKSB7CiAgJCgnLicraWQpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAkKHRoaXMpLnNob3coKTsKICAgIGlmICgkKHRoaXMpLmhhc0NsYXNzKCdsb2FkZWQnKSAmJiAhJCh0aGlzKS5oYXNDbGFzcygnY29sbGFwc2VkJykpIHsKICAgICAgZXhwYW5kU2NtRW50cnkoJCh0aGlzKS5hdHRyKCdpZCcpKTsKICAgIH0KICB9KTsKICAkKCcjJytpZCkuYWRkQ2xhc3MoJ29wZW4nKTsKfQoKZnVuY3Rpb24gc2NtRW50cnlDbGljayhpZCwgdXJsKSB7CiAgICB2YXIgZWwgPSAkKCcjJytpZCk7CiAgICB2YXIgZXhwYW5kZXIgPSBlbC5maW5kKCcuZXhwYW5kZXInKTsKICAgIHZhciBmb2xkZXIgPSBlbC5maW5kKCcuaWNvbi1mb2xkZXInKTsKCiAgICBpZiAoZWwuaGFzQ2xhc3MoJ29wZW4nKSkgewogICAgICAgIGNvbGxhcHNlU2NtRW50cnkoaWQpOwogICAgICAgIGVsLmZpbmQoJy5leHBhbmRlcicpLnN3aXRjaENsYXNzKCdpY29uLWV4cGFuZGVkJywgJ2ljb24tY29sbGFwc2VkJyk7CiAgICAgICAgZWwuYWRkQ2xhc3MoJ2NvbGxhcHNlZCcpOwogICAgICAgIHVwZGF0ZVNWR0ljb24oZm9sZGVyWzBdLCAnZm9sZGVyJykKICAgICAgICB0b2dnbGVFeHBlbmRDb2xsYXBzZUljb24oZXhwYW5kZXJbMF0pOwoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9IGVsc2UgaWYgKGVsLmhhc0NsYXNzKCdsb2FkZWQnKSkgewogICAgICAgIGV4cGFuZFNjbUVudHJ5KGlkKTsKICAgICAgICBlbC5maW5kKCcuZXhwYW5kZXInKS5zd2l0Y2hDbGFzcygnaWNvbi1jb2xsYXBzZWQnLCAnaWNvbi1leHBhbmRlZCcpOwogICAgICAgIGVsLnJlbW92ZUNsYXNzKCdjb2xsYXBzZWQnKTsKICAgICAgICB1cGRhdGVTVkdJY29uKGZvbGRlclswXSwgJ2ZvbGRlci1vcGVuJykKICAgICAgICB0b2dnbGVFeHBlbmRDb2xsYXBzZUljb24oZXhwYW5kZXJbMF0pOwoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAoZWwuaGFzQ2xhc3MoJ2xvYWRpbmcnKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGVsLmFkZENsYXNzKCdsb2FkaW5nJyk7CiAgICAkLmFqYXgoewogICAgICB1cmw6IHVybCwKICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSkgewogICAgICAgIGVsLmFmdGVyKGRhdGEpOwogICAgICAgIGVsLmFkZENsYXNzKCdvcGVuJykuYWRkQ2xhc3MoJ2xvYWRlZCcpLnJlbW92ZUNsYXNzKCdsb2FkaW5nJyk7CiAgICAgICAgZWwuZmluZCgnLmV4cGFuZGVyJykuc3dpdGNoQ2xhc3MoJ2ljb24tY29sbGFwc2VkJywgJ2ljb24tZXhwYW5kZWQnKTsKICAgICAgICB1cGRhdGVTVkdJY29uKGZvbGRlclswXSwgJ2ZvbGRlci1vcGVuJykKICAgICAgICB0b2dnbGVFeHBlbmRDb2xsYXBzZUljb24oZXhwYW5kZXJbMF0pOwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiB0cnVlOwp9CgpmdW5jdGlvbiByYW5kb21LZXkoc2l6ZSkgewogIHZhciBjaGFycyA9ICcwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eic7CiAgdmFyIGtleSA9ICcnOwogIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICBrZXkgKz0gY2hhcnMuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoYXJzLmxlbmd0aCkpOwogIH0KICByZXR1cm4ga2V5Owp9CgpmdW5jdGlvbiBjb3B5VG9DbGlwYm9hcmQodGV4dCkgewogIGlmIChuYXZpZ2F0b3IuY2xpcGJvYXJkKSB7CiAgICByZXR1cm4gbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGV4dCkuY2F0Y2goKCkgPT4gewogICAgICByZXR1cm4gZmFsbGJhY2tDbGlwYm9hcmRDb3B5KHRleHQpOwogICAgfSk7CiAgfSBlbHNlIHsKICAgIHJldHVybiBmYWxsYmFja0NsaXBib2FyZENvcHkodGV4dCk7CiAgfQp9CgpmdW5jdGlvbiBmYWxsYmFja0NsaXBib2FyZENvcHkodGV4dCkgewogIGNvbnN0IHRlbXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpOwogIHRlbXAudmFsdWUgPSB0ZXh0OwogIHRlbXAuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnOwogIHRlbXAuc3R5bGUubGVmdCA9ICctOTk5OXB4JzsKICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRlbXApOwogIHRlbXAuc2VsZWN0KCk7CiAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTsKICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRlbXApOwogIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsKfQoKZnVuY3Rpb24gY29weURhdGFDbGlwYm9hcmRUZXh0VG9DbGlwYm9hcmQodGFyZ2V0KSB7CiAgY29weVRvQ2xpcGJvYXJkKHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY2xpcGJvYXJkLXRleHQnKSk7CgogIGlmICgkKHRhcmdldCkuY2xvc2VzdCgnLmRyZG4uZXhwYW5kZWQnKS5sZW5ndGgpIHsKICAgICQodGFyZ2V0KS5jbG9zZXN0KCcuZHJkbi5leHBhbmRlZCcpLnJlbW92ZUNsYXNzKCJleHBhbmRlZCIpOwogIH0KICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIHNldHVwQ29weUJ1dHRvbnNUb1ByZUVsZW1lbnRzKCkgewogIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy53aWtpIHByZTpub3QoLnByZS13cmFwcGVyIHByZSknKS5mb3JFYWNoKChwcmUpID0+IHsKICAgIC8vIFdyYXAgdGhlIDxwcmU+IGVsZW1lbnQgd2l0aCBhIGNvbnRhaW5lciBhbmQgYWRkIGEgY29weSBidXR0b24KICAgIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgIHdyYXBwZXIuY2xhc3NMaXN0LmFkZCgicHJlLXdyYXBwZXIiKTsKCiAgICBjb25zdCBjb3B5QnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwogICAgY29weUJ1dHRvbi50aXRsZSA9IHJtLkkxOG4uYnV0dG9uQ29weTsKICAgIGNvcHlCdXR0b24uY2xhc3NMaXN0LmFkZCgiY29weS1wcmUtY29udGVudC1saW5rIiwgImljb24tb25seSIpOwogICAgY29weUJ1dHRvbi5hcHBlbmQoY3JlYXRlU1ZHSWNvbigiY29weS1wcmUtY29udGVudCIpKTsKCiAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGNvcHlCdXR0b24pOwogICAgd3JhcHBlci5hcHBlbmQocHJlLmNsb25lTm9kZSh0cnVlKSk7CiAgICBwcmUucmVwbGFjZVdpdGgod3JhcHBlcik7CgogICAgLy8gQ29weSB0aGUgY29udGVudHMgb2YgdGhlIHByZSB0YWcgd2hlbiBjb3B5QnV0dG9uIGlzIGNsaWNrZWQKICAgIGNvcHlCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoZXZlbnQpID0+IHsKICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgbGV0IHRleHRUb0NvcHkgPSAocHJlLnF1ZXJ5U2VsZWN0b3IoImNvZGUiKSB8fCBwcmUpLnRleHRDb250ZW50LnJlcGxhY2UoL1xuJC8sICcnKTsKICAgICAgaWYgKHByZS5xdWVyeVNlbGVjdG9yKCJjb2RlLnN5bnRheGhsIikpIHsgdGV4dFRvQ29weSA9IHRleHRUb0NvcHkucmVwbGFjZSgvICQvLCAnJyk7IH0gLy8gV29ya2Fyb3VuZCBmb3IgaGFsZi13aWR0aCBzcGFjZSBpc3N1ZSBpbiBUZXh0aWxlJ3MgaGlnaGxpZ2h0ZWQgY29kZQogICAgICBjb3B5VG9DbGlwYm9hcmQodGV4dFRvQ29weSkudGhlbigoKSA9PiB7CiAgICAgICAgdXBkYXRlU1ZHSWNvbihjb3B5QnV0dG9uLCAiY2hlY2tlZCIpOwogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdXBkYXRlU1ZHSWNvbihjb3B5QnV0dG9uLCAiY29weS1wcmUtY29udGVudCIpLCAyMDAwKTsKICAgICAgfSk7CiAgICB9KTsKICB9KTsKfQoKZnVuY3Rpb24gdXBkYXRlSXNzdWVGcm9tKHVybCwgZWwpIHsKICAkKCcjYWxsX2F0dHJpYnV0ZXMgaW5wdXQsICNhbGxfYXR0cmlidXRlcyB0ZXh0YXJlYSwgI2FsbF9hdHRyaWJ1dGVzIHNlbGVjdCcpLmVhY2goZnVuY3Rpb24oKXsKICAgICQodGhpcykuZGF0YSgndmFsdWViZWZvcmV1cGRhdGUnLCAkKHRoaXMpLnZhbCgpKTsKICB9KTsKICBpZiAoZWwpIHsKICAgICQoIiNmb3JtX3VwZGF0ZV90cmlnZ2VyZWRfYnkiKS52YWwoJChlbCkuYXR0cignaWQnKSk7CiAgfQogIHJldHVybiAkLmFqYXgoewogICAgdXJsOiB1cmwsCiAgICB0eXBlOiAncG9zdCcsCiAgICBkYXRhOiAkKCcjaXNzdWUtZm9ybScpLnNlcmlhbGl6ZSgpCiAgfSk7Cn0KCmZ1bmN0aW9uIHJlcGxhY2VJc3N1ZUZvcm1XaXRoKGh0bWwpewogIHZhciByZXBsYWNlbWVudCA9ICQoaHRtbCk7CiAgJCgnI2FsbF9hdHRyaWJ1dGVzIGlucHV0LCAjYWxsX2F0dHJpYnV0ZXMgdGV4dGFyZWEsICNhbGxfYXR0cmlidXRlcyBzZWxlY3QnKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICB2YXIgb2JqZWN0X2lkID0gJCh0aGlzKS5hdHRyKCdpZCcpOwogICAgaWYgKG9iamVjdF9pZCAmJiAkKHRoaXMpLmRhdGEoJ3ZhbHVlYmVmb3JldXBkYXRlJykhPSQodGhpcykudmFsKCkpIHsKICAgICAgcmVwbGFjZW1lbnQuZmluZCgnIycrb2JqZWN0X2lkKS52YWwoJCh0aGlzKS52YWwoKSk7CiAgICB9CiAgfSk7CiAgJCgnI2FsbF9hdHRyaWJ1dGVzJykuZW1wdHkoKTsKICAkKCcjYWxsX2F0dHJpYnV0ZXMnKS5wcmVwZW5kKHJlcGxhY2VtZW50KTsKfQoKZnVuY3Rpb24gdXBkYXRlQnVsa0VkaXRGcm9tKHVybCkgewogICQuYWpheCh7CiAgICB1cmw6IHVybCwKICAgIHR5cGU6ICdwb3N0JywKICAgIGRhdGE6ICQoJyNidWxrX2VkaXRfZm9ybScpLnNlcmlhbGl6ZSgpCiAgfSk7Cn0KCmZ1bmN0aW9uIG9ic2VydmVBdXRvY29tcGxldGVGaWVsZChmaWVsZElkLCB1cmwsIG9wdGlvbnMpIHsKICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKICAgICQoJyMnK2ZpZWxkSWQpLmF1dG9jb21wbGV0ZSgkLmV4dGVuZCh7CiAgICAgIHNvdXJjZTogdXJsLAogICAgICBtaW5MZW5ndGg6IDIsCiAgICAgIHBvc2l0aW9uOiB7Y29sbGlzaW9uOiAiZmxpcGZpdCJ9LAogICAgICBzZWFyY2g6IGZ1bmN0aW9uKCl7JCgnIycrZmllbGRJZCkuYWRkQ2xhc3MoJ2FqYXgtbG9hZGluZycpO30sCiAgICAgIHJlc3BvbnNlOiBmdW5jdGlvbigpeyQoJyMnK2ZpZWxkSWQpLnJlbW92ZUNsYXNzKCdhamF4LWxvYWRpbmcnKTt9CiAgICB9LCBvcHRpb25zKSk7CiAgICAkKCcjJytmaWVsZElkKS5hZGRDbGFzcygnYXV0b2NvbXBsZXRlJyk7CiAgfSk7Cn0KCmZ1bmN0aW9uIG11bHRpcGxlQXV0b2NvbXBsZXRlRmllbGQoZmllbGRJZCwgdXJsLCBvcHRpb25zKSB7CiAgZnVuY3Rpb24gc3BsaXQodmFsKSB7CiAgICByZXR1cm4gdmFsLnNwbGl0KC8sXHMqLyk7CiAgfQoKICBmdW5jdGlvbiBleHRyYWN0TGFzdCh0ZXJtKSB7CiAgICByZXR1cm4gc3BsaXQodGVybSkucG9wKCk7CiAgfQoKICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7CiAgICAkKCcjJyArIGZpZWxkSWQpLmF1dG9jb21wbGV0ZSgkLmV4dGVuZCh7CiAgICAgIHNvdXJjZTogZnVuY3Rpb24gKHJlcXVlc3QsIHJlc3BvbnNlKSB7CiAgICAgICAgJC5nZXRKU09OKHVybCwgewogICAgICAgICAgdGVybTogZXh0cmFjdExhc3QocmVxdWVzdC50ZXJtKQogICAgICAgIH0sIHJlc3BvbnNlKTsKICAgICAgfSwKICAgICAgbWluTGVuZ3RoOiAyLAogICAgICBwb3NpdGlvbjoge2NvbGxpc2lvbjogImZsaXBmaXQifSwKICAgICAgc2VhcmNoOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgJCgnIycgKyBmaWVsZElkKS5hZGRDbGFzcygnYWpheC1sb2FkaW5nJyk7CiAgICAgIH0sCiAgICAgIHJlc3BvbnNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgJCgnIycgKyBmaWVsZElkKS5yZW1vdmVDbGFzcygnYWpheC1sb2FkaW5nJyk7CiAgICAgIH0sCiAgICAgIHNlbGVjdDogZnVuY3Rpb24gKGV2ZW50LCB1aSkgewogICAgICAgIHZhciB0ZXJtcyA9IHNwbGl0KHRoaXMudmFsdWUpOwogICAgICAgIC8vIHJlbW92ZSB0aGUgY3VycmVudCBpbnB1dAogICAgICAgIHRlcm1zLnBvcCgpOwogICAgICAgIC8vIGFkZCB0aGUgc2VsZWN0ZWQgaXRlbQogICAgICAgIHRlcm1zLnB1c2godWkuaXRlbS52YWx1ZSk7CiAgICAgICAgLy8gYWRkIHBsYWNlaG9sZGVyIHRvIGdldCB0aGUgY29tbWEtYW5kLXNwYWNlIGF0IHRoZSBlbmQKICAgICAgICB0ZXJtcy5wdXNoKCIiKTsKICAgICAgICB0aGlzLnZhbHVlID0gdGVybXMuam9pbigiLCAiKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0sIG9wdGlvbnMpKTsKICAgICQoJyMnICsgZmllbGRJZCkuYWRkQ2xhc3MoJ2F1dG9jb21wbGV0ZScpOwogIH0pOwp9CgpmdW5jdGlvbiBvYnNlcnZlU2VhcmNoZmllbGQoZmllbGRJZCwgdGFyZ2V0SWQsIHVybCkgewogICQoJyMnK2ZpZWxkSWQpLmVhY2goZnVuY3Rpb24oKSB7CiAgICB2YXIgJHRoaXMgPSAkKHRoaXMpOwogICAgJHRoaXMuYWRkQ2xhc3MoJ2F1dG9jb21wbGV0ZScpOwogICAgJHRoaXMuYXR0cignZGF0YS12YWx1ZS13YXMnLCAkdGhpcy52YWwoKSk7CiAgICB2YXIgY2hlY2sgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIHZhbCA9ICR0aGlzLnZhbCgpOwogICAgICBpZiAoJHRoaXMuYXR0cignZGF0YS12YWx1ZS13YXMnKSAhPSB2YWwpewogICAgICAgICR0aGlzLmF0dHIoJ2RhdGEtdmFsdWUtd2FzJywgdmFsKTsKICAgICAgICAkLmFqYXgoewogICAgICAgICAgdXJsOiB1cmwsCiAgICAgICAgICB0eXBlOiAnZ2V0JywKICAgICAgICAgIGRhdGE6IHtxOiAkdGhpcy52YWwoKX0sCiAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihkYXRhKXsgaWYodGFyZ2V0SWQpICQoJyMnK3RhcmdldElkKS5odG1sKGRhdGEpOyB9LAogICAgICAgICAgYmVmb3JlU2VuZDogZnVuY3Rpb24oKXsgJHRoaXMuYWRkQ2xhc3MoJ2FqYXgtbG9hZGluZycpOyB9LAogICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKCl7ICR0aGlzLnJlbW92ZUNsYXNzKCdhamF4LWxvYWRpbmcnKTsgfQogICAgICAgIH0pOwogICAgICB9CiAgICB9OwogICAgdmFyIHJlc2V0ID0gZnVuY3Rpb24oKSB7CiAgICAgIGlmICh0aW1lcikgewogICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOwogICAgICAgIHRpbWVyID0gc2V0SW50ZXJ2YWwoY2hlY2ssIDMwMCk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgdGltZXIgPSBzZXRJbnRlcnZhbChjaGVjaywgMzAwKTsKICAgICR0aGlzLmJpbmQoJ2tleXVwIGNsaWNrIG1vdXNlbW92ZScsIHJlc2V0KTsKICB9KTsKfQoKJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKXsKICAkKCIuZHJkbiAuYXV0b2NvbXBsZXRlIikudmFsKCcnKTsKCiAgLy8gVGhpcyB2YXJpYWJsZSBpcyB1c2VkIHRvIGZvY3VzIHNlbGVjdGVkIHByb2plY3QKICB2YXIgc2VsZWN0ZWQ7CiAgJChkb2N1bWVudCkub24oJ2NsaWNrJywgJy5kcmRuLXRyaWdnZXInLCBmdW5jdGlvbihlKXsKICAgIHZhciBkcmRuID0gJCh0aGlzKS5jbG9zZXN0KCIuZHJkbiIpOwogICAgaWYgKGRyZG4uaGFzQ2xhc3MoImV4cGFuZGVkIikpIHsKICAgICAgZHJkbi5yZW1vdmVDbGFzcygiZXhwYW5kZWQiKTsKICAgIH0gZWxzZSB7CiAgICAgICQoIi5kcmRuIikucmVtb3ZlQ2xhc3MoImV4cGFuZGVkIik7CiAgICAgIGRyZG4uYWRkQ2xhc3MoImV4cGFuZGVkIik7CiAgICAgIGlmICgkKHRoaXMpLnBhcmVudCgnI3Byb2plY3QtanVtcCcpLmxlbmd0aCkgewogICAgICAgIHNlbGVjdGVkID0gJCgnLmRyZG4taXRlbXMgYS5zZWxlY3RlZCcpOyAvLyBTdG9yZSBzZWxlY3RlZCBwcm9qZWN0CiAgICAgICAgc2VsZWN0ZWQuZmlyc3QoKS5mb2N1cygpOyAvLyBDYWxsaW5nIGZvY3VzIHRvIHNjcm9sbCB0byBzZWxlY3RlZCBwcm9qZWN0CiAgICAgIH0KICAgICAgaWYgKCFpc01vYmlsZSgpKSB7CiAgICAgICAgZHJkbi5maW5kKCIuYXV0b2NvbXBsZXRlIikuZm9jdXMoKTsKICAgICAgfQogICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgfQogIH0pOwogICQoZG9jdW1lbnQpLmNsaWNrKGZ1bmN0aW9uKGUpewogICAgaWYgKCQoZS50YXJnZXQpLmNsb3Nlc3QoIi5kcmRuIikubGVuZ3RoIDwgMSkgewogICAgICAkKCIuZHJkbi5leHBhbmRlZCIpLnJlbW92ZUNsYXNzKCJleHBhbmRlZCIpOwogICAgfQogIH0pOwoKICBvYnNlcnZlU2VhcmNoZmllbGQoJ3Byb2plY3RzLXF1aWNrLXNlYXJjaCcsIG51bGwsICQoJyNwcm9qZWN0cy1xdWljay1zZWFyY2gnKS5kYXRhKCdhdXRvbWNvbXBsZXRlLXVybCcpKTsKCiAgJCgiLmRyZG4tY29udGVudCIpLmtleWRvd24oZnVuY3Rpb24oZXZlbnQpewogICAgdmFyIGl0ZW1zID0gJCh0aGlzKS5maW5kKCIuZHJkbi1pdGVtcyIpOwoKICAgIC8vIElmIGEgcHJvamVjdCBpcyBzZWxlY3RlZCBzZXQgZm9jdXNlZCB0byBzZWxlY3RlZCBvbmx5IG9uY2UKICAgIGlmIChzZWxlY3RlZCAmJiBzZWxlY3RlZC5sZW5ndGggPiAwKSB7CiAgICAgIHZhciBmb2N1c2VkID0gc2VsZWN0ZWQ7CiAgICAgIHNlbGVjdGVkID0gdW5kZWZpbmVkOwogICAgfQogICAgZWxzZSB7CiAgICAgIHZhciBmb2N1c2VkID0gaXRlbXMuZmluZCgiYTpmb2N1cyIpOwogICAgfQogICAgc3dpdGNoIChldmVudC53aGljaCkgewogICAgY2FzZSA0MDogLy9kb3duCiAgICAgIGlmIChmb2N1c2VkLmxlbmd0aCA+IDApIHsKICAgICAgICBmb2N1c2VkLm5leHRBbGwoImEiKS5maXJzdCgpLmZvY3VzKCk7OwogICAgICB9IGVsc2UgewogICAgICAgIGl0ZW1zLmZpbmQoImEiKS5maXJzdCgpLmZvY3VzKCk7OwogICAgICB9CiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAzODogLy91cAogICAgICBpZiAoZm9jdXNlZC5sZW5ndGggPiAwKSB7CiAgICAgICAgdmFyIHByZXYgPSBmb2N1c2VkLnByZXZBbGwoImEiKTsKICAgICAgICBpZiAocHJldi5sZW5ndGggPiAwKSB7CiAgICAgICAgICBwcmV2LmZpcnN0KCkuZm9jdXMoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgJCh0aGlzKS5maW5kKCIuYXV0b2NvbXBsZXRlIikuZm9jdXMoKTsKICAgICAgICB9CiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgMzU6IC8vZW5kCiAgICAgIGlmIChmb2N1c2VkLmxlbmd0aCA+IDApIHsKICAgICAgICBmb2N1c2VkLm5leHRBbGwoImEiKS5sYXN0KCkuZm9jdXMoKTsKICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSAzNjogLy9ob21lCiAgICAgIGlmIChmb2N1c2VkLmxlbmd0aCA+IDApIHsKICAgICAgICBmb2N1c2VkLnByZXZBbGwoImEiKS5sYXN0KCkuZm9jdXMoKTsKICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgfQogIH0pOwp9KTsKCmZ1bmN0aW9uIGJlZm9yZVNob3dEYXRlUGlja2VyKGlucHV0LCBpbnN0KSB7CiAgdmFyIGRlZmF1bHRfZGF0ZSA9IG51bGw7CiAgc3dpdGNoICgkKGlucHV0KS5hdHRyKCJpZCIpKSB7CiAgICBjYXNlICJpc3N1ZV9zdGFydF9kYXRlIiA6CiAgICAgIGlmICgkKCIjaXNzdWVfZHVlX2RhdGUiKS5sZW5ndGggPiAwKSB7CiAgICAgICAgZGVmYXVsdF9kYXRlID0gJCgiI2lzc3VlX2R1ZV9kYXRlIikudmFsKCk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlICJpc3N1ZV9kdWVfZGF0ZSIgOgogICAgICBpZiAoJCgiI2lzc3VlX3N0YXJ0X2RhdGUiKS5sZW5ndGggPiAwKSB7CiAgICAgICAgdmFyIHN0YXJ0X2RhdGUgPSAkKCIjaXNzdWVfc3RhcnRfZGF0ZSIpLnZhbCgpOwogICAgICAgIGlmIChzdGFydF9kYXRlICE9ICIiKSB7CiAgICAgICAgICBzdGFydF9kYXRlID0gbmV3IERhdGUoRGF0ZS5wYXJzZShzdGFydF9kYXRlKSk7CiAgICAgICAgICBpZiAoc3RhcnRfZGF0ZSA+IG5ldyBEYXRlKCkpIHsKICAgICAgICAgICAgZGVmYXVsdF9kYXRlID0gJCgiI2lzc3VlX3N0YXJ0X2RhdGUiKS52YWwoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgYnJlYWs7CiAgfQogICQoaW5wdXQpLmRhdGVwaWNrZXJGYWxsYmFjaygib3B0aW9uIiwgImRlZmF1bHREYXRlIiwgZGVmYXVsdF9kYXRlKTsKfQoKKGZ1bmN0aW9uKCQpewogICQuZm4ucG9zaXRpb25lZEl0ZW1zID0gZnVuY3Rpb24oc29ydGFibGVPcHRpb25zLCBvcHRpb25zKXsKICAgIHZhciBzZXR0aW5ncyA9ICQuZXh0ZW5kKHsKICAgICAgZmlyc3RQb3NpdGlvbjogMQogICAgfSwgb3B0aW9ucyApOwoKICAgIHJldHVybiB0aGlzLnNvcnRhYmxlKCQuZXh0ZW5kKHsKICAgICAgYXhpczogJ3knLAogICAgICBoYW5kbGU6ICIuc29ydC1oYW5kbGUiLAogICAgICBoZWxwZXI6IGZ1bmN0aW9uKGV2ZW50LCB1aSl7CiAgICAgICAgdWkuY2hpbGRyZW4oJ3RkJykuZWFjaChmdW5jdGlvbigpewogICAgICAgICAgJCh0aGlzKS53aWR0aCgkKHRoaXMpLndpZHRoKCkpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiB1aTsKICAgICAgfSwKICAgICAgdXBkYXRlOiBmdW5jdGlvbihldmVudCwgdWkpIHsKICAgICAgICB2YXIgc29ydGFibGUgPSAkKHRoaXMpOwogICAgICAgIHZhciBoYW5kbGUgPSB1aS5pdGVtLmZpbmQoIi5zb3J0LWhhbmRsZSIpLmFkZENsYXNzKCJhamF4LWxvYWRpbmciKTsKICAgICAgICB2YXIgdXJsID0gaGFuZGxlLmRhdGEoInJlb3JkZXItdXJsIik7CiAgICAgICAgdmFyIHBhcmFtID0gaGFuZGxlLmRhdGEoInJlb3JkZXItcGFyYW0iKTsKICAgICAgICB2YXIgZGF0YSA9IHt9OwogICAgICAgIGRhdGFbcGFyYW1dID0ge3Bvc2l0aW9uOiB1aS5pdGVtLmluZGV4KCkgKyBzZXR0aW5nc1snZmlyc3RQb3NpdGlvbiddfTsKICAgICAgICAkLmFqYXgoewogICAgICAgICAgdXJsOiB1cmwsCiAgICAgICAgICB0eXBlOiAncHV0JywKICAgICAgICAgIGRhdGFUeXBlOiAnc2NyaXB0JywKICAgICAgICAgIGRhdGE6IGRhdGEsCiAgICAgICAgICBlcnJvcjogZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKXsKICAgICAgICAgICAgYWxlcnQoanFYSFIuc3RhdHVzKTsKICAgICAgICAgICAgc29ydGFibGUuc29ydGFibGUoImNhbmNlbCIpOwogICAgICAgICAgfSwKICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pewogICAgICAgICAgICBoYW5kbGUucmVtb3ZlQ2xhc3MoImFqYXgtbG9hZGluZyIpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9LAogICAgfSwgc29ydGFibGVPcHRpb25zKSk7CiAgfQp9KCBqUXVlcnkgKSk7Cgp2YXIgd2FybkxlYXZpbmdVbnNhdmVkTWVzc2FnZTsKZnVuY3Rpb24gd2FybkxlYXZpbmdVbnNhdmVkKG1lc3NhZ2UpIHsKICB3YXJuTGVhdmluZ1Vuc2F2ZWRNZXNzYWdlID0gbWVzc2FnZTsKICAkKGRvY3VtZW50KS5vbignc3VibWl0JywgJ2Zvcm0nLCBmdW5jdGlvbigpewogICAgJCgndGV4dGFyZWEnKS5yZW1vdmVEYXRhKCdjaGFuZ2VkJyk7CiAgfSk7CiAgJChkb2N1bWVudCkub24oJ2NoYW5nZScsICd0ZXh0YXJlYScsIGZ1bmN0aW9uKCl7CiAgICAkKHRoaXMpLmRhdGEoJ2NoYW5nZWQnLCAnY2hhbmdlZCcpOwogIH0pOwogIHdpbmRvdy5vbmJlZm9yZXVubG9hZCA9IGZ1bmN0aW9uKCl7CiAgICB2YXIgd2FybiA9IGZhbHNlOwogICAgJCgndGV4dGFyZWEnKS5ibHVyKCkuZWFjaChmdW5jdGlvbigpewogICAgICBpZiAoJCh0aGlzKS5kYXRhKCdjaGFuZ2VkJykpIHsKICAgICAgICB3YXJuID0gdHJ1ZTsKICAgICAgfQogICAgfSk7CiAgICBpZiAod2Fybikge3JldHVybiB3YXJuTGVhdmluZ1Vuc2F2ZWRNZXNzYWdlO30KICB9Owp9CgpmdW5jdGlvbiBzZXR1cEFqYXhJbmRpY2F0b3IoKSB7CiAgJChkb2N1bWVudCkuYmluZCgnYWpheFNlbmQnLCBmdW5jdGlvbihldmVudCwgeGhyLCBzZXR0aW5ncykgewogICAgaWYgKCQoJy5hamF4LWxvYWRpbmcnKS5sZW5ndGggPT09IDAgJiYgc2V0dGluZ3MuY29udGVudFR5cGUgIT0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpIHsKICAgICAgJCgnI2FqYXgtaW5kaWNhdG9yJykuc2hvdygpOwogICAgfQogIH0pOwogICQoZG9jdW1lbnQpLmJpbmQoJ2FqYXhTdG9wJywgZnVuY3Rpb24oKSB7CiAgICAkKCcjYWpheC1pbmRpY2F0b3InKS5oaWRlKCk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHNldHVwVGFicygpIHsKICBpZigkKCcudGFicycpLmxlbmd0aCA+IDApIHsKICAgIGRpc3BsYXlUYWJzQnV0dG9ucygpOwogICAgJCh3aW5kb3cpLnJlc2l6ZShkaXNwbGF5VGFic0J1dHRvbnMpOwogIH0KfQoKZnVuY3Rpb24gc2V0dXBGaWxlUHJldmlld05hdmlnYXRpb24oKSB7CiAgLy8gb25seSBiaW5kIGFycm93IGtleXMgd2hlbiBwcmV2aWV3IG5hdmlnYXRpb24gaXMgcHJlc2VudAogIGNvbnN0IGVsZW1lbnQgPSAkKCcucGFnaW5hdGlvbi5maWxlcHJldmlldycpLmZpcnN0KCk7CiAgaWYgKGVsZW1lbnQpIHsKCiAgICBjb25zdCBoYW5kbGVBcnJvd0tleSA9IGZ1bmN0aW9uKHNlbGVjdG9yLCBlKXsKICAgICAgY29uc3QgaHJlZiA9ICQoZWxlbWVudCkuZmluZChzZWxlY3RvcikuYXR0cignaHJlZicpOwogICAgICBpZiAoaHJlZikgewogICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IGhyZWY7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICB9CiAgICB9OwoKICAgICQoZG9jdW1lbnQpLmtleWRvd24oZnVuY3Rpb24oZSkgewogICAgICBpZihlLnNoaWZ0S2V5IHx8IGUubWV0YUtleSB8fCBlLmN0cmxLZXkgfHwgZS5hbHRLZXkpIHJldHVybjsKICAgICAgc3dpdGNoKGUua2V5KSB7CiAgICAgICAgY2FzZSAnQXJyb3dMZWZ0JzoKICAgICAgICAgIGhhbmRsZUFycm93S2V5KCcucHJldmlvdXMgYScsIGUpOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOgogICAgICAgICAgaGFuZGxlQXJyb3dLZXkoJy5uZXh0IGEnLCBlKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9KTsKICB9Cn0KCiQoZG9jdW1lbnQpLm9uKCdrZXlkb3duJywgJ2Zvcm0gdGV4dGFyZWEnLCBmdW5jdGlvbihlKSB7CiAgLy8gU3VibWl0IHRoZSBmb3JtIHdpdGggQ3RybCArIEVudGVyIG9yIENvbW1hbmQgKyBSZXR1cm4KICB2YXIgdGFyZ2V0Rm9ybSA9ICQoZS50YXJnZXQpLmNsb3Nlc3QoJ2Zvcm0nKTsKICBpZihlLmtleUNvZGUgPT0gMTMgJiYgKChlLmN0cmxLZXkgJiYgIWUubWV0YUtleSkgfHwgKCFlLmN0cmxLZXkgJiYgZS5tZXRhS2V5KSAmJiB0YXJnZXRGb3JtLmxlbmd0aCkpIHsKICAgIC8vIEZvciBhamF4LCB1c2UgY2xpY2soKSBpbnN0ZWFkIG9mIHN1Ym1pdCgpIHRvIHByZXZlbnQgIkludmFsaWQgZm9ybSBhdXRoZW50aWNpdHkgdG9rZW4iIGVycm9yCiAgICBpZiAodGFyZ2V0Rm9ybS5hdHRyKCdkYXRhLXJlbW90ZScpID09ICd0cnVlJykgewogICAgICBpZiAodGFyZ2V0Rm9ybS5maW5kKCdpbnB1dFt0eXBlPXN1Ym1pdF0nKS5sZW5ndGggPT09IDApIHsgcmV0dXJuIGZhbHNlOyB9CiAgICAgIHRhcmdldEZvcm0uZmluZCgndGV4dGFyZWEnKS5ibHVyKCkucmVtb3ZlRGF0YSgnY2hhbmdlZCcpOwogICAgICB0YXJnZXRGb3JtLmZpbmQoJ2lucHV0W3R5cGU9c3VibWl0XScpLmZpcnN0KCkuY2xpY2soKTsKICAgIH0gZWxzZSB7CiAgICAgIHRhcmdldEZvcm0uZmluZCgndGV4dGFyZWEnKS5ibHVyKCkucmVtb3ZlRGF0YSgnY2hhbmdlZCcpOwogICAgICB0YXJnZXRGb3JtLnN1Ym1pdCgpOwogICAgfQogIH0KfSk7CgoKZnVuY3Rpb24gaGlkZU9uTG9hZCgpIHsKICAkKCcuaG9sJykuaGlkZSgpOwp9CgpmdW5jdGlvbiBhZGRGb3JtT2JzZXJ2ZXJzRm9yRG91YmxlU3VibWl0KCkgewogICQoJ2Zvcm1bbWV0aG9kPXBvc3RdJykuZWFjaChmdW5jdGlvbigpIHsKICAgIGlmICghJCh0aGlzKS5oYXNDbGFzcygnbXVsdGlwbGUtc3VibWl0JykpIHsKICAgICAgJCh0aGlzKS5zdWJtaXQoZnVuY3Rpb24oZm9ybV9zdWJtaXNzaW9uKSB7CiAgICAgICAgaWYgKCQoZm9ybV9zdWJtaXNzaW9uLnRhcmdldCkuYXR0cignZGF0YS1zdWJtaXR0ZWQnKSkgewogICAgICAgICAgZm9ybV9zdWJtaXNzaW9uLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICQoZm9ybV9zdWJtaXNzaW9uLnRhcmdldCkuYXR0cignZGF0YS1zdWJtaXR0ZWQnLCB0cnVlKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogIH0pOwp9CgpmdW5jdGlvbiBkZWZhdWx0Rm9jdXMoKXsKICBpZiAoKCQoJyNjb250ZW50IDpmb2N1cycpLmxlbmd0aCA9PSAwKSAmJiAod2luZG93LmxvY2F0aW9uLmhhc2ggPT0gJycpKSB7CiAgICAkKCcjY29udGVudCBpbnB1dFt0eXBlPXRleHRdOnZpc2libGUsICNjb250ZW50IHRleHRhcmVhOnZpc2libGUnKS5maXJzdCgpLmZvY3VzKCk7CiAgfQp9CgpmdW5jdGlvbiBibG9ja0V2ZW50UHJvcGFnYXRpb24oZXZlbnQpIHsKICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwp9CgpmdW5jdGlvbiB0b2dnbGVEaXNhYmxlZE9uQ2hhbmdlKCkgewogIHZhciBjaGVja2VkID0gJCh0aGlzKS5pcygnOmNoZWNrZWQnKTsKICAkKCQodGhpcykuZGF0YSgnZGlzYWJsZXMnKSkuYXR0cignZGlzYWJsZWQnLCBjaGVja2VkKTsKICAkKCQodGhpcykuZGF0YSgnZW5hYmxlcycpKS5hdHRyKCdkaXNhYmxlZCcsICFjaGVja2VkKTsKICAkKCQodGhpcykuZGF0YSgnc2hvd3MnKSkudG9nZ2xlKGNoZWNrZWQpOwp9CmZ1bmN0aW9uIHRvZ2dsZURpc2FibGVkSW5pdCgpIHsKICAkKCdpbnB1dFtkYXRhLWRpc2FibGVzXSwgaW5wdXRbZGF0YS1lbmFibGVzXSwgaW5wdXRbZGF0YS1zaG93c10nKS5lYWNoKHRvZ2dsZURpc2FibGVkT25DaGFuZ2UpOwp9CmZ1bmN0aW9uIHRvZ2dsZU11bHRpU2VsZWN0SWNvbkluaXQoKSB7CiAgJCgnLnRvZ2dsZS1tdWx0aXNlbGVjdDpub3QoLmljb24tdG9nZ2xlLW1pbnVzKTpub3QoLmljb24tdG9nZ2xlLXBsdXMpJykuZWFjaChmdW5jdGlvbigpewogICAgbGV0IGljb25UeXBlOwogICAgaWYgKCQodGhpcykuc2libGluZ3MoJ3NlbGVjdCcpLmZpbmQoJ29wdGlvbjpzZWxlY3RlZCcpLmxlbmd0aCA+IDEpIHsKICAgICAgaWNvblR5cGUgPSAndG9nZ2xlLW1pbnVzJzsKICAgIH0gZWxzZSB7CiAgICAgIGljb25UeXBlID0gJ3RvZ2dsZS1wbHVzJzsKICAgIH0KCiAgICAkKHRoaXMpLmFkZENsYXNzKGBpY29uLSR7aWNvblR5cGV9YCk7CiAgICB1cGRhdGVTVkdJY29uKCQodGhpcykuZmluZCgnc3ZnJylbMF0sIGljb25UeXBlKTsKICB9KTsKfQoKZnVuY3Rpb24gdG9nZ2xlTmV3T2JqZWN0RHJvcGRvd24oKSB7CiAgdmFyIGRyb3Bkb3duID0gJCgnI25ldy1vYmplY3QgKyB1bC5tZW51LWNoaWxkcmVuJyk7CiAgaWYoZHJvcGRvd24uaGFzQ2xhc3MoJ3Zpc2libGUnKSl7CiAgICBkcm9wZG93bi5yZW1vdmVDbGFzcygndmlzaWJsZScpOwogIH1lbHNlewogICAgZHJvcGRvd24uYWRkQ2xhc3MoJ3Zpc2libGUnKTsKICB9Cn0KCihmdW5jdGlvbiAoICQgKSB7CgogIC8vIGRldGVjdCBpZiBuYXRpdmUgZGF0ZSBpbnB1dCBpcyBzdXBwb3J0ZWQKICB2YXIgbmF0aXZlRGF0ZUlucHV0U3VwcG9ydGVkID0gdHJ1ZTsKCiAgdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTsKICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCdkYXRlJyk7CiAgaWYgKGlucHV0LnR5cGUgPT09ICd0ZXh0JykgewogICAgbmF0aXZlRGF0ZUlucHV0U3VwcG9ydGVkID0gZmFsc2U7CiAgfQoKICB2YXIgbm90QURhdGVWYWx1ZSA9ICdub3QtYS1kYXRlJzsKICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgbm90QURhdGVWYWx1ZSk7CiAgaWYgKGlucHV0LnZhbHVlID09PSBub3RBRGF0ZVZhbHVlKSB7CiAgICBuYXRpdmVEYXRlSW5wdXRTdXBwb3J0ZWQgPSBmYWxzZTsKICB9CgogICQuZm4uZGF0ZXBpY2tlckZhbGxiYWNrID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7CiAgICBpZiAobmF0aXZlRGF0ZUlucHV0U3VwcG9ydGVkKSB7CiAgICAgIHJldHVybiB0aGlzOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHRoaXMuZGF0ZXBpY2tlciggb3B0aW9ucyApOwogICAgfQogIH07Cn0oIGpRdWVyeSApKTsKCiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCl7CiAgJCgnI2NvbnRlbnQnKS5vbignY2hhbmdlJywgJ2lucHV0W2RhdGEtZGlzYWJsZXNdLCBpbnB1dFtkYXRhLWVuYWJsZXNdLCBpbnB1dFtkYXRhLXNob3dzXScsIHRvZ2dsZURpc2FibGVkT25DaGFuZ2UpOwogIHRvZ2dsZURpc2FibGVkSW5pdCgpOwoKICAkKCcjY29udGVudCcpLm9uKCdjbGljaycsICcudG9nZ2xlLW11bHRpc2VsZWN0JywgZnVuY3Rpb24oKSB7CiAgICB0b2dnbGVNdWx0aVNlbGVjdCgkKHRoaXMpLnNpYmxpbmdzKCdzZWxlY3QnKSk7CiAgICAkKHRoaXMpLnRvZ2dsZUNsYXNzKCdpY29uLXRvZ2dsZS1wbHVzIGljb24tdG9nZ2xlLW1pbnVzJyk7CiAgICB1cGRhdGVTVkdJY29uKCQodGhpcykuZmluZCgnc3ZnJylbMF0sICQodGhpcykuaGFzQ2xhc3MoJ2ljb24tdG9nZ2xlLXBsdXMnKSA/ICd0b2dnbGUtcGx1cycgOiAndG9nZ2xlLW1pbnVzJyk7CiAgfSk7CiAgdG9nZ2xlTXVsdGlTZWxlY3RJY29uSW5pdCgpOwoKICAkKCcjaGlzdG9yeSAudGFicycpLm9uKCdjbGljaycsICdhJywgZnVuY3Rpb24oZSl7CiAgICB2YXIgdGFiID0gJChlLnRhcmdldCkuYXR0cignaWQnKS5yZXBsYWNlKCd0YWItJywnJyk7CiAgICBkb2N1bWVudC5jb29raWUgPSAnaGlzdG9yeV9sYXN0X3RhYj0nICsgdGFiICsgJzsgU2FtZVNpdGU9TGF4JwogIH0pOwp9KTsKCiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCl7CiAgJCgnI2NvbnRlbnQnKS5vbignY2xpY2snLCAnZGl2LmpzdFRhYnMgYS50YWItcHJldmlldycsIGZ1bmN0aW9uKGV2ZW50KXsKICAgIHZhciB0YWIgPSAkKGV2ZW50LnRhcmdldCk7CgogICAgdmFyIHVybCA9IHRhYi5kYXRhKCd1cmwnKTsKICAgIHZhciBmb3JtID0gdGFiLnBhcmVudHMoJ2Zvcm0nKTsKICAgIHZhciBqc3RCbG9jayA9IHRhYi5wYXJlbnRzKCcuanN0QmxvY2snKTsKCiAgICB2YXIgZWxlbWVudCA9IGVuY29kZVVSSUNvbXBvbmVudChqc3RCbG9jay5maW5kKCcud2lraS1lZGl0JykudmFsKCkpOwogICAgdmFyIGF0dGFjaG1lbnRzID0gZm9ybS5maW5kKCcuYXR0YWNobWVudHNfZmllbGRzIGlucHV0Jykuc2VyaWFsaXplKCk7CgogICAgJC5hamF4KHsKICAgICAgdXJsOiB1cmwsCiAgICAgIHR5cGU6ICdwb3N0JywKICAgICAgZGF0YTogInRleHQ9IiArIGVsZW1lbnQgKyAnJicgKyBhdHRhY2htZW50cywKICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSl7CiAgICAgICAganN0QmxvY2suZmluZCgnLndpa2ktcHJldmlldycpLmh0bWwoZGF0YSk7CiAgICAgICAgc2V0dXBXaWtpVGFibGVTb3J0YWJsZUhlYWRlcigpOwogICAgICB9CiAgICB9KTsKICB9KTsKfSk7CgpmdW5jdGlvbiBrZWVwQW5jaG9yT25TaWduSW4oZm9ybSl7CiAgdmFyIGhhc2ggPSBkZWNvZGVVUklDb21wb25lbnQoc2VsZi5kb2N1bWVudC5sb2NhdGlvbi5oYXNoKTsKICBpZiAoaGFzaCkgewogICAgaWYgKGhhc2guaW5kZXhPZigiIyIpID09PSAtMSkgewogICAgICBoYXNoID0gIiMiICsgaGFzaDsKICAgIH0KICAgIGZvcm0uYWN0aW9uID0gZm9ybS5hY3Rpb24gKyBoYXNoOwogIH0KICByZXR1cm4gdHJ1ZTsKfQoKJChmdW5jdGlvbiAoJCkgewogICQoJyNhdXRoX3NvdXJjZV9sZGFwX21vZGUnKS5jaGFuZ2UoZnVuY3Rpb24gKCkgewogICAgJCgnLmxkYXBzX3dhcm5pbmcnKS50b2dnbGUoJCh0aGlzKS52YWwoKSAhPSAnbGRhcHNfdmVyaWZ5X3BlZXInKTsKICB9KS5jaGFuZ2UoKTsKfSk7CgpmdW5jdGlvbiBzZXRGaWxlY29udGVudENvbnRhaW5lckhlaWdodCgpIHsKICB2YXIgJGZpbGVjb250YWluZXIgPSAkKCcuZmlsZWNvbnRlbnQtY29udGFpbmVyJyk7CiAgdmFyIGZpbGVUeXBlU2VsZWN0b3JzID0gWycuaW1hZ2UnLCAndmlkZW8nXTsKCiAgaWYoJGZpbGVjb250YWluZXIubGVuZ3RoID4gMCAmJiAkZmlsZWNvbnRhaW5lci5maW5kKGZpbGVUeXBlU2VsZWN0b3JzLmpvaW4oJywnKSkubGVuZ3RoID09PSAxKSB7CiAgICB2YXIgY29udGFpbmVyT2Zmc2V0VG9wID0gJGZpbGVjb250YWluZXIub2Zmc2V0KCkudG9wOwogICAgdmFyIGNvbnRhaW5lck1hcmdpbkJvdHRvbSA9IHBhcnNlSW50KCRmaWxlY29udGFpbmVyLmNzcygnbWFyZ2luQm90dG9tJykpOwogICAgdmFyIHBhZ2luYXRpb25IZWlnaHQgPSAkZmlsZWNvbnRhaW5lci5uZXh0KCcucGFnaW5hdGlvbicpLmhlaWdodCgpOwogICAgdmFyIGRpZmYgPSBjb250YWluZXJPZmZzZXRUb3AgKyBjb250YWluZXJNYXJnaW5Cb3R0b20gKyBwYWdpbmF0aW9uSGVpZ2h0OwoKICAgICRmaWxlY29udGFpbmVyLmNzcygnaGVpZ2h0JywgJ2NhbGMoMTAwdmggLSAnICsgZGlmZiArICdweCknKQogIH0KfQoKZnVuY3Rpb24gc2V0dXBBdHRhY2htZW50RGV0YWlsKCkgewogIHNldEZpbGVjb250ZW50Q29udGFpbmVySGVpZ2h0KCk7CiAgJCh3aW5kb3cpLnJlc2l6ZShzZXRGaWxlY29udGVudENvbnRhaW5lckhlaWdodCk7Cn0KCmZ1bmN0aW9uIHNldHVwV2lraVRhYmxlU29ydGFibGVIZWFkZXIoKSB7CiAgaWYgKHR5cGVvZiBUYWJsZXNvcnQgPT09ICd1bmRlZmluZWQnKSB7IHJldHVybjsgfQogICQoJ2Rpdi53aWtpIHRhYmxlJykuZWFjaChmdW5jdGlvbihpLCB0YWJsZSl7CiAgICBpZiAodGFibGUucm93cy5sZW5ndGggPCAzKSByZXR1cm4gdHJ1ZTsKICAgIHZhciB0ciA9ICQodGFibGUucm93cykuZmlyc3QoKTsKICAgIGlmICh0ci5maW5kKCJUSCIpLmxlbmd0aCA+IDApIHsKICAgICAgdHIuYXR0cignZGF0YS1zb3J0LW1ldGhvZCcsICdub25lJyk7CiAgICAgIHRyLmZpbmQoIlREIikuYXR0cignZGF0YS1zb3J0LW1ldGhvZCcsICdub25lJyk7CiAgICAgIG5ldyBUYWJsZXNvcnQodGFibGUpOwogICAgfQogIH0pOwp9CgpmdW5jdGlvbiBzZXR1cEhvdmVyVG9vbHRpcHMoY29udGFpbmVyKSB7CiAgJChjb250YWluZXIgfHwgJ2JvZHknKS5maW5kKCJbdGl0bGVdOm5vdCgubm8tdG9vbHRpcCkiKS50b29sdGlwKHsKICAgIHNob3c6IHsKICAgICAgZGVsYXk6IDQwMAogICAgfSwKICAgIHBvc2l0aW9uOiB7CiAgICAgIG15OiAiY2VudGVyIGJvdHRvbS01IiwKICAgICAgYXQ6ICJjZW50ZXIgdG9wIgogICAgfQogIH0pOwp9CmZ1bmN0aW9uIHJlbW92ZUhvdmVyVG9vbHRpcHMoY29udGFpbmVyKSB7CiAgJChjb250YWluZXIgfHwgJ2JvZHknKS5maW5kKCJbdGl0bGVdOm5vdCgubm8tdG9vbHRpcCkiKS50b29sdGlwKCdkZXN0cm95JykKfQokKGZ1bmN0aW9uKCkgeyBzZXR1cEhvdmVyVG9vbHRpcHMoKTsgfSk7CgpmdW5jdGlvbiBpbmxpbmVBdXRvQ29tcGxldGUoZWxlbWVudCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIGRvIG5vdCBhdHRhY2ggaWYgVHJpYnV0ZSBpcyBhbHJlYWR5IGluaXRpYWxpemVkCiAgICBpZiAoZWxlbWVudC5kYXRhc2V0LnRyaWJ1dGUgPT09ICd0cnVlJykge3JldHVybn07CgogICAgY29uc3QgZ2V0RGF0YVNvdXJjZSA9IGZ1bmN0aW9uKGVudGl0eSkgewogICAgICBjb25zdCBkYXRhU291cmNlcyA9IHJtLkF1dG9Db21wbGV0ZS5kYXRhU291cmNlczsKCiAgICAgIGlmIChkYXRhU291cmNlc1tlbnRpdHldKSB7CiAgICAgICAgcmV0dXJuIGRhdGFTb3VyY2VzW2VudGl0eV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CgogICAgY29uc3QgZGVib3VuY2UgPSBmdW5jdGlvbihmdW5jLCBkZWxheSkgewogICAgICBsZXQgdGltZW91dDsKCiAgICAgIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7CiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXM7CiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpOwogICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyksIGRlbGF5KTsKICAgICAgfTsKICAgIH0KCiAgICBjb25zdCByZW1vdGVTZWFyY2ggPSBkZWJvdW5jZSgodXJsLCBjYikgPT4gewogICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpCiAgICAgIHsKICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDQpIHsKICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgdmFyIGRhdGEgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpOwogICAgICAgICAgICBjYihkYXRhKTsKICAgICAgICAgIH0gZWxzZSBpZiAoeGhyLnN0YXR1cyA9PT0gNDAzKSB7CiAgICAgICAgICAgIGNiKFtdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH07CiAgICAgIHhoci5vcGVuKCJHRVQiLCB1cmwsIHRydWUpOwogICAgICB4aHIuc2VuZCgpOwogICAgfSwgMjAwKTsKCiAgICBjb25zdCB0cmlidXRlID0gbmV3IFRyaWJ1dGUoewogICAgICBjb2xsZWN0aW9uOiBbCiAgICAgICAgewogICAgICAgICAgdHJpZ2dlcjogJyMnLAogICAgICAgICAgdmFsdWVzOiBmdW5jdGlvbiAodGV4dCwgY2IpIHsKICAgICAgICAgICAgaWYgKGV2ZW50LnRhcmdldC50eXBlID09PSAndGV4dCcgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2F1dG9jb21wbGV0ZScpICE9ICdvZmYnKSB7CiAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2F1dG9jb21wbGV0ZScsICdvZmYnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBXaGVuIHRyaWdnZXJlZCB3aXRoIHRleHQgc3RhcnRpbmcgd2l0aCAiIyMiLCBsaWtlICIjI2EiLCB0aGUgc2VhcmNoIHRlcm0gd2lsbCBiZWNvbWUgIiNhIiwKICAgICAgICAgICAgLy8gY2F1c2luZyB0aGUgU1FMIHF1ZXJ5IHRvIGZhaWwgaW4gZmluZGluZyBpc3N1ZXMgd2l0aCAiYSIgaW4gdGhlIHN1YmplY3QuCiAgICAgICAgICAgIC8vIFRvIGF2b2lkIHRoaXMsIHJlbW92ZSB0aGUgZmlyc3QgIiMiIGZyb20gdGhlIHNlYXJjaCB0ZXJtLgogICAgICAgICAgICBpZiAodGV4dCkgewogICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL14jLywgJycpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbW90ZVNlYXJjaChnZXREYXRhU291cmNlKCdpc3N1ZXMnKSArIGVuY29kZVVSSUNvbXBvbmVudCh0ZXh0KSwgZnVuY3Rpb24gKGlzc3VlcykgewogICAgICAgICAgICAgIHJldHVybiBjYihpc3N1ZXMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICBsb29rdXA6ICdsYWJlbCcsCiAgICAgICAgICBmaWxsQXR0cjogJ2xhYmVsJywKICAgICAgICAgIHJlcXVpcmVMZWFkaW5nU3BhY2U6IHRydWUsCiAgICAgICAgICBzZWxlY3RUZW1wbGF0ZTogZnVuY3Rpb24gKGlzc3VlKSB7CiAgICAgICAgICAgIGxldCBsZWFkaW5nSGFzaCA9ICIjIgogICAgICAgICAgICAvLyBrZWVwICMjIHN5bnRheCB3aGljaCBpcyBhIHZhbGlkIGlzc3VlIHN5bnRheCB0byBzaG93IGlzc3VlIHdpdGggdGl0bGUuCiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRNZW50aW9uVGV4dFNuYXBzaG90LmNoYXJBdCgwKSA9PT0gIiMiKSB7CiAgICAgICAgICAgICAgbGVhZGluZ0hhc2ggPSAiIyMiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGxlYWRpbmdIYXNoICsgaXNzdWUub3JpZ2luYWwuaWQ7CiAgICAgICAgICB9LAogICAgICAgICAgbWVudUl0ZW1UZW1wbGF0ZTogZnVuY3Rpb24gKGlzc3VlKSB7CiAgICAgICAgICAgIHJldHVybiBzYW5pdGl6ZUhUTUwoaXNzdWUub3JpZ2luYWwubGFiZWwpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgdHJpZ2dlcjogJ1tbJywKICAgICAgICAgIHZhbHVlczogZnVuY3Rpb24gKHRleHQsIGNiKSB7CiAgICAgICAgICAgIHJlbW90ZVNlYXJjaChnZXREYXRhU291cmNlKCd3aWtpX3BhZ2VzJykgKyBlbmNvZGVVUklDb21wb25lbnQodGV4dCksIGZ1bmN0aW9uICh3aWtpUGFnZXMpIHsKICAgICAgICAgICAgICByZXR1cm4gY2Iod2lraVBhZ2VzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9LAogICAgICAgICAgbG9va3VwOiAnbGFiZWwnLAogICAgICAgICAgZmlsbEF0dHI6ICdsYWJlbCcsCiAgICAgICAgICByZXF1aXJlTGVhZGluZ1NwYWNlOiB0cnVlLAogICAgICAgICAgc2VsZWN0VGVtcGxhdGU6IGZ1bmN0aW9uICh3aWtpUGFnZSkgewogICAgICAgICAgICByZXR1cm4gJ1tbJyArIHdpa2lQYWdlLm9yaWdpbmFsLnZhbHVlICsgJ11dJzsKICAgICAgICAgIH0sCiAgICAgICAgICBtZW51SXRlbVRlbXBsYXRlOiBmdW5jdGlvbiAod2lraVBhZ2UpIHsKICAgICAgICAgICAgcmV0dXJuIHNhbml0aXplSFRNTCh3aWtpUGFnZS5vcmlnaW5hbC5sYWJlbCk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICB0cmlnZ2VyOiAnQCcsCiAgICAgICAgICBsb29rdXA6IGZ1bmN0aW9uICh1c2VyLCBtZW50aW9uVGV4dCkgewogICAgICAgICAgICByZXR1cm4gdXNlci5uYW1lICsgdXNlci5maXJzdG5hbWUgKyB1c2VyLmxhc3RuYW1lICsgdXNlci5sb2dpbjsKICAgICAgICAgIH0sCiAgICAgICAgICB2YWx1ZXM6IGZ1bmN0aW9uICh0ZXh0LCBjYikgewogICAgICAgICAgICBjb25zdCB1cmwgPSBnZXREYXRhU291cmNlKCd1c2VycycpOwogICAgICAgICAgICBpZiAodXJsKSB7CiAgICAgICAgICAgICAgcmVtb3RlU2VhcmNoKHVybCArIGVuY29kZVVSSUNvbXBvbmVudCh0ZXh0KSwgZnVuY3Rpb24gKHVzZXJzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2IodXNlcnMpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgbWVudUl0ZW1UZW1wbGF0ZTogZnVuY3Rpb24gKHVzZXIpIHsKICAgICAgICAgICAgcmV0dXJuIHVzZXIub3JpZ2luYWwubmFtZTsKICAgICAgICAgIH0sCiAgICAgICAgICBzZWxlY3RUZW1wbGF0ZTogZnVuY3Rpb24gKHVzZXIpIHsKICAgICAgICAgICAgcmV0dXJuICdAJyArIHVzZXIub3JpZ2luYWwubG9naW47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICBdLAogICAgICBub01hdGNoVGVtcGxhdGU6ICIiCiAgICB9KTsKCiAgICB0cmlidXRlLmF0dGFjaChlbGVtZW50KTsKfQoKLy8gY29sbGFwc2libGUgc2lkZWJhciBqUXVlcnkgcGx1Z2luCihmdW5jdGlvbigkKSB7CiAgLy8gbWFpbiBjb250YWluZXIgdGhpcyBpcyBhcHBsaWVkIHRvCiAgdmFyIG1haW47CiAgLy8gdHJpZ2dlcnMgc2hvdy9oaWRlCiAgdmFyIGJ1dHRvbjsKICAvLyB0aGUga2V5IHRvIHVzZSBpbiBsb2NhbCBzdG9yYWdlCiAgLy8gdGhpcyB3aWxsIGxhdGVyIGJlIGV4cGFuZGVkIHVzaW5nIHRoZSBjdXJyZW50IGNvbnRyb2xsZXIgYW5kIGFjdGlvbiB0bwogIC8vIGFsbG93IGZvciBkaWZmZXJlbnQgc2lkZWJhciBzdGF0ZXMgZm9yIGRpZmZlcmVudCBwYWdlcwogIHZhciBsb2NhbFN0b3JhZ2VLZXkgPSAncmVkbWluZS1zaWRlYmFyLXN0YXRlJzsKICAvLyB0cnVlIGlmIGxvY2FsIHN0b3JhZ2UgaXMgYXZhaWxhYmxlCiAgdmFyIGNhblVzZUxvY2FsU3RvcmFnZSA9IGZ1bmN0aW9uKCl7CiAgICB0cnkgewogICAgICBpZignbG9jYWxTdG9yYWdlJyBpbiB3aW5kb3cpewogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdyZWRtaW5lLnRlc3Quc3RvcmFnZScsICdvaycpOwogICAgICAgIHZhciBpdGVtID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3JlZG1pbmUudGVzdC5zdG9yYWdlJyk7CiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3JlZG1pbmUudGVzdC5zdG9yYWdlJyk7CiAgICAgICAgaWYoaXRlbSA9PT0gJ29rJykgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGVycikge30KICAgIHJldHVybiBmYWxzZTsKICB9KCk7CiAgLy8gZnVuY3Rpb24gdG8gc2V0IGN1cnJlbnQgc2lkZWJhciBzdGF0ZQogIHZhciBzZXRTdGF0ZSA9IGZ1bmN0aW9uKHN0YXRlKXsKICAgIGlmKGNhblVzZUxvY2FsU3RvcmFnZSl7CiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxvY2FsU3RvcmFnZUtleSwgc3RhdGUpOwogICAgfQogIH07CiAgdmFyIGFwcGx5U3RhdGUgPSBmdW5jdGlvbigpewogICAgaWYobWFpbi5oYXNDbGFzcygnY29sbGFwc2Vkc2lkZWJhcicpKXsKICAgICAgdXBkYXRlU1ZHSWNvbihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2lkZWJhci1zd2l0Y2gtYnV0dG9uJyksICdjaGV2cm9ucy1sZWZ0JykKICAgICAgc2V0U3RhdGUoJ2hpZGRlbicpOwogICAgfSBlbHNlIHsKICAgICAgdXBkYXRlU1ZHSWNvbihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2lkZWJhci1zd2l0Y2gtYnV0dG9uJyksICdjaGV2cm9ucy1yaWdodCcpCiAgICAgIHNldFN0YXRlKCd2aXNpYmxlJyk7CiAgICB9CiAgfTsKICB2YXIgc2V0dXBUb2dnbGVCdXR0b24gPSBmdW5jdGlvbigpewogICAgYnV0dG9uID0gJCgnI3NpZGViYXItc3dpdGNoLWJ1dHRvbicpOwogICAgYnV0dG9uLmNsaWNrKGZ1bmN0aW9uKGUpewogICAgICBtYWluLmFkZENsYXNzKCJhbmltYXRlIik7CiAgICAgIG1haW4udG9nZ2xlQ2xhc3MoJ2NvbGxhcHNlZHNpZGViYXInKTsKICAgICAgYXBwbHlTdGF0ZSgpOwogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwogICAgYXBwbHlTdGF0ZSgpOwogIH07CiAgJC5mbi5jb2xsYXBzaWJsZVNpZGViYXIgPSBmdW5jdGlvbigpIHsKICAgIG1haW4gPSB0aGlzOwogICAgLy8gZGV0ZXJtaW5lIHByZXZpb3VzbHkgc3RvcmVkIHNpZGViYXIgc3RhdGUgZm9yIHRoaXMgcGFnZQogICAgaWYoY2FuVXNlTG9jYWxTdG9yYWdlKSB7CiAgICAgIC8vIGRldGVybWluZSBjdXJyZW50IGNvbnRyb2xsZXIvYWN0aW9uIHBhaXIgYW5kIHVzZSB0aGVtIGFzIHN0b3JhZ2Uga2V5CiAgICAgIHZhciBib2R5Q2xhc3MgPSAkKCdib2R5JykuYXR0cignY2xhc3MnKTsKICAgICAgaWYoYm9keUNsYXNzKXsKICAgICAgICB0cnkgewogICAgICAgICAgbG9jYWxTdG9yYWdlS2V5ICs9ICctJyArIGJvZHlDbGFzcy5zcGxpdCgvXHMrLykuZmlsdGVyKGZ1bmN0aW9uKHMpewogICAgICAgICAgICByZXR1cm4gcy5tYXRjaCgvKGFjdGlvbnxjb250cm9sbGVyKS0uKi8pOwogICAgICAgICAgfSkuc29ydCgpLmpvaW4oJy0nKTsKICAgICAgICB9IGNhdGNoKGUpIHsKICAgICAgICAgIC8vIGluIGNhc2Ugb2YgZXJyb3IgKHByb2JhYmx5IElFOCksIGNvbnRpbnVlIHdpdGggdGhlIHVubW9kaWZpZWQga2V5CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciBzdG9yZWRTdGF0ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGxvY2FsU3RvcmFnZUtleSk7CiAgICAgIG1haW4udG9nZ2xlQ2xhc3MoJ2NvbGxhcHNlZHNpZGViYXInLCBzdG9yZWRTdGF0ZSA9PT0gJ2hpZGRlbicpOwogICAgfQogICAgLy8gZHJhdyB0aGUgdG9nZ2xlIGJ1dHRvbiBvbmNlIHRoZSBET00gaXMgY29tcGxldGUKICAgICQoZG9jdW1lbnQpLnJlYWR5KHNldHVwVG9nZ2xlQnV0dG9uKTsKICB9Owp9KGpRdWVyeSkpOwoKJChkb2N1bWVudCkucmVhZHkoc2V0dXBBamF4SW5kaWNhdG9yKTsKJChkb2N1bWVudCkucmVhZHkoaGlkZU9uTG9hZCk7CiQoZG9jdW1lbnQpLnJlYWR5KGFkZEZvcm1PYnNlcnZlcnNGb3JEb3VibGVTdWJtaXQpOwokKGRvY3VtZW50KS5yZWFkeShkZWZhdWx0Rm9jdXMpOwokKGRvY3VtZW50KS5yZWFkeShzZXR1cEF0dGFjaG1lbnREZXRhaWwpOwokKGRvY3VtZW50KS5yZWFkeShzZXR1cFRhYnMpOwokKGRvY3VtZW50KS5yZWFkeShzZXR1cEZpbGVQcmV2aWV3TmF2aWdhdGlvbik7CiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwV2lraVRhYmxlU29ydGFibGVIZWFkZXIpOwokKGRvY3VtZW50KS5vbignZm9jdXMnLCAnW2RhdGEtYXV0by1jb21wbGV0ZT10cnVlXScsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgaW5saW5lQXV0b0NvbXBsZXRlKGV2ZW50LnRhcmdldCk7Cn0pOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgKCkgPT4geyBzZXR1cENvcHlCdXR0b25zVG9QcmVFbGVtZW50cygpOyB9KTsK" | |
| }, | |
| "attachments.js": { | |
| "hash": "934d0bc81faa9e3df22cf0fc2c4873e8", | |
| "path": "/usr/src/redmine/public/assets/attachments-f07e71fc.js", | |
| "base64": "LyoqCiAqIFJlZG1pbmUgLSBwcm9qZWN0IG1hbmFnZW1lbnQgc29mdHdhcmUKICogQ29weXJpZ2h0IChDKSAyMDA2LSAgSmVhbi1QaGlsaXBwZSBMYW5nCiAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCiAqLwoKZnVuY3Rpb24gYWRkRmlsZShpbnB1dEVsLCBmaWxlLCBlYWdlclVwbG9hZCkgewogIHZhciBhdHRhY2htZW50c0Zvcm0gPSAkKGlucHV0RWwpLmNsb3Nlc3QoJy5hdHRhY2htZW50c19mb3JtJykKICB2YXIgYXR0YWNobWVudHNGaWVsZHMgPSBhdHRhY2htZW50c0Zvcm0uZmluZCgnLmF0dGFjaG1lbnRzX2ZpZWxkcycpOwogIHZhciBhdHRhY2htZW50c0ljb25zID0gYXR0YWNobWVudHNGb3JtLmZpbmQoJy5hdHRhY2htZW50c19pY29ucycpOwogIHZhciBhZGRBdHRhY2htZW50ID0gYXR0YWNobWVudHNGb3JtLmZpbmQoJy5hZGRfYXR0YWNobWVudCcpOwogIHZhciBtYXhGaWxlcyA9ICgkKGlucHV0RWwpLmF0dHIoJ211bHRpcGxlJykgPT0gJ211bHRpcGxlJyA/IDEwIDogMSk7CiAgdmFyIGRlbEljb24gPSBhdHRhY2htZW50c0ljb25zLmZpbmQoJ3N2Zy5zdmctZGVsJykuY2xvbmUoKTsKICB2YXIgYXR0YWNobWVudEljb24gPSBhdHRhY2htZW50c0ljb25zLmZpbmQoJ3N2Zy5zdmctYXR0YWNobWVudCcpLmNsb25lKCk7CgogIGlmIChhdHRhY2htZW50c0ZpZWxkcy5jaGlsZHJlbigpLmxlbmd0aCA8IG1heEZpbGVzKSB7CiAgICB2YXIgYXR0YWNobWVudElkID0gYWRkRmlsZS5uZXh0QXR0YWNobWVudElkKys7CiAgICB2YXIgZmlsZVNwYW4gPSAkKCc8c3Bhbj4nLCB7IGlkOiAnYXR0YWNobWVudHNfJyArIGF0dGFjaG1lbnRJZCB9KTsKICAgIHZhciBwYXJhbSA9ICQoaW5wdXRFbCkuZGF0YSgncGFyYW0nKTsKICAgIGlmICghcGFyYW0pIHtwYXJhbSA9ICdhdHRhY2htZW50cyd9OwoKICAgIGZpbGVTcGFuLmFwcGVuZCgKICAgICAgICBhdHRhY2htZW50SWNvbiwKICAgICAgICAkKCc8aW5wdXQ+JywgeyB0eXBlOiAndGV4dCcsICdjbGFzcyc6ICdpY29uIGljb24tYXR0YWNobWVudCBmaWxlbmFtZSByZWFkb25seScsIG5hbWU6IHBhcmFtICsnWycgKyBhdHRhY2htZW50SWQgKyAnXVtmaWxlbmFtZV0nLCByZWFkb25seTogJ3JlYWRvbmx5J30gKS52YWwoZmlsZS5uYW1lKSwKICAgICAgICAkKCc8aW5wdXQ+JywgeyB0eXBlOiAndGV4dCcsICdjbGFzcyc6ICdkZXNjcmlwdGlvbicsIG5hbWU6IHBhcmFtICsgJ1snICsgYXR0YWNobWVudElkICsgJ11bZGVzY3JpcHRpb25dJywgbWF4bGVuZ3RoOiAyNTUsIHBsYWNlaG9sZGVyOiAkKGlucHV0RWwpLmRhdGEoJ2Rlc2NyaXB0aW9uLXBsYWNlaG9sZGVyJykgfSApLnRvZ2dsZSghZWFnZXJVcGxvYWQpLAogICAgICAgICQoJzxpbnB1dD4nLCB7IHR5cGU6ICdoaWRkZW4nLCAnY2xhc3MnOiAndG9rZW4nLCBuYW1lOiBwYXJhbSArICdbJyArIGF0dGFjaG1lbnRJZCArICddW3Rva2VuXSd9ICksCiAgICAgICAgJCgnPGE+JywgeyBocmVmOiAiIyIsICdjbGFzcyc6ICdpY29uLW9ubHkgaWNvbi1kZWwgcmVtb3ZlLXVwbG9hZCcgfSkuYXBwZW5kKGRlbEljb24pLmNsaWNrKHJlbW92ZUZpbGUpLnRvZ2dsZSghZWFnZXJVcGxvYWQpCiAgICApLmFwcGVuZFRvKGF0dGFjaG1lbnRzRmllbGRzKTsKCgogICAgaWYgKCQoaW5wdXRFbCkuZGF0YSgnZGVzY3JpcHRpb24nKSA9PSAwKSB7CiAgICAgIGZpbGVTcGFuLmZpbmQoJ2lucHV0LmRlc2NyaXB0aW9uJykucmVtb3ZlKCk7CiAgICB9CgogICAgaWYoZWFnZXJVcGxvYWQpIHsKICAgICAgYWpheFVwbG9hZChmaWxlLCBhdHRhY2htZW50SWQsIGZpbGVTcGFuLCBpbnB1dEVsKTsKICAgIH0KCiAgICBhZGRBdHRhY2htZW50LnRvZ2dsZShhdHRhY2htZW50c0ZpZWxkcy5jaGlsZHJlbigpLmxlbmd0aCA8IG1heEZpbGVzKTsKICAgIHJldHVybiBhdHRhY2htZW50SWQ7CiAgfQogIHJldHVybiBudWxsOwp9CgphZGRGaWxlLm5leHRBdHRhY2htZW50SWQgPSAxOwoKZnVuY3Rpb24gYWpheFVwbG9hZChmaWxlLCBhdHRhY2htZW50SWQsIGZpbGVTcGFuLCBpbnB1dEVsKSB7CiAgbGV0IGF0dGFjaG1lbnRJY29uID0gJChmaWxlU3BhbikuZmluZCgnc3ZnLnN2Zy1hdHRhY2htZW50Jyk7CgogIGZ1bmN0aW9uIG9uTG9hZHN0YXJ0KGUpIHsKICAgIGZpbGVTcGFuLnJlbW92ZUNsYXNzKCdhamF4LXdhaXRpbmcnKTsKICAgIGZpbGVTcGFuLmFkZENsYXNzKCdhamF4LWxvYWRpbmcnKTsKICAgIGF0dGFjaG1lbnRJY29uLmFkZENsYXNzKCdzdmctbG9hZGVyJyk7CiAgICB1cGRhdGVTVkdJY29uKGF0dGFjaG1lbnRJY29uWzBdLCAnbG9hZGVyJykKICAgICQoJ2lucHV0OnN1Ym1pdCcsICQodGhpcykucGFyZW50cygnZm9ybScpKS5hdHRyKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpOwogIH0KCiAgZnVuY3Rpb24gb25Qcm9ncmVzcyhlKSB7CiAgICBpZihlLmxlbmd0aENvbXB1dGFibGUpIHsKICAgICAgdGhpcy5wcm9ncmVzc2JhciggJ3ZhbHVlJywgZS5sb2FkZWQgKiAxMDAgLyBlLnRvdGFsICk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhY3R1YWxVcGxvYWQoZmlsZSwgYXR0YWNobWVudElkLCBmaWxlU3BhbiwgaW5wdXRFbCkgewoKICAgIGFqYXhVcGxvYWQudXBsb2FkaW5nKys7CgogICAgdXBsb2FkQmxvYihmaWxlLCAkKGlucHV0RWwpLmRhdGEoJ3VwbG9hZC1wYXRoJyksIGF0dGFjaG1lbnRJZCwgewogICAgICAgIGxvYWRzdGFydEV2ZW50SGFuZGxlcjogb25Mb2Fkc3RhcnQuYmluZChwcm9ncmVzc1NwYW4pLAogICAgICAgIHByb2dyZXNzRXZlbnRIYW5kbGVyOiBvblByb2dyZXNzLmJpbmQocHJvZ3Jlc3NTcGFuKQogICAgICB9KQogICAgICAuZG9uZShmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICBhZGRJbmxpbmVBdHRhY2htZW50TWFya3VwKGZpbGUpOwogICAgICAgIHByb2dyZXNzU3Bhbi5wcm9ncmVzc2JhciggJ3ZhbHVlJywgMTAwICkucmVtb3ZlKCk7CiAgICAgICAgZmlsZVNwYW4uZmluZCgnaW5wdXQuZGVzY3JpcHRpb24sIGEnKS5jc3MoJ2Rpc3BsYXknLCAnaW5saW5lLWZsZXgnKTsKICAgICAgfSkKICAgICAgLmZhaWwoZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgcHJvZ3Jlc3NTcGFuLnRleHQocmVzdWx0LnN0YXR1c1RleHQpOwogICAgICB9KS5hbHdheXMoZnVuY3Rpb24oKSB7CiAgICAgICAgYWpheFVwbG9hZC51cGxvYWRpbmctLTsKICAgICAgICBmaWxlU3Bhbi5yZW1vdmVDbGFzcygnYWpheC1sb2FkaW5nJyk7CiAgICAgICAgYXR0YWNobWVudEljb24ucmVtb3ZlQ2xhc3MoJ3N2Zy1sb2FkZXInKTsKICAgICAgICB1cGRhdGVTVkdJY29uKGF0dGFjaG1lbnRJY29uWzBdLCAnYXR0YWNobWVudCcpOwogICAgICAgIHZhciBmb3JtID0gZmlsZVNwYW4ucGFyZW50cygnZm9ybScpOwogICAgICAgIGlmIChmb3JtLnF1ZXVlKCd1cGxvYWQnKS5sZW5ndGggPT0gMCAmJiBhamF4VXBsb2FkLnVwbG9hZGluZyA9PSAwKSB7CiAgICAgICAgICAkKCdpbnB1dDpzdWJtaXQnLCBmb3JtKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpOwogICAgICAgIH0KICAgICAgICBmb3JtLmRlcXVldWUoJ3VwbG9hZCcpOwogICAgICB9KTsKICB9CgogIHZhciBwcm9ncmVzc1NwYW4gPSAkKCc8ZGl2PicpLmluc2VydEFmdGVyKGZpbGVTcGFuLmZpbmQoJ2lucHV0LmZpbGVuYW1lJykpOwogIHByb2dyZXNzU3Bhbi5wcm9ncmVzc2JhcigpOwogIGZpbGVTcGFuLmFkZENsYXNzKCdhamF4LXdhaXRpbmcnKTsKICB1cGRhdGVTVkdJY29uKGF0dGFjaG1lbnRJY29uWzBdLCAnaG91cmdsYXNzJyk7CgogIHZhciBtYXhTeW5jVXBsb2FkID0gJChpbnB1dEVsKS5kYXRhKCdtYXgtY29uY3VycmVudC11cGxvYWRzJyk7CgogIGlmKG1heFN5bmNVcGxvYWQgPT0gbnVsbCB8fCBtYXhTeW5jVXBsb2FkIDw9IDAgfHwgYWpheFVwbG9hZC51cGxvYWRpbmcgPCBtYXhTeW5jVXBsb2FkKQogICAgYWN0dWFsVXBsb2FkKGZpbGUsIGF0dGFjaG1lbnRJZCwgZmlsZVNwYW4sIGlucHV0RWwpOwogIGVsc2UKICAgICQoaW5wdXRFbCkucGFyZW50cygnZm9ybScpLnF1ZXVlKCd1cGxvYWQnLCBhY3R1YWxVcGxvYWQuYmluZCh0aGlzLCBmaWxlLCBhdHRhY2htZW50SWQsIGZpbGVTcGFuLCBpbnB1dEVsKSk7Cn0KCmFqYXhVcGxvYWQudXBsb2FkaW5nID0gMDsKCmZ1bmN0aW9uIHJlbW92ZUZpbGUoKSB7CiAgJCh0aGlzKS5jbG9zZXN0KCcuYXR0YWNobWVudHNfZm9ybScpLmZpbmQoJy5hZGRfYXR0YWNobWVudCcpLnNob3coKTsKICAkKHRoaXMpLnBhcmVudCgnc3BhbicpLnJlbW92ZSgpOwogIHJldHVybiBmYWxzZTsKfQoKZnVuY3Rpb24gdXBsb2FkQmxvYihibG9iLCB1cGxvYWRVcmwsIGF0dGFjaG1lbnRJZCwgb3B0aW9ucykgewoKICB2YXIgYWN0dWFsT3B0aW9ucyA9ICQuZXh0ZW5kKHsKICAgIGxvYWRzdGFydEV2ZW50SGFuZGxlcjogJC5ub29wLAogICAgcHJvZ3Jlc3NFdmVudEhhbmRsZXI6ICQubm9vcAogIH0sIG9wdGlvbnMpOwoKICB1cGxvYWRVcmwgPSB1cGxvYWRVcmwgKyAnP2F0dGFjaG1lbnRfaWQ9JyArIGF0dGFjaG1lbnRJZDsKICBpZiAoYmxvYiBpbnN0YW5jZW9mIHdpbmRvdy5CbG9iKSB7CiAgICB1cGxvYWRVcmwgKz0gJyZmaWxlbmFtZT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGJsb2IubmFtZSk7CiAgICB1cGxvYWRVcmwgKz0gJyZjb250ZW50X3R5cGU9JyArIGVuY29kZVVSSUNvbXBvbmVudChibG9iLnR5cGUpOwogIH0KCiAgcmV0dXJuICQuYWpheCh1cGxvYWRVcmwsIHsKICAgIHR5cGU6ICdQT1NUJywKICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgIGJlZm9yZVNlbmQ6IGZ1bmN0aW9uKGpxWGhyLCBzZXR0aW5ncykgewogICAgICBqcVhoci5zZXRSZXF1ZXN0SGVhZGVyKCdBY2NlcHQnLCAnYXBwbGljYXRpb24vanMnKTsKICAgICAgLy8gYXR0YWNoIHByb3BlciBGaWxlIG9iamVjdAogICAgICBzZXR0aW5ncy5kYXRhID0gYmxvYjsKICAgIH0sCiAgICB4aHI6IGZ1bmN0aW9uKCkgewogICAgICB2YXIgeGhyID0gJC5hamF4U2V0dGluZ3MueGhyKCk7CiAgICAgIHhoci51cGxvYWQub25sb2Fkc3RhcnQgPSBhY3R1YWxPcHRpb25zLmxvYWRzdGFydEV2ZW50SGFuZGxlcjsKICAgICAgeGhyLnVwbG9hZC5vbnByb2dyZXNzID0gYWN0dWFsT3B0aW9ucy5wcm9ncmVzc0V2ZW50SGFuZGxlcjsKICAgICAgcmV0dXJuIHhocjsKICAgIH0sCiAgICBkYXRhOiBibG9iLAogICAgY2FjaGU6IGZhbHNlLAogICAgcHJvY2Vzc0RhdGE6IGZhbHNlCiAgfSk7Cn0KCmZ1bmN0aW9uIGFkZElucHV0RmlsZXMoaW5wdXRFbCkgewogIHZhciBhdHRhY2htZW50c0ZpZWxkcyA9ICQoaW5wdXRFbCkuY2xvc2VzdCgnLmF0dGFjaG1lbnRzX2Zvcm0nKS5maW5kKCcuYXR0YWNobWVudHNfZmllbGRzJyk7CiAgdmFyIGFkZEF0dGFjaG1lbnQgPSAkKGlucHV0RWwpLmNsb3Nlc3QoJy5hdHRhY2htZW50c19mb3JtJykuZmluZCgnLmFkZF9hdHRhY2htZW50Jyk7CiAgdmFyIGNsZWFyZWRGaWxlSW5wdXQgPSAkKGlucHV0RWwpLmNsb25lKCkudmFsKCcnKTsKICB2YXIgc2l6ZUV4Y2VlZGVkID0gZmFsc2U7CiAgdmFyIHBhcmFtID0gJChpbnB1dEVsKS5kYXRhKCdwYXJhbScpOwogIGlmICghcGFyYW0pIHtwYXJhbSA9ICdhdHRhY2htZW50cyd9OwoKICBpZiAoJC5hamF4U2V0dGluZ3MueGhyKCkudXBsb2FkICYmIGlucHV0RWwuZmlsZXMpIHsKICAgIC8vIHVwbG9hZCBmaWxlcyB1c2luZyBhamF4CiAgICBzaXplRXhjZWVkZWQgPSB1cGxvYWRBbmRBdHRhY2hGaWxlcyhpbnB1dEVsLmZpbGVzLCBpbnB1dEVsKTsKICAgICQoaW5wdXRFbCkucmVtb3ZlKCk7CiAgfSBlbHNlIHsKICAgIC8vIGJyb3dzZXIgbm90IHN1cHBvcnRpbmcgdGhlIGZpbGUgQVBJLCB1cGxvYWQgb24gZm9ybSBzdWJtaXNzaW9uCiAgICB2YXIgYXR0YWNobWVudElkOwogICAgdmFyIGFGaWxlbmFtZSA9IGlucHV0RWwudmFsdWUuc3BsaXQoL1wvfFxcLyk7CiAgICBhdHRhY2htZW50SWQgPSBhZGRGaWxlKGlucHV0RWwsIHsgbmFtZTogYUZpbGVuYW1lWyBhRmlsZW5hbWUubGVuZ3RoIC0gMSBdIH0sIGZhbHNlKTsKICAgIGlmIChhdHRhY2htZW50SWQpIHsKICAgICAgJChpbnB1dEVsKS5hdHRyKHsgbmFtZTogcGFyYW0gKyAnWycgKyBhdHRhY2htZW50SWQgKyAnXVtmaWxlXScsIHN0eWxlOiAnZGlzcGxheTpub25lOycgfSkuYXBwZW5kVG8oJyNhdHRhY2htZW50c18nICsgYXR0YWNobWVudElkKTsKICAgIH0KICB9CgogIGNsZWFyZWRGaWxlSW5wdXQucHJlcGVuZFRvKGFkZEF0dGFjaG1lbnQpOwp9CgpmdW5jdGlvbiB1cGxvYWRBbmRBdHRhY2hGaWxlcyhmaWxlcywgaW5wdXRFbCkgewoKICB2YXIgbWF4RmlsZVNpemUgPSAkKGlucHV0RWwpLmRhdGEoJ21heC1maWxlLXNpemUnKTsKICB2YXIgbWF4RmlsZVNpemVFeGNlZWRlZCA9ICQoaW5wdXRFbCkuZGF0YSgnbWF4LWZpbGUtc2l6ZS1tZXNzYWdlJyk7CgogIHZhciBzaXplRXhjZWVkZWQgPSBmYWxzZTsKICB2YXIgZmlsZXNMZW5ndGggPSAkKGlucHV0RWwpLmNsb3Nlc3QoJy5hdHRhY2htZW50c19mb3JtJykuZmluZCgnLmF0dGFjaG1lbnRzX2ZpZWxkcycpLmNoaWxkcmVuKCkubGVuZ3RoICsgZmlsZXMubGVuZ3RoCiAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLnNpemUgJiYgbWF4RmlsZVNpemUgIT0gbnVsbCAmJiB0aGlzLnNpemUgPiBwYXJzZUludChtYXhGaWxlU2l6ZSkpIHtzaXplRXhjZWVkZWQ9dHJ1ZTt9CiAgfSk7CiAgaWYgKHNpemVFeGNlZWRlZCkgewogICAgd2luZG93LmFsZXJ0KG1heEZpbGVTaXplRXhjZWVkZWQpOwogIH0gZWxzZSB7CiAgICAkLmVhY2goZmlsZXMsIGZ1bmN0aW9uKCkge2FkZEZpbGUoaW5wdXRFbCwgdGhpcywgdHJ1ZSk7fSk7CiAgfQoKICBpZiAoZmlsZXNMZW5ndGggPiAoJChpbnB1dEVsKS5hdHRyKCdtdWx0aXBsZScpID09ICdtdWx0aXBsZScgPyAxMCA6IDEpKSB7CiAgICB3aW5kb3cuYWxlcnQoJChpbnB1dEVsKS5kYXRhKCdtYXgtbnVtYmVyLW9mLWZpbGVzLW1lc3NhZ2UnKSk7CiAgfQogIHJldHVybiBzaXplRXhjZWVkZWQ7Cn0KCmZ1bmN0aW9uIGhhbmRsZUZpbGVEcm9wRXZlbnQoZSkgewoKICAkKHRoaXMpLnJlbW92ZUNsYXNzKCdmaWxlb3ZlcicpOwogIGJsb2NrRXZlbnRQcm9wYWdhdGlvbihlKTsKCiAgaWYgKCQuaW5BcnJheSgnRmlsZXMnLCBlLmRhdGFUcmFuc2Zlci50eXBlcykgPiAtMSkgewogICAgaGFuZGxlRmlsZURyb3BFdmVudC50YXJnZXQgPSBlLnRhcmdldDsKICAgIGlmICgkKHRoaXMpLmhhc0NsYXNzKCdjdXN0b20tZmllbGQtZmlsZWRyb3BsaXN0bmVyJykpewogICAgICB1cGxvYWRBbmRBdHRhY2hGaWxlcyhlLmRhdGFUcmFuc2Zlci5maWxlcywgJCh0aGlzKS5maW5kKCdpbnB1dDpmaWxlLmN1c3RvbS1maWVsZC1maWxlZHJvcCcpLmZpcnN0KCkpOwogICAgfSBlbHNlIHsKICAgICAgdXBsb2FkQW5kQXR0YWNoRmlsZXMoZS5kYXRhVHJhbnNmZXIuZmlsZXMsICQodGhpcykuZmluZCgnaW5wdXQ6ZmlsZS5maWxlZHJvcCcpLmZpcnN0KCkpOwogICAgfQogIH0KfQpoYW5kbGVGaWxlRHJvcEV2ZW50LnRhcmdldCA9ICcnOwoKZnVuY3Rpb24gZHJhZ092ZXJIYW5kbGVyKGUpIHsKICAkKHRoaXMpLmFkZENsYXNzKCdmaWxlb3ZlcicpOwogIGJsb2NrRXZlbnRQcm9wYWdhdGlvbihlKTsKICBlLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ2NvcHknOwp9CgpmdW5jdGlvbiBkcmFnT3V0SGFuZGxlcihlKSB7CiAgJCh0aGlzKS5yZW1vdmVDbGFzcygnZmlsZW92ZXInKTsKICBibG9ja0V2ZW50UHJvcGFnYXRpb24oZSk7Cn0KCmZ1bmN0aW9uIHNldHVwRmlsZURyb3AoKSB7CiAgaWYgKHdpbmRvdy5GaWxlICYmIHdpbmRvdy5GaWxlTGlzdCAmJiB3aW5kb3cuUHJvZ3Jlc3NFdmVudCAmJiB3aW5kb3cuRm9ybURhdGEpIHsKCiAgICAkLmV2ZW50LmFkZFByb3AoJ2RhdGFUcmFuc2ZlcicpOwoKICAgICQoJ2Zvcm0gZGl2LmJveDpub3QoLmZpbGVkcm9wbGlzdG5lciknKS5oYXMoJ2lucHV0OmZpbGUuZmlsZWRyb3AnKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAkKHRoaXMpLm9uKHsKICAgICAgICAgIGRyYWdvdmVyOiBkcmFnT3ZlckhhbmRsZXIsCiAgICAgICAgICBkcmFnbGVhdmU6IGRyYWdPdXRIYW5kbGVyLAogICAgICAgICAgZHJvcDogaGFuZGxlRmlsZURyb3BFdmVudCwKICAgICAgICAgIHBhc3RlOiBjb3B5SW1hZ2VGcm9tQ2xpcGJvYXJkCiAgICAgIH0pLmFkZENsYXNzKCdmaWxlZHJvcGxpc3RuZXInKTsKICAgIH0pOwoKICAgICQoJ2Zvcm0gZGl2LmJveCBpbnB1dDpmaWxlLmN1c3RvbS1maWVsZC1maWxlZHJvcCcpLmNsb3Nlc3QoJ3AnKS5ub3QoJy5jdXN0b20tZmllbGQtZmlsZWRyb3BsaXN0bmVyJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgJCh0aGlzKS5vbih7CiAgICAgICAgICBkcmFnb3ZlcjogZHJhZ092ZXJIYW5kbGVyLAogICAgICAgICAgZHJhZ2xlYXZlOiBkcmFnT3V0SGFuZGxlciwKICAgICAgICAgIGRyb3A6IGhhbmRsZUZpbGVEcm9wRXZlbnQKICAgICAgfSkuYWRkQ2xhc3MoJ2N1c3RvbS1maWVsZC1maWxlZHJvcGxpc3RuZXInKTsKICAgIH0pOwogIH0KfQoKZnVuY3Rpb24gZ2V0SW1hZ2VXaWR0aChmaWxlKSB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgIGlmIChmaWxlLnR5cGUuc3RhcnRzV2l0aCgiaW1hZ2UvIikpIHsKICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7CiAgICAgICAgaW1nLm9ubG9hZCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmVzb2x2ZShpbWcud2lkdGgpOwogICAgICAgIH07CiAgICAgICAgaW1nLm9uZXJyb3IgPSByZWplY3Q7CiAgICAgICAgaW1nLnNyYyA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7CiAgICAgIH07CiAgICAgIHJlYWRlci5vbmVycm9yID0gcmVqZWN0OwogICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJlc29sdmUoMCk7CiAgICB9CiAgfSk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGdldElubGluZUF0dGFjaG1lbnRNYXJrdXAoZmlsZSkgewogIGNvbnN0IHNhbml0aXplZEZpbGVuYW1lID0gZmlsZS5uYW1lLnJlcGxhY2UoL1tcL1w/XCVcKlw6XHxcIlwnPD5cblxyXSsvZywgJ18nKTsKICBjb25zdCBpbmxpbmVGaWxlbmFtZSA9IGVuY29kZVVSSUNvbXBvbmVudChzYW5pdGl6ZWRGaWxlbmFtZSkKICAgIC5yZXBsYWNlKC9bISgpXS9nLCBmdW5jdGlvbihtYXRjaCkgeyByZXR1cm4gIiUiICsgbWF0Y2guY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikgfSk7CgogIGNvbnN0IGlzRnJvbUNsaXBib2FyZCA9IC9eY2xpcGJvYXJkLVxkezEyfS1bYS16MC05XXs1fVwuXHcrJC8udGVzdChmaWxlLm5hbWUpOwogIGxldCBpbWFnZURpc3BsYXlXaWR0aDsKICBpZiAoaXNGcm9tQ2xpcGJvYXJkKSB7CiAgICBjb25zdCBpbWFnZVdpZHRoID0gYXdhaXQgZ2V0SW1hZ2VXaWR0aChmaWxlKS5jYXRjaCgoKSA9PiAwKTsKICAgIGltYWdlRGlzcGxheVdpZHRoID0gTWF0aC5yb3VuZChpbWFnZVdpZHRoIC8gd2luZG93LmRldmljZVBpeGVsUmF0aW8pOwogIH0KICBjb25zdCBoYXNWYWxpZFdpZHRoID0gaXNGcm9tQ2xpcGJvYXJkICYmIGltYWdlRGlzcGxheVdpZHRoID4gMDsKCiAgc3dpdGNoIChkb2N1bWVudC5ib2R5LmdldEF0dHJpYnV0ZSgnZGF0YS10ZXh0LWZvcm1hdHRpbmcnKSkgewogICAgY2FzZSAndGV4dGlsZSc6CiAgICAgIHJldHVybiBoYXNWYWxpZFdpZHRoCiAgICAgICAgPyBgIXt3aWR0aDogJHtpbWFnZURpc3BsYXlXaWR0aH1weH0uJHtpbmxpbmVGaWxlbmFtZX0hYAogICAgICAgIDogYCEke2lubGluZUZpbGVuYW1lfSFgOwogICAgY2FzZSAnY29tbW9uX21hcmsnOgogICAgICByZXR1cm4gaGFzVmFsaWRXaWR0aAogICAgICAgID8gYDxpbWcgc3R5bGU9IndpZHRoOiAke2ltYWdlRGlzcGxheVdpZHRofXB4OyIgc3JjPSIke2lubGluZUZpbGVuYW1lfSI+PGJyPmAKICAgICAgICA6IGAhW10oJHtpbmxpbmVGaWxlbmFtZX0pYDsKICAgIGRlZmF1bHQ6CiAgICAgIC8vIFRleHQgZm9ybWF0dGluZyBpcyAibm9uZSIgb3IgdW5rbm93bgogICAgICByZXR1cm4gJyc7CiAgfQp9CgpmdW5jdGlvbiBhZGRJbmxpbmVBdHRhY2htZW50TWFya3VwKGZpbGUpIHsKICAvLyBpbnNlcnQgdXBsb2FkZWQgaW1hZ2UgaW5saW5lIGlmIGRyb3BwZWQgYXJlYSBpcyBjdXJyZW50bHkgZm9jdXNlZCB0ZXh0YXJlYQogIGlmKCQoaGFuZGxlRmlsZURyb3BFdmVudC50YXJnZXQpLmhhc0NsYXNzKCd3aWtpLWVkaXQnKSAmJiAkLmluQXJyYXkoZmlsZS50eXBlLCB3aW5kb3cud2lraUltYWdlTWltZVR5cGVzKSA+IC0xKSB7CiAgICB2YXIgJHRleHRhcmVhID0gJChoYW5kbGVGaWxlRHJvcEV2ZW50LnRhcmdldCk7CiAgICB2YXIgY3Vyc29yUG9zaXRpb24gPSAkdGV4dGFyZWEucHJvcCgnc2VsZWN0aW9uU3RhcnQnKTsKICAgIHZhciBkZXNjcmlwdGlvbiA9ICR0ZXh0YXJlYS52YWwoKTsKICAgIHZhciBuZXdMaW5lQmVmb3JlID0gdHJ1ZTsKICAgIHZhciBuZXdMaW5lQWZ0ZXIgPSB0cnVlOwogICAgaWYoY3Vyc29yUG9zaXRpb24gPT09IDAgfHwgZGVzY3JpcHRpb24uc3Vic3RyKGN1cnNvclBvc2l0aW9uLTEsMSkubWF0Y2goL1xyfFxuLykpIHsKICAgICAgbmV3TGluZUJlZm9yZSA9IGZhbHNlOwogICAgfQogICAgaWYoZGVzY3JpcHRpb24uc3Vic3RyKGN1cnNvclBvc2l0aW9uLDEpLm1hdGNoKC9ccnxcbi8pKSB7CiAgICAgIG5ld0xpbmVBZnRlciA9IGZhbHNlOwogICAgfQoKICAgIGdldElubGluZUF0dGFjaG1lbnRNYXJrdXAoZmlsZSkKICAgICAgLnRoZW4oaW1hZ2VNYXJrdXAgPT4gewogICAgICAgICR0ZXh0YXJlYS52YWwoCiAgICAgICAgICBkZXNjcmlwdGlvbi5zdWJzdHJpbmcoMCwgY3Vyc29yUG9zaXRpb24pCiAgICAgICAgICArIChuZXdMaW5lQmVmb3JlID8gJ1xuJyA6ICcnKQogICAgICAgICAgKyBpbWFnZU1hcmt1cAogICAgICAgICAgKyAobmV3TGluZUFmdGVyID8gJ1xuJyA6ICcnKQogICAgICAgICAgKyBkZXNjcmlwdGlvbi5zdWJzdHJpbmcoY3Vyc29yUG9zaXRpb24sIGRlc2NyaXB0aW9uLmxlbmd0aCkKICAgICAgICApOwogICAgICB9KQoKICAgIC8vIG1vdmUgY3Vyc29yIGludG8gbmV4dCBsaW5lCiAgICBjdXJzb3JQb3NpdGlvbiA9ICR0ZXh0YXJlYS5wcm9wKCdzZWxlY3Rpb25TdGFydCcpOwogICAgJHRleHRhcmVhLnByb3AoewogICAgICAnc2VsZWN0aW9uU3RhcnQnOiBjdXJzb3JQb3NpdGlvbiArIDEsCiAgICAgICdzZWxlY3Rpb25FbmQnOiBjdXJzb3JQb3NpdGlvbiArIDEKICAgIH0pOwoKICB9Cn0KCmZ1bmN0aW9uIGNvcHlJbWFnZUZyb21DbGlwYm9hcmQoZSkgewogIGlmICghJChlLnRhcmdldCkuaGFzQ2xhc3MoJ3dpa2ktZWRpdCcpKSB7IHJldHVybjsgfQogIHZhciBjbGlwYm9hcmREYXRhID0gZS5jbGlwYm9hcmREYXRhIHx8IGUub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhCiAgaWYgKCFjbGlwYm9hcmREYXRhKSB7IHJldHVybjsgfQogIGlmIChjbGlwYm9hcmREYXRhLnR5cGVzLnNvbWUoZnVuY3Rpb24odCl7IHJldHVybiAvXnRleHRcL3BsYWluJC8udGVzdCh0KTsgfSkpIHsgcmV0dXJuOyB9CgogIHZhciBmaWxlcyA9IGNsaXBib2FyZERhdGEuZmlsZXMKICBmb3IgKHZhciBpID0gMCA7IGkgPCBmaWxlcy5sZW5ndGggOyBpKyspIHsKICAgIHZhciBmaWxlID0gZmlsZXNbaV07CiAgICBpZiAoZmlsZS50eXBlLmluZGV4T2YoImltYWdlIikgIT0gLTEpIHsKICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgpOwogICAgICB2YXIgZmlsZW5hbWUgPSAnY2xpcGJvYXJkLScKICAgICAgICArIGRhdGUuZ2V0RnVsbFllYXIoKQogICAgICAgICsgKCcwJysoZGF0ZS5nZXRNb250aCgpKzEpKS5zbGljZSgtMikKICAgICAgICArICgnMCcrZGF0ZS5nZXREYXRlKCkpLnNsaWNlKC0yKQogICAgICAgICsgKCcwJytkYXRlLmdldEhvdXJzKCkpLnNsaWNlKC0yKQogICAgICAgICsgKCcwJytkYXRlLmdldE1pbnV0ZXMoKSkuc2xpY2UoLTIpCiAgICAgICAgKyAnLScgKyByYW5kb21LZXkoNSkudG9Mb2NhbGVMb3dlckNhc2UoKQogICAgICAgICsgJy4nICsgZmlsZS5uYW1lLnNwbGl0KCcuJykucG9wKCk7CgogICAgICAvLyBnZXQgaW5wdXQgZmlsZSBpbiB0aGUgY2xvc2VzdCBmb3JtCiAgICAgIHZhciBpbnB1dEVsID0gJCh0aGlzKS5jbG9zZXN0KCJmb3JtIikuZmluZCgnaW5wdXQ6ZmlsZS5maWxlZHJvcCcpOwogICAgICBoYW5kbGVGaWxlRHJvcEV2ZW50LnRhcmdldCA9IGUudGFyZ2V0OwogICAgICBhZGRGaWxlKGlucHV0RWwsIG5ldyBGaWxlKFtmaWxlXSwgZmlsZW5hbWUsIHsgdHlwZTogZmlsZS50eXBlIH0pLCB0cnVlKTsKICAgIH0KICB9Cn0KCiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwRmlsZURyb3ApOwokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICQoImlucHV0LmRlbGV0ZWRfYXR0YWNobWVudCIpLmNoYW5nZShmdW5jdGlvbigpewogICAgJCh0aGlzKS5wYXJlbnRzKCcuZXhpc3RpbmctYXR0YWNobWVudCcpLnRvZ2dsZUNsYXNzKCdkZWxldGVkJywgJCh0aGlzKS5pcygiOmNoZWNrZWQiKSk7CiAgfSkuY2hhbmdlKCk7Cn0pOwo=" | |
| } | |
| }, | |
| "6.1.0": { | |
| "application.js": { | |
| "hash": "c8a83c2e17a6d7c44dbda4672d23e54d", | |
| "path": "/usr/src/redmine/public/assets/application-legacy-d7c89bc3.js", | |
| "base64": "LyoqCiAqIFJlZG1pbmUgLSBwcm9qZWN0IG1hbmFnZW1lbnQgc29mdHdhcmUKICogQ29weXJpZ2h0IChDKSAyMDA2LSAgSmVhbi1QaGlsaXBwZSBMYW5nCiAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCiAqLwoKZnVuY3Rpb24gc2FuaXRpemVIVE1MKHN0cmluZykgewogIHZhciB0ZW1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIHRlbXAudGV4dENvbnRlbnQgPSBzdHJpbmc7CiAgcmV0dXJuIHRlbXAuaW5uZXJIVE1MOwp9CgpmdW5jdGlvbiBjaGVja0FsbChpZCwgY2hlY2tlZCkgewogICQoJyMnK2lkKS5maW5kKCdpbnB1dFt0eXBlPWNoZWNrYm94XTplbmFibGVkJykucHJvcCgnY2hlY2tlZCcsIGNoZWNrZWQpOwp9CgpmdW5jdGlvbiB0b2dnbGVDaGVja2JveGVzQnlTZWxlY3RvcihzZWxlY3RvcikgewogIHZhciBhbGxfY2hlY2tlZCA9IHRydWU7CiAgJChzZWxlY3RvcikuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgaWYgKCEkKHRoaXMpLmlzKCc6Y2hlY2tlZCcpKSB7IGFsbF9jaGVja2VkID0gZmFsc2U7IH0KICB9KTsKICAkKHNlbGVjdG9yKS5wcm9wKCdjaGVja2VkJywgIWFsbF9jaGVja2VkKS50cmlnZ2VyKCdjaGFuZ2UnKTsKfQoKZnVuY3Rpb24gc2hvd0FuZFNjcm9sbFRvKGlkLCBmb2N1cykgewogIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOwogIGlmIChlbCkgewogICAgZWwuc3R5bGUuZGlzcGxheSA9ICcnOyAvLyBzaG93KCkKICAgIGlmIChmb2N1cykgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZm9jdXMpPy5mb2N1cyh7IHByZXZlbnRTY3JvbGw6IHRydWUgfSk7CiAgICBlbC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnaW5zdGFudCcgfSk7CiAgfQp9CgpmdW5jdGlvbiB0b2dnbGVSb3dHcm91cChlbCkgewogIHZhciB0ciA9ICQoZWwpLnBhcmVudHMoJ3RyJykuZmlyc3QoKTsKICB2YXIgbiA9IHRyLm5leHQoKTsKICB0ci50b2dnbGVDbGFzcygnb3BlbicpOwogICQoZWwpLnRvZ2dsZUNsYXNzKCdpY29uLWV4cGFuZGVkIGljb24tY29sbGFwc2VkJyk7CiAgdG9nZ2xlRXhwZW5kQ29sbGFwc2VJY29uKGVsKQogIHdoaWxlIChuLmxlbmd0aCAmJiAhbi5oYXNDbGFzcygnZ3JvdXAnKSkgewogICAgbi50b2dnbGUoKTsKICAgIG4gPSBuLm5leHQoJ3RyJyk7CiAgfQp9CgpmdW5jdGlvbiB0b2dnbGVFeHBlbmRDb2xsYXBzZUljb24oZWwpIHsKICBjb25zdCBzdmcgPSBlbC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc3ZnJykuaXRlbSgwKQoKICBpZiAoc3ZnID09PSBudWxsKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBpZiAoZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdpY29uLWV4cGFuZGVkJykpIHsKICAgIHVwZGF0ZVNWR0ljb24oc3ZnLCAnYW5nbGUtZG93bicpCiAgICBzdmcuY2xhc3NMaXN0LnJlbW92ZSgnaWNvbi1ydGwnKQogIH0gZWxzZSB7CiAgICB1cGRhdGVTVkdJY29uKHN2ZywgJ2FuZ2xlLXJpZ2h0JykKICAgIHN2Zy5jbGFzc0xpc3QuYWRkKCdpY29uLXJ0bCcpCiAgfQp9CgpmdW5jdGlvbiB1cGRhdGVTVkdJY29uKGVsZW1lbnQsIGljb24pIHsKICBjb25zdCBpY29uRWxlbWVudCA9IGVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInVzZSIpLml0ZW0oMCkKCiAgaWYgKGljb25FbGVtZW50ID09PSBudWxsKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBjb25zdCBpY29uUGF0aCA9IGljb25FbGVtZW50LmdldEF0dHJpYnV0ZSgnaHJlZicpOwogIGljb25FbGVtZW50LnNldEF0dHJpYnV0ZSgnaHJlZicsIGljb25QYXRoLnJlcGxhY2UoLyMuKiQvZywgIiNpY29uLS0iICsgaWNvbikpCn0KCmZ1bmN0aW9uIGNyZWF0ZVNWR0ljb24oaWNvbikgewogIGNvbnN0IGNsb25lZEljb24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjaWNvbi1jb3B5LXNvdXJjZSBzdmcnKS5jbG9uZU5vZGUodHJ1ZSk7CiAgdXBkYXRlU1ZHSWNvbihjbG9uZWRJY29uLCBpY29uKTsKICByZXR1cm4gY2xvbmVkSWNvbgp9CgpmdW5jdGlvbiBjb2xsYXBzZUFsbFJvd0dyb3VwcyhlbCkgewogIHZhciB0Ym9keSA9ICQoZWwpLnBhcmVudHMoJ3Rib2R5JykuZmlyc3QoKTsKICB0Ym9keS5jaGlsZHJlbigndHInKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnZ3JvdXAnKSkgewogICAgICAkKHRoaXMpLnJlbW92ZUNsYXNzKCdvcGVuJyk7CiAgICAgIHZhciBleHBhbmRlciA9ICQodGhpcykuZmluZCgnLmV4cGFuZGVyJyk7CiAgICAgIGV4cGFuZGVyLnN3aXRjaENsYXNzKCdpY29uLWV4cGFuZGVkJywgJ2ljb24tY29sbGFwc2VkJyk7CiAgICAgIHRvZ2dsZUV4cGVuZENvbGxhcHNlSWNvbihleHBhbmRlclswXSk7CiAgICB9IGVsc2UgewogICAgICAkKHRoaXMpLmhpZGUoKTsKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gZXhwYW5kQWxsUm93R3JvdXBzKGVsKSB7CiAgdmFyIHRib2R5ID0gJChlbCkucGFyZW50cygndGJvZHknKS5maXJzdCgpOwogIHRib2R5LmNoaWxkcmVuKCd0cicpLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgIGlmICgkKHRoaXMpLmhhc0NsYXNzKCdncm91cCcpKSB7CiAgICAgICQodGhpcykuYWRkQ2xhc3MoJ29wZW4nKTsKICAgICAgdmFyIGV4cGFuZGVyID0gJCh0aGlzKS5maW5kKCcuZXhwYW5kZXInKTsKICAgICAgZXhwYW5kZXIuc3dpdGNoQ2xhc3MoJ2ljb24tY29sbGFwc2VkJywgJ2ljb24tZXhwYW5kZWQnKTsKICAgICAgdG9nZ2xlRXhwZW5kQ29sbGFwc2VJY29uKGV4cGFuZGVyWzBdKTsKICAgIH0gZWxzZSB7CiAgICAgICQodGhpcykuc2hvdygpOwogICAgfQogIH0pOwp9CgpmdW5jdGlvbiB0b2dnbGVBbGxSb3dHcm91cHMoZWwpIHsKICB2YXIgdHIgPSAkKGVsKS5wYXJlbnRzKCd0cicpLmZpcnN0KCk7CiAgaWYgKHRyLmhhc0NsYXNzKCdvcGVuJykpIHsKICAgIGNvbGxhcHNlQWxsUm93R3JvdXBzKGVsKTsKICB9IGVsc2UgewogICAgZXhwYW5kQWxsUm93R3JvdXBzKGVsKTsKICB9Cn0KCmZ1bmN0aW9uIHRvZ2dsZUZpZWxkc2V0KGVsKSB7CiAgdmFyIGZpZWxkc2V0ID0gJChlbCkucGFyZW50cygnZmllbGRzZXQnKS5maXJzdCgpOwogIGZpZWxkc2V0LnRvZ2dsZUNsYXNzKCdjb2xsYXBzZWQnKTsKICBmaWVsZHNldC5jaGlsZHJlbignbGVnZW5kJykudG9nZ2xlQ2xhc3MoJ2ljb24tZXhwYW5kZWQgaWNvbi1jb2xsYXBzZWQnKTsKICB0b2dnbGVFeHBlbmRDb2xsYXBzZUljb24oZmllbGRzZXQuY2hpbGRyZW4oJ2xlZ2VuZCcpWzBdKQogIGZpZWxkc2V0LmNoaWxkcmVuKCdkaXYnKS50b2dnbGUoKTsKfQoKZnVuY3Rpb24gaGlkZUZpZWxkc2V0KGVsKSB7CiAgdmFyIGZpZWxkc2V0ID0gJChlbCkucGFyZW50cygnZmllbGRzZXQnKS5maXJzdCgpOwogIGZpZWxkc2V0LnRvZ2dsZUNsYXNzKCdjb2xsYXBzZWQnKTsKICBmaWVsZHNldC5jaGlsZHJlbignZGl2JykuaGlkZSgpOwp9CgovLyBjb2x1bW5zIHNlbGVjdGlvbgpmdW5jdGlvbiBtb3ZlT3B0aW9ucyh0aGVTZWxGcm9tLCB0aGVTZWxUbykgewogICQodGhlU2VsRnJvbSkuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykuZGV0YWNoKCkucHJvcCgic2VsZWN0ZWQiLCBmYWxzZSkuYXBwZW5kVG8oJCh0aGVTZWxUbykpOwp9CgpmdW5jdGlvbiBtb3ZlT3B0aW9uVXAodGhlU2VsKSB7CiAgJCh0aGVTZWwpLmZpbmQoJ29wdGlvbjpzZWxlY3RlZCcpLmVhY2goZnVuY3Rpb24oKXsKICAgICQodGhpcykucHJldignOm5vdCg6c2VsZWN0ZWQpJykuZGV0YWNoKCkuaW5zZXJ0QWZ0ZXIoJCh0aGlzKSk7CiAgfSk7Cn0KCmZ1bmN0aW9uIG1vdmVPcHRpb25Ub3AodGhlU2VsKSB7CiAgJCh0aGVTZWwpLmZpbmQoJ29wdGlvbjpzZWxlY3RlZCcpLmRldGFjaCgpLnByZXBlbmRUbygkKHRoZVNlbCkpOwp9CgpmdW5jdGlvbiBtb3ZlT3B0aW9uRG93bih0aGVTZWwpIHsKICAkKCQodGhlU2VsKS5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS5nZXQoKS5yZXZlcnNlKCkpLmVhY2goZnVuY3Rpb24oKXsKICAgICQodGhpcykubmV4dCgnOm5vdCg6c2VsZWN0ZWQpJykuZGV0YWNoKCkuaW5zZXJ0QmVmb3JlKCQodGhpcykpOwogIH0pOwp9CgpmdW5jdGlvbiBtb3ZlT3B0aW9uQm90dG9tKHRoZVNlbCkgewogICQodGhlU2VsKS5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS5kZXRhY2goKS5hcHBlbmRUbygkKHRoZVNlbCkpOwp9CgpmdW5jdGlvbiBpbml0RmlsdGVycygpIHsKICAkKCcjYWRkX2ZpbHRlcl9zZWxlY3QnKS5jaGFuZ2UoZnVuY3Rpb24oKSB7CiAgICBhZGRGaWx0ZXIoJCh0aGlzKS52YWwoKSwgJycsIFtdKTsKICB9KTsKICAkKCcjZmlsdGVycy10YWJsZSAuZmllbGQgaW5wdXRbdHlwZT1jaGVja2JveF0nKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgdG9nZ2xlRmlsdGVyKCQodGhpcykudmFsKCkpOwogIH0pOwogICQoJyNmaWx0ZXJzLXRhYmxlJykub24oJ2NsaWNrJywgJy5maWVsZCBpbnB1dFt0eXBlPWNoZWNrYm94XScsIGZ1bmN0aW9uKCkgewogICAgdG9nZ2xlRmlsdGVyKCQodGhpcykudmFsKCkpOwogIH0pOwogICQoJyNmaWx0ZXJzLXRhYmxlJykub24oJ2tleXByZXNzJywgJ2lucHV0W3R5cGU9dGV4dF0nLCBmdW5jdGlvbihlKSB7CiAgICBpZiAoZS5rZXlDb2RlID09IDEzKSAkKHRoaXMpLmNsb3Nlc3QoJ2Zvcm0nKS5zdWJtaXQoKTsKICB9KTsKfQoKZnVuY3Rpb24gYWRkRmlsdGVyKGZpZWxkLCBvcGVyYXRvciwgdmFsdWVzKSB7CiAgdmFyIGZpZWxkSWQgPSBmaWVsZC5yZXBsYWNlKCcuJywgJ18nKTsKICB2YXIgdHIgPSAkKCcjdHJfJytmaWVsZElkKTsKCiAgdmFyIGZpbHRlck9wdGlvbnMgPSBhdmFpbGFibGVGaWx0ZXJzW2ZpZWxkXTsKICBpZiAoIWZpbHRlck9wdGlvbnMpIHJldHVybjsKCiAgaWYgKGZpbHRlck9wdGlvbnNbJ3JlbW90ZSddICYmIGZpbHRlck9wdGlvbnNbJ3ZhbHVlcyddID09IG51bGwpIHsKICAgICQuZ2V0SlNPTihmaWx0ZXJzVXJsLCB7J25hbWUnOiBmaWVsZH0pLmRvbmUoZnVuY3Rpb24oZGF0YSkgewogICAgICBmaWx0ZXJPcHRpb25zWyd2YWx1ZXMnXSA9IGRhdGE7CiAgICAgIGFkZEZpbHRlcihmaWVsZCwgb3BlcmF0b3IsIHZhbHVlcykgOwogICAgfSk7CiAgICByZXR1cm47CiAgfQoKICBpZiAodHIubGVuZ3RoID4gMCkgewogICAgdHIuc2hvdygpOwogIH0gZWxzZSB7CiAgICBidWlsZEZpbHRlclJvdyhmaWVsZCwgb3BlcmF0b3IsIHZhbHVlcyk7CiAgfQogICQoJyNjYl8nK2ZpZWxkSWQpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTsKICB0b2dnbGVGaWx0ZXIoZmllbGQpOwogIHRvZ2dsZU11bHRpU2VsZWN0SWNvbkluaXQoKTsKICAkKCcjYWRkX2ZpbHRlcl9zZWxlY3QnKS52YWwoJycpLmZpbmQoJ29wdGlvbicpLmVhY2goZnVuY3Rpb24oKSB7CiAgICBpZiAoJCh0aGlzKS5hdHRyKCd2YWx1ZScpID09IGZpZWxkKSB7CiAgICAgICQodGhpcykuYXR0cignZGlzYWJsZWQnLCB0cnVlKTsKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gYnVpbGRGaWx0ZXJSb3coZmllbGQsIG9wZXJhdG9yLCB2YWx1ZXMpIHsKICB2YXIgZmllbGRJZCA9IGZpZWxkLnJlcGxhY2UoJy4nLCAnXycpOwogIHZhciBmaWx0ZXJUYWJsZSA9ICQoIiNmaWx0ZXJzLXRhYmxlIik7CiAgdmFyIGZpbHRlck9wdGlvbnMgPSBhdmFpbGFibGVGaWx0ZXJzW2ZpZWxkXTsKICBpZiAoIWZpbHRlck9wdGlvbnMpIHJldHVybjsKICB2YXIgb3BlcmF0b3JzID0gb3BlcmF0b3JCeVR5cGVbZmlsdGVyT3B0aW9uc1sndHlwZSddXTsKICB2YXIgZmlsdGVyVmFsdWVzID0gZmlsdGVyT3B0aW9uc1sndmFsdWVzJ107CiAgdmFyIHNlbGVjdDsKCiAgdmFyIHRyID0gJCgnPGRpdiBjbGFzcz0iZmlsdGVyIj4nKS5hdHRyKCdpZCcsICd0cl8nK2ZpZWxkSWQpLmh0bWwoCiAgICAnPGRpdiBjbGFzcz0iZmllbGQiPjxpbnB1dCBjaGVja2VkPSJjaGVja2VkIiBpZD0iY2JfJytmaWVsZElkKyciIG5hbWU9ImZbXSIgdmFsdWU9IicrZmllbGQrJyIgdHlwZT0iY2hlY2tib3giPjxsYWJlbCBmb3I9ImNiXycrZmllbGRJZCsnIj4gJytmaWx0ZXJPcHRpb25zWyduYW1lJ10rJzwvbGFiZWw+PC9kaXY+JyArCiAgICAnPGRpdiBjbGFzcz0ib3BlcmF0b3IiPjxzZWxlY3QgaWQ9Im9wZXJhdG9yc18nK2ZpZWxkSWQrJyIgbmFtZT0ib3BbJytmaWVsZCsnXSI+PC9zZWxlY3Q+PC9kaXY+JyArCiAgICAnPGRpdiBjbGFzcz0idmFsdWVzIj48L2Rpdj4nCiAgKTsKICBmaWx0ZXJUYWJsZS5hcHBlbmQodHIpOwoKICBzZWxlY3QgPSB0ci5maW5kKCcub3BlcmF0b3Igc2VsZWN0Jyk7CiAgb3BlcmF0b3JzLmZvckVhY2goZnVuY3Rpb24ob3ApIHsKICAgIHZhciBvcHRpb24gPSAkKCc8b3B0aW9uPicpLnZhbChvcCkudGV4dChvcGVyYXRvckxhYmVsc1tvcF0pOwogICAgaWYgKG9wID09IG9wZXJhdG9yKSB7IG9wdGlvbi5wcm9wKCdzZWxlY3RlZCcsIHRydWUpOyB9CiAgICBzZWxlY3QuYXBwZW5kKG9wdGlvbik7CiAgfSk7CiAgc2VsZWN0LmNoYW5nZShmdW5jdGlvbigpeyB0b2dnbGVPcGVyYXRvcihmaWVsZCk7IH0pOwoKICBzd2l0Y2ggKGZpbHRlck9wdGlvbnNbJ3R5cGUnXSkgewogIGNhc2UgImxpc3QiOgogIGNhc2UgImxpc3Rfd2l0aF9oaXN0b3J5IjoKICBjYXNlICJsaXN0X29wdGlvbmFsIjoKICBjYXNlICJsaXN0X29wdGlvbmFsX3dpdGhfaGlzdG9yeSI6CiAgY2FzZSAibGlzdF9zdGF0dXMiOgogIGNhc2UgImxpc3Rfc3VicHJvamVjdHMiOgogICAgY29uc3QgaWNvblR5cGUgPSB2YWx1ZXMubGVuZ3RoID4gMSA/ICd0b2dnbGUtbWludXMnIDogJ3RvZ2dsZS1wbHVzJzsKICAgIGNvbnN0IGljb25TdmcgPSBjcmVhdGVTVkdJY29uKGljb25UeXBlKQoKICAgIHRyLmZpbmQoJy52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICQoJzxzcGFuPicsIHsgc3R5bGU6ICdkaXNwbGF5Om5vbmU7JyB9KS5hcHBlbmQoCiAgICAgICAgJCgnPHNlbGVjdD4nLCB7CiAgICAgICAgICBjbGFzczogJ3ZhbHVlJywKICAgICAgICAgIGlkOiBgdmFsdWVzXyR7ZmllbGRJZH1fMWAsCiAgICAgICAgICBuYW1lOiBgdlske2ZpZWxkfV1bXWAsCiAgICAgICAgfSksCiAgICAgICAgJ1xuJywKICAgICAgICAkKCc8c3Bhbj4nLCB7IGNsYXNzOiBgdG9nZ2xlLW11bHRpc2VsZWN0IGljb24tb25seSBpY29uLSR7aWNvblR5cGV9YCB9KS5hcHBlbmQoaWNvblN2ZykKICAgICAgKQogICAgKTsKICAgIHNlbGVjdCA9IHRyLmZpbmQoJy52YWx1ZXMgc2VsZWN0Jyk7CiAgICBpZiAodmFsdWVzLmxlbmd0aCA+IDEpIHsgc2VsZWN0LmF0dHIoJ211bHRpcGxlJywgdHJ1ZSk7IH0KICAgIGZpbHRlclZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKGZpbHRlclZhbHVlKSB7CiAgICAgIHZhciBvcHRpb24gPSAkKCc8b3B0aW9uPicpOwogICAgICBpZiAoJC5pc0FycmF5KGZpbHRlclZhbHVlKSkgewogICAgICAgIG9wdGlvbi52YWwoZmlsdGVyVmFsdWVbMV0pLnRleHQoZmlsdGVyVmFsdWVbMF0pOwogICAgICAgIGlmICgkLmluQXJyYXkoZmlsdGVyVmFsdWVbMV0sIHZhbHVlcykgPiAtMSkge29wdGlvbi5wcm9wKCdzZWxlY3RlZCcsIHRydWUpO30KICAgICAgICBpZiAoZmlsdGVyVmFsdWUubGVuZ3RoID09IDMpIHsKICAgICAgICAgIHZhciBvcHRncm91cCA9IHNlbGVjdC5maW5kKCdvcHRncm91cCcpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiAkKHRoaXMpLmF0dHIoJ2xhYmVsJykgPT0gZmlsdGVyVmFsdWVbMl19KTsKICAgICAgICAgIGlmICghb3B0Z3JvdXAubGVuZ3RoKSB7b3B0Z3JvdXAgPSAkKCc8b3B0Z3JvdXA+JykuYXR0cignbGFiZWwnLCBmaWx0ZXJWYWx1ZVsyXSk7fQogICAgICAgICAgb3B0aW9uID0gb3B0Z3JvdXAuYXBwZW5kKG9wdGlvbik7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIG9wdGlvbi52YWwoZmlsdGVyVmFsdWUpLnRleHQoZmlsdGVyVmFsdWUpOwogICAgICAgIGlmICgkLmluQXJyYXkoZmlsdGVyVmFsdWUsIHZhbHVlcykgPiAtMSkge29wdGlvbi5wcm9wKCdzZWxlY3RlZCcsIHRydWUpO30KICAgICAgfQogICAgICBzZWxlY3QuYXBwZW5kKG9wdGlvbik7CiAgICB9KTsKICAgIGJyZWFrOwogIGNhc2UgImRhdGUiOgogIGNhc2UgImRhdGVfcGFzdCI6CiAgICB0ci5maW5kKCcudmFsdWVzJykuYXBwZW5kKAogICAgICAnPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZTsiPjxpbnB1dCB0eXBlPSJkYXRlIiBuYW1lPSJ2WycrZmllbGQrJ11bXSIgaWQ9InZhbHVlc18nK2ZpZWxkSWQrJ18xIiBzaXplPSIxMCIgY2xhc3M9InZhbHVlIGRhdGVfdmFsdWUiIC8+PC9zcGFuPicgKwogICAgICAnIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW5wdXQgdHlwZT0iZGF0ZSIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKydfMiIgc2l6ZT0iMTAiIGNsYXNzPSJ2YWx1ZSBkYXRlX3ZhbHVlIiAvPjwvc3Bhbj4nICsKICAgICAgJyA8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnIiBzaXplPSIzIiBjbGFzcz0idmFsdWUiIC8+ICcrbGFiZWxEYXlQbHVyYWwrJzwvc3Bhbj4nCiAgICApOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQrJ18xJykudmFsKHZhbHVlc1swXSkuZGF0ZXBpY2tlckZhbGxiYWNrKGRhdGVwaWNrZXJPcHRpb25zKTsKICAgICQoJyN2YWx1ZXNfJytmaWVsZElkKydfMicpLnZhbCh2YWx1ZXNbMV0pLmRhdGVwaWNrZXJGYWxsYmFjayhkYXRlcGlja2VyT3B0aW9ucyk7CiAgICAkKCcjdmFsdWVzXycrZmllbGRJZCkudmFsKHZhbHVlc1swXSk7CiAgICBicmVhazsKICBjYXNlICJzdHJpbmciOgogIGNhc2UgInRleHQiOgogIGNhc2UgInNlYXJjaCI6CiAgICB0ci5maW5kKCcudmFsdWVzJykuYXBwZW5kKAogICAgICAnPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZTsiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ2WycrZmllbGQrJ11bXSIgaWQ9InZhbHVlc18nK2ZpZWxkSWQrJyIgc2l6ZT0iMzAiIGNsYXNzPSJ2YWx1ZSIgLz48L3NwYW4+JwogICAgKTsKICAgICQoJyN2YWx1ZXNfJytmaWVsZElkKS52YWwodmFsdWVzWzBdKTsKICAgIGJyZWFrOwogIGNhc2UgInJlbGF0aW9uIjoKICAgIHRyLmZpbmQoJy52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnIiBzaXplPSI2IiBjbGFzcz0idmFsdWUiIC8+PC9zcGFuPicgKwogICAgICAnPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZTsiPjxzZWxlY3QgY2xhc3M9InZhbHVlIiBuYW1lPSJ2WycrZmllbGQrJ11bXSIgaWQ9InZhbHVlc18nK2ZpZWxkSWQrJ18xIj48L3NlbGVjdD48L3NwYW4+JwogICAgKTsKICAgICQoJyN2YWx1ZXNfJytmaWVsZElkKS52YWwodmFsdWVzWzBdKTsKICAgIHNlbGVjdCA9IHRyLmZpbmQoJy52YWx1ZXMgc2VsZWN0Jyk7CiAgICBmaWx0ZXJWYWx1ZXMuZm9yRWFjaChmdW5jdGlvbihmaWx0ZXJWYWx1ZSkgewogICAgICB2YXIgb3B0aW9uID0gJCgnPG9wdGlvbj4nKTsKICAgICAgb3B0aW9uLnZhbChmaWx0ZXJWYWx1ZVsxXSkudGV4dChmaWx0ZXJWYWx1ZVswXSk7CiAgICAgIGlmICh2YWx1ZXNbMF0gPT0gZmlsdGVyVmFsdWVbMV0pIHsgb3B0aW9uLnByb3AoJ3NlbGVjdGVkJywgdHJ1ZSk7IH0KICAgICAgc2VsZWN0LmFwcGVuZChvcHRpb24pOwogICAgfSk7CiAgICBicmVhazsKICBjYXNlICJpbnRlZ2VyIjoKICBjYXNlICJmbG9hdCI6CiAgY2FzZSAidHJlZSI6CiAgICB0ci5maW5kKCcudmFsdWVzJykuYXBwZW5kKAogICAgICAnPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZTsiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ2WycrZmllbGQrJ11bXSIgaWQ9InZhbHVlc18nK2ZpZWxkSWQrJ18xIiBzaXplPSIxNCIgY2xhc3M9InZhbHVlIiAvPjwvc3Bhbj4nICsKICAgICAgJyA8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnXzIiIHNpemU9IjE0IiBjbGFzcz0idmFsdWUiIC8+PC9zcGFuPicKICAgICk7CiAgICAkKCcjdmFsdWVzXycrZmllbGRJZCsnXzEnKS52YWwodmFsdWVzWzBdKTsKICAgICQoJyN2YWx1ZXNfJytmaWVsZElkKydfMicpLnZhbCh2YWx1ZXNbMV0pOwogICAgYnJlYWs7CiAgfQp9CgpmdW5jdGlvbiB0b2dnbGVGaWx0ZXIoZmllbGQpIHsKICB2YXIgZmllbGRJZCA9IGZpZWxkLnJlcGxhY2UoJy4nLCAnXycpOwogIGlmICgkKCcjY2JfJyArIGZpZWxkSWQpLmlzKCc6Y2hlY2tlZCcpKSB7CiAgICAkKCIjb3BlcmF0b3JzXyIgKyBmaWVsZElkKS5zaG93KCkucmVtb3ZlQXR0cignZGlzYWJsZWQnKTsKICAgIHRvZ2dsZU9wZXJhdG9yKGZpZWxkKTsKICB9IGVsc2UgewogICAgJCgiI29wZXJhdG9yc18iICsgZmllbGRJZCkuaGlkZSgpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICBlbmFibGVWYWx1ZXMoZmllbGQsIFtdKTsKICB9Cn0KCmZ1bmN0aW9uIGVuYWJsZVZhbHVlcyhmaWVsZCwgaW5kZXhlcykgewogIHZhciBmaWVsZElkID0gZmllbGQucmVwbGFjZSgnLicsICdfJyk7CiAgJCgnI3RyXycrZmllbGRJZCsnIC52YWx1ZXMgLnZhbHVlJykuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgaWYgKCQuaW5BcnJheShpbmRleCwgaW5kZXhlcykgPj0gMCkgewogICAgICAkKHRoaXMpLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7CiAgICAgICQodGhpcykucGFyZW50cygnc3BhbicpLmZpcnN0KCkuc2hvdygpOwogICAgfSBlbHNlIHsKICAgICAgJCh0aGlzKS52YWwoJycpOwogICAgICAkKHRoaXMpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICQodGhpcykucGFyZW50cygnc3BhbicpLmZpcnN0KCkuaGlkZSgpOwogICAgfQoKICAgIGlmICgkKHRoaXMpLmhhc0NsYXNzKCdncm91cCcpKSB7CiAgICAgICQodGhpcykuYWRkQ2xhc3MoJ29wZW4nKTsKICAgIH0gZWxzZSB7CiAgICAgICQodGhpcykuc2hvdygpOwogICAgfQogIH0pOwp9CgpmdW5jdGlvbiB0b2dnbGVPcGVyYXRvcihmaWVsZCkgewogIHZhciBmaWVsZElkID0gZmllbGQucmVwbGFjZSgnLicsICdfJyk7CiAgdmFyIG9wZXJhdG9yID0gJCgiI29wZXJhdG9yc18iICsgZmllbGRJZCk7CiAgc3dpdGNoIChvcGVyYXRvci52YWwoKSkgewogICAgY2FzZSAiISoiOgogICAgY2FzZSAiKiI6CiAgICBjYXNlICJuZCI6CiAgICBjYXNlICJ0IjoKICAgIGNhc2UgImxkIjoKICAgIGNhc2UgIm53IjoKICAgIGNhc2UgInciOgogICAgY2FzZSAibHciOgogICAgY2FzZSAibDJ3IjoKICAgIGNhc2UgIm5tIjoKICAgIGNhc2UgIm0iOgogICAgY2FzZSAibG0iOgogICAgY2FzZSAieSI6CiAgICBjYXNlICJvIjoKICAgIGNhc2UgImMiOgogICAgY2FzZSAiKm8iOgogICAgY2FzZSAiIW8iOgogICAgICBlbmFibGVWYWx1ZXMoZmllbGQsIFtdKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICI+PCI6CiAgICAgIGVuYWJsZVZhbHVlcyhmaWVsZCwgWzAsMV0pOwogICAgICBicmVhazsKICAgIGNhc2UgIjx0KyI6CiAgICBjYXNlICI+dCsiOgogICAgY2FzZSAiPjx0KyI6CiAgICBjYXNlICJ0KyI6CiAgICBjYXNlICI+dC0iOgogICAgY2FzZSAiPHQtIjoKICAgIGNhc2UgIj48dC0iOgogICAgY2FzZSAidC0iOgogICAgICBlbmFibGVWYWx1ZXMoZmllbGQsIFsyXSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAiPXAiOgogICAgY2FzZSAiPSFwIjoKICAgIGNhc2UgIiFwIjoKICAgICAgZW5hYmxlVmFsdWVzKGZpZWxkLCBbMV0pOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIGVuYWJsZVZhbHVlcyhmaWVsZCwgWzBdKTsKICAgICAgYnJlYWs7CiAgfQp9CgpmdW5jdGlvbiB0b2dnbGVNdWx0aVNlbGVjdChlbCkgewogIHZhciBpc1dvcmtmbG93ID0gZWwuY2xvc2VzdCgnLmNvbnRyb2xsZXItd29ya2Zsb3dzJyk7CiAgaWYgKGVsLmF0dHIoJ211bHRpcGxlJykpIHsKICAgIGVsLnJlbW92ZUF0dHIoJ211bHRpcGxlJyk7CiAgICBpZiAoaXNXb3JrZmxvdykgeyBlbC5maW5kKCJvcHRpb25bdmFsdWU9YWxsXSIpLnNob3coKTsgfQogICAgZWwuYXR0cignc2l6ZScsIDEpOwogIH0gZWxzZSB7CiAgICBlbC5hdHRyKCdtdWx0aXBsZScsIHRydWUpOwogICAgaWYgKGlzV29ya2Zsb3cpIHsgZWwuZmluZCgib3B0aW9uW3ZhbHVlPWFsbF0iKS5hdHRyKCJzZWxlY3RlZCIsIGZhbHNlKS5oaWRlKCk7IH0KICAgIGlmIChlbC5jaGlsZHJlbigpLmxlbmd0aCA+IDEwKQogICAgICBlbC5hdHRyKCdzaXplJywgMTApOwogICAgZWxzZQogICAgICBlbC5hdHRyKCdzaXplJywgNCk7CiAgfQp9CgpmdW5jdGlvbiBzaG93VGFiKG5hbWUsIHVybCkgewogICQoJyN0YWItY29udGVudC0nICsgbmFtZSkucGFyZW50KCkuZmluZCgnLnRhYi1jb250ZW50JykuaGlkZSgpOwogICQoJyN0YWItY29udGVudC0nICsgbmFtZSkuc2hvdygpOwogICQoJyN0YWItJyArIG5hbWUpLmNsb3Nlc3QoJy50YWJzJykuZmluZCgnYScpLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpOwogICQoJyN0YWItJyArIG5hbWUpLmFkZENsYXNzKCdzZWxlY3RlZCcpOwoKICByZXBsYWNlSW5IaXN0b3J5KHVybCkKCiAgcmV0dXJuIGZhbHNlOwp9CgpmdW5jdGlvbiBzaG93SXNzdWVIaXN0b3J5KGpvdXJuYWwsIHVybCkgewogIHRhYl9jb250ZW50ID0gJCgnI3RhYi1jb250ZW50LWhpc3RvcnknKTsKICB0YWJfY29udGVudC5wYXJlbnQoKS5maW5kKCcudGFiLWNvbnRlbnQnKS5oaWRlKCk7CiAgdGFiX2NvbnRlbnQuc2hvdygpOwogIHRhYl9jb250ZW50LnBhcmVudCgpLmNoaWxkcmVuKCdkaXYudGFicycpLmZpbmQoJ2EnKS5yZW1vdmVDbGFzcygnc2VsZWN0ZWQnKTsKCiAgJCgnI3RhYi0nICsgam91cm5hbCkuYWRkQ2xhc3MoJ3NlbGVjdGVkJyk7CgogIHJlcGxhY2VJbkhpc3RvcnkodXJsKQoKICBzd2l0Y2goam91cm5hbCkgewogICAgY2FzZSAnbm90ZXMnOgogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCcpLnNob3coKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWw6bm90KC5oYXMtbm90ZXMpJykuaGlkZSgpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAud2lraScpLnNob3coKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwgLmpvdXJuYWwtYWN0aW9ucyA+IConKS5zaG93KCk7CgogICAgICAvLyBhbHdheXMgc2hvdyB0aHVtYm5haWxzIGluIG5vdGVzIHRhYgogICAgICB2YXIgdGh1bWJuYWlscyA9IHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC50aHVtYm5haWxzJyk7CiAgICAgIHRodW1ibmFpbHMuc2hvdygpOwogICAgICAvLyBzaG93IGpvdXJuYWxzIHdpdGhvdXQgbm90ZXMsIGJ1dCB3aXRoIHRodW1ibmFpbHMKICAgICAgdGh1bWJuYWlscy5wYXJlbnRzKCcuam91cm5hbCcpLnNob3coKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICdwcm9wZXJ0aWVzJzoKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwnKS5zaG93KCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsOm5vdCguaGFzLWRldGFpbHMpJykuaGlkZSgpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAud2lraScpLmhpZGUoKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwgLnRodW1ibmFpbHMnKS5oaWRlKCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC5qb3VybmFsLWFjdGlvbnMgPiAqJykuaGlkZSgpOwogICAgICAvLyBTaG93IHJlYWN0aW9uIGJ1dHRvbiBpbiBwcm9wZXJ0aWVzIHRhYgogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAuam91cm5hbC1hY3Rpb25zIC5yZWFjdGlvbi1idXR0b24td3JhcHBlcicpLnNob3coKTsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCcpLnNob3coKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwgLndpa2knKS5zaG93KCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC50aHVtYm5haWxzJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAuam91cm5hbC1hY3Rpb25zID4gKicpLnNob3coKTsKICB9CgogIHJldHVybiBmYWxzZTsKfQoKZnVuY3Rpb24gZ2V0UmVtb3RlVGFiKG5hbWUsIHJlbW90ZV91cmwsIHVybCwgbG9hZF9hbHdheXMpIHsKICBsb2FkX2Fsd2F5cyA9IGxvYWRfYWx3YXlzIHx8IGZhbHNlOwogIHZhciB0YWJfY29udGVudCA9ICQoJyN0YWItY29udGVudC0nICsgbmFtZSk7CgogIHRhYl9jb250ZW50LnBhcmVudCgpLmZpbmQoJy50YWItY29udGVudCcpLmhpZGUoKTsKICB0YWJfY29udGVudC5wYXJlbnQoKS5jaGlsZHJlbignZGl2LnRhYnMnKS5maW5kKCdhJykucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkJyk7CiAgJCgnI3RhYi0nICsgbmFtZSkuYWRkQ2xhc3MoJ3NlbGVjdGVkJyk7CgogIHJlcGxhY2VJbkhpc3RvcnkodXJsKTsKCiAgaWYgKHRhYl9jb250ZW50LmNoaWxkcmVuKCkubGVuZ3RoID09IDAgJiYgbG9hZF9hbHdheXMgPT0gZmFsc2UpIHsKICAgICQuYWpheCh7CiAgICAgIHVybDogcmVtb3RlX3VybCwKICAgICAgdHlwZTogJ2dldCcsCiAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpewogICAgICAgIHRhYl9jb250ZW50Lmh0bWwoZGF0YSkKICAgICAgfQogICAgfSk7CiAgfQoKICB0YWJfY29udGVudC5zaG93KCk7CiAgcmV0dXJuIGZhbHNlOwp9CgovL3JlcGxhY2VzIGN1cnJlbnQgVVJMIHdpdGggdGhlICJocmVmIiBhdHRyaWJ1dGUgb2YgdGhlIGN1cnJlbnQgbGluawovLyhvbmx5IHRyaWdnZXJlZCBpZiBzdXBwb3J0ZWQgYnkgYnJvd3NlcikKZnVuY3Rpb24gcmVwbGFjZUluSGlzdG9yeSh1cmwpIHsKICBpZiAoInJlcGxhY2VTdGF0ZSIgaW4gd2luZG93Lmhpc3RvcnkgJiYgdXJsICE9PSB1bmRlZmluZWQpIHsKICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCBkb2N1bWVudC50aXRsZSwgdXJsKTsKICB9Cn0KCmZ1bmN0aW9uIG1vdmVUYWJSaWdodChlbCkgewogIHZhciBsaXMgPSAkKGVsKS5wYXJlbnRzKCdkaXYudGFicycpLmZpcnN0KCkuZmluZCgndWwnKS5jaGlsZHJlbigpOwogIHZhciBidyA9ICQoZWwpLnBhcmVudHMoJ2Rpdi50YWJzLWJ1dHRvbnMnKS5vdXRlcldpZHRoKHRydWUpOwogIHZhciB0YWJzV2lkdGggPSAwOwogIHZhciBpID0gMDsKICBsaXMuZWFjaChmdW5jdGlvbigpIHsKICAgIGlmICgkKHRoaXMpLmlzKCc6dmlzaWJsZScpKSB7CiAgICAgIHRhYnNXaWR0aCArPSAkKHRoaXMpLm91dGVyV2lkdGgodHJ1ZSk7CiAgICB9CiAgfSk7CiAgaWYgKHRhYnNXaWR0aCA8ICQoZWwpLnBhcmVudHMoJ2Rpdi50YWJzJykuZmlyc3QoKS53aWR0aCgpIC0gYncpIHsgcmV0dXJuOyB9CiAgJChlbCkuc2libGluZ3MoJy50YWItbGVmdCcpLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOwogIHdoaWxlIChpPGxpcy5sZW5ndGggJiYgIWxpcy5lcShpKS5pcygnOnZpc2libGUnKSkgeyBpKys7IH0KICB2YXIgdyA9IGxpcy5lcShpKS53aWR0aCgpOwogIGxpcy5lcShpKS5oaWRlKCk7CiAgaWYgKHRhYnNXaWR0aCAtIHcgPCAkKGVsKS5wYXJlbnRzKCdkaXYudGFicycpLmZpcnN0KCkud2lkdGgoKSAtIGJ3KSB7CiAgICAkKGVsKS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKICB9Cn0KCmZ1bmN0aW9uIG1vdmVUYWJMZWZ0KGVsKSB7CiAgdmFyIGxpcyA9ICQoZWwpLnBhcmVudHMoJ2Rpdi50YWJzJykuZmlyc3QoKS5maW5kKCd1bCcpLmNoaWxkcmVuKCk7CiAgdmFyIGkgPSAwOwogIHdoaWxlIChpIDwgbGlzLmxlbmd0aCAmJiAhbGlzLmVxKGkpLmlzKCc6dmlzaWJsZScpKSB7IGkrKzsgfQogIGlmIChpID4gMCkgewogICAgbGlzLmVxKGktMSkuc2hvdygpOwogICAgJChlbCkuc2libGluZ3MoJy50YWItcmlnaHQnKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICB9CiAgaWYgKGkgPD0gMSkgewogICAgJChlbCkuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7CiAgfQp9CgpmdW5jdGlvbiBkaXNwbGF5VGFic0J1dHRvbnMoKSB7CiAgdmFyIGxpczsKICB2YXIgdGFic1dpZHRoOwogIHZhciBlbDsKICB2YXIgbnVtSGlkZGVuOwogICQoJ2Rpdi50YWJzJykuZWFjaChmdW5jdGlvbigpIHsKICAgIGVsID0gJCh0aGlzKTsKICAgIGxpcyA9IGVsLmZpbmQoJ3VsJykuY2hpbGRyZW4oKTsKICAgIHRhYnNXaWR0aCA9IDA7CiAgICBudW1IaWRkZW4gPSAwOwogICAgbGlzLmVhY2goZnVuY3Rpb24oKXsKICAgICAgaWYgKCQodGhpcykuaXMoJzp2aXNpYmxlJykpIHsKICAgICAgICB0YWJzV2lkdGggKz0gJCh0aGlzKS5vdXRlcldpZHRoKHRydWUpOwogICAgICB9IGVsc2UgewogICAgICAgIG51bUhpZGRlbisrOwogICAgICB9CiAgICB9KTsKICAgIHZhciBidyA9ICQoZWwpLmZpbmQoJ2Rpdi50YWJzLWJ1dHRvbnMnKS5vdXRlcldpZHRoKHRydWUpOwogICAgaWYgKCh0YWJzV2lkdGggPCBlbC53aWR0aCgpIC0gYncpICYmIChsaXMubGVuZ3RoID09PSAwIHx8IGxpcy5maXJzdCgpLmlzKCc6dmlzaWJsZScpKSkgewogICAgICBlbC5maW5kKCdkaXYudGFicy1idXR0b25zJykuaGlkZSgpOwogICAgfSBlbHNlIHsKICAgICAgZWwuZmluZCgnZGl2LnRhYnMtYnV0dG9ucycpLnNob3coKS5jaGlsZHJlbignYnV0dG9uLnRhYi1sZWZ0JykudG9nZ2xlQ2xhc3MoJ2Rpc2FibGVkJywgbnVtSGlkZGVuID09IDApOwogICAgfQogIH0pOwp9CgpmdW5jdGlvbiBzZXRQcmVkZWNlc3NvckZpZWxkc1Zpc2liaWxpdHkoKSB7CiAgdmFyIHJlbGF0aW9uVHlwZSA9ICQoJyNyZWxhdGlvbl9yZWxhdGlvbl90eXBlJyk7CiAgaWYgKHJlbGF0aW9uVHlwZS52YWwoKSA9PSAicHJlY2VkZXMiIHx8IHJlbGF0aW9uVHlwZS52YWwoKSA9PSAiZm9sbG93cyIpIHsKICAgICQoJyNwcmVkZWNlc3Nvcl9maWVsZHMnKS5zaG93KCk7CiAgfSBlbHNlIHsKICAgICQoJyNwcmVkZWNlc3Nvcl9maWVsZHMnKS5oaWRlKCk7CiAgfQp9CgpmdW5jdGlvbiBzaG93TW9kYWwoaWQsIHdpZHRoLCB0aXRsZSkgewogIHZhciBlbCA9ICQoJyMnK2lkKS5maXJzdCgpOwogIGlmIChlbC5sZW5ndGggPT09IDAgfHwgZWwuaXMoJzp2aXNpYmxlJykpIHtyZXR1cm47fQogIGlmICghdGl0bGUpIHRpdGxlID0gZWwuZmluZCgnaDMudGl0bGUnKS50ZXh0KCk7CiAgLy8gbW92ZXMgZXhpc3RpbmcgbW9kYWxzIGJlaGluZCB0aGUgdHJhbnNwYXJlbnQgYmFja2dyb3VuZAogICQoIi5tb2RhbCIpLmNzcygnekluZGV4Jyw5OSk7CiAgZWwuZGlhbG9nKHsKICAgIHdpZHRoOiB3aWR0aCwKICAgIG1vZGFsOiB0cnVlLAogICAgcmVzaXphYmxlOiBmYWxzZSwKICAgIGRpYWxvZ0NsYXNzOiAnbW9kYWwnLAogICAgdGl0bGU6IHRpdGxlCiAgfSkub24oJ2RpYWxvZ2Nsb3NlJywgZnVuY3Rpb24oKXsKICAgICQoIi5tb2RhbCIpLmNzcygnekluZGV4JywxMDEpOwogIH0pOwogIGVsLmZpbmQoImlucHV0W3R5cGU9dGV4dF0sIGlucHV0W3R5cGU9c3VibWl0XSIpLmZpcnN0KCkuZm9jdXMoKTsKfQoKZnVuY3Rpb24gaGlkZU1vZGFsKGVsKSB7CiAgdmFyIG1vZGFsOwogIGlmIChlbCkgewogICAgbW9kYWwgPSAkKGVsKS5wYXJlbnRzKCcudWktZGlhbG9nLWNvbnRlbnQnKTsKICB9IGVsc2UgewogICAgbW9kYWwgPSAkKCcjYWpheC1tb2RhbCcpOwogIH0KICBtb2RhbC5kaWFsb2coImNsb3NlIik7Cn0KCmZ1bmN0aW9uIGNvbGxhcHNlU2NtRW50cnkoaWQpIHsKICAkKCcuJytpZCkuZWFjaChmdW5jdGlvbigpIHsKICAgIGlmICgkKHRoaXMpLmhhc0NsYXNzKCdvcGVuJykpIHsKICAgICAgY29sbGFwc2VTY21FbnRyeSgkKHRoaXMpLmF0dHIoJ2lkJykpOwogICAgfQogICAgJCh0aGlzKS5oaWRlKCk7CiAgfSk7CiAgJCgnIycraWQpLnJlbW92ZUNsYXNzKCdvcGVuJyk7Cn0KCmZ1bmN0aW9uIGV4cGFuZFNjbUVudHJ5KGlkKSB7CiAgJCgnLicraWQpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAkKHRoaXMpLnNob3coKTsKICAgIGlmICgkKHRoaXMpLmhhc0NsYXNzKCdsb2FkZWQnKSAmJiAhJCh0aGlzKS5oYXNDbGFzcygnY29sbGFwc2VkJykpIHsKICAgICAgZXhwYW5kU2NtRW50cnkoJCh0aGlzKS5hdHRyKCdpZCcpKTsKICAgIH0KICB9KTsKICAkKCcjJytpZCkuYWRkQ2xhc3MoJ29wZW4nKTsKfQoKZnVuY3Rpb24gc2NtRW50cnlDbGljayhpZCwgdXJsKSB7CiAgICB2YXIgZWwgPSAkKCcjJytpZCk7CiAgICB2YXIgZXhwYW5kZXIgPSBlbC5maW5kKCcuZXhwYW5kZXInKTsKICAgIHZhciBmb2xkZXIgPSBlbC5maW5kKCcuaWNvbi1mb2xkZXInKTsKCiAgICBpZiAoZWwuaGFzQ2xhc3MoJ29wZW4nKSkgewogICAgICAgIGNvbGxhcHNlU2NtRW50cnkoaWQpOwogICAgICAgIGVsLmZpbmQoJy5leHBhbmRlcicpLnN3aXRjaENsYXNzKCdpY29uLWV4cGFuZGVkJywgJ2ljb24tY29sbGFwc2VkJyk7CiAgICAgICAgZWwuYWRkQ2xhc3MoJ2NvbGxhcHNlZCcpOwogICAgICAgIHVwZGF0ZVNWR0ljb24oZm9sZGVyWzBdLCAnZm9sZGVyJykKICAgICAgICB0b2dnbGVFeHBlbmRDb2xsYXBzZUljb24oZXhwYW5kZXJbMF0pOwoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9IGVsc2UgaWYgKGVsLmhhc0NsYXNzKCdsb2FkZWQnKSkgewogICAgICAgIGV4cGFuZFNjbUVudHJ5KGlkKTsKICAgICAgICBlbC5maW5kKCcuZXhwYW5kZXInKS5zd2l0Y2hDbGFzcygnaWNvbi1jb2xsYXBzZWQnLCAnaWNvbi1leHBhbmRlZCcpOwogICAgICAgIGVsLnJlbW92ZUNsYXNzKCdjb2xsYXBzZWQnKTsKICAgICAgICB1cGRhdGVTVkdJY29uKGZvbGRlclswXSwgJ2ZvbGRlci1vcGVuJykKICAgICAgICB0b2dnbGVFeHBlbmRDb2xsYXBzZUljb24oZXhwYW5kZXJbMF0pOwoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAoZWwuaGFzQ2xhc3MoJ2xvYWRpbmcnKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGVsLmFkZENsYXNzKCdsb2FkaW5nJyk7CiAgICAkLmFqYXgoewogICAgICB1cmw6IHVybCwKICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSkgewogICAgICAgIGVsLmFmdGVyKGRhdGEpOwogICAgICAgIGVsLmFkZENsYXNzKCdvcGVuJykuYWRkQ2xhc3MoJ2xvYWRlZCcpLnJlbW92ZUNsYXNzKCdsb2FkaW5nJyk7CiAgICAgICAgZWwuZmluZCgnLmV4cGFuZGVyJykuc3dpdGNoQ2xhc3MoJ2ljb24tY29sbGFwc2VkJywgJ2ljb24tZXhwYW5kZWQnKTsKICAgICAgICB1cGRhdGVTVkdJY29uKGZvbGRlclswXSwgJ2ZvbGRlci1vcGVuJykKICAgICAgICB0b2dnbGVFeHBlbmRDb2xsYXBzZUljb24oZXhwYW5kZXJbMF0pOwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiB0cnVlOwp9CgpmdW5jdGlvbiByYW5kb21LZXkoc2l6ZSkgewogIHZhciBjaGFycyA9ICcwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eic7CiAgdmFyIGtleSA9ICcnOwogIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICBrZXkgKz0gY2hhcnMuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoYXJzLmxlbmd0aCkpOwogIH0KICByZXR1cm4ga2V5Owp9CgpmdW5jdGlvbiBjb3B5VG9DbGlwYm9hcmQodGV4dCkgewogIGlmIChuYXZpZ2F0b3IuY2xpcGJvYXJkKSB7CiAgICByZXR1cm4gbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGV4dCkuY2F0Y2goKCkgPT4gewogICAgICByZXR1cm4gZmFsbGJhY2tDbGlwYm9hcmRDb3B5KHRleHQpOwogICAgfSk7CiAgfSBlbHNlIHsKICAgIHJldHVybiBmYWxsYmFja0NsaXBib2FyZENvcHkodGV4dCk7CiAgfQp9CgpmdW5jdGlvbiBmYWxsYmFja0NsaXBib2FyZENvcHkodGV4dCkgewogIGNvbnN0IHRlbXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpOwogIHRlbXAudmFsdWUgPSB0ZXh0OwogIHRlbXAuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnOwogIHRlbXAuc3R5bGUubGVmdCA9ICctOTk5OXB4JzsKICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRlbXApOwogIHRlbXAuc2VsZWN0KCk7CiAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTsKICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRlbXApOwogIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTsKfQoKZnVuY3Rpb24gY29weURhdGFDbGlwYm9hcmRUZXh0VG9DbGlwYm9hcmQodGFyZ2V0KSB7CiAgY29weVRvQ2xpcGJvYXJkKHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY2xpcGJvYXJkLXRleHQnKSk7CgogIGlmICgkKHRhcmdldCkuY2xvc2VzdCgnLmRyZG4uZXhwYW5kZWQnKS5sZW5ndGgpIHsKICAgICQodGFyZ2V0KS5jbG9zZXN0KCcuZHJkbi5leHBhbmRlZCcpLnJlbW92ZUNsYXNzKCJleHBhbmRlZCIpOwogIH0KICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIHNldHVwQ29weUJ1dHRvbnNUb1ByZUVsZW1lbnRzKCkgewogIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy53aWtpIHByZTpub3QoLnByZS13cmFwcGVyIHByZSknKS5mb3JFYWNoKChwcmUpID0+IHsKICAgIC8vIFdyYXAgdGhlIDxwcmU+IGVsZW1lbnQgd2l0aCBhIGNvbnRhaW5lciBhbmQgYWRkIGEgY29weSBidXR0b24KICAgIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgIHdyYXBwZXIuY2xhc3NMaXN0LmFkZCgicHJlLXdyYXBwZXIiKTsKCiAgICBjb25zdCBjb3B5QnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpOwogICAgY29weUJ1dHRvbi50aXRsZSA9IHJtLkkxOG4uYnV0dG9uQ29weTsKICAgIGNvcHlCdXR0b24uY2xhc3NMaXN0LmFkZCgiY29weS1wcmUtY29udGVudC1saW5rIiwgImljb24tb25seSIpOwogICAgY29weUJ1dHRvbi5hcHBlbmQoY3JlYXRlU1ZHSWNvbigiY29weS1wcmUtY29udGVudCIpKTsKCiAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGNvcHlCdXR0b24pOwogICAgd3JhcHBlci5hcHBlbmQocHJlLmNsb25lTm9kZSh0cnVlKSk7CiAgICBwcmUucmVwbGFjZVdpdGgod3JhcHBlcik7CgogICAgLy8gQ29weSB0aGUgY29udGVudHMgb2YgdGhlIHByZSB0YWcgd2hlbiBjb3B5QnV0dG9uIGlzIGNsaWNrZWQKICAgIGNvcHlCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoZXZlbnQpID0+IHsKICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgbGV0IHRleHRUb0NvcHkgPSAocHJlLnF1ZXJ5U2VsZWN0b3IoImNvZGUiKSB8fCBwcmUpLnRleHRDb250ZW50LnJlcGxhY2UoL1xuJC8sICcnKTsKICAgICAgaWYgKHByZS5xdWVyeVNlbGVjdG9yKCJjb2RlLnN5bnRheGhsIikpIHsgdGV4dFRvQ29weSA9IHRleHRUb0NvcHkucmVwbGFjZSgvICQvLCAnJyk7IH0gLy8gV29ya2Fyb3VuZCBmb3IgaGFsZi13aWR0aCBzcGFjZSBpc3N1ZSBpbiBUZXh0aWxlJ3MgaGlnaGxpZ2h0ZWQgY29kZQogICAgICBjb3B5VG9DbGlwYm9hcmQodGV4dFRvQ29weSkudGhlbigoKSA9PiB7CiAgICAgICAgdXBkYXRlU1ZHSWNvbihjb3B5QnV0dG9uLCAiY2hlY2tlZCIpOwogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdXBkYXRlU1ZHSWNvbihjb3B5QnV0dG9uLCAiY29weS1wcmUtY29udGVudCIpLCAyMDAwKTsKICAgICAgfSk7CiAgICB9KTsKICB9KTsKfQoKZnVuY3Rpb24gdXBkYXRlSXNzdWVGcm9tKHVybCwgZWwpIHsKICAkKCcjYWxsX2F0dHJpYnV0ZXMgaW5wdXQsICNhbGxfYXR0cmlidXRlcyB0ZXh0YXJlYSwgI2FsbF9hdHRyaWJ1dGVzIHNlbGVjdCcpLmVhY2goZnVuY3Rpb24oKXsKICAgICQodGhpcykuZGF0YSgndmFsdWViZWZvcmV1cGRhdGUnLCAkKHRoaXMpLnZhbCgpKTsKICB9KTsKICBpZiAoZWwpIHsKICAgICQoIiNmb3JtX3VwZGF0ZV90cmlnZ2VyZWRfYnkiKS52YWwoJChlbCkuYXR0cignaWQnKSk7CiAgfQogIHJldHVybiAkLmFqYXgoewogICAgdXJsOiB1cmwsCiAgICB0eXBlOiAncG9zdCcsCiAgICBkYXRhOiAkKCcjaXNzdWUtZm9ybScpLnNlcmlhbGl6ZSgpCiAgfSk7Cn0KCmZ1bmN0aW9uIHJlcGxhY2VJc3N1ZUZvcm1XaXRoKGh0bWwpewogIHZhciByZXBsYWNlbWVudCA9ICQoaHRtbCk7CiAgJCgnI2FsbF9hdHRyaWJ1dGVzIGlucHV0LCAjYWxsX2F0dHJpYnV0ZXMgdGV4dGFyZWEsICNhbGxfYXR0cmlidXRlcyBzZWxlY3QnKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICB2YXIgb2JqZWN0X2lkID0gJCh0aGlzKS5hdHRyKCdpZCcpOwogICAgaWYgKG9iamVjdF9pZCAmJiAkKHRoaXMpLmRhdGEoJ3ZhbHVlYmVmb3JldXBkYXRlJykhPSQodGhpcykudmFsKCkpIHsKICAgICAgcmVwbGFjZW1lbnQuZmluZCgnIycrb2JqZWN0X2lkKS52YWwoJCh0aGlzKS52YWwoKSk7CiAgICB9CiAgfSk7CiAgJCgnI2FsbF9hdHRyaWJ1dGVzJykuZW1wdHkoKTsKICAkKCcjYWxsX2F0dHJpYnV0ZXMnKS5wcmVwZW5kKHJlcGxhY2VtZW50KTsKfQoKZnVuY3Rpb24gdXBkYXRlQnVsa0VkaXRGcm9tKHVybCkgewogICQuYWpheCh7CiAgICB1cmw6IHVybCwKICAgIHR5cGU6ICdwb3N0JywKICAgIGRhdGE6ICQoJyNidWxrX2VkaXRfZm9ybScpLnNlcmlhbGl6ZSgpCiAgfSk7Cn0KCmZ1bmN0aW9uIG9ic2VydmVBdXRvY29tcGxldGVGaWVsZChmaWVsZElkLCB1cmwsIG9wdGlvbnMpIHsKICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKICAgICQoJyMnK2ZpZWxkSWQpLmF1dG9jb21wbGV0ZSgkLmV4dGVuZCh7CiAgICAgIHNvdXJjZTogdXJsLAogICAgICBtaW5MZW5ndGg6IDIsCiAgICAgIHBvc2l0aW9uOiB7Y29sbGlzaW9uOiAiZmxpcGZpdCJ9LAogICAgICBzZWFyY2g6IGZ1bmN0aW9uKCl7JCgnIycrZmllbGRJZCkuYWRkQ2xhc3MoJ2FqYXgtbG9hZGluZycpO30sCiAgICAgIHJlc3BvbnNlOiBmdW5jdGlvbigpeyQoJyMnK2ZpZWxkSWQpLnJlbW92ZUNsYXNzKCdhamF4LWxvYWRpbmcnKTt9CiAgICB9LCBvcHRpb25zKSk7CiAgICAkKCcjJytmaWVsZElkKS5hZGRDbGFzcygnYXV0b2NvbXBsZXRlJyk7CiAgfSk7Cn0KCmZ1bmN0aW9uIG11bHRpcGxlQXV0b2NvbXBsZXRlRmllbGQoZmllbGRJZCwgdXJsLCBvcHRpb25zKSB7CiAgZnVuY3Rpb24gc3BsaXQodmFsKSB7CiAgICByZXR1cm4gdmFsLnNwbGl0KC8sXHMqLyk7CiAgfQoKICBmdW5jdGlvbiBleHRyYWN0TGFzdCh0ZXJtKSB7CiAgICByZXR1cm4gc3BsaXQodGVybSkucG9wKCk7CiAgfQoKICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7CiAgICAkKCcjJyArIGZpZWxkSWQpLmF1dG9jb21wbGV0ZSgkLmV4dGVuZCh7CiAgICAgIHNvdXJjZTogZnVuY3Rpb24gKHJlcXVlc3QsIHJlc3BvbnNlKSB7CiAgICAgICAgJC5nZXRKU09OKHVybCwgewogICAgICAgICAgdGVybTogZXh0cmFjdExhc3QocmVxdWVzdC50ZXJtKQogICAgICAgIH0sIHJlc3BvbnNlKTsKICAgICAgfSwKICAgICAgbWluTGVuZ3RoOiAyLAogICAgICBwb3NpdGlvbjoge2NvbGxpc2lvbjogImZsaXBmaXQifSwKICAgICAgc2VhcmNoOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgJCgnIycgKyBmaWVsZElkKS5hZGRDbGFzcygnYWpheC1sb2FkaW5nJyk7CiAgICAgIH0sCiAgICAgIHJlc3BvbnNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgJCgnIycgKyBmaWVsZElkKS5yZW1vdmVDbGFzcygnYWpheC1sb2FkaW5nJyk7CiAgICAgIH0sCiAgICAgIHNlbGVjdDogZnVuY3Rpb24gKGV2ZW50LCB1aSkgewogICAgICAgIHZhciB0ZXJtcyA9IHNwbGl0KHRoaXMudmFsdWUpOwogICAgICAgIC8vIHJlbW92ZSB0aGUgY3VycmVudCBpbnB1dAogICAgICAgIHRlcm1zLnBvcCgpOwogICAgICAgIC8vIGFkZCB0aGUgc2VsZWN0ZWQgaXRlbQogICAgICAgIHRlcm1zLnB1c2godWkuaXRlbS52YWx1ZSk7CiAgICAgICAgLy8gYWRkIHBsYWNlaG9sZGVyIHRvIGdldCB0aGUgY29tbWEtYW5kLXNwYWNlIGF0IHRoZSBlbmQKICAgICAgICB0ZXJtcy5wdXNoKCIiKTsKICAgICAgICB0aGlzLnZhbHVlID0gdGVybXMuam9pbigiLCAiKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0sIG9wdGlvbnMpKTsKICAgICQoJyMnICsgZmllbGRJZCkuYWRkQ2xhc3MoJ2F1dG9jb21wbGV0ZScpOwogIH0pOwp9CgpmdW5jdGlvbiBvYnNlcnZlU2VhcmNoZmllbGQoZmllbGRJZCwgdGFyZ2V0SWQsIHVybCkgewogICQoJyMnK2ZpZWxkSWQpLmVhY2goZnVuY3Rpb24oKSB7CiAgICB2YXIgJHRoaXMgPSAkKHRoaXMpOwogICAgJHRoaXMuYWRkQ2xhc3MoJ2F1dG9jb21wbGV0ZScpOwogICAgJHRoaXMuYXR0cignZGF0YS12YWx1ZS13YXMnLCAkdGhpcy52YWwoKSk7CiAgICB2YXIgY2hlY2sgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIHZhbCA9ICR0aGlzLnZhbCgpOwogICAgICBpZiAoJHRoaXMuYXR0cignZGF0YS12YWx1ZS13YXMnKSAhPSB2YWwpewogICAgICAgICR0aGlzLmF0dHIoJ2RhdGEtdmFsdWUtd2FzJywgdmFsKTsKICAgICAgICAkLmFqYXgoewogICAgICAgICAgdXJsOiB1cmwsCiAgICAgICAgICB0eXBlOiAnZ2V0JywKICAgICAgICAgIGRhdGE6IHtxOiAkdGhpcy52YWwoKX0sCiAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihkYXRhKXsgaWYodGFyZ2V0SWQpICQoJyMnK3RhcmdldElkKS5odG1sKGRhdGEpOyB9LAogICAgICAgICAgYmVmb3JlU2VuZDogZnVuY3Rpb24oKXsgJHRoaXMuYWRkQ2xhc3MoJ2FqYXgtbG9hZGluZycpOyB9LAogICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKCl7ICR0aGlzLnJlbW92ZUNsYXNzKCdhamF4LWxvYWRpbmcnKTsgfQogICAgICAgIH0pOwogICAgICB9CiAgICB9OwogICAgdmFyIHJlc2V0ID0gZnVuY3Rpb24oKSB7CiAgICAgIGlmICh0aW1lcikgewogICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOwogICAgICAgIHRpbWVyID0gc2V0SW50ZXJ2YWwoY2hlY2ssIDMwMCk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgdGltZXIgPSBzZXRJbnRlcnZhbChjaGVjaywgMzAwKTsKICAgICR0aGlzLmJpbmQoJ2tleXVwIGNsaWNrIG1vdXNlbW92ZScsIHJlc2V0KTsKICB9KTsKfQoKJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKXsKICAkKCIuZHJkbiAuYXV0b2NvbXBsZXRlIikudmFsKCcnKTsKCiAgLy8gVGhpcyB2YXJpYWJsZSBpcyB1c2VkIHRvIGZvY3VzIHNlbGVjdGVkIHByb2plY3QKICB2YXIgc2VsZWN0ZWQ7CiAgJChkb2N1bWVudCkub24oJ2NsaWNrJywgJy5kcmRuLXRyaWdnZXInLCBmdW5jdGlvbihlKXsKICAgIHZhciBkcmRuID0gJCh0aGlzKS5jbG9zZXN0KCIuZHJkbiIpOwogICAgaWYgKGRyZG4uaGFzQ2xhc3MoImV4cGFuZGVkIikpIHsKICAgICAgZHJkbi5yZW1vdmVDbGFzcygiZXhwYW5kZWQiKTsKICAgIH0gZWxzZSB7CiAgICAgICQoIi5kcmRuIikucmVtb3ZlQ2xhc3MoImV4cGFuZGVkIik7CiAgICAgIGRyZG4uYWRkQ2xhc3MoImV4cGFuZGVkIik7CiAgICAgIGlmICgkKHRoaXMpLnBhcmVudCgnI3Byb2plY3QtanVtcCcpLmxlbmd0aCkgewogICAgICAgIHNlbGVjdGVkID0gJCgnLmRyZG4taXRlbXMgYS5zZWxlY3RlZCcpOyAvLyBTdG9yZSBzZWxlY3RlZCBwcm9qZWN0CiAgICAgICAgc2VsZWN0ZWQuZmlyc3QoKS5mb2N1cygpOyAvLyBDYWxsaW5nIGZvY3VzIHRvIHNjcm9sbCB0byBzZWxlY3RlZCBwcm9qZWN0CiAgICAgIH0KICAgICAgaWYgKCFpc01vYmlsZSgpKSB7CiAgICAgICAgZHJkbi5maW5kKCIuYXV0b2NvbXBsZXRlIikuZm9jdXMoKTsKICAgICAgfQogICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgfQogIH0pOwogICQoZG9jdW1lbnQpLmNsaWNrKGZ1bmN0aW9uKGUpewogICAgaWYgKCQoZS50YXJnZXQpLmNsb3Nlc3QoIi5kcmRuIikubGVuZ3RoIDwgMSkgewogICAgICAkKCIuZHJkbi5leHBhbmRlZCIpLnJlbW92ZUNsYXNzKCJleHBhbmRlZCIpOwogICAgfQogIH0pOwoKICBvYnNlcnZlU2VhcmNoZmllbGQoJ3Byb2plY3RzLXF1aWNrLXNlYXJjaCcsIG51bGwsICQoJyNwcm9qZWN0cy1xdWljay1zZWFyY2gnKS5kYXRhKCdhdXRvbWNvbXBsZXRlLXVybCcpKTsKCiAgJCgiLmRyZG4tY29udGVudCIpLmtleWRvd24oZnVuY3Rpb24oZXZlbnQpewogICAgdmFyIGl0ZW1zID0gJCh0aGlzKS5maW5kKCIuZHJkbi1pdGVtcyIpOwoKICAgIC8vIElmIGEgcHJvamVjdCBpcyBzZWxlY3RlZCBzZXQgZm9jdXNlZCB0byBzZWxlY3RlZCBvbmx5IG9uY2UKICAgIGlmIChzZWxlY3RlZCAmJiBzZWxlY3RlZC5sZW5ndGggPiAwKSB7CiAgICAgIHZhciBmb2N1c2VkID0gc2VsZWN0ZWQ7CiAgICAgIHNlbGVjdGVkID0gdW5kZWZpbmVkOwogICAgfQogICAgZWxzZSB7CiAgICAgIHZhciBmb2N1c2VkID0gaXRlbXMuZmluZCgiYTpmb2N1cyIpOwogICAgfQogICAgc3dpdGNoIChldmVudC53aGljaCkgewogICAgY2FzZSA0MDogLy9kb3duCiAgICAgIGlmIChmb2N1c2VkLmxlbmd0aCA+IDApIHsKICAgICAgICBmb2N1c2VkLm5leHRBbGwoImEiKS5maXJzdCgpLmZvY3VzKCk7OwogICAgICB9IGVsc2UgewogICAgICAgIGl0ZW1zLmZpbmQoImEiKS5maXJzdCgpLmZvY3VzKCk7OwogICAgICB9CiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAzODogLy91cAogICAgICBpZiAoZm9jdXNlZC5sZW5ndGggPiAwKSB7CiAgICAgICAgdmFyIHByZXYgPSBmb2N1c2VkLnByZXZBbGwoImEiKTsKICAgICAgICBpZiAocHJldi5sZW5ndGggPiAwKSB7CiAgICAgICAgICBwcmV2LmZpcnN0KCkuZm9jdXMoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgJCh0aGlzKS5maW5kKCIuYXV0b2NvbXBsZXRlIikuZm9jdXMoKTsKICAgICAgICB9CiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgMzU6IC8vZW5kCiAgICAgIGlmIChmb2N1c2VkLmxlbmd0aCA+IDApIHsKICAgICAgICBmb2N1c2VkLm5leHRBbGwoImEiKS5sYXN0KCkuZm9jdXMoKTsKICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSAzNjogLy9ob21lCiAgICAgIGlmIChmb2N1c2VkLmxlbmd0aCA+IDApIHsKICAgICAgICBmb2N1c2VkLnByZXZBbGwoImEiKS5sYXN0KCkuZm9jdXMoKTsKICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgfQogIH0pOwp9KTsKCmZ1bmN0aW9uIGJlZm9yZVNob3dEYXRlUGlja2VyKGlucHV0LCBpbnN0KSB7CiAgdmFyIGRlZmF1bHRfZGF0ZSA9IG51bGw7CiAgc3dpdGNoICgkKGlucHV0KS5hdHRyKCJpZCIpKSB7CiAgICBjYXNlICJpc3N1ZV9zdGFydF9kYXRlIiA6CiAgICAgIGlmICgkKCIjaXNzdWVfZHVlX2RhdGUiKS5sZW5ndGggPiAwKSB7CiAgICAgICAgZGVmYXVsdF9kYXRlID0gJCgiI2lzc3VlX2R1ZV9kYXRlIikudmFsKCk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlICJpc3N1ZV9kdWVfZGF0ZSIgOgogICAgICBpZiAoJCgiI2lzc3VlX3N0YXJ0X2RhdGUiKS5sZW5ndGggPiAwKSB7CiAgICAgICAgdmFyIHN0YXJ0X2RhdGUgPSAkKCIjaXNzdWVfc3RhcnRfZGF0ZSIpLnZhbCgpOwogICAgICAgIGlmIChzdGFydF9kYXRlICE9ICIiKSB7CiAgICAgICAgICBzdGFydF9kYXRlID0gbmV3IERhdGUoRGF0ZS5wYXJzZShzdGFydF9kYXRlKSk7CiAgICAgICAgICBpZiAoc3RhcnRfZGF0ZSA+IG5ldyBEYXRlKCkpIHsKICAgICAgICAgICAgZGVmYXVsdF9kYXRlID0gJCgiI2lzc3VlX3N0YXJ0X2RhdGUiKS52YWwoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgYnJlYWs7CiAgfQogICQoaW5wdXQpLmRhdGVwaWNrZXJGYWxsYmFjaygib3B0aW9uIiwgImRlZmF1bHREYXRlIiwgZGVmYXVsdF9kYXRlKTsKfQoKKGZ1bmN0aW9uKCQpewogICQuZm4ucG9zaXRpb25lZEl0ZW1zID0gZnVuY3Rpb24oc29ydGFibGVPcHRpb25zLCBvcHRpb25zKXsKICAgIHZhciBzZXR0aW5ncyA9ICQuZXh0ZW5kKHsKICAgICAgZmlyc3RQb3NpdGlvbjogMQogICAgfSwgb3B0aW9ucyApOwoKICAgIHJldHVybiB0aGlzLnNvcnRhYmxlKCQuZXh0ZW5kKHsKICAgICAgYXhpczogJ3knLAogICAgICBoYW5kbGU6ICIuc29ydC1oYW5kbGUiLAogICAgICBoZWxwZXI6IGZ1bmN0aW9uKGV2ZW50LCB1aSl7CiAgICAgICAgdWkuY2hpbGRyZW4oJ3RkJykuZWFjaChmdW5jdGlvbigpewogICAgICAgICAgJCh0aGlzKS53aWR0aCgkKHRoaXMpLndpZHRoKCkpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiB1aTsKICAgICAgfSwKICAgICAgdXBkYXRlOiBmdW5jdGlvbihldmVudCwgdWkpIHsKICAgICAgICB2YXIgc29ydGFibGUgPSAkKHRoaXMpOwogICAgICAgIHZhciBoYW5kbGUgPSB1aS5pdGVtLmZpbmQoIi5zb3J0LWhhbmRsZSIpLmFkZENsYXNzKCJhamF4LWxvYWRpbmciKTsKICAgICAgICB2YXIgdXJsID0gaGFuZGxlLmRhdGEoInJlb3JkZXItdXJsIik7CiAgICAgICAgdmFyIHBhcmFtID0gaGFuZGxlLmRhdGEoInJlb3JkZXItcGFyYW0iKTsKICAgICAgICB2YXIgZGF0YSA9IHt9OwogICAgICAgIGRhdGFbcGFyYW1dID0ge3Bvc2l0aW9uOiB1aS5pdGVtLmluZGV4KCkgKyBzZXR0aW5nc1snZmlyc3RQb3NpdGlvbiddfTsKICAgICAgICAkLmFqYXgoewogICAgICAgICAgdXJsOiB1cmwsCiAgICAgICAgICB0eXBlOiAncHV0JywKICAgICAgICAgIGRhdGFUeXBlOiAnc2NyaXB0JywKICAgICAgICAgIGRhdGE6IGRhdGEsCiAgICAgICAgICBlcnJvcjogZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKXsKICAgICAgICAgICAgYWxlcnQoanFYSFIuc3RhdHVzKTsKICAgICAgICAgICAgc29ydGFibGUuc29ydGFibGUoImNhbmNlbCIpOwogICAgICAgICAgfSwKICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pewogICAgICAgICAgICBoYW5kbGUucmVtb3ZlQ2xhc3MoImFqYXgtbG9hZGluZyIpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9LAogICAgfSwgc29ydGFibGVPcHRpb25zKSk7CiAgfQp9KCBqUXVlcnkgKSk7Cgp2YXIgd2FybkxlYXZpbmdVbnNhdmVkTWVzc2FnZTsKZnVuY3Rpb24gd2FybkxlYXZpbmdVbnNhdmVkKG1lc3NhZ2UpIHsKICB3YXJuTGVhdmluZ1Vuc2F2ZWRNZXNzYWdlID0gbWVzc2FnZTsKICAkKGRvY3VtZW50KS5vbignc3VibWl0JywgJ2Zvcm0nLCBmdW5jdGlvbigpewogICAgJCgndGV4dGFyZWEnKS5yZW1vdmVEYXRhKCdjaGFuZ2VkJyk7CiAgfSk7CiAgJChkb2N1bWVudCkub24oJ2NoYW5nZScsICd0ZXh0YXJlYScsIGZ1bmN0aW9uKCl7CiAgICAkKHRoaXMpLmRhdGEoJ2NoYW5nZWQnLCAnY2hhbmdlZCcpOwogIH0pOwogIHdpbmRvdy5vbmJlZm9yZXVubG9hZCA9IGZ1bmN0aW9uKCl7CiAgICB2YXIgd2FybiA9IGZhbHNlOwogICAgJCgndGV4dGFyZWEnKS5ibHVyKCkuZWFjaChmdW5jdGlvbigpewogICAgICBpZiAoJCh0aGlzKS5kYXRhKCdjaGFuZ2VkJykpIHsKICAgICAgICB3YXJuID0gdHJ1ZTsKICAgICAgfQogICAgfSk7CiAgICBpZiAod2Fybikge3JldHVybiB3YXJuTGVhdmluZ1Vuc2F2ZWRNZXNzYWdlO30KICB9Owp9CgpmdW5jdGlvbiBzZXR1cEFqYXhJbmRpY2F0b3IoKSB7CiAgJChkb2N1bWVudCkuYmluZCgnYWpheFNlbmQnLCBmdW5jdGlvbihldmVudCwgeGhyLCBzZXR0aW5ncykgewogICAgaWYgKCQoJy5hamF4LWxvYWRpbmcnKS5sZW5ndGggPT09IDAgJiYgc2V0dGluZ3MuY29udGVudFR5cGUgIT0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpIHsKICAgICAgJCgnI2FqYXgtaW5kaWNhdG9yJykuc2hvdygpOwogICAgfQogIH0pOwogICQoZG9jdW1lbnQpLmJpbmQoJ2FqYXhTdG9wJywgZnVuY3Rpb24oKSB7CiAgICAkKCcjYWpheC1pbmRpY2F0b3InKS5oaWRlKCk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHNldHVwVGFicygpIHsKICBpZigkKCcudGFicycpLmxlbmd0aCA+IDApIHsKICAgIGRpc3BsYXlUYWJzQnV0dG9ucygpOwogICAgJCh3aW5kb3cpLnJlc2l6ZShkaXNwbGF5VGFic0J1dHRvbnMpOwogIH0KfQoKZnVuY3Rpb24gc2V0dXBGaWxlUHJldmlld05hdmlnYXRpb24oKSB7CiAgLy8gb25seSBiaW5kIGFycm93IGtleXMgd2hlbiBwcmV2aWV3IG5hdmlnYXRpb24gaXMgcHJlc2VudAogIGNvbnN0IGVsZW1lbnQgPSAkKCcucGFnaW5hdGlvbi5maWxlcHJldmlldycpLmZpcnN0KCk7CiAgaWYgKGVsZW1lbnQpIHsKCiAgICBjb25zdCBoYW5kbGVBcnJvd0tleSA9IGZ1bmN0aW9uKHNlbGVjdG9yLCBlKXsKICAgICAgY29uc3QgaHJlZiA9ICQoZWxlbWVudCkuZmluZChzZWxlY3RvcikuYXR0cignaHJlZicpOwogICAgICBpZiAoaHJlZikgewogICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IGhyZWY7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICB9CiAgICB9OwoKICAgICQoZG9jdW1lbnQpLmtleWRvd24oZnVuY3Rpb24oZSkgewogICAgICBpZihlLnNoaWZ0S2V5IHx8IGUubWV0YUtleSB8fCBlLmN0cmxLZXkgfHwgZS5hbHRLZXkpIHJldHVybjsKICAgICAgc3dpdGNoKGUua2V5KSB7CiAgICAgICAgY2FzZSAnQXJyb3dMZWZ0JzoKICAgICAgICAgIGhhbmRsZUFycm93S2V5KCcucHJldmlvdXMgYScsIGUpOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOgogICAgICAgICAgaGFuZGxlQXJyb3dLZXkoJy5uZXh0IGEnLCBlKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9KTsKICB9Cn0KCiQoZG9jdW1lbnQpLm9uKCdrZXlkb3duJywgJ2Zvcm0gdGV4dGFyZWEnLCBmdW5jdGlvbihlKSB7CiAgLy8gU3VibWl0IHRoZSBmb3JtIHdpdGggQ3RybCArIEVudGVyIG9yIENvbW1hbmQgKyBSZXR1cm4KICB2YXIgdGFyZ2V0Rm9ybSA9ICQoZS50YXJnZXQpLmNsb3Nlc3QoJ2Zvcm0nKTsKICBpZihlLmtleUNvZGUgPT0gMTMgJiYgKChlLmN0cmxLZXkgJiYgIWUubWV0YUtleSkgfHwgKCFlLmN0cmxLZXkgJiYgZS5tZXRhS2V5KSAmJiB0YXJnZXRGb3JtLmxlbmd0aCkpIHsKICAgIC8vIEZvciBhamF4LCB1c2UgY2xpY2soKSBpbnN0ZWFkIG9mIHN1Ym1pdCgpIHRvIHByZXZlbnQgIkludmFsaWQgZm9ybSBhdXRoZW50aWNpdHkgdG9rZW4iIGVycm9yCiAgICBpZiAodGFyZ2V0Rm9ybS5hdHRyKCdkYXRhLXJlbW90ZScpID09ICd0cnVlJykgewogICAgICBpZiAodGFyZ2V0Rm9ybS5maW5kKCdpbnB1dFt0eXBlPXN1Ym1pdF0nKS5sZW5ndGggPT09IDApIHsgcmV0dXJuIGZhbHNlOyB9CiAgICAgIHRhcmdldEZvcm0uZmluZCgndGV4dGFyZWEnKS5ibHVyKCkucmVtb3ZlRGF0YSgnY2hhbmdlZCcpOwogICAgICB0YXJnZXRGb3JtLmZpbmQoJ2lucHV0W3R5cGU9c3VibWl0XScpLmZpcnN0KCkuY2xpY2soKTsKICAgIH0gZWxzZSB7CiAgICAgIHRhcmdldEZvcm0uZmluZCgndGV4dGFyZWEnKS5ibHVyKCkucmVtb3ZlRGF0YSgnY2hhbmdlZCcpOwogICAgICB0YXJnZXRGb3JtLnN1Ym1pdCgpOwogICAgfQogIH0KfSk7CgoKZnVuY3Rpb24gaGlkZU9uTG9hZCgpIHsKICAkKCcuaG9sJykuaGlkZSgpOwp9CgpmdW5jdGlvbiBhZGRGb3JtT2JzZXJ2ZXJzRm9yRG91YmxlU3VibWl0KCkgewogICQoJ2Zvcm1bbWV0aG9kPXBvc3RdJykuZWFjaChmdW5jdGlvbigpIHsKICAgIGlmICghJCh0aGlzKS5oYXNDbGFzcygnbXVsdGlwbGUtc3VibWl0JykpIHsKICAgICAgJCh0aGlzKS5zdWJtaXQoZnVuY3Rpb24oZm9ybV9zdWJtaXNzaW9uKSB7CiAgICAgICAgaWYgKCQoZm9ybV9zdWJtaXNzaW9uLnRhcmdldCkuYXR0cignZGF0YS1zdWJtaXR0ZWQnKSkgewogICAgICAgICAgZm9ybV9zdWJtaXNzaW9uLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICQoZm9ybV9zdWJtaXNzaW9uLnRhcmdldCkuYXR0cignZGF0YS1zdWJtaXR0ZWQnLCB0cnVlKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogIH0pOwp9CgpmdW5jdGlvbiBkZWZhdWx0Rm9jdXMoKXsKICBpZiAoKCQoJyNjb250ZW50IDpmb2N1cycpLmxlbmd0aCA9PSAwKSAmJiAod2luZG93LmxvY2F0aW9uLmhhc2ggPT0gJycpKSB7CiAgICAkKCcjY29udGVudCBpbnB1dFt0eXBlPXRleHRdOnZpc2libGUsICNjb250ZW50IHRleHRhcmVhOnZpc2libGUnKS5maXJzdCgpLmZvY3VzKCk7CiAgfQp9CgpmdW5jdGlvbiBibG9ja0V2ZW50UHJvcGFnYXRpb24oZXZlbnQpIHsKICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwp9CgpmdW5jdGlvbiB0b2dnbGVEaXNhYmxlZE9uQ2hhbmdlKCkgewogIHZhciBjaGVja2VkID0gJCh0aGlzKS5pcygnOmNoZWNrZWQnKTsKICAkKCQodGhpcykuZGF0YSgnZGlzYWJsZXMnKSkuYXR0cignZGlzYWJsZWQnLCBjaGVja2VkKTsKICAkKCQodGhpcykuZGF0YSgnZW5hYmxlcycpKS5hdHRyKCdkaXNhYmxlZCcsICFjaGVja2VkKTsKICAkKCQodGhpcykuZGF0YSgnc2hvd3MnKSkudG9nZ2xlKGNoZWNrZWQpOwp9CmZ1bmN0aW9uIHRvZ2dsZURpc2FibGVkSW5pdCgpIHsKICAkKCdpbnB1dFtkYXRhLWRpc2FibGVzXSwgaW5wdXRbZGF0YS1lbmFibGVzXSwgaW5wdXRbZGF0YS1zaG93c10nKS5lYWNoKHRvZ2dsZURpc2FibGVkT25DaGFuZ2UpOwp9CmZ1bmN0aW9uIHRvZ2dsZU11bHRpU2VsZWN0SWNvbkluaXQoKSB7CiAgJCgnLnRvZ2dsZS1tdWx0aXNlbGVjdDpub3QoLmljb24tdG9nZ2xlLW1pbnVzKTpub3QoLmljb24tdG9nZ2xlLXBsdXMpJykuZWFjaChmdW5jdGlvbigpewogICAgbGV0IGljb25UeXBlOwogICAgaWYgKCQodGhpcykuc2libGluZ3MoJ3NlbGVjdCcpLmZpbmQoJ29wdGlvbjpzZWxlY3RlZCcpLmxlbmd0aCA+IDEpIHsKICAgICAgaWNvblR5cGUgPSAndG9nZ2xlLW1pbnVzJzsKICAgIH0gZWxzZSB7CiAgICAgIGljb25UeXBlID0gJ3RvZ2dsZS1wbHVzJzsKICAgIH0KCiAgICAkKHRoaXMpLmFkZENsYXNzKGBpY29uLSR7aWNvblR5cGV9YCk7CiAgICB1cGRhdGVTVkdJY29uKCQodGhpcykuZmluZCgnc3ZnJylbMF0sIGljb25UeXBlKTsKICB9KTsKfQoKZnVuY3Rpb24gdG9nZ2xlTmV3T2JqZWN0RHJvcGRvd24oKSB7CiAgdmFyIGRyb3Bkb3duID0gJCgnI25ldy1vYmplY3QgKyB1bC5tZW51LWNoaWxkcmVuJyk7CiAgaWYoZHJvcGRvd24uaGFzQ2xhc3MoJ3Zpc2libGUnKSl7CiAgICBkcm9wZG93bi5yZW1vdmVDbGFzcygndmlzaWJsZScpOwogIH1lbHNlewogICAgZHJvcGRvd24uYWRkQ2xhc3MoJ3Zpc2libGUnKTsKICB9Cn0KCihmdW5jdGlvbiAoICQgKSB7CgogIC8vIGRldGVjdCBpZiBuYXRpdmUgZGF0ZSBpbnB1dCBpcyBzdXBwb3J0ZWQKICB2YXIgbmF0aXZlRGF0ZUlucHV0U3VwcG9ydGVkID0gdHJ1ZTsKCiAgdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTsKICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCdkYXRlJyk7CiAgaWYgKGlucHV0LnR5cGUgPT09ICd0ZXh0JykgewogICAgbmF0aXZlRGF0ZUlucHV0U3VwcG9ydGVkID0gZmFsc2U7CiAgfQoKICB2YXIgbm90QURhdGVWYWx1ZSA9ICdub3QtYS1kYXRlJzsKICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgbm90QURhdGVWYWx1ZSk7CiAgaWYgKGlucHV0LnZhbHVlID09PSBub3RBRGF0ZVZhbHVlKSB7CiAgICBuYXRpdmVEYXRlSW5wdXRTdXBwb3J0ZWQgPSBmYWxzZTsKICB9CgogICQuZm4uZGF0ZXBpY2tlckZhbGxiYWNrID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7CiAgICBpZiAobmF0aXZlRGF0ZUlucHV0U3VwcG9ydGVkKSB7CiAgICAgIHJldHVybiB0aGlzOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHRoaXMuZGF0ZXBpY2tlciggb3B0aW9ucyApOwogICAgfQogIH07Cn0oIGpRdWVyeSApKTsKCiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCl7CiAgJCgnI2NvbnRlbnQnKS5vbignY2hhbmdlJywgJ2lucHV0W2RhdGEtZGlzYWJsZXNdLCBpbnB1dFtkYXRhLWVuYWJsZXNdLCBpbnB1dFtkYXRhLXNob3dzXScsIHRvZ2dsZURpc2FibGVkT25DaGFuZ2UpOwogIHRvZ2dsZURpc2FibGVkSW5pdCgpOwoKICAkKCcjY29udGVudCcpLm9uKCdjbGljaycsICcudG9nZ2xlLW11bHRpc2VsZWN0JywgZnVuY3Rpb24oKSB7CiAgICB0b2dnbGVNdWx0aVNlbGVjdCgkKHRoaXMpLnNpYmxpbmdzKCdzZWxlY3QnKSk7CiAgICAkKHRoaXMpLnRvZ2dsZUNsYXNzKCdpY29uLXRvZ2dsZS1wbHVzIGljb24tdG9nZ2xlLW1pbnVzJyk7CiAgICB1cGRhdGVTVkdJY29uKCQodGhpcykuZmluZCgnc3ZnJylbMF0sICQodGhpcykuaGFzQ2xhc3MoJ2ljb24tdG9nZ2xlLXBsdXMnKSA/ICd0b2dnbGUtcGx1cycgOiAndG9nZ2xlLW1pbnVzJyk7CiAgfSk7CiAgdG9nZ2xlTXVsdGlTZWxlY3RJY29uSW5pdCgpOwoKICAkKCcjaGlzdG9yeSAudGFicycpLm9uKCdjbGljaycsICdhJywgZnVuY3Rpb24oZSl7CiAgICB2YXIgdGFiID0gJChlLnRhcmdldCkuYXR0cignaWQnKS5yZXBsYWNlKCd0YWItJywnJyk7CiAgICBkb2N1bWVudC5jb29raWUgPSAnaGlzdG9yeV9sYXN0X3RhYj0nICsgdGFiICsgJzsgU2FtZVNpdGU9TGF4JwogIH0pOwp9KTsKCiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCl7CiAgJCgnI2NvbnRlbnQnKS5vbignY2xpY2snLCAnZGl2LmpzdFRhYnMgYS50YWItcHJldmlldycsIGZ1bmN0aW9uKGV2ZW50KXsKICAgIHZhciB0YWIgPSAkKGV2ZW50LnRhcmdldCk7CgogICAgdmFyIHVybCA9IHRhYi5kYXRhKCd1cmwnKTsKICAgIHZhciBmb3JtID0gdGFiLnBhcmVudHMoJ2Zvcm0nKTsKICAgIHZhciBqc3RCbG9jayA9IHRhYi5wYXJlbnRzKCcuanN0QmxvY2snKTsKCiAgICB2YXIgZWxlbWVudCA9IGVuY29kZVVSSUNvbXBvbmVudChqc3RCbG9jay5maW5kKCcud2lraS1lZGl0JykudmFsKCkpOwogICAgdmFyIGF0dGFjaG1lbnRzID0gZm9ybS5maW5kKCcuYXR0YWNobWVudHNfZmllbGRzIGlucHV0Jykuc2VyaWFsaXplKCk7CgogICAgJC5hamF4KHsKICAgICAgdXJsOiB1cmwsCiAgICAgIHR5cGU6ICdwb3N0JywKICAgICAgZGF0YTogInRleHQ9IiArIGVsZW1lbnQgKyAnJicgKyBhdHRhY2htZW50cywKICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSl7CiAgICAgICAganN0QmxvY2suZmluZCgnLndpa2ktcHJldmlldycpLmh0bWwoZGF0YSk7CiAgICAgICAgc2V0dXBXaWtpVGFibGVTb3J0YWJsZUhlYWRlcigpOwogICAgICB9CiAgICB9KTsKICB9KTsKfSk7CgpmdW5jdGlvbiBrZWVwQW5jaG9yT25TaWduSW4oZm9ybSl7CiAgdmFyIGhhc2ggPSBkZWNvZGVVUklDb21wb25lbnQoc2VsZi5kb2N1bWVudC5sb2NhdGlvbi5oYXNoKTsKICBpZiAoaGFzaCkgewogICAgaWYgKGhhc2guaW5kZXhPZigiIyIpID09PSAtMSkgewogICAgICBoYXNoID0gIiMiICsgaGFzaDsKICAgIH0KICAgIGZvcm0uYWN0aW9uID0gZm9ybS5hY3Rpb24gKyBoYXNoOwogIH0KICByZXR1cm4gdHJ1ZTsKfQoKJChmdW5jdGlvbiAoJCkgewogICQoJyNhdXRoX3NvdXJjZV9sZGFwX21vZGUnKS5jaGFuZ2UoZnVuY3Rpb24gKCkgewogICAgJCgnLmxkYXBzX3dhcm5pbmcnKS50b2dnbGUoJCh0aGlzKS52YWwoKSAhPSAnbGRhcHNfdmVyaWZ5X3BlZXInKTsKICB9KS5jaGFuZ2UoKTsKfSk7CgpmdW5jdGlvbiBzZXRGaWxlY29udGVudENvbnRhaW5lckhlaWdodCgpIHsKICB2YXIgJGZpbGVjb250YWluZXIgPSAkKCcuZmlsZWNvbnRlbnQtY29udGFpbmVyJyk7CiAgdmFyIGZpbGVUeXBlU2VsZWN0b3JzID0gWycuaW1hZ2UnLCAndmlkZW8nXTsKCiAgaWYoJGZpbGVjb250YWluZXIubGVuZ3RoID4gMCAmJiAkZmlsZWNvbnRhaW5lci5maW5kKGZpbGVUeXBlU2VsZWN0b3JzLmpvaW4oJywnKSkubGVuZ3RoID09PSAxKSB7CiAgICB2YXIgY29udGFpbmVyT2Zmc2V0VG9wID0gJGZpbGVjb250YWluZXIub2Zmc2V0KCkudG9wOwogICAgdmFyIGNvbnRhaW5lck1hcmdpbkJvdHRvbSA9IHBhcnNlSW50KCRmaWxlY29udGFpbmVyLmNzcygnbWFyZ2luQm90dG9tJykpOwogICAgdmFyIHBhZ2luYXRpb25IZWlnaHQgPSAkZmlsZWNvbnRhaW5lci5uZXh0KCcucGFnaW5hdGlvbicpLmhlaWdodCgpOwogICAgdmFyIGRpZmYgPSBjb250YWluZXJPZmZzZXRUb3AgKyBjb250YWluZXJNYXJnaW5Cb3R0b20gKyBwYWdpbmF0aW9uSGVpZ2h0OwoKICAgICRmaWxlY29udGFpbmVyLmNzcygnaGVpZ2h0JywgJ2NhbGMoMTAwdmggLSAnICsgZGlmZiArICdweCknKQogIH0KfQoKZnVuY3Rpb24gc2V0dXBBdHRhY2htZW50RGV0YWlsKCkgewogIHNldEZpbGVjb250ZW50Q29udGFpbmVySGVpZ2h0KCk7CiAgJCh3aW5kb3cpLnJlc2l6ZShzZXRGaWxlY29udGVudENvbnRhaW5lckhlaWdodCk7Cn0KCmZ1bmN0aW9uIHNldHVwV2lraVRhYmxlU29ydGFibGVIZWFkZXIoKSB7CiAgaWYgKHR5cGVvZiBUYWJsZXNvcnQgPT09ICd1bmRlZmluZWQnKSB7IHJldHVybjsgfQogICQoJ2Rpdi53aWtpIHRhYmxlJykuZWFjaChmdW5jdGlvbihpLCB0YWJsZSl7CiAgICBpZiAodGFibGUucm93cy5sZW5ndGggPCAzKSByZXR1cm4gdHJ1ZTsKICAgIHZhciB0ciA9ICQodGFibGUucm93cykuZmlyc3QoKTsKICAgIGlmICh0ci5maW5kKCJUSCIpLmxlbmd0aCA+IDApIHsKICAgICAgdHIuYXR0cignZGF0YS1zb3J0LW1ldGhvZCcsICdub25lJyk7CiAgICAgIHRyLmZpbmQoIlREIikuYXR0cignZGF0YS1zb3J0LW1ldGhvZCcsICdub25lJyk7CiAgICAgIG5ldyBUYWJsZXNvcnQodGFibGUpOwogICAgfQogIH0pOwp9CgpmdW5jdGlvbiBzZXR1cEhvdmVyVG9vbHRpcHMoY29udGFpbmVyKSB7CiAgJChjb250YWluZXIgfHwgJ2JvZHknKS5maW5kKCJbdGl0bGVdOm5vdCgubm8tdG9vbHRpcCkiKS50b29sdGlwKHsKICAgIHNob3c6IHsKICAgICAgZGVsYXk6IDQwMAogICAgfSwKICAgIHBvc2l0aW9uOiB7CiAgICAgIG15OiAiY2VudGVyIGJvdHRvbS01IiwKICAgICAgYXQ6ICJjZW50ZXIgdG9wIgogICAgfQogIH0pOwp9CmZ1bmN0aW9uIHJlbW92ZUhvdmVyVG9vbHRpcHMoY29udGFpbmVyKSB7CiAgJChjb250YWluZXIgfHwgJ2JvZHknKS5maW5kKCJbdGl0bGVdOm5vdCgubm8tdG9vbHRpcCkiKS50b29sdGlwKCdkZXN0cm95JykKfQokKGZ1bmN0aW9uKCkgeyBzZXR1cEhvdmVyVG9vbHRpcHMoKTsgfSk7CgpmdW5jdGlvbiBpbmxpbmVBdXRvQ29tcGxldGUoZWxlbWVudCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIGRvIG5vdCBhdHRhY2ggaWYgVHJpYnV0ZSBpcyBhbHJlYWR5IGluaXRpYWxpemVkCiAgICBpZiAoZWxlbWVudC5kYXRhc2V0LnRyaWJ1dGUgPT09ICd0cnVlJykge3JldHVybn07CgogICAgY29uc3QgZ2V0RGF0YVNvdXJjZSA9IGZ1bmN0aW9uKGVudGl0eSkgewogICAgICBjb25zdCBkYXRhU291cmNlcyA9IHJtLkF1dG9Db21wbGV0ZS5kYXRhU291cmNlczsKCiAgICAgIGlmIChkYXRhU291cmNlc1tlbnRpdHldKSB7CiAgICAgICAgcmV0dXJuIGRhdGFTb3VyY2VzW2VudGl0eV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CgogICAgY29uc3QgZGVib3VuY2UgPSBmdW5jdGlvbihmdW5jLCBkZWxheSkgewogICAgICBsZXQgdGltZW91dDsKCiAgICAgIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7CiAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXM7CiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpOwogICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyksIGRlbGF5KTsKICAgICAgfTsKICAgIH0KCiAgICBjb25zdCByZW1vdGVTZWFyY2ggPSBkZWJvdW5jZSgodXJsLCBjYikgPT4gewogICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpCiAgICAgIHsKICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDQpIHsKICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgdmFyIGRhdGEgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpOwogICAgICAgICAgICBjYihkYXRhKTsKICAgICAgICAgIH0gZWxzZSBpZiAoeGhyLnN0YXR1cyA9PT0gNDAzKSB7CiAgICAgICAgICAgIGNiKFtdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH07CiAgICAgIHhoci5vcGVuKCJHRVQiLCB1cmwsIHRydWUpOwogICAgICB4aHIuc2VuZCgpOwogICAgfSwgMjAwKTsKCiAgICBjb25zdCB0cmlidXRlID0gbmV3IFRyaWJ1dGUoewogICAgICBjb2xsZWN0aW9uOiBbCiAgICAgICAgewogICAgICAgICAgdHJpZ2dlcjogJyMnLAogICAgICAgICAgdmFsdWVzOiBmdW5jdGlvbiAodGV4dCwgY2IpIHsKICAgICAgICAgICAgaWYgKGV2ZW50LnRhcmdldC50eXBlID09PSAndGV4dCcgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2F1dG9jb21wbGV0ZScpICE9ICdvZmYnKSB7CiAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2F1dG9jb21wbGV0ZScsICdvZmYnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBXaGVuIHRyaWdnZXJlZCB3aXRoIHRleHQgc3RhcnRpbmcgd2l0aCAiIyMiLCBsaWtlICIjI2EiLCB0aGUgc2VhcmNoIHRlcm0gd2lsbCBiZWNvbWUgIiNhIiwKICAgICAgICAgICAgLy8gY2F1c2luZyB0aGUgU1FMIHF1ZXJ5IHRvIGZhaWwgaW4gZmluZGluZyBpc3N1ZXMgd2l0aCAiYSIgaW4gdGhlIHN1YmplY3QuCiAgICAgICAgICAgIC8vIFRvIGF2b2lkIHRoaXMsIHJlbW92ZSB0aGUgZmlyc3QgIiMiIGZyb20gdGhlIHNlYXJjaCB0ZXJtLgogICAgICAgICAgICBpZiAodGV4dCkgewogICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL14jLywgJycpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbW90ZVNlYXJjaChnZXREYXRhU291cmNlKCdpc3N1ZXMnKSArIGVuY29kZVVSSUNvbXBvbmVudCh0ZXh0KSwgZnVuY3Rpb24gKGlzc3VlcykgewogICAgICAgICAgICAgIHJldHVybiBjYihpc3N1ZXMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICBsb29rdXA6ICdsYWJlbCcsCiAgICAgICAgICBmaWxsQXR0cjogJ2xhYmVsJywKICAgICAgICAgIHJlcXVpcmVMZWFkaW5nU3BhY2U6IHRydWUsCiAgICAgICAgICBzZWxlY3RUZW1wbGF0ZTogZnVuY3Rpb24gKGlzc3VlKSB7CiAgICAgICAgICAgIGxldCBsZWFkaW5nSGFzaCA9ICIjIgogICAgICAgICAgICAvLyBrZWVwICMjIHN5bnRheCB3aGljaCBpcyBhIHZhbGlkIGlzc3VlIHN5bnRheCB0byBzaG93IGlzc3VlIHdpdGggdGl0bGUuCiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRNZW50aW9uVGV4dFNuYXBzaG90LmNoYXJBdCgwKSA9PT0gIiMiKSB7CiAgICAgICAgICAgICAgbGVhZGluZ0hhc2ggPSAiIyMiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGxlYWRpbmdIYXNoICsgaXNzdWUub3JpZ2luYWwuaWQ7CiAgICAgICAgICB9LAogICAgICAgICAgbWVudUl0ZW1UZW1wbGF0ZTogZnVuY3Rpb24gKGlzc3VlKSB7CiAgICAgICAgICAgIHJldHVybiBzYW5pdGl6ZUhUTUwoaXNzdWUub3JpZ2luYWwubGFiZWwpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgdHJpZ2dlcjogJ1tbJywKICAgICAgICAgIHZhbHVlczogZnVuY3Rpb24gKHRleHQsIGNiKSB7CiAgICAgICAgICAgIHJlbW90ZVNlYXJjaChnZXREYXRhU291cmNlKCd3aWtpX3BhZ2VzJykgKyBlbmNvZGVVUklDb21wb25lbnQodGV4dCksIGZ1bmN0aW9uICh3aWtpUGFnZXMpIHsKICAgICAgICAgICAgICByZXR1cm4gY2Iod2lraVBhZ2VzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9LAogICAgICAgICAgbG9va3VwOiAnbGFiZWwnLAogICAgICAgICAgZmlsbEF0dHI6ICdsYWJlbCcsCiAgICAgICAgICByZXF1aXJlTGVhZGluZ1NwYWNlOiB0cnVlLAogICAgICAgICAgc2VsZWN0VGVtcGxhdGU6IGZ1bmN0aW9uICh3aWtpUGFnZSkgewogICAgICAgICAgICByZXR1cm4gJ1tbJyArIHdpa2lQYWdlLm9yaWdpbmFsLnZhbHVlICsgJ11dJzsKICAgICAgICAgIH0sCiAgICAgICAgICBtZW51SXRlbVRlbXBsYXRlOiBmdW5jdGlvbiAod2lraVBhZ2UpIHsKICAgICAgICAgICAgcmV0dXJuIHNhbml0aXplSFRNTCh3aWtpUGFnZS5vcmlnaW5hbC5sYWJlbCk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICB0cmlnZ2VyOiAnQCcsCiAgICAgICAgICBsb29rdXA6IGZ1bmN0aW9uICh1c2VyLCBtZW50aW9uVGV4dCkgewogICAgICAgICAgICByZXR1cm4gdXNlci5uYW1lICsgdXNlci5maXJzdG5hbWUgKyB1c2VyLmxhc3RuYW1lICsgdXNlci5sb2dpbjsKICAgICAgICAgIH0sCiAgICAgICAgICB2YWx1ZXM6IGZ1bmN0aW9uICh0ZXh0LCBjYikgewogICAgICAgICAgICBjb25zdCB1cmwgPSBnZXREYXRhU291cmNlKCd1c2VycycpOwogICAgICAgICAgICBpZiAodXJsKSB7CiAgICAgICAgICAgICAgcmVtb3RlU2VhcmNoKHVybCArIGVuY29kZVVSSUNvbXBvbmVudCh0ZXh0KSwgZnVuY3Rpb24gKHVzZXJzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2IodXNlcnMpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgbWVudUl0ZW1UZW1wbGF0ZTogZnVuY3Rpb24gKHVzZXIpIHsKICAgICAgICAgICAgcmV0dXJuIHVzZXIub3JpZ2luYWwubmFtZTsKICAgICAgICAgIH0sCiAgICAgICAgICBzZWxlY3RUZW1wbGF0ZTogZnVuY3Rpb24gKHVzZXIpIHsKICAgICAgICAgICAgcmV0dXJuICdAJyArIHVzZXIub3JpZ2luYWwubG9naW47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICBdLAogICAgICBub01hdGNoVGVtcGxhdGU6ICIiCiAgICB9KTsKCiAgICB0cmlidXRlLmF0dGFjaChlbGVtZW50KTsKfQoKLy8gY29sbGFwc2libGUgc2lkZWJhciBqUXVlcnkgcGx1Z2luCihmdW5jdGlvbigkKSB7CiAgLy8gbWFpbiBjb250YWluZXIgdGhpcyBpcyBhcHBsaWVkIHRvCiAgdmFyIG1haW47CiAgLy8gdHJpZ2dlcnMgc2hvdy9oaWRlCiAgdmFyIGJ1dHRvbjsKICAvLyB0aGUga2V5IHRvIHVzZSBpbiBsb2NhbCBzdG9yYWdlCiAgLy8gdGhpcyB3aWxsIGxhdGVyIGJlIGV4cGFuZGVkIHVzaW5nIHRoZSBjdXJyZW50IGNvbnRyb2xsZXIgYW5kIGFjdGlvbiB0bwogIC8vIGFsbG93IGZvciBkaWZmZXJlbnQgc2lkZWJhciBzdGF0ZXMgZm9yIGRpZmZlcmVudCBwYWdlcwogIHZhciBsb2NhbFN0b3JhZ2VLZXkgPSAncmVkbWluZS1zaWRlYmFyLXN0YXRlJzsKICAvLyB0cnVlIGlmIGxvY2FsIHN0b3JhZ2UgaXMgYXZhaWxhYmxlCiAgdmFyIGNhblVzZUxvY2FsU3RvcmFnZSA9IGZ1bmN0aW9uKCl7CiAgICB0cnkgewogICAgICBpZignbG9jYWxTdG9yYWdlJyBpbiB3aW5kb3cpewogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdyZWRtaW5lLnRlc3Quc3RvcmFnZScsICdvaycpOwogICAgICAgIHZhciBpdGVtID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3JlZG1pbmUudGVzdC5zdG9yYWdlJyk7CiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3JlZG1pbmUudGVzdC5zdG9yYWdlJyk7CiAgICAgICAgaWYoaXRlbSA9PT0gJ29rJykgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGVycikge30KICAgIHJldHVybiBmYWxzZTsKICB9KCk7CiAgLy8gZnVuY3Rpb24gdG8gc2V0IGN1cnJlbnQgc2lkZWJhciBzdGF0ZQogIHZhciBzZXRTdGF0ZSA9IGZ1bmN0aW9uKHN0YXRlKXsKICAgIGlmKGNhblVzZUxvY2FsU3RvcmFnZSl7CiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxvY2FsU3RvcmFnZUtleSwgc3RhdGUpOwogICAgfQogIH07CiAgdmFyIGFwcGx5U3RhdGUgPSBmdW5jdGlvbigpewogICAgaWYobWFpbi5oYXNDbGFzcygnY29sbGFwc2Vkc2lkZWJhcicpKXsKICAgICAgdXBkYXRlU1ZHSWNvbihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2lkZWJhci1zd2l0Y2gtYnV0dG9uJyksICdjaGV2cm9ucy1sZWZ0JykKICAgICAgc2V0U3RhdGUoJ2hpZGRlbicpOwogICAgfSBlbHNlIHsKICAgICAgdXBkYXRlU1ZHSWNvbihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2lkZWJhci1zd2l0Y2gtYnV0dG9uJyksICdjaGV2cm9ucy1yaWdodCcpCiAgICAgIHNldFN0YXRlKCd2aXNpYmxlJyk7CiAgICB9CiAgfTsKICB2YXIgc2V0dXBUb2dnbGVCdXR0b24gPSBmdW5jdGlvbigpewogICAgYnV0dG9uID0gJCgnI3NpZGViYXItc3dpdGNoLWJ1dHRvbicpOwogICAgYnV0dG9uLmNsaWNrKGZ1bmN0aW9uKGUpewogICAgICBtYWluLmFkZENsYXNzKCJhbmltYXRlIik7CiAgICAgIG1haW4udG9nZ2xlQ2xhc3MoJ2NvbGxhcHNlZHNpZGViYXInKTsKICAgICAgYXBwbHlTdGF0ZSgpOwogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwogICAgYXBwbHlTdGF0ZSgpOwogIH07CiAgJC5mbi5jb2xsYXBzaWJsZVNpZGViYXIgPSBmdW5jdGlvbigpIHsKICAgIG1haW4gPSB0aGlzOwogICAgLy8gZGV0ZXJtaW5lIHByZXZpb3VzbHkgc3RvcmVkIHNpZGViYXIgc3RhdGUgZm9yIHRoaXMgcGFnZQogICAgaWYoY2FuVXNlTG9jYWxTdG9yYWdlKSB7CiAgICAgIC8vIGRldGVybWluZSBjdXJyZW50IGNvbnRyb2xsZXIvYWN0aW9uIHBhaXIgYW5kIHVzZSB0aGVtIGFzIHN0b3JhZ2Uga2V5CiAgICAgIHZhciBib2R5Q2xhc3MgPSAkKCdib2R5JykuYXR0cignY2xhc3MnKTsKICAgICAgaWYoYm9keUNsYXNzKXsKICAgICAgICB0cnkgewogICAgICAgICAgbG9jYWxTdG9yYWdlS2V5ICs9ICctJyArIGJvZHlDbGFzcy5zcGxpdCgvXHMrLykuZmlsdGVyKGZ1bmN0aW9uKHMpewogICAgICAgICAgICByZXR1cm4gcy5tYXRjaCgvKGFjdGlvbnxjb250cm9sbGVyKS0uKi8pOwogICAgICAgICAgfSkuc29ydCgpLmpvaW4oJy0nKTsKICAgICAgICB9IGNhdGNoKGUpIHsKICAgICAgICAgIC8vIGluIGNhc2Ugb2YgZXJyb3IgKHByb2JhYmx5IElFOCksIGNvbnRpbnVlIHdpdGggdGhlIHVubW9kaWZpZWQga2V5CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciBzdG9yZWRTdGF0ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGxvY2FsU3RvcmFnZUtleSk7CiAgICAgIG1haW4udG9nZ2xlQ2xhc3MoJ2NvbGxhcHNlZHNpZGViYXInLCBzdG9yZWRTdGF0ZSA9PT0gJ2hpZGRlbicpOwogICAgfQogICAgLy8gZHJhdyB0aGUgdG9nZ2xlIGJ1dHRvbiBvbmNlIHRoZSBET00gaXMgY29tcGxldGUKICAgICQoZG9jdW1lbnQpLnJlYWR5KHNldHVwVG9nZ2xlQnV0dG9uKTsKICB9Owp9KGpRdWVyeSkpOwoKJChkb2N1bWVudCkucmVhZHkoc2V0dXBBamF4SW5kaWNhdG9yKTsKJChkb2N1bWVudCkucmVhZHkoaGlkZU9uTG9hZCk7CiQoZG9jdW1lbnQpLnJlYWR5KGFkZEZvcm1PYnNlcnZlcnNGb3JEb3VibGVTdWJtaXQpOwokKGRvY3VtZW50KS5yZWFkeShkZWZhdWx0Rm9jdXMpOwokKGRvY3VtZW50KS5yZWFkeShzZXR1cEF0dGFjaG1lbnREZXRhaWwpOwokKGRvY3VtZW50KS5yZWFkeShzZXR1cFRhYnMpOwokKGRvY3VtZW50KS5yZWFkeShzZXR1cEZpbGVQcmV2aWV3TmF2aWdhdGlvbik7CiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwV2lraVRhYmxlU29ydGFibGVIZWFkZXIpOwokKGRvY3VtZW50KS5vbignZm9jdXMnLCAnW2RhdGEtYXV0by1jb21wbGV0ZT10cnVlXScsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgaW5saW5lQXV0b0NvbXBsZXRlKGV2ZW50LnRhcmdldCk7Cn0pOwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgKCkgPT4geyBzZXR1cENvcHlCdXR0b25zVG9QcmVFbGVtZW50cygpOyB9KTsK" | |
| }, | |
| "attachments.js": { | |
| "hash": "934d0bc81faa9e3df22cf0fc2c4873e8", | |
| "path": "/usr/src/redmine/public/assets/attachments-f07e71fc.js", | |
| "base64": "LyoqCiAqIFJlZG1pbmUgLSBwcm9qZWN0IG1hbmFnZW1lbnQgc29mdHdhcmUKICogQ29weXJpZ2h0IChDKSAyMDA2LSAgSmVhbi1QaGlsaXBwZSBMYW5nCiAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCiAqLwoKZnVuY3Rpb24gYWRkRmlsZShpbnB1dEVsLCBmaWxlLCBlYWdlclVwbG9hZCkgewogIHZhciBhdHRhY2htZW50c0Zvcm0gPSAkKGlucHV0RWwpLmNsb3Nlc3QoJy5hdHRhY2htZW50c19mb3JtJykKICB2YXIgYXR0YWNobWVudHNGaWVsZHMgPSBhdHRhY2htZW50c0Zvcm0uZmluZCgnLmF0dGFjaG1lbnRzX2ZpZWxkcycpOwogIHZhciBhdHRhY2htZW50c0ljb25zID0gYXR0YWNobWVudHNGb3JtLmZpbmQoJy5hdHRhY2htZW50c19pY29ucycpOwogIHZhciBhZGRBdHRhY2htZW50ID0gYXR0YWNobWVudHNGb3JtLmZpbmQoJy5hZGRfYXR0YWNobWVudCcpOwogIHZhciBtYXhGaWxlcyA9ICgkKGlucHV0RWwpLmF0dHIoJ211bHRpcGxlJykgPT0gJ211bHRpcGxlJyA/IDEwIDogMSk7CiAgdmFyIGRlbEljb24gPSBhdHRhY2htZW50c0ljb25zLmZpbmQoJ3N2Zy5zdmctZGVsJykuY2xvbmUoKTsKICB2YXIgYXR0YWNobWVudEljb24gPSBhdHRhY2htZW50c0ljb25zLmZpbmQoJ3N2Zy5zdmctYXR0YWNobWVudCcpLmNsb25lKCk7CgogIGlmIChhdHRhY2htZW50c0ZpZWxkcy5jaGlsZHJlbigpLmxlbmd0aCA8IG1heEZpbGVzKSB7CiAgICB2YXIgYXR0YWNobWVudElkID0gYWRkRmlsZS5uZXh0QXR0YWNobWVudElkKys7CiAgICB2YXIgZmlsZVNwYW4gPSAkKCc8c3Bhbj4nLCB7IGlkOiAnYXR0YWNobWVudHNfJyArIGF0dGFjaG1lbnRJZCB9KTsKICAgIHZhciBwYXJhbSA9ICQoaW5wdXRFbCkuZGF0YSgncGFyYW0nKTsKICAgIGlmICghcGFyYW0pIHtwYXJhbSA9ICdhdHRhY2htZW50cyd9OwoKICAgIGZpbGVTcGFuLmFwcGVuZCgKICAgICAgICBhdHRhY2htZW50SWNvbiwKICAgICAgICAkKCc8aW5wdXQ+JywgeyB0eXBlOiAndGV4dCcsICdjbGFzcyc6ICdpY29uIGljb24tYXR0YWNobWVudCBmaWxlbmFtZSByZWFkb25seScsIG5hbWU6IHBhcmFtICsnWycgKyBhdHRhY2htZW50SWQgKyAnXVtmaWxlbmFtZV0nLCByZWFkb25seTogJ3JlYWRvbmx5J30gKS52YWwoZmlsZS5uYW1lKSwKICAgICAgICAkKCc8aW5wdXQ+JywgeyB0eXBlOiAndGV4dCcsICdjbGFzcyc6ICdkZXNjcmlwdGlvbicsIG5hbWU6IHBhcmFtICsgJ1snICsgYXR0YWNobWVudElkICsgJ11bZGVzY3JpcHRpb25dJywgbWF4bGVuZ3RoOiAyNTUsIHBsYWNlaG9sZGVyOiAkKGlucHV0RWwpLmRhdGEoJ2Rlc2NyaXB0aW9uLXBsYWNlaG9sZGVyJykgfSApLnRvZ2dsZSghZWFnZXJVcGxvYWQpLAogICAgICAgICQoJzxpbnB1dD4nLCB7IHR5cGU6ICdoaWRkZW4nLCAnY2xhc3MnOiAndG9rZW4nLCBuYW1lOiBwYXJhbSArICdbJyArIGF0dGFjaG1lbnRJZCArICddW3Rva2VuXSd9ICksCiAgICAgICAgJCgnPGE+JywgeyBocmVmOiAiIyIsICdjbGFzcyc6ICdpY29uLW9ubHkgaWNvbi1kZWwgcmVtb3ZlLXVwbG9hZCcgfSkuYXBwZW5kKGRlbEljb24pLmNsaWNrKHJlbW92ZUZpbGUpLnRvZ2dsZSghZWFnZXJVcGxvYWQpCiAgICApLmFwcGVuZFRvKGF0dGFjaG1lbnRzRmllbGRzKTsKCgogICAgaWYgKCQoaW5wdXRFbCkuZGF0YSgnZGVzY3JpcHRpb24nKSA9PSAwKSB7CiAgICAgIGZpbGVTcGFuLmZpbmQoJ2lucHV0LmRlc2NyaXB0aW9uJykucmVtb3ZlKCk7CiAgICB9CgogICAgaWYoZWFnZXJVcGxvYWQpIHsKICAgICAgYWpheFVwbG9hZChmaWxlLCBhdHRhY2htZW50SWQsIGZpbGVTcGFuLCBpbnB1dEVsKTsKICAgIH0KCiAgICBhZGRBdHRhY2htZW50LnRvZ2dsZShhdHRhY2htZW50c0ZpZWxkcy5jaGlsZHJlbigpLmxlbmd0aCA8IG1heEZpbGVzKTsKICAgIHJldHVybiBhdHRhY2htZW50SWQ7CiAgfQogIHJldHVybiBudWxsOwp9CgphZGRGaWxlLm5leHRBdHRhY2htZW50SWQgPSAxOwoKZnVuY3Rpb24gYWpheFVwbG9hZChmaWxlLCBhdHRhY2htZW50SWQsIGZpbGVTcGFuLCBpbnB1dEVsKSB7CiAgbGV0IGF0dGFjaG1lbnRJY29uID0gJChmaWxlU3BhbikuZmluZCgnc3ZnLnN2Zy1hdHRhY2htZW50Jyk7CgogIGZ1bmN0aW9uIG9uTG9hZHN0YXJ0KGUpIHsKICAgIGZpbGVTcGFuLnJlbW92ZUNsYXNzKCdhamF4LXdhaXRpbmcnKTsKICAgIGZpbGVTcGFuLmFkZENsYXNzKCdhamF4LWxvYWRpbmcnKTsKICAgIGF0dGFjaG1lbnRJY29uLmFkZENsYXNzKCdzdmctbG9hZGVyJyk7CiAgICB1cGRhdGVTVkdJY29uKGF0dGFjaG1lbnRJY29uWzBdLCAnbG9hZGVyJykKICAgICQoJ2lucHV0OnN1Ym1pdCcsICQodGhpcykucGFyZW50cygnZm9ybScpKS5hdHRyKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpOwogIH0KCiAgZnVuY3Rpb24gb25Qcm9ncmVzcyhlKSB7CiAgICBpZihlLmxlbmd0aENvbXB1dGFibGUpIHsKICAgICAgdGhpcy5wcm9ncmVzc2JhciggJ3ZhbHVlJywgZS5sb2FkZWQgKiAxMDAgLyBlLnRvdGFsICk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhY3R1YWxVcGxvYWQoZmlsZSwgYXR0YWNobWVudElkLCBmaWxlU3BhbiwgaW5wdXRFbCkgewoKICAgIGFqYXhVcGxvYWQudXBsb2FkaW5nKys7CgogICAgdXBsb2FkQmxvYihmaWxlLCAkKGlucHV0RWwpLmRhdGEoJ3VwbG9hZC1wYXRoJyksIGF0dGFjaG1lbnRJZCwgewogICAgICAgIGxvYWRzdGFydEV2ZW50SGFuZGxlcjogb25Mb2Fkc3RhcnQuYmluZChwcm9ncmVzc1NwYW4pLAogICAgICAgIHByb2dyZXNzRXZlbnRIYW5kbGVyOiBvblByb2dyZXNzLmJpbmQocHJvZ3Jlc3NTcGFuKQogICAgICB9KQogICAgICAuZG9uZShmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICBhZGRJbmxpbmVBdHRhY2htZW50TWFya3VwKGZpbGUpOwogICAgICAgIHByb2dyZXNzU3Bhbi5wcm9ncmVzc2JhciggJ3ZhbHVlJywgMTAwICkucmVtb3ZlKCk7CiAgICAgICAgZmlsZVNwYW4uZmluZCgnaW5wdXQuZGVzY3JpcHRpb24sIGEnKS5jc3MoJ2Rpc3BsYXknLCAnaW5saW5lLWZsZXgnKTsKICAgICAgfSkKICAgICAgLmZhaWwoZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgcHJvZ3Jlc3NTcGFuLnRleHQocmVzdWx0LnN0YXR1c1RleHQpOwogICAgICB9KS5hbHdheXMoZnVuY3Rpb24oKSB7CiAgICAgICAgYWpheFVwbG9hZC51cGxvYWRpbmctLTsKICAgICAgICBmaWxlU3Bhbi5yZW1vdmVDbGFzcygnYWpheC1sb2FkaW5nJyk7CiAgICAgICAgYXR0YWNobWVudEljb24ucmVtb3ZlQ2xhc3MoJ3N2Zy1sb2FkZXInKTsKICAgICAgICB1cGRhdGVTVkdJY29uKGF0dGFjaG1lbnRJY29uWzBdLCAnYXR0YWNobWVudCcpOwogICAgICAgIHZhciBmb3JtID0gZmlsZVNwYW4ucGFyZW50cygnZm9ybScpOwogICAgICAgIGlmIChmb3JtLnF1ZXVlKCd1cGxvYWQnKS5sZW5ndGggPT0gMCAmJiBhamF4VXBsb2FkLnVwbG9hZGluZyA9PSAwKSB7CiAgICAgICAgICAkKCdpbnB1dDpzdWJtaXQnLCBmb3JtKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpOwogICAgICAgIH0KICAgICAgICBmb3JtLmRlcXVldWUoJ3VwbG9hZCcpOwogICAgICB9KTsKICB9CgogIHZhciBwcm9ncmVzc1NwYW4gPSAkKCc8ZGl2PicpLmluc2VydEFmdGVyKGZpbGVTcGFuLmZpbmQoJ2lucHV0LmZpbGVuYW1lJykpOwogIHByb2dyZXNzU3Bhbi5wcm9ncmVzc2JhcigpOwogIGZpbGVTcGFuLmFkZENsYXNzKCdhamF4LXdhaXRpbmcnKTsKICB1cGRhdGVTVkdJY29uKGF0dGFjaG1lbnRJY29uWzBdLCAnaG91cmdsYXNzJyk7CgogIHZhciBtYXhTeW5jVXBsb2FkID0gJChpbnB1dEVsKS5kYXRhKCdtYXgtY29uY3VycmVudC11cGxvYWRzJyk7CgogIGlmKG1heFN5bmNVcGxvYWQgPT0gbnVsbCB8fCBtYXhTeW5jVXBsb2FkIDw9IDAgfHwgYWpheFVwbG9hZC51cGxvYWRpbmcgPCBtYXhTeW5jVXBsb2FkKQogICAgYWN0dWFsVXBsb2FkKGZpbGUsIGF0dGFjaG1lbnRJZCwgZmlsZVNwYW4sIGlucHV0RWwpOwogIGVsc2UKICAgICQoaW5wdXRFbCkucGFyZW50cygnZm9ybScpLnF1ZXVlKCd1cGxvYWQnLCBhY3R1YWxVcGxvYWQuYmluZCh0aGlzLCBmaWxlLCBhdHRhY2htZW50SWQsIGZpbGVTcGFuLCBpbnB1dEVsKSk7Cn0KCmFqYXhVcGxvYWQudXBsb2FkaW5nID0gMDsKCmZ1bmN0aW9uIHJlbW92ZUZpbGUoKSB7CiAgJCh0aGlzKS5jbG9zZXN0KCcuYXR0YWNobWVudHNfZm9ybScpLmZpbmQoJy5hZGRfYXR0YWNobWVudCcpLnNob3coKTsKICAkKHRoaXMpLnBhcmVudCgnc3BhbicpLnJlbW92ZSgpOwogIHJldHVybiBmYWxzZTsKfQoKZnVuY3Rpb24gdXBsb2FkQmxvYihibG9iLCB1cGxvYWRVcmwsIGF0dGFjaG1lbnRJZCwgb3B0aW9ucykgewoKICB2YXIgYWN0dWFsT3B0aW9ucyA9ICQuZXh0ZW5kKHsKICAgIGxvYWRzdGFydEV2ZW50SGFuZGxlcjogJC5ub29wLAogICAgcHJvZ3Jlc3NFdmVudEhhbmRsZXI6ICQubm9vcAogIH0sIG9wdGlvbnMpOwoKICB1cGxvYWRVcmwgPSB1cGxvYWRVcmwgKyAnP2F0dGFjaG1lbnRfaWQ9JyArIGF0dGFjaG1lbnRJZDsKICBpZiAoYmxvYiBpbnN0YW5jZW9mIHdpbmRvdy5CbG9iKSB7CiAgICB1cGxvYWRVcmwgKz0gJyZmaWxlbmFtZT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGJsb2IubmFtZSk7CiAgICB1cGxvYWRVcmwgKz0gJyZjb250ZW50X3R5cGU9JyArIGVuY29kZVVSSUNvbXBvbmVudChibG9iLnR5cGUpOwogIH0KCiAgcmV0dXJuICQuYWpheCh1cGxvYWRVcmwsIHsKICAgIHR5cGU6ICdQT1NUJywKICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKICAgIGJlZm9yZVNlbmQ6IGZ1bmN0aW9uKGpxWGhyLCBzZXR0aW5ncykgewogICAgICBqcVhoci5zZXRSZXF1ZXN0SGVhZGVyKCdBY2NlcHQnLCAnYXBwbGljYXRpb24vanMnKTsKICAgICAgLy8gYXR0YWNoIHByb3BlciBGaWxlIG9iamVjdAogICAgICBzZXR0aW5ncy5kYXRhID0gYmxvYjsKICAgIH0sCiAgICB4aHI6IGZ1bmN0aW9uKCkgewogICAgICB2YXIgeGhyID0gJC5hamF4U2V0dGluZ3MueGhyKCk7CiAgICAgIHhoci51cGxvYWQub25sb2Fkc3RhcnQgPSBhY3R1YWxPcHRpb25zLmxvYWRzdGFydEV2ZW50SGFuZGxlcjsKICAgICAgeGhyLnVwbG9hZC5vbnByb2dyZXNzID0gYWN0dWFsT3B0aW9ucy5wcm9ncmVzc0V2ZW50SGFuZGxlcjsKICAgICAgcmV0dXJuIHhocjsKICAgIH0sCiAgICBkYXRhOiBibG9iLAogICAgY2FjaGU6IGZhbHNlLAogICAgcHJvY2Vzc0RhdGE6IGZhbHNlCiAgfSk7Cn0KCmZ1bmN0aW9uIGFkZElucHV0RmlsZXMoaW5wdXRFbCkgewogIHZhciBhdHRhY2htZW50c0ZpZWxkcyA9ICQoaW5wdXRFbCkuY2xvc2VzdCgnLmF0dGFjaG1lbnRzX2Zvcm0nKS5maW5kKCcuYXR0YWNobWVudHNfZmllbGRzJyk7CiAgdmFyIGFkZEF0dGFjaG1lbnQgPSAkKGlucHV0RWwpLmNsb3Nlc3QoJy5hdHRhY2htZW50c19mb3JtJykuZmluZCgnLmFkZF9hdHRhY2htZW50Jyk7CiAgdmFyIGNsZWFyZWRGaWxlSW5wdXQgPSAkKGlucHV0RWwpLmNsb25lKCkudmFsKCcnKTsKICB2YXIgc2l6ZUV4Y2VlZGVkID0gZmFsc2U7CiAgdmFyIHBhcmFtID0gJChpbnB1dEVsKS5kYXRhKCdwYXJhbScpOwogIGlmICghcGFyYW0pIHtwYXJhbSA9ICdhdHRhY2htZW50cyd9OwoKICBpZiAoJC5hamF4U2V0dGluZ3MueGhyKCkudXBsb2FkICYmIGlucHV0RWwuZmlsZXMpIHsKICAgIC8vIHVwbG9hZCBmaWxlcyB1c2luZyBhamF4CiAgICBzaXplRXhjZWVkZWQgPSB1cGxvYWRBbmRBdHRhY2hGaWxlcyhpbnB1dEVsLmZpbGVzLCBpbnB1dEVsKTsKICAgICQoaW5wdXRFbCkucmVtb3ZlKCk7CiAgfSBlbHNlIHsKICAgIC8vIGJyb3dzZXIgbm90IHN1cHBvcnRpbmcgdGhlIGZpbGUgQVBJLCB1cGxvYWQgb24gZm9ybSBzdWJtaXNzaW9uCiAgICB2YXIgYXR0YWNobWVudElkOwogICAgdmFyIGFGaWxlbmFtZSA9IGlucHV0RWwudmFsdWUuc3BsaXQoL1wvfFxcLyk7CiAgICBhdHRhY2htZW50SWQgPSBhZGRGaWxlKGlucHV0RWwsIHsgbmFtZTogYUZpbGVuYW1lWyBhRmlsZW5hbWUubGVuZ3RoIC0gMSBdIH0sIGZhbHNlKTsKICAgIGlmIChhdHRhY2htZW50SWQpIHsKICAgICAgJChpbnB1dEVsKS5hdHRyKHsgbmFtZTogcGFyYW0gKyAnWycgKyBhdHRhY2htZW50SWQgKyAnXVtmaWxlXScsIHN0eWxlOiAnZGlzcGxheTpub25lOycgfSkuYXBwZW5kVG8oJyNhdHRhY2htZW50c18nICsgYXR0YWNobWVudElkKTsKICAgIH0KICB9CgogIGNsZWFyZWRGaWxlSW5wdXQucHJlcGVuZFRvKGFkZEF0dGFjaG1lbnQpOwp9CgpmdW5jdGlvbiB1cGxvYWRBbmRBdHRhY2hGaWxlcyhmaWxlcywgaW5wdXRFbCkgewoKICB2YXIgbWF4RmlsZVNpemUgPSAkKGlucHV0RWwpLmRhdGEoJ21heC1maWxlLXNpemUnKTsKICB2YXIgbWF4RmlsZVNpemVFeGNlZWRlZCA9ICQoaW5wdXRFbCkuZGF0YSgnbWF4LWZpbGUtc2l6ZS1tZXNzYWdlJyk7CgogIHZhciBzaXplRXhjZWVkZWQgPSBmYWxzZTsKICB2YXIgZmlsZXNMZW5ndGggPSAkKGlucHV0RWwpLmNsb3Nlc3QoJy5hdHRhY2htZW50c19mb3JtJykuZmluZCgnLmF0dGFjaG1lbnRzX2ZpZWxkcycpLmNoaWxkcmVuKCkubGVuZ3RoICsgZmlsZXMubGVuZ3RoCiAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLnNpemUgJiYgbWF4RmlsZVNpemUgIT0gbnVsbCAmJiB0aGlzLnNpemUgPiBwYXJzZUludChtYXhGaWxlU2l6ZSkpIHtzaXplRXhjZWVkZWQ9dHJ1ZTt9CiAgfSk7CiAgaWYgKHNpemVFeGNlZWRlZCkgewogICAgd2luZG93LmFsZXJ0KG1heEZpbGVTaXplRXhjZWVkZWQpOwogIH0gZWxzZSB7CiAgICAkLmVhY2goZmlsZXMsIGZ1bmN0aW9uKCkge2FkZEZpbGUoaW5wdXRFbCwgdGhpcywgdHJ1ZSk7fSk7CiAgfQoKICBpZiAoZmlsZXNMZW5ndGggPiAoJChpbnB1dEVsKS5hdHRyKCdtdWx0aXBsZScpID09ICdtdWx0aXBsZScgPyAxMCA6IDEpKSB7CiAgICB3aW5kb3cuYWxlcnQoJChpbnB1dEVsKS5kYXRhKCdtYXgtbnVtYmVyLW9mLWZpbGVzLW1lc3NhZ2UnKSk7CiAgfQogIHJldHVybiBzaXplRXhjZWVkZWQ7Cn0KCmZ1bmN0aW9uIGhhbmRsZUZpbGVEcm9wRXZlbnQoZSkgewoKICAkKHRoaXMpLnJlbW92ZUNsYXNzKCdmaWxlb3ZlcicpOwogIGJsb2NrRXZlbnRQcm9wYWdhdGlvbihlKTsKCiAgaWYgKCQuaW5BcnJheSgnRmlsZXMnLCBlLmRhdGFUcmFuc2Zlci50eXBlcykgPiAtMSkgewogICAgaGFuZGxlRmlsZURyb3BFdmVudC50YXJnZXQgPSBlLnRhcmdldDsKICAgIGlmICgkKHRoaXMpLmhhc0NsYXNzKCdjdXN0b20tZmllbGQtZmlsZWRyb3BsaXN0bmVyJykpewogICAgICB1cGxvYWRBbmRBdHRhY2hGaWxlcyhlLmRhdGFUcmFuc2Zlci5maWxlcywgJCh0aGlzKS5maW5kKCdpbnB1dDpmaWxlLmN1c3RvbS1maWVsZC1maWxlZHJvcCcpLmZpcnN0KCkpOwogICAgfSBlbHNlIHsKICAgICAgdXBsb2FkQW5kQXR0YWNoRmlsZXMoZS5kYXRhVHJhbnNmZXIuZmlsZXMsICQodGhpcykuZmluZCgnaW5wdXQ6ZmlsZS5maWxlZHJvcCcpLmZpcnN0KCkpOwogICAgfQogIH0KfQpoYW5kbGVGaWxlRHJvcEV2ZW50LnRhcmdldCA9ICcnOwoKZnVuY3Rpb24gZHJhZ092ZXJIYW5kbGVyKGUpIHsKICAkKHRoaXMpLmFkZENsYXNzKCdmaWxlb3ZlcicpOwogIGJsb2NrRXZlbnRQcm9wYWdhdGlvbihlKTsKICBlLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ2NvcHknOwp9CgpmdW5jdGlvbiBkcmFnT3V0SGFuZGxlcihlKSB7CiAgJCh0aGlzKS5yZW1vdmVDbGFzcygnZmlsZW92ZXInKTsKICBibG9ja0V2ZW50UHJvcGFnYXRpb24oZSk7Cn0KCmZ1bmN0aW9uIHNldHVwRmlsZURyb3AoKSB7CiAgaWYgKHdpbmRvdy5GaWxlICYmIHdpbmRvdy5GaWxlTGlzdCAmJiB3aW5kb3cuUHJvZ3Jlc3NFdmVudCAmJiB3aW5kb3cuRm9ybURhdGEpIHsKCiAgICAkLmV2ZW50LmFkZFByb3AoJ2RhdGFUcmFuc2ZlcicpOwoKICAgICQoJ2Zvcm0gZGl2LmJveDpub3QoLmZpbGVkcm9wbGlzdG5lciknKS5oYXMoJ2lucHV0OmZpbGUuZmlsZWRyb3AnKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAkKHRoaXMpLm9uKHsKICAgICAgICAgIGRyYWdvdmVyOiBkcmFnT3ZlckhhbmRsZXIsCiAgICAgICAgICBkcmFnbGVhdmU6IGRyYWdPdXRIYW5kbGVyLAogICAgICAgICAgZHJvcDogaGFuZGxlRmlsZURyb3BFdmVudCwKICAgICAgICAgIHBhc3RlOiBjb3B5SW1hZ2VGcm9tQ2xpcGJvYXJkCiAgICAgIH0pLmFkZENsYXNzKCdmaWxlZHJvcGxpc3RuZXInKTsKICAgIH0pOwoKICAgICQoJ2Zvcm0gZGl2LmJveCBpbnB1dDpmaWxlLmN1c3RvbS1maWVsZC1maWxlZHJvcCcpLmNsb3Nlc3QoJ3AnKS5ub3QoJy5jdXN0b20tZmllbGQtZmlsZWRyb3BsaXN0bmVyJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgJCh0aGlzKS5vbih7CiAgICAgICAgICBkcmFnb3ZlcjogZHJhZ092ZXJIYW5kbGVyLAogICAgICAgICAgZHJhZ2xlYXZlOiBkcmFnT3V0SGFuZGxlciwKICAgICAgICAgIGRyb3A6IGhhbmRsZUZpbGVEcm9wRXZlbnQKICAgICAgfSkuYWRkQ2xhc3MoJ2N1c3RvbS1maWVsZC1maWxlZHJvcGxpc3RuZXInKTsKICAgIH0pOwogIH0KfQoKZnVuY3Rpb24gZ2V0SW1hZ2VXaWR0aChmaWxlKSB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgIGlmIChmaWxlLnR5cGUuc3RhcnRzV2l0aCgiaW1hZ2UvIikpIHsKICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7CiAgICAgICAgaW1nLm9ubG9hZCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmVzb2x2ZShpbWcud2lkdGgpOwogICAgICAgIH07CiAgICAgICAgaW1nLm9uZXJyb3IgPSByZWplY3Q7CiAgICAgICAgaW1nLnNyYyA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7CiAgICAgIH07CiAgICAgIHJlYWRlci5vbmVycm9yID0gcmVqZWN0OwogICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJlc29sdmUoMCk7CiAgICB9CiAgfSk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGdldElubGluZUF0dGFjaG1lbnRNYXJrdXAoZmlsZSkgewogIGNvbnN0IHNhbml0aXplZEZpbGVuYW1lID0gZmlsZS5uYW1lLnJlcGxhY2UoL1tcL1w/XCVcKlw6XHxcIlwnPD5cblxyXSsvZywgJ18nKTsKICBjb25zdCBpbmxpbmVGaWxlbmFtZSA9IGVuY29kZVVSSUNvbXBvbmVudChzYW5pdGl6ZWRGaWxlbmFtZSkKICAgIC5yZXBsYWNlKC9bISgpXS9nLCBmdW5jdGlvbihtYXRjaCkgeyByZXR1cm4gIiUiICsgbWF0Y2guY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikgfSk7CgogIGNvbnN0IGlzRnJvbUNsaXBib2FyZCA9IC9eY2xpcGJvYXJkLVxkezEyfS1bYS16MC05XXs1fVwuXHcrJC8udGVzdChmaWxlLm5hbWUpOwogIGxldCBpbWFnZURpc3BsYXlXaWR0aDsKICBpZiAoaXNGcm9tQ2xpcGJvYXJkKSB7CiAgICBjb25zdCBpbWFnZVdpZHRoID0gYXdhaXQgZ2V0SW1hZ2VXaWR0aChmaWxlKS5jYXRjaCgoKSA9PiAwKTsKICAgIGltYWdlRGlzcGxheVdpZHRoID0gTWF0aC5yb3VuZChpbWFnZVdpZHRoIC8gd2luZG93LmRldmljZVBpeGVsUmF0aW8pOwogIH0KICBjb25zdCBoYXNWYWxpZFdpZHRoID0gaXNGcm9tQ2xpcGJvYXJkICYmIGltYWdlRGlzcGxheVdpZHRoID4gMDsKCiAgc3dpdGNoIChkb2N1bWVudC5ib2R5LmdldEF0dHJpYnV0ZSgnZGF0YS10ZXh0LWZvcm1hdHRpbmcnKSkgewogICAgY2FzZSAndGV4dGlsZSc6CiAgICAgIHJldHVybiBoYXNWYWxpZFdpZHRoCiAgICAgICAgPyBgIXt3aWR0aDogJHtpbWFnZURpc3BsYXlXaWR0aH1weH0uJHtpbmxpbmVGaWxlbmFtZX0hYAogICAgICAgIDogYCEke2lubGluZUZpbGVuYW1lfSFgOwogICAgY2FzZSAnY29tbW9uX21hcmsnOgogICAgICByZXR1cm4gaGFzVmFsaWRXaWR0aAogICAgICAgID8gYDxpbWcgc3R5bGU9IndpZHRoOiAke2ltYWdlRGlzcGxheVdpZHRofXB4OyIgc3JjPSIke2lubGluZUZpbGVuYW1lfSI+PGJyPmAKICAgICAgICA6IGAhW10oJHtpbmxpbmVGaWxlbmFtZX0pYDsKICAgIGRlZmF1bHQ6CiAgICAgIC8vIFRleHQgZm9ybWF0dGluZyBpcyAibm9uZSIgb3IgdW5rbm93bgogICAgICByZXR1cm4gJyc7CiAgfQp9CgpmdW5jdGlvbiBhZGRJbmxpbmVBdHRhY2htZW50TWFya3VwKGZpbGUpIHsKICAvLyBpbnNlcnQgdXBsb2FkZWQgaW1hZ2UgaW5saW5lIGlmIGRyb3BwZWQgYXJlYSBpcyBjdXJyZW50bHkgZm9jdXNlZCB0ZXh0YXJlYQogIGlmKCQoaGFuZGxlRmlsZURyb3BFdmVudC50YXJnZXQpLmhhc0NsYXNzKCd3aWtpLWVkaXQnKSAmJiAkLmluQXJyYXkoZmlsZS50eXBlLCB3aW5kb3cud2lraUltYWdlTWltZVR5cGVzKSA+IC0xKSB7CiAgICB2YXIgJHRleHRhcmVhID0gJChoYW5kbGVGaWxlRHJvcEV2ZW50LnRhcmdldCk7CiAgICB2YXIgY3Vyc29yUG9zaXRpb24gPSAkdGV4dGFyZWEucHJvcCgnc2VsZWN0aW9uU3RhcnQnKTsKICAgIHZhciBkZXNjcmlwdGlvbiA9ICR0ZXh0YXJlYS52YWwoKTsKICAgIHZhciBuZXdMaW5lQmVmb3JlID0gdHJ1ZTsKICAgIHZhciBuZXdMaW5lQWZ0ZXIgPSB0cnVlOwogICAgaWYoY3Vyc29yUG9zaXRpb24gPT09IDAgfHwgZGVzY3JpcHRpb24uc3Vic3RyKGN1cnNvclBvc2l0aW9uLTEsMSkubWF0Y2goL1xyfFxuLykpIHsKICAgICAgbmV3TGluZUJlZm9yZSA9IGZhbHNlOwogICAgfQogICAgaWYoZGVzY3JpcHRpb24uc3Vic3RyKGN1cnNvclBvc2l0aW9uLDEpLm1hdGNoKC9ccnxcbi8pKSB7CiAgICAgIG5ld0xpbmVBZnRlciA9IGZhbHNlOwogICAgfQoKICAgIGdldElubGluZUF0dGFjaG1lbnRNYXJrdXAoZmlsZSkKICAgICAgLnRoZW4oaW1hZ2VNYXJrdXAgPT4gewogICAgICAgICR0ZXh0YXJlYS52YWwoCiAgICAgICAgICBkZXNjcmlwdGlvbi5zdWJzdHJpbmcoMCwgY3Vyc29yUG9zaXRpb24pCiAgICAgICAgICArIChuZXdMaW5lQmVmb3JlID8gJ1xuJyA6ICcnKQogICAgICAgICAgKyBpbWFnZU1hcmt1cAogICAgICAgICAgKyAobmV3TGluZUFmdGVyID8gJ1xuJyA6ICcnKQogICAgICAgICAgKyBkZXNjcmlwdGlvbi5zdWJzdHJpbmcoY3Vyc29yUG9zaXRpb24sIGRlc2NyaXB0aW9uLmxlbmd0aCkKICAgICAgICApOwogICAgICB9KQoKICAgIC8vIG1vdmUgY3Vyc29yIGludG8gbmV4dCBsaW5lCiAgICBjdXJzb3JQb3NpdGlvbiA9ICR0ZXh0YXJlYS5wcm9wKCdzZWxlY3Rpb25TdGFydCcpOwogICAgJHRleHRhcmVhLnByb3AoewogICAgICAnc2VsZWN0aW9uU3RhcnQnOiBjdXJzb3JQb3NpdGlvbiArIDEsCiAgICAgICdzZWxlY3Rpb25FbmQnOiBjdXJzb3JQb3NpdGlvbiArIDEKICAgIH0pOwoKICB9Cn0KCmZ1bmN0aW9uIGNvcHlJbWFnZUZyb21DbGlwYm9hcmQoZSkgewogIGlmICghJChlLnRhcmdldCkuaGFzQ2xhc3MoJ3dpa2ktZWRpdCcpKSB7IHJldHVybjsgfQogIHZhciBjbGlwYm9hcmREYXRhID0gZS5jbGlwYm9hcmREYXRhIHx8IGUub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhCiAgaWYgKCFjbGlwYm9hcmREYXRhKSB7IHJldHVybjsgfQogIGlmIChjbGlwYm9hcmREYXRhLnR5cGVzLnNvbWUoZnVuY3Rpb24odCl7IHJldHVybiAvXnRleHRcL3BsYWluJC8udGVzdCh0KTsgfSkpIHsgcmV0dXJuOyB9CgogIHZhciBmaWxlcyA9IGNsaXBib2FyZERhdGEuZmlsZXMKICBmb3IgKHZhciBpID0gMCA7IGkgPCBmaWxlcy5sZW5ndGggOyBpKyspIHsKICAgIHZhciBmaWxlID0gZmlsZXNbaV07CiAgICBpZiAoZmlsZS50eXBlLmluZGV4T2YoImltYWdlIikgIT0gLTEpIHsKICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgpOwogICAgICB2YXIgZmlsZW5hbWUgPSAnY2xpcGJvYXJkLScKICAgICAgICArIGRhdGUuZ2V0RnVsbFllYXIoKQogICAgICAgICsgKCcwJysoZGF0ZS5nZXRNb250aCgpKzEpKS5zbGljZSgtMikKICAgICAgICArICgnMCcrZGF0ZS5nZXREYXRlKCkpLnNsaWNlKC0yKQogICAgICAgICsgKCcwJytkYXRlLmdldEhvdXJzKCkpLnNsaWNlKC0yKQogICAgICAgICsgKCcwJytkYXRlLmdldE1pbnV0ZXMoKSkuc2xpY2UoLTIpCiAgICAgICAgKyAnLScgKyByYW5kb21LZXkoNSkudG9Mb2NhbGVMb3dlckNhc2UoKQogICAgICAgICsgJy4nICsgZmlsZS5uYW1lLnNwbGl0KCcuJykucG9wKCk7CgogICAgICAvLyBnZXQgaW5wdXQgZmlsZSBpbiB0aGUgY2xvc2VzdCBmb3JtCiAgICAgIHZhciBpbnB1dEVsID0gJCh0aGlzKS5jbG9zZXN0KCJmb3JtIikuZmluZCgnaW5wdXQ6ZmlsZS5maWxlZHJvcCcpOwogICAgICBoYW5kbGVGaWxlRHJvcEV2ZW50LnRhcmdldCA9IGUudGFyZ2V0OwogICAgICBhZGRGaWxlKGlucHV0RWwsIG5ldyBGaWxlKFtmaWxlXSwgZmlsZW5hbWUsIHsgdHlwZTogZmlsZS50eXBlIH0pLCB0cnVlKTsKICAgIH0KICB9Cn0KCiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwRmlsZURyb3ApOwokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICQoImlucHV0LmRlbGV0ZWRfYXR0YWNobWVudCIpLmNoYW5nZShmdW5jdGlvbigpewogICAgJCh0aGlzKS5wYXJlbnRzKCcuZXhpc3RpbmctYXR0YWNobWVudCcpLnRvZ2dsZUNsYXNzKCdkZWxldGVkJywgJCh0aGlzKS5pcygiOmNoZWNrZWQiKSk7CiAgfSkuY2hhbmdlKCk7Cn0pOwo=" | |
| } | |
| }, | |
| "6.0.9": { | |
| "application.js": { | |
| "hash": "ed608a95b954885b7bec3384af9ccabb", | |
| "path": "/usr/src/redmine/public/assets/application-14833e45.js", | |
| "base64": "LyoqCiAqIFJlZG1pbmUgLSBwcm9qZWN0IG1hbmFnZW1lbnQgc29mdHdhcmUKICogQ29weXJpZ2h0IChDKSAyMDA2LSAgSmVhbi1QaGlsaXBwZSBMYW5nCiAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCiAqLwoKZnVuY3Rpb24gc2FuaXRpemVIVE1MKHN0cmluZykgewogIHZhciB0ZW1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIHRlbXAudGV4dENvbnRlbnQgPSBzdHJpbmc7CiAgcmV0dXJuIHRlbXAuaW5uZXJIVE1MOwp9CgpmdW5jdGlvbiBjaGVja0FsbChpZCwgY2hlY2tlZCkgewogICQoJyMnK2lkKS5maW5kKCdpbnB1dFt0eXBlPWNoZWNrYm94XTplbmFibGVkJykucHJvcCgnY2hlY2tlZCcsIGNoZWNrZWQpOwp9CgpmdW5jdGlvbiB0b2dnbGVDaGVja2JveGVzQnlTZWxlY3RvcihzZWxlY3RvcikgewogIHZhciBhbGxfY2hlY2tlZCA9IHRydWU7CiAgJChzZWxlY3RvcikuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgaWYgKCEkKHRoaXMpLmlzKCc6Y2hlY2tlZCcpKSB7IGFsbF9jaGVja2VkID0gZmFsc2U7IH0KICB9KTsKICAkKHNlbGVjdG9yKS5wcm9wKCdjaGVja2VkJywgIWFsbF9jaGVja2VkKS50cmlnZ2VyKCdjaGFuZ2UnKTsKfQoKZnVuY3Rpb24gc2hvd0FuZFNjcm9sbFRvKGlkLCBmb2N1cykgewogICQoJyMnK2lkKS5zaG93KCk7CiAgaWYgKGZvY3VzICE9PSBudWxsKSB7CiAgICAkKCcjJytmb2N1cykuZm9jdXMoKTsKICB9CiAgJCgnaHRtbCwgYm9keScpLmFuaW1hdGUoe3Njcm9sbFRvcDogJCgnIycraWQpLm9mZnNldCgpLnRvcH0sIDEwMCk7Cn0KCmZ1bmN0aW9uIHRvZ2dsZVJvd0dyb3VwKGVsKSB7CiAgdmFyIHRyID0gJChlbCkucGFyZW50cygndHInKS5maXJzdCgpOwogIHZhciBuID0gdHIubmV4dCgpOwogIHRyLnRvZ2dsZUNsYXNzKCdvcGVuJyk7CiAgJChlbCkudG9nZ2xlQ2xhc3MoJ2ljb24tZXhwYW5kZWQgaWNvbi1jb2xsYXBzZWQnKTsKICB0b2dnbGVFeHBlbmRDb2xsYXBzZUljb24oZWwpCiAgd2hpbGUgKG4ubGVuZ3RoICYmICFuLmhhc0NsYXNzKCdncm91cCcpKSB7CiAgICBuLnRvZ2dsZSgpOwogICAgbiA9IG4ubmV4dCgndHInKTsKICB9Cn0KCmZ1bmN0aW9uIHRvZ2dsZUV4cGVuZENvbGxhcHNlSWNvbihlbCkgewogIGNvbnN0IHN2ZyA9IGVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzdmcnKS5pdGVtKDApCgogIGlmIChzdmcgPT09IG51bGwpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2ljb24tZXhwYW5kZWQnKSkgewogICAgdXBkYXRlU1ZHSWNvbihzdmcsICdhbmdsZS1kb3duJykKICAgIHN2Zy5jbGFzc0xpc3QucmVtb3ZlKCdpY29uLXJ0bCcpCiAgfSBlbHNlIHsKICAgIHVwZGF0ZVNWR0ljb24oc3ZnLCAnYW5nbGUtcmlnaHQnKQogICAgc3ZnLmNsYXNzTGlzdC5hZGQoJ2ljb24tcnRsJykKICB9Cn0KCmZ1bmN0aW9uIHVwZGF0ZVNWR0ljb24oZWxlbWVudCwgaWNvbikgewogIGNvbnN0IGljb25FbGVtZW50ID0gZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidXNlIikuaXRlbSgwKQoKICBpZiAoaWNvbkVsZW1lbnQgPT09IG51bGwpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIGNvbnN0IGljb25QYXRoID0gaWNvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKCdocmVmJyk7CiAgaWNvbkVsZW1lbnQuc2V0QXR0cmlidXRlKCdocmVmJywgaWNvblBhdGgucmVwbGFjZSgvIy4qJC9nLCAiI2ljb24tLSIgKyBpY29uKSkKfQoKZnVuY3Rpb24gY29sbGFwc2VBbGxSb3dHcm91cHMoZWwpIHsKICB2YXIgdGJvZHkgPSAkKGVsKS5wYXJlbnRzKCd0Ym9keScpLmZpcnN0KCk7CiAgdGJvZHkuY2hpbGRyZW4oJ3RyJykuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ2dyb3VwJykpIHsKICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygnb3BlbicpOwogICAgICB2YXIgZXhwYW5kZXIgPSAkKHRoaXMpLmZpbmQoJy5leHBhbmRlcicpOwogICAgICBleHBhbmRlci5zd2l0Y2hDbGFzcygnaWNvbi1leHBhbmRlZCcsICdpY29uLWNvbGxhcHNlZCcpOwogICAgICB0b2dnbGVFeHBlbmRDb2xsYXBzZUljb24oZXhwYW5kZXJbMF0pOwogICAgfSBlbHNlIHsKICAgICAgJCh0aGlzKS5oaWRlKCk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIGV4cGFuZEFsbFJvd0dyb3VwcyhlbCkgewogIHZhciB0Ym9keSA9ICQoZWwpLnBhcmVudHMoJ3Rib2R5JykuZmlyc3QoKTsKICB0Ym9keS5jaGlsZHJlbigndHInKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnZ3JvdXAnKSkgewogICAgICAkKHRoaXMpLmFkZENsYXNzKCdvcGVuJyk7CiAgICAgIHZhciBleHBhbmRlciA9ICQodGhpcykuZmluZCgnLmV4cGFuZGVyJyk7CiAgICAgIGV4cGFuZGVyLnN3aXRjaENsYXNzKCdpY29uLWNvbGxhcHNlZCcsICdpY29uLWV4cGFuZGVkJyk7CiAgICAgIHRvZ2dsZUV4cGVuZENvbGxhcHNlSWNvbihleHBhbmRlclswXSk7CiAgICB9IGVsc2UgewogICAgICAkKHRoaXMpLnNob3coKTsKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gdG9nZ2xlQWxsUm93R3JvdXBzKGVsKSB7CiAgdmFyIHRyID0gJChlbCkucGFyZW50cygndHInKS5maXJzdCgpOwogIGlmICh0ci5oYXNDbGFzcygnb3BlbicpKSB7CiAgICBjb2xsYXBzZUFsbFJvd0dyb3VwcyhlbCk7CiAgfSBlbHNlIHsKICAgIGV4cGFuZEFsbFJvd0dyb3VwcyhlbCk7CiAgfQp9CgpmdW5jdGlvbiB0b2dnbGVGaWVsZHNldChlbCkgewogIHZhciBmaWVsZHNldCA9ICQoZWwpLnBhcmVudHMoJ2ZpZWxkc2V0JykuZmlyc3QoKTsKICBmaWVsZHNldC50b2dnbGVDbGFzcygnY29sbGFwc2VkJyk7CiAgZmllbGRzZXQuY2hpbGRyZW4oJ2xlZ2VuZCcpLnRvZ2dsZUNsYXNzKCdpY29uLWV4cGFuZGVkIGljb24tY29sbGFwc2VkJyk7CiAgdG9nZ2xlRXhwZW5kQ29sbGFwc2VJY29uKGZpZWxkc2V0LmNoaWxkcmVuKCdsZWdlbmQnKVswXSkKICBmaWVsZHNldC5jaGlsZHJlbignZGl2JykudG9nZ2xlKCk7Cn0KCmZ1bmN0aW9uIGhpZGVGaWVsZHNldChlbCkgewogIHZhciBmaWVsZHNldCA9ICQoZWwpLnBhcmVudHMoJ2ZpZWxkc2V0JykuZmlyc3QoKTsKICBmaWVsZHNldC50b2dnbGVDbGFzcygnY29sbGFwc2VkJyk7CiAgZmllbGRzZXQuY2hpbGRyZW4oJ2RpdicpLmhpZGUoKTsKfQoKLy8gY29sdW1ucyBzZWxlY3Rpb24KZnVuY3Rpb24gbW92ZU9wdGlvbnModGhlU2VsRnJvbSwgdGhlU2VsVG8pIHsKICAkKHRoZVNlbEZyb20pLmZpbmQoJ29wdGlvbjpzZWxlY3RlZCcpLmRldGFjaCgpLnByb3AoInNlbGVjdGVkIiwgZmFsc2UpLmFwcGVuZFRvKCQodGhlU2VsVG8pKTsKfQoKZnVuY3Rpb24gbW92ZU9wdGlvblVwKHRoZVNlbCkgewogICQodGhlU2VsKS5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAkKHRoaXMpLnByZXYoJzpub3QoOnNlbGVjdGVkKScpLmRldGFjaCgpLmluc2VydEFmdGVyKCQodGhpcykpOwogIH0pOwp9CgpmdW5jdGlvbiBtb3ZlT3B0aW9uVG9wKHRoZVNlbCkgewogICQodGhlU2VsKS5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS5kZXRhY2goKS5wcmVwZW5kVG8oJCh0aGVTZWwpKTsKfQoKZnVuY3Rpb24gbW92ZU9wdGlvbkRvd24odGhlU2VsKSB7CiAgJCgkKHRoZVNlbCkuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykuZ2V0KCkucmV2ZXJzZSgpKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAkKHRoaXMpLm5leHQoJzpub3QoOnNlbGVjdGVkKScpLmRldGFjaCgpLmluc2VydEJlZm9yZSgkKHRoaXMpKTsKICB9KTsKfQoKZnVuY3Rpb24gbW92ZU9wdGlvbkJvdHRvbSh0aGVTZWwpIHsKICAkKHRoZVNlbCkuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykuZGV0YWNoKCkuYXBwZW5kVG8oJCh0aGVTZWwpKTsKfQoKZnVuY3Rpb24gaW5pdEZpbHRlcnMoKSB7CiAgJCgnI2FkZF9maWx0ZXJfc2VsZWN0JykuY2hhbmdlKGZ1bmN0aW9uKCkgewogICAgYWRkRmlsdGVyKCQodGhpcykudmFsKCksICcnLCBbXSk7CiAgfSk7CiAgJCgnI2ZpbHRlcnMtdGFibGUgLmZpZWxkIGlucHV0W3R5cGU9Y2hlY2tib3hdJykuZWFjaChmdW5jdGlvbigpIHsKICAgIHRvZ2dsZUZpbHRlcigkKHRoaXMpLnZhbCgpKTsKICB9KTsKICAkKCcjZmlsdGVycy10YWJsZScpLm9uKCdjbGljaycsICcuZmllbGQgaW5wdXRbdHlwZT1jaGVja2JveF0nLCBmdW5jdGlvbigpIHsKICAgIHRvZ2dsZUZpbHRlcigkKHRoaXMpLnZhbCgpKTsKICB9KTsKICAkKCcjZmlsdGVycy10YWJsZScpLm9uKCdrZXlwcmVzcycsICdpbnB1dFt0eXBlPXRleHRdJywgZnVuY3Rpb24oZSkgewogICAgaWYgKGUua2V5Q29kZSA9PSAxMykgJCh0aGlzKS5jbG9zZXN0KCdmb3JtJykuc3VibWl0KCk7CiAgfSk7Cn0KCmZ1bmN0aW9uIGFkZEZpbHRlcihmaWVsZCwgb3BlcmF0b3IsIHZhbHVlcykgewogIHZhciBmaWVsZElkID0gZmllbGQucmVwbGFjZSgnLicsICdfJyk7CiAgdmFyIHRyID0gJCgnI3RyXycrZmllbGRJZCk7CgogIHZhciBmaWx0ZXJPcHRpb25zID0gYXZhaWxhYmxlRmlsdGVyc1tmaWVsZF07CiAgaWYgKCFmaWx0ZXJPcHRpb25zKSByZXR1cm47CgogIGlmIChmaWx0ZXJPcHRpb25zWydyZW1vdGUnXSAmJiBmaWx0ZXJPcHRpb25zWyd2YWx1ZXMnXSA9PSBudWxsKSB7CiAgICAkLmdldEpTT04oZmlsdGVyc1VybCwgeyduYW1lJzogZmllbGR9KS5kb25lKGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgZmlsdGVyT3B0aW9uc1sndmFsdWVzJ10gPSBkYXRhOwogICAgICBhZGRGaWx0ZXIoZmllbGQsIG9wZXJhdG9yLCB2YWx1ZXMpIDsKICAgIH0pOwogICAgcmV0dXJuOwogIH0KCiAgaWYgKHRyLmxlbmd0aCA+IDApIHsKICAgIHRyLnNob3coKTsKICB9IGVsc2UgewogICAgYnVpbGRGaWx0ZXJSb3coZmllbGQsIG9wZXJhdG9yLCB2YWx1ZXMpOwogIH0KICAkKCcjY2JfJytmaWVsZElkKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7CiAgdG9nZ2xlRmlsdGVyKGZpZWxkKTsKICB0b2dnbGVNdWx0aVNlbGVjdEljb25Jbml0KCk7CiAgJCgnI2FkZF9maWx0ZXJfc2VsZWN0JykudmFsKCcnKS5maW5kKCdvcHRpb24nKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgaWYgKCQodGhpcykuYXR0cigndmFsdWUnKSA9PSBmaWVsZCkgewogICAgICAkKHRoaXMpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIGJ1aWxkRmlsdGVyUm93KGZpZWxkLCBvcGVyYXRvciwgdmFsdWVzKSB7CiAgdmFyIGZpZWxkSWQgPSBmaWVsZC5yZXBsYWNlKCcuJywgJ18nKTsKICB2YXIgZmlsdGVyVGFibGUgPSAkKCIjZmlsdGVycy10YWJsZSIpOwogIHZhciBmaWx0ZXJPcHRpb25zID0gYXZhaWxhYmxlRmlsdGVyc1tmaWVsZF07CiAgaWYgKCFmaWx0ZXJPcHRpb25zKSByZXR1cm47CiAgdmFyIG9wZXJhdG9ycyA9IG9wZXJhdG9yQnlUeXBlW2ZpbHRlck9wdGlvbnNbJ3R5cGUnXV07CiAgdmFyIGZpbHRlclZhbHVlcyA9IGZpbHRlck9wdGlvbnNbJ3ZhbHVlcyddOwogIHZhciBzZWxlY3Q7CgogIHZhciB0ciA9ICQoJzxkaXYgY2xhc3M9ImZpbHRlciI+JykuYXR0cignaWQnLCAndHJfJytmaWVsZElkKS5odG1sKAogICAgJzxkaXYgY2xhc3M9ImZpZWxkIj48aW5wdXQgY2hlY2tlZD0iY2hlY2tlZCIgaWQ9ImNiXycrZmllbGRJZCsnIiBuYW1lPSJmW10iIHZhbHVlPSInK2ZpZWxkKyciIHR5cGU9ImNoZWNrYm94Ij48bGFiZWwgZm9yPSJjYl8nK2ZpZWxkSWQrJyI+ICcrc2FuaXRpemVIVE1MKGZpbHRlck9wdGlvbnNbJ25hbWUnXSkrJzwvbGFiZWw+PC9kaXY+JyArCiAgICAnPGRpdiBjbGFzcz0ib3BlcmF0b3IiPjxzZWxlY3QgaWQ9Im9wZXJhdG9yc18nK2ZpZWxkSWQrJyIgbmFtZT0ib3BbJytmaWVsZCsnXSI+PC9zZWxlY3Q+PC9kaXY+JyArCiAgICAnPGRpdiBjbGFzcz0idmFsdWVzIj48L2Rpdj4nCiAgKTsKICBmaWx0ZXJUYWJsZS5hcHBlbmQodHIpOwoKICBzZWxlY3QgPSB0ci5maW5kKCcub3BlcmF0b3Igc2VsZWN0Jyk7CiAgb3BlcmF0b3JzLmZvckVhY2goZnVuY3Rpb24ob3ApIHsKICAgIHZhciBvcHRpb24gPSAkKCc8b3B0aW9uPicpLnZhbChvcCkudGV4dChvcGVyYXRvckxhYmVsc1tvcF0pOwogICAgaWYgKG9wID09IG9wZXJhdG9yKSB7IG9wdGlvbi5wcm9wKCdzZWxlY3RlZCcsIHRydWUpOyB9CiAgICBzZWxlY3QuYXBwZW5kKG9wdGlvbik7CiAgfSk7CiAgc2VsZWN0LmNoYW5nZShmdW5jdGlvbigpeyB0b2dnbGVPcGVyYXRvcihmaWVsZCk7IH0pOwoKICBzd2l0Y2ggKGZpbHRlck9wdGlvbnNbJ3R5cGUnXSkgewogIGNhc2UgImxpc3QiOgogIGNhc2UgImxpc3Rfd2l0aF9oaXN0b3J5IjoKICBjYXNlICJsaXN0X29wdGlvbmFsIjoKICBjYXNlICJsaXN0X29wdGlvbmFsX3dpdGhfaGlzdG9yeSI6CiAgY2FzZSAibGlzdF9zdGF0dXMiOgogIGNhc2UgImxpc3Rfc3VicHJvamVjdHMiOgogICAgY29uc3QgaWNvblR5cGUgPSB2YWx1ZXMubGVuZ3RoID4gMSA/ICd0b2dnbGUtbWludXMnIDogJ3RvZ2dsZS1wbHVzJzsKICAgIGNvbnN0IGNsb25lZEljb24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjaWNvbi1jb3B5LXNvdXJjZSBzdmcnKS5jbG9uZU5vZGUodHJ1ZSk7CiAgICB1cGRhdGVTVkdJY29uKGNsb25lZEljb24sIGljb25UeXBlKTsKCiAgICB0ci5maW5kKCcudmFsdWVzJykuYXBwZW5kKAogICAgICAkKCc8c3Bhbj4nLCB7IHN0eWxlOiAnZGlzcGxheTpub25lOycgfSkuYXBwZW5kKAogICAgICAgICQoJzxzZWxlY3Q+JywgewogICAgICAgICAgY2xhc3M6ICd2YWx1ZScsCiAgICAgICAgICBpZDogYHZhbHVlc18ke2ZpZWxkSWR9XzFgLAogICAgICAgICAgbmFtZTogYHZbJHtmaWVsZH1dW11gLAogICAgICAgIH0pLAogICAgICAgICdcbicsCiAgICAgICAgJCgnPHNwYW4+JywgeyBjbGFzczogYHRvZ2dsZS1tdWx0aXNlbGVjdCBpY29uLW9ubHkgaWNvbi0ke2ljb25UeXBlfWAgfSkuYXBwZW5kKGNsb25lZEljb24pCiAgICAgICkKICAgICk7CiAgICBzZWxlY3QgPSB0ci5maW5kKCcudmFsdWVzIHNlbGVjdCcpOwogICAgaWYgKHZhbHVlcy5sZW5ndGggPiAxKSB7IHNlbGVjdC5hdHRyKCdtdWx0aXBsZScsIHRydWUpOyB9CiAgICBmaWx0ZXJWYWx1ZXMuZm9yRWFjaChmdW5jdGlvbihmaWx0ZXJWYWx1ZSkgewogICAgICB2YXIgb3B0aW9uID0gJCgnPG9wdGlvbj4nKTsKICAgICAgaWYgKCQuaXNBcnJheShmaWx0ZXJWYWx1ZSkpIHsKICAgICAgICBvcHRpb24udmFsKGZpbHRlclZhbHVlWzFdKS50ZXh0KGZpbHRlclZhbHVlWzBdKTsKICAgICAgICBpZiAoJC5pbkFycmF5KGZpbHRlclZhbHVlWzFdLCB2YWx1ZXMpID4gLTEpIHtvcHRpb24ucHJvcCgnc2VsZWN0ZWQnLCB0cnVlKTt9CiAgICAgICAgaWYgKGZpbHRlclZhbHVlLmxlbmd0aCA9PSAzKSB7CiAgICAgICAgICB2YXIgb3B0Z3JvdXAgPSBzZWxlY3QuZmluZCgnb3B0Z3JvdXAnKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gJCh0aGlzKS5hdHRyKCdsYWJlbCcpID09IGZpbHRlclZhbHVlWzJdfSk7CiAgICAgICAgICBpZiAoIW9wdGdyb3VwLmxlbmd0aCkge29wdGdyb3VwID0gJCgnPG9wdGdyb3VwPicpLmF0dHIoJ2xhYmVsJywgZmlsdGVyVmFsdWVbMl0pO30KICAgICAgICAgIG9wdGlvbiA9IG9wdGdyb3VwLmFwcGVuZChvcHRpb24pOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBvcHRpb24udmFsKGZpbHRlclZhbHVlKS50ZXh0KGZpbHRlclZhbHVlKTsKICAgICAgICBpZiAoJC5pbkFycmF5KGZpbHRlclZhbHVlLCB2YWx1ZXMpID4gLTEpIHtvcHRpb24ucHJvcCgnc2VsZWN0ZWQnLCB0cnVlKTt9CiAgICAgIH0KICAgICAgc2VsZWN0LmFwcGVuZChvcHRpb24pOwogICAgfSk7CiAgICBicmVhazsKICBjYXNlICJkYXRlIjoKICBjYXNlICJkYXRlX3Bhc3QiOgogICAgdHIuZmluZCgnLnZhbHVlcycpLmFwcGVuZCgKICAgICAgJzxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW5wdXQgdHlwZT0iZGF0ZSIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKydfMSIgc2l6ZT0iMTAiIGNsYXNzPSJ2YWx1ZSBkYXRlX3ZhbHVlIiAvPjwvc3Bhbj4nICsKICAgICAgJyA8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9ImRhdGUiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnXzIiIHNpemU9IjEwIiBjbGFzcz0idmFsdWUgZGF0ZV92YWx1ZSIgLz48L3NwYW4+JyArCiAgICAgICcgPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZTsiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ2WycrZmllbGQrJ11bXSIgaWQ9InZhbHVlc18nK2ZpZWxkSWQrJyIgc2l6ZT0iMyIgY2xhc3M9InZhbHVlIiAvPiAnK2xhYmVsRGF5UGx1cmFsKyc8L3NwYW4+JwogICAgKTsKICAgICQoJyN2YWx1ZXNfJytmaWVsZElkKydfMScpLnZhbCh2YWx1ZXNbMF0pLmRhdGVwaWNrZXJGYWxsYmFjayhkYXRlcGlja2VyT3B0aW9ucyk7CiAgICAkKCcjdmFsdWVzXycrZmllbGRJZCsnXzInKS52YWwodmFsdWVzWzFdKS5kYXRlcGlja2VyRmFsbGJhY2soZGF0ZXBpY2tlck9wdGlvbnMpOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQpLnZhbCh2YWx1ZXNbMF0pOwogICAgYnJlYWs7CiAgY2FzZSAic3RyaW5nIjoKICBjYXNlICJ0ZXh0IjoKICBjYXNlICJzZWFyY2giOgogICAgdHIuZmluZCgnLnZhbHVlcycpLmFwcGVuZCgKICAgICAgJzxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKyciIHNpemU9IjMwIiBjbGFzcz0idmFsdWUiIC8+PC9zcGFuPicKICAgICk7CiAgICAkKCcjdmFsdWVzXycrZmllbGRJZCkudmFsKHZhbHVlc1swXSk7CiAgICBicmVhazsKICBjYXNlICJyZWxhdGlvbiI6CiAgICB0ci5maW5kKCcudmFsdWVzJykuYXBwZW5kKAogICAgICAnPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZTsiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ2WycrZmllbGQrJ11bXSIgaWQ9InZhbHVlc18nK2ZpZWxkSWQrJyIgc2l6ZT0iNiIgY2xhc3M9InZhbHVlIiAvPjwvc3Bhbj4nICsKICAgICAgJzxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48c2VsZWN0IGNsYXNzPSJ2YWx1ZSIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKydfMSI+PC9zZWxlY3Q+PC9zcGFuPicKICAgICk7CiAgICAkKCcjdmFsdWVzXycrZmllbGRJZCkudmFsKHZhbHVlc1swXSk7CiAgICBzZWxlY3QgPSB0ci5maW5kKCcudmFsdWVzIHNlbGVjdCcpOwogICAgZmlsdGVyVmFsdWVzLmZvckVhY2goZnVuY3Rpb24oZmlsdGVyVmFsdWUpIHsKICAgICAgdmFyIG9wdGlvbiA9ICQoJzxvcHRpb24+Jyk7CiAgICAgIG9wdGlvbi52YWwoZmlsdGVyVmFsdWVbMV0pLnRleHQoZmlsdGVyVmFsdWVbMF0pOwogICAgICBpZiAodmFsdWVzWzBdID09IGZpbHRlclZhbHVlWzFdKSB7IG9wdGlvbi5wcm9wKCdzZWxlY3RlZCcsIHRydWUpOyB9CiAgICAgIHNlbGVjdC5hcHBlbmQob3B0aW9uKTsKICAgIH0pOwogICAgYnJlYWs7CiAgY2FzZSAiaW50ZWdlciI6CiAgY2FzZSAiZmxvYXQiOgogIGNhc2UgInRyZWUiOgogICAgdHIuZmluZCgnLnZhbHVlcycpLmFwcGVuZCgKICAgICAgJzxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKydfMSIgc2l6ZT0iMTQiIGNsYXNzPSJ2YWx1ZSIgLz48L3NwYW4+JyArCiAgICAgICcgPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZTsiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ2WycrZmllbGQrJ11bXSIgaWQ9InZhbHVlc18nK2ZpZWxkSWQrJ18yIiBzaXplPSIxNCIgY2xhc3M9InZhbHVlIiAvPjwvc3Bhbj4nCiAgICApOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQrJ18xJykudmFsKHZhbHVlc1swXSk7CiAgICAkKCcjdmFsdWVzXycrZmllbGRJZCsnXzInKS52YWwodmFsdWVzWzFdKTsKICAgIGJyZWFrOwogIH0KfQoKZnVuY3Rpb24gdG9nZ2xlRmlsdGVyKGZpZWxkKSB7CiAgdmFyIGZpZWxkSWQgPSBmaWVsZC5yZXBsYWNlKCcuJywgJ18nKTsKICBpZiAoJCgnI2NiXycgKyBmaWVsZElkKS5pcygnOmNoZWNrZWQnKSkgewogICAgJCgiI29wZXJhdG9yc18iICsgZmllbGRJZCkuc2hvdygpLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7CiAgICB0b2dnbGVPcGVyYXRvcihmaWVsZCk7CiAgfSBlbHNlIHsKICAgICQoIiNvcGVyYXRvcnNfIiArIGZpZWxkSWQpLmhpZGUoKS5hdHRyKCdkaXNhYmxlZCcsIHRydWUpOwogICAgZW5hYmxlVmFsdWVzKGZpZWxkLCBbXSk7CiAgfQp9CgpmdW5jdGlvbiBlbmFibGVWYWx1ZXMoZmllbGQsIGluZGV4ZXMpIHsKICB2YXIgZmllbGRJZCA9IGZpZWxkLnJlcGxhY2UoJy4nLCAnXycpOwogICQoJyN0cl8nK2ZpZWxkSWQrJyAudmFsdWVzIC52YWx1ZScpLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgIGlmICgkLmluQXJyYXkoaW5kZXgsIGluZGV4ZXMpID49IDApIHsKICAgICAgJCh0aGlzKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpOwogICAgICAkKHRoaXMpLnBhcmVudHMoJ3NwYW4nKS5maXJzdCgpLnNob3coKTsKICAgIH0gZWxzZSB7CiAgICAgICQodGhpcykudmFsKCcnKTsKICAgICAgJCh0aGlzKS5hdHRyKCdkaXNhYmxlZCcsIHRydWUpOwogICAgICAkKHRoaXMpLnBhcmVudHMoJ3NwYW4nKS5maXJzdCgpLmhpZGUoKTsKICAgIH0KCiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnZ3JvdXAnKSkgewogICAgICAkKHRoaXMpLmFkZENsYXNzKCdvcGVuJyk7CiAgICB9IGVsc2UgewogICAgICAkKHRoaXMpLnNob3coKTsKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gdG9nZ2xlT3BlcmF0b3IoZmllbGQpIHsKICB2YXIgZmllbGRJZCA9IGZpZWxkLnJlcGxhY2UoJy4nLCAnXycpOwogIHZhciBvcGVyYXRvciA9ICQoIiNvcGVyYXRvcnNfIiArIGZpZWxkSWQpOwogIHN3aXRjaCAob3BlcmF0b3IudmFsKCkpIHsKICAgIGNhc2UgIiEqIjoKICAgIGNhc2UgIioiOgogICAgY2FzZSAibmQiOgogICAgY2FzZSAidCI6CiAgICBjYXNlICJsZCI6CiAgICBjYXNlICJudyI6CiAgICBjYXNlICJ3IjoKICAgIGNhc2UgImx3IjoKICAgIGNhc2UgImwydyI6CiAgICBjYXNlICJubSI6CiAgICBjYXNlICJtIjoKICAgIGNhc2UgImxtIjoKICAgIGNhc2UgInkiOgogICAgY2FzZSAibyI6CiAgICBjYXNlICJjIjoKICAgIGNhc2UgIipvIjoKICAgIGNhc2UgIiFvIjoKICAgICAgZW5hYmxlVmFsdWVzKGZpZWxkLCBbXSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAiPjwiOgogICAgICBlbmFibGVWYWx1ZXMoZmllbGQsIFswLDFdKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICI8dCsiOgogICAgY2FzZSAiPnQrIjoKICAgIGNhc2UgIj48dCsiOgogICAgY2FzZSAidCsiOgogICAgY2FzZSAiPnQtIjoKICAgIGNhc2UgIjx0LSI6CiAgICBjYXNlICI+PHQtIjoKICAgIGNhc2UgInQtIjoKICAgICAgZW5hYmxlVmFsdWVzKGZpZWxkLCBbMl0pOwogICAgICBicmVhazsKICAgIGNhc2UgIj1wIjoKICAgIGNhc2UgIj0hcCI6CiAgICBjYXNlICIhcCI6CiAgICAgIGVuYWJsZVZhbHVlcyhmaWVsZCwgWzFdKTsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICBlbmFibGVWYWx1ZXMoZmllbGQsIFswXSk7CiAgICAgIGJyZWFrOwogIH0KfQoKZnVuY3Rpb24gdG9nZ2xlTXVsdGlTZWxlY3QoZWwpIHsKICB2YXIgaXNXb3JrZmxvdyA9IGVsLmNsb3Nlc3QoJy5jb250cm9sbGVyLXdvcmtmbG93cycpOwogIGlmIChlbC5hdHRyKCdtdWx0aXBsZScpKSB7CiAgICBlbC5yZW1vdmVBdHRyKCdtdWx0aXBsZScpOwogICAgaWYgKGlzV29ya2Zsb3cpIHsgZWwuZmluZCgib3B0aW9uW3ZhbHVlPWFsbF0iKS5zaG93KCk7IH0KICAgIGVsLmF0dHIoJ3NpemUnLCAxKTsKICB9IGVsc2UgewogICAgZWwuYXR0cignbXVsdGlwbGUnLCB0cnVlKTsKICAgIGlmIChpc1dvcmtmbG93KSB7IGVsLmZpbmQoIm9wdGlvblt2YWx1ZT1hbGxdIikuYXR0cigic2VsZWN0ZWQiLCBmYWxzZSkuaGlkZSgpOyB9CiAgICBpZiAoZWwuY2hpbGRyZW4oKS5sZW5ndGggPiAxMCkKICAgICAgZWwuYXR0cignc2l6ZScsIDEwKTsKICAgIGVsc2UKICAgICAgZWwuYXR0cignc2l6ZScsIDQpOwogIH0KfQoKZnVuY3Rpb24gc2hvd1RhYihuYW1lLCB1cmwpIHsKICAkKCcjdGFiLWNvbnRlbnQtJyArIG5hbWUpLnBhcmVudCgpLmZpbmQoJy50YWItY29udGVudCcpLmhpZGUoKTsKICAkKCcjdGFiLWNvbnRlbnQtJyArIG5hbWUpLnNob3coKTsKICAkKCcjdGFiLScgKyBuYW1lKS5jbG9zZXN0KCcudGFicycpLmZpbmQoJ2EnKS5yZW1vdmVDbGFzcygnc2VsZWN0ZWQnKTsKICAkKCcjdGFiLScgKyBuYW1lKS5hZGRDbGFzcygnc2VsZWN0ZWQnKTsKCiAgcmVwbGFjZUluSGlzdG9yeSh1cmwpCgogIHJldHVybiBmYWxzZTsKfQoKZnVuY3Rpb24gc2hvd0lzc3VlSGlzdG9yeShqb3VybmFsLCB1cmwpIHsKICB0YWJfY29udGVudCA9ICQoJyN0YWItY29udGVudC1oaXN0b3J5Jyk7CiAgdGFiX2NvbnRlbnQucGFyZW50KCkuZmluZCgnLnRhYi1jb250ZW50JykuaGlkZSgpOwogIHRhYl9jb250ZW50LnNob3coKTsKICB0YWJfY29udGVudC5wYXJlbnQoKS5jaGlsZHJlbignZGl2LnRhYnMnKS5maW5kKCdhJykucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkJyk7CgogICQoJyN0YWItJyArIGpvdXJuYWwpLmFkZENsYXNzKCdzZWxlY3RlZCcpOwoKICByZXBsYWNlSW5IaXN0b3J5KHVybCkKCiAgc3dpdGNoKGpvdXJuYWwpIHsKICAgIGNhc2UgJ25vdGVzJzoKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwnKS5zaG93KCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsOm5vdCguaGFzLW5vdGVzKScpLmhpZGUoKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwgLndpa2knKS5zaG93KCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC5jb250ZXh0dWFsIC5qb3VybmFsLWFjdGlvbnMnKS5zaG93KCk7CgogICAgICAvLyBhbHdheXMgc2hvdyB0aHVtYm5haWxzIGluIG5vdGVzIHRhYgogICAgICB2YXIgdGh1bWJuYWlscyA9IHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC50aHVtYm5haWxzJyk7CiAgICAgIHRodW1ibmFpbHMuc2hvdygpOwogICAgICAvLyBzaG93IGpvdXJuYWxzIHdpdGhvdXQgbm90ZXMsIGJ1dCB3aXRoIHRodW1ibmFpbHMKICAgICAgdGh1bWJuYWlscy5wYXJlbnRzKCcuam91cm5hbCcpLnNob3coKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICdwcm9wZXJ0aWVzJzoKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwnKS5zaG93KCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsOm5vdCguaGFzLWRldGFpbHMpJykuaGlkZSgpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAud2lraScpLmhpZGUoKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwgLnRodW1ibmFpbHMnKS5oaWRlKCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC5jb250ZXh0dWFsIC5qb3VybmFsLWFjdGlvbnMnKS5oaWRlKCk7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwnKS5zaG93KCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC53aWtpJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAudGh1bWJuYWlscycpLnNob3coKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwgLmNvbnRleHR1YWwgLmpvdXJuYWwtYWN0aW9ucycpLnNob3coKTsKICB9CgogIHJldHVybiBmYWxzZTsKfQoKZnVuY3Rpb24gZ2V0UmVtb3RlVGFiKG5hbWUsIHJlbW90ZV91cmwsIHVybCwgbG9hZF9hbHdheXMpIHsKICBsb2FkX2Fsd2F5cyA9IGxvYWRfYWx3YXlzIHx8IGZhbHNlOwogIHZhciB0YWJfY29udGVudCA9ICQoJyN0YWItY29udGVudC0nICsgbmFtZSk7CgogIHRhYl9jb250ZW50LnBhcmVudCgpLmZpbmQoJy50YWItY29udGVudCcpLmhpZGUoKTsKICB0YWJfY29udGVudC5wYXJlbnQoKS5jaGlsZHJlbignZGl2LnRhYnMnKS5maW5kKCdhJykucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkJyk7CiAgJCgnI3RhYi0nICsgbmFtZSkuYWRkQ2xhc3MoJ3NlbGVjdGVkJyk7CgogIHJlcGxhY2VJbkhpc3RvcnkodXJsKTsKCiAgaWYgKHRhYl9jb250ZW50LmNoaWxkcmVuKCkubGVuZ3RoID09IDAgJiYgbG9hZF9hbHdheXMgPT0gZmFsc2UpIHsKICAgICQuYWpheCh7CiAgICAgIHVybDogcmVtb3RlX3VybCwKICAgICAgdHlwZTogJ2dldCcsCiAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpewogICAgICAgIHRhYl9jb250ZW50Lmh0bWwoZGF0YSkKICAgICAgfQogICAgfSk7CiAgfQoKICB0YWJfY29udGVudC5zaG93KCk7CiAgcmV0dXJuIGZhbHNlOwp9CgovL3JlcGxhY2VzIGN1cnJlbnQgVVJMIHdpdGggdGhlICJocmVmIiBhdHRyaWJ1dGUgb2YgdGhlIGN1cnJlbnQgbGluawovLyhvbmx5IHRyaWdnZXJlZCBpZiBzdXBwb3J0ZWQgYnkgYnJvd3NlcikKZnVuY3Rpb24gcmVwbGFjZUluSGlzdG9yeSh1cmwpIHsKICBpZiAoInJlcGxhY2VTdGF0ZSIgaW4gd2luZG93Lmhpc3RvcnkgJiYgdXJsICE9PSB1bmRlZmluZWQpIHsKICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCBkb2N1bWVudC50aXRsZSwgdXJsKTsKICB9Cn0KCmZ1bmN0aW9uIG1vdmVUYWJSaWdodChlbCkgewogIHZhciBsaXMgPSAkKGVsKS5wYXJlbnRzKCdkaXYudGFicycpLmZpcnN0KCkuZmluZCgndWwnKS5jaGlsZHJlbigpOwogIHZhciBidyA9ICQoZWwpLnBhcmVudHMoJ2Rpdi50YWJzLWJ1dHRvbnMnKS5vdXRlcldpZHRoKHRydWUpOwogIHZhciB0YWJzV2lkdGggPSAwOwogIHZhciBpID0gMDsKICBsaXMuZWFjaChmdW5jdGlvbigpIHsKICAgIGlmICgkKHRoaXMpLmlzKCc6dmlzaWJsZScpKSB7CiAgICAgIHRhYnNXaWR0aCArPSAkKHRoaXMpLm91dGVyV2lkdGgodHJ1ZSk7CiAgICB9CiAgfSk7CiAgaWYgKHRhYnNXaWR0aCA8ICQoZWwpLnBhcmVudHMoJ2Rpdi50YWJzJykuZmlyc3QoKS53aWR0aCgpIC0gYncpIHsgcmV0dXJuOyB9CiAgJChlbCkuc2libGluZ3MoJy50YWItbGVmdCcpLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOwogIHdoaWxlIChpPGxpcy5sZW5ndGggJiYgIWxpcy5lcShpKS5pcygnOnZpc2libGUnKSkgeyBpKys7IH0KICB2YXIgdyA9IGxpcy5lcShpKS53aWR0aCgpOwogIGxpcy5lcShpKS5oaWRlKCk7CiAgaWYgKHRhYnNXaWR0aCAtIHcgPCAkKGVsKS5wYXJlbnRzKCdkaXYudGFicycpLmZpcnN0KCkud2lkdGgoKSAtIGJ3KSB7CiAgICAkKGVsKS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKICB9Cn0KCmZ1bmN0aW9uIG1vdmVUYWJMZWZ0KGVsKSB7CiAgdmFyIGxpcyA9ICQoZWwpLnBhcmVudHMoJ2Rpdi50YWJzJykuZmlyc3QoKS5maW5kKCd1bCcpLmNoaWxkcmVuKCk7CiAgdmFyIGkgPSAwOwogIHdoaWxlIChpIDwgbGlzLmxlbmd0aCAmJiAhbGlzLmVxKGkpLmlzKCc6dmlzaWJsZScpKSB7IGkrKzsgfQogIGlmIChpID4gMCkgewogICAgbGlzLmVxKGktMSkuc2hvdygpOwogICAgJChlbCkuc2libGluZ3MoJy50YWItcmlnaHQnKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICB9CiAgaWYgKGkgPD0gMSkgewogICAgJChlbCkuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7CiAgfQp9CgpmdW5jdGlvbiBkaXNwbGF5VGFic0J1dHRvbnMoKSB7CiAgdmFyIGxpczsKICB2YXIgdGFic1dpZHRoOwogIHZhciBlbDsKICB2YXIgbnVtSGlkZGVuOwogICQoJ2Rpdi50YWJzJykuZWFjaChmdW5jdGlvbigpIHsKICAgIGVsID0gJCh0aGlzKTsKICAgIGxpcyA9IGVsLmZpbmQoJ3VsJykuY2hpbGRyZW4oKTsKICAgIHRhYnNXaWR0aCA9IDA7CiAgICBudW1IaWRkZW4gPSAwOwogICAgbGlzLmVhY2goZnVuY3Rpb24oKXsKICAgICAgaWYgKCQodGhpcykuaXMoJzp2aXNpYmxlJykpIHsKICAgICAgICB0YWJzV2lkdGggKz0gJCh0aGlzKS5vdXRlcldpZHRoKHRydWUpOwogICAgICB9IGVsc2UgewogICAgICAgIG51bUhpZGRlbisrOwogICAgICB9CiAgICB9KTsKICAgIHZhciBidyA9ICQoZWwpLmZpbmQoJ2Rpdi50YWJzLWJ1dHRvbnMnKS5vdXRlcldpZHRoKHRydWUpOwogICAgaWYgKCh0YWJzV2lkdGggPCBlbC53aWR0aCgpIC0gYncpICYmIChsaXMubGVuZ3RoID09PSAwIHx8IGxpcy5maXJzdCgpLmlzKCc6dmlzaWJsZScpKSkgewogICAgICBlbC5maW5kKCdkaXYudGFicy1idXR0b25zJykuaGlkZSgpOwogICAgfSBlbHNlIHsKICAgICAgZWwuZmluZCgnZGl2LnRhYnMtYnV0dG9ucycpLnNob3coKS5jaGlsZHJlbignYnV0dG9uLnRhYi1sZWZ0JykudG9nZ2xlQ2xhc3MoJ2Rpc2FibGVkJywgbnVtSGlkZGVuID09IDApOwogICAgfQogIH0pOwp9CgpmdW5jdGlvbiBzZXRQcmVkZWNlc3NvckZpZWxkc1Zpc2liaWxpdHkoKSB7CiAgdmFyIHJlbGF0aW9uVHlwZSA9ICQoJyNyZWxhdGlvbl9yZWxhdGlvbl90eXBlJyk7CiAgaWYgKHJlbGF0aW9uVHlwZS52YWwoKSA9PSAicHJlY2VkZXMiIHx8IHJlbGF0aW9uVHlwZS52YWwoKSA9PSAiZm9sbG93cyIpIHsKICAgICQoJyNwcmVkZWNlc3Nvcl9maWVsZHMnKS5zaG93KCk7CiAgfSBlbHNlIHsKICAgICQoJyNwcmVkZWNlc3Nvcl9maWVsZHMnKS5oaWRlKCk7CiAgfQp9CgpmdW5jdGlvbiBzaG93TW9kYWwoaWQsIHdpZHRoLCB0aXRsZSkgewogIHZhciBlbCA9ICQoJyMnK2lkKS5maXJzdCgpOwogIGlmIChlbC5sZW5ndGggPT09IDAgfHwgZWwuaXMoJzp2aXNpYmxlJykpIHtyZXR1cm47fQogIGlmICghdGl0bGUpIHRpdGxlID0gZWwuZmluZCgnaDMudGl0bGUnKS50ZXh0KCk7CiAgLy8gbW92ZXMgZXhpc3RpbmcgbW9kYWxzIGJlaGluZCB0aGUgdHJhbnNwYXJlbnQgYmFja2dyb3VuZAogICQoIi5tb2RhbCIpLmNzcygnekluZGV4Jyw5OSk7CiAgZWwuZGlhbG9nKHsKICAgIHdpZHRoOiB3aWR0aCwKICAgIG1vZGFsOiB0cnVlLAogICAgcmVzaXphYmxlOiBmYWxzZSwKICAgIGRpYWxvZ0NsYXNzOiAnbW9kYWwnLAogICAgdGl0bGU6IHRpdGxlCiAgfSkub24oJ2RpYWxvZ2Nsb3NlJywgZnVuY3Rpb24oKXsKICAgICQoIi5tb2RhbCIpLmNzcygnekluZGV4JywxMDEpOwogIH0pOwogIGVsLmZpbmQoImlucHV0W3R5cGU9dGV4dF0sIGlucHV0W3R5cGU9c3VibWl0XSIpLmZpcnN0KCkuZm9jdXMoKTsKfQoKZnVuY3Rpb24gaGlkZU1vZGFsKGVsKSB7CiAgdmFyIG1vZGFsOwogIGlmIChlbCkgewogICAgbW9kYWwgPSAkKGVsKS5wYXJlbnRzKCcudWktZGlhbG9nLWNvbnRlbnQnKTsKICB9IGVsc2UgewogICAgbW9kYWwgPSAkKCcjYWpheC1tb2RhbCcpOwogIH0KICBtb2RhbC5kaWFsb2coImNsb3NlIik7Cn0KCmZ1bmN0aW9uIGNvbGxhcHNlU2NtRW50cnkoaWQpIHsKICAkKCcuJytpZCkuZWFjaChmdW5jdGlvbigpIHsKICAgIGlmICgkKHRoaXMpLmhhc0NsYXNzKCdvcGVuJykpIHsKICAgICAgY29sbGFwc2VTY21FbnRyeSgkKHRoaXMpLmF0dHIoJ2lkJykpOwogICAgfQogICAgJCh0aGlzKS5oaWRlKCk7CiAgfSk7CiAgJCgnIycraWQpLnJlbW92ZUNsYXNzKCdvcGVuJyk7Cn0KCmZ1bmN0aW9uIGV4cGFuZFNjbUVudHJ5KGlkKSB7CiAgJCgnLicraWQpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAkKHRoaXMpLnNob3coKTsKICAgIGlmICgkKHRoaXMpLmhhc0NsYXNzKCdsb2FkZWQnKSAmJiAhJCh0aGlzKS5oYXNDbGFzcygnY29sbGFwc2VkJykpIHsKICAgICAgZXhwYW5kU2NtRW50cnkoJCh0aGlzKS5hdHRyKCdpZCcpKTsKICAgIH0KICB9KTsKICAkKCcjJytpZCkuYWRkQ2xhc3MoJ29wZW4nKTsKfQoKZnVuY3Rpb24gc2NtRW50cnlDbGljayhpZCwgdXJsKSB7CiAgICB2YXIgZWwgPSAkKCcjJytpZCk7CiAgICB2YXIgZXhwYW5kZXIgPSBlbC5maW5kKCcuZXhwYW5kZXInKTsKICAgIHZhciBmb2xkZXIgPSBlbC5maW5kKCcuaWNvbi1mb2xkZXInKTsKCiAgICBpZiAoZWwuaGFzQ2xhc3MoJ29wZW4nKSkgewogICAgICAgIGNvbGxhcHNlU2NtRW50cnkoaWQpOwogICAgICAgIGVsLmZpbmQoJy5leHBhbmRlcicpLnN3aXRjaENsYXNzKCdpY29uLWV4cGFuZGVkJywgJ2ljb24tY29sbGFwc2VkJyk7CiAgICAgICAgZWwuYWRkQ2xhc3MoJ2NvbGxhcHNlZCcpOwogICAgICAgIHVwZGF0ZVNWR0ljb24oZm9sZGVyWzBdLCAnZm9sZGVyJykKICAgICAgICB0b2dnbGVFeHBlbmRDb2xsYXBzZUljb24oZXhwYW5kZXJbMF0pOwoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9IGVsc2UgaWYgKGVsLmhhc0NsYXNzKCdsb2FkZWQnKSkgewogICAgICAgIGV4cGFuZFNjbUVudHJ5KGlkKTsKICAgICAgICBlbC5maW5kKCcuZXhwYW5kZXInKS5zd2l0Y2hDbGFzcygnaWNvbi1jb2xsYXBzZWQnLCAnaWNvbi1leHBhbmRlZCcpOwogICAgICAgIGVsLnJlbW92ZUNsYXNzKCdjb2xsYXBzZWQnKTsKICAgICAgICB1cGRhdGVTVkdJY29uKGZvbGRlclswXSwgJ2ZvbGRlci1vcGVuJykKICAgICAgICB0b2dnbGVFeHBlbmRDb2xsYXBzZUljb24oZXhwYW5kZXJbMF0pOwoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBpZiAoZWwuaGFzQ2xhc3MoJ2xvYWRpbmcnKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGVsLmFkZENsYXNzKCdsb2FkaW5nJyk7CiAgICAkLmFqYXgoewogICAgICB1cmw6IHVybCwKICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSkgewogICAgICAgIGVsLmFmdGVyKGRhdGEpOwogICAgICAgIGVsLmFkZENsYXNzKCdvcGVuJykuYWRkQ2xhc3MoJ2xvYWRlZCcpLnJlbW92ZUNsYXNzKCdsb2FkaW5nJyk7CiAgICAgICAgZWwuZmluZCgnLmV4cGFuZGVyJykuc3dpdGNoQ2xhc3MoJ2ljb24tY29sbGFwc2VkJywgJ2ljb24tZXhwYW5kZWQnKTsKICAgICAgICB1cGRhdGVTVkdJY29uKGZvbGRlclswXSwgJ2ZvbGRlci1vcGVuJykKICAgICAgICB0b2dnbGVFeHBlbmRDb2xsYXBzZUljb24oZXhwYW5kZXJbMF0pOwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiB0cnVlOwp9CgpmdW5jdGlvbiByYW5kb21LZXkoc2l6ZSkgewogIHZhciBjaGFycyA9ICcwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eic7CiAgdmFyIGtleSA9ICcnOwogIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICBrZXkgKz0gY2hhcnMuY2hhckF0KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoYXJzLmxlbmd0aCkpOwogIH0KICByZXR1cm4ga2V5Owp9CgpmdW5jdGlvbiBjb3B5VGV4dFRvQ2xpcGJvYXJkKHRhcmdldCkgewogIGlmICh0YXJnZXQpIHsKICAgIHZhciB0ZW1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTsKICAgIHRlbXAudmFsdWUgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCdkYXRhLWNsaXBib2FyZC10ZXh0Jyk7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRlbXApOwogICAgdGVtcC5zZWxlY3QoKTsKICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7CiAgICBpZiAodGVtcC5wYXJlbnROb2RlKSB7CiAgICAgIHRlbXAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0ZW1wKTsKICAgIH0KICAgIGlmICgkKHRhcmdldCkuY2xvc2VzdCgnLmRyZG4uZXhwYW5kZWQnKS5sZW5ndGgpIHsKICAgICAgJCh0YXJnZXQpLmNsb3Nlc3QoJy5kcmRuLmV4cGFuZGVkJykucmVtb3ZlQ2xhc3MoImV4cGFuZGVkIik7CiAgICB9CiAgfQogIHJldHVybiBmYWxzZTsKfQoKZnVuY3Rpb24gdXBkYXRlSXNzdWVGcm9tKHVybCwgZWwpIHsKICAkKCcjYWxsX2F0dHJpYnV0ZXMgaW5wdXQsICNhbGxfYXR0cmlidXRlcyB0ZXh0YXJlYSwgI2FsbF9hdHRyaWJ1dGVzIHNlbGVjdCcpLmVhY2goZnVuY3Rpb24oKXsKICAgICQodGhpcykuZGF0YSgndmFsdWViZWZvcmV1cGRhdGUnLCAkKHRoaXMpLnZhbCgpKTsKICB9KTsKICBpZiAoZWwpIHsKICAgICQoIiNmb3JtX3VwZGF0ZV90cmlnZ2VyZWRfYnkiKS52YWwoJChlbCkuYXR0cignaWQnKSk7CiAgfQogIHJldHVybiAkLmFqYXgoewogICAgdXJsOiB1cmwsCiAgICB0eXBlOiAncG9zdCcsCiAgICBkYXRhOiAkKCcjaXNzdWUtZm9ybScpLnNlcmlhbGl6ZSgpCiAgfSk7Cn0KCmZ1bmN0aW9uIHJlcGxhY2VJc3N1ZUZvcm1XaXRoKGh0bWwpewogIHZhciByZXBsYWNlbWVudCA9ICQoaHRtbCk7CiAgJCgnI2FsbF9hdHRyaWJ1dGVzIGlucHV0LCAjYWxsX2F0dHJpYnV0ZXMgdGV4dGFyZWEsICNhbGxfYXR0cmlidXRlcyBzZWxlY3QnKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICB2YXIgb2JqZWN0X2lkID0gJCh0aGlzKS5hdHRyKCdpZCcpOwogICAgaWYgKG9iamVjdF9pZCAmJiAkKHRoaXMpLmRhdGEoJ3ZhbHVlYmVmb3JldXBkYXRlJykhPSQodGhpcykudmFsKCkpIHsKICAgICAgcmVwbGFjZW1lbnQuZmluZCgnIycrb2JqZWN0X2lkKS52YWwoJCh0aGlzKS52YWwoKSk7CiAgICB9CiAgfSk7CiAgJCgnI2FsbF9hdHRyaWJ1dGVzJykuZW1wdHkoKTsKICAkKCcjYWxsX2F0dHJpYnV0ZXMnKS5wcmVwZW5kKHJlcGxhY2VtZW50KTsKfQoKZnVuY3Rpb24gdXBkYXRlQnVsa0VkaXRGcm9tKHVybCkgewogICQuYWpheCh7CiAgICB1cmw6IHVybCwKICAgIHR5cGU6ICdwb3N0JywKICAgIGRhdGE6ICQoJyNidWxrX2VkaXRfZm9ybScpLnNlcmlhbGl6ZSgpCiAgfSk7Cn0KCmZ1bmN0aW9uIG9ic2VydmVBdXRvY29tcGxldGVGaWVsZChmaWVsZElkLCB1cmwsIG9wdGlvbnMpIHsKICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpIHsKICAgICQoJyMnK2ZpZWxkSWQpLmF1dG9jb21wbGV0ZSgkLmV4dGVuZCh7CiAgICAgIHNvdXJjZTogdXJsLAogICAgICBtaW5MZW5ndGg6IDIsCiAgICAgIHBvc2l0aW9uOiB7Y29sbGlzaW9uOiAiZmxpcGZpdCJ9LAogICAgICBzZWFyY2g6IGZ1bmN0aW9uKCl7JCgnIycrZmllbGRJZCkuYWRkQ2xhc3MoJ2FqYXgtbG9hZGluZycpO30sCiAgICAgIHJlc3BvbnNlOiBmdW5jdGlvbigpeyQoJyMnK2ZpZWxkSWQpLnJlbW92ZUNsYXNzKCdhamF4LWxvYWRpbmcnKTt9CiAgICB9LCBvcHRpb25zKSk7CiAgICAkKCcjJytmaWVsZElkKS5hZGRDbGFzcygnYXV0b2NvbXBsZXRlJyk7CiAgfSk7Cn0KCmZ1bmN0aW9uIG11bHRpcGxlQXV0b2NvbXBsZXRlRmllbGQoZmllbGRJZCwgdXJsLCBvcHRpb25zKSB7CiAgZnVuY3Rpb24gc3BsaXQodmFsKSB7CiAgICByZXR1cm4gdmFsLnNwbGl0KC8sXHMqLyk7CiAgfQoKICBmdW5jdGlvbiBleHRyYWN0TGFzdCh0ZXJtKSB7CiAgICByZXR1cm4gc3BsaXQodGVybSkucG9wKCk7CiAgfQoKICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7CiAgICAkKCcjJyArIGZpZWxkSWQpLmF1dG9jb21wbGV0ZSgkLmV4dGVuZCh7CiAgICAgIHNvdXJjZTogZnVuY3Rpb24gKHJlcXVlc3QsIHJlc3BvbnNlKSB7CiAgICAgICAgJC5nZXRKU09OKHVybCwgewogICAgICAgICAgdGVybTogZXh0cmFjdExhc3QocmVxdWVzdC50ZXJtKQogICAgICAgIH0sIHJlc3BvbnNlKTsKICAgICAgfSwKICAgICAgbWluTGVuZ3RoOiAyLAogICAgICBwb3NpdGlvbjoge2NvbGxpc2lvbjogImZsaXBmaXQifSwKICAgICAgc2VhcmNoOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgJCgnIycgKyBmaWVsZElkKS5hZGRDbGFzcygnYWpheC1sb2FkaW5nJyk7CiAgICAgIH0sCiAgICAgIHJlc3BvbnNlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgJCgnIycgKyBmaWVsZElkKS5yZW1vdmVDbGFzcygnYWpheC1sb2FkaW5nJyk7CiAgICAgIH0sCiAgICAgIHNlbGVjdDogZnVuY3Rpb24gKGV2ZW50LCB1aSkgewogICAgICAgIHZhciB0ZXJtcyA9IHNwbGl0KHRoaXMudmFsdWUpOwogICAgICAgIC8vIHJlbW92ZSB0aGUgY3VycmVudCBpbnB1dAogICAgICAgIHRlcm1zLnBvcCgpOwogICAgICAgIC8vIGFkZCB0aGUgc2VsZWN0ZWQgaXRlbQogICAgICAgIHRlcm1zLnB1c2godWkuaXRlbS52YWx1ZSk7CiAgICAgICAgLy8gYWRkIHBsYWNlaG9sZGVyIHRvIGdldCB0aGUgY29tbWEtYW5kLXNwYWNlIGF0IHRoZSBlbmQKICAgICAgICB0ZXJtcy5wdXNoKCIiKTsKICAgICAgICB0aGlzLnZhbHVlID0gdGVybXMuam9pbigiLCAiKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0sIG9wdGlvbnMpKTsKICAgICQoJyMnICsgZmllbGRJZCkuYWRkQ2xhc3MoJ2F1dG9jb21wbGV0ZScpOwogIH0pOwp9CgpmdW5jdGlvbiBvYnNlcnZlU2VhcmNoZmllbGQoZmllbGRJZCwgdGFyZ2V0SWQsIHVybCkgewogICQoJyMnK2ZpZWxkSWQpLmVhY2goZnVuY3Rpb24oKSB7CiAgICB2YXIgJHRoaXMgPSAkKHRoaXMpOwogICAgJHRoaXMuYWRkQ2xhc3MoJ2F1dG9jb21wbGV0ZScpOwogICAgJHRoaXMuYXR0cignZGF0YS12YWx1ZS13YXMnLCAkdGhpcy52YWwoKSk7CiAgICB2YXIgY2hlY2sgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIHZhbCA9ICR0aGlzLnZhbCgpOwogICAgICBpZiAoJHRoaXMuYXR0cignZGF0YS12YWx1ZS13YXMnKSAhPSB2YWwpewogICAgICAgICR0aGlzLmF0dHIoJ2RhdGEtdmFsdWUtd2FzJywgdmFsKTsKICAgICAgICAkLmFqYXgoewogICAgICAgICAgdXJsOiB1cmwsCiAgICAgICAgICB0eXBlOiAnZ2V0JywKICAgICAgICAgIGRhdGE6IHtxOiAkdGhpcy52YWwoKX0sCiAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihkYXRhKXsgaWYodGFyZ2V0SWQpICQoJyMnK3RhcmdldElkKS5odG1sKGRhdGEpOyB9LAogICAgICAgICAgYmVmb3JlU2VuZDogZnVuY3Rpb24oKXsgJHRoaXMuYWRkQ2xhc3MoJ2FqYXgtbG9hZGluZycpOyB9LAogICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKCl7ICR0aGlzLnJlbW92ZUNsYXNzKCdhamF4LWxvYWRpbmcnKTsgfQogICAgICAgIH0pOwogICAgICB9CiAgICB9OwogICAgdmFyIHJlc2V0ID0gZnVuY3Rpb24oKSB7CiAgICAgIGlmICh0aW1lcikgewogICAgICAgIGNsZWFySW50ZXJ2YWwodGltZXIpOwogICAgICAgIHRpbWVyID0gc2V0SW50ZXJ2YWwoY2hlY2ssIDMwMCk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgdGltZXIgPSBzZXRJbnRlcnZhbChjaGVjaywgMzAwKTsKICAgICR0aGlzLmJpbmQoJ2tleXVwIGNsaWNrIG1vdXNlbW92ZScsIHJlc2V0KTsKICB9KTsKfQoKJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKXsKICAkKCIuZHJkbiAuYXV0b2NvbXBsZXRlIikudmFsKCcnKTsKCiAgLy8gVGhpcyB2YXJpYWJsZSBpcyB1c2VkIHRvIGZvY3VzIHNlbGVjdGVkIHByb2plY3QKICB2YXIgc2VsZWN0ZWQ7CiAgJChkb2N1bWVudCkub24oJ2NsaWNrJywgJy5kcmRuLXRyaWdnZXInLCBmdW5jdGlvbihlKXsKICAgIHZhciBkcmRuID0gJCh0aGlzKS5jbG9zZXN0KCIuZHJkbiIpOwogICAgaWYgKGRyZG4uaGFzQ2xhc3MoImV4cGFuZGVkIikpIHsKICAgICAgZHJkbi5yZW1vdmVDbGFzcygiZXhwYW5kZWQiKTsKICAgIH0gZWxzZSB7CiAgICAgICQoIi5kcmRuIikucmVtb3ZlQ2xhc3MoImV4cGFuZGVkIik7CiAgICAgIGRyZG4uYWRkQ2xhc3MoImV4cGFuZGVkIik7CiAgICAgIGlmICgkKHRoaXMpLnBhcmVudCgnI3Byb2plY3QtanVtcCcpLmxlbmd0aCkgewogICAgICAgIHNlbGVjdGVkID0gJCgnLmRyZG4taXRlbXMgYS5zZWxlY3RlZCcpOyAvLyBTdG9yZSBzZWxlY3RlZCBwcm9qZWN0CiAgICAgICAgc2VsZWN0ZWQuZmlyc3QoKS5mb2N1cygpOyAvLyBDYWxsaW5nIGZvY3VzIHRvIHNjcm9sbCB0byBzZWxlY3RlZCBwcm9qZWN0CiAgICAgIH0KICAgICAgaWYgKCFpc01vYmlsZSgpKSB7CiAgICAgICAgZHJkbi5maW5kKCIuYXV0b2NvbXBsZXRlIikuZm9jdXMoKTsKICAgICAgfQogICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgfQogIH0pOwogICQoZG9jdW1lbnQpLmNsaWNrKGZ1bmN0aW9uKGUpewogICAgaWYgKCQoZS50YXJnZXQpLmNsb3Nlc3QoIi5kcmRuIikubGVuZ3RoIDwgMSkgewogICAgICAkKCIuZHJkbi5leHBhbmRlZCIpLnJlbW92ZUNsYXNzKCJleHBhbmRlZCIpOwogICAgfQogIH0pOwoKICBvYnNlcnZlU2VhcmNoZmllbGQoJ3Byb2plY3RzLXF1aWNrLXNlYXJjaCcsIG51bGwsICQoJyNwcm9qZWN0cy1xdWljay1zZWFyY2gnKS5kYXRhKCdhdXRvbWNvbXBsZXRlLXVybCcpKTsKCiAgJCgiLmRyZG4tY29udGVudCIpLmtleWRvd24oZnVuY3Rpb24oZXZlbnQpewogICAgdmFyIGl0ZW1zID0gJCh0aGlzKS5maW5kKCIuZHJkbi1pdGVtcyIpOwoKICAgIC8vIElmIGEgcHJvamVjdCBpcyBzZWxlY3RlZCBzZXQgZm9jdXNlZCB0byBzZWxlY3RlZCBvbmx5IG9uY2UKICAgIGlmIChzZWxlY3RlZCAmJiBzZWxlY3RlZC5sZW5ndGggPiAwKSB7CiAgICAgIHZhciBmb2N1c2VkID0gc2VsZWN0ZWQ7CiAgICAgIHNlbGVjdGVkID0gdW5kZWZpbmVkOwogICAgfQogICAgZWxzZSB7CiAgICAgIHZhciBmb2N1c2VkID0gaXRlbXMuZmluZCgiYTpmb2N1cyIpOwogICAgfQogICAgc3dpdGNoIChldmVudC53aGljaCkgewogICAgY2FzZSA0MDogLy9kb3duCiAgICAgIGlmIChmb2N1c2VkLmxlbmd0aCA+IDApIHsKICAgICAgICBmb2N1c2VkLm5leHRBbGwoImEiKS5maXJzdCgpLmZvY3VzKCk7OwogICAgICB9IGVsc2UgewogICAgICAgIGl0ZW1zLmZpbmQoImEiKS5maXJzdCgpLmZvY3VzKCk7OwogICAgICB9CiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAzODogLy91cAogICAgICBpZiAoZm9jdXNlZC5sZW5ndGggPiAwKSB7CiAgICAgICAgdmFyIHByZXYgPSBmb2N1c2VkLnByZXZBbGwoImEiKTsKICAgICAgICBpZiAocHJldi5sZW5ndGggPiAwKSB7CiAgICAgICAgICBwcmV2LmZpcnN0KCkuZm9jdXMoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgJCh0aGlzKS5maW5kKCIuYXV0b2NvbXBsZXRlIikuZm9jdXMoKTsKICAgICAgICB9CiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgMzU6IC8vZW5kCiAgICAgIGlmIChmb2N1c2VkLmxlbmd0aCA+IDApIHsKICAgICAgICBmb2N1c2VkLm5leHRBbGwoImEiKS5sYXN0KCkuZm9jdXMoKTsKICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSAzNjogLy9ob21lCiAgICAgIGlmIChmb2N1c2VkLmxlbmd0aCA+IDApIHsKICAgICAgICBmb2N1c2VkLnByZXZBbGwoImEiKS5sYXN0KCkuZm9jdXMoKTsKICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgfQogIH0pOwp9KTsKCmZ1bmN0aW9uIGJlZm9yZVNob3dEYXRlUGlja2VyKGlucHV0LCBpbnN0KSB7CiAgdmFyIGRlZmF1bHRfZGF0ZSA9IG51bGw7CiAgc3dpdGNoICgkKGlucHV0KS5hdHRyKCJpZCIpKSB7CiAgICBjYXNlICJpc3N1ZV9zdGFydF9kYXRlIiA6CiAgICAgIGlmICgkKCIjaXNzdWVfZHVlX2RhdGUiKS5sZW5ndGggPiAwKSB7CiAgICAgICAgZGVmYXVsdF9kYXRlID0gJCgiI2lzc3VlX2R1ZV9kYXRlIikudmFsKCk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlICJpc3N1ZV9kdWVfZGF0ZSIgOgogICAgICBpZiAoJCgiI2lzc3VlX3N0YXJ0X2RhdGUiKS5sZW5ndGggPiAwKSB7CiAgICAgICAgdmFyIHN0YXJ0X2RhdGUgPSAkKCIjaXNzdWVfc3RhcnRfZGF0ZSIpLnZhbCgpOwogICAgICAgIGlmIChzdGFydF9kYXRlICE9ICIiKSB7CiAgICAgICAgICBzdGFydF9kYXRlID0gbmV3IERhdGUoRGF0ZS5wYXJzZShzdGFydF9kYXRlKSk7CiAgICAgICAgICBpZiAoc3RhcnRfZGF0ZSA+IG5ldyBEYXRlKCkpIHsKICAgICAgICAgICAgZGVmYXVsdF9kYXRlID0gJCgiI2lzc3VlX3N0YXJ0X2RhdGUiKS52YWwoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgYnJlYWs7CiAgfQogICQoaW5wdXQpLmRhdGVwaWNrZXJGYWxsYmFjaygib3B0aW9uIiwgImRlZmF1bHREYXRlIiwgZGVmYXVsdF9kYXRlKTsKfQoKKGZ1bmN0aW9uKCQpewogICQuZm4ucG9zaXRpb25lZEl0ZW1zID0gZnVuY3Rpb24oc29ydGFibGVPcHRpb25zLCBvcHRpb25zKXsKICAgIHZhciBzZXR0aW5ncyA9ICQuZXh0ZW5kKHsKICAgICAgZmlyc3RQb3NpdGlvbjogMQogICAgfSwgb3B0aW9ucyApOwoKICAgIHJldHVybiB0aGlzLnNvcnRhYmxlKCQuZXh0ZW5kKHsKICAgICAgYXhpczogJ3knLAogICAgICBoYW5kbGU6ICIuc29ydC1oYW5kbGUiLAogICAgICBoZWxwZXI6IGZ1bmN0aW9uKGV2ZW50LCB1aSl7CiAgICAgICAgdWkuY2hpbGRyZW4oJ3RkJykuZWFjaChmdW5jdGlvbigpewogICAgICAgICAgJCh0aGlzKS53aWR0aCgkKHRoaXMpLndpZHRoKCkpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiB1aTsKICAgICAgfSwKICAgICAgdXBkYXRlOiBmdW5jdGlvbihldmVudCwgdWkpIHsKICAgICAgICB2YXIgc29ydGFibGUgPSAkKHRoaXMpOwogICAgICAgIHZhciBoYW5kbGUgPSB1aS5pdGVtLmZpbmQoIi5zb3J0LWhhbmRsZSIpLmFkZENsYXNzKCJhamF4LWxvYWRpbmciKTsKICAgICAgICB2YXIgdXJsID0gaGFuZGxlLmRhdGEoInJlb3JkZXItdXJsIik7CiAgICAgICAgdmFyIHBhcmFtID0gaGFuZGxlLmRhdGEoInJlb3JkZXItcGFyYW0iKTsKICAgICAgICB2YXIgZGF0YSA9IHt9OwogICAgICAgIGRhdGFbcGFyYW1dID0ge3Bvc2l0aW9uOiB1aS5pdGVtLmluZGV4KCkgKyBzZXR0aW5nc1snZmlyc3RQb3NpdGlvbiddfTsKICAgICAgICAkLmFqYXgoewogICAgICAgICAgdXJsOiB1cmwsCiAgICAgICAgICB0eXBlOiAncHV0JywKICAgICAgICAgIGRhdGFUeXBlOiAnc2NyaXB0JywKICAgICAgICAgIGRhdGE6IGRhdGEsCiAgICAgICAgICBlcnJvcjogZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKXsKICAgICAgICAgICAgYWxlcnQoanFYSFIuc3RhdHVzKTsKICAgICAgICAgICAgc29ydGFibGUuc29ydGFibGUoImNhbmNlbCIpOwogICAgICAgICAgfSwKICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pewogICAgICAgICAgICBoYW5kbGUucmVtb3ZlQ2xhc3MoImFqYXgtbG9hZGluZyIpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9LAogICAgfSwgc29ydGFibGVPcHRpb25zKSk7CiAgfQp9KCBqUXVlcnkgKSk7Cgp2YXIgd2FybkxlYXZpbmdVbnNhdmVkTWVzc2FnZTsKZnVuY3Rpb24gd2FybkxlYXZpbmdVbnNhdmVkKG1lc3NhZ2UpIHsKICB3YXJuTGVhdmluZ1Vuc2F2ZWRNZXNzYWdlID0gbWVzc2FnZTsKICAkKGRvY3VtZW50KS5vbignc3VibWl0JywgJ2Zvcm0nLCBmdW5jdGlvbigpewogICAgJCgndGV4dGFyZWEnKS5yZW1vdmVEYXRhKCdjaGFuZ2VkJyk7CiAgfSk7CiAgJChkb2N1bWVudCkub24oJ2NoYW5nZScsICd0ZXh0YXJlYScsIGZ1bmN0aW9uKCl7CiAgICAkKHRoaXMpLmRhdGEoJ2NoYW5nZWQnLCAnY2hhbmdlZCcpOwogIH0pOwogIHdpbmRvdy5vbmJlZm9yZXVubG9hZCA9IGZ1bmN0aW9uKCl7CiAgICB2YXIgd2FybiA9IGZhbHNlOwogICAgJCgndGV4dGFyZWEnKS5ibHVyKCkuZWFjaChmdW5jdGlvbigpewogICAgICBpZiAoJCh0aGlzKS5kYXRhKCdjaGFuZ2VkJykpIHsKICAgICAgICB3YXJuID0gdHJ1ZTsKICAgICAgfQogICAgfSk7CiAgICBpZiAod2Fybikge3JldHVybiB3YXJuTGVhdmluZ1Vuc2F2ZWRNZXNzYWdlO30KICB9Owp9CgpmdW5jdGlvbiBzZXR1cEFqYXhJbmRpY2F0b3IoKSB7CiAgJChkb2N1bWVudCkuYmluZCgnYWpheFNlbmQnLCBmdW5jdGlvbihldmVudCwgeGhyLCBzZXR0aW5ncykgewogICAgaWYgKCQoJy5hamF4LWxvYWRpbmcnKS5sZW5ndGggPT09IDAgJiYgc2V0dGluZ3MuY29udGVudFR5cGUgIT0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpIHsKICAgICAgJCgnI2FqYXgtaW5kaWNhdG9yJykuc2hvdygpOwogICAgfQogIH0pOwogICQoZG9jdW1lbnQpLmJpbmQoJ2FqYXhTdG9wJywgZnVuY3Rpb24oKSB7CiAgICAkKCcjYWpheC1pbmRpY2F0b3InKS5oaWRlKCk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHNldHVwVGFicygpIHsKICBpZigkKCcudGFicycpLmxlbmd0aCA+IDApIHsKICAgIGRpc3BsYXlUYWJzQnV0dG9ucygpOwogICAgJCh3aW5kb3cpLnJlc2l6ZShkaXNwbGF5VGFic0J1dHRvbnMpOwogIH0KfQoKZnVuY3Rpb24gc2V0dXBGaWxlUHJldmlld05hdmlnYXRpb24oKSB7CiAgLy8gb25seSBiaW5kIGFycm93IGtleXMgd2hlbiBwcmV2aWV3IG5hdmlnYXRpb24gaXMgcHJlc2VudAogIGNvbnN0IGVsZW1lbnQgPSAkKCcucGFnaW5hdGlvbi5maWxlcHJldmlldycpLmZpcnN0KCk7CiAgaWYgKGVsZW1lbnQpIHsKCiAgICBjb25zdCBoYW5kbGVBcnJvd0tleSA9IGZ1bmN0aW9uKHNlbGVjdG9yLCBlKXsKICAgICAgY29uc3QgaHJlZiA9ICQoZWxlbWVudCkuZmluZChzZWxlY3RvcikuYXR0cignaHJlZicpOwogICAgICBpZiAoaHJlZikgewogICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9IGhyZWY7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICB9CiAgICB9OwoKICAgICQoZG9jdW1lbnQpLmtleWRvd24oZnVuY3Rpb24oZSkgewogICAgICBpZihlLnNoaWZ0S2V5IHx8IGUubWV0YUtleSB8fCBlLmN0cmxLZXkgfHwgZS5hbHRLZXkpIHJldHVybjsKICAgICAgc3dpdGNoKGUua2V5KSB7CiAgICAgICAgY2FzZSAnQXJyb3dMZWZ0JzoKICAgICAgICAgIGhhbmRsZUFycm93S2V5KCcucHJldmlvdXMgYScsIGUpOwogICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOgogICAgICAgICAgaGFuZGxlQXJyb3dLZXkoJy5uZXh0IGEnLCBlKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9KTsKICB9Cn0KCiQoZG9jdW1lbnQpLm9uKCdrZXlkb3duJywgJ2Zvcm0gdGV4dGFyZWEnLCBmdW5jdGlvbihlKSB7CiAgLy8gU3VibWl0IHRoZSBmb3JtIHdpdGggQ3RybCArIEVudGVyIG9yIENvbW1hbmQgKyBSZXR1cm4KICB2YXIgdGFyZ2V0Rm9ybSA9ICQoZS50YXJnZXQpLmNsb3Nlc3QoJ2Zvcm0nKTsKICBpZihlLmtleUNvZGUgPT0gMTMgJiYgKChlLmN0cmxLZXkgJiYgIWUubWV0YUtleSkgfHwgKCFlLmN0cmxLZXkgJiYgZS5tZXRhS2V5KSAmJiB0YXJnZXRGb3JtLmxlbmd0aCkpIHsKICAgIC8vIEZvciBhamF4LCB1c2UgY2xpY2soKSBpbnN0ZWFkIG9mIHN1Ym1pdCgpIHRvIHByZXZlbnQgIkludmFsaWQgZm9ybSBhdXRoZW50aWNpdHkgdG9rZW4iIGVycm9yCiAgICBpZiAodGFyZ2V0Rm9ybS5hdHRyKCdkYXRhLXJlbW90ZScpID09ICd0cnVlJykgewogICAgICBpZiAodGFyZ2V0Rm9ybS5maW5kKCdpbnB1dFt0eXBlPXN1Ym1pdF0nKS5sZW5ndGggPT09IDApIHsgcmV0dXJuIGZhbHNlOyB9CiAgICAgIHRhcmdldEZvcm0uZmluZCgndGV4dGFyZWEnKS5ibHVyKCkucmVtb3ZlRGF0YSgnY2hhbmdlZCcpOwogICAgICB0YXJnZXRGb3JtLmZpbmQoJ2lucHV0W3R5cGU9c3VibWl0XScpLmZpcnN0KCkuY2xpY2soKTsKICAgIH0gZWxzZSB7CiAgICAgIHRhcmdldEZvcm0uZmluZCgndGV4dGFyZWEnKS5ibHVyKCkucmVtb3ZlRGF0YSgnY2hhbmdlZCcpOwogICAgICB0YXJnZXRGb3JtLnN1Ym1pdCgpOwogICAgfQogIH0KfSk7CgoKZnVuY3Rpb24gaGlkZU9uTG9hZCgpIHsKICAkKCcuaG9sJykuaGlkZSgpOwp9CgpmdW5jdGlvbiBhZGRGb3JtT2JzZXJ2ZXJzRm9yRG91YmxlU3VibWl0KCkgewogICQoJ2Zvcm1bbWV0aG9kPXBvc3RdJykuZWFjaChmdW5jdGlvbigpIHsKICAgIGlmICghJCh0aGlzKS5oYXNDbGFzcygnbXVsdGlwbGUtc3VibWl0JykpIHsKICAgICAgJCh0aGlzKS5zdWJtaXQoZnVuY3Rpb24oZm9ybV9zdWJtaXNzaW9uKSB7CiAgICAgICAgaWYgKCQoZm9ybV9zdWJtaXNzaW9uLnRhcmdldCkuYXR0cignZGF0YS1zdWJtaXR0ZWQnKSkgewogICAgICAgICAgZm9ybV9zdWJtaXNzaW9uLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICQoZm9ybV9zdWJtaXNzaW9uLnRhcmdldCkuYXR0cignZGF0YS1zdWJtaXR0ZWQnLCB0cnVlKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQogIH0pOwp9CgpmdW5jdGlvbiBkZWZhdWx0Rm9jdXMoKXsKICBpZiAoKCQoJyNjb250ZW50IDpmb2N1cycpLmxlbmd0aCA9PSAwKSAmJiAod2luZG93LmxvY2F0aW9uLmhhc2ggPT0gJycpKSB7CiAgICAkKCcjY29udGVudCBpbnB1dFt0eXBlPXRleHRdOnZpc2libGUsICNjb250ZW50IHRleHRhcmVhOnZpc2libGUnKS5maXJzdCgpLmZvY3VzKCk7CiAgfQp9CgpmdW5jdGlvbiBibG9ja0V2ZW50UHJvcGFnYXRpb24oZXZlbnQpIHsKICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwp9CgpmdW5jdGlvbiB0b2dnbGVEaXNhYmxlZE9uQ2hhbmdlKCkgewogIHZhciBjaGVja2VkID0gJCh0aGlzKS5pcygnOmNoZWNrZWQnKTsKICAkKCQodGhpcykuZGF0YSgnZGlzYWJsZXMnKSkuYXR0cignZGlzYWJsZWQnLCBjaGVja2VkKTsKICAkKCQodGhpcykuZGF0YSgnZW5hYmxlcycpKS5hdHRyKCdkaXNhYmxlZCcsICFjaGVja2VkKTsKICAkKCQodGhpcykuZGF0YSgnc2hvd3MnKSkudG9nZ2xlKGNoZWNrZWQpOwp9CmZ1bmN0aW9uIHRvZ2dsZURpc2FibGVkSW5pdCgpIHsKICAkKCdpbnB1dFtkYXRhLWRpc2FibGVzXSwgaW5wdXRbZGF0YS1lbmFibGVzXSwgaW5wdXRbZGF0YS1zaG93c10nKS5lYWNoKHRvZ2dsZURpc2FibGVkT25DaGFuZ2UpOwp9CmZ1bmN0aW9uIHRvZ2dsZU11bHRpU2VsZWN0SWNvbkluaXQoKSB7CiAgJCgnLnRvZ2dsZS1tdWx0aXNlbGVjdDpub3QoLmljb24tdG9nZ2xlLW1pbnVzKTpub3QoLmljb24tdG9nZ2xlLXBsdXMpJykuZWFjaChmdW5jdGlvbigpewogICAgbGV0IGljb25UeXBlOwogICAgaWYgKCQodGhpcykuc2libGluZ3MoJ3NlbGVjdCcpLmZpbmQoJ29wdGlvbjpzZWxlY3RlZCcpLmxlbmd0aCA+IDEpIHsKICAgICAgaWNvblR5cGUgPSAndG9nZ2xlLW1pbnVzJzsKICAgIH0gZWxzZSB7CiAgICAgIGljb25UeXBlID0gJ3RvZ2dsZS1wbHVzJzsKICAgIH0KCiAgICAkKHRoaXMpLmFkZENsYXNzKGBpY29uLSR7aWNvblR5cGV9YCk7CiAgICB1cGRhdGVTVkdJY29uKCQodGhpcykuZmluZCgnc3ZnJylbMF0sIGljb25UeXBlKTsKICB9KTsKfQoKZnVuY3Rpb24gdG9nZ2xlTmV3T2JqZWN0RHJvcGRvd24oKSB7CiAgdmFyIGRyb3Bkb3duID0gJCgnI25ldy1vYmplY3QgKyB1bC5tZW51LWNoaWxkcmVuJyk7CiAgaWYoZHJvcGRvd24uaGFzQ2xhc3MoJ3Zpc2libGUnKSl7CiAgICBkcm9wZG93bi5yZW1vdmVDbGFzcygndmlzaWJsZScpOwogIH1lbHNlewogICAgZHJvcGRvd24uYWRkQ2xhc3MoJ3Zpc2libGUnKTsKICB9Cn0KCihmdW5jdGlvbiAoICQgKSB7CgogIC8vIGRldGVjdCBpZiBuYXRpdmUgZGF0ZSBpbnB1dCBpcyBzdXBwb3J0ZWQKICB2YXIgbmF0aXZlRGF0ZUlucHV0U3VwcG9ydGVkID0gdHJ1ZTsKCiAgdmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTsKICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCdkYXRlJyk7CiAgaWYgKGlucHV0LnR5cGUgPT09ICd0ZXh0JykgewogICAgbmF0aXZlRGF0ZUlucHV0U3VwcG9ydGVkID0gZmFsc2U7CiAgfQoKICB2YXIgbm90QURhdGVWYWx1ZSA9ICdub3QtYS1kYXRlJzsKICBpbnB1dC5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgbm90QURhdGVWYWx1ZSk7CiAgaWYgKGlucHV0LnZhbHVlID09PSBub3RBRGF0ZVZhbHVlKSB7CiAgICBuYXRpdmVEYXRlSW5wdXRTdXBwb3J0ZWQgPSBmYWxzZTsKICB9CgogICQuZm4uZGF0ZXBpY2tlckZhbGxiYWNrID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7CiAgICBpZiAobmF0aXZlRGF0ZUlucHV0U3VwcG9ydGVkKSB7CiAgICAgIHJldHVybiB0aGlzOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHRoaXMuZGF0ZXBpY2tlciggb3B0aW9ucyApOwogICAgfQogIH07Cn0oIGpRdWVyeSApKTsKCiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCl7CiAgJCgnI2NvbnRlbnQnKS5vbignY2hhbmdlJywgJ2lucHV0W2RhdGEtZGlzYWJsZXNdLCBpbnB1dFtkYXRhLWVuYWJsZXNdLCBpbnB1dFtkYXRhLXNob3dzXScsIHRvZ2dsZURpc2FibGVkT25DaGFuZ2UpOwogIHRvZ2dsZURpc2FibGVkSW5pdCgpOwoKICAkKCcjY29udGVudCcpLm9uKCdjbGljaycsICcudG9nZ2xlLW11bHRpc2VsZWN0JywgZnVuY3Rpb24oKSB7CiAgICB0b2dnbGVNdWx0aVNlbGVjdCgkKHRoaXMpLnNpYmxpbmdzKCdzZWxlY3QnKSk7CiAgICAkKHRoaXMpLnRvZ2dsZUNsYXNzKCdpY29uLXRvZ2dsZS1wbHVzIGljb24tdG9nZ2xlLW1pbnVzJyk7CiAgICB1cGRhdGVTVkdJY29uKCQodGhpcykuZmluZCgnc3ZnJylbMF0sICQodGhpcykuaGFzQ2xhc3MoJ2ljb24tdG9nZ2xlLXBsdXMnKSA/ICd0b2dnbGUtcGx1cycgOiAndG9nZ2xlLW1pbnVzJyk7CiAgfSk7CiAgdG9nZ2xlTXVsdGlTZWxlY3RJY29uSW5pdCgpOwoKICAkKCcjaGlzdG9yeSAudGFicycpLm9uKCdjbGljaycsICdhJywgZnVuY3Rpb24oZSl7CiAgICB2YXIgdGFiID0gJChlLnRhcmdldCkuYXR0cignaWQnKS5yZXBsYWNlKCd0YWItJywnJyk7CiAgICBkb2N1bWVudC5jb29raWUgPSAnaGlzdG9yeV9sYXN0X3RhYj0nICsgdGFiICsgJzsgU2FtZVNpdGU9TGF4JwogIH0pOwp9KTsKCiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCl7CiAgJCgnI2NvbnRlbnQnKS5vbignY2xpY2snLCAnZGl2LmpzdFRhYnMgYS50YWItcHJldmlldycsIGZ1bmN0aW9uKGV2ZW50KXsKICAgIHZhciB0YWIgPSAkKGV2ZW50LnRhcmdldCk7CgogICAgdmFyIHVybCA9IHRhYi5kYXRhKCd1cmwnKTsKICAgIHZhciBmb3JtID0gdGFiLnBhcmVudHMoJ2Zvcm0nKTsKICAgIHZhciBqc3RCbG9jayA9IHRhYi5wYXJlbnRzKCcuanN0QmxvY2snKTsKCiAgICB2YXIgZWxlbWVudCA9IGVuY29kZVVSSUNvbXBvbmVudChqc3RCbG9jay5maW5kKCcud2lraS1lZGl0JykudmFsKCkpOwogICAgdmFyIGF0dGFjaG1lbnRzID0gZm9ybS5maW5kKCcuYXR0YWNobWVudHNfZmllbGRzIGlucHV0Jykuc2VyaWFsaXplKCk7CgogICAgJC5hamF4KHsKICAgICAgdXJsOiB1cmwsCiAgICAgIHR5cGU6ICdwb3N0JywKICAgICAgZGF0YTogInRleHQ9IiArIGVsZW1lbnQgKyAnJicgKyBhdHRhY2htZW50cywKICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSl7CiAgICAgICAganN0QmxvY2suZmluZCgnLndpa2ktcHJldmlldycpLmh0bWwoZGF0YSk7CiAgICAgICAgc2V0dXBXaWtpVGFibGVTb3J0YWJsZUhlYWRlcigpOwogICAgICB9CiAgICB9KTsKICB9KTsKfSk7CgpmdW5jdGlvbiBrZWVwQW5jaG9yT25TaWduSW4oZm9ybSl7CiAgdmFyIGhhc2ggPSBkZWNvZGVVUklDb21wb25lbnQoc2VsZi5kb2N1bWVudC5sb2NhdGlvbi5oYXNoKTsKICBpZiAoaGFzaCkgewogICAgaWYgKGhhc2guaW5kZXhPZigiIyIpID09PSAtMSkgewogICAgICBoYXNoID0gIiMiICsgaGFzaDsKICAgIH0KICAgIGZvcm0uYWN0aW9uID0gZm9ybS5hY3Rpb24gKyBoYXNoOwogIH0KICByZXR1cm4gdHJ1ZTsKfQoKJChmdW5jdGlvbiAoJCkgewogICQoJyNhdXRoX3NvdXJjZV9sZGFwX21vZGUnKS5jaGFuZ2UoZnVuY3Rpb24gKCkgewogICAgJCgnLmxkYXBzX3dhcm5pbmcnKS50b2dnbGUoJCh0aGlzKS52YWwoKSAhPSAnbGRhcHNfdmVyaWZ5X3BlZXInKTsKICB9KS5jaGFuZ2UoKTsKfSk7CgpmdW5jdGlvbiBzZXRGaWxlY29udGVudENvbnRhaW5lckhlaWdodCgpIHsKICB2YXIgJGZpbGVjb250YWluZXIgPSAkKCcuZmlsZWNvbnRlbnQtY29udGFpbmVyJyk7CiAgdmFyIGZpbGVUeXBlU2VsZWN0b3JzID0gWycuaW1hZ2UnLCAndmlkZW8nXTsKCiAgaWYoJGZpbGVjb250YWluZXIubGVuZ3RoID4gMCAmJiAkZmlsZWNvbnRhaW5lci5maW5kKGZpbGVUeXBlU2VsZWN0b3JzLmpvaW4oJywnKSkubGVuZ3RoID09PSAxKSB7CiAgICB2YXIgY29udGFpbmVyT2Zmc2V0VG9wID0gJGZpbGVjb250YWluZXIub2Zmc2V0KCkudG9wOwogICAgdmFyIGNvbnRhaW5lck1hcmdpbkJvdHRvbSA9IHBhcnNlSW50KCRmaWxlY29udGFpbmVyLmNzcygnbWFyZ2luQm90dG9tJykpOwogICAgdmFyIHBhZ2luYXRpb25IZWlnaHQgPSAkZmlsZWNvbnRhaW5lci5uZXh0KCcucGFnaW5hdGlvbicpLmhlaWdodCgpOwogICAgdmFyIGRpZmYgPSBjb250YWluZXJPZmZzZXRUb3AgKyBjb250YWluZXJNYXJnaW5Cb3R0b20gKyBwYWdpbmF0aW9uSGVpZ2h0OwoKICAgICRmaWxlY29udGFpbmVyLmNzcygnaGVpZ2h0JywgJ2NhbGMoMTAwdmggLSAnICsgZGlmZiArICdweCknKQogIH0KfQoKZnVuY3Rpb24gc2V0dXBBdHRhY2htZW50RGV0YWlsKCkgewogIHNldEZpbGVjb250ZW50Q29udGFpbmVySGVpZ2h0KCk7CiAgJCh3aW5kb3cpLnJlc2l6ZShzZXRGaWxlY29udGVudENvbnRhaW5lckhlaWdodCk7Cn0KCmZ1bmN0aW9uIHNldHVwV2lraVRhYmxlU29ydGFibGVIZWFkZXIoKSB7CiAgJCgnZGl2Lndpa2kgdGFibGUnKS5lYWNoKGZ1bmN0aW9uKGksIHRhYmxlKXsKICAgIGlmICh0YWJsZS5yb3dzLmxlbmd0aCA8IDMpIHJldHVybiB0cnVlOwogICAgdmFyIHRyID0gJCh0YWJsZS5yb3dzKS5maXJzdCgpOwogICAgaWYgKHRyLmZpbmQoIlRIIikubGVuZ3RoID4gMCkgewogICAgICB0ci5hdHRyKCdkYXRhLXNvcnQtbWV0aG9kJywgJ25vbmUnKTsKICAgICAgdHIuZmluZCgiVEQiKS5hdHRyKCdkYXRhLXNvcnQtbWV0aG9kJywgJ25vbmUnKTsKICAgICAgbmV3IFRhYmxlc29ydCh0YWJsZSk7CiAgICB9CiAgfSk7Cn0KCiQoZnVuY3Rpb24gKCkgewogICQoIlt0aXRsZV06bm90KC5uby10b29sdGlwKSIpLnRvb2x0aXAoewogICAgc2hvdzogewogICAgICBkZWxheTogNDAwCiAgICB9LAogICAgcG9zaXRpb246IHsKICAgICAgbXk6ICJjZW50ZXIgYm90dG9tLTUiLAogICAgICBhdDogImNlbnRlciB0b3AiCiAgICB9CiAgfSk7Cn0pOwoKZnVuY3Rpb24gaW5saW5lQXV0b0NvbXBsZXRlKGVsZW1lbnQpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBkbyBub3QgYXR0YWNoIGlmIFRyaWJ1dGUgaXMgYWxyZWFkeSBpbml0aWFsaXplZAogICAgaWYgKGVsZW1lbnQuZGF0YXNldC50cmlidXRlID09PSAndHJ1ZScpIHtyZXR1cm59OwoKICAgIGNvbnN0IGdldERhdGFTb3VyY2UgPSBmdW5jdGlvbihlbnRpdHkpIHsKICAgICAgY29uc3QgZGF0YVNvdXJjZXMgPSBybS5BdXRvQ29tcGxldGUuZGF0YVNvdXJjZXM7CgogICAgICBpZiAoZGF0YVNvdXJjZXNbZW50aXR5XSkgewogICAgICAgIHJldHVybiBkYXRhU291cmNlc1tlbnRpdHldOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIGNvbnN0IHJlbW90ZVNlYXJjaCA9IGZ1bmN0aW9uKHVybCwgY2IpIHsKICAgICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKQogICAgICB7CiAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7CiAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwKSB7CiAgICAgICAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KTsKICAgICAgICAgICAgY2IoZGF0YSk7CiAgICAgICAgICB9IGVsc2UgaWYgKHhoci5zdGF0dXMgPT09IDQwMykgewogICAgICAgICAgICBjYihbXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9OwogICAgICB4aHIub3BlbigiR0VUIiwgdXJsLCB0cnVlKTsKICAgICAgeGhyLnNlbmQoKTsKICAgIH07CgogICAgY29uc3QgdHJpYnV0ZSA9IG5ldyBUcmlidXRlKHsKICAgICAgY29sbGVjdGlvbjogWwogICAgICAgIHsKICAgICAgICAgIHRyaWdnZXI6ICcjJywKICAgICAgICAgIHZhbHVlczogZnVuY3Rpb24gKHRleHQsIGNiKSB7CiAgICAgICAgICAgIGlmIChldmVudC50YXJnZXQudHlwZSA9PT0gJ3RleHQnICYmIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdhdXRvY29tcGxldGUnKSAhPSAnb2ZmJykgewogICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdhdXRvY29tcGxldGUnLCAnb2ZmJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gV2hlbiB0cmlnZ2VyZWQgd2l0aCB0ZXh0IHN0YXJ0aW5nIHdpdGggIiMjIiwgbGlrZSAiIyNhIiwgdGhlIHNlYXJjaCB0ZXJtIHdpbGwgYmVjb21lICIjYSIsCiAgICAgICAgICAgIC8vIGNhdXNpbmcgdGhlIFNRTCBxdWVyeSB0byBmYWlsIGluIGZpbmRpbmcgaXNzdWVzIHdpdGggImEiIGluIHRoZSBzdWJqZWN0LgogICAgICAgICAgICAvLyBUbyBhdm9pZCB0aGlzLCByZW1vdmUgdGhlIGZpcnN0ICIjIiBmcm9tIHRoZSBzZWFyY2ggdGVybS4KICAgICAgICAgICAgaWYgKHRleHQpIHsKICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9eIy8sICcnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZW1vdGVTZWFyY2goZ2V0RGF0YVNvdXJjZSgnaXNzdWVzJykgKyBlbmNvZGVVUklDb21wb25lbnQodGV4dCksIGZ1bmN0aW9uIChpc3N1ZXMpIHsKICAgICAgICAgICAgICByZXR1cm4gY2IoaXNzdWVzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9LAogICAgICAgICAgbG9va3VwOiAnbGFiZWwnLAogICAgICAgICAgZmlsbEF0dHI6ICdsYWJlbCcsCiAgICAgICAgICByZXF1aXJlTGVhZGluZ1NwYWNlOiB0cnVlLAogICAgICAgICAgc2VsZWN0VGVtcGxhdGU6IGZ1bmN0aW9uIChpc3N1ZSkgewogICAgICAgICAgICBsZXQgbGVhZGluZ0hhc2ggPSAiIyIKICAgICAgICAgICAgLy8ga2VlcCAjIyBzeW50YXggd2hpY2ggaXMgYSB2YWxpZCBpc3N1ZSBzeW50YXggdG8gc2hvdyBpc3N1ZSB3aXRoIHRpdGxlLgogICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50TWVudGlvblRleHRTbmFwc2hvdC5jaGFyQXQoMCkgPT09ICIjIikgewogICAgICAgICAgICAgIGxlYWRpbmdIYXNoID0gIiMjIgogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBsZWFkaW5nSGFzaCArIGlzc3VlLm9yaWdpbmFsLmlkOwogICAgICAgICAgfSwKICAgICAgICAgIG1lbnVJdGVtVGVtcGxhdGU6IGZ1bmN0aW9uIChpc3N1ZSkgewogICAgICAgICAgICByZXR1cm4gc2FuaXRpemVIVE1MKGlzc3VlLm9yaWdpbmFsLmxhYmVsKTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIHRyaWdnZXI6ICdbWycsCiAgICAgICAgICB2YWx1ZXM6IGZ1bmN0aW9uICh0ZXh0LCBjYikgewogICAgICAgICAgICByZW1vdGVTZWFyY2goZ2V0RGF0YVNvdXJjZSgnd2lraV9wYWdlcycpICsgZW5jb2RlVVJJQ29tcG9uZW50KHRleHQpLCBmdW5jdGlvbiAod2lraVBhZ2VzKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGNiKHdpa2lQYWdlcyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIGxvb2t1cDogJ2xhYmVsJywKICAgICAgICAgIGZpbGxBdHRyOiAnbGFiZWwnLAogICAgICAgICAgcmVxdWlyZUxlYWRpbmdTcGFjZTogdHJ1ZSwKICAgICAgICAgIHNlbGVjdFRlbXBsYXRlOiBmdW5jdGlvbiAod2lraVBhZ2UpIHsKICAgICAgICAgICAgcmV0dXJuICdbWycgKyB3aWtpUGFnZS5vcmlnaW5hbC52YWx1ZSArICddXSc7CiAgICAgICAgICB9LAogICAgICAgICAgbWVudUl0ZW1UZW1wbGF0ZTogZnVuY3Rpb24gKHdpa2lQYWdlKSB7CiAgICAgICAgICAgIHJldHVybiBzYW5pdGl6ZUhUTUwod2lraVBhZ2Uub3JpZ2luYWwubGFiZWwpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgdHJpZ2dlcjogJ0AnLAogICAgICAgICAgbG9va3VwOiBmdW5jdGlvbiAodXNlciwgbWVudGlvblRleHQpIHsKICAgICAgICAgICAgcmV0dXJuIHVzZXIubmFtZSArIHVzZXIuZmlyc3RuYW1lICsgdXNlci5sYXN0bmFtZSArIHVzZXIubG9naW47CiAgICAgICAgICB9LAogICAgICAgICAgdmFsdWVzOiBmdW5jdGlvbiAodGV4dCwgY2IpIHsKICAgICAgICAgICAgY29uc3QgdXJsID0gZ2V0RGF0YVNvdXJjZSgndXNlcnMnKTsKICAgICAgICAgICAgaWYgKHVybCkgewogICAgICAgICAgICAgIHJlbW90ZVNlYXJjaCh1cmwgKyBlbmNvZGVVUklDb21wb25lbnQodGV4dCksIGZ1bmN0aW9uICh1c2VycykgewogICAgICAgICAgICAgICAgcmV0dXJuIGNiKHVzZXJzKTsKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIG1lbnVJdGVtVGVtcGxhdGU6IGZ1bmN0aW9uICh1c2VyKSB7CiAgICAgICAgICAgIHJldHVybiBzYW5pdGl6ZUhUTUwodXNlci5vcmlnaW5hbC5uYW1lKTsKICAgICAgICAgIH0sCiAgICAgICAgICBzZWxlY3RUZW1wbGF0ZTogZnVuY3Rpb24gKHVzZXIpIHsKICAgICAgICAgICAgcmV0dXJuICdAJyArIHVzZXIub3JpZ2luYWwubG9naW47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICBdLAogICAgICBub01hdGNoVGVtcGxhdGU6ICIiCiAgICB9KTsKCiAgICB0cmlidXRlLmF0dGFjaChlbGVtZW50KTsKfQoKLy8gY29sbGFwc2libGUgc2lkZWJhciBqUXVlcnkgcGx1Z2luCihmdW5jdGlvbigkKSB7CiAgLy8gbWFpbiBjb250YWluZXIgdGhpcyBpcyBhcHBsaWVkIHRvCiAgdmFyIG1haW47CiAgLy8gdHJpZ2dlcnMgc2hvdy9oaWRlCiAgdmFyIGJ1dHRvbjsKICAvLyB0aGUga2V5IHRvIHVzZSBpbiBsb2NhbCBzdG9yYWdlCiAgLy8gdGhpcyB3aWxsIGxhdGVyIGJlIGV4cGFuZGVkIHVzaW5nIHRoZSBjdXJyZW50IGNvbnRyb2xsZXIgYW5kIGFjdGlvbiB0bwogIC8vIGFsbG93IGZvciBkaWZmZXJlbnQgc2lkZWJhciBzdGF0ZXMgZm9yIGRpZmZlcmVudCBwYWdlcwogIHZhciBsb2NhbFN0b3JhZ2VLZXkgPSAncmVkbWluZS1zaWRlYmFyLXN0YXRlJzsKICAvLyB0cnVlIGlmIGxvY2FsIHN0b3JhZ2UgaXMgYXZhaWxhYmxlCiAgdmFyIGNhblVzZUxvY2FsU3RvcmFnZSA9IGZ1bmN0aW9uKCl7CiAgICB0cnkgewogICAgICBpZignbG9jYWxTdG9yYWdlJyBpbiB3aW5kb3cpewogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdyZWRtaW5lLnRlc3Quc3RvcmFnZScsICdvaycpOwogICAgICAgIHZhciBpdGVtID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3JlZG1pbmUudGVzdC5zdG9yYWdlJyk7CiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3JlZG1pbmUudGVzdC5zdG9yYWdlJyk7CiAgICAgICAgaWYoaXRlbSA9PT0gJ29rJykgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGVycikge30KICAgIHJldHVybiBmYWxzZTsKICB9KCk7CiAgLy8gZnVuY3Rpb24gdG8gc2V0IGN1cnJlbnQgc2lkZWJhciBzdGF0ZQogIHZhciBzZXRTdGF0ZSA9IGZ1bmN0aW9uKHN0YXRlKXsKICAgIGlmKGNhblVzZUxvY2FsU3RvcmFnZSl7CiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxvY2FsU3RvcmFnZUtleSwgc3RhdGUpOwogICAgfQogIH07CiAgdmFyIGFwcGx5U3RhdGUgPSBmdW5jdGlvbigpewogICAgaWYobWFpbi5oYXNDbGFzcygnY29sbGFwc2Vkc2lkZWJhcicpKXsKICAgICAgdXBkYXRlU1ZHSWNvbihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2lkZWJhci1zd2l0Y2gtYnV0dG9uJyksICdjaGV2cm9ucy1sZWZ0JykKICAgICAgc2V0U3RhdGUoJ2hpZGRlbicpOwogICAgfSBlbHNlIHsKICAgICAgdXBkYXRlU1ZHSWNvbihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2lkZWJhci1zd2l0Y2gtYnV0dG9uJyksICdjaGV2cm9ucy1yaWdodCcpCiAgICAgIHNldFN0YXRlKCd2aXNpYmxlJyk7CiAgICB9CiAgfTsKICB2YXIgc2V0dXBUb2dnbGVCdXR0b24gPSBmdW5jdGlvbigpewogICAgYnV0dG9uID0gJCgnI3NpZGViYXItc3dpdGNoLWJ1dHRvbicpOwogICAgYnV0dG9uLmNsaWNrKGZ1bmN0aW9uKGUpewogICAgICBtYWluLmFkZENsYXNzKCJhbmltYXRlIik7CiAgICAgIG1haW4udG9nZ2xlQ2xhc3MoJ2NvbGxhcHNlZHNpZGViYXInKTsKICAgICAgYXBwbHlTdGF0ZSgpOwogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwogICAgYXBwbHlTdGF0ZSgpOwogIH07CiAgJC5mbi5jb2xsYXBzaWJsZVNpZGViYXIgPSBmdW5jdGlvbigpIHsKICAgIG1haW4gPSB0aGlzOwogICAgLy8gZGV0ZXJtaW5lIHByZXZpb3VzbHkgc3RvcmVkIHNpZGViYXIgc3RhdGUgZm9yIHRoaXMgcGFnZQogICAgaWYoY2FuVXNlTG9jYWxTdG9yYWdlKSB7CiAgICAgIC8vIGRldGVybWluZSBjdXJyZW50IGNvbnRyb2xsZXIvYWN0aW9uIHBhaXIgYW5kIHVzZSB0aGVtIGFzIHN0b3JhZ2Uga2V5CiAgICAgIHZhciBib2R5Q2xhc3MgPSAkKCdib2R5JykuYXR0cignY2xhc3MnKTsKICAgICAgaWYoYm9keUNsYXNzKXsKICAgICAgICB0cnkgewogICAgICAgICAgbG9jYWxTdG9yYWdlS2V5ICs9ICctJyArIGJvZHlDbGFzcy5zcGxpdCgvXHMrLykuZmlsdGVyKGZ1bmN0aW9uKHMpewogICAgICAgICAgICByZXR1cm4gcy5tYXRjaCgvKGFjdGlvbnxjb250cm9sbGVyKS0uKi8pOwogICAgICAgICAgfSkuc29ydCgpLmpvaW4oJy0nKTsKICAgICAgICB9IGNhdGNoKGUpIHsKICAgICAgICAgIC8vIGluIGNhc2Ugb2YgZXJyb3IgKHByb2JhYmx5IElFOCksIGNvbnRpbnVlIHdpdGggdGhlIHVubW9kaWZpZWQga2V5CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciBzdG9yZWRTdGF0ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGxvY2FsU3RvcmFnZUtleSk7CiAgICAgIG1haW4udG9nZ2xlQ2xhc3MoJ2NvbGxhcHNlZHNpZGViYXInLCBzdG9yZWRTdGF0ZSA9PT0gJ2hpZGRlbicpOwogICAgfQogICAgLy8gZHJhdyB0aGUgdG9nZ2xlIGJ1dHRvbiBvbmNlIHRoZSBET00gaXMgY29tcGxldGUKICAgICQoZG9jdW1lbnQpLnJlYWR5KHNldHVwVG9nZ2xlQnV0dG9uKTsKICB9Owp9KGpRdWVyeSkpOwoKJChkb2N1bWVudCkucmVhZHkoc2V0dXBBamF4SW5kaWNhdG9yKTsKJChkb2N1bWVudCkucmVhZHkoaGlkZU9uTG9hZCk7CiQoZG9jdW1lbnQpLnJlYWR5KGFkZEZvcm1PYnNlcnZlcnNGb3JEb3VibGVTdWJtaXQpOwokKGRvY3VtZW50KS5yZWFkeShkZWZhdWx0Rm9jdXMpOwokKGRvY3VtZW50KS5yZWFkeShzZXR1cEF0dGFjaG1lbnREZXRhaWwpOwokKGRvY3VtZW50KS5yZWFkeShzZXR1cFRhYnMpOwokKGRvY3VtZW50KS5yZWFkeShzZXR1cEZpbGVQcmV2aWV3TmF2aWdhdGlvbik7CiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwV2lraVRhYmxlU29ydGFibGVIZWFkZXIpOwokKGRvY3VtZW50KS5vbignZm9jdXMnLCAnW2RhdGEtYXV0by1jb21wbGV0ZT10cnVlXScsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgaW5saW5lQXV0b0NvbXBsZXRlKGV2ZW50LnRhcmdldCk7Cn0pOwo=" | |
| }, | |
| "attachments.js": { | |
| "hash": "fe6f73f3351f734902238369b56ee6cd", | |
| "path": "/usr/src/redmine/public/assets/attachments-db17b2b6.js", | |
| "base64": "LyoqCiAqIFJlZG1pbmUgLSBwcm9qZWN0IG1hbmFnZW1lbnQgc29mdHdhcmUKICogQ29weXJpZ2h0IChDKSAyMDA2LSAgSmVhbi1QaGlsaXBwZSBMYW5nCiAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCiAqLwoKZnVuY3Rpb24gYWRkRmlsZShpbnB1dEVsLCBmaWxlLCBlYWdlclVwbG9hZCkgewogIHZhciBhdHRhY2htZW50c0Zvcm0gPSAkKGlucHV0RWwpLmNsb3Nlc3QoJy5hdHRhY2htZW50c19mb3JtJykKICB2YXIgYXR0YWNobWVudHNGaWVsZHMgPSBhdHRhY2htZW50c0Zvcm0uZmluZCgnLmF0dGFjaG1lbnRzX2ZpZWxkcycpOwogIHZhciBhdHRhY2htZW50c0ljb25zID0gYXR0YWNobWVudHNGb3JtLmZpbmQoJy5hdHRhY2htZW50c19pY29ucycpOwogIHZhciBhZGRBdHRhY2htZW50ID0gYXR0YWNobWVudHNGb3JtLmZpbmQoJy5hZGRfYXR0YWNobWVudCcpOwogIHZhciBtYXhGaWxlcyA9ICgkKGlucHV0RWwpLmF0dHIoJ211bHRpcGxlJykgPT0gJ211bHRpcGxlJyA/IDEwIDogMSk7CiAgdmFyIGRlbEljb24gPSBhdHRhY2htZW50c0ljb25zLmZpbmQoJ3N2Zy5zdmctZGVsJykuY2xvbmUoKTsKICB2YXIgYXR0YWNobWVudEljb24gPSBhdHRhY2htZW50c0ljb25zLmZpbmQoJ3N2Zy5zdmctYXR0YWNobWVudCcpLmNsb25lKCk7CgogIGlmIChhdHRhY2htZW50c0ZpZWxkcy5jaGlsZHJlbigpLmxlbmd0aCA8IG1heEZpbGVzKSB7CiAgICB2YXIgYXR0YWNobWVudElkID0gYWRkRmlsZS5uZXh0QXR0YWNobWVudElkKys7CiAgICB2YXIgZmlsZVNwYW4gPSAkKCc8c3Bhbj4nLCB7IGlkOiAnYXR0YWNobWVudHNfJyArIGF0dGFjaG1lbnRJZCB9KTsKICAgIHZhciBwYXJhbSA9ICQoaW5wdXRFbCkuZGF0YSgncGFyYW0nKTsKICAgIGlmICghcGFyYW0pIHtwYXJhbSA9ICdhdHRhY2htZW50cyd9OwoKICAgIGZpbGVTcGFuLmFwcGVuZCgKICAgICAgICBhdHRhY2htZW50SWNvbiwKICAgICAgICAkKCc8aW5wdXQ+JywgeyB0eXBlOiAndGV4dCcsICdjbGFzcyc6ICdpY29uIGljb24tYXR0YWNobWVudCBmaWxlbmFtZSByZWFkb25seScsIG5hbWU6IHBhcmFtICsnWycgKyBhdHRhY2htZW50SWQgKyAnXVtmaWxlbmFtZV0nLCByZWFkb25seTogJ3JlYWRvbmx5J30gKS52YWwoZmlsZS5uYW1lKSwKICAgICAgICAkKCc8aW5wdXQ+JywgeyB0eXBlOiAndGV4dCcsICdjbGFzcyc6ICdkZXNjcmlwdGlvbicsIG5hbWU6IHBhcmFtICsgJ1snICsgYXR0YWNobWVudElkICsgJ11bZGVzY3JpcHRpb25dJywgbWF4bGVuZ3RoOiAyNTUsIHBsYWNlaG9sZGVyOiAkKGlucHV0RWwpLmRhdGEoJ2Rlc2NyaXB0aW9uLXBsYWNlaG9sZGVyJykgfSApLnRvZ2dsZSghZWFnZXJVcGxvYWQpLAogICAgICAgICQoJzxpbnB1dD4nLCB7IHR5cGU6ICdoaWRkZW4nLCAnY2xhc3MnOiAndG9rZW4nLCBuYW1lOiBwYXJhbSArICdbJyArIGF0dGFjaG1lbnRJZCArICddW3Rva2VuXSd9ICksCiAgICAgICAgJCgnPGE+JywgeyBocmVmOiAiIyIsICdjbGFzcyc6ICdpY29uLW9ubHkgaWNvbi1kZWwgcmVtb3ZlLXVwbG9hZCcgfSkuYXBwZW5kKGRlbEljb24pLmNsaWNrKHJlbW92ZUZpbGUpLnRvZ2dsZSghZWFnZXJVcGxvYWQpCiAgICApLmFwcGVuZFRvKGF0dGFjaG1lbnRzRmllbGRzKTsKCgogICAgaWYgKCQoaW5wdXRFbCkuZGF0YSgnZGVzY3JpcHRpb24nKSA9PSAwKSB7CiAgICAgIGZpbGVTcGFuLmZpbmQoJ2lucHV0LmRlc2NyaXB0aW9uJykucmVtb3ZlKCk7CiAgICB9CgogICAgaWYoZWFnZXJVcGxvYWQpIHsKICAgICAgYWpheFVwbG9hZChmaWxlLCBhdHRhY2htZW50SWQsIGZpbGVTcGFuLCBpbnB1dEVsKTsKICAgIH0KCiAgICBhZGRBdHRhY2htZW50LnRvZ2dsZShhdHRhY2htZW50c0ZpZWxkcy5jaGlsZHJlbigpLmxlbmd0aCA8IG1heEZpbGVzKTsKICAgIHJldHVybiBhdHRhY2htZW50SWQ7CiAgfQogIHJldHVybiBudWxsOwp9CgphZGRGaWxlLm5leHRBdHRhY2htZW50SWQgPSAxOwoKZnVuY3Rpb24gYWpheFVwbG9hZChmaWxlLCBhdHRhY2htZW50SWQsIGZpbGVTcGFuLCBpbnB1dEVsKSB7CgogIGZ1bmN0aW9uIG9uTG9hZHN0YXJ0KGUpIHsKICAgIGZpbGVTcGFuLnJlbW92ZUNsYXNzKCdhamF4LXdhaXRpbmcnKTsKICAgIGZpbGVTcGFuLmFkZENsYXNzKCdhamF4LWxvYWRpbmcnKTsKICAgICQoJ2lucHV0OnN1Ym1pdCcsICQodGhpcykucGFyZW50cygnZm9ybScpKS5hdHRyKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpOwogIH0KCiAgZnVuY3Rpb24gb25Qcm9ncmVzcyhlKSB7CiAgICBpZihlLmxlbmd0aENvbXB1dGFibGUpIHsKICAgICAgdGhpcy5wcm9ncmVzc2JhciggJ3ZhbHVlJywgZS5sb2FkZWQgKiAxMDAgLyBlLnRvdGFsICk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhY3R1YWxVcGxvYWQoZmlsZSwgYXR0YWNobWVudElkLCBmaWxlU3BhbiwgaW5wdXRFbCkgewoKICAgIGFqYXhVcGxvYWQudXBsb2FkaW5nKys7CgogICAgdXBsb2FkQmxvYihmaWxlLCAkKGlucHV0RWwpLmRhdGEoJ3VwbG9hZC1wYXRoJyksIGF0dGFjaG1lbnRJZCwgewogICAgICAgIGxvYWRzdGFydEV2ZW50SGFuZGxlcjogb25Mb2Fkc3RhcnQuYmluZChwcm9ncmVzc1NwYW4pLAogICAgICAgIHByb2dyZXNzRXZlbnRIYW5kbGVyOiBvblByb2dyZXNzLmJpbmQocHJvZ3Jlc3NTcGFuKQogICAgICB9KQogICAgICAuZG9uZShmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICBhZGRJbmxpbmVBdHRhY2htZW50TWFya3VwKGZpbGUpOwogICAgICAgIHByb2dyZXNzU3Bhbi5wcm9ncmVzc2JhciggJ3ZhbHVlJywgMTAwICkucmVtb3ZlKCk7CiAgICAgICAgZmlsZVNwYW4uZmluZCgnaW5wdXQuZGVzY3JpcHRpb24sIGEnKS5jc3MoJ2Rpc3BsYXknLCAnaW5saW5lLWZsZXgnKTsKICAgICAgfSkKICAgICAgLmZhaWwoZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgcHJvZ3Jlc3NTcGFuLnRleHQocmVzdWx0LnN0YXR1c1RleHQpOwogICAgICB9KS5hbHdheXMoZnVuY3Rpb24oKSB7CiAgICAgICAgYWpheFVwbG9hZC51cGxvYWRpbmctLTsKICAgICAgICBmaWxlU3Bhbi5yZW1vdmVDbGFzcygnYWpheC1sb2FkaW5nJyk7CiAgICAgICAgdmFyIGZvcm0gPSBmaWxlU3Bhbi5wYXJlbnRzKCdmb3JtJyk7CiAgICAgICAgaWYgKGZvcm0ucXVldWUoJ3VwbG9hZCcpLmxlbmd0aCA9PSAwICYmIGFqYXhVcGxvYWQudXBsb2FkaW5nID09IDApIHsKICAgICAgICAgICQoJ2lucHV0OnN1Ym1pdCcsIGZvcm0pLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7CiAgICAgICAgfQogICAgICAgIGZvcm0uZGVxdWV1ZSgndXBsb2FkJyk7CiAgICAgIH0pOwogIH0KCiAgdmFyIHByb2dyZXNzU3BhbiA9ICQoJzxkaXY+JykuaW5zZXJ0QWZ0ZXIoZmlsZVNwYW4uZmluZCgnaW5wdXQuZmlsZW5hbWUnKSk7CiAgcHJvZ3Jlc3NTcGFuLnByb2dyZXNzYmFyKCk7CiAgZmlsZVNwYW4uYWRkQ2xhc3MoJ2FqYXgtd2FpdGluZycpOwoKICB2YXIgbWF4U3luY1VwbG9hZCA9ICQoaW5wdXRFbCkuZGF0YSgnbWF4LWNvbmN1cnJlbnQtdXBsb2FkcycpOwoKICBpZihtYXhTeW5jVXBsb2FkID09IG51bGwgfHwgbWF4U3luY1VwbG9hZCA8PSAwIHx8IGFqYXhVcGxvYWQudXBsb2FkaW5nIDwgbWF4U3luY1VwbG9hZCkKICAgIGFjdHVhbFVwbG9hZChmaWxlLCBhdHRhY2htZW50SWQsIGZpbGVTcGFuLCBpbnB1dEVsKTsKICBlbHNlCiAgICAkKGlucHV0RWwpLnBhcmVudHMoJ2Zvcm0nKS5xdWV1ZSgndXBsb2FkJywgYWN0dWFsVXBsb2FkLmJpbmQodGhpcywgZmlsZSwgYXR0YWNobWVudElkLCBmaWxlU3BhbiwgaW5wdXRFbCkpOwp9CgphamF4VXBsb2FkLnVwbG9hZGluZyA9IDA7CgpmdW5jdGlvbiByZW1vdmVGaWxlKCkgewogICQodGhpcykuY2xvc2VzdCgnLmF0dGFjaG1lbnRzX2Zvcm0nKS5maW5kKCcuYWRkX2F0dGFjaG1lbnQnKS5zaG93KCk7CiAgJCh0aGlzKS5wYXJlbnQoJ3NwYW4nKS5yZW1vdmUoKTsKICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIHVwbG9hZEJsb2IoYmxvYiwgdXBsb2FkVXJsLCBhdHRhY2htZW50SWQsIG9wdGlvbnMpIHsKCiAgdmFyIGFjdHVhbE9wdGlvbnMgPSAkLmV4dGVuZCh7CiAgICBsb2Fkc3RhcnRFdmVudEhhbmRsZXI6ICQubm9vcCwKICAgIHByb2dyZXNzRXZlbnRIYW5kbGVyOiAkLm5vb3AKICB9LCBvcHRpb25zKTsKCiAgdXBsb2FkVXJsID0gdXBsb2FkVXJsICsgJz9hdHRhY2htZW50X2lkPScgKyBhdHRhY2htZW50SWQ7CiAgaWYgKGJsb2IgaW5zdGFuY2VvZiB3aW5kb3cuQmxvYikgewogICAgdXBsb2FkVXJsICs9ICcmZmlsZW5hbWU9JyArIGVuY29kZVVSSUNvbXBvbmVudChibG9iLm5hbWUpOwogICAgdXBsb2FkVXJsICs9ICcmY29udGVudF90eXBlPScgKyBlbmNvZGVVUklDb21wb25lbnQoYmxvYi50eXBlKTsKICB9CgogIHJldHVybiAkLmFqYXgodXBsb2FkVXJsLCB7CiAgICB0eXBlOiAnUE9TVCcsCiAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsCiAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbihqcVhociwgc2V0dGluZ3MpIHsKICAgICAganFYaHIuc2V0UmVxdWVzdEhlYWRlcignQWNjZXB0JywgJ2FwcGxpY2F0aW9uL2pzJyk7CiAgICAgIC8vIGF0dGFjaCBwcm9wZXIgRmlsZSBvYmplY3QKICAgICAgc2V0dGluZ3MuZGF0YSA9IGJsb2I7CiAgICB9LAogICAgeGhyOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIHhociA9ICQuYWpheFNldHRpbmdzLnhocigpOwogICAgICB4aHIudXBsb2FkLm9ubG9hZHN0YXJ0ID0gYWN0dWFsT3B0aW9ucy5sb2Fkc3RhcnRFdmVudEhhbmRsZXI7CiAgICAgIHhoci51cGxvYWQub25wcm9ncmVzcyA9IGFjdHVhbE9wdGlvbnMucHJvZ3Jlc3NFdmVudEhhbmRsZXI7CiAgICAgIHJldHVybiB4aHI7CiAgICB9LAogICAgZGF0YTogYmxvYiwKICAgIGNhY2hlOiBmYWxzZSwKICAgIHByb2Nlc3NEYXRhOiBmYWxzZQogIH0pOwp9CgpmdW5jdGlvbiBhZGRJbnB1dEZpbGVzKGlucHV0RWwpIHsKICB2YXIgYXR0YWNobWVudHNGaWVsZHMgPSAkKGlucHV0RWwpLmNsb3Nlc3QoJy5hdHRhY2htZW50c19mb3JtJykuZmluZCgnLmF0dGFjaG1lbnRzX2ZpZWxkcycpOwogIHZhciBhZGRBdHRhY2htZW50ID0gJChpbnB1dEVsKS5jbG9zZXN0KCcuYXR0YWNobWVudHNfZm9ybScpLmZpbmQoJy5hZGRfYXR0YWNobWVudCcpOwogIHZhciBjbGVhcmVkRmlsZUlucHV0ID0gJChpbnB1dEVsKS5jbG9uZSgpLnZhbCgnJyk7CiAgdmFyIHNpemVFeGNlZWRlZCA9IGZhbHNlOwogIHZhciBwYXJhbSA9ICQoaW5wdXRFbCkuZGF0YSgncGFyYW0nKTsKICBpZiAoIXBhcmFtKSB7cGFyYW0gPSAnYXR0YWNobWVudHMnfTsKCiAgaWYgKCQuYWpheFNldHRpbmdzLnhocigpLnVwbG9hZCAmJiBpbnB1dEVsLmZpbGVzKSB7CiAgICAvLyB1cGxvYWQgZmlsZXMgdXNpbmcgYWpheAogICAgc2l6ZUV4Y2VlZGVkID0gdXBsb2FkQW5kQXR0YWNoRmlsZXMoaW5wdXRFbC5maWxlcywgaW5wdXRFbCk7CiAgICAkKGlucHV0RWwpLnJlbW92ZSgpOwogIH0gZWxzZSB7CiAgICAvLyBicm93c2VyIG5vdCBzdXBwb3J0aW5nIHRoZSBmaWxlIEFQSSwgdXBsb2FkIG9uIGZvcm0gc3VibWlzc2lvbgogICAgdmFyIGF0dGFjaG1lbnRJZDsKICAgIHZhciBhRmlsZW5hbWUgPSBpbnB1dEVsLnZhbHVlLnNwbGl0KC9cL3xcXC8pOwogICAgYXR0YWNobWVudElkID0gYWRkRmlsZShpbnB1dEVsLCB7IG5hbWU6IGFGaWxlbmFtZVsgYUZpbGVuYW1lLmxlbmd0aCAtIDEgXSB9LCBmYWxzZSk7CiAgICBpZiAoYXR0YWNobWVudElkKSB7CiAgICAgICQoaW5wdXRFbCkuYXR0cih7IG5hbWU6IHBhcmFtICsgJ1snICsgYXR0YWNobWVudElkICsgJ11bZmlsZV0nLCBzdHlsZTogJ2Rpc3BsYXk6bm9uZTsnIH0pLmFwcGVuZFRvKCcjYXR0YWNobWVudHNfJyArIGF0dGFjaG1lbnRJZCk7CiAgICB9CiAgfQoKICBjbGVhcmVkRmlsZUlucHV0LnByZXBlbmRUbyhhZGRBdHRhY2htZW50KTsKfQoKZnVuY3Rpb24gdXBsb2FkQW5kQXR0YWNoRmlsZXMoZmlsZXMsIGlucHV0RWwpIHsKCiAgdmFyIG1heEZpbGVTaXplID0gJChpbnB1dEVsKS5kYXRhKCdtYXgtZmlsZS1zaXplJyk7CiAgdmFyIG1heEZpbGVTaXplRXhjZWVkZWQgPSAkKGlucHV0RWwpLmRhdGEoJ21heC1maWxlLXNpemUtbWVzc2FnZScpOwoKICB2YXIgc2l6ZUV4Y2VlZGVkID0gZmFsc2U7CiAgdmFyIGZpbGVzTGVuZ3RoID0gJChpbnB1dEVsKS5jbG9zZXN0KCcuYXR0YWNobWVudHNfZm9ybScpLmZpbmQoJy5hdHRhY2htZW50c19maWVsZHMnKS5jaGlsZHJlbigpLmxlbmd0aCArIGZpbGVzLmxlbmd0aAogICQuZWFjaChmaWxlcywgZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5zaXplICYmIG1heEZpbGVTaXplICE9IG51bGwgJiYgdGhpcy5zaXplID4gcGFyc2VJbnQobWF4RmlsZVNpemUpKSB7c2l6ZUV4Y2VlZGVkPXRydWU7fQogIH0pOwogIGlmIChzaXplRXhjZWVkZWQpIHsKICAgIHdpbmRvdy5hbGVydChtYXhGaWxlU2l6ZUV4Y2VlZGVkKTsKICB9IGVsc2UgewogICAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbigpIHthZGRGaWxlKGlucHV0RWwsIHRoaXMsIHRydWUpO30pOwogIH0KCiAgaWYgKGZpbGVzTGVuZ3RoID4gKCQoaW5wdXRFbCkuYXR0cignbXVsdGlwbGUnKSA9PSAnbXVsdGlwbGUnID8gMTAgOiAxKSkgewogICAgd2luZG93LmFsZXJ0KCQoaW5wdXRFbCkuZGF0YSgnbWF4LW51bWJlci1vZi1maWxlcy1tZXNzYWdlJykpOwogIH0KICByZXR1cm4gc2l6ZUV4Y2VlZGVkOwp9CgpmdW5jdGlvbiBoYW5kbGVGaWxlRHJvcEV2ZW50KGUpIHsKCiAgJCh0aGlzKS5yZW1vdmVDbGFzcygnZmlsZW92ZXInKTsKICBibG9ja0V2ZW50UHJvcGFnYXRpb24oZSk7CgogIGlmICgkLmluQXJyYXkoJ0ZpbGVzJywgZS5kYXRhVHJhbnNmZXIudHlwZXMpID4gLTEpIHsKICAgIGhhbmRsZUZpbGVEcm9wRXZlbnQudGFyZ2V0ID0gZS50YXJnZXQ7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnY3VzdG9tLWZpZWxkLWZpbGVkcm9wbGlzdG5lcicpKXsKICAgICAgdXBsb2FkQW5kQXR0YWNoRmlsZXMoZS5kYXRhVHJhbnNmZXIuZmlsZXMsICQodGhpcykuZmluZCgnaW5wdXQ6ZmlsZS5jdXN0b20tZmllbGQtZmlsZWRyb3AnKS5maXJzdCgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHVwbG9hZEFuZEF0dGFjaEZpbGVzKGUuZGF0YVRyYW5zZmVyLmZpbGVzLCAkKHRoaXMpLmZpbmQoJ2lucHV0OmZpbGUuZmlsZWRyb3AnKS5maXJzdCgpKTsKICAgIH0KICB9Cn0KaGFuZGxlRmlsZURyb3BFdmVudC50YXJnZXQgPSAnJzsKCmZ1bmN0aW9uIGRyYWdPdmVySGFuZGxlcihlKSB7CiAgJCh0aGlzKS5hZGRDbGFzcygnZmlsZW92ZXInKTsKICBibG9ja0V2ZW50UHJvcGFnYXRpb24oZSk7CiAgZS5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdjb3B5JzsKfQoKZnVuY3Rpb24gZHJhZ091dEhhbmRsZXIoZSkgewogICQodGhpcykucmVtb3ZlQ2xhc3MoJ2ZpbGVvdmVyJyk7CiAgYmxvY2tFdmVudFByb3BhZ2F0aW9uKGUpOwp9CgpmdW5jdGlvbiBzZXR1cEZpbGVEcm9wKCkgewogIGlmICh3aW5kb3cuRmlsZSAmJiB3aW5kb3cuRmlsZUxpc3QgJiYgd2luZG93LlByb2dyZXNzRXZlbnQgJiYgd2luZG93LkZvcm1EYXRhKSB7CgogICAgJC5ldmVudC5hZGRQcm9wKCdkYXRhVHJhbnNmZXInKTsKCiAgICAkKCdmb3JtIGRpdi5ib3g6bm90KC5maWxlZHJvcGxpc3RuZXIpJykuaGFzKCdpbnB1dDpmaWxlLmZpbGVkcm9wJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgJCh0aGlzKS5vbih7CiAgICAgICAgICBkcmFnb3ZlcjogZHJhZ092ZXJIYW5kbGVyLAogICAgICAgICAgZHJhZ2xlYXZlOiBkcmFnT3V0SGFuZGxlciwKICAgICAgICAgIGRyb3A6IGhhbmRsZUZpbGVEcm9wRXZlbnQsCiAgICAgICAgICBwYXN0ZTogY29weUltYWdlRnJvbUNsaXBib2FyZAogICAgICB9KS5hZGRDbGFzcygnZmlsZWRyb3BsaXN0bmVyJyk7CiAgICB9KTsKCiAgICAkKCdmb3JtIGRpdi5ib3ggaW5wdXQ6ZmlsZS5jdXN0b20tZmllbGQtZmlsZWRyb3AnKS5jbG9zZXN0KCdwJykubm90KCcuY3VzdG9tLWZpZWxkLWZpbGVkcm9wbGlzdG5lcicpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICQodGhpcykub24oewogICAgICAgICAgZHJhZ292ZXI6IGRyYWdPdmVySGFuZGxlciwKICAgICAgICAgIGRyYWdsZWF2ZTogZHJhZ091dEhhbmRsZXIsCiAgICAgICAgICBkcm9wOiBoYW5kbGVGaWxlRHJvcEV2ZW50CiAgICAgIH0pLmFkZENsYXNzKCdjdXN0b20tZmllbGQtZmlsZWRyb3BsaXN0bmVyJyk7CiAgICB9KTsKICB9Cn0KCmZ1bmN0aW9uIGFkZElubGluZUF0dGFjaG1lbnRNYXJrdXAoZmlsZSkgewogIC8vIGluc2VydCB1cGxvYWRlZCBpbWFnZSBpbmxpbmUgaWYgZHJvcHBlZCBhcmVhIGlzIGN1cnJlbnRseSBmb2N1c2VkIHRleHRhcmVhCiAgaWYoJChoYW5kbGVGaWxlRHJvcEV2ZW50LnRhcmdldCkuaGFzQ2xhc3MoJ3dpa2ktZWRpdCcpICYmICQuaW5BcnJheShmaWxlLnR5cGUsIHdpbmRvdy53aWtpSW1hZ2VNaW1lVHlwZXMpID4gLTEpIHsKICAgIHZhciAkdGV4dGFyZWEgPSAkKGhhbmRsZUZpbGVEcm9wRXZlbnQudGFyZ2V0KTsKICAgIHZhciBjdXJzb3JQb3NpdGlvbiA9ICR0ZXh0YXJlYS5wcm9wKCdzZWxlY3Rpb25TdGFydCcpOwogICAgdmFyIGRlc2NyaXB0aW9uID0gJHRleHRhcmVhLnZhbCgpOwogICAgdmFyIHNhbml0aXplZEZpbGVuYW1lID0gZmlsZS5uYW1lLnJlcGxhY2UoL1tcL1w/XCVcKlw6XHxcIlwnPD5cblxyXSsvLCAnXycpOwogICAgdmFyIGlubGluZUZpbGVuYW1lID0gZW5jb2RlVVJJQ29tcG9uZW50KHNhbml0aXplZEZpbGVuYW1lKQogICAgICAucmVwbGFjZSgvWyEoKV0vZywgZnVuY3Rpb24obWF0Y2gpIHsgcmV0dXJuICIlIiArIG1hdGNoLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpIH0pOwogICAgdmFyIG5ld0xpbmVCZWZvcmUgPSB0cnVlOwogICAgdmFyIG5ld0xpbmVBZnRlciA9IHRydWU7CiAgICBpZihjdXJzb3JQb3NpdGlvbiA9PT0gMCB8fCBkZXNjcmlwdGlvbi5zdWJzdHIoY3Vyc29yUG9zaXRpb24tMSwxKS5tYXRjaCgvXHJ8XG4vKSkgewogICAgICBuZXdMaW5lQmVmb3JlID0gZmFsc2U7CiAgICB9CiAgICBpZihkZXNjcmlwdGlvbi5zdWJzdHIoY3Vyc29yUG9zaXRpb24sMSkubWF0Y2goL1xyfFxuLykpIHsKICAgICAgbmV3TGluZUFmdGVyID0gZmFsc2U7CiAgICB9CgogICAgJHRleHRhcmVhLnZhbCgKICAgICAgZGVzY3JpcHRpb24uc3Vic3RyaW5nKDAsIGN1cnNvclBvc2l0aW9uKQogICAgICArIChuZXdMaW5lQmVmb3JlID8gJ1xuJyA6ICcnKQogICAgICArIGlubGluZUZpbGVuYW1lCiAgICAgICsgKG5ld0xpbmVBZnRlciA/ICdcbicgOiAnJykKICAgICAgKyBkZXNjcmlwdGlvbi5zdWJzdHJpbmcoY3Vyc29yUG9zaXRpb24sIGRlc2NyaXB0aW9uLmxlbmd0aCkKICAgICk7CgogICAgJHRleHRhcmVhLnByb3AoewogICAgICAnc2VsZWN0aW9uU3RhcnQnOiBjdXJzb3JQb3NpdGlvbiArIG5ld0xpbmVCZWZvcmUsCiAgICAgICdzZWxlY3Rpb25FbmQnOiBjdXJzb3JQb3NpdGlvbiArIGlubGluZUZpbGVuYW1lLmxlbmd0aCArIG5ld0xpbmVCZWZvcmUKICAgIH0pOwogICAgJHRleHRhcmVhLnBhcmVudHMoJy5qc3RCbG9jaycpCiAgICAgIC5maW5kKCcuanN0Yl9pbWcnKS5jbGljaygpOwoKICAgIC8vIG1vdmUgY3Vyc29yIGludG8gbmV4dCBsaW5lCiAgICBjdXJzb3JQb3NpdGlvbiA9ICR0ZXh0YXJlYS5wcm9wKCdzZWxlY3Rpb25TdGFydCcpOwogICAgJHRleHRhcmVhLnByb3AoewogICAgICAnc2VsZWN0aW9uU3RhcnQnOiBjdXJzb3JQb3NpdGlvbiArIDEsCiAgICAgICdzZWxlY3Rpb25FbmQnOiBjdXJzb3JQb3NpdGlvbiArIDEKICAgIH0pOwoKICB9Cn0KCmZ1bmN0aW9uIGNvcHlJbWFnZUZyb21DbGlwYm9hcmQoZSkgewogIGlmICghJChlLnRhcmdldCkuaGFzQ2xhc3MoJ3dpa2ktZWRpdCcpKSB7IHJldHVybjsgfQogIHZhciBjbGlwYm9hcmREYXRhID0gZS5jbGlwYm9hcmREYXRhIHx8IGUub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhCiAgaWYgKCFjbGlwYm9hcmREYXRhKSB7IHJldHVybjsgfQogIGlmIChjbGlwYm9hcmREYXRhLnR5cGVzLnNvbWUoZnVuY3Rpb24odCl7IHJldHVybiAvXnRleHRcL3BsYWluJC8udGVzdCh0KTsgfSkpIHsgcmV0dXJuOyB9CgogIHZhciBmaWxlcyA9IGNsaXBib2FyZERhdGEuZmlsZXMKICBmb3IgKHZhciBpID0gMCA7IGkgPCBmaWxlcy5sZW5ndGggOyBpKyspIHsKICAgIHZhciBmaWxlID0gZmlsZXNbaV07CiAgICBpZiAoZmlsZS50eXBlLmluZGV4T2YoImltYWdlIikgIT0gLTEpIHsKICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgpOwogICAgICB2YXIgZmlsZW5hbWUgPSAnY2xpcGJvYXJkLScKICAgICAgICArIGRhdGUuZ2V0RnVsbFllYXIoKQogICAgICAgICsgKCcwJysoZGF0ZS5nZXRNb250aCgpKzEpKS5zbGljZSgtMikKICAgICAgICArICgnMCcrZGF0ZS5nZXREYXRlKCkpLnNsaWNlKC0yKQogICAgICAgICsgKCcwJytkYXRlLmdldEhvdXJzKCkpLnNsaWNlKC0yKQogICAgICAgICsgKCcwJytkYXRlLmdldE1pbnV0ZXMoKSkuc2xpY2UoLTIpCiAgICAgICAgKyAnLScgKyByYW5kb21LZXkoNSkudG9Mb2NhbGVMb3dlckNhc2UoKQogICAgICAgICsgJy4nICsgZmlsZS5uYW1lLnNwbGl0KCcuJykucG9wKCk7CgogICAgICAvLyBnZXQgaW5wdXQgZmlsZSBpbiB0aGUgY2xvc2VzdCBmb3JtCiAgICAgIHZhciBpbnB1dEVsID0gJCh0aGlzKS5jbG9zZXN0KCJmb3JtIikuZmluZCgnaW5wdXQ6ZmlsZS5maWxlZHJvcCcpOwogICAgICBoYW5kbGVGaWxlRHJvcEV2ZW50LnRhcmdldCA9IGUudGFyZ2V0OwogICAgICBhZGRGaWxlKGlucHV0RWwsIG5ldyBGaWxlKFtmaWxlXSwgZmlsZW5hbWUsIHsgdHlwZTogZmlsZS50eXBlIH0pLCB0cnVlKTsKICAgIH0KICB9Cn0KCiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwRmlsZURyb3ApOwokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICQoImlucHV0LmRlbGV0ZWRfYXR0YWNobWVudCIpLmNoYW5nZShmdW5jdGlvbigpewogICAgJCh0aGlzKS5wYXJlbnRzKCcuZXhpc3RpbmctYXR0YWNobWVudCcpLnRvZ2dsZUNsYXNzKCdkZWxldGVkJywgJCh0aGlzKS5pcygiOmNoZWNrZWQiKSk7CiAgfSkuY2hhbmdlKCk7Cn0pOwo=" | |
| } | |
| }, | |
| "6.0.8": { | |
| "application.js": { | |
| "hash": "ce494e4e380316d654c1db1fda5adf3c", | |
| "path": "/usr/src/redmine/public/assets/application-0aa6b43a.js", | |
| "base64": "LyoqCiAqIFJlZG1pbmUgLSBwcm9qZWN0IG1hbmFnZW1lbnQgc29mdHdhcmUKICogQ29weXJpZ2h0IChDKSAyMDA2LSAgSmVhbi1QaGlsaXBwZSBMYW5nCiAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCiAqLwoKZnVuY3Rpb24gc2FuaXRpemVIVE1MKHN0cmluZykgewogIHZhciB0ZW1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIHRlbXAudGV4dENvbnRlbnQgPSBzdHJpbmc7CiAgcmV0dXJuIHRlbXAuaW5uZXJIVE1MOwp9CgpmdW5jdGlvbiBjaGVja0FsbChpZCwgY2hlY2tlZCkgewogICQoJyMnK2lkKS5maW5kKCdpbnB1dFt0eXBlPWNoZWNrYm94XTplbmFibGVkJykucHJvcCgnY2hlY2tlZCcsIGNoZWNrZWQpOwp9CgpmdW5jdGlvbiB0b2dnbGVDaGVja2JveGVzQnlTZWxlY3RvcihzZWxlY3RvcikgewogIHZhciBhbGxfY2hlY2tlZCA9IHRydWU7CiAgJChzZWxlY3RvcikuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgaWYgKCEkKHRoaXMpLmlzKCc6Y2hlY2tlZCcpKSB7IGFsbF9jaGVja2VkID0gZmFsc2U7IH0KICB9KTsKICAkKHNlbGVjdG9yKS5wcm9wKCdjaGVja2VkJywgIWFsbF9jaGVja2VkKS50cmlnZ2VyKCdjaGFuZ2UnKTsKfQoKZnVuY3Rpb24gc2hvd0FuZFNjcm9sbFRvKGlkLCBmb2N1cykgewogICQoJyMnK2lkKS5zaG93KCk7CiAgaWYgKGZvY3VzICE9PSBudWxsKSB7CiAgICAkKCcjJytmb2N1cykuZm9jdXMoKTsKICB9CiAgJCgnaHRtbCwgYm9keScpLmFuaW1hdGUoe3Njcm9sbFRvcDogJCgnIycraWQpLm9mZnNldCgpLnRvcH0sIDEwMCk7Cn0KCmZ1bmN0aW9uIHRvZ2dsZVJvd0dyb3VwKGVsKSB7CiAgdmFyIHRyID0gJChlbCkucGFyZW50cygndHInKS5maXJzdCgpOwogIHZhciBuID0gdHIubmV4dCgpOwogIHRyLnRvZ2dsZUNsYXNzKCdvcGVuJyk7CiAgJChlbCkudG9nZ2xlQ2xhc3MoJ2ljb24tZXhwYW5kZWQgaWNvbi1jb2xsYXBzZWQnKTsKICB0b2dnbGVFeHBlbmRDb2xsYXBzZUljb24oZWwpCiAgd2hpbGUgKG4ubGVuZ3RoICYmICFuLmhhc0NsYXNzKCdncm91cCcpKSB7CiAgICBuLnRvZ2dsZSgpOwogICAgbiA9IG4ubmV4dCgndHInKTsKICB9Cn0KCmZ1bmN0aW9uIHRvZ2dsZUV4cGVuZENvbGxhcHNlSWNvbihlbCkgewogIGNvbnN0IHN2ZyA9IGVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzdmcnKS5pdGVtKDApCgogIGlmIChzdmcgPT09IG51bGwpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2ljb24tZXhwYW5kZWQnKSkgewogICAgdXBkYXRlU1ZHSWNvbihzdmcsICdhbmdsZS1kb3duJykKICAgIHN2Zy5jbGFzc0xpc3QucmVtb3ZlKCdpY29uLXJ0bCcpCiAgfSBlbHNlIHsKICAgIHVwZGF0ZVNWR0ljb24oc3ZnLCAnYW5nbGUtcmlnaHQnKQogICAgc3ZnLmNsYXNzTGlzdC5hZGQoJ2ljb24tcnRsJykKICB9Cn0KCmZ1bmN0aW9uIHVwZGF0ZVNWR0ljb24oZWxlbWVudCwgaWNvbikgewogIGNvbnN0IGljb25FbGVtZW50ID0gZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidXNlIikuaXRlbSgwKQoKICBpZiAoaWNvbkVsZW1lbnQgPT09IG51bGwpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIGNvbnN0IGljb25QYXRoID0gaWNvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKCdocmVmJyk7CiAgaWNvbkVsZW1lbnQuc2V0QXR0cmlidXRlKCdocmVmJywgaWNvblBhdGgucmVwbGFjZSgvIy4qJC9nLCAiI2ljb24tLSIgKyBpY29uKSkKfQoKZnVuY3Rpb24gY29sbGFwc2VBbGxSb3dHcm91cHMoZWwpIHsKICB2YXIgdGJvZHkgPSAkKGVsKS5wYXJlbnRzKCd0Ym9keScpLmZpcnN0KCk7CiAgdGJvZHkuY2hpbGRyZW4oJ3RyJykuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ2dyb3VwJykpIHsKICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygnb3BlbicpOwogICAgICB2YXIgZXhwYW5kZXIgPSAkKHRoaXMpLmZpbmQoJy5leHBhbmRlcicpOwogICAgICBleHBhbmRlci5zd2l0Y2hDbGFzcygnaWNvbi1leHBhbmRlZCcsICdpY29uLWNvbGxhcHNlZCcpOwogICAgICB0b2dnbGVFeHBlbmRDb2xsYXBzZUljb24oZXhwYW5kZXJbMF0pOwogICAgfSBlbHNlIHsKICAgICAgJCh0aGlzKS5oaWRlKCk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIGV4cGFuZEFsbFJvd0dyb3VwcyhlbCkgewogIHZhciB0Ym9keSA9ICQoZWwpLnBhcmVudHMoJ3Rib2R5JykuZmlyc3QoKTsKICB0Ym9keS5jaGlsZHJlbigndHInKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnZ3JvdXAnKSkgewogICAgICAkKHRoaXMpLmFkZENsYXNzKCdvcGVuJyk7CiAgICAgIHZhciBleHBhbmRlciA9ICQodGhpcykuZmluZCgnLmV4cGFuZGVyJyk7CiAgICAgIGV4cGFuZGVyLnN3aXRjaENsYXNzKCdpY29uLWNvbGxhcHNlZCcsICdpY29uLWV4cGFuZGVkJyk7CiAgICAgIHRvZ2dsZUV4cGVuZENvbGxhcHNlSWNvbihleHBhbmRlclswXSk7CiAgICB9IGVsc2UgewogICAgICAkKHRoaXMpLnNob3coKTsKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gdG9nZ2xlQWxsUm93R3JvdXBzKGVsKSB7CiAgdmFyIHRyID0gJChlbCkucGFyZW50cygndHInKS5maXJzdCgpOwogIGlmICh0ci5oYXNDbGFzcygnb3BlbicpKSB7CiAgICBjb2xsYXBzZUFsbFJvd0dyb3VwcyhlbCk7CiAgfSBlbHNlIHsKICAgIGV4cGFuZEFsbFJvd0dyb3VwcyhlbCk7CiAgfQp9CgpmdW5jdGlvbiB0b2dnbGVGaWVsZHNldChlbCkgewogIHZhciBmaWVsZHNldCA9ICQoZWwpLnBhcmVudHMoJ2ZpZWxkc2V0JykuZmlyc3QoKTsKICBmaWVsZHNldC50b2dnbGVDbGFzcygnY29sbGFwc2VkJyk7CiAgZmllbGRzZXQuY2hpbGRyZW4oJ2xlZ2VuZCcpLnRvZ2dsZUNsYXNzKCdpY29uLWV4cGFuZGVkIGljb24tY29sbGFwc2VkJyk7CiAgdG9nZ2xlRXhwZW5kQ29sbGFwc2VJY29uKGZpZWxkc2V0LmNoaWxkcmVuKCdsZWdlbmQnKVswXSkKICBmaWVsZHNldC5jaGlsZHJlbignZGl2JykudG9nZ2xlKCk7Cn0KCmZ1bmN0aW9uIGhpZGVGaWVsZHNldChlbCkgewogIHZhciBmaWVsZHNldCA9ICQoZWwpLnBhcmVudHMoJ2ZpZWxkc2V0JykuZmlyc3QoKTsKICBmaWVsZHNldC50b2dnbGVDbGFzcygnY29sbGFwc2VkJyk7CiAgZmllbGRzZXQuY2hpbGRyZW4oJ2RpdicpLmhpZGUoKTsKfQoKLy8gY29sdW1ucyBzZWxlY3Rpb24KZnVuY3Rpb24gbW92ZU9wdGlvbnModGhlU2VsRnJvbSwgdGhlU2VsVG8pIHsKICAkKHRoZVNlbEZyb20pLmZpbmQoJ29wdGlvbjpzZWxlY3RlZCcpLmRldGFjaCgpLnByb3AoInNlbGVjdGVkIiwgZmFsc2UpLmFwcGVuZFRvKCQodGhlU2VsVG8pKTsKfQoKZnVuY3Rpb24gbW92ZU9wdGlvblVwKHRoZVNlbCkgewogICQodGhlU2VsKS5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAkKHRoaXMpLnByZXYoJzpub3QoOnNlbGVjdGVkKScpLmRldGFjaCgpLmluc2VydEFmdGVyKCQodGhpcykpOwogIH0pOwp9CgpmdW5jdGlvbiBtb3ZlT3B0aW9uVG9wKHRoZVNlbCkgewogICQodGhlU2VsKS5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS5kZXRhY2goKS5wcmVwZW5kVG8oJCh0aGVTZWwpKTsKfQoKZnVuY3Rpb24gbW92ZU9wdGlvbkRvd24odGhlU2VsKSB7CiAgJCgkKHRoZVNlbCkuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykuZ2V0KCkucmV2ZXJzZSgpKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAkKHRoaXMpLm5leHQoJzpub3QoOnNlbGVjdGVkKScpLmRldGFjaCgpLmluc2VydEJlZm9yZSgkKHRoaXMpKTsKICB9KTsKfQoKZnVuY3Rpb24gbW92ZU9wdGlvbkJvdHRvbSh0aGVTZWwpIHsKICAkKHRoZVNlbCkuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykuZGV0YWNoKCkuYXBwZW5kVG8oJCh0aGVTZWwpKTsKfQoKZnVuY3Rpb24gaW5pdEZpbHRlcnMoKSB7CiAgJCgnI2FkZF9maWx0ZXJfc2VsZWN0JykuY2hhbmdlKGZ1bmN0aW9uKCkgewogICAgYWRkRmlsdGVyKCQodGhpcykudmFsKCksICcnLCBbXSk7CiAgfSk7CiAgJCgnI2ZpbHRlcnMtdGFibGUgLmZpZWxkIGlucHV0W3R5cGU9Y2hlY2tib3hdJykuZWFjaChmdW5jdGlvbigpIHsKICAgIHRvZ2dsZUZpbHRlcigkKHRoaXMpLnZhbCgpKTsKICB9KTsKICAkKCcjZmlsdGVycy10YWJsZScpLm9uKCdjbGljaycsICcuZmllbGQgaW5wdXRbdHlwZT1jaGVja2JveF0nLCBmdW5jdGlvbigpIHsKICAgIHRvZ2dsZUZpbHRlcigkKHRoaXMpLnZhbCgpKTsKICB9KTsKICAkKCcjZmlsdGVycy10YWJsZScpLm9uKCdrZXlwcmVzcycsICdpbnB1dFt0eXBlPXRleHRdJywgZnVuY3Rpb24oZSkgewogICAgaWYgKGUua2V5Q29kZSA9PSAxMykgJCh0aGlzKS5jbG9zZXN0KCdmb3JtJykuc3VibWl0KCk7CiAgfSk7Cn0KCmZ1bmN0aW9uIGFkZEZpbHRlcihmaWVsZCwgb3BlcmF0b3IsIHZhbHVlcykgewogIHZhciBmaWVsZElkID0gZmllbGQucmVwbGFjZSgnLicsICdfJyk7CiAgdmFyIHRyID0gJCgnI3RyXycrZmllbGRJZCk7CgogIHZhciBmaWx0ZXJPcHRpb25zID0gYXZhaWxhYmxlRmlsdGVyc1tmaWVsZF07CiAgaWYgKCFmaWx0ZXJPcHRpb25zKSByZXR1cm47CgogIGlmIChmaWx0ZXJPcHRpb25zWydyZW1vdGUnXSAmJiBmaWx0ZXJPcHRpb25zWyd2YWx1ZXMnXSA9PSBudWxsKSB7CiAgICAkLmdldEpTT04oZmlsdGVyc1VybCwgeyduYW1lJzogZmllbGR9KS5kb25lKGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgZmlsdGVyT3B0aW9uc1sndmFsdWVzJ10gPSBkYXRhOwogICAgICBhZGRGaWx0ZXIoZmllbGQsIG9wZXJhdG9yLCB2YWx1ZXMpIDsKICAgIH0pOwogICAgcmV0dXJuOwogIH0KCiAgaWYgKHRyLmxlbmd0aCA+IDApIHsKICAgIHRyLnNob3coKTsKICB9IGVsc2UgewogICAgYnVpbGRGaWx0ZXJSb3coZmllbGQsIG9wZXJhdG9yLCB2YWx1ZXMpOwogIH0KICAkKCcjY2JfJytmaWVsZElkKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7CiAgdG9nZ2xlRmlsdGVyKGZpZWxkKTsKICB0b2dnbGVNdWx0aVNlbGVjdEljb25Jbml0KCk7CiAgJCgnI2FkZF9maWx0ZXJfc2VsZWN0JykudmFsKCcnKS5maW5kKCdvcHRpb24nKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgaWYgKCQodGhpcykuYXR0cigndmFsdWUnKSA9PSBmaWVsZCkgewogICAgICAkKHRoaXMpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIGJ1aWxkRmlsdGVyUm93KGZpZWxkLCBvcGVyYXRvciwgdmFsdWVzKSB7CiAgdmFyIGZpZWxkSWQgPSBmaWVsZC5yZXBsYWNlKCcuJywgJ18nKTsKICB2YXIgZmlsdGVyVGFibGUgPSAkKCIjZmlsdGVycy10YWJsZSIpOwogIHZhciBmaWx0ZXJPcHRpb25zID0gYXZhaWxhYmxlRmlsdGVyc1tmaWVsZF07CiAgaWYgKCFmaWx0ZXJPcHRpb25zKSByZXR1cm47CiAgdmFyIG9wZXJhdG9ycyA9IG9wZXJhdG9yQnlUeXBlW2ZpbHRlck9wdGlvbnNbJ3R5cGUnXV07CiAgdmFyIGZpbHRlclZhbHVlcyA9IGZpbHRlck9wdGlvbnNbJ3ZhbHVlcyddOwogIHZhciBzZWxlY3Q7CgogIHZhciB0ciA9ICQoJzxkaXYgY2xhc3M9ImZpbHRlciI+JykuYXR0cignaWQnLCAndHJfJytmaWVsZElkKS5odG1sKAogICAgJzxkaXYgY2xhc3M9ImZpZWxkIj48aW5wdXQgY2hlY2tlZD0iY2hlY2tlZCIgaWQ9ImNiXycrZmllbGRJZCsnIiBuYW1lPSJmW10iIHZhbHVlPSInK2ZpZWxkKyciIHR5cGU9ImNoZWNrYm94Ij48bGFiZWwgZm9yPSJjYl8nK2ZpZWxkSWQrJyI+ICcrZmlsdGVyT3B0aW9uc1snbmFtZSddKyc8L2xhYmVsPjwvZGl2PicgKwogICAgJzxkaXYgY2xhc3M9Im9wZXJhdG9yIj48c2VsZWN0IGlkPSJvcGVyYXRvcnNfJytmaWVsZElkKyciIG5hbWU9Im9wWycrZmllbGQrJ10iPjwvc2VsZWN0PjwvZGl2PicgKwogICAgJzxkaXYgY2xhc3M9InZhbHVlcyI+PC9kaXY+JwogICk7CiAgZmlsdGVyVGFibGUuYXBwZW5kKHRyKTsKCiAgc2VsZWN0ID0gdHIuZmluZCgnLm9wZXJhdG9yIHNlbGVjdCcpOwogIG9wZXJhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uKG9wKSB7CiAgICB2YXIgb3B0aW9uID0gJCgnPG9wdGlvbj4nKS52YWwob3ApLnRleHQob3BlcmF0b3JMYWJlbHNbb3BdKTsKICAgIGlmIChvcCA9PSBvcGVyYXRvcikgeyBvcHRpb24ucHJvcCgnc2VsZWN0ZWQnLCB0cnVlKTsgfQogICAgc2VsZWN0LmFwcGVuZChvcHRpb24pOwogIH0pOwogIHNlbGVjdC5jaGFuZ2UoZnVuY3Rpb24oKXsgdG9nZ2xlT3BlcmF0b3IoZmllbGQpOyB9KTsKCiAgc3dpdGNoIChmaWx0ZXJPcHRpb25zWyd0eXBlJ10pIHsKICBjYXNlICJsaXN0IjoKICBjYXNlICJsaXN0X3dpdGhfaGlzdG9yeSI6CiAgY2FzZSAibGlzdF9vcHRpb25hbCI6CiAgY2FzZSAibGlzdF9vcHRpb25hbF93aXRoX2hpc3RvcnkiOgogIGNhc2UgImxpc3Rfc3RhdHVzIjoKICBjYXNlICJsaXN0X3N1YnByb2plY3RzIjoKICAgIGNvbnN0IGljb25UeXBlID0gdmFsdWVzLmxlbmd0aCA+IDEgPyAndG9nZ2xlLW1pbnVzJyA6ICd0b2dnbGUtcGx1cyc7CiAgICBjb25zdCBjbG9uZWRJY29uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2ljb24tY29weS1zb3VyY2Ugc3ZnJykuY2xvbmVOb2RlKHRydWUpOwogICAgdXBkYXRlU1ZHSWNvbihjbG9uZWRJY29uLCBpY29uVHlwZSk7CgogICAgdHIuZmluZCgnLnZhbHVlcycpLmFwcGVuZCgKICAgICAgJCgnPHNwYW4+JywgeyBzdHlsZTogJ2Rpc3BsYXk6bm9uZTsnIH0pLmFwcGVuZCgKICAgICAgICAkKCc8c2VsZWN0PicsIHsKICAgICAgICAgIGNsYXNzOiAndmFsdWUnLAogICAgICAgICAgaWQ6IGB2YWx1ZXNfJHtmaWVsZElkfV8xYCwKICAgICAgICAgIG5hbWU6IGB2WyR7ZmllbGR9XVtdYCwKICAgICAgICB9KSwKICAgICAgICAnXG4nLAogICAgICAgICQoJzxzcGFuPicsIHsgY2xhc3M6IGB0b2dnbGUtbXVsdGlzZWxlY3QgaWNvbi1vbmx5IGljb24tJHtpY29uVHlwZX1gIH0pLmFwcGVuZChjbG9uZWRJY29uKQogICAgICApCiAgICApOwogICAgc2VsZWN0ID0gdHIuZmluZCgnLnZhbHVlcyBzZWxlY3QnKTsKICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMSkgeyBzZWxlY3QuYXR0cignbXVsdGlwbGUnLCB0cnVlKTsgfQogICAgZmlsdGVyVmFsdWVzLmZvckVhY2goZnVuY3Rpb24oZmlsdGVyVmFsdWUpIHsKICAgICAgdmFyIG9wdGlvbiA9ICQoJzxvcHRpb24+Jyk7CiAgICAgIGlmICgkLmlzQXJyYXkoZmlsdGVyVmFsdWUpKSB7CiAgICAgICAgb3B0aW9uLnZhbChmaWx0ZXJWYWx1ZVsxXSkudGV4dChmaWx0ZXJWYWx1ZVswXSk7CiAgICAgICAgaWYgKCQuaW5BcnJheShmaWx0ZXJWYWx1ZVsxXSwgdmFsdWVzKSA+IC0xKSB7b3B0aW9uLnByb3AoJ3NlbGVjdGVkJywgdHJ1ZSk7fQogICAgICAgIGlmIChmaWx0ZXJWYWx1ZS5sZW5ndGggPT0gMykgewogICAgICAgICAgdmFyIG9wdGdyb3VwID0gc2VsZWN0LmZpbmQoJ29wdGdyb3VwJykuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuICQodGhpcykuYXR0cignbGFiZWwnKSA9PSBmaWx0ZXJWYWx1ZVsyXX0pOwogICAgICAgICAgaWYgKCFvcHRncm91cC5sZW5ndGgpIHtvcHRncm91cCA9ICQoJzxvcHRncm91cD4nKS5hdHRyKCdsYWJlbCcsIGZpbHRlclZhbHVlWzJdKTt9CiAgICAgICAgICBvcHRpb24gPSBvcHRncm91cC5hcHBlbmQob3B0aW9uKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb3B0aW9uLnZhbChmaWx0ZXJWYWx1ZSkudGV4dChmaWx0ZXJWYWx1ZSk7CiAgICAgICAgaWYgKCQuaW5BcnJheShmaWx0ZXJWYWx1ZSwgdmFsdWVzKSA+IC0xKSB7b3B0aW9uLnByb3AoJ3NlbGVjdGVkJywgdHJ1ZSk7fQogICAgICB9CiAgICAgIHNlbGVjdC5hcHBlbmQob3B0aW9uKTsKICAgIH0pOwogICAgYnJlYWs7CiAgY2FzZSAiZGF0ZSI6CiAgY2FzZSAiZGF0ZV9wYXN0IjoKICAgIHRyLmZpbmQoJy52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9ImRhdGUiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnXzEiIHNpemU9IjEwIiBjbGFzcz0idmFsdWUgZGF0ZV92YWx1ZSIgLz48L3NwYW4+JyArCiAgICAgICcgPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZTsiPjxpbnB1dCB0eXBlPSJkYXRlIiBuYW1lPSJ2WycrZmllbGQrJ11bXSIgaWQ9InZhbHVlc18nK2ZpZWxkSWQrJ18yIiBzaXplPSIxMCIgY2xhc3M9InZhbHVlIGRhdGVfdmFsdWUiIC8+PC9zcGFuPicgKwogICAgICAnIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKyciIHNpemU9IjMiIGNsYXNzPSJ2YWx1ZSIgLz4gJytsYWJlbERheVBsdXJhbCsnPC9zcGFuPicKICAgICk7CiAgICAkKCcjdmFsdWVzXycrZmllbGRJZCsnXzEnKS52YWwodmFsdWVzWzBdKS5kYXRlcGlja2VyRmFsbGJhY2soZGF0ZXBpY2tlck9wdGlvbnMpOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQrJ18yJykudmFsKHZhbHVlc1sxXSkuZGF0ZXBpY2tlckZhbGxiYWNrKGRhdGVwaWNrZXJPcHRpb25zKTsKICAgICQoJyN2YWx1ZXNfJytmaWVsZElkKS52YWwodmFsdWVzWzBdKTsKICAgIGJyZWFrOwogIGNhc2UgInN0cmluZyI6CiAgY2FzZSAidGV4dCI6CiAgY2FzZSAic2VhcmNoIjoKICAgIHRyLmZpbmQoJy52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnIiBzaXplPSIzMCIgY2xhc3M9InZhbHVlIiAvPjwvc3Bhbj4nCiAgICApOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQpLnZhbCh2YWx1ZXNbMF0pOwogICAgYnJlYWs7CiAgY2FzZSAicmVsYXRpb24iOgogICAgdHIuZmluZCgnLnZhbHVlcycpLmFwcGVuZCgKICAgICAgJzxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKyciIHNpemU9IjYiIGNsYXNzPSJ2YWx1ZSIgLz48L3NwYW4+JyArCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PHNlbGVjdCBjbGFzcz0idmFsdWUiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnXzEiPjwvc2VsZWN0Pjwvc3Bhbj4nCiAgICApOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQpLnZhbCh2YWx1ZXNbMF0pOwogICAgc2VsZWN0ID0gdHIuZmluZCgnLnZhbHVlcyBzZWxlY3QnKTsKICAgIGZpbHRlclZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKGZpbHRlclZhbHVlKSB7CiAgICAgIHZhciBvcHRpb24gPSAkKCc8b3B0aW9uPicpOwogICAgICBvcHRpb24udmFsKGZpbHRlclZhbHVlWzFdKS50ZXh0KGZpbHRlclZhbHVlWzBdKTsKICAgICAgaWYgKHZhbHVlc1swXSA9PSBmaWx0ZXJWYWx1ZVsxXSkgeyBvcHRpb24ucHJvcCgnc2VsZWN0ZWQnLCB0cnVlKTsgfQogICAgICBzZWxlY3QuYXBwZW5kKG9wdGlvbik7CiAgICB9KTsKICAgIGJyZWFrOwogIGNhc2UgImludGVnZXIiOgogIGNhc2UgImZsb2F0IjoKICBjYXNlICJ0cmVlIjoKICAgIHRyLmZpbmQoJy52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnXzEiIHNpemU9IjE0IiBjbGFzcz0idmFsdWUiIC8+PC9zcGFuPicgKwogICAgICAnIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKydfMiIgc2l6ZT0iMTQiIGNsYXNzPSJ2YWx1ZSIgLz48L3NwYW4+JwogICAgKTsKICAgICQoJyN2YWx1ZXNfJytmaWVsZElkKydfMScpLnZhbCh2YWx1ZXNbMF0pOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQrJ18yJykudmFsKHZhbHVlc1sxXSk7CiAgICBicmVhazsKICB9Cn0KCmZ1bmN0aW9uIHRvZ2dsZUZpbHRlcihmaWVsZCkgewogIHZhciBmaWVsZElkID0gZmllbGQucmVwbGFjZSgnLicsICdfJyk7CiAgaWYgKCQoJyNjYl8nICsgZmllbGRJZCkuaXMoJzpjaGVja2VkJykpIHsKICAgICQoIiNvcGVyYXRvcnNfIiArIGZpZWxkSWQpLnNob3coKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpOwogICAgdG9nZ2xlT3BlcmF0b3IoZmllbGQpOwogIH0gZWxzZSB7CiAgICAkKCIjb3BlcmF0b3JzXyIgKyBmaWVsZElkKS5oaWRlKCkuYXR0cignZGlzYWJsZWQnLCB0cnVlKTsKICAgIGVuYWJsZVZhbHVlcyhmaWVsZCwgW10pOwogIH0KfQoKZnVuY3Rpb24gZW5hYmxlVmFsdWVzKGZpZWxkLCBpbmRleGVzKSB7CiAgdmFyIGZpZWxkSWQgPSBmaWVsZC5yZXBsYWNlKCcuJywgJ18nKTsKICAkKCcjdHJfJytmaWVsZElkKycgLnZhbHVlcyAudmFsdWUnKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICBpZiAoJC5pbkFycmF5KGluZGV4LCBpbmRleGVzKSA+PSAwKSB7CiAgICAgICQodGhpcykucmVtb3ZlQXR0cignZGlzYWJsZWQnKTsKICAgICAgJCh0aGlzKS5wYXJlbnRzKCdzcGFuJykuZmlyc3QoKS5zaG93KCk7CiAgICB9IGVsc2UgewogICAgICAkKHRoaXMpLnZhbCgnJyk7CiAgICAgICQodGhpcykuYXR0cignZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgJCh0aGlzKS5wYXJlbnRzKCdzcGFuJykuZmlyc3QoKS5oaWRlKCk7CiAgICB9CgogICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ2dyb3VwJykpIHsKICAgICAgJCh0aGlzKS5hZGRDbGFzcygnb3BlbicpOwogICAgfSBlbHNlIHsKICAgICAgJCh0aGlzKS5zaG93KCk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIHRvZ2dsZU9wZXJhdG9yKGZpZWxkKSB7CiAgdmFyIGZpZWxkSWQgPSBmaWVsZC5yZXBsYWNlKCcuJywgJ18nKTsKICB2YXIgb3BlcmF0b3IgPSAkKCIjb3BlcmF0b3JzXyIgKyBmaWVsZElkKTsKICBzd2l0Y2ggKG9wZXJhdG9yLnZhbCgpKSB7CiAgICBjYXNlICIhKiI6CiAgICBjYXNlICIqIjoKICAgIGNhc2UgIm5kIjoKICAgIGNhc2UgInQiOgogICAgY2FzZSAibGQiOgogICAgY2FzZSAibnciOgogICAgY2FzZSAidyI6CiAgICBjYXNlICJsdyI6CiAgICBjYXNlICJsMnciOgogICAgY2FzZSAibm0iOgogICAgY2FzZSAibSI6CiAgICBjYXNlICJsbSI6CiAgICBjYXNlICJ5IjoKICAgIGNhc2UgIm8iOgogICAgY2FzZSAiYyI6CiAgICBjYXNlICIqbyI6CiAgICBjYXNlICIhbyI6CiAgICAgIGVuYWJsZVZhbHVlcyhmaWVsZCwgW10pOwogICAgICBicmVhazsKICAgIGNhc2UgIj48IjoKICAgICAgZW5hYmxlVmFsdWVzKGZpZWxkLCBbMCwxXSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAiPHQrIjoKICAgIGNhc2UgIj50KyI6CiAgICBjYXNlICI+PHQrIjoKICAgIGNhc2UgInQrIjoKICAgIGNhc2UgIj50LSI6CiAgICBjYXNlICI8dC0iOgogICAgY2FzZSAiPjx0LSI6CiAgICBjYXNlICJ0LSI6CiAgICAgIGVuYWJsZVZhbHVlcyhmaWVsZCwgWzJdKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICI9cCI6CiAgICBjYXNlICI9IXAiOgogICAgY2FzZSAiIXAiOgogICAgICBlbmFibGVWYWx1ZXMoZmllbGQsIFsxXSk7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgZW5hYmxlVmFsdWVzKGZpZWxkLCBbMF0pOwogICAgICBicmVhazsKICB9Cn0KCmZ1bmN0aW9uIHRvZ2dsZU11bHRpU2VsZWN0KGVsKSB7CiAgdmFyIGlzV29ya2Zsb3cgPSBlbC5jbG9zZXN0KCcuY29udHJvbGxlci13b3JrZmxvd3MnKTsKICBpZiAoZWwuYXR0cignbXVsdGlwbGUnKSkgewogICAgZWwucmVtb3ZlQXR0cignbXVsdGlwbGUnKTsKICAgIGlmIChpc1dvcmtmbG93KSB7IGVsLmZpbmQoIm9wdGlvblt2YWx1ZT1hbGxdIikuc2hvdygpOyB9CiAgICBlbC5hdHRyKCdzaXplJywgMSk7CiAgfSBlbHNlIHsKICAgIGVsLmF0dHIoJ211bHRpcGxlJywgdHJ1ZSk7CiAgICBpZiAoaXNXb3JrZmxvdykgeyBlbC5maW5kKCJvcHRpb25bdmFsdWU9YWxsXSIpLmF0dHIoInNlbGVjdGVkIiwgZmFsc2UpLmhpZGUoKTsgfQogICAgaWYgKGVsLmNoaWxkcmVuKCkubGVuZ3RoID4gMTApCiAgICAgIGVsLmF0dHIoJ3NpemUnLCAxMCk7CiAgICBlbHNlCiAgICAgIGVsLmF0dHIoJ3NpemUnLCA0KTsKICB9Cn0KCmZ1bmN0aW9uIHNob3dUYWIobmFtZSwgdXJsKSB7CiAgJCgnI3RhYi1jb250ZW50LScgKyBuYW1lKS5wYXJlbnQoKS5maW5kKCcudGFiLWNvbnRlbnQnKS5oaWRlKCk7CiAgJCgnI3RhYi1jb250ZW50LScgKyBuYW1lKS5zaG93KCk7CiAgJCgnI3RhYi0nICsgbmFtZSkuY2xvc2VzdCgnLnRhYnMnKS5maW5kKCdhJykucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkJyk7CiAgJCgnI3RhYi0nICsgbmFtZSkuYWRkQ2xhc3MoJ3NlbGVjdGVkJyk7CgogIHJlcGxhY2VJbkhpc3RvcnkodXJsKQoKICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIHNob3dJc3N1ZUhpc3Rvcnkoam91cm5hbCwgdXJsKSB7CiAgdGFiX2NvbnRlbnQgPSAkKCcjdGFiLWNvbnRlbnQtaGlzdG9yeScpOwogIHRhYl9jb250ZW50LnBhcmVudCgpLmZpbmQoJy50YWItY29udGVudCcpLmhpZGUoKTsKICB0YWJfY29udGVudC5zaG93KCk7CiAgdGFiX2NvbnRlbnQucGFyZW50KCkuY2hpbGRyZW4oJ2Rpdi50YWJzJykuZmluZCgnYScpLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpOwoKICAkKCcjdGFiLScgKyBqb3VybmFsKS5hZGRDbGFzcygnc2VsZWN0ZWQnKTsKCiAgcmVwbGFjZUluSGlzdG9yeSh1cmwpCgogIHN3aXRjaChqb3VybmFsKSB7CiAgICBjYXNlICdub3Rlcyc6CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbDpub3QoLmhhcy1ub3RlcyknKS5oaWRlKCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC53aWtpJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAuY29udGV4dHVhbCAuam91cm5hbC1hY3Rpb25zJykuc2hvdygpOwoKICAgICAgLy8gYWx3YXlzIHNob3cgdGh1bWJuYWlscyBpbiBub3RlcyB0YWIKICAgICAgdmFyIHRodW1ibmFpbHMgPSB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAudGh1bWJuYWlscycpOwogICAgICB0aHVtYm5haWxzLnNob3coKTsKICAgICAgLy8gc2hvdyBqb3VybmFscyB3aXRob3V0IG5vdGVzLCBidXQgd2l0aCB0aHVtYm5haWxzCiAgICAgIHRodW1ibmFpbHMucGFyZW50cygnLmpvdXJuYWwnKS5zaG93KCk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAncHJvcGVydGllcyc6CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbDpub3QoLmhhcy1kZXRhaWxzKScpLmhpZGUoKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwgLndpa2knKS5oaWRlKCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC50aHVtYm5haWxzJykuaGlkZSgpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAuY29udGV4dHVhbCAuam91cm5hbC1hY3Rpb25zJykuaGlkZSgpOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAud2lraScpLnNob3coKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwgLnRodW1ibmFpbHMnKS5zaG93KCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC5jb250ZXh0dWFsIC5qb3VybmFsLWFjdGlvbnMnKS5zaG93KCk7CiAgfQoKICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIGdldFJlbW90ZVRhYihuYW1lLCByZW1vdGVfdXJsLCB1cmwsIGxvYWRfYWx3YXlzKSB7CiAgbG9hZF9hbHdheXMgPSBsb2FkX2Fsd2F5cyB8fCBmYWxzZTsKICB2YXIgdGFiX2NvbnRlbnQgPSAkKCcjdGFiLWNvbnRlbnQtJyArIG5hbWUpOwoKICB0YWJfY29udGVudC5wYXJlbnQoKS5maW5kKCcudGFiLWNvbnRlbnQnKS5oaWRlKCk7CiAgdGFiX2NvbnRlbnQucGFyZW50KCkuY2hpbGRyZW4oJ2Rpdi50YWJzJykuZmluZCgnYScpLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpOwogICQoJyN0YWItJyArIG5hbWUpLmFkZENsYXNzKCdzZWxlY3RlZCcpOwoKICByZXBsYWNlSW5IaXN0b3J5KHVybCk7CgogIGlmICh0YWJfY29udGVudC5jaGlsZHJlbigpLmxlbmd0aCA9PSAwICYmIGxvYWRfYWx3YXlzID09IGZhbHNlKSB7CiAgICAkLmFqYXgoewogICAgICB1cmw6IHJlbW90ZV91cmwsCiAgICAgIHR5cGU6ICdnZXQnLAogICAgICBzdWNjZXNzOiBmdW5jdGlvbihkYXRhKXsKICAgICAgICB0YWJfY29udGVudC5odG1sKGRhdGEpCiAgICAgIH0KICAgIH0pOwogIH0KCiAgdGFiX2NvbnRlbnQuc2hvdygpOwogIHJldHVybiBmYWxzZTsKfQoKLy9yZXBsYWNlcyBjdXJyZW50IFVSTCB3aXRoIHRoZSAiaHJlZiIgYXR0cmlidXRlIG9mIHRoZSBjdXJyZW50IGxpbmsKLy8ob25seSB0cmlnZ2VyZWQgaWYgc3VwcG9ydGVkIGJ5IGJyb3dzZXIpCmZ1bmN0aW9uIHJlcGxhY2VJbkhpc3RvcnkodXJsKSB7CiAgaWYgKCJyZXBsYWNlU3RhdGUiIGluIHdpbmRvdy5oaXN0b3J5ICYmIHVybCAhPT0gdW5kZWZpbmVkKSB7CiAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwgZG9jdW1lbnQudGl0bGUsIHVybCk7CiAgfQp9CgpmdW5jdGlvbiBtb3ZlVGFiUmlnaHQoZWwpIHsKICB2YXIgbGlzID0gJChlbCkucGFyZW50cygnZGl2LnRhYnMnKS5maXJzdCgpLmZpbmQoJ3VsJykuY2hpbGRyZW4oKTsKICB2YXIgYncgPSAkKGVsKS5wYXJlbnRzKCdkaXYudGFicy1idXR0b25zJykub3V0ZXJXaWR0aCh0cnVlKTsKICB2YXIgdGFic1dpZHRoID0gMDsKICB2YXIgaSA9IDA7CiAgbGlzLmVhY2goZnVuY3Rpb24oKSB7CiAgICBpZiAoJCh0aGlzKS5pcygnOnZpc2libGUnKSkgewogICAgICB0YWJzV2lkdGggKz0gJCh0aGlzKS5vdXRlcldpZHRoKHRydWUpOwogICAgfQogIH0pOwogIGlmICh0YWJzV2lkdGggPCAkKGVsKS5wYXJlbnRzKCdkaXYudGFicycpLmZpcnN0KCkud2lkdGgoKSAtIGJ3KSB7IHJldHVybjsgfQogICQoZWwpLnNpYmxpbmdzKCcudGFiLWxlZnQnKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICB3aGlsZSAoaTxsaXMubGVuZ3RoICYmICFsaXMuZXEoaSkuaXMoJzp2aXNpYmxlJykpIHsgaSsrOyB9CiAgdmFyIHcgPSBsaXMuZXEoaSkud2lkdGgoKTsKICBsaXMuZXEoaSkuaGlkZSgpOwogIGlmICh0YWJzV2lkdGggLSB3IDwgJChlbCkucGFyZW50cygnZGl2LnRhYnMnKS5maXJzdCgpLndpZHRoKCkgLSBidykgewogICAgJChlbCkuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7CiAgfQp9CgpmdW5jdGlvbiBtb3ZlVGFiTGVmdChlbCkgewogIHZhciBsaXMgPSAkKGVsKS5wYXJlbnRzKCdkaXYudGFicycpLmZpcnN0KCkuZmluZCgndWwnKS5jaGlsZHJlbigpOwogIHZhciBpID0gMDsKICB3aGlsZSAoaSA8IGxpcy5sZW5ndGggJiYgIWxpcy5lcShpKS5pcygnOnZpc2libGUnKSkgeyBpKys7IH0KICBpZiAoaSA+IDApIHsKICAgIGxpcy5lcShpLTEpLnNob3coKTsKICAgICQoZWwpLnNpYmxpbmdzKCcudGFiLXJpZ2h0JykucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7CiAgfQogIGlmIChpIDw9IDEpIHsKICAgICQoZWwpLmFkZENsYXNzKCdkaXNhYmxlZCcpOwogIH0KfQoKZnVuY3Rpb24gZGlzcGxheVRhYnNCdXR0b25zKCkgewogIHZhciBsaXM7CiAgdmFyIHRhYnNXaWR0aDsKICB2YXIgZWw7CiAgdmFyIG51bUhpZGRlbjsKICAkKCdkaXYudGFicycpLmVhY2goZnVuY3Rpb24oKSB7CiAgICBlbCA9ICQodGhpcyk7CiAgICBsaXMgPSBlbC5maW5kKCd1bCcpLmNoaWxkcmVuKCk7CiAgICB0YWJzV2lkdGggPSAwOwogICAgbnVtSGlkZGVuID0gMDsKICAgIGxpcy5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgIGlmICgkKHRoaXMpLmlzKCc6dmlzaWJsZScpKSB7CiAgICAgICAgdGFic1dpZHRoICs9ICQodGhpcykub3V0ZXJXaWR0aCh0cnVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBudW1IaWRkZW4rKzsKICAgICAgfQogICAgfSk7CiAgICB2YXIgYncgPSAkKGVsKS5maW5kKCdkaXYudGFicy1idXR0b25zJykub3V0ZXJXaWR0aCh0cnVlKTsKICAgIGlmICgodGFic1dpZHRoIDwgZWwud2lkdGgoKSAtIGJ3KSAmJiAobGlzLmxlbmd0aCA9PT0gMCB8fCBsaXMuZmlyc3QoKS5pcygnOnZpc2libGUnKSkpIHsKICAgICAgZWwuZmluZCgnZGl2LnRhYnMtYnV0dG9ucycpLmhpZGUoKTsKICAgIH0gZWxzZSB7CiAgICAgIGVsLmZpbmQoJ2Rpdi50YWJzLWJ1dHRvbnMnKS5zaG93KCkuY2hpbGRyZW4oJ2J1dHRvbi50YWItbGVmdCcpLnRvZ2dsZUNsYXNzKCdkaXNhYmxlZCcsIG51bUhpZGRlbiA9PSAwKTsKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gc2V0UHJlZGVjZXNzb3JGaWVsZHNWaXNpYmlsaXR5KCkgewogIHZhciByZWxhdGlvblR5cGUgPSAkKCcjcmVsYXRpb25fcmVsYXRpb25fdHlwZScpOwogIGlmIChyZWxhdGlvblR5cGUudmFsKCkgPT0gInByZWNlZGVzIiB8fCByZWxhdGlvblR5cGUudmFsKCkgPT0gImZvbGxvd3MiKSB7CiAgICAkKCcjcHJlZGVjZXNzb3JfZmllbGRzJykuc2hvdygpOwogIH0gZWxzZSB7CiAgICAkKCcjcHJlZGVjZXNzb3JfZmllbGRzJykuaGlkZSgpOwogIH0KfQoKZnVuY3Rpb24gc2hvd01vZGFsKGlkLCB3aWR0aCwgdGl0bGUpIHsKICB2YXIgZWwgPSAkKCcjJytpZCkuZmlyc3QoKTsKICBpZiAoZWwubGVuZ3RoID09PSAwIHx8IGVsLmlzKCc6dmlzaWJsZScpKSB7cmV0dXJuO30KICBpZiAoIXRpdGxlKSB0aXRsZSA9IGVsLmZpbmQoJ2gzLnRpdGxlJykudGV4dCgpOwogIC8vIG1vdmVzIGV4aXN0aW5nIG1vZGFscyBiZWhpbmQgdGhlIHRyYW5zcGFyZW50IGJhY2tncm91bmQKICAkKCIubW9kYWwiKS5jc3MoJ3pJbmRleCcsOTkpOwogIGVsLmRpYWxvZyh7CiAgICB3aWR0aDogd2lkdGgsCiAgICBtb2RhbDogdHJ1ZSwKICAgIHJlc2l6YWJsZTogZmFsc2UsCiAgICBkaWFsb2dDbGFzczogJ21vZGFsJywKICAgIHRpdGxlOiB0aXRsZQogIH0pLm9uKCdkaWFsb2djbG9zZScsIGZ1bmN0aW9uKCl7CiAgICAkKCIubW9kYWwiKS5jc3MoJ3pJbmRleCcsMTAxKTsKICB9KTsKICBlbC5maW5kKCJpbnB1dFt0eXBlPXRleHRdLCBpbnB1dFt0eXBlPXN1Ym1pdF0iKS5maXJzdCgpLmZvY3VzKCk7Cn0KCmZ1bmN0aW9uIGhpZGVNb2RhbChlbCkgewogIHZhciBtb2RhbDsKICBpZiAoZWwpIHsKICAgIG1vZGFsID0gJChlbCkucGFyZW50cygnLnVpLWRpYWxvZy1jb250ZW50Jyk7CiAgfSBlbHNlIHsKICAgIG1vZGFsID0gJCgnI2FqYXgtbW9kYWwnKTsKICB9CiAgbW9kYWwuZGlhbG9nKCJjbG9zZSIpOwp9CgpmdW5jdGlvbiBjb2xsYXBzZVNjbUVudHJ5KGlkKSB7CiAgJCgnLicraWQpLmVhY2goZnVuY3Rpb24oKSB7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnb3BlbicpKSB7CiAgICAgIGNvbGxhcHNlU2NtRW50cnkoJCh0aGlzKS5hdHRyKCdpZCcpKTsKICAgIH0KICAgICQodGhpcykuaGlkZSgpOwogIH0pOwogICQoJyMnK2lkKS5yZW1vdmVDbGFzcygnb3BlbicpOwp9CgpmdW5jdGlvbiBleHBhbmRTY21FbnRyeShpZCkgewogICQoJy4nK2lkKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgJCh0aGlzKS5zaG93KCk7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnbG9hZGVkJykgJiYgISQodGhpcykuaGFzQ2xhc3MoJ2NvbGxhcHNlZCcpKSB7CiAgICAgIGV4cGFuZFNjbUVudHJ5KCQodGhpcykuYXR0cignaWQnKSk7CiAgICB9CiAgfSk7CiAgJCgnIycraWQpLmFkZENsYXNzKCdvcGVuJyk7Cn0KCmZ1bmN0aW9uIHNjbUVudHJ5Q2xpY2soaWQsIHVybCkgewogICAgdmFyIGVsID0gJCgnIycraWQpOwogICAgdmFyIGV4cGFuZGVyID0gZWwuZmluZCgnLmV4cGFuZGVyJyk7CiAgICB2YXIgZm9sZGVyID0gZWwuZmluZCgnLmljb24tZm9sZGVyJyk7CgogICAgaWYgKGVsLmhhc0NsYXNzKCdvcGVuJykpIHsKICAgICAgICBjb2xsYXBzZVNjbUVudHJ5KGlkKTsKICAgICAgICBlbC5maW5kKCcuZXhwYW5kZXInKS5zd2l0Y2hDbGFzcygnaWNvbi1leHBhbmRlZCcsICdpY29uLWNvbGxhcHNlZCcpOwogICAgICAgIGVsLmFkZENsYXNzKCdjb2xsYXBzZWQnKTsKICAgICAgICB1cGRhdGVTVkdJY29uKGZvbGRlclswXSwgJ2ZvbGRlcicpCiAgICAgICAgdG9nZ2xlRXhwZW5kQ29sbGFwc2VJY29uKGV4cGFuZGVyWzBdKTsKCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSBlbHNlIGlmIChlbC5oYXNDbGFzcygnbG9hZGVkJykpIHsKICAgICAgICBleHBhbmRTY21FbnRyeShpZCk7CiAgICAgICAgZWwuZmluZCgnLmV4cGFuZGVyJykuc3dpdGNoQ2xhc3MoJ2ljb24tY29sbGFwc2VkJywgJ2ljb24tZXhwYW5kZWQnKTsKICAgICAgICBlbC5yZW1vdmVDbGFzcygnY29sbGFwc2VkJyk7CiAgICAgICAgdXBkYXRlU1ZHSWNvbihmb2xkZXJbMF0sICdmb2xkZXItb3BlbicpCiAgICAgICAgdG9nZ2xlRXhwZW5kQ29sbGFwc2VJY29uKGV4cGFuZGVyWzBdKTsKCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKGVsLmhhc0NsYXNzKCdsb2FkaW5nJykpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBlbC5hZGRDbGFzcygnbG9hZGluZycpOwogICAgJC5hamF4KHsKICAgICAgdXJsOiB1cmwsCiAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICBlbC5hZnRlcihkYXRhKTsKICAgICAgICBlbC5hZGRDbGFzcygnb3BlbicpLmFkZENsYXNzKCdsb2FkZWQnKS5yZW1vdmVDbGFzcygnbG9hZGluZycpOwogICAgICAgIGVsLmZpbmQoJy5leHBhbmRlcicpLnN3aXRjaENsYXNzKCdpY29uLWNvbGxhcHNlZCcsICdpY29uLWV4cGFuZGVkJyk7CiAgICAgICAgdXBkYXRlU1ZHSWNvbihmb2xkZXJbMF0sICdmb2xkZXItb3BlbicpCiAgICAgICAgdG9nZ2xlRXhwZW5kQ29sbGFwc2VJY29uKGV4cGFuZGVyWzBdKTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gdHJ1ZTsKfQoKZnVuY3Rpb24gcmFuZG9tS2V5KHNpemUpIHsKICB2YXIgY2hhcnMgPSAnMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonOwogIHZhciBrZXkgPSAnJzsKICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykgewogICAga2V5ICs9IGNoYXJzLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGFycy5sZW5ndGgpKTsKICB9CiAgcmV0dXJuIGtleTsKfQoKZnVuY3Rpb24gY29weVRleHRUb0NsaXBib2FyZCh0YXJnZXQpIHsKICBpZiAodGFyZ2V0KSB7CiAgICB2YXIgdGVtcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7CiAgICB0ZW1wLnZhbHVlID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1jbGlwYm9hcmQtdGV4dCcpOwogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZW1wKTsKICAgIHRlbXAuc2VsZWN0KCk7CiAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpOwogICAgaWYgKHRlbXAucGFyZW50Tm9kZSkgewogICAgICB0ZW1wLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGVtcCk7CiAgICB9CiAgICBpZiAoJCh0YXJnZXQpLmNsb3Nlc3QoJy5kcmRuLmV4cGFuZGVkJykubGVuZ3RoKSB7CiAgICAgICQodGFyZ2V0KS5jbG9zZXN0KCcuZHJkbi5leHBhbmRlZCcpLnJlbW92ZUNsYXNzKCJleHBhbmRlZCIpOwogICAgfQogIH0KICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIHVwZGF0ZUlzc3VlRnJvbSh1cmwsIGVsKSB7CiAgJCgnI2FsbF9hdHRyaWJ1dGVzIGlucHV0LCAjYWxsX2F0dHJpYnV0ZXMgdGV4dGFyZWEsICNhbGxfYXR0cmlidXRlcyBzZWxlY3QnKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAkKHRoaXMpLmRhdGEoJ3ZhbHVlYmVmb3JldXBkYXRlJywgJCh0aGlzKS52YWwoKSk7CiAgfSk7CiAgaWYgKGVsKSB7CiAgICAkKCIjZm9ybV91cGRhdGVfdHJpZ2dlcmVkX2J5IikudmFsKCQoZWwpLmF0dHIoJ2lkJykpOwogIH0KICByZXR1cm4gJC5hamF4KHsKICAgIHVybDogdXJsLAogICAgdHlwZTogJ3Bvc3QnLAogICAgZGF0YTogJCgnI2lzc3VlLWZvcm0nKS5zZXJpYWxpemUoKQogIH0pOwp9CgpmdW5jdGlvbiByZXBsYWNlSXNzdWVGb3JtV2l0aChodG1sKXsKICB2YXIgcmVwbGFjZW1lbnQgPSAkKGh0bWwpOwogICQoJyNhbGxfYXR0cmlidXRlcyBpbnB1dCwgI2FsbF9hdHRyaWJ1dGVzIHRleHRhcmVhLCAjYWxsX2F0dHJpYnV0ZXMgc2VsZWN0JykuZWFjaChmdW5jdGlvbigpewogICAgdmFyIG9iamVjdF9pZCA9ICQodGhpcykuYXR0cignaWQnKTsKICAgIGlmIChvYmplY3RfaWQgJiYgJCh0aGlzKS5kYXRhKCd2YWx1ZWJlZm9yZXVwZGF0ZScpIT0kKHRoaXMpLnZhbCgpKSB7CiAgICAgIHJlcGxhY2VtZW50LmZpbmQoJyMnK29iamVjdF9pZCkudmFsKCQodGhpcykudmFsKCkpOwogICAgfQogIH0pOwogICQoJyNhbGxfYXR0cmlidXRlcycpLmVtcHR5KCk7CiAgJCgnI2FsbF9hdHRyaWJ1dGVzJykucHJlcGVuZChyZXBsYWNlbWVudCk7Cn0KCmZ1bmN0aW9uIHVwZGF0ZUJ1bGtFZGl0RnJvbSh1cmwpIHsKICAkLmFqYXgoewogICAgdXJsOiB1cmwsCiAgICB0eXBlOiAncG9zdCcsCiAgICBkYXRhOiAkKCcjYnVsa19lZGl0X2Zvcm0nKS5zZXJpYWxpemUoKQogIH0pOwp9CgpmdW5jdGlvbiBvYnNlcnZlQXV0b2NvbXBsZXRlRmllbGQoZmllbGRJZCwgdXJsLCBvcHRpb25zKSB7CiAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CiAgICAkKCcjJytmaWVsZElkKS5hdXRvY29tcGxldGUoJC5leHRlbmQoewogICAgICBzb3VyY2U6IHVybCwKICAgICAgbWluTGVuZ3RoOiAyLAogICAgICBwb3NpdGlvbjoge2NvbGxpc2lvbjogImZsaXBmaXQifSwKICAgICAgc2VhcmNoOiBmdW5jdGlvbigpeyQoJyMnK2ZpZWxkSWQpLmFkZENsYXNzKCdhamF4LWxvYWRpbmcnKTt9LAogICAgICByZXNwb25zZTogZnVuY3Rpb24oKXskKCcjJytmaWVsZElkKS5yZW1vdmVDbGFzcygnYWpheC1sb2FkaW5nJyk7fQogICAgfSwgb3B0aW9ucykpOwogICAgJCgnIycrZmllbGRJZCkuYWRkQ2xhc3MoJ2F1dG9jb21wbGV0ZScpOwogIH0pOwp9CgpmdW5jdGlvbiBtdWx0aXBsZUF1dG9jb21wbGV0ZUZpZWxkKGZpZWxkSWQsIHVybCwgb3B0aW9ucykgewogIGZ1bmN0aW9uIHNwbGl0KHZhbCkgewogICAgcmV0dXJuIHZhbC5zcGxpdCgvLFxzKi8pOwogIH0KCiAgZnVuY3Rpb24gZXh0cmFjdExhc3QodGVybSkgewogICAgcmV0dXJuIHNwbGl0KHRlcm0pLnBvcCgpOwogIH0KCiAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkgewogICAgJCgnIycgKyBmaWVsZElkKS5hdXRvY29tcGxldGUoJC5leHRlbmQoewogICAgICBzb3VyY2U6IGZ1bmN0aW9uIChyZXF1ZXN0LCByZXNwb25zZSkgewogICAgICAgICQuZ2V0SlNPTih1cmwsIHsKICAgICAgICAgIHRlcm06IGV4dHJhY3RMYXN0KHJlcXVlc3QudGVybSkKICAgICAgICB9LCByZXNwb25zZSk7CiAgICAgIH0sCiAgICAgIG1pbkxlbmd0aDogMiwKICAgICAgcG9zaXRpb246IHtjb2xsaXNpb246ICJmbGlwZml0In0sCiAgICAgIHNlYXJjaDogZnVuY3Rpb24gKCkgewogICAgICAgICQoJyMnICsgZmllbGRJZCkuYWRkQ2xhc3MoJ2FqYXgtbG9hZGluZycpOwogICAgICB9LAogICAgICByZXNwb25zZTogZnVuY3Rpb24gKCkgewogICAgICAgICQoJyMnICsgZmllbGRJZCkucmVtb3ZlQ2xhc3MoJ2FqYXgtbG9hZGluZycpOwogICAgICB9LAogICAgICBzZWxlY3Q6IGZ1bmN0aW9uIChldmVudCwgdWkpIHsKICAgICAgICB2YXIgdGVybXMgPSBzcGxpdCh0aGlzLnZhbHVlKTsKICAgICAgICAvLyByZW1vdmUgdGhlIGN1cnJlbnQgaW5wdXQKICAgICAgICB0ZXJtcy5wb3AoKTsKICAgICAgICAvLyBhZGQgdGhlIHNlbGVjdGVkIGl0ZW0KICAgICAgICB0ZXJtcy5wdXNoKHVpLml0ZW0udmFsdWUpOwogICAgICAgIC8vIGFkZCBwbGFjZWhvbGRlciB0byBnZXQgdGhlIGNvbW1hLWFuZC1zcGFjZSBhdCB0aGUgZW5kCiAgICAgICAgdGVybXMucHVzaCgiIik7CiAgICAgICAgdGhpcy52YWx1ZSA9IHRlcm1zLmpvaW4oIiwgIik7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9LCBvcHRpb25zKSk7CiAgICAkKCcjJyArIGZpZWxkSWQpLmFkZENsYXNzKCdhdXRvY29tcGxldGUnKTsKICB9KTsKfQoKZnVuY3Rpb24gb2JzZXJ2ZVNlYXJjaGZpZWxkKGZpZWxkSWQsIHRhcmdldElkLCB1cmwpIHsKICAkKCcjJytmaWVsZElkKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgdmFyICR0aGlzID0gJCh0aGlzKTsKICAgICR0aGlzLmFkZENsYXNzKCdhdXRvY29tcGxldGUnKTsKICAgICR0aGlzLmF0dHIoJ2RhdGEtdmFsdWUtd2FzJywgJHRoaXMudmFsKCkpOwogICAgdmFyIGNoZWNrID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciB2YWwgPSAkdGhpcy52YWwoKTsKICAgICAgaWYgKCR0aGlzLmF0dHIoJ2RhdGEtdmFsdWUtd2FzJykgIT0gdmFsKXsKICAgICAgICAkdGhpcy5hdHRyKCdkYXRhLXZhbHVlLXdhcycsIHZhbCk7CiAgICAgICAgJC5hamF4KHsKICAgICAgICAgIHVybDogdXJsLAogICAgICAgICAgdHlwZTogJ2dldCcsCiAgICAgICAgICBkYXRhOiB7cTogJHRoaXMudmFsKCl9LAogICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSl7IGlmKHRhcmdldElkKSAkKCcjJyt0YXJnZXRJZCkuaHRtbChkYXRhKTsgfSwKICAgICAgICAgIGJlZm9yZVNlbmQ6IGZ1bmN0aW9uKCl7ICR0aGlzLmFkZENsYXNzKCdhamF4LWxvYWRpbmcnKTsgfSwKICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpeyAkdGhpcy5yZW1vdmVDbGFzcygnYWpheC1sb2FkaW5nJyk7IH0KICAgICAgICB9KTsKICAgICAgfQogICAgfTsKICAgIHZhciByZXNldCA9IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGltZXIpIHsKICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsKICAgICAgICB0aW1lciA9IHNldEludGVydmFsKGNoZWNrLCAzMDApOwogICAgICB9CiAgICB9OwogICAgdmFyIHRpbWVyID0gc2V0SW50ZXJ2YWwoY2hlY2ssIDMwMCk7CiAgICAkdGhpcy5iaW5kKCdrZXl1cCBjbGljayBtb3VzZW1vdmUnLCByZXNldCk7CiAgfSk7Cn0KCiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCl7CiAgJCgiLmRyZG4gLmF1dG9jb21wbGV0ZSIpLnZhbCgnJyk7CgogIC8vIFRoaXMgdmFyaWFibGUgaXMgdXNlZCB0byBmb2N1cyBzZWxlY3RlZCBwcm9qZWN0CiAgdmFyIHNlbGVjdGVkOwogICQoZG9jdW1lbnQpLm9uKCdjbGljaycsICcuZHJkbi10cmlnZ2VyJywgZnVuY3Rpb24oZSl7CiAgICB2YXIgZHJkbiA9ICQodGhpcykuY2xvc2VzdCgiLmRyZG4iKTsKICAgIGlmIChkcmRuLmhhc0NsYXNzKCJleHBhbmRlZCIpKSB7CiAgICAgIGRyZG4ucmVtb3ZlQ2xhc3MoImV4cGFuZGVkIik7CiAgICB9IGVsc2UgewogICAgICAkKCIuZHJkbiIpLnJlbW92ZUNsYXNzKCJleHBhbmRlZCIpOwogICAgICBkcmRuLmFkZENsYXNzKCJleHBhbmRlZCIpOwogICAgICBpZiAoJCh0aGlzKS5wYXJlbnQoJyNwcm9qZWN0LWp1bXAnKS5sZW5ndGgpIHsKICAgICAgICBzZWxlY3RlZCA9ICQoJy5kcmRuLWl0ZW1zIGEuc2VsZWN0ZWQnKTsgLy8gU3RvcmUgc2VsZWN0ZWQgcHJvamVjdAogICAgICAgIHNlbGVjdGVkLmZpcnN0KCkuZm9jdXMoKTsgLy8gQ2FsbGluZyBmb2N1cyB0byBzY3JvbGwgdG8gc2VsZWN0ZWQgcHJvamVjdAogICAgICB9CiAgICAgIGlmICghaXNNb2JpbGUoKSkgewogICAgICAgIGRyZG4uZmluZCgiLmF1dG9jb21wbGV0ZSIpLmZvY3VzKCk7CiAgICAgIH0KICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgIH0KICB9KTsKICAkKGRvY3VtZW50KS5jbGljayhmdW5jdGlvbihlKXsKICAgIGlmICgkKGUudGFyZ2V0KS5jbG9zZXN0KCIuZHJkbiIpLmxlbmd0aCA8IDEpIHsKICAgICAgJCgiLmRyZG4uZXhwYW5kZWQiKS5yZW1vdmVDbGFzcygiZXhwYW5kZWQiKTsKICAgIH0KICB9KTsKCiAgb2JzZXJ2ZVNlYXJjaGZpZWxkKCdwcm9qZWN0cy1xdWljay1zZWFyY2gnLCBudWxsLCAkKCcjcHJvamVjdHMtcXVpY2stc2VhcmNoJykuZGF0YSgnYXV0b21jb21wbGV0ZS11cmwnKSk7CgogICQoIi5kcmRuLWNvbnRlbnQiKS5rZXlkb3duKGZ1bmN0aW9uKGV2ZW50KXsKICAgIHZhciBpdGVtcyA9ICQodGhpcykuZmluZCgiLmRyZG4taXRlbXMiKTsKCiAgICAvLyBJZiBhIHByb2plY3QgaXMgc2VsZWN0ZWQgc2V0IGZvY3VzZWQgdG8gc2VsZWN0ZWQgb25seSBvbmNlCiAgICBpZiAoc2VsZWN0ZWQgJiYgc2VsZWN0ZWQubGVuZ3RoID4gMCkgewogICAgICB2YXIgZm9jdXNlZCA9IHNlbGVjdGVkOwogICAgICBzZWxlY3RlZCA9IHVuZGVmaW5lZDsKICAgIH0KICAgIGVsc2UgewogICAgICB2YXIgZm9jdXNlZCA9IGl0ZW1zLmZpbmQoImE6Zm9jdXMiKTsKICAgIH0KICAgIHN3aXRjaCAoZXZlbnQud2hpY2gpIHsKICAgIGNhc2UgNDA6IC8vZG93bgogICAgICBpZiAoZm9jdXNlZC5sZW5ndGggPiAwKSB7CiAgICAgICAgZm9jdXNlZC5uZXh0QWxsKCJhIikuZmlyc3QoKS5mb2N1cygpOzsKICAgICAgfSBlbHNlIHsKICAgICAgICBpdGVtcy5maW5kKCJhIikuZmlyc3QoKS5mb2N1cygpOzsKICAgICAgfQogICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBicmVhazsKICAgIGNhc2UgMzg6IC8vdXAKICAgICAgaWYgKGZvY3VzZWQubGVuZ3RoID4gMCkgewogICAgICAgIHZhciBwcmV2ID0gZm9jdXNlZC5wcmV2QWxsKCJhIik7CiAgICAgICAgaWYgKHByZXYubGVuZ3RoID4gMCkgewogICAgICAgICAgcHJldi5maXJzdCgpLmZvY3VzKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICQodGhpcykuZmluZCgiLmF1dG9jb21wbGV0ZSIpLmZvY3VzKCk7CiAgICAgICAgfQogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlIDM1OiAvL2VuZAogICAgICBpZiAoZm9jdXNlZC5sZW5ndGggPiAwKSB7CiAgICAgICAgZm9jdXNlZC5uZXh0QWxsKCJhIikubGFzdCgpLmZvY3VzKCk7CiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgMzY6IC8vaG9tZQogICAgICBpZiAoZm9jdXNlZC5sZW5ndGggPiAwKSB7CiAgICAgICAgZm9jdXNlZC5wcmV2QWxsKCJhIikubGFzdCgpLmZvY3VzKCk7CiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgfQogICAgICBicmVhazsKICAgIH0KICB9KTsKfSk7CgpmdW5jdGlvbiBiZWZvcmVTaG93RGF0ZVBpY2tlcihpbnB1dCwgaW5zdCkgewogIHZhciBkZWZhdWx0X2RhdGUgPSBudWxsOwogIHN3aXRjaCAoJChpbnB1dCkuYXR0cigiaWQiKSkgewogICAgY2FzZSAiaXNzdWVfc3RhcnRfZGF0ZSIgOgogICAgICBpZiAoJCgiI2lzc3VlX2R1ZV9kYXRlIikubGVuZ3RoID4gMCkgewogICAgICAgIGRlZmF1bHRfZGF0ZSA9ICQoIiNpc3N1ZV9kdWVfZGF0ZSIpLnZhbCgpOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSAiaXNzdWVfZHVlX2RhdGUiIDoKICAgICAgaWYgKCQoIiNpc3N1ZV9zdGFydF9kYXRlIikubGVuZ3RoID4gMCkgewogICAgICAgIHZhciBzdGFydF9kYXRlID0gJCgiI2lzc3VlX3N0YXJ0X2RhdGUiKS52YWwoKTsKICAgICAgICBpZiAoc3RhcnRfZGF0ZSAhPSAiIikgewogICAgICAgICAgc3RhcnRfZGF0ZSA9IG5ldyBEYXRlKERhdGUucGFyc2Uoc3RhcnRfZGF0ZSkpOwogICAgICAgICAgaWYgKHN0YXJ0X2RhdGUgPiBuZXcgRGF0ZSgpKSB7CiAgICAgICAgICAgIGRlZmF1bHRfZGF0ZSA9ICQoIiNpc3N1ZV9zdGFydF9kYXRlIikudmFsKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGJyZWFrOwogIH0KICAkKGlucHV0KS5kYXRlcGlja2VyRmFsbGJhY2soIm9wdGlvbiIsICJkZWZhdWx0RGF0ZSIsIGRlZmF1bHRfZGF0ZSk7Cn0KCihmdW5jdGlvbigkKXsKICAkLmZuLnBvc2l0aW9uZWRJdGVtcyA9IGZ1bmN0aW9uKHNvcnRhYmxlT3B0aW9ucywgb3B0aW9ucyl7CiAgICB2YXIgc2V0dGluZ3MgPSAkLmV4dGVuZCh7CiAgICAgIGZpcnN0UG9zaXRpb246IDEKICAgIH0sIG9wdGlvbnMgKTsKCiAgICByZXR1cm4gdGhpcy5zb3J0YWJsZSgkLmV4dGVuZCh7CiAgICAgIGF4aXM6ICd5JywKICAgICAgaGFuZGxlOiAiLnNvcnQtaGFuZGxlIiwKICAgICAgaGVscGVyOiBmdW5jdGlvbihldmVudCwgdWkpewogICAgICAgIHVpLmNoaWxkcmVuKCd0ZCcpLmVhY2goZnVuY3Rpb24oKXsKICAgICAgICAgICQodGhpcykud2lkdGgoJCh0aGlzKS53aWR0aCgpKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gdWk7CiAgICAgIH0sCiAgICAgIHVwZGF0ZTogZnVuY3Rpb24oZXZlbnQsIHVpKSB7CiAgICAgICAgdmFyIHNvcnRhYmxlID0gJCh0aGlzKTsKICAgICAgICB2YXIgaGFuZGxlID0gdWkuaXRlbS5maW5kKCIuc29ydC1oYW5kbGUiKS5hZGRDbGFzcygiYWpheC1sb2FkaW5nIik7CiAgICAgICAgdmFyIHVybCA9IGhhbmRsZS5kYXRhKCJyZW9yZGVyLXVybCIpOwogICAgICAgIHZhciBwYXJhbSA9IGhhbmRsZS5kYXRhKCJyZW9yZGVyLXBhcmFtIik7CiAgICAgICAgdmFyIGRhdGEgPSB7fTsKICAgICAgICBkYXRhW3BhcmFtXSA9IHtwb3NpdGlvbjogdWkuaXRlbS5pbmRleCgpICsgc2V0dGluZ3NbJ2ZpcnN0UG9zaXRpb24nXX07CiAgICAgICAgJC5hamF4KHsKICAgICAgICAgIHVybDogdXJsLAogICAgICAgICAgdHlwZTogJ3B1dCcsCiAgICAgICAgICBkYXRhVHlwZTogJ3NjcmlwdCcsCiAgICAgICAgICBkYXRhOiBkYXRhLAogICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bil7CiAgICAgICAgICAgIGFsZXJ0KGpxWEhSLnN0YXR1cyk7CiAgICAgICAgICAgIHNvcnRhYmxlLnNvcnRhYmxlKCJjYW5jZWwiKTsKICAgICAgICAgIH0sCiAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKXsKICAgICAgICAgICAgaGFuZGxlLnJlbW92ZUNsYXNzKCJhamF4LWxvYWRpbmciKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfSwKICAgIH0sIHNvcnRhYmxlT3B0aW9ucykpOwogIH0KfSggalF1ZXJ5ICkpOwoKdmFyIHdhcm5MZWF2aW5nVW5zYXZlZE1lc3NhZ2U7CmZ1bmN0aW9uIHdhcm5MZWF2aW5nVW5zYXZlZChtZXNzYWdlKSB7CiAgd2FybkxlYXZpbmdVbnNhdmVkTWVzc2FnZSA9IG1lc3NhZ2U7CiAgJChkb2N1bWVudCkub24oJ3N1Ym1pdCcsICdmb3JtJywgZnVuY3Rpb24oKXsKICAgICQoJ3RleHRhcmVhJykucmVtb3ZlRGF0YSgnY2hhbmdlZCcpOwogIH0pOwogICQoZG9jdW1lbnQpLm9uKCdjaGFuZ2UnLCAndGV4dGFyZWEnLCBmdW5jdGlvbigpewogICAgJCh0aGlzKS5kYXRhKCdjaGFuZ2VkJywgJ2NoYW5nZWQnKTsKICB9KTsKICB3aW5kb3cub25iZWZvcmV1bmxvYWQgPSBmdW5jdGlvbigpewogICAgdmFyIHdhcm4gPSBmYWxzZTsKICAgICQoJ3RleHRhcmVhJykuYmx1cigpLmVhY2goZnVuY3Rpb24oKXsKICAgICAgaWYgKCQodGhpcykuZGF0YSgnY2hhbmdlZCcpKSB7CiAgICAgICAgd2FybiA9IHRydWU7CiAgICAgIH0KICAgIH0pOwogICAgaWYgKHdhcm4pIHtyZXR1cm4gd2FybkxlYXZpbmdVbnNhdmVkTWVzc2FnZTt9CiAgfTsKfQoKZnVuY3Rpb24gc2V0dXBBamF4SW5kaWNhdG9yKCkgewogICQoZG9jdW1lbnQpLmJpbmQoJ2FqYXhTZW5kJywgZnVuY3Rpb24oZXZlbnQsIHhociwgc2V0dGluZ3MpIHsKICAgIGlmICgkKCcuYWpheC1sb2FkaW5nJykubGVuZ3RoID09PSAwICYmIHNldHRpbmdzLmNvbnRlbnRUeXBlICE9ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKSB7CiAgICAgICQoJyNhamF4LWluZGljYXRvcicpLnNob3coKTsKICAgIH0KICB9KTsKICAkKGRvY3VtZW50KS5iaW5kKCdhamF4U3RvcCcsIGZ1bmN0aW9uKCkgewogICAgJCgnI2FqYXgtaW5kaWNhdG9yJykuaGlkZSgpOwogIH0pOwp9CgpmdW5jdGlvbiBzZXR1cFRhYnMoKSB7CiAgaWYoJCgnLnRhYnMnKS5sZW5ndGggPiAwKSB7CiAgICBkaXNwbGF5VGFic0J1dHRvbnMoKTsKICAgICQod2luZG93KS5yZXNpemUoZGlzcGxheVRhYnNCdXR0b25zKTsKICB9Cn0KCmZ1bmN0aW9uIHNldHVwRmlsZVByZXZpZXdOYXZpZ2F0aW9uKCkgewogIC8vIG9ubHkgYmluZCBhcnJvdyBrZXlzIHdoZW4gcHJldmlldyBuYXZpZ2F0aW9uIGlzIHByZXNlbnQKICBjb25zdCBlbGVtZW50ID0gJCgnLnBhZ2luYXRpb24uZmlsZXByZXZpZXcnKS5maXJzdCgpOwogIGlmIChlbGVtZW50KSB7CgogICAgY29uc3QgaGFuZGxlQXJyb3dLZXkgPSBmdW5jdGlvbihzZWxlY3RvciwgZSl7CiAgICAgIGNvbnN0IGhyZWYgPSAkKGVsZW1lbnQpLmZpbmQoc2VsZWN0b3IpLmF0dHIoJ2hyZWYnKTsKICAgICAgaWYgKGhyZWYpIHsKICAgICAgICB3aW5kb3cubG9jYXRpb24gPSBocmVmOwogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgfQogICAgfTsKCiAgICAkKGRvY3VtZW50KS5rZXlkb3duKGZ1bmN0aW9uKGUpIHsKICAgICAgaWYoZS5zaGlmdEtleSB8fCBlLm1ldGFLZXkgfHwgZS5jdHJsS2V5IHx8IGUuYWx0S2V5KSByZXR1cm47CiAgICAgIHN3aXRjaChlLmtleSkgewogICAgICAgIGNhc2UgJ0Fycm93TGVmdCc6CiAgICAgICAgICBoYW5kbGVBcnJvd0tleSgnLnByZXZpb3VzIGEnLCBlKTsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdBcnJvd1JpZ2h0JzoKICAgICAgICAgIGhhbmRsZUFycm93S2V5KCcubmV4dCBhJywgZSk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfSk7CiAgfQp9CgokKGRvY3VtZW50KS5vbigna2V5ZG93bicsICdmb3JtIHRleHRhcmVhJywgZnVuY3Rpb24oZSkgewogIC8vIFN1Ym1pdCB0aGUgZm9ybSB3aXRoIEN0cmwgKyBFbnRlciBvciBDb21tYW5kICsgUmV0dXJuCiAgdmFyIHRhcmdldEZvcm0gPSAkKGUudGFyZ2V0KS5jbG9zZXN0KCdmb3JtJyk7CiAgaWYoZS5rZXlDb2RlID09IDEzICYmICgoZS5jdHJsS2V5ICYmICFlLm1ldGFLZXkpIHx8ICghZS5jdHJsS2V5ICYmIGUubWV0YUtleSkgJiYgdGFyZ2V0Rm9ybS5sZW5ndGgpKSB7CiAgICAvLyBGb3IgYWpheCwgdXNlIGNsaWNrKCkgaW5zdGVhZCBvZiBzdWJtaXQoKSB0byBwcmV2ZW50ICJJbnZhbGlkIGZvcm0gYXV0aGVudGljaXR5IHRva2VuIiBlcnJvcgogICAgaWYgKHRhcmdldEZvcm0uYXR0cignZGF0YS1yZW1vdGUnKSA9PSAndHJ1ZScpIHsKICAgICAgaWYgKHRhcmdldEZvcm0uZmluZCgnaW5wdXRbdHlwZT1zdWJtaXRdJykubGVuZ3RoID09PSAwKSB7IHJldHVybiBmYWxzZTsgfQogICAgICB0YXJnZXRGb3JtLmZpbmQoJ3RleHRhcmVhJykuYmx1cigpLnJlbW92ZURhdGEoJ2NoYW5nZWQnKTsKICAgICAgdGFyZ2V0Rm9ybS5maW5kKCdpbnB1dFt0eXBlPXN1Ym1pdF0nKS5maXJzdCgpLmNsaWNrKCk7CiAgICB9IGVsc2UgewogICAgICB0YXJnZXRGb3JtLmZpbmQoJ3RleHRhcmVhJykuYmx1cigpLnJlbW92ZURhdGEoJ2NoYW5nZWQnKTsKICAgICAgdGFyZ2V0Rm9ybS5zdWJtaXQoKTsKICAgIH0KICB9Cn0pOwoKCmZ1bmN0aW9uIGhpZGVPbkxvYWQoKSB7CiAgJCgnLmhvbCcpLmhpZGUoKTsKfQoKZnVuY3Rpb24gYWRkRm9ybU9ic2VydmVyc0ZvckRvdWJsZVN1Ym1pdCgpIHsKICAkKCdmb3JtW21ldGhvZD1wb3N0XScpLmVhY2goZnVuY3Rpb24oKSB7CiAgICBpZiAoISQodGhpcykuaGFzQ2xhc3MoJ211bHRpcGxlLXN1Ym1pdCcpKSB7CiAgICAgICQodGhpcykuc3VibWl0KGZ1bmN0aW9uKGZvcm1fc3VibWlzc2lvbikgewogICAgICAgIGlmICgkKGZvcm1fc3VibWlzc2lvbi50YXJnZXQpLmF0dHIoJ2RhdGEtc3VibWl0dGVkJykpIHsKICAgICAgICAgIGZvcm1fc3VibWlzc2lvbi5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAkKGZvcm1fc3VibWlzc2lvbi50YXJnZXQpLmF0dHIoJ2RhdGEtc3VibWl0dGVkJywgdHJ1ZSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gZGVmYXVsdEZvY3VzKCl7CiAgaWYgKCgkKCcjY29udGVudCA6Zm9jdXMnKS5sZW5ndGggPT0gMCkgJiYgKHdpbmRvdy5sb2NhdGlvbi5oYXNoID09ICcnKSkgewogICAgJCgnI2NvbnRlbnQgaW5wdXRbdHlwZT10ZXh0XTp2aXNpYmxlLCAjY29udGVudCB0ZXh0YXJlYTp2aXNpYmxlJykuZmlyc3QoKS5mb2N1cygpOwogIH0KfQoKZnVuY3Rpb24gYmxvY2tFdmVudFByb3BhZ2F0aW9uKGV2ZW50KSB7CiAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKfQoKZnVuY3Rpb24gdG9nZ2xlRGlzYWJsZWRPbkNoYW5nZSgpIHsKICB2YXIgY2hlY2tlZCA9ICQodGhpcykuaXMoJzpjaGVja2VkJyk7CiAgJCgkKHRoaXMpLmRhdGEoJ2Rpc2FibGVzJykpLmF0dHIoJ2Rpc2FibGVkJywgY2hlY2tlZCk7CiAgJCgkKHRoaXMpLmRhdGEoJ2VuYWJsZXMnKSkuYXR0cignZGlzYWJsZWQnLCAhY2hlY2tlZCk7CiAgJCgkKHRoaXMpLmRhdGEoJ3Nob3dzJykpLnRvZ2dsZShjaGVja2VkKTsKfQpmdW5jdGlvbiB0b2dnbGVEaXNhYmxlZEluaXQoKSB7CiAgJCgnaW5wdXRbZGF0YS1kaXNhYmxlc10sIGlucHV0W2RhdGEtZW5hYmxlc10sIGlucHV0W2RhdGEtc2hvd3NdJykuZWFjaCh0b2dnbGVEaXNhYmxlZE9uQ2hhbmdlKTsKfQpmdW5jdGlvbiB0b2dnbGVNdWx0aVNlbGVjdEljb25Jbml0KCkgewogICQoJy50b2dnbGUtbXVsdGlzZWxlY3Q6bm90KC5pY29uLXRvZ2dsZS1taW51cyk6bm90KC5pY29uLXRvZ2dsZS1wbHVzKScpLmVhY2goZnVuY3Rpb24oKXsKICAgIGxldCBpY29uVHlwZTsKICAgIGlmICgkKHRoaXMpLnNpYmxpbmdzKCdzZWxlY3QnKS5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS5sZW5ndGggPiAxKSB7CiAgICAgIGljb25UeXBlID0gJ3RvZ2dsZS1taW51cyc7CiAgICB9IGVsc2UgewogICAgICBpY29uVHlwZSA9ICd0b2dnbGUtcGx1cyc7CiAgICB9CgogICAgJCh0aGlzKS5hZGRDbGFzcyhgaWNvbi0ke2ljb25UeXBlfWApOwogICAgdXBkYXRlU1ZHSWNvbigkKHRoaXMpLmZpbmQoJ3N2ZycpWzBdLCBpY29uVHlwZSk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHRvZ2dsZU5ld09iamVjdERyb3Bkb3duKCkgewogIHZhciBkcm9wZG93biA9ICQoJyNuZXctb2JqZWN0ICsgdWwubWVudS1jaGlsZHJlbicpOwogIGlmKGRyb3Bkb3duLmhhc0NsYXNzKCd2aXNpYmxlJykpewogICAgZHJvcGRvd24ucmVtb3ZlQ2xhc3MoJ3Zpc2libGUnKTsKICB9ZWxzZXsKICAgIGRyb3Bkb3duLmFkZENsYXNzKCd2aXNpYmxlJyk7CiAgfQp9CgooZnVuY3Rpb24gKCAkICkgewoKICAvLyBkZXRlY3QgaWYgbmF0aXZlIGRhdGUgaW5wdXQgaXMgc3VwcG9ydGVkCiAgdmFyIG5hdGl2ZURhdGVJbnB1dFN1cHBvcnRlZCA9IHRydWU7CgogIHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7CiAgaW5wdXQuc2V0QXR0cmlidXRlKCd0eXBlJywnZGF0ZScpOwogIGlmIChpbnB1dC50eXBlID09PSAndGV4dCcpIHsKICAgIG5hdGl2ZURhdGVJbnB1dFN1cHBvcnRlZCA9IGZhbHNlOwogIH0KCiAgdmFyIG5vdEFEYXRlVmFsdWUgPSAnbm90LWEtZGF0ZSc7CiAgaW5wdXQuc2V0QXR0cmlidXRlKCd2YWx1ZScsIG5vdEFEYXRlVmFsdWUpOwogIGlmIChpbnB1dC52YWx1ZSA9PT0gbm90QURhdGVWYWx1ZSkgewogICAgbmF0aXZlRGF0ZUlucHV0U3VwcG9ydGVkID0gZmFsc2U7CiAgfQoKICAkLmZuLmRhdGVwaWNrZXJGYWxsYmFjayA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewogICAgaWYgKG5hdGl2ZURhdGVJbnB1dFN1cHBvcnRlZCkgewogICAgICByZXR1cm4gdGhpczsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0aGlzLmRhdGVwaWNrZXIoIG9wdGlvbnMgKTsKICAgIH0KICB9Owp9KCBqUXVlcnkgKSk7CgokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICQoJyNjb250ZW50Jykub24oJ2NoYW5nZScsICdpbnB1dFtkYXRhLWRpc2FibGVzXSwgaW5wdXRbZGF0YS1lbmFibGVzXSwgaW5wdXRbZGF0YS1zaG93c10nLCB0b2dnbGVEaXNhYmxlZE9uQ2hhbmdlKTsKICB0b2dnbGVEaXNhYmxlZEluaXQoKTsKCiAgJCgnI2NvbnRlbnQnKS5vbignY2xpY2snLCAnLnRvZ2dsZS1tdWx0aXNlbGVjdCcsIGZ1bmN0aW9uKCkgewogICAgdG9nZ2xlTXVsdGlTZWxlY3QoJCh0aGlzKS5zaWJsaW5ncygnc2VsZWN0JykpOwogICAgJCh0aGlzKS50b2dnbGVDbGFzcygnaWNvbi10b2dnbGUtcGx1cyBpY29uLXRvZ2dsZS1taW51cycpOwogICAgdXBkYXRlU1ZHSWNvbigkKHRoaXMpLmZpbmQoJ3N2ZycpWzBdLCAkKHRoaXMpLmhhc0NsYXNzKCdpY29uLXRvZ2dsZS1wbHVzJykgPyAndG9nZ2xlLXBsdXMnIDogJ3RvZ2dsZS1taW51cycpOwogIH0pOwogIHRvZ2dsZU11bHRpU2VsZWN0SWNvbkluaXQoKTsKCiAgJCgnI2hpc3RvcnkgLnRhYnMnKS5vbignY2xpY2snLCAnYScsIGZ1bmN0aW9uKGUpewogICAgdmFyIHRhYiA9ICQoZS50YXJnZXQpLmF0dHIoJ2lkJykucmVwbGFjZSgndGFiLScsJycpOwogICAgZG9jdW1lbnQuY29va2llID0gJ2hpc3RvcnlfbGFzdF90YWI9JyArIHRhYiArICc7IFNhbWVTaXRlPUxheCcKICB9KTsKfSk7CgokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICQoJyNjb250ZW50Jykub24oJ2NsaWNrJywgJ2Rpdi5qc3RUYWJzIGEudGFiLXByZXZpZXcnLCBmdW5jdGlvbihldmVudCl7CiAgICB2YXIgdGFiID0gJChldmVudC50YXJnZXQpOwoKICAgIHZhciB1cmwgPSB0YWIuZGF0YSgndXJsJyk7CiAgICB2YXIgZm9ybSA9IHRhYi5wYXJlbnRzKCdmb3JtJyk7CiAgICB2YXIganN0QmxvY2sgPSB0YWIucGFyZW50cygnLmpzdEJsb2NrJyk7CgogICAgdmFyIGVsZW1lbnQgPSBlbmNvZGVVUklDb21wb25lbnQoanN0QmxvY2suZmluZCgnLndpa2ktZWRpdCcpLnZhbCgpKTsKICAgIHZhciBhdHRhY2htZW50cyA9IGZvcm0uZmluZCgnLmF0dGFjaG1lbnRzX2ZpZWxkcyBpbnB1dCcpLnNlcmlhbGl6ZSgpOwoKICAgICQuYWpheCh7CiAgICAgIHVybDogdXJsLAogICAgICB0eXBlOiAncG9zdCcsCiAgICAgIGRhdGE6ICJ0ZXh0PSIgKyBlbGVtZW50ICsgJyYnICsgYXR0YWNobWVudHMsCiAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpewogICAgICAgIGpzdEJsb2NrLmZpbmQoJy53aWtpLXByZXZpZXcnKS5odG1sKGRhdGEpOwogICAgICAgIHNldHVwV2lraVRhYmxlU29ydGFibGVIZWFkZXIoKTsKICAgICAgfQogICAgfSk7CiAgfSk7Cn0pOwoKZnVuY3Rpb24ga2VlcEFuY2hvck9uU2lnbkluKGZvcm0pewogIHZhciBoYXNoID0gZGVjb2RlVVJJQ29tcG9uZW50KHNlbGYuZG9jdW1lbnQubG9jYXRpb24uaGFzaCk7CiAgaWYgKGhhc2gpIHsKICAgIGlmIChoYXNoLmluZGV4T2YoIiMiKSA9PT0gLTEpIHsKICAgICAgaGFzaCA9ICIjIiArIGhhc2g7CiAgICB9CiAgICBmb3JtLmFjdGlvbiA9IGZvcm0uYWN0aW9uICsgaGFzaDsKICB9CiAgcmV0dXJuIHRydWU7Cn0KCiQoZnVuY3Rpb24gKCQpIHsKICAkKCcjYXV0aF9zb3VyY2VfbGRhcF9tb2RlJykuY2hhbmdlKGZ1bmN0aW9uICgpIHsKICAgICQoJy5sZGFwc193YXJuaW5nJykudG9nZ2xlKCQodGhpcykudmFsKCkgIT0gJ2xkYXBzX3ZlcmlmeV9wZWVyJyk7CiAgfSkuY2hhbmdlKCk7Cn0pOwoKZnVuY3Rpb24gc2V0RmlsZWNvbnRlbnRDb250YWluZXJIZWlnaHQoKSB7CiAgdmFyICRmaWxlY29udGFpbmVyID0gJCgnLmZpbGVjb250ZW50LWNvbnRhaW5lcicpOwogIHZhciBmaWxlVHlwZVNlbGVjdG9ycyA9IFsnLmltYWdlJywgJ3ZpZGVvJ107CgogIGlmKCRmaWxlY29udGFpbmVyLmxlbmd0aCA+IDAgJiYgJGZpbGVjb250YWluZXIuZmluZChmaWxlVHlwZVNlbGVjdG9ycy5qb2luKCcsJykpLmxlbmd0aCA9PT0gMSkgewogICAgdmFyIGNvbnRhaW5lck9mZnNldFRvcCA9ICRmaWxlY29udGFpbmVyLm9mZnNldCgpLnRvcDsKICAgIHZhciBjb250YWluZXJNYXJnaW5Cb3R0b20gPSBwYXJzZUludCgkZmlsZWNvbnRhaW5lci5jc3MoJ21hcmdpbkJvdHRvbScpKTsKICAgIHZhciBwYWdpbmF0aW9uSGVpZ2h0ID0gJGZpbGVjb250YWluZXIubmV4dCgnLnBhZ2luYXRpb24nKS5oZWlnaHQoKTsKICAgIHZhciBkaWZmID0gY29udGFpbmVyT2Zmc2V0VG9wICsgY29udGFpbmVyTWFyZ2luQm90dG9tICsgcGFnaW5hdGlvbkhlaWdodDsKCiAgICAkZmlsZWNvbnRhaW5lci5jc3MoJ2hlaWdodCcsICdjYWxjKDEwMHZoIC0gJyArIGRpZmYgKyAncHgpJykKICB9Cn0KCmZ1bmN0aW9uIHNldHVwQXR0YWNobWVudERldGFpbCgpIHsKICBzZXRGaWxlY29udGVudENvbnRhaW5lckhlaWdodCgpOwogICQod2luZG93KS5yZXNpemUoc2V0RmlsZWNvbnRlbnRDb250YWluZXJIZWlnaHQpOwp9CgpmdW5jdGlvbiBzZXR1cFdpa2lUYWJsZVNvcnRhYmxlSGVhZGVyKCkgewogICQoJ2Rpdi53aWtpIHRhYmxlJykuZWFjaChmdW5jdGlvbihpLCB0YWJsZSl7CiAgICBpZiAodGFibGUucm93cy5sZW5ndGggPCAzKSByZXR1cm4gdHJ1ZTsKICAgIHZhciB0ciA9ICQodGFibGUucm93cykuZmlyc3QoKTsKICAgIGlmICh0ci5maW5kKCJUSCIpLmxlbmd0aCA+IDApIHsKICAgICAgdHIuYXR0cignZGF0YS1zb3J0LW1ldGhvZCcsICdub25lJyk7CiAgICAgIHRyLmZpbmQoIlREIikuYXR0cignZGF0YS1zb3J0LW1ldGhvZCcsICdub25lJyk7CiAgICAgIG5ldyBUYWJsZXNvcnQodGFibGUpOwogICAgfQogIH0pOwp9CgokKGZ1bmN0aW9uICgpIHsKICAkKCJbdGl0bGVdOm5vdCgubm8tdG9vbHRpcCkiKS50b29sdGlwKHsKICAgIHNob3c6IHsKICAgICAgZGVsYXk6IDQwMAogICAgfSwKICAgIHBvc2l0aW9uOiB7CiAgICAgIG15OiAiY2VudGVyIGJvdHRvbS01IiwKICAgICAgYXQ6ICJjZW50ZXIgdG9wIgogICAgfQogIH0pOwp9KTsKCmZ1bmN0aW9uIGlubGluZUF1dG9Db21wbGV0ZShlbGVtZW50KSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gZG8gbm90IGF0dGFjaCBpZiBUcmlidXRlIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQKICAgIGlmIChlbGVtZW50LmRhdGFzZXQudHJpYnV0ZSA9PT0gJ3RydWUnKSB7cmV0dXJufTsKCiAgICBjb25zdCBnZXREYXRhU291cmNlID0gZnVuY3Rpb24oZW50aXR5KSB7CiAgICAgIGNvbnN0IGRhdGFTb3VyY2VzID0gcm0uQXV0b0NvbXBsZXRlLmRhdGFTb3VyY2VzOwoKICAgICAgaWYgKGRhdGFTb3VyY2VzW2VudGl0eV0pIHsKICAgICAgICByZXR1cm4gZGF0YVNvdXJjZXNbZW50aXR5XTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KCiAgICBjb25zdCByZW1vdGVTZWFyY2ggPSBmdW5jdGlvbih1cmwsIGNiKSB7CiAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkKICAgICAgewogICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkgewogICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7CiAgICAgICAgICAgIGNiKGRhdGEpOwogICAgICAgICAgfSBlbHNlIGlmICh4aHIuc3RhdHVzID09PSA0MDMpIHsKICAgICAgICAgICAgY2IoW10pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfTsKICAgICAgeGhyLm9wZW4oIkdFVCIsIHVybCwgdHJ1ZSk7CiAgICAgIHhoci5zZW5kKCk7CiAgICB9OwoKICAgIGNvbnN0IHRyaWJ1dGUgPSBuZXcgVHJpYnV0ZSh7CiAgICAgIGNvbGxlY3Rpb246IFsKICAgICAgICB7CiAgICAgICAgICB0cmlnZ2VyOiAnIycsCiAgICAgICAgICB2YWx1ZXM6IGZ1bmN0aW9uICh0ZXh0LCBjYikgewogICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0LnR5cGUgPT09ICd0ZXh0JyAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZSgnYXV0b2NvbXBsZXRlJykgIT0gJ29mZicpIHsKICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXV0b2NvbXBsZXRlJywgJ29mZicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFdoZW4gdHJpZ2dlcmVkIHdpdGggdGV4dCBzdGFydGluZyB3aXRoICIjIyIsIGxpa2UgIiMjYSIsIHRoZSBzZWFyY2ggdGVybSB3aWxsIGJlY29tZSAiI2EiLAogICAgICAgICAgICAvLyBjYXVzaW5nIHRoZSBTUUwgcXVlcnkgdG8gZmFpbCBpbiBmaW5kaW5nIGlzc3VlcyB3aXRoICJhIiBpbiB0aGUgc3ViamVjdC4KICAgICAgICAgICAgLy8gVG8gYXZvaWQgdGhpcywgcmVtb3ZlIHRoZSBmaXJzdCAiIyIgZnJvbSB0aGUgc2VhcmNoIHRlcm0uCiAgICAgICAgICAgIGlmICh0ZXh0KSB7CiAgICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXiMvLCAnJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVtb3RlU2VhcmNoKGdldERhdGFTb3VyY2UoJ2lzc3VlcycpICsgZW5jb2RlVVJJQ29tcG9uZW50KHRleHQpLCBmdW5jdGlvbiAoaXNzdWVzKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGNiKGlzc3Vlcyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIGxvb2t1cDogJ2xhYmVsJywKICAgICAgICAgIGZpbGxBdHRyOiAnbGFiZWwnLAogICAgICAgICAgcmVxdWlyZUxlYWRpbmdTcGFjZTogdHJ1ZSwKICAgICAgICAgIHNlbGVjdFRlbXBsYXRlOiBmdW5jdGlvbiAoaXNzdWUpIHsKICAgICAgICAgICAgbGV0IGxlYWRpbmdIYXNoID0gIiMiCiAgICAgICAgICAgIC8vIGtlZXAgIyMgc3ludGF4IHdoaWNoIGlzIGEgdmFsaWQgaXNzdWUgc3ludGF4IHRvIHNob3cgaXNzdWUgd2l0aCB0aXRsZS4KICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudE1lbnRpb25UZXh0U25hcHNob3QuY2hhckF0KDApID09PSAiIyIpIHsKICAgICAgICAgICAgICBsZWFkaW5nSGFzaCA9ICIjIyIKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbGVhZGluZ0hhc2ggKyBpc3N1ZS5vcmlnaW5hbC5pZDsKICAgICAgICAgIH0sCiAgICAgICAgICBtZW51SXRlbVRlbXBsYXRlOiBmdW5jdGlvbiAoaXNzdWUpIHsKICAgICAgICAgICAgcmV0dXJuIHNhbml0aXplSFRNTChpc3N1ZS5vcmlnaW5hbC5sYWJlbCk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICB0cmlnZ2VyOiAnW1snLAogICAgICAgICAgdmFsdWVzOiBmdW5jdGlvbiAodGV4dCwgY2IpIHsKICAgICAgICAgICAgcmVtb3RlU2VhcmNoKGdldERhdGFTb3VyY2UoJ3dpa2lfcGFnZXMnKSArIGVuY29kZVVSSUNvbXBvbmVudCh0ZXh0KSwgZnVuY3Rpb24gKHdpa2lQYWdlcykgewogICAgICAgICAgICAgIHJldHVybiBjYih3aWtpUGFnZXMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICBsb29rdXA6ICdsYWJlbCcsCiAgICAgICAgICBmaWxsQXR0cjogJ2xhYmVsJywKICAgICAgICAgIHJlcXVpcmVMZWFkaW5nU3BhY2U6IHRydWUsCiAgICAgICAgICBzZWxlY3RUZW1wbGF0ZTogZnVuY3Rpb24gKHdpa2lQYWdlKSB7CiAgICAgICAgICAgIHJldHVybiAnW1snICsgd2lraVBhZ2Uub3JpZ2luYWwudmFsdWUgKyAnXV0nOwogICAgICAgICAgfSwKICAgICAgICAgIG1lbnVJdGVtVGVtcGxhdGU6IGZ1bmN0aW9uICh3aWtpUGFnZSkgewogICAgICAgICAgICByZXR1cm4gc2FuaXRpemVIVE1MKHdpa2lQYWdlLm9yaWdpbmFsLmxhYmVsKTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIHRyaWdnZXI6ICdAJywKICAgICAgICAgIGxvb2t1cDogZnVuY3Rpb24gKHVzZXIsIG1lbnRpb25UZXh0KSB7CiAgICAgICAgICAgIHJldHVybiB1c2VyLm5hbWUgKyB1c2VyLmZpcnN0bmFtZSArIHVzZXIubGFzdG5hbWUgKyB1c2VyLmxvZ2luOwogICAgICAgICAgfSwKICAgICAgICAgIHZhbHVlczogZnVuY3Rpb24gKHRleHQsIGNiKSB7CiAgICAgICAgICAgIGNvbnN0IHVybCA9IGdldERhdGFTb3VyY2UoJ3VzZXJzJyk7CiAgICAgICAgICAgIGlmICh1cmwpIHsKICAgICAgICAgICAgICByZW1vdGVTZWFyY2godXJsICsgZW5jb2RlVVJJQ29tcG9uZW50KHRleHQpLCBmdW5jdGlvbiAodXNlcnMpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjYih1c2Vycyk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICBtZW51SXRlbVRlbXBsYXRlOiBmdW5jdGlvbiAodXNlcikgewogICAgICAgICAgICByZXR1cm4gdXNlci5vcmlnaW5hbC5uYW1lOwogICAgICAgICAgfSwKICAgICAgICAgIHNlbGVjdFRlbXBsYXRlOiBmdW5jdGlvbiAodXNlcikgewogICAgICAgICAgICByZXR1cm4gJ0AnICsgdXNlci5vcmlnaW5hbC5sb2dpbjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIF0sCiAgICAgIG5vTWF0Y2hUZW1wbGF0ZTogIiIKICAgIH0pOwoKICAgIHRyaWJ1dGUuYXR0YWNoKGVsZW1lbnQpOwp9CgovLyBjb2xsYXBzaWJsZSBzaWRlYmFyIGpRdWVyeSBwbHVnaW4KKGZ1bmN0aW9uKCQpIHsKICAvLyBtYWluIGNvbnRhaW5lciB0aGlzIGlzIGFwcGxpZWQgdG8KICB2YXIgbWFpbjsKICAvLyB0cmlnZ2VycyBzaG93L2hpZGUKICB2YXIgYnV0dG9uOwogIC8vIHRoZSBrZXkgdG8gdXNlIGluIGxvY2FsIHN0b3JhZ2UKICAvLyB0aGlzIHdpbGwgbGF0ZXIgYmUgZXhwYW5kZWQgdXNpbmcgdGhlIGN1cnJlbnQgY29udHJvbGxlciBhbmQgYWN0aW9uIHRvCiAgLy8gYWxsb3cgZm9yIGRpZmZlcmVudCBzaWRlYmFyIHN0YXRlcyBmb3IgZGlmZmVyZW50IHBhZ2VzCiAgdmFyIGxvY2FsU3RvcmFnZUtleSA9ICdyZWRtaW5lLXNpZGViYXItc3RhdGUnOwogIC8vIHRydWUgaWYgbG9jYWwgc3RvcmFnZSBpcyBhdmFpbGFibGUKICB2YXIgY2FuVXNlTG9jYWxTdG9yYWdlID0gZnVuY3Rpb24oKXsKICAgIHRyeSB7CiAgICAgIGlmKCdsb2NhbFN0b3JhZ2UnIGluIHdpbmRvdyl7CiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3JlZG1pbmUudGVzdC5zdG9yYWdlJywgJ29rJyk7CiAgICAgICAgdmFyIGl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncmVkbWluZS50ZXN0LnN0b3JhZ2UnKTsKICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgncmVkbWluZS50ZXN0LnN0b3JhZ2UnKTsKICAgICAgICBpZihpdGVtID09PSAnb2snKSByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfSBjYXRjaCAoZXJyKSB7fQogICAgcmV0dXJuIGZhbHNlOwogIH0oKTsKICAvLyBmdW5jdGlvbiB0byBzZXQgY3VycmVudCBzaWRlYmFyIHN0YXRlCiAgdmFyIHNldFN0YXRlID0gZnVuY3Rpb24oc3RhdGUpewogICAgaWYoY2FuVXNlTG9jYWxTdG9yYWdlKXsKICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obG9jYWxTdG9yYWdlS2V5LCBzdGF0ZSk7CiAgICB9CiAgfTsKICB2YXIgYXBwbHlTdGF0ZSA9IGZ1bmN0aW9uKCl7CiAgICBpZihtYWluLmhhc0NsYXNzKCdjb2xsYXBzZWRzaWRlYmFyJykpewogICAgICB1cGRhdGVTVkdJY29uKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaWRlYmFyLXN3aXRjaC1idXR0b24nKSwgJ2NoZXZyb25zLWxlZnQnKQogICAgICBzZXRTdGF0ZSgnaGlkZGVuJyk7CiAgICB9IGVsc2UgewogICAgICB1cGRhdGVTVkdJY29uKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaWRlYmFyLXN3aXRjaC1idXR0b24nKSwgJ2NoZXZyb25zLXJpZ2h0JykKICAgICAgc2V0U3RhdGUoJ3Zpc2libGUnKTsKICAgIH0KICB9OwogIHZhciBzZXR1cFRvZ2dsZUJ1dHRvbiA9IGZ1bmN0aW9uKCl7CiAgICBidXR0b24gPSAkKCcjc2lkZWJhci1zd2l0Y2gtYnV0dG9uJyk7CiAgICBidXR0b24uY2xpY2soZnVuY3Rpb24oZSl7CiAgICAgIG1haW4uYWRkQ2xhc3MoImFuaW1hdGUiKTsKICAgICAgbWFpbi50b2dnbGVDbGFzcygnY29sbGFwc2Vkc2lkZWJhcicpOwogICAgICBhcHBseVN0YXRlKCk7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7CiAgICBhcHBseVN0YXRlKCk7CiAgfTsKICAkLmZuLmNvbGxhcHNpYmxlU2lkZWJhciA9IGZ1bmN0aW9uKCkgewogICAgbWFpbiA9IHRoaXM7CiAgICAvLyBkZXRlcm1pbmUgcHJldmlvdXNseSBzdG9yZWQgc2lkZWJhciBzdGF0ZSBmb3IgdGhpcyBwYWdlCiAgICBpZihjYW5Vc2VMb2NhbFN0b3JhZ2UpIHsKICAgICAgLy8gZGV0ZXJtaW5lIGN1cnJlbnQgY29udHJvbGxlci9hY3Rpb24gcGFpciBhbmQgdXNlIHRoZW0gYXMgc3RvcmFnZSBrZXkKICAgICAgdmFyIGJvZHlDbGFzcyA9ICQoJ2JvZHknKS5hdHRyKCdjbGFzcycpOwogICAgICBpZihib2R5Q2xhc3MpewogICAgICAgIHRyeSB7CiAgICAgICAgICBsb2NhbFN0b3JhZ2VLZXkgKz0gJy0nICsgYm9keUNsYXNzLnNwbGl0KC9ccysvKS5maWx0ZXIoZnVuY3Rpb24ocyl7CiAgICAgICAgICAgIHJldHVybiBzLm1hdGNoKC8oYWN0aW9ufGNvbnRyb2xsZXIpLS4qLyk7CiAgICAgICAgICB9KS5zb3J0KCkuam9pbignLScpOwogICAgICAgIH0gY2F0Y2goZSkgewogICAgICAgICAgLy8gaW4gY2FzZSBvZiBlcnJvciAocHJvYmFibHkgSUU4KSwgY29udGludWUgd2l0aCB0aGUgdW5tb2RpZmllZCBrZXkKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyIHN0b3JlZFN0YXRlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0obG9jYWxTdG9yYWdlS2V5KTsKICAgICAgbWFpbi50b2dnbGVDbGFzcygnY29sbGFwc2Vkc2lkZWJhcicsIHN0b3JlZFN0YXRlID09PSAnaGlkZGVuJyk7CiAgICB9CiAgICAvLyBkcmF3IHRoZSB0b2dnbGUgYnV0dG9uIG9uY2UgdGhlIERPTSBpcyBjb21wbGV0ZQogICAgJChkb2N1bWVudCkucmVhZHkoc2V0dXBUb2dnbGVCdXR0b24pOwogIH07Cn0oalF1ZXJ5KSk7CgokKGRvY3VtZW50KS5yZWFkeShzZXR1cEFqYXhJbmRpY2F0b3IpOwokKGRvY3VtZW50KS5yZWFkeShoaWRlT25Mb2FkKTsKJChkb2N1bWVudCkucmVhZHkoYWRkRm9ybU9ic2VydmVyc0ZvckRvdWJsZVN1Ym1pdCk7CiQoZG9jdW1lbnQpLnJlYWR5KGRlZmF1bHRGb2N1cyk7CiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwQXR0YWNobWVudERldGFpbCk7CiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwVGFicyk7CiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwRmlsZVByZXZpZXdOYXZpZ2F0aW9uKTsKJChkb2N1bWVudCkucmVhZHkoc2V0dXBXaWtpVGFibGVTb3J0YWJsZUhlYWRlcik7CiQoZG9jdW1lbnQpLm9uKCdmb2N1cycsICdbZGF0YS1hdXRvLWNvbXBsZXRlPXRydWVdJywgZnVuY3Rpb24oZXZlbnQpIHsKICBpbmxpbmVBdXRvQ29tcGxldGUoZXZlbnQudGFyZ2V0KTsKfSk7Cg==" | |
| }, | |
| "attachments.js": { | |
| "hash": "fe6f73f3351f734902238369b56ee6cd", | |
| "path": "/usr/src/redmine/public/assets/attachments-db17b2b6.js", | |
| "base64": "LyoqCiAqIFJlZG1pbmUgLSBwcm9qZWN0IG1hbmFnZW1lbnQgc29mdHdhcmUKICogQ29weXJpZ2h0IChDKSAyMDA2LSAgSmVhbi1QaGlsaXBwZSBMYW5nCiAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCiAqLwoKZnVuY3Rpb24gYWRkRmlsZShpbnB1dEVsLCBmaWxlLCBlYWdlclVwbG9hZCkgewogIHZhciBhdHRhY2htZW50c0Zvcm0gPSAkKGlucHV0RWwpLmNsb3Nlc3QoJy5hdHRhY2htZW50c19mb3JtJykKICB2YXIgYXR0YWNobWVudHNGaWVsZHMgPSBhdHRhY2htZW50c0Zvcm0uZmluZCgnLmF0dGFjaG1lbnRzX2ZpZWxkcycpOwogIHZhciBhdHRhY2htZW50c0ljb25zID0gYXR0YWNobWVudHNGb3JtLmZpbmQoJy5hdHRhY2htZW50c19pY29ucycpOwogIHZhciBhZGRBdHRhY2htZW50ID0gYXR0YWNobWVudHNGb3JtLmZpbmQoJy5hZGRfYXR0YWNobWVudCcpOwogIHZhciBtYXhGaWxlcyA9ICgkKGlucHV0RWwpLmF0dHIoJ211bHRpcGxlJykgPT0gJ211bHRpcGxlJyA/IDEwIDogMSk7CiAgdmFyIGRlbEljb24gPSBhdHRhY2htZW50c0ljb25zLmZpbmQoJ3N2Zy5zdmctZGVsJykuY2xvbmUoKTsKICB2YXIgYXR0YWNobWVudEljb24gPSBhdHRhY2htZW50c0ljb25zLmZpbmQoJ3N2Zy5zdmctYXR0YWNobWVudCcpLmNsb25lKCk7CgogIGlmIChhdHRhY2htZW50c0ZpZWxkcy5jaGlsZHJlbigpLmxlbmd0aCA8IG1heEZpbGVzKSB7CiAgICB2YXIgYXR0YWNobWVudElkID0gYWRkRmlsZS5uZXh0QXR0YWNobWVudElkKys7CiAgICB2YXIgZmlsZVNwYW4gPSAkKCc8c3Bhbj4nLCB7IGlkOiAnYXR0YWNobWVudHNfJyArIGF0dGFjaG1lbnRJZCB9KTsKICAgIHZhciBwYXJhbSA9ICQoaW5wdXRFbCkuZGF0YSgncGFyYW0nKTsKICAgIGlmICghcGFyYW0pIHtwYXJhbSA9ICdhdHRhY2htZW50cyd9OwoKICAgIGZpbGVTcGFuLmFwcGVuZCgKICAgICAgICBhdHRhY2htZW50SWNvbiwKICAgICAgICAkKCc8aW5wdXQ+JywgeyB0eXBlOiAndGV4dCcsICdjbGFzcyc6ICdpY29uIGljb24tYXR0YWNobWVudCBmaWxlbmFtZSByZWFkb25seScsIG5hbWU6IHBhcmFtICsnWycgKyBhdHRhY2htZW50SWQgKyAnXVtmaWxlbmFtZV0nLCByZWFkb25seTogJ3JlYWRvbmx5J30gKS52YWwoZmlsZS5uYW1lKSwKICAgICAgICAkKCc8aW5wdXQ+JywgeyB0eXBlOiAndGV4dCcsICdjbGFzcyc6ICdkZXNjcmlwdGlvbicsIG5hbWU6IHBhcmFtICsgJ1snICsgYXR0YWNobWVudElkICsgJ11bZGVzY3JpcHRpb25dJywgbWF4bGVuZ3RoOiAyNTUsIHBsYWNlaG9sZGVyOiAkKGlucHV0RWwpLmRhdGEoJ2Rlc2NyaXB0aW9uLXBsYWNlaG9sZGVyJykgfSApLnRvZ2dsZSghZWFnZXJVcGxvYWQpLAogICAgICAgICQoJzxpbnB1dD4nLCB7IHR5cGU6ICdoaWRkZW4nLCAnY2xhc3MnOiAndG9rZW4nLCBuYW1lOiBwYXJhbSArICdbJyArIGF0dGFjaG1lbnRJZCArICddW3Rva2VuXSd9ICksCiAgICAgICAgJCgnPGE+JywgeyBocmVmOiAiIyIsICdjbGFzcyc6ICdpY29uLW9ubHkgaWNvbi1kZWwgcmVtb3ZlLXVwbG9hZCcgfSkuYXBwZW5kKGRlbEljb24pLmNsaWNrKHJlbW92ZUZpbGUpLnRvZ2dsZSghZWFnZXJVcGxvYWQpCiAgICApLmFwcGVuZFRvKGF0dGFjaG1lbnRzRmllbGRzKTsKCgogICAgaWYgKCQoaW5wdXRFbCkuZGF0YSgnZGVzY3JpcHRpb24nKSA9PSAwKSB7CiAgICAgIGZpbGVTcGFuLmZpbmQoJ2lucHV0LmRlc2NyaXB0aW9uJykucmVtb3ZlKCk7CiAgICB9CgogICAgaWYoZWFnZXJVcGxvYWQpIHsKICAgICAgYWpheFVwbG9hZChmaWxlLCBhdHRhY2htZW50SWQsIGZpbGVTcGFuLCBpbnB1dEVsKTsKICAgIH0KCiAgICBhZGRBdHRhY2htZW50LnRvZ2dsZShhdHRhY2htZW50c0ZpZWxkcy5jaGlsZHJlbigpLmxlbmd0aCA8IG1heEZpbGVzKTsKICAgIHJldHVybiBhdHRhY2htZW50SWQ7CiAgfQogIHJldHVybiBudWxsOwp9CgphZGRGaWxlLm5leHRBdHRhY2htZW50SWQgPSAxOwoKZnVuY3Rpb24gYWpheFVwbG9hZChmaWxlLCBhdHRhY2htZW50SWQsIGZpbGVTcGFuLCBpbnB1dEVsKSB7CgogIGZ1bmN0aW9uIG9uTG9hZHN0YXJ0KGUpIHsKICAgIGZpbGVTcGFuLnJlbW92ZUNsYXNzKCdhamF4LXdhaXRpbmcnKTsKICAgIGZpbGVTcGFuLmFkZENsYXNzKCdhamF4LWxvYWRpbmcnKTsKICAgICQoJ2lucHV0OnN1Ym1pdCcsICQodGhpcykucGFyZW50cygnZm9ybScpKS5hdHRyKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpOwogIH0KCiAgZnVuY3Rpb24gb25Qcm9ncmVzcyhlKSB7CiAgICBpZihlLmxlbmd0aENvbXB1dGFibGUpIHsKICAgICAgdGhpcy5wcm9ncmVzc2JhciggJ3ZhbHVlJywgZS5sb2FkZWQgKiAxMDAgLyBlLnRvdGFsICk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhY3R1YWxVcGxvYWQoZmlsZSwgYXR0YWNobWVudElkLCBmaWxlU3BhbiwgaW5wdXRFbCkgewoKICAgIGFqYXhVcGxvYWQudXBsb2FkaW5nKys7CgogICAgdXBsb2FkQmxvYihmaWxlLCAkKGlucHV0RWwpLmRhdGEoJ3VwbG9hZC1wYXRoJyksIGF0dGFjaG1lbnRJZCwgewogICAgICAgIGxvYWRzdGFydEV2ZW50SGFuZGxlcjogb25Mb2Fkc3RhcnQuYmluZChwcm9ncmVzc1NwYW4pLAogICAgICAgIHByb2dyZXNzRXZlbnRIYW5kbGVyOiBvblByb2dyZXNzLmJpbmQocHJvZ3Jlc3NTcGFuKQogICAgICB9KQogICAgICAuZG9uZShmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICBhZGRJbmxpbmVBdHRhY2htZW50TWFya3VwKGZpbGUpOwogICAgICAgIHByb2dyZXNzU3Bhbi5wcm9ncmVzc2JhciggJ3ZhbHVlJywgMTAwICkucmVtb3ZlKCk7CiAgICAgICAgZmlsZVNwYW4uZmluZCgnaW5wdXQuZGVzY3JpcHRpb24sIGEnKS5jc3MoJ2Rpc3BsYXknLCAnaW5saW5lLWZsZXgnKTsKICAgICAgfSkKICAgICAgLmZhaWwoZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgcHJvZ3Jlc3NTcGFuLnRleHQocmVzdWx0LnN0YXR1c1RleHQpOwogICAgICB9KS5hbHdheXMoZnVuY3Rpb24oKSB7CiAgICAgICAgYWpheFVwbG9hZC51cGxvYWRpbmctLTsKICAgICAgICBmaWxlU3Bhbi5yZW1vdmVDbGFzcygnYWpheC1sb2FkaW5nJyk7CiAgICAgICAgdmFyIGZvcm0gPSBmaWxlU3Bhbi5wYXJlbnRzKCdmb3JtJyk7CiAgICAgICAgaWYgKGZvcm0ucXVldWUoJ3VwbG9hZCcpLmxlbmd0aCA9PSAwICYmIGFqYXhVcGxvYWQudXBsb2FkaW5nID09IDApIHsKICAgICAgICAgICQoJ2lucHV0OnN1Ym1pdCcsIGZvcm0pLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7CiAgICAgICAgfQogICAgICAgIGZvcm0uZGVxdWV1ZSgndXBsb2FkJyk7CiAgICAgIH0pOwogIH0KCiAgdmFyIHByb2dyZXNzU3BhbiA9ICQoJzxkaXY+JykuaW5zZXJ0QWZ0ZXIoZmlsZVNwYW4uZmluZCgnaW5wdXQuZmlsZW5hbWUnKSk7CiAgcHJvZ3Jlc3NTcGFuLnByb2dyZXNzYmFyKCk7CiAgZmlsZVNwYW4uYWRkQ2xhc3MoJ2FqYXgtd2FpdGluZycpOwoKICB2YXIgbWF4U3luY1VwbG9hZCA9ICQoaW5wdXRFbCkuZGF0YSgnbWF4LWNvbmN1cnJlbnQtdXBsb2FkcycpOwoKICBpZihtYXhTeW5jVXBsb2FkID09IG51bGwgfHwgbWF4U3luY1VwbG9hZCA8PSAwIHx8IGFqYXhVcGxvYWQudXBsb2FkaW5nIDwgbWF4U3luY1VwbG9hZCkKICAgIGFjdHVhbFVwbG9hZChmaWxlLCBhdHRhY2htZW50SWQsIGZpbGVTcGFuLCBpbnB1dEVsKTsKICBlbHNlCiAgICAkKGlucHV0RWwpLnBhcmVudHMoJ2Zvcm0nKS5xdWV1ZSgndXBsb2FkJywgYWN0dWFsVXBsb2FkLmJpbmQodGhpcywgZmlsZSwgYXR0YWNobWVudElkLCBmaWxlU3BhbiwgaW5wdXRFbCkpOwp9CgphamF4VXBsb2FkLnVwbG9hZGluZyA9IDA7CgpmdW5jdGlvbiByZW1vdmVGaWxlKCkgewogICQodGhpcykuY2xvc2VzdCgnLmF0dGFjaG1lbnRzX2Zvcm0nKS5maW5kKCcuYWRkX2F0dGFjaG1lbnQnKS5zaG93KCk7CiAgJCh0aGlzKS5wYXJlbnQoJ3NwYW4nKS5yZW1vdmUoKTsKICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIHVwbG9hZEJsb2IoYmxvYiwgdXBsb2FkVXJsLCBhdHRhY2htZW50SWQsIG9wdGlvbnMpIHsKCiAgdmFyIGFjdHVhbE9wdGlvbnMgPSAkLmV4dGVuZCh7CiAgICBsb2Fkc3RhcnRFdmVudEhhbmRsZXI6ICQubm9vcCwKICAgIHByb2dyZXNzRXZlbnRIYW5kbGVyOiAkLm5vb3AKICB9LCBvcHRpb25zKTsKCiAgdXBsb2FkVXJsID0gdXBsb2FkVXJsICsgJz9hdHRhY2htZW50X2lkPScgKyBhdHRhY2htZW50SWQ7CiAgaWYgKGJsb2IgaW5zdGFuY2VvZiB3aW5kb3cuQmxvYikgewogICAgdXBsb2FkVXJsICs9ICcmZmlsZW5hbWU9JyArIGVuY29kZVVSSUNvbXBvbmVudChibG9iLm5hbWUpOwogICAgdXBsb2FkVXJsICs9ICcmY29udGVudF90eXBlPScgKyBlbmNvZGVVUklDb21wb25lbnQoYmxvYi50eXBlKTsKICB9CgogIHJldHVybiAkLmFqYXgodXBsb2FkVXJsLCB7CiAgICB0eXBlOiAnUE9TVCcsCiAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsCiAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbihqcVhociwgc2V0dGluZ3MpIHsKICAgICAganFYaHIuc2V0UmVxdWVzdEhlYWRlcignQWNjZXB0JywgJ2FwcGxpY2F0aW9uL2pzJyk7CiAgICAgIC8vIGF0dGFjaCBwcm9wZXIgRmlsZSBvYmplY3QKICAgICAgc2V0dGluZ3MuZGF0YSA9IGJsb2I7CiAgICB9LAogICAgeGhyOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIHhociA9ICQuYWpheFNldHRpbmdzLnhocigpOwogICAgICB4aHIudXBsb2FkLm9ubG9hZHN0YXJ0ID0gYWN0dWFsT3B0aW9ucy5sb2Fkc3RhcnRFdmVudEhhbmRsZXI7CiAgICAgIHhoci51cGxvYWQub25wcm9ncmVzcyA9IGFjdHVhbE9wdGlvbnMucHJvZ3Jlc3NFdmVudEhhbmRsZXI7CiAgICAgIHJldHVybiB4aHI7CiAgICB9LAogICAgZGF0YTogYmxvYiwKICAgIGNhY2hlOiBmYWxzZSwKICAgIHByb2Nlc3NEYXRhOiBmYWxzZQogIH0pOwp9CgpmdW5jdGlvbiBhZGRJbnB1dEZpbGVzKGlucHV0RWwpIHsKICB2YXIgYXR0YWNobWVudHNGaWVsZHMgPSAkKGlucHV0RWwpLmNsb3Nlc3QoJy5hdHRhY2htZW50c19mb3JtJykuZmluZCgnLmF0dGFjaG1lbnRzX2ZpZWxkcycpOwogIHZhciBhZGRBdHRhY2htZW50ID0gJChpbnB1dEVsKS5jbG9zZXN0KCcuYXR0YWNobWVudHNfZm9ybScpLmZpbmQoJy5hZGRfYXR0YWNobWVudCcpOwogIHZhciBjbGVhcmVkRmlsZUlucHV0ID0gJChpbnB1dEVsKS5jbG9uZSgpLnZhbCgnJyk7CiAgdmFyIHNpemVFeGNlZWRlZCA9IGZhbHNlOwogIHZhciBwYXJhbSA9ICQoaW5wdXRFbCkuZGF0YSgncGFyYW0nKTsKICBpZiAoIXBhcmFtKSB7cGFyYW0gPSAnYXR0YWNobWVudHMnfTsKCiAgaWYgKCQuYWpheFNldHRpbmdzLnhocigpLnVwbG9hZCAmJiBpbnB1dEVsLmZpbGVzKSB7CiAgICAvLyB1cGxvYWQgZmlsZXMgdXNpbmcgYWpheAogICAgc2l6ZUV4Y2VlZGVkID0gdXBsb2FkQW5kQXR0YWNoRmlsZXMoaW5wdXRFbC5maWxlcywgaW5wdXRFbCk7CiAgICAkKGlucHV0RWwpLnJlbW92ZSgpOwogIH0gZWxzZSB7CiAgICAvLyBicm93c2VyIG5vdCBzdXBwb3J0aW5nIHRoZSBmaWxlIEFQSSwgdXBsb2FkIG9uIGZvcm0gc3VibWlzc2lvbgogICAgdmFyIGF0dGFjaG1lbnRJZDsKICAgIHZhciBhRmlsZW5hbWUgPSBpbnB1dEVsLnZhbHVlLnNwbGl0KC9cL3xcXC8pOwogICAgYXR0YWNobWVudElkID0gYWRkRmlsZShpbnB1dEVsLCB7IG5hbWU6IGFGaWxlbmFtZVsgYUZpbGVuYW1lLmxlbmd0aCAtIDEgXSB9LCBmYWxzZSk7CiAgICBpZiAoYXR0YWNobWVudElkKSB7CiAgICAgICQoaW5wdXRFbCkuYXR0cih7IG5hbWU6IHBhcmFtICsgJ1snICsgYXR0YWNobWVudElkICsgJ11bZmlsZV0nLCBzdHlsZTogJ2Rpc3BsYXk6bm9uZTsnIH0pLmFwcGVuZFRvKCcjYXR0YWNobWVudHNfJyArIGF0dGFjaG1lbnRJZCk7CiAgICB9CiAgfQoKICBjbGVhcmVkRmlsZUlucHV0LnByZXBlbmRUbyhhZGRBdHRhY2htZW50KTsKfQoKZnVuY3Rpb24gdXBsb2FkQW5kQXR0YWNoRmlsZXMoZmlsZXMsIGlucHV0RWwpIHsKCiAgdmFyIG1heEZpbGVTaXplID0gJChpbnB1dEVsKS5kYXRhKCdtYXgtZmlsZS1zaXplJyk7CiAgdmFyIG1heEZpbGVTaXplRXhjZWVkZWQgPSAkKGlucHV0RWwpLmRhdGEoJ21heC1maWxlLXNpemUtbWVzc2FnZScpOwoKICB2YXIgc2l6ZUV4Y2VlZGVkID0gZmFsc2U7CiAgdmFyIGZpbGVzTGVuZ3RoID0gJChpbnB1dEVsKS5jbG9zZXN0KCcuYXR0YWNobWVudHNfZm9ybScpLmZpbmQoJy5hdHRhY2htZW50c19maWVsZHMnKS5jaGlsZHJlbigpLmxlbmd0aCArIGZpbGVzLmxlbmd0aAogICQuZWFjaChmaWxlcywgZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5zaXplICYmIG1heEZpbGVTaXplICE9IG51bGwgJiYgdGhpcy5zaXplID4gcGFyc2VJbnQobWF4RmlsZVNpemUpKSB7c2l6ZUV4Y2VlZGVkPXRydWU7fQogIH0pOwogIGlmIChzaXplRXhjZWVkZWQpIHsKICAgIHdpbmRvdy5hbGVydChtYXhGaWxlU2l6ZUV4Y2VlZGVkKTsKICB9IGVsc2UgewogICAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbigpIHthZGRGaWxlKGlucHV0RWwsIHRoaXMsIHRydWUpO30pOwogIH0KCiAgaWYgKGZpbGVzTGVuZ3RoID4gKCQoaW5wdXRFbCkuYXR0cignbXVsdGlwbGUnKSA9PSAnbXVsdGlwbGUnID8gMTAgOiAxKSkgewogICAgd2luZG93LmFsZXJ0KCQoaW5wdXRFbCkuZGF0YSgnbWF4LW51bWJlci1vZi1maWxlcy1tZXNzYWdlJykpOwogIH0KICByZXR1cm4gc2l6ZUV4Y2VlZGVkOwp9CgpmdW5jdGlvbiBoYW5kbGVGaWxlRHJvcEV2ZW50KGUpIHsKCiAgJCh0aGlzKS5yZW1vdmVDbGFzcygnZmlsZW92ZXInKTsKICBibG9ja0V2ZW50UHJvcGFnYXRpb24oZSk7CgogIGlmICgkLmluQXJyYXkoJ0ZpbGVzJywgZS5kYXRhVHJhbnNmZXIudHlwZXMpID4gLTEpIHsKICAgIGhhbmRsZUZpbGVEcm9wRXZlbnQudGFyZ2V0ID0gZS50YXJnZXQ7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnY3VzdG9tLWZpZWxkLWZpbGVkcm9wbGlzdG5lcicpKXsKICAgICAgdXBsb2FkQW5kQXR0YWNoRmlsZXMoZS5kYXRhVHJhbnNmZXIuZmlsZXMsICQodGhpcykuZmluZCgnaW5wdXQ6ZmlsZS5jdXN0b20tZmllbGQtZmlsZWRyb3AnKS5maXJzdCgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHVwbG9hZEFuZEF0dGFjaEZpbGVzKGUuZGF0YVRyYW5zZmVyLmZpbGVzLCAkKHRoaXMpLmZpbmQoJ2lucHV0OmZpbGUuZmlsZWRyb3AnKS5maXJzdCgpKTsKICAgIH0KICB9Cn0KaGFuZGxlRmlsZURyb3BFdmVudC50YXJnZXQgPSAnJzsKCmZ1bmN0aW9uIGRyYWdPdmVySGFuZGxlcihlKSB7CiAgJCh0aGlzKS5hZGRDbGFzcygnZmlsZW92ZXInKTsKICBibG9ja0V2ZW50UHJvcGFnYXRpb24oZSk7CiAgZS5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdjb3B5JzsKfQoKZnVuY3Rpb24gZHJhZ091dEhhbmRsZXIoZSkgewogICQodGhpcykucmVtb3ZlQ2xhc3MoJ2ZpbGVvdmVyJyk7CiAgYmxvY2tFdmVudFByb3BhZ2F0aW9uKGUpOwp9CgpmdW5jdGlvbiBzZXR1cEZpbGVEcm9wKCkgewogIGlmICh3aW5kb3cuRmlsZSAmJiB3aW5kb3cuRmlsZUxpc3QgJiYgd2luZG93LlByb2dyZXNzRXZlbnQgJiYgd2luZG93LkZvcm1EYXRhKSB7CgogICAgJC5ldmVudC5hZGRQcm9wKCdkYXRhVHJhbnNmZXInKTsKCiAgICAkKCdmb3JtIGRpdi5ib3g6bm90KC5maWxlZHJvcGxpc3RuZXIpJykuaGFzKCdpbnB1dDpmaWxlLmZpbGVkcm9wJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgJCh0aGlzKS5vbih7CiAgICAgICAgICBkcmFnb3ZlcjogZHJhZ092ZXJIYW5kbGVyLAogICAgICAgICAgZHJhZ2xlYXZlOiBkcmFnT3V0SGFuZGxlciwKICAgICAgICAgIGRyb3A6IGhhbmRsZUZpbGVEcm9wRXZlbnQsCiAgICAgICAgICBwYXN0ZTogY29weUltYWdlRnJvbUNsaXBib2FyZAogICAgICB9KS5hZGRDbGFzcygnZmlsZWRyb3BsaXN0bmVyJyk7CiAgICB9KTsKCiAgICAkKCdmb3JtIGRpdi5ib3ggaW5wdXQ6ZmlsZS5jdXN0b20tZmllbGQtZmlsZWRyb3AnKS5jbG9zZXN0KCdwJykubm90KCcuY3VzdG9tLWZpZWxkLWZpbGVkcm9wbGlzdG5lcicpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICQodGhpcykub24oewogICAgICAgICAgZHJhZ292ZXI6IGRyYWdPdmVySGFuZGxlciwKICAgICAgICAgIGRyYWdsZWF2ZTogZHJhZ091dEhhbmRsZXIsCiAgICAgICAgICBkcm9wOiBoYW5kbGVGaWxlRHJvcEV2ZW50CiAgICAgIH0pLmFkZENsYXNzKCdjdXN0b20tZmllbGQtZmlsZWRyb3BsaXN0bmVyJyk7CiAgICB9KTsKICB9Cn0KCmZ1bmN0aW9uIGFkZElubGluZUF0dGFjaG1lbnRNYXJrdXAoZmlsZSkgewogIC8vIGluc2VydCB1cGxvYWRlZCBpbWFnZSBpbmxpbmUgaWYgZHJvcHBlZCBhcmVhIGlzIGN1cnJlbnRseSBmb2N1c2VkIHRleHRhcmVhCiAgaWYoJChoYW5kbGVGaWxlRHJvcEV2ZW50LnRhcmdldCkuaGFzQ2xhc3MoJ3dpa2ktZWRpdCcpICYmICQuaW5BcnJheShmaWxlLnR5cGUsIHdpbmRvdy53aWtpSW1hZ2VNaW1lVHlwZXMpID4gLTEpIHsKICAgIHZhciAkdGV4dGFyZWEgPSAkKGhhbmRsZUZpbGVEcm9wRXZlbnQudGFyZ2V0KTsKICAgIHZhciBjdXJzb3JQb3NpdGlvbiA9ICR0ZXh0YXJlYS5wcm9wKCdzZWxlY3Rpb25TdGFydCcpOwogICAgdmFyIGRlc2NyaXB0aW9uID0gJHRleHRhcmVhLnZhbCgpOwogICAgdmFyIHNhbml0aXplZEZpbGVuYW1lID0gZmlsZS5uYW1lLnJlcGxhY2UoL1tcL1w/XCVcKlw6XHxcIlwnPD5cblxyXSsvLCAnXycpOwogICAgdmFyIGlubGluZUZpbGVuYW1lID0gZW5jb2RlVVJJQ29tcG9uZW50KHNhbml0aXplZEZpbGVuYW1lKQogICAgICAucmVwbGFjZSgvWyEoKV0vZywgZnVuY3Rpb24obWF0Y2gpIHsgcmV0dXJuICIlIiArIG1hdGNoLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpIH0pOwogICAgdmFyIG5ld0xpbmVCZWZvcmUgPSB0cnVlOwogICAgdmFyIG5ld0xpbmVBZnRlciA9IHRydWU7CiAgICBpZihjdXJzb3JQb3NpdGlvbiA9PT0gMCB8fCBkZXNjcmlwdGlvbi5zdWJzdHIoY3Vyc29yUG9zaXRpb24tMSwxKS5tYXRjaCgvXHJ8XG4vKSkgewogICAgICBuZXdMaW5lQmVmb3JlID0gZmFsc2U7CiAgICB9CiAgICBpZihkZXNjcmlwdGlvbi5zdWJzdHIoY3Vyc29yUG9zaXRpb24sMSkubWF0Y2goL1xyfFxuLykpIHsKICAgICAgbmV3TGluZUFmdGVyID0gZmFsc2U7CiAgICB9CgogICAgJHRleHRhcmVhLnZhbCgKICAgICAgZGVzY3JpcHRpb24uc3Vic3RyaW5nKDAsIGN1cnNvclBvc2l0aW9uKQogICAgICArIChuZXdMaW5lQmVmb3JlID8gJ1xuJyA6ICcnKQogICAgICArIGlubGluZUZpbGVuYW1lCiAgICAgICsgKG5ld0xpbmVBZnRlciA/ICdcbicgOiAnJykKICAgICAgKyBkZXNjcmlwdGlvbi5zdWJzdHJpbmcoY3Vyc29yUG9zaXRpb24sIGRlc2NyaXB0aW9uLmxlbmd0aCkKICAgICk7CgogICAgJHRleHRhcmVhLnByb3AoewogICAgICAnc2VsZWN0aW9uU3RhcnQnOiBjdXJzb3JQb3NpdGlvbiArIG5ld0xpbmVCZWZvcmUsCiAgICAgICdzZWxlY3Rpb25FbmQnOiBjdXJzb3JQb3NpdGlvbiArIGlubGluZUZpbGVuYW1lLmxlbmd0aCArIG5ld0xpbmVCZWZvcmUKICAgIH0pOwogICAgJHRleHRhcmVhLnBhcmVudHMoJy5qc3RCbG9jaycpCiAgICAgIC5maW5kKCcuanN0Yl9pbWcnKS5jbGljaygpOwoKICAgIC8vIG1vdmUgY3Vyc29yIGludG8gbmV4dCBsaW5lCiAgICBjdXJzb3JQb3NpdGlvbiA9ICR0ZXh0YXJlYS5wcm9wKCdzZWxlY3Rpb25TdGFydCcpOwogICAgJHRleHRhcmVhLnByb3AoewogICAgICAnc2VsZWN0aW9uU3RhcnQnOiBjdXJzb3JQb3NpdGlvbiArIDEsCiAgICAgICdzZWxlY3Rpb25FbmQnOiBjdXJzb3JQb3NpdGlvbiArIDEKICAgIH0pOwoKICB9Cn0KCmZ1bmN0aW9uIGNvcHlJbWFnZUZyb21DbGlwYm9hcmQoZSkgewogIGlmICghJChlLnRhcmdldCkuaGFzQ2xhc3MoJ3dpa2ktZWRpdCcpKSB7IHJldHVybjsgfQogIHZhciBjbGlwYm9hcmREYXRhID0gZS5jbGlwYm9hcmREYXRhIHx8IGUub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhCiAgaWYgKCFjbGlwYm9hcmREYXRhKSB7IHJldHVybjsgfQogIGlmIChjbGlwYm9hcmREYXRhLnR5cGVzLnNvbWUoZnVuY3Rpb24odCl7IHJldHVybiAvXnRleHRcL3BsYWluJC8udGVzdCh0KTsgfSkpIHsgcmV0dXJuOyB9CgogIHZhciBmaWxlcyA9IGNsaXBib2FyZERhdGEuZmlsZXMKICBmb3IgKHZhciBpID0gMCA7IGkgPCBmaWxlcy5sZW5ndGggOyBpKyspIHsKICAgIHZhciBmaWxlID0gZmlsZXNbaV07CiAgICBpZiAoZmlsZS50eXBlLmluZGV4T2YoImltYWdlIikgIT0gLTEpIHsKICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgpOwogICAgICB2YXIgZmlsZW5hbWUgPSAnY2xpcGJvYXJkLScKICAgICAgICArIGRhdGUuZ2V0RnVsbFllYXIoKQogICAgICAgICsgKCcwJysoZGF0ZS5nZXRNb250aCgpKzEpKS5zbGljZSgtMikKICAgICAgICArICgnMCcrZGF0ZS5nZXREYXRlKCkpLnNsaWNlKC0yKQogICAgICAgICsgKCcwJytkYXRlLmdldEhvdXJzKCkpLnNsaWNlKC0yKQogICAgICAgICsgKCcwJytkYXRlLmdldE1pbnV0ZXMoKSkuc2xpY2UoLTIpCiAgICAgICAgKyAnLScgKyByYW5kb21LZXkoNSkudG9Mb2NhbGVMb3dlckNhc2UoKQogICAgICAgICsgJy4nICsgZmlsZS5uYW1lLnNwbGl0KCcuJykucG9wKCk7CgogICAgICAvLyBnZXQgaW5wdXQgZmlsZSBpbiB0aGUgY2xvc2VzdCBmb3JtCiAgICAgIHZhciBpbnB1dEVsID0gJCh0aGlzKS5jbG9zZXN0KCJmb3JtIikuZmluZCgnaW5wdXQ6ZmlsZS5maWxlZHJvcCcpOwogICAgICBoYW5kbGVGaWxlRHJvcEV2ZW50LnRhcmdldCA9IGUudGFyZ2V0OwogICAgICBhZGRGaWxlKGlucHV0RWwsIG5ldyBGaWxlKFtmaWxlXSwgZmlsZW5hbWUsIHsgdHlwZTogZmlsZS50eXBlIH0pLCB0cnVlKTsKICAgIH0KICB9Cn0KCiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwRmlsZURyb3ApOwokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICQoImlucHV0LmRlbGV0ZWRfYXR0YWNobWVudCIpLmNoYW5nZShmdW5jdGlvbigpewogICAgJCh0aGlzKS5wYXJlbnRzKCcuZXhpc3RpbmctYXR0YWNobWVudCcpLnRvZ2dsZUNsYXNzKCdkZWxldGVkJywgJCh0aGlzKS5pcygiOmNoZWNrZWQiKSk7CiAgfSkuY2hhbmdlKCk7Cn0pOwo=" | |
| } | |
| }, | |
| "6.0.7": { | |
| "application.js": { | |
| "hash": "ce494e4e380316d654c1db1fda5adf3c", | |
| "path": "/usr/src/redmine/public/assets/application-0aa6b43a.js", | |
| "base64": "LyoqCiAqIFJlZG1pbmUgLSBwcm9qZWN0IG1hbmFnZW1lbnQgc29mdHdhcmUKICogQ29weXJpZ2h0IChDKSAyMDA2LSAgSmVhbi1QaGlsaXBwZSBMYW5nCiAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCiAqLwoKZnVuY3Rpb24gc2FuaXRpemVIVE1MKHN0cmluZykgewogIHZhciB0ZW1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIHRlbXAudGV4dENvbnRlbnQgPSBzdHJpbmc7CiAgcmV0dXJuIHRlbXAuaW5uZXJIVE1MOwp9CgpmdW5jdGlvbiBjaGVja0FsbChpZCwgY2hlY2tlZCkgewogICQoJyMnK2lkKS5maW5kKCdpbnB1dFt0eXBlPWNoZWNrYm94XTplbmFibGVkJykucHJvcCgnY2hlY2tlZCcsIGNoZWNrZWQpOwp9CgpmdW5jdGlvbiB0b2dnbGVDaGVja2JveGVzQnlTZWxlY3RvcihzZWxlY3RvcikgewogIHZhciBhbGxfY2hlY2tlZCA9IHRydWU7CiAgJChzZWxlY3RvcikuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgaWYgKCEkKHRoaXMpLmlzKCc6Y2hlY2tlZCcpKSB7IGFsbF9jaGVja2VkID0gZmFsc2U7IH0KICB9KTsKICAkKHNlbGVjdG9yKS5wcm9wKCdjaGVja2VkJywgIWFsbF9jaGVja2VkKS50cmlnZ2VyKCdjaGFuZ2UnKTsKfQoKZnVuY3Rpb24gc2hvd0FuZFNjcm9sbFRvKGlkLCBmb2N1cykgewogICQoJyMnK2lkKS5zaG93KCk7CiAgaWYgKGZvY3VzICE9PSBudWxsKSB7CiAgICAkKCcjJytmb2N1cykuZm9jdXMoKTsKICB9CiAgJCgnaHRtbCwgYm9keScpLmFuaW1hdGUoe3Njcm9sbFRvcDogJCgnIycraWQpLm9mZnNldCgpLnRvcH0sIDEwMCk7Cn0KCmZ1bmN0aW9uIHRvZ2dsZVJvd0dyb3VwKGVsKSB7CiAgdmFyIHRyID0gJChlbCkucGFyZW50cygndHInKS5maXJzdCgpOwogIHZhciBuID0gdHIubmV4dCgpOwogIHRyLnRvZ2dsZUNsYXNzKCdvcGVuJyk7CiAgJChlbCkudG9nZ2xlQ2xhc3MoJ2ljb24tZXhwYW5kZWQgaWNvbi1jb2xsYXBzZWQnKTsKICB0b2dnbGVFeHBlbmRDb2xsYXBzZUljb24oZWwpCiAgd2hpbGUgKG4ubGVuZ3RoICYmICFuLmhhc0NsYXNzKCdncm91cCcpKSB7CiAgICBuLnRvZ2dsZSgpOwogICAgbiA9IG4ubmV4dCgndHInKTsKICB9Cn0KCmZ1bmN0aW9uIHRvZ2dsZUV4cGVuZENvbGxhcHNlSWNvbihlbCkgewogIGNvbnN0IHN2ZyA9IGVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzdmcnKS5pdGVtKDApCgogIGlmIChzdmcgPT09IG51bGwpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2ljb24tZXhwYW5kZWQnKSkgewogICAgdXBkYXRlU1ZHSWNvbihzdmcsICdhbmdsZS1kb3duJykKICAgIHN2Zy5jbGFzc0xpc3QucmVtb3ZlKCdpY29uLXJ0bCcpCiAgfSBlbHNlIHsKICAgIHVwZGF0ZVNWR0ljb24oc3ZnLCAnYW5nbGUtcmlnaHQnKQogICAgc3ZnLmNsYXNzTGlzdC5hZGQoJ2ljb24tcnRsJykKICB9Cn0KCmZ1bmN0aW9uIHVwZGF0ZVNWR0ljb24oZWxlbWVudCwgaWNvbikgewogIGNvbnN0IGljb25FbGVtZW50ID0gZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidXNlIikuaXRlbSgwKQoKICBpZiAoaWNvbkVsZW1lbnQgPT09IG51bGwpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIGNvbnN0IGljb25QYXRoID0gaWNvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKCdocmVmJyk7CiAgaWNvbkVsZW1lbnQuc2V0QXR0cmlidXRlKCdocmVmJywgaWNvblBhdGgucmVwbGFjZSgvIy4qJC9nLCAiI2ljb24tLSIgKyBpY29uKSkKfQoKZnVuY3Rpb24gY29sbGFwc2VBbGxSb3dHcm91cHMoZWwpIHsKICB2YXIgdGJvZHkgPSAkKGVsKS5wYXJlbnRzKCd0Ym9keScpLmZpcnN0KCk7CiAgdGJvZHkuY2hpbGRyZW4oJ3RyJykuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ2dyb3VwJykpIHsKICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygnb3BlbicpOwogICAgICB2YXIgZXhwYW5kZXIgPSAkKHRoaXMpLmZpbmQoJy5leHBhbmRlcicpOwogICAgICBleHBhbmRlci5zd2l0Y2hDbGFzcygnaWNvbi1leHBhbmRlZCcsICdpY29uLWNvbGxhcHNlZCcpOwogICAgICB0b2dnbGVFeHBlbmRDb2xsYXBzZUljb24oZXhwYW5kZXJbMF0pOwogICAgfSBlbHNlIHsKICAgICAgJCh0aGlzKS5oaWRlKCk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIGV4cGFuZEFsbFJvd0dyb3VwcyhlbCkgewogIHZhciB0Ym9keSA9ICQoZWwpLnBhcmVudHMoJ3Rib2R5JykuZmlyc3QoKTsKICB0Ym9keS5jaGlsZHJlbigndHInKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnZ3JvdXAnKSkgewogICAgICAkKHRoaXMpLmFkZENsYXNzKCdvcGVuJyk7CiAgICAgIHZhciBleHBhbmRlciA9ICQodGhpcykuZmluZCgnLmV4cGFuZGVyJyk7CiAgICAgIGV4cGFuZGVyLnN3aXRjaENsYXNzKCdpY29uLWNvbGxhcHNlZCcsICdpY29uLWV4cGFuZGVkJyk7CiAgICAgIHRvZ2dsZUV4cGVuZENvbGxhcHNlSWNvbihleHBhbmRlclswXSk7CiAgICB9IGVsc2UgewogICAgICAkKHRoaXMpLnNob3coKTsKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gdG9nZ2xlQWxsUm93R3JvdXBzKGVsKSB7CiAgdmFyIHRyID0gJChlbCkucGFyZW50cygndHInKS5maXJzdCgpOwogIGlmICh0ci5oYXNDbGFzcygnb3BlbicpKSB7CiAgICBjb2xsYXBzZUFsbFJvd0dyb3VwcyhlbCk7CiAgfSBlbHNlIHsKICAgIGV4cGFuZEFsbFJvd0dyb3VwcyhlbCk7CiAgfQp9CgpmdW5jdGlvbiB0b2dnbGVGaWVsZHNldChlbCkgewogIHZhciBmaWVsZHNldCA9ICQoZWwpLnBhcmVudHMoJ2ZpZWxkc2V0JykuZmlyc3QoKTsKICBmaWVsZHNldC50b2dnbGVDbGFzcygnY29sbGFwc2VkJyk7CiAgZmllbGRzZXQuY2hpbGRyZW4oJ2xlZ2VuZCcpLnRvZ2dsZUNsYXNzKCdpY29uLWV4cGFuZGVkIGljb24tY29sbGFwc2VkJyk7CiAgdG9nZ2xlRXhwZW5kQ29sbGFwc2VJY29uKGZpZWxkc2V0LmNoaWxkcmVuKCdsZWdlbmQnKVswXSkKICBmaWVsZHNldC5jaGlsZHJlbignZGl2JykudG9nZ2xlKCk7Cn0KCmZ1bmN0aW9uIGhpZGVGaWVsZHNldChlbCkgewogIHZhciBmaWVsZHNldCA9ICQoZWwpLnBhcmVudHMoJ2ZpZWxkc2V0JykuZmlyc3QoKTsKICBmaWVsZHNldC50b2dnbGVDbGFzcygnY29sbGFwc2VkJyk7CiAgZmllbGRzZXQuY2hpbGRyZW4oJ2RpdicpLmhpZGUoKTsKfQoKLy8gY29sdW1ucyBzZWxlY3Rpb24KZnVuY3Rpb24gbW92ZU9wdGlvbnModGhlU2VsRnJvbSwgdGhlU2VsVG8pIHsKICAkKHRoZVNlbEZyb20pLmZpbmQoJ29wdGlvbjpzZWxlY3RlZCcpLmRldGFjaCgpLnByb3AoInNlbGVjdGVkIiwgZmFsc2UpLmFwcGVuZFRvKCQodGhlU2VsVG8pKTsKfQoKZnVuY3Rpb24gbW92ZU9wdGlvblVwKHRoZVNlbCkgewogICQodGhlU2VsKS5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAkKHRoaXMpLnByZXYoJzpub3QoOnNlbGVjdGVkKScpLmRldGFjaCgpLmluc2VydEFmdGVyKCQodGhpcykpOwogIH0pOwp9CgpmdW5jdGlvbiBtb3ZlT3B0aW9uVG9wKHRoZVNlbCkgewogICQodGhlU2VsKS5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS5kZXRhY2goKS5wcmVwZW5kVG8oJCh0aGVTZWwpKTsKfQoKZnVuY3Rpb24gbW92ZU9wdGlvbkRvd24odGhlU2VsKSB7CiAgJCgkKHRoZVNlbCkuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykuZ2V0KCkucmV2ZXJzZSgpKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAkKHRoaXMpLm5leHQoJzpub3QoOnNlbGVjdGVkKScpLmRldGFjaCgpLmluc2VydEJlZm9yZSgkKHRoaXMpKTsKICB9KTsKfQoKZnVuY3Rpb24gbW92ZU9wdGlvbkJvdHRvbSh0aGVTZWwpIHsKICAkKHRoZVNlbCkuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykuZGV0YWNoKCkuYXBwZW5kVG8oJCh0aGVTZWwpKTsKfQoKZnVuY3Rpb24gaW5pdEZpbHRlcnMoKSB7CiAgJCgnI2FkZF9maWx0ZXJfc2VsZWN0JykuY2hhbmdlKGZ1bmN0aW9uKCkgewogICAgYWRkRmlsdGVyKCQodGhpcykudmFsKCksICcnLCBbXSk7CiAgfSk7CiAgJCgnI2ZpbHRlcnMtdGFibGUgLmZpZWxkIGlucHV0W3R5cGU9Y2hlY2tib3hdJykuZWFjaChmdW5jdGlvbigpIHsKICAgIHRvZ2dsZUZpbHRlcigkKHRoaXMpLnZhbCgpKTsKICB9KTsKICAkKCcjZmlsdGVycy10YWJsZScpLm9uKCdjbGljaycsICcuZmllbGQgaW5wdXRbdHlwZT1jaGVja2JveF0nLCBmdW5jdGlvbigpIHsKICAgIHRvZ2dsZUZpbHRlcigkKHRoaXMpLnZhbCgpKTsKICB9KTsKICAkKCcjZmlsdGVycy10YWJsZScpLm9uKCdrZXlwcmVzcycsICdpbnB1dFt0eXBlPXRleHRdJywgZnVuY3Rpb24oZSkgewogICAgaWYgKGUua2V5Q29kZSA9PSAxMykgJCh0aGlzKS5jbG9zZXN0KCdmb3JtJykuc3VibWl0KCk7CiAgfSk7Cn0KCmZ1bmN0aW9uIGFkZEZpbHRlcihmaWVsZCwgb3BlcmF0b3IsIHZhbHVlcykgewogIHZhciBmaWVsZElkID0gZmllbGQucmVwbGFjZSgnLicsICdfJyk7CiAgdmFyIHRyID0gJCgnI3RyXycrZmllbGRJZCk7CgogIHZhciBmaWx0ZXJPcHRpb25zID0gYXZhaWxhYmxlRmlsdGVyc1tmaWVsZF07CiAgaWYgKCFmaWx0ZXJPcHRpb25zKSByZXR1cm47CgogIGlmIChmaWx0ZXJPcHRpb25zWydyZW1vdGUnXSAmJiBmaWx0ZXJPcHRpb25zWyd2YWx1ZXMnXSA9PSBudWxsKSB7CiAgICAkLmdldEpTT04oZmlsdGVyc1VybCwgeyduYW1lJzogZmllbGR9KS5kb25lKGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgZmlsdGVyT3B0aW9uc1sndmFsdWVzJ10gPSBkYXRhOwogICAgICBhZGRGaWx0ZXIoZmllbGQsIG9wZXJhdG9yLCB2YWx1ZXMpIDsKICAgIH0pOwogICAgcmV0dXJuOwogIH0KCiAgaWYgKHRyLmxlbmd0aCA+IDApIHsKICAgIHRyLnNob3coKTsKICB9IGVsc2UgewogICAgYnVpbGRGaWx0ZXJSb3coZmllbGQsIG9wZXJhdG9yLCB2YWx1ZXMpOwogIH0KICAkKCcjY2JfJytmaWVsZElkKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7CiAgdG9nZ2xlRmlsdGVyKGZpZWxkKTsKICB0b2dnbGVNdWx0aVNlbGVjdEljb25Jbml0KCk7CiAgJCgnI2FkZF9maWx0ZXJfc2VsZWN0JykudmFsKCcnKS5maW5kKCdvcHRpb24nKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgaWYgKCQodGhpcykuYXR0cigndmFsdWUnKSA9PSBmaWVsZCkgewogICAgICAkKHRoaXMpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIGJ1aWxkRmlsdGVyUm93KGZpZWxkLCBvcGVyYXRvciwgdmFsdWVzKSB7CiAgdmFyIGZpZWxkSWQgPSBmaWVsZC5yZXBsYWNlKCcuJywgJ18nKTsKICB2YXIgZmlsdGVyVGFibGUgPSAkKCIjZmlsdGVycy10YWJsZSIpOwogIHZhciBmaWx0ZXJPcHRpb25zID0gYXZhaWxhYmxlRmlsdGVyc1tmaWVsZF07CiAgaWYgKCFmaWx0ZXJPcHRpb25zKSByZXR1cm47CiAgdmFyIG9wZXJhdG9ycyA9IG9wZXJhdG9yQnlUeXBlW2ZpbHRlck9wdGlvbnNbJ3R5cGUnXV07CiAgdmFyIGZpbHRlclZhbHVlcyA9IGZpbHRlck9wdGlvbnNbJ3ZhbHVlcyddOwogIHZhciBzZWxlY3Q7CgogIHZhciB0ciA9ICQoJzxkaXYgY2xhc3M9ImZpbHRlciI+JykuYXR0cignaWQnLCAndHJfJytmaWVsZElkKS5odG1sKAogICAgJzxkaXYgY2xhc3M9ImZpZWxkIj48aW5wdXQgY2hlY2tlZD0iY2hlY2tlZCIgaWQ9ImNiXycrZmllbGRJZCsnIiBuYW1lPSJmW10iIHZhbHVlPSInK2ZpZWxkKyciIHR5cGU9ImNoZWNrYm94Ij48bGFiZWwgZm9yPSJjYl8nK2ZpZWxkSWQrJyI+ICcrZmlsdGVyT3B0aW9uc1snbmFtZSddKyc8L2xhYmVsPjwvZGl2PicgKwogICAgJzxkaXYgY2xhc3M9Im9wZXJhdG9yIj48c2VsZWN0IGlkPSJvcGVyYXRvcnNfJytmaWVsZElkKyciIG5hbWU9Im9wWycrZmllbGQrJ10iPjwvc2VsZWN0PjwvZGl2PicgKwogICAgJzxkaXYgY2xhc3M9InZhbHVlcyI+PC9kaXY+JwogICk7CiAgZmlsdGVyVGFibGUuYXBwZW5kKHRyKTsKCiAgc2VsZWN0ID0gdHIuZmluZCgnLm9wZXJhdG9yIHNlbGVjdCcpOwogIG9wZXJhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uKG9wKSB7CiAgICB2YXIgb3B0aW9uID0gJCgnPG9wdGlvbj4nKS52YWwob3ApLnRleHQob3BlcmF0b3JMYWJlbHNbb3BdKTsKICAgIGlmIChvcCA9PSBvcGVyYXRvcikgeyBvcHRpb24ucHJvcCgnc2VsZWN0ZWQnLCB0cnVlKTsgfQogICAgc2VsZWN0LmFwcGVuZChvcHRpb24pOwogIH0pOwogIHNlbGVjdC5jaGFuZ2UoZnVuY3Rpb24oKXsgdG9nZ2xlT3BlcmF0b3IoZmllbGQpOyB9KTsKCiAgc3dpdGNoIChmaWx0ZXJPcHRpb25zWyd0eXBlJ10pIHsKICBjYXNlICJsaXN0IjoKICBjYXNlICJsaXN0X3dpdGhfaGlzdG9yeSI6CiAgY2FzZSAibGlzdF9vcHRpb25hbCI6CiAgY2FzZSAibGlzdF9vcHRpb25hbF93aXRoX2hpc3RvcnkiOgogIGNhc2UgImxpc3Rfc3RhdHVzIjoKICBjYXNlICJsaXN0X3N1YnByb2plY3RzIjoKICAgIGNvbnN0IGljb25UeXBlID0gdmFsdWVzLmxlbmd0aCA+IDEgPyAndG9nZ2xlLW1pbnVzJyA6ICd0b2dnbGUtcGx1cyc7CiAgICBjb25zdCBjbG9uZWRJY29uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2ljb24tY29weS1zb3VyY2Ugc3ZnJykuY2xvbmVOb2RlKHRydWUpOwogICAgdXBkYXRlU1ZHSWNvbihjbG9uZWRJY29uLCBpY29uVHlwZSk7CgogICAgdHIuZmluZCgnLnZhbHVlcycpLmFwcGVuZCgKICAgICAgJCgnPHNwYW4+JywgeyBzdHlsZTogJ2Rpc3BsYXk6bm9uZTsnIH0pLmFwcGVuZCgKICAgICAgICAkKCc8c2VsZWN0PicsIHsKICAgICAgICAgIGNsYXNzOiAndmFsdWUnLAogICAgICAgICAgaWQ6IGB2YWx1ZXNfJHtmaWVsZElkfV8xYCwKICAgICAgICAgIG5hbWU6IGB2WyR7ZmllbGR9XVtdYCwKICAgICAgICB9KSwKICAgICAgICAnXG4nLAogICAgICAgICQoJzxzcGFuPicsIHsgY2xhc3M6IGB0b2dnbGUtbXVsdGlzZWxlY3QgaWNvbi1vbmx5IGljb24tJHtpY29uVHlwZX1gIH0pLmFwcGVuZChjbG9uZWRJY29uKQogICAgICApCiAgICApOwogICAgc2VsZWN0ID0gdHIuZmluZCgnLnZhbHVlcyBzZWxlY3QnKTsKICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMSkgeyBzZWxlY3QuYXR0cignbXVsdGlwbGUnLCB0cnVlKTsgfQogICAgZmlsdGVyVmFsdWVzLmZvckVhY2goZnVuY3Rpb24oZmlsdGVyVmFsdWUpIHsKICAgICAgdmFyIG9wdGlvbiA9ICQoJzxvcHRpb24+Jyk7CiAgICAgIGlmICgkLmlzQXJyYXkoZmlsdGVyVmFsdWUpKSB7CiAgICAgICAgb3B0aW9uLnZhbChmaWx0ZXJWYWx1ZVsxXSkudGV4dChmaWx0ZXJWYWx1ZVswXSk7CiAgICAgICAgaWYgKCQuaW5BcnJheShmaWx0ZXJWYWx1ZVsxXSwgdmFsdWVzKSA+IC0xKSB7b3B0aW9uLnByb3AoJ3NlbGVjdGVkJywgdHJ1ZSk7fQogICAgICAgIGlmIChmaWx0ZXJWYWx1ZS5sZW5ndGggPT0gMykgewogICAgICAgICAgdmFyIG9wdGdyb3VwID0gc2VsZWN0LmZpbmQoJ29wdGdyb3VwJykuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuICQodGhpcykuYXR0cignbGFiZWwnKSA9PSBmaWx0ZXJWYWx1ZVsyXX0pOwogICAgICAgICAgaWYgKCFvcHRncm91cC5sZW5ndGgpIHtvcHRncm91cCA9ICQoJzxvcHRncm91cD4nKS5hdHRyKCdsYWJlbCcsIGZpbHRlclZhbHVlWzJdKTt9CiAgICAgICAgICBvcHRpb24gPSBvcHRncm91cC5hcHBlbmQob3B0aW9uKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb3B0aW9uLnZhbChmaWx0ZXJWYWx1ZSkudGV4dChmaWx0ZXJWYWx1ZSk7CiAgICAgICAgaWYgKCQuaW5BcnJheShmaWx0ZXJWYWx1ZSwgdmFsdWVzKSA+IC0xKSB7b3B0aW9uLnByb3AoJ3NlbGVjdGVkJywgdHJ1ZSk7fQogICAgICB9CiAgICAgIHNlbGVjdC5hcHBlbmQob3B0aW9uKTsKICAgIH0pOwogICAgYnJlYWs7CiAgY2FzZSAiZGF0ZSI6CiAgY2FzZSAiZGF0ZV9wYXN0IjoKICAgIHRyLmZpbmQoJy52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9ImRhdGUiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnXzEiIHNpemU9IjEwIiBjbGFzcz0idmFsdWUgZGF0ZV92YWx1ZSIgLz48L3NwYW4+JyArCiAgICAgICcgPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZTsiPjxpbnB1dCB0eXBlPSJkYXRlIiBuYW1lPSJ2WycrZmllbGQrJ11bXSIgaWQ9InZhbHVlc18nK2ZpZWxkSWQrJ18yIiBzaXplPSIxMCIgY2xhc3M9InZhbHVlIGRhdGVfdmFsdWUiIC8+PC9zcGFuPicgKwogICAgICAnIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKyciIHNpemU9IjMiIGNsYXNzPSJ2YWx1ZSIgLz4gJytsYWJlbERheVBsdXJhbCsnPC9zcGFuPicKICAgICk7CiAgICAkKCcjdmFsdWVzXycrZmllbGRJZCsnXzEnKS52YWwodmFsdWVzWzBdKS5kYXRlcGlja2VyRmFsbGJhY2soZGF0ZXBpY2tlck9wdGlvbnMpOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQrJ18yJykudmFsKHZhbHVlc1sxXSkuZGF0ZXBpY2tlckZhbGxiYWNrKGRhdGVwaWNrZXJPcHRpb25zKTsKICAgICQoJyN2YWx1ZXNfJytmaWVsZElkKS52YWwodmFsdWVzWzBdKTsKICAgIGJyZWFrOwogIGNhc2UgInN0cmluZyI6CiAgY2FzZSAidGV4dCI6CiAgY2FzZSAic2VhcmNoIjoKICAgIHRyLmZpbmQoJy52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnIiBzaXplPSIzMCIgY2xhc3M9InZhbHVlIiAvPjwvc3Bhbj4nCiAgICApOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQpLnZhbCh2YWx1ZXNbMF0pOwogICAgYnJlYWs7CiAgY2FzZSAicmVsYXRpb24iOgogICAgdHIuZmluZCgnLnZhbHVlcycpLmFwcGVuZCgKICAgICAgJzxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKyciIHNpemU9IjYiIGNsYXNzPSJ2YWx1ZSIgLz48L3NwYW4+JyArCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PHNlbGVjdCBjbGFzcz0idmFsdWUiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnXzEiPjwvc2VsZWN0Pjwvc3Bhbj4nCiAgICApOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQpLnZhbCh2YWx1ZXNbMF0pOwogICAgc2VsZWN0ID0gdHIuZmluZCgnLnZhbHVlcyBzZWxlY3QnKTsKICAgIGZpbHRlclZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKGZpbHRlclZhbHVlKSB7CiAgICAgIHZhciBvcHRpb24gPSAkKCc8b3B0aW9uPicpOwogICAgICBvcHRpb24udmFsKGZpbHRlclZhbHVlWzFdKS50ZXh0KGZpbHRlclZhbHVlWzBdKTsKICAgICAgaWYgKHZhbHVlc1swXSA9PSBmaWx0ZXJWYWx1ZVsxXSkgeyBvcHRpb24ucHJvcCgnc2VsZWN0ZWQnLCB0cnVlKTsgfQogICAgICBzZWxlY3QuYXBwZW5kKG9wdGlvbik7CiAgICB9KTsKICAgIGJyZWFrOwogIGNhc2UgImludGVnZXIiOgogIGNhc2UgImZsb2F0IjoKICBjYXNlICJ0cmVlIjoKICAgIHRyLmZpbmQoJy52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnXzEiIHNpemU9IjE0IiBjbGFzcz0idmFsdWUiIC8+PC9zcGFuPicgKwogICAgICAnIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKydfMiIgc2l6ZT0iMTQiIGNsYXNzPSJ2YWx1ZSIgLz48L3NwYW4+JwogICAgKTsKICAgICQoJyN2YWx1ZXNfJytmaWVsZElkKydfMScpLnZhbCh2YWx1ZXNbMF0pOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQrJ18yJykudmFsKHZhbHVlc1sxXSk7CiAgICBicmVhazsKICB9Cn0KCmZ1bmN0aW9uIHRvZ2dsZUZpbHRlcihmaWVsZCkgewogIHZhciBmaWVsZElkID0gZmllbGQucmVwbGFjZSgnLicsICdfJyk7CiAgaWYgKCQoJyNjYl8nICsgZmllbGRJZCkuaXMoJzpjaGVja2VkJykpIHsKICAgICQoIiNvcGVyYXRvcnNfIiArIGZpZWxkSWQpLnNob3coKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpOwogICAgdG9nZ2xlT3BlcmF0b3IoZmllbGQpOwogIH0gZWxzZSB7CiAgICAkKCIjb3BlcmF0b3JzXyIgKyBmaWVsZElkKS5oaWRlKCkuYXR0cignZGlzYWJsZWQnLCB0cnVlKTsKICAgIGVuYWJsZVZhbHVlcyhmaWVsZCwgW10pOwogIH0KfQoKZnVuY3Rpb24gZW5hYmxlVmFsdWVzKGZpZWxkLCBpbmRleGVzKSB7CiAgdmFyIGZpZWxkSWQgPSBmaWVsZC5yZXBsYWNlKCcuJywgJ18nKTsKICAkKCcjdHJfJytmaWVsZElkKycgLnZhbHVlcyAudmFsdWUnKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICBpZiAoJC5pbkFycmF5KGluZGV4LCBpbmRleGVzKSA+PSAwKSB7CiAgICAgICQodGhpcykucmVtb3ZlQXR0cignZGlzYWJsZWQnKTsKICAgICAgJCh0aGlzKS5wYXJlbnRzKCdzcGFuJykuZmlyc3QoKS5zaG93KCk7CiAgICB9IGVsc2UgewogICAgICAkKHRoaXMpLnZhbCgnJyk7CiAgICAgICQodGhpcykuYXR0cignZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgJCh0aGlzKS5wYXJlbnRzKCdzcGFuJykuZmlyc3QoKS5oaWRlKCk7CiAgICB9CgogICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ2dyb3VwJykpIHsKICAgICAgJCh0aGlzKS5hZGRDbGFzcygnb3BlbicpOwogICAgfSBlbHNlIHsKICAgICAgJCh0aGlzKS5zaG93KCk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIHRvZ2dsZU9wZXJhdG9yKGZpZWxkKSB7CiAgdmFyIGZpZWxkSWQgPSBmaWVsZC5yZXBsYWNlKCcuJywgJ18nKTsKICB2YXIgb3BlcmF0b3IgPSAkKCIjb3BlcmF0b3JzXyIgKyBmaWVsZElkKTsKICBzd2l0Y2ggKG9wZXJhdG9yLnZhbCgpKSB7CiAgICBjYXNlICIhKiI6CiAgICBjYXNlICIqIjoKICAgIGNhc2UgIm5kIjoKICAgIGNhc2UgInQiOgogICAgY2FzZSAibGQiOgogICAgY2FzZSAibnciOgogICAgY2FzZSAidyI6CiAgICBjYXNlICJsdyI6CiAgICBjYXNlICJsMnciOgogICAgY2FzZSAibm0iOgogICAgY2FzZSAibSI6CiAgICBjYXNlICJsbSI6CiAgICBjYXNlICJ5IjoKICAgIGNhc2UgIm8iOgogICAgY2FzZSAiYyI6CiAgICBjYXNlICIqbyI6CiAgICBjYXNlICIhbyI6CiAgICAgIGVuYWJsZVZhbHVlcyhmaWVsZCwgW10pOwogICAgICBicmVhazsKICAgIGNhc2UgIj48IjoKICAgICAgZW5hYmxlVmFsdWVzKGZpZWxkLCBbMCwxXSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAiPHQrIjoKICAgIGNhc2UgIj50KyI6CiAgICBjYXNlICI+PHQrIjoKICAgIGNhc2UgInQrIjoKICAgIGNhc2UgIj50LSI6CiAgICBjYXNlICI8dC0iOgogICAgY2FzZSAiPjx0LSI6CiAgICBjYXNlICJ0LSI6CiAgICAgIGVuYWJsZVZhbHVlcyhmaWVsZCwgWzJdKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICI9cCI6CiAgICBjYXNlICI9IXAiOgogICAgY2FzZSAiIXAiOgogICAgICBlbmFibGVWYWx1ZXMoZmllbGQsIFsxXSk7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgZW5hYmxlVmFsdWVzKGZpZWxkLCBbMF0pOwogICAgICBicmVhazsKICB9Cn0KCmZ1bmN0aW9uIHRvZ2dsZU11bHRpU2VsZWN0KGVsKSB7CiAgdmFyIGlzV29ya2Zsb3cgPSBlbC5jbG9zZXN0KCcuY29udHJvbGxlci13b3JrZmxvd3MnKTsKICBpZiAoZWwuYXR0cignbXVsdGlwbGUnKSkgewogICAgZWwucmVtb3ZlQXR0cignbXVsdGlwbGUnKTsKICAgIGlmIChpc1dvcmtmbG93KSB7IGVsLmZpbmQoIm9wdGlvblt2YWx1ZT1hbGxdIikuc2hvdygpOyB9CiAgICBlbC5hdHRyKCdzaXplJywgMSk7CiAgfSBlbHNlIHsKICAgIGVsLmF0dHIoJ211bHRpcGxlJywgdHJ1ZSk7CiAgICBpZiAoaXNXb3JrZmxvdykgeyBlbC5maW5kKCJvcHRpb25bdmFsdWU9YWxsXSIpLmF0dHIoInNlbGVjdGVkIiwgZmFsc2UpLmhpZGUoKTsgfQogICAgaWYgKGVsLmNoaWxkcmVuKCkubGVuZ3RoID4gMTApCiAgICAgIGVsLmF0dHIoJ3NpemUnLCAxMCk7CiAgICBlbHNlCiAgICAgIGVsLmF0dHIoJ3NpemUnLCA0KTsKICB9Cn0KCmZ1bmN0aW9uIHNob3dUYWIobmFtZSwgdXJsKSB7CiAgJCgnI3RhYi1jb250ZW50LScgKyBuYW1lKS5wYXJlbnQoKS5maW5kKCcudGFiLWNvbnRlbnQnKS5oaWRlKCk7CiAgJCgnI3RhYi1jb250ZW50LScgKyBuYW1lKS5zaG93KCk7CiAgJCgnI3RhYi0nICsgbmFtZSkuY2xvc2VzdCgnLnRhYnMnKS5maW5kKCdhJykucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkJyk7CiAgJCgnI3RhYi0nICsgbmFtZSkuYWRkQ2xhc3MoJ3NlbGVjdGVkJyk7CgogIHJlcGxhY2VJbkhpc3RvcnkodXJsKQoKICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIHNob3dJc3N1ZUhpc3Rvcnkoam91cm5hbCwgdXJsKSB7CiAgdGFiX2NvbnRlbnQgPSAkKCcjdGFiLWNvbnRlbnQtaGlzdG9yeScpOwogIHRhYl9jb250ZW50LnBhcmVudCgpLmZpbmQoJy50YWItY29udGVudCcpLmhpZGUoKTsKICB0YWJfY29udGVudC5zaG93KCk7CiAgdGFiX2NvbnRlbnQucGFyZW50KCkuY2hpbGRyZW4oJ2Rpdi50YWJzJykuZmluZCgnYScpLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpOwoKICAkKCcjdGFiLScgKyBqb3VybmFsKS5hZGRDbGFzcygnc2VsZWN0ZWQnKTsKCiAgcmVwbGFjZUluSGlzdG9yeSh1cmwpCgogIHN3aXRjaChqb3VybmFsKSB7CiAgICBjYXNlICdub3Rlcyc6CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbDpub3QoLmhhcy1ub3RlcyknKS5oaWRlKCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC53aWtpJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAuY29udGV4dHVhbCAuam91cm5hbC1hY3Rpb25zJykuc2hvdygpOwoKICAgICAgLy8gYWx3YXlzIHNob3cgdGh1bWJuYWlscyBpbiBub3RlcyB0YWIKICAgICAgdmFyIHRodW1ibmFpbHMgPSB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAudGh1bWJuYWlscycpOwogICAgICB0aHVtYm5haWxzLnNob3coKTsKICAgICAgLy8gc2hvdyBqb3VybmFscyB3aXRob3V0IG5vdGVzLCBidXQgd2l0aCB0aHVtYm5haWxzCiAgICAgIHRodW1ibmFpbHMucGFyZW50cygnLmpvdXJuYWwnKS5zaG93KCk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAncHJvcGVydGllcyc6CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbDpub3QoLmhhcy1kZXRhaWxzKScpLmhpZGUoKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwgLndpa2knKS5oaWRlKCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC50aHVtYm5haWxzJykuaGlkZSgpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAuY29udGV4dHVhbCAuam91cm5hbC1hY3Rpb25zJykuaGlkZSgpOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAud2lraScpLnNob3coKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwgLnRodW1ibmFpbHMnKS5zaG93KCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC5jb250ZXh0dWFsIC5qb3VybmFsLWFjdGlvbnMnKS5zaG93KCk7CiAgfQoKICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIGdldFJlbW90ZVRhYihuYW1lLCByZW1vdGVfdXJsLCB1cmwsIGxvYWRfYWx3YXlzKSB7CiAgbG9hZF9hbHdheXMgPSBsb2FkX2Fsd2F5cyB8fCBmYWxzZTsKICB2YXIgdGFiX2NvbnRlbnQgPSAkKCcjdGFiLWNvbnRlbnQtJyArIG5hbWUpOwoKICB0YWJfY29udGVudC5wYXJlbnQoKS5maW5kKCcudGFiLWNvbnRlbnQnKS5oaWRlKCk7CiAgdGFiX2NvbnRlbnQucGFyZW50KCkuY2hpbGRyZW4oJ2Rpdi50YWJzJykuZmluZCgnYScpLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpOwogICQoJyN0YWItJyArIG5hbWUpLmFkZENsYXNzKCdzZWxlY3RlZCcpOwoKICByZXBsYWNlSW5IaXN0b3J5KHVybCk7CgogIGlmICh0YWJfY29udGVudC5jaGlsZHJlbigpLmxlbmd0aCA9PSAwICYmIGxvYWRfYWx3YXlzID09IGZhbHNlKSB7CiAgICAkLmFqYXgoewogICAgICB1cmw6IHJlbW90ZV91cmwsCiAgICAgIHR5cGU6ICdnZXQnLAogICAgICBzdWNjZXNzOiBmdW5jdGlvbihkYXRhKXsKICAgICAgICB0YWJfY29udGVudC5odG1sKGRhdGEpCiAgICAgIH0KICAgIH0pOwogIH0KCiAgdGFiX2NvbnRlbnQuc2hvdygpOwogIHJldHVybiBmYWxzZTsKfQoKLy9yZXBsYWNlcyBjdXJyZW50IFVSTCB3aXRoIHRoZSAiaHJlZiIgYXR0cmlidXRlIG9mIHRoZSBjdXJyZW50IGxpbmsKLy8ob25seSB0cmlnZ2VyZWQgaWYgc3VwcG9ydGVkIGJ5IGJyb3dzZXIpCmZ1bmN0aW9uIHJlcGxhY2VJbkhpc3RvcnkodXJsKSB7CiAgaWYgKCJyZXBsYWNlU3RhdGUiIGluIHdpbmRvdy5oaXN0b3J5ICYmIHVybCAhPT0gdW5kZWZpbmVkKSB7CiAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwgZG9jdW1lbnQudGl0bGUsIHVybCk7CiAgfQp9CgpmdW5jdGlvbiBtb3ZlVGFiUmlnaHQoZWwpIHsKICB2YXIgbGlzID0gJChlbCkucGFyZW50cygnZGl2LnRhYnMnKS5maXJzdCgpLmZpbmQoJ3VsJykuY2hpbGRyZW4oKTsKICB2YXIgYncgPSAkKGVsKS5wYXJlbnRzKCdkaXYudGFicy1idXR0b25zJykub3V0ZXJXaWR0aCh0cnVlKTsKICB2YXIgdGFic1dpZHRoID0gMDsKICB2YXIgaSA9IDA7CiAgbGlzLmVhY2goZnVuY3Rpb24oKSB7CiAgICBpZiAoJCh0aGlzKS5pcygnOnZpc2libGUnKSkgewogICAgICB0YWJzV2lkdGggKz0gJCh0aGlzKS5vdXRlcldpZHRoKHRydWUpOwogICAgfQogIH0pOwogIGlmICh0YWJzV2lkdGggPCAkKGVsKS5wYXJlbnRzKCdkaXYudGFicycpLmZpcnN0KCkud2lkdGgoKSAtIGJ3KSB7IHJldHVybjsgfQogICQoZWwpLnNpYmxpbmdzKCcudGFiLWxlZnQnKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICB3aGlsZSAoaTxsaXMubGVuZ3RoICYmICFsaXMuZXEoaSkuaXMoJzp2aXNpYmxlJykpIHsgaSsrOyB9CiAgdmFyIHcgPSBsaXMuZXEoaSkud2lkdGgoKTsKICBsaXMuZXEoaSkuaGlkZSgpOwogIGlmICh0YWJzV2lkdGggLSB3IDwgJChlbCkucGFyZW50cygnZGl2LnRhYnMnKS5maXJzdCgpLndpZHRoKCkgLSBidykgewogICAgJChlbCkuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7CiAgfQp9CgpmdW5jdGlvbiBtb3ZlVGFiTGVmdChlbCkgewogIHZhciBsaXMgPSAkKGVsKS5wYXJlbnRzKCdkaXYudGFicycpLmZpcnN0KCkuZmluZCgndWwnKS5jaGlsZHJlbigpOwogIHZhciBpID0gMDsKICB3aGlsZSAoaSA8IGxpcy5sZW5ndGggJiYgIWxpcy5lcShpKS5pcygnOnZpc2libGUnKSkgeyBpKys7IH0KICBpZiAoaSA+IDApIHsKICAgIGxpcy5lcShpLTEpLnNob3coKTsKICAgICQoZWwpLnNpYmxpbmdzKCcudGFiLXJpZ2h0JykucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7CiAgfQogIGlmIChpIDw9IDEpIHsKICAgICQoZWwpLmFkZENsYXNzKCdkaXNhYmxlZCcpOwogIH0KfQoKZnVuY3Rpb24gZGlzcGxheVRhYnNCdXR0b25zKCkgewogIHZhciBsaXM7CiAgdmFyIHRhYnNXaWR0aDsKICB2YXIgZWw7CiAgdmFyIG51bUhpZGRlbjsKICAkKCdkaXYudGFicycpLmVhY2goZnVuY3Rpb24oKSB7CiAgICBlbCA9ICQodGhpcyk7CiAgICBsaXMgPSBlbC5maW5kKCd1bCcpLmNoaWxkcmVuKCk7CiAgICB0YWJzV2lkdGggPSAwOwogICAgbnVtSGlkZGVuID0gMDsKICAgIGxpcy5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgIGlmICgkKHRoaXMpLmlzKCc6dmlzaWJsZScpKSB7CiAgICAgICAgdGFic1dpZHRoICs9ICQodGhpcykub3V0ZXJXaWR0aCh0cnVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBudW1IaWRkZW4rKzsKICAgICAgfQogICAgfSk7CiAgICB2YXIgYncgPSAkKGVsKS5maW5kKCdkaXYudGFicy1idXR0b25zJykub3V0ZXJXaWR0aCh0cnVlKTsKICAgIGlmICgodGFic1dpZHRoIDwgZWwud2lkdGgoKSAtIGJ3KSAmJiAobGlzLmxlbmd0aCA9PT0gMCB8fCBsaXMuZmlyc3QoKS5pcygnOnZpc2libGUnKSkpIHsKICAgICAgZWwuZmluZCgnZGl2LnRhYnMtYnV0dG9ucycpLmhpZGUoKTsKICAgIH0gZWxzZSB7CiAgICAgIGVsLmZpbmQoJ2Rpdi50YWJzLWJ1dHRvbnMnKS5zaG93KCkuY2hpbGRyZW4oJ2J1dHRvbi50YWItbGVmdCcpLnRvZ2dsZUNsYXNzKCdkaXNhYmxlZCcsIG51bUhpZGRlbiA9PSAwKTsKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gc2V0UHJlZGVjZXNzb3JGaWVsZHNWaXNpYmlsaXR5KCkgewogIHZhciByZWxhdGlvblR5cGUgPSAkKCcjcmVsYXRpb25fcmVsYXRpb25fdHlwZScpOwogIGlmIChyZWxhdGlvblR5cGUudmFsKCkgPT0gInByZWNlZGVzIiB8fCByZWxhdGlvblR5cGUudmFsKCkgPT0gImZvbGxvd3MiKSB7CiAgICAkKCcjcHJlZGVjZXNzb3JfZmllbGRzJykuc2hvdygpOwogIH0gZWxzZSB7CiAgICAkKCcjcHJlZGVjZXNzb3JfZmllbGRzJykuaGlkZSgpOwogIH0KfQoKZnVuY3Rpb24gc2hvd01vZGFsKGlkLCB3aWR0aCwgdGl0bGUpIHsKICB2YXIgZWwgPSAkKCcjJytpZCkuZmlyc3QoKTsKICBpZiAoZWwubGVuZ3RoID09PSAwIHx8IGVsLmlzKCc6dmlzaWJsZScpKSB7cmV0dXJuO30KICBpZiAoIXRpdGxlKSB0aXRsZSA9IGVsLmZpbmQoJ2gzLnRpdGxlJykudGV4dCgpOwogIC8vIG1vdmVzIGV4aXN0aW5nIG1vZGFscyBiZWhpbmQgdGhlIHRyYW5zcGFyZW50IGJhY2tncm91bmQKICAkKCIubW9kYWwiKS5jc3MoJ3pJbmRleCcsOTkpOwogIGVsLmRpYWxvZyh7CiAgICB3aWR0aDogd2lkdGgsCiAgICBtb2RhbDogdHJ1ZSwKICAgIHJlc2l6YWJsZTogZmFsc2UsCiAgICBkaWFsb2dDbGFzczogJ21vZGFsJywKICAgIHRpdGxlOiB0aXRsZQogIH0pLm9uKCdkaWFsb2djbG9zZScsIGZ1bmN0aW9uKCl7CiAgICAkKCIubW9kYWwiKS5jc3MoJ3pJbmRleCcsMTAxKTsKICB9KTsKICBlbC5maW5kKCJpbnB1dFt0eXBlPXRleHRdLCBpbnB1dFt0eXBlPXN1Ym1pdF0iKS5maXJzdCgpLmZvY3VzKCk7Cn0KCmZ1bmN0aW9uIGhpZGVNb2RhbChlbCkgewogIHZhciBtb2RhbDsKICBpZiAoZWwpIHsKICAgIG1vZGFsID0gJChlbCkucGFyZW50cygnLnVpLWRpYWxvZy1jb250ZW50Jyk7CiAgfSBlbHNlIHsKICAgIG1vZGFsID0gJCgnI2FqYXgtbW9kYWwnKTsKICB9CiAgbW9kYWwuZGlhbG9nKCJjbG9zZSIpOwp9CgpmdW5jdGlvbiBjb2xsYXBzZVNjbUVudHJ5KGlkKSB7CiAgJCgnLicraWQpLmVhY2goZnVuY3Rpb24oKSB7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnb3BlbicpKSB7CiAgICAgIGNvbGxhcHNlU2NtRW50cnkoJCh0aGlzKS5hdHRyKCdpZCcpKTsKICAgIH0KICAgICQodGhpcykuaGlkZSgpOwogIH0pOwogICQoJyMnK2lkKS5yZW1vdmVDbGFzcygnb3BlbicpOwp9CgpmdW5jdGlvbiBleHBhbmRTY21FbnRyeShpZCkgewogICQoJy4nK2lkKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgJCh0aGlzKS5zaG93KCk7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnbG9hZGVkJykgJiYgISQodGhpcykuaGFzQ2xhc3MoJ2NvbGxhcHNlZCcpKSB7CiAgICAgIGV4cGFuZFNjbUVudHJ5KCQodGhpcykuYXR0cignaWQnKSk7CiAgICB9CiAgfSk7CiAgJCgnIycraWQpLmFkZENsYXNzKCdvcGVuJyk7Cn0KCmZ1bmN0aW9uIHNjbUVudHJ5Q2xpY2soaWQsIHVybCkgewogICAgdmFyIGVsID0gJCgnIycraWQpOwogICAgdmFyIGV4cGFuZGVyID0gZWwuZmluZCgnLmV4cGFuZGVyJyk7CiAgICB2YXIgZm9sZGVyID0gZWwuZmluZCgnLmljb24tZm9sZGVyJyk7CgogICAgaWYgKGVsLmhhc0NsYXNzKCdvcGVuJykpIHsKICAgICAgICBjb2xsYXBzZVNjbUVudHJ5KGlkKTsKICAgICAgICBlbC5maW5kKCcuZXhwYW5kZXInKS5zd2l0Y2hDbGFzcygnaWNvbi1leHBhbmRlZCcsICdpY29uLWNvbGxhcHNlZCcpOwogICAgICAgIGVsLmFkZENsYXNzKCdjb2xsYXBzZWQnKTsKICAgICAgICB1cGRhdGVTVkdJY29uKGZvbGRlclswXSwgJ2ZvbGRlcicpCiAgICAgICAgdG9nZ2xlRXhwZW5kQ29sbGFwc2VJY29uKGV4cGFuZGVyWzBdKTsKCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSBlbHNlIGlmIChlbC5oYXNDbGFzcygnbG9hZGVkJykpIHsKICAgICAgICBleHBhbmRTY21FbnRyeShpZCk7CiAgICAgICAgZWwuZmluZCgnLmV4cGFuZGVyJykuc3dpdGNoQ2xhc3MoJ2ljb24tY29sbGFwc2VkJywgJ2ljb24tZXhwYW5kZWQnKTsKICAgICAgICBlbC5yZW1vdmVDbGFzcygnY29sbGFwc2VkJyk7CiAgICAgICAgdXBkYXRlU1ZHSWNvbihmb2xkZXJbMF0sICdmb2xkZXItb3BlbicpCiAgICAgICAgdG9nZ2xlRXhwZW5kQ29sbGFwc2VJY29uKGV4cGFuZGVyWzBdKTsKCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKGVsLmhhc0NsYXNzKCdsb2FkaW5nJykpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBlbC5hZGRDbGFzcygnbG9hZGluZycpOwogICAgJC5hamF4KHsKICAgICAgdXJsOiB1cmwsCiAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICBlbC5hZnRlcihkYXRhKTsKICAgICAgICBlbC5hZGRDbGFzcygnb3BlbicpLmFkZENsYXNzKCdsb2FkZWQnKS5yZW1vdmVDbGFzcygnbG9hZGluZycpOwogICAgICAgIGVsLmZpbmQoJy5leHBhbmRlcicpLnN3aXRjaENsYXNzKCdpY29uLWNvbGxhcHNlZCcsICdpY29uLWV4cGFuZGVkJyk7CiAgICAgICAgdXBkYXRlU1ZHSWNvbihmb2xkZXJbMF0sICdmb2xkZXItb3BlbicpCiAgICAgICAgdG9nZ2xlRXhwZW5kQ29sbGFwc2VJY29uKGV4cGFuZGVyWzBdKTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gdHJ1ZTsKfQoKZnVuY3Rpb24gcmFuZG9tS2V5KHNpemUpIHsKICB2YXIgY2hhcnMgPSAnMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonOwogIHZhciBrZXkgPSAnJzsKICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykgewogICAga2V5ICs9IGNoYXJzLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGFycy5sZW5ndGgpKTsKICB9CiAgcmV0dXJuIGtleTsKfQoKZnVuY3Rpb24gY29weVRleHRUb0NsaXBib2FyZCh0YXJnZXQpIHsKICBpZiAodGFyZ2V0KSB7CiAgICB2YXIgdGVtcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7CiAgICB0ZW1wLnZhbHVlID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1jbGlwYm9hcmQtdGV4dCcpOwogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZW1wKTsKICAgIHRlbXAuc2VsZWN0KCk7CiAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpOwogICAgaWYgKHRlbXAucGFyZW50Tm9kZSkgewogICAgICB0ZW1wLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGVtcCk7CiAgICB9CiAgICBpZiAoJCh0YXJnZXQpLmNsb3Nlc3QoJy5kcmRuLmV4cGFuZGVkJykubGVuZ3RoKSB7CiAgICAgICQodGFyZ2V0KS5jbG9zZXN0KCcuZHJkbi5leHBhbmRlZCcpLnJlbW92ZUNsYXNzKCJleHBhbmRlZCIpOwogICAgfQogIH0KICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIHVwZGF0ZUlzc3VlRnJvbSh1cmwsIGVsKSB7CiAgJCgnI2FsbF9hdHRyaWJ1dGVzIGlucHV0LCAjYWxsX2F0dHJpYnV0ZXMgdGV4dGFyZWEsICNhbGxfYXR0cmlidXRlcyBzZWxlY3QnKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAkKHRoaXMpLmRhdGEoJ3ZhbHVlYmVmb3JldXBkYXRlJywgJCh0aGlzKS52YWwoKSk7CiAgfSk7CiAgaWYgKGVsKSB7CiAgICAkKCIjZm9ybV91cGRhdGVfdHJpZ2dlcmVkX2J5IikudmFsKCQoZWwpLmF0dHIoJ2lkJykpOwogIH0KICByZXR1cm4gJC5hamF4KHsKICAgIHVybDogdXJsLAogICAgdHlwZTogJ3Bvc3QnLAogICAgZGF0YTogJCgnI2lzc3VlLWZvcm0nKS5zZXJpYWxpemUoKQogIH0pOwp9CgpmdW5jdGlvbiByZXBsYWNlSXNzdWVGb3JtV2l0aChodG1sKXsKICB2YXIgcmVwbGFjZW1lbnQgPSAkKGh0bWwpOwogICQoJyNhbGxfYXR0cmlidXRlcyBpbnB1dCwgI2FsbF9hdHRyaWJ1dGVzIHRleHRhcmVhLCAjYWxsX2F0dHJpYnV0ZXMgc2VsZWN0JykuZWFjaChmdW5jdGlvbigpewogICAgdmFyIG9iamVjdF9pZCA9ICQodGhpcykuYXR0cignaWQnKTsKICAgIGlmIChvYmplY3RfaWQgJiYgJCh0aGlzKS5kYXRhKCd2YWx1ZWJlZm9yZXVwZGF0ZScpIT0kKHRoaXMpLnZhbCgpKSB7CiAgICAgIHJlcGxhY2VtZW50LmZpbmQoJyMnK29iamVjdF9pZCkudmFsKCQodGhpcykudmFsKCkpOwogICAgfQogIH0pOwogICQoJyNhbGxfYXR0cmlidXRlcycpLmVtcHR5KCk7CiAgJCgnI2FsbF9hdHRyaWJ1dGVzJykucHJlcGVuZChyZXBsYWNlbWVudCk7Cn0KCmZ1bmN0aW9uIHVwZGF0ZUJ1bGtFZGl0RnJvbSh1cmwpIHsKICAkLmFqYXgoewogICAgdXJsOiB1cmwsCiAgICB0eXBlOiAncG9zdCcsCiAgICBkYXRhOiAkKCcjYnVsa19lZGl0X2Zvcm0nKS5zZXJpYWxpemUoKQogIH0pOwp9CgpmdW5jdGlvbiBvYnNlcnZlQXV0b2NvbXBsZXRlRmllbGQoZmllbGRJZCwgdXJsLCBvcHRpb25zKSB7CiAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CiAgICAkKCcjJytmaWVsZElkKS5hdXRvY29tcGxldGUoJC5leHRlbmQoewogICAgICBzb3VyY2U6IHVybCwKICAgICAgbWluTGVuZ3RoOiAyLAogICAgICBwb3NpdGlvbjoge2NvbGxpc2lvbjogImZsaXBmaXQifSwKICAgICAgc2VhcmNoOiBmdW5jdGlvbigpeyQoJyMnK2ZpZWxkSWQpLmFkZENsYXNzKCdhamF4LWxvYWRpbmcnKTt9LAogICAgICByZXNwb25zZTogZnVuY3Rpb24oKXskKCcjJytmaWVsZElkKS5yZW1vdmVDbGFzcygnYWpheC1sb2FkaW5nJyk7fQogICAgfSwgb3B0aW9ucykpOwogICAgJCgnIycrZmllbGRJZCkuYWRkQ2xhc3MoJ2F1dG9jb21wbGV0ZScpOwogIH0pOwp9CgpmdW5jdGlvbiBtdWx0aXBsZUF1dG9jb21wbGV0ZUZpZWxkKGZpZWxkSWQsIHVybCwgb3B0aW9ucykgewogIGZ1bmN0aW9uIHNwbGl0KHZhbCkgewogICAgcmV0dXJuIHZhbC5zcGxpdCgvLFxzKi8pOwogIH0KCiAgZnVuY3Rpb24gZXh0cmFjdExhc3QodGVybSkgewogICAgcmV0dXJuIHNwbGl0KHRlcm0pLnBvcCgpOwogIH0KCiAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkgewogICAgJCgnIycgKyBmaWVsZElkKS5hdXRvY29tcGxldGUoJC5leHRlbmQoewogICAgICBzb3VyY2U6IGZ1bmN0aW9uIChyZXF1ZXN0LCByZXNwb25zZSkgewogICAgICAgICQuZ2V0SlNPTih1cmwsIHsKICAgICAgICAgIHRlcm06IGV4dHJhY3RMYXN0KHJlcXVlc3QudGVybSkKICAgICAgICB9LCByZXNwb25zZSk7CiAgICAgIH0sCiAgICAgIG1pbkxlbmd0aDogMiwKICAgICAgcG9zaXRpb246IHtjb2xsaXNpb246ICJmbGlwZml0In0sCiAgICAgIHNlYXJjaDogZnVuY3Rpb24gKCkgewogICAgICAgICQoJyMnICsgZmllbGRJZCkuYWRkQ2xhc3MoJ2FqYXgtbG9hZGluZycpOwogICAgICB9LAogICAgICByZXNwb25zZTogZnVuY3Rpb24gKCkgewogICAgICAgICQoJyMnICsgZmllbGRJZCkucmVtb3ZlQ2xhc3MoJ2FqYXgtbG9hZGluZycpOwogICAgICB9LAogICAgICBzZWxlY3Q6IGZ1bmN0aW9uIChldmVudCwgdWkpIHsKICAgICAgICB2YXIgdGVybXMgPSBzcGxpdCh0aGlzLnZhbHVlKTsKICAgICAgICAvLyByZW1vdmUgdGhlIGN1cnJlbnQgaW5wdXQKICAgICAgICB0ZXJtcy5wb3AoKTsKICAgICAgICAvLyBhZGQgdGhlIHNlbGVjdGVkIGl0ZW0KICAgICAgICB0ZXJtcy5wdXNoKHVpLml0ZW0udmFsdWUpOwogICAgICAgIC8vIGFkZCBwbGFjZWhvbGRlciB0byBnZXQgdGhlIGNvbW1hLWFuZC1zcGFjZSBhdCB0aGUgZW5kCiAgICAgICAgdGVybXMucHVzaCgiIik7CiAgICAgICAgdGhpcy52YWx1ZSA9IHRlcm1zLmpvaW4oIiwgIik7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9LCBvcHRpb25zKSk7CiAgICAkKCcjJyArIGZpZWxkSWQpLmFkZENsYXNzKCdhdXRvY29tcGxldGUnKTsKICB9KTsKfQoKZnVuY3Rpb24gb2JzZXJ2ZVNlYXJjaGZpZWxkKGZpZWxkSWQsIHRhcmdldElkLCB1cmwpIHsKICAkKCcjJytmaWVsZElkKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgdmFyICR0aGlzID0gJCh0aGlzKTsKICAgICR0aGlzLmFkZENsYXNzKCdhdXRvY29tcGxldGUnKTsKICAgICR0aGlzLmF0dHIoJ2RhdGEtdmFsdWUtd2FzJywgJHRoaXMudmFsKCkpOwogICAgdmFyIGNoZWNrID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciB2YWwgPSAkdGhpcy52YWwoKTsKICAgICAgaWYgKCR0aGlzLmF0dHIoJ2RhdGEtdmFsdWUtd2FzJykgIT0gdmFsKXsKICAgICAgICAkdGhpcy5hdHRyKCdkYXRhLXZhbHVlLXdhcycsIHZhbCk7CiAgICAgICAgJC5hamF4KHsKICAgICAgICAgIHVybDogdXJsLAogICAgICAgICAgdHlwZTogJ2dldCcsCiAgICAgICAgICBkYXRhOiB7cTogJHRoaXMudmFsKCl9LAogICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSl7IGlmKHRhcmdldElkKSAkKCcjJyt0YXJnZXRJZCkuaHRtbChkYXRhKTsgfSwKICAgICAgICAgIGJlZm9yZVNlbmQ6IGZ1bmN0aW9uKCl7ICR0aGlzLmFkZENsYXNzKCdhamF4LWxvYWRpbmcnKTsgfSwKICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpeyAkdGhpcy5yZW1vdmVDbGFzcygnYWpheC1sb2FkaW5nJyk7IH0KICAgICAgICB9KTsKICAgICAgfQogICAgfTsKICAgIHZhciByZXNldCA9IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGltZXIpIHsKICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsKICAgICAgICB0aW1lciA9IHNldEludGVydmFsKGNoZWNrLCAzMDApOwogICAgICB9CiAgICB9OwogICAgdmFyIHRpbWVyID0gc2V0SW50ZXJ2YWwoY2hlY2ssIDMwMCk7CiAgICAkdGhpcy5iaW5kKCdrZXl1cCBjbGljayBtb3VzZW1vdmUnLCByZXNldCk7CiAgfSk7Cn0KCiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCl7CiAgJCgiLmRyZG4gLmF1dG9jb21wbGV0ZSIpLnZhbCgnJyk7CgogIC8vIFRoaXMgdmFyaWFibGUgaXMgdXNlZCB0byBmb2N1cyBzZWxlY3RlZCBwcm9qZWN0CiAgdmFyIHNlbGVjdGVkOwogICQoZG9jdW1lbnQpLm9uKCdjbGljaycsICcuZHJkbi10cmlnZ2VyJywgZnVuY3Rpb24oZSl7CiAgICB2YXIgZHJkbiA9ICQodGhpcykuY2xvc2VzdCgiLmRyZG4iKTsKICAgIGlmIChkcmRuLmhhc0NsYXNzKCJleHBhbmRlZCIpKSB7CiAgICAgIGRyZG4ucmVtb3ZlQ2xhc3MoImV4cGFuZGVkIik7CiAgICB9IGVsc2UgewogICAgICAkKCIuZHJkbiIpLnJlbW92ZUNsYXNzKCJleHBhbmRlZCIpOwogICAgICBkcmRuLmFkZENsYXNzKCJleHBhbmRlZCIpOwogICAgICBpZiAoJCh0aGlzKS5wYXJlbnQoJyNwcm9qZWN0LWp1bXAnKS5sZW5ndGgpIHsKICAgICAgICBzZWxlY3RlZCA9ICQoJy5kcmRuLWl0ZW1zIGEuc2VsZWN0ZWQnKTsgLy8gU3RvcmUgc2VsZWN0ZWQgcHJvamVjdAogICAgICAgIHNlbGVjdGVkLmZpcnN0KCkuZm9jdXMoKTsgLy8gQ2FsbGluZyBmb2N1cyB0byBzY3JvbGwgdG8gc2VsZWN0ZWQgcHJvamVjdAogICAgICB9CiAgICAgIGlmICghaXNNb2JpbGUoKSkgewogICAgICAgIGRyZG4uZmluZCgiLmF1dG9jb21wbGV0ZSIpLmZvY3VzKCk7CiAgICAgIH0KICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgIH0KICB9KTsKICAkKGRvY3VtZW50KS5jbGljayhmdW5jdGlvbihlKXsKICAgIGlmICgkKGUudGFyZ2V0KS5jbG9zZXN0KCIuZHJkbiIpLmxlbmd0aCA8IDEpIHsKICAgICAgJCgiLmRyZG4uZXhwYW5kZWQiKS5yZW1vdmVDbGFzcygiZXhwYW5kZWQiKTsKICAgIH0KICB9KTsKCiAgb2JzZXJ2ZVNlYXJjaGZpZWxkKCdwcm9qZWN0cy1xdWljay1zZWFyY2gnLCBudWxsLCAkKCcjcHJvamVjdHMtcXVpY2stc2VhcmNoJykuZGF0YSgnYXV0b21jb21wbGV0ZS11cmwnKSk7CgogICQoIi5kcmRuLWNvbnRlbnQiKS5rZXlkb3duKGZ1bmN0aW9uKGV2ZW50KXsKICAgIHZhciBpdGVtcyA9ICQodGhpcykuZmluZCgiLmRyZG4taXRlbXMiKTsKCiAgICAvLyBJZiBhIHByb2plY3QgaXMgc2VsZWN0ZWQgc2V0IGZvY3VzZWQgdG8gc2VsZWN0ZWQgb25seSBvbmNlCiAgICBpZiAoc2VsZWN0ZWQgJiYgc2VsZWN0ZWQubGVuZ3RoID4gMCkgewogICAgICB2YXIgZm9jdXNlZCA9IHNlbGVjdGVkOwogICAgICBzZWxlY3RlZCA9IHVuZGVmaW5lZDsKICAgIH0KICAgIGVsc2UgewogICAgICB2YXIgZm9jdXNlZCA9IGl0ZW1zLmZpbmQoImE6Zm9jdXMiKTsKICAgIH0KICAgIHN3aXRjaCAoZXZlbnQud2hpY2gpIHsKICAgIGNhc2UgNDA6IC8vZG93bgogICAgICBpZiAoZm9jdXNlZC5sZW5ndGggPiAwKSB7CiAgICAgICAgZm9jdXNlZC5uZXh0QWxsKCJhIikuZmlyc3QoKS5mb2N1cygpOzsKICAgICAgfSBlbHNlIHsKICAgICAgICBpdGVtcy5maW5kKCJhIikuZmlyc3QoKS5mb2N1cygpOzsKICAgICAgfQogICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBicmVhazsKICAgIGNhc2UgMzg6IC8vdXAKICAgICAgaWYgKGZvY3VzZWQubGVuZ3RoID4gMCkgewogICAgICAgIHZhciBwcmV2ID0gZm9jdXNlZC5wcmV2QWxsKCJhIik7CiAgICAgICAgaWYgKHByZXYubGVuZ3RoID4gMCkgewogICAgICAgICAgcHJldi5maXJzdCgpLmZvY3VzKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICQodGhpcykuZmluZCgiLmF1dG9jb21wbGV0ZSIpLmZvY3VzKCk7CiAgICAgICAgfQogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlIDM1OiAvL2VuZAogICAgICBpZiAoZm9jdXNlZC5sZW5ndGggPiAwKSB7CiAgICAgICAgZm9jdXNlZC5uZXh0QWxsKCJhIikubGFzdCgpLmZvY3VzKCk7CiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgMzY6IC8vaG9tZQogICAgICBpZiAoZm9jdXNlZC5sZW5ndGggPiAwKSB7CiAgICAgICAgZm9jdXNlZC5wcmV2QWxsKCJhIikubGFzdCgpLmZvY3VzKCk7CiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgfQogICAgICBicmVhazsKICAgIH0KICB9KTsKfSk7CgpmdW5jdGlvbiBiZWZvcmVTaG93RGF0ZVBpY2tlcihpbnB1dCwgaW5zdCkgewogIHZhciBkZWZhdWx0X2RhdGUgPSBudWxsOwogIHN3aXRjaCAoJChpbnB1dCkuYXR0cigiaWQiKSkgewogICAgY2FzZSAiaXNzdWVfc3RhcnRfZGF0ZSIgOgogICAgICBpZiAoJCgiI2lzc3VlX2R1ZV9kYXRlIikubGVuZ3RoID4gMCkgewogICAgICAgIGRlZmF1bHRfZGF0ZSA9ICQoIiNpc3N1ZV9kdWVfZGF0ZSIpLnZhbCgpOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSAiaXNzdWVfZHVlX2RhdGUiIDoKICAgICAgaWYgKCQoIiNpc3N1ZV9zdGFydF9kYXRlIikubGVuZ3RoID4gMCkgewogICAgICAgIHZhciBzdGFydF9kYXRlID0gJCgiI2lzc3VlX3N0YXJ0X2RhdGUiKS52YWwoKTsKICAgICAgICBpZiAoc3RhcnRfZGF0ZSAhPSAiIikgewogICAgICAgICAgc3RhcnRfZGF0ZSA9IG5ldyBEYXRlKERhdGUucGFyc2Uoc3RhcnRfZGF0ZSkpOwogICAgICAgICAgaWYgKHN0YXJ0X2RhdGUgPiBuZXcgRGF0ZSgpKSB7CiAgICAgICAgICAgIGRlZmF1bHRfZGF0ZSA9ICQoIiNpc3N1ZV9zdGFydF9kYXRlIikudmFsKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGJyZWFrOwogIH0KICAkKGlucHV0KS5kYXRlcGlja2VyRmFsbGJhY2soIm9wdGlvbiIsICJkZWZhdWx0RGF0ZSIsIGRlZmF1bHRfZGF0ZSk7Cn0KCihmdW5jdGlvbigkKXsKICAkLmZuLnBvc2l0aW9uZWRJdGVtcyA9IGZ1bmN0aW9uKHNvcnRhYmxlT3B0aW9ucywgb3B0aW9ucyl7CiAgICB2YXIgc2V0dGluZ3MgPSAkLmV4dGVuZCh7CiAgICAgIGZpcnN0UG9zaXRpb246IDEKICAgIH0sIG9wdGlvbnMgKTsKCiAgICByZXR1cm4gdGhpcy5zb3J0YWJsZSgkLmV4dGVuZCh7CiAgICAgIGF4aXM6ICd5JywKICAgICAgaGFuZGxlOiAiLnNvcnQtaGFuZGxlIiwKICAgICAgaGVscGVyOiBmdW5jdGlvbihldmVudCwgdWkpewogICAgICAgIHVpLmNoaWxkcmVuKCd0ZCcpLmVhY2goZnVuY3Rpb24oKXsKICAgICAgICAgICQodGhpcykud2lkdGgoJCh0aGlzKS53aWR0aCgpKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gdWk7CiAgICAgIH0sCiAgICAgIHVwZGF0ZTogZnVuY3Rpb24oZXZlbnQsIHVpKSB7CiAgICAgICAgdmFyIHNvcnRhYmxlID0gJCh0aGlzKTsKICAgICAgICB2YXIgaGFuZGxlID0gdWkuaXRlbS5maW5kKCIuc29ydC1oYW5kbGUiKS5hZGRDbGFzcygiYWpheC1sb2FkaW5nIik7CiAgICAgICAgdmFyIHVybCA9IGhhbmRsZS5kYXRhKCJyZW9yZGVyLXVybCIpOwogICAgICAgIHZhciBwYXJhbSA9IGhhbmRsZS5kYXRhKCJyZW9yZGVyLXBhcmFtIik7CiAgICAgICAgdmFyIGRhdGEgPSB7fTsKICAgICAgICBkYXRhW3BhcmFtXSA9IHtwb3NpdGlvbjogdWkuaXRlbS5pbmRleCgpICsgc2V0dGluZ3NbJ2ZpcnN0UG9zaXRpb24nXX07CiAgICAgICAgJC5hamF4KHsKICAgICAgICAgIHVybDogdXJsLAogICAgICAgICAgdHlwZTogJ3B1dCcsCiAgICAgICAgICBkYXRhVHlwZTogJ3NjcmlwdCcsCiAgICAgICAgICBkYXRhOiBkYXRhLAogICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bil7CiAgICAgICAgICAgIGFsZXJ0KGpxWEhSLnN0YXR1cyk7CiAgICAgICAgICAgIHNvcnRhYmxlLnNvcnRhYmxlKCJjYW5jZWwiKTsKICAgICAgICAgIH0sCiAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKXsKICAgICAgICAgICAgaGFuZGxlLnJlbW92ZUNsYXNzKCJhamF4LWxvYWRpbmciKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfSwKICAgIH0sIHNvcnRhYmxlT3B0aW9ucykpOwogIH0KfSggalF1ZXJ5ICkpOwoKdmFyIHdhcm5MZWF2aW5nVW5zYXZlZE1lc3NhZ2U7CmZ1bmN0aW9uIHdhcm5MZWF2aW5nVW5zYXZlZChtZXNzYWdlKSB7CiAgd2FybkxlYXZpbmdVbnNhdmVkTWVzc2FnZSA9IG1lc3NhZ2U7CiAgJChkb2N1bWVudCkub24oJ3N1Ym1pdCcsICdmb3JtJywgZnVuY3Rpb24oKXsKICAgICQoJ3RleHRhcmVhJykucmVtb3ZlRGF0YSgnY2hhbmdlZCcpOwogIH0pOwogICQoZG9jdW1lbnQpLm9uKCdjaGFuZ2UnLCAndGV4dGFyZWEnLCBmdW5jdGlvbigpewogICAgJCh0aGlzKS5kYXRhKCdjaGFuZ2VkJywgJ2NoYW5nZWQnKTsKICB9KTsKICB3aW5kb3cub25iZWZvcmV1bmxvYWQgPSBmdW5jdGlvbigpewogICAgdmFyIHdhcm4gPSBmYWxzZTsKICAgICQoJ3RleHRhcmVhJykuYmx1cigpLmVhY2goZnVuY3Rpb24oKXsKICAgICAgaWYgKCQodGhpcykuZGF0YSgnY2hhbmdlZCcpKSB7CiAgICAgICAgd2FybiA9IHRydWU7CiAgICAgIH0KICAgIH0pOwogICAgaWYgKHdhcm4pIHtyZXR1cm4gd2FybkxlYXZpbmdVbnNhdmVkTWVzc2FnZTt9CiAgfTsKfQoKZnVuY3Rpb24gc2V0dXBBamF4SW5kaWNhdG9yKCkgewogICQoZG9jdW1lbnQpLmJpbmQoJ2FqYXhTZW5kJywgZnVuY3Rpb24oZXZlbnQsIHhociwgc2V0dGluZ3MpIHsKICAgIGlmICgkKCcuYWpheC1sb2FkaW5nJykubGVuZ3RoID09PSAwICYmIHNldHRpbmdzLmNvbnRlbnRUeXBlICE9ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKSB7CiAgICAgICQoJyNhamF4LWluZGljYXRvcicpLnNob3coKTsKICAgIH0KICB9KTsKICAkKGRvY3VtZW50KS5iaW5kKCdhamF4U3RvcCcsIGZ1bmN0aW9uKCkgewogICAgJCgnI2FqYXgtaW5kaWNhdG9yJykuaGlkZSgpOwogIH0pOwp9CgpmdW5jdGlvbiBzZXR1cFRhYnMoKSB7CiAgaWYoJCgnLnRhYnMnKS5sZW5ndGggPiAwKSB7CiAgICBkaXNwbGF5VGFic0J1dHRvbnMoKTsKICAgICQod2luZG93KS5yZXNpemUoZGlzcGxheVRhYnNCdXR0b25zKTsKICB9Cn0KCmZ1bmN0aW9uIHNldHVwRmlsZVByZXZpZXdOYXZpZ2F0aW9uKCkgewogIC8vIG9ubHkgYmluZCBhcnJvdyBrZXlzIHdoZW4gcHJldmlldyBuYXZpZ2F0aW9uIGlzIHByZXNlbnQKICBjb25zdCBlbGVtZW50ID0gJCgnLnBhZ2luYXRpb24uZmlsZXByZXZpZXcnKS5maXJzdCgpOwogIGlmIChlbGVtZW50KSB7CgogICAgY29uc3QgaGFuZGxlQXJyb3dLZXkgPSBmdW5jdGlvbihzZWxlY3RvciwgZSl7CiAgICAgIGNvbnN0IGhyZWYgPSAkKGVsZW1lbnQpLmZpbmQoc2VsZWN0b3IpLmF0dHIoJ2hyZWYnKTsKICAgICAgaWYgKGhyZWYpIHsKICAgICAgICB3aW5kb3cubG9jYXRpb24gPSBocmVmOwogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgfQogICAgfTsKCiAgICAkKGRvY3VtZW50KS5rZXlkb3duKGZ1bmN0aW9uKGUpIHsKICAgICAgaWYoZS5zaGlmdEtleSB8fCBlLm1ldGFLZXkgfHwgZS5jdHJsS2V5IHx8IGUuYWx0S2V5KSByZXR1cm47CiAgICAgIHN3aXRjaChlLmtleSkgewogICAgICAgIGNhc2UgJ0Fycm93TGVmdCc6CiAgICAgICAgICBoYW5kbGVBcnJvd0tleSgnLnByZXZpb3VzIGEnLCBlKTsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdBcnJvd1JpZ2h0JzoKICAgICAgICAgIGhhbmRsZUFycm93S2V5KCcubmV4dCBhJywgZSk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfSk7CiAgfQp9CgokKGRvY3VtZW50KS5vbigna2V5ZG93bicsICdmb3JtIHRleHRhcmVhJywgZnVuY3Rpb24oZSkgewogIC8vIFN1Ym1pdCB0aGUgZm9ybSB3aXRoIEN0cmwgKyBFbnRlciBvciBDb21tYW5kICsgUmV0dXJuCiAgdmFyIHRhcmdldEZvcm0gPSAkKGUudGFyZ2V0KS5jbG9zZXN0KCdmb3JtJyk7CiAgaWYoZS5rZXlDb2RlID09IDEzICYmICgoZS5jdHJsS2V5ICYmICFlLm1ldGFLZXkpIHx8ICghZS5jdHJsS2V5ICYmIGUubWV0YUtleSkgJiYgdGFyZ2V0Rm9ybS5sZW5ndGgpKSB7CiAgICAvLyBGb3IgYWpheCwgdXNlIGNsaWNrKCkgaW5zdGVhZCBvZiBzdWJtaXQoKSB0byBwcmV2ZW50ICJJbnZhbGlkIGZvcm0gYXV0aGVudGljaXR5IHRva2VuIiBlcnJvcgogICAgaWYgKHRhcmdldEZvcm0uYXR0cignZGF0YS1yZW1vdGUnKSA9PSAndHJ1ZScpIHsKICAgICAgaWYgKHRhcmdldEZvcm0uZmluZCgnaW5wdXRbdHlwZT1zdWJtaXRdJykubGVuZ3RoID09PSAwKSB7IHJldHVybiBmYWxzZTsgfQogICAgICB0YXJnZXRGb3JtLmZpbmQoJ3RleHRhcmVhJykuYmx1cigpLnJlbW92ZURhdGEoJ2NoYW5nZWQnKTsKICAgICAgdGFyZ2V0Rm9ybS5maW5kKCdpbnB1dFt0eXBlPXN1Ym1pdF0nKS5maXJzdCgpLmNsaWNrKCk7CiAgICB9IGVsc2UgewogICAgICB0YXJnZXRGb3JtLmZpbmQoJ3RleHRhcmVhJykuYmx1cigpLnJlbW92ZURhdGEoJ2NoYW5nZWQnKTsKICAgICAgdGFyZ2V0Rm9ybS5zdWJtaXQoKTsKICAgIH0KICB9Cn0pOwoKCmZ1bmN0aW9uIGhpZGVPbkxvYWQoKSB7CiAgJCgnLmhvbCcpLmhpZGUoKTsKfQoKZnVuY3Rpb24gYWRkRm9ybU9ic2VydmVyc0ZvckRvdWJsZVN1Ym1pdCgpIHsKICAkKCdmb3JtW21ldGhvZD1wb3N0XScpLmVhY2goZnVuY3Rpb24oKSB7CiAgICBpZiAoISQodGhpcykuaGFzQ2xhc3MoJ211bHRpcGxlLXN1Ym1pdCcpKSB7CiAgICAgICQodGhpcykuc3VibWl0KGZ1bmN0aW9uKGZvcm1fc3VibWlzc2lvbikgewogICAgICAgIGlmICgkKGZvcm1fc3VibWlzc2lvbi50YXJnZXQpLmF0dHIoJ2RhdGEtc3VibWl0dGVkJykpIHsKICAgICAgICAgIGZvcm1fc3VibWlzc2lvbi5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAkKGZvcm1fc3VibWlzc2lvbi50YXJnZXQpLmF0dHIoJ2RhdGEtc3VibWl0dGVkJywgdHJ1ZSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gZGVmYXVsdEZvY3VzKCl7CiAgaWYgKCgkKCcjY29udGVudCA6Zm9jdXMnKS5sZW5ndGggPT0gMCkgJiYgKHdpbmRvdy5sb2NhdGlvbi5oYXNoID09ICcnKSkgewogICAgJCgnI2NvbnRlbnQgaW5wdXRbdHlwZT10ZXh0XTp2aXNpYmxlLCAjY29udGVudCB0ZXh0YXJlYTp2aXNpYmxlJykuZmlyc3QoKS5mb2N1cygpOwogIH0KfQoKZnVuY3Rpb24gYmxvY2tFdmVudFByb3BhZ2F0aW9uKGV2ZW50KSB7CiAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKfQoKZnVuY3Rpb24gdG9nZ2xlRGlzYWJsZWRPbkNoYW5nZSgpIHsKICB2YXIgY2hlY2tlZCA9ICQodGhpcykuaXMoJzpjaGVja2VkJyk7CiAgJCgkKHRoaXMpLmRhdGEoJ2Rpc2FibGVzJykpLmF0dHIoJ2Rpc2FibGVkJywgY2hlY2tlZCk7CiAgJCgkKHRoaXMpLmRhdGEoJ2VuYWJsZXMnKSkuYXR0cignZGlzYWJsZWQnLCAhY2hlY2tlZCk7CiAgJCgkKHRoaXMpLmRhdGEoJ3Nob3dzJykpLnRvZ2dsZShjaGVja2VkKTsKfQpmdW5jdGlvbiB0b2dnbGVEaXNhYmxlZEluaXQoKSB7CiAgJCgnaW5wdXRbZGF0YS1kaXNhYmxlc10sIGlucHV0W2RhdGEtZW5hYmxlc10sIGlucHV0W2RhdGEtc2hvd3NdJykuZWFjaCh0b2dnbGVEaXNhYmxlZE9uQ2hhbmdlKTsKfQpmdW5jdGlvbiB0b2dnbGVNdWx0aVNlbGVjdEljb25Jbml0KCkgewogICQoJy50b2dnbGUtbXVsdGlzZWxlY3Q6bm90KC5pY29uLXRvZ2dsZS1taW51cyk6bm90KC5pY29uLXRvZ2dsZS1wbHVzKScpLmVhY2goZnVuY3Rpb24oKXsKICAgIGxldCBpY29uVHlwZTsKICAgIGlmICgkKHRoaXMpLnNpYmxpbmdzKCdzZWxlY3QnKS5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS5sZW5ndGggPiAxKSB7CiAgICAgIGljb25UeXBlID0gJ3RvZ2dsZS1taW51cyc7CiAgICB9IGVsc2UgewogICAgICBpY29uVHlwZSA9ICd0b2dnbGUtcGx1cyc7CiAgICB9CgogICAgJCh0aGlzKS5hZGRDbGFzcyhgaWNvbi0ke2ljb25UeXBlfWApOwogICAgdXBkYXRlU1ZHSWNvbigkKHRoaXMpLmZpbmQoJ3N2ZycpWzBdLCBpY29uVHlwZSk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHRvZ2dsZU5ld09iamVjdERyb3Bkb3duKCkgewogIHZhciBkcm9wZG93biA9ICQoJyNuZXctb2JqZWN0ICsgdWwubWVudS1jaGlsZHJlbicpOwogIGlmKGRyb3Bkb3duLmhhc0NsYXNzKCd2aXNpYmxlJykpewogICAgZHJvcGRvd24ucmVtb3ZlQ2xhc3MoJ3Zpc2libGUnKTsKICB9ZWxzZXsKICAgIGRyb3Bkb3duLmFkZENsYXNzKCd2aXNpYmxlJyk7CiAgfQp9CgooZnVuY3Rpb24gKCAkICkgewoKICAvLyBkZXRlY3QgaWYgbmF0aXZlIGRhdGUgaW5wdXQgaXMgc3VwcG9ydGVkCiAgdmFyIG5hdGl2ZURhdGVJbnB1dFN1cHBvcnRlZCA9IHRydWU7CgogIHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7CiAgaW5wdXQuc2V0QXR0cmlidXRlKCd0eXBlJywnZGF0ZScpOwogIGlmIChpbnB1dC50eXBlID09PSAndGV4dCcpIHsKICAgIG5hdGl2ZURhdGVJbnB1dFN1cHBvcnRlZCA9IGZhbHNlOwogIH0KCiAgdmFyIG5vdEFEYXRlVmFsdWUgPSAnbm90LWEtZGF0ZSc7CiAgaW5wdXQuc2V0QXR0cmlidXRlKCd2YWx1ZScsIG5vdEFEYXRlVmFsdWUpOwogIGlmIChpbnB1dC52YWx1ZSA9PT0gbm90QURhdGVWYWx1ZSkgewogICAgbmF0aXZlRGF0ZUlucHV0U3VwcG9ydGVkID0gZmFsc2U7CiAgfQoKICAkLmZuLmRhdGVwaWNrZXJGYWxsYmFjayA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewogICAgaWYgKG5hdGl2ZURhdGVJbnB1dFN1cHBvcnRlZCkgewogICAgICByZXR1cm4gdGhpczsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0aGlzLmRhdGVwaWNrZXIoIG9wdGlvbnMgKTsKICAgIH0KICB9Owp9KCBqUXVlcnkgKSk7CgokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICQoJyNjb250ZW50Jykub24oJ2NoYW5nZScsICdpbnB1dFtkYXRhLWRpc2FibGVzXSwgaW5wdXRbZGF0YS1lbmFibGVzXSwgaW5wdXRbZGF0YS1zaG93c10nLCB0b2dnbGVEaXNhYmxlZE9uQ2hhbmdlKTsKICB0b2dnbGVEaXNhYmxlZEluaXQoKTsKCiAgJCgnI2NvbnRlbnQnKS5vbignY2xpY2snLCAnLnRvZ2dsZS1tdWx0aXNlbGVjdCcsIGZ1bmN0aW9uKCkgewogICAgdG9nZ2xlTXVsdGlTZWxlY3QoJCh0aGlzKS5zaWJsaW5ncygnc2VsZWN0JykpOwogICAgJCh0aGlzKS50b2dnbGVDbGFzcygnaWNvbi10b2dnbGUtcGx1cyBpY29uLXRvZ2dsZS1taW51cycpOwogICAgdXBkYXRlU1ZHSWNvbigkKHRoaXMpLmZpbmQoJ3N2ZycpWzBdLCAkKHRoaXMpLmhhc0NsYXNzKCdpY29uLXRvZ2dsZS1wbHVzJykgPyAndG9nZ2xlLXBsdXMnIDogJ3RvZ2dsZS1taW51cycpOwogIH0pOwogIHRvZ2dsZU11bHRpU2VsZWN0SWNvbkluaXQoKTsKCiAgJCgnI2hpc3RvcnkgLnRhYnMnKS5vbignY2xpY2snLCAnYScsIGZ1bmN0aW9uKGUpewogICAgdmFyIHRhYiA9ICQoZS50YXJnZXQpLmF0dHIoJ2lkJykucmVwbGFjZSgndGFiLScsJycpOwogICAgZG9jdW1lbnQuY29va2llID0gJ2hpc3RvcnlfbGFzdF90YWI9JyArIHRhYiArICc7IFNhbWVTaXRlPUxheCcKICB9KTsKfSk7CgokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICQoJyNjb250ZW50Jykub24oJ2NsaWNrJywgJ2Rpdi5qc3RUYWJzIGEudGFiLXByZXZpZXcnLCBmdW5jdGlvbihldmVudCl7CiAgICB2YXIgdGFiID0gJChldmVudC50YXJnZXQpOwoKICAgIHZhciB1cmwgPSB0YWIuZGF0YSgndXJsJyk7CiAgICB2YXIgZm9ybSA9IHRhYi5wYXJlbnRzKCdmb3JtJyk7CiAgICB2YXIganN0QmxvY2sgPSB0YWIucGFyZW50cygnLmpzdEJsb2NrJyk7CgogICAgdmFyIGVsZW1lbnQgPSBlbmNvZGVVUklDb21wb25lbnQoanN0QmxvY2suZmluZCgnLndpa2ktZWRpdCcpLnZhbCgpKTsKICAgIHZhciBhdHRhY2htZW50cyA9IGZvcm0uZmluZCgnLmF0dGFjaG1lbnRzX2ZpZWxkcyBpbnB1dCcpLnNlcmlhbGl6ZSgpOwoKICAgICQuYWpheCh7CiAgICAgIHVybDogdXJsLAogICAgICB0eXBlOiAncG9zdCcsCiAgICAgIGRhdGE6ICJ0ZXh0PSIgKyBlbGVtZW50ICsgJyYnICsgYXR0YWNobWVudHMsCiAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpewogICAgICAgIGpzdEJsb2NrLmZpbmQoJy53aWtpLXByZXZpZXcnKS5odG1sKGRhdGEpOwogICAgICAgIHNldHVwV2lraVRhYmxlU29ydGFibGVIZWFkZXIoKTsKICAgICAgfQogICAgfSk7CiAgfSk7Cn0pOwoKZnVuY3Rpb24ga2VlcEFuY2hvck9uU2lnbkluKGZvcm0pewogIHZhciBoYXNoID0gZGVjb2RlVVJJQ29tcG9uZW50KHNlbGYuZG9jdW1lbnQubG9jYXRpb24uaGFzaCk7CiAgaWYgKGhhc2gpIHsKICAgIGlmIChoYXNoLmluZGV4T2YoIiMiKSA9PT0gLTEpIHsKICAgICAgaGFzaCA9ICIjIiArIGhhc2g7CiAgICB9CiAgICBmb3JtLmFjdGlvbiA9IGZvcm0uYWN0aW9uICsgaGFzaDsKICB9CiAgcmV0dXJuIHRydWU7Cn0KCiQoZnVuY3Rpb24gKCQpIHsKICAkKCcjYXV0aF9zb3VyY2VfbGRhcF9tb2RlJykuY2hhbmdlKGZ1bmN0aW9uICgpIHsKICAgICQoJy5sZGFwc193YXJuaW5nJykudG9nZ2xlKCQodGhpcykudmFsKCkgIT0gJ2xkYXBzX3ZlcmlmeV9wZWVyJyk7CiAgfSkuY2hhbmdlKCk7Cn0pOwoKZnVuY3Rpb24gc2V0RmlsZWNvbnRlbnRDb250YWluZXJIZWlnaHQoKSB7CiAgdmFyICRmaWxlY29udGFpbmVyID0gJCgnLmZpbGVjb250ZW50LWNvbnRhaW5lcicpOwogIHZhciBmaWxlVHlwZVNlbGVjdG9ycyA9IFsnLmltYWdlJywgJ3ZpZGVvJ107CgogIGlmKCRmaWxlY29udGFpbmVyLmxlbmd0aCA+IDAgJiYgJGZpbGVjb250YWluZXIuZmluZChmaWxlVHlwZVNlbGVjdG9ycy5qb2luKCcsJykpLmxlbmd0aCA9PT0gMSkgewogICAgdmFyIGNvbnRhaW5lck9mZnNldFRvcCA9ICRmaWxlY29udGFpbmVyLm9mZnNldCgpLnRvcDsKICAgIHZhciBjb250YWluZXJNYXJnaW5Cb3R0b20gPSBwYXJzZUludCgkZmlsZWNvbnRhaW5lci5jc3MoJ21hcmdpbkJvdHRvbScpKTsKICAgIHZhciBwYWdpbmF0aW9uSGVpZ2h0ID0gJGZpbGVjb250YWluZXIubmV4dCgnLnBhZ2luYXRpb24nKS5oZWlnaHQoKTsKICAgIHZhciBkaWZmID0gY29udGFpbmVyT2Zmc2V0VG9wICsgY29udGFpbmVyTWFyZ2luQm90dG9tICsgcGFnaW5hdGlvbkhlaWdodDsKCiAgICAkZmlsZWNvbnRhaW5lci5jc3MoJ2hlaWdodCcsICdjYWxjKDEwMHZoIC0gJyArIGRpZmYgKyAncHgpJykKICB9Cn0KCmZ1bmN0aW9uIHNldHVwQXR0YWNobWVudERldGFpbCgpIHsKICBzZXRGaWxlY29udGVudENvbnRhaW5lckhlaWdodCgpOwogICQod2luZG93KS5yZXNpemUoc2V0RmlsZWNvbnRlbnRDb250YWluZXJIZWlnaHQpOwp9CgpmdW5jdGlvbiBzZXR1cFdpa2lUYWJsZVNvcnRhYmxlSGVhZGVyKCkgewogICQoJ2Rpdi53aWtpIHRhYmxlJykuZWFjaChmdW5jdGlvbihpLCB0YWJsZSl7CiAgICBpZiAodGFibGUucm93cy5sZW5ndGggPCAzKSByZXR1cm4gdHJ1ZTsKICAgIHZhciB0ciA9ICQodGFibGUucm93cykuZmlyc3QoKTsKICAgIGlmICh0ci5maW5kKCJUSCIpLmxlbmd0aCA+IDApIHsKICAgICAgdHIuYXR0cignZGF0YS1zb3J0LW1ldGhvZCcsICdub25lJyk7CiAgICAgIHRyLmZpbmQoIlREIikuYXR0cignZGF0YS1zb3J0LW1ldGhvZCcsICdub25lJyk7CiAgICAgIG5ldyBUYWJsZXNvcnQodGFibGUpOwogICAgfQogIH0pOwp9CgokKGZ1bmN0aW9uICgpIHsKICAkKCJbdGl0bGVdOm5vdCgubm8tdG9vbHRpcCkiKS50b29sdGlwKHsKICAgIHNob3c6IHsKICAgICAgZGVsYXk6IDQwMAogICAgfSwKICAgIHBvc2l0aW9uOiB7CiAgICAgIG15OiAiY2VudGVyIGJvdHRvbS01IiwKICAgICAgYXQ6ICJjZW50ZXIgdG9wIgogICAgfQogIH0pOwp9KTsKCmZ1bmN0aW9uIGlubGluZUF1dG9Db21wbGV0ZShlbGVtZW50KSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gZG8gbm90IGF0dGFjaCBpZiBUcmlidXRlIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQKICAgIGlmIChlbGVtZW50LmRhdGFzZXQudHJpYnV0ZSA9PT0gJ3RydWUnKSB7cmV0dXJufTsKCiAgICBjb25zdCBnZXREYXRhU291cmNlID0gZnVuY3Rpb24oZW50aXR5KSB7CiAgICAgIGNvbnN0IGRhdGFTb3VyY2VzID0gcm0uQXV0b0NvbXBsZXRlLmRhdGFTb3VyY2VzOwoKICAgICAgaWYgKGRhdGFTb3VyY2VzW2VudGl0eV0pIHsKICAgICAgICByZXR1cm4gZGF0YVNvdXJjZXNbZW50aXR5XTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KCiAgICBjb25zdCByZW1vdGVTZWFyY2ggPSBmdW5jdGlvbih1cmwsIGNiKSB7CiAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkKICAgICAgewogICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkgewogICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7CiAgICAgICAgICAgIGNiKGRhdGEpOwogICAgICAgICAgfSBlbHNlIGlmICh4aHIuc3RhdHVzID09PSA0MDMpIHsKICAgICAgICAgICAgY2IoW10pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfTsKICAgICAgeGhyLm9wZW4oIkdFVCIsIHVybCwgdHJ1ZSk7CiAgICAgIHhoci5zZW5kKCk7CiAgICB9OwoKICAgIGNvbnN0IHRyaWJ1dGUgPSBuZXcgVHJpYnV0ZSh7CiAgICAgIGNvbGxlY3Rpb246IFsKICAgICAgICB7CiAgICAgICAgICB0cmlnZ2VyOiAnIycsCiAgICAgICAgICB2YWx1ZXM6IGZ1bmN0aW9uICh0ZXh0LCBjYikgewogICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0LnR5cGUgPT09ICd0ZXh0JyAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZSgnYXV0b2NvbXBsZXRlJykgIT0gJ29mZicpIHsKICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXV0b2NvbXBsZXRlJywgJ29mZicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFdoZW4gdHJpZ2dlcmVkIHdpdGggdGV4dCBzdGFydGluZyB3aXRoICIjIyIsIGxpa2UgIiMjYSIsIHRoZSBzZWFyY2ggdGVybSB3aWxsIGJlY29tZSAiI2EiLAogICAgICAgICAgICAvLyBjYXVzaW5nIHRoZSBTUUwgcXVlcnkgdG8gZmFpbCBpbiBmaW5kaW5nIGlzc3VlcyB3aXRoICJhIiBpbiB0aGUgc3ViamVjdC4KICAgICAgICAgICAgLy8gVG8gYXZvaWQgdGhpcywgcmVtb3ZlIHRoZSBmaXJzdCAiIyIgZnJvbSB0aGUgc2VhcmNoIHRlcm0uCiAgICAgICAgICAgIGlmICh0ZXh0KSB7CiAgICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXiMvLCAnJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVtb3RlU2VhcmNoKGdldERhdGFTb3VyY2UoJ2lzc3VlcycpICsgZW5jb2RlVVJJQ29tcG9uZW50KHRleHQpLCBmdW5jdGlvbiAoaXNzdWVzKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGNiKGlzc3Vlcyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIGxvb2t1cDogJ2xhYmVsJywKICAgICAgICAgIGZpbGxBdHRyOiAnbGFiZWwnLAogICAgICAgICAgcmVxdWlyZUxlYWRpbmdTcGFjZTogdHJ1ZSwKICAgICAgICAgIHNlbGVjdFRlbXBsYXRlOiBmdW5jdGlvbiAoaXNzdWUpIHsKICAgICAgICAgICAgbGV0IGxlYWRpbmdIYXNoID0gIiMiCiAgICAgICAgICAgIC8vIGtlZXAgIyMgc3ludGF4IHdoaWNoIGlzIGEgdmFsaWQgaXNzdWUgc3ludGF4IHRvIHNob3cgaXNzdWUgd2l0aCB0aXRsZS4KICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudE1lbnRpb25UZXh0U25hcHNob3QuY2hhckF0KDApID09PSAiIyIpIHsKICAgICAgICAgICAgICBsZWFkaW5nSGFzaCA9ICIjIyIKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbGVhZGluZ0hhc2ggKyBpc3N1ZS5vcmlnaW5hbC5pZDsKICAgICAgICAgIH0sCiAgICAgICAgICBtZW51SXRlbVRlbXBsYXRlOiBmdW5jdGlvbiAoaXNzdWUpIHsKICAgICAgICAgICAgcmV0dXJuIHNhbml0aXplSFRNTChpc3N1ZS5vcmlnaW5hbC5sYWJlbCk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICB0cmlnZ2VyOiAnW1snLAogICAgICAgICAgdmFsdWVzOiBmdW5jdGlvbiAodGV4dCwgY2IpIHsKICAgICAgICAgICAgcmVtb3RlU2VhcmNoKGdldERhdGFTb3VyY2UoJ3dpa2lfcGFnZXMnKSArIGVuY29kZVVSSUNvbXBvbmVudCh0ZXh0KSwgZnVuY3Rpb24gKHdpa2lQYWdlcykgewogICAgICAgICAgICAgIHJldHVybiBjYih3aWtpUGFnZXMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICBsb29rdXA6ICdsYWJlbCcsCiAgICAgICAgICBmaWxsQXR0cjogJ2xhYmVsJywKICAgICAgICAgIHJlcXVpcmVMZWFkaW5nU3BhY2U6IHRydWUsCiAgICAgICAgICBzZWxlY3RUZW1wbGF0ZTogZnVuY3Rpb24gKHdpa2lQYWdlKSB7CiAgICAgICAgICAgIHJldHVybiAnW1snICsgd2lraVBhZ2Uub3JpZ2luYWwudmFsdWUgKyAnXV0nOwogICAgICAgICAgfSwKICAgICAgICAgIG1lbnVJdGVtVGVtcGxhdGU6IGZ1bmN0aW9uICh3aWtpUGFnZSkgewogICAgICAgICAgICByZXR1cm4gc2FuaXRpemVIVE1MKHdpa2lQYWdlLm9yaWdpbmFsLmxhYmVsKTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIHRyaWdnZXI6ICdAJywKICAgICAgICAgIGxvb2t1cDogZnVuY3Rpb24gKHVzZXIsIG1lbnRpb25UZXh0KSB7CiAgICAgICAgICAgIHJldHVybiB1c2VyLm5hbWUgKyB1c2VyLmZpcnN0bmFtZSArIHVzZXIubGFzdG5hbWUgKyB1c2VyLmxvZ2luOwogICAgICAgICAgfSwKICAgICAgICAgIHZhbHVlczogZnVuY3Rpb24gKHRleHQsIGNiKSB7CiAgICAgICAgICAgIGNvbnN0IHVybCA9IGdldERhdGFTb3VyY2UoJ3VzZXJzJyk7CiAgICAgICAgICAgIGlmICh1cmwpIHsKICAgICAgICAgICAgICByZW1vdGVTZWFyY2godXJsICsgZW5jb2RlVVJJQ29tcG9uZW50KHRleHQpLCBmdW5jdGlvbiAodXNlcnMpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjYih1c2Vycyk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICBtZW51SXRlbVRlbXBsYXRlOiBmdW5jdGlvbiAodXNlcikgewogICAgICAgICAgICByZXR1cm4gdXNlci5vcmlnaW5hbC5uYW1lOwogICAgICAgICAgfSwKICAgICAgICAgIHNlbGVjdFRlbXBsYXRlOiBmdW5jdGlvbiAodXNlcikgewogICAgICAgICAgICByZXR1cm4gJ0AnICsgdXNlci5vcmlnaW5hbC5sb2dpbjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIF0sCiAgICAgIG5vTWF0Y2hUZW1wbGF0ZTogIiIKICAgIH0pOwoKICAgIHRyaWJ1dGUuYXR0YWNoKGVsZW1lbnQpOwp9CgovLyBjb2xsYXBzaWJsZSBzaWRlYmFyIGpRdWVyeSBwbHVnaW4KKGZ1bmN0aW9uKCQpIHsKICAvLyBtYWluIGNvbnRhaW5lciB0aGlzIGlzIGFwcGxpZWQgdG8KICB2YXIgbWFpbjsKICAvLyB0cmlnZ2VycyBzaG93L2hpZGUKICB2YXIgYnV0dG9uOwogIC8vIHRoZSBrZXkgdG8gdXNlIGluIGxvY2FsIHN0b3JhZ2UKICAvLyB0aGlzIHdpbGwgbGF0ZXIgYmUgZXhwYW5kZWQgdXNpbmcgdGhlIGN1cnJlbnQgY29udHJvbGxlciBhbmQgYWN0aW9uIHRvCiAgLy8gYWxsb3cgZm9yIGRpZmZlcmVudCBzaWRlYmFyIHN0YXRlcyBmb3IgZGlmZmVyZW50IHBhZ2VzCiAgdmFyIGxvY2FsU3RvcmFnZUtleSA9ICdyZWRtaW5lLXNpZGViYXItc3RhdGUnOwogIC8vIHRydWUgaWYgbG9jYWwgc3RvcmFnZSBpcyBhdmFpbGFibGUKICB2YXIgY2FuVXNlTG9jYWxTdG9yYWdlID0gZnVuY3Rpb24oKXsKICAgIHRyeSB7CiAgICAgIGlmKCdsb2NhbFN0b3JhZ2UnIGluIHdpbmRvdyl7CiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3JlZG1pbmUudGVzdC5zdG9yYWdlJywgJ29rJyk7CiAgICAgICAgdmFyIGl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncmVkbWluZS50ZXN0LnN0b3JhZ2UnKTsKICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgncmVkbWluZS50ZXN0LnN0b3JhZ2UnKTsKICAgICAgICBpZihpdGVtID09PSAnb2snKSByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfSBjYXRjaCAoZXJyKSB7fQogICAgcmV0dXJuIGZhbHNlOwogIH0oKTsKICAvLyBmdW5jdGlvbiB0byBzZXQgY3VycmVudCBzaWRlYmFyIHN0YXRlCiAgdmFyIHNldFN0YXRlID0gZnVuY3Rpb24oc3RhdGUpewogICAgaWYoY2FuVXNlTG9jYWxTdG9yYWdlKXsKICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obG9jYWxTdG9yYWdlS2V5LCBzdGF0ZSk7CiAgICB9CiAgfTsKICB2YXIgYXBwbHlTdGF0ZSA9IGZ1bmN0aW9uKCl7CiAgICBpZihtYWluLmhhc0NsYXNzKCdjb2xsYXBzZWRzaWRlYmFyJykpewogICAgICB1cGRhdGVTVkdJY29uKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaWRlYmFyLXN3aXRjaC1idXR0b24nKSwgJ2NoZXZyb25zLWxlZnQnKQogICAgICBzZXRTdGF0ZSgnaGlkZGVuJyk7CiAgICB9IGVsc2UgewogICAgICB1cGRhdGVTVkdJY29uKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaWRlYmFyLXN3aXRjaC1idXR0b24nKSwgJ2NoZXZyb25zLXJpZ2h0JykKICAgICAgc2V0U3RhdGUoJ3Zpc2libGUnKTsKICAgIH0KICB9OwogIHZhciBzZXR1cFRvZ2dsZUJ1dHRvbiA9IGZ1bmN0aW9uKCl7CiAgICBidXR0b24gPSAkKCcjc2lkZWJhci1zd2l0Y2gtYnV0dG9uJyk7CiAgICBidXR0b24uY2xpY2soZnVuY3Rpb24oZSl7CiAgICAgIG1haW4uYWRkQ2xhc3MoImFuaW1hdGUiKTsKICAgICAgbWFpbi50b2dnbGVDbGFzcygnY29sbGFwc2Vkc2lkZWJhcicpOwogICAgICBhcHBseVN0YXRlKCk7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7CiAgICBhcHBseVN0YXRlKCk7CiAgfTsKICAkLmZuLmNvbGxhcHNpYmxlU2lkZWJhciA9IGZ1bmN0aW9uKCkgewogICAgbWFpbiA9IHRoaXM7CiAgICAvLyBkZXRlcm1pbmUgcHJldmlvdXNseSBzdG9yZWQgc2lkZWJhciBzdGF0ZSBmb3IgdGhpcyBwYWdlCiAgICBpZihjYW5Vc2VMb2NhbFN0b3JhZ2UpIHsKICAgICAgLy8gZGV0ZXJtaW5lIGN1cnJlbnQgY29udHJvbGxlci9hY3Rpb24gcGFpciBhbmQgdXNlIHRoZW0gYXMgc3RvcmFnZSBrZXkKICAgICAgdmFyIGJvZHlDbGFzcyA9ICQoJ2JvZHknKS5hdHRyKCdjbGFzcycpOwogICAgICBpZihib2R5Q2xhc3MpewogICAgICAgIHRyeSB7CiAgICAgICAgICBsb2NhbFN0b3JhZ2VLZXkgKz0gJy0nICsgYm9keUNsYXNzLnNwbGl0KC9ccysvKS5maWx0ZXIoZnVuY3Rpb24ocyl7CiAgICAgICAgICAgIHJldHVybiBzLm1hdGNoKC8oYWN0aW9ufGNvbnRyb2xsZXIpLS4qLyk7CiAgICAgICAgICB9KS5zb3J0KCkuam9pbignLScpOwogICAgICAgIH0gY2F0Y2goZSkgewogICAgICAgICAgLy8gaW4gY2FzZSBvZiBlcnJvciAocHJvYmFibHkgSUU4KSwgY29udGludWUgd2l0aCB0aGUgdW5tb2RpZmllZCBrZXkKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyIHN0b3JlZFN0YXRlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0obG9jYWxTdG9yYWdlS2V5KTsKICAgICAgbWFpbi50b2dnbGVDbGFzcygnY29sbGFwc2Vkc2lkZWJhcicsIHN0b3JlZFN0YXRlID09PSAnaGlkZGVuJyk7CiAgICB9CiAgICAvLyBkcmF3IHRoZSB0b2dnbGUgYnV0dG9uIG9uY2UgdGhlIERPTSBpcyBjb21wbGV0ZQogICAgJChkb2N1bWVudCkucmVhZHkoc2V0dXBUb2dnbGVCdXR0b24pOwogIH07Cn0oalF1ZXJ5KSk7CgokKGRvY3VtZW50KS5yZWFkeShzZXR1cEFqYXhJbmRpY2F0b3IpOwokKGRvY3VtZW50KS5yZWFkeShoaWRlT25Mb2FkKTsKJChkb2N1bWVudCkucmVhZHkoYWRkRm9ybU9ic2VydmVyc0ZvckRvdWJsZVN1Ym1pdCk7CiQoZG9jdW1lbnQpLnJlYWR5KGRlZmF1bHRGb2N1cyk7CiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwQXR0YWNobWVudERldGFpbCk7CiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwVGFicyk7CiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwRmlsZVByZXZpZXdOYXZpZ2F0aW9uKTsKJChkb2N1bWVudCkucmVhZHkoc2V0dXBXaWtpVGFibGVTb3J0YWJsZUhlYWRlcik7CiQoZG9jdW1lbnQpLm9uKCdmb2N1cycsICdbZGF0YS1hdXRvLWNvbXBsZXRlPXRydWVdJywgZnVuY3Rpb24oZXZlbnQpIHsKICBpbmxpbmVBdXRvQ29tcGxldGUoZXZlbnQudGFyZ2V0KTsKfSk7Cg==" | |
| }, | |
| "attachments.js": { | |
| "hash": "fe6f73f3351f734902238369b56ee6cd", | |
| "path": "/usr/src/redmine/public/assets/attachments-db17b2b6.js", | |
| "base64": "LyoqCiAqIFJlZG1pbmUgLSBwcm9qZWN0IG1hbmFnZW1lbnQgc29mdHdhcmUKICogQ29weXJpZ2h0IChDKSAyMDA2LSAgSmVhbi1QaGlsaXBwZSBMYW5nCiAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCiAqLwoKZnVuY3Rpb24gYWRkRmlsZShpbnB1dEVsLCBmaWxlLCBlYWdlclVwbG9hZCkgewogIHZhciBhdHRhY2htZW50c0Zvcm0gPSAkKGlucHV0RWwpLmNsb3Nlc3QoJy5hdHRhY2htZW50c19mb3JtJykKICB2YXIgYXR0YWNobWVudHNGaWVsZHMgPSBhdHRhY2htZW50c0Zvcm0uZmluZCgnLmF0dGFjaG1lbnRzX2ZpZWxkcycpOwogIHZhciBhdHRhY2htZW50c0ljb25zID0gYXR0YWNobWVudHNGb3JtLmZpbmQoJy5hdHRhY2htZW50c19pY29ucycpOwogIHZhciBhZGRBdHRhY2htZW50ID0gYXR0YWNobWVudHNGb3JtLmZpbmQoJy5hZGRfYXR0YWNobWVudCcpOwogIHZhciBtYXhGaWxlcyA9ICgkKGlucHV0RWwpLmF0dHIoJ211bHRpcGxlJykgPT0gJ211bHRpcGxlJyA/IDEwIDogMSk7CiAgdmFyIGRlbEljb24gPSBhdHRhY2htZW50c0ljb25zLmZpbmQoJ3N2Zy5zdmctZGVsJykuY2xvbmUoKTsKICB2YXIgYXR0YWNobWVudEljb24gPSBhdHRhY2htZW50c0ljb25zLmZpbmQoJ3N2Zy5zdmctYXR0YWNobWVudCcpLmNsb25lKCk7CgogIGlmIChhdHRhY2htZW50c0ZpZWxkcy5jaGlsZHJlbigpLmxlbmd0aCA8IG1heEZpbGVzKSB7CiAgICB2YXIgYXR0YWNobWVudElkID0gYWRkRmlsZS5uZXh0QXR0YWNobWVudElkKys7CiAgICB2YXIgZmlsZVNwYW4gPSAkKCc8c3Bhbj4nLCB7IGlkOiAnYXR0YWNobWVudHNfJyArIGF0dGFjaG1lbnRJZCB9KTsKICAgIHZhciBwYXJhbSA9ICQoaW5wdXRFbCkuZGF0YSgncGFyYW0nKTsKICAgIGlmICghcGFyYW0pIHtwYXJhbSA9ICdhdHRhY2htZW50cyd9OwoKICAgIGZpbGVTcGFuLmFwcGVuZCgKICAgICAgICBhdHRhY2htZW50SWNvbiwKICAgICAgICAkKCc8aW5wdXQ+JywgeyB0eXBlOiAndGV4dCcsICdjbGFzcyc6ICdpY29uIGljb24tYXR0YWNobWVudCBmaWxlbmFtZSByZWFkb25seScsIG5hbWU6IHBhcmFtICsnWycgKyBhdHRhY2htZW50SWQgKyAnXVtmaWxlbmFtZV0nLCByZWFkb25seTogJ3JlYWRvbmx5J30gKS52YWwoZmlsZS5uYW1lKSwKICAgICAgICAkKCc8aW5wdXQ+JywgeyB0eXBlOiAndGV4dCcsICdjbGFzcyc6ICdkZXNjcmlwdGlvbicsIG5hbWU6IHBhcmFtICsgJ1snICsgYXR0YWNobWVudElkICsgJ11bZGVzY3JpcHRpb25dJywgbWF4bGVuZ3RoOiAyNTUsIHBsYWNlaG9sZGVyOiAkKGlucHV0RWwpLmRhdGEoJ2Rlc2NyaXB0aW9uLXBsYWNlaG9sZGVyJykgfSApLnRvZ2dsZSghZWFnZXJVcGxvYWQpLAogICAgICAgICQoJzxpbnB1dD4nLCB7IHR5cGU6ICdoaWRkZW4nLCAnY2xhc3MnOiAndG9rZW4nLCBuYW1lOiBwYXJhbSArICdbJyArIGF0dGFjaG1lbnRJZCArICddW3Rva2VuXSd9ICksCiAgICAgICAgJCgnPGE+JywgeyBocmVmOiAiIyIsICdjbGFzcyc6ICdpY29uLW9ubHkgaWNvbi1kZWwgcmVtb3ZlLXVwbG9hZCcgfSkuYXBwZW5kKGRlbEljb24pLmNsaWNrKHJlbW92ZUZpbGUpLnRvZ2dsZSghZWFnZXJVcGxvYWQpCiAgICApLmFwcGVuZFRvKGF0dGFjaG1lbnRzRmllbGRzKTsKCgogICAgaWYgKCQoaW5wdXRFbCkuZGF0YSgnZGVzY3JpcHRpb24nKSA9PSAwKSB7CiAgICAgIGZpbGVTcGFuLmZpbmQoJ2lucHV0LmRlc2NyaXB0aW9uJykucmVtb3ZlKCk7CiAgICB9CgogICAgaWYoZWFnZXJVcGxvYWQpIHsKICAgICAgYWpheFVwbG9hZChmaWxlLCBhdHRhY2htZW50SWQsIGZpbGVTcGFuLCBpbnB1dEVsKTsKICAgIH0KCiAgICBhZGRBdHRhY2htZW50LnRvZ2dsZShhdHRhY2htZW50c0ZpZWxkcy5jaGlsZHJlbigpLmxlbmd0aCA8IG1heEZpbGVzKTsKICAgIHJldHVybiBhdHRhY2htZW50SWQ7CiAgfQogIHJldHVybiBudWxsOwp9CgphZGRGaWxlLm5leHRBdHRhY2htZW50SWQgPSAxOwoKZnVuY3Rpb24gYWpheFVwbG9hZChmaWxlLCBhdHRhY2htZW50SWQsIGZpbGVTcGFuLCBpbnB1dEVsKSB7CgogIGZ1bmN0aW9uIG9uTG9hZHN0YXJ0KGUpIHsKICAgIGZpbGVTcGFuLnJlbW92ZUNsYXNzKCdhamF4LXdhaXRpbmcnKTsKICAgIGZpbGVTcGFuLmFkZENsYXNzKCdhamF4LWxvYWRpbmcnKTsKICAgICQoJ2lucHV0OnN1Ym1pdCcsICQodGhpcykucGFyZW50cygnZm9ybScpKS5hdHRyKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpOwogIH0KCiAgZnVuY3Rpb24gb25Qcm9ncmVzcyhlKSB7CiAgICBpZihlLmxlbmd0aENvbXB1dGFibGUpIHsKICAgICAgdGhpcy5wcm9ncmVzc2JhciggJ3ZhbHVlJywgZS5sb2FkZWQgKiAxMDAgLyBlLnRvdGFsICk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhY3R1YWxVcGxvYWQoZmlsZSwgYXR0YWNobWVudElkLCBmaWxlU3BhbiwgaW5wdXRFbCkgewoKICAgIGFqYXhVcGxvYWQudXBsb2FkaW5nKys7CgogICAgdXBsb2FkQmxvYihmaWxlLCAkKGlucHV0RWwpLmRhdGEoJ3VwbG9hZC1wYXRoJyksIGF0dGFjaG1lbnRJZCwgewogICAgICAgIGxvYWRzdGFydEV2ZW50SGFuZGxlcjogb25Mb2Fkc3RhcnQuYmluZChwcm9ncmVzc1NwYW4pLAogICAgICAgIHByb2dyZXNzRXZlbnRIYW5kbGVyOiBvblByb2dyZXNzLmJpbmQocHJvZ3Jlc3NTcGFuKQogICAgICB9KQogICAgICAuZG9uZShmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICBhZGRJbmxpbmVBdHRhY2htZW50TWFya3VwKGZpbGUpOwogICAgICAgIHByb2dyZXNzU3Bhbi5wcm9ncmVzc2JhciggJ3ZhbHVlJywgMTAwICkucmVtb3ZlKCk7CiAgICAgICAgZmlsZVNwYW4uZmluZCgnaW5wdXQuZGVzY3JpcHRpb24sIGEnKS5jc3MoJ2Rpc3BsYXknLCAnaW5saW5lLWZsZXgnKTsKICAgICAgfSkKICAgICAgLmZhaWwoZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgcHJvZ3Jlc3NTcGFuLnRleHQocmVzdWx0LnN0YXR1c1RleHQpOwogICAgICB9KS5hbHdheXMoZnVuY3Rpb24oKSB7CiAgICAgICAgYWpheFVwbG9hZC51cGxvYWRpbmctLTsKICAgICAgICBmaWxlU3Bhbi5yZW1vdmVDbGFzcygnYWpheC1sb2FkaW5nJyk7CiAgICAgICAgdmFyIGZvcm0gPSBmaWxlU3Bhbi5wYXJlbnRzKCdmb3JtJyk7CiAgICAgICAgaWYgKGZvcm0ucXVldWUoJ3VwbG9hZCcpLmxlbmd0aCA9PSAwICYmIGFqYXhVcGxvYWQudXBsb2FkaW5nID09IDApIHsKICAgICAgICAgICQoJ2lucHV0OnN1Ym1pdCcsIGZvcm0pLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7CiAgICAgICAgfQogICAgICAgIGZvcm0uZGVxdWV1ZSgndXBsb2FkJyk7CiAgICAgIH0pOwogIH0KCiAgdmFyIHByb2dyZXNzU3BhbiA9ICQoJzxkaXY+JykuaW5zZXJ0QWZ0ZXIoZmlsZVNwYW4uZmluZCgnaW5wdXQuZmlsZW5hbWUnKSk7CiAgcHJvZ3Jlc3NTcGFuLnByb2dyZXNzYmFyKCk7CiAgZmlsZVNwYW4uYWRkQ2xhc3MoJ2FqYXgtd2FpdGluZycpOwoKICB2YXIgbWF4U3luY1VwbG9hZCA9ICQoaW5wdXRFbCkuZGF0YSgnbWF4LWNvbmN1cnJlbnQtdXBsb2FkcycpOwoKICBpZihtYXhTeW5jVXBsb2FkID09IG51bGwgfHwgbWF4U3luY1VwbG9hZCA8PSAwIHx8IGFqYXhVcGxvYWQudXBsb2FkaW5nIDwgbWF4U3luY1VwbG9hZCkKICAgIGFjdHVhbFVwbG9hZChmaWxlLCBhdHRhY2htZW50SWQsIGZpbGVTcGFuLCBpbnB1dEVsKTsKICBlbHNlCiAgICAkKGlucHV0RWwpLnBhcmVudHMoJ2Zvcm0nKS5xdWV1ZSgndXBsb2FkJywgYWN0dWFsVXBsb2FkLmJpbmQodGhpcywgZmlsZSwgYXR0YWNobWVudElkLCBmaWxlU3BhbiwgaW5wdXRFbCkpOwp9CgphamF4VXBsb2FkLnVwbG9hZGluZyA9IDA7CgpmdW5jdGlvbiByZW1vdmVGaWxlKCkgewogICQodGhpcykuY2xvc2VzdCgnLmF0dGFjaG1lbnRzX2Zvcm0nKS5maW5kKCcuYWRkX2F0dGFjaG1lbnQnKS5zaG93KCk7CiAgJCh0aGlzKS5wYXJlbnQoJ3NwYW4nKS5yZW1vdmUoKTsKICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIHVwbG9hZEJsb2IoYmxvYiwgdXBsb2FkVXJsLCBhdHRhY2htZW50SWQsIG9wdGlvbnMpIHsKCiAgdmFyIGFjdHVhbE9wdGlvbnMgPSAkLmV4dGVuZCh7CiAgICBsb2Fkc3RhcnRFdmVudEhhbmRsZXI6ICQubm9vcCwKICAgIHByb2dyZXNzRXZlbnRIYW5kbGVyOiAkLm5vb3AKICB9LCBvcHRpb25zKTsKCiAgdXBsb2FkVXJsID0gdXBsb2FkVXJsICsgJz9hdHRhY2htZW50X2lkPScgKyBhdHRhY2htZW50SWQ7CiAgaWYgKGJsb2IgaW5zdGFuY2VvZiB3aW5kb3cuQmxvYikgewogICAgdXBsb2FkVXJsICs9ICcmZmlsZW5hbWU9JyArIGVuY29kZVVSSUNvbXBvbmVudChibG9iLm5hbWUpOwogICAgdXBsb2FkVXJsICs9ICcmY29udGVudF90eXBlPScgKyBlbmNvZGVVUklDb21wb25lbnQoYmxvYi50eXBlKTsKICB9CgogIHJldHVybiAkLmFqYXgodXBsb2FkVXJsLCB7CiAgICB0eXBlOiAnUE9TVCcsCiAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsCiAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbihqcVhociwgc2V0dGluZ3MpIHsKICAgICAganFYaHIuc2V0UmVxdWVzdEhlYWRlcignQWNjZXB0JywgJ2FwcGxpY2F0aW9uL2pzJyk7CiAgICAgIC8vIGF0dGFjaCBwcm9wZXIgRmlsZSBvYmplY3QKICAgICAgc2V0dGluZ3MuZGF0YSA9IGJsb2I7CiAgICB9LAogICAgeGhyOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIHhociA9ICQuYWpheFNldHRpbmdzLnhocigpOwogICAgICB4aHIudXBsb2FkLm9ubG9hZHN0YXJ0ID0gYWN0dWFsT3B0aW9ucy5sb2Fkc3RhcnRFdmVudEhhbmRsZXI7CiAgICAgIHhoci51cGxvYWQub25wcm9ncmVzcyA9IGFjdHVhbE9wdGlvbnMucHJvZ3Jlc3NFdmVudEhhbmRsZXI7CiAgICAgIHJldHVybiB4aHI7CiAgICB9LAogICAgZGF0YTogYmxvYiwKICAgIGNhY2hlOiBmYWxzZSwKICAgIHByb2Nlc3NEYXRhOiBmYWxzZQogIH0pOwp9CgpmdW5jdGlvbiBhZGRJbnB1dEZpbGVzKGlucHV0RWwpIHsKICB2YXIgYXR0YWNobWVudHNGaWVsZHMgPSAkKGlucHV0RWwpLmNsb3Nlc3QoJy5hdHRhY2htZW50c19mb3JtJykuZmluZCgnLmF0dGFjaG1lbnRzX2ZpZWxkcycpOwogIHZhciBhZGRBdHRhY2htZW50ID0gJChpbnB1dEVsKS5jbG9zZXN0KCcuYXR0YWNobWVudHNfZm9ybScpLmZpbmQoJy5hZGRfYXR0YWNobWVudCcpOwogIHZhciBjbGVhcmVkRmlsZUlucHV0ID0gJChpbnB1dEVsKS5jbG9uZSgpLnZhbCgnJyk7CiAgdmFyIHNpemVFeGNlZWRlZCA9IGZhbHNlOwogIHZhciBwYXJhbSA9ICQoaW5wdXRFbCkuZGF0YSgncGFyYW0nKTsKICBpZiAoIXBhcmFtKSB7cGFyYW0gPSAnYXR0YWNobWVudHMnfTsKCiAgaWYgKCQuYWpheFNldHRpbmdzLnhocigpLnVwbG9hZCAmJiBpbnB1dEVsLmZpbGVzKSB7CiAgICAvLyB1cGxvYWQgZmlsZXMgdXNpbmcgYWpheAogICAgc2l6ZUV4Y2VlZGVkID0gdXBsb2FkQW5kQXR0YWNoRmlsZXMoaW5wdXRFbC5maWxlcywgaW5wdXRFbCk7CiAgICAkKGlucHV0RWwpLnJlbW92ZSgpOwogIH0gZWxzZSB7CiAgICAvLyBicm93c2VyIG5vdCBzdXBwb3J0aW5nIHRoZSBmaWxlIEFQSSwgdXBsb2FkIG9uIGZvcm0gc3VibWlzc2lvbgogICAgdmFyIGF0dGFjaG1lbnRJZDsKICAgIHZhciBhRmlsZW5hbWUgPSBpbnB1dEVsLnZhbHVlLnNwbGl0KC9cL3xcXC8pOwogICAgYXR0YWNobWVudElkID0gYWRkRmlsZShpbnB1dEVsLCB7IG5hbWU6IGFGaWxlbmFtZVsgYUZpbGVuYW1lLmxlbmd0aCAtIDEgXSB9LCBmYWxzZSk7CiAgICBpZiAoYXR0YWNobWVudElkKSB7CiAgICAgICQoaW5wdXRFbCkuYXR0cih7IG5hbWU6IHBhcmFtICsgJ1snICsgYXR0YWNobWVudElkICsgJ11bZmlsZV0nLCBzdHlsZTogJ2Rpc3BsYXk6bm9uZTsnIH0pLmFwcGVuZFRvKCcjYXR0YWNobWVudHNfJyArIGF0dGFjaG1lbnRJZCk7CiAgICB9CiAgfQoKICBjbGVhcmVkRmlsZUlucHV0LnByZXBlbmRUbyhhZGRBdHRhY2htZW50KTsKfQoKZnVuY3Rpb24gdXBsb2FkQW5kQXR0YWNoRmlsZXMoZmlsZXMsIGlucHV0RWwpIHsKCiAgdmFyIG1heEZpbGVTaXplID0gJChpbnB1dEVsKS5kYXRhKCdtYXgtZmlsZS1zaXplJyk7CiAgdmFyIG1heEZpbGVTaXplRXhjZWVkZWQgPSAkKGlucHV0RWwpLmRhdGEoJ21heC1maWxlLXNpemUtbWVzc2FnZScpOwoKICB2YXIgc2l6ZUV4Y2VlZGVkID0gZmFsc2U7CiAgdmFyIGZpbGVzTGVuZ3RoID0gJChpbnB1dEVsKS5jbG9zZXN0KCcuYXR0YWNobWVudHNfZm9ybScpLmZpbmQoJy5hdHRhY2htZW50c19maWVsZHMnKS5jaGlsZHJlbigpLmxlbmd0aCArIGZpbGVzLmxlbmd0aAogICQuZWFjaChmaWxlcywgZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5zaXplICYmIG1heEZpbGVTaXplICE9IG51bGwgJiYgdGhpcy5zaXplID4gcGFyc2VJbnQobWF4RmlsZVNpemUpKSB7c2l6ZUV4Y2VlZGVkPXRydWU7fQogIH0pOwogIGlmIChzaXplRXhjZWVkZWQpIHsKICAgIHdpbmRvdy5hbGVydChtYXhGaWxlU2l6ZUV4Y2VlZGVkKTsKICB9IGVsc2UgewogICAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbigpIHthZGRGaWxlKGlucHV0RWwsIHRoaXMsIHRydWUpO30pOwogIH0KCiAgaWYgKGZpbGVzTGVuZ3RoID4gKCQoaW5wdXRFbCkuYXR0cignbXVsdGlwbGUnKSA9PSAnbXVsdGlwbGUnID8gMTAgOiAxKSkgewogICAgd2luZG93LmFsZXJ0KCQoaW5wdXRFbCkuZGF0YSgnbWF4LW51bWJlci1vZi1maWxlcy1tZXNzYWdlJykpOwogIH0KICByZXR1cm4gc2l6ZUV4Y2VlZGVkOwp9CgpmdW5jdGlvbiBoYW5kbGVGaWxlRHJvcEV2ZW50KGUpIHsKCiAgJCh0aGlzKS5yZW1vdmVDbGFzcygnZmlsZW92ZXInKTsKICBibG9ja0V2ZW50UHJvcGFnYXRpb24oZSk7CgogIGlmICgkLmluQXJyYXkoJ0ZpbGVzJywgZS5kYXRhVHJhbnNmZXIudHlwZXMpID4gLTEpIHsKICAgIGhhbmRsZUZpbGVEcm9wRXZlbnQudGFyZ2V0ID0gZS50YXJnZXQ7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnY3VzdG9tLWZpZWxkLWZpbGVkcm9wbGlzdG5lcicpKXsKICAgICAgdXBsb2FkQW5kQXR0YWNoRmlsZXMoZS5kYXRhVHJhbnNmZXIuZmlsZXMsICQodGhpcykuZmluZCgnaW5wdXQ6ZmlsZS5jdXN0b20tZmllbGQtZmlsZWRyb3AnKS5maXJzdCgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHVwbG9hZEFuZEF0dGFjaEZpbGVzKGUuZGF0YVRyYW5zZmVyLmZpbGVzLCAkKHRoaXMpLmZpbmQoJ2lucHV0OmZpbGUuZmlsZWRyb3AnKS5maXJzdCgpKTsKICAgIH0KICB9Cn0KaGFuZGxlRmlsZURyb3BFdmVudC50YXJnZXQgPSAnJzsKCmZ1bmN0aW9uIGRyYWdPdmVySGFuZGxlcihlKSB7CiAgJCh0aGlzKS5hZGRDbGFzcygnZmlsZW92ZXInKTsKICBibG9ja0V2ZW50UHJvcGFnYXRpb24oZSk7CiAgZS5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdjb3B5JzsKfQoKZnVuY3Rpb24gZHJhZ091dEhhbmRsZXIoZSkgewogICQodGhpcykucmVtb3ZlQ2xhc3MoJ2ZpbGVvdmVyJyk7CiAgYmxvY2tFdmVudFByb3BhZ2F0aW9uKGUpOwp9CgpmdW5jdGlvbiBzZXR1cEZpbGVEcm9wKCkgewogIGlmICh3aW5kb3cuRmlsZSAmJiB3aW5kb3cuRmlsZUxpc3QgJiYgd2luZG93LlByb2dyZXNzRXZlbnQgJiYgd2luZG93LkZvcm1EYXRhKSB7CgogICAgJC5ldmVudC5hZGRQcm9wKCdkYXRhVHJhbnNmZXInKTsKCiAgICAkKCdmb3JtIGRpdi5ib3g6bm90KC5maWxlZHJvcGxpc3RuZXIpJykuaGFzKCdpbnB1dDpmaWxlLmZpbGVkcm9wJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgJCh0aGlzKS5vbih7CiAgICAgICAgICBkcmFnb3ZlcjogZHJhZ092ZXJIYW5kbGVyLAogICAgICAgICAgZHJhZ2xlYXZlOiBkcmFnT3V0SGFuZGxlciwKICAgICAgICAgIGRyb3A6IGhhbmRsZUZpbGVEcm9wRXZlbnQsCiAgICAgICAgICBwYXN0ZTogY29weUltYWdlRnJvbUNsaXBib2FyZAogICAgICB9KS5hZGRDbGFzcygnZmlsZWRyb3BsaXN0bmVyJyk7CiAgICB9KTsKCiAgICAkKCdmb3JtIGRpdi5ib3ggaW5wdXQ6ZmlsZS5jdXN0b20tZmllbGQtZmlsZWRyb3AnKS5jbG9zZXN0KCdwJykubm90KCcuY3VzdG9tLWZpZWxkLWZpbGVkcm9wbGlzdG5lcicpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICQodGhpcykub24oewogICAgICAgICAgZHJhZ292ZXI6IGRyYWdPdmVySGFuZGxlciwKICAgICAgICAgIGRyYWdsZWF2ZTogZHJhZ091dEhhbmRsZXIsCiAgICAgICAgICBkcm9wOiBoYW5kbGVGaWxlRHJvcEV2ZW50CiAgICAgIH0pLmFkZENsYXNzKCdjdXN0b20tZmllbGQtZmlsZWRyb3BsaXN0bmVyJyk7CiAgICB9KTsKICB9Cn0KCmZ1bmN0aW9uIGFkZElubGluZUF0dGFjaG1lbnRNYXJrdXAoZmlsZSkgewogIC8vIGluc2VydCB1cGxvYWRlZCBpbWFnZSBpbmxpbmUgaWYgZHJvcHBlZCBhcmVhIGlzIGN1cnJlbnRseSBmb2N1c2VkIHRleHRhcmVhCiAgaWYoJChoYW5kbGVGaWxlRHJvcEV2ZW50LnRhcmdldCkuaGFzQ2xhc3MoJ3dpa2ktZWRpdCcpICYmICQuaW5BcnJheShmaWxlLnR5cGUsIHdpbmRvdy53aWtpSW1hZ2VNaW1lVHlwZXMpID4gLTEpIHsKICAgIHZhciAkdGV4dGFyZWEgPSAkKGhhbmRsZUZpbGVEcm9wRXZlbnQudGFyZ2V0KTsKICAgIHZhciBjdXJzb3JQb3NpdGlvbiA9ICR0ZXh0YXJlYS5wcm9wKCdzZWxlY3Rpb25TdGFydCcpOwogICAgdmFyIGRlc2NyaXB0aW9uID0gJHRleHRhcmVhLnZhbCgpOwogICAgdmFyIHNhbml0aXplZEZpbGVuYW1lID0gZmlsZS5uYW1lLnJlcGxhY2UoL1tcL1w/XCVcKlw6XHxcIlwnPD5cblxyXSsvLCAnXycpOwogICAgdmFyIGlubGluZUZpbGVuYW1lID0gZW5jb2RlVVJJQ29tcG9uZW50KHNhbml0aXplZEZpbGVuYW1lKQogICAgICAucmVwbGFjZSgvWyEoKV0vZywgZnVuY3Rpb24obWF0Y2gpIHsgcmV0dXJuICIlIiArIG1hdGNoLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpIH0pOwogICAgdmFyIG5ld0xpbmVCZWZvcmUgPSB0cnVlOwogICAgdmFyIG5ld0xpbmVBZnRlciA9IHRydWU7CiAgICBpZihjdXJzb3JQb3NpdGlvbiA9PT0gMCB8fCBkZXNjcmlwdGlvbi5zdWJzdHIoY3Vyc29yUG9zaXRpb24tMSwxKS5tYXRjaCgvXHJ8XG4vKSkgewogICAgICBuZXdMaW5lQmVmb3JlID0gZmFsc2U7CiAgICB9CiAgICBpZihkZXNjcmlwdGlvbi5zdWJzdHIoY3Vyc29yUG9zaXRpb24sMSkubWF0Y2goL1xyfFxuLykpIHsKICAgICAgbmV3TGluZUFmdGVyID0gZmFsc2U7CiAgICB9CgogICAgJHRleHRhcmVhLnZhbCgKICAgICAgZGVzY3JpcHRpb24uc3Vic3RyaW5nKDAsIGN1cnNvclBvc2l0aW9uKQogICAgICArIChuZXdMaW5lQmVmb3JlID8gJ1xuJyA6ICcnKQogICAgICArIGlubGluZUZpbGVuYW1lCiAgICAgICsgKG5ld0xpbmVBZnRlciA/ICdcbicgOiAnJykKICAgICAgKyBkZXNjcmlwdGlvbi5zdWJzdHJpbmcoY3Vyc29yUG9zaXRpb24sIGRlc2NyaXB0aW9uLmxlbmd0aCkKICAgICk7CgogICAgJHRleHRhcmVhLnByb3AoewogICAgICAnc2VsZWN0aW9uU3RhcnQnOiBjdXJzb3JQb3NpdGlvbiArIG5ld0xpbmVCZWZvcmUsCiAgICAgICdzZWxlY3Rpb25FbmQnOiBjdXJzb3JQb3NpdGlvbiArIGlubGluZUZpbGVuYW1lLmxlbmd0aCArIG5ld0xpbmVCZWZvcmUKICAgIH0pOwogICAgJHRleHRhcmVhLnBhcmVudHMoJy5qc3RCbG9jaycpCiAgICAgIC5maW5kKCcuanN0Yl9pbWcnKS5jbGljaygpOwoKICAgIC8vIG1vdmUgY3Vyc29yIGludG8gbmV4dCBsaW5lCiAgICBjdXJzb3JQb3NpdGlvbiA9ICR0ZXh0YXJlYS5wcm9wKCdzZWxlY3Rpb25TdGFydCcpOwogICAgJHRleHRhcmVhLnByb3AoewogICAgICAnc2VsZWN0aW9uU3RhcnQnOiBjdXJzb3JQb3NpdGlvbiArIDEsCiAgICAgICdzZWxlY3Rpb25FbmQnOiBjdXJzb3JQb3NpdGlvbiArIDEKICAgIH0pOwoKICB9Cn0KCmZ1bmN0aW9uIGNvcHlJbWFnZUZyb21DbGlwYm9hcmQoZSkgewogIGlmICghJChlLnRhcmdldCkuaGFzQ2xhc3MoJ3dpa2ktZWRpdCcpKSB7IHJldHVybjsgfQogIHZhciBjbGlwYm9hcmREYXRhID0gZS5jbGlwYm9hcmREYXRhIHx8IGUub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhCiAgaWYgKCFjbGlwYm9hcmREYXRhKSB7IHJldHVybjsgfQogIGlmIChjbGlwYm9hcmREYXRhLnR5cGVzLnNvbWUoZnVuY3Rpb24odCl7IHJldHVybiAvXnRleHRcL3BsYWluJC8udGVzdCh0KTsgfSkpIHsgcmV0dXJuOyB9CgogIHZhciBmaWxlcyA9IGNsaXBib2FyZERhdGEuZmlsZXMKICBmb3IgKHZhciBpID0gMCA7IGkgPCBmaWxlcy5sZW5ndGggOyBpKyspIHsKICAgIHZhciBmaWxlID0gZmlsZXNbaV07CiAgICBpZiAoZmlsZS50eXBlLmluZGV4T2YoImltYWdlIikgIT0gLTEpIHsKICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgpOwogICAgICB2YXIgZmlsZW5hbWUgPSAnY2xpcGJvYXJkLScKICAgICAgICArIGRhdGUuZ2V0RnVsbFllYXIoKQogICAgICAgICsgKCcwJysoZGF0ZS5nZXRNb250aCgpKzEpKS5zbGljZSgtMikKICAgICAgICArICgnMCcrZGF0ZS5nZXREYXRlKCkpLnNsaWNlKC0yKQogICAgICAgICsgKCcwJytkYXRlLmdldEhvdXJzKCkpLnNsaWNlKC0yKQogICAgICAgICsgKCcwJytkYXRlLmdldE1pbnV0ZXMoKSkuc2xpY2UoLTIpCiAgICAgICAgKyAnLScgKyByYW5kb21LZXkoNSkudG9Mb2NhbGVMb3dlckNhc2UoKQogICAgICAgICsgJy4nICsgZmlsZS5uYW1lLnNwbGl0KCcuJykucG9wKCk7CgogICAgICAvLyBnZXQgaW5wdXQgZmlsZSBpbiB0aGUgY2xvc2VzdCBmb3JtCiAgICAgIHZhciBpbnB1dEVsID0gJCh0aGlzKS5jbG9zZXN0KCJmb3JtIikuZmluZCgnaW5wdXQ6ZmlsZS5maWxlZHJvcCcpOwogICAgICBoYW5kbGVGaWxlRHJvcEV2ZW50LnRhcmdldCA9IGUudGFyZ2V0OwogICAgICBhZGRGaWxlKGlucHV0RWwsIG5ldyBGaWxlKFtmaWxlXSwgZmlsZW5hbWUsIHsgdHlwZTogZmlsZS50eXBlIH0pLCB0cnVlKTsKICAgIH0KICB9Cn0KCiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwRmlsZURyb3ApOwokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICQoImlucHV0LmRlbGV0ZWRfYXR0YWNobWVudCIpLmNoYW5nZShmdW5jdGlvbigpewogICAgJCh0aGlzKS5wYXJlbnRzKCcuZXhpc3RpbmctYXR0YWNobWVudCcpLnRvZ2dsZUNsYXNzKCdkZWxldGVkJywgJCh0aGlzKS5pcygiOmNoZWNrZWQiKSk7CiAgfSkuY2hhbmdlKCk7Cn0pOwo=" | |
| } | |
| }, | |
| "6.0.6": { | |
| "application.js": { | |
| "hash": "ce494e4e380316d654c1db1fda5adf3c", | |
| "path": "/usr/src/redmine/public/assets/application-0aa6b43a.js", | |
| "base64": "LyoqCiAqIFJlZG1pbmUgLSBwcm9qZWN0IG1hbmFnZW1lbnQgc29mdHdhcmUKICogQ29weXJpZ2h0IChDKSAyMDA2LSAgSmVhbi1QaGlsaXBwZSBMYW5nCiAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCiAqLwoKZnVuY3Rpb24gc2FuaXRpemVIVE1MKHN0cmluZykgewogIHZhciB0ZW1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIHRlbXAudGV4dENvbnRlbnQgPSBzdHJpbmc7CiAgcmV0dXJuIHRlbXAuaW5uZXJIVE1MOwp9CgpmdW5jdGlvbiBjaGVja0FsbChpZCwgY2hlY2tlZCkgewogICQoJyMnK2lkKS5maW5kKCdpbnB1dFt0eXBlPWNoZWNrYm94XTplbmFibGVkJykucHJvcCgnY2hlY2tlZCcsIGNoZWNrZWQpOwp9CgpmdW5jdGlvbiB0b2dnbGVDaGVja2JveGVzQnlTZWxlY3RvcihzZWxlY3RvcikgewogIHZhciBhbGxfY2hlY2tlZCA9IHRydWU7CiAgJChzZWxlY3RvcikuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgaWYgKCEkKHRoaXMpLmlzKCc6Y2hlY2tlZCcpKSB7IGFsbF9jaGVja2VkID0gZmFsc2U7IH0KICB9KTsKICAkKHNlbGVjdG9yKS5wcm9wKCdjaGVja2VkJywgIWFsbF9jaGVja2VkKS50cmlnZ2VyKCdjaGFuZ2UnKTsKfQoKZnVuY3Rpb24gc2hvd0FuZFNjcm9sbFRvKGlkLCBmb2N1cykgewogICQoJyMnK2lkKS5zaG93KCk7CiAgaWYgKGZvY3VzICE9PSBudWxsKSB7CiAgICAkKCcjJytmb2N1cykuZm9jdXMoKTsKICB9CiAgJCgnaHRtbCwgYm9keScpLmFuaW1hdGUoe3Njcm9sbFRvcDogJCgnIycraWQpLm9mZnNldCgpLnRvcH0sIDEwMCk7Cn0KCmZ1bmN0aW9uIHRvZ2dsZVJvd0dyb3VwKGVsKSB7CiAgdmFyIHRyID0gJChlbCkucGFyZW50cygndHInKS5maXJzdCgpOwogIHZhciBuID0gdHIubmV4dCgpOwogIHRyLnRvZ2dsZUNsYXNzKCdvcGVuJyk7CiAgJChlbCkudG9nZ2xlQ2xhc3MoJ2ljb24tZXhwYW5kZWQgaWNvbi1jb2xsYXBzZWQnKTsKICB0b2dnbGVFeHBlbmRDb2xsYXBzZUljb24oZWwpCiAgd2hpbGUgKG4ubGVuZ3RoICYmICFuLmhhc0NsYXNzKCdncm91cCcpKSB7CiAgICBuLnRvZ2dsZSgpOwogICAgbiA9IG4ubmV4dCgndHInKTsKICB9Cn0KCmZ1bmN0aW9uIHRvZ2dsZUV4cGVuZENvbGxhcHNlSWNvbihlbCkgewogIGNvbnN0IHN2ZyA9IGVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzdmcnKS5pdGVtKDApCgogIGlmIChzdmcgPT09IG51bGwpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2ljb24tZXhwYW5kZWQnKSkgewogICAgdXBkYXRlU1ZHSWNvbihzdmcsICdhbmdsZS1kb3duJykKICAgIHN2Zy5jbGFzc0xpc3QucmVtb3ZlKCdpY29uLXJ0bCcpCiAgfSBlbHNlIHsKICAgIHVwZGF0ZVNWR0ljb24oc3ZnLCAnYW5nbGUtcmlnaHQnKQogICAgc3ZnLmNsYXNzTGlzdC5hZGQoJ2ljb24tcnRsJykKICB9Cn0KCmZ1bmN0aW9uIHVwZGF0ZVNWR0ljb24oZWxlbWVudCwgaWNvbikgewogIGNvbnN0IGljb25FbGVtZW50ID0gZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidXNlIikuaXRlbSgwKQoKICBpZiAoaWNvbkVsZW1lbnQgPT09IG51bGwpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIGNvbnN0IGljb25QYXRoID0gaWNvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKCdocmVmJyk7CiAgaWNvbkVsZW1lbnQuc2V0QXR0cmlidXRlKCdocmVmJywgaWNvblBhdGgucmVwbGFjZSgvIy4qJC9nLCAiI2ljb24tLSIgKyBpY29uKSkKfQoKZnVuY3Rpb24gY29sbGFwc2VBbGxSb3dHcm91cHMoZWwpIHsKICB2YXIgdGJvZHkgPSAkKGVsKS5wYXJlbnRzKCd0Ym9keScpLmZpcnN0KCk7CiAgdGJvZHkuY2hpbGRyZW4oJ3RyJykuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ2dyb3VwJykpIHsKICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygnb3BlbicpOwogICAgICB2YXIgZXhwYW5kZXIgPSAkKHRoaXMpLmZpbmQoJy5leHBhbmRlcicpOwogICAgICBleHBhbmRlci5zd2l0Y2hDbGFzcygnaWNvbi1leHBhbmRlZCcsICdpY29uLWNvbGxhcHNlZCcpOwogICAgICB0b2dnbGVFeHBlbmRDb2xsYXBzZUljb24oZXhwYW5kZXJbMF0pOwogICAgfSBlbHNlIHsKICAgICAgJCh0aGlzKS5oaWRlKCk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIGV4cGFuZEFsbFJvd0dyb3VwcyhlbCkgewogIHZhciB0Ym9keSA9ICQoZWwpLnBhcmVudHMoJ3Rib2R5JykuZmlyc3QoKTsKICB0Ym9keS5jaGlsZHJlbigndHInKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnZ3JvdXAnKSkgewogICAgICAkKHRoaXMpLmFkZENsYXNzKCdvcGVuJyk7CiAgICAgIHZhciBleHBhbmRlciA9ICQodGhpcykuZmluZCgnLmV4cGFuZGVyJyk7CiAgICAgIGV4cGFuZGVyLnN3aXRjaENsYXNzKCdpY29uLWNvbGxhcHNlZCcsICdpY29uLWV4cGFuZGVkJyk7CiAgICAgIHRvZ2dsZUV4cGVuZENvbGxhcHNlSWNvbihleHBhbmRlclswXSk7CiAgICB9IGVsc2UgewogICAgICAkKHRoaXMpLnNob3coKTsKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gdG9nZ2xlQWxsUm93R3JvdXBzKGVsKSB7CiAgdmFyIHRyID0gJChlbCkucGFyZW50cygndHInKS5maXJzdCgpOwogIGlmICh0ci5oYXNDbGFzcygnb3BlbicpKSB7CiAgICBjb2xsYXBzZUFsbFJvd0dyb3VwcyhlbCk7CiAgfSBlbHNlIHsKICAgIGV4cGFuZEFsbFJvd0dyb3VwcyhlbCk7CiAgfQp9CgpmdW5jdGlvbiB0b2dnbGVGaWVsZHNldChlbCkgewogIHZhciBmaWVsZHNldCA9ICQoZWwpLnBhcmVudHMoJ2ZpZWxkc2V0JykuZmlyc3QoKTsKICBmaWVsZHNldC50b2dnbGVDbGFzcygnY29sbGFwc2VkJyk7CiAgZmllbGRzZXQuY2hpbGRyZW4oJ2xlZ2VuZCcpLnRvZ2dsZUNsYXNzKCdpY29uLWV4cGFuZGVkIGljb24tY29sbGFwc2VkJyk7CiAgdG9nZ2xlRXhwZW5kQ29sbGFwc2VJY29uKGZpZWxkc2V0LmNoaWxkcmVuKCdsZWdlbmQnKVswXSkKICBmaWVsZHNldC5jaGlsZHJlbignZGl2JykudG9nZ2xlKCk7Cn0KCmZ1bmN0aW9uIGhpZGVGaWVsZHNldChlbCkgewogIHZhciBmaWVsZHNldCA9ICQoZWwpLnBhcmVudHMoJ2ZpZWxkc2V0JykuZmlyc3QoKTsKICBmaWVsZHNldC50b2dnbGVDbGFzcygnY29sbGFwc2VkJyk7CiAgZmllbGRzZXQuY2hpbGRyZW4oJ2RpdicpLmhpZGUoKTsKfQoKLy8gY29sdW1ucyBzZWxlY3Rpb24KZnVuY3Rpb24gbW92ZU9wdGlvbnModGhlU2VsRnJvbSwgdGhlU2VsVG8pIHsKICAkKHRoZVNlbEZyb20pLmZpbmQoJ29wdGlvbjpzZWxlY3RlZCcpLmRldGFjaCgpLnByb3AoInNlbGVjdGVkIiwgZmFsc2UpLmFwcGVuZFRvKCQodGhlU2VsVG8pKTsKfQoKZnVuY3Rpb24gbW92ZU9wdGlvblVwKHRoZVNlbCkgewogICQodGhlU2VsKS5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAkKHRoaXMpLnByZXYoJzpub3QoOnNlbGVjdGVkKScpLmRldGFjaCgpLmluc2VydEFmdGVyKCQodGhpcykpOwogIH0pOwp9CgpmdW5jdGlvbiBtb3ZlT3B0aW9uVG9wKHRoZVNlbCkgewogICQodGhlU2VsKS5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS5kZXRhY2goKS5wcmVwZW5kVG8oJCh0aGVTZWwpKTsKfQoKZnVuY3Rpb24gbW92ZU9wdGlvbkRvd24odGhlU2VsKSB7CiAgJCgkKHRoZVNlbCkuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykuZ2V0KCkucmV2ZXJzZSgpKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAkKHRoaXMpLm5leHQoJzpub3QoOnNlbGVjdGVkKScpLmRldGFjaCgpLmluc2VydEJlZm9yZSgkKHRoaXMpKTsKICB9KTsKfQoKZnVuY3Rpb24gbW92ZU9wdGlvbkJvdHRvbSh0aGVTZWwpIHsKICAkKHRoZVNlbCkuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykuZGV0YWNoKCkuYXBwZW5kVG8oJCh0aGVTZWwpKTsKfQoKZnVuY3Rpb24gaW5pdEZpbHRlcnMoKSB7CiAgJCgnI2FkZF9maWx0ZXJfc2VsZWN0JykuY2hhbmdlKGZ1bmN0aW9uKCkgewogICAgYWRkRmlsdGVyKCQodGhpcykudmFsKCksICcnLCBbXSk7CiAgfSk7CiAgJCgnI2ZpbHRlcnMtdGFibGUgLmZpZWxkIGlucHV0W3R5cGU9Y2hlY2tib3hdJykuZWFjaChmdW5jdGlvbigpIHsKICAgIHRvZ2dsZUZpbHRlcigkKHRoaXMpLnZhbCgpKTsKICB9KTsKICAkKCcjZmlsdGVycy10YWJsZScpLm9uKCdjbGljaycsICcuZmllbGQgaW5wdXRbdHlwZT1jaGVja2JveF0nLCBmdW5jdGlvbigpIHsKICAgIHRvZ2dsZUZpbHRlcigkKHRoaXMpLnZhbCgpKTsKICB9KTsKICAkKCcjZmlsdGVycy10YWJsZScpLm9uKCdrZXlwcmVzcycsICdpbnB1dFt0eXBlPXRleHRdJywgZnVuY3Rpb24oZSkgewogICAgaWYgKGUua2V5Q29kZSA9PSAxMykgJCh0aGlzKS5jbG9zZXN0KCdmb3JtJykuc3VibWl0KCk7CiAgfSk7Cn0KCmZ1bmN0aW9uIGFkZEZpbHRlcihmaWVsZCwgb3BlcmF0b3IsIHZhbHVlcykgewogIHZhciBmaWVsZElkID0gZmllbGQucmVwbGFjZSgnLicsICdfJyk7CiAgdmFyIHRyID0gJCgnI3RyXycrZmllbGRJZCk7CgogIHZhciBmaWx0ZXJPcHRpb25zID0gYXZhaWxhYmxlRmlsdGVyc1tmaWVsZF07CiAgaWYgKCFmaWx0ZXJPcHRpb25zKSByZXR1cm47CgogIGlmIChmaWx0ZXJPcHRpb25zWydyZW1vdGUnXSAmJiBmaWx0ZXJPcHRpb25zWyd2YWx1ZXMnXSA9PSBudWxsKSB7CiAgICAkLmdldEpTT04oZmlsdGVyc1VybCwgeyduYW1lJzogZmllbGR9KS5kb25lKGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgZmlsdGVyT3B0aW9uc1sndmFsdWVzJ10gPSBkYXRhOwogICAgICBhZGRGaWx0ZXIoZmllbGQsIG9wZXJhdG9yLCB2YWx1ZXMpIDsKICAgIH0pOwogICAgcmV0dXJuOwogIH0KCiAgaWYgKHRyLmxlbmd0aCA+IDApIHsKICAgIHRyLnNob3coKTsKICB9IGVsc2UgewogICAgYnVpbGRGaWx0ZXJSb3coZmllbGQsIG9wZXJhdG9yLCB2YWx1ZXMpOwogIH0KICAkKCcjY2JfJytmaWVsZElkKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7CiAgdG9nZ2xlRmlsdGVyKGZpZWxkKTsKICB0b2dnbGVNdWx0aVNlbGVjdEljb25Jbml0KCk7CiAgJCgnI2FkZF9maWx0ZXJfc2VsZWN0JykudmFsKCcnKS5maW5kKCdvcHRpb24nKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgaWYgKCQodGhpcykuYXR0cigndmFsdWUnKSA9PSBmaWVsZCkgewogICAgICAkKHRoaXMpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIGJ1aWxkRmlsdGVyUm93KGZpZWxkLCBvcGVyYXRvciwgdmFsdWVzKSB7CiAgdmFyIGZpZWxkSWQgPSBmaWVsZC5yZXBsYWNlKCcuJywgJ18nKTsKICB2YXIgZmlsdGVyVGFibGUgPSAkKCIjZmlsdGVycy10YWJsZSIpOwogIHZhciBmaWx0ZXJPcHRpb25zID0gYXZhaWxhYmxlRmlsdGVyc1tmaWVsZF07CiAgaWYgKCFmaWx0ZXJPcHRpb25zKSByZXR1cm47CiAgdmFyIG9wZXJhdG9ycyA9IG9wZXJhdG9yQnlUeXBlW2ZpbHRlck9wdGlvbnNbJ3R5cGUnXV07CiAgdmFyIGZpbHRlclZhbHVlcyA9IGZpbHRlck9wdGlvbnNbJ3ZhbHVlcyddOwogIHZhciBzZWxlY3Q7CgogIHZhciB0ciA9ICQoJzxkaXYgY2xhc3M9ImZpbHRlciI+JykuYXR0cignaWQnLCAndHJfJytmaWVsZElkKS5odG1sKAogICAgJzxkaXYgY2xhc3M9ImZpZWxkIj48aW5wdXQgY2hlY2tlZD0iY2hlY2tlZCIgaWQ9ImNiXycrZmllbGRJZCsnIiBuYW1lPSJmW10iIHZhbHVlPSInK2ZpZWxkKyciIHR5cGU9ImNoZWNrYm94Ij48bGFiZWwgZm9yPSJjYl8nK2ZpZWxkSWQrJyI+ICcrZmlsdGVyT3B0aW9uc1snbmFtZSddKyc8L2xhYmVsPjwvZGl2PicgKwogICAgJzxkaXYgY2xhc3M9Im9wZXJhdG9yIj48c2VsZWN0IGlkPSJvcGVyYXRvcnNfJytmaWVsZElkKyciIG5hbWU9Im9wWycrZmllbGQrJ10iPjwvc2VsZWN0PjwvZGl2PicgKwogICAgJzxkaXYgY2xhc3M9InZhbHVlcyI+PC9kaXY+JwogICk7CiAgZmlsdGVyVGFibGUuYXBwZW5kKHRyKTsKCiAgc2VsZWN0ID0gdHIuZmluZCgnLm9wZXJhdG9yIHNlbGVjdCcpOwogIG9wZXJhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uKG9wKSB7CiAgICB2YXIgb3B0aW9uID0gJCgnPG9wdGlvbj4nKS52YWwob3ApLnRleHQob3BlcmF0b3JMYWJlbHNbb3BdKTsKICAgIGlmIChvcCA9PSBvcGVyYXRvcikgeyBvcHRpb24ucHJvcCgnc2VsZWN0ZWQnLCB0cnVlKTsgfQogICAgc2VsZWN0LmFwcGVuZChvcHRpb24pOwogIH0pOwogIHNlbGVjdC5jaGFuZ2UoZnVuY3Rpb24oKXsgdG9nZ2xlT3BlcmF0b3IoZmllbGQpOyB9KTsKCiAgc3dpdGNoIChmaWx0ZXJPcHRpb25zWyd0eXBlJ10pIHsKICBjYXNlICJsaXN0IjoKICBjYXNlICJsaXN0X3dpdGhfaGlzdG9yeSI6CiAgY2FzZSAibGlzdF9vcHRpb25hbCI6CiAgY2FzZSAibGlzdF9vcHRpb25hbF93aXRoX2hpc3RvcnkiOgogIGNhc2UgImxpc3Rfc3RhdHVzIjoKICBjYXNlICJsaXN0X3N1YnByb2plY3RzIjoKICAgIGNvbnN0IGljb25UeXBlID0gdmFsdWVzLmxlbmd0aCA+IDEgPyAndG9nZ2xlLW1pbnVzJyA6ICd0b2dnbGUtcGx1cyc7CiAgICBjb25zdCBjbG9uZWRJY29uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2ljb24tY29weS1zb3VyY2Ugc3ZnJykuY2xvbmVOb2RlKHRydWUpOwogICAgdXBkYXRlU1ZHSWNvbihjbG9uZWRJY29uLCBpY29uVHlwZSk7CgogICAgdHIuZmluZCgnLnZhbHVlcycpLmFwcGVuZCgKICAgICAgJCgnPHNwYW4+JywgeyBzdHlsZTogJ2Rpc3BsYXk6bm9uZTsnIH0pLmFwcGVuZCgKICAgICAgICAkKCc8c2VsZWN0PicsIHsKICAgICAgICAgIGNsYXNzOiAndmFsdWUnLAogICAgICAgICAgaWQ6IGB2YWx1ZXNfJHtmaWVsZElkfV8xYCwKICAgICAgICAgIG5hbWU6IGB2WyR7ZmllbGR9XVtdYCwKICAgICAgICB9KSwKICAgICAgICAnXG4nLAogICAgICAgICQoJzxzcGFuPicsIHsgY2xhc3M6IGB0b2dnbGUtbXVsdGlzZWxlY3QgaWNvbi1vbmx5IGljb24tJHtpY29uVHlwZX1gIH0pLmFwcGVuZChjbG9uZWRJY29uKQogICAgICApCiAgICApOwogICAgc2VsZWN0ID0gdHIuZmluZCgnLnZhbHVlcyBzZWxlY3QnKTsKICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMSkgeyBzZWxlY3QuYXR0cignbXVsdGlwbGUnLCB0cnVlKTsgfQogICAgZmlsdGVyVmFsdWVzLmZvckVhY2goZnVuY3Rpb24oZmlsdGVyVmFsdWUpIHsKICAgICAgdmFyIG9wdGlvbiA9ICQoJzxvcHRpb24+Jyk7CiAgICAgIGlmICgkLmlzQXJyYXkoZmlsdGVyVmFsdWUpKSB7CiAgICAgICAgb3B0aW9uLnZhbChmaWx0ZXJWYWx1ZVsxXSkudGV4dChmaWx0ZXJWYWx1ZVswXSk7CiAgICAgICAgaWYgKCQuaW5BcnJheShmaWx0ZXJWYWx1ZVsxXSwgdmFsdWVzKSA+IC0xKSB7b3B0aW9uLnByb3AoJ3NlbGVjdGVkJywgdHJ1ZSk7fQogICAgICAgIGlmIChmaWx0ZXJWYWx1ZS5sZW5ndGggPT0gMykgewogICAgICAgICAgdmFyIG9wdGdyb3VwID0gc2VsZWN0LmZpbmQoJ29wdGdyb3VwJykuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuICQodGhpcykuYXR0cignbGFiZWwnKSA9PSBmaWx0ZXJWYWx1ZVsyXX0pOwogICAgICAgICAgaWYgKCFvcHRncm91cC5sZW5ndGgpIHtvcHRncm91cCA9ICQoJzxvcHRncm91cD4nKS5hdHRyKCdsYWJlbCcsIGZpbHRlclZhbHVlWzJdKTt9CiAgICAgICAgICBvcHRpb24gPSBvcHRncm91cC5hcHBlbmQob3B0aW9uKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb3B0aW9uLnZhbChmaWx0ZXJWYWx1ZSkudGV4dChmaWx0ZXJWYWx1ZSk7CiAgICAgICAgaWYgKCQuaW5BcnJheShmaWx0ZXJWYWx1ZSwgdmFsdWVzKSA+IC0xKSB7b3B0aW9uLnByb3AoJ3NlbGVjdGVkJywgdHJ1ZSk7fQogICAgICB9CiAgICAgIHNlbGVjdC5hcHBlbmQob3B0aW9uKTsKICAgIH0pOwogICAgYnJlYWs7CiAgY2FzZSAiZGF0ZSI6CiAgY2FzZSAiZGF0ZV9wYXN0IjoKICAgIHRyLmZpbmQoJy52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9ImRhdGUiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnXzEiIHNpemU9IjEwIiBjbGFzcz0idmFsdWUgZGF0ZV92YWx1ZSIgLz48L3NwYW4+JyArCiAgICAgICcgPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZTsiPjxpbnB1dCB0eXBlPSJkYXRlIiBuYW1lPSJ2WycrZmllbGQrJ11bXSIgaWQ9InZhbHVlc18nK2ZpZWxkSWQrJ18yIiBzaXplPSIxMCIgY2xhc3M9InZhbHVlIGRhdGVfdmFsdWUiIC8+PC9zcGFuPicgKwogICAgICAnIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKyciIHNpemU9IjMiIGNsYXNzPSJ2YWx1ZSIgLz4gJytsYWJlbERheVBsdXJhbCsnPC9zcGFuPicKICAgICk7CiAgICAkKCcjdmFsdWVzXycrZmllbGRJZCsnXzEnKS52YWwodmFsdWVzWzBdKS5kYXRlcGlja2VyRmFsbGJhY2soZGF0ZXBpY2tlck9wdGlvbnMpOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQrJ18yJykudmFsKHZhbHVlc1sxXSkuZGF0ZXBpY2tlckZhbGxiYWNrKGRhdGVwaWNrZXJPcHRpb25zKTsKICAgICQoJyN2YWx1ZXNfJytmaWVsZElkKS52YWwodmFsdWVzWzBdKTsKICAgIGJyZWFrOwogIGNhc2UgInN0cmluZyI6CiAgY2FzZSAidGV4dCI6CiAgY2FzZSAic2VhcmNoIjoKICAgIHRyLmZpbmQoJy52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnIiBzaXplPSIzMCIgY2xhc3M9InZhbHVlIiAvPjwvc3Bhbj4nCiAgICApOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQpLnZhbCh2YWx1ZXNbMF0pOwogICAgYnJlYWs7CiAgY2FzZSAicmVsYXRpb24iOgogICAgdHIuZmluZCgnLnZhbHVlcycpLmFwcGVuZCgKICAgICAgJzxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKyciIHNpemU9IjYiIGNsYXNzPSJ2YWx1ZSIgLz48L3NwYW4+JyArCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PHNlbGVjdCBjbGFzcz0idmFsdWUiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnXzEiPjwvc2VsZWN0Pjwvc3Bhbj4nCiAgICApOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQpLnZhbCh2YWx1ZXNbMF0pOwogICAgc2VsZWN0ID0gdHIuZmluZCgnLnZhbHVlcyBzZWxlY3QnKTsKICAgIGZpbHRlclZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKGZpbHRlclZhbHVlKSB7CiAgICAgIHZhciBvcHRpb24gPSAkKCc8b3B0aW9uPicpOwogICAgICBvcHRpb24udmFsKGZpbHRlclZhbHVlWzFdKS50ZXh0KGZpbHRlclZhbHVlWzBdKTsKICAgICAgaWYgKHZhbHVlc1swXSA9PSBmaWx0ZXJWYWx1ZVsxXSkgeyBvcHRpb24ucHJvcCgnc2VsZWN0ZWQnLCB0cnVlKTsgfQogICAgICBzZWxlY3QuYXBwZW5kKG9wdGlvbik7CiAgICB9KTsKICAgIGJyZWFrOwogIGNhc2UgImludGVnZXIiOgogIGNhc2UgImZsb2F0IjoKICBjYXNlICJ0cmVlIjoKICAgIHRyLmZpbmQoJy52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnXzEiIHNpemU9IjE0IiBjbGFzcz0idmFsdWUiIC8+PC9zcGFuPicgKwogICAgICAnIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKydfMiIgc2l6ZT0iMTQiIGNsYXNzPSJ2YWx1ZSIgLz48L3NwYW4+JwogICAgKTsKICAgICQoJyN2YWx1ZXNfJytmaWVsZElkKydfMScpLnZhbCh2YWx1ZXNbMF0pOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQrJ18yJykudmFsKHZhbHVlc1sxXSk7CiAgICBicmVhazsKICB9Cn0KCmZ1bmN0aW9uIHRvZ2dsZUZpbHRlcihmaWVsZCkgewogIHZhciBmaWVsZElkID0gZmllbGQucmVwbGFjZSgnLicsICdfJyk7CiAgaWYgKCQoJyNjYl8nICsgZmllbGRJZCkuaXMoJzpjaGVja2VkJykpIHsKICAgICQoIiNvcGVyYXRvcnNfIiArIGZpZWxkSWQpLnNob3coKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpOwogICAgdG9nZ2xlT3BlcmF0b3IoZmllbGQpOwogIH0gZWxzZSB7CiAgICAkKCIjb3BlcmF0b3JzXyIgKyBmaWVsZElkKS5oaWRlKCkuYXR0cignZGlzYWJsZWQnLCB0cnVlKTsKICAgIGVuYWJsZVZhbHVlcyhmaWVsZCwgW10pOwogIH0KfQoKZnVuY3Rpb24gZW5hYmxlVmFsdWVzKGZpZWxkLCBpbmRleGVzKSB7CiAgdmFyIGZpZWxkSWQgPSBmaWVsZC5yZXBsYWNlKCcuJywgJ18nKTsKICAkKCcjdHJfJytmaWVsZElkKycgLnZhbHVlcyAudmFsdWUnKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICBpZiAoJC5pbkFycmF5KGluZGV4LCBpbmRleGVzKSA+PSAwKSB7CiAgICAgICQodGhpcykucmVtb3ZlQXR0cignZGlzYWJsZWQnKTsKICAgICAgJCh0aGlzKS5wYXJlbnRzKCdzcGFuJykuZmlyc3QoKS5zaG93KCk7CiAgICB9IGVsc2UgewogICAgICAkKHRoaXMpLnZhbCgnJyk7CiAgICAgICQodGhpcykuYXR0cignZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgJCh0aGlzKS5wYXJlbnRzKCdzcGFuJykuZmlyc3QoKS5oaWRlKCk7CiAgICB9CgogICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ2dyb3VwJykpIHsKICAgICAgJCh0aGlzKS5hZGRDbGFzcygnb3BlbicpOwogICAgfSBlbHNlIHsKICAgICAgJCh0aGlzKS5zaG93KCk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIHRvZ2dsZU9wZXJhdG9yKGZpZWxkKSB7CiAgdmFyIGZpZWxkSWQgPSBmaWVsZC5yZXBsYWNlKCcuJywgJ18nKTsKICB2YXIgb3BlcmF0b3IgPSAkKCIjb3BlcmF0b3JzXyIgKyBmaWVsZElkKTsKICBzd2l0Y2ggKG9wZXJhdG9yLnZhbCgpKSB7CiAgICBjYXNlICIhKiI6CiAgICBjYXNlICIqIjoKICAgIGNhc2UgIm5kIjoKICAgIGNhc2UgInQiOgogICAgY2FzZSAibGQiOgogICAgY2FzZSAibnciOgogICAgY2FzZSAidyI6CiAgICBjYXNlICJsdyI6CiAgICBjYXNlICJsMnciOgogICAgY2FzZSAibm0iOgogICAgY2FzZSAibSI6CiAgICBjYXNlICJsbSI6CiAgICBjYXNlICJ5IjoKICAgIGNhc2UgIm8iOgogICAgY2FzZSAiYyI6CiAgICBjYXNlICIqbyI6CiAgICBjYXNlICIhbyI6CiAgICAgIGVuYWJsZVZhbHVlcyhmaWVsZCwgW10pOwogICAgICBicmVhazsKICAgIGNhc2UgIj48IjoKICAgICAgZW5hYmxlVmFsdWVzKGZpZWxkLCBbMCwxXSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAiPHQrIjoKICAgIGNhc2UgIj50KyI6CiAgICBjYXNlICI+PHQrIjoKICAgIGNhc2UgInQrIjoKICAgIGNhc2UgIj50LSI6CiAgICBjYXNlICI8dC0iOgogICAgY2FzZSAiPjx0LSI6CiAgICBjYXNlICJ0LSI6CiAgICAgIGVuYWJsZVZhbHVlcyhmaWVsZCwgWzJdKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICI9cCI6CiAgICBjYXNlICI9IXAiOgogICAgY2FzZSAiIXAiOgogICAgICBlbmFibGVWYWx1ZXMoZmllbGQsIFsxXSk7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgZW5hYmxlVmFsdWVzKGZpZWxkLCBbMF0pOwogICAgICBicmVhazsKICB9Cn0KCmZ1bmN0aW9uIHRvZ2dsZU11bHRpU2VsZWN0KGVsKSB7CiAgdmFyIGlzV29ya2Zsb3cgPSBlbC5jbG9zZXN0KCcuY29udHJvbGxlci13b3JrZmxvd3MnKTsKICBpZiAoZWwuYXR0cignbXVsdGlwbGUnKSkgewogICAgZWwucmVtb3ZlQXR0cignbXVsdGlwbGUnKTsKICAgIGlmIChpc1dvcmtmbG93KSB7IGVsLmZpbmQoIm9wdGlvblt2YWx1ZT1hbGxdIikuc2hvdygpOyB9CiAgICBlbC5hdHRyKCdzaXplJywgMSk7CiAgfSBlbHNlIHsKICAgIGVsLmF0dHIoJ211bHRpcGxlJywgdHJ1ZSk7CiAgICBpZiAoaXNXb3JrZmxvdykgeyBlbC5maW5kKCJvcHRpb25bdmFsdWU9YWxsXSIpLmF0dHIoInNlbGVjdGVkIiwgZmFsc2UpLmhpZGUoKTsgfQogICAgaWYgKGVsLmNoaWxkcmVuKCkubGVuZ3RoID4gMTApCiAgICAgIGVsLmF0dHIoJ3NpemUnLCAxMCk7CiAgICBlbHNlCiAgICAgIGVsLmF0dHIoJ3NpemUnLCA0KTsKICB9Cn0KCmZ1bmN0aW9uIHNob3dUYWIobmFtZSwgdXJsKSB7CiAgJCgnI3RhYi1jb250ZW50LScgKyBuYW1lKS5wYXJlbnQoKS5maW5kKCcudGFiLWNvbnRlbnQnKS5oaWRlKCk7CiAgJCgnI3RhYi1jb250ZW50LScgKyBuYW1lKS5zaG93KCk7CiAgJCgnI3RhYi0nICsgbmFtZSkuY2xvc2VzdCgnLnRhYnMnKS5maW5kKCdhJykucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkJyk7CiAgJCgnI3RhYi0nICsgbmFtZSkuYWRkQ2xhc3MoJ3NlbGVjdGVkJyk7CgogIHJlcGxhY2VJbkhpc3RvcnkodXJsKQoKICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIHNob3dJc3N1ZUhpc3Rvcnkoam91cm5hbCwgdXJsKSB7CiAgdGFiX2NvbnRlbnQgPSAkKCcjdGFiLWNvbnRlbnQtaGlzdG9yeScpOwogIHRhYl9jb250ZW50LnBhcmVudCgpLmZpbmQoJy50YWItY29udGVudCcpLmhpZGUoKTsKICB0YWJfY29udGVudC5zaG93KCk7CiAgdGFiX2NvbnRlbnQucGFyZW50KCkuY2hpbGRyZW4oJ2Rpdi50YWJzJykuZmluZCgnYScpLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpOwoKICAkKCcjdGFiLScgKyBqb3VybmFsKS5hZGRDbGFzcygnc2VsZWN0ZWQnKTsKCiAgcmVwbGFjZUluSGlzdG9yeSh1cmwpCgogIHN3aXRjaChqb3VybmFsKSB7CiAgICBjYXNlICdub3Rlcyc6CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbDpub3QoLmhhcy1ub3RlcyknKS5oaWRlKCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC53aWtpJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAuY29udGV4dHVhbCAuam91cm5hbC1hY3Rpb25zJykuc2hvdygpOwoKICAgICAgLy8gYWx3YXlzIHNob3cgdGh1bWJuYWlscyBpbiBub3RlcyB0YWIKICAgICAgdmFyIHRodW1ibmFpbHMgPSB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAudGh1bWJuYWlscycpOwogICAgICB0aHVtYm5haWxzLnNob3coKTsKICAgICAgLy8gc2hvdyBqb3VybmFscyB3aXRob3V0IG5vdGVzLCBidXQgd2l0aCB0aHVtYm5haWxzCiAgICAgIHRodW1ibmFpbHMucGFyZW50cygnLmpvdXJuYWwnKS5zaG93KCk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAncHJvcGVydGllcyc6CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbDpub3QoLmhhcy1kZXRhaWxzKScpLmhpZGUoKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwgLndpa2knKS5oaWRlKCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC50aHVtYm5haWxzJykuaGlkZSgpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAuY29udGV4dHVhbCAuam91cm5hbC1hY3Rpb25zJykuaGlkZSgpOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAud2lraScpLnNob3coKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwgLnRodW1ibmFpbHMnKS5zaG93KCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC5jb250ZXh0dWFsIC5qb3VybmFsLWFjdGlvbnMnKS5zaG93KCk7CiAgfQoKICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIGdldFJlbW90ZVRhYihuYW1lLCByZW1vdGVfdXJsLCB1cmwsIGxvYWRfYWx3YXlzKSB7CiAgbG9hZF9hbHdheXMgPSBsb2FkX2Fsd2F5cyB8fCBmYWxzZTsKICB2YXIgdGFiX2NvbnRlbnQgPSAkKCcjdGFiLWNvbnRlbnQtJyArIG5hbWUpOwoKICB0YWJfY29udGVudC5wYXJlbnQoKS5maW5kKCcudGFiLWNvbnRlbnQnKS5oaWRlKCk7CiAgdGFiX2NvbnRlbnQucGFyZW50KCkuY2hpbGRyZW4oJ2Rpdi50YWJzJykuZmluZCgnYScpLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpOwogICQoJyN0YWItJyArIG5hbWUpLmFkZENsYXNzKCdzZWxlY3RlZCcpOwoKICByZXBsYWNlSW5IaXN0b3J5KHVybCk7CgogIGlmICh0YWJfY29udGVudC5jaGlsZHJlbigpLmxlbmd0aCA9PSAwICYmIGxvYWRfYWx3YXlzID09IGZhbHNlKSB7CiAgICAkLmFqYXgoewogICAgICB1cmw6IHJlbW90ZV91cmwsCiAgICAgIHR5cGU6ICdnZXQnLAogICAgICBzdWNjZXNzOiBmdW5jdGlvbihkYXRhKXsKICAgICAgICB0YWJfY29udGVudC5odG1sKGRhdGEpCiAgICAgIH0KICAgIH0pOwogIH0KCiAgdGFiX2NvbnRlbnQuc2hvdygpOwogIHJldHVybiBmYWxzZTsKfQoKLy9yZXBsYWNlcyBjdXJyZW50IFVSTCB3aXRoIHRoZSAiaHJlZiIgYXR0cmlidXRlIG9mIHRoZSBjdXJyZW50IGxpbmsKLy8ob25seSB0cmlnZ2VyZWQgaWYgc3VwcG9ydGVkIGJ5IGJyb3dzZXIpCmZ1bmN0aW9uIHJlcGxhY2VJbkhpc3RvcnkodXJsKSB7CiAgaWYgKCJyZXBsYWNlU3RhdGUiIGluIHdpbmRvdy5oaXN0b3J5ICYmIHVybCAhPT0gdW5kZWZpbmVkKSB7CiAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwgZG9jdW1lbnQudGl0bGUsIHVybCk7CiAgfQp9CgpmdW5jdGlvbiBtb3ZlVGFiUmlnaHQoZWwpIHsKICB2YXIgbGlzID0gJChlbCkucGFyZW50cygnZGl2LnRhYnMnKS5maXJzdCgpLmZpbmQoJ3VsJykuY2hpbGRyZW4oKTsKICB2YXIgYncgPSAkKGVsKS5wYXJlbnRzKCdkaXYudGFicy1idXR0b25zJykub3V0ZXJXaWR0aCh0cnVlKTsKICB2YXIgdGFic1dpZHRoID0gMDsKICB2YXIgaSA9IDA7CiAgbGlzLmVhY2goZnVuY3Rpb24oKSB7CiAgICBpZiAoJCh0aGlzKS5pcygnOnZpc2libGUnKSkgewogICAgICB0YWJzV2lkdGggKz0gJCh0aGlzKS5vdXRlcldpZHRoKHRydWUpOwogICAgfQogIH0pOwogIGlmICh0YWJzV2lkdGggPCAkKGVsKS5wYXJlbnRzKCdkaXYudGFicycpLmZpcnN0KCkud2lkdGgoKSAtIGJ3KSB7IHJldHVybjsgfQogICQoZWwpLnNpYmxpbmdzKCcudGFiLWxlZnQnKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICB3aGlsZSAoaTxsaXMubGVuZ3RoICYmICFsaXMuZXEoaSkuaXMoJzp2aXNpYmxlJykpIHsgaSsrOyB9CiAgdmFyIHcgPSBsaXMuZXEoaSkud2lkdGgoKTsKICBsaXMuZXEoaSkuaGlkZSgpOwogIGlmICh0YWJzV2lkdGggLSB3IDwgJChlbCkucGFyZW50cygnZGl2LnRhYnMnKS5maXJzdCgpLndpZHRoKCkgLSBidykgewogICAgJChlbCkuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7CiAgfQp9CgpmdW5jdGlvbiBtb3ZlVGFiTGVmdChlbCkgewogIHZhciBsaXMgPSAkKGVsKS5wYXJlbnRzKCdkaXYudGFicycpLmZpcnN0KCkuZmluZCgndWwnKS5jaGlsZHJlbigpOwogIHZhciBpID0gMDsKICB3aGlsZSAoaSA8IGxpcy5sZW5ndGggJiYgIWxpcy5lcShpKS5pcygnOnZpc2libGUnKSkgeyBpKys7IH0KICBpZiAoaSA+IDApIHsKICAgIGxpcy5lcShpLTEpLnNob3coKTsKICAgICQoZWwpLnNpYmxpbmdzKCcudGFiLXJpZ2h0JykucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7CiAgfQogIGlmIChpIDw9IDEpIHsKICAgICQoZWwpLmFkZENsYXNzKCdkaXNhYmxlZCcpOwogIH0KfQoKZnVuY3Rpb24gZGlzcGxheVRhYnNCdXR0b25zKCkgewogIHZhciBsaXM7CiAgdmFyIHRhYnNXaWR0aDsKICB2YXIgZWw7CiAgdmFyIG51bUhpZGRlbjsKICAkKCdkaXYudGFicycpLmVhY2goZnVuY3Rpb24oKSB7CiAgICBlbCA9ICQodGhpcyk7CiAgICBsaXMgPSBlbC5maW5kKCd1bCcpLmNoaWxkcmVuKCk7CiAgICB0YWJzV2lkdGggPSAwOwogICAgbnVtSGlkZGVuID0gMDsKICAgIGxpcy5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgIGlmICgkKHRoaXMpLmlzKCc6dmlzaWJsZScpKSB7CiAgICAgICAgdGFic1dpZHRoICs9ICQodGhpcykub3V0ZXJXaWR0aCh0cnVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBudW1IaWRkZW4rKzsKICAgICAgfQogICAgfSk7CiAgICB2YXIgYncgPSAkKGVsKS5maW5kKCdkaXYudGFicy1idXR0b25zJykub3V0ZXJXaWR0aCh0cnVlKTsKICAgIGlmICgodGFic1dpZHRoIDwgZWwud2lkdGgoKSAtIGJ3KSAmJiAobGlzLmxlbmd0aCA9PT0gMCB8fCBsaXMuZmlyc3QoKS5pcygnOnZpc2libGUnKSkpIHsKICAgICAgZWwuZmluZCgnZGl2LnRhYnMtYnV0dG9ucycpLmhpZGUoKTsKICAgIH0gZWxzZSB7CiAgICAgIGVsLmZpbmQoJ2Rpdi50YWJzLWJ1dHRvbnMnKS5zaG93KCkuY2hpbGRyZW4oJ2J1dHRvbi50YWItbGVmdCcpLnRvZ2dsZUNsYXNzKCdkaXNhYmxlZCcsIG51bUhpZGRlbiA9PSAwKTsKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gc2V0UHJlZGVjZXNzb3JGaWVsZHNWaXNpYmlsaXR5KCkgewogIHZhciByZWxhdGlvblR5cGUgPSAkKCcjcmVsYXRpb25fcmVsYXRpb25fdHlwZScpOwogIGlmIChyZWxhdGlvblR5cGUudmFsKCkgPT0gInByZWNlZGVzIiB8fCByZWxhdGlvblR5cGUudmFsKCkgPT0gImZvbGxvd3MiKSB7CiAgICAkKCcjcHJlZGVjZXNzb3JfZmllbGRzJykuc2hvdygpOwogIH0gZWxzZSB7CiAgICAkKCcjcHJlZGVjZXNzb3JfZmllbGRzJykuaGlkZSgpOwogIH0KfQoKZnVuY3Rpb24gc2hvd01vZGFsKGlkLCB3aWR0aCwgdGl0bGUpIHsKICB2YXIgZWwgPSAkKCcjJytpZCkuZmlyc3QoKTsKICBpZiAoZWwubGVuZ3RoID09PSAwIHx8IGVsLmlzKCc6dmlzaWJsZScpKSB7cmV0dXJuO30KICBpZiAoIXRpdGxlKSB0aXRsZSA9IGVsLmZpbmQoJ2gzLnRpdGxlJykudGV4dCgpOwogIC8vIG1vdmVzIGV4aXN0aW5nIG1vZGFscyBiZWhpbmQgdGhlIHRyYW5zcGFyZW50IGJhY2tncm91bmQKICAkKCIubW9kYWwiKS5jc3MoJ3pJbmRleCcsOTkpOwogIGVsLmRpYWxvZyh7CiAgICB3aWR0aDogd2lkdGgsCiAgICBtb2RhbDogdHJ1ZSwKICAgIHJlc2l6YWJsZTogZmFsc2UsCiAgICBkaWFsb2dDbGFzczogJ21vZGFsJywKICAgIHRpdGxlOiB0aXRsZQogIH0pLm9uKCdkaWFsb2djbG9zZScsIGZ1bmN0aW9uKCl7CiAgICAkKCIubW9kYWwiKS5jc3MoJ3pJbmRleCcsMTAxKTsKICB9KTsKICBlbC5maW5kKCJpbnB1dFt0eXBlPXRleHRdLCBpbnB1dFt0eXBlPXN1Ym1pdF0iKS5maXJzdCgpLmZvY3VzKCk7Cn0KCmZ1bmN0aW9uIGhpZGVNb2RhbChlbCkgewogIHZhciBtb2RhbDsKICBpZiAoZWwpIHsKICAgIG1vZGFsID0gJChlbCkucGFyZW50cygnLnVpLWRpYWxvZy1jb250ZW50Jyk7CiAgfSBlbHNlIHsKICAgIG1vZGFsID0gJCgnI2FqYXgtbW9kYWwnKTsKICB9CiAgbW9kYWwuZGlhbG9nKCJjbG9zZSIpOwp9CgpmdW5jdGlvbiBjb2xsYXBzZVNjbUVudHJ5KGlkKSB7CiAgJCgnLicraWQpLmVhY2goZnVuY3Rpb24oKSB7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnb3BlbicpKSB7CiAgICAgIGNvbGxhcHNlU2NtRW50cnkoJCh0aGlzKS5hdHRyKCdpZCcpKTsKICAgIH0KICAgICQodGhpcykuaGlkZSgpOwogIH0pOwogICQoJyMnK2lkKS5yZW1vdmVDbGFzcygnb3BlbicpOwp9CgpmdW5jdGlvbiBleHBhbmRTY21FbnRyeShpZCkgewogICQoJy4nK2lkKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgJCh0aGlzKS5zaG93KCk7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnbG9hZGVkJykgJiYgISQodGhpcykuaGFzQ2xhc3MoJ2NvbGxhcHNlZCcpKSB7CiAgICAgIGV4cGFuZFNjbUVudHJ5KCQodGhpcykuYXR0cignaWQnKSk7CiAgICB9CiAgfSk7CiAgJCgnIycraWQpLmFkZENsYXNzKCdvcGVuJyk7Cn0KCmZ1bmN0aW9uIHNjbUVudHJ5Q2xpY2soaWQsIHVybCkgewogICAgdmFyIGVsID0gJCgnIycraWQpOwogICAgdmFyIGV4cGFuZGVyID0gZWwuZmluZCgnLmV4cGFuZGVyJyk7CiAgICB2YXIgZm9sZGVyID0gZWwuZmluZCgnLmljb24tZm9sZGVyJyk7CgogICAgaWYgKGVsLmhhc0NsYXNzKCdvcGVuJykpIHsKICAgICAgICBjb2xsYXBzZVNjbUVudHJ5KGlkKTsKICAgICAgICBlbC5maW5kKCcuZXhwYW5kZXInKS5zd2l0Y2hDbGFzcygnaWNvbi1leHBhbmRlZCcsICdpY29uLWNvbGxhcHNlZCcpOwogICAgICAgIGVsLmFkZENsYXNzKCdjb2xsYXBzZWQnKTsKICAgICAgICB1cGRhdGVTVkdJY29uKGZvbGRlclswXSwgJ2ZvbGRlcicpCiAgICAgICAgdG9nZ2xlRXhwZW5kQ29sbGFwc2VJY29uKGV4cGFuZGVyWzBdKTsKCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSBlbHNlIGlmIChlbC5oYXNDbGFzcygnbG9hZGVkJykpIHsKICAgICAgICBleHBhbmRTY21FbnRyeShpZCk7CiAgICAgICAgZWwuZmluZCgnLmV4cGFuZGVyJykuc3dpdGNoQ2xhc3MoJ2ljb24tY29sbGFwc2VkJywgJ2ljb24tZXhwYW5kZWQnKTsKICAgICAgICBlbC5yZW1vdmVDbGFzcygnY29sbGFwc2VkJyk7CiAgICAgICAgdXBkYXRlU1ZHSWNvbihmb2xkZXJbMF0sICdmb2xkZXItb3BlbicpCiAgICAgICAgdG9nZ2xlRXhwZW5kQ29sbGFwc2VJY29uKGV4cGFuZGVyWzBdKTsKCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKGVsLmhhc0NsYXNzKCdsb2FkaW5nJykpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBlbC5hZGRDbGFzcygnbG9hZGluZycpOwogICAgJC5hamF4KHsKICAgICAgdXJsOiB1cmwsCiAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICBlbC5hZnRlcihkYXRhKTsKICAgICAgICBlbC5hZGRDbGFzcygnb3BlbicpLmFkZENsYXNzKCdsb2FkZWQnKS5yZW1vdmVDbGFzcygnbG9hZGluZycpOwogICAgICAgIGVsLmZpbmQoJy5leHBhbmRlcicpLnN3aXRjaENsYXNzKCdpY29uLWNvbGxhcHNlZCcsICdpY29uLWV4cGFuZGVkJyk7CiAgICAgICAgdXBkYXRlU1ZHSWNvbihmb2xkZXJbMF0sICdmb2xkZXItb3BlbicpCiAgICAgICAgdG9nZ2xlRXhwZW5kQ29sbGFwc2VJY29uKGV4cGFuZGVyWzBdKTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gdHJ1ZTsKfQoKZnVuY3Rpb24gcmFuZG9tS2V5KHNpemUpIHsKICB2YXIgY2hhcnMgPSAnMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonOwogIHZhciBrZXkgPSAnJzsKICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykgewogICAga2V5ICs9IGNoYXJzLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGFycy5sZW5ndGgpKTsKICB9CiAgcmV0dXJuIGtleTsKfQoKZnVuY3Rpb24gY29weVRleHRUb0NsaXBib2FyZCh0YXJnZXQpIHsKICBpZiAodGFyZ2V0KSB7CiAgICB2YXIgdGVtcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7CiAgICB0ZW1wLnZhbHVlID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1jbGlwYm9hcmQtdGV4dCcpOwogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZW1wKTsKICAgIHRlbXAuc2VsZWN0KCk7CiAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpOwogICAgaWYgKHRlbXAucGFyZW50Tm9kZSkgewogICAgICB0ZW1wLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGVtcCk7CiAgICB9CiAgICBpZiAoJCh0YXJnZXQpLmNsb3Nlc3QoJy5kcmRuLmV4cGFuZGVkJykubGVuZ3RoKSB7CiAgICAgICQodGFyZ2V0KS5jbG9zZXN0KCcuZHJkbi5leHBhbmRlZCcpLnJlbW92ZUNsYXNzKCJleHBhbmRlZCIpOwogICAgfQogIH0KICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIHVwZGF0ZUlzc3VlRnJvbSh1cmwsIGVsKSB7CiAgJCgnI2FsbF9hdHRyaWJ1dGVzIGlucHV0LCAjYWxsX2F0dHJpYnV0ZXMgdGV4dGFyZWEsICNhbGxfYXR0cmlidXRlcyBzZWxlY3QnKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAkKHRoaXMpLmRhdGEoJ3ZhbHVlYmVmb3JldXBkYXRlJywgJCh0aGlzKS52YWwoKSk7CiAgfSk7CiAgaWYgKGVsKSB7CiAgICAkKCIjZm9ybV91cGRhdGVfdHJpZ2dlcmVkX2J5IikudmFsKCQoZWwpLmF0dHIoJ2lkJykpOwogIH0KICByZXR1cm4gJC5hamF4KHsKICAgIHVybDogdXJsLAogICAgdHlwZTogJ3Bvc3QnLAogICAgZGF0YTogJCgnI2lzc3VlLWZvcm0nKS5zZXJpYWxpemUoKQogIH0pOwp9CgpmdW5jdGlvbiByZXBsYWNlSXNzdWVGb3JtV2l0aChodG1sKXsKICB2YXIgcmVwbGFjZW1lbnQgPSAkKGh0bWwpOwogICQoJyNhbGxfYXR0cmlidXRlcyBpbnB1dCwgI2FsbF9hdHRyaWJ1dGVzIHRleHRhcmVhLCAjYWxsX2F0dHJpYnV0ZXMgc2VsZWN0JykuZWFjaChmdW5jdGlvbigpewogICAgdmFyIG9iamVjdF9pZCA9ICQodGhpcykuYXR0cignaWQnKTsKICAgIGlmIChvYmplY3RfaWQgJiYgJCh0aGlzKS5kYXRhKCd2YWx1ZWJlZm9yZXVwZGF0ZScpIT0kKHRoaXMpLnZhbCgpKSB7CiAgICAgIHJlcGxhY2VtZW50LmZpbmQoJyMnK29iamVjdF9pZCkudmFsKCQodGhpcykudmFsKCkpOwogICAgfQogIH0pOwogICQoJyNhbGxfYXR0cmlidXRlcycpLmVtcHR5KCk7CiAgJCgnI2FsbF9hdHRyaWJ1dGVzJykucHJlcGVuZChyZXBsYWNlbWVudCk7Cn0KCmZ1bmN0aW9uIHVwZGF0ZUJ1bGtFZGl0RnJvbSh1cmwpIHsKICAkLmFqYXgoewogICAgdXJsOiB1cmwsCiAgICB0eXBlOiAncG9zdCcsCiAgICBkYXRhOiAkKCcjYnVsa19lZGl0X2Zvcm0nKS5zZXJpYWxpemUoKQogIH0pOwp9CgpmdW5jdGlvbiBvYnNlcnZlQXV0b2NvbXBsZXRlRmllbGQoZmllbGRJZCwgdXJsLCBvcHRpb25zKSB7CiAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CiAgICAkKCcjJytmaWVsZElkKS5hdXRvY29tcGxldGUoJC5leHRlbmQoewogICAgICBzb3VyY2U6IHVybCwKICAgICAgbWluTGVuZ3RoOiAyLAogICAgICBwb3NpdGlvbjoge2NvbGxpc2lvbjogImZsaXBmaXQifSwKICAgICAgc2VhcmNoOiBmdW5jdGlvbigpeyQoJyMnK2ZpZWxkSWQpLmFkZENsYXNzKCdhamF4LWxvYWRpbmcnKTt9LAogICAgICByZXNwb25zZTogZnVuY3Rpb24oKXskKCcjJytmaWVsZElkKS5yZW1vdmVDbGFzcygnYWpheC1sb2FkaW5nJyk7fQogICAgfSwgb3B0aW9ucykpOwogICAgJCgnIycrZmllbGRJZCkuYWRkQ2xhc3MoJ2F1dG9jb21wbGV0ZScpOwogIH0pOwp9CgpmdW5jdGlvbiBtdWx0aXBsZUF1dG9jb21wbGV0ZUZpZWxkKGZpZWxkSWQsIHVybCwgb3B0aW9ucykgewogIGZ1bmN0aW9uIHNwbGl0KHZhbCkgewogICAgcmV0dXJuIHZhbC5zcGxpdCgvLFxzKi8pOwogIH0KCiAgZnVuY3Rpb24gZXh0cmFjdExhc3QodGVybSkgewogICAgcmV0dXJuIHNwbGl0KHRlcm0pLnBvcCgpOwogIH0KCiAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkgewogICAgJCgnIycgKyBmaWVsZElkKS5hdXRvY29tcGxldGUoJC5leHRlbmQoewogICAgICBzb3VyY2U6IGZ1bmN0aW9uIChyZXF1ZXN0LCByZXNwb25zZSkgewogICAgICAgICQuZ2V0SlNPTih1cmwsIHsKICAgICAgICAgIHRlcm06IGV4dHJhY3RMYXN0KHJlcXVlc3QudGVybSkKICAgICAgICB9LCByZXNwb25zZSk7CiAgICAgIH0sCiAgICAgIG1pbkxlbmd0aDogMiwKICAgICAgcG9zaXRpb246IHtjb2xsaXNpb246ICJmbGlwZml0In0sCiAgICAgIHNlYXJjaDogZnVuY3Rpb24gKCkgewogICAgICAgICQoJyMnICsgZmllbGRJZCkuYWRkQ2xhc3MoJ2FqYXgtbG9hZGluZycpOwogICAgICB9LAogICAgICByZXNwb25zZTogZnVuY3Rpb24gKCkgewogICAgICAgICQoJyMnICsgZmllbGRJZCkucmVtb3ZlQ2xhc3MoJ2FqYXgtbG9hZGluZycpOwogICAgICB9LAogICAgICBzZWxlY3Q6IGZ1bmN0aW9uIChldmVudCwgdWkpIHsKICAgICAgICB2YXIgdGVybXMgPSBzcGxpdCh0aGlzLnZhbHVlKTsKICAgICAgICAvLyByZW1vdmUgdGhlIGN1cnJlbnQgaW5wdXQKICAgICAgICB0ZXJtcy5wb3AoKTsKICAgICAgICAvLyBhZGQgdGhlIHNlbGVjdGVkIGl0ZW0KICAgICAgICB0ZXJtcy5wdXNoKHVpLml0ZW0udmFsdWUpOwogICAgICAgIC8vIGFkZCBwbGFjZWhvbGRlciB0byBnZXQgdGhlIGNvbW1hLWFuZC1zcGFjZSBhdCB0aGUgZW5kCiAgICAgICAgdGVybXMucHVzaCgiIik7CiAgICAgICAgdGhpcy52YWx1ZSA9IHRlcm1zLmpvaW4oIiwgIik7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9LCBvcHRpb25zKSk7CiAgICAkKCcjJyArIGZpZWxkSWQpLmFkZENsYXNzKCdhdXRvY29tcGxldGUnKTsKICB9KTsKfQoKZnVuY3Rpb24gb2JzZXJ2ZVNlYXJjaGZpZWxkKGZpZWxkSWQsIHRhcmdldElkLCB1cmwpIHsKICAkKCcjJytmaWVsZElkKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgdmFyICR0aGlzID0gJCh0aGlzKTsKICAgICR0aGlzLmFkZENsYXNzKCdhdXRvY29tcGxldGUnKTsKICAgICR0aGlzLmF0dHIoJ2RhdGEtdmFsdWUtd2FzJywgJHRoaXMudmFsKCkpOwogICAgdmFyIGNoZWNrID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciB2YWwgPSAkdGhpcy52YWwoKTsKICAgICAgaWYgKCR0aGlzLmF0dHIoJ2RhdGEtdmFsdWUtd2FzJykgIT0gdmFsKXsKICAgICAgICAkdGhpcy5hdHRyKCdkYXRhLXZhbHVlLXdhcycsIHZhbCk7CiAgICAgICAgJC5hamF4KHsKICAgICAgICAgIHVybDogdXJsLAogICAgICAgICAgdHlwZTogJ2dldCcsCiAgICAgICAgICBkYXRhOiB7cTogJHRoaXMudmFsKCl9LAogICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSl7IGlmKHRhcmdldElkKSAkKCcjJyt0YXJnZXRJZCkuaHRtbChkYXRhKTsgfSwKICAgICAgICAgIGJlZm9yZVNlbmQ6IGZ1bmN0aW9uKCl7ICR0aGlzLmFkZENsYXNzKCdhamF4LWxvYWRpbmcnKTsgfSwKICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpeyAkdGhpcy5yZW1vdmVDbGFzcygnYWpheC1sb2FkaW5nJyk7IH0KICAgICAgICB9KTsKICAgICAgfQogICAgfTsKICAgIHZhciByZXNldCA9IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGltZXIpIHsKICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsKICAgICAgICB0aW1lciA9IHNldEludGVydmFsKGNoZWNrLCAzMDApOwogICAgICB9CiAgICB9OwogICAgdmFyIHRpbWVyID0gc2V0SW50ZXJ2YWwoY2hlY2ssIDMwMCk7CiAgICAkdGhpcy5iaW5kKCdrZXl1cCBjbGljayBtb3VzZW1vdmUnLCByZXNldCk7CiAgfSk7Cn0KCiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCl7CiAgJCgiLmRyZG4gLmF1dG9jb21wbGV0ZSIpLnZhbCgnJyk7CgogIC8vIFRoaXMgdmFyaWFibGUgaXMgdXNlZCB0byBmb2N1cyBzZWxlY3RlZCBwcm9qZWN0CiAgdmFyIHNlbGVjdGVkOwogICQoZG9jdW1lbnQpLm9uKCdjbGljaycsICcuZHJkbi10cmlnZ2VyJywgZnVuY3Rpb24oZSl7CiAgICB2YXIgZHJkbiA9ICQodGhpcykuY2xvc2VzdCgiLmRyZG4iKTsKICAgIGlmIChkcmRuLmhhc0NsYXNzKCJleHBhbmRlZCIpKSB7CiAgICAgIGRyZG4ucmVtb3ZlQ2xhc3MoImV4cGFuZGVkIik7CiAgICB9IGVsc2UgewogICAgICAkKCIuZHJkbiIpLnJlbW92ZUNsYXNzKCJleHBhbmRlZCIpOwogICAgICBkcmRuLmFkZENsYXNzKCJleHBhbmRlZCIpOwogICAgICBpZiAoJCh0aGlzKS5wYXJlbnQoJyNwcm9qZWN0LWp1bXAnKS5sZW5ndGgpIHsKICAgICAgICBzZWxlY3RlZCA9ICQoJy5kcmRuLWl0ZW1zIGEuc2VsZWN0ZWQnKTsgLy8gU3RvcmUgc2VsZWN0ZWQgcHJvamVjdAogICAgICAgIHNlbGVjdGVkLmZpcnN0KCkuZm9jdXMoKTsgLy8gQ2FsbGluZyBmb2N1cyB0byBzY3JvbGwgdG8gc2VsZWN0ZWQgcHJvamVjdAogICAgICB9CiAgICAgIGlmICghaXNNb2JpbGUoKSkgewogICAgICAgIGRyZG4uZmluZCgiLmF1dG9jb21wbGV0ZSIpLmZvY3VzKCk7CiAgICAgIH0KICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgIH0KICB9KTsKICAkKGRvY3VtZW50KS5jbGljayhmdW5jdGlvbihlKXsKICAgIGlmICgkKGUudGFyZ2V0KS5jbG9zZXN0KCIuZHJkbiIpLmxlbmd0aCA8IDEpIHsKICAgICAgJCgiLmRyZG4uZXhwYW5kZWQiKS5yZW1vdmVDbGFzcygiZXhwYW5kZWQiKTsKICAgIH0KICB9KTsKCiAgb2JzZXJ2ZVNlYXJjaGZpZWxkKCdwcm9qZWN0cy1xdWljay1zZWFyY2gnLCBudWxsLCAkKCcjcHJvamVjdHMtcXVpY2stc2VhcmNoJykuZGF0YSgnYXV0b21jb21wbGV0ZS11cmwnKSk7CgogICQoIi5kcmRuLWNvbnRlbnQiKS5rZXlkb3duKGZ1bmN0aW9uKGV2ZW50KXsKICAgIHZhciBpdGVtcyA9ICQodGhpcykuZmluZCgiLmRyZG4taXRlbXMiKTsKCiAgICAvLyBJZiBhIHByb2plY3QgaXMgc2VsZWN0ZWQgc2V0IGZvY3VzZWQgdG8gc2VsZWN0ZWQgb25seSBvbmNlCiAgICBpZiAoc2VsZWN0ZWQgJiYgc2VsZWN0ZWQubGVuZ3RoID4gMCkgewogICAgICB2YXIgZm9jdXNlZCA9IHNlbGVjdGVkOwogICAgICBzZWxlY3RlZCA9IHVuZGVmaW5lZDsKICAgIH0KICAgIGVsc2UgewogICAgICB2YXIgZm9jdXNlZCA9IGl0ZW1zLmZpbmQoImE6Zm9jdXMiKTsKICAgIH0KICAgIHN3aXRjaCAoZXZlbnQud2hpY2gpIHsKICAgIGNhc2UgNDA6IC8vZG93bgogICAgICBpZiAoZm9jdXNlZC5sZW5ndGggPiAwKSB7CiAgICAgICAgZm9jdXNlZC5uZXh0QWxsKCJhIikuZmlyc3QoKS5mb2N1cygpOzsKICAgICAgfSBlbHNlIHsKICAgICAgICBpdGVtcy5maW5kKCJhIikuZmlyc3QoKS5mb2N1cygpOzsKICAgICAgfQogICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBicmVhazsKICAgIGNhc2UgMzg6IC8vdXAKICAgICAgaWYgKGZvY3VzZWQubGVuZ3RoID4gMCkgewogICAgICAgIHZhciBwcmV2ID0gZm9jdXNlZC5wcmV2QWxsKCJhIik7CiAgICAgICAgaWYgKHByZXYubGVuZ3RoID4gMCkgewogICAgICAgICAgcHJldi5maXJzdCgpLmZvY3VzKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICQodGhpcykuZmluZCgiLmF1dG9jb21wbGV0ZSIpLmZvY3VzKCk7CiAgICAgICAgfQogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlIDM1OiAvL2VuZAogICAgICBpZiAoZm9jdXNlZC5sZW5ndGggPiAwKSB7CiAgICAgICAgZm9jdXNlZC5uZXh0QWxsKCJhIikubGFzdCgpLmZvY3VzKCk7CiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgMzY6IC8vaG9tZQogICAgICBpZiAoZm9jdXNlZC5sZW5ndGggPiAwKSB7CiAgICAgICAgZm9jdXNlZC5wcmV2QWxsKCJhIikubGFzdCgpLmZvY3VzKCk7CiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgfQogICAgICBicmVhazsKICAgIH0KICB9KTsKfSk7CgpmdW5jdGlvbiBiZWZvcmVTaG93RGF0ZVBpY2tlcihpbnB1dCwgaW5zdCkgewogIHZhciBkZWZhdWx0X2RhdGUgPSBudWxsOwogIHN3aXRjaCAoJChpbnB1dCkuYXR0cigiaWQiKSkgewogICAgY2FzZSAiaXNzdWVfc3RhcnRfZGF0ZSIgOgogICAgICBpZiAoJCgiI2lzc3VlX2R1ZV9kYXRlIikubGVuZ3RoID4gMCkgewogICAgICAgIGRlZmF1bHRfZGF0ZSA9ICQoIiNpc3N1ZV9kdWVfZGF0ZSIpLnZhbCgpOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSAiaXNzdWVfZHVlX2RhdGUiIDoKICAgICAgaWYgKCQoIiNpc3N1ZV9zdGFydF9kYXRlIikubGVuZ3RoID4gMCkgewogICAgICAgIHZhciBzdGFydF9kYXRlID0gJCgiI2lzc3VlX3N0YXJ0X2RhdGUiKS52YWwoKTsKICAgICAgICBpZiAoc3RhcnRfZGF0ZSAhPSAiIikgewogICAgICAgICAgc3RhcnRfZGF0ZSA9IG5ldyBEYXRlKERhdGUucGFyc2Uoc3RhcnRfZGF0ZSkpOwogICAgICAgICAgaWYgKHN0YXJ0X2RhdGUgPiBuZXcgRGF0ZSgpKSB7CiAgICAgICAgICAgIGRlZmF1bHRfZGF0ZSA9ICQoIiNpc3N1ZV9zdGFydF9kYXRlIikudmFsKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGJyZWFrOwogIH0KICAkKGlucHV0KS5kYXRlcGlja2VyRmFsbGJhY2soIm9wdGlvbiIsICJkZWZhdWx0RGF0ZSIsIGRlZmF1bHRfZGF0ZSk7Cn0KCihmdW5jdGlvbigkKXsKICAkLmZuLnBvc2l0aW9uZWRJdGVtcyA9IGZ1bmN0aW9uKHNvcnRhYmxlT3B0aW9ucywgb3B0aW9ucyl7CiAgICB2YXIgc2V0dGluZ3MgPSAkLmV4dGVuZCh7CiAgICAgIGZpcnN0UG9zaXRpb246IDEKICAgIH0sIG9wdGlvbnMgKTsKCiAgICByZXR1cm4gdGhpcy5zb3J0YWJsZSgkLmV4dGVuZCh7CiAgICAgIGF4aXM6ICd5JywKICAgICAgaGFuZGxlOiAiLnNvcnQtaGFuZGxlIiwKICAgICAgaGVscGVyOiBmdW5jdGlvbihldmVudCwgdWkpewogICAgICAgIHVpLmNoaWxkcmVuKCd0ZCcpLmVhY2goZnVuY3Rpb24oKXsKICAgICAgICAgICQodGhpcykud2lkdGgoJCh0aGlzKS53aWR0aCgpKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gdWk7CiAgICAgIH0sCiAgICAgIHVwZGF0ZTogZnVuY3Rpb24oZXZlbnQsIHVpKSB7CiAgICAgICAgdmFyIHNvcnRhYmxlID0gJCh0aGlzKTsKICAgICAgICB2YXIgaGFuZGxlID0gdWkuaXRlbS5maW5kKCIuc29ydC1oYW5kbGUiKS5hZGRDbGFzcygiYWpheC1sb2FkaW5nIik7CiAgICAgICAgdmFyIHVybCA9IGhhbmRsZS5kYXRhKCJyZW9yZGVyLXVybCIpOwogICAgICAgIHZhciBwYXJhbSA9IGhhbmRsZS5kYXRhKCJyZW9yZGVyLXBhcmFtIik7CiAgICAgICAgdmFyIGRhdGEgPSB7fTsKICAgICAgICBkYXRhW3BhcmFtXSA9IHtwb3NpdGlvbjogdWkuaXRlbS5pbmRleCgpICsgc2V0dGluZ3NbJ2ZpcnN0UG9zaXRpb24nXX07CiAgICAgICAgJC5hamF4KHsKICAgICAgICAgIHVybDogdXJsLAogICAgICAgICAgdHlwZTogJ3B1dCcsCiAgICAgICAgICBkYXRhVHlwZTogJ3NjcmlwdCcsCiAgICAgICAgICBkYXRhOiBkYXRhLAogICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bil7CiAgICAgICAgICAgIGFsZXJ0KGpxWEhSLnN0YXR1cyk7CiAgICAgICAgICAgIHNvcnRhYmxlLnNvcnRhYmxlKCJjYW5jZWwiKTsKICAgICAgICAgIH0sCiAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKXsKICAgICAgICAgICAgaGFuZGxlLnJlbW92ZUNsYXNzKCJhamF4LWxvYWRpbmciKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfSwKICAgIH0sIHNvcnRhYmxlT3B0aW9ucykpOwogIH0KfSggalF1ZXJ5ICkpOwoKdmFyIHdhcm5MZWF2aW5nVW5zYXZlZE1lc3NhZ2U7CmZ1bmN0aW9uIHdhcm5MZWF2aW5nVW5zYXZlZChtZXNzYWdlKSB7CiAgd2FybkxlYXZpbmdVbnNhdmVkTWVzc2FnZSA9IG1lc3NhZ2U7CiAgJChkb2N1bWVudCkub24oJ3N1Ym1pdCcsICdmb3JtJywgZnVuY3Rpb24oKXsKICAgICQoJ3RleHRhcmVhJykucmVtb3ZlRGF0YSgnY2hhbmdlZCcpOwogIH0pOwogICQoZG9jdW1lbnQpLm9uKCdjaGFuZ2UnLCAndGV4dGFyZWEnLCBmdW5jdGlvbigpewogICAgJCh0aGlzKS5kYXRhKCdjaGFuZ2VkJywgJ2NoYW5nZWQnKTsKICB9KTsKICB3aW5kb3cub25iZWZvcmV1bmxvYWQgPSBmdW5jdGlvbigpewogICAgdmFyIHdhcm4gPSBmYWxzZTsKICAgICQoJ3RleHRhcmVhJykuYmx1cigpLmVhY2goZnVuY3Rpb24oKXsKICAgICAgaWYgKCQodGhpcykuZGF0YSgnY2hhbmdlZCcpKSB7CiAgICAgICAgd2FybiA9IHRydWU7CiAgICAgIH0KICAgIH0pOwogICAgaWYgKHdhcm4pIHtyZXR1cm4gd2FybkxlYXZpbmdVbnNhdmVkTWVzc2FnZTt9CiAgfTsKfQoKZnVuY3Rpb24gc2V0dXBBamF4SW5kaWNhdG9yKCkgewogICQoZG9jdW1lbnQpLmJpbmQoJ2FqYXhTZW5kJywgZnVuY3Rpb24oZXZlbnQsIHhociwgc2V0dGluZ3MpIHsKICAgIGlmICgkKCcuYWpheC1sb2FkaW5nJykubGVuZ3RoID09PSAwICYmIHNldHRpbmdzLmNvbnRlbnRUeXBlICE9ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKSB7CiAgICAgICQoJyNhamF4LWluZGljYXRvcicpLnNob3coKTsKICAgIH0KICB9KTsKICAkKGRvY3VtZW50KS5iaW5kKCdhamF4U3RvcCcsIGZ1bmN0aW9uKCkgewogICAgJCgnI2FqYXgtaW5kaWNhdG9yJykuaGlkZSgpOwogIH0pOwp9CgpmdW5jdGlvbiBzZXR1cFRhYnMoKSB7CiAgaWYoJCgnLnRhYnMnKS5sZW5ndGggPiAwKSB7CiAgICBkaXNwbGF5VGFic0J1dHRvbnMoKTsKICAgICQod2luZG93KS5yZXNpemUoZGlzcGxheVRhYnNCdXR0b25zKTsKICB9Cn0KCmZ1bmN0aW9uIHNldHVwRmlsZVByZXZpZXdOYXZpZ2F0aW9uKCkgewogIC8vIG9ubHkgYmluZCBhcnJvdyBrZXlzIHdoZW4gcHJldmlldyBuYXZpZ2F0aW9uIGlzIHByZXNlbnQKICBjb25zdCBlbGVtZW50ID0gJCgnLnBhZ2luYXRpb24uZmlsZXByZXZpZXcnKS5maXJzdCgpOwogIGlmIChlbGVtZW50KSB7CgogICAgY29uc3QgaGFuZGxlQXJyb3dLZXkgPSBmdW5jdGlvbihzZWxlY3RvciwgZSl7CiAgICAgIGNvbnN0IGhyZWYgPSAkKGVsZW1lbnQpLmZpbmQoc2VsZWN0b3IpLmF0dHIoJ2hyZWYnKTsKICAgICAgaWYgKGhyZWYpIHsKICAgICAgICB3aW5kb3cubG9jYXRpb24gPSBocmVmOwogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgfQogICAgfTsKCiAgICAkKGRvY3VtZW50KS5rZXlkb3duKGZ1bmN0aW9uKGUpIHsKICAgICAgaWYoZS5zaGlmdEtleSB8fCBlLm1ldGFLZXkgfHwgZS5jdHJsS2V5IHx8IGUuYWx0S2V5KSByZXR1cm47CiAgICAgIHN3aXRjaChlLmtleSkgewogICAgICAgIGNhc2UgJ0Fycm93TGVmdCc6CiAgICAgICAgICBoYW5kbGVBcnJvd0tleSgnLnByZXZpb3VzIGEnLCBlKTsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdBcnJvd1JpZ2h0JzoKICAgICAgICAgIGhhbmRsZUFycm93S2V5KCcubmV4dCBhJywgZSk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfSk7CiAgfQp9CgokKGRvY3VtZW50KS5vbigna2V5ZG93bicsICdmb3JtIHRleHRhcmVhJywgZnVuY3Rpb24oZSkgewogIC8vIFN1Ym1pdCB0aGUgZm9ybSB3aXRoIEN0cmwgKyBFbnRlciBvciBDb21tYW5kICsgUmV0dXJuCiAgdmFyIHRhcmdldEZvcm0gPSAkKGUudGFyZ2V0KS5jbG9zZXN0KCdmb3JtJyk7CiAgaWYoZS5rZXlDb2RlID09IDEzICYmICgoZS5jdHJsS2V5ICYmICFlLm1ldGFLZXkpIHx8ICghZS5jdHJsS2V5ICYmIGUubWV0YUtleSkgJiYgdGFyZ2V0Rm9ybS5sZW5ndGgpKSB7CiAgICAvLyBGb3IgYWpheCwgdXNlIGNsaWNrKCkgaW5zdGVhZCBvZiBzdWJtaXQoKSB0byBwcmV2ZW50ICJJbnZhbGlkIGZvcm0gYXV0aGVudGljaXR5IHRva2VuIiBlcnJvcgogICAgaWYgKHRhcmdldEZvcm0uYXR0cignZGF0YS1yZW1vdGUnKSA9PSAndHJ1ZScpIHsKICAgICAgaWYgKHRhcmdldEZvcm0uZmluZCgnaW5wdXRbdHlwZT1zdWJtaXRdJykubGVuZ3RoID09PSAwKSB7IHJldHVybiBmYWxzZTsgfQogICAgICB0YXJnZXRGb3JtLmZpbmQoJ3RleHRhcmVhJykuYmx1cigpLnJlbW92ZURhdGEoJ2NoYW5nZWQnKTsKICAgICAgdGFyZ2V0Rm9ybS5maW5kKCdpbnB1dFt0eXBlPXN1Ym1pdF0nKS5maXJzdCgpLmNsaWNrKCk7CiAgICB9IGVsc2UgewogICAgICB0YXJnZXRGb3JtLmZpbmQoJ3RleHRhcmVhJykuYmx1cigpLnJlbW92ZURhdGEoJ2NoYW5nZWQnKTsKICAgICAgdGFyZ2V0Rm9ybS5zdWJtaXQoKTsKICAgIH0KICB9Cn0pOwoKCmZ1bmN0aW9uIGhpZGVPbkxvYWQoKSB7CiAgJCgnLmhvbCcpLmhpZGUoKTsKfQoKZnVuY3Rpb24gYWRkRm9ybU9ic2VydmVyc0ZvckRvdWJsZVN1Ym1pdCgpIHsKICAkKCdmb3JtW21ldGhvZD1wb3N0XScpLmVhY2goZnVuY3Rpb24oKSB7CiAgICBpZiAoISQodGhpcykuaGFzQ2xhc3MoJ211bHRpcGxlLXN1Ym1pdCcpKSB7CiAgICAgICQodGhpcykuc3VibWl0KGZ1bmN0aW9uKGZvcm1fc3VibWlzc2lvbikgewogICAgICAgIGlmICgkKGZvcm1fc3VibWlzc2lvbi50YXJnZXQpLmF0dHIoJ2RhdGEtc3VibWl0dGVkJykpIHsKICAgICAgICAgIGZvcm1fc3VibWlzc2lvbi5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAkKGZvcm1fc3VibWlzc2lvbi50YXJnZXQpLmF0dHIoJ2RhdGEtc3VibWl0dGVkJywgdHJ1ZSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gZGVmYXVsdEZvY3VzKCl7CiAgaWYgKCgkKCcjY29udGVudCA6Zm9jdXMnKS5sZW5ndGggPT0gMCkgJiYgKHdpbmRvdy5sb2NhdGlvbi5oYXNoID09ICcnKSkgewogICAgJCgnI2NvbnRlbnQgaW5wdXRbdHlwZT10ZXh0XTp2aXNpYmxlLCAjY29udGVudCB0ZXh0YXJlYTp2aXNpYmxlJykuZmlyc3QoKS5mb2N1cygpOwogIH0KfQoKZnVuY3Rpb24gYmxvY2tFdmVudFByb3BhZ2F0aW9uKGV2ZW50KSB7CiAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKfQoKZnVuY3Rpb24gdG9nZ2xlRGlzYWJsZWRPbkNoYW5nZSgpIHsKICB2YXIgY2hlY2tlZCA9ICQodGhpcykuaXMoJzpjaGVja2VkJyk7CiAgJCgkKHRoaXMpLmRhdGEoJ2Rpc2FibGVzJykpLmF0dHIoJ2Rpc2FibGVkJywgY2hlY2tlZCk7CiAgJCgkKHRoaXMpLmRhdGEoJ2VuYWJsZXMnKSkuYXR0cignZGlzYWJsZWQnLCAhY2hlY2tlZCk7CiAgJCgkKHRoaXMpLmRhdGEoJ3Nob3dzJykpLnRvZ2dsZShjaGVja2VkKTsKfQpmdW5jdGlvbiB0b2dnbGVEaXNhYmxlZEluaXQoKSB7CiAgJCgnaW5wdXRbZGF0YS1kaXNhYmxlc10sIGlucHV0W2RhdGEtZW5hYmxlc10sIGlucHV0W2RhdGEtc2hvd3NdJykuZWFjaCh0b2dnbGVEaXNhYmxlZE9uQ2hhbmdlKTsKfQpmdW5jdGlvbiB0b2dnbGVNdWx0aVNlbGVjdEljb25Jbml0KCkgewogICQoJy50b2dnbGUtbXVsdGlzZWxlY3Q6bm90KC5pY29uLXRvZ2dsZS1taW51cyk6bm90KC5pY29uLXRvZ2dsZS1wbHVzKScpLmVhY2goZnVuY3Rpb24oKXsKICAgIGxldCBpY29uVHlwZTsKICAgIGlmICgkKHRoaXMpLnNpYmxpbmdzKCdzZWxlY3QnKS5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS5sZW5ndGggPiAxKSB7CiAgICAgIGljb25UeXBlID0gJ3RvZ2dsZS1taW51cyc7CiAgICB9IGVsc2UgewogICAgICBpY29uVHlwZSA9ICd0b2dnbGUtcGx1cyc7CiAgICB9CgogICAgJCh0aGlzKS5hZGRDbGFzcyhgaWNvbi0ke2ljb25UeXBlfWApOwogICAgdXBkYXRlU1ZHSWNvbigkKHRoaXMpLmZpbmQoJ3N2ZycpWzBdLCBpY29uVHlwZSk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHRvZ2dsZU5ld09iamVjdERyb3Bkb3duKCkgewogIHZhciBkcm9wZG93biA9ICQoJyNuZXctb2JqZWN0ICsgdWwubWVudS1jaGlsZHJlbicpOwogIGlmKGRyb3Bkb3duLmhhc0NsYXNzKCd2aXNpYmxlJykpewogICAgZHJvcGRvd24ucmVtb3ZlQ2xhc3MoJ3Zpc2libGUnKTsKICB9ZWxzZXsKICAgIGRyb3Bkb3duLmFkZENsYXNzKCd2aXNpYmxlJyk7CiAgfQp9CgooZnVuY3Rpb24gKCAkICkgewoKICAvLyBkZXRlY3QgaWYgbmF0aXZlIGRhdGUgaW5wdXQgaXMgc3VwcG9ydGVkCiAgdmFyIG5hdGl2ZURhdGVJbnB1dFN1cHBvcnRlZCA9IHRydWU7CgogIHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7CiAgaW5wdXQuc2V0QXR0cmlidXRlKCd0eXBlJywnZGF0ZScpOwogIGlmIChpbnB1dC50eXBlID09PSAndGV4dCcpIHsKICAgIG5hdGl2ZURhdGVJbnB1dFN1cHBvcnRlZCA9IGZhbHNlOwogIH0KCiAgdmFyIG5vdEFEYXRlVmFsdWUgPSAnbm90LWEtZGF0ZSc7CiAgaW5wdXQuc2V0QXR0cmlidXRlKCd2YWx1ZScsIG5vdEFEYXRlVmFsdWUpOwogIGlmIChpbnB1dC52YWx1ZSA9PT0gbm90QURhdGVWYWx1ZSkgewogICAgbmF0aXZlRGF0ZUlucHV0U3VwcG9ydGVkID0gZmFsc2U7CiAgfQoKICAkLmZuLmRhdGVwaWNrZXJGYWxsYmFjayA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewogICAgaWYgKG5hdGl2ZURhdGVJbnB1dFN1cHBvcnRlZCkgewogICAgICByZXR1cm4gdGhpczsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0aGlzLmRhdGVwaWNrZXIoIG9wdGlvbnMgKTsKICAgIH0KICB9Owp9KCBqUXVlcnkgKSk7CgokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICQoJyNjb250ZW50Jykub24oJ2NoYW5nZScsICdpbnB1dFtkYXRhLWRpc2FibGVzXSwgaW5wdXRbZGF0YS1lbmFibGVzXSwgaW5wdXRbZGF0YS1zaG93c10nLCB0b2dnbGVEaXNhYmxlZE9uQ2hhbmdlKTsKICB0b2dnbGVEaXNhYmxlZEluaXQoKTsKCiAgJCgnI2NvbnRlbnQnKS5vbignY2xpY2snLCAnLnRvZ2dsZS1tdWx0aXNlbGVjdCcsIGZ1bmN0aW9uKCkgewogICAgdG9nZ2xlTXVsdGlTZWxlY3QoJCh0aGlzKS5zaWJsaW5ncygnc2VsZWN0JykpOwogICAgJCh0aGlzKS50b2dnbGVDbGFzcygnaWNvbi10b2dnbGUtcGx1cyBpY29uLXRvZ2dsZS1taW51cycpOwogICAgdXBkYXRlU1ZHSWNvbigkKHRoaXMpLmZpbmQoJ3N2ZycpWzBdLCAkKHRoaXMpLmhhc0NsYXNzKCdpY29uLXRvZ2dsZS1wbHVzJykgPyAndG9nZ2xlLXBsdXMnIDogJ3RvZ2dsZS1taW51cycpOwogIH0pOwogIHRvZ2dsZU11bHRpU2VsZWN0SWNvbkluaXQoKTsKCiAgJCgnI2hpc3RvcnkgLnRhYnMnKS5vbignY2xpY2snLCAnYScsIGZ1bmN0aW9uKGUpewogICAgdmFyIHRhYiA9ICQoZS50YXJnZXQpLmF0dHIoJ2lkJykucmVwbGFjZSgndGFiLScsJycpOwogICAgZG9jdW1lbnQuY29va2llID0gJ2hpc3RvcnlfbGFzdF90YWI9JyArIHRhYiArICc7IFNhbWVTaXRlPUxheCcKICB9KTsKfSk7CgokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICQoJyNjb250ZW50Jykub24oJ2NsaWNrJywgJ2Rpdi5qc3RUYWJzIGEudGFiLXByZXZpZXcnLCBmdW5jdGlvbihldmVudCl7CiAgICB2YXIgdGFiID0gJChldmVudC50YXJnZXQpOwoKICAgIHZhciB1cmwgPSB0YWIuZGF0YSgndXJsJyk7CiAgICB2YXIgZm9ybSA9IHRhYi5wYXJlbnRzKCdmb3JtJyk7CiAgICB2YXIganN0QmxvY2sgPSB0YWIucGFyZW50cygnLmpzdEJsb2NrJyk7CgogICAgdmFyIGVsZW1lbnQgPSBlbmNvZGVVUklDb21wb25lbnQoanN0QmxvY2suZmluZCgnLndpa2ktZWRpdCcpLnZhbCgpKTsKICAgIHZhciBhdHRhY2htZW50cyA9IGZvcm0uZmluZCgnLmF0dGFjaG1lbnRzX2ZpZWxkcyBpbnB1dCcpLnNlcmlhbGl6ZSgpOwoKICAgICQuYWpheCh7CiAgICAgIHVybDogdXJsLAogICAgICB0eXBlOiAncG9zdCcsCiAgICAgIGRhdGE6ICJ0ZXh0PSIgKyBlbGVtZW50ICsgJyYnICsgYXR0YWNobWVudHMsCiAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpewogICAgICAgIGpzdEJsb2NrLmZpbmQoJy53aWtpLXByZXZpZXcnKS5odG1sKGRhdGEpOwogICAgICAgIHNldHVwV2lraVRhYmxlU29ydGFibGVIZWFkZXIoKTsKICAgICAgfQogICAgfSk7CiAgfSk7Cn0pOwoKZnVuY3Rpb24ga2VlcEFuY2hvck9uU2lnbkluKGZvcm0pewogIHZhciBoYXNoID0gZGVjb2RlVVJJQ29tcG9uZW50KHNlbGYuZG9jdW1lbnQubG9jYXRpb24uaGFzaCk7CiAgaWYgKGhhc2gpIHsKICAgIGlmIChoYXNoLmluZGV4T2YoIiMiKSA9PT0gLTEpIHsKICAgICAgaGFzaCA9ICIjIiArIGhhc2g7CiAgICB9CiAgICBmb3JtLmFjdGlvbiA9IGZvcm0uYWN0aW9uICsgaGFzaDsKICB9CiAgcmV0dXJuIHRydWU7Cn0KCiQoZnVuY3Rpb24gKCQpIHsKICAkKCcjYXV0aF9zb3VyY2VfbGRhcF9tb2RlJykuY2hhbmdlKGZ1bmN0aW9uICgpIHsKICAgICQoJy5sZGFwc193YXJuaW5nJykudG9nZ2xlKCQodGhpcykudmFsKCkgIT0gJ2xkYXBzX3ZlcmlmeV9wZWVyJyk7CiAgfSkuY2hhbmdlKCk7Cn0pOwoKZnVuY3Rpb24gc2V0RmlsZWNvbnRlbnRDb250YWluZXJIZWlnaHQoKSB7CiAgdmFyICRmaWxlY29udGFpbmVyID0gJCgnLmZpbGVjb250ZW50LWNvbnRhaW5lcicpOwogIHZhciBmaWxlVHlwZVNlbGVjdG9ycyA9IFsnLmltYWdlJywgJ3ZpZGVvJ107CgogIGlmKCRmaWxlY29udGFpbmVyLmxlbmd0aCA+IDAgJiYgJGZpbGVjb250YWluZXIuZmluZChmaWxlVHlwZVNlbGVjdG9ycy5qb2luKCcsJykpLmxlbmd0aCA9PT0gMSkgewogICAgdmFyIGNvbnRhaW5lck9mZnNldFRvcCA9ICRmaWxlY29udGFpbmVyLm9mZnNldCgpLnRvcDsKICAgIHZhciBjb250YWluZXJNYXJnaW5Cb3R0b20gPSBwYXJzZUludCgkZmlsZWNvbnRhaW5lci5jc3MoJ21hcmdpbkJvdHRvbScpKTsKICAgIHZhciBwYWdpbmF0aW9uSGVpZ2h0ID0gJGZpbGVjb250YWluZXIubmV4dCgnLnBhZ2luYXRpb24nKS5oZWlnaHQoKTsKICAgIHZhciBkaWZmID0gY29udGFpbmVyT2Zmc2V0VG9wICsgY29udGFpbmVyTWFyZ2luQm90dG9tICsgcGFnaW5hdGlvbkhlaWdodDsKCiAgICAkZmlsZWNvbnRhaW5lci5jc3MoJ2hlaWdodCcsICdjYWxjKDEwMHZoIC0gJyArIGRpZmYgKyAncHgpJykKICB9Cn0KCmZ1bmN0aW9uIHNldHVwQXR0YWNobWVudERldGFpbCgpIHsKICBzZXRGaWxlY29udGVudENvbnRhaW5lckhlaWdodCgpOwogICQod2luZG93KS5yZXNpemUoc2V0RmlsZWNvbnRlbnRDb250YWluZXJIZWlnaHQpOwp9CgpmdW5jdGlvbiBzZXR1cFdpa2lUYWJsZVNvcnRhYmxlSGVhZGVyKCkgewogICQoJ2Rpdi53aWtpIHRhYmxlJykuZWFjaChmdW5jdGlvbihpLCB0YWJsZSl7CiAgICBpZiAodGFibGUucm93cy5sZW5ndGggPCAzKSByZXR1cm4gdHJ1ZTsKICAgIHZhciB0ciA9ICQodGFibGUucm93cykuZmlyc3QoKTsKICAgIGlmICh0ci5maW5kKCJUSCIpLmxlbmd0aCA+IDApIHsKICAgICAgdHIuYXR0cignZGF0YS1zb3J0LW1ldGhvZCcsICdub25lJyk7CiAgICAgIHRyLmZpbmQoIlREIikuYXR0cignZGF0YS1zb3J0LW1ldGhvZCcsICdub25lJyk7CiAgICAgIG5ldyBUYWJsZXNvcnQodGFibGUpOwogICAgfQogIH0pOwp9CgokKGZ1bmN0aW9uICgpIHsKICAkKCJbdGl0bGVdOm5vdCgubm8tdG9vbHRpcCkiKS50b29sdGlwKHsKICAgIHNob3c6IHsKICAgICAgZGVsYXk6IDQwMAogICAgfSwKICAgIHBvc2l0aW9uOiB7CiAgICAgIG15OiAiY2VudGVyIGJvdHRvbS01IiwKICAgICAgYXQ6ICJjZW50ZXIgdG9wIgogICAgfQogIH0pOwp9KTsKCmZ1bmN0aW9uIGlubGluZUF1dG9Db21wbGV0ZShlbGVtZW50KSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gZG8gbm90IGF0dGFjaCBpZiBUcmlidXRlIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQKICAgIGlmIChlbGVtZW50LmRhdGFzZXQudHJpYnV0ZSA9PT0gJ3RydWUnKSB7cmV0dXJufTsKCiAgICBjb25zdCBnZXREYXRhU291cmNlID0gZnVuY3Rpb24oZW50aXR5KSB7CiAgICAgIGNvbnN0IGRhdGFTb3VyY2VzID0gcm0uQXV0b0NvbXBsZXRlLmRhdGFTb3VyY2VzOwoKICAgICAgaWYgKGRhdGFTb3VyY2VzW2VudGl0eV0pIHsKICAgICAgICByZXR1cm4gZGF0YVNvdXJjZXNbZW50aXR5XTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KCiAgICBjb25zdCByZW1vdGVTZWFyY2ggPSBmdW5jdGlvbih1cmwsIGNiKSB7CiAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkKICAgICAgewogICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkgewogICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7CiAgICAgICAgICAgIGNiKGRhdGEpOwogICAgICAgICAgfSBlbHNlIGlmICh4aHIuc3RhdHVzID09PSA0MDMpIHsKICAgICAgICAgICAgY2IoW10pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfTsKICAgICAgeGhyLm9wZW4oIkdFVCIsIHVybCwgdHJ1ZSk7CiAgICAgIHhoci5zZW5kKCk7CiAgICB9OwoKICAgIGNvbnN0IHRyaWJ1dGUgPSBuZXcgVHJpYnV0ZSh7CiAgICAgIGNvbGxlY3Rpb246IFsKICAgICAgICB7CiAgICAgICAgICB0cmlnZ2VyOiAnIycsCiAgICAgICAgICB2YWx1ZXM6IGZ1bmN0aW9uICh0ZXh0LCBjYikgewogICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0LnR5cGUgPT09ICd0ZXh0JyAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZSgnYXV0b2NvbXBsZXRlJykgIT0gJ29mZicpIHsKICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXV0b2NvbXBsZXRlJywgJ29mZicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFdoZW4gdHJpZ2dlcmVkIHdpdGggdGV4dCBzdGFydGluZyB3aXRoICIjIyIsIGxpa2UgIiMjYSIsIHRoZSBzZWFyY2ggdGVybSB3aWxsIGJlY29tZSAiI2EiLAogICAgICAgICAgICAvLyBjYXVzaW5nIHRoZSBTUUwgcXVlcnkgdG8gZmFpbCBpbiBmaW5kaW5nIGlzc3VlcyB3aXRoICJhIiBpbiB0aGUgc3ViamVjdC4KICAgICAgICAgICAgLy8gVG8gYXZvaWQgdGhpcywgcmVtb3ZlIHRoZSBmaXJzdCAiIyIgZnJvbSB0aGUgc2VhcmNoIHRlcm0uCiAgICAgICAgICAgIGlmICh0ZXh0KSB7CiAgICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXiMvLCAnJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVtb3RlU2VhcmNoKGdldERhdGFTb3VyY2UoJ2lzc3VlcycpICsgZW5jb2RlVVJJQ29tcG9uZW50KHRleHQpLCBmdW5jdGlvbiAoaXNzdWVzKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGNiKGlzc3Vlcyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIGxvb2t1cDogJ2xhYmVsJywKICAgICAgICAgIGZpbGxBdHRyOiAnbGFiZWwnLAogICAgICAgICAgcmVxdWlyZUxlYWRpbmdTcGFjZTogdHJ1ZSwKICAgICAgICAgIHNlbGVjdFRlbXBsYXRlOiBmdW5jdGlvbiAoaXNzdWUpIHsKICAgICAgICAgICAgbGV0IGxlYWRpbmdIYXNoID0gIiMiCiAgICAgICAgICAgIC8vIGtlZXAgIyMgc3ludGF4IHdoaWNoIGlzIGEgdmFsaWQgaXNzdWUgc3ludGF4IHRvIHNob3cgaXNzdWUgd2l0aCB0aXRsZS4KICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudE1lbnRpb25UZXh0U25hcHNob3QuY2hhckF0KDApID09PSAiIyIpIHsKICAgICAgICAgICAgICBsZWFkaW5nSGFzaCA9ICIjIyIKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbGVhZGluZ0hhc2ggKyBpc3N1ZS5vcmlnaW5hbC5pZDsKICAgICAgICAgIH0sCiAgICAgICAgICBtZW51SXRlbVRlbXBsYXRlOiBmdW5jdGlvbiAoaXNzdWUpIHsKICAgICAgICAgICAgcmV0dXJuIHNhbml0aXplSFRNTChpc3N1ZS5vcmlnaW5hbC5sYWJlbCk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICB0cmlnZ2VyOiAnW1snLAogICAgICAgICAgdmFsdWVzOiBmdW5jdGlvbiAodGV4dCwgY2IpIHsKICAgICAgICAgICAgcmVtb3RlU2VhcmNoKGdldERhdGFTb3VyY2UoJ3dpa2lfcGFnZXMnKSArIGVuY29kZVVSSUNvbXBvbmVudCh0ZXh0KSwgZnVuY3Rpb24gKHdpa2lQYWdlcykgewogICAgICAgICAgICAgIHJldHVybiBjYih3aWtpUGFnZXMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICBsb29rdXA6ICdsYWJlbCcsCiAgICAgICAgICBmaWxsQXR0cjogJ2xhYmVsJywKICAgICAgICAgIHJlcXVpcmVMZWFkaW5nU3BhY2U6IHRydWUsCiAgICAgICAgICBzZWxlY3RUZW1wbGF0ZTogZnVuY3Rpb24gKHdpa2lQYWdlKSB7CiAgICAgICAgICAgIHJldHVybiAnW1snICsgd2lraVBhZ2Uub3JpZ2luYWwudmFsdWUgKyAnXV0nOwogICAgICAgICAgfSwKICAgICAgICAgIG1lbnVJdGVtVGVtcGxhdGU6IGZ1bmN0aW9uICh3aWtpUGFnZSkgewogICAgICAgICAgICByZXR1cm4gc2FuaXRpemVIVE1MKHdpa2lQYWdlLm9yaWdpbmFsLmxhYmVsKTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIHRyaWdnZXI6ICdAJywKICAgICAgICAgIGxvb2t1cDogZnVuY3Rpb24gKHVzZXIsIG1lbnRpb25UZXh0KSB7CiAgICAgICAgICAgIHJldHVybiB1c2VyLm5hbWUgKyB1c2VyLmZpcnN0bmFtZSArIHVzZXIubGFzdG5hbWUgKyB1c2VyLmxvZ2luOwogICAgICAgICAgfSwKICAgICAgICAgIHZhbHVlczogZnVuY3Rpb24gKHRleHQsIGNiKSB7CiAgICAgICAgICAgIGNvbnN0IHVybCA9IGdldERhdGFTb3VyY2UoJ3VzZXJzJyk7CiAgICAgICAgICAgIGlmICh1cmwpIHsKICAgICAgICAgICAgICByZW1vdGVTZWFyY2godXJsICsgZW5jb2RlVVJJQ29tcG9uZW50KHRleHQpLCBmdW5jdGlvbiAodXNlcnMpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjYih1c2Vycyk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICBtZW51SXRlbVRlbXBsYXRlOiBmdW5jdGlvbiAodXNlcikgewogICAgICAgICAgICByZXR1cm4gdXNlci5vcmlnaW5hbC5uYW1lOwogICAgICAgICAgfSwKICAgICAgICAgIHNlbGVjdFRlbXBsYXRlOiBmdW5jdGlvbiAodXNlcikgewogICAgICAgICAgICByZXR1cm4gJ0AnICsgdXNlci5vcmlnaW5hbC5sb2dpbjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIF0sCiAgICAgIG5vTWF0Y2hUZW1wbGF0ZTogIiIKICAgIH0pOwoKICAgIHRyaWJ1dGUuYXR0YWNoKGVsZW1lbnQpOwp9CgovLyBjb2xsYXBzaWJsZSBzaWRlYmFyIGpRdWVyeSBwbHVnaW4KKGZ1bmN0aW9uKCQpIHsKICAvLyBtYWluIGNvbnRhaW5lciB0aGlzIGlzIGFwcGxpZWQgdG8KICB2YXIgbWFpbjsKICAvLyB0cmlnZ2VycyBzaG93L2hpZGUKICB2YXIgYnV0dG9uOwogIC8vIHRoZSBrZXkgdG8gdXNlIGluIGxvY2FsIHN0b3JhZ2UKICAvLyB0aGlzIHdpbGwgbGF0ZXIgYmUgZXhwYW5kZWQgdXNpbmcgdGhlIGN1cnJlbnQgY29udHJvbGxlciBhbmQgYWN0aW9uIHRvCiAgLy8gYWxsb3cgZm9yIGRpZmZlcmVudCBzaWRlYmFyIHN0YXRlcyBmb3IgZGlmZmVyZW50IHBhZ2VzCiAgdmFyIGxvY2FsU3RvcmFnZUtleSA9ICdyZWRtaW5lLXNpZGViYXItc3RhdGUnOwogIC8vIHRydWUgaWYgbG9jYWwgc3RvcmFnZSBpcyBhdmFpbGFibGUKICB2YXIgY2FuVXNlTG9jYWxTdG9yYWdlID0gZnVuY3Rpb24oKXsKICAgIHRyeSB7CiAgICAgIGlmKCdsb2NhbFN0b3JhZ2UnIGluIHdpbmRvdyl7CiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3JlZG1pbmUudGVzdC5zdG9yYWdlJywgJ29rJyk7CiAgICAgICAgdmFyIGl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncmVkbWluZS50ZXN0LnN0b3JhZ2UnKTsKICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgncmVkbWluZS50ZXN0LnN0b3JhZ2UnKTsKICAgICAgICBpZihpdGVtID09PSAnb2snKSByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfSBjYXRjaCAoZXJyKSB7fQogICAgcmV0dXJuIGZhbHNlOwogIH0oKTsKICAvLyBmdW5jdGlvbiB0byBzZXQgY3VycmVudCBzaWRlYmFyIHN0YXRlCiAgdmFyIHNldFN0YXRlID0gZnVuY3Rpb24oc3RhdGUpewogICAgaWYoY2FuVXNlTG9jYWxTdG9yYWdlKXsKICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obG9jYWxTdG9yYWdlS2V5LCBzdGF0ZSk7CiAgICB9CiAgfTsKICB2YXIgYXBwbHlTdGF0ZSA9IGZ1bmN0aW9uKCl7CiAgICBpZihtYWluLmhhc0NsYXNzKCdjb2xsYXBzZWRzaWRlYmFyJykpewogICAgICB1cGRhdGVTVkdJY29uKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaWRlYmFyLXN3aXRjaC1idXR0b24nKSwgJ2NoZXZyb25zLWxlZnQnKQogICAgICBzZXRTdGF0ZSgnaGlkZGVuJyk7CiAgICB9IGVsc2UgewogICAgICB1cGRhdGVTVkdJY29uKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaWRlYmFyLXN3aXRjaC1idXR0b24nKSwgJ2NoZXZyb25zLXJpZ2h0JykKICAgICAgc2V0U3RhdGUoJ3Zpc2libGUnKTsKICAgIH0KICB9OwogIHZhciBzZXR1cFRvZ2dsZUJ1dHRvbiA9IGZ1bmN0aW9uKCl7CiAgICBidXR0b24gPSAkKCcjc2lkZWJhci1zd2l0Y2gtYnV0dG9uJyk7CiAgICBidXR0b24uY2xpY2soZnVuY3Rpb24oZSl7CiAgICAgIG1haW4uYWRkQ2xhc3MoImFuaW1hdGUiKTsKICAgICAgbWFpbi50b2dnbGVDbGFzcygnY29sbGFwc2Vkc2lkZWJhcicpOwogICAgICBhcHBseVN0YXRlKCk7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7CiAgICBhcHBseVN0YXRlKCk7CiAgfTsKICAkLmZuLmNvbGxhcHNpYmxlU2lkZWJhciA9IGZ1bmN0aW9uKCkgewogICAgbWFpbiA9IHRoaXM7CiAgICAvLyBkZXRlcm1pbmUgcHJldmlvdXNseSBzdG9yZWQgc2lkZWJhciBzdGF0ZSBmb3IgdGhpcyBwYWdlCiAgICBpZihjYW5Vc2VMb2NhbFN0b3JhZ2UpIHsKICAgICAgLy8gZGV0ZXJtaW5lIGN1cnJlbnQgY29udHJvbGxlci9hY3Rpb24gcGFpciBhbmQgdXNlIHRoZW0gYXMgc3RvcmFnZSBrZXkKICAgICAgdmFyIGJvZHlDbGFzcyA9ICQoJ2JvZHknKS5hdHRyKCdjbGFzcycpOwogICAgICBpZihib2R5Q2xhc3MpewogICAgICAgIHRyeSB7CiAgICAgICAgICBsb2NhbFN0b3JhZ2VLZXkgKz0gJy0nICsgYm9keUNsYXNzLnNwbGl0KC9ccysvKS5maWx0ZXIoZnVuY3Rpb24ocyl7CiAgICAgICAgICAgIHJldHVybiBzLm1hdGNoKC8oYWN0aW9ufGNvbnRyb2xsZXIpLS4qLyk7CiAgICAgICAgICB9KS5zb3J0KCkuam9pbignLScpOwogICAgICAgIH0gY2F0Y2goZSkgewogICAgICAgICAgLy8gaW4gY2FzZSBvZiBlcnJvciAocHJvYmFibHkgSUU4KSwgY29udGludWUgd2l0aCB0aGUgdW5tb2RpZmllZCBrZXkKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyIHN0b3JlZFN0YXRlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0obG9jYWxTdG9yYWdlS2V5KTsKICAgICAgbWFpbi50b2dnbGVDbGFzcygnY29sbGFwc2Vkc2lkZWJhcicsIHN0b3JlZFN0YXRlID09PSAnaGlkZGVuJyk7CiAgICB9CiAgICAvLyBkcmF3IHRoZSB0b2dnbGUgYnV0dG9uIG9uY2UgdGhlIERPTSBpcyBjb21wbGV0ZQogICAgJChkb2N1bWVudCkucmVhZHkoc2V0dXBUb2dnbGVCdXR0b24pOwogIH07Cn0oalF1ZXJ5KSk7CgokKGRvY3VtZW50KS5yZWFkeShzZXR1cEFqYXhJbmRpY2F0b3IpOwokKGRvY3VtZW50KS5yZWFkeShoaWRlT25Mb2FkKTsKJChkb2N1bWVudCkucmVhZHkoYWRkRm9ybU9ic2VydmVyc0ZvckRvdWJsZVN1Ym1pdCk7CiQoZG9jdW1lbnQpLnJlYWR5KGRlZmF1bHRGb2N1cyk7CiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwQXR0YWNobWVudERldGFpbCk7CiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwVGFicyk7CiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwRmlsZVByZXZpZXdOYXZpZ2F0aW9uKTsKJChkb2N1bWVudCkucmVhZHkoc2V0dXBXaWtpVGFibGVTb3J0YWJsZUhlYWRlcik7CiQoZG9jdW1lbnQpLm9uKCdmb2N1cycsICdbZGF0YS1hdXRvLWNvbXBsZXRlPXRydWVdJywgZnVuY3Rpb24oZXZlbnQpIHsKICBpbmxpbmVBdXRvQ29tcGxldGUoZXZlbnQudGFyZ2V0KTsKfSk7Cg==" | |
| }, | |
| "attachments.js": { | |
| "hash": "fe6f73f3351f734902238369b56ee6cd", | |
| "path": "/usr/src/redmine/public/assets/attachments-db17b2b6.js", | |
| "base64": "LyoqCiAqIFJlZG1pbmUgLSBwcm9qZWN0IG1hbmFnZW1lbnQgc29mdHdhcmUKICogQ29weXJpZ2h0IChDKSAyMDA2LSAgSmVhbi1QaGlsaXBwZSBMYW5nCiAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCiAqLwoKZnVuY3Rpb24gYWRkRmlsZShpbnB1dEVsLCBmaWxlLCBlYWdlclVwbG9hZCkgewogIHZhciBhdHRhY2htZW50c0Zvcm0gPSAkKGlucHV0RWwpLmNsb3Nlc3QoJy5hdHRhY2htZW50c19mb3JtJykKICB2YXIgYXR0YWNobWVudHNGaWVsZHMgPSBhdHRhY2htZW50c0Zvcm0uZmluZCgnLmF0dGFjaG1lbnRzX2ZpZWxkcycpOwogIHZhciBhdHRhY2htZW50c0ljb25zID0gYXR0YWNobWVudHNGb3JtLmZpbmQoJy5hdHRhY2htZW50c19pY29ucycpOwogIHZhciBhZGRBdHRhY2htZW50ID0gYXR0YWNobWVudHNGb3JtLmZpbmQoJy5hZGRfYXR0YWNobWVudCcpOwogIHZhciBtYXhGaWxlcyA9ICgkKGlucHV0RWwpLmF0dHIoJ211bHRpcGxlJykgPT0gJ211bHRpcGxlJyA/IDEwIDogMSk7CiAgdmFyIGRlbEljb24gPSBhdHRhY2htZW50c0ljb25zLmZpbmQoJ3N2Zy5zdmctZGVsJykuY2xvbmUoKTsKICB2YXIgYXR0YWNobWVudEljb24gPSBhdHRhY2htZW50c0ljb25zLmZpbmQoJ3N2Zy5zdmctYXR0YWNobWVudCcpLmNsb25lKCk7CgogIGlmIChhdHRhY2htZW50c0ZpZWxkcy5jaGlsZHJlbigpLmxlbmd0aCA8IG1heEZpbGVzKSB7CiAgICB2YXIgYXR0YWNobWVudElkID0gYWRkRmlsZS5uZXh0QXR0YWNobWVudElkKys7CiAgICB2YXIgZmlsZVNwYW4gPSAkKCc8c3Bhbj4nLCB7IGlkOiAnYXR0YWNobWVudHNfJyArIGF0dGFjaG1lbnRJZCB9KTsKICAgIHZhciBwYXJhbSA9ICQoaW5wdXRFbCkuZGF0YSgncGFyYW0nKTsKICAgIGlmICghcGFyYW0pIHtwYXJhbSA9ICdhdHRhY2htZW50cyd9OwoKICAgIGZpbGVTcGFuLmFwcGVuZCgKICAgICAgICBhdHRhY2htZW50SWNvbiwKICAgICAgICAkKCc8aW5wdXQ+JywgeyB0eXBlOiAndGV4dCcsICdjbGFzcyc6ICdpY29uIGljb24tYXR0YWNobWVudCBmaWxlbmFtZSByZWFkb25seScsIG5hbWU6IHBhcmFtICsnWycgKyBhdHRhY2htZW50SWQgKyAnXVtmaWxlbmFtZV0nLCByZWFkb25seTogJ3JlYWRvbmx5J30gKS52YWwoZmlsZS5uYW1lKSwKICAgICAgICAkKCc8aW5wdXQ+JywgeyB0eXBlOiAndGV4dCcsICdjbGFzcyc6ICdkZXNjcmlwdGlvbicsIG5hbWU6IHBhcmFtICsgJ1snICsgYXR0YWNobWVudElkICsgJ11bZGVzY3JpcHRpb25dJywgbWF4bGVuZ3RoOiAyNTUsIHBsYWNlaG9sZGVyOiAkKGlucHV0RWwpLmRhdGEoJ2Rlc2NyaXB0aW9uLXBsYWNlaG9sZGVyJykgfSApLnRvZ2dsZSghZWFnZXJVcGxvYWQpLAogICAgICAgICQoJzxpbnB1dD4nLCB7IHR5cGU6ICdoaWRkZW4nLCAnY2xhc3MnOiAndG9rZW4nLCBuYW1lOiBwYXJhbSArICdbJyArIGF0dGFjaG1lbnRJZCArICddW3Rva2VuXSd9ICksCiAgICAgICAgJCgnPGE+JywgeyBocmVmOiAiIyIsICdjbGFzcyc6ICdpY29uLW9ubHkgaWNvbi1kZWwgcmVtb3ZlLXVwbG9hZCcgfSkuYXBwZW5kKGRlbEljb24pLmNsaWNrKHJlbW92ZUZpbGUpLnRvZ2dsZSghZWFnZXJVcGxvYWQpCiAgICApLmFwcGVuZFRvKGF0dGFjaG1lbnRzRmllbGRzKTsKCgogICAgaWYgKCQoaW5wdXRFbCkuZGF0YSgnZGVzY3JpcHRpb24nKSA9PSAwKSB7CiAgICAgIGZpbGVTcGFuLmZpbmQoJ2lucHV0LmRlc2NyaXB0aW9uJykucmVtb3ZlKCk7CiAgICB9CgogICAgaWYoZWFnZXJVcGxvYWQpIHsKICAgICAgYWpheFVwbG9hZChmaWxlLCBhdHRhY2htZW50SWQsIGZpbGVTcGFuLCBpbnB1dEVsKTsKICAgIH0KCiAgICBhZGRBdHRhY2htZW50LnRvZ2dsZShhdHRhY2htZW50c0ZpZWxkcy5jaGlsZHJlbigpLmxlbmd0aCA8IG1heEZpbGVzKTsKICAgIHJldHVybiBhdHRhY2htZW50SWQ7CiAgfQogIHJldHVybiBudWxsOwp9CgphZGRGaWxlLm5leHRBdHRhY2htZW50SWQgPSAxOwoKZnVuY3Rpb24gYWpheFVwbG9hZChmaWxlLCBhdHRhY2htZW50SWQsIGZpbGVTcGFuLCBpbnB1dEVsKSB7CgogIGZ1bmN0aW9uIG9uTG9hZHN0YXJ0KGUpIHsKICAgIGZpbGVTcGFuLnJlbW92ZUNsYXNzKCdhamF4LXdhaXRpbmcnKTsKICAgIGZpbGVTcGFuLmFkZENsYXNzKCdhamF4LWxvYWRpbmcnKTsKICAgICQoJ2lucHV0OnN1Ym1pdCcsICQodGhpcykucGFyZW50cygnZm9ybScpKS5hdHRyKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpOwogIH0KCiAgZnVuY3Rpb24gb25Qcm9ncmVzcyhlKSB7CiAgICBpZihlLmxlbmd0aENvbXB1dGFibGUpIHsKICAgICAgdGhpcy5wcm9ncmVzc2JhciggJ3ZhbHVlJywgZS5sb2FkZWQgKiAxMDAgLyBlLnRvdGFsICk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhY3R1YWxVcGxvYWQoZmlsZSwgYXR0YWNobWVudElkLCBmaWxlU3BhbiwgaW5wdXRFbCkgewoKICAgIGFqYXhVcGxvYWQudXBsb2FkaW5nKys7CgogICAgdXBsb2FkQmxvYihmaWxlLCAkKGlucHV0RWwpLmRhdGEoJ3VwbG9hZC1wYXRoJyksIGF0dGFjaG1lbnRJZCwgewogICAgICAgIGxvYWRzdGFydEV2ZW50SGFuZGxlcjogb25Mb2Fkc3RhcnQuYmluZChwcm9ncmVzc1NwYW4pLAogICAgICAgIHByb2dyZXNzRXZlbnRIYW5kbGVyOiBvblByb2dyZXNzLmJpbmQocHJvZ3Jlc3NTcGFuKQogICAgICB9KQogICAgICAuZG9uZShmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICBhZGRJbmxpbmVBdHRhY2htZW50TWFya3VwKGZpbGUpOwogICAgICAgIHByb2dyZXNzU3Bhbi5wcm9ncmVzc2JhciggJ3ZhbHVlJywgMTAwICkucmVtb3ZlKCk7CiAgICAgICAgZmlsZVNwYW4uZmluZCgnaW5wdXQuZGVzY3JpcHRpb24sIGEnKS5jc3MoJ2Rpc3BsYXknLCAnaW5saW5lLWZsZXgnKTsKICAgICAgfSkKICAgICAgLmZhaWwoZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgcHJvZ3Jlc3NTcGFuLnRleHQocmVzdWx0LnN0YXR1c1RleHQpOwogICAgICB9KS5hbHdheXMoZnVuY3Rpb24oKSB7CiAgICAgICAgYWpheFVwbG9hZC51cGxvYWRpbmctLTsKICAgICAgICBmaWxlU3Bhbi5yZW1vdmVDbGFzcygnYWpheC1sb2FkaW5nJyk7CiAgICAgICAgdmFyIGZvcm0gPSBmaWxlU3Bhbi5wYXJlbnRzKCdmb3JtJyk7CiAgICAgICAgaWYgKGZvcm0ucXVldWUoJ3VwbG9hZCcpLmxlbmd0aCA9PSAwICYmIGFqYXhVcGxvYWQudXBsb2FkaW5nID09IDApIHsKICAgICAgICAgICQoJ2lucHV0OnN1Ym1pdCcsIGZvcm0pLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7CiAgICAgICAgfQogICAgICAgIGZvcm0uZGVxdWV1ZSgndXBsb2FkJyk7CiAgICAgIH0pOwogIH0KCiAgdmFyIHByb2dyZXNzU3BhbiA9ICQoJzxkaXY+JykuaW5zZXJ0QWZ0ZXIoZmlsZVNwYW4uZmluZCgnaW5wdXQuZmlsZW5hbWUnKSk7CiAgcHJvZ3Jlc3NTcGFuLnByb2dyZXNzYmFyKCk7CiAgZmlsZVNwYW4uYWRkQ2xhc3MoJ2FqYXgtd2FpdGluZycpOwoKICB2YXIgbWF4U3luY1VwbG9hZCA9ICQoaW5wdXRFbCkuZGF0YSgnbWF4LWNvbmN1cnJlbnQtdXBsb2FkcycpOwoKICBpZihtYXhTeW5jVXBsb2FkID09IG51bGwgfHwgbWF4U3luY1VwbG9hZCA8PSAwIHx8IGFqYXhVcGxvYWQudXBsb2FkaW5nIDwgbWF4U3luY1VwbG9hZCkKICAgIGFjdHVhbFVwbG9hZChmaWxlLCBhdHRhY2htZW50SWQsIGZpbGVTcGFuLCBpbnB1dEVsKTsKICBlbHNlCiAgICAkKGlucHV0RWwpLnBhcmVudHMoJ2Zvcm0nKS5xdWV1ZSgndXBsb2FkJywgYWN0dWFsVXBsb2FkLmJpbmQodGhpcywgZmlsZSwgYXR0YWNobWVudElkLCBmaWxlU3BhbiwgaW5wdXRFbCkpOwp9CgphamF4VXBsb2FkLnVwbG9hZGluZyA9IDA7CgpmdW5jdGlvbiByZW1vdmVGaWxlKCkgewogICQodGhpcykuY2xvc2VzdCgnLmF0dGFjaG1lbnRzX2Zvcm0nKS5maW5kKCcuYWRkX2F0dGFjaG1lbnQnKS5zaG93KCk7CiAgJCh0aGlzKS5wYXJlbnQoJ3NwYW4nKS5yZW1vdmUoKTsKICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIHVwbG9hZEJsb2IoYmxvYiwgdXBsb2FkVXJsLCBhdHRhY2htZW50SWQsIG9wdGlvbnMpIHsKCiAgdmFyIGFjdHVhbE9wdGlvbnMgPSAkLmV4dGVuZCh7CiAgICBsb2Fkc3RhcnRFdmVudEhhbmRsZXI6ICQubm9vcCwKICAgIHByb2dyZXNzRXZlbnRIYW5kbGVyOiAkLm5vb3AKICB9LCBvcHRpb25zKTsKCiAgdXBsb2FkVXJsID0gdXBsb2FkVXJsICsgJz9hdHRhY2htZW50X2lkPScgKyBhdHRhY2htZW50SWQ7CiAgaWYgKGJsb2IgaW5zdGFuY2VvZiB3aW5kb3cuQmxvYikgewogICAgdXBsb2FkVXJsICs9ICcmZmlsZW5hbWU9JyArIGVuY29kZVVSSUNvbXBvbmVudChibG9iLm5hbWUpOwogICAgdXBsb2FkVXJsICs9ICcmY29udGVudF90eXBlPScgKyBlbmNvZGVVUklDb21wb25lbnQoYmxvYi50eXBlKTsKICB9CgogIHJldHVybiAkLmFqYXgodXBsb2FkVXJsLCB7CiAgICB0eXBlOiAnUE9TVCcsCiAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsCiAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbihqcVhociwgc2V0dGluZ3MpIHsKICAgICAganFYaHIuc2V0UmVxdWVzdEhlYWRlcignQWNjZXB0JywgJ2FwcGxpY2F0aW9uL2pzJyk7CiAgICAgIC8vIGF0dGFjaCBwcm9wZXIgRmlsZSBvYmplY3QKICAgICAgc2V0dGluZ3MuZGF0YSA9IGJsb2I7CiAgICB9LAogICAgeGhyOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIHhociA9ICQuYWpheFNldHRpbmdzLnhocigpOwogICAgICB4aHIudXBsb2FkLm9ubG9hZHN0YXJ0ID0gYWN0dWFsT3B0aW9ucy5sb2Fkc3RhcnRFdmVudEhhbmRsZXI7CiAgICAgIHhoci51cGxvYWQub25wcm9ncmVzcyA9IGFjdHVhbE9wdGlvbnMucHJvZ3Jlc3NFdmVudEhhbmRsZXI7CiAgICAgIHJldHVybiB4aHI7CiAgICB9LAogICAgZGF0YTogYmxvYiwKICAgIGNhY2hlOiBmYWxzZSwKICAgIHByb2Nlc3NEYXRhOiBmYWxzZQogIH0pOwp9CgpmdW5jdGlvbiBhZGRJbnB1dEZpbGVzKGlucHV0RWwpIHsKICB2YXIgYXR0YWNobWVudHNGaWVsZHMgPSAkKGlucHV0RWwpLmNsb3Nlc3QoJy5hdHRhY2htZW50c19mb3JtJykuZmluZCgnLmF0dGFjaG1lbnRzX2ZpZWxkcycpOwogIHZhciBhZGRBdHRhY2htZW50ID0gJChpbnB1dEVsKS5jbG9zZXN0KCcuYXR0YWNobWVudHNfZm9ybScpLmZpbmQoJy5hZGRfYXR0YWNobWVudCcpOwogIHZhciBjbGVhcmVkRmlsZUlucHV0ID0gJChpbnB1dEVsKS5jbG9uZSgpLnZhbCgnJyk7CiAgdmFyIHNpemVFeGNlZWRlZCA9IGZhbHNlOwogIHZhciBwYXJhbSA9ICQoaW5wdXRFbCkuZGF0YSgncGFyYW0nKTsKICBpZiAoIXBhcmFtKSB7cGFyYW0gPSAnYXR0YWNobWVudHMnfTsKCiAgaWYgKCQuYWpheFNldHRpbmdzLnhocigpLnVwbG9hZCAmJiBpbnB1dEVsLmZpbGVzKSB7CiAgICAvLyB1cGxvYWQgZmlsZXMgdXNpbmcgYWpheAogICAgc2l6ZUV4Y2VlZGVkID0gdXBsb2FkQW5kQXR0YWNoRmlsZXMoaW5wdXRFbC5maWxlcywgaW5wdXRFbCk7CiAgICAkKGlucHV0RWwpLnJlbW92ZSgpOwogIH0gZWxzZSB7CiAgICAvLyBicm93c2VyIG5vdCBzdXBwb3J0aW5nIHRoZSBmaWxlIEFQSSwgdXBsb2FkIG9uIGZvcm0gc3VibWlzc2lvbgogICAgdmFyIGF0dGFjaG1lbnRJZDsKICAgIHZhciBhRmlsZW5hbWUgPSBpbnB1dEVsLnZhbHVlLnNwbGl0KC9cL3xcXC8pOwogICAgYXR0YWNobWVudElkID0gYWRkRmlsZShpbnB1dEVsLCB7IG5hbWU6IGFGaWxlbmFtZVsgYUZpbGVuYW1lLmxlbmd0aCAtIDEgXSB9LCBmYWxzZSk7CiAgICBpZiAoYXR0YWNobWVudElkKSB7CiAgICAgICQoaW5wdXRFbCkuYXR0cih7IG5hbWU6IHBhcmFtICsgJ1snICsgYXR0YWNobWVudElkICsgJ11bZmlsZV0nLCBzdHlsZTogJ2Rpc3BsYXk6bm9uZTsnIH0pLmFwcGVuZFRvKCcjYXR0YWNobWVudHNfJyArIGF0dGFjaG1lbnRJZCk7CiAgICB9CiAgfQoKICBjbGVhcmVkRmlsZUlucHV0LnByZXBlbmRUbyhhZGRBdHRhY2htZW50KTsKfQoKZnVuY3Rpb24gdXBsb2FkQW5kQXR0YWNoRmlsZXMoZmlsZXMsIGlucHV0RWwpIHsKCiAgdmFyIG1heEZpbGVTaXplID0gJChpbnB1dEVsKS5kYXRhKCdtYXgtZmlsZS1zaXplJyk7CiAgdmFyIG1heEZpbGVTaXplRXhjZWVkZWQgPSAkKGlucHV0RWwpLmRhdGEoJ21heC1maWxlLXNpemUtbWVzc2FnZScpOwoKICB2YXIgc2l6ZUV4Y2VlZGVkID0gZmFsc2U7CiAgdmFyIGZpbGVzTGVuZ3RoID0gJChpbnB1dEVsKS5jbG9zZXN0KCcuYXR0YWNobWVudHNfZm9ybScpLmZpbmQoJy5hdHRhY2htZW50c19maWVsZHMnKS5jaGlsZHJlbigpLmxlbmd0aCArIGZpbGVzLmxlbmd0aAogICQuZWFjaChmaWxlcywgZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5zaXplICYmIG1heEZpbGVTaXplICE9IG51bGwgJiYgdGhpcy5zaXplID4gcGFyc2VJbnQobWF4RmlsZVNpemUpKSB7c2l6ZUV4Y2VlZGVkPXRydWU7fQogIH0pOwogIGlmIChzaXplRXhjZWVkZWQpIHsKICAgIHdpbmRvdy5hbGVydChtYXhGaWxlU2l6ZUV4Y2VlZGVkKTsKICB9IGVsc2UgewogICAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbigpIHthZGRGaWxlKGlucHV0RWwsIHRoaXMsIHRydWUpO30pOwogIH0KCiAgaWYgKGZpbGVzTGVuZ3RoID4gKCQoaW5wdXRFbCkuYXR0cignbXVsdGlwbGUnKSA9PSAnbXVsdGlwbGUnID8gMTAgOiAxKSkgewogICAgd2luZG93LmFsZXJ0KCQoaW5wdXRFbCkuZGF0YSgnbWF4LW51bWJlci1vZi1maWxlcy1tZXNzYWdlJykpOwogIH0KICByZXR1cm4gc2l6ZUV4Y2VlZGVkOwp9CgpmdW5jdGlvbiBoYW5kbGVGaWxlRHJvcEV2ZW50KGUpIHsKCiAgJCh0aGlzKS5yZW1vdmVDbGFzcygnZmlsZW92ZXInKTsKICBibG9ja0V2ZW50UHJvcGFnYXRpb24oZSk7CgogIGlmICgkLmluQXJyYXkoJ0ZpbGVzJywgZS5kYXRhVHJhbnNmZXIudHlwZXMpID4gLTEpIHsKICAgIGhhbmRsZUZpbGVEcm9wRXZlbnQudGFyZ2V0ID0gZS50YXJnZXQ7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnY3VzdG9tLWZpZWxkLWZpbGVkcm9wbGlzdG5lcicpKXsKICAgICAgdXBsb2FkQW5kQXR0YWNoRmlsZXMoZS5kYXRhVHJhbnNmZXIuZmlsZXMsICQodGhpcykuZmluZCgnaW5wdXQ6ZmlsZS5jdXN0b20tZmllbGQtZmlsZWRyb3AnKS5maXJzdCgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHVwbG9hZEFuZEF0dGFjaEZpbGVzKGUuZGF0YVRyYW5zZmVyLmZpbGVzLCAkKHRoaXMpLmZpbmQoJ2lucHV0OmZpbGUuZmlsZWRyb3AnKS5maXJzdCgpKTsKICAgIH0KICB9Cn0KaGFuZGxlRmlsZURyb3BFdmVudC50YXJnZXQgPSAnJzsKCmZ1bmN0aW9uIGRyYWdPdmVySGFuZGxlcihlKSB7CiAgJCh0aGlzKS5hZGRDbGFzcygnZmlsZW92ZXInKTsKICBibG9ja0V2ZW50UHJvcGFnYXRpb24oZSk7CiAgZS5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdjb3B5JzsKfQoKZnVuY3Rpb24gZHJhZ091dEhhbmRsZXIoZSkgewogICQodGhpcykucmVtb3ZlQ2xhc3MoJ2ZpbGVvdmVyJyk7CiAgYmxvY2tFdmVudFByb3BhZ2F0aW9uKGUpOwp9CgpmdW5jdGlvbiBzZXR1cEZpbGVEcm9wKCkgewogIGlmICh3aW5kb3cuRmlsZSAmJiB3aW5kb3cuRmlsZUxpc3QgJiYgd2luZG93LlByb2dyZXNzRXZlbnQgJiYgd2luZG93LkZvcm1EYXRhKSB7CgogICAgJC5ldmVudC5hZGRQcm9wKCdkYXRhVHJhbnNmZXInKTsKCiAgICAkKCdmb3JtIGRpdi5ib3g6bm90KC5maWxlZHJvcGxpc3RuZXIpJykuaGFzKCdpbnB1dDpmaWxlLmZpbGVkcm9wJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgJCh0aGlzKS5vbih7CiAgICAgICAgICBkcmFnb3ZlcjogZHJhZ092ZXJIYW5kbGVyLAogICAgICAgICAgZHJhZ2xlYXZlOiBkcmFnT3V0SGFuZGxlciwKICAgICAgICAgIGRyb3A6IGhhbmRsZUZpbGVEcm9wRXZlbnQsCiAgICAgICAgICBwYXN0ZTogY29weUltYWdlRnJvbUNsaXBib2FyZAogICAgICB9KS5hZGRDbGFzcygnZmlsZWRyb3BsaXN0bmVyJyk7CiAgICB9KTsKCiAgICAkKCdmb3JtIGRpdi5ib3ggaW5wdXQ6ZmlsZS5jdXN0b20tZmllbGQtZmlsZWRyb3AnKS5jbG9zZXN0KCdwJykubm90KCcuY3VzdG9tLWZpZWxkLWZpbGVkcm9wbGlzdG5lcicpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICQodGhpcykub24oewogICAgICAgICAgZHJhZ292ZXI6IGRyYWdPdmVySGFuZGxlciwKICAgICAgICAgIGRyYWdsZWF2ZTogZHJhZ091dEhhbmRsZXIsCiAgICAgICAgICBkcm9wOiBoYW5kbGVGaWxlRHJvcEV2ZW50CiAgICAgIH0pLmFkZENsYXNzKCdjdXN0b20tZmllbGQtZmlsZWRyb3BsaXN0bmVyJyk7CiAgICB9KTsKICB9Cn0KCmZ1bmN0aW9uIGFkZElubGluZUF0dGFjaG1lbnRNYXJrdXAoZmlsZSkgewogIC8vIGluc2VydCB1cGxvYWRlZCBpbWFnZSBpbmxpbmUgaWYgZHJvcHBlZCBhcmVhIGlzIGN1cnJlbnRseSBmb2N1c2VkIHRleHRhcmVhCiAgaWYoJChoYW5kbGVGaWxlRHJvcEV2ZW50LnRhcmdldCkuaGFzQ2xhc3MoJ3dpa2ktZWRpdCcpICYmICQuaW5BcnJheShmaWxlLnR5cGUsIHdpbmRvdy53aWtpSW1hZ2VNaW1lVHlwZXMpID4gLTEpIHsKICAgIHZhciAkdGV4dGFyZWEgPSAkKGhhbmRsZUZpbGVEcm9wRXZlbnQudGFyZ2V0KTsKICAgIHZhciBjdXJzb3JQb3NpdGlvbiA9ICR0ZXh0YXJlYS5wcm9wKCdzZWxlY3Rpb25TdGFydCcpOwogICAgdmFyIGRlc2NyaXB0aW9uID0gJHRleHRhcmVhLnZhbCgpOwogICAgdmFyIHNhbml0aXplZEZpbGVuYW1lID0gZmlsZS5uYW1lLnJlcGxhY2UoL1tcL1w/XCVcKlw6XHxcIlwnPD5cblxyXSsvLCAnXycpOwogICAgdmFyIGlubGluZUZpbGVuYW1lID0gZW5jb2RlVVJJQ29tcG9uZW50KHNhbml0aXplZEZpbGVuYW1lKQogICAgICAucmVwbGFjZSgvWyEoKV0vZywgZnVuY3Rpb24obWF0Y2gpIHsgcmV0dXJuICIlIiArIG1hdGNoLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpIH0pOwogICAgdmFyIG5ld0xpbmVCZWZvcmUgPSB0cnVlOwogICAgdmFyIG5ld0xpbmVBZnRlciA9IHRydWU7CiAgICBpZihjdXJzb3JQb3NpdGlvbiA9PT0gMCB8fCBkZXNjcmlwdGlvbi5zdWJzdHIoY3Vyc29yUG9zaXRpb24tMSwxKS5tYXRjaCgvXHJ8XG4vKSkgewogICAgICBuZXdMaW5lQmVmb3JlID0gZmFsc2U7CiAgICB9CiAgICBpZihkZXNjcmlwdGlvbi5zdWJzdHIoY3Vyc29yUG9zaXRpb24sMSkubWF0Y2goL1xyfFxuLykpIHsKICAgICAgbmV3TGluZUFmdGVyID0gZmFsc2U7CiAgICB9CgogICAgJHRleHRhcmVhLnZhbCgKICAgICAgZGVzY3JpcHRpb24uc3Vic3RyaW5nKDAsIGN1cnNvclBvc2l0aW9uKQogICAgICArIChuZXdMaW5lQmVmb3JlID8gJ1xuJyA6ICcnKQogICAgICArIGlubGluZUZpbGVuYW1lCiAgICAgICsgKG5ld0xpbmVBZnRlciA/ICdcbicgOiAnJykKICAgICAgKyBkZXNjcmlwdGlvbi5zdWJzdHJpbmcoY3Vyc29yUG9zaXRpb24sIGRlc2NyaXB0aW9uLmxlbmd0aCkKICAgICk7CgogICAgJHRleHRhcmVhLnByb3AoewogICAgICAnc2VsZWN0aW9uU3RhcnQnOiBjdXJzb3JQb3NpdGlvbiArIG5ld0xpbmVCZWZvcmUsCiAgICAgICdzZWxlY3Rpb25FbmQnOiBjdXJzb3JQb3NpdGlvbiArIGlubGluZUZpbGVuYW1lLmxlbmd0aCArIG5ld0xpbmVCZWZvcmUKICAgIH0pOwogICAgJHRleHRhcmVhLnBhcmVudHMoJy5qc3RCbG9jaycpCiAgICAgIC5maW5kKCcuanN0Yl9pbWcnKS5jbGljaygpOwoKICAgIC8vIG1vdmUgY3Vyc29yIGludG8gbmV4dCBsaW5lCiAgICBjdXJzb3JQb3NpdGlvbiA9ICR0ZXh0YXJlYS5wcm9wKCdzZWxlY3Rpb25TdGFydCcpOwogICAgJHRleHRhcmVhLnByb3AoewogICAgICAnc2VsZWN0aW9uU3RhcnQnOiBjdXJzb3JQb3NpdGlvbiArIDEsCiAgICAgICdzZWxlY3Rpb25FbmQnOiBjdXJzb3JQb3NpdGlvbiArIDEKICAgIH0pOwoKICB9Cn0KCmZ1bmN0aW9uIGNvcHlJbWFnZUZyb21DbGlwYm9hcmQoZSkgewogIGlmICghJChlLnRhcmdldCkuaGFzQ2xhc3MoJ3dpa2ktZWRpdCcpKSB7IHJldHVybjsgfQogIHZhciBjbGlwYm9hcmREYXRhID0gZS5jbGlwYm9hcmREYXRhIHx8IGUub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhCiAgaWYgKCFjbGlwYm9hcmREYXRhKSB7IHJldHVybjsgfQogIGlmIChjbGlwYm9hcmREYXRhLnR5cGVzLnNvbWUoZnVuY3Rpb24odCl7IHJldHVybiAvXnRleHRcL3BsYWluJC8udGVzdCh0KTsgfSkpIHsgcmV0dXJuOyB9CgogIHZhciBmaWxlcyA9IGNsaXBib2FyZERhdGEuZmlsZXMKICBmb3IgKHZhciBpID0gMCA7IGkgPCBmaWxlcy5sZW5ndGggOyBpKyspIHsKICAgIHZhciBmaWxlID0gZmlsZXNbaV07CiAgICBpZiAoZmlsZS50eXBlLmluZGV4T2YoImltYWdlIikgIT0gLTEpIHsKICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgpOwogICAgICB2YXIgZmlsZW5hbWUgPSAnY2xpcGJvYXJkLScKICAgICAgICArIGRhdGUuZ2V0RnVsbFllYXIoKQogICAgICAgICsgKCcwJysoZGF0ZS5nZXRNb250aCgpKzEpKS5zbGljZSgtMikKICAgICAgICArICgnMCcrZGF0ZS5nZXREYXRlKCkpLnNsaWNlKC0yKQogICAgICAgICsgKCcwJytkYXRlLmdldEhvdXJzKCkpLnNsaWNlKC0yKQogICAgICAgICsgKCcwJytkYXRlLmdldE1pbnV0ZXMoKSkuc2xpY2UoLTIpCiAgICAgICAgKyAnLScgKyByYW5kb21LZXkoNSkudG9Mb2NhbGVMb3dlckNhc2UoKQogICAgICAgICsgJy4nICsgZmlsZS5uYW1lLnNwbGl0KCcuJykucG9wKCk7CgogICAgICAvLyBnZXQgaW5wdXQgZmlsZSBpbiB0aGUgY2xvc2VzdCBmb3JtCiAgICAgIHZhciBpbnB1dEVsID0gJCh0aGlzKS5jbG9zZXN0KCJmb3JtIikuZmluZCgnaW5wdXQ6ZmlsZS5maWxlZHJvcCcpOwogICAgICBoYW5kbGVGaWxlRHJvcEV2ZW50LnRhcmdldCA9IGUudGFyZ2V0OwogICAgICBhZGRGaWxlKGlucHV0RWwsIG5ldyBGaWxlKFtmaWxlXSwgZmlsZW5hbWUsIHsgdHlwZTogZmlsZS50eXBlIH0pLCB0cnVlKTsKICAgIH0KICB9Cn0KCiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwRmlsZURyb3ApOwokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICQoImlucHV0LmRlbGV0ZWRfYXR0YWNobWVudCIpLmNoYW5nZShmdW5jdGlvbigpewogICAgJCh0aGlzKS5wYXJlbnRzKCcuZXhpc3RpbmctYXR0YWNobWVudCcpLnRvZ2dsZUNsYXNzKCdkZWxldGVkJywgJCh0aGlzKS5pcygiOmNoZWNrZWQiKSk7CiAgfSkuY2hhbmdlKCk7Cn0pOwo=" | |
| } | |
| }, | |
| "6.0.5": { | |
| "application.js": { | |
| "hash": "ce494e4e380316d654c1db1fda5adf3c", | |
| "path": "/usr/src/redmine/public/assets/application-0aa6b43a.js", | |
| "base64": "LyoqCiAqIFJlZG1pbmUgLSBwcm9qZWN0IG1hbmFnZW1lbnQgc29mdHdhcmUKICogQ29weXJpZ2h0IChDKSAyMDA2LSAgSmVhbi1QaGlsaXBwZSBMYW5nCiAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCiAqLwoKZnVuY3Rpb24gc2FuaXRpemVIVE1MKHN0cmluZykgewogIHZhciB0ZW1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIHRlbXAudGV4dENvbnRlbnQgPSBzdHJpbmc7CiAgcmV0dXJuIHRlbXAuaW5uZXJIVE1MOwp9CgpmdW5jdGlvbiBjaGVja0FsbChpZCwgY2hlY2tlZCkgewogICQoJyMnK2lkKS5maW5kKCdpbnB1dFt0eXBlPWNoZWNrYm94XTplbmFibGVkJykucHJvcCgnY2hlY2tlZCcsIGNoZWNrZWQpOwp9CgpmdW5jdGlvbiB0b2dnbGVDaGVja2JveGVzQnlTZWxlY3RvcihzZWxlY3RvcikgewogIHZhciBhbGxfY2hlY2tlZCA9IHRydWU7CiAgJChzZWxlY3RvcikuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgaWYgKCEkKHRoaXMpLmlzKCc6Y2hlY2tlZCcpKSB7IGFsbF9jaGVja2VkID0gZmFsc2U7IH0KICB9KTsKICAkKHNlbGVjdG9yKS5wcm9wKCdjaGVja2VkJywgIWFsbF9jaGVja2VkKS50cmlnZ2VyKCdjaGFuZ2UnKTsKfQoKZnVuY3Rpb24gc2hvd0FuZFNjcm9sbFRvKGlkLCBmb2N1cykgewogICQoJyMnK2lkKS5zaG93KCk7CiAgaWYgKGZvY3VzICE9PSBudWxsKSB7CiAgICAkKCcjJytmb2N1cykuZm9jdXMoKTsKICB9CiAgJCgnaHRtbCwgYm9keScpLmFuaW1hdGUoe3Njcm9sbFRvcDogJCgnIycraWQpLm9mZnNldCgpLnRvcH0sIDEwMCk7Cn0KCmZ1bmN0aW9uIHRvZ2dsZVJvd0dyb3VwKGVsKSB7CiAgdmFyIHRyID0gJChlbCkucGFyZW50cygndHInKS5maXJzdCgpOwogIHZhciBuID0gdHIubmV4dCgpOwogIHRyLnRvZ2dsZUNsYXNzKCdvcGVuJyk7CiAgJChlbCkudG9nZ2xlQ2xhc3MoJ2ljb24tZXhwYW5kZWQgaWNvbi1jb2xsYXBzZWQnKTsKICB0b2dnbGVFeHBlbmRDb2xsYXBzZUljb24oZWwpCiAgd2hpbGUgKG4ubGVuZ3RoICYmICFuLmhhc0NsYXNzKCdncm91cCcpKSB7CiAgICBuLnRvZ2dsZSgpOwogICAgbiA9IG4ubmV4dCgndHInKTsKICB9Cn0KCmZ1bmN0aW9uIHRvZ2dsZUV4cGVuZENvbGxhcHNlSWNvbihlbCkgewogIGNvbnN0IHN2ZyA9IGVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzdmcnKS5pdGVtKDApCgogIGlmIChzdmcgPT09IG51bGwpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2ljb24tZXhwYW5kZWQnKSkgewogICAgdXBkYXRlU1ZHSWNvbihzdmcsICdhbmdsZS1kb3duJykKICAgIHN2Zy5jbGFzc0xpc3QucmVtb3ZlKCdpY29uLXJ0bCcpCiAgfSBlbHNlIHsKICAgIHVwZGF0ZVNWR0ljb24oc3ZnLCAnYW5nbGUtcmlnaHQnKQogICAgc3ZnLmNsYXNzTGlzdC5hZGQoJ2ljb24tcnRsJykKICB9Cn0KCmZ1bmN0aW9uIHVwZGF0ZVNWR0ljb24oZWxlbWVudCwgaWNvbikgewogIGNvbnN0IGljb25FbGVtZW50ID0gZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidXNlIikuaXRlbSgwKQoKICBpZiAoaWNvbkVsZW1lbnQgPT09IG51bGwpIHsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIGNvbnN0IGljb25QYXRoID0gaWNvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKCdocmVmJyk7CiAgaWNvbkVsZW1lbnQuc2V0QXR0cmlidXRlKCdocmVmJywgaWNvblBhdGgucmVwbGFjZSgvIy4qJC9nLCAiI2ljb24tLSIgKyBpY29uKSkKfQoKZnVuY3Rpb24gY29sbGFwc2VBbGxSb3dHcm91cHMoZWwpIHsKICB2YXIgdGJvZHkgPSAkKGVsKS5wYXJlbnRzKCd0Ym9keScpLmZpcnN0KCk7CiAgdGJvZHkuY2hpbGRyZW4oJ3RyJykuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ2dyb3VwJykpIHsKICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygnb3BlbicpOwogICAgICB2YXIgZXhwYW5kZXIgPSAkKHRoaXMpLmZpbmQoJy5leHBhbmRlcicpOwogICAgICBleHBhbmRlci5zd2l0Y2hDbGFzcygnaWNvbi1leHBhbmRlZCcsICdpY29uLWNvbGxhcHNlZCcpOwogICAgICB0b2dnbGVFeHBlbmRDb2xsYXBzZUljb24oZXhwYW5kZXJbMF0pOwogICAgfSBlbHNlIHsKICAgICAgJCh0aGlzKS5oaWRlKCk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIGV4cGFuZEFsbFJvd0dyb3VwcyhlbCkgewogIHZhciB0Ym9keSA9ICQoZWwpLnBhcmVudHMoJ3Rib2R5JykuZmlyc3QoKTsKICB0Ym9keS5jaGlsZHJlbigndHInKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnZ3JvdXAnKSkgewogICAgICAkKHRoaXMpLmFkZENsYXNzKCdvcGVuJyk7CiAgICAgIHZhciBleHBhbmRlciA9ICQodGhpcykuZmluZCgnLmV4cGFuZGVyJyk7CiAgICAgIGV4cGFuZGVyLnN3aXRjaENsYXNzKCdpY29uLWNvbGxhcHNlZCcsICdpY29uLWV4cGFuZGVkJyk7CiAgICAgIHRvZ2dsZUV4cGVuZENvbGxhcHNlSWNvbihleHBhbmRlclswXSk7CiAgICB9IGVsc2UgewogICAgICAkKHRoaXMpLnNob3coKTsKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gdG9nZ2xlQWxsUm93R3JvdXBzKGVsKSB7CiAgdmFyIHRyID0gJChlbCkucGFyZW50cygndHInKS5maXJzdCgpOwogIGlmICh0ci5oYXNDbGFzcygnb3BlbicpKSB7CiAgICBjb2xsYXBzZUFsbFJvd0dyb3VwcyhlbCk7CiAgfSBlbHNlIHsKICAgIGV4cGFuZEFsbFJvd0dyb3VwcyhlbCk7CiAgfQp9CgpmdW5jdGlvbiB0b2dnbGVGaWVsZHNldChlbCkgewogIHZhciBmaWVsZHNldCA9ICQoZWwpLnBhcmVudHMoJ2ZpZWxkc2V0JykuZmlyc3QoKTsKICBmaWVsZHNldC50b2dnbGVDbGFzcygnY29sbGFwc2VkJyk7CiAgZmllbGRzZXQuY2hpbGRyZW4oJ2xlZ2VuZCcpLnRvZ2dsZUNsYXNzKCdpY29uLWV4cGFuZGVkIGljb24tY29sbGFwc2VkJyk7CiAgdG9nZ2xlRXhwZW5kQ29sbGFwc2VJY29uKGZpZWxkc2V0LmNoaWxkcmVuKCdsZWdlbmQnKVswXSkKICBmaWVsZHNldC5jaGlsZHJlbignZGl2JykudG9nZ2xlKCk7Cn0KCmZ1bmN0aW9uIGhpZGVGaWVsZHNldChlbCkgewogIHZhciBmaWVsZHNldCA9ICQoZWwpLnBhcmVudHMoJ2ZpZWxkc2V0JykuZmlyc3QoKTsKICBmaWVsZHNldC50b2dnbGVDbGFzcygnY29sbGFwc2VkJyk7CiAgZmllbGRzZXQuY2hpbGRyZW4oJ2RpdicpLmhpZGUoKTsKfQoKLy8gY29sdW1ucyBzZWxlY3Rpb24KZnVuY3Rpb24gbW92ZU9wdGlvbnModGhlU2VsRnJvbSwgdGhlU2VsVG8pIHsKICAkKHRoZVNlbEZyb20pLmZpbmQoJ29wdGlvbjpzZWxlY3RlZCcpLmRldGFjaCgpLnByb3AoInNlbGVjdGVkIiwgZmFsc2UpLmFwcGVuZFRvKCQodGhlU2VsVG8pKTsKfQoKZnVuY3Rpb24gbW92ZU9wdGlvblVwKHRoZVNlbCkgewogICQodGhlU2VsKS5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAkKHRoaXMpLnByZXYoJzpub3QoOnNlbGVjdGVkKScpLmRldGFjaCgpLmluc2VydEFmdGVyKCQodGhpcykpOwogIH0pOwp9CgpmdW5jdGlvbiBtb3ZlT3B0aW9uVG9wKHRoZVNlbCkgewogICQodGhlU2VsKS5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS5kZXRhY2goKS5wcmVwZW5kVG8oJCh0aGVTZWwpKTsKfQoKZnVuY3Rpb24gbW92ZU9wdGlvbkRvd24odGhlU2VsKSB7CiAgJCgkKHRoZVNlbCkuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykuZ2V0KCkucmV2ZXJzZSgpKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAkKHRoaXMpLm5leHQoJzpub3QoOnNlbGVjdGVkKScpLmRldGFjaCgpLmluc2VydEJlZm9yZSgkKHRoaXMpKTsKICB9KTsKfQoKZnVuY3Rpb24gbW92ZU9wdGlvbkJvdHRvbSh0aGVTZWwpIHsKICAkKHRoZVNlbCkuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykuZGV0YWNoKCkuYXBwZW5kVG8oJCh0aGVTZWwpKTsKfQoKZnVuY3Rpb24gaW5pdEZpbHRlcnMoKSB7CiAgJCgnI2FkZF9maWx0ZXJfc2VsZWN0JykuY2hhbmdlKGZ1bmN0aW9uKCkgewogICAgYWRkRmlsdGVyKCQodGhpcykudmFsKCksICcnLCBbXSk7CiAgfSk7CiAgJCgnI2ZpbHRlcnMtdGFibGUgLmZpZWxkIGlucHV0W3R5cGU9Y2hlY2tib3hdJykuZWFjaChmdW5jdGlvbigpIHsKICAgIHRvZ2dsZUZpbHRlcigkKHRoaXMpLnZhbCgpKTsKICB9KTsKICAkKCcjZmlsdGVycy10YWJsZScpLm9uKCdjbGljaycsICcuZmllbGQgaW5wdXRbdHlwZT1jaGVja2JveF0nLCBmdW5jdGlvbigpIHsKICAgIHRvZ2dsZUZpbHRlcigkKHRoaXMpLnZhbCgpKTsKICB9KTsKICAkKCcjZmlsdGVycy10YWJsZScpLm9uKCdrZXlwcmVzcycsICdpbnB1dFt0eXBlPXRleHRdJywgZnVuY3Rpb24oZSkgewogICAgaWYgKGUua2V5Q29kZSA9PSAxMykgJCh0aGlzKS5jbG9zZXN0KCdmb3JtJykuc3VibWl0KCk7CiAgfSk7Cn0KCmZ1bmN0aW9uIGFkZEZpbHRlcihmaWVsZCwgb3BlcmF0b3IsIHZhbHVlcykgewogIHZhciBmaWVsZElkID0gZmllbGQucmVwbGFjZSgnLicsICdfJyk7CiAgdmFyIHRyID0gJCgnI3RyXycrZmllbGRJZCk7CgogIHZhciBmaWx0ZXJPcHRpb25zID0gYXZhaWxhYmxlRmlsdGVyc1tmaWVsZF07CiAgaWYgKCFmaWx0ZXJPcHRpb25zKSByZXR1cm47CgogIGlmIChmaWx0ZXJPcHRpb25zWydyZW1vdGUnXSAmJiBmaWx0ZXJPcHRpb25zWyd2YWx1ZXMnXSA9PSBudWxsKSB7CiAgICAkLmdldEpTT04oZmlsdGVyc1VybCwgeyduYW1lJzogZmllbGR9KS5kb25lKGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgZmlsdGVyT3B0aW9uc1sndmFsdWVzJ10gPSBkYXRhOwogICAgICBhZGRGaWx0ZXIoZmllbGQsIG9wZXJhdG9yLCB2YWx1ZXMpIDsKICAgIH0pOwogICAgcmV0dXJuOwogIH0KCiAgaWYgKHRyLmxlbmd0aCA+IDApIHsKICAgIHRyLnNob3coKTsKICB9IGVsc2UgewogICAgYnVpbGRGaWx0ZXJSb3coZmllbGQsIG9wZXJhdG9yLCB2YWx1ZXMpOwogIH0KICAkKCcjY2JfJytmaWVsZElkKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7CiAgdG9nZ2xlRmlsdGVyKGZpZWxkKTsKICB0b2dnbGVNdWx0aVNlbGVjdEljb25Jbml0KCk7CiAgJCgnI2FkZF9maWx0ZXJfc2VsZWN0JykudmFsKCcnKS5maW5kKCdvcHRpb24nKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgaWYgKCQodGhpcykuYXR0cigndmFsdWUnKSA9PSBmaWVsZCkgewogICAgICAkKHRoaXMpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIGJ1aWxkRmlsdGVyUm93KGZpZWxkLCBvcGVyYXRvciwgdmFsdWVzKSB7CiAgdmFyIGZpZWxkSWQgPSBmaWVsZC5yZXBsYWNlKCcuJywgJ18nKTsKICB2YXIgZmlsdGVyVGFibGUgPSAkKCIjZmlsdGVycy10YWJsZSIpOwogIHZhciBmaWx0ZXJPcHRpb25zID0gYXZhaWxhYmxlRmlsdGVyc1tmaWVsZF07CiAgaWYgKCFmaWx0ZXJPcHRpb25zKSByZXR1cm47CiAgdmFyIG9wZXJhdG9ycyA9IG9wZXJhdG9yQnlUeXBlW2ZpbHRlck9wdGlvbnNbJ3R5cGUnXV07CiAgdmFyIGZpbHRlclZhbHVlcyA9IGZpbHRlck9wdGlvbnNbJ3ZhbHVlcyddOwogIHZhciBzZWxlY3Q7CgogIHZhciB0ciA9ICQoJzxkaXYgY2xhc3M9ImZpbHRlciI+JykuYXR0cignaWQnLCAndHJfJytmaWVsZElkKS5odG1sKAogICAgJzxkaXYgY2xhc3M9ImZpZWxkIj48aW5wdXQgY2hlY2tlZD0iY2hlY2tlZCIgaWQ9ImNiXycrZmllbGRJZCsnIiBuYW1lPSJmW10iIHZhbHVlPSInK2ZpZWxkKyciIHR5cGU9ImNoZWNrYm94Ij48bGFiZWwgZm9yPSJjYl8nK2ZpZWxkSWQrJyI+ICcrZmlsdGVyT3B0aW9uc1snbmFtZSddKyc8L2xhYmVsPjwvZGl2PicgKwogICAgJzxkaXYgY2xhc3M9Im9wZXJhdG9yIj48c2VsZWN0IGlkPSJvcGVyYXRvcnNfJytmaWVsZElkKyciIG5hbWU9Im9wWycrZmllbGQrJ10iPjwvc2VsZWN0PjwvZGl2PicgKwogICAgJzxkaXYgY2xhc3M9InZhbHVlcyI+PC9kaXY+JwogICk7CiAgZmlsdGVyVGFibGUuYXBwZW5kKHRyKTsKCiAgc2VsZWN0ID0gdHIuZmluZCgnLm9wZXJhdG9yIHNlbGVjdCcpOwogIG9wZXJhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uKG9wKSB7CiAgICB2YXIgb3B0aW9uID0gJCgnPG9wdGlvbj4nKS52YWwob3ApLnRleHQob3BlcmF0b3JMYWJlbHNbb3BdKTsKICAgIGlmIChvcCA9PSBvcGVyYXRvcikgeyBvcHRpb24ucHJvcCgnc2VsZWN0ZWQnLCB0cnVlKTsgfQogICAgc2VsZWN0LmFwcGVuZChvcHRpb24pOwogIH0pOwogIHNlbGVjdC5jaGFuZ2UoZnVuY3Rpb24oKXsgdG9nZ2xlT3BlcmF0b3IoZmllbGQpOyB9KTsKCiAgc3dpdGNoIChmaWx0ZXJPcHRpb25zWyd0eXBlJ10pIHsKICBjYXNlICJsaXN0IjoKICBjYXNlICJsaXN0X3dpdGhfaGlzdG9yeSI6CiAgY2FzZSAibGlzdF9vcHRpb25hbCI6CiAgY2FzZSAibGlzdF9vcHRpb25hbF93aXRoX2hpc3RvcnkiOgogIGNhc2UgImxpc3Rfc3RhdHVzIjoKICBjYXNlICJsaXN0X3N1YnByb2plY3RzIjoKICAgIGNvbnN0IGljb25UeXBlID0gdmFsdWVzLmxlbmd0aCA+IDEgPyAndG9nZ2xlLW1pbnVzJyA6ICd0b2dnbGUtcGx1cyc7CiAgICBjb25zdCBjbG9uZWRJY29uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2ljb24tY29weS1zb3VyY2Ugc3ZnJykuY2xvbmVOb2RlKHRydWUpOwogICAgdXBkYXRlU1ZHSWNvbihjbG9uZWRJY29uLCBpY29uVHlwZSk7CgogICAgdHIuZmluZCgnLnZhbHVlcycpLmFwcGVuZCgKICAgICAgJCgnPHNwYW4+JywgeyBzdHlsZTogJ2Rpc3BsYXk6bm9uZTsnIH0pLmFwcGVuZCgKICAgICAgICAkKCc8c2VsZWN0PicsIHsKICAgICAgICAgIGNsYXNzOiAndmFsdWUnLAogICAgICAgICAgaWQ6IGB2YWx1ZXNfJHtmaWVsZElkfV8xYCwKICAgICAgICAgIG5hbWU6IGB2WyR7ZmllbGR9XVtdYCwKICAgICAgICB9KSwKICAgICAgICAnXG4nLAogICAgICAgICQoJzxzcGFuPicsIHsgY2xhc3M6IGB0b2dnbGUtbXVsdGlzZWxlY3QgaWNvbi1vbmx5IGljb24tJHtpY29uVHlwZX1gIH0pLmFwcGVuZChjbG9uZWRJY29uKQogICAgICApCiAgICApOwogICAgc2VsZWN0ID0gdHIuZmluZCgnLnZhbHVlcyBzZWxlY3QnKTsKICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMSkgeyBzZWxlY3QuYXR0cignbXVsdGlwbGUnLCB0cnVlKTsgfQogICAgZmlsdGVyVmFsdWVzLmZvckVhY2goZnVuY3Rpb24oZmlsdGVyVmFsdWUpIHsKICAgICAgdmFyIG9wdGlvbiA9ICQoJzxvcHRpb24+Jyk7CiAgICAgIGlmICgkLmlzQXJyYXkoZmlsdGVyVmFsdWUpKSB7CiAgICAgICAgb3B0aW9uLnZhbChmaWx0ZXJWYWx1ZVsxXSkudGV4dChmaWx0ZXJWYWx1ZVswXSk7CiAgICAgICAgaWYgKCQuaW5BcnJheShmaWx0ZXJWYWx1ZVsxXSwgdmFsdWVzKSA+IC0xKSB7b3B0aW9uLnByb3AoJ3NlbGVjdGVkJywgdHJ1ZSk7fQogICAgICAgIGlmIChmaWx0ZXJWYWx1ZS5sZW5ndGggPT0gMykgewogICAgICAgICAgdmFyIG9wdGdyb3VwID0gc2VsZWN0LmZpbmQoJ29wdGdyb3VwJykuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuICQodGhpcykuYXR0cignbGFiZWwnKSA9PSBmaWx0ZXJWYWx1ZVsyXX0pOwogICAgICAgICAgaWYgKCFvcHRncm91cC5sZW5ndGgpIHtvcHRncm91cCA9ICQoJzxvcHRncm91cD4nKS5hdHRyKCdsYWJlbCcsIGZpbHRlclZhbHVlWzJdKTt9CiAgICAgICAgICBvcHRpb24gPSBvcHRncm91cC5hcHBlbmQob3B0aW9uKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb3B0aW9uLnZhbChmaWx0ZXJWYWx1ZSkudGV4dChmaWx0ZXJWYWx1ZSk7CiAgICAgICAgaWYgKCQuaW5BcnJheShmaWx0ZXJWYWx1ZSwgdmFsdWVzKSA+IC0xKSB7b3B0aW9uLnByb3AoJ3NlbGVjdGVkJywgdHJ1ZSk7fQogICAgICB9CiAgICAgIHNlbGVjdC5hcHBlbmQob3B0aW9uKTsKICAgIH0pOwogICAgYnJlYWs7CiAgY2FzZSAiZGF0ZSI6CiAgY2FzZSAiZGF0ZV9wYXN0IjoKICAgIHRyLmZpbmQoJy52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9ImRhdGUiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnXzEiIHNpemU9IjEwIiBjbGFzcz0idmFsdWUgZGF0ZV92YWx1ZSIgLz48L3NwYW4+JyArCiAgICAgICcgPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZTsiPjxpbnB1dCB0eXBlPSJkYXRlIiBuYW1lPSJ2WycrZmllbGQrJ11bXSIgaWQ9InZhbHVlc18nK2ZpZWxkSWQrJ18yIiBzaXplPSIxMCIgY2xhc3M9InZhbHVlIGRhdGVfdmFsdWUiIC8+PC9zcGFuPicgKwogICAgICAnIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKyciIHNpemU9IjMiIGNsYXNzPSJ2YWx1ZSIgLz4gJytsYWJlbERheVBsdXJhbCsnPC9zcGFuPicKICAgICk7CiAgICAkKCcjdmFsdWVzXycrZmllbGRJZCsnXzEnKS52YWwodmFsdWVzWzBdKS5kYXRlcGlja2VyRmFsbGJhY2soZGF0ZXBpY2tlck9wdGlvbnMpOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQrJ18yJykudmFsKHZhbHVlc1sxXSkuZGF0ZXBpY2tlckZhbGxiYWNrKGRhdGVwaWNrZXJPcHRpb25zKTsKICAgICQoJyN2YWx1ZXNfJytmaWVsZElkKS52YWwodmFsdWVzWzBdKTsKICAgIGJyZWFrOwogIGNhc2UgInN0cmluZyI6CiAgY2FzZSAidGV4dCI6CiAgY2FzZSAic2VhcmNoIjoKICAgIHRyLmZpbmQoJy52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnIiBzaXplPSIzMCIgY2xhc3M9InZhbHVlIiAvPjwvc3Bhbj4nCiAgICApOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQpLnZhbCh2YWx1ZXNbMF0pOwogICAgYnJlYWs7CiAgY2FzZSAicmVsYXRpb24iOgogICAgdHIuZmluZCgnLnZhbHVlcycpLmFwcGVuZCgKICAgICAgJzxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKyciIHNpemU9IjYiIGNsYXNzPSJ2YWx1ZSIgLz48L3NwYW4+JyArCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PHNlbGVjdCBjbGFzcz0idmFsdWUiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnXzEiPjwvc2VsZWN0Pjwvc3Bhbj4nCiAgICApOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQpLnZhbCh2YWx1ZXNbMF0pOwogICAgc2VsZWN0ID0gdHIuZmluZCgnLnZhbHVlcyBzZWxlY3QnKTsKICAgIGZpbHRlclZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKGZpbHRlclZhbHVlKSB7CiAgICAgIHZhciBvcHRpb24gPSAkKCc8b3B0aW9uPicpOwogICAgICBvcHRpb24udmFsKGZpbHRlclZhbHVlWzFdKS50ZXh0KGZpbHRlclZhbHVlWzBdKTsKICAgICAgaWYgKHZhbHVlc1swXSA9PSBmaWx0ZXJWYWx1ZVsxXSkgeyBvcHRpb24ucHJvcCgnc2VsZWN0ZWQnLCB0cnVlKTsgfQogICAgICBzZWxlY3QuYXBwZW5kKG9wdGlvbik7CiAgICB9KTsKICAgIGJyZWFrOwogIGNhc2UgImludGVnZXIiOgogIGNhc2UgImZsb2F0IjoKICBjYXNlICJ0cmVlIjoKICAgIHRyLmZpbmQoJy52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnXzEiIHNpemU9IjE0IiBjbGFzcz0idmFsdWUiIC8+PC9zcGFuPicgKwogICAgICAnIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKydfMiIgc2l6ZT0iMTQiIGNsYXNzPSJ2YWx1ZSIgLz48L3NwYW4+JwogICAgKTsKICAgICQoJyN2YWx1ZXNfJytmaWVsZElkKydfMScpLnZhbCh2YWx1ZXNbMF0pOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQrJ18yJykudmFsKHZhbHVlc1sxXSk7CiAgICBicmVhazsKICB9Cn0KCmZ1bmN0aW9uIHRvZ2dsZUZpbHRlcihmaWVsZCkgewogIHZhciBmaWVsZElkID0gZmllbGQucmVwbGFjZSgnLicsICdfJyk7CiAgaWYgKCQoJyNjYl8nICsgZmllbGRJZCkuaXMoJzpjaGVja2VkJykpIHsKICAgICQoIiNvcGVyYXRvcnNfIiArIGZpZWxkSWQpLnNob3coKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpOwogICAgdG9nZ2xlT3BlcmF0b3IoZmllbGQpOwogIH0gZWxzZSB7CiAgICAkKCIjb3BlcmF0b3JzXyIgKyBmaWVsZElkKS5oaWRlKCkuYXR0cignZGlzYWJsZWQnLCB0cnVlKTsKICAgIGVuYWJsZVZhbHVlcyhmaWVsZCwgW10pOwogIH0KfQoKZnVuY3Rpb24gZW5hYmxlVmFsdWVzKGZpZWxkLCBpbmRleGVzKSB7CiAgdmFyIGZpZWxkSWQgPSBmaWVsZC5yZXBsYWNlKCcuJywgJ18nKTsKICAkKCcjdHJfJytmaWVsZElkKycgLnZhbHVlcyAudmFsdWUnKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICBpZiAoJC5pbkFycmF5KGluZGV4LCBpbmRleGVzKSA+PSAwKSB7CiAgICAgICQodGhpcykucmVtb3ZlQXR0cignZGlzYWJsZWQnKTsKICAgICAgJCh0aGlzKS5wYXJlbnRzKCdzcGFuJykuZmlyc3QoKS5zaG93KCk7CiAgICB9IGVsc2UgewogICAgICAkKHRoaXMpLnZhbCgnJyk7CiAgICAgICQodGhpcykuYXR0cignZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgJCh0aGlzKS5wYXJlbnRzKCdzcGFuJykuZmlyc3QoKS5oaWRlKCk7CiAgICB9CgogICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ2dyb3VwJykpIHsKICAgICAgJCh0aGlzKS5hZGRDbGFzcygnb3BlbicpOwogICAgfSBlbHNlIHsKICAgICAgJCh0aGlzKS5zaG93KCk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIHRvZ2dsZU9wZXJhdG9yKGZpZWxkKSB7CiAgdmFyIGZpZWxkSWQgPSBmaWVsZC5yZXBsYWNlKCcuJywgJ18nKTsKICB2YXIgb3BlcmF0b3IgPSAkKCIjb3BlcmF0b3JzXyIgKyBmaWVsZElkKTsKICBzd2l0Y2ggKG9wZXJhdG9yLnZhbCgpKSB7CiAgICBjYXNlICIhKiI6CiAgICBjYXNlICIqIjoKICAgIGNhc2UgIm5kIjoKICAgIGNhc2UgInQiOgogICAgY2FzZSAibGQiOgogICAgY2FzZSAibnciOgogICAgY2FzZSAidyI6CiAgICBjYXNlICJsdyI6CiAgICBjYXNlICJsMnciOgogICAgY2FzZSAibm0iOgogICAgY2FzZSAibSI6CiAgICBjYXNlICJsbSI6CiAgICBjYXNlICJ5IjoKICAgIGNhc2UgIm8iOgogICAgY2FzZSAiYyI6CiAgICBjYXNlICIqbyI6CiAgICBjYXNlICIhbyI6CiAgICAgIGVuYWJsZVZhbHVlcyhmaWVsZCwgW10pOwogICAgICBicmVhazsKICAgIGNhc2UgIj48IjoKICAgICAgZW5hYmxlVmFsdWVzKGZpZWxkLCBbMCwxXSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAiPHQrIjoKICAgIGNhc2UgIj50KyI6CiAgICBjYXNlICI+PHQrIjoKICAgIGNhc2UgInQrIjoKICAgIGNhc2UgIj50LSI6CiAgICBjYXNlICI8dC0iOgogICAgY2FzZSAiPjx0LSI6CiAgICBjYXNlICJ0LSI6CiAgICAgIGVuYWJsZVZhbHVlcyhmaWVsZCwgWzJdKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICI9cCI6CiAgICBjYXNlICI9IXAiOgogICAgY2FzZSAiIXAiOgogICAgICBlbmFibGVWYWx1ZXMoZmllbGQsIFsxXSk7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgZW5hYmxlVmFsdWVzKGZpZWxkLCBbMF0pOwogICAgICBicmVhazsKICB9Cn0KCmZ1bmN0aW9uIHRvZ2dsZU11bHRpU2VsZWN0KGVsKSB7CiAgdmFyIGlzV29ya2Zsb3cgPSBlbC5jbG9zZXN0KCcuY29udHJvbGxlci13b3JrZmxvd3MnKTsKICBpZiAoZWwuYXR0cignbXVsdGlwbGUnKSkgewogICAgZWwucmVtb3ZlQXR0cignbXVsdGlwbGUnKTsKICAgIGlmIChpc1dvcmtmbG93KSB7IGVsLmZpbmQoIm9wdGlvblt2YWx1ZT1hbGxdIikuc2hvdygpOyB9CiAgICBlbC5hdHRyKCdzaXplJywgMSk7CiAgfSBlbHNlIHsKICAgIGVsLmF0dHIoJ211bHRpcGxlJywgdHJ1ZSk7CiAgICBpZiAoaXNXb3JrZmxvdykgeyBlbC5maW5kKCJvcHRpb25bdmFsdWU9YWxsXSIpLmF0dHIoInNlbGVjdGVkIiwgZmFsc2UpLmhpZGUoKTsgfQogICAgaWYgKGVsLmNoaWxkcmVuKCkubGVuZ3RoID4gMTApCiAgICAgIGVsLmF0dHIoJ3NpemUnLCAxMCk7CiAgICBlbHNlCiAgICAgIGVsLmF0dHIoJ3NpemUnLCA0KTsKICB9Cn0KCmZ1bmN0aW9uIHNob3dUYWIobmFtZSwgdXJsKSB7CiAgJCgnI3RhYi1jb250ZW50LScgKyBuYW1lKS5wYXJlbnQoKS5maW5kKCcudGFiLWNvbnRlbnQnKS5oaWRlKCk7CiAgJCgnI3RhYi1jb250ZW50LScgKyBuYW1lKS5zaG93KCk7CiAgJCgnI3RhYi0nICsgbmFtZSkuY2xvc2VzdCgnLnRhYnMnKS5maW5kKCdhJykucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkJyk7CiAgJCgnI3RhYi0nICsgbmFtZSkuYWRkQ2xhc3MoJ3NlbGVjdGVkJyk7CgogIHJlcGxhY2VJbkhpc3RvcnkodXJsKQoKICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIHNob3dJc3N1ZUhpc3Rvcnkoam91cm5hbCwgdXJsKSB7CiAgdGFiX2NvbnRlbnQgPSAkKCcjdGFiLWNvbnRlbnQtaGlzdG9yeScpOwogIHRhYl9jb250ZW50LnBhcmVudCgpLmZpbmQoJy50YWItY29udGVudCcpLmhpZGUoKTsKICB0YWJfY29udGVudC5zaG93KCk7CiAgdGFiX2NvbnRlbnQucGFyZW50KCkuY2hpbGRyZW4oJ2Rpdi50YWJzJykuZmluZCgnYScpLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpOwoKICAkKCcjdGFiLScgKyBqb3VybmFsKS5hZGRDbGFzcygnc2VsZWN0ZWQnKTsKCiAgcmVwbGFjZUluSGlzdG9yeSh1cmwpCgogIHN3aXRjaChqb3VybmFsKSB7CiAgICBjYXNlICdub3Rlcyc6CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbDpub3QoLmhhcy1ub3RlcyknKS5oaWRlKCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC53aWtpJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAuY29udGV4dHVhbCAuam91cm5hbC1hY3Rpb25zJykuc2hvdygpOwoKICAgICAgLy8gYWx3YXlzIHNob3cgdGh1bWJuYWlscyBpbiBub3RlcyB0YWIKICAgICAgdmFyIHRodW1ibmFpbHMgPSB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAudGh1bWJuYWlscycpOwogICAgICB0aHVtYm5haWxzLnNob3coKTsKICAgICAgLy8gc2hvdyBqb3VybmFscyB3aXRob3V0IG5vdGVzLCBidXQgd2l0aCB0aHVtYm5haWxzCiAgICAgIHRodW1ibmFpbHMucGFyZW50cygnLmpvdXJuYWwnKS5zaG93KCk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAncHJvcGVydGllcyc6CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbDpub3QoLmhhcy1kZXRhaWxzKScpLmhpZGUoKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwgLndpa2knKS5oaWRlKCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC50aHVtYm5haWxzJykuaGlkZSgpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAuY29udGV4dHVhbCAuam91cm5hbC1hY3Rpb25zJykuaGlkZSgpOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAud2lraScpLnNob3coKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwgLnRodW1ibmFpbHMnKS5zaG93KCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC5jb250ZXh0dWFsIC5qb3VybmFsLWFjdGlvbnMnKS5zaG93KCk7CiAgfQoKICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIGdldFJlbW90ZVRhYihuYW1lLCByZW1vdGVfdXJsLCB1cmwsIGxvYWRfYWx3YXlzKSB7CiAgbG9hZF9hbHdheXMgPSBsb2FkX2Fsd2F5cyB8fCBmYWxzZTsKICB2YXIgdGFiX2NvbnRlbnQgPSAkKCcjdGFiLWNvbnRlbnQtJyArIG5hbWUpOwoKICB0YWJfY29udGVudC5wYXJlbnQoKS5maW5kKCcudGFiLWNvbnRlbnQnKS5oaWRlKCk7CiAgdGFiX2NvbnRlbnQucGFyZW50KCkuY2hpbGRyZW4oJ2Rpdi50YWJzJykuZmluZCgnYScpLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpOwogICQoJyN0YWItJyArIG5hbWUpLmFkZENsYXNzKCdzZWxlY3RlZCcpOwoKICByZXBsYWNlSW5IaXN0b3J5KHVybCk7CgogIGlmICh0YWJfY29udGVudC5jaGlsZHJlbigpLmxlbmd0aCA9PSAwICYmIGxvYWRfYWx3YXlzID09IGZhbHNlKSB7CiAgICAkLmFqYXgoewogICAgICB1cmw6IHJlbW90ZV91cmwsCiAgICAgIHR5cGU6ICdnZXQnLAogICAgICBzdWNjZXNzOiBmdW5jdGlvbihkYXRhKXsKICAgICAgICB0YWJfY29udGVudC5odG1sKGRhdGEpCiAgICAgIH0KICAgIH0pOwogIH0KCiAgdGFiX2NvbnRlbnQuc2hvdygpOwogIHJldHVybiBmYWxzZTsKfQoKLy9yZXBsYWNlcyBjdXJyZW50IFVSTCB3aXRoIHRoZSAiaHJlZiIgYXR0cmlidXRlIG9mIHRoZSBjdXJyZW50IGxpbmsKLy8ob25seSB0cmlnZ2VyZWQgaWYgc3VwcG9ydGVkIGJ5IGJyb3dzZXIpCmZ1bmN0aW9uIHJlcGxhY2VJbkhpc3RvcnkodXJsKSB7CiAgaWYgKCJyZXBsYWNlU3RhdGUiIGluIHdpbmRvdy5oaXN0b3J5ICYmIHVybCAhPT0gdW5kZWZpbmVkKSB7CiAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwgZG9jdW1lbnQudGl0bGUsIHVybCk7CiAgfQp9CgpmdW5jdGlvbiBtb3ZlVGFiUmlnaHQoZWwpIHsKICB2YXIgbGlzID0gJChlbCkucGFyZW50cygnZGl2LnRhYnMnKS5maXJzdCgpLmZpbmQoJ3VsJykuY2hpbGRyZW4oKTsKICB2YXIgYncgPSAkKGVsKS5wYXJlbnRzKCdkaXYudGFicy1idXR0b25zJykub3V0ZXJXaWR0aCh0cnVlKTsKICB2YXIgdGFic1dpZHRoID0gMDsKICB2YXIgaSA9IDA7CiAgbGlzLmVhY2goZnVuY3Rpb24oKSB7CiAgICBpZiAoJCh0aGlzKS5pcygnOnZpc2libGUnKSkgewogICAgICB0YWJzV2lkdGggKz0gJCh0aGlzKS5vdXRlcldpZHRoKHRydWUpOwogICAgfQogIH0pOwogIGlmICh0YWJzV2lkdGggPCAkKGVsKS5wYXJlbnRzKCdkaXYudGFicycpLmZpcnN0KCkud2lkdGgoKSAtIGJ3KSB7IHJldHVybjsgfQogICQoZWwpLnNpYmxpbmdzKCcudGFiLWxlZnQnKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICB3aGlsZSAoaTxsaXMubGVuZ3RoICYmICFsaXMuZXEoaSkuaXMoJzp2aXNpYmxlJykpIHsgaSsrOyB9CiAgdmFyIHcgPSBsaXMuZXEoaSkud2lkdGgoKTsKICBsaXMuZXEoaSkuaGlkZSgpOwogIGlmICh0YWJzV2lkdGggLSB3IDwgJChlbCkucGFyZW50cygnZGl2LnRhYnMnKS5maXJzdCgpLndpZHRoKCkgLSBidykgewogICAgJChlbCkuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7CiAgfQp9CgpmdW5jdGlvbiBtb3ZlVGFiTGVmdChlbCkgewogIHZhciBsaXMgPSAkKGVsKS5wYXJlbnRzKCdkaXYudGFicycpLmZpcnN0KCkuZmluZCgndWwnKS5jaGlsZHJlbigpOwogIHZhciBpID0gMDsKICB3aGlsZSAoaSA8IGxpcy5sZW5ndGggJiYgIWxpcy5lcShpKS5pcygnOnZpc2libGUnKSkgeyBpKys7IH0KICBpZiAoaSA+IDApIHsKICAgIGxpcy5lcShpLTEpLnNob3coKTsKICAgICQoZWwpLnNpYmxpbmdzKCcudGFiLXJpZ2h0JykucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7CiAgfQogIGlmIChpIDw9IDEpIHsKICAgICQoZWwpLmFkZENsYXNzKCdkaXNhYmxlZCcpOwogIH0KfQoKZnVuY3Rpb24gZGlzcGxheVRhYnNCdXR0b25zKCkgewogIHZhciBsaXM7CiAgdmFyIHRhYnNXaWR0aDsKICB2YXIgZWw7CiAgdmFyIG51bUhpZGRlbjsKICAkKCdkaXYudGFicycpLmVhY2goZnVuY3Rpb24oKSB7CiAgICBlbCA9ICQodGhpcyk7CiAgICBsaXMgPSBlbC5maW5kKCd1bCcpLmNoaWxkcmVuKCk7CiAgICB0YWJzV2lkdGggPSAwOwogICAgbnVtSGlkZGVuID0gMDsKICAgIGxpcy5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgIGlmICgkKHRoaXMpLmlzKCc6dmlzaWJsZScpKSB7CiAgICAgICAgdGFic1dpZHRoICs9ICQodGhpcykub3V0ZXJXaWR0aCh0cnVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBudW1IaWRkZW4rKzsKICAgICAgfQogICAgfSk7CiAgICB2YXIgYncgPSAkKGVsKS5maW5kKCdkaXYudGFicy1idXR0b25zJykub3V0ZXJXaWR0aCh0cnVlKTsKICAgIGlmICgodGFic1dpZHRoIDwgZWwud2lkdGgoKSAtIGJ3KSAmJiAobGlzLmxlbmd0aCA9PT0gMCB8fCBsaXMuZmlyc3QoKS5pcygnOnZpc2libGUnKSkpIHsKICAgICAgZWwuZmluZCgnZGl2LnRhYnMtYnV0dG9ucycpLmhpZGUoKTsKICAgIH0gZWxzZSB7CiAgICAgIGVsLmZpbmQoJ2Rpdi50YWJzLWJ1dHRvbnMnKS5zaG93KCkuY2hpbGRyZW4oJ2J1dHRvbi50YWItbGVmdCcpLnRvZ2dsZUNsYXNzKCdkaXNhYmxlZCcsIG51bUhpZGRlbiA9PSAwKTsKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gc2V0UHJlZGVjZXNzb3JGaWVsZHNWaXNpYmlsaXR5KCkgewogIHZhciByZWxhdGlvblR5cGUgPSAkKCcjcmVsYXRpb25fcmVsYXRpb25fdHlwZScpOwogIGlmIChyZWxhdGlvblR5cGUudmFsKCkgPT0gInByZWNlZGVzIiB8fCByZWxhdGlvblR5cGUudmFsKCkgPT0gImZvbGxvd3MiKSB7CiAgICAkKCcjcHJlZGVjZXNzb3JfZmllbGRzJykuc2hvdygpOwogIH0gZWxzZSB7CiAgICAkKCcjcHJlZGVjZXNzb3JfZmllbGRzJykuaGlkZSgpOwogIH0KfQoKZnVuY3Rpb24gc2hvd01vZGFsKGlkLCB3aWR0aCwgdGl0bGUpIHsKICB2YXIgZWwgPSAkKCcjJytpZCkuZmlyc3QoKTsKICBpZiAoZWwubGVuZ3RoID09PSAwIHx8IGVsLmlzKCc6dmlzaWJsZScpKSB7cmV0dXJuO30KICBpZiAoIXRpdGxlKSB0aXRsZSA9IGVsLmZpbmQoJ2gzLnRpdGxlJykudGV4dCgpOwogIC8vIG1vdmVzIGV4aXN0aW5nIG1vZGFscyBiZWhpbmQgdGhlIHRyYW5zcGFyZW50IGJhY2tncm91bmQKICAkKCIubW9kYWwiKS5jc3MoJ3pJbmRleCcsOTkpOwogIGVsLmRpYWxvZyh7CiAgICB3aWR0aDogd2lkdGgsCiAgICBtb2RhbDogdHJ1ZSwKICAgIHJlc2l6YWJsZTogZmFsc2UsCiAgICBkaWFsb2dDbGFzczogJ21vZGFsJywKICAgIHRpdGxlOiB0aXRsZQogIH0pLm9uKCdkaWFsb2djbG9zZScsIGZ1bmN0aW9uKCl7CiAgICAkKCIubW9kYWwiKS5jc3MoJ3pJbmRleCcsMTAxKTsKICB9KTsKICBlbC5maW5kKCJpbnB1dFt0eXBlPXRleHRdLCBpbnB1dFt0eXBlPXN1Ym1pdF0iKS5maXJzdCgpLmZvY3VzKCk7Cn0KCmZ1bmN0aW9uIGhpZGVNb2RhbChlbCkgewogIHZhciBtb2RhbDsKICBpZiAoZWwpIHsKICAgIG1vZGFsID0gJChlbCkucGFyZW50cygnLnVpLWRpYWxvZy1jb250ZW50Jyk7CiAgfSBlbHNlIHsKICAgIG1vZGFsID0gJCgnI2FqYXgtbW9kYWwnKTsKICB9CiAgbW9kYWwuZGlhbG9nKCJjbG9zZSIpOwp9CgpmdW5jdGlvbiBjb2xsYXBzZVNjbUVudHJ5KGlkKSB7CiAgJCgnLicraWQpLmVhY2goZnVuY3Rpb24oKSB7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnb3BlbicpKSB7CiAgICAgIGNvbGxhcHNlU2NtRW50cnkoJCh0aGlzKS5hdHRyKCdpZCcpKTsKICAgIH0KICAgICQodGhpcykuaGlkZSgpOwogIH0pOwogICQoJyMnK2lkKS5yZW1vdmVDbGFzcygnb3BlbicpOwp9CgpmdW5jdGlvbiBleHBhbmRTY21FbnRyeShpZCkgewogICQoJy4nK2lkKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgJCh0aGlzKS5zaG93KCk7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnbG9hZGVkJykgJiYgISQodGhpcykuaGFzQ2xhc3MoJ2NvbGxhcHNlZCcpKSB7CiAgICAgIGV4cGFuZFNjbUVudHJ5KCQodGhpcykuYXR0cignaWQnKSk7CiAgICB9CiAgfSk7CiAgJCgnIycraWQpLmFkZENsYXNzKCdvcGVuJyk7Cn0KCmZ1bmN0aW9uIHNjbUVudHJ5Q2xpY2soaWQsIHVybCkgewogICAgdmFyIGVsID0gJCgnIycraWQpOwogICAgdmFyIGV4cGFuZGVyID0gZWwuZmluZCgnLmV4cGFuZGVyJyk7CiAgICB2YXIgZm9sZGVyID0gZWwuZmluZCgnLmljb24tZm9sZGVyJyk7CgogICAgaWYgKGVsLmhhc0NsYXNzKCdvcGVuJykpIHsKICAgICAgICBjb2xsYXBzZVNjbUVudHJ5KGlkKTsKICAgICAgICBlbC5maW5kKCcuZXhwYW5kZXInKS5zd2l0Y2hDbGFzcygnaWNvbi1leHBhbmRlZCcsICdpY29uLWNvbGxhcHNlZCcpOwogICAgICAgIGVsLmFkZENsYXNzKCdjb2xsYXBzZWQnKTsKICAgICAgICB1cGRhdGVTVkdJY29uKGZvbGRlclswXSwgJ2ZvbGRlcicpCiAgICAgICAgdG9nZ2xlRXhwZW5kQ29sbGFwc2VJY29uKGV4cGFuZGVyWzBdKTsKCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSBlbHNlIGlmIChlbC5oYXNDbGFzcygnbG9hZGVkJykpIHsKICAgICAgICBleHBhbmRTY21FbnRyeShpZCk7CiAgICAgICAgZWwuZmluZCgnLmV4cGFuZGVyJykuc3dpdGNoQ2xhc3MoJ2ljb24tY29sbGFwc2VkJywgJ2ljb24tZXhwYW5kZWQnKTsKICAgICAgICBlbC5yZW1vdmVDbGFzcygnY29sbGFwc2VkJyk7CiAgICAgICAgdXBkYXRlU1ZHSWNvbihmb2xkZXJbMF0sICdmb2xkZXItb3BlbicpCiAgICAgICAgdG9nZ2xlRXhwZW5kQ29sbGFwc2VJY29uKGV4cGFuZGVyWzBdKTsKCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKGVsLmhhc0NsYXNzKCdsb2FkaW5nJykpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBlbC5hZGRDbGFzcygnbG9hZGluZycpOwogICAgJC5hamF4KHsKICAgICAgdXJsOiB1cmwsCiAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICBlbC5hZnRlcihkYXRhKTsKICAgICAgICBlbC5hZGRDbGFzcygnb3BlbicpLmFkZENsYXNzKCdsb2FkZWQnKS5yZW1vdmVDbGFzcygnbG9hZGluZycpOwogICAgICAgIGVsLmZpbmQoJy5leHBhbmRlcicpLnN3aXRjaENsYXNzKCdpY29uLWNvbGxhcHNlZCcsICdpY29uLWV4cGFuZGVkJyk7CiAgICAgICAgdXBkYXRlU1ZHSWNvbihmb2xkZXJbMF0sICdmb2xkZXItb3BlbicpCiAgICAgICAgdG9nZ2xlRXhwZW5kQ29sbGFwc2VJY29uKGV4cGFuZGVyWzBdKTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gdHJ1ZTsKfQoKZnVuY3Rpb24gcmFuZG9tS2V5KHNpemUpIHsKICB2YXIgY2hhcnMgPSAnMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonOwogIHZhciBrZXkgPSAnJzsKICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykgewogICAga2V5ICs9IGNoYXJzLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGFycy5sZW5ndGgpKTsKICB9CiAgcmV0dXJuIGtleTsKfQoKZnVuY3Rpb24gY29weVRleHRUb0NsaXBib2FyZCh0YXJnZXQpIHsKICBpZiAodGFyZ2V0KSB7CiAgICB2YXIgdGVtcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7CiAgICB0ZW1wLnZhbHVlID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1jbGlwYm9hcmQtdGV4dCcpOwogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZW1wKTsKICAgIHRlbXAuc2VsZWN0KCk7CiAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpOwogICAgaWYgKHRlbXAucGFyZW50Tm9kZSkgewogICAgICB0ZW1wLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGVtcCk7CiAgICB9CiAgICBpZiAoJCh0YXJnZXQpLmNsb3Nlc3QoJy5kcmRuLmV4cGFuZGVkJykubGVuZ3RoKSB7CiAgICAgICQodGFyZ2V0KS5jbG9zZXN0KCcuZHJkbi5leHBhbmRlZCcpLnJlbW92ZUNsYXNzKCJleHBhbmRlZCIpOwogICAgfQogIH0KICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIHVwZGF0ZUlzc3VlRnJvbSh1cmwsIGVsKSB7CiAgJCgnI2FsbF9hdHRyaWJ1dGVzIGlucHV0LCAjYWxsX2F0dHJpYnV0ZXMgdGV4dGFyZWEsICNhbGxfYXR0cmlidXRlcyBzZWxlY3QnKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAkKHRoaXMpLmRhdGEoJ3ZhbHVlYmVmb3JldXBkYXRlJywgJCh0aGlzKS52YWwoKSk7CiAgfSk7CiAgaWYgKGVsKSB7CiAgICAkKCIjZm9ybV91cGRhdGVfdHJpZ2dlcmVkX2J5IikudmFsKCQoZWwpLmF0dHIoJ2lkJykpOwogIH0KICByZXR1cm4gJC5hamF4KHsKICAgIHVybDogdXJsLAogICAgdHlwZTogJ3Bvc3QnLAogICAgZGF0YTogJCgnI2lzc3VlLWZvcm0nKS5zZXJpYWxpemUoKQogIH0pOwp9CgpmdW5jdGlvbiByZXBsYWNlSXNzdWVGb3JtV2l0aChodG1sKXsKICB2YXIgcmVwbGFjZW1lbnQgPSAkKGh0bWwpOwogICQoJyNhbGxfYXR0cmlidXRlcyBpbnB1dCwgI2FsbF9hdHRyaWJ1dGVzIHRleHRhcmVhLCAjYWxsX2F0dHJpYnV0ZXMgc2VsZWN0JykuZWFjaChmdW5jdGlvbigpewogICAgdmFyIG9iamVjdF9pZCA9ICQodGhpcykuYXR0cignaWQnKTsKICAgIGlmIChvYmplY3RfaWQgJiYgJCh0aGlzKS5kYXRhKCd2YWx1ZWJlZm9yZXVwZGF0ZScpIT0kKHRoaXMpLnZhbCgpKSB7CiAgICAgIHJlcGxhY2VtZW50LmZpbmQoJyMnK29iamVjdF9pZCkudmFsKCQodGhpcykudmFsKCkpOwogICAgfQogIH0pOwogICQoJyNhbGxfYXR0cmlidXRlcycpLmVtcHR5KCk7CiAgJCgnI2FsbF9hdHRyaWJ1dGVzJykucHJlcGVuZChyZXBsYWNlbWVudCk7Cn0KCmZ1bmN0aW9uIHVwZGF0ZUJ1bGtFZGl0RnJvbSh1cmwpIHsKICAkLmFqYXgoewogICAgdXJsOiB1cmwsCiAgICB0eXBlOiAncG9zdCcsCiAgICBkYXRhOiAkKCcjYnVsa19lZGl0X2Zvcm0nKS5zZXJpYWxpemUoKQogIH0pOwp9CgpmdW5jdGlvbiBvYnNlcnZlQXV0b2NvbXBsZXRlRmllbGQoZmllbGRJZCwgdXJsLCBvcHRpb25zKSB7CiAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CiAgICAkKCcjJytmaWVsZElkKS5hdXRvY29tcGxldGUoJC5leHRlbmQoewogICAgICBzb3VyY2U6IHVybCwKICAgICAgbWluTGVuZ3RoOiAyLAogICAgICBwb3NpdGlvbjoge2NvbGxpc2lvbjogImZsaXBmaXQifSwKICAgICAgc2VhcmNoOiBmdW5jdGlvbigpeyQoJyMnK2ZpZWxkSWQpLmFkZENsYXNzKCdhamF4LWxvYWRpbmcnKTt9LAogICAgICByZXNwb25zZTogZnVuY3Rpb24oKXskKCcjJytmaWVsZElkKS5yZW1vdmVDbGFzcygnYWpheC1sb2FkaW5nJyk7fQogICAgfSwgb3B0aW9ucykpOwogICAgJCgnIycrZmllbGRJZCkuYWRkQ2xhc3MoJ2F1dG9jb21wbGV0ZScpOwogIH0pOwp9CgpmdW5jdGlvbiBtdWx0aXBsZUF1dG9jb21wbGV0ZUZpZWxkKGZpZWxkSWQsIHVybCwgb3B0aW9ucykgewogIGZ1bmN0aW9uIHNwbGl0KHZhbCkgewogICAgcmV0dXJuIHZhbC5zcGxpdCgvLFxzKi8pOwogIH0KCiAgZnVuY3Rpb24gZXh0cmFjdExhc3QodGVybSkgewogICAgcmV0dXJuIHNwbGl0KHRlcm0pLnBvcCgpOwogIH0KCiAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkgewogICAgJCgnIycgKyBmaWVsZElkKS5hdXRvY29tcGxldGUoJC5leHRlbmQoewogICAgICBzb3VyY2U6IGZ1bmN0aW9uIChyZXF1ZXN0LCByZXNwb25zZSkgewogICAgICAgICQuZ2V0SlNPTih1cmwsIHsKICAgICAgICAgIHRlcm06IGV4dHJhY3RMYXN0KHJlcXVlc3QudGVybSkKICAgICAgICB9LCByZXNwb25zZSk7CiAgICAgIH0sCiAgICAgIG1pbkxlbmd0aDogMiwKICAgICAgcG9zaXRpb246IHtjb2xsaXNpb246ICJmbGlwZml0In0sCiAgICAgIHNlYXJjaDogZnVuY3Rpb24gKCkgewogICAgICAgICQoJyMnICsgZmllbGRJZCkuYWRkQ2xhc3MoJ2FqYXgtbG9hZGluZycpOwogICAgICB9LAogICAgICByZXNwb25zZTogZnVuY3Rpb24gKCkgewogICAgICAgICQoJyMnICsgZmllbGRJZCkucmVtb3ZlQ2xhc3MoJ2FqYXgtbG9hZGluZycpOwogICAgICB9LAogICAgICBzZWxlY3Q6IGZ1bmN0aW9uIChldmVudCwgdWkpIHsKICAgICAgICB2YXIgdGVybXMgPSBzcGxpdCh0aGlzLnZhbHVlKTsKICAgICAgICAvLyByZW1vdmUgdGhlIGN1cnJlbnQgaW5wdXQKICAgICAgICB0ZXJtcy5wb3AoKTsKICAgICAgICAvLyBhZGQgdGhlIHNlbGVjdGVkIGl0ZW0KICAgICAgICB0ZXJtcy5wdXNoKHVpLml0ZW0udmFsdWUpOwogICAgICAgIC8vIGFkZCBwbGFjZWhvbGRlciB0byBnZXQgdGhlIGNvbW1hLWFuZC1zcGFjZSBhdCB0aGUgZW5kCiAgICAgICAgdGVybXMucHVzaCgiIik7CiAgICAgICAgdGhpcy52YWx1ZSA9IHRlcm1zLmpvaW4oIiwgIik7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9LCBvcHRpb25zKSk7CiAgICAkKCcjJyArIGZpZWxkSWQpLmFkZENsYXNzKCdhdXRvY29tcGxldGUnKTsKICB9KTsKfQoKZnVuY3Rpb24gb2JzZXJ2ZVNlYXJjaGZpZWxkKGZpZWxkSWQsIHRhcmdldElkLCB1cmwpIHsKICAkKCcjJytmaWVsZElkKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgdmFyICR0aGlzID0gJCh0aGlzKTsKICAgICR0aGlzLmFkZENsYXNzKCdhdXRvY29tcGxldGUnKTsKICAgICR0aGlzLmF0dHIoJ2RhdGEtdmFsdWUtd2FzJywgJHRoaXMudmFsKCkpOwogICAgdmFyIGNoZWNrID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciB2YWwgPSAkdGhpcy52YWwoKTsKICAgICAgaWYgKCR0aGlzLmF0dHIoJ2RhdGEtdmFsdWUtd2FzJykgIT0gdmFsKXsKICAgICAgICAkdGhpcy5hdHRyKCdkYXRhLXZhbHVlLXdhcycsIHZhbCk7CiAgICAgICAgJC5hamF4KHsKICAgICAgICAgIHVybDogdXJsLAogICAgICAgICAgdHlwZTogJ2dldCcsCiAgICAgICAgICBkYXRhOiB7cTogJHRoaXMudmFsKCl9LAogICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSl7IGlmKHRhcmdldElkKSAkKCcjJyt0YXJnZXRJZCkuaHRtbChkYXRhKTsgfSwKICAgICAgICAgIGJlZm9yZVNlbmQ6IGZ1bmN0aW9uKCl7ICR0aGlzLmFkZENsYXNzKCdhamF4LWxvYWRpbmcnKTsgfSwKICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpeyAkdGhpcy5yZW1vdmVDbGFzcygnYWpheC1sb2FkaW5nJyk7IH0KICAgICAgICB9KTsKICAgICAgfQogICAgfTsKICAgIHZhciByZXNldCA9IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGltZXIpIHsKICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsKICAgICAgICB0aW1lciA9IHNldEludGVydmFsKGNoZWNrLCAzMDApOwogICAgICB9CiAgICB9OwogICAgdmFyIHRpbWVyID0gc2V0SW50ZXJ2YWwoY2hlY2ssIDMwMCk7CiAgICAkdGhpcy5iaW5kKCdrZXl1cCBjbGljayBtb3VzZW1vdmUnLCByZXNldCk7CiAgfSk7Cn0KCiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCl7CiAgJCgiLmRyZG4gLmF1dG9jb21wbGV0ZSIpLnZhbCgnJyk7CgogIC8vIFRoaXMgdmFyaWFibGUgaXMgdXNlZCB0byBmb2N1cyBzZWxlY3RlZCBwcm9qZWN0CiAgdmFyIHNlbGVjdGVkOwogICQoZG9jdW1lbnQpLm9uKCdjbGljaycsICcuZHJkbi10cmlnZ2VyJywgZnVuY3Rpb24oZSl7CiAgICB2YXIgZHJkbiA9ICQodGhpcykuY2xvc2VzdCgiLmRyZG4iKTsKICAgIGlmIChkcmRuLmhhc0NsYXNzKCJleHBhbmRlZCIpKSB7CiAgICAgIGRyZG4ucmVtb3ZlQ2xhc3MoImV4cGFuZGVkIik7CiAgICB9IGVsc2UgewogICAgICAkKCIuZHJkbiIpLnJlbW92ZUNsYXNzKCJleHBhbmRlZCIpOwogICAgICBkcmRuLmFkZENsYXNzKCJleHBhbmRlZCIpOwogICAgICBpZiAoJCh0aGlzKS5wYXJlbnQoJyNwcm9qZWN0LWp1bXAnKS5sZW5ndGgpIHsKICAgICAgICBzZWxlY3RlZCA9ICQoJy5kcmRuLWl0ZW1zIGEuc2VsZWN0ZWQnKTsgLy8gU3RvcmUgc2VsZWN0ZWQgcHJvamVjdAogICAgICAgIHNlbGVjdGVkLmZpcnN0KCkuZm9jdXMoKTsgLy8gQ2FsbGluZyBmb2N1cyB0byBzY3JvbGwgdG8gc2VsZWN0ZWQgcHJvamVjdAogICAgICB9CiAgICAgIGlmICghaXNNb2JpbGUoKSkgewogICAgICAgIGRyZG4uZmluZCgiLmF1dG9jb21wbGV0ZSIpLmZvY3VzKCk7CiAgICAgIH0KICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgIH0KICB9KTsKICAkKGRvY3VtZW50KS5jbGljayhmdW5jdGlvbihlKXsKICAgIGlmICgkKGUudGFyZ2V0KS5jbG9zZXN0KCIuZHJkbiIpLmxlbmd0aCA8IDEpIHsKICAgICAgJCgiLmRyZG4uZXhwYW5kZWQiKS5yZW1vdmVDbGFzcygiZXhwYW5kZWQiKTsKICAgIH0KICB9KTsKCiAgb2JzZXJ2ZVNlYXJjaGZpZWxkKCdwcm9qZWN0cy1xdWljay1zZWFyY2gnLCBudWxsLCAkKCcjcHJvamVjdHMtcXVpY2stc2VhcmNoJykuZGF0YSgnYXV0b21jb21wbGV0ZS11cmwnKSk7CgogICQoIi5kcmRuLWNvbnRlbnQiKS5rZXlkb3duKGZ1bmN0aW9uKGV2ZW50KXsKICAgIHZhciBpdGVtcyA9ICQodGhpcykuZmluZCgiLmRyZG4taXRlbXMiKTsKCiAgICAvLyBJZiBhIHByb2plY3QgaXMgc2VsZWN0ZWQgc2V0IGZvY3VzZWQgdG8gc2VsZWN0ZWQgb25seSBvbmNlCiAgICBpZiAoc2VsZWN0ZWQgJiYgc2VsZWN0ZWQubGVuZ3RoID4gMCkgewogICAgICB2YXIgZm9jdXNlZCA9IHNlbGVjdGVkOwogICAgICBzZWxlY3RlZCA9IHVuZGVmaW5lZDsKICAgIH0KICAgIGVsc2UgewogICAgICB2YXIgZm9jdXNlZCA9IGl0ZW1zLmZpbmQoImE6Zm9jdXMiKTsKICAgIH0KICAgIHN3aXRjaCAoZXZlbnQud2hpY2gpIHsKICAgIGNhc2UgNDA6IC8vZG93bgogICAgICBpZiAoZm9jdXNlZC5sZW5ndGggPiAwKSB7CiAgICAgICAgZm9jdXNlZC5uZXh0QWxsKCJhIikuZmlyc3QoKS5mb2N1cygpOzsKICAgICAgfSBlbHNlIHsKICAgICAgICBpdGVtcy5maW5kKCJhIikuZmlyc3QoKS5mb2N1cygpOzsKICAgICAgfQogICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBicmVhazsKICAgIGNhc2UgMzg6IC8vdXAKICAgICAgaWYgKGZvY3VzZWQubGVuZ3RoID4gMCkgewogICAgICAgIHZhciBwcmV2ID0gZm9jdXNlZC5wcmV2QWxsKCJhIik7CiAgICAgICAgaWYgKHByZXYubGVuZ3RoID4gMCkgewogICAgICAgICAgcHJldi5maXJzdCgpLmZvY3VzKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICQodGhpcykuZmluZCgiLmF1dG9jb21wbGV0ZSIpLmZvY3VzKCk7CiAgICAgICAgfQogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlIDM1OiAvL2VuZAogICAgICBpZiAoZm9jdXNlZC5sZW5ndGggPiAwKSB7CiAgICAgICAgZm9jdXNlZC5uZXh0QWxsKCJhIikubGFzdCgpLmZvY3VzKCk7CiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgMzY6IC8vaG9tZQogICAgICBpZiAoZm9jdXNlZC5sZW5ndGggPiAwKSB7CiAgICAgICAgZm9jdXNlZC5wcmV2QWxsKCJhIikubGFzdCgpLmZvY3VzKCk7CiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgfQogICAgICBicmVhazsKICAgIH0KICB9KTsKfSk7CgpmdW5jdGlvbiBiZWZvcmVTaG93RGF0ZVBpY2tlcihpbnB1dCwgaW5zdCkgewogIHZhciBkZWZhdWx0X2RhdGUgPSBudWxsOwogIHN3aXRjaCAoJChpbnB1dCkuYXR0cigiaWQiKSkgewogICAgY2FzZSAiaXNzdWVfc3RhcnRfZGF0ZSIgOgogICAgICBpZiAoJCgiI2lzc3VlX2R1ZV9kYXRlIikubGVuZ3RoID4gMCkgewogICAgICAgIGRlZmF1bHRfZGF0ZSA9ICQoIiNpc3N1ZV9kdWVfZGF0ZSIpLnZhbCgpOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSAiaXNzdWVfZHVlX2RhdGUiIDoKICAgICAgaWYgKCQoIiNpc3N1ZV9zdGFydF9kYXRlIikubGVuZ3RoID4gMCkgewogICAgICAgIHZhciBzdGFydF9kYXRlID0gJCgiI2lzc3VlX3N0YXJ0X2RhdGUiKS52YWwoKTsKICAgICAgICBpZiAoc3RhcnRfZGF0ZSAhPSAiIikgewogICAgICAgICAgc3RhcnRfZGF0ZSA9IG5ldyBEYXRlKERhdGUucGFyc2Uoc3RhcnRfZGF0ZSkpOwogICAgICAgICAgaWYgKHN0YXJ0X2RhdGUgPiBuZXcgRGF0ZSgpKSB7CiAgICAgICAgICAgIGRlZmF1bHRfZGF0ZSA9ICQoIiNpc3N1ZV9zdGFydF9kYXRlIikudmFsKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGJyZWFrOwogIH0KICAkKGlucHV0KS5kYXRlcGlja2VyRmFsbGJhY2soIm9wdGlvbiIsICJkZWZhdWx0RGF0ZSIsIGRlZmF1bHRfZGF0ZSk7Cn0KCihmdW5jdGlvbigkKXsKICAkLmZuLnBvc2l0aW9uZWRJdGVtcyA9IGZ1bmN0aW9uKHNvcnRhYmxlT3B0aW9ucywgb3B0aW9ucyl7CiAgICB2YXIgc2V0dGluZ3MgPSAkLmV4dGVuZCh7CiAgICAgIGZpcnN0UG9zaXRpb246IDEKICAgIH0sIG9wdGlvbnMgKTsKCiAgICByZXR1cm4gdGhpcy5zb3J0YWJsZSgkLmV4dGVuZCh7CiAgICAgIGF4aXM6ICd5JywKICAgICAgaGFuZGxlOiAiLnNvcnQtaGFuZGxlIiwKICAgICAgaGVscGVyOiBmdW5jdGlvbihldmVudCwgdWkpewogICAgICAgIHVpLmNoaWxkcmVuKCd0ZCcpLmVhY2goZnVuY3Rpb24oKXsKICAgICAgICAgICQodGhpcykud2lkdGgoJCh0aGlzKS53aWR0aCgpKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gdWk7CiAgICAgIH0sCiAgICAgIHVwZGF0ZTogZnVuY3Rpb24oZXZlbnQsIHVpKSB7CiAgICAgICAgdmFyIHNvcnRhYmxlID0gJCh0aGlzKTsKICAgICAgICB2YXIgaGFuZGxlID0gdWkuaXRlbS5maW5kKCIuc29ydC1oYW5kbGUiKS5hZGRDbGFzcygiYWpheC1sb2FkaW5nIik7CiAgICAgICAgdmFyIHVybCA9IGhhbmRsZS5kYXRhKCJyZW9yZGVyLXVybCIpOwogICAgICAgIHZhciBwYXJhbSA9IGhhbmRsZS5kYXRhKCJyZW9yZGVyLXBhcmFtIik7CiAgICAgICAgdmFyIGRhdGEgPSB7fTsKICAgICAgICBkYXRhW3BhcmFtXSA9IHtwb3NpdGlvbjogdWkuaXRlbS5pbmRleCgpICsgc2V0dGluZ3NbJ2ZpcnN0UG9zaXRpb24nXX07CiAgICAgICAgJC5hamF4KHsKICAgICAgICAgIHVybDogdXJsLAogICAgICAgICAgdHlwZTogJ3B1dCcsCiAgICAgICAgICBkYXRhVHlwZTogJ3NjcmlwdCcsCiAgICAgICAgICBkYXRhOiBkYXRhLAogICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bil7CiAgICAgICAgICAgIGFsZXJ0KGpxWEhSLnN0YXR1cyk7CiAgICAgICAgICAgIHNvcnRhYmxlLnNvcnRhYmxlKCJjYW5jZWwiKTsKICAgICAgICAgIH0sCiAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24oanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKXsKICAgICAgICAgICAgaGFuZGxlLnJlbW92ZUNsYXNzKCJhamF4LWxvYWRpbmciKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfSwKICAgIH0sIHNvcnRhYmxlT3B0aW9ucykpOwogIH0KfSggalF1ZXJ5ICkpOwoKdmFyIHdhcm5MZWF2aW5nVW5zYXZlZE1lc3NhZ2U7CmZ1bmN0aW9uIHdhcm5MZWF2aW5nVW5zYXZlZChtZXNzYWdlKSB7CiAgd2FybkxlYXZpbmdVbnNhdmVkTWVzc2FnZSA9IG1lc3NhZ2U7CiAgJChkb2N1bWVudCkub24oJ3N1Ym1pdCcsICdmb3JtJywgZnVuY3Rpb24oKXsKICAgICQoJ3RleHRhcmVhJykucmVtb3ZlRGF0YSgnY2hhbmdlZCcpOwogIH0pOwogICQoZG9jdW1lbnQpLm9uKCdjaGFuZ2UnLCAndGV4dGFyZWEnLCBmdW5jdGlvbigpewogICAgJCh0aGlzKS5kYXRhKCdjaGFuZ2VkJywgJ2NoYW5nZWQnKTsKICB9KTsKICB3aW5kb3cub25iZWZvcmV1bmxvYWQgPSBmdW5jdGlvbigpewogICAgdmFyIHdhcm4gPSBmYWxzZTsKICAgICQoJ3RleHRhcmVhJykuYmx1cigpLmVhY2goZnVuY3Rpb24oKXsKICAgICAgaWYgKCQodGhpcykuZGF0YSgnY2hhbmdlZCcpKSB7CiAgICAgICAgd2FybiA9IHRydWU7CiAgICAgIH0KICAgIH0pOwogICAgaWYgKHdhcm4pIHtyZXR1cm4gd2FybkxlYXZpbmdVbnNhdmVkTWVzc2FnZTt9CiAgfTsKfQoKZnVuY3Rpb24gc2V0dXBBamF4SW5kaWNhdG9yKCkgewogICQoZG9jdW1lbnQpLmJpbmQoJ2FqYXhTZW5kJywgZnVuY3Rpb24oZXZlbnQsIHhociwgc2V0dGluZ3MpIHsKICAgIGlmICgkKCcuYWpheC1sb2FkaW5nJykubGVuZ3RoID09PSAwICYmIHNldHRpbmdzLmNvbnRlbnRUeXBlICE9ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKSB7CiAgICAgICQoJyNhamF4LWluZGljYXRvcicpLnNob3coKTsKICAgIH0KICB9KTsKICAkKGRvY3VtZW50KS5iaW5kKCdhamF4U3RvcCcsIGZ1bmN0aW9uKCkgewogICAgJCgnI2FqYXgtaW5kaWNhdG9yJykuaGlkZSgpOwogIH0pOwp9CgpmdW5jdGlvbiBzZXR1cFRhYnMoKSB7CiAgaWYoJCgnLnRhYnMnKS5sZW5ndGggPiAwKSB7CiAgICBkaXNwbGF5VGFic0J1dHRvbnMoKTsKICAgICQod2luZG93KS5yZXNpemUoZGlzcGxheVRhYnNCdXR0b25zKTsKICB9Cn0KCmZ1bmN0aW9uIHNldHVwRmlsZVByZXZpZXdOYXZpZ2F0aW9uKCkgewogIC8vIG9ubHkgYmluZCBhcnJvdyBrZXlzIHdoZW4gcHJldmlldyBuYXZpZ2F0aW9uIGlzIHByZXNlbnQKICBjb25zdCBlbGVtZW50ID0gJCgnLnBhZ2luYXRpb24uZmlsZXByZXZpZXcnKS5maXJzdCgpOwogIGlmIChlbGVtZW50KSB7CgogICAgY29uc3QgaGFuZGxlQXJyb3dLZXkgPSBmdW5jdGlvbihzZWxlY3RvciwgZSl7CiAgICAgIGNvbnN0IGhyZWYgPSAkKGVsZW1lbnQpLmZpbmQoc2VsZWN0b3IpLmF0dHIoJ2hyZWYnKTsKICAgICAgaWYgKGhyZWYpIHsKICAgICAgICB3aW5kb3cubG9jYXRpb24gPSBocmVmOwogICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgfQogICAgfTsKCiAgICAkKGRvY3VtZW50KS5rZXlkb3duKGZ1bmN0aW9uKGUpIHsKICAgICAgaWYoZS5zaGlmdEtleSB8fCBlLm1ldGFLZXkgfHwgZS5jdHJsS2V5IHx8IGUuYWx0S2V5KSByZXR1cm47CiAgICAgIHN3aXRjaChlLmtleSkgewogICAgICAgIGNhc2UgJ0Fycm93TGVmdCc6CiAgICAgICAgICBoYW5kbGVBcnJvd0tleSgnLnByZXZpb3VzIGEnLCBlKTsKICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdBcnJvd1JpZ2h0JzoKICAgICAgICAgIGhhbmRsZUFycm93S2V5KCcubmV4dCBhJywgZSk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfSk7CiAgfQp9CgokKGRvY3VtZW50KS5vbigna2V5ZG93bicsICdmb3JtIHRleHRhcmVhJywgZnVuY3Rpb24oZSkgewogIC8vIFN1Ym1pdCB0aGUgZm9ybSB3aXRoIEN0cmwgKyBFbnRlciBvciBDb21tYW5kICsgUmV0dXJuCiAgdmFyIHRhcmdldEZvcm0gPSAkKGUudGFyZ2V0KS5jbG9zZXN0KCdmb3JtJyk7CiAgaWYoZS5rZXlDb2RlID09IDEzICYmICgoZS5jdHJsS2V5ICYmICFlLm1ldGFLZXkpIHx8ICghZS5jdHJsS2V5ICYmIGUubWV0YUtleSkgJiYgdGFyZ2V0Rm9ybS5sZW5ndGgpKSB7CiAgICAvLyBGb3IgYWpheCwgdXNlIGNsaWNrKCkgaW5zdGVhZCBvZiBzdWJtaXQoKSB0byBwcmV2ZW50ICJJbnZhbGlkIGZvcm0gYXV0aGVudGljaXR5IHRva2VuIiBlcnJvcgogICAgaWYgKHRhcmdldEZvcm0uYXR0cignZGF0YS1yZW1vdGUnKSA9PSAndHJ1ZScpIHsKICAgICAgaWYgKHRhcmdldEZvcm0uZmluZCgnaW5wdXRbdHlwZT1zdWJtaXRdJykubGVuZ3RoID09PSAwKSB7IHJldHVybiBmYWxzZTsgfQogICAgICB0YXJnZXRGb3JtLmZpbmQoJ3RleHRhcmVhJykuYmx1cigpLnJlbW92ZURhdGEoJ2NoYW5nZWQnKTsKICAgICAgdGFyZ2V0Rm9ybS5maW5kKCdpbnB1dFt0eXBlPXN1Ym1pdF0nKS5maXJzdCgpLmNsaWNrKCk7CiAgICB9IGVsc2UgewogICAgICB0YXJnZXRGb3JtLmZpbmQoJ3RleHRhcmVhJykuYmx1cigpLnJlbW92ZURhdGEoJ2NoYW5nZWQnKTsKICAgICAgdGFyZ2V0Rm9ybS5zdWJtaXQoKTsKICAgIH0KICB9Cn0pOwoKCmZ1bmN0aW9uIGhpZGVPbkxvYWQoKSB7CiAgJCgnLmhvbCcpLmhpZGUoKTsKfQoKZnVuY3Rpb24gYWRkRm9ybU9ic2VydmVyc0ZvckRvdWJsZVN1Ym1pdCgpIHsKICAkKCdmb3JtW21ldGhvZD1wb3N0XScpLmVhY2goZnVuY3Rpb24oKSB7CiAgICBpZiAoISQodGhpcykuaGFzQ2xhc3MoJ211bHRpcGxlLXN1Ym1pdCcpKSB7CiAgICAgICQodGhpcykuc3VibWl0KGZ1bmN0aW9uKGZvcm1fc3VibWlzc2lvbikgewogICAgICAgIGlmICgkKGZvcm1fc3VibWlzc2lvbi50YXJnZXQpLmF0dHIoJ2RhdGEtc3VibWl0dGVkJykpIHsKICAgICAgICAgIGZvcm1fc3VibWlzc2lvbi5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAkKGZvcm1fc3VibWlzc2lvbi50YXJnZXQpLmF0dHIoJ2RhdGEtc3VibWl0dGVkJywgdHJ1ZSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gZGVmYXVsdEZvY3VzKCl7CiAgaWYgKCgkKCcjY29udGVudCA6Zm9jdXMnKS5sZW5ndGggPT0gMCkgJiYgKHdpbmRvdy5sb2NhdGlvbi5oYXNoID09ICcnKSkgewogICAgJCgnI2NvbnRlbnQgaW5wdXRbdHlwZT10ZXh0XTp2aXNpYmxlLCAjY29udGVudCB0ZXh0YXJlYTp2aXNpYmxlJykuZmlyc3QoKS5mb2N1cygpOwogIH0KfQoKZnVuY3Rpb24gYmxvY2tFdmVudFByb3BhZ2F0aW9uKGV2ZW50KSB7CiAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKfQoKZnVuY3Rpb24gdG9nZ2xlRGlzYWJsZWRPbkNoYW5nZSgpIHsKICB2YXIgY2hlY2tlZCA9ICQodGhpcykuaXMoJzpjaGVja2VkJyk7CiAgJCgkKHRoaXMpLmRhdGEoJ2Rpc2FibGVzJykpLmF0dHIoJ2Rpc2FibGVkJywgY2hlY2tlZCk7CiAgJCgkKHRoaXMpLmRhdGEoJ2VuYWJsZXMnKSkuYXR0cignZGlzYWJsZWQnLCAhY2hlY2tlZCk7CiAgJCgkKHRoaXMpLmRhdGEoJ3Nob3dzJykpLnRvZ2dsZShjaGVja2VkKTsKfQpmdW5jdGlvbiB0b2dnbGVEaXNhYmxlZEluaXQoKSB7CiAgJCgnaW5wdXRbZGF0YS1kaXNhYmxlc10sIGlucHV0W2RhdGEtZW5hYmxlc10sIGlucHV0W2RhdGEtc2hvd3NdJykuZWFjaCh0b2dnbGVEaXNhYmxlZE9uQ2hhbmdlKTsKfQpmdW5jdGlvbiB0b2dnbGVNdWx0aVNlbGVjdEljb25Jbml0KCkgewogICQoJy50b2dnbGUtbXVsdGlzZWxlY3Q6bm90KC5pY29uLXRvZ2dsZS1taW51cyk6bm90KC5pY29uLXRvZ2dsZS1wbHVzKScpLmVhY2goZnVuY3Rpb24oKXsKICAgIGxldCBpY29uVHlwZTsKICAgIGlmICgkKHRoaXMpLnNpYmxpbmdzKCdzZWxlY3QnKS5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS5sZW5ndGggPiAxKSB7CiAgICAgIGljb25UeXBlID0gJ3RvZ2dsZS1taW51cyc7CiAgICB9IGVsc2UgewogICAgICBpY29uVHlwZSA9ICd0b2dnbGUtcGx1cyc7CiAgICB9CgogICAgJCh0aGlzKS5hZGRDbGFzcyhgaWNvbi0ke2ljb25UeXBlfWApOwogICAgdXBkYXRlU1ZHSWNvbigkKHRoaXMpLmZpbmQoJ3N2ZycpWzBdLCBpY29uVHlwZSk7CiAgfSk7Cn0KCmZ1bmN0aW9uIHRvZ2dsZU5ld09iamVjdERyb3Bkb3duKCkgewogIHZhciBkcm9wZG93biA9ICQoJyNuZXctb2JqZWN0ICsgdWwubWVudS1jaGlsZHJlbicpOwogIGlmKGRyb3Bkb3duLmhhc0NsYXNzKCd2aXNpYmxlJykpewogICAgZHJvcGRvd24ucmVtb3ZlQ2xhc3MoJ3Zpc2libGUnKTsKICB9ZWxzZXsKICAgIGRyb3Bkb3duLmFkZENsYXNzKCd2aXNpYmxlJyk7CiAgfQp9CgooZnVuY3Rpb24gKCAkICkgewoKICAvLyBkZXRlY3QgaWYgbmF0aXZlIGRhdGUgaW5wdXQgaXMgc3VwcG9ydGVkCiAgdmFyIG5hdGl2ZURhdGVJbnB1dFN1cHBvcnRlZCA9IHRydWU7CgogIHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7CiAgaW5wdXQuc2V0QXR0cmlidXRlKCd0eXBlJywnZGF0ZScpOwogIGlmIChpbnB1dC50eXBlID09PSAndGV4dCcpIHsKICAgIG5hdGl2ZURhdGVJbnB1dFN1cHBvcnRlZCA9IGZhbHNlOwogIH0KCiAgdmFyIG5vdEFEYXRlVmFsdWUgPSAnbm90LWEtZGF0ZSc7CiAgaW5wdXQuc2V0QXR0cmlidXRlKCd2YWx1ZScsIG5vdEFEYXRlVmFsdWUpOwogIGlmIChpbnB1dC52YWx1ZSA9PT0gbm90QURhdGVWYWx1ZSkgewogICAgbmF0aXZlRGF0ZUlucHV0U3VwcG9ydGVkID0gZmFsc2U7CiAgfQoKICAkLmZuLmRhdGVwaWNrZXJGYWxsYmFjayA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewogICAgaWYgKG5hdGl2ZURhdGVJbnB1dFN1cHBvcnRlZCkgewogICAgICByZXR1cm4gdGhpczsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0aGlzLmRhdGVwaWNrZXIoIG9wdGlvbnMgKTsKICAgIH0KICB9Owp9KCBqUXVlcnkgKSk7CgokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICQoJyNjb250ZW50Jykub24oJ2NoYW5nZScsICdpbnB1dFtkYXRhLWRpc2FibGVzXSwgaW5wdXRbZGF0YS1lbmFibGVzXSwgaW5wdXRbZGF0YS1zaG93c10nLCB0b2dnbGVEaXNhYmxlZE9uQ2hhbmdlKTsKICB0b2dnbGVEaXNhYmxlZEluaXQoKTsKCiAgJCgnI2NvbnRlbnQnKS5vbignY2xpY2snLCAnLnRvZ2dsZS1tdWx0aXNlbGVjdCcsIGZ1bmN0aW9uKCkgewogICAgdG9nZ2xlTXVsdGlTZWxlY3QoJCh0aGlzKS5zaWJsaW5ncygnc2VsZWN0JykpOwogICAgJCh0aGlzKS50b2dnbGVDbGFzcygnaWNvbi10b2dnbGUtcGx1cyBpY29uLXRvZ2dsZS1taW51cycpOwogICAgdXBkYXRlU1ZHSWNvbigkKHRoaXMpLmZpbmQoJ3N2ZycpWzBdLCAkKHRoaXMpLmhhc0NsYXNzKCdpY29uLXRvZ2dsZS1wbHVzJykgPyAndG9nZ2xlLXBsdXMnIDogJ3RvZ2dsZS1taW51cycpOwogIH0pOwogIHRvZ2dsZU11bHRpU2VsZWN0SWNvbkluaXQoKTsKCiAgJCgnI2hpc3RvcnkgLnRhYnMnKS5vbignY2xpY2snLCAnYScsIGZ1bmN0aW9uKGUpewogICAgdmFyIHRhYiA9ICQoZS50YXJnZXQpLmF0dHIoJ2lkJykucmVwbGFjZSgndGFiLScsJycpOwogICAgZG9jdW1lbnQuY29va2llID0gJ2hpc3RvcnlfbGFzdF90YWI9JyArIHRhYiArICc7IFNhbWVTaXRlPUxheCcKICB9KTsKfSk7CgokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICQoJyNjb250ZW50Jykub24oJ2NsaWNrJywgJ2Rpdi5qc3RUYWJzIGEudGFiLXByZXZpZXcnLCBmdW5jdGlvbihldmVudCl7CiAgICB2YXIgdGFiID0gJChldmVudC50YXJnZXQpOwoKICAgIHZhciB1cmwgPSB0YWIuZGF0YSgndXJsJyk7CiAgICB2YXIgZm9ybSA9IHRhYi5wYXJlbnRzKCdmb3JtJyk7CiAgICB2YXIganN0QmxvY2sgPSB0YWIucGFyZW50cygnLmpzdEJsb2NrJyk7CgogICAgdmFyIGVsZW1lbnQgPSBlbmNvZGVVUklDb21wb25lbnQoanN0QmxvY2suZmluZCgnLndpa2ktZWRpdCcpLnZhbCgpKTsKICAgIHZhciBhdHRhY2htZW50cyA9IGZvcm0uZmluZCgnLmF0dGFjaG1lbnRzX2ZpZWxkcyBpbnB1dCcpLnNlcmlhbGl6ZSgpOwoKICAgICQuYWpheCh7CiAgICAgIHVybDogdXJsLAogICAgICB0eXBlOiAncG9zdCcsCiAgICAgIGRhdGE6ICJ0ZXh0PSIgKyBlbGVtZW50ICsgJyYnICsgYXR0YWNobWVudHMsCiAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpewogICAgICAgIGpzdEJsb2NrLmZpbmQoJy53aWtpLXByZXZpZXcnKS5odG1sKGRhdGEpOwogICAgICAgIHNldHVwV2lraVRhYmxlU29ydGFibGVIZWFkZXIoKTsKICAgICAgfQogICAgfSk7CiAgfSk7Cn0pOwoKZnVuY3Rpb24ga2VlcEFuY2hvck9uU2lnbkluKGZvcm0pewogIHZhciBoYXNoID0gZGVjb2RlVVJJQ29tcG9uZW50KHNlbGYuZG9jdW1lbnQubG9jYXRpb24uaGFzaCk7CiAgaWYgKGhhc2gpIHsKICAgIGlmIChoYXNoLmluZGV4T2YoIiMiKSA9PT0gLTEpIHsKICAgICAgaGFzaCA9ICIjIiArIGhhc2g7CiAgICB9CiAgICBmb3JtLmFjdGlvbiA9IGZvcm0uYWN0aW9uICsgaGFzaDsKICB9CiAgcmV0dXJuIHRydWU7Cn0KCiQoZnVuY3Rpb24gKCQpIHsKICAkKCcjYXV0aF9zb3VyY2VfbGRhcF9tb2RlJykuY2hhbmdlKGZ1bmN0aW9uICgpIHsKICAgICQoJy5sZGFwc193YXJuaW5nJykudG9nZ2xlKCQodGhpcykudmFsKCkgIT0gJ2xkYXBzX3ZlcmlmeV9wZWVyJyk7CiAgfSkuY2hhbmdlKCk7Cn0pOwoKZnVuY3Rpb24gc2V0RmlsZWNvbnRlbnRDb250YWluZXJIZWlnaHQoKSB7CiAgdmFyICRmaWxlY29udGFpbmVyID0gJCgnLmZpbGVjb250ZW50LWNvbnRhaW5lcicpOwogIHZhciBmaWxlVHlwZVNlbGVjdG9ycyA9IFsnLmltYWdlJywgJ3ZpZGVvJ107CgogIGlmKCRmaWxlY29udGFpbmVyLmxlbmd0aCA+IDAgJiYgJGZpbGVjb250YWluZXIuZmluZChmaWxlVHlwZVNlbGVjdG9ycy5qb2luKCcsJykpLmxlbmd0aCA9PT0gMSkgewogICAgdmFyIGNvbnRhaW5lck9mZnNldFRvcCA9ICRmaWxlY29udGFpbmVyLm9mZnNldCgpLnRvcDsKICAgIHZhciBjb250YWluZXJNYXJnaW5Cb3R0b20gPSBwYXJzZUludCgkZmlsZWNvbnRhaW5lci5jc3MoJ21hcmdpbkJvdHRvbScpKTsKICAgIHZhciBwYWdpbmF0aW9uSGVpZ2h0ID0gJGZpbGVjb250YWluZXIubmV4dCgnLnBhZ2luYXRpb24nKS5oZWlnaHQoKTsKICAgIHZhciBkaWZmID0gY29udGFpbmVyT2Zmc2V0VG9wICsgY29udGFpbmVyTWFyZ2luQm90dG9tICsgcGFnaW5hdGlvbkhlaWdodDsKCiAgICAkZmlsZWNvbnRhaW5lci5jc3MoJ2hlaWdodCcsICdjYWxjKDEwMHZoIC0gJyArIGRpZmYgKyAncHgpJykKICB9Cn0KCmZ1bmN0aW9uIHNldHVwQXR0YWNobWVudERldGFpbCgpIHsKICBzZXRGaWxlY29udGVudENvbnRhaW5lckhlaWdodCgpOwogICQod2luZG93KS5yZXNpemUoc2V0RmlsZWNvbnRlbnRDb250YWluZXJIZWlnaHQpOwp9CgpmdW5jdGlvbiBzZXR1cFdpa2lUYWJsZVNvcnRhYmxlSGVhZGVyKCkgewogICQoJ2Rpdi53aWtpIHRhYmxlJykuZWFjaChmdW5jdGlvbihpLCB0YWJsZSl7CiAgICBpZiAodGFibGUucm93cy5sZW5ndGggPCAzKSByZXR1cm4gdHJ1ZTsKICAgIHZhciB0ciA9ICQodGFibGUucm93cykuZmlyc3QoKTsKICAgIGlmICh0ci5maW5kKCJUSCIpLmxlbmd0aCA+IDApIHsKICAgICAgdHIuYXR0cignZGF0YS1zb3J0LW1ldGhvZCcsICdub25lJyk7CiAgICAgIHRyLmZpbmQoIlREIikuYXR0cignZGF0YS1zb3J0LW1ldGhvZCcsICdub25lJyk7CiAgICAgIG5ldyBUYWJsZXNvcnQodGFibGUpOwogICAgfQogIH0pOwp9CgokKGZ1bmN0aW9uICgpIHsKICAkKCJbdGl0bGVdOm5vdCgubm8tdG9vbHRpcCkiKS50b29sdGlwKHsKICAgIHNob3c6IHsKICAgICAgZGVsYXk6IDQwMAogICAgfSwKICAgIHBvc2l0aW9uOiB7CiAgICAgIG15OiAiY2VudGVyIGJvdHRvbS01IiwKICAgICAgYXQ6ICJjZW50ZXIgdG9wIgogICAgfQogIH0pOwp9KTsKCmZ1bmN0aW9uIGlubGluZUF1dG9Db21wbGV0ZShlbGVtZW50KSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gZG8gbm90IGF0dGFjaCBpZiBUcmlidXRlIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQKICAgIGlmIChlbGVtZW50LmRhdGFzZXQudHJpYnV0ZSA9PT0gJ3RydWUnKSB7cmV0dXJufTsKCiAgICBjb25zdCBnZXREYXRhU291cmNlID0gZnVuY3Rpb24oZW50aXR5KSB7CiAgICAgIGNvbnN0IGRhdGFTb3VyY2VzID0gcm0uQXV0b0NvbXBsZXRlLmRhdGFTb3VyY2VzOwoKICAgICAgaWYgKGRhdGFTb3VyY2VzW2VudGl0eV0pIHsKICAgICAgICByZXR1cm4gZGF0YVNvdXJjZXNbZW50aXR5XTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KCiAgICBjb25zdCByZW1vdGVTZWFyY2ggPSBmdW5jdGlvbih1cmwsIGNiKSB7CiAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkKICAgICAgewogICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkgewogICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7CiAgICAgICAgICAgIGNiKGRhdGEpOwogICAgICAgICAgfSBlbHNlIGlmICh4aHIuc3RhdHVzID09PSA0MDMpIHsKICAgICAgICAgICAgY2IoW10pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfTsKICAgICAgeGhyLm9wZW4oIkdFVCIsIHVybCwgdHJ1ZSk7CiAgICAgIHhoci5zZW5kKCk7CiAgICB9OwoKICAgIGNvbnN0IHRyaWJ1dGUgPSBuZXcgVHJpYnV0ZSh7CiAgICAgIGNvbGxlY3Rpb246IFsKICAgICAgICB7CiAgICAgICAgICB0cmlnZ2VyOiAnIycsCiAgICAgICAgICB2YWx1ZXM6IGZ1bmN0aW9uICh0ZXh0LCBjYikgewogICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0LnR5cGUgPT09ICd0ZXh0JyAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZSgnYXV0b2NvbXBsZXRlJykgIT0gJ29mZicpIHsKICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXV0b2NvbXBsZXRlJywgJ29mZicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFdoZW4gdHJpZ2dlcmVkIHdpdGggdGV4dCBzdGFydGluZyB3aXRoICIjIyIsIGxpa2UgIiMjYSIsIHRoZSBzZWFyY2ggdGVybSB3aWxsIGJlY29tZSAiI2EiLAogICAgICAgICAgICAvLyBjYXVzaW5nIHRoZSBTUUwgcXVlcnkgdG8gZmFpbCBpbiBmaW5kaW5nIGlzc3VlcyB3aXRoICJhIiBpbiB0aGUgc3ViamVjdC4KICAgICAgICAgICAgLy8gVG8gYXZvaWQgdGhpcywgcmVtb3ZlIHRoZSBmaXJzdCAiIyIgZnJvbSB0aGUgc2VhcmNoIHRlcm0uCiAgICAgICAgICAgIGlmICh0ZXh0KSB7CiAgICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXiMvLCAnJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVtb3RlU2VhcmNoKGdldERhdGFTb3VyY2UoJ2lzc3VlcycpICsgZW5jb2RlVVJJQ29tcG9uZW50KHRleHQpLCBmdW5jdGlvbiAoaXNzdWVzKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGNiKGlzc3Vlcyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIGxvb2t1cDogJ2xhYmVsJywKICAgICAgICAgIGZpbGxBdHRyOiAnbGFiZWwnLAogICAgICAgICAgcmVxdWlyZUxlYWRpbmdTcGFjZTogdHJ1ZSwKICAgICAgICAgIHNlbGVjdFRlbXBsYXRlOiBmdW5jdGlvbiAoaXNzdWUpIHsKICAgICAgICAgICAgbGV0IGxlYWRpbmdIYXNoID0gIiMiCiAgICAgICAgICAgIC8vIGtlZXAgIyMgc3ludGF4IHdoaWNoIGlzIGEgdmFsaWQgaXNzdWUgc3ludGF4IHRvIHNob3cgaXNzdWUgd2l0aCB0aXRsZS4KICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudE1lbnRpb25UZXh0U25hcHNob3QuY2hhckF0KDApID09PSAiIyIpIHsKICAgICAgICAgICAgICBsZWFkaW5nSGFzaCA9ICIjIyIKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbGVhZGluZ0hhc2ggKyBpc3N1ZS5vcmlnaW5hbC5pZDsKICAgICAgICAgIH0sCiAgICAgICAgICBtZW51SXRlbVRlbXBsYXRlOiBmdW5jdGlvbiAoaXNzdWUpIHsKICAgICAgICAgICAgcmV0dXJuIHNhbml0aXplSFRNTChpc3N1ZS5vcmlnaW5hbC5sYWJlbCk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICB0cmlnZ2VyOiAnW1snLAogICAgICAgICAgdmFsdWVzOiBmdW5jdGlvbiAodGV4dCwgY2IpIHsKICAgICAgICAgICAgcmVtb3RlU2VhcmNoKGdldERhdGFTb3VyY2UoJ3dpa2lfcGFnZXMnKSArIGVuY29kZVVSSUNvbXBvbmVudCh0ZXh0KSwgZnVuY3Rpb24gKHdpa2lQYWdlcykgewogICAgICAgICAgICAgIHJldHVybiBjYih3aWtpUGFnZXMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICBsb29rdXA6ICdsYWJlbCcsCiAgICAgICAgICBmaWxsQXR0cjogJ2xhYmVsJywKICAgICAgICAgIHJlcXVpcmVMZWFkaW5nU3BhY2U6IHRydWUsCiAgICAgICAgICBzZWxlY3RUZW1wbGF0ZTogZnVuY3Rpb24gKHdpa2lQYWdlKSB7CiAgICAgICAgICAgIHJldHVybiAnW1snICsgd2lraVBhZ2Uub3JpZ2luYWwudmFsdWUgKyAnXV0nOwogICAgICAgICAgfSwKICAgICAgICAgIG1lbnVJdGVtVGVtcGxhdGU6IGZ1bmN0aW9uICh3aWtpUGFnZSkgewogICAgICAgICAgICByZXR1cm4gc2FuaXRpemVIVE1MKHdpa2lQYWdlLm9yaWdpbmFsLmxhYmVsKTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIHRyaWdnZXI6ICdAJywKICAgICAgICAgIGxvb2t1cDogZnVuY3Rpb24gKHVzZXIsIG1lbnRpb25UZXh0KSB7CiAgICAgICAgICAgIHJldHVybiB1c2VyLm5hbWUgKyB1c2VyLmZpcnN0bmFtZSArIHVzZXIubGFzdG5hbWUgKyB1c2VyLmxvZ2luOwogICAgICAgICAgfSwKICAgICAgICAgIHZhbHVlczogZnVuY3Rpb24gKHRleHQsIGNiKSB7CiAgICAgICAgICAgIGNvbnN0IHVybCA9IGdldERhdGFTb3VyY2UoJ3VzZXJzJyk7CiAgICAgICAgICAgIGlmICh1cmwpIHsKICAgICAgICAgICAgICByZW1vdGVTZWFyY2godXJsICsgZW5jb2RlVVJJQ29tcG9uZW50KHRleHQpLCBmdW5jdGlvbiAodXNlcnMpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjYih1c2Vycyk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICBtZW51SXRlbVRlbXBsYXRlOiBmdW5jdGlvbiAodXNlcikgewogICAgICAgICAgICByZXR1cm4gdXNlci5vcmlnaW5hbC5uYW1lOwogICAgICAgICAgfSwKICAgICAgICAgIHNlbGVjdFRlbXBsYXRlOiBmdW5jdGlvbiAodXNlcikgewogICAgICAgICAgICByZXR1cm4gJ0AnICsgdXNlci5vcmlnaW5hbC5sb2dpbjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIF0sCiAgICAgIG5vTWF0Y2hUZW1wbGF0ZTogIiIKICAgIH0pOwoKICAgIHRyaWJ1dGUuYXR0YWNoKGVsZW1lbnQpOwp9CgovLyBjb2xsYXBzaWJsZSBzaWRlYmFyIGpRdWVyeSBwbHVnaW4KKGZ1bmN0aW9uKCQpIHsKICAvLyBtYWluIGNvbnRhaW5lciB0aGlzIGlzIGFwcGxpZWQgdG8KICB2YXIgbWFpbjsKICAvLyB0cmlnZ2VycyBzaG93L2hpZGUKICB2YXIgYnV0dG9uOwogIC8vIHRoZSBrZXkgdG8gdXNlIGluIGxvY2FsIHN0b3JhZ2UKICAvLyB0aGlzIHdpbGwgbGF0ZXIgYmUgZXhwYW5kZWQgdXNpbmcgdGhlIGN1cnJlbnQgY29udHJvbGxlciBhbmQgYWN0aW9uIHRvCiAgLy8gYWxsb3cgZm9yIGRpZmZlcmVudCBzaWRlYmFyIHN0YXRlcyBmb3IgZGlmZmVyZW50IHBhZ2VzCiAgdmFyIGxvY2FsU3RvcmFnZUtleSA9ICdyZWRtaW5lLXNpZGViYXItc3RhdGUnOwogIC8vIHRydWUgaWYgbG9jYWwgc3RvcmFnZSBpcyBhdmFpbGFibGUKICB2YXIgY2FuVXNlTG9jYWxTdG9yYWdlID0gZnVuY3Rpb24oKXsKICAgIHRyeSB7CiAgICAgIGlmKCdsb2NhbFN0b3JhZ2UnIGluIHdpbmRvdyl7CiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3JlZG1pbmUudGVzdC5zdG9yYWdlJywgJ29rJyk7CiAgICAgICAgdmFyIGl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncmVkbWluZS50ZXN0LnN0b3JhZ2UnKTsKICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgncmVkbWluZS50ZXN0LnN0b3JhZ2UnKTsKICAgICAgICBpZihpdGVtID09PSAnb2snKSByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfSBjYXRjaCAoZXJyKSB7fQogICAgcmV0dXJuIGZhbHNlOwogIH0oKTsKICAvLyBmdW5jdGlvbiB0byBzZXQgY3VycmVudCBzaWRlYmFyIHN0YXRlCiAgdmFyIHNldFN0YXRlID0gZnVuY3Rpb24oc3RhdGUpewogICAgaWYoY2FuVXNlTG9jYWxTdG9yYWdlKXsKICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obG9jYWxTdG9yYWdlS2V5LCBzdGF0ZSk7CiAgICB9CiAgfTsKICB2YXIgYXBwbHlTdGF0ZSA9IGZ1bmN0aW9uKCl7CiAgICBpZihtYWluLmhhc0NsYXNzKCdjb2xsYXBzZWRzaWRlYmFyJykpewogICAgICB1cGRhdGVTVkdJY29uKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaWRlYmFyLXN3aXRjaC1idXR0b24nKSwgJ2NoZXZyb25zLWxlZnQnKQogICAgICBzZXRTdGF0ZSgnaGlkZGVuJyk7CiAgICB9IGVsc2UgewogICAgICB1cGRhdGVTVkdJY29uKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaWRlYmFyLXN3aXRjaC1idXR0b24nKSwgJ2NoZXZyb25zLXJpZ2h0JykKICAgICAgc2V0U3RhdGUoJ3Zpc2libGUnKTsKICAgIH0KICB9OwogIHZhciBzZXR1cFRvZ2dsZUJ1dHRvbiA9IGZ1bmN0aW9uKCl7CiAgICBidXR0b24gPSAkKCcjc2lkZWJhci1zd2l0Y2gtYnV0dG9uJyk7CiAgICBidXR0b24uY2xpY2soZnVuY3Rpb24oZSl7CiAgICAgIG1haW4uYWRkQ2xhc3MoImFuaW1hdGUiKTsKICAgICAgbWFpbi50b2dnbGVDbGFzcygnY29sbGFwc2Vkc2lkZWJhcicpOwogICAgICBhcHBseVN0YXRlKCk7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7CiAgICBhcHBseVN0YXRlKCk7CiAgfTsKICAkLmZuLmNvbGxhcHNpYmxlU2lkZWJhciA9IGZ1bmN0aW9uKCkgewogICAgbWFpbiA9IHRoaXM7CiAgICAvLyBkZXRlcm1pbmUgcHJldmlvdXNseSBzdG9yZWQgc2lkZWJhciBzdGF0ZSBmb3IgdGhpcyBwYWdlCiAgICBpZihjYW5Vc2VMb2NhbFN0b3JhZ2UpIHsKICAgICAgLy8gZGV0ZXJtaW5lIGN1cnJlbnQgY29udHJvbGxlci9hY3Rpb24gcGFpciBhbmQgdXNlIHRoZW0gYXMgc3RvcmFnZSBrZXkKICAgICAgdmFyIGJvZHlDbGFzcyA9ICQoJ2JvZHknKS5hdHRyKCdjbGFzcycpOwogICAgICBpZihib2R5Q2xhc3MpewogICAgICAgIHRyeSB7CiAgICAgICAgICBsb2NhbFN0b3JhZ2VLZXkgKz0gJy0nICsgYm9keUNsYXNzLnNwbGl0KC9ccysvKS5maWx0ZXIoZnVuY3Rpb24ocyl7CiAgICAgICAgICAgIHJldHVybiBzLm1hdGNoKC8oYWN0aW9ufGNvbnRyb2xsZXIpLS4qLyk7CiAgICAgICAgICB9KS5zb3J0KCkuam9pbignLScpOwogICAgICAgIH0gY2F0Y2goZSkgewogICAgICAgICAgLy8gaW4gY2FzZSBvZiBlcnJvciAocHJvYmFibHkgSUU4KSwgY29udGludWUgd2l0aCB0aGUgdW5tb2RpZmllZCBrZXkKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyIHN0b3JlZFN0YXRlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0obG9jYWxTdG9yYWdlS2V5KTsKICAgICAgbWFpbi50b2dnbGVDbGFzcygnY29sbGFwc2Vkc2lkZWJhcicsIHN0b3JlZFN0YXRlID09PSAnaGlkZGVuJyk7CiAgICB9CiAgICAvLyBkcmF3IHRoZSB0b2dnbGUgYnV0dG9uIG9uY2UgdGhlIERPTSBpcyBjb21wbGV0ZQogICAgJChkb2N1bWVudCkucmVhZHkoc2V0dXBUb2dnbGVCdXR0b24pOwogIH07Cn0oalF1ZXJ5KSk7CgokKGRvY3VtZW50KS5yZWFkeShzZXR1cEFqYXhJbmRpY2F0b3IpOwokKGRvY3VtZW50KS5yZWFkeShoaWRlT25Mb2FkKTsKJChkb2N1bWVudCkucmVhZHkoYWRkRm9ybU9ic2VydmVyc0ZvckRvdWJsZVN1Ym1pdCk7CiQoZG9jdW1lbnQpLnJlYWR5KGRlZmF1bHRGb2N1cyk7CiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwQXR0YWNobWVudERldGFpbCk7CiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwVGFicyk7CiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwRmlsZVByZXZpZXdOYXZpZ2F0aW9uKTsKJChkb2N1bWVudCkucmVhZHkoc2V0dXBXaWtpVGFibGVTb3J0YWJsZUhlYWRlcik7CiQoZG9jdW1lbnQpLm9uKCdmb2N1cycsICdbZGF0YS1hdXRvLWNvbXBsZXRlPXRydWVdJywgZnVuY3Rpb24oZXZlbnQpIHsKICBpbmxpbmVBdXRvQ29tcGxldGUoZXZlbnQudGFyZ2V0KTsKfSk7Cg==" | |
| }, | |
| "attachments.js": { | |
| "hash": "fe6f73f3351f734902238369b56ee6cd", | |
| "path": "/usr/src/redmine/public/assets/attachments-db17b2b6.js", | |
| "base64": "LyoqCiAqIFJlZG1pbmUgLSBwcm9qZWN0IG1hbmFnZW1lbnQgc29mdHdhcmUKICogQ29weXJpZ2h0IChDKSAyMDA2LSAgSmVhbi1QaGlsaXBwZSBMYW5nCiAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCiAqLwoKZnVuY3Rpb24gYWRkRmlsZShpbnB1dEVsLCBmaWxlLCBlYWdlclVwbG9hZCkgewogIHZhciBhdHRhY2htZW50c0Zvcm0gPSAkKGlucHV0RWwpLmNsb3Nlc3QoJy5hdHRhY2htZW50c19mb3JtJykKICB2YXIgYXR0YWNobWVudHNGaWVsZHMgPSBhdHRhY2htZW50c0Zvcm0uZmluZCgnLmF0dGFjaG1lbnRzX2ZpZWxkcycpOwogIHZhciBhdHRhY2htZW50c0ljb25zID0gYXR0YWNobWVudHNGb3JtLmZpbmQoJy5hdHRhY2htZW50c19pY29ucycpOwogIHZhciBhZGRBdHRhY2htZW50ID0gYXR0YWNobWVudHNGb3JtLmZpbmQoJy5hZGRfYXR0YWNobWVudCcpOwogIHZhciBtYXhGaWxlcyA9ICgkKGlucHV0RWwpLmF0dHIoJ211bHRpcGxlJykgPT0gJ211bHRpcGxlJyA/IDEwIDogMSk7CiAgdmFyIGRlbEljb24gPSBhdHRhY2htZW50c0ljb25zLmZpbmQoJ3N2Zy5zdmctZGVsJykuY2xvbmUoKTsKICB2YXIgYXR0YWNobWVudEljb24gPSBhdHRhY2htZW50c0ljb25zLmZpbmQoJ3N2Zy5zdmctYXR0YWNobWVudCcpLmNsb25lKCk7CgogIGlmIChhdHRhY2htZW50c0ZpZWxkcy5jaGlsZHJlbigpLmxlbmd0aCA8IG1heEZpbGVzKSB7CiAgICB2YXIgYXR0YWNobWVudElkID0gYWRkRmlsZS5uZXh0QXR0YWNobWVudElkKys7CiAgICB2YXIgZmlsZVNwYW4gPSAkKCc8c3Bhbj4nLCB7IGlkOiAnYXR0YWNobWVudHNfJyArIGF0dGFjaG1lbnRJZCB9KTsKICAgIHZhciBwYXJhbSA9ICQoaW5wdXRFbCkuZGF0YSgncGFyYW0nKTsKICAgIGlmICghcGFyYW0pIHtwYXJhbSA9ICdhdHRhY2htZW50cyd9OwoKICAgIGZpbGVTcGFuLmFwcGVuZCgKICAgICAgICBhdHRhY2htZW50SWNvbiwKICAgICAgICAkKCc8aW5wdXQ+JywgeyB0eXBlOiAndGV4dCcsICdjbGFzcyc6ICdpY29uIGljb24tYXR0YWNobWVudCBmaWxlbmFtZSByZWFkb25seScsIG5hbWU6IHBhcmFtICsnWycgKyBhdHRhY2htZW50SWQgKyAnXVtmaWxlbmFtZV0nLCByZWFkb25seTogJ3JlYWRvbmx5J30gKS52YWwoZmlsZS5uYW1lKSwKICAgICAgICAkKCc8aW5wdXQ+JywgeyB0eXBlOiAndGV4dCcsICdjbGFzcyc6ICdkZXNjcmlwdGlvbicsIG5hbWU6IHBhcmFtICsgJ1snICsgYXR0YWNobWVudElkICsgJ11bZGVzY3JpcHRpb25dJywgbWF4bGVuZ3RoOiAyNTUsIHBsYWNlaG9sZGVyOiAkKGlucHV0RWwpLmRhdGEoJ2Rlc2NyaXB0aW9uLXBsYWNlaG9sZGVyJykgfSApLnRvZ2dsZSghZWFnZXJVcGxvYWQpLAogICAgICAgICQoJzxpbnB1dD4nLCB7IHR5cGU6ICdoaWRkZW4nLCAnY2xhc3MnOiAndG9rZW4nLCBuYW1lOiBwYXJhbSArICdbJyArIGF0dGFjaG1lbnRJZCArICddW3Rva2VuXSd9ICksCiAgICAgICAgJCgnPGE+JywgeyBocmVmOiAiIyIsICdjbGFzcyc6ICdpY29uLW9ubHkgaWNvbi1kZWwgcmVtb3ZlLXVwbG9hZCcgfSkuYXBwZW5kKGRlbEljb24pLmNsaWNrKHJlbW92ZUZpbGUpLnRvZ2dsZSghZWFnZXJVcGxvYWQpCiAgICApLmFwcGVuZFRvKGF0dGFjaG1lbnRzRmllbGRzKTsKCgogICAgaWYgKCQoaW5wdXRFbCkuZGF0YSgnZGVzY3JpcHRpb24nKSA9PSAwKSB7CiAgICAgIGZpbGVTcGFuLmZpbmQoJ2lucHV0LmRlc2NyaXB0aW9uJykucmVtb3ZlKCk7CiAgICB9CgogICAgaWYoZWFnZXJVcGxvYWQpIHsKICAgICAgYWpheFVwbG9hZChmaWxlLCBhdHRhY2htZW50SWQsIGZpbGVTcGFuLCBpbnB1dEVsKTsKICAgIH0KCiAgICBhZGRBdHRhY2htZW50LnRvZ2dsZShhdHRhY2htZW50c0ZpZWxkcy5jaGlsZHJlbigpLmxlbmd0aCA8IG1heEZpbGVzKTsKICAgIHJldHVybiBhdHRhY2htZW50SWQ7CiAgfQogIHJldHVybiBudWxsOwp9CgphZGRGaWxlLm5leHRBdHRhY2htZW50SWQgPSAxOwoKZnVuY3Rpb24gYWpheFVwbG9hZChmaWxlLCBhdHRhY2htZW50SWQsIGZpbGVTcGFuLCBpbnB1dEVsKSB7CgogIGZ1bmN0aW9uIG9uTG9hZHN0YXJ0KGUpIHsKICAgIGZpbGVTcGFuLnJlbW92ZUNsYXNzKCdhamF4LXdhaXRpbmcnKTsKICAgIGZpbGVTcGFuLmFkZENsYXNzKCdhamF4LWxvYWRpbmcnKTsKICAgICQoJ2lucHV0OnN1Ym1pdCcsICQodGhpcykucGFyZW50cygnZm9ybScpKS5hdHRyKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpOwogIH0KCiAgZnVuY3Rpb24gb25Qcm9ncmVzcyhlKSB7CiAgICBpZihlLmxlbmd0aENvbXB1dGFibGUpIHsKICAgICAgdGhpcy5wcm9ncmVzc2JhciggJ3ZhbHVlJywgZS5sb2FkZWQgKiAxMDAgLyBlLnRvdGFsICk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhY3R1YWxVcGxvYWQoZmlsZSwgYXR0YWNobWVudElkLCBmaWxlU3BhbiwgaW5wdXRFbCkgewoKICAgIGFqYXhVcGxvYWQudXBsb2FkaW5nKys7CgogICAgdXBsb2FkQmxvYihmaWxlLCAkKGlucHV0RWwpLmRhdGEoJ3VwbG9hZC1wYXRoJyksIGF0dGFjaG1lbnRJZCwgewogICAgICAgIGxvYWRzdGFydEV2ZW50SGFuZGxlcjogb25Mb2Fkc3RhcnQuYmluZChwcm9ncmVzc1NwYW4pLAogICAgICAgIHByb2dyZXNzRXZlbnRIYW5kbGVyOiBvblByb2dyZXNzLmJpbmQocHJvZ3Jlc3NTcGFuKQogICAgICB9KQogICAgICAuZG9uZShmdW5jdGlvbihyZXN1bHQpIHsKICAgICAgICBhZGRJbmxpbmVBdHRhY2htZW50TWFya3VwKGZpbGUpOwogICAgICAgIHByb2dyZXNzU3Bhbi5wcm9ncmVzc2JhciggJ3ZhbHVlJywgMTAwICkucmVtb3ZlKCk7CiAgICAgICAgZmlsZVNwYW4uZmluZCgnaW5wdXQuZGVzY3JpcHRpb24sIGEnKS5jc3MoJ2Rpc3BsYXknLCAnaW5saW5lLWZsZXgnKTsKICAgICAgfSkKICAgICAgLmZhaWwoZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgcHJvZ3Jlc3NTcGFuLnRleHQocmVzdWx0LnN0YXR1c1RleHQpOwogICAgICB9KS5hbHdheXMoZnVuY3Rpb24oKSB7CiAgICAgICAgYWpheFVwbG9hZC51cGxvYWRpbmctLTsKICAgICAgICBmaWxlU3Bhbi5yZW1vdmVDbGFzcygnYWpheC1sb2FkaW5nJyk7CiAgICAgICAgdmFyIGZvcm0gPSBmaWxlU3Bhbi5wYXJlbnRzKCdmb3JtJyk7CiAgICAgICAgaWYgKGZvcm0ucXVldWUoJ3VwbG9hZCcpLmxlbmd0aCA9PSAwICYmIGFqYXhVcGxvYWQudXBsb2FkaW5nID09IDApIHsKICAgICAgICAgICQoJ2lucHV0OnN1Ym1pdCcsIGZvcm0pLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7CiAgICAgICAgfQogICAgICAgIGZvcm0uZGVxdWV1ZSgndXBsb2FkJyk7CiAgICAgIH0pOwogIH0KCiAgdmFyIHByb2dyZXNzU3BhbiA9ICQoJzxkaXY+JykuaW5zZXJ0QWZ0ZXIoZmlsZVNwYW4uZmluZCgnaW5wdXQuZmlsZW5hbWUnKSk7CiAgcHJvZ3Jlc3NTcGFuLnByb2dyZXNzYmFyKCk7CiAgZmlsZVNwYW4uYWRkQ2xhc3MoJ2FqYXgtd2FpdGluZycpOwoKICB2YXIgbWF4U3luY1VwbG9hZCA9ICQoaW5wdXRFbCkuZGF0YSgnbWF4LWNvbmN1cnJlbnQtdXBsb2FkcycpOwoKICBpZihtYXhTeW5jVXBsb2FkID09IG51bGwgfHwgbWF4U3luY1VwbG9hZCA8PSAwIHx8IGFqYXhVcGxvYWQudXBsb2FkaW5nIDwgbWF4U3luY1VwbG9hZCkKICAgIGFjdHVhbFVwbG9hZChmaWxlLCBhdHRhY2htZW50SWQsIGZpbGVTcGFuLCBpbnB1dEVsKTsKICBlbHNlCiAgICAkKGlucHV0RWwpLnBhcmVudHMoJ2Zvcm0nKS5xdWV1ZSgndXBsb2FkJywgYWN0dWFsVXBsb2FkLmJpbmQodGhpcywgZmlsZSwgYXR0YWNobWVudElkLCBmaWxlU3BhbiwgaW5wdXRFbCkpOwp9CgphamF4VXBsb2FkLnVwbG9hZGluZyA9IDA7CgpmdW5jdGlvbiByZW1vdmVGaWxlKCkgewogICQodGhpcykuY2xvc2VzdCgnLmF0dGFjaG1lbnRzX2Zvcm0nKS5maW5kKCcuYWRkX2F0dGFjaG1lbnQnKS5zaG93KCk7CiAgJCh0aGlzKS5wYXJlbnQoJ3NwYW4nKS5yZW1vdmUoKTsKICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIHVwbG9hZEJsb2IoYmxvYiwgdXBsb2FkVXJsLCBhdHRhY2htZW50SWQsIG9wdGlvbnMpIHsKCiAgdmFyIGFjdHVhbE9wdGlvbnMgPSAkLmV4dGVuZCh7CiAgICBsb2Fkc3RhcnRFdmVudEhhbmRsZXI6ICQubm9vcCwKICAgIHByb2dyZXNzRXZlbnRIYW5kbGVyOiAkLm5vb3AKICB9LCBvcHRpb25zKTsKCiAgdXBsb2FkVXJsID0gdXBsb2FkVXJsICsgJz9hdHRhY2htZW50X2lkPScgKyBhdHRhY2htZW50SWQ7CiAgaWYgKGJsb2IgaW5zdGFuY2VvZiB3aW5kb3cuQmxvYikgewogICAgdXBsb2FkVXJsICs9ICcmZmlsZW5hbWU9JyArIGVuY29kZVVSSUNvbXBvbmVudChibG9iLm5hbWUpOwogICAgdXBsb2FkVXJsICs9ICcmY29udGVudF90eXBlPScgKyBlbmNvZGVVUklDb21wb25lbnQoYmxvYi50eXBlKTsKICB9CgogIHJldHVybiAkLmFqYXgodXBsb2FkVXJsLCB7CiAgICB0eXBlOiAnUE9TVCcsCiAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsCiAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbihqcVhociwgc2V0dGluZ3MpIHsKICAgICAganFYaHIuc2V0UmVxdWVzdEhlYWRlcignQWNjZXB0JywgJ2FwcGxpY2F0aW9uL2pzJyk7CiAgICAgIC8vIGF0dGFjaCBwcm9wZXIgRmlsZSBvYmplY3QKICAgICAgc2V0dGluZ3MuZGF0YSA9IGJsb2I7CiAgICB9LAogICAgeGhyOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIHhociA9ICQuYWpheFNldHRpbmdzLnhocigpOwogICAgICB4aHIudXBsb2FkLm9ubG9hZHN0YXJ0ID0gYWN0dWFsT3B0aW9ucy5sb2Fkc3RhcnRFdmVudEhhbmRsZXI7CiAgICAgIHhoci51cGxvYWQub25wcm9ncmVzcyA9IGFjdHVhbE9wdGlvbnMucHJvZ3Jlc3NFdmVudEhhbmRsZXI7CiAgICAgIHJldHVybiB4aHI7CiAgICB9LAogICAgZGF0YTogYmxvYiwKICAgIGNhY2hlOiBmYWxzZSwKICAgIHByb2Nlc3NEYXRhOiBmYWxzZQogIH0pOwp9CgpmdW5jdGlvbiBhZGRJbnB1dEZpbGVzKGlucHV0RWwpIHsKICB2YXIgYXR0YWNobWVudHNGaWVsZHMgPSAkKGlucHV0RWwpLmNsb3Nlc3QoJy5hdHRhY2htZW50c19mb3JtJykuZmluZCgnLmF0dGFjaG1lbnRzX2ZpZWxkcycpOwogIHZhciBhZGRBdHRhY2htZW50ID0gJChpbnB1dEVsKS5jbG9zZXN0KCcuYXR0YWNobWVudHNfZm9ybScpLmZpbmQoJy5hZGRfYXR0YWNobWVudCcpOwogIHZhciBjbGVhcmVkRmlsZUlucHV0ID0gJChpbnB1dEVsKS5jbG9uZSgpLnZhbCgnJyk7CiAgdmFyIHNpemVFeGNlZWRlZCA9IGZhbHNlOwogIHZhciBwYXJhbSA9ICQoaW5wdXRFbCkuZGF0YSgncGFyYW0nKTsKICBpZiAoIXBhcmFtKSB7cGFyYW0gPSAnYXR0YWNobWVudHMnfTsKCiAgaWYgKCQuYWpheFNldHRpbmdzLnhocigpLnVwbG9hZCAmJiBpbnB1dEVsLmZpbGVzKSB7CiAgICAvLyB1cGxvYWQgZmlsZXMgdXNpbmcgYWpheAogICAgc2l6ZUV4Y2VlZGVkID0gdXBsb2FkQW5kQXR0YWNoRmlsZXMoaW5wdXRFbC5maWxlcywgaW5wdXRFbCk7CiAgICAkKGlucHV0RWwpLnJlbW92ZSgpOwogIH0gZWxzZSB7CiAgICAvLyBicm93c2VyIG5vdCBzdXBwb3J0aW5nIHRoZSBmaWxlIEFQSSwgdXBsb2FkIG9uIGZvcm0gc3VibWlzc2lvbgogICAgdmFyIGF0dGFjaG1lbnRJZDsKICAgIHZhciBhRmlsZW5hbWUgPSBpbnB1dEVsLnZhbHVlLnNwbGl0KC9cL3xcXC8pOwogICAgYXR0YWNobWVudElkID0gYWRkRmlsZShpbnB1dEVsLCB7IG5hbWU6IGFGaWxlbmFtZVsgYUZpbGVuYW1lLmxlbmd0aCAtIDEgXSB9LCBmYWxzZSk7CiAgICBpZiAoYXR0YWNobWVudElkKSB7CiAgICAgICQoaW5wdXRFbCkuYXR0cih7IG5hbWU6IHBhcmFtICsgJ1snICsgYXR0YWNobWVudElkICsgJ11bZmlsZV0nLCBzdHlsZTogJ2Rpc3BsYXk6bm9uZTsnIH0pLmFwcGVuZFRvKCcjYXR0YWNobWVudHNfJyArIGF0dGFjaG1lbnRJZCk7CiAgICB9CiAgfQoKICBjbGVhcmVkRmlsZUlucHV0LnByZXBlbmRUbyhhZGRBdHRhY2htZW50KTsKfQoKZnVuY3Rpb24gdXBsb2FkQW5kQXR0YWNoRmlsZXMoZmlsZXMsIGlucHV0RWwpIHsKCiAgdmFyIG1heEZpbGVTaXplID0gJChpbnB1dEVsKS5kYXRhKCdtYXgtZmlsZS1zaXplJyk7CiAgdmFyIG1heEZpbGVTaXplRXhjZWVkZWQgPSAkKGlucHV0RWwpLmRhdGEoJ21heC1maWxlLXNpemUtbWVzc2FnZScpOwoKICB2YXIgc2l6ZUV4Y2VlZGVkID0gZmFsc2U7CiAgdmFyIGZpbGVzTGVuZ3RoID0gJChpbnB1dEVsKS5jbG9zZXN0KCcuYXR0YWNobWVudHNfZm9ybScpLmZpbmQoJy5hdHRhY2htZW50c19maWVsZHMnKS5jaGlsZHJlbigpLmxlbmd0aCArIGZpbGVzLmxlbmd0aAogICQuZWFjaChmaWxlcywgZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5zaXplICYmIG1heEZpbGVTaXplICE9IG51bGwgJiYgdGhpcy5zaXplID4gcGFyc2VJbnQobWF4RmlsZVNpemUpKSB7c2l6ZUV4Y2VlZGVkPXRydWU7fQogIH0pOwogIGlmIChzaXplRXhjZWVkZWQpIHsKICAgIHdpbmRvdy5hbGVydChtYXhGaWxlU2l6ZUV4Y2VlZGVkKTsKICB9IGVsc2UgewogICAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbigpIHthZGRGaWxlKGlucHV0RWwsIHRoaXMsIHRydWUpO30pOwogIH0KCiAgaWYgKGZpbGVzTGVuZ3RoID4gKCQoaW5wdXRFbCkuYXR0cignbXVsdGlwbGUnKSA9PSAnbXVsdGlwbGUnID8gMTAgOiAxKSkgewogICAgd2luZG93LmFsZXJ0KCQoaW5wdXRFbCkuZGF0YSgnbWF4LW51bWJlci1vZi1maWxlcy1tZXNzYWdlJykpOwogIH0KICByZXR1cm4gc2l6ZUV4Y2VlZGVkOwp9CgpmdW5jdGlvbiBoYW5kbGVGaWxlRHJvcEV2ZW50KGUpIHsKCiAgJCh0aGlzKS5yZW1vdmVDbGFzcygnZmlsZW92ZXInKTsKICBibG9ja0V2ZW50UHJvcGFnYXRpb24oZSk7CgogIGlmICgkLmluQXJyYXkoJ0ZpbGVzJywgZS5kYXRhVHJhbnNmZXIudHlwZXMpID4gLTEpIHsKICAgIGhhbmRsZUZpbGVEcm9wRXZlbnQudGFyZ2V0ID0gZS50YXJnZXQ7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnY3VzdG9tLWZpZWxkLWZpbGVkcm9wbGlzdG5lcicpKXsKICAgICAgdXBsb2FkQW5kQXR0YWNoRmlsZXMoZS5kYXRhVHJhbnNmZXIuZmlsZXMsICQodGhpcykuZmluZCgnaW5wdXQ6ZmlsZS5jdXN0b20tZmllbGQtZmlsZWRyb3AnKS5maXJzdCgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHVwbG9hZEFuZEF0dGFjaEZpbGVzKGUuZGF0YVRyYW5zZmVyLmZpbGVzLCAkKHRoaXMpLmZpbmQoJ2lucHV0OmZpbGUuZmlsZWRyb3AnKS5maXJzdCgpKTsKICAgIH0KICB9Cn0KaGFuZGxlRmlsZURyb3BFdmVudC50YXJnZXQgPSAnJzsKCmZ1bmN0aW9uIGRyYWdPdmVySGFuZGxlcihlKSB7CiAgJCh0aGlzKS5hZGRDbGFzcygnZmlsZW92ZXInKTsKICBibG9ja0V2ZW50UHJvcGFnYXRpb24oZSk7CiAgZS5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdjb3B5JzsKfQoKZnVuY3Rpb24gZHJhZ091dEhhbmRsZXIoZSkgewogICQodGhpcykucmVtb3ZlQ2xhc3MoJ2ZpbGVvdmVyJyk7CiAgYmxvY2tFdmVudFByb3BhZ2F0aW9uKGUpOwp9CgpmdW5jdGlvbiBzZXR1cEZpbGVEcm9wKCkgewogIGlmICh3aW5kb3cuRmlsZSAmJiB3aW5kb3cuRmlsZUxpc3QgJiYgd2luZG93LlByb2dyZXNzRXZlbnQgJiYgd2luZG93LkZvcm1EYXRhKSB7CgogICAgJC5ldmVudC5hZGRQcm9wKCdkYXRhVHJhbnNmZXInKTsKCiAgICAkKCdmb3JtIGRpdi5ib3g6bm90KC5maWxlZHJvcGxpc3RuZXIpJykuaGFzKCdpbnB1dDpmaWxlLmZpbGVkcm9wJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgJCh0aGlzKS5vbih7CiAgICAgICAgICBkcmFnb3ZlcjogZHJhZ092ZXJIYW5kbGVyLAogICAgICAgICAgZHJhZ2xlYXZlOiBkcmFnT3V0SGFuZGxlciwKICAgICAgICAgIGRyb3A6IGhhbmRsZUZpbGVEcm9wRXZlbnQsCiAgICAgICAgICBwYXN0ZTogY29weUltYWdlRnJvbUNsaXBib2FyZAogICAgICB9KS5hZGRDbGFzcygnZmlsZWRyb3BsaXN0bmVyJyk7CiAgICB9KTsKCiAgICAkKCdmb3JtIGRpdi5ib3ggaW5wdXQ6ZmlsZS5jdXN0b20tZmllbGQtZmlsZWRyb3AnKS5jbG9zZXN0KCdwJykubm90KCcuY3VzdG9tLWZpZWxkLWZpbGVkcm9wbGlzdG5lcicpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICQodGhpcykub24oewogICAgICAgICAgZHJhZ292ZXI6IGRyYWdPdmVySGFuZGxlciwKICAgICAgICAgIGRyYWdsZWF2ZTogZHJhZ091dEhhbmRsZXIsCiAgICAgICAgICBkcm9wOiBoYW5kbGVGaWxlRHJvcEV2ZW50CiAgICAgIH0pLmFkZENsYXNzKCdjdXN0b20tZmllbGQtZmlsZWRyb3BsaXN0bmVyJyk7CiAgICB9KTsKICB9Cn0KCmZ1bmN0aW9uIGFkZElubGluZUF0dGFjaG1lbnRNYXJrdXAoZmlsZSkgewogIC8vIGluc2VydCB1cGxvYWRlZCBpbWFnZSBpbmxpbmUgaWYgZHJvcHBlZCBhcmVhIGlzIGN1cnJlbnRseSBmb2N1c2VkIHRleHRhcmVhCiAgaWYoJChoYW5kbGVGaWxlRHJvcEV2ZW50LnRhcmdldCkuaGFzQ2xhc3MoJ3dpa2ktZWRpdCcpICYmICQuaW5BcnJheShmaWxlLnR5cGUsIHdpbmRvdy53aWtpSW1hZ2VNaW1lVHlwZXMpID4gLTEpIHsKICAgIHZhciAkdGV4dGFyZWEgPSAkKGhhbmRsZUZpbGVEcm9wRXZlbnQudGFyZ2V0KTsKICAgIHZhciBjdXJzb3JQb3NpdGlvbiA9ICR0ZXh0YXJlYS5wcm9wKCdzZWxlY3Rpb25TdGFydCcpOwogICAgdmFyIGRlc2NyaXB0aW9uID0gJHRleHRhcmVhLnZhbCgpOwogICAgdmFyIHNhbml0aXplZEZpbGVuYW1lID0gZmlsZS5uYW1lLnJlcGxhY2UoL1tcL1w/XCVcKlw6XHxcIlwnPD5cblxyXSsvLCAnXycpOwogICAgdmFyIGlubGluZUZpbGVuYW1lID0gZW5jb2RlVVJJQ29tcG9uZW50KHNhbml0aXplZEZpbGVuYW1lKQogICAgICAucmVwbGFjZSgvWyEoKV0vZywgZnVuY3Rpb24obWF0Y2gpIHsgcmV0dXJuICIlIiArIG1hdGNoLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpIH0pOwogICAgdmFyIG5ld0xpbmVCZWZvcmUgPSB0cnVlOwogICAgdmFyIG5ld0xpbmVBZnRlciA9IHRydWU7CiAgICBpZihjdXJzb3JQb3NpdGlvbiA9PT0gMCB8fCBkZXNjcmlwdGlvbi5zdWJzdHIoY3Vyc29yUG9zaXRpb24tMSwxKS5tYXRjaCgvXHJ8XG4vKSkgewogICAgICBuZXdMaW5lQmVmb3JlID0gZmFsc2U7CiAgICB9CiAgICBpZihkZXNjcmlwdGlvbi5zdWJzdHIoY3Vyc29yUG9zaXRpb24sMSkubWF0Y2goL1xyfFxuLykpIHsKICAgICAgbmV3TGluZUFmdGVyID0gZmFsc2U7CiAgICB9CgogICAgJHRleHRhcmVhLnZhbCgKICAgICAgZGVzY3JpcHRpb24uc3Vic3RyaW5nKDAsIGN1cnNvclBvc2l0aW9uKQogICAgICArIChuZXdMaW5lQmVmb3JlID8gJ1xuJyA6ICcnKQogICAgICArIGlubGluZUZpbGVuYW1lCiAgICAgICsgKG5ld0xpbmVBZnRlciA/ICdcbicgOiAnJykKICAgICAgKyBkZXNjcmlwdGlvbi5zdWJzdHJpbmcoY3Vyc29yUG9zaXRpb24sIGRlc2NyaXB0aW9uLmxlbmd0aCkKICAgICk7CgogICAgJHRleHRhcmVhLnByb3AoewogICAgICAnc2VsZWN0aW9uU3RhcnQnOiBjdXJzb3JQb3NpdGlvbiArIG5ld0xpbmVCZWZvcmUsCiAgICAgICdzZWxlY3Rpb25FbmQnOiBjdXJzb3JQb3NpdGlvbiArIGlubGluZUZpbGVuYW1lLmxlbmd0aCArIG5ld0xpbmVCZWZvcmUKICAgIH0pOwogICAgJHRleHRhcmVhLnBhcmVudHMoJy5qc3RCbG9jaycpCiAgICAgIC5maW5kKCcuanN0Yl9pbWcnKS5jbGljaygpOwoKICAgIC8vIG1vdmUgY3Vyc29yIGludG8gbmV4dCBsaW5lCiAgICBjdXJzb3JQb3NpdGlvbiA9ICR0ZXh0YXJlYS5wcm9wKCdzZWxlY3Rpb25TdGFydCcpOwogICAgJHRleHRhcmVhLnByb3AoewogICAgICAnc2VsZWN0aW9uU3RhcnQnOiBjdXJzb3JQb3NpdGlvbiArIDEsCiAgICAgICdzZWxlY3Rpb25FbmQnOiBjdXJzb3JQb3NpdGlvbiArIDEKICAgIH0pOwoKICB9Cn0KCmZ1bmN0aW9uIGNvcHlJbWFnZUZyb21DbGlwYm9hcmQoZSkgewogIGlmICghJChlLnRhcmdldCkuaGFzQ2xhc3MoJ3dpa2ktZWRpdCcpKSB7IHJldHVybjsgfQogIHZhciBjbGlwYm9hcmREYXRhID0gZS5jbGlwYm9hcmREYXRhIHx8IGUub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhCiAgaWYgKCFjbGlwYm9hcmREYXRhKSB7IHJldHVybjsgfQogIGlmIChjbGlwYm9hcmREYXRhLnR5cGVzLnNvbWUoZnVuY3Rpb24odCl7IHJldHVybiAvXnRleHRcL3BsYWluJC8udGVzdCh0KTsgfSkpIHsgcmV0dXJuOyB9CgogIHZhciBmaWxlcyA9IGNsaXBib2FyZERhdGEuZmlsZXMKICBmb3IgKHZhciBpID0gMCA7IGkgPCBmaWxlcy5sZW5ndGggOyBpKyspIHsKICAgIHZhciBmaWxlID0gZmlsZXNbaV07CiAgICBpZiAoZmlsZS50eXBlLmluZGV4T2YoImltYWdlIikgIT0gLTEpIHsKICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgpOwogICAgICB2YXIgZmlsZW5hbWUgPSAnY2xpcGJvYXJkLScKICAgICAgICArIGRhdGUuZ2V0RnVsbFllYXIoKQogICAgICAgICsgKCcwJysoZGF0ZS5nZXRNb250aCgpKzEpKS5zbGljZSgtMikKICAgICAgICArICgnMCcrZGF0ZS5nZXREYXRlKCkpLnNsaWNlKC0yKQogICAgICAgICsgKCcwJytkYXRlLmdldEhvdXJzKCkpLnNsaWNlKC0yKQogICAgICAgICsgKCcwJytkYXRlLmdldE1pbnV0ZXMoKSkuc2xpY2UoLTIpCiAgICAgICAgKyAnLScgKyByYW5kb21LZXkoNSkudG9Mb2NhbGVMb3dlckNhc2UoKQogICAgICAgICsgJy4nICsgZmlsZS5uYW1lLnNwbGl0KCcuJykucG9wKCk7CgogICAgICAvLyBnZXQgaW5wdXQgZmlsZSBpbiB0aGUgY2xvc2VzdCBmb3JtCiAgICAgIHZhciBpbnB1dEVsID0gJCh0aGlzKS5jbG9zZXN0KCJmb3JtIikuZmluZCgnaW5wdXQ6ZmlsZS5maWxlZHJvcCcpOwogICAgICBoYW5kbGVGaWxlRHJvcEV2ZW50LnRhcmdldCA9IGUudGFyZ2V0OwogICAgICBhZGRGaWxlKGlucHV0RWwsIG5ldyBGaWxlKFtmaWxlXSwgZmlsZW5hbWUsIHsgdHlwZTogZmlsZS50eXBlIH0pLCB0cnVlKTsKICAgIH0KICB9Cn0KCiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwRmlsZURyb3ApOwokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICQoImlucHV0LmRlbGV0ZWRfYXR0YWNobWVudCIpLmNoYW5nZShmdW5jdGlvbigpewogICAgJCh0aGlzKS5wYXJlbnRzKCcuZXhpc3RpbmctYXR0YWNobWVudCcpLnRvZ2dsZUNsYXNzKCdkZWxldGVkJywgJCh0aGlzKS5pcygiOmNoZWNrZWQiKSk7CiAgfSkuY2hhbmdlKCk7Cn0pOwo=" | |
| } | |
| }, | |
| "6.0.4": { | |
| "application.js": { | |
| "hash": "e8724b6e0c228d0944a290bdcbfe8a84", | |
| "path": "/usr/src/redmine/public/assets/application-24bcafd3.js", | |
| "base64": "LyoqCiAqIFJlZG1pbmUgLSBwcm9qZWN0IG1hbmFnZW1lbnQgc29mdHdhcmUKICogQ29weXJpZ2h0IChDKSAyMDA2LSAgSmVhbi1QaGlsaXBwZSBMYW5nCiAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCiAqLwoKZnVuY3Rpb24gc2FuaXRpemVIVE1MKHN0cmluZykgewogIHZhciB0ZW1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIHRlbXAudGV4dENvbnRlbnQgPSBzdHJpbmc7CiAgcmV0dXJuIHRlbXAuaW5uZXJIVE1MOwp9CgpmdW5jdGlvbiBjaGVja0FsbChpZCwgY2hlY2tlZCkgewogICQoJyMnK2lkKS5maW5kKCdpbnB1dFt0eXBlPWNoZWNrYm94XTplbmFibGVkJykucHJvcCgnY2hlY2tlZCcsIGNoZWNrZWQpOwp9CgpmdW5jdGlvbiB0b2dnbGVDaGVja2JveGVzQnlTZWxlY3RvcihzZWxlY3RvcikgewogIHZhciBhbGxfY2hlY2tlZCA9IHRydWU7CiAgJChzZWxlY3RvcikuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgaWYgKCEkKHRoaXMpLmlzKCc6Y2hlY2tlZCcpKSB7IGFsbF9jaGVja2VkID0gZmFsc2U7IH0KICB9KTsKICAkKHNlbGVjdG9yKS5wcm9wKCdjaGVja2VkJywgIWFsbF9jaGVja2VkKS50cmlnZ2VyKCdjaGFuZ2UnKTsKfQoKZnVuY3Rpb24gc2hvd0FuZFNjcm9sbFRvKGlkLCBmb2N1cykgewogICQoJyMnK2lkKS5zaG93KCk7CiAgaWYgKGZvY3VzICE9PSBudWxsKSB7CiAgICAkKCcjJytmb2N1cykuZm9jdXMoKTsKICB9CiAgJCgnaHRtbCwgYm9keScpLmFuaW1hdGUoe3Njcm9sbFRvcDogJCgnIycraWQpLm9mZnNldCgpLnRvcH0sIDEwMCk7Cn0KCmZ1bmN0aW9uIHRvZ2dsZVJvd0dyb3VwKGVsKSB7CiAgdmFyIHRyID0gJChlbCkucGFyZW50cygndHInKS5maXJzdCgpOwogIHZhciBuID0gdHIubmV4dCgpOwogIHRyLnRvZ2dsZUNsYXNzKCdvcGVuJyk7CiAgJChlbCkudG9nZ2xlQ2xhc3MoJ2ljb24tZXhwYW5kZWQgaWNvbi1jb2xsYXBzZWQnKTsKICB0b2dnbGVFeHBlbmRDb2xsYXBzZUljb24oZWwpCiAgd2hpbGUgKG4ubGVuZ3RoICYmICFuLmhhc0NsYXNzKCdncm91cCcpKSB7CiAgICBuLnRvZ2dsZSgpOwogICAgbiA9IG4ubmV4dCgndHInKTsKICB9Cn0KCmZ1bmN0aW9uIHRvZ2dsZUV4cGVuZENvbGxhcHNlSWNvbihlbCkgewogIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2ljb24tZXhwYW5kZWQnKSkgewogICAgdXBkYXRlU1ZHSWNvbihlbCwgJ2FuZ2xlLWRvd24nKQogIH0gZWxzZSB7CiAgICB1cGRhdGVTVkdJY29uKGVsLCAnYW5nbGUtcmlnaHQnKQogIH0KfQoKZnVuY3Rpb24gdXBkYXRlU1ZHSWNvbihlbGVtZW50LCBpY29uKSB7CiAgY29uc3QgaWNvbkVsZW1lbnQgPSBlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ1c2UiKS5pdGVtKDApCgogIGlmIChpY29uRWxlbWVudCA9PT0gbnVsbCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgY29uc3QgaWNvblBhdGggPSBpY29uRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTsKICBpY29uRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBpY29uUGF0aC5yZXBsYWNlKC8jLiokL2csICIjaWNvbi0tIiArIGljb24pKQp9CgpmdW5jdGlvbiBjb2xsYXBzZUFsbFJvd0dyb3VwcyhlbCkgewogIHZhciB0Ym9keSA9ICQoZWwpLnBhcmVudHMoJ3Rib2R5JykuZmlyc3QoKTsKICB0Ym9keS5jaGlsZHJlbigndHInKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnZ3JvdXAnKSkgewogICAgICAkKHRoaXMpLnJlbW92ZUNsYXNzKCdvcGVuJyk7CiAgICAgICQodGhpcykuZmluZCgnLmV4cGFuZGVyJykuc3dpdGNoQ2xhc3MoJ2ljb24tZXhwYW5kZWQnLCAnaWNvbi1jb2xsYXBzZWQnKTsKICAgIH0gZWxzZSB7CiAgICAgICQodGhpcykuaGlkZSgpOwogICAgfQogIH0pOwp9CgpmdW5jdGlvbiBleHBhbmRBbGxSb3dHcm91cHMoZWwpIHsKICB2YXIgdGJvZHkgPSAkKGVsKS5wYXJlbnRzKCd0Ym9keScpLmZpcnN0KCk7CiAgdGJvZHkuY2hpbGRyZW4oJ3RyJykuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ2dyb3VwJykpIHsKICAgICAgJCh0aGlzKS5hZGRDbGFzcygnb3BlbicpOwogICAgICAkKHRoaXMpLmZpbmQoJy5leHBhbmRlcicpLnN3aXRjaENsYXNzKCdpY29uLWNvbGxhcHNlZCcsICdpY29uLWV4cGFuZGVkJyk7CiAgICB9IGVsc2UgewogICAgICAkKHRoaXMpLnNob3coKTsKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gdG9nZ2xlQWxsUm93R3JvdXBzKGVsKSB7CiAgdmFyIHRyID0gJChlbCkucGFyZW50cygndHInKS5maXJzdCgpOwogIGlmICh0ci5oYXNDbGFzcygnb3BlbicpKSB7CiAgICBjb2xsYXBzZUFsbFJvd0dyb3VwcyhlbCk7CiAgfSBlbHNlIHsKICAgIGV4cGFuZEFsbFJvd0dyb3VwcyhlbCk7CiAgfQp9CgpmdW5jdGlvbiB0b2dnbGVGaWVsZHNldChlbCkgewogIHZhciBmaWVsZHNldCA9ICQoZWwpLnBhcmVudHMoJ2ZpZWxkc2V0JykuZmlyc3QoKTsKICBmaWVsZHNldC50b2dnbGVDbGFzcygnY29sbGFwc2VkJyk7CiAgZmllbGRzZXQuY2hpbGRyZW4oJ2xlZ2VuZCcpLnRvZ2dsZUNsYXNzKCdpY29uLWV4cGFuZGVkIGljb24tY29sbGFwc2VkJyk7CiAgdG9nZ2xlRXhwZW5kQ29sbGFwc2VJY29uKGZpZWxkc2V0LmNoaWxkcmVuKCdsZWdlbmQnKVswXSkKICBmaWVsZHNldC5jaGlsZHJlbignZGl2JykudG9nZ2xlKCk7Cn0KCmZ1bmN0aW9uIGhpZGVGaWVsZHNldChlbCkgewogIHZhciBmaWVsZHNldCA9ICQoZWwpLnBhcmVudHMoJ2ZpZWxkc2V0JykuZmlyc3QoKTsKICBmaWVsZHNldC50b2dnbGVDbGFzcygnY29sbGFwc2VkJyk7CiAgZmllbGRzZXQuY2hpbGRyZW4oJ2RpdicpLmhpZGUoKTsKfQoKLy8gY29sdW1ucyBzZWxlY3Rpb24KZnVuY3Rpb24gbW92ZU9wdGlvbnModGhlU2VsRnJvbSwgdGhlU2VsVG8pIHsKICAkKHRoZVNlbEZyb20pLmZpbmQoJ29wdGlvbjpzZWxlY3RlZCcpLmRldGFjaCgpLnByb3AoInNlbGVjdGVkIiwgZmFsc2UpLmFwcGVuZFRvKCQodGhlU2VsVG8pKTsKfQoKZnVuY3Rpb24gbW92ZU9wdGlvblVwKHRoZVNlbCkgewogICQodGhlU2VsKS5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAkKHRoaXMpLnByZXYoJzpub3QoOnNlbGVjdGVkKScpLmRldGFjaCgpLmluc2VydEFmdGVyKCQodGhpcykpOwogIH0pOwp9CgpmdW5jdGlvbiBtb3ZlT3B0aW9uVG9wKHRoZVNlbCkgewogICQodGhlU2VsKS5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS5kZXRhY2goKS5wcmVwZW5kVG8oJCh0aGVTZWwpKTsKfQoKZnVuY3Rpb24gbW92ZU9wdGlvbkRvd24odGhlU2VsKSB7CiAgJCgkKHRoZVNlbCkuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykuZ2V0KCkucmV2ZXJzZSgpKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAkKHRoaXMpLm5leHQoJzpub3QoOnNlbGVjdGVkKScpLmRldGFjaCgpLmluc2VydEJlZm9yZSgkKHRoaXMpKTsKICB9KTsKfQoKZnVuY3Rpb24gbW92ZU9wdGlvbkJvdHRvbSh0aGVTZWwpIHsKICAkKHRoZVNlbCkuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykuZGV0YWNoKCkuYXBwZW5kVG8oJCh0aGVTZWwpKTsKfQoKZnVuY3Rpb24gaW5pdEZpbHRlcnMoKSB7CiAgJCgnI2FkZF9maWx0ZXJfc2VsZWN0JykuY2hhbmdlKGZ1bmN0aW9uKCkgewogICAgYWRkRmlsdGVyKCQodGhpcykudmFsKCksICcnLCBbXSk7CiAgfSk7CiAgJCgnI2ZpbHRlcnMtdGFibGUgLmZpZWxkIGlucHV0W3R5cGU9Y2hlY2tib3hdJykuZWFjaChmdW5jdGlvbigpIHsKICAgIHRvZ2dsZUZpbHRlcigkKHRoaXMpLnZhbCgpKTsKICB9KTsKICAkKCcjZmlsdGVycy10YWJsZScpLm9uKCdjbGljaycsICcuZmllbGQgaW5wdXRbdHlwZT1jaGVja2JveF0nLCBmdW5jdGlvbigpIHsKICAgIHRvZ2dsZUZpbHRlcigkKHRoaXMpLnZhbCgpKTsKICB9KTsKICAkKCcjZmlsdGVycy10YWJsZScpLm9uKCdrZXlwcmVzcycsICdpbnB1dFt0eXBlPXRleHRdJywgZnVuY3Rpb24oZSkgewogICAgaWYgKGUua2V5Q29kZSA9PSAxMykgJCh0aGlzKS5jbG9zZXN0KCdmb3JtJykuc3VibWl0KCk7CiAgfSk7Cn0KCmZ1bmN0aW9uIGFkZEZpbHRlcihmaWVsZCwgb3BlcmF0b3IsIHZhbHVlcykgewogIHZhciBmaWVsZElkID0gZmllbGQucmVwbGFjZSgnLicsICdfJyk7CiAgdmFyIHRyID0gJCgnI3RyXycrZmllbGRJZCk7CgogIHZhciBmaWx0ZXJPcHRpb25zID0gYXZhaWxhYmxlRmlsdGVyc1tmaWVsZF07CiAgaWYgKCFmaWx0ZXJPcHRpb25zKSByZXR1cm47CgogIGlmIChmaWx0ZXJPcHRpb25zWydyZW1vdGUnXSAmJiBmaWx0ZXJPcHRpb25zWyd2YWx1ZXMnXSA9PSBudWxsKSB7CiAgICAkLmdldEpTT04oZmlsdGVyc1VybCwgeyduYW1lJzogZmllbGR9KS5kb25lKGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgZmlsdGVyT3B0aW9uc1sndmFsdWVzJ10gPSBkYXRhOwogICAgICBhZGRGaWx0ZXIoZmllbGQsIG9wZXJhdG9yLCB2YWx1ZXMpIDsKICAgIH0pOwogICAgcmV0dXJuOwogIH0KCiAgaWYgKHRyLmxlbmd0aCA+IDApIHsKICAgIHRyLnNob3coKTsKICB9IGVsc2UgewogICAgYnVpbGRGaWx0ZXJSb3coZmllbGQsIG9wZXJhdG9yLCB2YWx1ZXMpOwogIH0KICAkKCcjY2JfJytmaWVsZElkKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7CiAgdG9nZ2xlRmlsdGVyKGZpZWxkKTsKICB0b2dnbGVNdWx0aVNlbGVjdEljb25Jbml0KCk7CiAgJCgnI2FkZF9maWx0ZXJfc2VsZWN0JykudmFsKCcnKS5maW5kKCdvcHRpb24nKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgaWYgKCQodGhpcykuYXR0cigndmFsdWUnKSA9PSBmaWVsZCkgewogICAgICAkKHRoaXMpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIGJ1aWxkRmlsdGVyUm93KGZpZWxkLCBvcGVyYXRvciwgdmFsdWVzKSB7CiAgdmFyIGZpZWxkSWQgPSBmaWVsZC5yZXBsYWNlKCcuJywgJ18nKTsKICB2YXIgZmlsdGVyVGFibGUgPSAkKCIjZmlsdGVycy10YWJsZSIpOwogIHZhciBmaWx0ZXJPcHRpb25zID0gYXZhaWxhYmxlRmlsdGVyc1tmaWVsZF07CiAgaWYgKCFmaWx0ZXJPcHRpb25zKSByZXR1cm47CiAgdmFyIG9wZXJhdG9ycyA9IG9wZXJhdG9yQnlUeXBlW2ZpbHRlck9wdGlvbnNbJ3R5cGUnXV07CiAgdmFyIGZpbHRlclZhbHVlcyA9IGZpbHRlck9wdGlvbnNbJ3ZhbHVlcyddOwogIHZhciBzZWxlY3Q7CgogIHZhciB0ciA9ICQoJzxkaXYgY2xhc3M9ImZpbHRlciI+JykuYXR0cignaWQnLCAndHJfJytmaWVsZElkKS5odG1sKAogICAgJzxkaXYgY2xhc3M9ImZpZWxkIj48aW5wdXQgY2hlY2tlZD0iY2hlY2tlZCIgaWQ9ImNiXycrZmllbGRJZCsnIiBuYW1lPSJmW10iIHZhbHVlPSInK2ZpZWxkKyciIHR5cGU9ImNoZWNrYm94Ij48bGFiZWwgZm9yPSJjYl8nK2ZpZWxkSWQrJyI+ICcrZmlsdGVyT3B0aW9uc1snbmFtZSddKyc8L2xhYmVsPjwvZGl2PicgKwogICAgJzxkaXYgY2xhc3M9Im9wZXJhdG9yIj48c2VsZWN0IGlkPSJvcGVyYXRvcnNfJytmaWVsZElkKyciIG5hbWU9Im9wWycrZmllbGQrJ10iPjwvc2VsZWN0PjwvZGl2PicgKwogICAgJzxkaXYgY2xhc3M9InZhbHVlcyI+PC9kaXY+JwogICk7CiAgZmlsdGVyVGFibGUuYXBwZW5kKHRyKTsKCiAgc2VsZWN0ID0gdHIuZmluZCgnLm9wZXJhdG9yIHNlbGVjdCcpOwogIG9wZXJhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uKG9wKSB7CiAgICB2YXIgb3B0aW9uID0gJCgnPG9wdGlvbj4nKS52YWwob3ApLnRleHQob3BlcmF0b3JMYWJlbHNbb3BdKTsKICAgIGlmIChvcCA9PSBvcGVyYXRvcikgeyBvcHRpb24ucHJvcCgnc2VsZWN0ZWQnLCB0cnVlKTsgfQogICAgc2VsZWN0LmFwcGVuZChvcHRpb24pOwogIH0pOwogIHNlbGVjdC5jaGFuZ2UoZnVuY3Rpb24oKXsgdG9nZ2xlT3BlcmF0b3IoZmllbGQpOyB9KTsKCiAgc3dpdGNoIChmaWx0ZXJPcHRpb25zWyd0eXBlJ10pIHsKICBjYXNlICJsaXN0IjoKICBjYXNlICJsaXN0X3dpdGhfaGlzdG9yeSI6CiAgY2FzZSAibGlzdF9vcHRpb25hbCI6CiAgY2FzZSAibGlzdF9vcHRpb25hbF93aXRoX2hpc3RvcnkiOgogIGNhc2UgImxpc3Rfc3RhdHVzIjoKICBjYXNlICJsaXN0X3N1YnByb2plY3RzIjoKICAgIGNvbnN0IGljb25UeXBlID0gdmFsdWVzLmxlbmd0aCA+IDEgPyAndG9nZ2xlLW1pbnVzJyA6ICd0b2dnbGUtcGx1cyc7CiAgICBjb25zdCBjbG9uZWRJY29uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2ljb24tY29weS1zb3VyY2Ugc3ZnJykuY2xvbmVOb2RlKHRydWUpOwogICAgdXBkYXRlU1ZHSWNvbihjbG9uZWRJY29uLCBpY29uVHlwZSk7CgogICAgdHIuZmluZCgnLnZhbHVlcycpLmFwcGVuZCgKICAgICAgJCgnPHNwYW4+JywgeyBzdHlsZTogJ2Rpc3BsYXk6bm9uZTsnIH0pLmFwcGVuZCgKICAgICAgICAkKCc8c2VsZWN0PicsIHsKICAgICAgICAgIGNsYXNzOiAndmFsdWUnLAogICAgICAgICAgaWQ6IGB2YWx1ZXNfJHtmaWVsZElkfV8xYCwKICAgICAgICAgIG5hbWU6IGB2WyR7ZmllbGR9XVtdYCwKICAgICAgICB9KSwKICAgICAgICAnXG4nLAogICAgICAgICQoJzxzcGFuPicsIHsgY2xhc3M6IGB0b2dnbGUtbXVsdGlzZWxlY3QgaWNvbi1vbmx5IGljb24tJHtpY29uVHlwZX1gIH0pLmFwcGVuZChjbG9uZWRJY29uKQogICAgICApCiAgICApOwogICAgc2VsZWN0ID0gdHIuZmluZCgnLnZhbHVlcyBzZWxlY3QnKTsKICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMSkgeyBzZWxlY3QuYXR0cignbXVsdGlwbGUnLCB0cnVlKTsgfQogICAgZmlsdGVyVmFsdWVzLmZvckVhY2goZnVuY3Rpb24oZmlsdGVyVmFsdWUpIHsKICAgICAgdmFyIG9wdGlvbiA9ICQoJzxvcHRpb24+Jyk7CiAgICAgIGlmICgkLmlzQXJyYXkoZmlsdGVyVmFsdWUpKSB7CiAgICAgICAgb3B0aW9uLnZhbChmaWx0ZXJWYWx1ZVsxXSkudGV4dChmaWx0ZXJWYWx1ZVswXSk7CiAgICAgICAgaWYgKCQuaW5BcnJheShmaWx0ZXJWYWx1ZVsxXSwgdmFsdWVzKSA+IC0xKSB7b3B0aW9uLnByb3AoJ3NlbGVjdGVkJywgdHJ1ZSk7fQogICAgICAgIGlmIChmaWx0ZXJWYWx1ZS5sZW5ndGggPT0gMykgewogICAgICAgICAgdmFyIG9wdGdyb3VwID0gc2VsZWN0LmZpbmQoJ29wdGdyb3VwJykuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuICQodGhpcykuYXR0cignbGFiZWwnKSA9PSBmaWx0ZXJWYWx1ZVsyXX0pOwogICAgICAgICAgaWYgKCFvcHRncm91cC5sZW5ndGgpIHtvcHRncm91cCA9ICQoJzxvcHRncm91cD4nKS5hdHRyKCdsYWJlbCcsIGZpbHRlclZhbHVlWzJdKTt9CiAgICAgICAgICBvcHRpb24gPSBvcHRncm91cC5hcHBlbmQob3B0aW9uKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb3B0aW9uLnZhbChmaWx0ZXJWYWx1ZSkudGV4dChmaWx0ZXJWYWx1ZSk7CiAgICAgICAgaWYgKCQuaW5BcnJheShmaWx0ZXJWYWx1ZSwgdmFsdWVzKSA+IC0xKSB7b3B0aW9uLnByb3AoJ3NlbGVjdGVkJywgdHJ1ZSk7fQogICAgICB9CiAgICAgIHNlbGVjdC5hcHBlbmQob3B0aW9uKTsKICAgIH0pOwogICAgYnJlYWs7CiAgY2FzZSAiZGF0ZSI6CiAgY2FzZSAiZGF0ZV9wYXN0IjoKICAgIHRyLmZpbmQoJy52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9ImRhdGUiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnXzEiIHNpemU9IjEwIiBjbGFzcz0idmFsdWUgZGF0ZV92YWx1ZSIgLz48L3NwYW4+JyArCiAgICAgICcgPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZTsiPjxpbnB1dCB0eXBlPSJkYXRlIiBuYW1lPSJ2WycrZmllbGQrJ11bXSIgaWQ9InZhbHVlc18nK2ZpZWxkSWQrJ18yIiBzaXplPSIxMCIgY2xhc3M9InZhbHVlIGRhdGVfdmFsdWUiIC8+PC9zcGFuPicgKwogICAgICAnIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKyciIHNpemU9IjMiIGNsYXNzPSJ2YWx1ZSIgLz4gJytsYWJlbERheVBsdXJhbCsnPC9zcGFuPicKICAgICk7CiAgICAkKCcjdmFsdWVzXycrZmllbGRJZCsnXzEnKS52YWwodmFsdWVzWzBdKS5kYXRlcGlja2VyRmFsbGJhY2soZGF0ZXBpY2tlck9wdGlvbnMpOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQrJ18yJykudmFsKHZhbHVlc1sxXSkuZGF0ZXBpY2tlckZhbGxiYWNrKGRhdGVwaWNrZXJPcHRpb25zKTsKICAgICQoJyN2YWx1ZXNfJytmaWVsZElkKS52YWwodmFsdWVzWzBdKTsKICAgIGJyZWFrOwogIGNhc2UgInN0cmluZyI6CiAgY2FzZSAidGV4dCI6CiAgY2FzZSAic2VhcmNoIjoKICAgIHRyLmZpbmQoJy52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnIiBzaXplPSIzMCIgY2xhc3M9InZhbHVlIiAvPjwvc3Bhbj4nCiAgICApOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQpLnZhbCh2YWx1ZXNbMF0pOwogICAgYnJlYWs7CiAgY2FzZSAicmVsYXRpb24iOgogICAgdHIuZmluZCgnLnZhbHVlcycpLmFwcGVuZCgKICAgICAgJzxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKyciIHNpemU9IjYiIGNsYXNzPSJ2YWx1ZSIgLz48L3NwYW4+JyArCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PHNlbGVjdCBjbGFzcz0idmFsdWUiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnXzEiPjwvc2VsZWN0Pjwvc3Bhbj4nCiAgICApOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQpLnZhbCh2YWx1ZXNbMF0pOwogICAgc2VsZWN0ID0gdHIuZmluZCgnLnZhbHVlcyBzZWxlY3QnKTsKICAgIGZpbHRlclZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKGZpbHRlclZhbHVlKSB7CiAgICAgIHZhciBvcHRpb24gPSAkKCc8b3B0aW9uPicpOwogICAgICBvcHRpb24udmFsKGZpbHRlclZhbHVlWzFdKS50ZXh0KGZpbHRlclZhbHVlWzBdKTsKICAgICAgaWYgKHZhbHVlc1swXSA9PSBmaWx0ZXJWYWx1ZVsxXSkgeyBvcHRpb24ucHJvcCgnc2VsZWN0ZWQnLCB0cnVlKTsgfQogICAgICBzZWxlY3QuYXBwZW5kKG9wdGlvbik7CiAgICB9KTsKICAgIGJyZWFrOwogIGNhc2UgImludGVnZXIiOgogIGNhc2UgImZsb2F0IjoKICBjYXNlICJ0cmVlIjoKICAgIHRyLmZpbmQoJy52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnXzEiIHNpemU9IjE0IiBjbGFzcz0idmFsdWUiIC8+PC9zcGFuPicgKwogICAgICAnIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKydfMiIgc2l6ZT0iMTQiIGNsYXNzPSJ2YWx1ZSIgLz48L3NwYW4+JwogICAgKTsKICAgICQoJyN2YWx1ZXNfJytmaWVsZElkKydfMScpLnZhbCh2YWx1ZXNbMF0pOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQrJ18yJykudmFsKHZhbHVlc1sxXSk7CiAgICBicmVhazsKICB9Cn0KCmZ1bmN0aW9uIHRvZ2dsZUZpbHRlcihmaWVsZCkgewogIHZhciBmaWVsZElkID0gZmllbGQucmVwbGFjZSgnLicsICdfJyk7CiAgaWYgKCQoJyNjYl8nICsgZmllbGRJZCkuaXMoJzpjaGVja2VkJykpIHsKICAgICQoIiNvcGVyYXRvcnNfIiArIGZpZWxkSWQpLnNob3coKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpOwogICAgdG9nZ2xlT3BlcmF0b3IoZmllbGQpOwogIH0gZWxzZSB7CiAgICAkKCIjb3BlcmF0b3JzXyIgKyBmaWVsZElkKS5oaWRlKCkuYXR0cignZGlzYWJsZWQnLCB0cnVlKTsKICAgIGVuYWJsZVZhbHVlcyhmaWVsZCwgW10pOwogIH0KfQoKZnVuY3Rpb24gZW5hYmxlVmFsdWVzKGZpZWxkLCBpbmRleGVzKSB7CiAgdmFyIGZpZWxkSWQgPSBmaWVsZC5yZXBsYWNlKCcuJywgJ18nKTsKICAkKCcjdHJfJytmaWVsZElkKycgLnZhbHVlcyAudmFsdWUnKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICBpZiAoJC5pbkFycmF5KGluZGV4LCBpbmRleGVzKSA+PSAwKSB7CiAgICAgICQodGhpcykucmVtb3ZlQXR0cignZGlzYWJsZWQnKTsKICAgICAgJCh0aGlzKS5wYXJlbnRzKCdzcGFuJykuZmlyc3QoKS5zaG93KCk7CiAgICB9IGVsc2UgewogICAgICAkKHRoaXMpLnZhbCgnJyk7CiAgICAgICQodGhpcykuYXR0cignZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgJCh0aGlzKS5wYXJlbnRzKCdzcGFuJykuZmlyc3QoKS5oaWRlKCk7CiAgICB9CgogICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ2dyb3VwJykpIHsKICAgICAgJCh0aGlzKS5hZGRDbGFzcygnb3BlbicpOwogICAgfSBlbHNlIHsKICAgICAgJCh0aGlzKS5zaG93KCk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIHRvZ2dsZU9wZXJhdG9yKGZpZWxkKSB7CiAgdmFyIGZpZWxkSWQgPSBmaWVsZC5yZXBsYWNlKCcuJywgJ18nKTsKICB2YXIgb3BlcmF0b3IgPSAkKCIjb3BlcmF0b3JzXyIgKyBmaWVsZElkKTsKICBzd2l0Y2ggKG9wZXJhdG9yLnZhbCgpKSB7CiAgICBjYXNlICIhKiI6CiAgICBjYXNlICIqIjoKICAgIGNhc2UgIm5kIjoKICAgIGNhc2UgInQiOgogICAgY2FzZSAibGQiOgogICAgY2FzZSAibnciOgogICAgY2FzZSAidyI6CiAgICBjYXNlICJsdyI6CiAgICBjYXNlICJsMnciOgogICAgY2FzZSAibm0iOgogICAgY2FzZSAibSI6CiAgICBjYXNlICJsbSI6CiAgICBjYXNlICJ5IjoKICAgIGNhc2UgIm8iOgogICAgY2FzZSAiYyI6CiAgICBjYXNlICIqbyI6CiAgICBjYXNlICIhbyI6CiAgICAgIGVuYWJsZVZhbHVlcyhmaWVsZCwgW10pOwogICAgICBicmVhazsKICAgIGNhc2UgIj48IjoKICAgICAgZW5hYmxlVmFsdWVzKGZpZWxkLCBbMCwxXSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAiPHQrIjoKICAgIGNhc2UgIj50KyI6CiAgICBjYXNlICI+PHQrIjoKICAgIGNhc2UgInQrIjoKICAgIGNhc2UgIj50LSI6CiAgICBjYXNlICI8dC0iOgogICAgY2FzZSAiPjx0LSI6CiAgICBjYXNlICJ0LSI6CiAgICAgIGVuYWJsZVZhbHVlcyhmaWVsZCwgWzJdKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICI9cCI6CiAgICBjYXNlICI9IXAiOgogICAgY2FzZSAiIXAiOgogICAgICBlbmFibGVWYWx1ZXMoZmllbGQsIFsxXSk7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgZW5hYmxlVmFsdWVzKGZpZWxkLCBbMF0pOwogICAgICBicmVhazsKICB9Cn0KCmZ1bmN0aW9uIHRvZ2dsZU11bHRpU2VsZWN0KGVsKSB7CiAgdmFyIGlzV29ya2Zsb3cgPSBlbC5jbG9zZXN0KCcuY29udHJvbGxlci13b3JrZmxvd3MnKTsKICBpZiAoZWwuYXR0cignbXVsdGlwbGUnKSkgewogICAgZWwucmVtb3ZlQXR0cignbXVsdGlwbGUnKTsKICAgIGlmIChpc1dvcmtmbG93KSB7IGVsLmZpbmQoIm9wdGlvblt2YWx1ZT1hbGxdIikuc2hvdygpOyB9CiAgICBlbC5hdHRyKCdzaXplJywgMSk7CiAgfSBlbHNlIHsKICAgIGVsLmF0dHIoJ211bHRpcGxlJywgdHJ1ZSk7CiAgICBpZiAoaXNXb3JrZmxvdykgeyBlbC5maW5kKCJvcHRpb25bdmFsdWU9YWxsXSIpLmF0dHIoInNlbGVjdGVkIiwgZmFsc2UpLmhpZGUoKTsgfQogICAgaWYgKGVsLmNoaWxkcmVuKCkubGVuZ3RoID4gMTApCiAgICAgIGVsLmF0dHIoJ3NpemUnLCAxMCk7CiAgICBlbHNlCiAgICAgIGVsLmF0dHIoJ3NpemUnLCA0KTsKICB9Cn0KCmZ1bmN0aW9uIHNob3dUYWIobmFtZSwgdXJsKSB7CiAgJCgnI3RhYi1jb250ZW50LScgKyBuYW1lKS5wYXJlbnQoKS5maW5kKCcudGFiLWNvbnRlbnQnKS5oaWRlKCk7CiAgJCgnI3RhYi1jb250ZW50LScgKyBuYW1lKS5zaG93KCk7CiAgJCgnI3RhYi0nICsgbmFtZSkuY2xvc2VzdCgnLnRhYnMnKS5maW5kKCdhJykucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkJyk7CiAgJCgnI3RhYi0nICsgbmFtZSkuYWRkQ2xhc3MoJ3NlbGVjdGVkJyk7CgogIHJlcGxhY2VJbkhpc3RvcnkodXJsKQoKICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIHNob3dJc3N1ZUhpc3Rvcnkoam91cm5hbCwgdXJsKSB7CiAgdGFiX2NvbnRlbnQgPSAkKCcjdGFiLWNvbnRlbnQtaGlzdG9yeScpOwogIHRhYl9jb250ZW50LnBhcmVudCgpLmZpbmQoJy50YWItY29udGVudCcpLmhpZGUoKTsKICB0YWJfY29udGVudC5zaG93KCk7CiAgdGFiX2NvbnRlbnQucGFyZW50KCkuY2hpbGRyZW4oJ2Rpdi50YWJzJykuZmluZCgnYScpLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpOwoKICAkKCcjdGFiLScgKyBqb3VybmFsKS5hZGRDbGFzcygnc2VsZWN0ZWQnKTsKCiAgcmVwbGFjZUluSGlzdG9yeSh1cmwpCgogIHN3aXRjaChqb3VybmFsKSB7CiAgICBjYXNlICdub3Rlcyc6CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbDpub3QoLmhhcy1ub3RlcyknKS5oaWRlKCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC53aWtpJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAuY29udGV4dHVhbCAuam91cm5hbC1hY3Rpb25zJykuc2hvdygpOwoKICAgICAgLy8gYWx3YXlzIHNob3cgdGh1bWJuYWlscyBpbiBub3RlcyB0YWIKICAgICAgdmFyIHRodW1ibmFpbHMgPSB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAudGh1bWJuYWlscycpOwogICAgICB0aHVtYm5haWxzLnNob3coKTsKICAgICAgLy8gc2hvdyBqb3VybmFscyB3aXRob3V0IG5vdGVzLCBidXQgd2l0aCB0aHVtYm5haWxzCiAgICAgIHRodW1ibmFpbHMucGFyZW50cygnLmpvdXJuYWwnKS5zaG93KCk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAncHJvcGVydGllcyc6CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbDpub3QoLmhhcy1kZXRhaWxzKScpLmhpZGUoKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwgLndpa2knKS5oaWRlKCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC50aHVtYm5haWxzJykuaGlkZSgpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAuY29udGV4dHVhbCAuam91cm5hbC1hY3Rpb25zJykuaGlkZSgpOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAud2lraScpLnNob3coKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwgLnRodW1ibmFpbHMnKS5zaG93KCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC5jb250ZXh0dWFsIC5qb3VybmFsLWFjdGlvbnMnKS5zaG93KCk7CiAgfQoKICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIGdldFJlbW90ZVRhYihuYW1lLCByZW1vdGVfdXJsLCB1cmwsIGxvYWRfYWx3YXlzKSB7CiAgbG9hZF9hbHdheXMgPSBsb2FkX2Fsd2F5cyB8fCBmYWxzZTsKICB2YXIgdGFiX2NvbnRlbnQgPSAkKCcjdGFiLWNvbnRlbnQtJyArIG5hbWUpOwoKICB0YWJfY29udGVudC5wYXJlbnQoKS5maW5kKCcudGFiLWNvbnRlbnQnKS5oaWRlKCk7CiAgdGFiX2NvbnRlbnQucGFyZW50KCkuY2hpbGRyZW4oJ2Rpdi50YWJzJykuZmluZCgnYScpLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpOwogICQoJyN0YWItJyArIG5hbWUpLmFkZENsYXNzKCdzZWxlY3RlZCcpOwoKICByZXBsYWNlSW5IaXN0b3J5KHVybCk7CgogIGlmICh0YWJfY29udGVudC5jaGlsZHJlbigpLmxlbmd0aCA9PSAwICYmIGxvYWRfYWx3YXlzID09IGZhbHNlKSB7CiAgICAkLmFqYXgoewogICAgICB1cmw6IHJlbW90ZV91cmwsCiAgICAgIHR5cGU6ICdnZXQnLAogICAgICBzdWNjZXNzOiBmdW5jdGlvbihkYXRhKXsKICAgICAgICB0YWJfY29udGVudC5odG1sKGRhdGEpCiAgICAgIH0KICAgIH0pOwogIH0KCiAgdGFiX2NvbnRlbnQuc2hvdygpOwogIHJldHVybiBmYWxzZTsKfQoKLy9yZXBsYWNlcyBjdXJyZW50IFVSTCB3aXRoIHRoZSAiaHJlZiIgYXR0cmlidXRlIG9mIHRoZSBjdXJyZW50IGxpbmsKLy8ob25seSB0cmlnZ2VyZWQgaWYgc3VwcG9ydGVkIGJ5IGJyb3dzZXIpCmZ1bmN0aW9uIHJlcGxhY2VJbkhpc3RvcnkodXJsKSB7CiAgaWYgKCJyZXBsYWNlU3RhdGUiIGluIHdpbmRvdy5oaXN0b3J5ICYmIHVybCAhPT0gdW5kZWZpbmVkKSB7CiAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwgZG9jdW1lbnQudGl0bGUsIHVybCk7CiAgfQp9CgpmdW5jdGlvbiBtb3ZlVGFiUmlnaHQoZWwpIHsKICB2YXIgbGlzID0gJChlbCkucGFyZW50cygnZGl2LnRhYnMnKS5maXJzdCgpLmZpbmQoJ3VsJykuY2hpbGRyZW4oKTsKICB2YXIgYncgPSAkKGVsKS5wYXJlbnRzKCdkaXYudGFicy1idXR0b25zJykub3V0ZXJXaWR0aCh0cnVlKTsKICB2YXIgdGFic1dpZHRoID0gMDsKICB2YXIgaSA9IDA7CiAgbGlzLmVhY2goZnVuY3Rpb24oKSB7CiAgICBpZiAoJCh0aGlzKS5pcygnOnZpc2libGUnKSkgewogICAgICB0YWJzV2lkdGggKz0gJCh0aGlzKS5vdXRlcldpZHRoKHRydWUpOwogICAgfQogIH0pOwogIGlmICh0YWJzV2lkdGggPCAkKGVsKS5wYXJlbnRzKCdkaXYudGFicycpLmZpcnN0KCkud2lkdGgoKSAtIGJ3KSB7IHJldHVybjsgfQogICQoZWwpLnNpYmxpbmdzKCcudGFiLWxlZnQnKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICB3aGlsZSAoaTxsaXMubGVuZ3RoICYmICFsaXMuZXEoaSkuaXMoJzp2aXNpYmxlJykpIHsgaSsrOyB9CiAgdmFyIHcgPSBsaXMuZXEoaSkud2lkdGgoKTsKICBsaXMuZXEoaSkuaGlkZSgpOwogIGlmICh0YWJzV2lkdGggLSB3IDwgJChlbCkucGFyZW50cygnZGl2LnRhYnMnKS5maXJzdCgpLndpZHRoKCkgLSBidykgewogICAgJChlbCkuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7CiAgfQp9CgpmdW5jdGlvbiBtb3ZlVGFiTGVmdChlbCkgewogIHZhciBsaXMgPSAkKGVsKS5wYXJlbnRzKCdkaXYudGFicycpLmZpcnN0KCkuZmluZCgndWwnKS5jaGlsZHJlbigpOwogIHZhciBpID0gMDsKICB3aGlsZSAoaSA8IGxpcy5sZW5ndGggJiYgIWxpcy5lcShpKS5pcygnOnZpc2libGUnKSkgeyBpKys7IH0KICBpZiAoaSA+IDApIHsKICAgIGxpcy5lcShpLTEpLnNob3coKTsKICAgICQoZWwpLnNpYmxpbmdzKCcudGFiLXJpZ2h0JykucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7CiAgfQogIGlmIChpIDw9IDEpIHsKICAgICQoZWwpLmFkZENsYXNzKCdkaXNhYmxlZCcpOwogIH0KfQoKZnVuY3Rpb24gZGlzcGxheVRhYnNCdXR0b25zKCkgewogIHZhciBsaXM7CiAgdmFyIHRhYnNXaWR0aDsKICB2YXIgZWw7CiAgdmFyIG51bUhpZGRlbjsKICAkKCdkaXYudGFicycpLmVhY2goZnVuY3Rpb24oKSB7CiAgICBlbCA9ICQodGhpcyk7CiAgICBsaXMgPSBlbC5maW5kKCd1bCcpLmNoaWxkcmVuKCk7CiAgICB0YWJzV2lkdGggPSAwOwogICAgbnVtSGlkZGVuID0gMDsKICAgIGxpcy5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgIGlmICgkKHRoaXMpLmlzKCc6dmlzaWJsZScpKSB7CiAgICAgICAgdGFic1dpZHRoICs9ICQodGhpcykub3V0ZXJXaWR0aCh0cnVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBudW1IaWRkZW4rKzsKICAgICAgfQogICAgfSk7CiAgICB2YXIgYncgPSAkKGVsKS5maW5kKCdkaXYudGFicy1idXR0b25zJykub3V0ZXJXaWR0aCh0cnVlKTsKICAgIGlmICgodGFic1dpZHRoIDwgZWwud2lkdGgoKSAtIGJ3KSAmJiAobGlzLmxlbmd0aCA9PT0gMCB8fCBsaXMuZmlyc3QoKS5pcygnOnZpc2libGUnKSkpIHsKICAgICAgZWwuZmluZCgnZGl2LnRhYnMtYnV0dG9ucycpLmhpZGUoKTsKICAgIH0gZWxzZSB7CiAgICAgIGVsLmZpbmQoJ2Rpdi50YWJzLWJ1dHRvbnMnKS5zaG93KCkuY2hpbGRyZW4oJ2J1dHRvbi50YWItbGVmdCcpLnRvZ2dsZUNsYXNzKCdkaXNhYmxlZCcsIG51bUhpZGRlbiA9PSAwKTsKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gc2V0UHJlZGVjZXNzb3JGaWVsZHNWaXNpYmlsaXR5KCkgewogIHZhciByZWxhdGlvblR5cGUgPSAkKCcjcmVsYXRpb25fcmVsYXRpb25fdHlwZScpOwogIGlmIChyZWxhdGlvblR5cGUudmFsKCkgPT0gInByZWNlZGVzIiB8fCByZWxhdGlvblR5cGUudmFsKCkgPT0gImZvbGxvd3MiKSB7CiAgICAkKCcjcHJlZGVjZXNzb3JfZmllbGRzJykuc2hvdygpOwogIH0gZWxzZSB7CiAgICAkKCcjcHJlZGVjZXNzb3JfZmllbGRzJykuaGlkZSgpOwogIH0KfQoKZnVuY3Rpb24gc2hvd01vZGFsKGlkLCB3aWR0aCwgdGl0bGUpIHsKICB2YXIgZWwgPSAkKCcjJytpZCkuZmlyc3QoKTsKICBpZiAoZWwubGVuZ3RoID09PSAwIHx8IGVsLmlzKCc6dmlzaWJsZScpKSB7cmV0dXJuO30KICBpZiAoIXRpdGxlKSB0aXRsZSA9IGVsLmZpbmQoJ2gzLnRpdGxlJykudGV4dCgpOwogIC8vIG1vdmVzIGV4aXN0aW5nIG1vZGFscyBiZWhpbmQgdGhlIHRyYW5zcGFyZW50IGJhY2tncm91bmQKICAkKCIubW9kYWwiKS5jc3MoJ3pJbmRleCcsOTkpOwogIGVsLmRpYWxvZyh7CiAgICB3aWR0aDogd2lkdGgsCiAgICBtb2RhbDogdHJ1ZSwKICAgIHJlc2l6YWJsZTogZmFsc2UsCiAgICBkaWFsb2dDbGFzczogJ21vZGFsJywKICAgIHRpdGxlOiB0aXRsZQogIH0pLm9uKCdkaWFsb2djbG9zZScsIGZ1bmN0aW9uKCl7CiAgICAkKCIubW9kYWwiKS5jc3MoJ3pJbmRleCcsMTAxKTsKICB9KTsKICBlbC5maW5kKCJpbnB1dFt0eXBlPXRleHRdLCBpbnB1dFt0eXBlPXN1Ym1pdF0iKS5maXJzdCgpLmZvY3VzKCk7Cn0KCmZ1bmN0aW9uIGhpZGVNb2RhbChlbCkgewogIHZhciBtb2RhbDsKICBpZiAoZWwpIHsKICAgIG1vZGFsID0gJChlbCkucGFyZW50cygnLnVpLWRpYWxvZy1jb250ZW50Jyk7CiAgfSBlbHNlIHsKICAgIG1vZGFsID0gJCgnI2FqYXgtbW9kYWwnKTsKICB9CiAgbW9kYWwuZGlhbG9nKCJjbG9zZSIpOwp9CgpmdW5jdGlvbiBjb2xsYXBzZVNjbUVudHJ5KGlkKSB7CiAgJCgnLicraWQpLmVhY2goZnVuY3Rpb24oKSB7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnb3BlbicpKSB7CiAgICAgIGNvbGxhcHNlU2NtRW50cnkoJCh0aGlzKS5hdHRyKCdpZCcpKTsKICAgIH0KICAgICQodGhpcykuaGlkZSgpOwogIH0pOwogICQoJyMnK2lkKS5yZW1vdmVDbGFzcygnb3BlbicpOwp9CgpmdW5jdGlvbiBleHBhbmRTY21FbnRyeShpZCkgewogICQoJy4nK2lkKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgJCh0aGlzKS5zaG93KCk7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnbG9hZGVkJykgJiYgISQodGhpcykuaGFzQ2xhc3MoJ2NvbGxhcHNlZCcpKSB7CiAgICAgIGV4cGFuZFNjbUVudHJ5KCQodGhpcykuYXR0cignaWQnKSk7CiAgICB9CiAgfSk7CiAgJCgnIycraWQpLmFkZENsYXNzKCdvcGVuJyk7Cn0KCmZ1bmN0aW9uIHNjbUVudHJ5Q2xpY2soaWQsIHVybCkgewogICAgdmFyIGVsID0gJCgnIycraWQpOwoKICAgIGlmIChlbC5oYXNDbGFzcygnb3BlbicpKSB7CiAgICAgICAgY29sbGFwc2VTY21FbnRyeShpZCk7CiAgICAgICAgZWwuZmluZCgnLmV4cGFuZGVyJykuc3dpdGNoQ2xhc3MoJ2ljb24tZXhwYW5kZWQnLCAnaWNvbi1jb2xsYXBzZWQnKTsKICAgICAgICBlbC5hZGRDbGFzcygnY29sbGFwc2VkJyk7CiAgICAgICAgdXBkYXRlU1ZHSWNvbihlbC5maW5kKCcuaWNvbi1mb2xkZXInKVswXSwgJ2ZvbGRlcicpCgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0gZWxzZSBpZiAoZWwuaGFzQ2xhc3MoJ2xvYWRlZCcpKSB7CiAgICAgICAgZXhwYW5kU2NtRW50cnkoaWQpOwogICAgICAgIGVsLmZpbmQoJy5leHBhbmRlcicpLnN3aXRjaENsYXNzKCdpY29uLWNvbGxhcHNlZCcsICdpY29uLWV4cGFuZGVkJyk7CiAgICAgICAgZWwucmVtb3ZlQ2xhc3MoJ2NvbGxhcHNlZCcpOwogICAgICAgIHVwZGF0ZVNWR0ljb24oZWwuZmluZCgnLmljb24tZm9sZGVyLW9wZW4nKVswXSwgJ2ZvbGRlci1vcGVuJykKCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKGVsLmhhc0NsYXNzKCdsb2FkaW5nJykpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBlbC5hZGRDbGFzcygnbG9hZGluZycpOwogICAgJC5hamF4KHsKICAgICAgdXJsOiB1cmwsCiAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICBlbC5hZnRlcihkYXRhKTsKICAgICAgICBlbC5hZGRDbGFzcygnb3BlbicpLmFkZENsYXNzKCdsb2FkZWQnKS5yZW1vdmVDbGFzcygnbG9hZGluZycpOwogICAgICAgIHVwZGF0ZVNWR0ljb24oZWwuZmluZCgnLmljb24tZm9sZGVyJylbMF0sICdmb2xkZXItb3BlbicpCiAgICAgICAgZWwuZmluZCgnLmV4cGFuZGVyJykuc3dpdGNoQ2xhc3MoJ2ljb24tY29sbGFwc2VkJywgJ2ljb24tZXhwYW5kZWQnKTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gdHJ1ZTsKfQoKZnVuY3Rpb24gcmFuZG9tS2V5KHNpemUpIHsKICB2YXIgY2hhcnMgPSAnMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonOwogIHZhciBrZXkgPSAnJzsKICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykgewogICAga2V5ICs9IGNoYXJzLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGFycy5sZW5ndGgpKTsKICB9CiAgcmV0dXJuIGtleTsKfQoKZnVuY3Rpb24gY29weVRleHRUb0NsaXBib2FyZCh0YXJnZXQpIHsKICBpZiAodGFyZ2V0KSB7CiAgICB2YXIgdGVtcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7CiAgICB0ZW1wLnZhbHVlID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1jbGlwYm9hcmQtdGV4dCcpOwogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZW1wKTsKICAgIHRlbXAuc2VsZWN0KCk7CiAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpOwogICAgaWYgKHRlbXAucGFyZW50Tm9kZSkgewogICAgICB0ZW1wLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGVtcCk7CiAgICB9CiAgICBpZiAoJCh0YXJnZXQpLmNsb3Nlc3QoJy5kcmRuLmV4cGFuZGVkJykubGVuZ3RoKSB7CiAgICAgICQodGFyZ2V0KS5jbG9zZXN0KCcuZHJkbi5leHBhbmRlZCcpLnJlbW92ZUNsYXNzKCJleHBhbmRlZCIpOwogICAgfQogIH0KICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIHVwZGF0ZUlzc3VlRnJvbSh1cmwsIGVsKSB7CiAgJCgnI2FsbF9hdHRyaWJ1dGVzIGlucHV0LCAjYWxsX2F0dHJpYnV0ZXMgdGV4dGFyZWEsICNhbGxfYXR0cmlidXRlcyBzZWxlY3QnKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAkKHRoaXMpLmRhdGEoJ3ZhbHVlYmVmb3JldXBkYXRlJywgJCh0aGlzKS52YWwoKSk7CiAgfSk7CiAgaWYgKGVsKSB7CiAgICAkKCIjZm9ybV91cGRhdGVfdHJpZ2dlcmVkX2J5IikudmFsKCQoZWwpLmF0dHIoJ2lkJykpOwogIH0KICByZXR1cm4gJC5hamF4KHsKICAgIHVybDogdXJsLAogICAgdHlwZTogJ3Bvc3QnLAogICAgZGF0YTogJCgnI2lzc3VlLWZvcm0nKS5zZXJpYWxpemUoKQogIH0pOwp9CgpmdW5jdGlvbiByZXBsYWNlSXNzdWVGb3JtV2l0aChodG1sKXsKICB2YXIgcmVwbGFjZW1lbnQgPSAkKGh0bWwpOwogICQoJyNhbGxfYXR0cmlidXRlcyBpbnB1dCwgI2FsbF9hdHRyaWJ1dGVzIHRleHRhcmVhLCAjYWxsX2F0dHJpYnV0ZXMgc2VsZWN0JykuZWFjaChmdW5jdGlvbigpewogICAgdmFyIG9iamVjdF9pZCA9ICQodGhpcykuYXR0cignaWQnKTsKICAgIGlmIChvYmplY3RfaWQgJiYgJCh0aGlzKS5kYXRhKCd2YWx1ZWJlZm9yZXVwZGF0ZScpIT0kKHRoaXMpLnZhbCgpKSB7CiAgICAgIHJlcGxhY2VtZW50LmZpbmQoJyMnK29iamVjdF9pZCkudmFsKCQodGhpcykudmFsKCkpOwogICAgfQogIH0pOwogICQoJyNhbGxfYXR0cmlidXRlcycpLmVtcHR5KCk7CiAgJCgnI2FsbF9hdHRyaWJ1dGVzJykucHJlcGVuZChyZXBsYWNlbWVudCk7Cn0KCmZ1bmN0aW9uIHVwZGF0ZUJ1bGtFZGl0RnJvbSh1cmwpIHsKICAkLmFqYXgoewogICAgdXJsOiB1cmwsCiAgICB0eXBlOiAncG9zdCcsCiAgICBkYXRhOiAkKCcjYnVsa19lZGl0X2Zvcm0nKS5zZXJpYWxpemUoKQogIH0pOwp9CgpmdW5jdGlvbiBvYnNlcnZlQXV0b2NvbXBsZXRlRmllbGQoZmllbGRJZCwgdXJsLCBvcHRpb25zKSB7CiAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CiAgICAkKCcjJytmaWVsZElkKS5hdXRvY29tcGxldGUoJC5leHRlbmQoewogICAgICBzb3VyY2U6IHVybCwKICAgICAgbWluTGVuZ3RoOiAyLAogICAgICBwb3NpdGlvbjoge2NvbGxpc2lvbjogImZsaXBmaXQifSwKICAgICAgc2VhcmNoOiBmdW5jdGlvbigpeyQoJyMnK2ZpZWxkSWQpLmFkZENsYXNzKCdhamF4LWxvYWRpbmcnKTt9LAogICAgICByZXNwb25zZTogZnVuY3Rpb24oKXskKCcjJytmaWVsZElkKS5yZW1vdmVDbGFzcygnYWpheC1sb2FkaW5nJyk7fQogICAgfSwgb3B0aW9ucykpOwogICAgJCgnIycrZmllbGRJZCkuYWRkQ2xhc3MoJ2F1dG9jb21wbGV0ZScpOwogIH0pOwp9CgpmdW5jdGlvbiBtdWx0aXBsZUF1dG9jb21wbGV0ZUZpZWxkKGZpZWxkSWQsIHVybCwgb3B0aW9ucykgewogIGZ1bmN0aW9uIHNwbGl0KHZhbCkgewogICAgcmV0dXJuIHZhbC5zcGxpdCgvLFxzKi8pOwogIH0KCiAgZnVuY3Rpb24gZXh0cmFjdExhc3QodGVybSkgewogICAgcmV0dXJuIHNwbGl0KHRlcm0pLnBvcCgpOwogIH0KCiAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkgewogICAgJCgnIycgKyBmaWVsZElkKS5hdXRvY29tcGxldGUoJC5leHRlbmQoewogICAgICBzb3VyY2U6IGZ1bmN0aW9uIChyZXF1ZXN0LCByZXNwb25zZSkgewogICAgICAgICQuZ2V0SlNPTih1cmwsIHsKICAgICAgICAgIHRlcm06IGV4dHJhY3RMYXN0KHJlcXVlc3QudGVybSkKICAgICAgICB9LCByZXNwb25zZSk7CiAgICAgIH0sCiAgICAgIG1pbkxlbmd0aDogMiwKICAgICAgcG9zaXRpb246IHtjb2xsaXNpb246ICJmbGlwZml0In0sCiAgICAgIHNlYXJjaDogZnVuY3Rpb24gKCkgewogICAgICAgICQoJyMnICsgZmllbGRJZCkuYWRkQ2xhc3MoJ2FqYXgtbG9hZGluZycpOwogICAgICB9LAogICAgICByZXNwb25zZTogZnVuY3Rpb24gKCkgewogICAgICAgICQoJyMnICsgZmllbGRJZCkucmVtb3ZlQ2xhc3MoJ2FqYXgtbG9hZGluZycpOwogICAgICB9LAogICAgICBzZWxlY3Q6IGZ1bmN0aW9uIChldmVudCwgdWkpIHsKICAgICAgICB2YXIgdGVybXMgPSBzcGxpdCh0aGlzLnZhbHVlKTsKICAgICAgICAvLyByZW1vdmUgdGhlIGN1cnJlbnQgaW5wdXQKICAgICAgICB0ZXJtcy5wb3AoKTsKICAgICAgICAvLyBhZGQgdGhlIHNlbGVjdGVkIGl0ZW0KICAgICAgICB0ZXJtcy5wdXNoKHVpLml0ZW0udmFsdWUpOwogICAgICAgIC8vIGFkZCBwbGFjZWhvbGRlciB0byBnZXQgdGhlIGNvbW1hLWFuZC1zcGFjZSBhdCB0aGUgZW5kCiAgICAgICAgdGVybXMucHVzaCgiIik7CiAgICAgICAgdGhpcy52YWx1ZSA9IHRlcm1zLmpvaW4oIiwgIik7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9LCBvcHRpb25zKSk7CiAgICAkKCcjJyArIGZpZWxkSWQpLmFkZENsYXNzKCdhdXRvY29tcGxldGUnKTsKICB9KTsKfQoKZnVuY3Rpb24gb2JzZXJ2ZVNlYXJjaGZpZWxkKGZpZWxkSWQsIHRhcmdldElkLCB1cmwpIHsKICAkKCcjJytmaWVsZElkKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgdmFyICR0aGlzID0gJCh0aGlzKTsKICAgICR0aGlzLmFkZENsYXNzKCdhdXRvY29tcGxldGUnKTsKICAgICR0aGlzLmF0dHIoJ2RhdGEtdmFsdWUtd2FzJywgJHRoaXMudmFsKCkpOwogICAgdmFyIGNoZWNrID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciB2YWwgPSAkdGhpcy52YWwoKTsKICAgICAgaWYgKCR0aGlzLmF0dHIoJ2RhdGEtdmFsdWUtd2FzJykgIT0gdmFsKXsKICAgICAgICAkdGhpcy5hdHRyKCdkYXRhLXZhbHVlLXdhcycsIHZhbCk7CiAgICAgICAgJC5hamF4KHsKICAgICAgICAgIHVybDogdXJsLAogICAgICAgICAgdHlwZTogJ2dldCcsCiAgICAgICAgICBkYXRhOiB7cTogJHRoaXMudmFsKCl9LAogICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSl7IGlmKHRhcmdldElkKSAkKCcjJyt0YXJnZXRJZCkuaHRtbChkYXRhKTsgfSwKICAgICAgICAgIGJlZm9yZVNlbmQ6IGZ1bmN0aW9uKCl7ICR0aGlzLmFkZENsYXNzKCdhamF4LWxvYWRpbmcnKTsgfSwKICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpeyAkdGhpcy5yZW1vdmVDbGFzcygnYWpheC1sb2FkaW5nJyk7IH0KICAgICAgICB9KTsKICAgICAgfQogICAgfTsKICAgIHZhciByZXNldCA9IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGltZXIpIHsKICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsKICAgICAgICB0aW1lciA9IHNldEludGVydmFsKGNoZWNrLCAzMDApOwogICAgICB9CiAgICB9OwogICAgdmFyIHRpbWVyID0gc2V0SW50ZXJ2YWwoY2hlY2ssIDMwMCk7CiAgICAkdGhpcy5iaW5kKCdrZXl1cCBjbGljayBtb3VzZW1vdmUnLCByZXNldCk7CiAgfSk7Cn0KCiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCl7CiAgJCgiLmRyZG4gLmF1dG9jb21wbGV0ZSIpLnZhbCgnJyk7CgogIC8vIFRoaXMgdmFyaWFibGUgaXMgdXNlZCB0byBmb2N1cyBzZWxlY3RlZCBwcm9qZWN0CiAgdmFyIHNlbGVjdGVkOwogICQoZG9jdW1lbnQpLm9uKCdjbGljaycsICcuZHJkbi10cmlnZ2VyJywgZnVuY3Rpb24oZSl7CiAgICB2YXIgZHJkbiA9ICQodGhpcykuY2xvc2VzdCgiLmRyZG4iKTsKICAgIGlmIChkcmRuLmhhc0NsYXNzKCJleHBhbmRlZCIpKSB7CiAgICAgIGRyZG4ucmVtb3ZlQ2xhc3MoImV4cGFuZGVkIik7CiAgICB9IGVsc2UgewogICAgICAkKCIuZHJkbiIpLnJlbW92ZUNsYXNzKCJleHBhbmRlZCIpOwogICAgICBkcmRuLmFkZENsYXNzKCJleHBhbmRlZCIpOwogICAgICBpZiAoJCh0aGlzKS5wYXJlbnQoJyNwcm9qZWN0LWp1bXAnKS5sZW5ndGgpIHsKICAgICAgICBzZWxlY3RlZCA9ICQoJy5kcmRuLWl0ZW1zIGEuc2VsZWN0ZWQnKTsgLy8gU3RvcmUgc2VsZWN0ZWQgcHJvamVjdAogICAgICAgIHNlbGVjdGVkLmZvY3VzKCk7IC8vIENhbGxpbmcgZm9jdXMgdG8gc2Nyb2xsIHRvIHNlbGVjdGVkIHByb2plY3QKICAgICAgfQogICAgICBpZiAoIWlzTW9iaWxlKCkpIHsKICAgICAgICBkcmRuLmZpbmQoIi5hdXRvY29tcGxldGUiKS5mb2N1cygpOwogICAgICB9CiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICB9CiAgfSk7CiAgJChkb2N1bWVudCkuY2xpY2soZnVuY3Rpb24oZSl7CiAgICBpZiAoJChlLnRhcmdldCkuY2xvc2VzdCgiLmRyZG4iKS5sZW5ndGggPCAxKSB7CiAgICAgICQoIi5kcmRuLmV4cGFuZGVkIikucmVtb3ZlQ2xhc3MoImV4cGFuZGVkIik7CiAgICB9CiAgfSk7CgogIG9ic2VydmVTZWFyY2hmaWVsZCgncHJvamVjdHMtcXVpY2stc2VhcmNoJywgbnVsbCwgJCgnI3Byb2plY3RzLXF1aWNrLXNlYXJjaCcpLmRhdGEoJ2F1dG9tY29tcGxldGUtdXJsJykpOwoKICAkKCIuZHJkbi1jb250ZW50Iikua2V5ZG93bihmdW5jdGlvbihldmVudCl7CiAgICB2YXIgaXRlbXMgPSAkKHRoaXMpLmZpbmQoIi5kcmRuLWl0ZW1zIik7CgogICAgLy8gSWYgYSBwcm9qZWN0IGlzIHNlbGVjdGVkIHNldCBmb2N1c2VkIHRvIHNlbGVjdGVkIG9ubHkgb25jZQogICAgaWYgKHNlbGVjdGVkICYmIHNlbGVjdGVkLmxlbmd0aCA+IDApIHsKICAgICAgdmFyIGZvY3VzZWQgPSBzZWxlY3RlZDsKICAgICAgc2VsZWN0ZWQgPSB1bmRlZmluZWQ7CiAgICB9CiAgICBlbHNlIHsKICAgICAgdmFyIGZvY3VzZWQgPSBpdGVtcy5maW5kKCJhOmZvY3VzIik7CiAgICB9CiAgICBzd2l0Y2ggKGV2ZW50LndoaWNoKSB7CiAgICBjYXNlIDQwOiAvL2Rvd24KICAgICAgaWYgKGZvY3VzZWQubGVuZ3RoID4gMCkgewogICAgICAgIGZvY3VzZWQubmV4dEFsbCgiYSIpLmZpcnN0KCkuZm9jdXMoKTs7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaXRlbXMuZmluZCgiYSIpLmZpcnN0KCkuZm9jdXMoKTs7CiAgICAgIH0KICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDM4OiAvL3VwCiAgICAgIGlmIChmb2N1c2VkLmxlbmd0aCA+IDApIHsKICAgICAgICB2YXIgcHJldiA9IGZvY3VzZWQucHJldkFsbCgiYSIpOwogICAgICAgIGlmIChwcmV2Lmxlbmd0aCA+IDApIHsKICAgICAgICAgIHByZXYuZmlyc3QoKS5mb2N1cygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAkKHRoaXMpLmZpbmQoIi5hdXRvY29tcGxldGUiKS5mb2N1cygpOwogICAgICAgIH0KICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSAzNTogLy9lbmQKICAgICAgaWYgKGZvY3VzZWQubGVuZ3RoID4gMCkgewogICAgICAgIGZvY3VzZWQubmV4dEFsbCgiYSIpLmxhc3QoKS5mb2N1cygpOwogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlIDM2OiAvL2hvbWUKICAgICAgaWYgKGZvY3VzZWQubGVuZ3RoID4gMCkgewogICAgICAgIGZvY3VzZWQucHJldkFsbCgiYSIpLmxhc3QoKS5mb2N1cygpOwogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICB9CiAgfSk7Cn0pOwoKZnVuY3Rpb24gYmVmb3JlU2hvd0RhdGVQaWNrZXIoaW5wdXQsIGluc3QpIHsKICB2YXIgZGVmYXVsdF9kYXRlID0gbnVsbDsKICBzd2l0Y2ggKCQoaW5wdXQpLmF0dHIoImlkIikpIHsKICAgIGNhc2UgImlzc3VlX3N0YXJ0X2RhdGUiIDoKICAgICAgaWYgKCQoIiNpc3N1ZV9kdWVfZGF0ZSIpLmxlbmd0aCA+IDApIHsKICAgICAgICBkZWZhdWx0X2RhdGUgPSAkKCIjaXNzdWVfZHVlX2RhdGUiKS52YWwoKTsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgImlzc3VlX2R1ZV9kYXRlIiA6CiAgICAgIGlmICgkKCIjaXNzdWVfc3RhcnRfZGF0ZSIpLmxlbmd0aCA+IDApIHsKICAgICAgICB2YXIgc3RhcnRfZGF0ZSA9ICQoIiNpc3N1ZV9zdGFydF9kYXRlIikudmFsKCk7CiAgICAgICAgaWYgKHN0YXJ0X2RhdGUgIT0gIiIpIHsKICAgICAgICAgIHN0YXJ0X2RhdGUgPSBuZXcgRGF0ZShEYXRlLnBhcnNlKHN0YXJ0X2RhdGUpKTsKICAgICAgICAgIGlmIChzdGFydF9kYXRlID4gbmV3IERhdGUoKSkgewogICAgICAgICAgICBkZWZhdWx0X2RhdGUgPSAkKCIjaXNzdWVfc3RhcnRfZGF0ZSIpLnZhbCgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBicmVhazsKICB9CiAgJChpbnB1dCkuZGF0ZXBpY2tlckZhbGxiYWNrKCJvcHRpb24iLCAiZGVmYXVsdERhdGUiLCBkZWZhdWx0X2RhdGUpOwp9CgooZnVuY3Rpb24oJCl7CiAgJC5mbi5wb3NpdGlvbmVkSXRlbXMgPSBmdW5jdGlvbihzb3J0YWJsZU9wdGlvbnMsIG9wdGlvbnMpewogICAgdmFyIHNldHRpbmdzID0gJC5leHRlbmQoewogICAgICBmaXJzdFBvc2l0aW9uOiAxCiAgICB9LCBvcHRpb25zICk7CgogICAgcmV0dXJuIHRoaXMuc29ydGFibGUoJC5leHRlbmQoewogICAgICBheGlzOiAneScsCiAgICAgIGhhbmRsZTogIi5zb3J0LWhhbmRsZSIsCiAgICAgIGhlbHBlcjogZnVuY3Rpb24oZXZlbnQsIHVpKXsKICAgICAgICB1aS5jaGlsZHJlbigndGQnKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgICAgICAkKHRoaXMpLndpZHRoKCQodGhpcykud2lkdGgoKSk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHVpOwogICAgICB9LAogICAgICB1cGRhdGU6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgewogICAgICAgIHZhciBzb3J0YWJsZSA9ICQodGhpcyk7CiAgICAgICAgdmFyIGhhbmRsZSA9IHVpLml0ZW0uZmluZCgiLnNvcnQtaGFuZGxlIikuYWRkQ2xhc3MoImFqYXgtbG9hZGluZyIpOwogICAgICAgIHZhciB1cmwgPSBoYW5kbGUuZGF0YSgicmVvcmRlci11cmwiKTsKICAgICAgICB2YXIgcGFyYW0gPSBoYW5kbGUuZGF0YSgicmVvcmRlci1wYXJhbSIpOwogICAgICAgIHZhciBkYXRhID0ge307CiAgICAgICAgZGF0YVtwYXJhbV0gPSB7cG9zaXRpb246IHVpLml0ZW0uaW5kZXgoKSArIHNldHRpbmdzWydmaXJzdFBvc2l0aW9uJ119OwogICAgICAgICQuYWpheCh7CiAgICAgICAgICB1cmw6IHVybCwKICAgICAgICAgIHR5cGU6ICdwdXQnLAogICAgICAgICAgZGF0YVR5cGU6ICdzY3JpcHQnLAogICAgICAgICAgZGF0YTogZGF0YSwKICAgICAgICAgIGVycm9yOiBmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pewogICAgICAgICAgICBhbGVydChqcVhIUi5zdGF0dXMpOwogICAgICAgICAgICBzb3J0YWJsZS5zb3J0YWJsZSgiY2FuY2VsIik7CiAgICAgICAgICB9LAogICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bil7CiAgICAgICAgICAgIGhhbmRsZS5yZW1vdmVDbGFzcygiYWpheC1sb2FkaW5nIik7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0sCiAgICB9LCBzb3J0YWJsZU9wdGlvbnMpKTsKICB9Cn0oIGpRdWVyeSApKTsKCnZhciB3YXJuTGVhdmluZ1Vuc2F2ZWRNZXNzYWdlOwpmdW5jdGlvbiB3YXJuTGVhdmluZ1Vuc2F2ZWQobWVzc2FnZSkgewogIHdhcm5MZWF2aW5nVW5zYXZlZE1lc3NhZ2UgPSBtZXNzYWdlOwogICQoZG9jdW1lbnQpLm9uKCdzdWJtaXQnLCAnZm9ybScsIGZ1bmN0aW9uKCl7CiAgICAkKCd0ZXh0YXJlYScpLnJlbW92ZURhdGEoJ2NoYW5nZWQnKTsKICB9KTsKICAkKGRvY3VtZW50KS5vbignY2hhbmdlJywgJ3RleHRhcmVhJywgZnVuY3Rpb24oKXsKICAgICQodGhpcykuZGF0YSgnY2hhbmdlZCcsICdjaGFuZ2VkJyk7CiAgfSk7CiAgd2luZG93Lm9uYmVmb3JldW5sb2FkID0gZnVuY3Rpb24oKXsKICAgIHZhciB3YXJuID0gZmFsc2U7CiAgICAkKCd0ZXh0YXJlYScpLmJsdXIoKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgIGlmICgkKHRoaXMpLmRhdGEoJ2NoYW5nZWQnKSkgewogICAgICAgIHdhcm4gPSB0cnVlOwogICAgICB9CiAgICB9KTsKICAgIGlmICh3YXJuKSB7cmV0dXJuIHdhcm5MZWF2aW5nVW5zYXZlZE1lc3NhZ2U7fQogIH07Cn0KCmZ1bmN0aW9uIHNldHVwQWpheEluZGljYXRvcigpIHsKICAkKGRvY3VtZW50KS5iaW5kKCdhamF4U2VuZCcsIGZ1bmN0aW9uKGV2ZW50LCB4aHIsIHNldHRpbmdzKSB7CiAgICBpZiAoJCgnLmFqYXgtbG9hZGluZycpLmxlbmd0aCA9PT0gMCAmJiBzZXR0aW5ncy5jb250ZW50VHlwZSAhPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJykgewogICAgICAkKCcjYWpheC1pbmRpY2F0b3InKS5zaG93KCk7CiAgICB9CiAgfSk7CiAgJChkb2N1bWVudCkuYmluZCgnYWpheFN0b3AnLCBmdW5jdGlvbigpIHsKICAgICQoJyNhamF4LWluZGljYXRvcicpLmhpZGUoKTsKICB9KTsKfQoKZnVuY3Rpb24gc2V0dXBUYWJzKCkgewogIGlmKCQoJy50YWJzJykubGVuZ3RoID4gMCkgewogICAgZGlzcGxheVRhYnNCdXR0b25zKCk7CiAgICAkKHdpbmRvdykucmVzaXplKGRpc3BsYXlUYWJzQnV0dG9ucyk7CiAgfQp9CgpmdW5jdGlvbiBzZXR1cEZpbGVQcmV2aWV3TmF2aWdhdGlvbigpIHsKICAvLyBvbmx5IGJpbmQgYXJyb3cga2V5cyB3aGVuIHByZXZpZXcgbmF2aWdhdGlvbiBpcyBwcmVzZW50CiAgY29uc3QgZWxlbWVudCA9ICQoJy5wYWdpbmF0aW9uLmZpbGVwcmV2aWV3JykuZmlyc3QoKTsKICBpZiAoZWxlbWVudCkgewoKICAgIGNvbnN0IGhhbmRsZUFycm93S2V5ID0gZnVuY3Rpb24oc2VsZWN0b3IsIGUpewogICAgICBjb25zdCBocmVmID0gJChlbGVtZW50KS5maW5kKHNlbGVjdG9yKS5hdHRyKCdocmVmJyk7CiAgICAgIGlmIChocmVmKSB7CiAgICAgICAgd2luZG93LmxvY2F0aW9uID0gaHJlZjsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIH0KICAgIH07CgogICAgJChkb2N1bWVudCkua2V5ZG93bihmdW5jdGlvbihlKSB7CiAgICAgIGlmKGUuc2hpZnRLZXkgfHwgZS5tZXRhS2V5IHx8IGUuY3RybEtleSB8fCBlLmFsdEtleSkgcmV0dXJuOwogICAgICBzd2l0Y2goZS5rZXkpIHsKICAgICAgICBjYXNlICdBcnJvd0xlZnQnOgogICAgICAgICAgaGFuZGxlQXJyb3dLZXkoJy5wcmV2aW91cyBhJywgZSk7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnQXJyb3dSaWdodCc6CiAgICAgICAgICBoYW5kbGVBcnJvd0tleSgnLm5leHQgYScsIGUpOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0pOwogIH0KfQoKJChkb2N1bWVudCkub24oJ2tleWRvd24nLCAnZm9ybSB0ZXh0YXJlYScsIGZ1bmN0aW9uKGUpIHsKICAvLyBTdWJtaXQgdGhlIGZvcm0gd2l0aCBDdHJsICsgRW50ZXIgb3IgQ29tbWFuZCArIFJldHVybgogIHZhciB0YXJnZXRGb3JtID0gJChlLnRhcmdldCkuY2xvc2VzdCgnZm9ybScpOwogIGlmKGUua2V5Q29kZSA9PSAxMyAmJiAoKGUuY3RybEtleSAmJiAhZS5tZXRhS2V5KSB8fCAoIWUuY3RybEtleSAmJiBlLm1ldGFLZXkpICYmIHRhcmdldEZvcm0ubGVuZ3RoKSkgewogICAgLy8gRm9yIGFqYXgsIHVzZSBjbGljaygpIGluc3RlYWQgb2Ygc3VibWl0KCkgdG8gcHJldmVudCAiSW52YWxpZCBmb3JtIGF1dGhlbnRpY2l0eSB0b2tlbiIgZXJyb3IKICAgIGlmICh0YXJnZXRGb3JtLmF0dHIoJ2RhdGEtcmVtb3RlJykgPT0gJ3RydWUnKSB7CiAgICAgIGlmICh0YXJnZXRGb3JtLmZpbmQoJ2lucHV0W3R5cGU9c3VibWl0XScpLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gZmFsc2U7IH0KICAgICAgdGFyZ2V0Rm9ybS5maW5kKCd0ZXh0YXJlYScpLmJsdXIoKS5yZW1vdmVEYXRhKCdjaGFuZ2VkJyk7CiAgICAgIHRhcmdldEZvcm0uZmluZCgnaW5wdXRbdHlwZT1zdWJtaXRdJykuZmlyc3QoKS5jbGljaygpOwogICAgfSBlbHNlIHsKICAgICAgdGFyZ2V0Rm9ybS5maW5kKCd0ZXh0YXJlYScpLmJsdXIoKS5yZW1vdmVEYXRhKCdjaGFuZ2VkJyk7CiAgICAgIHRhcmdldEZvcm0uc3VibWl0KCk7CiAgICB9CiAgfQp9KTsKCgpmdW5jdGlvbiBoaWRlT25Mb2FkKCkgewogICQoJy5ob2wnKS5oaWRlKCk7Cn0KCmZ1bmN0aW9uIGFkZEZvcm1PYnNlcnZlcnNGb3JEb3VibGVTdWJtaXQoKSB7CiAgJCgnZm9ybVttZXRob2Q9cG9zdF0nKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgaWYgKCEkKHRoaXMpLmhhc0NsYXNzKCdtdWx0aXBsZS1zdWJtaXQnKSkgewogICAgICAkKHRoaXMpLnN1Ym1pdChmdW5jdGlvbihmb3JtX3N1Ym1pc3Npb24pIHsKICAgICAgICBpZiAoJChmb3JtX3N1Ym1pc3Npb24udGFyZ2V0KS5hdHRyKCdkYXRhLXN1Ym1pdHRlZCcpKSB7CiAgICAgICAgICBmb3JtX3N1Ym1pc3Npb24ucHJldmVudERlZmF1bHQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgJChmb3JtX3N1Ym1pc3Npb24udGFyZ2V0KS5hdHRyKCdkYXRhLXN1Ym1pdHRlZCcsIHRydWUpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIGRlZmF1bHRGb2N1cygpewogIGlmICgoJCgnI2NvbnRlbnQgOmZvY3VzJykubGVuZ3RoID09IDApICYmICh3aW5kb3cubG9jYXRpb24uaGFzaCA9PSAnJykpIHsKICAgICQoJyNjb250ZW50IGlucHV0W3R5cGU9dGV4dF06dmlzaWJsZSwgI2NvbnRlbnQgdGV4dGFyZWE6dmlzaWJsZScpLmZpcnN0KCkuZm9jdXMoKTsKICB9Cn0KCmZ1bmN0aW9uIGJsb2NrRXZlbnRQcm9wYWdhdGlvbihldmVudCkgewogIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7Cn0KCmZ1bmN0aW9uIHRvZ2dsZURpc2FibGVkT25DaGFuZ2UoKSB7CiAgdmFyIGNoZWNrZWQgPSAkKHRoaXMpLmlzKCc6Y2hlY2tlZCcpOwogICQoJCh0aGlzKS5kYXRhKCdkaXNhYmxlcycpKS5hdHRyKCdkaXNhYmxlZCcsIGNoZWNrZWQpOwogICQoJCh0aGlzKS5kYXRhKCdlbmFibGVzJykpLmF0dHIoJ2Rpc2FibGVkJywgIWNoZWNrZWQpOwogICQoJCh0aGlzKS5kYXRhKCdzaG93cycpKS50b2dnbGUoY2hlY2tlZCk7Cn0KZnVuY3Rpb24gdG9nZ2xlRGlzYWJsZWRJbml0KCkgewogICQoJ2lucHV0W2RhdGEtZGlzYWJsZXNdLCBpbnB1dFtkYXRhLWVuYWJsZXNdLCBpbnB1dFtkYXRhLXNob3dzXScpLmVhY2godG9nZ2xlRGlzYWJsZWRPbkNoYW5nZSk7Cn0KZnVuY3Rpb24gdG9nZ2xlTXVsdGlTZWxlY3RJY29uSW5pdCgpIHsKICAkKCcudG9nZ2xlLW11bHRpc2VsZWN0Om5vdCguaWNvbi10b2dnbGUtbWludXMpOm5vdCguaWNvbi10b2dnbGUtcGx1cyknKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICBsZXQgaWNvblR5cGU7CiAgICBpZiAoJCh0aGlzKS5zaWJsaW5ncygnc2VsZWN0JykuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykubGVuZ3RoID4gMSkgewogICAgICBpY29uVHlwZSA9ICd0b2dnbGUtbWludXMnOwogICAgfSBlbHNlIHsKICAgICAgaWNvblR5cGUgPSAndG9nZ2xlLXBsdXMnOwogICAgfQoKICAgICQodGhpcykuYWRkQ2xhc3MoYGljb24tJHtpY29uVHlwZX1gKTsKICAgIHVwZGF0ZVNWR0ljb24oJCh0aGlzKS5maW5kKCdzdmcnKVswXSwgaWNvblR5cGUpOwogIH0pOwp9CgpmdW5jdGlvbiB0b2dnbGVOZXdPYmplY3REcm9wZG93bigpIHsKICB2YXIgZHJvcGRvd24gPSAkKCcjbmV3LW9iamVjdCArIHVsLm1lbnUtY2hpbGRyZW4nKTsKICBpZihkcm9wZG93bi5oYXNDbGFzcygndmlzaWJsZScpKXsKICAgIGRyb3Bkb3duLnJlbW92ZUNsYXNzKCd2aXNpYmxlJyk7CiAgfWVsc2V7CiAgICBkcm9wZG93bi5hZGRDbGFzcygndmlzaWJsZScpOwogIH0KfQoKKGZ1bmN0aW9uICggJCApIHsKCiAgLy8gZGV0ZWN0IGlmIG5hdGl2ZSBkYXRlIGlucHV0IGlzIHN1cHBvcnRlZAogIHZhciBuYXRpdmVEYXRlSW5wdXRTdXBwb3J0ZWQgPSB0cnVlOwoKICB2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpOwogIGlucHV0LnNldEF0dHJpYnV0ZSgndHlwZScsJ2RhdGUnKTsKICBpZiAoaW5wdXQudHlwZSA9PT0gJ3RleHQnKSB7CiAgICBuYXRpdmVEYXRlSW5wdXRTdXBwb3J0ZWQgPSBmYWxzZTsKICB9CgogIHZhciBub3RBRGF0ZVZhbHVlID0gJ25vdC1hLWRhdGUnOwogIGlucHV0LnNldEF0dHJpYnV0ZSgndmFsdWUnLCBub3RBRGF0ZVZhbHVlKTsKICBpZiAoaW5wdXQudmFsdWUgPT09IG5vdEFEYXRlVmFsdWUpIHsKICAgIG5hdGl2ZURhdGVJbnB1dFN1cHBvcnRlZCA9IGZhbHNlOwogIH0KCiAgJC5mbi5kYXRlcGlja2VyRmFsbGJhY2sgPSBmdW5jdGlvbiggb3B0aW9ucyApIHsKICAgIGlmIChuYXRpdmVEYXRlSW5wdXRTdXBwb3J0ZWQpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gdGhpcy5kYXRlcGlja2VyKCBvcHRpb25zICk7CiAgICB9CiAgfTsKfSggalF1ZXJ5ICkpOwoKJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKXsKICAkKCcjY29udGVudCcpLm9uKCdjaGFuZ2UnLCAnaW5wdXRbZGF0YS1kaXNhYmxlc10sIGlucHV0W2RhdGEtZW5hYmxlc10sIGlucHV0W2RhdGEtc2hvd3NdJywgdG9nZ2xlRGlzYWJsZWRPbkNoYW5nZSk7CiAgdG9nZ2xlRGlzYWJsZWRJbml0KCk7CgogICQoJyNjb250ZW50Jykub24oJ2NsaWNrJywgJy50b2dnbGUtbXVsdGlzZWxlY3QnLCBmdW5jdGlvbigpIHsKICAgIHRvZ2dsZU11bHRpU2VsZWN0KCQodGhpcykuc2libGluZ3MoJ3NlbGVjdCcpKTsKICAgICQodGhpcykudG9nZ2xlQ2xhc3MoJ2ljb24tdG9nZ2xlLXBsdXMgaWNvbi10b2dnbGUtbWludXMnKTsKICAgIHVwZGF0ZVNWR0ljb24oJCh0aGlzKS5maW5kKCdzdmcnKVswXSwgJCh0aGlzKS5oYXNDbGFzcygnaWNvbi10b2dnbGUtcGx1cycpID8gJ3RvZ2dsZS1wbHVzJyA6ICd0b2dnbGUtbWludXMnKTsKICB9KTsKICB0b2dnbGVNdWx0aVNlbGVjdEljb25Jbml0KCk7CgogICQoJyNoaXN0b3J5IC50YWJzJykub24oJ2NsaWNrJywgJ2EnLCBmdW5jdGlvbihlKXsKICAgIHZhciB0YWIgPSAkKGUudGFyZ2V0KS5hdHRyKCdpZCcpLnJlcGxhY2UoJ3RhYi0nLCcnKTsKICAgIGRvY3VtZW50LmNvb2tpZSA9ICdoaXN0b3J5X2xhc3RfdGFiPScgKyB0YWIgKyAnOyBTYW1lU2l0ZT1MYXgnCiAgfSk7Cn0pOwoKJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKXsKICAkKCcjY29udGVudCcpLm9uKCdjbGljaycsICdkaXYuanN0VGFicyBhLnRhYi1wcmV2aWV3JywgZnVuY3Rpb24oZXZlbnQpewogICAgdmFyIHRhYiA9ICQoZXZlbnQudGFyZ2V0KTsKCiAgICB2YXIgdXJsID0gdGFiLmRhdGEoJ3VybCcpOwogICAgdmFyIGZvcm0gPSB0YWIucGFyZW50cygnZm9ybScpOwogICAgdmFyIGpzdEJsb2NrID0gdGFiLnBhcmVudHMoJy5qc3RCbG9jaycpOwoKICAgIHZhciBlbGVtZW50ID0gZW5jb2RlVVJJQ29tcG9uZW50KGpzdEJsb2NrLmZpbmQoJy53aWtpLWVkaXQnKS52YWwoKSk7CiAgICB2YXIgYXR0YWNobWVudHMgPSBmb3JtLmZpbmQoJy5hdHRhY2htZW50c19maWVsZHMgaW5wdXQnKS5zZXJpYWxpemUoKTsKCiAgICAkLmFqYXgoewogICAgICB1cmw6IHVybCwKICAgICAgdHlwZTogJ3Bvc3QnLAogICAgICBkYXRhOiAidGV4dD0iICsgZWxlbWVudCArICcmJyArIGF0dGFjaG1lbnRzLAogICAgICBzdWNjZXNzOiBmdW5jdGlvbihkYXRhKXsKICAgICAgICBqc3RCbG9jay5maW5kKCcud2lraS1wcmV2aWV3JykuaHRtbChkYXRhKTsKICAgICAgICBzZXR1cFdpa2lUYWJsZVNvcnRhYmxlSGVhZGVyKCk7CiAgICAgIH0KICAgIH0pOwogIH0pOwp9KTsKCmZ1bmN0aW9uIGtlZXBBbmNob3JPblNpZ25Jbihmb3JtKXsKICB2YXIgaGFzaCA9IGRlY29kZVVSSUNvbXBvbmVudChzZWxmLmRvY3VtZW50LmxvY2F0aW9uLmhhc2gpOwogIGlmIChoYXNoKSB7CiAgICBpZiAoaGFzaC5pbmRleE9mKCIjIikgPT09IC0xKSB7CiAgICAgIGhhc2ggPSAiIyIgKyBoYXNoOwogICAgfQogICAgZm9ybS5hY3Rpb24gPSBmb3JtLmFjdGlvbiArIGhhc2g7CiAgfQogIHJldHVybiB0cnVlOwp9CgokKGZ1bmN0aW9uICgkKSB7CiAgJCgnI2F1dGhfc291cmNlX2xkYXBfbW9kZScpLmNoYW5nZShmdW5jdGlvbiAoKSB7CiAgICAkKCcubGRhcHNfd2FybmluZycpLnRvZ2dsZSgkKHRoaXMpLnZhbCgpICE9ICdsZGFwc192ZXJpZnlfcGVlcicpOwogIH0pLmNoYW5nZSgpOwp9KTsKCmZ1bmN0aW9uIHNldEZpbGVjb250ZW50Q29udGFpbmVySGVpZ2h0KCkgewogIHZhciAkZmlsZWNvbnRhaW5lciA9ICQoJy5maWxlY29udGVudC1jb250YWluZXInKTsKICB2YXIgZmlsZVR5cGVTZWxlY3RvcnMgPSBbJy5pbWFnZScsICd2aWRlbyddOwoKICBpZigkZmlsZWNvbnRhaW5lci5sZW5ndGggPiAwICYmICRmaWxlY29udGFpbmVyLmZpbmQoZmlsZVR5cGVTZWxlY3RvcnMuam9pbignLCcpKS5sZW5ndGggPT09IDEpIHsKICAgIHZhciBjb250YWluZXJPZmZzZXRUb3AgPSAkZmlsZWNvbnRhaW5lci5vZmZzZXQoKS50b3A7CiAgICB2YXIgY29udGFpbmVyTWFyZ2luQm90dG9tID0gcGFyc2VJbnQoJGZpbGVjb250YWluZXIuY3NzKCdtYXJnaW5Cb3R0b20nKSk7CiAgICB2YXIgcGFnaW5hdGlvbkhlaWdodCA9ICRmaWxlY29udGFpbmVyLm5leHQoJy5wYWdpbmF0aW9uJykuaGVpZ2h0KCk7CiAgICB2YXIgZGlmZiA9IGNvbnRhaW5lck9mZnNldFRvcCArIGNvbnRhaW5lck1hcmdpbkJvdHRvbSArIHBhZ2luYXRpb25IZWlnaHQ7CgogICAgJGZpbGVjb250YWluZXIuY3NzKCdoZWlnaHQnLCAnY2FsYygxMDB2aCAtICcgKyBkaWZmICsgJ3B4KScpCiAgfQp9CgpmdW5jdGlvbiBzZXR1cEF0dGFjaG1lbnREZXRhaWwoKSB7CiAgc2V0RmlsZWNvbnRlbnRDb250YWluZXJIZWlnaHQoKTsKICAkKHdpbmRvdykucmVzaXplKHNldEZpbGVjb250ZW50Q29udGFpbmVySGVpZ2h0KTsKfQoKZnVuY3Rpb24gc2V0dXBXaWtpVGFibGVTb3J0YWJsZUhlYWRlcigpIHsKICAkKCdkaXYud2lraSB0YWJsZScpLmVhY2goZnVuY3Rpb24oaSwgdGFibGUpewogICAgaWYgKHRhYmxlLnJvd3MubGVuZ3RoIDwgMykgcmV0dXJuIHRydWU7CiAgICB2YXIgdHIgPSAkKHRhYmxlLnJvd3MpLmZpcnN0KCk7CiAgICBpZiAodHIuZmluZCgiVEgiKS5sZW5ndGggPiAwKSB7CiAgICAgIHRyLmF0dHIoJ2RhdGEtc29ydC1tZXRob2QnLCAnbm9uZScpOwogICAgICB0ci5maW5kKCJURCIpLmF0dHIoJ2RhdGEtc29ydC1tZXRob2QnLCAnbm9uZScpOwogICAgICBuZXcgVGFibGVzb3J0KHRhYmxlKTsKICAgIH0KICB9KTsKfQoKJChmdW5jdGlvbiAoKSB7CiAgJCgiW3RpdGxlXTpub3QoLm5vLXRvb2x0aXApIikudG9vbHRpcCh7CiAgICBzaG93OiB7CiAgICAgIGRlbGF5OiA0MDAKICAgIH0sCiAgICBwb3NpdGlvbjogewogICAgICBteTogImNlbnRlciBib3R0b20tNSIsCiAgICAgIGF0OiAiY2VudGVyIHRvcCIKICAgIH0KICB9KTsKfSk7CgpmdW5jdGlvbiBpbmxpbmVBdXRvQ29tcGxldGUoZWxlbWVudCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIGRvIG5vdCBhdHRhY2ggaWYgVHJpYnV0ZSBpcyBhbHJlYWR5IGluaXRpYWxpemVkCiAgICBpZiAoZWxlbWVudC5kYXRhc2V0LnRyaWJ1dGUgPT09ICd0cnVlJykge3JldHVybn07CgogICAgY29uc3QgZ2V0RGF0YVNvdXJjZSA9IGZ1bmN0aW9uKGVudGl0eSkgewogICAgICBjb25zdCBkYXRhU291cmNlcyA9IHJtLkF1dG9Db21wbGV0ZS5kYXRhU291cmNlczsKCiAgICAgIGlmIChkYXRhU291cmNlc1tlbnRpdHldKSB7CiAgICAgICAgcmV0dXJuIGRhdGFTb3VyY2VzW2VudGl0eV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CgogICAgY29uc3QgcmVtb3RlU2VhcmNoID0gZnVuY3Rpb24odXJsLCBjYikgewogICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpCiAgICAgIHsKICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDQpIHsKICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgdmFyIGRhdGEgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpOwogICAgICAgICAgICBjYihkYXRhKTsKICAgICAgICAgIH0gZWxzZSBpZiAoeGhyLnN0YXR1cyA9PT0gNDAzKSB7CiAgICAgICAgICAgIGNiKFtdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH07CiAgICAgIHhoci5vcGVuKCJHRVQiLCB1cmwsIHRydWUpOwogICAgICB4aHIuc2VuZCgpOwogICAgfTsKCiAgICBjb25zdCB0cmlidXRlID0gbmV3IFRyaWJ1dGUoewogICAgICBjb2xsZWN0aW9uOiBbCiAgICAgICAgewogICAgICAgICAgdHJpZ2dlcjogJyMnLAogICAgICAgICAgdmFsdWVzOiBmdW5jdGlvbiAodGV4dCwgY2IpIHsKICAgICAgICAgICAgaWYgKGV2ZW50LnRhcmdldC50eXBlID09PSAndGV4dCcgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2F1dG9jb21wbGV0ZScpICE9ICdvZmYnKSB7CiAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2F1dG9jb21wbGV0ZScsICdvZmYnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBXaGVuIHRyaWdnZXJlZCB3aXRoIHRleHQgc3RhcnRpbmcgd2l0aCAiIyMiLCBsaWtlICIjI2EiLCB0aGUgc2VhcmNoIHRlcm0gd2lsbCBiZWNvbWUgIiNhIiwKICAgICAgICAgICAgLy8gY2F1c2luZyB0aGUgU1FMIHF1ZXJ5IHRvIGZhaWwgaW4gZmluZGluZyBpc3N1ZXMgd2l0aCAiYSIgaW4gdGhlIHN1YmplY3QuCiAgICAgICAgICAgIC8vIFRvIGF2b2lkIHRoaXMsIHJlbW92ZSB0aGUgZmlyc3QgIiMiIGZyb20gdGhlIHNlYXJjaCB0ZXJtLgogICAgICAgICAgICBpZiAodGV4dCkgewogICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL14jLywgJycpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbW90ZVNlYXJjaChnZXREYXRhU291cmNlKCdpc3N1ZXMnKSArIGVuY29kZVVSSUNvbXBvbmVudCh0ZXh0KSwgZnVuY3Rpb24gKGlzc3VlcykgewogICAgICAgICAgICAgIHJldHVybiBjYihpc3N1ZXMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICBsb29rdXA6ICdsYWJlbCcsCiAgICAgICAgICBmaWxsQXR0cjogJ2xhYmVsJywKICAgICAgICAgIHJlcXVpcmVMZWFkaW5nU3BhY2U6IHRydWUsCiAgICAgICAgICBzZWxlY3RUZW1wbGF0ZTogZnVuY3Rpb24gKGlzc3VlKSB7CiAgICAgICAgICAgIGxldCBsZWFkaW5nSGFzaCA9ICIjIgogICAgICAgICAgICAvLyBrZWVwICMjIHN5bnRheCB3aGljaCBpcyBhIHZhbGlkIGlzc3VlIHN5bnRheCB0byBzaG93IGlzc3VlIHdpdGggdGl0bGUuCiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRNZW50aW9uVGV4dFNuYXBzaG90LmNoYXJBdCgwKSA9PT0gIiMiKSB7CiAgICAgICAgICAgICAgbGVhZGluZ0hhc2ggPSAiIyMiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGxlYWRpbmdIYXNoICsgaXNzdWUub3JpZ2luYWwuaWQ7CiAgICAgICAgICB9LAogICAgICAgICAgbWVudUl0ZW1UZW1wbGF0ZTogZnVuY3Rpb24gKGlzc3VlKSB7CiAgICAgICAgICAgIHJldHVybiBzYW5pdGl6ZUhUTUwoaXNzdWUub3JpZ2luYWwubGFiZWwpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgdHJpZ2dlcjogJ1tbJywKICAgICAgICAgIHZhbHVlczogZnVuY3Rpb24gKHRleHQsIGNiKSB7CiAgICAgICAgICAgIHJlbW90ZVNlYXJjaChnZXREYXRhU291cmNlKCd3aWtpX3BhZ2VzJykgKyBlbmNvZGVVUklDb21wb25lbnQodGV4dCksIGZ1bmN0aW9uICh3aWtpUGFnZXMpIHsKICAgICAgICAgICAgICByZXR1cm4gY2Iod2lraVBhZ2VzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9LAogICAgICAgICAgbG9va3VwOiAnbGFiZWwnLAogICAgICAgICAgZmlsbEF0dHI6ICdsYWJlbCcsCiAgICAgICAgICByZXF1aXJlTGVhZGluZ1NwYWNlOiB0cnVlLAogICAgICAgICAgc2VsZWN0VGVtcGxhdGU6IGZ1bmN0aW9uICh3aWtpUGFnZSkgewogICAgICAgICAgICByZXR1cm4gJ1tbJyArIHdpa2lQYWdlLm9yaWdpbmFsLnZhbHVlICsgJ11dJzsKICAgICAgICAgIH0sCiAgICAgICAgICBtZW51SXRlbVRlbXBsYXRlOiBmdW5jdGlvbiAod2lraVBhZ2UpIHsKICAgICAgICAgICAgcmV0dXJuIHNhbml0aXplSFRNTCh3aWtpUGFnZS5vcmlnaW5hbC5sYWJlbCk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICB0cmlnZ2VyOiAnQCcsCiAgICAgICAgICBsb29rdXA6IGZ1bmN0aW9uICh1c2VyLCBtZW50aW9uVGV4dCkgewogICAgICAgICAgICByZXR1cm4gdXNlci5uYW1lICsgdXNlci5maXJzdG5hbWUgKyB1c2VyLmxhc3RuYW1lICsgdXNlci5sb2dpbjsKICAgICAgICAgIH0sCiAgICAgICAgICB2YWx1ZXM6IGZ1bmN0aW9uICh0ZXh0LCBjYikgewogICAgICAgICAgICBjb25zdCB1cmwgPSBnZXREYXRhU291cmNlKCd1c2VycycpOwogICAgICAgICAgICBpZiAodXJsKSB7CiAgICAgICAgICAgICAgcmVtb3RlU2VhcmNoKHVybCArIGVuY29kZVVSSUNvbXBvbmVudCh0ZXh0KSwgZnVuY3Rpb24gKHVzZXJzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2IodXNlcnMpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgbWVudUl0ZW1UZW1wbGF0ZTogZnVuY3Rpb24gKHVzZXIpIHsKICAgICAgICAgICAgcmV0dXJuIHVzZXIub3JpZ2luYWwubmFtZTsKICAgICAgICAgIH0sCiAgICAgICAgICBzZWxlY3RUZW1wbGF0ZTogZnVuY3Rpb24gKHVzZXIpIHsKICAgICAgICAgICAgcmV0dXJuICdAJyArIHVzZXIub3JpZ2luYWwubG9naW47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICBdLAogICAgICBub01hdGNoVGVtcGxhdGU6ICIiCiAgICB9KTsKCiAgICB0cmlidXRlLmF0dGFjaChlbGVtZW50KTsKfQoKLy8gY29sbGFwc2libGUgc2lkZWJhciBqUXVlcnkgcGx1Z2luCihmdW5jdGlvbigkKSB7CiAgLy8gbWFpbiBjb250YWluZXIgdGhpcyBpcyBhcHBsaWVkIHRvCiAgdmFyIG1haW47CiAgLy8gdHJpZ2dlcnMgc2hvdy9oaWRlCiAgdmFyIGJ1dHRvbjsKICAvLyB0aGUga2V5IHRvIHVzZSBpbiBsb2NhbCBzdG9yYWdlCiAgLy8gdGhpcyB3aWxsIGxhdGVyIGJlIGV4cGFuZGVkIHVzaW5nIHRoZSBjdXJyZW50IGNvbnRyb2xsZXIgYW5kIGFjdGlvbiB0bwogIC8vIGFsbG93IGZvciBkaWZmZXJlbnQgc2lkZWJhciBzdGF0ZXMgZm9yIGRpZmZlcmVudCBwYWdlcwogIHZhciBsb2NhbFN0b3JhZ2VLZXkgPSAncmVkbWluZS1zaWRlYmFyLXN0YXRlJzsKICAvLyB0cnVlIGlmIGxvY2FsIHN0b3JhZ2UgaXMgYXZhaWxhYmxlCiAgdmFyIGNhblVzZUxvY2FsU3RvcmFnZSA9IGZ1bmN0aW9uKCl7CiAgICB0cnkgewogICAgICBpZignbG9jYWxTdG9yYWdlJyBpbiB3aW5kb3cpewogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdyZWRtaW5lLnRlc3Quc3RvcmFnZScsICdvaycpOwogICAgICAgIHZhciBpdGVtID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3JlZG1pbmUudGVzdC5zdG9yYWdlJyk7CiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3JlZG1pbmUudGVzdC5zdG9yYWdlJyk7CiAgICAgICAgaWYoaXRlbSA9PT0gJ29rJykgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGVycikge30KICAgIHJldHVybiBmYWxzZTsKICB9KCk7CiAgLy8gZnVuY3Rpb24gdG8gc2V0IGN1cnJlbnQgc2lkZWJhciBzdGF0ZQogIHZhciBzZXRTdGF0ZSA9IGZ1bmN0aW9uKHN0YXRlKXsKICAgIGlmKGNhblVzZUxvY2FsU3RvcmFnZSl7CiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxvY2FsU3RvcmFnZUtleSwgc3RhdGUpOwogICAgfQogIH07CiAgdmFyIGFwcGx5U3RhdGUgPSBmdW5jdGlvbigpewogICAgaWYobWFpbi5oYXNDbGFzcygnY29sbGFwc2Vkc2lkZWJhcicpKXsKICAgICAgdXBkYXRlU1ZHSWNvbihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2lkZWJhci1zd2l0Y2gtYnV0dG9uJyksICdjaGV2cm9ucy1sZWZ0JykKICAgICAgc2V0U3RhdGUoJ2hpZGRlbicpOwogICAgfSBlbHNlIHsKICAgICAgdXBkYXRlU1ZHSWNvbihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2lkZWJhci1zd2l0Y2gtYnV0dG9uJyksICdjaGV2cm9ucy1yaWdodCcpCiAgICAgIHNldFN0YXRlKCd2aXNpYmxlJyk7CiAgICB9CiAgfTsKICB2YXIgc2V0dXBUb2dnbGVCdXR0b24gPSBmdW5jdGlvbigpewogICAgYnV0dG9uID0gJCgnI3NpZGViYXItc3dpdGNoLWJ1dHRvbicpOwogICAgYnV0dG9uLmNsaWNrKGZ1bmN0aW9uKGUpewogICAgICBtYWluLmFkZENsYXNzKCJhbmltYXRlIik7CiAgICAgIG1haW4udG9nZ2xlQ2xhc3MoJ2NvbGxhcHNlZHNpZGViYXInKTsKICAgICAgYXBwbHlTdGF0ZSgpOwogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwogICAgYXBwbHlTdGF0ZSgpOwogIH07CiAgJC5mbi5jb2xsYXBzaWJsZVNpZGViYXIgPSBmdW5jdGlvbigpIHsKICAgIG1haW4gPSB0aGlzOwogICAgLy8gZGV0ZXJtaW5lIHByZXZpb3VzbHkgc3RvcmVkIHNpZGViYXIgc3RhdGUgZm9yIHRoaXMgcGFnZQogICAgaWYoY2FuVXNlTG9jYWxTdG9yYWdlKSB7CiAgICAgIC8vIGRldGVybWluZSBjdXJyZW50IGNvbnRyb2xsZXIvYWN0aW9uIHBhaXIgYW5kIHVzZSB0aGVtIGFzIHN0b3JhZ2Uga2V5CiAgICAgIHZhciBib2R5Q2xhc3MgPSAkKCdib2R5JykuYXR0cignY2xhc3MnKTsKICAgICAgaWYoYm9keUNsYXNzKXsKICAgICAgICB0cnkgewogICAgICAgICAgbG9jYWxTdG9yYWdlS2V5ICs9ICctJyArIGJvZHlDbGFzcy5zcGxpdCgvXHMrLykuZmlsdGVyKGZ1bmN0aW9uKHMpewogICAgICAgICAgICByZXR1cm4gcy5tYXRjaCgvKGFjdGlvbnxjb250cm9sbGVyKS0uKi8pOwogICAgICAgICAgfSkuc29ydCgpLmpvaW4oJy0nKTsKICAgICAgICB9IGNhdGNoKGUpIHsKICAgICAgICAgIC8vIGluIGNhc2Ugb2YgZXJyb3IgKHByb2JhYmx5IElFOCksIGNvbnRpbnVlIHdpdGggdGhlIHVubW9kaWZpZWQga2V5CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciBzdG9yZWRTdGF0ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGxvY2FsU3RvcmFnZUtleSk7CiAgICAgIG1haW4udG9nZ2xlQ2xhc3MoJ2NvbGxhcHNlZHNpZGViYXInLCBzdG9yZWRTdGF0ZSA9PT0gJ2hpZGRlbicpOwogICAgfQogICAgLy8gZHJhdyB0aGUgdG9nZ2xlIGJ1dHRvbiBvbmNlIHRoZSBET00gaXMgY29tcGxldGUKICAgICQoZG9jdW1lbnQpLnJlYWR5KHNldHVwVG9nZ2xlQnV0dG9uKTsKICB9Owp9KGpRdWVyeSkpOwoKJChkb2N1bWVudCkucmVhZHkoc2V0dXBBamF4SW5kaWNhdG9yKTsKJChkb2N1bWVudCkucmVhZHkoaGlkZU9uTG9hZCk7CiQoZG9jdW1lbnQpLnJlYWR5KGFkZEZvcm1PYnNlcnZlcnNGb3JEb3VibGVTdWJtaXQpOwokKGRvY3VtZW50KS5yZWFkeShkZWZhdWx0Rm9jdXMpOwokKGRvY3VtZW50KS5yZWFkeShzZXR1cEF0dGFjaG1lbnREZXRhaWwpOwokKGRvY3VtZW50KS5yZWFkeShzZXR1cFRhYnMpOwokKGRvY3VtZW50KS5yZWFkeShzZXR1cEZpbGVQcmV2aWV3TmF2aWdhdGlvbik7CiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwV2lraVRhYmxlU29ydGFibGVIZWFkZXIpOwokKGRvY3VtZW50KS5vbignZm9jdXMnLCAnW2RhdGEtYXV0by1jb21wbGV0ZT10cnVlXScsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgaW5saW5lQXV0b0NvbXBsZXRlKGV2ZW50LnRhcmdldCk7Cn0pOwo=" | |
| }, | |
| "attachments.js": { | |
| "hash": "3ec6492326b3262f7b880cc7baff194c", | |
| "path": "/usr/src/redmine/public/assets/attachments-70e32d30.js", | |
| "base64": "LyoqCiAqIFJlZG1pbmUgLSBwcm9qZWN0IG1hbmFnZW1lbnQgc29mdHdhcmUKICogQ29weXJpZ2h0IChDKSAyMDA2LSAgSmVhbi1QaGlsaXBwZSBMYW5nCiAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCiAqLwoKZnVuY3Rpb24gYWRkRmlsZShpbnB1dEVsLCBmaWxlLCBlYWdlclVwbG9hZCkgewogIHZhciBhdHRhY2htZW50c0ZpZWxkcyA9ICQoaW5wdXRFbCkuY2xvc2VzdCgnLmF0dGFjaG1lbnRzX2Zvcm0nKS5maW5kKCcuYXR0YWNobWVudHNfZmllbGRzJyk7CiAgdmFyIGFkZEF0dGFjaG1lbnQgPSAkKGlucHV0RWwpLmNsb3Nlc3QoJy5hdHRhY2htZW50c19mb3JtJykuZmluZCgnLmFkZF9hdHRhY2htZW50Jyk7CiAgdmFyIG1heEZpbGVzID0gKCQoaW5wdXRFbCkuYXR0cignbXVsdGlwbGUnKSA9PSAnbXVsdGlwbGUnID8gMTAgOiAxKTsKCiAgaWYgKGF0dGFjaG1lbnRzRmllbGRzLmNoaWxkcmVuKCkubGVuZ3RoIDwgbWF4RmlsZXMpIHsKICAgIHZhciBhdHRhY2htZW50SWQgPSBhZGRGaWxlLm5leHRBdHRhY2htZW50SWQrKzsKICAgIHZhciBmaWxlU3BhbiA9ICQoJzxzcGFuPicsIHsgaWQ6ICdhdHRhY2htZW50c18nICsgYXR0YWNobWVudElkIH0pOwogICAgdmFyIHBhcmFtID0gJChpbnB1dEVsKS5kYXRhKCdwYXJhbScpOwogICAgaWYgKCFwYXJhbSkge3BhcmFtID0gJ2F0dGFjaG1lbnRzJ307CgogICAgZmlsZVNwYW4uYXBwZW5kKAogICAgICAgICQoJzxpbnB1dD4nLCB7IHR5cGU6ICd0ZXh0JywgJ2NsYXNzJzogJ2ljb24gaWNvbi1hdHRhY2htZW50IGZpbGVuYW1lIHJlYWRvbmx5JywgbmFtZTogcGFyYW0gKydbJyArIGF0dGFjaG1lbnRJZCArICddW2ZpbGVuYW1lXScsIHJlYWRvbmx5OiAncmVhZG9ubHknfSApLnZhbChmaWxlLm5hbWUpLAogICAgICAgICQoJzxpbnB1dD4nLCB7IHR5cGU6ICd0ZXh0JywgJ2NsYXNzJzogJ2Rlc2NyaXB0aW9uJywgbmFtZTogcGFyYW0gKyAnWycgKyBhdHRhY2htZW50SWQgKyAnXVtkZXNjcmlwdGlvbl0nLCBtYXhsZW5ndGg6IDI1NSwgcGxhY2Vob2xkZXI6ICQoaW5wdXRFbCkuZGF0YSgnZGVzY3JpcHRpb24tcGxhY2Vob2xkZXInKSB9ICkudG9nZ2xlKCFlYWdlclVwbG9hZCksCiAgICAgICAgJCgnPGlucHV0PicsIHsgdHlwZTogJ2hpZGRlbicsICdjbGFzcyc6ICd0b2tlbicsIG5hbWU6IHBhcmFtICsgJ1snICsgYXR0YWNobWVudElkICsgJ11bdG9rZW5dJ30gKSwKICAgICAgICAkKCc8YT4mbmJzcDwvYT4nKS5hdHRyKHsgaHJlZjogIiMiLCAnY2xhc3MnOiAnaWNvbi1vbmx5IGljb24tZGVsIHJlbW92ZS11cGxvYWQnIH0pLmNsaWNrKHJlbW92ZUZpbGUpLnRvZ2dsZSghZWFnZXJVcGxvYWQpCiAgICApLmFwcGVuZFRvKGF0dGFjaG1lbnRzRmllbGRzKTsKCiAgICBpZiAoJChpbnB1dEVsKS5kYXRhKCdkZXNjcmlwdGlvbicpID09IDApIHsKICAgICAgZmlsZVNwYW4uZmluZCgnaW5wdXQuZGVzY3JpcHRpb24nKS5yZW1vdmUoKTsKICAgIH0KCiAgICBpZihlYWdlclVwbG9hZCkgewogICAgICBhamF4VXBsb2FkKGZpbGUsIGF0dGFjaG1lbnRJZCwgZmlsZVNwYW4sIGlucHV0RWwpOwogICAgfQoKICAgIGFkZEF0dGFjaG1lbnQudG9nZ2xlKGF0dGFjaG1lbnRzRmllbGRzLmNoaWxkcmVuKCkubGVuZ3RoIDwgbWF4RmlsZXMpOwogICAgcmV0dXJuIGF0dGFjaG1lbnRJZDsKICB9CiAgcmV0dXJuIG51bGw7Cn0KCmFkZEZpbGUubmV4dEF0dGFjaG1lbnRJZCA9IDE7CgpmdW5jdGlvbiBhamF4VXBsb2FkKGZpbGUsIGF0dGFjaG1lbnRJZCwgZmlsZVNwYW4sIGlucHV0RWwpIHsKCiAgZnVuY3Rpb24gb25Mb2Fkc3RhcnQoZSkgewogICAgZmlsZVNwYW4ucmVtb3ZlQ2xhc3MoJ2FqYXgtd2FpdGluZycpOwogICAgZmlsZVNwYW4uYWRkQ2xhc3MoJ2FqYXgtbG9hZGluZycpOwogICAgJCgnaW5wdXQ6c3VibWl0JywgJCh0aGlzKS5wYXJlbnRzKCdmb3JtJykpLmF0dHIoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7CiAgfQoKICBmdW5jdGlvbiBvblByb2dyZXNzKGUpIHsKICAgIGlmKGUubGVuZ3RoQ29tcHV0YWJsZSkgewogICAgICB0aGlzLnByb2dyZXNzYmFyKCAndmFsdWUnLCBlLmxvYWRlZCAqIDEwMCAvIGUudG90YWwgKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGFjdHVhbFVwbG9hZChmaWxlLCBhdHRhY2htZW50SWQsIGZpbGVTcGFuLCBpbnB1dEVsKSB7CgogICAgYWpheFVwbG9hZC51cGxvYWRpbmcrKzsKCiAgICB1cGxvYWRCbG9iKGZpbGUsICQoaW5wdXRFbCkuZGF0YSgndXBsb2FkLXBhdGgnKSwgYXR0YWNobWVudElkLCB7CiAgICAgICAgbG9hZHN0YXJ0RXZlbnRIYW5kbGVyOiBvbkxvYWRzdGFydC5iaW5kKHByb2dyZXNzU3BhbiksCiAgICAgICAgcHJvZ3Jlc3NFdmVudEhhbmRsZXI6IG9uUHJvZ3Jlc3MuYmluZChwcm9ncmVzc1NwYW4pCiAgICAgIH0pCiAgICAgIC5kb25lKGZ1bmN0aW9uKHJlc3VsdCkgewogICAgICAgIGFkZElubGluZUF0dGFjaG1lbnRNYXJrdXAoZmlsZSk7CiAgICAgICAgcHJvZ3Jlc3NTcGFuLnByb2dyZXNzYmFyKCAndmFsdWUnLCAxMDAgKS5yZW1vdmUoKTsKICAgICAgICBmaWxlU3Bhbi5maW5kKCdpbnB1dC5kZXNjcmlwdGlvbiwgYScpLmNzcygnZGlzcGxheScsICdpbmxpbmUtYmxvY2snKTsKICAgICAgfSkKICAgICAgLmZhaWwoZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgcHJvZ3Jlc3NTcGFuLnRleHQocmVzdWx0LnN0YXR1c1RleHQpOwogICAgICB9KS5hbHdheXMoZnVuY3Rpb24oKSB7CiAgICAgICAgYWpheFVwbG9hZC51cGxvYWRpbmctLTsKICAgICAgICBmaWxlU3Bhbi5yZW1vdmVDbGFzcygnYWpheC1sb2FkaW5nJyk7CiAgICAgICAgdmFyIGZvcm0gPSBmaWxlU3Bhbi5wYXJlbnRzKCdmb3JtJyk7CiAgICAgICAgaWYgKGZvcm0ucXVldWUoJ3VwbG9hZCcpLmxlbmd0aCA9PSAwICYmIGFqYXhVcGxvYWQudXBsb2FkaW5nID09IDApIHsKICAgICAgICAgICQoJ2lucHV0OnN1Ym1pdCcsIGZvcm0pLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7CiAgICAgICAgfQogICAgICAgIGZvcm0uZGVxdWV1ZSgndXBsb2FkJyk7CiAgICAgIH0pOwogIH0KCiAgdmFyIHByb2dyZXNzU3BhbiA9ICQoJzxkaXY+JykuaW5zZXJ0QWZ0ZXIoZmlsZVNwYW4uZmluZCgnaW5wdXQuZmlsZW5hbWUnKSk7CiAgcHJvZ3Jlc3NTcGFuLnByb2dyZXNzYmFyKCk7CiAgZmlsZVNwYW4uYWRkQ2xhc3MoJ2FqYXgtd2FpdGluZycpOwoKICB2YXIgbWF4U3luY1VwbG9hZCA9ICQoaW5wdXRFbCkuZGF0YSgnbWF4LWNvbmN1cnJlbnQtdXBsb2FkcycpOwoKICBpZihtYXhTeW5jVXBsb2FkID09IG51bGwgfHwgbWF4U3luY1VwbG9hZCA8PSAwIHx8IGFqYXhVcGxvYWQudXBsb2FkaW5nIDwgbWF4U3luY1VwbG9hZCkKICAgIGFjdHVhbFVwbG9hZChmaWxlLCBhdHRhY2htZW50SWQsIGZpbGVTcGFuLCBpbnB1dEVsKTsKICBlbHNlCiAgICAkKGlucHV0RWwpLnBhcmVudHMoJ2Zvcm0nKS5xdWV1ZSgndXBsb2FkJywgYWN0dWFsVXBsb2FkLmJpbmQodGhpcywgZmlsZSwgYXR0YWNobWVudElkLCBmaWxlU3BhbiwgaW5wdXRFbCkpOwp9CgphamF4VXBsb2FkLnVwbG9hZGluZyA9IDA7CgpmdW5jdGlvbiByZW1vdmVGaWxlKCkgewogICQodGhpcykuY2xvc2VzdCgnLmF0dGFjaG1lbnRzX2Zvcm0nKS5maW5kKCcuYWRkX2F0dGFjaG1lbnQnKS5zaG93KCk7CiAgJCh0aGlzKS5wYXJlbnQoJ3NwYW4nKS5yZW1vdmUoKTsKICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIHVwbG9hZEJsb2IoYmxvYiwgdXBsb2FkVXJsLCBhdHRhY2htZW50SWQsIG9wdGlvbnMpIHsKCiAgdmFyIGFjdHVhbE9wdGlvbnMgPSAkLmV4dGVuZCh7CiAgICBsb2Fkc3RhcnRFdmVudEhhbmRsZXI6ICQubm9vcCwKICAgIHByb2dyZXNzRXZlbnRIYW5kbGVyOiAkLm5vb3AKICB9LCBvcHRpb25zKTsKCiAgdXBsb2FkVXJsID0gdXBsb2FkVXJsICsgJz9hdHRhY2htZW50X2lkPScgKyBhdHRhY2htZW50SWQ7CiAgaWYgKGJsb2IgaW5zdGFuY2VvZiB3aW5kb3cuQmxvYikgewogICAgdXBsb2FkVXJsICs9ICcmZmlsZW5hbWU9JyArIGVuY29kZVVSSUNvbXBvbmVudChibG9iLm5hbWUpOwogICAgdXBsb2FkVXJsICs9ICcmY29udGVudF90eXBlPScgKyBlbmNvZGVVUklDb21wb25lbnQoYmxvYi50eXBlKTsKICB9CgogIHJldHVybiAkLmFqYXgodXBsb2FkVXJsLCB7CiAgICB0eXBlOiAnUE9TVCcsCiAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsCiAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbihqcVhociwgc2V0dGluZ3MpIHsKICAgICAganFYaHIuc2V0UmVxdWVzdEhlYWRlcignQWNjZXB0JywgJ2FwcGxpY2F0aW9uL2pzJyk7CiAgICAgIC8vIGF0dGFjaCBwcm9wZXIgRmlsZSBvYmplY3QKICAgICAgc2V0dGluZ3MuZGF0YSA9IGJsb2I7CiAgICB9LAogICAgeGhyOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIHhociA9ICQuYWpheFNldHRpbmdzLnhocigpOwogICAgICB4aHIudXBsb2FkLm9ubG9hZHN0YXJ0ID0gYWN0dWFsT3B0aW9ucy5sb2Fkc3RhcnRFdmVudEhhbmRsZXI7CiAgICAgIHhoci51cGxvYWQub25wcm9ncmVzcyA9IGFjdHVhbE9wdGlvbnMucHJvZ3Jlc3NFdmVudEhhbmRsZXI7CiAgICAgIHJldHVybiB4aHI7CiAgICB9LAogICAgZGF0YTogYmxvYiwKICAgIGNhY2hlOiBmYWxzZSwKICAgIHByb2Nlc3NEYXRhOiBmYWxzZQogIH0pOwp9CgpmdW5jdGlvbiBhZGRJbnB1dEZpbGVzKGlucHV0RWwpIHsKICB2YXIgYXR0YWNobWVudHNGaWVsZHMgPSAkKGlucHV0RWwpLmNsb3Nlc3QoJy5hdHRhY2htZW50c19mb3JtJykuZmluZCgnLmF0dGFjaG1lbnRzX2ZpZWxkcycpOwogIHZhciBhZGRBdHRhY2htZW50ID0gJChpbnB1dEVsKS5jbG9zZXN0KCcuYXR0YWNobWVudHNfZm9ybScpLmZpbmQoJy5hZGRfYXR0YWNobWVudCcpOwogIHZhciBjbGVhcmVkRmlsZUlucHV0ID0gJChpbnB1dEVsKS5jbG9uZSgpLnZhbCgnJyk7CiAgdmFyIHNpemVFeGNlZWRlZCA9IGZhbHNlOwogIHZhciBwYXJhbSA9ICQoaW5wdXRFbCkuZGF0YSgncGFyYW0nKTsKICBpZiAoIXBhcmFtKSB7cGFyYW0gPSAnYXR0YWNobWVudHMnfTsKCiAgaWYgKCQuYWpheFNldHRpbmdzLnhocigpLnVwbG9hZCAmJiBpbnB1dEVsLmZpbGVzKSB7CiAgICAvLyB1cGxvYWQgZmlsZXMgdXNpbmcgYWpheAogICAgc2l6ZUV4Y2VlZGVkID0gdXBsb2FkQW5kQXR0YWNoRmlsZXMoaW5wdXRFbC5maWxlcywgaW5wdXRFbCk7CiAgICAkKGlucHV0RWwpLnJlbW92ZSgpOwogIH0gZWxzZSB7CiAgICAvLyBicm93c2VyIG5vdCBzdXBwb3J0aW5nIHRoZSBmaWxlIEFQSSwgdXBsb2FkIG9uIGZvcm0gc3VibWlzc2lvbgogICAgdmFyIGF0dGFjaG1lbnRJZDsKICAgIHZhciBhRmlsZW5hbWUgPSBpbnB1dEVsLnZhbHVlLnNwbGl0KC9cL3xcXC8pOwogICAgYXR0YWNobWVudElkID0gYWRkRmlsZShpbnB1dEVsLCB7IG5hbWU6IGFGaWxlbmFtZVsgYUZpbGVuYW1lLmxlbmd0aCAtIDEgXSB9LCBmYWxzZSk7CiAgICBpZiAoYXR0YWNobWVudElkKSB7CiAgICAgICQoaW5wdXRFbCkuYXR0cih7IG5hbWU6IHBhcmFtICsgJ1snICsgYXR0YWNobWVudElkICsgJ11bZmlsZV0nLCBzdHlsZTogJ2Rpc3BsYXk6bm9uZTsnIH0pLmFwcGVuZFRvKCcjYXR0YWNobWVudHNfJyArIGF0dGFjaG1lbnRJZCk7CiAgICB9CiAgfQoKICBjbGVhcmVkRmlsZUlucHV0LnByZXBlbmRUbyhhZGRBdHRhY2htZW50KTsKfQoKZnVuY3Rpb24gdXBsb2FkQW5kQXR0YWNoRmlsZXMoZmlsZXMsIGlucHV0RWwpIHsKCiAgdmFyIG1heEZpbGVTaXplID0gJChpbnB1dEVsKS5kYXRhKCdtYXgtZmlsZS1zaXplJyk7CiAgdmFyIG1heEZpbGVTaXplRXhjZWVkZWQgPSAkKGlucHV0RWwpLmRhdGEoJ21heC1maWxlLXNpemUtbWVzc2FnZScpOwoKICB2YXIgc2l6ZUV4Y2VlZGVkID0gZmFsc2U7CiAgdmFyIGZpbGVzTGVuZ3RoID0gJChpbnB1dEVsKS5jbG9zZXN0KCcuYXR0YWNobWVudHNfZm9ybScpLmZpbmQoJy5hdHRhY2htZW50c19maWVsZHMnKS5jaGlsZHJlbigpLmxlbmd0aCArIGZpbGVzLmxlbmd0aAogICQuZWFjaChmaWxlcywgZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5zaXplICYmIG1heEZpbGVTaXplICE9IG51bGwgJiYgdGhpcy5zaXplID4gcGFyc2VJbnQobWF4RmlsZVNpemUpKSB7c2l6ZUV4Y2VlZGVkPXRydWU7fQogIH0pOwogIGlmIChzaXplRXhjZWVkZWQpIHsKICAgIHdpbmRvdy5hbGVydChtYXhGaWxlU2l6ZUV4Y2VlZGVkKTsKICB9IGVsc2UgewogICAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbigpIHthZGRGaWxlKGlucHV0RWwsIHRoaXMsIHRydWUpO30pOwogIH0KCiAgaWYgKGZpbGVzTGVuZ3RoID4gKCQoaW5wdXRFbCkuYXR0cignbXVsdGlwbGUnKSA9PSAnbXVsdGlwbGUnID8gMTAgOiAxKSkgewogICAgd2luZG93LmFsZXJ0KCQoaW5wdXRFbCkuZGF0YSgnbWF4LW51bWJlci1vZi1maWxlcy1tZXNzYWdlJykpOwogIH0KICByZXR1cm4gc2l6ZUV4Y2VlZGVkOwp9CgpmdW5jdGlvbiBoYW5kbGVGaWxlRHJvcEV2ZW50KGUpIHsKCiAgJCh0aGlzKS5yZW1vdmVDbGFzcygnZmlsZW92ZXInKTsKICBibG9ja0V2ZW50UHJvcGFnYXRpb24oZSk7CgogIGlmICgkLmluQXJyYXkoJ0ZpbGVzJywgZS5kYXRhVHJhbnNmZXIudHlwZXMpID4gLTEpIHsKICAgIGhhbmRsZUZpbGVEcm9wRXZlbnQudGFyZ2V0ID0gZS50YXJnZXQ7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnY3VzdG9tLWZpZWxkLWZpbGVkcm9wbGlzdG5lcicpKXsKICAgICAgdXBsb2FkQW5kQXR0YWNoRmlsZXMoZS5kYXRhVHJhbnNmZXIuZmlsZXMsICQodGhpcykuZmluZCgnaW5wdXQ6ZmlsZS5jdXN0b20tZmllbGQtZmlsZWRyb3AnKS5maXJzdCgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHVwbG9hZEFuZEF0dGFjaEZpbGVzKGUuZGF0YVRyYW5zZmVyLmZpbGVzLCAkKHRoaXMpLmZpbmQoJ2lucHV0OmZpbGUuZmlsZWRyb3AnKS5maXJzdCgpKTsKICAgIH0KICB9Cn0KaGFuZGxlRmlsZURyb3BFdmVudC50YXJnZXQgPSAnJzsKCmZ1bmN0aW9uIGRyYWdPdmVySGFuZGxlcihlKSB7CiAgJCh0aGlzKS5hZGRDbGFzcygnZmlsZW92ZXInKTsKICBibG9ja0V2ZW50UHJvcGFnYXRpb24oZSk7CiAgZS5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdjb3B5JzsKfQoKZnVuY3Rpb24gZHJhZ091dEhhbmRsZXIoZSkgewogICQodGhpcykucmVtb3ZlQ2xhc3MoJ2ZpbGVvdmVyJyk7CiAgYmxvY2tFdmVudFByb3BhZ2F0aW9uKGUpOwp9CgpmdW5jdGlvbiBzZXR1cEZpbGVEcm9wKCkgewogIGlmICh3aW5kb3cuRmlsZSAmJiB3aW5kb3cuRmlsZUxpc3QgJiYgd2luZG93LlByb2dyZXNzRXZlbnQgJiYgd2luZG93LkZvcm1EYXRhKSB7CgogICAgJC5ldmVudC5hZGRQcm9wKCdkYXRhVHJhbnNmZXInKTsKCiAgICAkKCdmb3JtIGRpdi5ib3g6bm90KC5maWxlZHJvcGxpc3RuZXIpJykuaGFzKCdpbnB1dDpmaWxlLmZpbGVkcm9wJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgJCh0aGlzKS5vbih7CiAgICAgICAgICBkcmFnb3ZlcjogZHJhZ092ZXJIYW5kbGVyLAogICAgICAgICAgZHJhZ2xlYXZlOiBkcmFnT3V0SGFuZGxlciwKICAgICAgICAgIGRyb3A6IGhhbmRsZUZpbGVEcm9wRXZlbnQsCiAgICAgICAgICBwYXN0ZTogY29weUltYWdlRnJvbUNsaXBib2FyZAogICAgICB9KS5hZGRDbGFzcygnZmlsZWRyb3BsaXN0bmVyJyk7CiAgICB9KTsKCiAgICAkKCdmb3JtIGRpdi5ib3ggaW5wdXQ6ZmlsZS5jdXN0b20tZmllbGQtZmlsZWRyb3AnKS5jbG9zZXN0KCdwJykubm90KCcuY3VzdG9tLWZpZWxkLWZpbGVkcm9wbGlzdG5lcicpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICQodGhpcykub24oewogICAgICAgICAgZHJhZ292ZXI6IGRyYWdPdmVySGFuZGxlciwKICAgICAgICAgIGRyYWdsZWF2ZTogZHJhZ091dEhhbmRsZXIsCiAgICAgICAgICBkcm9wOiBoYW5kbGVGaWxlRHJvcEV2ZW50CiAgICAgIH0pLmFkZENsYXNzKCdjdXN0b20tZmllbGQtZmlsZWRyb3BsaXN0bmVyJyk7CiAgICB9KTsKICB9Cn0KCmZ1bmN0aW9uIGFkZElubGluZUF0dGFjaG1lbnRNYXJrdXAoZmlsZSkgewogIC8vIGluc2VydCB1cGxvYWRlZCBpbWFnZSBpbmxpbmUgaWYgZHJvcHBlZCBhcmVhIGlzIGN1cnJlbnRseSBmb2N1c2VkIHRleHRhcmVhCiAgaWYoJChoYW5kbGVGaWxlRHJvcEV2ZW50LnRhcmdldCkuaGFzQ2xhc3MoJ3dpa2ktZWRpdCcpICYmICQuaW5BcnJheShmaWxlLnR5cGUsIHdpbmRvdy53aWtpSW1hZ2VNaW1lVHlwZXMpID4gLTEpIHsKICAgIHZhciAkdGV4dGFyZWEgPSAkKGhhbmRsZUZpbGVEcm9wRXZlbnQudGFyZ2V0KTsKICAgIHZhciBjdXJzb3JQb3NpdGlvbiA9ICR0ZXh0YXJlYS5wcm9wKCdzZWxlY3Rpb25TdGFydCcpOwogICAgdmFyIGRlc2NyaXB0aW9uID0gJHRleHRhcmVhLnZhbCgpOwogICAgdmFyIHNhbml0aXplZEZpbGVuYW1lID0gZmlsZS5uYW1lLnJlcGxhY2UoL1tcL1w/XCVcKlw6XHxcIlwnPD5cblxyXSsvLCAnXycpOwogICAgdmFyIGlubGluZUZpbGVuYW1lID0gZW5jb2RlVVJJQ29tcG9uZW50KHNhbml0aXplZEZpbGVuYW1lKQogICAgICAucmVwbGFjZSgvWyEoKV0vZywgZnVuY3Rpb24obWF0Y2gpIHsgcmV0dXJuICIlIiArIG1hdGNoLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpIH0pOwogICAgdmFyIG5ld0xpbmVCZWZvcmUgPSB0cnVlOwogICAgdmFyIG5ld0xpbmVBZnRlciA9IHRydWU7CiAgICBpZihjdXJzb3JQb3NpdGlvbiA9PT0gMCB8fCBkZXNjcmlwdGlvbi5zdWJzdHIoY3Vyc29yUG9zaXRpb24tMSwxKS5tYXRjaCgvXHJ8XG4vKSkgewogICAgICBuZXdMaW5lQmVmb3JlID0gZmFsc2U7CiAgICB9CiAgICBpZihkZXNjcmlwdGlvbi5zdWJzdHIoY3Vyc29yUG9zaXRpb24sMSkubWF0Y2goL1xyfFxuLykpIHsKICAgICAgbmV3TGluZUFmdGVyID0gZmFsc2U7CiAgICB9CgogICAgJHRleHRhcmVhLnZhbCgKICAgICAgZGVzY3JpcHRpb24uc3Vic3RyaW5nKDAsIGN1cnNvclBvc2l0aW9uKQogICAgICArIChuZXdMaW5lQmVmb3JlID8gJ1xuJyA6ICcnKQogICAgICArIGlubGluZUZpbGVuYW1lCiAgICAgICsgKG5ld0xpbmVBZnRlciA/ICdcbicgOiAnJykKICAgICAgKyBkZXNjcmlwdGlvbi5zdWJzdHJpbmcoY3Vyc29yUG9zaXRpb24sIGRlc2NyaXB0aW9uLmxlbmd0aCkKICAgICk7CgogICAgJHRleHRhcmVhLnByb3AoewogICAgICAnc2VsZWN0aW9uU3RhcnQnOiBjdXJzb3JQb3NpdGlvbiArIG5ld0xpbmVCZWZvcmUsCiAgICAgICdzZWxlY3Rpb25FbmQnOiBjdXJzb3JQb3NpdGlvbiArIGlubGluZUZpbGVuYW1lLmxlbmd0aCArIG5ld0xpbmVCZWZvcmUKICAgIH0pOwogICAgJHRleHRhcmVhLnBhcmVudHMoJy5qc3RCbG9jaycpCiAgICAgIC5maW5kKCcuanN0Yl9pbWcnKS5jbGljaygpOwoKICAgIC8vIG1vdmUgY3Vyc29yIGludG8gbmV4dCBsaW5lCiAgICBjdXJzb3JQb3NpdGlvbiA9ICR0ZXh0YXJlYS5wcm9wKCdzZWxlY3Rpb25TdGFydCcpOwogICAgJHRleHRhcmVhLnByb3AoewogICAgICAnc2VsZWN0aW9uU3RhcnQnOiBjdXJzb3JQb3NpdGlvbiArIDEsCiAgICAgICdzZWxlY3Rpb25FbmQnOiBjdXJzb3JQb3NpdGlvbiArIDEKICAgIH0pOwoKICB9Cn0KCmZ1bmN0aW9uIGNvcHlJbWFnZUZyb21DbGlwYm9hcmQoZSkgewogIGlmICghJChlLnRhcmdldCkuaGFzQ2xhc3MoJ3dpa2ktZWRpdCcpKSB7IHJldHVybjsgfQogIHZhciBjbGlwYm9hcmREYXRhID0gZS5jbGlwYm9hcmREYXRhIHx8IGUub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhCiAgaWYgKCFjbGlwYm9hcmREYXRhKSB7IHJldHVybjsgfQogIGlmIChjbGlwYm9hcmREYXRhLnR5cGVzLnNvbWUoZnVuY3Rpb24odCl7IHJldHVybiAvXnRleHRcL3BsYWluJC8udGVzdCh0KTsgfSkpIHsgcmV0dXJuOyB9CgogIHZhciBmaWxlcyA9IGNsaXBib2FyZERhdGEuZmlsZXMKICBmb3IgKHZhciBpID0gMCA7IGkgPCBmaWxlcy5sZW5ndGggOyBpKyspIHsKICAgIHZhciBmaWxlID0gZmlsZXNbaV07CiAgICBpZiAoZmlsZS50eXBlLmluZGV4T2YoImltYWdlIikgIT0gLTEpIHsKICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgpOwogICAgICB2YXIgZmlsZW5hbWUgPSAnY2xpcGJvYXJkLScKICAgICAgICArIGRhdGUuZ2V0RnVsbFllYXIoKQogICAgICAgICsgKCcwJysoZGF0ZS5nZXRNb250aCgpKzEpKS5zbGljZSgtMikKICAgICAgICArICgnMCcrZGF0ZS5nZXREYXRlKCkpLnNsaWNlKC0yKQogICAgICAgICsgKCcwJytkYXRlLmdldEhvdXJzKCkpLnNsaWNlKC0yKQogICAgICAgICsgKCcwJytkYXRlLmdldE1pbnV0ZXMoKSkuc2xpY2UoLTIpCiAgICAgICAgKyAnLScgKyByYW5kb21LZXkoNSkudG9Mb2NhbGVMb3dlckNhc2UoKQogICAgICAgICsgJy4nICsgZmlsZS5uYW1lLnNwbGl0KCcuJykucG9wKCk7CgogICAgICAvLyBnZXQgaW5wdXQgZmlsZSBpbiB0aGUgY2xvc2VzdCBmb3JtCiAgICAgIHZhciBpbnB1dEVsID0gJCh0aGlzKS5jbG9zZXN0KCJmb3JtIikuZmluZCgnaW5wdXQ6ZmlsZS5maWxlZHJvcCcpOwogICAgICBoYW5kbGVGaWxlRHJvcEV2ZW50LnRhcmdldCA9IGUudGFyZ2V0OwogICAgICBhZGRGaWxlKGlucHV0RWwsIG5ldyBGaWxlKFtmaWxlXSwgZmlsZW5hbWUsIHsgdHlwZTogZmlsZS50eXBlIH0pLCB0cnVlKTsKICAgIH0KICB9Cn0KCiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwRmlsZURyb3ApOwokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICQoImlucHV0LmRlbGV0ZWRfYXR0YWNobWVudCIpLmNoYW5nZShmdW5jdGlvbigpewogICAgJCh0aGlzKS5wYXJlbnRzKCcuZXhpc3RpbmctYXR0YWNobWVudCcpLnRvZ2dsZUNsYXNzKCdkZWxldGVkJywgJCh0aGlzKS5pcygiOmNoZWNrZWQiKSk7CiAgfSkuY2hhbmdlKCk7Cn0pOwo=" | |
| } | |
| }, | |
| "6.0.3": { | |
| "application.js": { | |
| "hash": "e8724b6e0c228d0944a290bdcbfe8a84", | |
| "path": "/usr/src/redmine/public/assets/application-24bcafd3.js", | |
| "base64": "LyoqCiAqIFJlZG1pbmUgLSBwcm9qZWN0IG1hbmFnZW1lbnQgc29mdHdhcmUKICogQ29weXJpZ2h0IChDKSAyMDA2LSAgSmVhbi1QaGlsaXBwZSBMYW5nCiAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCiAqLwoKZnVuY3Rpb24gc2FuaXRpemVIVE1MKHN0cmluZykgewogIHZhciB0ZW1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIHRlbXAudGV4dENvbnRlbnQgPSBzdHJpbmc7CiAgcmV0dXJuIHRlbXAuaW5uZXJIVE1MOwp9CgpmdW5jdGlvbiBjaGVja0FsbChpZCwgY2hlY2tlZCkgewogICQoJyMnK2lkKS5maW5kKCdpbnB1dFt0eXBlPWNoZWNrYm94XTplbmFibGVkJykucHJvcCgnY2hlY2tlZCcsIGNoZWNrZWQpOwp9CgpmdW5jdGlvbiB0b2dnbGVDaGVja2JveGVzQnlTZWxlY3RvcihzZWxlY3RvcikgewogIHZhciBhbGxfY2hlY2tlZCA9IHRydWU7CiAgJChzZWxlY3RvcikuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgaWYgKCEkKHRoaXMpLmlzKCc6Y2hlY2tlZCcpKSB7IGFsbF9jaGVja2VkID0gZmFsc2U7IH0KICB9KTsKICAkKHNlbGVjdG9yKS5wcm9wKCdjaGVja2VkJywgIWFsbF9jaGVja2VkKS50cmlnZ2VyKCdjaGFuZ2UnKTsKfQoKZnVuY3Rpb24gc2hvd0FuZFNjcm9sbFRvKGlkLCBmb2N1cykgewogICQoJyMnK2lkKS5zaG93KCk7CiAgaWYgKGZvY3VzICE9PSBudWxsKSB7CiAgICAkKCcjJytmb2N1cykuZm9jdXMoKTsKICB9CiAgJCgnaHRtbCwgYm9keScpLmFuaW1hdGUoe3Njcm9sbFRvcDogJCgnIycraWQpLm9mZnNldCgpLnRvcH0sIDEwMCk7Cn0KCmZ1bmN0aW9uIHRvZ2dsZVJvd0dyb3VwKGVsKSB7CiAgdmFyIHRyID0gJChlbCkucGFyZW50cygndHInKS5maXJzdCgpOwogIHZhciBuID0gdHIubmV4dCgpOwogIHRyLnRvZ2dsZUNsYXNzKCdvcGVuJyk7CiAgJChlbCkudG9nZ2xlQ2xhc3MoJ2ljb24tZXhwYW5kZWQgaWNvbi1jb2xsYXBzZWQnKTsKICB0b2dnbGVFeHBlbmRDb2xsYXBzZUljb24oZWwpCiAgd2hpbGUgKG4ubGVuZ3RoICYmICFuLmhhc0NsYXNzKCdncm91cCcpKSB7CiAgICBuLnRvZ2dsZSgpOwogICAgbiA9IG4ubmV4dCgndHInKTsKICB9Cn0KCmZ1bmN0aW9uIHRvZ2dsZUV4cGVuZENvbGxhcHNlSWNvbihlbCkgewogIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2ljb24tZXhwYW5kZWQnKSkgewogICAgdXBkYXRlU1ZHSWNvbihlbCwgJ2FuZ2xlLWRvd24nKQogIH0gZWxzZSB7CiAgICB1cGRhdGVTVkdJY29uKGVsLCAnYW5nbGUtcmlnaHQnKQogIH0KfQoKZnVuY3Rpb24gdXBkYXRlU1ZHSWNvbihlbGVtZW50LCBpY29uKSB7CiAgY29uc3QgaWNvbkVsZW1lbnQgPSBlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ1c2UiKS5pdGVtKDApCgogIGlmIChpY29uRWxlbWVudCA9PT0gbnVsbCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgY29uc3QgaWNvblBhdGggPSBpY29uRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTsKICBpY29uRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBpY29uUGF0aC5yZXBsYWNlKC8jLiokL2csICIjaWNvbi0tIiArIGljb24pKQp9CgpmdW5jdGlvbiBjb2xsYXBzZUFsbFJvd0dyb3VwcyhlbCkgewogIHZhciB0Ym9keSA9ICQoZWwpLnBhcmVudHMoJ3Rib2R5JykuZmlyc3QoKTsKICB0Ym9keS5jaGlsZHJlbigndHInKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnZ3JvdXAnKSkgewogICAgICAkKHRoaXMpLnJlbW92ZUNsYXNzKCdvcGVuJyk7CiAgICAgICQodGhpcykuZmluZCgnLmV4cGFuZGVyJykuc3dpdGNoQ2xhc3MoJ2ljb24tZXhwYW5kZWQnLCAnaWNvbi1jb2xsYXBzZWQnKTsKICAgIH0gZWxzZSB7CiAgICAgICQodGhpcykuaGlkZSgpOwogICAgfQogIH0pOwp9CgpmdW5jdGlvbiBleHBhbmRBbGxSb3dHcm91cHMoZWwpIHsKICB2YXIgdGJvZHkgPSAkKGVsKS5wYXJlbnRzKCd0Ym9keScpLmZpcnN0KCk7CiAgdGJvZHkuY2hpbGRyZW4oJ3RyJykuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ2dyb3VwJykpIHsKICAgICAgJCh0aGlzKS5hZGRDbGFzcygnb3BlbicpOwogICAgICAkKHRoaXMpLmZpbmQoJy5leHBhbmRlcicpLnN3aXRjaENsYXNzKCdpY29uLWNvbGxhcHNlZCcsICdpY29uLWV4cGFuZGVkJyk7CiAgICB9IGVsc2UgewogICAgICAkKHRoaXMpLnNob3coKTsKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gdG9nZ2xlQWxsUm93R3JvdXBzKGVsKSB7CiAgdmFyIHRyID0gJChlbCkucGFyZW50cygndHInKS5maXJzdCgpOwogIGlmICh0ci5oYXNDbGFzcygnb3BlbicpKSB7CiAgICBjb2xsYXBzZUFsbFJvd0dyb3VwcyhlbCk7CiAgfSBlbHNlIHsKICAgIGV4cGFuZEFsbFJvd0dyb3VwcyhlbCk7CiAgfQp9CgpmdW5jdGlvbiB0b2dnbGVGaWVsZHNldChlbCkgewogIHZhciBmaWVsZHNldCA9ICQoZWwpLnBhcmVudHMoJ2ZpZWxkc2V0JykuZmlyc3QoKTsKICBmaWVsZHNldC50b2dnbGVDbGFzcygnY29sbGFwc2VkJyk7CiAgZmllbGRzZXQuY2hpbGRyZW4oJ2xlZ2VuZCcpLnRvZ2dsZUNsYXNzKCdpY29uLWV4cGFuZGVkIGljb24tY29sbGFwc2VkJyk7CiAgdG9nZ2xlRXhwZW5kQ29sbGFwc2VJY29uKGZpZWxkc2V0LmNoaWxkcmVuKCdsZWdlbmQnKVswXSkKICBmaWVsZHNldC5jaGlsZHJlbignZGl2JykudG9nZ2xlKCk7Cn0KCmZ1bmN0aW9uIGhpZGVGaWVsZHNldChlbCkgewogIHZhciBmaWVsZHNldCA9ICQoZWwpLnBhcmVudHMoJ2ZpZWxkc2V0JykuZmlyc3QoKTsKICBmaWVsZHNldC50b2dnbGVDbGFzcygnY29sbGFwc2VkJyk7CiAgZmllbGRzZXQuY2hpbGRyZW4oJ2RpdicpLmhpZGUoKTsKfQoKLy8gY29sdW1ucyBzZWxlY3Rpb24KZnVuY3Rpb24gbW92ZU9wdGlvbnModGhlU2VsRnJvbSwgdGhlU2VsVG8pIHsKICAkKHRoZVNlbEZyb20pLmZpbmQoJ29wdGlvbjpzZWxlY3RlZCcpLmRldGFjaCgpLnByb3AoInNlbGVjdGVkIiwgZmFsc2UpLmFwcGVuZFRvKCQodGhlU2VsVG8pKTsKfQoKZnVuY3Rpb24gbW92ZU9wdGlvblVwKHRoZVNlbCkgewogICQodGhlU2VsKS5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAkKHRoaXMpLnByZXYoJzpub3QoOnNlbGVjdGVkKScpLmRldGFjaCgpLmluc2VydEFmdGVyKCQodGhpcykpOwogIH0pOwp9CgpmdW5jdGlvbiBtb3ZlT3B0aW9uVG9wKHRoZVNlbCkgewogICQodGhlU2VsKS5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS5kZXRhY2goKS5wcmVwZW5kVG8oJCh0aGVTZWwpKTsKfQoKZnVuY3Rpb24gbW92ZU9wdGlvbkRvd24odGhlU2VsKSB7CiAgJCgkKHRoZVNlbCkuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykuZ2V0KCkucmV2ZXJzZSgpKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAkKHRoaXMpLm5leHQoJzpub3QoOnNlbGVjdGVkKScpLmRldGFjaCgpLmluc2VydEJlZm9yZSgkKHRoaXMpKTsKICB9KTsKfQoKZnVuY3Rpb24gbW92ZU9wdGlvbkJvdHRvbSh0aGVTZWwpIHsKICAkKHRoZVNlbCkuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykuZGV0YWNoKCkuYXBwZW5kVG8oJCh0aGVTZWwpKTsKfQoKZnVuY3Rpb24gaW5pdEZpbHRlcnMoKSB7CiAgJCgnI2FkZF9maWx0ZXJfc2VsZWN0JykuY2hhbmdlKGZ1bmN0aW9uKCkgewogICAgYWRkRmlsdGVyKCQodGhpcykudmFsKCksICcnLCBbXSk7CiAgfSk7CiAgJCgnI2ZpbHRlcnMtdGFibGUgLmZpZWxkIGlucHV0W3R5cGU9Y2hlY2tib3hdJykuZWFjaChmdW5jdGlvbigpIHsKICAgIHRvZ2dsZUZpbHRlcigkKHRoaXMpLnZhbCgpKTsKICB9KTsKICAkKCcjZmlsdGVycy10YWJsZScpLm9uKCdjbGljaycsICcuZmllbGQgaW5wdXRbdHlwZT1jaGVja2JveF0nLCBmdW5jdGlvbigpIHsKICAgIHRvZ2dsZUZpbHRlcigkKHRoaXMpLnZhbCgpKTsKICB9KTsKICAkKCcjZmlsdGVycy10YWJsZScpLm9uKCdrZXlwcmVzcycsICdpbnB1dFt0eXBlPXRleHRdJywgZnVuY3Rpb24oZSkgewogICAgaWYgKGUua2V5Q29kZSA9PSAxMykgJCh0aGlzKS5jbG9zZXN0KCdmb3JtJykuc3VibWl0KCk7CiAgfSk7Cn0KCmZ1bmN0aW9uIGFkZEZpbHRlcihmaWVsZCwgb3BlcmF0b3IsIHZhbHVlcykgewogIHZhciBmaWVsZElkID0gZmllbGQucmVwbGFjZSgnLicsICdfJyk7CiAgdmFyIHRyID0gJCgnI3RyXycrZmllbGRJZCk7CgogIHZhciBmaWx0ZXJPcHRpb25zID0gYXZhaWxhYmxlRmlsdGVyc1tmaWVsZF07CiAgaWYgKCFmaWx0ZXJPcHRpb25zKSByZXR1cm47CgogIGlmIChmaWx0ZXJPcHRpb25zWydyZW1vdGUnXSAmJiBmaWx0ZXJPcHRpb25zWyd2YWx1ZXMnXSA9PSBudWxsKSB7CiAgICAkLmdldEpTT04oZmlsdGVyc1VybCwgeyduYW1lJzogZmllbGR9KS5kb25lKGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgZmlsdGVyT3B0aW9uc1sndmFsdWVzJ10gPSBkYXRhOwogICAgICBhZGRGaWx0ZXIoZmllbGQsIG9wZXJhdG9yLCB2YWx1ZXMpIDsKICAgIH0pOwogICAgcmV0dXJuOwogIH0KCiAgaWYgKHRyLmxlbmd0aCA+IDApIHsKICAgIHRyLnNob3coKTsKICB9IGVsc2UgewogICAgYnVpbGRGaWx0ZXJSb3coZmllbGQsIG9wZXJhdG9yLCB2YWx1ZXMpOwogIH0KICAkKCcjY2JfJytmaWVsZElkKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7CiAgdG9nZ2xlRmlsdGVyKGZpZWxkKTsKICB0b2dnbGVNdWx0aVNlbGVjdEljb25Jbml0KCk7CiAgJCgnI2FkZF9maWx0ZXJfc2VsZWN0JykudmFsKCcnKS5maW5kKCdvcHRpb24nKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgaWYgKCQodGhpcykuYXR0cigndmFsdWUnKSA9PSBmaWVsZCkgewogICAgICAkKHRoaXMpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIGJ1aWxkRmlsdGVyUm93KGZpZWxkLCBvcGVyYXRvciwgdmFsdWVzKSB7CiAgdmFyIGZpZWxkSWQgPSBmaWVsZC5yZXBsYWNlKCcuJywgJ18nKTsKICB2YXIgZmlsdGVyVGFibGUgPSAkKCIjZmlsdGVycy10YWJsZSIpOwogIHZhciBmaWx0ZXJPcHRpb25zID0gYXZhaWxhYmxlRmlsdGVyc1tmaWVsZF07CiAgaWYgKCFmaWx0ZXJPcHRpb25zKSByZXR1cm47CiAgdmFyIG9wZXJhdG9ycyA9IG9wZXJhdG9yQnlUeXBlW2ZpbHRlck9wdGlvbnNbJ3R5cGUnXV07CiAgdmFyIGZpbHRlclZhbHVlcyA9IGZpbHRlck9wdGlvbnNbJ3ZhbHVlcyddOwogIHZhciBzZWxlY3Q7CgogIHZhciB0ciA9ICQoJzxkaXYgY2xhc3M9ImZpbHRlciI+JykuYXR0cignaWQnLCAndHJfJytmaWVsZElkKS5odG1sKAogICAgJzxkaXYgY2xhc3M9ImZpZWxkIj48aW5wdXQgY2hlY2tlZD0iY2hlY2tlZCIgaWQ9ImNiXycrZmllbGRJZCsnIiBuYW1lPSJmW10iIHZhbHVlPSInK2ZpZWxkKyciIHR5cGU9ImNoZWNrYm94Ij48bGFiZWwgZm9yPSJjYl8nK2ZpZWxkSWQrJyI+ICcrZmlsdGVyT3B0aW9uc1snbmFtZSddKyc8L2xhYmVsPjwvZGl2PicgKwogICAgJzxkaXYgY2xhc3M9Im9wZXJhdG9yIj48c2VsZWN0IGlkPSJvcGVyYXRvcnNfJytmaWVsZElkKyciIG5hbWU9Im9wWycrZmllbGQrJ10iPjwvc2VsZWN0PjwvZGl2PicgKwogICAgJzxkaXYgY2xhc3M9InZhbHVlcyI+PC9kaXY+JwogICk7CiAgZmlsdGVyVGFibGUuYXBwZW5kKHRyKTsKCiAgc2VsZWN0ID0gdHIuZmluZCgnLm9wZXJhdG9yIHNlbGVjdCcpOwogIG9wZXJhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uKG9wKSB7CiAgICB2YXIgb3B0aW9uID0gJCgnPG9wdGlvbj4nKS52YWwob3ApLnRleHQob3BlcmF0b3JMYWJlbHNbb3BdKTsKICAgIGlmIChvcCA9PSBvcGVyYXRvcikgeyBvcHRpb24ucHJvcCgnc2VsZWN0ZWQnLCB0cnVlKTsgfQogICAgc2VsZWN0LmFwcGVuZChvcHRpb24pOwogIH0pOwogIHNlbGVjdC5jaGFuZ2UoZnVuY3Rpb24oKXsgdG9nZ2xlT3BlcmF0b3IoZmllbGQpOyB9KTsKCiAgc3dpdGNoIChmaWx0ZXJPcHRpb25zWyd0eXBlJ10pIHsKICBjYXNlICJsaXN0IjoKICBjYXNlICJsaXN0X3dpdGhfaGlzdG9yeSI6CiAgY2FzZSAibGlzdF9vcHRpb25hbCI6CiAgY2FzZSAibGlzdF9vcHRpb25hbF93aXRoX2hpc3RvcnkiOgogIGNhc2UgImxpc3Rfc3RhdHVzIjoKICBjYXNlICJsaXN0X3N1YnByb2plY3RzIjoKICAgIGNvbnN0IGljb25UeXBlID0gdmFsdWVzLmxlbmd0aCA+IDEgPyAndG9nZ2xlLW1pbnVzJyA6ICd0b2dnbGUtcGx1cyc7CiAgICBjb25zdCBjbG9uZWRJY29uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2ljb24tY29weS1zb3VyY2Ugc3ZnJykuY2xvbmVOb2RlKHRydWUpOwogICAgdXBkYXRlU1ZHSWNvbihjbG9uZWRJY29uLCBpY29uVHlwZSk7CgogICAgdHIuZmluZCgnLnZhbHVlcycpLmFwcGVuZCgKICAgICAgJCgnPHNwYW4+JywgeyBzdHlsZTogJ2Rpc3BsYXk6bm9uZTsnIH0pLmFwcGVuZCgKICAgICAgICAkKCc8c2VsZWN0PicsIHsKICAgICAgICAgIGNsYXNzOiAndmFsdWUnLAogICAgICAgICAgaWQ6IGB2YWx1ZXNfJHtmaWVsZElkfV8xYCwKICAgICAgICAgIG5hbWU6IGB2WyR7ZmllbGR9XVtdYCwKICAgICAgICB9KSwKICAgICAgICAnXG4nLAogICAgICAgICQoJzxzcGFuPicsIHsgY2xhc3M6IGB0b2dnbGUtbXVsdGlzZWxlY3QgaWNvbi1vbmx5IGljb24tJHtpY29uVHlwZX1gIH0pLmFwcGVuZChjbG9uZWRJY29uKQogICAgICApCiAgICApOwogICAgc2VsZWN0ID0gdHIuZmluZCgnLnZhbHVlcyBzZWxlY3QnKTsKICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMSkgeyBzZWxlY3QuYXR0cignbXVsdGlwbGUnLCB0cnVlKTsgfQogICAgZmlsdGVyVmFsdWVzLmZvckVhY2goZnVuY3Rpb24oZmlsdGVyVmFsdWUpIHsKICAgICAgdmFyIG9wdGlvbiA9ICQoJzxvcHRpb24+Jyk7CiAgICAgIGlmICgkLmlzQXJyYXkoZmlsdGVyVmFsdWUpKSB7CiAgICAgICAgb3B0aW9uLnZhbChmaWx0ZXJWYWx1ZVsxXSkudGV4dChmaWx0ZXJWYWx1ZVswXSk7CiAgICAgICAgaWYgKCQuaW5BcnJheShmaWx0ZXJWYWx1ZVsxXSwgdmFsdWVzKSA+IC0xKSB7b3B0aW9uLnByb3AoJ3NlbGVjdGVkJywgdHJ1ZSk7fQogICAgICAgIGlmIChmaWx0ZXJWYWx1ZS5sZW5ndGggPT0gMykgewogICAgICAgICAgdmFyIG9wdGdyb3VwID0gc2VsZWN0LmZpbmQoJ29wdGdyb3VwJykuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuICQodGhpcykuYXR0cignbGFiZWwnKSA9PSBmaWx0ZXJWYWx1ZVsyXX0pOwogICAgICAgICAgaWYgKCFvcHRncm91cC5sZW5ndGgpIHtvcHRncm91cCA9ICQoJzxvcHRncm91cD4nKS5hdHRyKCdsYWJlbCcsIGZpbHRlclZhbHVlWzJdKTt9CiAgICAgICAgICBvcHRpb24gPSBvcHRncm91cC5hcHBlbmQob3B0aW9uKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb3B0aW9uLnZhbChmaWx0ZXJWYWx1ZSkudGV4dChmaWx0ZXJWYWx1ZSk7CiAgICAgICAgaWYgKCQuaW5BcnJheShmaWx0ZXJWYWx1ZSwgdmFsdWVzKSA+IC0xKSB7b3B0aW9uLnByb3AoJ3NlbGVjdGVkJywgdHJ1ZSk7fQogICAgICB9CiAgICAgIHNlbGVjdC5hcHBlbmQob3B0aW9uKTsKICAgIH0pOwogICAgYnJlYWs7CiAgY2FzZSAiZGF0ZSI6CiAgY2FzZSAiZGF0ZV9wYXN0IjoKICAgIHRyLmZpbmQoJy52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9ImRhdGUiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnXzEiIHNpemU9IjEwIiBjbGFzcz0idmFsdWUgZGF0ZV92YWx1ZSIgLz48L3NwYW4+JyArCiAgICAgICcgPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZTsiPjxpbnB1dCB0eXBlPSJkYXRlIiBuYW1lPSJ2WycrZmllbGQrJ11bXSIgaWQ9InZhbHVlc18nK2ZpZWxkSWQrJ18yIiBzaXplPSIxMCIgY2xhc3M9InZhbHVlIGRhdGVfdmFsdWUiIC8+PC9zcGFuPicgKwogICAgICAnIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKyciIHNpemU9IjMiIGNsYXNzPSJ2YWx1ZSIgLz4gJytsYWJlbERheVBsdXJhbCsnPC9zcGFuPicKICAgICk7CiAgICAkKCcjdmFsdWVzXycrZmllbGRJZCsnXzEnKS52YWwodmFsdWVzWzBdKS5kYXRlcGlja2VyRmFsbGJhY2soZGF0ZXBpY2tlck9wdGlvbnMpOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQrJ18yJykudmFsKHZhbHVlc1sxXSkuZGF0ZXBpY2tlckZhbGxiYWNrKGRhdGVwaWNrZXJPcHRpb25zKTsKICAgICQoJyN2YWx1ZXNfJytmaWVsZElkKS52YWwodmFsdWVzWzBdKTsKICAgIGJyZWFrOwogIGNhc2UgInN0cmluZyI6CiAgY2FzZSAidGV4dCI6CiAgY2FzZSAic2VhcmNoIjoKICAgIHRyLmZpbmQoJy52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnIiBzaXplPSIzMCIgY2xhc3M9InZhbHVlIiAvPjwvc3Bhbj4nCiAgICApOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQpLnZhbCh2YWx1ZXNbMF0pOwogICAgYnJlYWs7CiAgY2FzZSAicmVsYXRpb24iOgogICAgdHIuZmluZCgnLnZhbHVlcycpLmFwcGVuZCgKICAgICAgJzxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKyciIHNpemU9IjYiIGNsYXNzPSJ2YWx1ZSIgLz48L3NwYW4+JyArCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PHNlbGVjdCBjbGFzcz0idmFsdWUiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnXzEiPjwvc2VsZWN0Pjwvc3Bhbj4nCiAgICApOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQpLnZhbCh2YWx1ZXNbMF0pOwogICAgc2VsZWN0ID0gdHIuZmluZCgnLnZhbHVlcyBzZWxlY3QnKTsKICAgIGZpbHRlclZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKGZpbHRlclZhbHVlKSB7CiAgICAgIHZhciBvcHRpb24gPSAkKCc8b3B0aW9uPicpOwogICAgICBvcHRpb24udmFsKGZpbHRlclZhbHVlWzFdKS50ZXh0KGZpbHRlclZhbHVlWzBdKTsKICAgICAgaWYgKHZhbHVlc1swXSA9PSBmaWx0ZXJWYWx1ZVsxXSkgeyBvcHRpb24ucHJvcCgnc2VsZWN0ZWQnLCB0cnVlKTsgfQogICAgICBzZWxlY3QuYXBwZW5kKG9wdGlvbik7CiAgICB9KTsKICAgIGJyZWFrOwogIGNhc2UgImludGVnZXIiOgogIGNhc2UgImZsb2F0IjoKICBjYXNlICJ0cmVlIjoKICAgIHRyLmZpbmQoJy52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnXzEiIHNpemU9IjE0IiBjbGFzcz0idmFsdWUiIC8+PC9zcGFuPicgKwogICAgICAnIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKydfMiIgc2l6ZT0iMTQiIGNsYXNzPSJ2YWx1ZSIgLz48L3NwYW4+JwogICAgKTsKICAgICQoJyN2YWx1ZXNfJytmaWVsZElkKydfMScpLnZhbCh2YWx1ZXNbMF0pOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQrJ18yJykudmFsKHZhbHVlc1sxXSk7CiAgICBicmVhazsKICB9Cn0KCmZ1bmN0aW9uIHRvZ2dsZUZpbHRlcihmaWVsZCkgewogIHZhciBmaWVsZElkID0gZmllbGQucmVwbGFjZSgnLicsICdfJyk7CiAgaWYgKCQoJyNjYl8nICsgZmllbGRJZCkuaXMoJzpjaGVja2VkJykpIHsKICAgICQoIiNvcGVyYXRvcnNfIiArIGZpZWxkSWQpLnNob3coKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpOwogICAgdG9nZ2xlT3BlcmF0b3IoZmllbGQpOwogIH0gZWxzZSB7CiAgICAkKCIjb3BlcmF0b3JzXyIgKyBmaWVsZElkKS5oaWRlKCkuYXR0cignZGlzYWJsZWQnLCB0cnVlKTsKICAgIGVuYWJsZVZhbHVlcyhmaWVsZCwgW10pOwogIH0KfQoKZnVuY3Rpb24gZW5hYmxlVmFsdWVzKGZpZWxkLCBpbmRleGVzKSB7CiAgdmFyIGZpZWxkSWQgPSBmaWVsZC5yZXBsYWNlKCcuJywgJ18nKTsKICAkKCcjdHJfJytmaWVsZElkKycgLnZhbHVlcyAudmFsdWUnKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICBpZiAoJC5pbkFycmF5KGluZGV4LCBpbmRleGVzKSA+PSAwKSB7CiAgICAgICQodGhpcykucmVtb3ZlQXR0cignZGlzYWJsZWQnKTsKICAgICAgJCh0aGlzKS5wYXJlbnRzKCdzcGFuJykuZmlyc3QoKS5zaG93KCk7CiAgICB9IGVsc2UgewogICAgICAkKHRoaXMpLnZhbCgnJyk7CiAgICAgICQodGhpcykuYXR0cignZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgJCh0aGlzKS5wYXJlbnRzKCdzcGFuJykuZmlyc3QoKS5oaWRlKCk7CiAgICB9CgogICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ2dyb3VwJykpIHsKICAgICAgJCh0aGlzKS5hZGRDbGFzcygnb3BlbicpOwogICAgfSBlbHNlIHsKICAgICAgJCh0aGlzKS5zaG93KCk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIHRvZ2dsZU9wZXJhdG9yKGZpZWxkKSB7CiAgdmFyIGZpZWxkSWQgPSBmaWVsZC5yZXBsYWNlKCcuJywgJ18nKTsKICB2YXIgb3BlcmF0b3IgPSAkKCIjb3BlcmF0b3JzXyIgKyBmaWVsZElkKTsKICBzd2l0Y2ggKG9wZXJhdG9yLnZhbCgpKSB7CiAgICBjYXNlICIhKiI6CiAgICBjYXNlICIqIjoKICAgIGNhc2UgIm5kIjoKICAgIGNhc2UgInQiOgogICAgY2FzZSAibGQiOgogICAgY2FzZSAibnciOgogICAgY2FzZSAidyI6CiAgICBjYXNlICJsdyI6CiAgICBjYXNlICJsMnciOgogICAgY2FzZSAibm0iOgogICAgY2FzZSAibSI6CiAgICBjYXNlICJsbSI6CiAgICBjYXNlICJ5IjoKICAgIGNhc2UgIm8iOgogICAgY2FzZSAiYyI6CiAgICBjYXNlICIqbyI6CiAgICBjYXNlICIhbyI6CiAgICAgIGVuYWJsZVZhbHVlcyhmaWVsZCwgW10pOwogICAgICBicmVhazsKICAgIGNhc2UgIj48IjoKICAgICAgZW5hYmxlVmFsdWVzKGZpZWxkLCBbMCwxXSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAiPHQrIjoKICAgIGNhc2UgIj50KyI6CiAgICBjYXNlICI+PHQrIjoKICAgIGNhc2UgInQrIjoKICAgIGNhc2UgIj50LSI6CiAgICBjYXNlICI8dC0iOgogICAgY2FzZSAiPjx0LSI6CiAgICBjYXNlICJ0LSI6CiAgICAgIGVuYWJsZVZhbHVlcyhmaWVsZCwgWzJdKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICI9cCI6CiAgICBjYXNlICI9IXAiOgogICAgY2FzZSAiIXAiOgogICAgICBlbmFibGVWYWx1ZXMoZmllbGQsIFsxXSk7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgZW5hYmxlVmFsdWVzKGZpZWxkLCBbMF0pOwogICAgICBicmVhazsKICB9Cn0KCmZ1bmN0aW9uIHRvZ2dsZU11bHRpU2VsZWN0KGVsKSB7CiAgdmFyIGlzV29ya2Zsb3cgPSBlbC5jbG9zZXN0KCcuY29udHJvbGxlci13b3JrZmxvd3MnKTsKICBpZiAoZWwuYXR0cignbXVsdGlwbGUnKSkgewogICAgZWwucmVtb3ZlQXR0cignbXVsdGlwbGUnKTsKICAgIGlmIChpc1dvcmtmbG93KSB7IGVsLmZpbmQoIm9wdGlvblt2YWx1ZT1hbGxdIikuc2hvdygpOyB9CiAgICBlbC5hdHRyKCdzaXplJywgMSk7CiAgfSBlbHNlIHsKICAgIGVsLmF0dHIoJ211bHRpcGxlJywgdHJ1ZSk7CiAgICBpZiAoaXNXb3JrZmxvdykgeyBlbC5maW5kKCJvcHRpb25bdmFsdWU9YWxsXSIpLmF0dHIoInNlbGVjdGVkIiwgZmFsc2UpLmhpZGUoKTsgfQogICAgaWYgKGVsLmNoaWxkcmVuKCkubGVuZ3RoID4gMTApCiAgICAgIGVsLmF0dHIoJ3NpemUnLCAxMCk7CiAgICBlbHNlCiAgICAgIGVsLmF0dHIoJ3NpemUnLCA0KTsKICB9Cn0KCmZ1bmN0aW9uIHNob3dUYWIobmFtZSwgdXJsKSB7CiAgJCgnI3RhYi1jb250ZW50LScgKyBuYW1lKS5wYXJlbnQoKS5maW5kKCcudGFiLWNvbnRlbnQnKS5oaWRlKCk7CiAgJCgnI3RhYi1jb250ZW50LScgKyBuYW1lKS5zaG93KCk7CiAgJCgnI3RhYi0nICsgbmFtZSkuY2xvc2VzdCgnLnRhYnMnKS5maW5kKCdhJykucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkJyk7CiAgJCgnI3RhYi0nICsgbmFtZSkuYWRkQ2xhc3MoJ3NlbGVjdGVkJyk7CgogIHJlcGxhY2VJbkhpc3RvcnkodXJsKQoKICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIHNob3dJc3N1ZUhpc3Rvcnkoam91cm5hbCwgdXJsKSB7CiAgdGFiX2NvbnRlbnQgPSAkKCcjdGFiLWNvbnRlbnQtaGlzdG9yeScpOwogIHRhYl9jb250ZW50LnBhcmVudCgpLmZpbmQoJy50YWItY29udGVudCcpLmhpZGUoKTsKICB0YWJfY29udGVudC5zaG93KCk7CiAgdGFiX2NvbnRlbnQucGFyZW50KCkuY2hpbGRyZW4oJ2Rpdi50YWJzJykuZmluZCgnYScpLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpOwoKICAkKCcjdGFiLScgKyBqb3VybmFsKS5hZGRDbGFzcygnc2VsZWN0ZWQnKTsKCiAgcmVwbGFjZUluSGlzdG9yeSh1cmwpCgogIHN3aXRjaChqb3VybmFsKSB7CiAgICBjYXNlICdub3Rlcyc6CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbDpub3QoLmhhcy1ub3RlcyknKS5oaWRlKCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC53aWtpJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAuY29udGV4dHVhbCAuam91cm5hbC1hY3Rpb25zJykuc2hvdygpOwoKICAgICAgLy8gYWx3YXlzIHNob3cgdGh1bWJuYWlscyBpbiBub3RlcyB0YWIKICAgICAgdmFyIHRodW1ibmFpbHMgPSB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAudGh1bWJuYWlscycpOwogICAgICB0aHVtYm5haWxzLnNob3coKTsKICAgICAgLy8gc2hvdyBqb3VybmFscyB3aXRob3V0IG5vdGVzLCBidXQgd2l0aCB0aHVtYm5haWxzCiAgICAgIHRodW1ibmFpbHMucGFyZW50cygnLmpvdXJuYWwnKS5zaG93KCk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAncHJvcGVydGllcyc6CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbDpub3QoLmhhcy1kZXRhaWxzKScpLmhpZGUoKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwgLndpa2knKS5oaWRlKCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC50aHVtYm5haWxzJykuaGlkZSgpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAuY29udGV4dHVhbCAuam91cm5hbC1hY3Rpb25zJykuaGlkZSgpOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAud2lraScpLnNob3coKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwgLnRodW1ibmFpbHMnKS5zaG93KCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC5jb250ZXh0dWFsIC5qb3VybmFsLWFjdGlvbnMnKS5zaG93KCk7CiAgfQoKICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIGdldFJlbW90ZVRhYihuYW1lLCByZW1vdGVfdXJsLCB1cmwsIGxvYWRfYWx3YXlzKSB7CiAgbG9hZF9hbHdheXMgPSBsb2FkX2Fsd2F5cyB8fCBmYWxzZTsKICB2YXIgdGFiX2NvbnRlbnQgPSAkKCcjdGFiLWNvbnRlbnQtJyArIG5hbWUpOwoKICB0YWJfY29udGVudC5wYXJlbnQoKS5maW5kKCcudGFiLWNvbnRlbnQnKS5oaWRlKCk7CiAgdGFiX2NvbnRlbnQucGFyZW50KCkuY2hpbGRyZW4oJ2Rpdi50YWJzJykuZmluZCgnYScpLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpOwogICQoJyN0YWItJyArIG5hbWUpLmFkZENsYXNzKCdzZWxlY3RlZCcpOwoKICByZXBsYWNlSW5IaXN0b3J5KHVybCk7CgogIGlmICh0YWJfY29udGVudC5jaGlsZHJlbigpLmxlbmd0aCA9PSAwICYmIGxvYWRfYWx3YXlzID09IGZhbHNlKSB7CiAgICAkLmFqYXgoewogICAgICB1cmw6IHJlbW90ZV91cmwsCiAgICAgIHR5cGU6ICdnZXQnLAogICAgICBzdWNjZXNzOiBmdW5jdGlvbihkYXRhKXsKICAgICAgICB0YWJfY29udGVudC5odG1sKGRhdGEpCiAgICAgIH0KICAgIH0pOwogIH0KCiAgdGFiX2NvbnRlbnQuc2hvdygpOwogIHJldHVybiBmYWxzZTsKfQoKLy9yZXBsYWNlcyBjdXJyZW50IFVSTCB3aXRoIHRoZSAiaHJlZiIgYXR0cmlidXRlIG9mIHRoZSBjdXJyZW50IGxpbmsKLy8ob25seSB0cmlnZ2VyZWQgaWYgc3VwcG9ydGVkIGJ5IGJyb3dzZXIpCmZ1bmN0aW9uIHJlcGxhY2VJbkhpc3RvcnkodXJsKSB7CiAgaWYgKCJyZXBsYWNlU3RhdGUiIGluIHdpbmRvdy5oaXN0b3J5ICYmIHVybCAhPT0gdW5kZWZpbmVkKSB7CiAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwgZG9jdW1lbnQudGl0bGUsIHVybCk7CiAgfQp9CgpmdW5jdGlvbiBtb3ZlVGFiUmlnaHQoZWwpIHsKICB2YXIgbGlzID0gJChlbCkucGFyZW50cygnZGl2LnRhYnMnKS5maXJzdCgpLmZpbmQoJ3VsJykuY2hpbGRyZW4oKTsKICB2YXIgYncgPSAkKGVsKS5wYXJlbnRzKCdkaXYudGFicy1idXR0b25zJykub3V0ZXJXaWR0aCh0cnVlKTsKICB2YXIgdGFic1dpZHRoID0gMDsKICB2YXIgaSA9IDA7CiAgbGlzLmVhY2goZnVuY3Rpb24oKSB7CiAgICBpZiAoJCh0aGlzKS5pcygnOnZpc2libGUnKSkgewogICAgICB0YWJzV2lkdGggKz0gJCh0aGlzKS5vdXRlcldpZHRoKHRydWUpOwogICAgfQogIH0pOwogIGlmICh0YWJzV2lkdGggPCAkKGVsKS5wYXJlbnRzKCdkaXYudGFicycpLmZpcnN0KCkud2lkdGgoKSAtIGJ3KSB7IHJldHVybjsgfQogICQoZWwpLnNpYmxpbmdzKCcudGFiLWxlZnQnKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICB3aGlsZSAoaTxsaXMubGVuZ3RoICYmICFsaXMuZXEoaSkuaXMoJzp2aXNpYmxlJykpIHsgaSsrOyB9CiAgdmFyIHcgPSBsaXMuZXEoaSkud2lkdGgoKTsKICBsaXMuZXEoaSkuaGlkZSgpOwogIGlmICh0YWJzV2lkdGggLSB3IDwgJChlbCkucGFyZW50cygnZGl2LnRhYnMnKS5maXJzdCgpLndpZHRoKCkgLSBidykgewogICAgJChlbCkuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7CiAgfQp9CgpmdW5jdGlvbiBtb3ZlVGFiTGVmdChlbCkgewogIHZhciBsaXMgPSAkKGVsKS5wYXJlbnRzKCdkaXYudGFicycpLmZpcnN0KCkuZmluZCgndWwnKS5jaGlsZHJlbigpOwogIHZhciBpID0gMDsKICB3aGlsZSAoaSA8IGxpcy5sZW5ndGggJiYgIWxpcy5lcShpKS5pcygnOnZpc2libGUnKSkgeyBpKys7IH0KICBpZiAoaSA+IDApIHsKICAgIGxpcy5lcShpLTEpLnNob3coKTsKICAgICQoZWwpLnNpYmxpbmdzKCcudGFiLXJpZ2h0JykucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7CiAgfQogIGlmIChpIDw9IDEpIHsKICAgICQoZWwpLmFkZENsYXNzKCdkaXNhYmxlZCcpOwogIH0KfQoKZnVuY3Rpb24gZGlzcGxheVRhYnNCdXR0b25zKCkgewogIHZhciBsaXM7CiAgdmFyIHRhYnNXaWR0aDsKICB2YXIgZWw7CiAgdmFyIG51bUhpZGRlbjsKICAkKCdkaXYudGFicycpLmVhY2goZnVuY3Rpb24oKSB7CiAgICBlbCA9ICQodGhpcyk7CiAgICBsaXMgPSBlbC5maW5kKCd1bCcpLmNoaWxkcmVuKCk7CiAgICB0YWJzV2lkdGggPSAwOwogICAgbnVtSGlkZGVuID0gMDsKICAgIGxpcy5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgIGlmICgkKHRoaXMpLmlzKCc6dmlzaWJsZScpKSB7CiAgICAgICAgdGFic1dpZHRoICs9ICQodGhpcykub3V0ZXJXaWR0aCh0cnVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBudW1IaWRkZW4rKzsKICAgICAgfQogICAgfSk7CiAgICB2YXIgYncgPSAkKGVsKS5maW5kKCdkaXYudGFicy1idXR0b25zJykub3V0ZXJXaWR0aCh0cnVlKTsKICAgIGlmICgodGFic1dpZHRoIDwgZWwud2lkdGgoKSAtIGJ3KSAmJiAobGlzLmxlbmd0aCA9PT0gMCB8fCBsaXMuZmlyc3QoKS5pcygnOnZpc2libGUnKSkpIHsKICAgICAgZWwuZmluZCgnZGl2LnRhYnMtYnV0dG9ucycpLmhpZGUoKTsKICAgIH0gZWxzZSB7CiAgICAgIGVsLmZpbmQoJ2Rpdi50YWJzLWJ1dHRvbnMnKS5zaG93KCkuY2hpbGRyZW4oJ2J1dHRvbi50YWItbGVmdCcpLnRvZ2dsZUNsYXNzKCdkaXNhYmxlZCcsIG51bUhpZGRlbiA9PSAwKTsKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gc2V0UHJlZGVjZXNzb3JGaWVsZHNWaXNpYmlsaXR5KCkgewogIHZhciByZWxhdGlvblR5cGUgPSAkKCcjcmVsYXRpb25fcmVsYXRpb25fdHlwZScpOwogIGlmIChyZWxhdGlvblR5cGUudmFsKCkgPT0gInByZWNlZGVzIiB8fCByZWxhdGlvblR5cGUudmFsKCkgPT0gImZvbGxvd3MiKSB7CiAgICAkKCcjcHJlZGVjZXNzb3JfZmllbGRzJykuc2hvdygpOwogIH0gZWxzZSB7CiAgICAkKCcjcHJlZGVjZXNzb3JfZmllbGRzJykuaGlkZSgpOwogIH0KfQoKZnVuY3Rpb24gc2hvd01vZGFsKGlkLCB3aWR0aCwgdGl0bGUpIHsKICB2YXIgZWwgPSAkKCcjJytpZCkuZmlyc3QoKTsKICBpZiAoZWwubGVuZ3RoID09PSAwIHx8IGVsLmlzKCc6dmlzaWJsZScpKSB7cmV0dXJuO30KICBpZiAoIXRpdGxlKSB0aXRsZSA9IGVsLmZpbmQoJ2gzLnRpdGxlJykudGV4dCgpOwogIC8vIG1vdmVzIGV4aXN0aW5nIG1vZGFscyBiZWhpbmQgdGhlIHRyYW5zcGFyZW50IGJhY2tncm91bmQKICAkKCIubW9kYWwiKS5jc3MoJ3pJbmRleCcsOTkpOwogIGVsLmRpYWxvZyh7CiAgICB3aWR0aDogd2lkdGgsCiAgICBtb2RhbDogdHJ1ZSwKICAgIHJlc2l6YWJsZTogZmFsc2UsCiAgICBkaWFsb2dDbGFzczogJ21vZGFsJywKICAgIHRpdGxlOiB0aXRsZQogIH0pLm9uKCdkaWFsb2djbG9zZScsIGZ1bmN0aW9uKCl7CiAgICAkKCIubW9kYWwiKS5jc3MoJ3pJbmRleCcsMTAxKTsKICB9KTsKICBlbC5maW5kKCJpbnB1dFt0eXBlPXRleHRdLCBpbnB1dFt0eXBlPXN1Ym1pdF0iKS5maXJzdCgpLmZvY3VzKCk7Cn0KCmZ1bmN0aW9uIGhpZGVNb2RhbChlbCkgewogIHZhciBtb2RhbDsKICBpZiAoZWwpIHsKICAgIG1vZGFsID0gJChlbCkucGFyZW50cygnLnVpLWRpYWxvZy1jb250ZW50Jyk7CiAgfSBlbHNlIHsKICAgIG1vZGFsID0gJCgnI2FqYXgtbW9kYWwnKTsKICB9CiAgbW9kYWwuZGlhbG9nKCJjbG9zZSIpOwp9CgpmdW5jdGlvbiBjb2xsYXBzZVNjbUVudHJ5KGlkKSB7CiAgJCgnLicraWQpLmVhY2goZnVuY3Rpb24oKSB7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnb3BlbicpKSB7CiAgICAgIGNvbGxhcHNlU2NtRW50cnkoJCh0aGlzKS5hdHRyKCdpZCcpKTsKICAgIH0KICAgICQodGhpcykuaGlkZSgpOwogIH0pOwogICQoJyMnK2lkKS5yZW1vdmVDbGFzcygnb3BlbicpOwp9CgpmdW5jdGlvbiBleHBhbmRTY21FbnRyeShpZCkgewogICQoJy4nK2lkKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgJCh0aGlzKS5zaG93KCk7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnbG9hZGVkJykgJiYgISQodGhpcykuaGFzQ2xhc3MoJ2NvbGxhcHNlZCcpKSB7CiAgICAgIGV4cGFuZFNjbUVudHJ5KCQodGhpcykuYXR0cignaWQnKSk7CiAgICB9CiAgfSk7CiAgJCgnIycraWQpLmFkZENsYXNzKCdvcGVuJyk7Cn0KCmZ1bmN0aW9uIHNjbUVudHJ5Q2xpY2soaWQsIHVybCkgewogICAgdmFyIGVsID0gJCgnIycraWQpOwoKICAgIGlmIChlbC5oYXNDbGFzcygnb3BlbicpKSB7CiAgICAgICAgY29sbGFwc2VTY21FbnRyeShpZCk7CiAgICAgICAgZWwuZmluZCgnLmV4cGFuZGVyJykuc3dpdGNoQ2xhc3MoJ2ljb24tZXhwYW5kZWQnLCAnaWNvbi1jb2xsYXBzZWQnKTsKICAgICAgICBlbC5hZGRDbGFzcygnY29sbGFwc2VkJyk7CiAgICAgICAgdXBkYXRlU1ZHSWNvbihlbC5maW5kKCcuaWNvbi1mb2xkZXInKVswXSwgJ2ZvbGRlcicpCgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0gZWxzZSBpZiAoZWwuaGFzQ2xhc3MoJ2xvYWRlZCcpKSB7CiAgICAgICAgZXhwYW5kU2NtRW50cnkoaWQpOwogICAgICAgIGVsLmZpbmQoJy5leHBhbmRlcicpLnN3aXRjaENsYXNzKCdpY29uLWNvbGxhcHNlZCcsICdpY29uLWV4cGFuZGVkJyk7CiAgICAgICAgZWwucmVtb3ZlQ2xhc3MoJ2NvbGxhcHNlZCcpOwogICAgICAgIHVwZGF0ZVNWR0ljb24oZWwuZmluZCgnLmljb24tZm9sZGVyLW9wZW4nKVswXSwgJ2ZvbGRlci1vcGVuJykKCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKGVsLmhhc0NsYXNzKCdsb2FkaW5nJykpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBlbC5hZGRDbGFzcygnbG9hZGluZycpOwogICAgJC5hamF4KHsKICAgICAgdXJsOiB1cmwsCiAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICBlbC5hZnRlcihkYXRhKTsKICAgICAgICBlbC5hZGRDbGFzcygnb3BlbicpLmFkZENsYXNzKCdsb2FkZWQnKS5yZW1vdmVDbGFzcygnbG9hZGluZycpOwogICAgICAgIHVwZGF0ZVNWR0ljb24oZWwuZmluZCgnLmljb24tZm9sZGVyJylbMF0sICdmb2xkZXItb3BlbicpCiAgICAgICAgZWwuZmluZCgnLmV4cGFuZGVyJykuc3dpdGNoQ2xhc3MoJ2ljb24tY29sbGFwc2VkJywgJ2ljb24tZXhwYW5kZWQnKTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gdHJ1ZTsKfQoKZnVuY3Rpb24gcmFuZG9tS2V5KHNpemUpIHsKICB2YXIgY2hhcnMgPSAnMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonOwogIHZhciBrZXkgPSAnJzsKICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykgewogICAga2V5ICs9IGNoYXJzLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGFycy5sZW5ndGgpKTsKICB9CiAgcmV0dXJuIGtleTsKfQoKZnVuY3Rpb24gY29weVRleHRUb0NsaXBib2FyZCh0YXJnZXQpIHsKICBpZiAodGFyZ2V0KSB7CiAgICB2YXIgdGVtcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7CiAgICB0ZW1wLnZhbHVlID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1jbGlwYm9hcmQtdGV4dCcpOwogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZW1wKTsKICAgIHRlbXAuc2VsZWN0KCk7CiAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpOwogICAgaWYgKHRlbXAucGFyZW50Tm9kZSkgewogICAgICB0ZW1wLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGVtcCk7CiAgICB9CiAgICBpZiAoJCh0YXJnZXQpLmNsb3Nlc3QoJy5kcmRuLmV4cGFuZGVkJykubGVuZ3RoKSB7CiAgICAgICQodGFyZ2V0KS5jbG9zZXN0KCcuZHJkbi5leHBhbmRlZCcpLnJlbW92ZUNsYXNzKCJleHBhbmRlZCIpOwogICAgfQogIH0KICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIHVwZGF0ZUlzc3VlRnJvbSh1cmwsIGVsKSB7CiAgJCgnI2FsbF9hdHRyaWJ1dGVzIGlucHV0LCAjYWxsX2F0dHJpYnV0ZXMgdGV4dGFyZWEsICNhbGxfYXR0cmlidXRlcyBzZWxlY3QnKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAkKHRoaXMpLmRhdGEoJ3ZhbHVlYmVmb3JldXBkYXRlJywgJCh0aGlzKS52YWwoKSk7CiAgfSk7CiAgaWYgKGVsKSB7CiAgICAkKCIjZm9ybV91cGRhdGVfdHJpZ2dlcmVkX2J5IikudmFsKCQoZWwpLmF0dHIoJ2lkJykpOwogIH0KICByZXR1cm4gJC5hamF4KHsKICAgIHVybDogdXJsLAogICAgdHlwZTogJ3Bvc3QnLAogICAgZGF0YTogJCgnI2lzc3VlLWZvcm0nKS5zZXJpYWxpemUoKQogIH0pOwp9CgpmdW5jdGlvbiByZXBsYWNlSXNzdWVGb3JtV2l0aChodG1sKXsKICB2YXIgcmVwbGFjZW1lbnQgPSAkKGh0bWwpOwogICQoJyNhbGxfYXR0cmlidXRlcyBpbnB1dCwgI2FsbF9hdHRyaWJ1dGVzIHRleHRhcmVhLCAjYWxsX2F0dHJpYnV0ZXMgc2VsZWN0JykuZWFjaChmdW5jdGlvbigpewogICAgdmFyIG9iamVjdF9pZCA9ICQodGhpcykuYXR0cignaWQnKTsKICAgIGlmIChvYmplY3RfaWQgJiYgJCh0aGlzKS5kYXRhKCd2YWx1ZWJlZm9yZXVwZGF0ZScpIT0kKHRoaXMpLnZhbCgpKSB7CiAgICAgIHJlcGxhY2VtZW50LmZpbmQoJyMnK29iamVjdF9pZCkudmFsKCQodGhpcykudmFsKCkpOwogICAgfQogIH0pOwogICQoJyNhbGxfYXR0cmlidXRlcycpLmVtcHR5KCk7CiAgJCgnI2FsbF9hdHRyaWJ1dGVzJykucHJlcGVuZChyZXBsYWNlbWVudCk7Cn0KCmZ1bmN0aW9uIHVwZGF0ZUJ1bGtFZGl0RnJvbSh1cmwpIHsKICAkLmFqYXgoewogICAgdXJsOiB1cmwsCiAgICB0eXBlOiAncG9zdCcsCiAgICBkYXRhOiAkKCcjYnVsa19lZGl0X2Zvcm0nKS5zZXJpYWxpemUoKQogIH0pOwp9CgpmdW5jdGlvbiBvYnNlcnZlQXV0b2NvbXBsZXRlRmllbGQoZmllbGRJZCwgdXJsLCBvcHRpb25zKSB7CiAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CiAgICAkKCcjJytmaWVsZElkKS5hdXRvY29tcGxldGUoJC5leHRlbmQoewogICAgICBzb3VyY2U6IHVybCwKICAgICAgbWluTGVuZ3RoOiAyLAogICAgICBwb3NpdGlvbjoge2NvbGxpc2lvbjogImZsaXBmaXQifSwKICAgICAgc2VhcmNoOiBmdW5jdGlvbigpeyQoJyMnK2ZpZWxkSWQpLmFkZENsYXNzKCdhamF4LWxvYWRpbmcnKTt9LAogICAgICByZXNwb25zZTogZnVuY3Rpb24oKXskKCcjJytmaWVsZElkKS5yZW1vdmVDbGFzcygnYWpheC1sb2FkaW5nJyk7fQogICAgfSwgb3B0aW9ucykpOwogICAgJCgnIycrZmllbGRJZCkuYWRkQ2xhc3MoJ2F1dG9jb21wbGV0ZScpOwogIH0pOwp9CgpmdW5jdGlvbiBtdWx0aXBsZUF1dG9jb21wbGV0ZUZpZWxkKGZpZWxkSWQsIHVybCwgb3B0aW9ucykgewogIGZ1bmN0aW9uIHNwbGl0KHZhbCkgewogICAgcmV0dXJuIHZhbC5zcGxpdCgvLFxzKi8pOwogIH0KCiAgZnVuY3Rpb24gZXh0cmFjdExhc3QodGVybSkgewogICAgcmV0dXJuIHNwbGl0KHRlcm0pLnBvcCgpOwogIH0KCiAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkgewogICAgJCgnIycgKyBmaWVsZElkKS5hdXRvY29tcGxldGUoJC5leHRlbmQoewogICAgICBzb3VyY2U6IGZ1bmN0aW9uIChyZXF1ZXN0LCByZXNwb25zZSkgewogICAgICAgICQuZ2V0SlNPTih1cmwsIHsKICAgICAgICAgIHRlcm06IGV4dHJhY3RMYXN0KHJlcXVlc3QudGVybSkKICAgICAgICB9LCByZXNwb25zZSk7CiAgICAgIH0sCiAgICAgIG1pbkxlbmd0aDogMiwKICAgICAgcG9zaXRpb246IHtjb2xsaXNpb246ICJmbGlwZml0In0sCiAgICAgIHNlYXJjaDogZnVuY3Rpb24gKCkgewogICAgICAgICQoJyMnICsgZmllbGRJZCkuYWRkQ2xhc3MoJ2FqYXgtbG9hZGluZycpOwogICAgICB9LAogICAgICByZXNwb25zZTogZnVuY3Rpb24gKCkgewogICAgICAgICQoJyMnICsgZmllbGRJZCkucmVtb3ZlQ2xhc3MoJ2FqYXgtbG9hZGluZycpOwogICAgICB9LAogICAgICBzZWxlY3Q6IGZ1bmN0aW9uIChldmVudCwgdWkpIHsKICAgICAgICB2YXIgdGVybXMgPSBzcGxpdCh0aGlzLnZhbHVlKTsKICAgICAgICAvLyByZW1vdmUgdGhlIGN1cnJlbnQgaW5wdXQKICAgICAgICB0ZXJtcy5wb3AoKTsKICAgICAgICAvLyBhZGQgdGhlIHNlbGVjdGVkIGl0ZW0KICAgICAgICB0ZXJtcy5wdXNoKHVpLml0ZW0udmFsdWUpOwogICAgICAgIC8vIGFkZCBwbGFjZWhvbGRlciB0byBnZXQgdGhlIGNvbW1hLWFuZC1zcGFjZSBhdCB0aGUgZW5kCiAgICAgICAgdGVybXMucHVzaCgiIik7CiAgICAgICAgdGhpcy52YWx1ZSA9IHRlcm1zLmpvaW4oIiwgIik7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9LCBvcHRpb25zKSk7CiAgICAkKCcjJyArIGZpZWxkSWQpLmFkZENsYXNzKCdhdXRvY29tcGxldGUnKTsKICB9KTsKfQoKZnVuY3Rpb24gb2JzZXJ2ZVNlYXJjaGZpZWxkKGZpZWxkSWQsIHRhcmdldElkLCB1cmwpIHsKICAkKCcjJytmaWVsZElkKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgdmFyICR0aGlzID0gJCh0aGlzKTsKICAgICR0aGlzLmFkZENsYXNzKCdhdXRvY29tcGxldGUnKTsKICAgICR0aGlzLmF0dHIoJ2RhdGEtdmFsdWUtd2FzJywgJHRoaXMudmFsKCkpOwogICAgdmFyIGNoZWNrID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciB2YWwgPSAkdGhpcy52YWwoKTsKICAgICAgaWYgKCR0aGlzLmF0dHIoJ2RhdGEtdmFsdWUtd2FzJykgIT0gdmFsKXsKICAgICAgICAkdGhpcy5hdHRyKCdkYXRhLXZhbHVlLXdhcycsIHZhbCk7CiAgICAgICAgJC5hamF4KHsKICAgICAgICAgIHVybDogdXJsLAogICAgICAgICAgdHlwZTogJ2dldCcsCiAgICAgICAgICBkYXRhOiB7cTogJHRoaXMudmFsKCl9LAogICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSl7IGlmKHRhcmdldElkKSAkKCcjJyt0YXJnZXRJZCkuaHRtbChkYXRhKTsgfSwKICAgICAgICAgIGJlZm9yZVNlbmQ6IGZ1bmN0aW9uKCl7ICR0aGlzLmFkZENsYXNzKCdhamF4LWxvYWRpbmcnKTsgfSwKICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpeyAkdGhpcy5yZW1vdmVDbGFzcygnYWpheC1sb2FkaW5nJyk7IH0KICAgICAgICB9KTsKICAgICAgfQogICAgfTsKICAgIHZhciByZXNldCA9IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGltZXIpIHsKICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsKICAgICAgICB0aW1lciA9IHNldEludGVydmFsKGNoZWNrLCAzMDApOwogICAgICB9CiAgICB9OwogICAgdmFyIHRpbWVyID0gc2V0SW50ZXJ2YWwoY2hlY2ssIDMwMCk7CiAgICAkdGhpcy5iaW5kKCdrZXl1cCBjbGljayBtb3VzZW1vdmUnLCByZXNldCk7CiAgfSk7Cn0KCiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCl7CiAgJCgiLmRyZG4gLmF1dG9jb21wbGV0ZSIpLnZhbCgnJyk7CgogIC8vIFRoaXMgdmFyaWFibGUgaXMgdXNlZCB0byBmb2N1cyBzZWxlY3RlZCBwcm9qZWN0CiAgdmFyIHNlbGVjdGVkOwogICQoZG9jdW1lbnQpLm9uKCdjbGljaycsICcuZHJkbi10cmlnZ2VyJywgZnVuY3Rpb24oZSl7CiAgICB2YXIgZHJkbiA9ICQodGhpcykuY2xvc2VzdCgiLmRyZG4iKTsKICAgIGlmIChkcmRuLmhhc0NsYXNzKCJleHBhbmRlZCIpKSB7CiAgICAgIGRyZG4ucmVtb3ZlQ2xhc3MoImV4cGFuZGVkIik7CiAgICB9IGVsc2UgewogICAgICAkKCIuZHJkbiIpLnJlbW92ZUNsYXNzKCJleHBhbmRlZCIpOwogICAgICBkcmRuLmFkZENsYXNzKCJleHBhbmRlZCIpOwogICAgICBpZiAoJCh0aGlzKS5wYXJlbnQoJyNwcm9qZWN0LWp1bXAnKS5sZW5ndGgpIHsKICAgICAgICBzZWxlY3RlZCA9ICQoJy5kcmRuLWl0ZW1zIGEuc2VsZWN0ZWQnKTsgLy8gU3RvcmUgc2VsZWN0ZWQgcHJvamVjdAogICAgICAgIHNlbGVjdGVkLmZvY3VzKCk7IC8vIENhbGxpbmcgZm9jdXMgdG8gc2Nyb2xsIHRvIHNlbGVjdGVkIHByb2plY3QKICAgICAgfQogICAgICBpZiAoIWlzTW9iaWxlKCkpIHsKICAgICAgICBkcmRuLmZpbmQoIi5hdXRvY29tcGxldGUiKS5mb2N1cygpOwogICAgICB9CiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICB9CiAgfSk7CiAgJChkb2N1bWVudCkuY2xpY2soZnVuY3Rpb24oZSl7CiAgICBpZiAoJChlLnRhcmdldCkuY2xvc2VzdCgiLmRyZG4iKS5sZW5ndGggPCAxKSB7CiAgICAgICQoIi5kcmRuLmV4cGFuZGVkIikucmVtb3ZlQ2xhc3MoImV4cGFuZGVkIik7CiAgICB9CiAgfSk7CgogIG9ic2VydmVTZWFyY2hmaWVsZCgncHJvamVjdHMtcXVpY2stc2VhcmNoJywgbnVsbCwgJCgnI3Byb2plY3RzLXF1aWNrLXNlYXJjaCcpLmRhdGEoJ2F1dG9tY29tcGxldGUtdXJsJykpOwoKICAkKCIuZHJkbi1jb250ZW50Iikua2V5ZG93bihmdW5jdGlvbihldmVudCl7CiAgICB2YXIgaXRlbXMgPSAkKHRoaXMpLmZpbmQoIi5kcmRuLWl0ZW1zIik7CgogICAgLy8gSWYgYSBwcm9qZWN0IGlzIHNlbGVjdGVkIHNldCBmb2N1c2VkIHRvIHNlbGVjdGVkIG9ubHkgb25jZQogICAgaWYgKHNlbGVjdGVkICYmIHNlbGVjdGVkLmxlbmd0aCA+IDApIHsKICAgICAgdmFyIGZvY3VzZWQgPSBzZWxlY3RlZDsKICAgICAgc2VsZWN0ZWQgPSB1bmRlZmluZWQ7CiAgICB9CiAgICBlbHNlIHsKICAgICAgdmFyIGZvY3VzZWQgPSBpdGVtcy5maW5kKCJhOmZvY3VzIik7CiAgICB9CiAgICBzd2l0Y2ggKGV2ZW50LndoaWNoKSB7CiAgICBjYXNlIDQwOiAvL2Rvd24KICAgICAgaWYgKGZvY3VzZWQubGVuZ3RoID4gMCkgewogICAgICAgIGZvY3VzZWQubmV4dEFsbCgiYSIpLmZpcnN0KCkuZm9jdXMoKTs7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaXRlbXMuZmluZCgiYSIpLmZpcnN0KCkuZm9jdXMoKTs7CiAgICAgIH0KICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDM4OiAvL3VwCiAgICAgIGlmIChmb2N1c2VkLmxlbmd0aCA+IDApIHsKICAgICAgICB2YXIgcHJldiA9IGZvY3VzZWQucHJldkFsbCgiYSIpOwogICAgICAgIGlmIChwcmV2Lmxlbmd0aCA+IDApIHsKICAgICAgICAgIHByZXYuZmlyc3QoKS5mb2N1cygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAkKHRoaXMpLmZpbmQoIi5hdXRvY29tcGxldGUiKS5mb2N1cygpOwogICAgICAgIH0KICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSAzNTogLy9lbmQKICAgICAgaWYgKGZvY3VzZWQubGVuZ3RoID4gMCkgewogICAgICAgIGZvY3VzZWQubmV4dEFsbCgiYSIpLmxhc3QoKS5mb2N1cygpOwogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlIDM2OiAvL2hvbWUKICAgICAgaWYgKGZvY3VzZWQubGVuZ3RoID4gMCkgewogICAgICAgIGZvY3VzZWQucHJldkFsbCgiYSIpLmxhc3QoKS5mb2N1cygpOwogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICB9CiAgfSk7Cn0pOwoKZnVuY3Rpb24gYmVmb3JlU2hvd0RhdGVQaWNrZXIoaW5wdXQsIGluc3QpIHsKICB2YXIgZGVmYXVsdF9kYXRlID0gbnVsbDsKICBzd2l0Y2ggKCQoaW5wdXQpLmF0dHIoImlkIikpIHsKICAgIGNhc2UgImlzc3VlX3N0YXJ0X2RhdGUiIDoKICAgICAgaWYgKCQoIiNpc3N1ZV9kdWVfZGF0ZSIpLmxlbmd0aCA+IDApIHsKICAgICAgICBkZWZhdWx0X2RhdGUgPSAkKCIjaXNzdWVfZHVlX2RhdGUiKS52YWwoKTsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgImlzc3VlX2R1ZV9kYXRlIiA6CiAgICAgIGlmICgkKCIjaXNzdWVfc3RhcnRfZGF0ZSIpLmxlbmd0aCA+IDApIHsKICAgICAgICB2YXIgc3RhcnRfZGF0ZSA9ICQoIiNpc3N1ZV9zdGFydF9kYXRlIikudmFsKCk7CiAgICAgICAgaWYgKHN0YXJ0X2RhdGUgIT0gIiIpIHsKICAgICAgICAgIHN0YXJ0X2RhdGUgPSBuZXcgRGF0ZShEYXRlLnBhcnNlKHN0YXJ0X2RhdGUpKTsKICAgICAgICAgIGlmIChzdGFydF9kYXRlID4gbmV3IERhdGUoKSkgewogICAgICAgICAgICBkZWZhdWx0X2RhdGUgPSAkKCIjaXNzdWVfc3RhcnRfZGF0ZSIpLnZhbCgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBicmVhazsKICB9CiAgJChpbnB1dCkuZGF0ZXBpY2tlckZhbGxiYWNrKCJvcHRpb24iLCAiZGVmYXVsdERhdGUiLCBkZWZhdWx0X2RhdGUpOwp9CgooZnVuY3Rpb24oJCl7CiAgJC5mbi5wb3NpdGlvbmVkSXRlbXMgPSBmdW5jdGlvbihzb3J0YWJsZU9wdGlvbnMsIG9wdGlvbnMpewogICAgdmFyIHNldHRpbmdzID0gJC5leHRlbmQoewogICAgICBmaXJzdFBvc2l0aW9uOiAxCiAgICB9LCBvcHRpb25zICk7CgogICAgcmV0dXJuIHRoaXMuc29ydGFibGUoJC5leHRlbmQoewogICAgICBheGlzOiAneScsCiAgICAgIGhhbmRsZTogIi5zb3J0LWhhbmRsZSIsCiAgICAgIGhlbHBlcjogZnVuY3Rpb24oZXZlbnQsIHVpKXsKICAgICAgICB1aS5jaGlsZHJlbigndGQnKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgICAgICAkKHRoaXMpLndpZHRoKCQodGhpcykud2lkdGgoKSk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHVpOwogICAgICB9LAogICAgICB1cGRhdGU6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgewogICAgICAgIHZhciBzb3J0YWJsZSA9ICQodGhpcyk7CiAgICAgICAgdmFyIGhhbmRsZSA9IHVpLml0ZW0uZmluZCgiLnNvcnQtaGFuZGxlIikuYWRkQ2xhc3MoImFqYXgtbG9hZGluZyIpOwogICAgICAgIHZhciB1cmwgPSBoYW5kbGUuZGF0YSgicmVvcmRlci11cmwiKTsKICAgICAgICB2YXIgcGFyYW0gPSBoYW5kbGUuZGF0YSgicmVvcmRlci1wYXJhbSIpOwogICAgICAgIHZhciBkYXRhID0ge307CiAgICAgICAgZGF0YVtwYXJhbV0gPSB7cG9zaXRpb246IHVpLml0ZW0uaW5kZXgoKSArIHNldHRpbmdzWydmaXJzdFBvc2l0aW9uJ119OwogICAgICAgICQuYWpheCh7CiAgICAgICAgICB1cmw6IHVybCwKICAgICAgICAgIHR5cGU6ICdwdXQnLAogICAgICAgICAgZGF0YVR5cGU6ICdzY3JpcHQnLAogICAgICAgICAgZGF0YTogZGF0YSwKICAgICAgICAgIGVycm9yOiBmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pewogICAgICAgICAgICBhbGVydChqcVhIUi5zdGF0dXMpOwogICAgICAgICAgICBzb3J0YWJsZS5zb3J0YWJsZSgiY2FuY2VsIik7CiAgICAgICAgICB9LAogICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bil7CiAgICAgICAgICAgIGhhbmRsZS5yZW1vdmVDbGFzcygiYWpheC1sb2FkaW5nIik7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0sCiAgICB9LCBzb3J0YWJsZU9wdGlvbnMpKTsKICB9Cn0oIGpRdWVyeSApKTsKCnZhciB3YXJuTGVhdmluZ1Vuc2F2ZWRNZXNzYWdlOwpmdW5jdGlvbiB3YXJuTGVhdmluZ1Vuc2F2ZWQobWVzc2FnZSkgewogIHdhcm5MZWF2aW5nVW5zYXZlZE1lc3NhZ2UgPSBtZXNzYWdlOwogICQoZG9jdW1lbnQpLm9uKCdzdWJtaXQnLCAnZm9ybScsIGZ1bmN0aW9uKCl7CiAgICAkKCd0ZXh0YXJlYScpLnJlbW92ZURhdGEoJ2NoYW5nZWQnKTsKICB9KTsKICAkKGRvY3VtZW50KS5vbignY2hhbmdlJywgJ3RleHRhcmVhJywgZnVuY3Rpb24oKXsKICAgICQodGhpcykuZGF0YSgnY2hhbmdlZCcsICdjaGFuZ2VkJyk7CiAgfSk7CiAgd2luZG93Lm9uYmVmb3JldW5sb2FkID0gZnVuY3Rpb24oKXsKICAgIHZhciB3YXJuID0gZmFsc2U7CiAgICAkKCd0ZXh0YXJlYScpLmJsdXIoKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgIGlmICgkKHRoaXMpLmRhdGEoJ2NoYW5nZWQnKSkgewogICAgICAgIHdhcm4gPSB0cnVlOwogICAgICB9CiAgICB9KTsKICAgIGlmICh3YXJuKSB7cmV0dXJuIHdhcm5MZWF2aW5nVW5zYXZlZE1lc3NhZ2U7fQogIH07Cn0KCmZ1bmN0aW9uIHNldHVwQWpheEluZGljYXRvcigpIHsKICAkKGRvY3VtZW50KS5iaW5kKCdhamF4U2VuZCcsIGZ1bmN0aW9uKGV2ZW50LCB4aHIsIHNldHRpbmdzKSB7CiAgICBpZiAoJCgnLmFqYXgtbG9hZGluZycpLmxlbmd0aCA9PT0gMCAmJiBzZXR0aW5ncy5jb250ZW50VHlwZSAhPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJykgewogICAgICAkKCcjYWpheC1pbmRpY2F0b3InKS5zaG93KCk7CiAgICB9CiAgfSk7CiAgJChkb2N1bWVudCkuYmluZCgnYWpheFN0b3AnLCBmdW5jdGlvbigpIHsKICAgICQoJyNhamF4LWluZGljYXRvcicpLmhpZGUoKTsKICB9KTsKfQoKZnVuY3Rpb24gc2V0dXBUYWJzKCkgewogIGlmKCQoJy50YWJzJykubGVuZ3RoID4gMCkgewogICAgZGlzcGxheVRhYnNCdXR0b25zKCk7CiAgICAkKHdpbmRvdykucmVzaXplKGRpc3BsYXlUYWJzQnV0dG9ucyk7CiAgfQp9CgpmdW5jdGlvbiBzZXR1cEZpbGVQcmV2aWV3TmF2aWdhdGlvbigpIHsKICAvLyBvbmx5IGJpbmQgYXJyb3cga2V5cyB3aGVuIHByZXZpZXcgbmF2aWdhdGlvbiBpcyBwcmVzZW50CiAgY29uc3QgZWxlbWVudCA9ICQoJy5wYWdpbmF0aW9uLmZpbGVwcmV2aWV3JykuZmlyc3QoKTsKICBpZiAoZWxlbWVudCkgewoKICAgIGNvbnN0IGhhbmRsZUFycm93S2V5ID0gZnVuY3Rpb24oc2VsZWN0b3IsIGUpewogICAgICBjb25zdCBocmVmID0gJChlbGVtZW50KS5maW5kKHNlbGVjdG9yKS5hdHRyKCdocmVmJyk7CiAgICAgIGlmIChocmVmKSB7CiAgICAgICAgd2luZG93LmxvY2F0aW9uID0gaHJlZjsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIH0KICAgIH07CgogICAgJChkb2N1bWVudCkua2V5ZG93bihmdW5jdGlvbihlKSB7CiAgICAgIGlmKGUuc2hpZnRLZXkgfHwgZS5tZXRhS2V5IHx8IGUuY3RybEtleSB8fCBlLmFsdEtleSkgcmV0dXJuOwogICAgICBzd2l0Y2goZS5rZXkpIHsKICAgICAgICBjYXNlICdBcnJvd0xlZnQnOgogICAgICAgICAgaGFuZGxlQXJyb3dLZXkoJy5wcmV2aW91cyBhJywgZSk7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnQXJyb3dSaWdodCc6CiAgICAgICAgICBoYW5kbGVBcnJvd0tleSgnLm5leHQgYScsIGUpOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0pOwogIH0KfQoKJChkb2N1bWVudCkub24oJ2tleWRvd24nLCAnZm9ybSB0ZXh0YXJlYScsIGZ1bmN0aW9uKGUpIHsKICAvLyBTdWJtaXQgdGhlIGZvcm0gd2l0aCBDdHJsICsgRW50ZXIgb3IgQ29tbWFuZCArIFJldHVybgogIHZhciB0YXJnZXRGb3JtID0gJChlLnRhcmdldCkuY2xvc2VzdCgnZm9ybScpOwogIGlmKGUua2V5Q29kZSA9PSAxMyAmJiAoKGUuY3RybEtleSAmJiAhZS5tZXRhS2V5KSB8fCAoIWUuY3RybEtleSAmJiBlLm1ldGFLZXkpICYmIHRhcmdldEZvcm0ubGVuZ3RoKSkgewogICAgLy8gRm9yIGFqYXgsIHVzZSBjbGljaygpIGluc3RlYWQgb2Ygc3VibWl0KCkgdG8gcHJldmVudCAiSW52YWxpZCBmb3JtIGF1dGhlbnRpY2l0eSB0b2tlbiIgZXJyb3IKICAgIGlmICh0YXJnZXRGb3JtLmF0dHIoJ2RhdGEtcmVtb3RlJykgPT0gJ3RydWUnKSB7CiAgICAgIGlmICh0YXJnZXRGb3JtLmZpbmQoJ2lucHV0W3R5cGU9c3VibWl0XScpLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gZmFsc2U7IH0KICAgICAgdGFyZ2V0Rm9ybS5maW5kKCd0ZXh0YXJlYScpLmJsdXIoKS5yZW1vdmVEYXRhKCdjaGFuZ2VkJyk7CiAgICAgIHRhcmdldEZvcm0uZmluZCgnaW5wdXRbdHlwZT1zdWJtaXRdJykuZmlyc3QoKS5jbGljaygpOwogICAgfSBlbHNlIHsKICAgICAgdGFyZ2V0Rm9ybS5maW5kKCd0ZXh0YXJlYScpLmJsdXIoKS5yZW1vdmVEYXRhKCdjaGFuZ2VkJyk7CiAgICAgIHRhcmdldEZvcm0uc3VibWl0KCk7CiAgICB9CiAgfQp9KTsKCgpmdW5jdGlvbiBoaWRlT25Mb2FkKCkgewogICQoJy5ob2wnKS5oaWRlKCk7Cn0KCmZ1bmN0aW9uIGFkZEZvcm1PYnNlcnZlcnNGb3JEb3VibGVTdWJtaXQoKSB7CiAgJCgnZm9ybVttZXRob2Q9cG9zdF0nKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgaWYgKCEkKHRoaXMpLmhhc0NsYXNzKCdtdWx0aXBsZS1zdWJtaXQnKSkgewogICAgICAkKHRoaXMpLnN1Ym1pdChmdW5jdGlvbihmb3JtX3N1Ym1pc3Npb24pIHsKICAgICAgICBpZiAoJChmb3JtX3N1Ym1pc3Npb24udGFyZ2V0KS5hdHRyKCdkYXRhLXN1Ym1pdHRlZCcpKSB7CiAgICAgICAgICBmb3JtX3N1Ym1pc3Npb24ucHJldmVudERlZmF1bHQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgJChmb3JtX3N1Ym1pc3Npb24udGFyZ2V0KS5hdHRyKCdkYXRhLXN1Ym1pdHRlZCcsIHRydWUpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIGRlZmF1bHRGb2N1cygpewogIGlmICgoJCgnI2NvbnRlbnQgOmZvY3VzJykubGVuZ3RoID09IDApICYmICh3aW5kb3cubG9jYXRpb24uaGFzaCA9PSAnJykpIHsKICAgICQoJyNjb250ZW50IGlucHV0W3R5cGU9dGV4dF06dmlzaWJsZSwgI2NvbnRlbnQgdGV4dGFyZWE6dmlzaWJsZScpLmZpcnN0KCkuZm9jdXMoKTsKICB9Cn0KCmZ1bmN0aW9uIGJsb2NrRXZlbnRQcm9wYWdhdGlvbihldmVudCkgewogIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7Cn0KCmZ1bmN0aW9uIHRvZ2dsZURpc2FibGVkT25DaGFuZ2UoKSB7CiAgdmFyIGNoZWNrZWQgPSAkKHRoaXMpLmlzKCc6Y2hlY2tlZCcpOwogICQoJCh0aGlzKS5kYXRhKCdkaXNhYmxlcycpKS5hdHRyKCdkaXNhYmxlZCcsIGNoZWNrZWQpOwogICQoJCh0aGlzKS5kYXRhKCdlbmFibGVzJykpLmF0dHIoJ2Rpc2FibGVkJywgIWNoZWNrZWQpOwogICQoJCh0aGlzKS5kYXRhKCdzaG93cycpKS50b2dnbGUoY2hlY2tlZCk7Cn0KZnVuY3Rpb24gdG9nZ2xlRGlzYWJsZWRJbml0KCkgewogICQoJ2lucHV0W2RhdGEtZGlzYWJsZXNdLCBpbnB1dFtkYXRhLWVuYWJsZXNdLCBpbnB1dFtkYXRhLXNob3dzXScpLmVhY2godG9nZ2xlRGlzYWJsZWRPbkNoYW5nZSk7Cn0KZnVuY3Rpb24gdG9nZ2xlTXVsdGlTZWxlY3RJY29uSW5pdCgpIHsKICAkKCcudG9nZ2xlLW11bHRpc2VsZWN0Om5vdCguaWNvbi10b2dnbGUtbWludXMpOm5vdCguaWNvbi10b2dnbGUtcGx1cyknKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICBsZXQgaWNvblR5cGU7CiAgICBpZiAoJCh0aGlzKS5zaWJsaW5ncygnc2VsZWN0JykuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykubGVuZ3RoID4gMSkgewogICAgICBpY29uVHlwZSA9ICd0b2dnbGUtbWludXMnOwogICAgfSBlbHNlIHsKICAgICAgaWNvblR5cGUgPSAndG9nZ2xlLXBsdXMnOwogICAgfQoKICAgICQodGhpcykuYWRkQ2xhc3MoYGljb24tJHtpY29uVHlwZX1gKTsKICAgIHVwZGF0ZVNWR0ljb24oJCh0aGlzKS5maW5kKCdzdmcnKVswXSwgaWNvblR5cGUpOwogIH0pOwp9CgpmdW5jdGlvbiB0b2dnbGVOZXdPYmplY3REcm9wZG93bigpIHsKICB2YXIgZHJvcGRvd24gPSAkKCcjbmV3LW9iamVjdCArIHVsLm1lbnUtY2hpbGRyZW4nKTsKICBpZihkcm9wZG93bi5oYXNDbGFzcygndmlzaWJsZScpKXsKICAgIGRyb3Bkb3duLnJlbW92ZUNsYXNzKCd2aXNpYmxlJyk7CiAgfWVsc2V7CiAgICBkcm9wZG93bi5hZGRDbGFzcygndmlzaWJsZScpOwogIH0KfQoKKGZ1bmN0aW9uICggJCApIHsKCiAgLy8gZGV0ZWN0IGlmIG5hdGl2ZSBkYXRlIGlucHV0IGlzIHN1cHBvcnRlZAogIHZhciBuYXRpdmVEYXRlSW5wdXRTdXBwb3J0ZWQgPSB0cnVlOwoKICB2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpOwogIGlucHV0LnNldEF0dHJpYnV0ZSgndHlwZScsJ2RhdGUnKTsKICBpZiAoaW5wdXQudHlwZSA9PT0gJ3RleHQnKSB7CiAgICBuYXRpdmVEYXRlSW5wdXRTdXBwb3J0ZWQgPSBmYWxzZTsKICB9CgogIHZhciBub3RBRGF0ZVZhbHVlID0gJ25vdC1hLWRhdGUnOwogIGlucHV0LnNldEF0dHJpYnV0ZSgndmFsdWUnLCBub3RBRGF0ZVZhbHVlKTsKICBpZiAoaW5wdXQudmFsdWUgPT09IG5vdEFEYXRlVmFsdWUpIHsKICAgIG5hdGl2ZURhdGVJbnB1dFN1cHBvcnRlZCA9IGZhbHNlOwogIH0KCiAgJC5mbi5kYXRlcGlja2VyRmFsbGJhY2sgPSBmdW5jdGlvbiggb3B0aW9ucyApIHsKICAgIGlmIChuYXRpdmVEYXRlSW5wdXRTdXBwb3J0ZWQpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gdGhpcy5kYXRlcGlja2VyKCBvcHRpb25zICk7CiAgICB9CiAgfTsKfSggalF1ZXJ5ICkpOwoKJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKXsKICAkKCcjY29udGVudCcpLm9uKCdjaGFuZ2UnLCAnaW5wdXRbZGF0YS1kaXNhYmxlc10sIGlucHV0W2RhdGEtZW5hYmxlc10sIGlucHV0W2RhdGEtc2hvd3NdJywgdG9nZ2xlRGlzYWJsZWRPbkNoYW5nZSk7CiAgdG9nZ2xlRGlzYWJsZWRJbml0KCk7CgogICQoJyNjb250ZW50Jykub24oJ2NsaWNrJywgJy50b2dnbGUtbXVsdGlzZWxlY3QnLCBmdW5jdGlvbigpIHsKICAgIHRvZ2dsZU11bHRpU2VsZWN0KCQodGhpcykuc2libGluZ3MoJ3NlbGVjdCcpKTsKICAgICQodGhpcykudG9nZ2xlQ2xhc3MoJ2ljb24tdG9nZ2xlLXBsdXMgaWNvbi10b2dnbGUtbWludXMnKTsKICAgIHVwZGF0ZVNWR0ljb24oJCh0aGlzKS5maW5kKCdzdmcnKVswXSwgJCh0aGlzKS5oYXNDbGFzcygnaWNvbi10b2dnbGUtcGx1cycpID8gJ3RvZ2dsZS1wbHVzJyA6ICd0b2dnbGUtbWludXMnKTsKICB9KTsKICB0b2dnbGVNdWx0aVNlbGVjdEljb25Jbml0KCk7CgogICQoJyNoaXN0b3J5IC50YWJzJykub24oJ2NsaWNrJywgJ2EnLCBmdW5jdGlvbihlKXsKICAgIHZhciB0YWIgPSAkKGUudGFyZ2V0KS5hdHRyKCdpZCcpLnJlcGxhY2UoJ3RhYi0nLCcnKTsKICAgIGRvY3VtZW50LmNvb2tpZSA9ICdoaXN0b3J5X2xhc3RfdGFiPScgKyB0YWIgKyAnOyBTYW1lU2l0ZT1MYXgnCiAgfSk7Cn0pOwoKJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKXsKICAkKCcjY29udGVudCcpLm9uKCdjbGljaycsICdkaXYuanN0VGFicyBhLnRhYi1wcmV2aWV3JywgZnVuY3Rpb24oZXZlbnQpewogICAgdmFyIHRhYiA9ICQoZXZlbnQudGFyZ2V0KTsKCiAgICB2YXIgdXJsID0gdGFiLmRhdGEoJ3VybCcpOwogICAgdmFyIGZvcm0gPSB0YWIucGFyZW50cygnZm9ybScpOwogICAgdmFyIGpzdEJsb2NrID0gdGFiLnBhcmVudHMoJy5qc3RCbG9jaycpOwoKICAgIHZhciBlbGVtZW50ID0gZW5jb2RlVVJJQ29tcG9uZW50KGpzdEJsb2NrLmZpbmQoJy53aWtpLWVkaXQnKS52YWwoKSk7CiAgICB2YXIgYXR0YWNobWVudHMgPSBmb3JtLmZpbmQoJy5hdHRhY2htZW50c19maWVsZHMgaW5wdXQnKS5zZXJpYWxpemUoKTsKCiAgICAkLmFqYXgoewogICAgICB1cmw6IHVybCwKICAgICAgdHlwZTogJ3Bvc3QnLAogICAgICBkYXRhOiAidGV4dD0iICsgZWxlbWVudCArICcmJyArIGF0dGFjaG1lbnRzLAogICAgICBzdWNjZXNzOiBmdW5jdGlvbihkYXRhKXsKICAgICAgICBqc3RCbG9jay5maW5kKCcud2lraS1wcmV2aWV3JykuaHRtbChkYXRhKTsKICAgICAgICBzZXR1cFdpa2lUYWJsZVNvcnRhYmxlSGVhZGVyKCk7CiAgICAgIH0KICAgIH0pOwogIH0pOwp9KTsKCmZ1bmN0aW9uIGtlZXBBbmNob3JPblNpZ25Jbihmb3JtKXsKICB2YXIgaGFzaCA9IGRlY29kZVVSSUNvbXBvbmVudChzZWxmLmRvY3VtZW50LmxvY2F0aW9uLmhhc2gpOwogIGlmIChoYXNoKSB7CiAgICBpZiAoaGFzaC5pbmRleE9mKCIjIikgPT09IC0xKSB7CiAgICAgIGhhc2ggPSAiIyIgKyBoYXNoOwogICAgfQogICAgZm9ybS5hY3Rpb24gPSBmb3JtLmFjdGlvbiArIGhhc2g7CiAgfQogIHJldHVybiB0cnVlOwp9CgokKGZ1bmN0aW9uICgkKSB7CiAgJCgnI2F1dGhfc291cmNlX2xkYXBfbW9kZScpLmNoYW5nZShmdW5jdGlvbiAoKSB7CiAgICAkKCcubGRhcHNfd2FybmluZycpLnRvZ2dsZSgkKHRoaXMpLnZhbCgpICE9ICdsZGFwc192ZXJpZnlfcGVlcicpOwogIH0pLmNoYW5nZSgpOwp9KTsKCmZ1bmN0aW9uIHNldEZpbGVjb250ZW50Q29udGFpbmVySGVpZ2h0KCkgewogIHZhciAkZmlsZWNvbnRhaW5lciA9ICQoJy5maWxlY29udGVudC1jb250YWluZXInKTsKICB2YXIgZmlsZVR5cGVTZWxlY3RvcnMgPSBbJy5pbWFnZScsICd2aWRlbyddOwoKICBpZigkZmlsZWNvbnRhaW5lci5sZW5ndGggPiAwICYmICRmaWxlY29udGFpbmVyLmZpbmQoZmlsZVR5cGVTZWxlY3RvcnMuam9pbignLCcpKS5sZW5ndGggPT09IDEpIHsKICAgIHZhciBjb250YWluZXJPZmZzZXRUb3AgPSAkZmlsZWNvbnRhaW5lci5vZmZzZXQoKS50b3A7CiAgICB2YXIgY29udGFpbmVyTWFyZ2luQm90dG9tID0gcGFyc2VJbnQoJGZpbGVjb250YWluZXIuY3NzKCdtYXJnaW5Cb3R0b20nKSk7CiAgICB2YXIgcGFnaW5hdGlvbkhlaWdodCA9ICRmaWxlY29udGFpbmVyLm5leHQoJy5wYWdpbmF0aW9uJykuaGVpZ2h0KCk7CiAgICB2YXIgZGlmZiA9IGNvbnRhaW5lck9mZnNldFRvcCArIGNvbnRhaW5lck1hcmdpbkJvdHRvbSArIHBhZ2luYXRpb25IZWlnaHQ7CgogICAgJGZpbGVjb250YWluZXIuY3NzKCdoZWlnaHQnLCAnY2FsYygxMDB2aCAtICcgKyBkaWZmICsgJ3B4KScpCiAgfQp9CgpmdW5jdGlvbiBzZXR1cEF0dGFjaG1lbnREZXRhaWwoKSB7CiAgc2V0RmlsZWNvbnRlbnRDb250YWluZXJIZWlnaHQoKTsKICAkKHdpbmRvdykucmVzaXplKHNldEZpbGVjb250ZW50Q29udGFpbmVySGVpZ2h0KTsKfQoKZnVuY3Rpb24gc2V0dXBXaWtpVGFibGVTb3J0YWJsZUhlYWRlcigpIHsKICAkKCdkaXYud2lraSB0YWJsZScpLmVhY2goZnVuY3Rpb24oaSwgdGFibGUpewogICAgaWYgKHRhYmxlLnJvd3MubGVuZ3RoIDwgMykgcmV0dXJuIHRydWU7CiAgICB2YXIgdHIgPSAkKHRhYmxlLnJvd3MpLmZpcnN0KCk7CiAgICBpZiAodHIuZmluZCgiVEgiKS5sZW5ndGggPiAwKSB7CiAgICAgIHRyLmF0dHIoJ2RhdGEtc29ydC1tZXRob2QnLCAnbm9uZScpOwogICAgICB0ci5maW5kKCJURCIpLmF0dHIoJ2RhdGEtc29ydC1tZXRob2QnLCAnbm9uZScpOwogICAgICBuZXcgVGFibGVzb3J0KHRhYmxlKTsKICAgIH0KICB9KTsKfQoKJChmdW5jdGlvbiAoKSB7CiAgJCgiW3RpdGxlXTpub3QoLm5vLXRvb2x0aXApIikudG9vbHRpcCh7CiAgICBzaG93OiB7CiAgICAgIGRlbGF5OiA0MDAKICAgIH0sCiAgICBwb3NpdGlvbjogewogICAgICBteTogImNlbnRlciBib3R0b20tNSIsCiAgICAgIGF0OiAiY2VudGVyIHRvcCIKICAgIH0KICB9KTsKfSk7CgpmdW5jdGlvbiBpbmxpbmVBdXRvQ29tcGxldGUoZWxlbWVudCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIGRvIG5vdCBhdHRhY2ggaWYgVHJpYnV0ZSBpcyBhbHJlYWR5IGluaXRpYWxpemVkCiAgICBpZiAoZWxlbWVudC5kYXRhc2V0LnRyaWJ1dGUgPT09ICd0cnVlJykge3JldHVybn07CgogICAgY29uc3QgZ2V0RGF0YVNvdXJjZSA9IGZ1bmN0aW9uKGVudGl0eSkgewogICAgICBjb25zdCBkYXRhU291cmNlcyA9IHJtLkF1dG9Db21wbGV0ZS5kYXRhU291cmNlczsKCiAgICAgIGlmIChkYXRhU291cmNlc1tlbnRpdHldKSB7CiAgICAgICAgcmV0dXJuIGRhdGFTb3VyY2VzW2VudGl0eV07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CgogICAgY29uc3QgcmVtb3RlU2VhcmNoID0gZnVuY3Rpb24odXJsLCBjYikgewogICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpCiAgICAgIHsKICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDQpIHsKICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDApIHsKICAgICAgICAgICAgdmFyIGRhdGEgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpOwogICAgICAgICAgICBjYihkYXRhKTsKICAgICAgICAgIH0gZWxzZSBpZiAoeGhyLnN0YXR1cyA9PT0gNDAzKSB7CiAgICAgICAgICAgIGNiKFtdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH07CiAgICAgIHhoci5vcGVuKCJHRVQiLCB1cmwsIHRydWUpOwogICAgICB4aHIuc2VuZCgpOwogICAgfTsKCiAgICBjb25zdCB0cmlidXRlID0gbmV3IFRyaWJ1dGUoewogICAgICBjb2xsZWN0aW9uOiBbCiAgICAgICAgewogICAgICAgICAgdHJpZ2dlcjogJyMnLAogICAgICAgICAgdmFsdWVzOiBmdW5jdGlvbiAodGV4dCwgY2IpIHsKICAgICAgICAgICAgaWYgKGV2ZW50LnRhcmdldC50eXBlID09PSAndGV4dCcgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2F1dG9jb21wbGV0ZScpICE9ICdvZmYnKSB7CiAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2F1dG9jb21wbGV0ZScsICdvZmYnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBXaGVuIHRyaWdnZXJlZCB3aXRoIHRleHQgc3RhcnRpbmcgd2l0aCAiIyMiLCBsaWtlICIjI2EiLCB0aGUgc2VhcmNoIHRlcm0gd2lsbCBiZWNvbWUgIiNhIiwKICAgICAgICAgICAgLy8gY2F1c2luZyB0aGUgU1FMIHF1ZXJ5IHRvIGZhaWwgaW4gZmluZGluZyBpc3N1ZXMgd2l0aCAiYSIgaW4gdGhlIHN1YmplY3QuCiAgICAgICAgICAgIC8vIFRvIGF2b2lkIHRoaXMsIHJlbW92ZSB0aGUgZmlyc3QgIiMiIGZyb20gdGhlIHNlYXJjaCB0ZXJtLgogICAgICAgICAgICBpZiAodGV4dCkgewogICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL14jLywgJycpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbW90ZVNlYXJjaChnZXREYXRhU291cmNlKCdpc3N1ZXMnKSArIGVuY29kZVVSSUNvbXBvbmVudCh0ZXh0KSwgZnVuY3Rpb24gKGlzc3VlcykgewogICAgICAgICAgICAgIHJldHVybiBjYihpc3N1ZXMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICBsb29rdXA6ICdsYWJlbCcsCiAgICAgICAgICBmaWxsQXR0cjogJ2xhYmVsJywKICAgICAgICAgIHJlcXVpcmVMZWFkaW5nU3BhY2U6IHRydWUsCiAgICAgICAgICBzZWxlY3RUZW1wbGF0ZTogZnVuY3Rpb24gKGlzc3VlKSB7CiAgICAgICAgICAgIGxldCBsZWFkaW5nSGFzaCA9ICIjIgogICAgICAgICAgICAvLyBrZWVwICMjIHN5bnRheCB3aGljaCBpcyBhIHZhbGlkIGlzc3VlIHN5bnRheCB0byBzaG93IGlzc3VlIHdpdGggdGl0bGUuCiAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRNZW50aW9uVGV4dFNuYXBzaG90LmNoYXJBdCgwKSA9PT0gIiMiKSB7CiAgICAgICAgICAgICAgbGVhZGluZ0hhc2ggPSAiIyMiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGxlYWRpbmdIYXNoICsgaXNzdWUub3JpZ2luYWwuaWQ7CiAgICAgICAgICB9LAogICAgICAgICAgbWVudUl0ZW1UZW1wbGF0ZTogZnVuY3Rpb24gKGlzc3VlKSB7CiAgICAgICAgICAgIHJldHVybiBzYW5pdGl6ZUhUTUwoaXNzdWUub3JpZ2luYWwubGFiZWwpOwogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgdHJpZ2dlcjogJ1tbJywKICAgICAgICAgIHZhbHVlczogZnVuY3Rpb24gKHRleHQsIGNiKSB7CiAgICAgICAgICAgIHJlbW90ZVNlYXJjaChnZXREYXRhU291cmNlKCd3aWtpX3BhZ2VzJykgKyBlbmNvZGVVUklDb21wb25lbnQodGV4dCksIGZ1bmN0aW9uICh3aWtpUGFnZXMpIHsKICAgICAgICAgICAgICByZXR1cm4gY2Iod2lraVBhZ2VzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9LAogICAgICAgICAgbG9va3VwOiAnbGFiZWwnLAogICAgICAgICAgZmlsbEF0dHI6ICdsYWJlbCcsCiAgICAgICAgICByZXF1aXJlTGVhZGluZ1NwYWNlOiB0cnVlLAogICAgICAgICAgc2VsZWN0VGVtcGxhdGU6IGZ1bmN0aW9uICh3aWtpUGFnZSkgewogICAgICAgICAgICByZXR1cm4gJ1tbJyArIHdpa2lQYWdlLm9yaWdpbmFsLnZhbHVlICsgJ11dJzsKICAgICAgICAgIH0sCiAgICAgICAgICBtZW51SXRlbVRlbXBsYXRlOiBmdW5jdGlvbiAod2lraVBhZ2UpIHsKICAgICAgICAgICAgcmV0dXJuIHNhbml0aXplSFRNTCh3aWtpUGFnZS5vcmlnaW5hbC5sYWJlbCk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICB0cmlnZ2VyOiAnQCcsCiAgICAgICAgICBsb29rdXA6IGZ1bmN0aW9uICh1c2VyLCBtZW50aW9uVGV4dCkgewogICAgICAgICAgICByZXR1cm4gdXNlci5uYW1lICsgdXNlci5maXJzdG5hbWUgKyB1c2VyLmxhc3RuYW1lICsgdXNlci5sb2dpbjsKICAgICAgICAgIH0sCiAgICAgICAgICB2YWx1ZXM6IGZ1bmN0aW9uICh0ZXh0LCBjYikgewogICAgICAgICAgICBjb25zdCB1cmwgPSBnZXREYXRhU291cmNlKCd1c2VycycpOwogICAgICAgICAgICBpZiAodXJsKSB7CiAgICAgICAgICAgICAgcmVtb3RlU2VhcmNoKHVybCArIGVuY29kZVVSSUNvbXBvbmVudCh0ZXh0KSwgZnVuY3Rpb24gKHVzZXJzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2IodXNlcnMpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgbWVudUl0ZW1UZW1wbGF0ZTogZnVuY3Rpb24gKHVzZXIpIHsKICAgICAgICAgICAgcmV0dXJuIHVzZXIub3JpZ2luYWwubmFtZTsKICAgICAgICAgIH0sCiAgICAgICAgICBzZWxlY3RUZW1wbGF0ZTogZnVuY3Rpb24gKHVzZXIpIHsKICAgICAgICAgICAgcmV0dXJuICdAJyArIHVzZXIub3JpZ2luYWwubG9naW47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICBdLAogICAgICBub01hdGNoVGVtcGxhdGU6ICIiCiAgICB9KTsKCiAgICB0cmlidXRlLmF0dGFjaChlbGVtZW50KTsKfQoKLy8gY29sbGFwc2libGUgc2lkZWJhciBqUXVlcnkgcGx1Z2luCihmdW5jdGlvbigkKSB7CiAgLy8gbWFpbiBjb250YWluZXIgdGhpcyBpcyBhcHBsaWVkIHRvCiAgdmFyIG1haW47CiAgLy8gdHJpZ2dlcnMgc2hvdy9oaWRlCiAgdmFyIGJ1dHRvbjsKICAvLyB0aGUga2V5IHRvIHVzZSBpbiBsb2NhbCBzdG9yYWdlCiAgLy8gdGhpcyB3aWxsIGxhdGVyIGJlIGV4cGFuZGVkIHVzaW5nIHRoZSBjdXJyZW50IGNvbnRyb2xsZXIgYW5kIGFjdGlvbiB0bwogIC8vIGFsbG93IGZvciBkaWZmZXJlbnQgc2lkZWJhciBzdGF0ZXMgZm9yIGRpZmZlcmVudCBwYWdlcwogIHZhciBsb2NhbFN0b3JhZ2VLZXkgPSAncmVkbWluZS1zaWRlYmFyLXN0YXRlJzsKICAvLyB0cnVlIGlmIGxvY2FsIHN0b3JhZ2UgaXMgYXZhaWxhYmxlCiAgdmFyIGNhblVzZUxvY2FsU3RvcmFnZSA9IGZ1bmN0aW9uKCl7CiAgICB0cnkgewogICAgICBpZignbG9jYWxTdG9yYWdlJyBpbiB3aW5kb3cpewogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdyZWRtaW5lLnRlc3Quc3RvcmFnZScsICdvaycpOwogICAgICAgIHZhciBpdGVtID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3JlZG1pbmUudGVzdC5zdG9yYWdlJyk7CiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3JlZG1pbmUudGVzdC5zdG9yYWdlJyk7CiAgICAgICAgaWYoaXRlbSA9PT0gJ29rJykgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0gY2F0Y2ggKGVycikge30KICAgIHJldHVybiBmYWxzZTsKICB9KCk7CiAgLy8gZnVuY3Rpb24gdG8gc2V0IGN1cnJlbnQgc2lkZWJhciBzdGF0ZQogIHZhciBzZXRTdGF0ZSA9IGZ1bmN0aW9uKHN0YXRlKXsKICAgIGlmKGNhblVzZUxvY2FsU3RvcmFnZSl7CiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxvY2FsU3RvcmFnZUtleSwgc3RhdGUpOwogICAgfQogIH07CiAgdmFyIGFwcGx5U3RhdGUgPSBmdW5jdGlvbigpewogICAgaWYobWFpbi5oYXNDbGFzcygnY29sbGFwc2Vkc2lkZWJhcicpKXsKICAgICAgdXBkYXRlU1ZHSWNvbihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2lkZWJhci1zd2l0Y2gtYnV0dG9uJyksICdjaGV2cm9ucy1sZWZ0JykKICAgICAgc2V0U3RhdGUoJ2hpZGRlbicpOwogICAgfSBlbHNlIHsKICAgICAgdXBkYXRlU1ZHSWNvbihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2lkZWJhci1zd2l0Y2gtYnV0dG9uJyksICdjaGV2cm9ucy1yaWdodCcpCiAgICAgIHNldFN0YXRlKCd2aXNpYmxlJyk7CiAgICB9CiAgfTsKICB2YXIgc2V0dXBUb2dnbGVCdXR0b24gPSBmdW5jdGlvbigpewogICAgYnV0dG9uID0gJCgnI3NpZGViYXItc3dpdGNoLWJ1dHRvbicpOwogICAgYnV0dG9uLmNsaWNrKGZ1bmN0aW9uKGUpewogICAgICBtYWluLmFkZENsYXNzKCJhbmltYXRlIik7CiAgICAgIG1haW4udG9nZ2xlQ2xhc3MoJ2NvbGxhcHNlZHNpZGViYXInKTsKICAgICAgYXBwbHlTdGF0ZSgpOwogICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwogICAgYXBwbHlTdGF0ZSgpOwogIH07CiAgJC5mbi5jb2xsYXBzaWJsZVNpZGViYXIgPSBmdW5jdGlvbigpIHsKICAgIG1haW4gPSB0aGlzOwogICAgLy8gZGV0ZXJtaW5lIHByZXZpb3VzbHkgc3RvcmVkIHNpZGViYXIgc3RhdGUgZm9yIHRoaXMgcGFnZQogICAgaWYoY2FuVXNlTG9jYWxTdG9yYWdlKSB7CiAgICAgIC8vIGRldGVybWluZSBjdXJyZW50IGNvbnRyb2xsZXIvYWN0aW9uIHBhaXIgYW5kIHVzZSB0aGVtIGFzIHN0b3JhZ2Uga2V5CiAgICAgIHZhciBib2R5Q2xhc3MgPSAkKCdib2R5JykuYXR0cignY2xhc3MnKTsKICAgICAgaWYoYm9keUNsYXNzKXsKICAgICAgICB0cnkgewogICAgICAgICAgbG9jYWxTdG9yYWdlS2V5ICs9ICctJyArIGJvZHlDbGFzcy5zcGxpdCgvXHMrLykuZmlsdGVyKGZ1bmN0aW9uKHMpewogICAgICAgICAgICByZXR1cm4gcy5tYXRjaCgvKGFjdGlvbnxjb250cm9sbGVyKS0uKi8pOwogICAgICAgICAgfSkuc29ydCgpLmpvaW4oJy0nKTsKICAgICAgICB9IGNhdGNoKGUpIHsKICAgICAgICAgIC8vIGluIGNhc2Ugb2YgZXJyb3IgKHByb2JhYmx5IElFOCksIGNvbnRpbnVlIHdpdGggdGhlIHVubW9kaWZpZWQga2V5CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciBzdG9yZWRTdGF0ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGxvY2FsU3RvcmFnZUtleSk7CiAgICAgIG1haW4udG9nZ2xlQ2xhc3MoJ2NvbGxhcHNlZHNpZGViYXInLCBzdG9yZWRTdGF0ZSA9PT0gJ2hpZGRlbicpOwogICAgfQogICAgLy8gZHJhdyB0aGUgdG9nZ2xlIGJ1dHRvbiBvbmNlIHRoZSBET00gaXMgY29tcGxldGUKICAgICQoZG9jdW1lbnQpLnJlYWR5KHNldHVwVG9nZ2xlQnV0dG9uKTsKICB9Owp9KGpRdWVyeSkpOwoKJChkb2N1bWVudCkucmVhZHkoc2V0dXBBamF4SW5kaWNhdG9yKTsKJChkb2N1bWVudCkucmVhZHkoaGlkZU9uTG9hZCk7CiQoZG9jdW1lbnQpLnJlYWR5KGFkZEZvcm1PYnNlcnZlcnNGb3JEb3VibGVTdWJtaXQpOwokKGRvY3VtZW50KS5yZWFkeShkZWZhdWx0Rm9jdXMpOwokKGRvY3VtZW50KS5yZWFkeShzZXR1cEF0dGFjaG1lbnREZXRhaWwpOwokKGRvY3VtZW50KS5yZWFkeShzZXR1cFRhYnMpOwokKGRvY3VtZW50KS5yZWFkeShzZXR1cEZpbGVQcmV2aWV3TmF2aWdhdGlvbik7CiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwV2lraVRhYmxlU29ydGFibGVIZWFkZXIpOwokKGRvY3VtZW50KS5vbignZm9jdXMnLCAnW2RhdGEtYXV0by1jb21wbGV0ZT10cnVlXScsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgaW5saW5lQXV0b0NvbXBsZXRlKGV2ZW50LnRhcmdldCk7Cn0pOwo=" | |
| }, | |
| "attachments.js": { | |
| "hash": "3ec6492326b3262f7b880cc7baff194c", | |
| "path": "/usr/src/redmine/public/assets/attachments-70e32d30.js", | |
| "base64": "LyoqCiAqIFJlZG1pbmUgLSBwcm9qZWN0IG1hbmFnZW1lbnQgc29mdHdhcmUKICogQ29weXJpZ2h0IChDKSAyMDA2LSAgSmVhbi1QaGlsaXBwZSBMYW5nCiAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCiAqLwoKZnVuY3Rpb24gYWRkRmlsZShpbnB1dEVsLCBmaWxlLCBlYWdlclVwbG9hZCkgewogIHZhciBhdHRhY2htZW50c0ZpZWxkcyA9ICQoaW5wdXRFbCkuY2xvc2VzdCgnLmF0dGFjaG1lbnRzX2Zvcm0nKS5maW5kKCcuYXR0YWNobWVudHNfZmllbGRzJyk7CiAgdmFyIGFkZEF0dGFjaG1lbnQgPSAkKGlucHV0RWwpLmNsb3Nlc3QoJy5hdHRhY2htZW50c19mb3JtJykuZmluZCgnLmFkZF9hdHRhY2htZW50Jyk7CiAgdmFyIG1heEZpbGVzID0gKCQoaW5wdXRFbCkuYXR0cignbXVsdGlwbGUnKSA9PSAnbXVsdGlwbGUnID8gMTAgOiAxKTsKCiAgaWYgKGF0dGFjaG1lbnRzRmllbGRzLmNoaWxkcmVuKCkubGVuZ3RoIDwgbWF4RmlsZXMpIHsKICAgIHZhciBhdHRhY2htZW50SWQgPSBhZGRGaWxlLm5leHRBdHRhY2htZW50SWQrKzsKICAgIHZhciBmaWxlU3BhbiA9ICQoJzxzcGFuPicsIHsgaWQ6ICdhdHRhY2htZW50c18nICsgYXR0YWNobWVudElkIH0pOwogICAgdmFyIHBhcmFtID0gJChpbnB1dEVsKS5kYXRhKCdwYXJhbScpOwogICAgaWYgKCFwYXJhbSkge3BhcmFtID0gJ2F0dGFjaG1lbnRzJ307CgogICAgZmlsZVNwYW4uYXBwZW5kKAogICAgICAgICQoJzxpbnB1dD4nLCB7IHR5cGU6ICd0ZXh0JywgJ2NsYXNzJzogJ2ljb24gaWNvbi1hdHRhY2htZW50IGZpbGVuYW1lIHJlYWRvbmx5JywgbmFtZTogcGFyYW0gKydbJyArIGF0dGFjaG1lbnRJZCArICddW2ZpbGVuYW1lXScsIHJlYWRvbmx5OiAncmVhZG9ubHknfSApLnZhbChmaWxlLm5hbWUpLAogICAgICAgICQoJzxpbnB1dD4nLCB7IHR5cGU6ICd0ZXh0JywgJ2NsYXNzJzogJ2Rlc2NyaXB0aW9uJywgbmFtZTogcGFyYW0gKyAnWycgKyBhdHRhY2htZW50SWQgKyAnXVtkZXNjcmlwdGlvbl0nLCBtYXhsZW5ndGg6IDI1NSwgcGxhY2Vob2xkZXI6ICQoaW5wdXRFbCkuZGF0YSgnZGVzY3JpcHRpb24tcGxhY2Vob2xkZXInKSB9ICkudG9nZ2xlKCFlYWdlclVwbG9hZCksCiAgICAgICAgJCgnPGlucHV0PicsIHsgdHlwZTogJ2hpZGRlbicsICdjbGFzcyc6ICd0b2tlbicsIG5hbWU6IHBhcmFtICsgJ1snICsgYXR0YWNobWVudElkICsgJ11bdG9rZW5dJ30gKSwKICAgICAgICAkKCc8YT4mbmJzcDwvYT4nKS5hdHRyKHsgaHJlZjogIiMiLCAnY2xhc3MnOiAnaWNvbi1vbmx5IGljb24tZGVsIHJlbW92ZS11cGxvYWQnIH0pLmNsaWNrKHJlbW92ZUZpbGUpLnRvZ2dsZSghZWFnZXJVcGxvYWQpCiAgICApLmFwcGVuZFRvKGF0dGFjaG1lbnRzRmllbGRzKTsKCiAgICBpZiAoJChpbnB1dEVsKS5kYXRhKCdkZXNjcmlwdGlvbicpID09IDApIHsKICAgICAgZmlsZVNwYW4uZmluZCgnaW5wdXQuZGVzY3JpcHRpb24nKS5yZW1vdmUoKTsKICAgIH0KCiAgICBpZihlYWdlclVwbG9hZCkgewogICAgICBhamF4VXBsb2FkKGZpbGUsIGF0dGFjaG1lbnRJZCwgZmlsZVNwYW4sIGlucHV0RWwpOwogICAgfQoKICAgIGFkZEF0dGFjaG1lbnQudG9nZ2xlKGF0dGFjaG1lbnRzRmllbGRzLmNoaWxkcmVuKCkubGVuZ3RoIDwgbWF4RmlsZXMpOwogICAgcmV0dXJuIGF0dGFjaG1lbnRJZDsKICB9CiAgcmV0dXJuIG51bGw7Cn0KCmFkZEZpbGUubmV4dEF0dGFjaG1lbnRJZCA9IDE7CgpmdW5jdGlvbiBhamF4VXBsb2FkKGZpbGUsIGF0dGFjaG1lbnRJZCwgZmlsZVNwYW4sIGlucHV0RWwpIHsKCiAgZnVuY3Rpb24gb25Mb2Fkc3RhcnQoZSkgewogICAgZmlsZVNwYW4ucmVtb3ZlQ2xhc3MoJ2FqYXgtd2FpdGluZycpOwogICAgZmlsZVNwYW4uYWRkQ2xhc3MoJ2FqYXgtbG9hZGluZycpOwogICAgJCgnaW5wdXQ6c3VibWl0JywgJCh0aGlzKS5wYXJlbnRzKCdmb3JtJykpLmF0dHIoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7CiAgfQoKICBmdW5jdGlvbiBvblByb2dyZXNzKGUpIHsKICAgIGlmKGUubGVuZ3RoQ29tcHV0YWJsZSkgewogICAgICB0aGlzLnByb2dyZXNzYmFyKCAndmFsdWUnLCBlLmxvYWRlZCAqIDEwMCAvIGUudG90YWwgKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGFjdHVhbFVwbG9hZChmaWxlLCBhdHRhY2htZW50SWQsIGZpbGVTcGFuLCBpbnB1dEVsKSB7CgogICAgYWpheFVwbG9hZC51cGxvYWRpbmcrKzsKCiAgICB1cGxvYWRCbG9iKGZpbGUsICQoaW5wdXRFbCkuZGF0YSgndXBsb2FkLXBhdGgnKSwgYXR0YWNobWVudElkLCB7CiAgICAgICAgbG9hZHN0YXJ0RXZlbnRIYW5kbGVyOiBvbkxvYWRzdGFydC5iaW5kKHByb2dyZXNzU3BhbiksCiAgICAgICAgcHJvZ3Jlc3NFdmVudEhhbmRsZXI6IG9uUHJvZ3Jlc3MuYmluZChwcm9ncmVzc1NwYW4pCiAgICAgIH0pCiAgICAgIC5kb25lKGZ1bmN0aW9uKHJlc3VsdCkgewogICAgICAgIGFkZElubGluZUF0dGFjaG1lbnRNYXJrdXAoZmlsZSk7CiAgICAgICAgcHJvZ3Jlc3NTcGFuLnByb2dyZXNzYmFyKCAndmFsdWUnLCAxMDAgKS5yZW1vdmUoKTsKICAgICAgICBmaWxlU3Bhbi5maW5kKCdpbnB1dC5kZXNjcmlwdGlvbiwgYScpLmNzcygnZGlzcGxheScsICdpbmxpbmUtYmxvY2snKTsKICAgICAgfSkKICAgICAgLmZhaWwoZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgcHJvZ3Jlc3NTcGFuLnRleHQocmVzdWx0LnN0YXR1c1RleHQpOwogICAgICB9KS5hbHdheXMoZnVuY3Rpb24oKSB7CiAgICAgICAgYWpheFVwbG9hZC51cGxvYWRpbmctLTsKICAgICAgICBmaWxlU3Bhbi5yZW1vdmVDbGFzcygnYWpheC1sb2FkaW5nJyk7CiAgICAgICAgdmFyIGZvcm0gPSBmaWxlU3Bhbi5wYXJlbnRzKCdmb3JtJyk7CiAgICAgICAgaWYgKGZvcm0ucXVldWUoJ3VwbG9hZCcpLmxlbmd0aCA9PSAwICYmIGFqYXhVcGxvYWQudXBsb2FkaW5nID09IDApIHsKICAgICAgICAgICQoJ2lucHV0OnN1Ym1pdCcsIGZvcm0pLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7CiAgICAgICAgfQogICAgICAgIGZvcm0uZGVxdWV1ZSgndXBsb2FkJyk7CiAgICAgIH0pOwogIH0KCiAgdmFyIHByb2dyZXNzU3BhbiA9ICQoJzxkaXY+JykuaW5zZXJ0QWZ0ZXIoZmlsZVNwYW4uZmluZCgnaW5wdXQuZmlsZW5hbWUnKSk7CiAgcHJvZ3Jlc3NTcGFuLnByb2dyZXNzYmFyKCk7CiAgZmlsZVNwYW4uYWRkQ2xhc3MoJ2FqYXgtd2FpdGluZycpOwoKICB2YXIgbWF4U3luY1VwbG9hZCA9ICQoaW5wdXRFbCkuZGF0YSgnbWF4LWNvbmN1cnJlbnQtdXBsb2FkcycpOwoKICBpZihtYXhTeW5jVXBsb2FkID09IG51bGwgfHwgbWF4U3luY1VwbG9hZCA8PSAwIHx8IGFqYXhVcGxvYWQudXBsb2FkaW5nIDwgbWF4U3luY1VwbG9hZCkKICAgIGFjdHVhbFVwbG9hZChmaWxlLCBhdHRhY2htZW50SWQsIGZpbGVTcGFuLCBpbnB1dEVsKTsKICBlbHNlCiAgICAkKGlucHV0RWwpLnBhcmVudHMoJ2Zvcm0nKS5xdWV1ZSgndXBsb2FkJywgYWN0dWFsVXBsb2FkLmJpbmQodGhpcywgZmlsZSwgYXR0YWNobWVudElkLCBmaWxlU3BhbiwgaW5wdXRFbCkpOwp9CgphamF4VXBsb2FkLnVwbG9hZGluZyA9IDA7CgpmdW5jdGlvbiByZW1vdmVGaWxlKCkgewogICQodGhpcykuY2xvc2VzdCgnLmF0dGFjaG1lbnRzX2Zvcm0nKS5maW5kKCcuYWRkX2F0dGFjaG1lbnQnKS5zaG93KCk7CiAgJCh0aGlzKS5wYXJlbnQoJ3NwYW4nKS5yZW1vdmUoKTsKICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIHVwbG9hZEJsb2IoYmxvYiwgdXBsb2FkVXJsLCBhdHRhY2htZW50SWQsIG9wdGlvbnMpIHsKCiAgdmFyIGFjdHVhbE9wdGlvbnMgPSAkLmV4dGVuZCh7CiAgICBsb2Fkc3RhcnRFdmVudEhhbmRsZXI6ICQubm9vcCwKICAgIHByb2dyZXNzRXZlbnRIYW5kbGVyOiAkLm5vb3AKICB9LCBvcHRpb25zKTsKCiAgdXBsb2FkVXJsID0gdXBsb2FkVXJsICsgJz9hdHRhY2htZW50X2lkPScgKyBhdHRhY2htZW50SWQ7CiAgaWYgKGJsb2IgaW5zdGFuY2VvZiB3aW5kb3cuQmxvYikgewogICAgdXBsb2FkVXJsICs9ICcmZmlsZW5hbWU9JyArIGVuY29kZVVSSUNvbXBvbmVudChibG9iLm5hbWUpOwogICAgdXBsb2FkVXJsICs9ICcmY29udGVudF90eXBlPScgKyBlbmNvZGVVUklDb21wb25lbnQoYmxvYi50eXBlKTsKICB9CgogIHJldHVybiAkLmFqYXgodXBsb2FkVXJsLCB7CiAgICB0eXBlOiAnUE9TVCcsCiAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsCiAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbihqcVhociwgc2V0dGluZ3MpIHsKICAgICAganFYaHIuc2V0UmVxdWVzdEhlYWRlcignQWNjZXB0JywgJ2FwcGxpY2F0aW9uL2pzJyk7CiAgICAgIC8vIGF0dGFjaCBwcm9wZXIgRmlsZSBvYmplY3QKICAgICAgc2V0dGluZ3MuZGF0YSA9IGJsb2I7CiAgICB9LAogICAgeGhyOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIHhociA9ICQuYWpheFNldHRpbmdzLnhocigpOwogICAgICB4aHIudXBsb2FkLm9ubG9hZHN0YXJ0ID0gYWN0dWFsT3B0aW9ucy5sb2Fkc3RhcnRFdmVudEhhbmRsZXI7CiAgICAgIHhoci51cGxvYWQub25wcm9ncmVzcyA9IGFjdHVhbE9wdGlvbnMucHJvZ3Jlc3NFdmVudEhhbmRsZXI7CiAgICAgIHJldHVybiB4aHI7CiAgICB9LAogICAgZGF0YTogYmxvYiwKICAgIGNhY2hlOiBmYWxzZSwKICAgIHByb2Nlc3NEYXRhOiBmYWxzZQogIH0pOwp9CgpmdW5jdGlvbiBhZGRJbnB1dEZpbGVzKGlucHV0RWwpIHsKICB2YXIgYXR0YWNobWVudHNGaWVsZHMgPSAkKGlucHV0RWwpLmNsb3Nlc3QoJy5hdHRhY2htZW50c19mb3JtJykuZmluZCgnLmF0dGFjaG1lbnRzX2ZpZWxkcycpOwogIHZhciBhZGRBdHRhY2htZW50ID0gJChpbnB1dEVsKS5jbG9zZXN0KCcuYXR0YWNobWVudHNfZm9ybScpLmZpbmQoJy5hZGRfYXR0YWNobWVudCcpOwogIHZhciBjbGVhcmVkRmlsZUlucHV0ID0gJChpbnB1dEVsKS5jbG9uZSgpLnZhbCgnJyk7CiAgdmFyIHNpemVFeGNlZWRlZCA9IGZhbHNlOwogIHZhciBwYXJhbSA9ICQoaW5wdXRFbCkuZGF0YSgncGFyYW0nKTsKICBpZiAoIXBhcmFtKSB7cGFyYW0gPSAnYXR0YWNobWVudHMnfTsKCiAgaWYgKCQuYWpheFNldHRpbmdzLnhocigpLnVwbG9hZCAmJiBpbnB1dEVsLmZpbGVzKSB7CiAgICAvLyB1cGxvYWQgZmlsZXMgdXNpbmcgYWpheAogICAgc2l6ZUV4Y2VlZGVkID0gdXBsb2FkQW5kQXR0YWNoRmlsZXMoaW5wdXRFbC5maWxlcywgaW5wdXRFbCk7CiAgICAkKGlucHV0RWwpLnJlbW92ZSgpOwogIH0gZWxzZSB7CiAgICAvLyBicm93c2VyIG5vdCBzdXBwb3J0aW5nIHRoZSBmaWxlIEFQSSwgdXBsb2FkIG9uIGZvcm0gc3VibWlzc2lvbgogICAgdmFyIGF0dGFjaG1lbnRJZDsKICAgIHZhciBhRmlsZW5hbWUgPSBpbnB1dEVsLnZhbHVlLnNwbGl0KC9cL3xcXC8pOwogICAgYXR0YWNobWVudElkID0gYWRkRmlsZShpbnB1dEVsLCB7IG5hbWU6IGFGaWxlbmFtZVsgYUZpbGVuYW1lLmxlbmd0aCAtIDEgXSB9LCBmYWxzZSk7CiAgICBpZiAoYXR0YWNobWVudElkKSB7CiAgICAgICQoaW5wdXRFbCkuYXR0cih7IG5hbWU6IHBhcmFtICsgJ1snICsgYXR0YWNobWVudElkICsgJ11bZmlsZV0nLCBzdHlsZTogJ2Rpc3BsYXk6bm9uZTsnIH0pLmFwcGVuZFRvKCcjYXR0YWNobWVudHNfJyArIGF0dGFjaG1lbnRJZCk7CiAgICB9CiAgfQoKICBjbGVhcmVkRmlsZUlucHV0LnByZXBlbmRUbyhhZGRBdHRhY2htZW50KTsKfQoKZnVuY3Rpb24gdXBsb2FkQW5kQXR0YWNoRmlsZXMoZmlsZXMsIGlucHV0RWwpIHsKCiAgdmFyIG1heEZpbGVTaXplID0gJChpbnB1dEVsKS5kYXRhKCdtYXgtZmlsZS1zaXplJyk7CiAgdmFyIG1heEZpbGVTaXplRXhjZWVkZWQgPSAkKGlucHV0RWwpLmRhdGEoJ21heC1maWxlLXNpemUtbWVzc2FnZScpOwoKICB2YXIgc2l6ZUV4Y2VlZGVkID0gZmFsc2U7CiAgdmFyIGZpbGVzTGVuZ3RoID0gJChpbnB1dEVsKS5jbG9zZXN0KCcuYXR0YWNobWVudHNfZm9ybScpLmZpbmQoJy5hdHRhY2htZW50c19maWVsZHMnKS5jaGlsZHJlbigpLmxlbmd0aCArIGZpbGVzLmxlbmd0aAogICQuZWFjaChmaWxlcywgZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5zaXplICYmIG1heEZpbGVTaXplICE9IG51bGwgJiYgdGhpcy5zaXplID4gcGFyc2VJbnQobWF4RmlsZVNpemUpKSB7c2l6ZUV4Y2VlZGVkPXRydWU7fQogIH0pOwogIGlmIChzaXplRXhjZWVkZWQpIHsKICAgIHdpbmRvdy5hbGVydChtYXhGaWxlU2l6ZUV4Y2VlZGVkKTsKICB9IGVsc2UgewogICAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbigpIHthZGRGaWxlKGlucHV0RWwsIHRoaXMsIHRydWUpO30pOwogIH0KCiAgaWYgKGZpbGVzTGVuZ3RoID4gKCQoaW5wdXRFbCkuYXR0cignbXVsdGlwbGUnKSA9PSAnbXVsdGlwbGUnID8gMTAgOiAxKSkgewogICAgd2luZG93LmFsZXJ0KCQoaW5wdXRFbCkuZGF0YSgnbWF4LW51bWJlci1vZi1maWxlcy1tZXNzYWdlJykpOwogIH0KICByZXR1cm4gc2l6ZUV4Y2VlZGVkOwp9CgpmdW5jdGlvbiBoYW5kbGVGaWxlRHJvcEV2ZW50KGUpIHsKCiAgJCh0aGlzKS5yZW1vdmVDbGFzcygnZmlsZW92ZXInKTsKICBibG9ja0V2ZW50UHJvcGFnYXRpb24oZSk7CgogIGlmICgkLmluQXJyYXkoJ0ZpbGVzJywgZS5kYXRhVHJhbnNmZXIudHlwZXMpID4gLTEpIHsKICAgIGhhbmRsZUZpbGVEcm9wRXZlbnQudGFyZ2V0ID0gZS50YXJnZXQ7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnY3VzdG9tLWZpZWxkLWZpbGVkcm9wbGlzdG5lcicpKXsKICAgICAgdXBsb2FkQW5kQXR0YWNoRmlsZXMoZS5kYXRhVHJhbnNmZXIuZmlsZXMsICQodGhpcykuZmluZCgnaW5wdXQ6ZmlsZS5jdXN0b20tZmllbGQtZmlsZWRyb3AnKS5maXJzdCgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHVwbG9hZEFuZEF0dGFjaEZpbGVzKGUuZGF0YVRyYW5zZmVyLmZpbGVzLCAkKHRoaXMpLmZpbmQoJ2lucHV0OmZpbGUuZmlsZWRyb3AnKS5maXJzdCgpKTsKICAgIH0KICB9Cn0KaGFuZGxlRmlsZURyb3BFdmVudC50YXJnZXQgPSAnJzsKCmZ1bmN0aW9uIGRyYWdPdmVySGFuZGxlcihlKSB7CiAgJCh0aGlzKS5hZGRDbGFzcygnZmlsZW92ZXInKTsKICBibG9ja0V2ZW50UHJvcGFnYXRpb24oZSk7CiAgZS5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdjb3B5JzsKfQoKZnVuY3Rpb24gZHJhZ091dEhhbmRsZXIoZSkgewogICQodGhpcykucmVtb3ZlQ2xhc3MoJ2ZpbGVvdmVyJyk7CiAgYmxvY2tFdmVudFByb3BhZ2F0aW9uKGUpOwp9CgpmdW5jdGlvbiBzZXR1cEZpbGVEcm9wKCkgewogIGlmICh3aW5kb3cuRmlsZSAmJiB3aW5kb3cuRmlsZUxpc3QgJiYgd2luZG93LlByb2dyZXNzRXZlbnQgJiYgd2luZG93LkZvcm1EYXRhKSB7CgogICAgJC5ldmVudC5hZGRQcm9wKCdkYXRhVHJhbnNmZXInKTsKCiAgICAkKCdmb3JtIGRpdi5ib3g6bm90KC5maWxlZHJvcGxpc3RuZXIpJykuaGFzKCdpbnB1dDpmaWxlLmZpbGVkcm9wJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgJCh0aGlzKS5vbih7CiAgICAgICAgICBkcmFnb3ZlcjogZHJhZ092ZXJIYW5kbGVyLAogICAgICAgICAgZHJhZ2xlYXZlOiBkcmFnT3V0SGFuZGxlciwKICAgICAgICAgIGRyb3A6IGhhbmRsZUZpbGVEcm9wRXZlbnQsCiAgICAgICAgICBwYXN0ZTogY29weUltYWdlRnJvbUNsaXBib2FyZAogICAgICB9KS5hZGRDbGFzcygnZmlsZWRyb3BsaXN0bmVyJyk7CiAgICB9KTsKCiAgICAkKCdmb3JtIGRpdi5ib3ggaW5wdXQ6ZmlsZS5jdXN0b20tZmllbGQtZmlsZWRyb3AnKS5jbG9zZXN0KCdwJykubm90KCcuY3VzdG9tLWZpZWxkLWZpbGVkcm9wbGlzdG5lcicpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICQodGhpcykub24oewogICAgICAgICAgZHJhZ292ZXI6IGRyYWdPdmVySGFuZGxlciwKICAgICAgICAgIGRyYWdsZWF2ZTogZHJhZ091dEhhbmRsZXIsCiAgICAgICAgICBkcm9wOiBoYW5kbGVGaWxlRHJvcEV2ZW50CiAgICAgIH0pLmFkZENsYXNzKCdjdXN0b20tZmllbGQtZmlsZWRyb3BsaXN0bmVyJyk7CiAgICB9KTsKICB9Cn0KCmZ1bmN0aW9uIGFkZElubGluZUF0dGFjaG1lbnRNYXJrdXAoZmlsZSkgewogIC8vIGluc2VydCB1cGxvYWRlZCBpbWFnZSBpbmxpbmUgaWYgZHJvcHBlZCBhcmVhIGlzIGN1cnJlbnRseSBmb2N1c2VkIHRleHRhcmVhCiAgaWYoJChoYW5kbGVGaWxlRHJvcEV2ZW50LnRhcmdldCkuaGFzQ2xhc3MoJ3dpa2ktZWRpdCcpICYmICQuaW5BcnJheShmaWxlLnR5cGUsIHdpbmRvdy53aWtpSW1hZ2VNaW1lVHlwZXMpID4gLTEpIHsKICAgIHZhciAkdGV4dGFyZWEgPSAkKGhhbmRsZUZpbGVEcm9wRXZlbnQudGFyZ2V0KTsKICAgIHZhciBjdXJzb3JQb3NpdGlvbiA9ICR0ZXh0YXJlYS5wcm9wKCdzZWxlY3Rpb25TdGFydCcpOwogICAgdmFyIGRlc2NyaXB0aW9uID0gJHRleHRhcmVhLnZhbCgpOwogICAgdmFyIHNhbml0aXplZEZpbGVuYW1lID0gZmlsZS5uYW1lLnJlcGxhY2UoL1tcL1w/XCVcKlw6XHxcIlwnPD5cblxyXSsvLCAnXycpOwogICAgdmFyIGlubGluZUZpbGVuYW1lID0gZW5jb2RlVVJJQ29tcG9uZW50KHNhbml0aXplZEZpbGVuYW1lKQogICAgICAucmVwbGFjZSgvWyEoKV0vZywgZnVuY3Rpb24obWF0Y2gpIHsgcmV0dXJuICIlIiArIG1hdGNoLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpIH0pOwogICAgdmFyIG5ld0xpbmVCZWZvcmUgPSB0cnVlOwogICAgdmFyIG5ld0xpbmVBZnRlciA9IHRydWU7CiAgICBpZihjdXJzb3JQb3NpdGlvbiA9PT0gMCB8fCBkZXNjcmlwdGlvbi5zdWJzdHIoY3Vyc29yUG9zaXRpb24tMSwxKS5tYXRjaCgvXHJ8XG4vKSkgewogICAgICBuZXdMaW5lQmVmb3JlID0gZmFsc2U7CiAgICB9CiAgICBpZihkZXNjcmlwdGlvbi5zdWJzdHIoY3Vyc29yUG9zaXRpb24sMSkubWF0Y2goL1xyfFxuLykpIHsKICAgICAgbmV3TGluZUFmdGVyID0gZmFsc2U7CiAgICB9CgogICAgJHRleHRhcmVhLnZhbCgKICAgICAgZGVzY3JpcHRpb24uc3Vic3RyaW5nKDAsIGN1cnNvclBvc2l0aW9uKQogICAgICArIChuZXdMaW5lQmVmb3JlID8gJ1xuJyA6ICcnKQogICAgICArIGlubGluZUZpbGVuYW1lCiAgICAgICsgKG5ld0xpbmVBZnRlciA/ICdcbicgOiAnJykKICAgICAgKyBkZXNjcmlwdGlvbi5zdWJzdHJpbmcoY3Vyc29yUG9zaXRpb24sIGRlc2NyaXB0aW9uLmxlbmd0aCkKICAgICk7CgogICAgJHRleHRhcmVhLnByb3AoewogICAgICAnc2VsZWN0aW9uU3RhcnQnOiBjdXJzb3JQb3NpdGlvbiArIG5ld0xpbmVCZWZvcmUsCiAgICAgICdzZWxlY3Rpb25FbmQnOiBjdXJzb3JQb3NpdGlvbiArIGlubGluZUZpbGVuYW1lLmxlbmd0aCArIG5ld0xpbmVCZWZvcmUKICAgIH0pOwogICAgJHRleHRhcmVhLnBhcmVudHMoJy5qc3RCbG9jaycpCiAgICAgIC5maW5kKCcuanN0Yl9pbWcnKS5jbGljaygpOwoKICAgIC8vIG1vdmUgY3Vyc29yIGludG8gbmV4dCBsaW5lCiAgICBjdXJzb3JQb3NpdGlvbiA9ICR0ZXh0YXJlYS5wcm9wKCdzZWxlY3Rpb25TdGFydCcpOwogICAgJHRleHRhcmVhLnByb3AoewogICAgICAnc2VsZWN0aW9uU3RhcnQnOiBjdXJzb3JQb3NpdGlvbiArIDEsCiAgICAgICdzZWxlY3Rpb25FbmQnOiBjdXJzb3JQb3NpdGlvbiArIDEKICAgIH0pOwoKICB9Cn0KCmZ1bmN0aW9uIGNvcHlJbWFnZUZyb21DbGlwYm9hcmQoZSkgewogIGlmICghJChlLnRhcmdldCkuaGFzQ2xhc3MoJ3dpa2ktZWRpdCcpKSB7IHJldHVybjsgfQogIHZhciBjbGlwYm9hcmREYXRhID0gZS5jbGlwYm9hcmREYXRhIHx8IGUub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhCiAgaWYgKCFjbGlwYm9hcmREYXRhKSB7IHJldHVybjsgfQogIGlmIChjbGlwYm9hcmREYXRhLnR5cGVzLnNvbWUoZnVuY3Rpb24odCl7IHJldHVybiAvXnRleHRcL3BsYWluJC8udGVzdCh0KTsgfSkpIHsgcmV0dXJuOyB9CgogIHZhciBmaWxlcyA9IGNsaXBib2FyZERhdGEuZmlsZXMKICBmb3IgKHZhciBpID0gMCA7IGkgPCBmaWxlcy5sZW5ndGggOyBpKyspIHsKICAgIHZhciBmaWxlID0gZmlsZXNbaV07CiAgICBpZiAoZmlsZS50eXBlLmluZGV4T2YoImltYWdlIikgIT0gLTEpIHsKICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgpOwogICAgICB2YXIgZmlsZW5hbWUgPSAnY2xpcGJvYXJkLScKICAgICAgICArIGRhdGUuZ2V0RnVsbFllYXIoKQogICAgICAgICsgKCcwJysoZGF0ZS5nZXRNb250aCgpKzEpKS5zbGljZSgtMikKICAgICAgICArICgnMCcrZGF0ZS5nZXREYXRlKCkpLnNsaWNlKC0yKQogICAgICAgICsgKCcwJytkYXRlLmdldEhvdXJzKCkpLnNsaWNlKC0yKQogICAgICAgICsgKCcwJytkYXRlLmdldE1pbnV0ZXMoKSkuc2xpY2UoLTIpCiAgICAgICAgKyAnLScgKyByYW5kb21LZXkoNSkudG9Mb2NhbGVMb3dlckNhc2UoKQogICAgICAgICsgJy4nICsgZmlsZS5uYW1lLnNwbGl0KCcuJykucG9wKCk7CgogICAgICAvLyBnZXQgaW5wdXQgZmlsZSBpbiB0aGUgY2xvc2VzdCBmb3JtCiAgICAgIHZhciBpbnB1dEVsID0gJCh0aGlzKS5jbG9zZXN0KCJmb3JtIikuZmluZCgnaW5wdXQ6ZmlsZS5maWxlZHJvcCcpOwogICAgICBoYW5kbGVGaWxlRHJvcEV2ZW50LnRhcmdldCA9IGUudGFyZ2V0OwogICAgICBhZGRGaWxlKGlucHV0RWwsIG5ldyBGaWxlKFtmaWxlXSwgZmlsZW5hbWUsIHsgdHlwZTogZmlsZS50eXBlIH0pLCB0cnVlKTsKICAgIH0KICB9Cn0KCiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwRmlsZURyb3ApOwokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICQoImlucHV0LmRlbGV0ZWRfYXR0YWNobWVudCIpLmNoYW5nZShmdW5jdGlvbigpewogICAgJCh0aGlzKS5wYXJlbnRzKCcuZXhpc3RpbmctYXR0YWNobWVudCcpLnRvZ2dsZUNsYXNzKCdkZWxldGVkJywgJCh0aGlzKS5pcygiOmNoZWNrZWQiKSk7CiAgfSkuY2hhbmdlKCk7Cn0pOwo=" | |
| } | |
| }, | |
| "6.0.2": { | |
| "application.js": { | |
| "hash": "af03887f3bf3d19ec7501dee32b4c7d1", | |
| "path": "/usr/src/redmine/public/assets/application-2c7543cd.js", | |
| "base64": "LyoqCiAqIFJlZG1pbmUgLSBwcm9qZWN0IG1hbmFnZW1lbnQgc29mdHdhcmUKICogQ29weXJpZ2h0IChDKSAyMDA2LSAgSmVhbi1QaGlsaXBwZSBMYW5nCiAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCiAqLwoKZnVuY3Rpb24gc2FuaXRpemVIVE1MKHN0cmluZykgewogIHZhciB0ZW1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIHRlbXAudGV4dENvbnRlbnQgPSBzdHJpbmc7CiAgcmV0dXJuIHRlbXAuaW5uZXJIVE1MOwp9CgpmdW5jdGlvbiBjaGVja0FsbChpZCwgY2hlY2tlZCkgewogICQoJyMnK2lkKS5maW5kKCdpbnB1dFt0eXBlPWNoZWNrYm94XTplbmFibGVkJykucHJvcCgnY2hlY2tlZCcsIGNoZWNrZWQpOwp9CgpmdW5jdGlvbiB0b2dnbGVDaGVja2JveGVzQnlTZWxlY3RvcihzZWxlY3RvcikgewogIHZhciBhbGxfY2hlY2tlZCA9IHRydWU7CiAgJChzZWxlY3RvcikuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgaWYgKCEkKHRoaXMpLmlzKCc6Y2hlY2tlZCcpKSB7IGFsbF9jaGVja2VkID0gZmFsc2U7IH0KICB9KTsKICAkKHNlbGVjdG9yKS5wcm9wKCdjaGVja2VkJywgIWFsbF9jaGVja2VkKS50cmlnZ2VyKCdjaGFuZ2UnKTsKfQoKZnVuY3Rpb24gc2hvd0FuZFNjcm9sbFRvKGlkLCBmb2N1cykgewogICQoJyMnK2lkKS5zaG93KCk7CiAgaWYgKGZvY3VzICE9PSBudWxsKSB7CiAgICAkKCcjJytmb2N1cykuZm9jdXMoKTsKICB9CiAgJCgnaHRtbCwgYm9keScpLmFuaW1hdGUoe3Njcm9sbFRvcDogJCgnIycraWQpLm9mZnNldCgpLnRvcH0sIDEwMCk7Cn0KCmZ1bmN0aW9uIHRvZ2dsZVJvd0dyb3VwKGVsKSB7CiAgdmFyIHRyID0gJChlbCkucGFyZW50cygndHInKS5maXJzdCgpOwogIHZhciBuID0gdHIubmV4dCgpOwogIHRyLnRvZ2dsZUNsYXNzKCdvcGVuJyk7CiAgJChlbCkudG9nZ2xlQ2xhc3MoJ2ljb24tZXhwYW5kZWQgaWNvbi1jb2xsYXBzZWQnKTsKICB0b2dnbGVFeHBlbmRDb2xsYXBzZUljb24oZWwpCiAgd2hpbGUgKG4ubGVuZ3RoICYmICFuLmhhc0NsYXNzKCdncm91cCcpKSB7CiAgICBuLnRvZ2dsZSgpOwogICAgbiA9IG4ubmV4dCgndHInKTsKICB9Cn0KCmZ1bmN0aW9uIHRvZ2dsZUV4cGVuZENvbGxhcHNlSWNvbihlbCkgewogIGlmIChlbC5jbGFzc0xpc3QuY29udGFpbnMoJ2ljb24tZXhwYW5kZWQnKSkgewogICAgdXBkYXRlU1ZHSWNvbihlbCwgJ2FuZ2xlLWRvd24nKQogIH0gZWxzZSB7CiAgICB1cGRhdGVTVkdJY29uKGVsLCAnYW5nbGUtcmlnaHQnKQogIH0KfQoKZnVuY3Rpb24gdXBkYXRlU1ZHSWNvbihlbGVtZW50LCBpY29uKSB7CiAgY29uc3QgaWNvbkVsZW1lbnQgPSBlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ1c2UiKS5pdGVtKDApCgogIGlmIChpY29uRWxlbWVudCA9PT0gbnVsbCkgewogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgY29uc3QgaWNvblBhdGggPSBpY29uRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTsKICBpY29uRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBpY29uUGF0aC5yZXBsYWNlKC8jLiokL2csICIjaWNvbi0tIiArIGljb24pKQp9CgpmdW5jdGlvbiBjb2xsYXBzZUFsbFJvd0dyb3VwcyhlbCkgewogIHZhciB0Ym9keSA9ICQoZWwpLnBhcmVudHMoJ3Rib2R5JykuZmlyc3QoKTsKICB0Ym9keS5jaGlsZHJlbigndHInKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnZ3JvdXAnKSkgewogICAgICAkKHRoaXMpLnJlbW92ZUNsYXNzKCdvcGVuJyk7CiAgICAgICQodGhpcykuZmluZCgnLmV4cGFuZGVyJykuc3dpdGNoQ2xhc3MoJ2ljb24tZXhwYW5kZWQnLCAnaWNvbi1jb2xsYXBzZWQnKTsKICAgIH0gZWxzZSB7CiAgICAgICQodGhpcykuaGlkZSgpOwogICAgfQogIH0pOwp9CgpmdW5jdGlvbiBleHBhbmRBbGxSb3dHcm91cHMoZWwpIHsKICB2YXIgdGJvZHkgPSAkKGVsKS5wYXJlbnRzKCd0Ym9keScpLmZpcnN0KCk7CiAgdGJvZHkuY2hpbGRyZW4oJ3RyJykuZWFjaChmdW5jdGlvbihpbmRleCkgewogICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ2dyb3VwJykpIHsKICAgICAgJCh0aGlzKS5hZGRDbGFzcygnb3BlbicpOwogICAgICAkKHRoaXMpLmZpbmQoJy5leHBhbmRlcicpLnN3aXRjaENsYXNzKCdpY29uLWNvbGxhcHNlZCcsICdpY29uLWV4cGFuZGVkJyk7CiAgICB9IGVsc2UgewogICAgICAkKHRoaXMpLnNob3coKTsKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gdG9nZ2xlQWxsUm93R3JvdXBzKGVsKSB7CiAgdmFyIHRyID0gJChlbCkucGFyZW50cygndHInKS5maXJzdCgpOwogIGlmICh0ci5oYXNDbGFzcygnb3BlbicpKSB7CiAgICBjb2xsYXBzZUFsbFJvd0dyb3VwcyhlbCk7CiAgfSBlbHNlIHsKICAgIGV4cGFuZEFsbFJvd0dyb3VwcyhlbCk7CiAgfQp9CgpmdW5jdGlvbiB0b2dnbGVGaWVsZHNldChlbCkgewogIHZhciBmaWVsZHNldCA9ICQoZWwpLnBhcmVudHMoJ2ZpZWxkc2V0JykuZmlyc3QoKTsKICBmaWVsZHNldC50b2dnbGVDbGFzcygnY29sbGFwc2VkJyk7CiAgZmllbGRzZXQuY2hpbGRyZW4oJ2xlZ2VuZCcpLnRvZ2dsZUNsYXNzKCdpY29uLWV4cGFuZGVkIGljb24tY29sbGFwc2VkJyk7CiAgdG9nZ2xlRXhwZW5kQ29sbGFwc2VJY29uKGZpZWxkc2V0LmNoaWxkcmVuKCdsZWdlbmQnKVswXSkKICBmaWVsZHNldC5jaGlsZHJlbignZGl2JykudG9nZ2xlKCk7Cn0KCmZ1bmN0aW9uIGhpZGVGaWVsZHNldChlbCkgewogIHZhciBmaWVsZHNldCA9ICQoZWwpLnBhcmVudHMoJ2ZpZWxkc2V0JykuZmlyc3QoKTsKICBmaWVsZHNldC50b2dnbGVDbGFzcygnY29sbGFwc2VkJyk7CiAgZmllbGRzZXQuY2hpbGRyZW4oJ2RpdicpLmhpZGUoKTsKfQoKLy8gY29sdW1ucyBzZWxlY3Rpb24KZnVuY3Rpb24gbW92ZU9wdGlvbnModGhlU2VsRnJvbSwgdGhlU2VsVG8pIHsKICAkKHRoZVNlbEZyb20pLmZpbmQoJ29wdGlvbjpzZWxlY3RlZCcpLmRldGFjaCgpLnByb3AoInNlbGVjdGVkIiwgZmFsc2UpLmFwcGVuZFRvKCQodGhlU2VsVG8pKTsKfQoKZnVuY3Rpb24gbW92ZU9wdGlvblVwKHRoZVNlbCkgewogICQodGhlU2VsKS5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAkKHRoaXMpLnByZXYoJzpub3QoOnNlbGVjdGVkKScpLmRldGFjaCgpLmluc2VydEFmdGVyKCQodGhpcykpOwogIH0pOwp9CgpmdW5jdGlvbiBtb3ZlT3B0aW9uVG9wKHRoZVNlbCkgewogICQodGhlU2VsKS5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS5kZXRhY2goKS5wcmVwZW5kVG8oJCh0aGVTZWwpKTsKfQoKZnVuY3Rpb24gbW92ZU9wdGlvbkRvd24odGhlU2VsKSB7CiAgJCgkKHRoZVNlbCkuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykuZ2V0KCkucmV2ZXJzZSgpKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAkKHRoaXMpLm5leHQoJzpub3QoOnNlbGVjdGVkKScpLmRldGFjaCgpLmluc2VydEJlZm9yZSgkKHRoaXMpKTsKICB9KTsKfQoKZnVuY3Rpb24gbW92ZU9wdGlvbkJvdHRvbSh0aGVTZWwpIHsKICAkKHRoZVNlbCkuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykuZGV0YWNoKCkuYXBwZW5kVG8oJCh0aGVTZWwpKTsKfQoKZnVuY3Rpb24gaW5pdEZpbHRlcnMoKSB7CiAgJCgnI2FkZF9maWx0ZXJfc2VsZWN0JykuY2hhbmdlKGZ1bmN0aW9uKCkgewogICAgYWRkRmlsdGVyKCQodGhpcykudmFsKCksICcnLCBbXSk7CiAgfSk7CiAgJCgnI2ZpbHRlcnMtdGFibGUgLmZpZWxkIGlucHV0W3R5cGU9Y2hlY2tib3hdJykuZWFjaChmdW5jdGlvbigpIHsKICAgIHRvZ2dsZUZpbHRlcigkKHRoaXMpLnZhbCgpKTsKICB9KTsKICAkKCcjZmlsdGVycy10YWJsZScpLm9uKCdjbGljaycsICcuZmllbGQgaW5wdXRbdHlwZT1jaGVja2JveF0nLCBmdW5jdGlvbigpIHsKICAgIHRvZ2dsZUZpbHRlcigkKHRoaXMpLnZhbCgpKTsKICB9KTsKICAkKCcjZmlsdGVycy10YWJsZScpLm9uKCdrZXlwcmVzcycsICdpbnB1dFt0eXBlPXRleHRdJywgZnVuY3Rpb24oZSkgewogICAgaWYgKGUua2V5Q29kZSA9PSAxMykgJCh0aGlzKS5jbG9zZXN0KCdmb3JtJykuc3VibWl0KCk7CiAgfSk7Cn0KCmZ1bmN0aW9uIGFkZEZpbHRlcihmaWVsZCwgb3BlcmF0b3IsIHZhbHVlcykgewogIHZhciBmaWVsZElkID0gZmllbGQucmVwbGFjZSgnLicsICdfJyk7CiAgdmFyIHRyID0gJCgnI3RyXycrZmllbGRJZCk7CgogIHZhciBmaWx0ZXJPcHRpb25zID0gYXZhaWxhYmxlRmlsdGVyc1tmaWVsZF07CiAgaWYgKCFmaWx0ZXJPcHRpb25zKSByZXR1cm47CgogIGlmIChmaWx0ZXJPcHRpb25zWydyZW1vdGUnXSAmJiBmaWx0ZXJPcHRpb25zWyd2YWx1ZXMnXSA9PSBudWxsKSB7CiAgICAkLmdldEpTT04oZmlsdGVyc1VybCwgeyduYW1lJzogZmllbGR9KS5kb25lKGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgZmlsdGVyT3B0aW9uc1sndmFsdWVzJ10gPSBkYXRhOwogICAgICBhZGRGaWx0ZXIoZmllbGQsIG9wZXJhdG9yLCB2YWx1ZXMpIDsKICAgIH0pOwogICAgcmV0dXJuOwogIH0KCiAgaWYgKHRyLmxlbmd0aCA+IDApIHsKICAgIHRyLnNob3coKTsKICB9IGVsc2UgewogICAgYnVpbGRGaWx0ZXJSb3coZmllbGQsIG9wZXJhdG9yLCB2YWx1ZXMpOwogIH0KICAkKCcjY2JfJytmaWVsZElkKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7CiAgdG9nZ2xlRmlsdGVyKGZpZWxkKTsKICB0b2dnbGVNdWx0aVNlbGVjdEljb25Jbml0KCk7CiAgJCgnI2FkZF9maWx0ZXJfc2VsZWN0JykudmFsKCcnKS5maW5kKCdvcHRpb24nKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgaWYgKCQodGhpcykuYXR0cigndmFsdWUnKSA9PSBmaWVsZCkgewogICAgICAkKHRoaXMpLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIGJ1aWxkRmlsdGVyUm93KGZpZWxkLCBvcGVyYXRvciwgdmFsdWVzKSB7CiAgdmFyIGZpZWxkSWQgPSBmaWVsZC5yZXBsYWNlKCcuJywgJ18nKTsKICB2YXIgZmlsdGVyVGFibGUgPSAkKCIjZmlsdGVycy10YWJsZSIpOwogIHZhciBmaWx0ZXJPcHRpb25zID0gYXZhaWxhYmxlRmlsdGVyc1tmaWVsZF07CiAgaWYgKCFmaWx0ZXJPcHRpb25zKSByZXR1cm47CiAgdmFyIG9wZXJhdG9ycyA9IG9wZXJhdG9yQnlUeXBlW2ZpbHRlck9wdGlvbnNbJ3R5cGUnXV07CiAgdmFyIGZpbHRlclZhbHVlcyA9IGZpbHRlck9wdGlvbnNbJ3ZhbHVlcyddOwogIHZhciBzZWxlY3Q7CgogIHZhciB0ciA9ICQoJzxkaXYgY2xhc3M9ImZpbHRlciI+JykuYXR0cignaWQnLCAndHJfJytmaWVsZElkKS5odG1sKAogICAgJzxkaXYgY2xhc3M9ImZpZWxkIj48aW5wdXQgY2hlY2tlZD0iY2hlY2tlZCIgaWQ9ImNiXycrZmllbGRJZCsnIiBuYW1lPSJmW10iIHZhbHVlPSInK2ZpZWxkKyciIHR5cGU9ImNoZWNrYm94Ij48bGFiZWwgZm9yPSJjYl8nK2ZpZWxkSWQrJyI+ICcrZmlsdGVyT3B0aW9uc1snbmFtZSddKyc8L2xhYmVsPjwvZGl2PicgKwogICAgJzxkaXYgY2xhc3M9Im9wZXJhdG9yIj48c2VsZWN0IGlkPSJvcGVyYXRvcnNfJytmaWVsZElkKyciIG5hbWU9Im9wWycrZmllbGQrJ10iPjwvc2VsZWN0PjwvZGl2PicgKwogICAgJzxkaXYgY2xhc3M9InZhbHVlcyI+PC9kaXY+JwogICk7CiAgZmlsdGVyVGFibGUuYXBwZW5kKHRyKTsKCiAgc2VsZWN0ID0gdHIuZmluZCgnLm9wZXJhdG9yIHNlbGVjdCcpOwogIG9wZXJhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uKG9wKSB7CiAgICB2YXIgb3B0aW9uID0gJCgnPG9wdGlvbj4nKS52YWwob3ApLnRleHQob3BlcmF0b3JMYWJlbHNbb3BdKTsKICAgIGlmIChvcCA9PSBvcGVyYXRvcikgeyBvcHRpb24ucHJvcCgnc2VsZWN0ZWQnLCB0cnVlKTsgfQogICAgc2VsZWN0LmFwcGVuZChvcHRpb24pOwogIH0pOwogIHNlbGVjdC5jaGFuZ2UoZnVuY3Rpb24oKXsgdG9nZ2xlT3BlcmF0b3IoZmllbGQpOyB9KTsKCiAgc3dpdGNoIChmaWx0ZXJPcHRpb25zWyd0eXBlJ10pIHsKICBjYXNlICJsaXN0IjoKICBjYXNlICJsaXN0X3dpdGhfaGlzdG9yeSI6CiAgY2FzZSAibGlzdF9vcHRpb25hbCI6CiAgY2FzZSAibGlzdF9vcHRpb25hbF93aXRoX2hpc3RvcnkiOgogIGNhc2UgImxpc3Rfc3RhdHVzIjoKICBjYXNlICJsaXN0X3N1YnByb2plY3RzIjoKICAgIHRyLmZpbmQoJy52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PHNlbGVjdCBjbGFzcz0idmFsdWUiIGlkPSJ2YWx1ZXNfJytmaWVsZElkKydfMSIgbmFtZT0idlsnK2ZpZWxkKyddW10iPjwvc2VsZWN0PicgKwogICAgICAnIDxzcGFuIGNsYXNzPSJ0b2dnbGUtbXVsdGlzZWxlY3QgaWNvbi1vbmx5ICcrKHZhbHVlcy5sZW5ndGggPiAxID8gJ2ljb24tdG9nZ2xlLW1pbnVzJyA6ICdpY29uLXRvZ2dsZS1wbHVzJykrJyI+Jm5ic3A7PC9zcGFuPjwvc3Bhbj4nCiAgICApOwogICAgc2VsZWN0ID0gdHIuZmluZCgnLnZhbHVlcyBzZWxlY3QnKTsKICAgIGlmICh2YWx1ZXMubGVuZ3RoID4gMSkgeyBzZWxlY3QuYXR0cignbXVsdGlwbGUnLCB0cnVlKTsgfQogICAgZmlsdGVyVmFsdWVzLmZvckVhY2goZnVuY3Rpb24oZmlsdGVyVmFsdWUpIHsKICAgICAgdmFyIG9wdGlvbiA9ICQoJzxvcHRpb24+Jyk7CiAgICAgIGlmICgkLmlzQXJyYXkoZmlsdGVyVmFsdWUpKSB7CiAgICAgICAgb3B0aW9uLnZhbChmaWx0ZXJWYWx1ZVsxXSkudGV4dChmaWx0ZXJWYWx1ZVswXSk7CiAgICAgICAgaWYgKCQuaW5BcnJheShmaWx0ZXJWYWx1ZVsxXSwgdmFsdWVzKSA+IC0xKSB7b3B0aW9uLnByb3AoJ3NlbGVjdGVkJywgdHJ1ZSk7fQogICAgICAgIGlmIChmaWx0ZXJWYWx1ZS5sZW5ndGggPT0gMykgewogICAgICAgICAgdmFyIG9wdGdyb3VwID0gc2VsZWN0LmZpbmQoJ29wdGdyb3VwJykuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuICQodGhpcykuYXR0cignbGFiZWwnKSA9PSBmaWx0ZXJWYWx1ZVsyXX0pOwogICAgICAgICAgaWYgKCFvcHRncm91cC5sZW5ndGgpIHtvcHRncm91cCA9ICQoJzxvcHRncm91cD4nKS5hdHRyKCdsYWJlbCcsIGZpbHRlclZhbHVlWzJdKTt9CiAgICAgICAgICBvcHRpb24gPSBvcHRncm91cC5hcHBlbmQob3B0aW9uKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb3B0aW9uLnZhbChmaWx0ZXJWYWx1ZSkudGV4dChmaWx0ZXJWYWx1ZSk7CiAgICAgICAgaWYgKCQuaW5BcnJheShmaWx0ZXJWYWx1ZSwgdmFsdWVzKSA+IC0xKSB7b3B0aW9uLnByb3AoJ3NlbGVjdGVkJywgdHJ1ZSk7fQogICAgICB9CiAgICAgIHNlbGVjdC5hcHBlbmQob3B0aW9uKTsKICAgIH0pOwogICAgYnJlYWs7CiAgY2FzZSAiZGF0ZSI6CiAgY2FzZSAiZGF0ZV9wYXN0IjoKICAgIHRyLmZpbmQoJy52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9ImRhdGUiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnXzEiIHNpemU9IjEwIiBjbGFzcz0idmFsdWUgZGF0ZV92YWx1ZSIgLz48L3NwYW4+JyArCiAgICAgICcgPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZTsiPjxpbnB1dCB0eXBlPSJkYXRlIiBuYW1lPSJ2WycrZmllbGQrJ11bXSIgaWQ9InZhbHVlc18nK2ZpZWxkSWQrJ18yIiBzaXplPSIxMCIgY2xhc3M9InZhbHVlIGRhdGVfdmFsdWUiIC8+PC9zcGFuPicgKwogICAgICAnIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKyciIHNpemU9IjMiIGNsYXNzPSJ2YWx1ZSIgLz4gJytsYWJlbERheVBsdXJhbCsnPC9zcGFuPicKICAgICk7CiAgICAkKCcjdmFsdWVzXycrZmllbGRJZCsnXzEnKS52YWwodmFsdWVzWzBdKS5kYXRlcGlja2VyRmFsbGJhY2soZGF0ZXBpY2tlck9wdGlvbnMpOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQrJ18yJykudmFsKHZhbHVlc1sxXSkuZGF0ZXBpY2tlckZhbGxiYWNrKGRhdGVwaWNrZXJPcHRpb25zKTsKICAgICQoJyN2YWx1ZXNfJytmaWVsZElkKS52YWwodmFsdWVzWzBdKTsKICAgIGJyZWFrOwogIGNhc2UgInN0cmluZyI6CiAgY2FzZSAidGV4dCI6CiAgY2FzZSAic2VhcmNoIjoKICAgIHRyLmZpbmQoJy52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnIiBzaXplPSIzMCIgY2xhc3M9InZhbHVlIiAvPjwvc3Bhbj4nCiAgICApOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQpLnZhbCh2YWx1ZXNbMF0pOwogICAgYnJlYWs7CiAgY2FzZSAicmVsYXRpb24iOgogICAgdHIuZmluZCgnLnZhbHVlcycpLmFwcGVuZCgKICAgICAgJzxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKyciIHNpemU9IjYiIGNsYXNzPSJ2YWx1ZSIgLz48L3NwYW4+JyArCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PHNlbGVjdCBjbGFzcz0idmFsdWUiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnXzEiPjwvc2VsZWN0Pjwvc3Bhbj4nCiAgICApOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQpLnZhbCh2YWx1ZXNbMF0pOwogICAgc2VsZWN0ID0gdHIuZmluZCgnLnZhbHVlcyBzZWxlY3QnKTsKICAgIGZpbHRlclZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKGZpbHRlclZhbHVlKSB7CiAgICAgIHZhciBvcHRpb24gPSAkKCc8b3B0aW9uPicpOwogICAgICBvcHRpb24udmFsKGZpbHRlclZhbHVlWzFdKS50ZXh0KGZpbHRlclZhbHVlWzBdKTsKICAgICAgaWYgKHZhbHVlc1swXSA9PSBmaWx0ZXJWYWx1ZVsxXSkgeyBvcHRpb24ucHJvcCgnc2VsZWN0ZWQnLCB0cnVlKTsgfQogICAgICBzZWxlY3QuYXBwZW5kKG9wdGlvbik7CiAgICB9KTsKICAgIGJyZWFrOwogIGNhc2UgImludGVnZXIiOgogIGNhc2UgImZsb2F0IjoKICBjYXNlICJ0cmVlIjoKICAgIHRyLmZpbmQoJy52YWx1ZXMnKS5hcHBlbmQoCiAgICAgICc8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lOyI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9InZbJytmaWVsZCsnXVtdIiBpZD0idmFsdWVzXycrZmllbGRJZCsnXzEiIHNpemU9IjE0IiBjbGFzcz0idmFsdWUiIC8+PC9zcGFuPicgKwogICAgICAnIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0idlsnK2ZpZWxkKyddW10iIGlkPSJ2YWx1ZXNfJytmaWVsZElkKydfMiIgc2l6ZT0iMTQiIGNsYXNzPSJ2YWx1ZSIgLz48L3NwYW4+JwogICAgKTsKICAgICQoJyN2YWx1ZXNfJytmaWVsZElkKydfMScpLnZhbCh2YWx1ZXNbMF0pOwogICAgJCgnI3ZhbHVlc18nK2ZpZWxkSWQrJ18yJykudmFsKHZhbHVlc1sxXSk7CiAgICBicmVhazsKICB9Cn0KCmZ1bmN0aW9uIHRvZ2dsZUZpbHRlcihmaWVsZCkgewogIHZhciBmaWVsZElkID0gZmllbGQucmVwbGFjZSgnLicsICdfJyk7CiAgaWYgKCQoJyNjYl8nICsgZmllbGRJZCkuaXMoJzpjaGVja2VkJykpIHsKICAgICQoIiNvcGVyYXRvcnNfIiArIGZpZWxkSWQpLnNob3coKS5yZW1vdmVBdHRyKCdkaXNhYmxlZCcpOwogICAgdG9nZ2xlT3BlcmF0b3IoZmllbGQpOwogIH0gZWxzZSB7CiAgICAkKCIjb3BlcmF0b3JzXyIgKyBmaWVsZElkKS5oaWRlKCkuYXR0cignZGlzYWJsZWQnLCB0cnVlKTsKICAgIGVuYWJsZVZhbHVlcyhmaWVsZCwgW10pOwogIH0KfQoKZnVuY3Rpb24gZW5hYmxlVmFsdWVzKGZpZWxkLCBpbmRleGVzKSB7CiAgdmFyIGZpZWxkSWQgPSBmaWVsZC5yZXBsYWNlKCcuJywgJ18nKTsKICAkKCcjdHJfJytmaWVsZElkKycgLnZhbHVlcyAudmFsdWUnKS5lYWNoKGZ1bmN0aW9uKGluZGV4KSB7CiAgICBpZiAoJC5pbkFycmF5KGluZGV4LCBpbmRleGVzKSA+PSAwKSB7CiAgICAgICQodGhpcykucmVtb3ZlQXR0cignZGlzYWJsZWQnKTsKICAgICAgJCh0aGlzKS5wYXJlbnRzKCdzcGFuJykuZmlyc3QoKS5zaG93KCk7CiAgICB9IGVsc2UgewogICAgICAkKHRoaXMpLnZhbCgnJyk7CiAgICAgICQodGhpcykuYXR0cignZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgJCh0aGlzKS5wYXJlbnRzKCdzcGFuJykuZmlyc3QoKS5oaWRlKCk7CiAgICB9CgogICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ2dyb3VwJykpIHsKICAgICAgJCh0aGlzKS5hZGRDbGFzcygnb3BlbicpOwogICAgfSBlbHNlIHsKICAgICAgJCh0aGlzKS5zaG93KCk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIHRvZ2dsZU9wZXJhdG9yKGZpZWxkKSB7CiAgdmFyIGZpZWxkSWQgPSBmaWVsZC5yZXBsYWNlKCcuJywgJ18nKTsKICB2YXIgb3BlcmF0b3IgPSAkKCIjb3BlcmF0b3JzXyIgKyBmaWVsZElkKTsKICBzd2l0Y2ggKG9wZXJhdG9yLnZhbCgpKSB7CiAgICBjYXNlICIhKiI6CiAgICBjYXNlICIqIjoKICAgIGNhc2UgIm5kIjoKICAgIGNhc2UgInQiOgogICAgY2FzZSAibGQiOgogICAgY2FzZSAibnciOgogICAgY2FzZSAidyI6CiAgICBjYXNlICJsdyI6CiAgICBjYXNlICJsMnciOgogICAgY2FzZSAibm0iOgogICAgY2FzZSAibSI6CiAgICBjYXNlICJsbSI6CiAgICBjYXNlICJ5IjoKICAgIGNhc2UgIm8iOgogICAgY2FzZSAiYyI6CiAgICBjYXNlICIqbyI6CiAgICBjYXNlICIhbyI6CiAgICAgIGVuYWJsZVZhbHVlcyhmaWVsZCwgW10pOwogICAgICBicmVhazsKICAgIGNhc2UgIj48IjoKICAgICAgZW5hYmxlVmFsdWVzKGZpZWxkLCBbMCwxXSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAiPHQrIjoKICAgIGNhc2UgIj50KyI6CiAgICBjYXNlICI+PHQrIjoKICAgIGNhc2UgInQrIjoKICAgIGNhc2UgIj50LSI6CiAgICBjYXNlICI8dC0iOgogICAgY2FzZSAiPjx0LSI6CiAgICBjYXNlICJ0LSI6CiAgICAgIGVuYWJsZVZhbHVlcyhmaWVsZCwgWzJdKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICI9cCI6CiAgICBjYXNlICI9IXAiOgogICAgY2FzZSAiIXAiOgogICAgICBlbmFibGVWYWx1ZXMoZmllbGQsIFsxXSk7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgZW5hYmxlVmFsdWVzKGZpZWxkLCBbMF0pOwogICAgICBicmVhazsKICB9Cn0KCmZ1bmN0aW9uIHRvZ2dsZU11bHRpU2VsZWN0KGVsKSB7CiAgdmFyIGlzV29ya2Zsb3cgPSBlbC5jbG9zZXN0KCcuY29udHJvbGxlci13b3JrZmxvd3MnKTsKICBpZiAoZWwuYXR0cignbXVsdGlwbGUnKSkgewogICAgZWwucmVtb3ZlQXR0cignbXVsdGlwbGUnKTsKICAgIGlmIChpc1dvcmtmbG93KSB7IGVsLmZpbmQoIm9wdGlvblt2YWx1ZT1hbGxdIikuc2hvdygpOyB9CiAgICBlbC5hdHRyKCdzaXplJywgMSk7CiAgfSBlbHNlIHsKICAgIGVsLmF0dHIoJ211bHRpcGxlJywgdHJ1ZSk7CiAgICBpZiAoaXNXb3JrZmxvdykgeyBlbC5maW5kKCJvcHRpb25bdmFsdWU9YWxsXSIpLmF0dHIoInNlbGVjdGVkIiwgZmFsc2UpLmhpZGUoKTsgfQogICAgaWYgKGVsLmNoaWxkcmVuKCkubGVuZ3RoID4gMTApCiAgICAgIGVsLmF0dHIoJ3NpemUnLCAxMCk7CiAgICBlbHNlCiAgICAgIGVsLmF0dHIoJ3NpemUnLCA0KTsKICB9Cn0KCmZ1bmN0aW9uIHNob3dUYWIobmFtZSwgdXJsKSB7CiAgJCgnI3RhYi1jb250ZW50LScgKyBuYW1lKS5wYXJlbnQoKS5maW5kKCcudGFiLWNvbnRlbnQnKS5oaWRlKCk7CiAgJCgnI3RhYi1jb250ZW50LScgKyBuYW1lKS5zaG93KCk7CiAgJCgnI3RhYi0nICsgbmFtZSkuY2xvc2VzdCgnLnRhYnMnKS5maW5kKCdhJykucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkJyk7CiAgJCgnI3RhYi0nICsgbmFtZSkuYWRkQ2xhc3MoJ3NlbGVjdGVkJyk7CgogIHJlcGxhY2VJbkhpc3RvcnkodXJsKQoKICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIHNob3dJc3N1ZUhpc3Rvcnkoam91cm5hbCwgdXJsKSB7CiAgdGFiX2NvbnRlbnQgPSAkKCcjdGFiLWNvbnRlbnQtaGlzdG9yeScpOwogIHRhYl9jb250ZW50LnBhcmVudCgpLmZpbmQoJy50YWItY29udGVudCcpLmhpZGUoKTsKICB0YWJfY29udGVudC5zaG93KCk7CiAgdGFiX2NvbnRlbnQucGFyZW50KCkuY2hpbGRyZW4oJ2Rpdi50YWJzJykuZmluZCgnYScpLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpOwoKICAkKCcjdGFiLScgKyBqb3VybmFsKS5hZGRDbGFzcygnc2VsZWN0ZWQnKTsKCiAgcmVwbGFjZUluSGlzdG9yeSh1cmwpCgogIHN3aXRjaChqb3VybmFsKSB7CiAgICBjYXNlICdub3Rlcyc6CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbDpub3QoLmhhcy1ub3RlcyknKS5oaWRlKCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC53aWtpJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAuY29udGV4dHVhbCAuam91cm5hbC1hY3Rpb25zJykuc2hvdygpOwoKICAgICAgLy8gYWx3YXlzIHNob3cgdGh1bWJuYWlscyBpbiBub3RlcyB0YWIKICAgICAgdmFyIHRodW1ibmFpbHMgPSB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAudGh1bWJuYWlscycpOwogICAgICB0aHVtYm5haWxzLnNob3coKTsKICAgICAgLy8gc2hvdyBqb3VybmFscyB3aXRob3V0IG5vdGVzLCBidXQgd2l0aCB0aHVtYm5haWxzCiAgICAgIHRodW1ibmFpbHMucGFyZW50cygnLmpvdXJuYWwnKS5zaG93KCk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAncHJvcGVydGllcyc6CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbDpub3QoLmhhcy1kZXRhaWxzKScpLmhpZGUoKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwgLndpa2knKS5oaWRlKCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC50aHVtYm5haWxzJykuaGlkZSgpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAuY29udGV4dHVhbCAuam91cm5hbC1hY3Rpb25zJykuaGlkZSgpOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsJykuc2hvdygpOwogICAgICB0YWJfY29udGVudC5maW5kKCcuam91cm5hbCAud2lraScpLnNob3coKTsKICAgICAgdGFiX2NvbnRlbnQuZmluZCgnLmpvdXJuYWwgLnRodW1ibmFpbHMnKS5zaG93KCk7CiAgICAgIHRhYl9jb250ZW50LmZpbmQoJy5qb3VybmFsIC5jb250ZXh0dWFsIC5qb3VybmFsLWFjdGlvbnMnKS5zaG93KCk7CiAgfQoKICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIGdldFJlbW90ZVRhYihuYW1lLCByZW1vdGVfdXJsLCB1cmwsIGxvYWRfYWx3YXlzKSB7CiAgbG9hZF9hbHdheXMgPSBsb2FkX2Fsd2F5cyB8fCBmYWxzZTsKICB2YXIgdGFiX2NvbnRlbnQgPSAkKCcjdGFiLWNvbnRlbnQtJyArIG5hbWUpOwoKICB0YWJfY29udGVudC5wYXJlbnQoKS5maW5kKCcudGFiLWNvbnRlbnQnKS5oaWRlKCk7CiAgdGFiX2NvbnRlbnQucGFyZW50KCkuY2hpbGRyZW4oJ2Rpdi50YWJzJykuZmluZCgnYScpLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpOwogICQoJyN0YWItJyArIG5hbWUpLmFkZENsYXNzKCdzZWxlY3RlZCcpOwoKICByZXBsYWNlSW5IaXN0b3J5KHVybCk7CgogIGlmICh0YWJfY29udGVudC5jaGlsZHJlbigpLmxlbmd0aCA9PSAwICYmIGxvYWRfYWx3YXlzID09IGZhbHNlKSB7CiAgICAkLmFqYXgoewogICAgICB1cmw6IHJlbW90ZV91cmwsCiAgICAgIHR5cGU6ICdnZXQnLAogICAgICBzdWNjZXNzOiBmdW5jdGlvbihkYXRhKXsKICAgICAgICB0YWJfY29udGVudC5odG1sKGRhdGEpCiAgICAgIH0KICAgIH0pOwogIH0KCiAgdGFiX2NvbnRlbnQuc2hvdygpOwogIHJldHVybiBmYWxzZTsKfQoKLy9yZXBsYWNlcyBjdXJyZW50IFVSTCB3aXRoIHRoZSAiaHJlZiIgYXR0cmlidXRlIG9mIHRoZSBjdXJyZW50IGxpbmsKLy8ob25seSB0cmlnZ2VyZWQgaWYgc3VwcG9ydGVkIGJ5IGJyb3dzZXIpCmZ1bmN0aW9uIHJlcGxhY2VJbkhpc3RvcnkodXJsKSB7CiAgaWYgKCJyZXBsYWNlU3RhdGUiIGluIHdpbmRvdy5oaXN0b3J5ICYmIHVybCAhPT0gdW5kZWZpbmVkKSB7CiAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwgZG9jdW1lbnQudGl0bGUsIHVybCk7CiAgfQp9CgpmdW5jdGlvbiBtb3ZlVGFiUmlnaHQoZWwpIHsKICB2YXIgbGlzID0gJChlbCkucGFyZW50cygnZGl2LnRhYnMnKS5maXJzdCgpLmZpbmQoJ3VsJykuY2hpbGRyZW4oKTsKICB2YXIgYncgPSAkKGVsKS5wYXJlbnRzKCdkaXYudGFicy1idXR0b25zJykub3V0ZXJXaWR0aCh0cnVlKTsKICB2YXIgdGFic1dpZHRoID0gMDsKICB2YXIgaSA9IDA7CiAgbGlzLmVhY2goZnVuY3Rpb24oKSB7CiAgICBpZiAoJCh0aGlzKS5pcygnOnZpc2libGUnKSkgewogICAgICB0YWJzV2lkdGggKz0gJCh0aGlzKS5vdXRlcldpZHRoKHRydWUpOwogICAgfQogIH0pOwogIGlmICh0YWJzV2lkdGggPCAkKGVsKS5wYXJlbnRzKCdkaXYudGFicycpLmZpcnN0KCkud2lkdGgoKSAtIGJ3KSB7IHJldHVybjsgfQogICQoZWwpLnNpYmxpbmdzKCcudGFiLWxlZnQnKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICB3aGlsZSAoaTxsaXMubGVuZ3RoICYmICFsaXMuZXEoaSkuaXMoJzp2aXNpYmxlJykpIHsgaSsrOyB9CiAgdmFyIHcgPSBsaXMuZXEoaSkud2lkdGgoKTsKICBsaXMuZXEoaSkuaGlkZSgpOwogIGlmICh0YWJzV2lkdGggLSB3IDwgJChlbCkucGFyZW50cygnZGl2LnRhYnMnKS5maXJzdCgpLndpZHRoKCkgLSBidykgewogICAgJChlbCkuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7CiAgfQp9CgpmdW5jdGlvbiBtb3ZlVGFiTGVmdChlbCkgewogIHZhciBsaXMgPSAkKGVsKS5wYXJlbnRzKCdkaXYudGFicycpLmZpcnN0KCkuZmluZCgndWwnKS5jaGlsZHJlbigpOwogIHZhciBpID0gMDsKICB3aGlsZSAoaSA8IGxpcy5sZW5ndGggJiYgIWxpcy5lcShpKS5pcygnOnZpc2libGUnKSkgeyBpKys7IH0KICBpZiAoaSA+IDApIHsKICAgIGxpcy5lcShpLTEpLnNob3coKTsKICAgICQoZWwpLnNpYmxpbmdzKCcudGFiLXJpZ2h0JykucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7CiAgfQogIGlmIChpIDw9IDEpIHsKICAgICQoZWwpLmFkZENsYXNzKCdkaXNhYmxlZCcpOwogIH0KfQoKZnVuY3Rpb24gZGlzcGxheVRhYnNCdXR0b25zKCkgewogIHZhciBsaXM7CiAgdmFyIHRhYnNXaWR0aDsKICB2YXIgZWw7CiAgdmFyIG51bUhpZGRlbjsKICAkKCdkaXYudGFicycpLmVhY2goZnVuY3Rpb24oKSB7CiAgICBlbCA9ICQodGhpcyk7CiAgICBsaXMgPSBlbC5maW5kKCd1bCcpLmNoaWxkcmVuKCk7CiAgICB0YWJzV2lkdGggPSAwOwogICAgbnVtSGlkZGVuID0gMDsKICAgIGxpcy5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgIGlmICgkKHRoaXMpLmlzKCc6dmlzaWJsZScpKSB7CiAgICAgICAgdGFic1dpZHRoICs9ICQodGhpcykub3V0ZXJXaWR0aCh0cnVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBudW1IaWRkZW4rKzsKICAgICAgfQogICAgfSk7CiAgICB2YXIgYncgPSAkKGVsKS5maW5kKCdkaXYudGFicy1idXR0b25zJykub3V0ZXJXaWR0aCh0cnVlKTsKICAgIGlmICgodGFic1dpZHRoIDwgZWwud2lkdGgoKSAtIGJ3KSAmJiAobGlzLmxlbmd0aCA9PT0gMCB8fCBsaXMuZmlyc3QoKS5pcygnOnZpc2libGUnKSkpIHsKICAgICAgZWwuZmluZCgnZGl2LnRhYnMtYnV0dG9ucycpLmhpZGUoKTsKICAgIH0gZWxzZSB7CiAgICAgIGVsLmZpbmQoJ2Rpdi50YWJzLWJ1dHRvbnMnKS5zaG93KCkuY2hpbGRyZW4oJ2J1dHRvbi50YWItbGVmdCcpLnRvZ2dsZUNsYXNzKCdkaXNhYmxlZCcsIG51bUhpZGRlbiA9PSAwKTsKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gc2V0UHJlZGVjZXNzb3JGaWVsZHNWaXNpYmlsaXR5KCkgewogIHZhciByZWxhdGlvblR5cGUgPSAkKCcjcmVsYXRpb25fcmVsYXRpb25fdHlwZScpOwogIGlmIChyZWxhdGlvblR5cGUudmFsKCkgPT0gInByZWNlZGVzIiB8fCByZWxhdGlvblR5cGUudmFsKCkgPT0gImZvbGxvd3MiKSB7CiAgICAkKCcjcHJlZGVjZXNzb3JfZmllbGRzJykuc2hvdygpOwogIH0gZWxzZSB7CiAgICAkKCcjcHJlZGVjZXNzb3JfZmllbGRzJykuaGlkZSgpOwogIH0KfQoKZnVuY3Rpb24gc2hvd01vZGFsKGlkLCB3aWR0aCwgdGl0bGUpIHsKICB2YXIgZWwgPSAkKCcjJytpZCkuZmlyc3QoKTsKICBpZiAoZWwubGVuZ3RoID09PSAwIHx8IGVsLmlzKCc6dmlzaWJsZScpKSB7cmV0dXJuO30KICBpZiAoIXRpdGxlKSB0aXRsZSA9IGVsLmZpbmQoJ2gzLnRpdGxlJykudGV4dCgpOwogIC8vIG1vdmVzIGV4aXN0aW5nIG1vZGFscyBiZWhpbmQgdGhlIHRyYW5zcGFyZW50IGJhY2tncm91bmQKICAkKCIubW9kYWwiKS5jc3MoJ3pJbmRleCcsOTkpOwogIGVsLmRpYWxvZyh7CiAgICB3aWR0aDogd2lkdGgsCiAgICBtb2RhbDogdHJ1ZSwKICAgIHJlc2l6YWJsZTogZmFsc2UsCiAgICBkaWFsb2dDbGFzczogJ21vZGFsJywKICAgIHRpdGxlOiB0aXRsZQogIH0pLm9uKCdkaWFsb2djbG9zZScsIGZ1bmN0aW9uKCl7CiAgICAkKCIubW9kYWwiKS5jc3MoJ3pJbmRleCcsMTAxKTsKICB9KTsKICBlbC5maW5kKCJpbnB1dFt0eXBlPXRleHRdLCBpbnB1dFt0eXBlPXN1Ym1pdF0iKS5maXJzdCgpLmZvY3VzKCk7Cn0KCmZ1bmN0aW9uIGhpZGVNb2RhbChlbCkgewogIHZhciBtb2RhbDsKICBpZiAoZWwpIHsKICAgIG1vZGFsID0gJChlbCkucGFyZW50cygnLnVpLWRpYWxvZy1jb250ZW50Jyk7CiAgfSBlbHNlIHsKICAgIG1vZGFsID0gJCgnI2FqYXgtbW9kYWwnKTsKICB9CiAgbW9kYWwuZGlhbG9nKCJjbG9zZSIpOwp9CgpmdW5jdGlvbiBjb2xsYXBzZVNjbUVudHJ5KGlkKSB7CiAgJCgnLicraWQpLmVhY2goZnVuY3Rpb24oKSB7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnb3BlbicpKSB7CiAgICAgIGNvbGxhcHNlU2NtRW50cnkoJCh0aGlzKS5hdHRyKCdpZCcpKTsKICAgIH0KICAgICQodGhpcykuaGlkZSgpOwogIH0pOwogICQoJyMnK2lkKS5yZW1vdmVDbGFzcygnb3BlbicpOwp9CgpmdW5jdGlvbiBleHBhbmRTY21FbnRyeShpZCkgewogICQoJy4nK2lkKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgJCh0aGlzKS5zaG93KCk7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnbG9hZGVkJykgJiYgISQodGhpcykuaGFzQ2xhc3MoJ2NvbGxhcHNlZCcpKSB7CiAgICAgIGV4cGFuZFNjbUVudHJ5KCQodGhpcykuYXR0cignaWQnKSk7CiAgICB9CiAgfSk7CiAgJCgnIycraWQpLmFkZENsYXNzKCdvcGVuJyk7Cn0KCmZ1bmN0aW9uIHNjbUVudHJ5Q2xpY2soaWQsIHVybCkgewogICAgdmFyIGVsID0gJCgnIycraWQpOwoKICAgIGlmIChlbC5oYXNDbGFzcygnb3BlbicpKSB7CiAgICAgICAgY29sbGFwc2VTY21FbnRyeShpZCk7CiAgICAgICAgZWwuZmluZCgnLmV4cGFuZGVyJykuc3dpdGNoQ2xhc3MoJ2ljb24tZXhwYW5kZWQnLCAnaWNvbi1jb2xsYXBzZWQnKTsKICAgICAgICBlbC5hZGRDbGFzcygnY29sbGFwc2VkJyk7CiAgICAgICAgdXBkYXRlU1ZHSWNvbihlbC5maW5kKCcuaWNvbi1mb2xkZXInKVswXSwgJ2ZvbGRlcicpCgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0gZWxzZSBpZiAoZWwuaGFzQ2xhc3MoJ2xvYWRlZCcpKSB7CiAgICAgICAgZXhwYW5kU2NtRW50cnkoaWQpOwogICAgICAgIGVsLmZpbmQoJy5leHBhbmRlcicpLnN3aXRjaENsYXNzKCdpY29uLWNvbGxhcHNlZCcsICdpY29uLWV4cGFuZGVkJyk7CiAgICAgICAgZWwucmVtb3ZlQ2xhc3MoJ2NvbGxhcHNlZCcpOwogICAgICAgIHVwZGF0ZVNWR0ljb24oZWwuZmluZCgnLmljb24tZm9sZGVyLW9wZW4nKVswXSwgJ2ZvbGRlci1vcGVuJykKCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgaWYgKGVsLmhhc0NsYXNzKCdsb2FkaW5nJykpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBlbC5hZGRDbGFzcygnbG9hZGluZycpOwogICAgJC5hamF4KHsKICAgICAgdXJsOiB1cmwsCiAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICBlbC5hZnRlcihkYXRhKTsKICAgICAgICBlbC5hZGRDbGFzcygnb3BlbicpLmFkZENsYXNzKCdsb2FkZWQnKS5yZW1vdmVDbGFzcygnbG9hZGluZycpOwogICAgICAgIHVwZGF0ZVNWR0ljb24oZWwuZmluZCgnLmljb24tZm9sZGVyJylbMF0sICdmb2xkZXItb3BlbicpCiAgICAgICAgZWwuZmluZCgnLmV4cGFuZGVyJykuc3dpdGNoQ2xhc3MoJ2ljb24tY29sbGFwc2VkJywgJ2ljb24tZXhwYW5kZWQnKTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gdHJ1ZTsKfQoKZnVuY3Rpb24gcmFuZG9tS2V5KHNpemUpIHsKICB2YXIgY2hhcnMgPSAnMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonOwogIHZhciBrZXkgPSAnJzsKICBmb3IgKHZhciBpID0gMDsgaSA8IHNpemU7IGkrKykgewogICAga2V5ICs9IGNoYXJzLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGFycy5sZW5ndGgpKTsKICB9CiAgcmV0dXJuIGtleTsKfQoKZnVuY3Rpb24gY29weVRleHRUb0NsaXBib2FyZCh0YXJnZXQpIHsKICBpZiAodGFyZ2V0KSB7CiAgICB2YXIgdGVtcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7CiAgICB0ZW1wLnZhbHVlID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnZGF0YS1jbGlwYm9hcmQtdGV4dCcpOwogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZW1wKTsKICAgIHRlbXAuc2VsZWN0KCk7CiAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpOwogICAgaWYgKHRlbXAucGFyZW50Tm9kZSkgewogICAgICB0ZW1wLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGVtcCk7CiAgICB9CiAgICBpZiAoJCh0YXJnZXQpLmNsb3Nlc3QoJy5kcmRuLmV4cGFuZGVkJykubGVuZ3RoKSB7CiAgICAgICQodGFyZ2V0KS5jbG9zZXN0KCcuZHJkbi5leHBhbmRlZCcpLnJlbW92ZUNsYXNzKCJleHBhbmRlZCIpOwogICAgfQogIH0KICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIHVwZGF0ZUlzc3VlRnJvbSh1cmwsIGVsKSB7CiAgJCgnI2FsbF9hdHRyaWJ1dGVzIGlucHV0LCAjYWxsX2F0dHJpYnV0ZXMgdGV4dGFyZWEsICNhbGxfYXR0cmlidXRlcyBzZWxlY3QnKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAkKHRoaXMpLmRhdGEoJ3ZhbHVlYmVmb3JldXBkYXRlJywgJCh0aGlzKS52YWwoKSk7CiAgfSk7CiAgaWYgKGVsKSB7CiAgICAkKCIjZm9ybV91cGRhdGVfdHJpZ2dlcmVkX2J5IikudmFsKCQoZWwpLmF0dHIoJ2lkJykpOwogIH0KICByZXR1cm4gJC5hamF4KHsKICAgIHVybDogdXJsLAogICAgdHlwZTogJ3Bvc3QnLAogICAgZGF0YTogJCgnI2lzc3VlLWZvcm0nKS5zZXJpYWxpemUoKQogIH0pOwp9CgpmdW5jdGlvbiByZXBsYWNlSXNzdWVGb3JtV2l0aChodG1sKXsKICB2YXIgcmVwbGFjZW1lbnQgPSAkKGh0bWwpOwogICQoJyNhbGxfYXR0cmlidXRlcyBpbnB1dCwgI2FsbF9hdHRyaWJ1dGVzIHRleHRhcmVhLCAjYWxsX2F0dHJpYnV0ZXMgc2VsZWN0JykuZWFjaChmdW5jdGlvbigpewogICAgdmFyIG9iamVjdF9pZCA9ICQodGhpcykuYXR0cignaWQnKTsKICAgIGlmIChvYmplY3RfaWQgJiYgJCh0aGlzKS5kYXRhKCd2YWx1ZWJlZm9yZXVwZGF0ZScpIT0kKHRoaXMpLnZhbCgpKSB7CiAgICAgIHJlcGxhY2VtZW50LmZpbmQoJyMnK29iamVjdF9pZCkudmFsKCQodGhpcykudmFsKCkpOwogICAgfQogIH0pOwogICQoJyNhbGxfYXR0cmlidXRlcycpLmVtcHR5KCk7CiAgJCgnI2FsbF9hdHRyaWJ1dGVzJykucHJlcGVuZChyZXBsYWNlbWVudCk7Cn0KCmZ1bmN0aW9uIHVwZGF0ZUJ1bGtFZGl0RnJvbSh1cmwpIHsKICAkLmFqYXgoewogICAgdXJsOiB1cmwsCiAgICB0eXBlOiAncG9zdCcsCiAgICBkYXRhOiAkKCcjYnVsa19lZGl0X2Zvcm0nKS5zZXJpYWxpemUoKQogIH0pOwp9CgpmdW5jdGlvbiBvYnNlcnZlQXV0b2NvbXBsZXRlRmllbGQoZmllbGRJZCwgdXJsLCBvcHRpb25zKSB7CiAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CiAgICAkKCcjJytmaWVsZElkKS5hdXRvY29tcGxldGUoJC5leHRlbmQoewogICAgICBzb3VyY2U6IHVybCwKICAgICAgbWluTGVuZ3RoOiAyLAogICAgICBwb3NpdGlvbjoge2NvbGxpc2lvbjogImZsaXBmaXQifSwKICAgICAgc2VhcmNoOiBmdW5jdGlvbigpeyQoJyMnK2ZpZWxkSWQpLmFkZENsYXNzKCdhamF4LWxvYWRpbmcnKTt9LAogICAgICByZXNwb25zZTogZnVuY3Rpb24oKXskKCcjJytmaWVsZElkKS5yZW1vdmVDbGFzcygnYWpheC1sb2FkaW5nJyk7fQogICAgfSwgb3B0aW9ucykpOwogICAgJCgnIycrZmllbGRJZCkuYWRkQ2xhc3MoJ2F1dG9jb21wbGV0ZScpOwogIH0pOwp9CgpmdW5jdGlvbiBtdWx0aXBsZUF1dG9jb21wbGV0ZUZpZWxkKGZpZWxkSWQsIHVybCwgb3B0aW9ucykgewogIGZ1bmN0aW9uIHNwbGl0KHZhbCkgewogICAgcmV0dXJuIHZhbC5zcGxpdCgvLFxzKi8pOwogIH0KCiAgZnVuY3Rpb24gZXh0cmFjdExhc3QodGVybSkgewogICAgcmV0dXJuIHNwbGl0KHRlcm0pLnBvcCgpOwogIH0KCiAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkgewogICAgJCgnIycgKyBmaWVsZElkKS5hdXRvY29tcGxldGUoJC5leHRlbmQoewogICAgICBzb3VyY2U6IGZ1bmN0aW9uIChyZXF1ZXN0LCByZXNwb25zZSkgewogICAgICAgICQuZ2V0SlNPTih1cmwsIHsKICAgICAgICAgIHRlcm06IGV4dHJhY3RMYXN0KHJlcXVlc3QudGVybSkKICAgICAgICB9LCByZXNwb25zZSk7CiAgICAgIH0sCiAgICAgIG1pbkxlbmd0aDogMiwKICAgICAgcG9zaXRpb246IHtjb2xsaXNpb246ICJmbGlwZml0In0sCiAgICAgIHNlYXJjaDogZnVuY3Rpb24gKCkgewogICAgICAgICQoJyMnICsgZmllbGRJZCkuYWRkQ2xhc3MoJ2FqYXgtbG9hZGluZycpOwogICAgICB9LAogICAgICByZXNwb25zZTogZnVuY3Rpb24gKCkgewogICAgICAgICQoJyMnICsgZmllbGRJZCkucmVtb3ZlQ2xhc3MoJ2FqYXgtbG9hZGluZycpOwogICAgICB9LAogICAgICBzZWxlY3Q6IGZ1bmN0aW9uIChldmVudCwgdWkpIHsKICAgICAgICB2YXIgdGVybXMgPSBzcGxpdCh0aGlzLnZhbHVlKTsKICAgICAgICAvLyByZW1vdmUgdGhlIGN1cnJlbnQgaW5wdXQKICAgICAgICB0ZXJtcy5wb3AoKTsKICAgICAgICAvLyBhZGQgdGhlIHNlbGVjdGVkIGl0ZW0KICAgICAgICB0ZXJtcy5wdXNoKHVpLml0ZW0udmFsdWUpOwogICAgICAgIC8vIGFkZCBwbGFjZWhvbGRlciB0byBnZXQgdGhlIGNvbW1hLWFuZC1zcGFjZSBhdCB0aGUgZW5kCiAgICAgICAgdGVybXMucHVzaCgiIik7CiAgICAgICAgdGhpcy52YWx1ZSA9IHRlcm1zLmpvaW4oIiwgIik7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9LCBvcHRpb25zKSk7CiAgICAkKCcjJyArIGZpZWxkSWQpLmFkZENsYXNzKCdhdXRvY29tcGxldGUnKTsKICB9KTsKfQoKZnVuY3Rpb24gb2JzZXJ2ZVNlYXJjaGZpZWxkKGZpZWxkSWQsIHRhcmdldElkLCB1cmwpIHsKICAkKCcjJytmaWVsZElkKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgdmFyICR0aGlzID0gJCh0aGlzKTsKICAgICR0aGlzLmFkZENsYXNzKCdhdXRvY29tcGxldGUnKTsKICAgICR0aGlzLmF0dHIoJ2RhdGEtdmFsdWUtd2FzJywgJHRoaXMudmFsKCkpOwogICAgdmFyIGNoZWNrID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciB2YWwgPSAkdGhpcy52YWwoKTsKICAgICAgaWYgKCR0aGlzLmF0dHIoJ2RhdGEtdmFsdWUtd2FzJykgIT0gdmFsKXsKICAgICAgICAkdGhpcy5hdHRyKCdkYXRhLXZhbHVlLXdhcycsIHZhbCk7CiAgICAgICAgJC5hamF4KHsKICAgICAgICAgIHVybDogdXJsLAogICAgICAgICAgdHlwZTogJ2dldCcsCiAgICAgICAgICBkYXRhOiB7cTogJHRoaXMudmFsKCl9LAogICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSl7IGlmKHRhcmdldElkKSAkKCcjJyt0YXJnZXRJZCkuaHRtbChkYXRhKTsgfSwKICAgICAgICAgIGJlZm9yZVNlbmQ6IGZ1bmN0aW9uKCl7ICR0aGlzLmFkZENsYXNzKCdhamF4LWxvYWRpbmcnKTsgfSwKICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpeyAkdGhpcy5yZW1vdmVDbGFzcygnYWpheC1sb2FkaW5nJyk7IH0KICAgICAgICB9KTsKICAgICAgfQogICAgfTsKICAgIHZhciByZXNldCA9IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGltZXIpIHsKICAgICAgICBjbGVhckludGVydmFsKHRpbWVyKTsKICAgICAgICB0aW1lciA9IHNldEludGVydmFsKGNoZWNrLCAzMDApOwogICAgICB9CiAgICB9OwogICAgdmFyIHRpbWVyID0gc2V0SW50ZXJ2YWwoY2hlY2ssIDMwMCk7CiAgICAkdGhpcy5iaW5kKCdrZXl1cCBjbGljayBtb3VzZW1vdmUnLCByZXNldCk7CiAgfSk7Cn0KCiQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCl7CiAgJCgiLmRyZG4gLmF1dG9jb21wbGV0ZSIpLnZhbCgnJyk7CgogIC8vIFRoaXMgdmFyaWFibGUgaXMgdXNlZCB0byBmb2N1cyBzZWxlY3RlZCBwcm9qZWN0CiAgdmFyIHNlbGVjdGVkOwogICQoZG9jdW1lbnQpLm9uKCdjbGljaycsICcuZHJkbi10cmlnZ2VyJywgZnVuY3Rpb24oZSl7CiAgICB2YXIgZHJkbiA9ICQodGhpcykuY2xvc2VzdCgiLmRyZG4iKTsKICAgIGlmIChkcmRuLmhhc0NsYXNzKCJleHBhbmRlZCIpKSB7CiAgICAgIGRyZG4ucmVtb3ZlQ2xhc3MoImV4cGFuZGVkIik7CiAgICB9IGVsc2UgewogICAgICAkKCIuZHJkbiIpLnJlbW92ZUNsYXNzKCJleHBhbmRlZCIpOwogICAgICBkcmRuLmFkZENsYXNzKCJleHBhbmRlZCIpOwogICAgICBpZiAoJCh0aGlzKS5wYXJlbnQoJyNwcm9qZWN0LWp1bXAnKS5sZW5ndGgpIHsKICAgICAgICBzZWxlY3RlZCA9ICQoJy5kcmRuLWl0ZW1zIGEuc2VsZWN0ZWQnKTsgLy8gU3RvcmUgc2VsZWN0ZWQgcHJvamVjdAogICAgICAgIHNlbGVjdGVkLmZvY3VzKCk7IC8vIENhbGxpbmcgZm9jdXMgdG8gc2Nyb2xsIHRvIHNlbGVjdGVkIHByb2plY3QKICAgICAgfQogICAgICBpZiAoIWlzTW9iaWxlKCkpIHsKICAgICAgICBkcmRuLmZpbmQoIi5hdXRvY29tcGxldGUiKS5mb2N1cygpOwogICAgICB9CiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICB9CiAgfSk7CiAgJChkb2N1bWVudCkuY2xpY2soZnVuY3Rpb24oZSl7CiAgICBpZiAoJChlLnRhcmdldCkuY2xvc2VzdCgiLmRyZG4iKS5sZW5ndGggPCAxKSB7CiAgICAgICQoIi5kcmRuLmV4cGFuZGVkIikucmVtb3ZlQ2xhc3MoImV4cGFuZGVkIik7CiAgICB9CiAgfSk7CgogIG9ic2VydmVTZWFyY2hmaWVsZCgncHJvamVjdHMtcXVpY2stc2VhcmNoJywgbnVsbCwgJCgnI3Byb2plY3RzLXF1aWNrLXNlYXJjaCcpLmRhdGEoJ2F1dG9tY29tcGxldGUtdXJsJykpOwoKICAkKCIuZHJkbi1jb250ZW50Iikua2V5ZG93bihmdW5jdGlvbihldmVudCl7CiAgICB2YXIgaXRlbXMgPSAkKHRoaXMpLmZpbmQoIi5kcmRuLWl0ZW1zIik7CgogICAgLy8gSWYgYSBwcm9qZWN0IGlzIHNlbGVjdGVkIHNldCBmb2N1c2VkIHRvIHNlbGVjdGVkIG9ubHkgb25jZQogICAgaWYgKHNlbGVjdGVkICYmIHNlbGVjdGVkLmxlbmd0aCA+IDApIHsKICAgICAgdmFyIGZvY3VzZWQgPSBzZWxlY3RlZDsKICAgICAgc2VsZWN0ZWQgPSB1bmRlZmluZWQ7CiAgICB9CiAgICBlbHNlIHsKICAgICAgdmFyIGZvY3VzZWQgPSBpdGVtcy5maW5kKCJhOmZvY3VzIik7CiAgICB9CiAgICBzd2l0Y2ggKGV2ZW50LndoaWNoKSB7CiAgICBjYXNlIDQwOiAvL2Rvd24KICAgICAgaWYgKGZvY3VzZWQubGVuZ3RoID4gMCkgewogICAgICAgIGZvY3VzZWQubmV4dEFsbCgiYSIpLmZpcnN0KCkuZm9jdXMoKTs7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaXRlbXMuZmluZCgiYSIpLmZpcnN0KCkuZm9jdXMoKTs7CiAgICAgIH0KICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDM4OiAvL3VwCiAgICAgIGlmIChmb2N1c2VkLmxlbmd0aCA+IDApIHsKICAgICAgICB2YXIgcHJldiA9IGZvY3VzZWQucHJldkFsbCgiYSIpOwogICAgICAgIGlmIChwcmV2Lmxlbmd0aCA+IDApIHsKICAgICAgICAgIHByZXYuZmlyc3QoKS5mb2N1cygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAkKHRoaXMpLmZpbmQoIi5hdXRvY29tcGxldGUiKS5mb2N1cygpOwogICAgICAgIH0KICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSAzNTogLy9lbmQKICAgICAgaWYgKGZvY3VzZWQubGVuZ3RoID4gMCkgewogICAgICAgIGZvY3VzZWQubmV4dEFsbCgiYSIpLmxhc3QoKS5mb2N1cygpOwogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlIDM2OiAvL2hvbWUKICAgICAgaWYgKGZvY3VzZWQubGVuZ3RoID4gMCkgewogICAgICAgIGZvY3VzZWQucHJldkFsbCgiYSIpLmxhc3QoKS5mb2N1cygpOwogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICB9CiAgfSk7Cn0pOwoKZnVuY3Rpb24gYmVmb3JlU2hvd0RhdGVQaWNrZXIoaW5wdXQsIGluc3QpIHsKICB2YXIgZGVmYXVsdF9kYXRlID0gbnVsbDsKICBzd2l0Y2ggKCQoaW5wdXQpLmF0dHIoImlkIikpIHsKICAgIGNhc2UgImlzc3VlX3N0YXJ0X2RhdGUiIDoKICAgICAgaWYgKCQoIiNpc3N1ZV9kdWVfZGF0ZSIpLmxlbmd0aCA+IDApIHsKICAgICAgICBkZWZhdWx0X2RhdGUgPSAkKCIjaXNzdWVfZHVlX2RhdGUiKS52YWwoKTsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgImlzc3VlX2R1ZV9kYXRlIiA6CiAgICAgIGlmICgkKCIjaXNzdWVfc3RhcnRfZGF0ZSIpLmxlbmd0aCA+IDApIHsKICAgICAgICB2YXIgc3RhcnRfZGF0ZSA9ICQoIiNpc3N1ZV9zdGFydF9kYXRlIikudmFsKCk7CiAgICAgICAgaWYgKHN0YXJ0X2RhdGUgIT0gIiIpIHsKICAgICAgICAgIHN0YXJ0X2RhdGUgPSBuZXcgRGF0ZShEYXRlLnBhcnNlKHN0YXJ0X2RhdGUpKTsKICAgICAgICAgIGlmIChzdGFydF9kYXRlID4gbmV3IERhdGUoKSkgewogICAgICAgICAgICBkZWZhdWx0X2RhdGUgPSAkKCIjaXNzdWVfc3RhcnRfZGF0ZSIpLnZhbCgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBicmVhazsKICB9CiAgJChpbnB1dCkuZGF0ZXBpY2tlckZhbGxiYWNrKCJvcHRpb24iLCAiZGVmYXVsdERhdGUiLCBkZWZhdWx0X2RhdGUpOwp9CgooZnVuY3Rpb24oJCl7CiAgJC5mbi5wb3NpdGlvbmVkSXRlbXMgPSBmdW5jdGlvbihzb3J0YWJsZU9wdGlvbnMsIG9wdGlvbnMpewogICAgdmFyIHNldHRpbmdzID0gJC5leHRlbmQoewogICAgICBmaXJzdFBvc2l0aW9uOiAxCiAgICB9LCBvcHRpb25zICk7CgogICAgcmV0dXJuIHRoaXMuc29ydGFibGUoJC5leHRlbmQoewogICAgICBheGlzOiAneScsCiAgICAgIGhhbmRsZTogIi5zb3J0LWhhbmRsZSIsCiAgICAgIGhlbHBlcjogZnVuY3Rpb24oZXZlbnQsIHVpKXsKICAgICAgICB1aS5jaGlsZHJlbigndGQnKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgICAgICAkKHRoaXMpLndpZHRoKCQodGhpcykud2lkdGgoKSk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHVpOwogICAgICB9LAogICAgICB1cGRhdGU6IGZ1bmN0aW9uKGV2ZW50LCB1aSkgewogICAgICAgIHZhciBzb3J0YWJsZSA9ICQodGhpcyk7CiAgICAgICAgdmFyIGhhbmRsZSA9IHVpLml0ZW0uZmluZCgiLnNvcnQtaGFuZGxlIikuYWRkQ2xhc3MoImFqYXgtbG9hZGluZyIpOwogICAgICAgIHZhciB1cmwgPSBoYW5kbGUuZGF0YSgicmVvcmRlci11cmwiKTsKICAgICAgICB2YXIgcGFyYW0gPSBoYW5kbGUuZGF0YSgicmVvcmRlci1wYXJhbSIpOwogICAgICAgIHZhciBkYXRhID0ge307CiAgICAgICAgZGF0YVtwYXJhbV0gPSB7cG9zaXRpb246IHVpLml0ZW0uaW5kZXgoKSArIHNldHRpbmdzWydmaXJzdFBvc2l0aW9uJ119OwogICAgICAgICQuYWpheCh7CiAgICAgICAgICB1cmw6IHVybCwKICAgICAgICAgIHR5cGU6ICdwdXQnLAogICAgICAgICAgZGF0YVR5cGU6ICdzY3JpcHQnLAogICAgICAgICAgZGF0YTogZGF0YSwKICAgICAgICAgIGVycm9yOiBmdW5jdGlvbihqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pewogICAgICAgICAgICBhbGVydChqcVhIUi5zdGF0dXMpOwogICAgICAgICAgICBzb3J0YWJsZS5zb3J0YWJsZSgiY2FuY2VsIik7CiAgICAgICAgICB9LAogICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bil7CiAgICAgICAgICAgIGhhbmRsZS5yZW1vdmVDbGFzcygiYWpheC1sb2FkaW5nIik7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0sCiAgICB9LCBzb3J0YWJsZU9wdGlvbnMpKTsKICB9Cn0oIGpRdWVyeSApKTsKCnZhciB3YXJuTGVhdmluZ1Vuc2F2ZWRNZXNzYWdlOwpmdW5jdGlvbiB3YXJuTGVhdmluZ1Vuc2F2ZWQobWVzc2FnZSkgewogIHdhcm5MZWF2aW5nVW5zYXZlZE1lc3NhZ2UgPSBtZXNzYWdlOwogICQoZG9jdW1lbnQpLm9uKCdzdWJtaXQnLCAnZm9ybScsIGZ1bmN0aW9uKCl7CiAgICAkKCd0ZXh0YXJlYScpLnJlbW92ZURhdGEoJ2NoYW5nZWQnKTsKICB9KTsKICAkKGRvY3VtZW50KS5vbignY2hhbmdlJywgJ3RleHRhcmVhJywgZnVuY3Rpb24oKXsKICAgICQodGhpcykuZGF0YSgnY2hhbmdlZCcsICdjaGFuZ2VkJyk7CiAgfSk7CiAgd2luZG93Lm9uYmVmb3JldW5sb2FkID0gZnVuY3Rpb24oKXsKICAgIHZhciB3YXJuID0gZmFsc2U7CiAgICAkKCd0ZXh0YXJlYScpLmJsdXIoKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgIGlmICgkKHRoaXMpLmRhdGEoJ2NoYW5nZWQnKSkgewogICAgICAgIHdhcm4gPSB0cnVlOwogICAgICB9CiAgICB9KTsKICAgIGlmICh3YXJuKSB7cmV0dXJuIHdhcm5MZWF2aW5nVW5zYXZlZE1lc3NhZ2U7fQogIH07Cn0KCmZ1bmN0aW9uIHNldHVwQWpheEluZGljYXRvcigpIHsKICAkKGRvY3VtZW50KS5iaW5kKCdhamF4U2VuZCcsIGZ1bmN0aW9uKGV2ZW50LCB4aHIsIHNldHRpbmdzKSB7CiAgICBpZiAoJCgnLmFqYXgtbG9hZGluZycpLmxlbmd0aCA9PT0gMCAmJiBzZXR0aW5ncy5jb250ZW50VHlwZSAhPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJykgewogICAgICAkKCcjYWpheC1pbmRpY2F0b3InKS5zaG93KCk7CiAgICB9CiAgfSk7CiAgJChkb2N1bWVudCkuYmluZCgnYWpheFN0b3AnLCBmdW5jdGlvbigpIHsKICAgICQoJyNhamF4LWluZGljYXRvcicpLmhpZGUoKTsKICB9KTsKfQoKZnVuY3Rpb24gc2V0dXBUYWJzKCkgewogIGlmKCQoJy50YWJzJykubGVuZ3RoID4gMCkgewogICAgZGlzcGxheVRhYnNCdXR0b25zKCk7CiAgICAkKHdpbmRvdykucmVzaXplKGRpc3BsYXlUYWJzQnV0dG9ucyk7CiAgfQp9CgpmdW5jdGlvbiBzZXR1cEZpbGVQcmV2aWV3TmF2aWdhdGlvbigpIHsKICAvLyBvbmx5IGJpbmQgYXJyb3cga2V5cyB3aGVuIHByZXZpZXcgbmF2aWdhdGlvbiBpcyBwcmVzZW50CiAgY29uc3QgZWxlbWVudCA9ICQoJy5wYWdpbmF0aW9uLmZpbGVwcmV2aWV3JykuZmlyc3QoKTsKICBpZiAoZWxlbWVudCkgewoKICAgIGNvbnN0IGhhbmRsZUFycm93S2V5ID0gZnVuY3Rpb24oc2VsZWN0b3IsIGUpewogICAgICBjb25zdCBocmVmID0gJChlbGVtZW50KS5maW5kKHNlbGVjdG9yKS5hdHRyKCdocmVmJyk7CiAgICAgIGlmIChocmVmKSB7CiAgICAgICAgd2luZG93LmxvY2F0aW9uID0gaHJlZjsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIH0KICAgIH07CgogICAgJChkb2N1bWVudCkua2V5ZG93bihmdW5jdGlvbihlKSB7CiAgICAgIGlmKGUuc2hpZnRLZXkgfHwgZS5tZXRhS2V5IHx8IGUuY3RybEtleSB8fCBlLmFsdEtleSkgcmV0dXJuOwogICAgICBzd2l0Y2goZS5rZXkpIHsKICAgICAgICBjYXNlICdBcnJvd0xlZnQnOgogICAgICAgICAgaGFuZGxlQXJyb3dLZXkoJy5wcmV2aW91cyBhJywgZSk7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnQXJyb3dSaWdodCc6CiAgICAgICAgICBoYW5kbGVBcnJvd0tleSgnLm5leHQgYScsIGUpOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0pOwogIH0KfQoKJChkb2N1bWVudCkub24oJ2tleWRvd24nLCAnZm9ybSB0ZXh0YXJlYScsIGZ1bmN0aW9uKGUpIHsKICAvLyBTdWJtaXQgdGhlIGZvcm0gd2l0aCBDdHJsICsgRW50ZXIgb3IgQ29tbWFuZCArIFJldHVybgogIHZhciB0YXJnZXRGb3JtID0gJChlLnRhcmdldCkuY2xvc2VzdCgnZm9ybScpOwogIGlmKGUua2V5Q29kZSA9PSAxMyAmJiAoKGUuY3RybEtleSAmJiAhZS5tZXRhS2V5KSB8fCAoIWUuY3RybEtleSAmJiBlLm1ldGFLZXkpICYmIHRhcmdldEZvcm0ubGVuZ3RoKSkgewogICAgLy8gRm9yIGFqYXgsIHVzZSBjbGljaygpIGluc3RlYWQgb2Ygc3VibWl0KCkgdG8gcHJldmVudCAiSW52YWxpZCBmb3JtIGF1dGhlbnRpY2l0eSB0b2tlbiIgZXJyb3IKICAgIGlmICh0YXJnZXRGb3JtLmF0dHIoJ2RhdGEtcmVtb3RlJykgPT0gJ3RydWUnKSB7CiAgICAgIGlmICh0YXJnZXRGb3JtLmZpbmQoJ2lucHV0W3R5cGU9c3VibWl0XScpLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gZmFsc2U7IH0KICAgICAgdGFyZ2V0Rm9ybS5maW5kKCd0ZXh0YXJlYScpLmJsdXIoKS5yZW1vdmVEYXRhKCdjaGFuZ2VkJyk7CiAgICAgIHRhcmdldEZvcm0uZmluZCgnaW5wdXRbdHlwZT1zdWJtaXRdJykuZmlyc3QoKS5jbGljaygpOwogICAgfSBlbHNlIHsKICAgICAgdGFyZ2V0Rm9ybS5maW5kKCd0ZXh0YXJlYScpLmJsdXIoKS5yZW1vdmVEYXRhKCdjaGFuZ2VkJyk7CiAgICAgIHRhcmdldEZvcm0uc3VibWl0KCk7CiAgICB9CiAgfQp9KTsKCgpmdW5jdGlvbiBoaWRlT25Mb2FkKCkgewogICQoJy5ob2wnKS5oaWRlKCk7Cn0KCmZ1bmN0aW9uIGFkZEZvcm1PYnNlcnZlcnNGb3JEb3VibGVTdWJtaXQoKSB7CiAgJCgnZm9ybVttZXRob2Q9cG9zdF0nKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgaWYgKCEkKHRoaXMpLmhhc0NsYXNzKCdtdWx0aXBsZS1zdWJtaXQnKSkgewogICAgICAkKHRoaXMpLnN1Ym1pdChmdW5jdGlvbihmb3JtX3N1Ym1pc3Npb24pIHsKICAgICAgICBpZiAoJChmb3JtX3N1Ym1pc3Npb24udGFyZ2V0KS5hdHRyKCdkYXRhLXN1Ym1pdHRlZCcpKSB7CiAgICAgICAgICBmb3JtX3N1Ym1pc3Npb24ucHJldmVudERlZmF1bHQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgJChmb3JtX3N1Ym1pc3Npb24udGFyZ2V0KS5hdHRyKCdkYXRhLXN1Ym1pdHRlZCcsIHRydWUpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIGRlZmF1bHRGb2N1cygpewogIGlmICgoJCgnI2NvbnRlbnQgOmZvY3VzJykubGVuZ3RoID09IDApICYmICh3aW5kb3cubG9jYXRpb24uaGFzaCA9PSAnJykpIHsKICAgICQoJyNjb250ZW50IGlucHV0W3R5cGU9dGV4dF06dmlzaWJsZSwgI2NvbnRlbnQgdGV4dGFyZWE6dmlzaWJsZScpLmZpcnN0KCkuZm9jdXMoKTsKICB9Cn0KCmZ1bmN0aW9uIGJsb2NrRXZlbnRQcm9wYWdhdGlvbihldmVudCkgewogIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7Cn0KCmZ1bmN0aW9uIHRvZ2dsZURpc2FibGVkT25DaGFuZ2UoKSB7CiAgdmFyIGNoZWNrZWQgPSAkKHRoaXMpLmlzKCc6Y2hlY2tlZCcpOwogICQoJCh0aGlzKS5kYXRhKCdkaXNhYmxlcycpKS5hdHRyKCdkaXNhYmxlZCcsIGNoZWNrZWQpOwogICQoJCh0aGlzKS5kYXRhKCdlbmFibGVzJykpLmF0dHIoJ2Rpc2FibGVkJywgIWNoZWNrZWQpOwogICQoJCh0aGlzKS5kYXRhKCdzaG93cycpKS50b2dnbGUoY2hlY2tlZCk7Cn0KZnVuY3Rpb24gdG9nZ2xlRGlzYWJsZWRJbml0KCkgewogICQoJ2lucHV0W2RhdGEtZGlzYWJsZXNdLCBpbnB1dFtkYXRhLWVuYWJsZXNdLCBpbnB1dFtkYXRhLXNob3dzXScpLmVhY2godG9nZ2xlRGlzYWJsZWRPbkNoYW5nZSk7Cn0KZnVuY3Rpb24gdG9nZ2xlTXVsdGlTZWxlY3RJY29uSW5pdCgpIHsKICAkKCcudG9nZ2xlLW11bHRpc2VsZWN0Om5vdCguaWNvbi10b2dnbGUtbWludXMpLCAudG9nZ2xlLW11bHRpc2VsZWN0Om5vdCguaWNvbi10b2dnbGUtcGx1cyknKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICBpZiAoJCh0aGlzKS5zaWJsaW5ncygnc2VsZWN0JykuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykubGVuZ3RoID4gMSl7CiAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2ljb24tdG9nZ2xlLW1pbnVzJyk7CiAgICB9IGVsc2UgewogICAgICAkKHRoaXMpLmFkZENsYXNzKCdpY29uLXRvZ2dsZS1wbHVzJyk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIHRvZ2dsZU5ld09iamVjdERyb3Bkb3duKCkgewogIHZhciBkcm9wZG93biA9ICQoJyNuZXctb2JqZWN0ICsgdWwubWVudS1jaGlsZHJlbicpOwogIGlmKGRyb3Bkb3duLmhhc0NsYXNzKCd2aXNpYmxlJykpewogICAgZHJvcGRvd24ucmVtb3ZlQ2xhc3MoJ3Zpc2libGUnKTsKICB9ZWxzZXsKICAgIGRyb3Bkb3duLmFkZENsYXNzKCd2aXNpYmxlJyk7CiAgfQp9CgooZnVuY3Rpb24gKCAkICkgewoKICAvLyBkZXRlY3QgaWYgbmF0aXZlIGRhdGUgaW5wdXQgaXMgc3VwcG9ydGVkCiAgdmFyIG5hdGl2ZURhdGVJbnB1dFN1cHBvcnRlZCA9IHRydWU7CgogIHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7CiAgaW5wdXQuc2V0QXR0cmlidXRlKCd0eXBlJywnZGF0ZScpOwogIGlmIChpbnB1dC50eXBlID09PSAndGV4dCcpIHsKICAgIG5hdGl2ZURhdGVJbnB1dFN1cHBvcnRlZCA9IGZhbHNlOwogIH0KCiAgdmFyIG5vdEFEYXRlVmFsdWUgPSAnbm90LWEtZGF0ZSc7CiAgaW5wdXQuc2V0QXR0cmlidXRlKCd2YWx1ZScsIG5vdEFEYXRlVmFsdWUpOwogIGlmIChpbnB1dC52YWx1ZSA9PT0gbm90QURhdGVWYWx1ZSkgewogICAgbmF0aXZlRGF0ZUlucHV0U3VwcG9ydGVkID0gZmFsc2U7CiAgfQoKICAkLmZuLmRhdGVwaWNrZXJGYWxsYmFjayA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewogICAgaWYgKG5hdGl2ZURhdGVJbnB1dFN1cHBvcnRlZCkgewogICAgICByZXR1cm4gdGhpczsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0aGlzLmRhdGVwaWNrZXIoIG9wdGlvbnMgKTsKICAgIH0KICB9Owp9KCBqUXVlcnkgKSk7CgokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICQoJyNjb250ZW50Jykub24oJ2NoYW5nZScsICdpbnB1dFtkYXRhLWRpc2FibGVzXSwgaW5wdXRbZGF0YS1lbmFibGVzXSwgaW5wdXRbZGF0YS1zaG93c10nLCB0b2dnbGVEaXNhYmxlZE9uQ2hhbmdlKTsKICB0b2dnbGVEaXNhYmxlZEluaXQoKTsKCiAgJCgnI2NvbnRlbnQnKS5vbignY2xpY2snLCAnLnRvZ2dsZS1tdWx0aXNlbGVjdCcsIGZ1bmN0aW9uKCkgewogICAgdG9nZ2xlTXVsdGlTZWxlY3QoJCh0aGlzKS5zaWJsaW5ncygnc2VsZWN0JykpOwogICAgJCh0aGlzKS50b2dnbGVDbGFzcygnaWNvbi10b2dnbGUtcGx1cyBpY29uLXRvZ2dsZS1taW51cycpOwogIH0pOwogIHRvZ2dsZU11bHRpU2VsZWN0SWNvbkluaXQoKTsKCiAgJCgnI2hpc3RvcnkgLnRhYnMnKS5vbignY2xpY2snLCAnYScsIGZ1bmN0aW9uKGUpewogICAgdmFyIHRhYiA9ICQoZS50YXJnZXQpLmF0dHIoJ2lkJykucmVwbGFjZSgndGFiLScsJycpOwogICAgZG9jdW1lbnQuY29va2llID0gJ2hpc3RvcnlfbGFzdF90YWI9JyArIHRhYiArICc7IFNhbWVTaXRlPUxheCcKICB9KTsKfSk7CgokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICQoJyNjb250ZW50Jykub24oJ2NsaWNrJywgJ2Rpdi5qc3RUYWJzIGEudGFiLXByZXZpZXcnLCBmdW5jdGlvbihldmVudCl7CiAgICB2YXIgdGFiID0gJChldmVudC50YXJnZXQpOwoKICAgIHZhciB1cmwgPSB0YWIuZGF0YSgndXJsJyk7CiAgICB2YXIgZm9ybSA9IHRhYi5wYXJlbnRzKCdmb3JtJyk7CiAgICB2YXIganN0QmxvY2sgPSB0YWIucGFyZW50cygnLmpzdEJsb2NrJyk7CgogICAgdmFyIGVsZW1lbnQgPSBlbmNvZGVVUklDb21wb25lbnQoanN0QmxvY2suZmluZCgnLndpa2ktZWRpdCcpLnZhbCgpKTsKICAgIHZhciBhdHRhY2htZW50cyA9IGZvcm0uZmluZCgnLmF0dGFjaG1lbnRzX2ZpZWxkcyBpbnB1dCcpLnNlcmlhbGl6ZSgpOwoKICAgICQuYWpheCh7CiAgICAgIHVybDogdXJsLAogICAgICB0eXBlOiAncG9zdCcsCiAgICAgIGRhdGE6ICJ0ZXh0PSIgKyBlbGVtZW50ICsgJyYnICsgYXR0YWNobWVudHMsCiAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpewogICAgICAgIGpzdEJsb2NrLmZpbmQoJy53aWtpLXByZXZpZXcnKS5odG1sKGRhdGEpOwogICAgICAgIHNldHVwV2lraVRhYmxlU29ydGFibGVIZWFkZXIoKTsKICAgICAgfQogICAgfSk7CiAgfSk7Cn0pOwoKZnVuY3Rpb24ga2VlcEFuY2hvck9uU2lnbkluKGZvcm0pewogIHZhciBoYXNoID0gZGVjb2RlVVJJQ29tcG9uZW50KHNlbGYuZG9jdW1lbnQubG9jYXRpb24uaGFzaCk7CiAgaWYgKGhhc2gpIHsKICAgIGlmIChoYXNoLmluZGV4T2YoIiMiKSA9PT0gLTEpIHsKICAgICAgaGFzaCA9ICIjIiArIGhhc2g7CiAgICB9CiAgICBmb3JtLmFjdGlvbiA9IGZvcm0uYWN0aW9uICsgaGFzaDsKICB9CiAgcmV0dXJuIHRydWU7Cn0KCiQoZnVuY3Rpb24gKCQpIHsKICAkKCcjYXV0aF9zb3VyY2VfbGRhcF9tb2RlJykuY2hhbmdlKGZ1bmN0aW9uICgpIHsKICAgICQoJy5sZGFwc193YXJuaW5nJykudG9nZ2xlKCQodGhpcykudmFsKCkgIT0gJ2xkYXBzX3ZlcmlmeV9wZWVyJyk7CiAgfSkuY2hhbmdlKCk7Cn0pOwoKZnVuY3Rpb24gc2V0RmlsZWNvbnRlbnRDb250YWluZXJIZWlnaHQoKSB7CiAgdmFyICRmaWxlY29udGFpbmVyID0gJCgnLmZpbGVjb250ZW50LWNvbnRhaW5lcicpOwogIHZhciBmaWxlVHlwZVNlbGVjdG9ycyA9IFsnLmltYWdlJywgJ3ZpZGVvJ107CgogIGlmKCRmaWxlY29udGFpbmVyLmxlbmd0aCA+IDAgJiYgJGZpbGVjb250YWluZXIuZmluZChmaWxlVHlwZVNlbGVjdG9ycy5qb2luKCcsJykpLmxlbmd0aCA9PT0gMSkgewogICAgdmFyIGNvbnRhaW5lck9mZnNldFRvcCA9ICRmaWxlY29udGFpbmVyLm9mZnNldCgpLnRvcDsKICAgIHZhciBjb250YWluZXJNYXJnaW5Cb3R0b20gPSBwYXJzZUludCgkZmlsZWNvbnRhaW5lci5jc3MoJ21hcmdpbkJvdHRvbScpKTsKICAgIHZhciBwYWdpbmF0aW9uSGVpZ2h0ID0gJGZpbGVjb250YWluZXIubmV4dCgnLnBhZ2luYXRpb24nKS5oZWlnaHQoKTsKICAgIHZhciBkaWZmID0gY29udGFpbmVyT2Zmc2V0VG9wICsgY29udGFpbmVyTWFyZ2luQm90dG9tICsgcGFnaW5hdGlvbkhlaWdodDsKCiAgICAkZmlsZWNvbnRhaW5lci5jc3MoJ2hlaWdodCcsICdjYWxjKDEwMHZoIC0gJyArIGRpZmYgKyAncHgpJykKICB9Cn0KCmZ1bmN0aW9uIHNldHVwQXR0YWNobWVudERldGFpbCgpIHsKICBzZXRGaWxlY29udGVudENvbnRhaW5lckhlaWdodCgpOwogICQod2luZG93KS5yZXNpemUoc2V0RmlsZWNvbnRlbnRDb250YWluZXJIZWlnaHQpOwp9CgpmdW5jdGlvbiBzZXR1cFdpa2lUYWJsZVNvcnRhYmxlSGVhZGVyKCkgewogICQoJ2Rpdi53aWtpIHRhYmxlJykuZWFjaChmdW5jdGlvbihpLCB0YWJsZSl7CiAgICBpZiAodGFibGUucm93cy5sZW5ndGggPCAzKSByZXR1cm4gdHJ1ZTsKICAgIHZhciB0ciA9ICQodGFibGUucm93cykuZmlyc3QoKTsKICAgIGlmICh0ci5maW5kKCJUSCIpLmxlbmd0aCA+IDApIHsKICAgICAgdHIuYXR0cignZGF0YS1zb3J0LW1ldGhvZCcsICdub25lJyk7CiAgICAgIHRyLmZpbmQoIlREIikuYXR0cignZGF0YS1zb3J0LW1ldGhvZCcsICdub25lJyk7CiAgICAgIG5ldyBUYWJsZXNvcnQodGFibGUpOwogICAgfQogIH0pOwp9CgokKGZ1bmN0aW9uICgpIHsKICAkKCJbdGl0bGVdOm5vdCgubm8tdG9vbHRpcCkiKS50b29sdGlwKHsKICAgIHNob3c6IHsKICAgICAgZGVsYXk6IDQwMAogICAgfSwKICAgIHBvc2l0aW9uOiB7CiAgICAgIG15OiAiY2VudGVyIGJvdHRvbS01IiwKICAgICAgYXQ6ICJjZW50ZXIgdG9wIgogICAgfQogIH0pOwp9KTsKCmZ1bmN0aW9uIGlubGluZUF1dG9Db21wbGV0ZShlbGVtZW50KSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gZG8gbm90IGF0dGFjaCBpZiBUcmlidXRlIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQKICAgIGlmIChlbGVtZW50LmRhdGFzZXQudHJpYnV0ZSA9PT0gJ3RydWUnKSB7cmV0dXJufTsKCiAgICBjb25zdCBnZXREYXRhU291cmNlID0gZnVuY3Rpb24oZW50aXR5KSB7CiAgICAgIGNvbnN0IGRhdGFTb3VyY2VzID0gcm0uQXV0b0NvbXBsZXRlLmRhdGFTb3VyY2VzOwoKICAgICAgaWYgKGRhdGFTb3VyY2VzW2VudGl0eV0pIHsKICAgICAgICByZXR1cm4gZGF0YVNvdXJjZXNbZW50aXR5XTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KCiAgICBjb25zdCByZW1vdGVTZWFyY2ggPSBmdW5jdGlvbih1cmwsIGNiKSB7CiAgICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkKICAgICAgewogICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkgewogICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2UoeGhyLnJlc3BvbnNlVGV4dCk7CiAgICAgICAgICAgIGNiKGRhdGEpOwogICAgICAgICAgfSBlbHNlIGlmICh4aHIuc3RhdHVzID09PSA0MDMpIHsKICAgICAgICAgICAgY2IoW10pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfTsKICAgICAgeGhyLm9wZW4oIkdFVCIsIHVybCwgdHJ1ZSk7CiAgICAgIHhoci5zZW5kKCk7CiAgICB9OwoKICAgIGNvbnN0IHRyaWJ1dGUgPSBuZXcgVHJpYnV0ZSh7CiAgICAgIGNvbGxlY3Rpb246IFsKICAgICAgICB7CiAgICAgICAgICB0cmlnZ2VyOiAnIycsCiAgICAgICAgICB2YWx1ZXM6IGZ1bmN0aW9uICh0ZXh0LCBjYikgewogICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0LnR5cGUgPT09ICd0ZXh0JyAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZSgnYXV0b2NvbXBsZXRlJykgIT0gJ29mZicpIHsKICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXV0b2NvbXBsZXRlJywgJ29mZicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFdoZW4gdHJpZ2dlcmVkIHdpdGggdGV4dCBzdGFydGluZyB3aXRoICIjIyIsIGxpa2UgIiMjYSIsIHRoZSBzZWFyY2ggdGVybSB3aWxsIGJlY29tZSAiI2EiLAogICAgICAgICAgICAvLyBjYXVzaW5nIHRoZSBTUUwgcXVlcnkgdG8gZmFpbCBpbiBmaW5kaW5nIGlzc3VlcyB3aXRoICJhIiBpbiB0aGUgc3ViamVjdC4KICAgICAgICAgICAgLy8gVG8gYXZvaWQgdGhpcywgcmVtb3ZlIHRoZSBmaXJzdCAiIyIgZnJvbSB0aGUgc2VhcmNoIHRlcm0uCiAgICAgICAgICAgIGlmICh0ZXh0KSB7CiAgICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXiMvLCAnJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVtb3RlU2VhcmNoKGdldERhdGFTb3VyY2UoJ2lzc3VlcycpICsgZW5jb2RlVVJJQ29tcG9uZW50KHRleHQpLCBmdW5jdGlvbiAoaXNzdWVzKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGNiKGlzc3Vlcyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwKICAgICAgICAgIGxvb2t1cDogJ2xhYmVsJywKICAgICAgICAgIGZpbGxBdHRyOiAnbGFiZWwnLAogICAgICAgICAgcmVxdWlyZUxlYWRpbmdTcGFjZTogdHJ1ZSwKICAgICAgICAgIHNlbGVjdFRlbXBsYXRlOiBmdW5jdGlvbiAoaXNzdWUpIHsKICAgICAgICAgICAgbGV0IGxlYWRpbmdIYXNoID0gIiMiCiAgICAgICAgICAgIC8vIGtlZXAgIyMgc3ludGF4IHdoaWNoIGlzIGEgdmFsaWQgaXNzdWUgc3ludGF4IHRvIHNob3cgaXNzdWUgd2l0aCB0aXRsZS4KICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudE1lbnRpb25UZXh0U25hcHNob3QuY2hhckF0KDApID09PSAiIyIpIHsKICAgICAgICAgICAgICBsZWFkaW5nSGFzaCA9ICIjIyIKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbGVhZGluZ0hhc2ggKyBpc3N1ZS5vcmlnaW5hbC5pZDsKICAgICAgICAgIH0sCiAgICAgICAgICBtZW51SXRlbVRlbXBsYXRlOiBmdW5jdGlvbiAoaXNzdWUpIHsKICAgICAgICAgICAgcmV0dXJuIHNhbml0aXplSFRNTChpc3N1ZS5vcmlnaW5hbC5sYWJlbCk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICB0cmlnZ2VyOiAnW1snLAogICAgICAgICAgdmFsdWVzOiBmdW5jdGlvbiAodGV4dCwgY2IpIHsKICAgICAgICAgICAgcmVtb3RlU2VhcmNoKGdldERhdGFTb3VyY2UoJ3dpa2lfcGFnZXMnKSArIGVuY29kZVVSSUNvbXBvbmVudCh0ZXh0KSwgZnVuY3Rpb24gKHdpa2lQYWdlcykgewogICAgICAgICAgICAgIHJldHVybiBjYih3aWtpUGFnZXMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sCiAgICAgICAgICBsb29rdXA6ICdsYWJlbCcsCiAgICAgICAgICBmaWxsQXR0cjogJ2xhYmVsJywKICAgICAgICAgIHJlcXVpcmVMZWFkaW5nU3BhY2U6IHRydWUsCiAgICAgICAgICBzZWxlY3RUZW1wbGF0ZTogZnVuY3Rpb24gKHdpa2lQYWdlKSB7CiAgICAgICAgICAgIHJldHVybiAnW1snICsgd2lraVBhZ2Uub3JpZ2luYWwudmFsdWUgKyAnXV0nOwogICAgICAgICAgfSwKICAgICAgICAgIG1lbnVJdGVtVGVtcGxhdGU6IGZ1bmN0aW9uICh3aWtpUGFnZSkgewogICAgICAgICAgICByZXR1cm4gc2FuaXRpemVIVE1MKHdpa2lQYWdlLm9yaWdpbmFsLmxhYmVsKTsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgIHRyaWdnZXI6ICdAJywKICAgICAgICAgIGxvb2t1cDogZnVuY3Rpb24gKHVzZXIsIG1lbnRpb25UZXh0KSB7CiAgICAgICAgICAgIHJldHVybiB1c2VyLm5hbWUgKyB1c2VyLmZpcnN0bmFtZSArIHVzZXIubGFzdG5hbWUgKyB1c2VyLmxvZ2luOwogICAgICAgICAgfSwKICAgICAgICAgIHZhbHVlczogZnVuY3Rpb24gKHRleHQsIGNiKSB7CiAgICAgICAgICAgIGNvbnN0IHVybCA9IGdldERhdGFTb3VyY2UoJ3VzZXJzJyk7CiAgICAgICAgICAgIGlmICh1cmwpIHsKICAgICAgICAgICAgICByZW1vdGVTZWFyY2godXJsICsgZW5jb2RlVVJJQ29tcG9uZW50KHRleHQpLCBmdW5jdGlvbiAodXNlcnMpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjYih1c2Vycyk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICBtZW51SXRlbVRlbXBsYXRlOiBmdW5jdGlvbiAodXNlcikgewogICAgICAgICAgICByZXR1cm4gdXNlci5vcmlnaW5hbC5uYW1lOwogICAgICAgICAgfSwKICAgICAgICAgIHNlbGVjdFRlbXBsYXRlOiBmdW5jdGlvbiAodXNlcikgewogICAgICAgICAgICByZXR1cm4gJ0AnICsgdXNlci5vcmlnaW5hbC5sb2dpbjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIF0sCiAgICAgIG5vTWF0Y2hUZW1wbGF0ZTogIiIKICAgIH0pOwoKICAgIHRyaWJ1dGUuYXR0YWNoKGVsZW1lbnQpOwp9CgovLyBjb2xsYXBzaWJsZSBzaWRlYmFyIGpRdWVyeSBwbHVnaW4KKGZ1bmN0aW9uKCQpIHsKICAvLyBtYWluIGNvbnRhaW5lciB0aGlzIGlzIGFwcGxpZWQgdG8KICB2YXIgbWFpbjsKICAvLyB0cmlnZ2VycyBzaG93L2hpZGUKICB2YXIgYnV0dG9uOwogIC8vIHRoZSBrZXkgdG8gdXNlIGluIGxvY2FsIHN0b3JhZ2UKICAvLyB0aGlzIHdpbGwgbGF0ZXIgYmUgZXhwYW5kZWQgdXNpbmcgdGhlIGN1cnJlbnQgY29udHJvbGxlciBhbmQgYWN0aW9uIHRvCiAgLy8gYWxsb3cgZm9yIGRpZmZlcmVudCBzaWRlYmFyIHN0YXRlcyBmb3IgZGlmZmVyZW50IHBhZ2VzCiAgdmFyIGxvY2FsU3RvcmFnZUtleSA9ICdyZWRtaW5lLXNpZGViYXItc3RhdGUnOwogIC8vIHRydWUgaWYgbG9jYWwgc3RvcmFnZSBpcyBhdmFpbGFibGUKICB2YXIgY2FuVXNlTG9jYWxTdG9yYWdlID0gZnVuY3Rpb24oKXsKICAgIHRyeSB7CiAgICAgIGlmKCdsb2NhbFN0b3JhZ2UnIGluIHdpbmRvdyl7CiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3JlZG1pbmUudGVzdC5zdG9yYWdlJywgJ29rJyk7CiAgICAgICAgdmFyIGl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncmVkbWluZS50ZXN0LnN0b3JhZ2UnKTsKICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgncmVkbWluZS50ZXN0LnN0b3JhZ2UnKTsKICAgICAgICBpZihpdGVtID09PSAnb2snKSByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfSBjYXRjaCAoZXJyKSB7fQogICAgcmV0dXJuIGZhbHNlOwogIH0oKTsKICAvLyBmdW5jdGlvbiB0byBzZXQgY3VycmVudCBzaWRlYmFyIHN0YXRlCiAgdmFyIHNldFN0YXRlID0gZnVuY3Rpb24oc3RhdGUpewogICAgaWYoY2FuVXNlTG9jYWxTdG9yYWdlKXsKICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0obG9jYWxTdG9yYWdlS2V5LCBzdGF0ZSk7CiAgICB9CiAgfTsKICB2YXIgYXBwbHlTdGF0ZSA9IGZ1bmN0aW9uKCl7CiAgICBpZihtYWluLmhhc0NsYXNzKCdjb2xsYXBzZWRzaWRlYmFyJykpewogICAgICB1cGRhdGVTVkdJY29uKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaWRlYmFyLXN3aXRjaC1idXR0b24nKSwgJ2NoZXZyb25zLWxlZnQnKQogICAgICBzZXRTdGF0ZSgnaGlkZGVuJyk7CiAgICB9IGVsc2UgewogICAgICB1cGRhdGVTVkdJY29uKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaWRlYmFyLXN3aXRjaC1idXR0b24nKSwgJ2NoZXZyb25zLXJpZ2h0JykKICAgICAgc2V0U3RhdGUoJ3Zpc2libGUnKTsKICAgIH0KICB9OwogIHZhciBzZXR1cFRvZ2dsZUJ1dHRvbiA9IGZ1bmN0aW9uKCl7CiAgICBidXR0b24gPSAkKCcjc2lkZWJhci1zd2l0Y2gtYnV0dG9uJyk7CiAgICBidXR0b24uY2xpY2soZnVuY3Rpb24oZSl7CiAgICAgIG1haW4uYWRkQ2xhc3MoImFuaW1hdGUiKTsKICAgICAgbWFpbi50b2dnbGVDbGFzcygnY29sbGFwc2Vkc2lkZWJhcicpOwogICAgICBhcHBseVN0YXRlKCk7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7CiAgICBhcHBseVN0YXRlKCk7CiAgfTsKICAkLmZuLmNvbGxhcHNpYmxlU2lkZWJhciA9IGZ1bmN0aW9uKCkgewogICAgbWFpbiA9IHRoaXM7CiAgICAvLyBkZXRlcm1pbmUgcHJldmlvdXNseSBzdG9yZWQgc2lkZWJhciBzdGF0ZSBmb3IgdGhpcyBwYWdlCiAgICBpZihjYW5Vc2VMb2NhbFN0b3JhZ2UpIHsKICAgICAgLy8gZGV0ZXJtaW5lIGN1cnJlbnQgY29udHJvbGxlci9hY3Rpb24gcGFpciBhbmQgdXNlIHRoZW0gYXMgc3RvcmFnZSBrZXkKICAgICAgdmFyIGJvZHlDbGFzcyA9ICQoJ2JvZHknKS5hdHRyKCdjbGFzcycpOwogICAgICBpZihib2R5Q2xhc3MpewogICAgICAgIHRyeSB7CiAgICAgICAgICBsb2NhbFN0b3JhZ2VLZXkgKz0gJy0nICsgYm9keUNsYXNzLnNwbGl0KC9ccysvKS5maWx0ZXIoZnVuY3Rpb24ocyl7CiAgICAgICAgICAgIHJldHVybiBzLm1hdGNoKC8oYWN0aW9ufGNvbnRyb2xsZXIpLS4qLyk7CiAgICAgICAgICB9KS5zb3J0KCkuam9pbignLScpOwogICAgICAgIH0gY2F0Y2goZSkgewogICAgICAgICAgLy8gaW4gY2FzZSBvZiBlcnJvciAocHJvYmFibHkgSUU4KSwgY29udGludWUgd2l0aCB0aGUgdW5tb2RpZmllZCBrZXkKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyIHN0b3JlZFN0YXRlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0obG9jYWxTdG9yYWdlS2V5KTsKICAgICAgbWFpbi50b2dnbGVDbGFzcygnY29sbGFwc2Vkc2lkZWJhcicsIHN0b3JlZFN0YXRlID09PSAnaGlkZGVuJyk7CiAgICB9CiAgICAvLyBkcmF3IHRoZSB0b2dnbGUgYnV0dG9uIG9uY2UgdGhlIERPTSBpcyBjb21wbGV0ZQogICAgJChkb2N1bWVudCkucmVhZHkoc2V0dXBUb2dnbGVCdXR0b24pOwogIH07Cn0oalF1ZXJ5KSk7CgokKGRvY3VtZW50KS5yZWFkeShzZXR1cEFqYXhJbmRpY2F0b3IpOwokKGRvY3VtZW50KS5yZWFkeShoaWRlT25Mb2FkKTsKJChkb2N1bWVudCkucmVhZHkoYWRkRm9ybU9ic2VydmVyc0ZvckRvdWJsZVN1Ym1pdCk7CiQoZG9jdW1lbnQpLnJlYWR5KGRlZmF1bHRGb2N1cyk7CiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwQXR0YWNobWVudERldGFpbCk7CiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwVGFicyk7CiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwRmlsZVByZXZpZXdOYXZpZ2F0aW9uKTsKJChkb2N1bWVudCkucmVhZHkoc2V0dXBXaWtpVGFibGVTb3J0YWJsZUhlYWRlcik7CiQoZG9jdW1lbnQpLm9uKCdmb2N1cycsICdbZGF0YS1hdXRvLWNvbXBsZXRlPXRydWVdJywgZnVuY3Rpb24oZXZlbnQpIHsKICBpbmxpbmVBdXRvQ29tcGxldGUoZXZlbnQudGFyZ2V0KTsKfSk7Cg==" | |
| }, | |
| "attachments.js": { | |
| "hash": "3ec6492326b3262f7b880cc7baff194c", | |
| "path": "/usr/src/redmine/public/assets/attachments-70e32d30.js", | |
| "base64": "LyoqCiAqIFJlZG1pbmUgLSBwcm9qZWN0IG1hbmFnZW1lbnQgc29mdHdhcmUKICogQ29weXJpZ2h0IChDKSAyMDA2LSAgSmVhbi1QaGlsaXBwZSBMYW5nCiAqIFRoaXMgY29kZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCiAqLwoKZnVuY3Rpb24gYWRkRmlsZShpbnB1dEVsLCBmaWxlLCBlYWdlclVwbG9hZCkgewogIHZhciBhdHRhY2htZW50c0ZpZWxkcyA9ICQoaW5wdXRFbCkuY2xvc2VzdCgnLmF0dGFjaG1lbnRzX2Zvcm0nKS5maW5kKCcuYXR0YWNobWVudHNfZmllbGRzJyk7CiAgdmFyIGFkZEF0dGFjaG1lbnQgPSAkKGlucHV0RWwpLmNsb3Nlc3QoJy5hdHRhY2htZW50c19mb3JtJykuZmluZCgnLmFkZF9hdHRhY2htZW50Jyk7CiAgdmFyIG1heEZpbGVzID0gKCQoaW5wdXRFbCkuYXR0cignbXVsdGlwbGUnKSA9PSAnbXVsdGlwbGUnID8gMTAgOiAxKTsKCiAgaWYgKGF0dGFjaG1lbnRzRmllbGRzLmNoaWxkcmVuKCkubGVuZ3RoIDwgbWF4RmlsZXMpIHsKICAgIHZhciBhdHRhY2htZW50SWQgPSBhZGRGaWxlLm5leHRBdHRhY2htZW50SWQrKzsKICAgIHZhciBmaWxlU3BhbiA9ICQoJzxzcGFuPicsIHsgaWQ6ICdhdHRhY2htZW50c18nICsgYXR0YWNobWVudElkIH0pOwogICAgdmFyIHBhcmFtID0gJChpbnB1dEVsKS5kYXRhKCdwYXJhbScpOwogICAgaWYgKCFwYXJhbSkge3BhcmFtID0gJ2F0dGFjaG1lbnRzJ307CgogICAgZmlsZVNwYW4uYXBwZW5kKAogICAgICAgICQoJzxpbnB1dD4nLCB7IHR5cGU6ICd0ZXh0JywgJ2NsYXNzJzogJ2ljb24gaWNvbi1hdHRhY2htZW50IGZpbGVuYW1lIHJlYWRvbmx5JywgbmFtZTogcGFyYW0gKydbJyArIGF0dGFjaG1lbnRJZCArICddW2ZpbGVuYW1lXScsIHJlYWRvbmx5OiAncmVhZG9ubHknfSApLnZhbChmaWxlLm5hbWUpLAogICAgICAgICQoJzxpbnB1dD4nLCB7IHR5cGU6ICd0ZXh0JywgJ2NsYXNzJzogJ2Rlc2NyaXB0aW9uJywgbmFtZTogcGFyYW0gKyAnWycgKyBhdHRhY2htZW50SWQgKyAnXVtkZXNjcmlwdGlvbl0nLCBtYXhsZW5ndGg6IDI1NSwgcGxhY2Vob2xkZXI6ICQoaW5wdXRFbCkuZGF0YSgnZGVzY3JpcHRpb24tcGxhY2Vob2xkZXInKSB9ICkudG9nZ2xlKCFlYWdlclVwbG9hZCksCiAgICAgICAgJCgnPGlucHV0PicsIHsgdHlwZTogJ2hpZGRlbicsICdjbGFzcyc6ICd0b2tlbicsIG5hbWU6IHBhcmFtICsgJ1snICsgYXR0YWNobWVudElkICsgJ11bdG9rZW5dJ30gKSwKICAgICAgICAkKCc8YT4mbmJzcDwvYT4nKS5hdHRyKHsgaHJlZjogIiMiLCAnY2xhc3MnOiAnaWNvbi1vbmx5IGljb24tZGVsIHJlbW92ZS11cGxvYWQnIH0pLmNsaWNrKHJlbW92ZUZpbGUpLnRvZ2dsZSghZWFnZXJVcGxvYWQpCiAgICApLmFwcGVuZFRvKGF0dGFjaG1lbnRzRmllbGRzKTsKCiAgICBpZiAoJChpbnB1dEVsKS5kYXRhKCdkZXNjcmlwdGlvbicpID09IDApIHsKICAgICAgZmlsZVNwYW4uZmluZCgnaW5wdXQuZGVzY3JpcHRpb24nKS5yZW1vdmUoKTsKICAgIH0KCiAgICBpZihlYWdlclVwbG9hZCkgewogICAgICBhamF4VXBsb2FkKGZpbGUsIGF0dGFjaG1lbnRJZCwgZmlsZVNwYW4sIGlucHV0RWwpOwogICAgfQoKICAgIGFkZEF0dGFjaG1lbnQudG9nZ2xlKGF0dGFjaG1lbnRzRmllbGRzLmNoaWxkcmVuKCkubGVuZ3RoIDwgbWF4RmlsZXMpOwogICAgcmV0dXJuIGF0dGFjaG1lbnRJZDsKICB9CiAgcmV0dXJuIG51bGw7Cn0KCmFkZEZpbGUubmV4dEF0dGFjaG1lbnRJZCA9IDE7CgpmdW5jdGlvbiBhamF4VXBsb2FkKGZpbGUsIGF0dGFjaG1lbnRJZCwgZmlsZVNwYW4sIGlucHV0RWwpIHsKCiAgZnVuY3Rpb24gb25Mb2Fkc3RhcnQoZSkgewogICAgZmlsZVNwYW4ucmVtb3ZlQ2xhc3MoJ2FqYXgtd2FpdGluZycpOwogICAgZmlsZVNwYW4uYWRkQ2xhc3MoJ2FqYXgtbG9hZGluZycpOwogICAgJCgnaW5wdXQ6c3VibWl0JywgJCh0aGlzKS5wYXJlbnRzKCdmb3JtJykpLmF0dHIoJ2Rpc2FibGVkJywgJ2Rpc2FibGVkJyk7CiAgfQoKICBmdW5jdGlvbiBvblByb2dyZXNzKGUpIHsKICAgIGlmKGUubGVuZ3RoQ29tcHV0YWJsZSkgewogICAgICB0aGlzLnByb2dyZXNzYmFyKCAndmFsdWUnLCBlLmxvYWRlZCAqIDEwMCAvIGUudG90YWwgKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGFjdHVhbFVwbG9hZChmaWxlLCBhdHRhY2htZW50SWQsIGZpbGVTcGFuLCBpbnB1dEVsKSB7CgogICAgYWpheFVwbG9hZC51cGxvYWRpbmcrKzsKCiAgICB1cGxvYWRCbG9iKGZpbGUsICQoaW5wdXRFbCkuZGF0YSgndXBsb2FkLXBhdGgnKSwgYXR0YWNobWVudElkLCB7CiAgICAgICAgbG9hZHN0YXJ0RXZlbnRIYW5kbGVyOiBvbkxvYWRzdGFydC5iaW5kKHByb2dyZXNzU3BhbiksCiAgICAgICAgcHJvZ3Jlc3NFdmVudEhhbmRsZXI6IG9uUHJvZ3Jlc3MuYmluZChwcm9ncmVzc1NwYW4pCiAgICAgIH0pCiAgICAgIC5kb25lKGZ1bmN0aW9uKHJlc3VsdCkgewogICAgICAgIGFkZElubGluZUF0dGFjaG1lbnRNYXJrdXAoZmlsZSk7CiAgICAgICAgcHJvZ3Jlc3NTcGFuLnByb2dyZXNzYmFyKCAndmFsdWUnLCAxMDAgKS5yZW1vdmUoKTsKICAgICAgICBmaWxlU3Bhbi5maW5kKCdpbnB1dC5kZXNjcmlwdGlvbiwgYScpLmNzcygnZGlzcGxheScsICdpbmxpbmUtYmxvY2snKTsKICAgICAgfSkKICAgICAgLmZhaWwoZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgcHJvZ3Jlc3NTcGFuLnRleHQocmVzdWx0LnN0YXR1c1RleHQpOwogICAgICB9KS5hbHdheXMoZnVuY3Rpb24oKSB7CiAgICAgICAgYWpheFVwbG9hZC51cGxvYWRpbmctLTsKICAgICAgICBmaWxlU3Bhbi5yZW1vdmVDbGFzcygnYWpheC1sb2FkaW5nJyk7CiAgICAgICAgdmFyIGZvcm0gPSBmaWxlU3Bhbi5wYXJlbnRzKCdmb3JtJyk7CiAgICAgICAgaWYgKGZvcm0ucXVldWUoJ3VwbG9hZCcpLmxlbmd0aCA9PSAwICYmIGFqYXhVcGxvYWQudXBsb2FkaW5nID09IDApIHsKICAgICAgICAgICQoJ2lucHV0OnN1Ym1pdCcsIGZvcm0pLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7CiAgICAgICAgfQogICAgICAgIGZvcm0uZGVxdWV1ZSgndXBsb2FkJyk7CiAgICAgIH0pOwogIH0KCiAgdmFyIHByb2dyZXNzU3BhbiA9ICQoJzxkaXY+JykuaW5zZXJ0QWZ0ZXIoZmlsZVNwYW4uZmluZCgnaW5wdXQuZmlsZW5hbWUnKSk7CiAgcHJvZ3Jlc3NTcGFuLnByb2dyZXNzYmFyKCk7CiAgZmlsZVNwYW4uYWRkQ2xhc3MoJ2FqYXgtd2FpdGluZycpOwoKICB2YXIgbWF4U3luY1VwbG9hZCA9ICQoaW5wdXRFbCkuZGF0YSgnbWF4LWNvbmN1cnJlbnQtdXBsb2FkcycpOwoKICBpZihtYXhTeW5jVXBsb2FkID09IG51bGwgfHwgbWF4U3luY1VwbG9hZCA8PSAwIHx8IGFqYXhVcGxvYWQudXBsb2FkaW5nIDwgbWF4U3luY1VwbG9hZCkKICAgIGFjdHVhbFVwbG9hZChmaWxlLCBhdHRhY2htZW50SWQsIGZpbGVTcGFuLCBpbnB1dEVsKTsKICBlbHNlCiAgICAkKGlucHV0RWwpLnBhcmVudHMoJ2Zvcm0nKS5xdWV1ZSgndXBsb2FkJywgYWN0dWFsVXBsb2FkLmJpbmQodGhpcywgZmlsZSwgYXR0YWNobWVudElkLCBmaWxlU3BhbiwgaW5wdXRFbCkpOwp9CgphamF4VXBsb2FkLnVwbG9hZGluZyA9IDA7CgpmdW5jdGlvbiByZW1vdmVGaWxlKCkgewogICQodGhpcykuY2xvc2VzdCgnLmF0dGFjaG1lbnRzX2Zvcm0nKS5maW5kKCcuYWRkX2F0dGFjaG1lbnQnKS5zaG93KCk7CiAgJCh0aGlzKS5wYXJlbnQoJ3NwYW4nKS5yZW1vdmUoKTsKICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIHVwbG9hZEJsb2IoYmxvYiwgdXBsb2FkVXJsLCBhdHRhY2htZW50SWQsIG9wdGlvbnMpIHsKCiAgdmFyIGFjdHVhbE9wdGlvbnMgPSAkLmV4dGVuZCh7CiAgICBsb2Fkc3RhcnRFdmVudEhhbmRsZXI6ICQubm9vcCwKICAgIHByb2dyZXNzRXZlbnRIYW5kbGVyOiAkLm5vb3AKICB9LCBvcHRpb25zKTsKCiAgdXBsb2FkVXJsID0gdXBsb2FkVXJsICsgJz9hdHRhY2htZW50X2lkPScgKyBhdHRhY2htZW50SWQ7CiAgaWYgKGJsb2IgaW5zdGFuY2VvZiB3aW5kb3cuQmxvYikgewogICAgdXBsb2FkVXJsICs9ICcmZmlsZW5hbWU9JyArIGVuY29kZVVSSUNvbXBvbmVudChibG9iLm5hbWUpOwogICAgdXBsb2FkVXJsICs9ICcmY29udGVudF90eXBlPScgKyBlbmNvZGVVUklDb21wb25lbnQoYmxvYi50eXBlKTsKICB9CgogIHJldHVybiAkLmFqYXgodXBsb2FkVXJsLCB7CiAgICB0eXBlOiAnUE9TVCcsCiAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsCiAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbihqcVhociwgc2V0dGluZ3MpIHsKICAgICAganFYaHIuc2V0UmVxdWVzdEhlYWRlcignQWNjZXB0JywgJ2FwcGxpY2F0aW9uL2pzJyk7CiAgICAgIC8vIGF0dGFjaCBwcm9wZXIgRmlsZSBvYmplY3QKICAgICAgc2V0dGluZ3MuZGF0YSA9IGJsb2I7CiAgICB9LAogICAgeGhyOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIHhociA9ICQuYWpheFNldHRpbmdzLnhocigpOwogICAgICB4aHIudXBsb2FkLm9ubG9hZHN0YXJ0ID0gYWN0dWFsT3B0aW9ucy5sb2Fkc3RhcnRFdmVudEhhbmRsZXI7CiAgICAgIHhoci51cGxvYWQub25wcm9ncmVzcyA9IGFjdHVhbE9wdGlvbnMucHJvZ3Jlc3NFdmVudEhhbmRsZXI7CiAgICAgIHJldHVybiB4aHI7CiAgICB9LAogICAgZGF0YTogYmxvYiwKICAgIGNhY2hlOiBmYWxzZSwKICAgIHByb2Nlc3NEYXRhOiBmYWxzZQogIH0pOwp9CgpmdW5jdGlvbiBhZGRJbnB1dEZpbGVzKGlucHV0RWwpIHsKICB2YXIgYXR0YWNobWVudHNGaWVsZHMgPSAkKGlucHV0RWwpLmNsb3Nlc3QoJy5hdHRhY2htZW50c19mb3JtJykuZmluZCgnLmF0dGFjaG1lbnRzX2ZpZWxkcycpOwogIHZhciBhZGRBdHRhY2htZW50ID0gJChpbnB1dEVsKS5jbG9zZXN0KCcuYXR0YWNobWVudHNfZm9ybScpLmZpbmQoJy5hZGRfYXR0YWNobWVudCcpOwogIHZhciBjbGVhcmVkRmlsZUlucHV0ID0gJChpbnB1dEVsKS5jbG9uZSgpLnZhbCgnJyk7CiAgdmFyIHNpemVFeGNlZWRlZCA9IGZhbHNlOwogIHZhciBwYXJhbSA9ICQoaW5wdXRFbCkuZGF0YSgncGFyYW0nKTsKICBpZiAoIXBhcmFtKSB7cGFyYW0gPSAnYXR0YWNobWVudHMnfTsKCiAgaWYgKCQuYWpheFNldHRpbmdzLnhocigpLnVwbG9hZCAmJiBpbnB1dEVsLmZpbGVzKSB7CiAgICAvLyB1cGxvYWQgZmlsZXMgdXNpbmcgYWpheAogICAgc2l6ZUV4Y2VlZGVkID0gdXBsb2FkQW5kQXR0YWNoRmlsZXMoaW5wdXRFbC5maWxlcywgaW5wdXRFbCk7CiAgICAkKGlucHV0RWwpLnJlbW92ZSgpOwogIH0gZWxzZSB7CiAgICAvLyBicm93c2VyIG5vdCBzdXBwb3J0aW5nIHRoZSBmaWxlIEFQSSwgdXBsb2FkIG9uIGZvcm0gc3VibWlzc2lvbgogICAgdmFyIGF0dGFjaG1lbnRJZDsKICAgIHZhciBhRmlsZW5hbWUgPSBpbnB1dEVsLnZhbHVlLnNwbGl0KC9cL3xcXC8pOwogICAgYXR0YWNobWVudElkID0gYWRkRmlsZShpbnB1dEVsLCB7IG5hbWU6IGFGaWxlbmFtZVsgYUZpbGVuYW1lLmxlbmd0aCAtIDEgXSB9LCBmYWxzZSk7CiAgICBpZiAoYXR0YWNobWVudElkKSB7CiAgICAgICQoaW5wdXRFbCkuYXR0cih7IG5hbWU6IHBhcmFtICsgJ1snICsgYXR0YWNobWVudElkICsgJ11bZmlsZV0nLCBzdHlsZTogJ2Rpc3BsYXk6bm9uZTsnIH0pLmFwcGVuZFRvKCcjYXR0YWNobWVudHNfJyArIGF0dGFjaG1lbnRJZCk7CiAgICB9CiAgfQoKICBjbGVhcmVkRmlsZUlucHV0LnByZXBlbmRUbyhhZGRBdHRhY2htZW50KTsKfQoKZnVuY3Rpb24gdXBsb2FkQW5kQXR0YWNoRmlsZXMoZmlsZXMsIGlucHV0RWwpIHsKCiAgdmFyIG1heEZpbGVTaXplID0gJChpbnB1dEVsKS5kYXRhKCdtYXgtZmlsZS1zaXplJyk7CiAgdmFyIG1heEZpbGVTaXplRXhjZWVkZWQgPSAkKGlucHV0RWwpLmRhdGEoJ21heC1maWxlLXNpemUtbWVzc2FnZScpOwoKICB2YXIgc2l6ZUV4Y2VlZGVkID0gZmFsc2U7CiAgdmFyIGZpbGVzTGVuZ3RoID0gJChpbnB1dEVsKS5jbG9zZXN0KCcuYXR0YWNobWVudHNfZm9ybScpLmZpbmQoJy5hdHRhY2htZW50c19maWVsZHMnKS5jaGlsZHJlbigpLmxlbmd0aCArIGZpbGVzLmxlbmd0aAogICQuZWFjaChmaWxlcywgZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5zaXplICYmIG1heEZpbGVTaXplICE9IG51bGwgJiYgdGhpcy5zaXplID4gcGFyc2VJbnQobWF4RmlsZVNpemUpKSB7c2l6ZUV4Y2VlZGVkPXRydWU7fQogIH0pOwogIGlmIChzaXplRXhjZWVkZWQpIHsKICAgIHdpbmRvdy5hbGVydChtYXhGaWxlU2l6ZUV4Y2VlZGVkKTsKICB9IGVsc2UgewogICAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbigpIHthZGRGaWxlKGlucHV0RWwsIHRoaXMsIHRydWUpO30pOwogIH0KCiAgaWYgKGZpbGVzTGVuZ3RoID4gKCQoaW5wdXRFbCkuYXR0cignbXVsdGlwbGUnKSA9PSAnbXVsdGlwbGUnID8gMTAgOiAxKSkgewogICAgd2luZG93LmFsZXJ0KCQoaW5wdXRFbCkuZGF0YSgnbWF4LW51bWJlci1vZi1maWxlcy1tZXNzYWdlJykpOwogIH0KICByZXR1cm4gc2l6ZUV4Y2VlZGVkOwp9CgpmdW5jdGlvbiBoYW5kbGVGaWxlRHJvcEV2ZW50KGUpIHsKCiAgJCh0aGlzKS5yZW1vdmVDbGFzcygnZmlsZW92ZXInKTsKICBibG9ja0V2ZW50UHJvcGFnYXRpb24oZSk7CgogIGlmICgkLmluQXJyYXkoJ0ZpbGVzJywgZS5kYXRhVHJhbnNmZXIudHlwZXMpID4gLTEpIHsKICAgIGhhbmRsZUZpbGVEcm9wRXZlbnQudGFyZ2V0ID0gZS50YXJnZXQ7CiAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnY3VzdG9tLWZpZWxkLWZpbGVkcm9wbGlzdG5lcicpKXsKICAgICAgdXBsb2FkQW5kQXR0YWNoRmlsZXMoZS5kYXRhVHJhbnNmZXIuZmlsZXMsICQodGhpcykuZmluZCgnaW5wdXQ6ZmlsZS5jdXN0b20tZmllbGQtZmlsZWRyb3AnKS5maXJzdCgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHVwbG9hZEFuZEF0dGFjaEZpbGVzKGUuZGF0YVRyYW5zZmVyLmZpbGVzLCAkKHRoaXMpLmZpbmQoJ2lucHV0OmZpbGUuZmlsZWRyb3AnKS5maXJzdCgpKTsKICAgIH0KICB9Cn0KaGFuZGxlRmlsZURyb3BFdmVudC50YXJnZXQgPSAnJzsKCmZ1bmN0aW9uIGRyYWdPdmVySGFuZGxlcihlKSB7CiAgJCh0aGlzKS5hZGRDbGFzcygnZmlsZW92ZXInKTsKICBibG9ja0V2ZW50UHJvcGFnYXRpb24oZSk7CiAgZS5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdjb3B5JzsKfQoKZnVuY3Rpb24gZHJhZ091dEhhbmRsZXIoZSkgewogICQodGhpcykucmVtb3ZlQ2xhc3MoJ2ZpbGVvdmVyJyk7CiAgYmxvY2tFdmVudFByb3BhZ2F0aW9uKGUpOwp9CgpmdW5jdGlvbiBzZXR1cEZpbGVEcm9wKCkgewogIGlmICh3aW5kb3cuRmlsZSAmJiB3aW5kb3cuRmlsZUxpc3QgJiYgd2luZG93LlByb2dyZXNzRXZlbnQgJiYgd2luZG93LkZvcm1EYXRhKSB7CgogICAgJC5ldmVudC5hZGRQcm9wKCdkYXRhVHJhbnNmZXInKTsKCiAgICAkKCdmb3JtIGRpdi5ib3g6bm90KC5maWxlZHJvcGxpc3RuZXIpJykuaGFzKCdpbnB1dDpmaWxlLmZpbGVkcm9wJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgJCh0aGlzKS5vbih7CiAgICAgICAgICBkcmFnb3ZlcjogZHJhZ092ZXJIYW5kbGVyLAogICAgICAgICAgZHJhZ2xlYXZlOiBkcmFnT3V0SGFuZGxlciwKICAgICAgICAgIGRyb3A6IGhhbmRsZUZpbGVEcm9wRXZlbnQsCiAgICAgICAgICBwYXN0ZTogY29weUltYWdlRnJvbUNsaXBib2FyZAogICAgICB9KS5hZGRDbGFzcygnZmlsZWRyb3BsaXN0bmVyJyk7CiAgICB9KTsKCiAgICAkKCdmb3JtIGRpdi5ib3ggaW5wdXQ6ZmlsZS5jdXN0b20tZmllbGQtZmlsZWRyb3AnKS5jbG9zZXN0KCdwJykubm90KCcuY3VzdG9tLWZpZWxkLWZpbGVkcm9wbGlzdG5lcicpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICQodGhpcykub24oewogICAgICAgICAgZHJhZ292ZXI6IGRyYWdPdmVySGFuZGxlciwKICAgICAgICAgIGRyYWdsZWF2ZTogZHJhZ091dEhhbmRsZXIsCiAgICAgICAgICBkcm9wOiBoYW5kbGVGaWxlRHJvcEV2ZW50CiAgICAgIH0pLmFkZENsYXNzKCdjdXN0b20tZmllbGQtZmlsZWRyb3BsaXN0bmVyJyk7CiAgICB9KTsKICB9Cn0KCmZ1bmN0aW9uIGFkZElubGluZUF0dGFjaG1lbnRNYXJrdXAoZmlsZSkgewogIC8vIGluc2VydCB1cGxvYWRlZCBpbWFnZSBpbmxpbmUgaWYgZHJvcHBlZCBhcmVhIGlzIGN1cnJlbnRseSBmb2N1c2VkIHRleHRhcmVhCiAgaWYoJChoYW5kbGVGaWxlRHJvcEV2ZW50LnRhcmdldCkuaGFzQ2xhc3MoJ3dpa2ktZWRpdCcpICYmICQuaW5BcnJheShmaWxlLnR5cGUsIHdpbmRvdy53aWtpSW1hZ2VNaW1lVHlwZXMpID4gLTEpIHsKICAgIHZhciAkdGV4dGFyZWEgPSAkKGhhbmRsZUZpbGVEcm9wRXZlbnQudGFyZ2V0KTsKICAgIHZhciBjdXJzb3JQb3NpdGlvbiA9ICR0ZXh0YXJlYS5wcm9wKCdzZWxlY3Rpb25TdGFydCcpOwogICAgdmFyIGRlc2NyaXB0aW9uID0gJHRleHRhcmVhLnZhbCgpOwogICAgdmFyIHNhbml0aXplZEZpbGVuYW1lID0gZmlsZS5uYW1lLnJlcGxhY2UoL1tcL1w/XCVcKlw6XHxcIlwnPD5cblxyXSsvLCAnXycpOwogICAgdmFyIGlubGluZUZpbGVuYW1lID0gZW5jb2RlVVJJQ29tcG9uZW50KHNhbml0aXplZEZpbGVuYW1lKQogICAgICAucmVwbGFjZSgvWyEoKV0vZywgZnVuY3Rpb24obWF0Y2gpIHsgcmV0dXJuICIlIiArIG1hdGNoLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpIH0pOwogICAgdmFyIG5ld0xpbmVCZWZvcmUgPSB0cnVlOwogICAgdmFyIG5ld0xpbmVBZnRlciA9IHRydWU7CiAgICBpZihjdXJzb3JQb3NpdGlvbiA9PT0gMCB8fCBkZXNjcmlwdGlvbi5zdWJzdHIoY3Vyc29yUG9zaXRpb24tMSwxKS5tYXRjaCgvXHJ8XG4vKSkgewogICAgICBuZXdMaW5lQmVmb3JlID0gZmFsc2U7CiAgICB9CiAgICBpZihkZXNjcmlwdGlvbi5zdWJzdHIoY3Vyc29yUG9zaXRpb24sMSkubWF0Y2goL1xyfFxuLykpIHsKICAgICAgbmV3TGluZUFmdGVyID0gZmFsc2U7CiAgICB9CgogICAgJHRleHRhcmVhLnZhbCgKICAgICAgZGVzY3JpcHRpb24uc3Vic3RyaW5nKDAsIGN1cnNvclBvc2l0aW9uKQogICAgICArIChuZXdMaW5lQmVmb3JlID8gJ1xuJyA6ICcnKQogICAgICArIGlubGluZUZpbGVuYW1lCiAgICAgICsgKG5ld0xpbmVBZnRlciA/ICdcbicgOiAnJykKICAgICAgKyBkZXNjcmlwdGlvbi5zdWJzdHJpbmcoY3Vyc29yUG9zaXRpb24sIGRlc2NyaXB0aW9uLmxlbmd0aCkKICAgICk7CgogICAgJHRleHRhcmVhLnByb3AoewogICAgICAnc2VsZWN0aW9uU3RhcnQnOiBjdXJzb3JQb3NpdGlvbiArIG5ld0xpbmVCZWZvcmUsCiAgICAgICdzZWxlY3Rpb25FbmQnOiBjdXJzb3JQb3NpdGlvbiArIGlubGluZUZpbGVuYW1lLmxlbmd0aCArIG5ld0xpbmVCZWZvcmUKICAgIH0pOwogICAgJHRleHRhcmVhLnBhcmVudHMoJy5qc3RCbG9jaycpCiAgICAgIC5maW5kKCcuanN0Yl9pbWcnKS5jbGljaygpOwoKICAgIC8vIG1vdmUgY3Vyc29yIGludG8gbmV4dCBsaW5lCiAgICBjdXJzb3JQb3NpdGlvbiA9ICR0ZXh0YXJlYS5wcm9wKCdzZWxlY3Rpb25TdGFydCcpOwogICAgJHRleHRhcmVhLnByb3AoewogICAgICAnc2VsZWN0aW9uU3RhcnQnOiBjdXJzb3JQb3NpdGlvbiArIDEsCiAgICAgICdzZWxlY3Rpb25FbmQnOiBjdXJzb3JQb3NpdGlvbiArIDEKICAgIH0pOwoKICB9Cn0KCmZ1bmN0aW9uIGNvcHlJbWFnZUZyb21DbGlwYm9hcmQoZSkgewogIGlmICghJChlLnRhcmdldCkuaGFzQ2xhc3MoJ3dpa2ktZWRpdCcpKSB7IHJldHVybjsgfQogIHZhciBjbGlwYm9hcmREYXRhID0gZS5jbGlwYm9hcmREYXRhIHx8IGUub3JpZ2luYWxFdmVudC5jbGlwYm9hcmREYXRhCiAgaWYgKCFjbGlwYm9hcmREYXRhKSB7IHJldHVybjsgfQogIGlmIChjbGlwYm9hcmREYXRhLnR5cGVzLnNvbWUoZnVuY3Rpb24odCl7IHJldHVybiAvXnRleHRcL3BsYWluJC8udGVzdCh0KTsgfSkpIHsgcmV0dXJuOyB9CgogIHZhciBmaWxlcyA9IGNsaXBib2FyZERhdGEuZmlsZXMKICBmb3IgKHZhciBpID0gMCA7IGkgPCBmaWxlcy5sZW5ndGggOyBpKyspIHsKICAgIHZhciBmaWxlID0gZmlsZXNbaV07CiAgICBpZiAoZmlsZS50eXBlLmluZGV4T2YoImltYWdlIikgIT0gLTEpIHsKICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgpOwogICAgICB2YXIgZmlsZW5hbWUgPSAnY2xpcGJvYXJkLScKICAgICAgICArIGRhdGUuZ2V0RnVsbFllYXIoKQogICAgICAgICsgKCcwJysoZGF0ZS5nZXRNb250aCgpKzEpKS5zbGljZSgtMikKICAgICAgICArICgnMCcrZGF0ZS5nZXREYXRlKCkpLnNsaWNlKC0yKQogICAgICAgICsgKCcwJytkYXRlLmdldEhvdXJzKCkpLnNsaWNlKC0yKQogICAgICAgICsgKCcwJytkYXRlLmdldE1pbnV0ZXMoKSkuc2xpY2UoLTIpCiAgICAgICAgKyAnLScgKyByYW5kb21LZXkoNSkudG9Mb2NhbGVMb3dlckNhc2UoKQogICAgICAgICsgJy4nICsgZmlsZS5uYW1lLnNwbGl0KCcuJykucG9wKCk7CgogICAgICAvLyBnZXQgaW5wdXQgZmlsZSBpbiB0aGUgY2xvc2VzdCBmb3JtCiAgICAgIHZhciBpbnB1dEVsID0gJCh0aGlzKS5jbG9zZXN0KCJmb3JtIikuZmluZCgnaW5wdXQ6ZmlsZS5maWxlZHJvcCcpOwogICAgICBoYW5kbGVGaWxlRHJvcEV2ZW50LnRhcmdldCA9IGUudGFyZ2V0OwogICAgICBhZGRGaWxlKGlucHV0RWwsIG5ldyBGaWxlKFtmaWxlXSwgZmlsZW5hbWUsIHsgdHlwZTogZmlsZS50eXBlIH0pLCB0cnVlKTsKICAgIH0KICB9Cn0KCiQoZG9jdW1lbnQpLnJlYWR5KHNldHVwRmlsZURyb3ApOwokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICQoImlucHV0LmRlbGV0ZWRfYXR0YWNobWVudCIpLmNoYW5nZShmdW5jdGlvbigpewogICAgJCh0aGlzKS5wYXJlbnRzKCcuZXhpc3RpbmctYXR0YWNobWVudCcpLnRvZ2dsZUNsYXNzKCdkZWxldGVkJywgJCh0aGlzKS5pcygiOmNoZWNrZWQiKSk7CiAgfSkuY2hhbmdlKCk7Cn0pOwo=" | |
| } | |
| }, | |
| "6.0.1": { | |
| "application.js": { | |
| "hash": "0c94592ef8c71e654832d385c610600e", | |
| "path": "/usr/src/redmine/public/assets/application-7bcc3ab4.js", |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment